@@ -49,6 +49,26 @@ struct mtk_wed_flow_block_priv {
4949 struct net_device * dev ;
5050};
5151
52+ static const struct mtk_wed_soc_data mt7622_data = {
53+ .regmap = {
54+ .tx_bm_tkid = 0x088 ,
55+ .wpdma_rx_ring0 = 0x770 ,
56+ .reset_idx_tx_mask = GENMASK (3 , 0 ),
57+ .reset_idx_rx_mask = GENMASK (17 , 16 ),
58+ },
59+ .wdma_desc_size = sizeof (struct mtk_wdma_desc ),
60+ };
61+
62+ static const struct mtk_wed_soc_data mt7986_data = {
63+ .regmap = {
64+ .tx_bm_tkid = 0x0c8 ,
65+ .wpdma_rx_ring0 = 0x770 ,
66+ .reset_idx_tx_mask = GENMASK (1 , 0 ),
67+ .reset_idx_rx_mask = GENMASK (7 , 6 ),
68+ },
69+ .wdma_desc_size = 2 * sizeof (struct mtk_wdma_desc ),
70+ };
71+
5272static void
5373wed_m32 (struct mtk_wed_device * dev , u32 reg , u32 mask , u32 val )
5474{
@@ -747,7 +767,7 @@ mtk_wed_set_wpdma(struct mtk_wed_device *dev)
747767 return ;
748768
749769 wed_w32 (dev , MTK_WED_WPDMA_RX_GLO_CFG , dev -> wlan .wpdma_rx_glo );
750- wed_w32 (dev , MTK_WED_WPDMA_RX_RING , dev -> wlan .wpdma_rx );
770+ wed_w32 (dev , dev -> hw -> soc -> regmap . wpdma_rx_ring0 , dev -> wlan .wpdma_rx );
751771}
752772
753773static void
@@ -941,22 +961,10 @@ mtk_wed_hw_init(struct mtk_wed_device *dev)
941961 wed_w32 (dev , MTK_WED_TX_BM_BUF_LEN , MTK_WED_PKT_SIZE );
942962
943963 if (mtk_wed_is_v1 (dev -> hw )) {
944- wed_w32 (dev , MTK_WED_TX_BM_TKID ,
945- FIELD_PREP (MTK_WED_TX_BM_TKID_START ,
946- dev -> wlan .token_start ) |
947- FIELD_PREP (MTK_WED_TX_BM_TKID_END ,
948- dev -> wlan .token_start +
949- dev -> wlan .nbuf - 1 ));
950964 wed_w32 (dev , MTK_WED_TX_BM_DYN_THR ,
951965 FIELD_PREP (MTK_WED_TX_BM_DYN_THR_LO , 1 ) |
952966 MTK_WED_TX_BM_DYN_THR_HI );
953967 } else {
954- wed_w32 (dev , MTK_WED_TX_BM_TKID_V2 ,
955- FIELD_PREP (MTK_WED_TX_BM_TKID_START ,
956- dev -> wlan .token_start ) |
957- FIELD_PREP (MTK_WED_TX_BM_TKID_END ,
958- dev -> wlan .token_start +
959- dev -> wlan .nbuf - 1 ));
960968 wed_w32 (dev , MTK_WED_TX_BM_DYN_THR ,
961969 FIELD_PREP (MTK_WED_TX_BM_DYN_THR_LO_V2 , 0 ) |
962970 MTK_WED_TX_BM_DYN_THR_HI_V2 );
@@ -971,6 +979,11 @@ mtk_wed_hw_init(struct mtk_wed_device *dev)
971979 MTK_WED_TX_TKID_DYN_THR_HI );
972980 }
973981
982+ wed_w32 (dev , dev -> hw -> soc -> regmap .tx_bm_tkid ,
983+ FIELD_PREP (MTK_WED_TX_BM_TKID_START , dev -> wlan .token_start ) |
984+ FIELD_PREP (MTK_WED_TX_BM_TKID_END ,
985+ dev -> wlan .token_start + dev -> wlan .nbuf - 1 ));
986+
974987 mtk_wed_reset (dev , MTK_WED_RESET_TX_BM );
975988
976989 if (mtk_wed_is_v1 (dev -> hw )) {
@@ -1105,13 +1118,8 @@ mtk_wed_rx_reset(struct mtk_wed_device *dev)
11051118 if (ret ) {
11061119 mtk_wed_reset (dev , MTK_WED_RESET_WED_RX_DMA );
11071120 } else {
1108- struct mtk_eth * eth = dev -> hw -> eth ;
1109-
1110- if (mtk_is_netsys_v2_or_greater (eth ))
1111- wed_set (dev , MTK_WED_RESET_IDX ,
1112- MTK_WED_RESET_IDX_RX_V2 );
1113- else
1114- wed_set (dev , MTK_WED_RESET_IDX , MTK_WED_RESET_IDX_RX );
1121+ wed_set (dev , MTK_WED_RESET_IDX ,
1122+ dev -> hw -> soc -> regmap .reset_idx_rx_mask );
11151123 wed_w32 (dev , MTK_WED_RESET_IDX , 0 );
11161124 }
11171125
@@ -1164,7 +1172,8 @@ mtk_wed_reset_dma(struct mtk_wed_device *dev)
11641172 if (busy ) {
11651173 mtk_wed_reset (dev , MTK_WED_RESET_WED_TX_DMA );
11661174 } else {
1167- wed_w32 (dev , MTK_WED_RESET_IDX , MTK_WED_RESET_IDX_TX );
1175+ wed_w32 (dev , MTK_WED_RESET_IDX ,
1176+ dev -> hw -> soc -> regmap .reset_idx_tx_mask );
11681177 wed_w32 (dev , MTK_WED_RESET_IDX , 0 );
11691178 }
11701179
@@ -1256,15 +1265,14 @@ static int
12561265mtk_wed_wdma_rx_ring_setup (struct mtk_wed_device * dev , int idx , int size ,
12571266 bool reset )
12581267{
1259- u32 desc_size = sizeof (struct mtk_wdma_desc ) * dev -> hw -> version ;
12601268 struct mtk_wed_ring * wdma ;
12611269
12621270 if (idx >= ARRAY_SIZE (dev -> rx_wdma ))
12631271 return - EINVAL ;
12641272
12651273 wdma = & dev -> rx_wdma [idx ];
12661274 if (!reset && mtk_wed_ring_alloc (dev , wdma , MTK_WED_WDMA_RING_SIZE ,
1267- desc_size , true))
1275+ dev -> hw -> soc -> wdma_desc_size , true))
12681276 return - ENOMEM ;
12691277
12701278 wdma_w32 (dev , MTK_WDMA_RING_RX (idx ) + MTK_WED_RING_OFS_BASE ,
@@ -1285,15 +1293,14 @@ static int
12851293mtk_wed_wdma_tx_ring_setup (struct mtk_wed_device * dev , int idx , int size ,
12861294 bool reset )
12871295{
1288- u32 desc_size = sizeof (struct mtk_wdma_desc ) * dev -> hw -> version ;
12891296 struct mtk_wed_ring * wdma ;
12901297
12911298 if (idx >= ARRAY_SIZE (dev -> tx_wdma ))
12921299 return - EINVAL ;
12931300
12941301 wdma = & dev -> tx_wdma [idx ];
12951302 if (!reset && mtk_wed_ring_alloc (dev , wdma , MTK_WED_WDMA_RING_SIZE ,
1296- desc_size , true))
1303+ dev -> hw -> soc -> wdma_desc_size , true))
12971304 return - ENOMEM ;
12981305
12991306 wdma_w32 (dev , MTK_WDMA_RING_TX (idx ) + MTK_WED_RING_OFS_BASE ,
@@ -1932,7 +1939,12 @@ void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
19321939 hw -> irq = irq ;
19331940 hw -> version = eth -> soc -> version ;
19341941
1935- if (mtk_wed_is_v1 (hw )) {
1942+ switch (hw -> version ) {
1943+ case 2 :
1944+ hw -> soc = & mt7986_data ;
1945+ break ;
1946+ default :
1947+ case 1 :
19361948 hw -> mirror = syscon_regmap_lookup_by_phandle (eth_np ,
19371949 "mediatek,pcie-mirror" );
19381950 hw -> hifsys = syscon_regmap_lookup_by_phandle (eth_np ,
@@ -1946,6 +1958,8 @@ void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
19461958 regmap_write (hw -> mirror , 0 , 0 );
19471959 regmap_write (hw -> mirror , 4 , 0 );
19481960 }
1961+ hw -> soc = & mt7622_data ;
1962+ break ;
19491963 }
19501964
19511965 mtk_wed_hw_add_debugfs (hw );
0 commit comments