@@ -876,17 +876,32 @@ void mtk_stats_update_mac(struct mtk_mac *mac)
876876 mtk_r32 (mac -> hw , reg_map -> gdm1_cnt + 0x20 + offs );
877877 hw_stats -> rx_flow_control_packets +=
878878 mtk_r32 (mac -> hw , reg_map -> gdm1_cnt + 0x24 + offs );
879- hw_stats -> tx_skip +=
880- mtk_r32 (mac -> hw , reg_map -> gdm1_cnt + 0x28 + offs );
881- hw_stats -> tx_collisions +=
882- mtk_r32 (mac -> hw , reg_map -> gdm1_cnt + 0x2c + offs );
883- hw_stats -> tx_bytes +=
884- mtk_r32 (mac -> hw , reg_map -> gdm1_cnt + 0x30 + offs );
885- stats = mtk_r32 (mac -> hw , reg_map -> gdm1_cnt + 0x34 + offs );
886- if (stats )
887- hw_stats -> tx_bytes += (stats << 32 );
888- hw_stats -> tx_packets +=
889- mtk_r32 (mac -> hw , reg_map -> gdm1_cnt + 0x38 + offs );
879+
880+ if (mtk_is_netsys_v3_or_greater (eth )) {
881+ hw_stats -> tx_skip +=
882+ mtk_r32 (mac -> hw , reg_map -> gdm1_cnt + 0x50 + offs );
883+ hw_stats -> tx_collisions +=
884+ mtk_r32 (mac -> hw , reg_map -> gdm1_cnt + 0x54 + offs );
885+ hw_stats -> tx_bytes +=
886+ mtk_r32 (mac -> hw , reg_map -> gdm1_cnt + 0x40 + offs );
887+ stats = mtk_r32 (mac -> hw , reg_map -> gdm1_cnt + 0x44 + offs );
888+ if (stats )
889+ hw_stats -> tx_bytes += (stats << 32 );
890+ hw_stats -> tx_packets +=
891+ mtk_r32 (mac -> hw , reg_map -> gdm1_cnt + 0x48 + offs );
892+ } else {
893+ hw_stats -> tx_skip +=
894+ mtk_r32 (mac -> hw , reg_map -> gdm1_cnt + 0x28 + offs );
895+ hw_stats -> tx_collisions +=
896+ mtk_r32 (mac -> hw , reg_map -> gdm1_cnt + 0x2c + offs );
897+ hw_stats -> tx_bytes +=
898+ mtk_r32 (mac -> hw , reg_map -> gdm1_cnt + 0x30 + offs );
899+ stats = mtk_r32 (mac -> hw , reg_map -> gdm1_cnt + 0x34 + offs );
900+ if (stats )
901+ hw_stats -> tx_bytes += (stats << 32 );
902+ hw_stats -> tx_packets +=
903+ mtk_r32 (mac -> hw , reg_map -> gdm1_cnt + 0x38 + offs );
904+ }
890905 }
891906
892907 u64_stats_update_end (& hw_stats -> syncp );
@@ -1190,7 +1205,10 @@ static void mtk_tx_set_dma_desc_v2(struct net_device *dev, void *txd,
11901205 data |= TX_DMA_LS0 ;
11911206 WRITE_ONCE (desc -> txd3 , data );
11921207
1193- data = (mac -> id + 1 ) << TX_DMA_FPORT_SHIFT_V2 ; /* forward port */
1208+ if (mac -> id == MTK_GMAC3_ID )
1209+ data = PSE_GDM3_PORT ;
1210+ else
1211+ data = (mac -> id + 1 ) << TX_DMA_FPORT_SHIFT_V2 ; /* forward port */
11941212 data |= TX_DMA_SWC_V2 | QID_BITS_V2 (info -> qid );
11951213 WRITE_ONCE (desc -> txd4 , data );
11961214
@@ -1201,6 +1219,8 @@ static void mtk_tx_set_dma_desc_v2(struct net_device *dev, void *txd,
12011219 /* tx checksum offload */
12021220 if (info -> csum )
12031221 data |= TX_DMA_CHKSUM_V2 ;
1222+ if (mtk_is_netsys_v3_or_greater (eth ) && netdev_uses_dsa (dev ))
1223+ data |= TX_DMA_SPTAG_V3 ;
12041224 }
12051225 WRITE_ONCE (desc -> txd5 , data );
12061226
@@ -1266,8 +1286,7 @@ static int mtk_tx_map(struct sk_buff *skb, struct net_device *dev,
12661286 mtk_tx_set_dma_desc (dev , itxd , & txd_info );
12671287
12681288 itx_buf -> flags |= MTK_TX_FLAGS_SINGLE0 ;
1269- itx_buf -> flags |= (!mac -> id ) ? MTK_TX_FLAGS_FPORT0 :
1270- MTK_TX_FLAGS_FPORT1 ;
1289+ itx_buf -> mac_id = mac -> id ;
12711290 setup_tx_buf (eth , itx_buf , itxd_pdma , txd_info .addr , txd_info .size ,
12721291 k ++ );
12731292
@@ -1315,8 +1334,7 @@ static int mtk_tx_map(struct sk_buff *skb, struct net_device *dev,
13151334 memset (tx_buf , 0 , sizeof (* tx_buf ));
13161335 tx_buf -> data = (void * )MTK_DMA_DUMMY_DESC ;
13171336 tx_buf -> flags |= MTK_TX_FLAGS_PAGE0 ;
1318- tx_buf -> flags |= (!mac -> id ) ? MTK_TX_FLAGS_FPORT0 :
1319- MTK_TX_FLAGS_FPORT1 ;
1337+ tx_buf -> mac_id = mac -> id ;
13201338
13211339 setup_tx_buf (eth , tx_buf , txd_pdma , txd_info .addr ,
13221340 txd_info .size , k ++ );
@@ -1618,7 +1636,7 @@ static int mtk_xdp_frame_map(struct mtk_eth *eth, struct net_device *dev,
16181636 }
16191637 mtk_tx_set_dma_desc (dev , txd , txd_info );
16201638
1621- tx_buf -> flags |= ! mac -> id ? MTK_TX_FLAGS_FPORT0 : MTK_TX_FLAGS_FPORT1 ;
1639+ tx_buf -> mac_id = mac -> id ;
16221640 tx_buf -> type = dma_map ? MTK_TYPE_XDP_NDO : MTK_TYPE_XDP_TX ;
16231641 tx_buf -> data = (void * )MTK_DMA_DUMMY_DESC ;
16241642
@@ -1868,11 +1886,24 @@ static int mtk_poll_rx(struct napi_struct *napi, int budget,
18681886 break ;
18691887
18701888 /* find out which mac the packet come from. values start at 1 */
1871- if (mtk_is_netsys_v2_or_greater (eth ))
1872- mac = RX_DMA_GET_SPORT_V2 (trxd .rxd5 ) - 1 ;
1873- else if (!MTK_HAS_CAPS (eth -> soc -> caps , MTK_SOC_MT7628 ) &&
1874- !(trxd .rxd4 & RX_DMA_SPECIAL_TAG ))
1889+ if (mtk_is_netsys_v2_or_greater (eth )) {
1890+ u32 val = RX_DMA_GET_SPORT_V2 (trxd .rxd5 );
1891+
1892+ switch (val ) {
1893+ case PSE_GDM1_PORT :
1894+ case PSE_GDM2_PORT :
1895+ mac = val - 1 ;
1896+ break ;
1897+ case PSE_GDM3_PORT :
1898+ mac = MTK_GMAC3_ID ;
1899+ break ;
1900+ default :
1901+ break ;
1902+ }
1903+ } else if (!MTK_HAS_CAPS (eth -> soc -> caps , MTK_SOC_MT7628 ) &&
1904+ !(trxd .rxd4 & RX_DMA_SPECIAL_TAG )) {
18751905 mac = RX_DMA_GET_SPORT (trxd .rxd4 ) - 1 ;
1906+ }
18761907
18771908 if (unlikely (mac < 0 || mac >= MTK_MAX_DEVS ||
18781909 !eth -> netdev [mac ]))
@@ -2094,23 +2125,20 @@ static int mtk_poll_tx_qdma(struct mtk_eth *eth, int budget,
20942125
20952126 while ((cpu != dma ) && budget ) {
20962127 u32 next_cpu = desc -> txd2 ;
2097- int mac = 0 ;
20982128
20992129 desc = mtk_qdma_phys_to_virt (ring , desc -> txd2 );
21002130 if ((desc -> txd3 & TX_DMA_OWNER_CPU ) == 0 )
21012131 break ;
21022132
21032133 tx_buf = mtk_desc_to_tx_buf (ring , desc ,
21042134 eth -> soc -> txrx .txd_size );
2105- if (tx_buf -> flags & MTK_TX_FLAGS_FPORT1 )
2106- mac = 1 ;
2107-
21082135 if (!tx_buf -> data )
21092136 break ;
21102137
21112138 if (tx_buf -> data != (void * )MTK_DMA_DUMMY_DESC ) {
21122139 if (tx_buf -> type == MTK_TYPE_SKB )
2113- mtk_poll_tx_done (eth , state , mac , tx_buf -> data );
2140+ mtk_poll_tx_done (eth , state , tx_buf -> mac_id ,
2141+ tx_buf -> data );
21142142
21152143 budget -- ;
21162144 }
@@ -3721,7 +3749,24 @@ static int mtk_hw_init(struct mtk_eth *eth, bool reset)
37213749 mtk_w32 (eth , eth -> soc -> txrx .rx_irq_done_mask , reg_map -> qdma .int_grp + 4 );
37223750 mtk_w32 (eth , 0x21021000 , MTK_FE_INT_GRP );
37233751
3724- if (mtk_is_netsys_v2_or_greater (eth )) {
3752+ if (mtk_is_netsys_v3_or_greater (eth )) {
3753+ /* PSE should not drop port1, port8 and port9 packets */
3754+ mtk_w32 (eth , 0x00000302 , PSE_DROP_CFG );
3755+
3756+ /* GDM and CDM Threshold */
3757+ mtk_w32 (eth , 0x00000707 , MTK_CDMW0_THRES );
3758+ mtk_w32 (eth , 0x00000077 , MTK_CDMW1_THRES );
3759+
3760+ /* Disable GDM1 RX CRC stripping */
3761+ mtk_m32 (eth , MTK_GDMA_STRP_CRC , 0 , MTK_GDMA_FWD_CFG (0 ));
3762+
3763+ /* PSE GDM3 MIB counter has incorrect hw default values,
3764+ * so the driver ought to read clear the values beforehand
3765+ * in case ethtool retrieve wrong mib values.
3766+ */
3767+ for (i = 0 ; i < 0x80 ; i += 0x4 )
3768+ mtk_r32 (eth , reg_map -> gdm1_cnt + 0x100 + i );
3769+ } else if (!mtk_is_netsys_v1 (eth )) {
37253770 /* PSE should not drop port8 and port9 packets from WDMA Tx */
37263771 mtk_w32 (eth , 0x00000300 , PSE_DROP_CFG );
37273772
@@ -4284,7 +4329,11 @@ static int mtk_add_mac(struct mtk_eth *eth, struct device_node *np)
42844329 }
42854330 spin_lock_init (& mac -> hw_stats -> stats_lock );
42864331 u64_stats_init (& mac -> hw_stats -> syncp );
4287- mac -> hw_stats -> reg_offset = id * MTK_STAT_OFFSET ;
4332+
4333+ if (mtk_is_netsys_v3_or_greater (eth ))
4334+ mac -> hw_stats -> reg_offset = id * 0x80 ;
4335+ else
4336+ mac -> hw_stats -> reg_offset = id * 0x40 ;
42884337
42894338 /* phylink create */
42904339 err = of_get_phy_mode (np , & phy_mode );
0 commit comments