@@ -553,9 +553,14 @@ static int mtk_mac_prepare(struct phylink_config *config, unsigned int mode,
553553 mtk_m32 (mac -> hw , XMAC_MCR_TRX_DISABLE ,
554554 XMAC_MCR_TRX_DISABLE , MTK_XMAC_MCR (mac -> id ));
555555
556- mtk_m32 (mac -> hw , MTK_XGMAC_FORCE_MODE (mac -> id ) |
557- MTK_XGMAC_FORCE_LINK (mac -> id ),
558- MTK_XGMAC_FORCE_MODE (mac -> id ), MTK_XGMAC_STS (mac -> id ));
556+ if (MTK_HAS_CAPS (eth -> soc -> caps , MTK_XGMAC_V2 ))
557+ mtk_m32 (mac -> hw , XMAC_FORCE_RX_FC_MODE | XMAC_FORCE_TX_FC_MODE |
558+ XMAC_FORCE_LINK_MODE | XMAC_FORCE_LINK ,
559+ XMAC_FORCE_RX_FC_MODE | XMAC_FORCE_TX_FC_MODE |
560+ XMAC_FORCE_LINK_MODE , MTK_XMAC_STS_FRC (mac -> id ));
561+ else
562+ mtk_m32 (mac -> hw , MTK_XGMAC_FORCE_MODE (mac -> id ) | MTK_XGMAC_FORCE_LINK (mac -> id ),
563+ MTK_XGMAC_FORCE_MODE (mac -> id ), MTK_XGMAC_STS (mac -> id ));
559564 }
560565
561566 return 0 ;
@@ -755,6 +760,7 @@ static void mtk_mac_link_down(struct phylink_config *config, unsigned int mode,
755760{
756761 struct mtk_mac * mac = container_of (config , struct mtk_mac ,
757762 phylink_config );
763+ struct mtk_eth * eth = mac -> hw ;
758764
759765 if (!mtk_interface_mode_is_xgmii (mac -> hw , interface )) {
760766 /* GMAC modes */
@@ -764,12 +770,14 @@ static void mtk_mac_link_down(struct phylink_config *config, unsigned int mode,
764770 if (mtk_is_netsys_v3_or_greater (mac -> hw ))
765771 mtk_m32 (mac -> hw , MTK_XGMAC_FORCE_LINK (mac -> id ), 0 ,
766772 MTK_XGMAC_STS (mac -> id ));
767- } else if (mac -> id != MTK_GMAC1_ID ) {
773+ } else if (mtk_is_netsys_v3_or_greater ( mac -> hw ) && mac -> id != MTK_GMAC1_ID ) {
768774 /* XGMAC except for built-in switch */
769775 mtk_m32 (mac -> hw , XMAC_MCR_TRX_DISABLE , XMAC_MCR_TRX_DISABLE ,
770776 MTK_XMAC_MCR (mac -> id ));
771- mtk_m32 (mac -> hw , MTK_XGMAC_FORCE_LINK (mac -> id ), 0 ,
772- MTK_XGMAC_STS (mac -> id ));
777+ if (MTK_HAS_CAPS (eth -> soc -> caps , MTK_XGMAC_V2 ))
778+ mtk_m32 (mac -> hw , XMAC_FORCE_LINK , 0 , MTK_XMAC_STS_FRC (mac -> id ));
779+ else
780+ mtk_m32 (mac -> hw , MTK_XGMAC_FORCE_LINK (mac -> id ), 0 , MTK_XGMAC_STS (mac -> id ));
773781 }
774782}
775783
@@ -783,10 +791,16 @@ static void mtk_set_queue_speed(struct mtk_eth *eth, unsigned int idx,
783791 return ;
784792
785793 val = MTK_QTX_SCH_MIN_RATE_EN |
786- /* minimum: 10 Mbps */
787- FIELD_PREP (MTK_QTX_SCH_MIN_RATE_MAN , 1 ) |
788- FIELD_PREP (MTK_QTX_SCH_MIN_RATE_EXP , 4 ) |
789794 MTK_QTX_SCH_LEAKY_BUCKET_SIZE ;
795+ /* minimum: 10 Mbps */
796+ if (mtk_is_netsys_v3_or_greater (eth ) &&
797+ (eth -> soc -> caps != MT7988_CAPS )) {
798+ val |= FIELD_PREP (MTK_QTX_SCH_MIN_RATE_MAN_V3 , 1 ) |
799+ FIELD_PREP (MTK_QTX_SCH_MIN_RATE_EXP_V3 , 4 );
800+ } else {
801+ val |= FIELD_PREP (MTK_QTX_SCH_MIN_RATE_MAN , 1 ) |
802+ FIELD_PREP (MTK_QTX_SCH_MIN_RATE_EXP , 4 );
803+ }
790804 if (mtk_is_netsys_v1 (eth ))
791805 val |= MTK_QTX_SCH_LEAKY_BUCKET_EN ;
792806
@@ -813,6 +827,30 @@ static void mtk_set_queue_speed(struct mtk_eth *eth, unsigned int idx,
813827 default :
814828 break ;
815829 }
830+ } else if (mtk_is_netsys_v3_or_greater (eth ) &&
831+ (eth -> soc -> caps != MT7988_CAPS )) {
832+ switch (speed ) {
833+ case SPEED_10 :
834+ val |= MTK_QTX_SCH_MAX_RATE_EN_V3 |
835+ FIELD_PREP (MTK_QTX_SCH_MAX_RATE_MAN_V3 , 1 ) |
836+ FIELD_PREP (MTK_QTX_SCH_MAX_RATE_EXP_V3 , 4 ) |
837+ FIELD_PREP (MTK_QTX_SCH_MAX_RATE_WEIGHT_V3 , 1 );
838+ break ;
839+ case SPEED_100 :
840+ val |= MTK_QTX_SCH_MAX_RATE_EN_V3 |
841+ FIELD_PREP (MTK_QTX_SCH_MAX_RATE_MAN_V3 , 1 ) |
842+ FIELD_PREP (MTK_QTX_SCH_MAX_RATE_EXP_V3 , 5 ) |
843+ FIELD_PREP (MTK_QTX_SCH_MAX_RATE_WEIGHT_V3 , 1 );
844+ break ;
845+ case SPEED_1000 :
846+ val |= MTK_QTX_SCH_MAX_RATE_EN_V3 |
847+ FIELD_PREP (MTK_QTX_SCH_MAX_RATE_MAN_V3 , 1 ) |
848+ FIELD_PREP (MTK_QTX_SCH_MAX_RATE_EXP_V3 , 6 ) |
849+ FIELD_PREP (MTK_QTX_SCH_MAX_RATE_WEIGHT_V3 , 10 );
850+ break ;
851+ default :
852+ break ;
853+ }
816854 } else {
817855 switch (speed ) {
818856 case SPEED_10 :
@@ -887,6 +925,7 @@ static void mtk_xgdm_mac_link_up(struct mtk_mac *mac,
887925 int speed , int duplex , bool tx_pause ,
888926 bool rx_pause )
889927{
928+ struct mtk_eth * eth = mac -> hw ;
890929 u32 mcr ;
891930
892931 if (mac -> id == MTK_GMAC1_ID )
@@ -898,21 +937,35 @@ static void mtk_xgdm_mac_link_up(struct mtk_mac *mac,
898937 mtk_m32 (mac -> hw , XMAC_GLB_CNTCLR , XMAC_GLB_CNTCLR ,
899938 MTK_XMAC_CNT_CTRL (mac -> id ));
900939
901- mtk_m32 (mac -> hw , MTK_XGMAC_FORCE_LINK (mac -> id ),
902- MTK_XGMAC_FORCE_LINK (mac -> id ), MTK_XGMAC_STS (mac -> id ));
940+ if (MTK_HAS_CAPS (eth -> soc -> caps , MTK_XGMAC_V2 )) {
941+ mcr = mtk_r32 (mac -> hw , MTK_XMAC_STS_FRC (mac -> id ));
942+ mcr |= XMAC_FORCE_LINK ;
943+ mcr &= ~(XMAC_FORCE_TX_FC | XMAC_FORCE_RX_FC );
944+ /* Configure pause modes -
945+ * phylink will avoid these for half duplex
946+ */
947+ if (tx_pause )
948+ mcr |= XMAC_FORCE_TX_FC ;
949+ if (rx_pause )
950+ mcr |= XMAC_FORCE_RX_FC ;
951+ mtk_w32 (mac -> hw , mcr , MTK_XMAC_STS_FRC (mac -> id ));
952+ mtk_m32 (mac -> hw , XMAC_MCR_TRX_DISABLE , 0 , MTK_XMAC_MCR (mac -> id ));
953+ } else {
954+ mtk_m32 (mac -> hw , MTK_XGMAC_FORCE_LINK (mac -> id ),
955+ MTK_XGMAC_FORCE_LINK (mac -> id ), MTK_XGMAC_STS (mac -> id ));
903956
904- mcr = mtk_r32 (mac -> hw , MTK_XMAC_MCR (mac -> id ));
905- mcr &= ~(XMAC_MCR_FORCE_TX_FC | XMAC_MCR_FORCE_RX_FC |
906- XMAC_MCR_TRX_DISABLE );
907- /* Configure pause modes -
908- * phylink will avoid these for half duplex
909- */
910- if (tx_pause )
911- mcr |= XMAC_MCR_FORCE_TX_FC ;
912- if (rx_pause )
913- mcr |= XMAC_MCR_FORCE_RX_FC ;
957+ mcr = mtk_r32 (mac -> hw , MTK_XMAC_MCR (mac -> id ));
958+ mcr &= ~(XMAC_MCR_FORCE_TX_FC | XMAC_MCR_FORCE_RX_FC | XMAC_MCR_TRX_DISABLE );
959+ /* Configure pause modes -
960+ * phylink will avoid these for half duplex
961+ */
962+ if (tx_pause )
963+ mcr |= XMAC_MCR_FORCE_TX_FC ;
964+ if (rx_pause )
965+ mcr |= XMAC_MCR_FORCE_RX_FC ;
914966
915- mtk_w32 (mac -> hw , mcr , MTK_XMAC_MCR (mac -> id ));
967+ mtk_w32 (mac -> hw , mcr , MTK_XMAC_MCR (mac -> id ));
968+ }
916969}
917970
918971static void mtk_mac_link_up (struct phylink_config * config ,
@@ -2740,10 +2793,16 @@ static int mtk_tx_alloc(struct mtk_eth *eth)
27402793 mtk_w32 (eth , val , soc -> reg_map -> qdma .qtx_cfg + ofs );
27412794
27422795 val = MTK_QTX_SCH_MIN_RATE_EN |
2743- /* minimum: 10 Mbps */
2744- FIELD_PREP (MTK_QTX_SCH_MIN_RATE_MAN , 1 ) |
2745- FIELD_PREP (MTK_QTX_SCH_MIN_RATE_EXP , 4 ) |
27462796 MTK_QTX_SCH_LEAKY_BUCKET_SIZE ;
2797+ /* minimum: 10 Mbps */
2798+ if (mtk_is_netsys_v3_or_greater (eth ) &&
2799+ (eth -> soc -> caps != MT7988_CAPS )) {
2800+ val |= FIELD_PREP (MTK_QTX_SCH_MIN_RATE_MAN_V3 , 1 ) |
2801+ FIELD_PREP (MTK_QTX_SCH_MIN_RATE_EXP_V3 , 4 );
2802+ } else {
2803+ val |= FIELD_PREP (MTK_QTX_SCH_MIN_RATE_MAN , 1 ) |
2804+ FIELD_PREP (MTK_QTX_SCH_MIN_RATE_EXP , 4 );
2805+ }
27472806 if (mtk_is_netsys_v1 (eth ))
27482807 val |= MTK_QTX_SCH_LEAKY_BUCKET_EN ;
27492808 mtk_w32 (eth , val , soc -> reg_map -> qdma .qtx_sch + ofs );
@@ -5889,6 +5948,36 @@ static const struct mtk_soc_data mt7986_data = {
58895948 },
58905949};
58915950
5951+ static const struct mtk_soc_data mt7987_data = {
5952+ .reg_map = & mt7988_reg_map ,
5953+ .ana_rgc3 = 0x128 ,
5954+ .caps = MT7987_CAPS ,
5955+ .hw_features = MTK_HW_FEATURES ,
5956+ .required_clks = MT7987_CLKS_BITMAP ,
5957+ .required_pctl = false,
5958+ .version = 3 ,
5959+ .offload_version = 2 ,
5960+ .ppe_num = 2 ,
5961+ .hash_offset = 4 ,
5962+ .has_accounting = true,
5963+ .foe_entry_size = MTK_FOE_ENTRY_V3_SIZE ,
5964+ //.rss_num = 4,
5965+ .tx = {
5966+ .desc_size = sizeof (struct mtk_tx_dma_v2 ),
5967+ .dma_max_len = MTK_TX_DMA_BUF_LEN_V2 ,
5968+ .dma_len_offset = 8 ,
5969+ .dma_size = MTK_DMA_SIZE (2 K ),
5970+ .fq_dma_size = MTK_DMA_SIZE (4 K ),
5971+ },
5972+ .rx = {
5973+ .desc_size = sizeof (struct mtk_rx_dma_v2 ),
5974+ .dma_l4_valid = RX_DMA_L4_VALID_V2 ,
5975+ .dma_max_len = MTK_TX_DMA_BUF_LEN_V2 ,
5976+ .dma_len_offset = 8 ,
5977+ .dma_size = MTK_DMA_SIZE (2 K ),
5978+ },
5979+ };
5980+
58925981static const struct mtk_soc_data mt7988_data = {
58935982 .reg_map = & mt7988_reg_map ,
58945983 .ana_rgc3 = 0x128 ,
@@ -5950,6 +6039,7 @@ const struct of_device_id of_mtk_match[] = {
59506039 { .compatible = "mediatek,mt7629-eth" , .data = & mt7629_data },
59516040 { .compatible = "mediatek,mt7981-eth" , .data = & mt7981_data },
59526041 { .compatible = "mediatek,mt7986-eth" , .data = & mt7986_data },
6042+ { .compatible = "mediatek,mt7987-eth" , .data = & mt7987_data },
59536043 { .compatible = "mediatek,mt7988-eth" , .data = & mt7988_data },
59546044 { .compatible = "ralink,rt5350-eth" , .data = & rt5350_data },
59556045 {},
0 commit comments