@@ -576,9 +576,14 @@ static int mtk_mac_prepare(struct phylink_config *config, unsigned int mode,
576576 mtk_m32 (mac -> hw , XMAC_MCR_TRX_DISABLE ,
577577 XMAC_MCR_TRX_DISABLE , MTK_XMAC_MCR (mac -> id ));
578578
579- mtk_m32 (mac -> hw , MTK_XGMAC_FORCE_MODE (mac -> id ) |
580- MTK_XGMAC_FORCE_LINK (mac -> id ),
581- MTK_XGMAC_FORCE_MODE (mac -> id ), MTK_XGMAC_STS (mac -> id ));
579+ if (MTK_HAS_CAPS (eth -> soc -> caps , MTK_XGMAC_V2 ))
580+ mtk_m32 (mac -> hw , XMAC_FORCE_RX_FC_MODE | XMAC_FORCE_TX_FC_MODE |
581+ XMAC_FORCE_LINK_MODE | XMAC_FORCE_LINK ,
582+ XMAC_FORCE_RX_FC_MODE | XMAC_FORCE_TX_FC_MODE |
583+ XMAC_FORCE_LINK_MODE , MTK_XMAC_STS_FRC (mac -> id ));
584+ else
585+ mtk_m32 (mac -> hw , MTK_XGMAC_FORCE_MODE (mac -> id ) | MTK_XGMAC_FORCE_LINK (mac -> id ),
586+ MTK_XGMAC_FORCE_MODE (mac -> id ), MTK_XGMAC_STS (mac -> id ));
582587 }
583588
584589 return 0 ;
@@ -778,6 +783,7 @@ static void mtk_mac_link_down(struct phylink_config *config, unsigned int mode,
778783{
779784 struct mtk_mac * mac = container_of (config , struct mtk_mac ,
780785 phylink_config );
786+ struct mtk_eth * eth = mac -> hw ;
781787
782788 if (!mtk_interface_mode_is_xgmii (mac -> hw , interface )) {
783789 /* GMAC modes */
@@ -787,12 +793,14 @@ static void mtk_mac_link_down(struct phylink_config *config, unsigned int mode,
787793 if (mtk_is_netsys_v3_or_greater (mac -> hw ))
788794 mtk_m32 (mac -> hw , MTK_XGMAC_FORCE_LINK (mac -> id ), 0 ,
789795 MTK_XGMAC_STS (mac -> id ));
790- } else if (mac -> id != MTK_GMAC1_ID ) {
796+ } else if (mtk_is_netsys_v3_or_greater ( mac -> hw ) && mac -> id != MTK_GMAC1_ID ) {
791797 /* XGMAC except for built-in switch */
792798 mtk_m32 (mac -> hw , XMAC_MCR_TRX_DISABLE , XMAC_MCR_TRX_DISABLE ,
793799 MTK_XMAC_MCR (mac -> id ));
794- mtk_m32 (mac -> hw , MTK_XGMAC_FORCE_LINK (mac -> id ), 0 ,
795- MTK_XGMAC_STS (mac -> id ));
800+ if (MTK_HAS_CAPS (eth -> soc -> caps , MTK_XGMAC_V2 ))
801+ mtk_m32 (mac -> hw , XMAC_FORCE_LINK , 0 , MTK_XMAC_STS_FRC (mac -> id ));
802+ else
803+ mtk_m32 (mac -> hw , MTK_XGMAC_FORCE_LINK (mac -> id ), 0 , MTK_XGMAC_STS (mac -> id ));
796804 }
797805}
798806
@@ -806,10 +814,16 @@ static void mtk_set_queue_speed(struct mtk_eth *eth, unsigned int idx,
806814 return ;
807815
808816 val = MTK_QTX_SCH_MIN_RATE_EN |
809- /* minimum: 10 Mbps */
810- FIELD_PREP (MTK_QTX_SCH_MIN_RATE_MAN , 1 ) |
811- FIELD_PREP (MTK_QTX_SCH_MIN_RATE_EXP , 4 ) |
812817 MTK_QTX_SCH_LEAKY_BUCKET_SIZE ;
818+ /* minimum: 10 Mbps */
819+ if (mtk_is_netsys_v3_or_greater (eth ) &&
820+ (eth -> soc -> caps != MT7988_CAPS )) {
821+ val |= FIELD_PREP (MTK_QTX_SCH_MIN_RATE_MAN_V3 , 1 ) |
822+ FIELD_PREP (MTK_QTX_SCH_MIN_RATE_EXP_V3 , 4 );
823+ } else {
824+ val |= FIELD_PREP (MTK_QTX_SCH_MIN_RATE_MAN , 1 ) |
825+ FIELD_PREP (MTK_QTX_SCH_MIN_RATE_EXP , 4 );
826+ }
813827 if (mtk_is_netsys_v1 (eth ))
814828 val |= MTK_QTX_SCH_LEAKY_BUCKET_EN ;
815829
@@ -836,6 +850,30 @@ static void mtk_set_queue_speed(struct mtk_eth *eth, unsigned int idx,
836850 default :
837851 break ;
838852 }
853+ } else if (mtk_is_netsys_v3_or_greater (eth ) &&
854+ (eth -> soc -> caps != MT7988_CAPS )) {
855+ switch (speed ) {
856+ case SPEED_10 :
857+ val |= MTK_QTX_SCH_MAX_RATE_EN_V3 |
858+ FIELD_PREP (MTK_QTX_SCH_MAX_RATE_MAN_V3 , 1 ) |
859+ FIELD_PREP (MTK_QTX_SCH_MAX_RATE_EXP_V3 , 4 ) |
860+ FIELD_PREP (MTK_QTX_SCH_MAX_RATE_WEIGHT_V3 , 1 );
861+ break ;
862+ case SPEED_100 :
863+ val |= MTK_QTX_SCH_MAX_RATE_EN_V3 |
864+ FIELD_PREP (MTK_QTX_SCH_MAX_RATE_MAN_V3 , 1 ) |
865+ FIELD_PREP (MTK_QTX_SCH_MAX_RATE_EXP_V3 , 5 ) |
866+ FIELD_PREP (MTK_QTX_SCH_MAX_RATE_WEIGHT_V3 , 1 );
867+ break ;
868+ case SPEED_1000 :
869+ val |= MTK_QTX_SCH_MAX_RATE_EN_V3 |
870+ FIELD_PREP (MTK_QTX_SCH_MAX_RATE_MAN_V3 , 1 ) |
871+ FIELD_PREP (MTK_QTX_SCH_MAX_RATE_EXP_V3 , 6 ) |
872+ FIELD_PREP (MTK_QTX_SCH_MAX_RATE_WEIGHT_V3 , 10 );
873+ break ;
874+ default :
875+ break ;
876+ }
839877 } else {
840878 switch (speed ) {
841879 case SPEED_10 :
@@ -910,6 +948,7 @@ static void mtk_xgdm_mac_link_up(struct mtk_mac *mac,
910948 int speed , int duplex , bool tx_pause ,
911949 bool rx_pause )
912950{
951+ struct mtk_eth * eth = mac -> hw ;
913952 u32 mcr ;
914953
915954 if (mac -> id == MTK_GMAC1_ID )
@@ -921,21 +960,35 @@ static void mtk_xgdm_mac_link_up(struct mtk_mac *mac,
921960 mtk_m32 (mac -> hw , XMAC_GLB_CNTCLR , XMAC_GLB_CNTCLR ,
922961 MTK_XMAC_CNT_CTRL (mac -> id ));
923962
924- mtk_m32 (mac -> hw , MTK_XGMAC_FORCE_LINK (mac -> id ),
925- MTK_XGMAC_FORCE_LINK (mac -> id ), MTK_XGMAC_STS (mac -> id ));
963+ if (MTK_HAS_CAPS (eth -> soc -> caps , MTK_XGMAC_V2 )) {
964+ mcr = mtk_r32 (mac -> hw , MTK_XMAC_STS_FRC (mac -> id ));
965+ mcr |= XMAC_FORCE_LINK ;
966+ mcr &= ~(XMAC_FORCE_TX_FC | XMAC_FORCE_RX_FC );
967+ /* Configure pause modes -
968+ * phylink will avoid these for half duplex
969+ */
970+ if (tx_pause )
971+ mcr |= XMAC_FORCE_TX_FC ;
972+ if (rx_pause )
973+ mcr |= XMAC_FORCE_RX_FC ;
974+ mtk_w32 (mac -> hw , mcr , MTK_XMAC_STS_FRC (mac -> id ));
975+ mtk_m32 (mac -> hw , XMAC_MCR_TRX_DISABLE , 0 , MTK_XMAC_MCR (mac -> id ));
976+ } else {
977+ mtk_m32 (mac -> hw , MTK_XGMAC_FORCE_LINK (mac -> id ),
978+ MTK_XGMAC_FORCE_LINK (mac -> id ), MTK_XGMAC_STS (mac -> id ));
926979
927- mcr = mtk_r32 (mac -> hw , MTK_XMAC_MCR (mac -> id ));
928- mcr &= ~(XMAC_MCR_FORCE_TX_FC | XMAC_MCR_FORCE_RX_FC |
929- XMAC_MCR_TRX_DISABLE );
930- /* Configure pause modes -
931- * phylink will avoid these for half duplex
932- */
933- if (tx_pause )
934- mcr |= XMAC_MCR_FORCE_TX_FC ;
935- if (rx_pause )
936- mcr |= XMAC_MCR_FORCE_RX_FC ;
980+ mcr = mtk_r32 (mac -> hw , MTK_XMAC_MCR (mac -> id ));
981+ mcr &= ~(XMAC_MCR_FORCE_TX_FC | XMAC_MCR_FORCE_RX_FC | XMAC_MCR_TRX_DISABLE );
982+ /* Configure pause modes -
983+ * phylink will avoid these for half duplex
984+ */
985+ if (tx_pause )
986+ mcr |= XMAC_MCR_FORCE_TX_FC ;
987+ if (rx_pause )
988+ mcr |= XMAC_MCR_FORCE_RX_FC ;
937989
938- mtk_w32 (mac -> hw , mcr , MTK_XMAC_MCR (mac -> id ));
990+ mtk_w32 (mac -> hw , mcr , MTK_XMAC_MCR (mac -> id ));
991+ }
939992}
940993
941994static void mtk_mac_link_up (struct phylink_config * config ,
@@ -2735,10 +2788,16 @@ static int mtk_tx_alloc(struct mtk_eth *eth)
27352788 mtk_w32 (eth , val , soc -> reg_map -> qdma .qtx_cfg + ofs );
27362789
27372790 val = MTK_QTX_SCH_MIN_RATE_EN |
2738- /* minimum: 10 Mbps */
2739- FIELD_PREP (MTK_QTX_SCH_MIN_RATE_MAN , 1 ) |
2740- FIELD_PREP (MTK_QTX_SCH_MIN_RATE_EXP , 4 ) |
27412791 MTK_QTX_SCH_LEAKY_BUCKET_SIZE ;
2792+ /* minimum: 10 Mbps */
2793+ if (mtk_is_netsys_v3_or_greater (eth ) &&
2794+ (eth -> soc -> caps != MT7988_CAPS )) {
2795+ val |= FIELD_PREP (MTK_QTX_SCH_MIN_RATE_MAN_V3 , 1 ) |
2796+ FIELD_PREP (MTK_QTX_SCH_MIN_RATE_EXP_V3 , 4 );
2797+ } else {
2798+ val |= FIELD_PREP (MTK_QTX_SCH_MIN_RATE_MAN , 1 ) |
2799+ FIELD_PREP (MTK_QTX_SCH_MIN_RATE_EXP , 4 );
2800+ }
27422801 if (mtk_is_netsys_v1 (eth ))
27432802 val |= MTK_QTX_SCH_LEAKY_BUCKET_EN ;
27442803 mtk_w32 (eth , val , soc -> reg_map -> qdma .qtx_sch + ofs );
@@ -6445,6 +6504,37 @@ static const struct mtk_soc_data mt7986_data = {
64456504 },
64466505};
64476506
6507+ static const struct mtk_soc_data mt7987_data = {
6508+ .reg_map = & mt7988_reg_map ,
6509+ .ana_rgc3 = 0x128 ,
6510+ .caps = MT7987_CAPS ,
6511+ .hw_features = MTK_HW_FEATURES ,
6512+ .required_clks = MT7987_CLKS_BITMAP ,
6513+ .required_pctl = false,
6514+ .version = 3 ,
6515+ .offload_version = 2 ,
6516+ .ppe_num = 2 ,
6517+ .hash_offset = 4 ,
6518+ .has_accounting = true,
6519+ .foe_entry_size = MTK_FOE_ENTRY_V3_SIZE ,
6520+ //.rss_num = 4,
6521+ .tx = {
6522+ .desc_size = sizeof (struct mtk_tx_dma_v2 ),
6523+ .dma_max_len = MTK_TX_DMA_BUF_LEN_V2 ,
6524+ .dma_len_offset = 8 ,
6525+ .dma_size = MTK_DMA_SIZE (2 K ),
6526+ .fq_dma_size = MTK_DMA_SIZE (4 K ),
6527+ },
6528+ .rx = {
6529+ .desc_size = sizeof (struct mtk_rx_dma_v2 ),
6530+ .irq_done_mask = MTK_RX_DONE_INT_V2 ,
6531+ .dma_l4_valid = RX_DMA_L4_VALID_V2 ,
6532+ .dma_max_len = MTK_TX_DMA_BUF_LEN_V2 ,
6533+ .dma_len_offset = 8 ,
6534+ .dma_size = MTK_DMA_SIZE (2 K ),
6535+ },
6536+ };
6537+
64486538static const struct mtk_soc_data mt7988_data = {
64496539 .reg_map = & mt7988_reg_map ,
64506540 .ana_rgc3 = 0x128 ,
@@ -6506,6 +6596,7 @@ const struct of_device_id of_mtk_match[] = {
65066596 { .compatible = "mediatek,mt7629-eth" , .data = & mt7629_data },
65076597 { .compatible = "mediatek,mt7981-eth" , .data = & mt7981_data },
65086598 { .compatible = "mediatek,mt7986-eth" , .data = & mt7986_data },
6599+ { .compatible = "mediatek,mt7987-eth" , .data = & mt7987_data },
65096600 { .compatible = "mediatek,mt7988-eth" , .data = & mt7988_data },
65106601 { .compatible = "ralink,rt5350-eth" , .data = & rt5350_data },
65116602 {},
0 commit comments