mt76: mac: run mt76x02_mac_work routine atomically
authorLorenzo Bianconi <lorenzo.bianconi@redhat.com>
Thu, 6 Dec 2018 16:07:39 +0000 (17:07 +0100)
committerFelix Fietkau <nbd@nbd.name>
Fri, 11 Jan 2019 14:10:16 +0000 (15:10 +0100)
Grab mt76_dev mutex in mt76x02_mac_work handler since it runs
concurrently with mt76x{0,2}_set_channel routines

Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt76x02_mac.c

index 490368d..64841f4 100644 (file)
@@ -784,6 +784,8 @@ void mt76x02_mac_work(struct work_struct *work)
                                               mac_work.work);
        int i, idx;
 
+       mutex_lock(&dev->mt76.mutex);
+
        mt76x02_update_channel(&dev->mt76);
        for (i = 0, idx = 0; i < 16; i++) {
                u32 val = mt76_rr(dev, MT_TX_AGG_CNT(i));
@@ -796,6 +798,8 @@ void mt76x02_mac_work(struct work_struct *work)
        if (!dev->beacon_mask)
                mt76x02_check_mac_err(dev);
 
+       mutex_unlock(&dev->mt76.mutex);
+
        mt76_tx_status_check(&dev->mt76, NULL, false);
 
        ieee80211_queue_delayed_work(mt76_hw(dev), &dev->mac_work,