mirror of
https://github.com/torvalds/linux.git
synced 2026-05-27 16:44:58 +02:00
wifi: mt76: do not add wcid entries to sta poll list during MCU reset
Fixes linked list management issues during restart, where sta entries can be recreated and reinitialized while still in the poll list, triggering kernel warnings. Link: https://patch.msgid.link/20241230194202.95065-14-nbd@nbd.name Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
parent
13e2e9c6b3
commit
387ab042ac
|
|
@ -1595,6 +1595,18 @@ void mt76_wcid_cleanup(struct mt76_dev *dev, struct mt76_wcid *wcid)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(mt76_wcid_cleanup);
|
||||
|
||||
void mt76_wcid_add_poll(struct mt76_dev *dev, struct mt76_wcid *wcid)
|
||||
{
|
||||
if (test_bit(MT76_MCU_RESET, &dev->phy.state))
|
||||
return;
|
||||
|
||||
spin_lock_bh(&dev->sta_poll_lock);
|
||||
if (list_empty(&wcid->poll_list))
|
||||
list_add_tail(&wcid->poll_list, &dev->sta_poll_list);
|
||||
spin_unlock_bh(&dev->sta_poll_lock);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mt76_wcid_add_poll);
|
||||
|
||||
int mt76_get_txpower(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
unsigned int link_id, int *dbm)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1735,5 +1735,6 @@ mt76_token_put(struct mt76_dev *dev, int token)
|
|||
|
||||
void mt76_wcid_init(struct mt76_wcid *wcid);
|
||||
void mt76_wcid_cleanup(struct mt76_dev *dev, struct mt76_wcid *wcid);
|
||||
void mt76_wcid_add_poll(struct mt76_dev *dev, struct mt76_wcid *wcid);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1277,12 +1277,7 @@ void mt7603_mac_add_txs(struct mt7603_dev *dev, void *data)
|
|||
|
||||
msta = container_of(wcid, struct mt7603_sta, wcid);
|
||||
sta = wcid_to_sta(wcid);
|
||||
|
||||
if (list_empty(&msta->wcid.poll_list)) {
|
||||
spin_lock_bh(&dev->mt76.sta_poll_lock);
|
||||
list_add_tail(&msta->wcid.poll_list, &dev->mt76.sta_poll_list);
|
||||
spin_unlock_bh(&dev->mt76.sta_poll_lock);
|
||||
}
|
||||
mt76_wcid_add_poll(&dev->mt76, &msta->wcid);
|
||||
|
||||
if (mt7603_mac_add_txs_skb(dev, msta, pid, txs_data))
|
||||
goto out;
|
||||
|
|
|
|||
|
|
@ -387,11 +387,7 @@ static int mt7615_mac_fill_rx(struct mt7615_dev *dev, struct sk_buff *skb)
|
|||
struct mt7615_sta *msta;
|
||||
|
||||
msta = container_of(status->wcid, struct mt7615_sta, wcid);
|
||||
spin_lock_bh(&dev->mt76.sta_poll_lock);
|
||||
if (list_empty(&msta->wcid.poll_list))
|
||||
list_add_tail(&msta->wcid.poll_list,
|
||||
&dev->mt76.sta_poll_list);
|
||||
spin_unlock_bh(&dev->mt76.sta_poll_lock);
|
||||
mt76_wcid_add_poll(&dev->mt76, &msta->wcid);
|
||||
}
|
||||
|
||||
if (mt76_is_mmio(&dev->mt76) && (rxd0 & csum_mask) == csum_mask &&
|
||||
|
|
@ -1514,11 +1510,7 @@ static void mt7615_mac_add_txs(struct mt7615_dev *dev, void *data)
|
|||
|
||||
msta = container_of(wcid, struct mt7615_sta, wcid);
|
||||
sta = wcid_to_sta(wcid);
|
||||
|
||||
spin_lock_bh(&dev->mt76.sta_poll_lock);
|
||||
if (list_empty(&msta->wcid.poll_list))
|
||||
list_add_tail(&msta->wcid.poll_list, &dev->mt76.sta_poll_list);
|
||||
spin_unlock_bh(&dev->mt76.sta_poll_lock);
|
||||
mt76_wcid_add_poll(&dev->mt76, &msta->wcid);
|
||||
|
||||
if (mt7615_mac_add_txs_skb(dev, msta, pid, txs_data))
|
||||
goto out;
|
||||
|
|
|
|||
|
|
@ -1174,11 +1174,7 @@ void mt76_connac2_txwi_free(struct mt76_dev *dev, struct mt76_txwi_cache *t,
|
|||
if (wcid && wcid->sta) {
|
||||
sta = container_of((void *)wcid, struct ieee80211_sta,
|
||||
drv_priv);
|
||||
spin_lock_bh(&dev->sta_poll_lock);
|
||||
if (list_empty(&wcid->poll_list))
|
||||
list_add_tail(&wcid->poll_list,
|
||||
&dev->sta_poll_list);
|
||||
spin_unlock_bh(&dev->sta_poll_lock);
|
||||
mt76_wcid_add_poll(dev, wcid);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -333,11 +333,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb,
|
|||
|
||||
if (status->wcid) {
|
||||
msta = container_of(status->wcid, struct mt7915_sta, wcid);
|
||||
spin_lock_bh(&dev->mt76.sta_poll_lock);
|
||||
if (list_empty(&msta->wcid.poll_list))
|
||||
list_add_tail(&msta->wcid.poll_list,
|
||||
&dev->mt76.sta_poll_list);
|
||||
spin_unlock_bh(&dev->mt76.sta_poll_lock);
|
||||
mt76_wcid_add_poll(&dev->mt76, &msta->wcid);
|
||||
}
|
||||
|
||||
status->freq = mphy->chandef.chan->center_freq;
|
||||
|
|
@ -927,11 +923,7 @@ mt7915_mac_tx_free(struct mt7915_dev *dev, void *data, int len)
|
|||
continue;
|
||||
|
||||
msta = container_of(wcid, struct mt7915_sta, wcid);
|
||||
spin_lock_bh(&mdev->sta_poll_lock);
|
||||
if (list_empty(&msta->wcid.poll_list))
|
||||
list_add_tail(&msta->wcid.poll_list,
|
||||
&mdev->sta_poll_list);
|
||||
spin_unlock_bh(&mdev->sta_poll_lock);
|
||||
mt76_wcid_add_poll(&dev->mt76, &msta->wcid);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
@ -1040,10 +1032,7 @@ static void mt7915_mac_add_txs(struct mt7915_dev *dev, void *data)
|
|||
if (!wcid->sta)
|
||||
goto out;
|
||||
|
||||
spin_lock_bh(&dev->mt76.sta_poll_lock);
|
||||
if (list_empty(&msta->wcid.poll_list))
|
||||
list_add_tail(&msta->wcid.poll_list, &dev->mt76.sta_poll_list);
|
||||
spin_unlock_bh(&dev->mt76.sta_poll_lock);
|
||||
mt76_wcid_add_poll(&dev->mt76, &msta->wcid);
|
||||
|
||||
out:
|
||||
rcu_read_unlock();
|
||||
|
|
|
|||
|
|
@ -216,11 +216,7 @@ mt7921_mac_fill_rx(struct mt792x_dev *dev, struct sk_buff *skb)
|
|||
if (status->wcid) {
|
||||
mlink = container_of(status->wcid, struct mt792x_link_sta, wcid);
|
||||
msta = container_of(mlink, struct mt792x_sta, deflink);
|
||||
spin_lock_bh(&dev->mt76.sta_poll_lock);
|
||||
if (list_empty(&mlink->wcid.poll_list))
|
||||
list_add_tail(&mlink->wcid.poll_list,
|
||||
&dev->mt76.sta_poll_list);
|
||||
spin_unlock_bh(&dev->mt76.sta_poll_lock);
|
||||
mt76_wcid_add_poll(&dev->mt76, &mlink->wcid);
|
||||
}
|
||||
|
||||
mt792x_get_status_freq_info(status, chfreq);
|
||||
|
|
@ -479,10 +475,7 @@ void mt7921_mac_add_txs(struct mt792x_dev *dev, void *data)
|
|||
if (!wcid->sta)
|
||||
goto out;
|
||||
|
||||
spin_lock_bh(&dev->mt76.sta_poll_lock);
|
||||
if (list_empty(&mlink->wcid.poll_list))
|
||||
list_add_tail(&mlink->wcid.poll_list, &dev->mt76.sta_poll_list);
|
||||
spin_unlock_bh(&dev->mt76.sta_poll_lock);
|
||||
mt76_wcid_add_poll(&dev->mt76, &mlink->wcid);
|
||||
|
||||
out:
|
||||
rcu_read_unlock();
|
||||
|
|
@ -529,11 +522,7 @@ static void mt7921_mac_tx_free(struct mt792x_dev *dev, void *data, int len)
|
|||
continue;
|
||||
|
||||
mlink = container_of(wcid, struct mt792x_link_sta, wcid);
|
||||
spin_lock_bh(&mdev->sta_poll_lock);
|
||||
if (list_empty(&mlink->wcid.poll_list))
|
||||
list_add_tail(&mlink->wcid.poll_list,
|
||||
&mdev->sta_poll_list);
|
||||
spin_unlock_bh(&mdev->sta_poll_lock);
|
||||
mt76_wcid_add_poll(&dev->mt76, &mlink->wcid);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -395,11 +395,7 @@ mt7925_mac_fill_rx(struct mt792x_dev *dev, struct sk_buff *skb)
|
|||
|
||||
if (status->wcid) {
|
||||
mlink = container_of(status->wcid, struct mt792x_link_sta, wcid);
|
||||
spin_lock_bh(&dev->mt76.sta_poll_lock);
|
||||
if (list_empty(&mlink->wcid.poll_list))
|
||||
list_add_tail(&mlink->wcid.poll_list,
|
||||
&dev->mt76.sta_poll_list);
|
||||
spin_unlock_bh(&dev->mt76.sta_poll_lock);
|
||||
mt76_wcid_add_poll(&dev->mt76, &mlink->wcid);
|
||||
}
|
||||
|
||||
mt792x_get_status_freq_info(status, chfreq);
|
||||
|
|
@ -1054,10 +1050,7 @@ void mt7925_mac_add_txs(struct mt792x_dev *dev, void *data)
|
|||
if (!wcid->sta)
|
||||
goto out;
|
||||
|
||||
spin_lock_bh(&dev->mt76.sta_poll_lock);
|
||||
if (list_empty(&mlink->wcid.poll_list))
|
||||
list_add_tail(&mlink->wcid.poll_list, &dev->mt76.sta_poll_list);
|
||||
spin_unlock_bh(&dev->mt76.sta_poll_lock);
|
||||
mt76_wcid_add_poll(&dev->mt76, &mlink->wcid);
|
||||
|
||||
out:
|
||||
rcu_read_unlock();
|
||||
|
|
@ -1135,11 +1128,7 @@ mt7925_mac_tx_free(struct mt792x_dev *dev, void *data, int len)
|
|||
continue;
|
||||
|
||||
mlink = container_of(wcid, struct mt792x_link_sta, wcid);
|
||||
spin_lock_bh(&mdev->sta_poll_lock);
|
||||
if (list_empty(&mlink->wcid.poll_list))
|
||||
list_add_tail(&mlink->wcid.poll_list,
|
||||
&mdev->sta_poll_list);
|
||||
spin_unlock_bh(&mdev->sta_poll_lock);
|
||||
mt76_wcid_add_poll(&dev->mt76, &mlink->wcid);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -478,11 +478,7 @@ mt7996_mac_fill_rx(struct mt7996_dev *dev, enum mt76_rxq_id q,
|
|||
|
||||
if (status->wcid) {
|
||||
msta = container_of(status->wcid, struct mt7996_sta, wcid);
|
||||
spin_lock_bh(&dev->mt76.sta_poll_lock);
|
||||
if (list_empty(&msta->wcid.poll_list))
|
||||
list_add_tail(&msta->wcid.poll_list,
|
||||
&dev->mt76.sta_poll_list);
|
||||
spin_unlock_bh(&dev->mt76.sta_poll_lock);
|
||||
mt76_wcid_add_poll(&dev->mt76, &msta->wcid);
|
||||
}
|
||||
|
||||
status->freq = mphy->chandef.chan->center_freq;
|
||||
|
|
@ -1149,11 +1145,7 @@ mt7996_mac_tx_free(struct mt7996_dev *dev, void *data, int len)
|
|||
continue;
|
||||
|
||||
msta = container_of(wcid, struct mt7996_sta, wcid);
|
||||
spin_lock_bh(&mdev->sta_poll_lock);
|
||||
if (list_empty(&msta->wcid.poll_list))
|
||||
list_add_tail(&msta->wcid.poll_list,
|
||||
&mdev->sta_poll_list);
|
||||
spin_unlock_bh(&mdev->sta_poll_lock);
|
||||
mt76_wcid_add_poll(&dev->mt76, &msta->wcid);
|
||||
continue;
|
||||
} else if (info & MT_TXFREE_INFO_HEADER) {
|
||||
u32 tx_retries = 0, tx_failed = 0;
|
||||
|
|
@ -1379,10 +1371,7 @@ static void mt7996_mac_add_txs(struct mt7996_dev *dev, void *data)
|
|||
if (!wcid->sta)
|
||||
goto out;
|
||||
|
||||
spin_lock_bh(&dev->mt76.sta_poll_lock);
|
||||
if (list_empty(&msta->wcid.poll_list))
|
||||
list_add_tail(&msta->wcid.poll_list, &dev->mt76.sta_poll_list);
|
||||
spin_unlock_bh(&dev->mt76.sta_poll_lock);
|
||||
mt76_wcid_add_poll(&dev->mt76, &msta->wcid);
|
||||
|
||||
out:
|
||||
rcu_read_unlock();
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user