Skip to content

Commit f473b42

Browse files
committed
mt76: only iterate over initialized rx queues
Fixes the following reported crash: [ 2.361127] BUG: spinlock bad magic on CPU#0, modprobe/456 [ 2.361583] lock: 0xffffa1287525b3b8, .magic: 00000000, .owner: <none>/-1, .owner_cpu: 0 [ 2.362250] CPU: 0 PID: 456 Comm: modprobe Not tainted 4.14.177 #5 [ 2.362751] Hardware name: HP Meep/Meep, BIOS Google_Meep.11297.75.0 06/17/2019 [ 2.363343] Call Trace: [ 2.363552] dump_stack+0x97/0xdb [ 2.363826] ? spin_bug+0xa6/0xb3 [ 2.364096] do_raw_spin_lock+0x6a/0x9a [ 2.364417] mt76_dma_rx_fill+0x44/0x1de [mt76] [ 2.364787] ? mt76_dma_kick_queue+0x18/0x18 [mt76] [ 2.365184] mt76_dma_init+0x53/0x85 [mt76] [ 2.365532] mt7615_dma_init+0x3d7/0x546 [mt7615e] [ 2.365928] mt7615_register_device+0xe6/0x1a0 [mt7615e] [ 2.366364] mt7615_mmio_probe+0x14b/0x171 [mt7615e] [ 2.366771] mt7615_pci_probe+0x118/0x13b [mt7615e] [ 2.367169] pci_device_probe+0xaf/0x13d [ 2.367491] driver_probe_device+0x284/0x2ca [ 2.367840] __driver_attach+0x7a/0x9e [ 2.368146] ? driver_attach+0x1f/0x1f [ 2.368451] bus_for_each_dev+0xa0/0xdb [ 2.368765] bus_add_driver+0x132/0x204 [ 2.369078] driver_register+0x8e/0xcd [ 2.369384] do_one_initcall+0x160/0x257 [ 2.369706] ? 0xffffffffc0240000 [ 2.369980] do_init_module+0x60/0x1bb [ 2.370286] load_module+0x18c2/0x1a2b [ 2.370596] ? kernel_read_file+0x141/0x1b9 [ 2.370937] ? kernel_read_file_from_fd+0x46/0x71 [ 2.371320] SyS_finit_module+0xcc/0xf0 [ 2.371636] do_syscall_64+0x6b/0xf7 [ 2.371930] entry_SYSCALL_64_after_hwframe+0x3d/0xa2 [ 2.372344] RIP: 0033:0x7da218ae4199 [ 2.372637] RSP: 002b:00007fffd0608398 EFLAGS: 00000246 ORIG_RAX: 0000000000000139 [ 2.373252] RAX: ffffffffffffffda RBX: 00005a705449df90 RCX: 00007da218ae4199 [ 2.373833] RDX: 0000000000000000 RSI: 00005a7052e73bd8 RDI: 0000000000000006 [ 2.374411] RBP: 00007fffd06083e0 R08: 0000000000000000 R09: 00005a705449d540 [ 2.374989] R10: 0000000000000006 R11: 0000000000000246 R12: 0000000000000000 [ 2.375569] R13: 00005a705449def0 R14: 00005a7052e73bd8 R15: 0000000000000000 Reported-by: Sean Wang <[email protected]> Fixes: d3377b7 ("mt76: add HE phy modes and hardware queue") Signed-off-by: Felix Fietkau <[email protected]>
1 parent e47f224 commit f473b42

File tree

8 files changed

+20
-10
lines changed

8 files changed

+20
-10
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ static int mt76_rx_queues_read(struct seq_file *s, void *data)
5151
struct mt76_dev *dev = dev_get_drvdata(s->private);
5252
int i, queued;
5353

54-
for (i = 0; i < ARRAY_SIZE(dev->q_rx); i++) {
54+
mt76_for_each_q_rx(dev, i) {
5555
struct mt76_queue *q = &dev->q_rx[i];
5656

5757
if (!q->ndesc)

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -576,7 +576,7 @@ mt76_dma_init(struct mt76_dev *dev)
576576

577577
init_dummy_netdev(&dev->napi_dev);
578578

579-
for (i = 0; i < ARRAY_SIZE(dev->q_rx); i++) {
579+
mt76_for_each_q_rx(dev, i) {
580580
netif_napi_add(&dev->napi_dev, &dev->napi[i], mt76_dma_rx_poll,
581581
64);
582582
mt76_dma_rx_fill(dev, &dev->q_rx[i]);
@@ -610,7 +610,7 @@ void mt76_dma_cleanup(struct mt76_dev *dev)
610610
for (i = 0; i < ARRAY_SIZE(dev->q_tx); i++)
611611
mt76_dma_tx_cleanup(dev, i, true);
612612

613-
for (i = 0; i < ARRAY_SIZE(dev->q_rx); i++) {
613+
mt76_for_each_q_rx(dev, i) {
614614
netif_napi_del(&dev->napi[i]);
615615
mt76_dma_rx_cleanup(dev, &dev->q_rx[i]);
616616
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -671,6 +671,10 @@ static inline u16 mt76_rev(struct mt76_dev *dev)
671671
#define mt76_queue_tx_cleanup(dev, ...) (dev)->mt76.queue_ops->tx_cleanup(&((dev)->mt76), __VA_ARGS__)
672672
#define mt76_queue_kick(dev, ...) (dev)->mt76.queue_ops->kick(&((dev)->mt76), __VA_ARGS__)
673673

674+
#define mt76_for_each_q_rx(dev, i) \
675+
for (i = 0; i < ARRAY_SIZE((dev)->q_rx) && \
676+
(dev)->q_rx[i].ndesc; i++)
677+
674678
struct mt76_dev *mt76_alloc_device(struct device *pdev, unsigned int size,
675679
const struct ieee80211_ops *ops,
676680
const struct mt76_driver_ops *drv_ops);

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1438,8 +1438,9 @@ static void mt7603_mac_watchdog_reset(struct mt7603_dev *dev)
14381438
for (i = 0; i < __MT_TXQ_MAX; i++)
14391439
mt76_queue_tx_cleanup(dev, i, true);
14401440

1441-
for (i = 0; i < ARRAY_SIZE(dev->mt76.q_rx); i++)
1441+
mt76_for_each_q_rx(&dev->mt76, i) {
14421442
mt76_queue_rx_reset(dev, i);
1443+
}
14431444

14441445
mt7603_dma_sched_reset(dev);
14451446

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1820,8 +1820,9 @@ void mt7615_dma_reset(struct mt7615_dev *dev)
18201820
for (i = 0; i < __MT_TXQ_MAX; i++)
18211821
mt76_queue_tx_cleanup(dev, i, true);
18221822

1823-
for (i = 0; i < ARRAY_SIZE(dev->mt76.q_rx); i++)
1823+
mt76_for_each_q_rx(&dev->mt76, i) {
18241824
mt76_queue_rx_reset(dev, i);
1825+
}
18251826

18261827
mt76_set(dev, MT_WPDMA_GLO_CFG,
18271828
MT_WPDMA_GLO_CFG_RX_DMA_EN | MT_WPDMA_GLO_CFG_TX_DMA_EN |

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,9 @@ static int mt7615_pci_suspend(struct pci_dev *pdev, pm_message_t state)
8686
napi_disable(&mdev->tx_napi);
8787
tasklet_kill(&mdev->tx_tasklet);
8888

89-
for (i = 0; i < ARRAY_SIZE(mdev->q_rx); i++)
89+
mt76_for_each_q_rx(mdev, i) {
9090
napi_disable(&mdev->napi[i]);
91+
}
9192
tasklet_kill(&dev->irq_tasklet);
9293

9394
mt7615_dma_reset(dev);
@@ -120,8 +121,9 @@ static int mt7615_pci_suspend(struct pci_dev *pdev, pm_message_t state)
120121
return 0;
121122

122123
restore:
123-
for (i = 0; i < ARRAY_SIZE(mdev->q_rx); i++)
124+
mt76_for_each_q_rx(mdev, i) {
124125
napi_enable(&mdev->napi[i]);
126+
}
125127
napi_enable(&mdev->tx_napi);
126128
if (hif_suspend)
127129
mt7615_mcu_set_hif_suspend(dev, false);
@@ -156,7 +158,7 @@ static int mt7615_pci_resume(struct pci_dev *pdev)
156158
if (pdma_reset)
157159
dev_err(mdev->dev, "PDMA engine must be reinitialized\n");
158160

159-
for (i = 0; i < ARRAY_SIZE(mdev->q_rx); i++) {
161+
mt76_for_each_q_rx(mdev, i) {
160162
napi_enable(&mdev->napi[i]);
161163
napi_schedule(&mdev->napi[i]);
162164
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -489,8 +489,9 @@ static void mt76x02_watchdog_reset(struct mt76x02_dev *dev)
489489
for (i = 0; i < __MT_TXQ_MAX; i++)
490490
mt76_queue_tx_cleanup(dev, i, true);
491491

492-
for (i = 0; i < ARRAY_SIZE(dev->mt76.q_rx); i++)
492+
mt76_for_each_q_rx(&dev->mt76, i) {
493493
mt76_queue_rx_reset(dev, i);
494+
}
494495

495496
mt76x02_mac_start(dev);
496497

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1146,8 +1146,9 @@ mt7915_dma_reset(struct mt7915_dev *dev)
11461146
for (i = 0; i < __MT_TXQ_MAX; i++)
11471147
mt76_queue_tx_cleanup(dev, i, true);
11481148

1149-
for (i = 0; i < ARRAY_SIZE(dev->mt76.q_rx); i++)
1149+
mt76_for_each_q_rx(&dev->mt76, i) {
11501150
mt76_queue_rx_reset(dev, i);
1151+
}
11511152

11521153
/* re-init prefetch settings after reset */
11531154
mt7915_dma_prefetch(dev);

0 commit comments

Comments
 (0)