Skip to content

Commit 9ae7eca

Browse files
LorenzoBianconiPaolo Abeni
authored andcommitted
net: ethernet: mtk_wed: add mtk_wed_soc_data structure
Introduce mtk_wed_soc_data utility structure to contain per-SoC definitions. Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
1 parent c80471b commit 9ae7eca

File tree

3 files changed

+51
-32
lines changed

3 files changed

+51
-32
lines changed

drivers/net/ethernet/mediatek/mtk_wed.c

Lines changed: 40 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
5272
static void
5373
wed_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

753773
static 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
12561265
mtk_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
12851293
mtk_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);

drivers/net/ethernet/mediatek/mtk_wed.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,18 @@
1212
struct mtk_eth;
1313
struct mtk_wed_wo;
1414

15+
struct mtk_wed_soc_data {
16+
struct {
17+
u32 tx_bm_tkid;
18+
u32 wpdma_rx_ring0;
19+
u32 reset_idx_tx_mask;
20+
u32 reset_idx_rx_mask;
21+
} regmap;
22+
u32 wdma_desc_size;
23+
};
24+
1525
struct mtk_wed_hw {
26+
const struct mtk_wed_soc_data *soc;
1627
struct device_node *node;
1728
struct mtk_eth *eth;
1829
struct regmap *regs;

drivers/net/ethernet/mediatek/mtk_wed_regs.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,6 @@ struct mtk_wdma_desc {
100100

101101
#define MTK_WED_TX_BM_BASE 0x084
102102

103-
#define MTK_WED_TX_BM_TKID 0x088
104-
#define MTK_WED_TX_BM_TKID_V2 0x0c8
105103
#define MTK_WED_TX_BM_TKID_START GENMASK(15, 0)
106104
#define MTK_WED_TX_BM_TKID_END GENMASK(31, 16)
107105

@@ -160,9 +158,6 @@ struct mtk_wdma_desc {
160158
#define MTK_WED_GLO_CFG_RX_2B_OFFSET BIT(31)
161159

162160
#define MTK_WED_RESET_IDX 0x20c
163-
#define MTK_WED_RESET_IDX_TX GENMASK(3, 0)
164-
#define MTK_WED_RESET_IDX_RX GENMASK(17, 16)
165-
#define MTK_WED_RESET_IDX_RX_V2 GENMASK(7, 6)
166161
#define MTK_WED_RESET_WPDMA_IDX_RX GENMASK(31, 30)
167162

168163
#define MTK_WED_TX_MIB(_n) (0x2a0 + (_n) * 4)
@@ -286,7 +281,6 @@ struct mtk_wdma_desc {
286281
#define MTK_WED_WPDMA_RX_D_RST_DRV_IDX GENMASK(25, 24)
287282

288283
#define MTK_WED_WPDMA_RX_GLO_CFG 0x76c
289-
#define MTK_WED_WPDMA_RX_RING 0x770
290284

291285
#define MTK_WED_WPDMA_RX_D_MIB(_n) (0x774 + (_n) * 4)
292286
#define MTK_WED_WPDMA_RX_D_PROCESSED_MIB(_n) (0x784 + (_n) * 4)

0 commit comments

Comments
 (0)