OSDN Git Service

mt76: mt7615: rework mt7615_mac_sta_poll for usb code
authorLorenzo Bianconi <lorenzo@kernel.org>
Wed, 22 Apr 2020 08:47:23 +0000 (10:47 +0200)
committerFelix Fietkau <nbd@nbd.name>
Tue, 12 May 2020 17:52:32 +0000 (19:52 +0200)
Since usb code can't access device registers in interrupt context, move
rcu_read_lock/rcu_read_unlock in mt7615_poll_tx routine. Moreover loop
over a local msta list in mt7615_mac_sta_poll since mt7663u driver will
not be able to complete the inner while loop before sta_poll_list list
is refilled by mt7615_mac_add_txs/mt7615_mac_fill_rx

Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7615/dma.c
drivers/net/wireless/mediatek/mt76/mt7615/mac.c

index b0ba0e7..5cdbe37 100644 (file)
@@ -121,7 +121,9 @@ static int mt7615_poll_tx(struct napi_struct *napi, int budget)
 
        mt7615_tx_cleanup(dev);
 
+       rcu_read_lock();
        mt7615_mac_sta_poll(dev);
+       rcu_read_unlock();
 
        tasklet_schedule(&dev->mt76.tx_tasklet);
 
index 3dab07d..396f11e 100644 (file)
@@ -724,22 +724,20 @@ void mt7615_mac_sta_poll(struct mt7615_dev *dev)
        struct ieee80211_sta *sta;
        struct mt7615_sta *msta;
        u32 addr, tx_time[4], rx_time[4];
+       struct list_head sta_poll_list;
        int i;
 
-       rcu_read_lock();
+       INIT_LIST_HEAD(&sta_poll_list);
+       spin_lock_bh(&dev->sta_poll_lock);
+       list_splice_init(&dev->sta_poll_list, &sta_poll_list);
+       spin_unlock_bh(&dev->sta_poll_lock);
 
-       while (true) {
+       while (!list_empty(&sta_poll_list)) {
                bool clear = false;
 
-               spin_lock_bh(&dev->sta_poll_lock);
-               if (list_empty(&dev->sta_poll_list)) {
-                       spin_unlock_bh(&dev->sta_poll_lock);
-                       break;
-               }
-               msta = list_first_entry(&dev->sta_poll_list,
-                                       struct mt7615_sta, poll_list);
+               msta = list_first_entry(&sta_poll_list, struct mt7615_sta,
+                                       poll_list);
                list_del_init(&msta->poll_list);
-               spin_unlock_bh(&dev->sta_poll_lock);
 
                addr = mt7615_mac_wtbl_addr(dev, msta->wcid.idx) + 19 * 4;
 
@@ -779,8 +777,6 @@ void mt7615_mac_sta_poll(struct mt7615_dev *dev)
                                                       rx_cur);
                }
        }
-
-       rcu_read_unlock();
 }
 EXPORT_SYMBOL_GPL(mt7615_mac_sta_poll);