mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-03-13 07:50:20 -04:00
wifi: mt76: mt7996: rely on shared sta_poll_list and sta_poll_lock
Rely on sta_poll_list and sta_poll_lock fields in mt76_dev structure and get rid of private copies. Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
committed by
Felix Fietkau
parent
57a3fac664
commit
ea0f3867c0
@@ -856,9 +856,7 @@ int mt7996_register_device(struct mt7996_dev *dev)
|
||||
INIT_WORK(&dev->rc_work, mt7996_mac_sta_rc_work);
|
||||
INIT_DELAYED_WORK(&dev->mphy.mac_work, mt7996_mac_work);
|
||||
INIT_LIST_HEAD(&dev->sta_rc_list);
|
||||
INIT_LIST_HEAD(&dev->sta_poll_list);
|
||||
INIT_LIST_HEAD(&dev->twt_list);
|
||||
spin_lock_init(&dev->sta_poll_lock);
|
||||
|
||||
init_waitqueue_head(&dev->reset_wait);
|
||||
INIT_WORK(&dev->reset_work, mt7996_mac_reset_work);
|
||||
|
||||
@@ -111,9 +111,9 @@ static void mt7996_mac_sta_poll(struct mt7996_dev *dev)
|
||||
LIST_HEAD(sta_poll_list);
|
||||
int i;
|
||||
|
||||
spin_lock_bh(&dev->sta_poll_lock);
|
||||
list_splice_init(&dev->sta_poll_list, &sta_poll_list);
|
||||
spin_unlock_bh(&dev->sta_poll_lock);
|
||||
spin_lock_bh(&dev->mt76.sta_poll_lock);
|
||||
list_splice_init(&dev->mt76.sta_poll_list, &sta_poll_list);
|
||||
spin_unlock_bh(&dev->mt76.sta_poll_lock);
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
@@ -124,15 +124,15 @@ static void mt7996_mac_sta_poll(struct mt7996_dev *dev)
|
||||
s8 rssi[4];
|
||||
u8 bw;
|
||||
|
||||
spin_lock_bh(&dev->sta_poll_lock);
|
||||
spin_lock_bh(&dev->mt76.sta_poll_lock);
|
||||
if (list_empty(&sta_poll_list)) {
|
||||
spin_unlock_bh(&dev->sta_poll_lock);
|
||||
spin_unlock_bh(&dev->mt76.sta_poll_lock);
|
||||
break;
|
||||
}
|
||||
msta = list_first_entry(&sta_poll_list,
|
||||
struct mt7996_sta, poll_list);
|
||||
list_del_init(&msta->poll_list);
|
||||
spin_unlock_bh(&dev->sta_poll_lock);
|
||||
spin_unlock_bh(&dev->mt76.sta_poll_lock);
|
||||
|
||||
idx = msta->wcid.idx;
|
||||
|
||||
@@ -681,10 +681,11 @@ mt7996_mac_fill_rx(struct mt7996_dev *dev, struct sk_buff *skb)
|
||||
struct mt7996_sta *msta;
|
||||
|
||||
msta = container_of(status->wcid, struct mt7996_sta, wcid);
|
||||
spin_lock_bh(&dev->sta_poll_lock);
|
||||
spin_lock_bh(&dev->mt76.sta_poll_lock);
|
||||
if (list_empty(&msta->poll_list))
|
||||
list_add_tail(&msta->poll_list, &dev->sta_poll_list);
|
||||
spin_unlock_bh(&dev->sta_poll_lock);
|
||||
list_add_tail(&msta->poll_list,
|
||||
&dev->mt76.sta_poll_list);
|
||||
spin_unlock_bh(&dev->mt76.sta_poll_lock);
|
||||
}
|
||||
|
||||
status->freq = mphy->chandef.chan->center_freq;
|
||||
@@ -1291,10 +1292,11 @@ mt7996_mac_tx_free(struct mt7996_dev *dev, void *data, int len)
|
||||
continue;
|
||||
|
||||
msta = container_of(wcid, struct mt7996_sta, wcid);
|
||||
spin_lock_bh(&dev->sta_poll_lock);
|
||||
spin_lock_bh(&mdev->sta_poll_lock);
|
||||
if (list_empty(&msta->poll_list))
|
||||
list_add_tail(&msta->poll_list, &dev->sta_poll_list);
|
||||
spin_unlock_bh(&dev->sta_poll_lock);
|
||||
list_add_tail(&msta->poll_list,
|
||||
&mdev->sta_poll_list);
|
||||
spin_unlock_bh(&mdev->sta_poll_lock);
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -1499,10 +1501,10 @@ static void mt7996_mac_add_txs(struct mt7996_dev *dev, void *data)
|
||||
if (!wcid->sta)
|
||||
goto out;
|
||||
|
||||
spin_lock_bh(&dev->sta_poll_lock);
|
||||
spin_lock_bh(&dev->mt76.sta_poll_lock);
|
||||
if (list_empty(&msta->poll_list))
|
||||
list_add_tail(&msta->poll_list, &dev->sta_poll_list);
|
||||
spin_unlock_bh(&dev->sta_poll_lock);
|
||||
list_add_tail(&msta->poll_list, &dev->mt76.sta_poll_list);
|
||||
spin_unlock_bh(&dev->mt76.sta_poll_lock);
|
||||
|
||||
out:
|
||||
rcu_read_unlock();
|
||||
@@ -2325,7 +2327,7 @@ void mt7996_mac_sta_rc_work(struct work_struct *work)
|
||||
u32 changed;
|
||||
LIST_HEAD(list);
|
||||
|
||||
spin_lock_bh(&dev->sta_poll_lock);
|
||||
spin_lock_bh(&dev->mt76.sta_poll_lock);
|
||||
list_splice_init(&dev->sta_rc_list, &list);
|
||||
|
||||
while (!list_empty(&list)) {
|
||||
@@ -2333,7 +2335,7 @@ void mt7996_mac_sta_rc_work(struct work_struct *work)
|
||||
list_del_init(&msta->rc_list);
|
||||
changed = msta->changed;
|
||||
msta->changed = 0;
|
||||
spin_unlock_bh(&dev->sta_poll_lock);
|
||||
spin_unlock_bh(&dev->mt76.sta_poll_lock);
|
||||
|
||||
sta = container_of((void *)msta, struct ieee80211_sta, drv_priv);
|
||||
vif = container_of((void *)msta->vif, struct ieee80211_vif, drv_priv);
|
||||
@@ -2345,10 +2347,10 @@ void mt7996_mac_sta_rc_work(struct work_struct *work)
|
||||
|
||||
/* TODO: smps change */
|
||||
|
||||
spin_lock_bh(&dev->sta_poll_lock);
|
||||
spin_lock_bh(&dev->mt76.sta_poll_lock);
|
||||
}
|
||||
|
||||
spin_unlock_bh(&dev->sta_poll_lock);
|
||||
spin_unlock_bh(&dev->mt76.sta_poll_lock);
|
||||
}
|
||||
|
||||
void mt7996_mac_work(struct work_struct *work)
|
||||
|
||||
@@ -263,10 +263,10 @@ static void mt7996_remove_interface(struct ieee80211_hw *hw,
|
||||
phy->omac_mask &= ~BIT_ULL(mvif->mt76.omac_idx);
|
||||
mutex_unlock(&dev->mt76.mutex);
|
||||
|
||||
spin_lock_bh(&dev->sta_poll_lock);
|
||||
spin_lock_bh(&dev->mt76.sta_poll_lock);
|
||||
if (!list_empty(&msta->poll_list))
|
||||
list_del_init(&msta->poll_list);
|
||||
spin_unlock_bh(&dev->sta_poll_lock);
|
||||
spin_unlock_bh(&dev->mt76.sta_poll_lock);
|
||||
|
||||
mt76_packet_id_flush(&dev->mt76, &msta->wcid);
|
||||
}
|
||||
@@ -689,12 +689,12 @@ void mt7996_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif,
|
||||
for (i = 0; i < ARRAY_SIZE(msta->twt.flow); i++)
|
||||
mt7996_mac_twt_teardown_flow(dev, msta, i);
|
||||
|
||||
spin_lock_bh(&dev->sta_poll_lock);
|
||||
spin_lock_bh(&mdev->sta_poll_lock);
|
||||
if (!list_empty(&msta->poll_list))
|
||||
list_del_init(&msta->poll_list);
|
||||
if (!list_empty(&msta->rc_list))
|
||||
list_del_init(&msta->rc_list);
|
||||
spin_unlock_bh(&dev->sta_poll_lock);
|
||||
spin_unlock_bh(&mdev->sta_poll_lock);
|
||||
}
|
||||
|
||||
static void mt7996_tx(struct ieee80211_hw *hw,
|
||||
@@ -1005,11 +1005,11 @@ static void mt7996_sta_rc_work(void *data, struct ieee80211_sta *sta)
|
||||
struct mt7996_dev *dev = msta->vif->phy->dev;
|
||||
u32 *changed = data;
|
||||
|
||||
spin_lock_bh(&dev->sta_poll_lock);
|
||||
spin_lock_bh(&dev->mt76.sta_poll_lock);
|
||||
msta->changed |= *changed;
|
||||
if (list_empty(&msta->rc_list))
|
||||
list_add_tail(&msta->rc_list, &dev->sta_rc_list);
|
||||
spin_unlock_bh(&dev->sta_poll_lock);
|
||||
spin_unlock_bh(&dev->mt76.sta_poll_lock);
|
||||
}
|
||||
|
||||
static void mt7996_sta_rc_update(struct ieee80211_hw *hw,
|
||||
|
||||
@@ -224,9 +224,7 @@ struct mt7996_dev {
|
||||
#endif
|
||||
|
||||
struct list_head sta_rc_list;
|
||||
struct list_head sta_poll_list;
|
||||
struct list_head twt_list;
|
||||
spinlock_t sta_poll_lock;
|
||||
|
||||
u32 hw_pattern;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user