Skip to content

Commit 970be1d

Browse files
committed
mt76: disable BH around napi_schedule() calls
napi_schedule() can call __raise_softirq_irqoff(), which can perform softirq handling, so it must not be called in a pure process context with BH enabled. Signed-off-by: Felix Fietkau <[email protected]>
1 parent abe3f3d commit 970be1d

File tree

9 files changed

+30
-4
lines changed

9 files changed

+30
-4
lines changed

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1471,17 +1471,20 @@ static void mt7603_mac_watchdog_reset(struct mt7603_dev *dev)
14711471
mutex_unlock(&dev->mt76.mutex);
14721472

14731473
mt76_worker_enable(&dev->mt76.tx_worker);
1474-
napi_enable(&dev->mt76.tx_napi);
1475-
napi_schedule(&dev->mt76.tx_napi);
14761474

14771475
tasklet_enable(&dev->mt76.pre_tbtt_tasklet);
14781476
mt7603_beacon_set_timer(dev, -1, beacon_int);
14791477

1478+
local_bh_disable();
1479+
napi_enable(&dev->mt76.tx_napi);
1480+
napi_schedule(&dev->mt76.tx_napi);
1481+
14801482
napi_enable(&dev->mt76.napi[0]);
14811483
napi_schedule(&dev->mt76.napi[0]);
14821484

14831485
napi_enable(&dev->mt76.napi[1]);
14841486
napi_schedule(&dev->mt76.napi[1]);
1487+
local_bh_enable();
14851488

14861489
ieee80211_wake_queues(dev->mt76.hw);
14871490
mt76_txq_schedule_all(&dev->mphy);

drivers/net/wireless/mediatek/mt76/mt7615/pci.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,12 +164,14 @@ static int mt7615_pci_resume(struct pci_dev *pdev)
164164
dev_err(mdev->dev, "PDMA engine must be reinitialized\n");
165165

166166
mt76_worker_enable(&mdev->tx_worker);
167+
local_bh_disable();
167168
mt76_for_each_q_rx(mdev, i) {
168169
napi_enable(&mdev->napi[i]);
169170
napi_schedule(&mdev->napi[i]);
170171
}
171172
napi_enable(&mdev->tx_napi);
172173
napi_schedule(&mdev->tx_napi);
174+
local_bh_enable();
173175

174176
if (!test_bit(MT76_STATE_SUSPEND, &dev->mphy.state) &&
175177
mt7615_firmware_offload(dev))

drivers/net/wireless/mediatek/mt76/mt7615/pci_mac.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,8 @@ void mt7615_mac_reset_work(struct work_struct *work)
326326
clear_bit(MT76_RESET, &phy2->mt76->state);
327327

328328
mt76_worker_enable(&dev->mt76.tx_worker);
329+
330+
local_bh_disable();
329331
napi_enable(&dev->mt76.tx_napi);
330332
napi_schedule(&dev->mt76.tx_napi);
331333

@@ -334,6 +336,7 @@ void mt7615_mac_reset_work(struct work_struct *work)
334336

335337
napi_enable(&dev->mt76.napi[1]);
336338
napi_schedule(&dev->mt76.napi[1]);
339+
local_bh_enable();
337340

338341
ieee80211_wake_queues(mt76_hw(dev));
339342
if (ext_phy)

drivers/net/wireless/mediatek/mt76/mt76x0/pci.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,7 @@ static int mt76x0e_resume(struct pci_dev *pdev)
276276

277277
mt76_worker_enable(&mdev->tx_worker);
278278

279+
local_bh_disable();
279280
mt76_for_each_q_rx(mdev, i) {
280281
mt76_queue_rx_reset(dev, i);
281282
napi_enable(&mdev->napi[i]);
@@ -284,6 +285,7 @@ static int mt76x0e_resume(struct pci_dev *pdev)
284285

285286
napi_enable(&mdev->tx_napi);
286287
napi_schedule(&mdev->tx_napi);
288+
local_bh_enable();
287289

288290
return mt76x0e_init_hardware(dev, true);
289291
}

drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -491,15 +491,17 @@ static void mt76x02_watchdog_reset(struct mt76x02_dev *dev)
491491
clear_bit(MT76_RESET, &dev->mphy.state);
492492

493493
mt76_worker_enable(&dev->mt76.tx_worker);
494+
tasklet_enable(&dev->mt76.pre_tbtt_tasklet);
495+
496+
local_bh_disable();
494497
napi_enable(&dev->mt76.tx_napi);
495498
napi_schedule(&dev->mt76.tx_napi);
496499

497-
tasklet_enable(&dev->mt76.pre_tbtt_tasklet);
498-
499500
mt76_for_each_q_rx(&dev->mt76, i) {
500501
napi_enable(&dev->mt76.napi[i]);
501502
napi_schedule(&dev->mt76.napi[i]);
502503
}
504+
local_bh_enable();
503505

504506
if (restart) {
505507
set_bit(MT76_RESTART, &dev->mphy.state);

drivers/net/wireless/mediatek/mt76/mt76x2/pci.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,12 +149,15 @@ mt76x2e_resume(struct pci_dev *pdev)
149149
pci_restore_state(pdev);
150150

151151
mt76_worker_enable(&mdev->tx_worker);
152+
153+
local_bh_disable();
152154
mt76_for_each_q_rx(mdev, i) {
153155
napi_enable(&mdev->napi[i]);
154156
napi_schedule(&mdev->napi[i]);
155157
}
156158
napi_enable(&mdev->tx_napi);
157159
napi_schedule(&mdev->tx_napi);
160+
local_bh_enable();
158161

159162
return mt76x2_resume_device(dev);
160163
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1837,6 +1837,7 @@ void mt7915_mac_reset_work(struct work_struct *work)
18371837
if (phy2)
18381838
clear_bit(MT76_RESET, &phy2->mt76->state);
18391839

1840+
local_bh_disable();
18401841
napi_enable(&dev->mt76.napi[0]);
18411842
napi_schedule(&dev->mt76.napi[0]);
18421843

@@ -1845,6 +1846,8 @@ void mt7915_mac_reset_work(struct work_struct *work)
18451846

18461847
napi_enable(&dev->mt76.napi[2]);
18471848
napi_schedule(&dev->mt76.napi[2]);
1849+
local_bh_enable();
1850+
18481851
tasklet_schedule(&dev->irq_tasklet);
18491852

18501853
mt76_wr(dev, MT_MCU_INT_EVENT, MT_MCU_INT_EVENT_RESET_DONE);

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1390,10 +1390,12 @@ mt7921_mac_reset(struct mt7921_dev *dev)
13901390

13911391
mt7921_wpdma_reset(dev, true);
13921392

1393+
local_bh_disable();
13931394
mt76_for_each_q_rx(&dev->mt76, i) {
13941395
napi_enable(&dev->mt76.napi[i]);
13951396
napi_schedule(&dev->mt76.napi[i]);
13961397
}
1398+
local_bh_enable();
13971399

13981400
clear_bit(MT76_MCU_RESET, &dev->mphy.state);
13991401

@@ -1418,8 +1420,11 @@ mt7921_mac_reset(struct mt7921_dev *dev)
14181420
out:
14191421
clear_bit(MT76_RESET, &dev->mphy.state);
14201422

1423+
local_bh_disable();
14211424
napi_enable(&dev->mt76.tx_napi);
14221425
napi_schedule(&dev->mt76.tx_napi);
1426+
local_bh_enable();
1427+
14231428
mt76_worker_enable(&dev->mt76.tx_worker);
14241429

14251430
return err;

drivers/net/wireless/mediatek/mt76/mt7921/pci.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,12 +302,15 @@ static int mt7921_pci_resume(struct pci_dev *pdev)
302302
MT_WFDMA0_GLO_CFG_TX_DMA_EN | MT_WFDMA0_GLO_CFG_RX_DMA_EN);
303303

304304
mt76_worker_enable(&mdev->tx_worker);
305+
306+
local_bh_disable();
305307
mt76_for_each_q_rx(mdev, i) {
306308
napi_enable(&mdev->napi[i]);
307309
napi_schedule(&mdev->napi[i]);
308310
}
309311
napi_enable(&mdev->tx_napi);
310312
napi_schedule(&mdev->tx_napi);
313+
local_bh_enable();
311314

312315
/* restore previous ds setting */
313316
if (!pm->ds_enable)

0 commit comments

Comments
 (0)