Skip to content

Commit d493bb5

Browse files
Bo Jiaonbd168
authored andcommitted
wifi: mt76: mt7915: rework mt7915_dma_reset()
Reuse mt7915_dma_disable() to reduce duplicated code. This is a preliminary patch to enable full system reset. Co-developed-by: Ryder Lee <ryder.lee@mediatek.com> Signed-off-by: Ryder Lee <ryder.lee@mediatek.com> Signed-off-by: Bo Jiao <Bo.Jiao@mediatek.com> Signed-off-by: Felix Fietkau <nbd@nbd.name>
1 parent d107501 commit d493bb5

File tree

3 files changed

+91
-89
lines changed

3 files changed

+91
-89
lines changed

drivers/net/wireless/mediatek/mt76/mt7915/dma.c

Lines changed: 89 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -50,23 +50,37 @@ static void mt7915_dma_config(struct mt7915_dev *dev)
5050
#define TXQ_CONFIG(q, wfdma, int, id) Q_CONFIG(__TXQ(q), (wfdma), (int), (id))
5151

5252
if (is_mt7915(&dev->mt76)) {
53-
RXQ_CONFIG(MT_RXQ_MAIN, WFDMA0, MT_INT_RX_DONE_BAND0, MT7915_RXQ_BAND0);
54-
RXQ_CONFIG(MT_RXQ_MCU, WFDMA1, MT_INT_RX_DONE_WM, MT7915_RXQ_MCU_WM);
55-
RXQ_CONFIG(MT_RXQ_MCU_WA, WFDMA1, MT_INT_RX_DONE_WA, MT7915_RXQ_MCU_WA);
56-
RXQ_CONFIG(MT_RXQ_BAND1, WFDMA0, MT_INT_RX_DONE_BAND1, MT7915_RXQ_BAND1);
57-
RXQ_CONFIG(MT_RXQ_BAND1_WA, WFDMA1, MT_INT_RX_DONE_WA_EXT, MT7915_RXQ_MCU_WA_EXT);
58-
RXQ_CONFIG(MT_RXQ_MAIN_WA, WFDMA1, MT_INT_RX_DONE_WA_MAIN, MT7915_RXQ_MCU_WA);
53+
RXQ_CONFIG(MT_RXQ_MAIN, WFDMA0, MT_INT_RX_DONE_BAND0,
54+
MT7915_RXQ_BAND0);
55+
RXQ_CONFIG(MT_RXQ_MCU, WFDMA1, MT_INT_RX_DONE_WM,
56+
MT7915_RXQ_MCU_WM);
57+
RXQ_CONFIG(MT_RXQ_MCU_WA, WFDMA1, MT_INT_RX_DONE_WA,
58+
MT7915_RXQ_MCU_WA);
59+
RXQ_CONFIG(MT_RXQ_BAND1, WFDMA0, MT_INT_RX_DONE_BAND1,
60+
MT7915_RXQ_BAND1);
61+
RXQ_CONFIG(MT_RXQ_BAND1_WA, WFDMA1, MT_INT_RX_DONE_WA_EXT,
62+
MT7915_RXQ_MCU_WA_EXT);
63+
RXQ_CONFIG(MT_RXQ_MAIN_WA, WFDMA1, MT_INT_RX_DONE_WA_MAIN,
64+
MT7915_RXQ_MCU_WA);
5965
TXQ_CONFIG(0, WFDMA1, MT_INT_TX_DONE_BAND0, MT7915_TXQ_BAND0);
6066
TXQ_CONFIG(1, WFDMA1, MT_INT_TX_DONE_BAND1, MT7915_TXQ_BAND1);
61-
MCUQ_CONFIG(MT_MCUQ_WM, WFDMA1, MT_INT_TX_DONE_MCU_WM, MT7915_TXQ_MCU_WM);
62-
MCUQ_CONFIG(MT_MCUQ_WA, WFDMA1, MT_INT_TX_DONE_MCU_WA, MT7915_TXQ_MCU_WA);
63-
MCUQ_CONFIG(MT_MCUQ_FWDL, WFDMA1, MT_INT_TX_DONE_FWDL, MT7915_TXQ_FWDL);
67+
MCUQ_CONFIG(MT_MCUQ_WM, WFDMA1, MT_INT_TX_DONE_MCU_WM,
68+
MT7915_TXQ_MCU_WM);
69+
MCUQ_CONFIG(MT_MCUQ_WA, WFDMA1, MT_INT_TX_DONE_MCU_WA,
70+
MT7915_TXQ_MCU_WA);
71+
MCUQ_CONFIG(MT_MCUQ_FWDL, WFDMA1, MT_INT_TX_DONE_FWDL,
72+
MT7915_TXQ_FWDL);
6473
} else {
65-
RXQ_CONFIG(MT_RXQ_MCU, WFDMA0, MT_INT_RX_DONE_WM, MT7916_RXQ_MCU_WM);
66-
RXQ_CONFIG(MT_RXQ_BAND1_WA, WFDMA0, MT_INT_RX_DONE_WA_EXT_MT7916, MT7916_RXQ_MCU_WA_EXT);
67-
MCUQ_CONFIG(MT_MCUQ_WM, WFDMA0, MT_INT_TX_DONE_MCU_WM, MT7915_TXQ_MCU_WM);
68-
MCUQ_CONFIG(MT_MCUQ_WA, WFDMA0, MT_INT_TX_DONE_MCU_WA_MT7916, MT7915_TXQ_MCU_WA);
69-
MCUQ_CONFIG(MT_MCUQ_FWDL, WFDMA0, MT_INT_TX_DONE_FWDL, MT7915_TXQ_FWDL);
74+
RXQ_CONFIG(MT_RXQ_MCU, WFDMA0, MT_INT_RX_DONE_WM,
75+
MT7916_RXQ_MCU_WM);
76+
RXQ_CONFIG(MT_RXQ_BAND1_WA, WFDMA0, MT_INT_RX_DONE_WA_EXT_MT7916,
77+
MT7916_RXQ_MCU_WA_EXT);
78+
MCUQ_CONFIG(MT_MCUQ_WM, WFDMA0, MT_INT_TX_DONE_MCU_WM,
79+
MT7915_TXQ_MCU_WM);
80+
MCUQ_CONFIG(MT_MCUQ_WA, WFDMA0, MT_INT_TX_DONE_MCU_WA_MT7916,
81+
MT7915_TXQ_MCU_WA);
82+
MCUQ_CONFIG(MT_MCUQ_FWDL, WFDMA0, MT_INT_TX_DONE_FWDL,
83+
MT7915_TXQ_FWDL);
7084

7185
if (is_mt7916(&dev->mt76) && mtk_wed_device_active(&dev->mt76.mmio.wed)) {
7286
RXQ_CONFIG(MT_RXQ_MAIN, WFDMA0, MT_INT_WED_RX_DONE_BAND0_MT7916,
@@ -77,16 +91,23 @@ static void mt7915_dma_config(struct mt7915_dev *dev)
7791
MT7916_RXQ_BAND1);
7892
RXQ_CONFIG(MT_RXQ_MAIN_WA, WFDMA0, MT_INT_WED_RX_DONE_WA_MAIN_MT7916,
7993
MT7916_RXQ_MCU_WA_MAIN);
80-
TXQ_CONFIG(0, WFDMA0, MT_INT_WED_TX_DONE_BAND0, MT7915_TXQ_BAND0);
81-
TXQ_CONFIG(1, WFDMA0, MT_INT_WED_TX_DONE_BAND1, MT7915_TXQ_BAND1);
94+
TXQ_CONFIG(0, WFDMA0, MT_INT_WED_TX_DONE_BAND0,
95+
MT7915_TXQ_BAND0);
96+
TXQ_CONFIG(1, WFDMA0, MT_INT_WED_TX_DONE_BAND1,
97+
MT7915_TXQ_BAND1);
8298
} else {
83-
RXQ_CONFIG(MT_RXQ_MAIN, WFDMA0, MT_INT_RX_DONE_BAND0_MT7916, MT7916_RXQ_BAND0);
84-
RXQ_CONFIG(MT_RXQ_MCU_WA, WFDMA0, MT_INT_RX_DONE_WA, MT7916_RXQ_MCU_WA);
85-
RXQ_CONFIG(MT_RXQ_BAND1, WFDMA0, MT_INT_RX_DONE_BAND1_MT7916, MT7916_RXQ_BAND1);
99+
RXQ_CONFIG(MT_RXQ_MAIN, WFDMA0, MT_INT_RX_DONE_BAND0_MT7916,
100+
MT7916_RXQ_BAND0);
101+
RXQ_CONFIG(MT_RXQ_MCU_WA, WFDMA0, MT_INT_RX_DONE_WA,
102+
MT7916_RXQ_MCU_WA);
103+
RXQ_CONFIG(MT_RXQ_BAND1, WFDMA0, MT_INT_RX_DONE_BAND1_MT7916,
104+
MT7916_RXQ_BAND1);
86105
RXQ_CONFIG(MT_RXQ_MAIN_WA, WFDMA0, MT_INT_RX_DONE_WA_MAIN_MT7916,
87106
MT7916_RXQ_MCU_WA_MAIN);
88-
TXQ_CONFIG(0, WFDMA0, MT_INT_TX_DONE_BAND0, MT7915_TXQ_BAND0);
89-
TXQ_CONFIG(1, WFDMA0, MT_INT_TX_DONE_BAND1, MT7915_TXQ_BAND1);
107+
TXQ_CONFIG(0, WFDMA0, MT_INT_TX_DONE_BAND0,
108+
MT7915_TXQ_BAND0);
109+
TXQ_CONFIG(1, WFDMA0, MT_INT_TX_DONE_BAND1,
110+
MT7915_TXQ_BAND1);
90111
}
91112
}
92113
}
@@ -514,6 +535,53 @@ int mt7915_dma_init(struct mt7915_dev *dev, struct mt7915_phy *phy2)
514535
return 0;
515536
}
516537

538+
int mt7915_dma_reset(struct mt7915_dev *dev, bool force)
539+
{
540+
struct mt76_phy *mphy_ext = dev->mt76.phys[MT_BAND1];
541+
int i;
542+
543+
/* clean up hw queues */
544+
for (i = 0; i < ARRAY_SIZE(dev->mt76.phy.q_tx); i++) {
545+
mt76_queue_tx_cleanup(dev, dev->mphy.q_tx[i], true);
546+
if (mphy_ext)
547+
mt76_queue_tx_cleanup(dev, mphy_ext->q_tx[i], true);
548+
}
549+
550+
for (i = 0; i < ARRAY_SIZE(dev->mt76.q_mcu); i++)
551+
mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[i], true);
552+
553+
mt76_for_each_q_rx(&dev->mt76, i)
554+
mt76_queue_rx_cleanup(dev, &dev->mt76.q_rx[i]);
555+
556+
/* reset wfsys */
557+
if (force)
558+
mt7915_wfsys_reset(dev);
559+
560+
mt7915_dma_disable(dev, force);
561+
562+
/* reset hw queues */
563+
for (i = 0; i < __MT_TXQ_MAX; i++) {
564+
mt76_queue_reset(dev, dev->mphy.q_tx[i]);
565+
if (mphy_ext)
566+
mt76_queue_reset(dev, mphy_ext->q_tx[i]);
567+
}
568+
569+
for (i = 0; i < __MT_MCUQ_MAX; i++)
570+
mt76_queue_reset(dev, dev->mt76.q_mcu[i]);
571+
572+
mt76_for_each_q_rx(&dev->mt76, i)
573+
mt76_queue_reset(dev, &dev->mt76.q_rx[i]);
574+
575+
mt76_tx_status_check(&dev->mt76, true);
576+
577+
mt7915_dma_enable(dev);
578+
579+
mt76_for_each_q_rx(&dev->mt76, i)
580+
mt76_queue_rx_reset(dev, i);
581+
582+
return 0;
583+
}
584+
517585
void mt7915_dma_cleanup(struct mt7915_dev *dev)
518586
{
519587
mt7915_dma_disable(dev, true);

drivers/net/wireless/mediatek/mt76/mt7915/mac.c

Lines changed: 1 addition & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1332,73 +1332,6 @@ mt7915_update_beacons(struct mt7915_dev *dev)
13321332
mt7915_update_vif_beacon, mphy_ext->hw);
13331333
}
13341334

1335-
static void
1336-
mt7915_dma_reset(struct mt7915_dev *dev)
1337-
{
1338-
struct mt76_phy *mphy_ext = dev->mt76.phys[MT_BAND1];
1339-
u32 hif1_ofs = MT_WFDMA0_PCIE1(0) - MT_WFDMA0(0);
1340-
int i;
1341-
1342-
mt76_clear(dev, MT_WFDMA0_GLO_CFG,
1343-
MT_WFDMA0_GLO_CFG_TX_DMA_EN |
1344-
MT_WFDMA0_GLO_CFG_RX_DMA_EN);
1345-
1346-
if (is_mt7915(&dev->mt76))
1347-
mt76_clear(dev, MT_WFDMA1_GLO_CFG,
1348-
MT_WFDMA1_GLO_CFG_TX_DMA_EN |
1349-
MT_WFDMA1_GLO_CFG_RX_DMA_EN);
1350-
if (dev->hif2) {
1351-
mt76_clear(dev, MT_WFDMA0_GLO_CFG + hif1_ofs,
1352-
MT_WFDMA0_GLO_CFG_TX_DMA_EN |
1353-
MT_WFDMA0_GLO_CFG_RX_DMA_EN);
1354-
1355-
if (is_mt7915(&dev->mt76))
1356-
mt76_clear(dev, MT_WFDMA1_GLO_CFG + hif1_ofs,
1357-
MT_WFDMA1_GLO_CFG_TX_DMA_EN |
1358-
MT_WFDMA1_GLO_CFG_RX_DMA_EN);
1359-
}
1360-
1361-
usleep_range(1000, 2000);
1362-
1363-
for (i = 0; i < __MT_TXQ_MAX; i++) {
1364-
mt76_queue_tx_cleanup(dev, dev->mphy.q_tx[i], true);
1365-
if (mphy_ext)
1366-
mt76_queue_tx_cleanup(dev, mphy_ext->q_tx[i], true);
1367-
}
1368-
1369-
for (i = 0; i < __MT_MCUQ_MAX; i++)
1370-
mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[i], true);
1371-
1372-
mt76_for_each_q_rx(&dev->mt76, i)
1373-
mt76_queue_rx_reset(dev, i);
1374-
1375-
mt76_tx_status_check(&dev->mt76, true);
1376-
1377-
/* re-init prefetch settings after reset */
1378-
mt7915_dma_prefetch(dev);
1379-
1380-
mt76_set(dev, MT_WFDMA0_GLO_CFG,
1381-
MT_WFDMA0_GLO_CFG_TX_DMA_EN | MT_WFDMA0_GLO_CFG_RX_DMA_EN);
1382-
if (is_mt7915(&dev->mt76))
1383-
mt76_set(dev, MT_WFDMA1_GLO_CFG,
1384-
MT_WFDMA1_GLO_CFG_TX_DMA_EN |
1385-
MT_WFDMA1_GLO_CFG_RX_DMA_EN |
1386-
MT_WFDMA1_GLO_CFG_OMIT_TX_INFO |
1387-
MT_WFDMA1_GLO_CFG_OMIT_RX_INFO);
1388-
if (dev->hif2) {
1389-
mt76_set(dev, MT_WFDMA0_GLO_CFG + hif1_ofs,
1390-
MT_WFDMA0_GLO_CFG_TX_DMA_EN |
1391-
MT_WFDMA0_GLO_CFG_RX_DMA_EN);
1392-
1393-
if (is_mt7915(&dev->mt76))
1394-
mt76_set(dev, MT_WFDMA1_GLO_CFG + hif1_ofs,
1395-
MT_WFDMA1_GLO_CFG_TX_DMA_EN |
1396-
MT_WFDMA1_GLO_CFG_RX_DMA_EN |
1397-
MT_WFDMA1_GLO_CFG_OMIT_TX_INFO |
1398-
MT_WFDMA1_GLO_CFG_OMIT_RX_INFO);
1399-
}
1400-
}
1401-
14021335
void mt7915_tx_token_put(struct mt7915_dev *dev)
14031336
{
14041337
struct mt76_txwi_cache *txwi;
@@ -1450,7 +1383,7 @@ void mt7915_mac_reset_work(struct work_struct *work)
14501383
mt76_wr(dev, MT_MCU_INT_EVENT, MT_MCU_INT_EVENT_DMA_STOPPED);
14511384

14521385
if (mt7915_wait_reset_state(dev, MT_MCU_CMD_RESET_DONE)) {
1453-
mt7915_dma_reset(dev);
1386+
mt7915_dma_reset(dev, false);
14541387

14551388
mt7915_tx_token_put(dev);
14561389
idr_init(&dev->mt76.token);

drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,7 @@ s8 mt7915_eeprom_get_power_delta(struct mt7915_dev *dev, int band);
447447
int mt7915_dma_init(struct mt7915_dev *dev, struct mt7915_phy *phy2);
448448
void mt7915_dma_prefetch(struct mt7915_dev *dev);
449449
void mt7915_dma_cleanup(struct mt7915_dev *dev);
450+
int mt7915_dma_reset(struct mt7915_dev *dev, bool force);
450451
int mt7915_mcu_init(struct mt7915_dev *dev);
451452
int mt7915_mcu_twt_agrt_update(struct mt7915_dev *dev,
452453
struct mt7915_vif *mvif,

0 commit comments

Comments
 (0)