diff options
author | Lorenzo Bianconi <lorenzo@kernel.org> | 2021-09-13 11:25:02 +0200 |
---|---|---|
committer | Felix Fietkau <nbd@nbd.name> | 2021-10-20 10:36:47 +0200 |
commit | bd1e3e7b693c17a04e7d2bd9119daa482b7c7720 (patch) | |
tree | c28515b327e460349744ff182f9adef7a6db0552 /drivers/net/wireless/mediatek/mt76/mac80211.c | |
parent | 50ac15a511e3a03d5ade7fad976973560c3d453e (diff) | |
download | linux-stable-bd1e3e7b693c17a04e7d2bd9119daa482b7c7720.tar.gz linux-stable-bd1e3e7b693c17a04e7d2bd9119daa482b7c7720.tar.bz2 linux-stable-bd1e3e7b693c17a04e7d2bd9119daa482b7c7720.zip |
mt76: introduce packet_id idr
Introduce per-wcid idr to manage packet id for txs. This allow fast idr
lookup and skb queueing at the same time.
Tested-by: mrkiko.rs@gmail.com
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Diffstat (limited to 'drivers/net/wireless/mediatek/mt76/mac80211.c')
-rw-r--r-- | drivers/net/wireless/mediatek/mt76/mac80211.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/drivers/net/wireless/mediatek/mt76/mac80211.c b/drivers/net/wireless/mediatek/mt76/mac80211.c index 4ca2c154e046..ddc692d7b59e 100644 --- a/drivers/net/wireless/mediatek/mt76/mac80211.c +++ b/drivers/net/wireless/mediatek/mt76/mac80211.c @@ -566,6 +566,8 @@ mt76_alloc_device(struct device *pdev, unsigned int size, spin_lock_init(&dev->token_lock); idr_init(&dev->token); + INIT_LIST_HEAD(&dev->wcid_list); + INIT_LIST_HEAD(&dev->txwi_cache); for (i = 0; i < ARRAY_SIZE(dev->q_rx); i++) @@ -1237,6 +1239,7 @@ mt76_sta_add(struct mt76_dev *dev, struct ieee80211_vif *vif, wcid->ext_phy = ext_phy; rcu_assign_pointer(dev->wcid[wcid->idx], wcid); + mt76_packet_id_init(wcid); out: mutex_unlock(&dev->mutex); @@ -1255,7 +1258,8 @@ void __mt76_sta_remove(struct mt76_dev *dev, struct ieee80211_vif *vif, if (dev->drv->sta_remove) dev->drv->sta_remove(dev, vif, sta); - mt76_tx_status_check(dev, wcid, true); + mt76_packet_id_flush(dev, wcid); + mt76_wcid_mask_clear(dev->wcid_mask, idx); mt76_wcid_mask_clear(dev->wcid_phy_mask, idx); } |