Skip to content

Commit 34b6954

Browse files
nbd168Kalle Valo
authored andcommitted
wifi: mt76: do not increase mcu skb refcount if retry is not supported
If mcu_skb_prepare_msg is not implemented, incrementing skb refcount does not work for mcu message retry. In some cases (e.g. on SDIO), shared skbs can trigger a BUG_ON, crashing the system. Fix this by only incrementing refcount if retry is actually supported. Fixes: 3688c18 ("wifi: mt76: mt7915: retry mcu messages") Closes: https://lore.kernel.org/r/d907b13a-f8be-4cb8-a0bb-560a21278041@notapiano/ Reported-by: Nícolas F. R. A. Prado <[email protected]> #KernelCI Tested-by: Alper Nebi Yasak <[email protected]> Signed-off-by: Felix Fietkau <[email protected]> Signed-off-by: Kalle Valo <[email protected]> Link: https://patch.msgid.link/[email protected]
1 parent 5575058 commit 34b6954

File tree

1 file changed

+5
-2
lines changed
  • drivers/net/wireless/mediatek/mt76

1 file changed

+5
-2
lines changed

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,13 +84,16 @@ int mt76_mcu_skb_send_and_get_msg(struct mt76_dev *dev, struct sk_buff *skb,
8484
mutex_lock(&dev->mcu.mutex);
8585

8686
if (dev->mcu_ops->mcu_skb_prepare_msg) {
87+
orig_skb = skb;
8788
ret = dev->mcu_ops->mcu_skb_prepare_msg(dev, skb, cmd, &seq);
8889
if (ret < 0)
8990
goto out;
9091
}
9192

9293
retry:
93-
orig_skb = skb_get(skb);
94+
/* orig skb might be needed for retry, mcu_skb_send_msg consumes it */
95+
if (orig_skb)
96+
skb_get(orig_skb);
9497
ret = dev->mcu_ops->mcu_skb_send_msg(dev, skb, cmd, &seq);
9598
if (ret < 0)
9699
goto out;
@@ -105,7 +108,7 @@ int mt76_mcu_skb_send_and_get_msg(struct mt76_dev *dev, struct sk_buff *skb,
105108
do {
106109
skb = mt76_mcu_get_response(dev, expires);
107110
if (!skb && !test_bit(MT76_MCU_RESET, &dev->phy.state) &&
108-
retry++ < dev->mcu_ops->max_retry) {
111+
orig_skb && retry++ < dev->mcu_ops->max_retry) {
109112
dev_err(dev->dev, "Retry message %08x (seq %d)\n",
110113
cmd, seq);
111114
skb = orig_skb;

0 commit comments

Comments
 (0)