mt76: move mt76 workqueue in common code
authorLorenzo Bianconi <lorenzo@kernel.org>
Fri, 3 Jul 2020 08:15:41 +0000 (10:15 +0200)
committerFelix Fietkau <nbd@nbd.name>
Tue, 21 Jul 2020 17:01:16 +0000 (19:01 +0200)
Move mt76 workqueue from usb to common code in order to be reused adding
low-power support for mt7663 chipset

Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mac80211.c
drivers/net/wireless/mediatek/mt76/mt76.h
drivers/net/wireless/mediatek/mt76/mt7615/mac.c
drivers/net/wireless/mediatek/mt76/mt7615/main.c
drivers/net/wireless/mediatek/mt76/mt7615/usb.c
drivers/net/wireless/mediatek/mt76/mt76x0/usb.c
drivers/net/wireless/mediatek/mt76/mt76x2/usb.c
drivers/net/wireless/mediatek/mt76/usb.c

index 10e6dbb..6aa3efa 100644 (file)
@@ -437,6 +437,12 @@ mt76_alloc_device(struct device *pdev, unsigned int size,
 
        tasklet_init(&dev->tx_tasklet, mt76_tx_tasklet, (unsigned long)dev);
 
+       dev->wq = alloc_ordered_workqueue("mt76", 0);
+       if (!dev->wq) {
+               ieee80211_free_hw(hw);
+               return NULL;
+       }
+
        return dev;
 }
 EXPORT_SYMBOL_GPL(mt76_alloc_device);
@@ -490,7 +496,12 @@ EXPORT_SYMBOL_GPL(mt76_unregister_device);
 
 void mt76_free_device(struct mt76_dev *dev)
 {
-       mt76_tx_free(dev);
+       if (dev->wq) {
+               destroy_workqueue(dev->wq);
+               dev->wq = NULL;
+       }
+       if (mt76_is_mmio(dev))
+               mt76_tx_free(dev);
        ieee80211_free_hw(dev->hw);
 }
 EXPORT_SYMBOL_GPL(mt76_free_device);
index 14b3a39..dea63d6 100644 (file)
@@ -423,7 +423,6 @@ struct mt76_usb {
        u16 data_len;
 
        struct tasklet_struct rx_tasklet;
-       struct workqueue_struct *wq;
        struct work_struct stat_work;
 
        u8 out_ep[__MT_EP_OUT_MAX];
@@ -621,6 +620,8 @@ struct mt76_dev {
        struct mt76_testmode_data test;
 #endif
 
+       struct workqueue_struct *wq;
+
        union {
                struct mt76_mmio mmio;
                struct mt76_usb usb;
@@ -1018,7 +1019,6 @@ int mt76u_vendor_request(struct mt76_dev *dev, u8 req,
                         void *buf, size_t len);
 void mt76u_single_wr(struct mt76_dev *dev, const u8 req,
                     const u16 offset, const u32 val);
-void mt76u_deinit(struct mt76_dev *dev);
 int mt76u_init(struct mt76_dev *dev, struct usb_interface *intf,
               bool ext);
 int mt76u_alloc_mcu_queue(struct mt76_dev *dev);
index 2d432d0..73b994a 100644 (file)
@@ -927,7 +927,7 @@ mt7615_mac_queue_rate_update(struct mt7615_phy *phy, struct mt7615_sta *sta,
        mt7615_mac_update_rate_desc(phy, sta, probe_rate, rates,
                                    &wd->rate);
        list_add_tail(&wd->node, &dev->wd_head);
-       queue_work(dev->mt76.usb.wq, &dev->wtbl_work);
+       queue_work(dev->mt76.wq, &dev->wtbl_work);
 
        return 0;
 }
index 3abb33d..3bcbd13 100644 (file)
@@ -319,7 +319,7 @@ mt7615_queue_key_update(struct mt7615_dev *dev, enum set_key_cmd cmd,
        wd->key.cmd = cmd;
 
        list_add_tail(&wd->node, &dev->wd_head);
-       queue_work(dev->mt76.usb.wq, &dev->wtbl_work);
+       queue_work(dev->mt76.wq, &dev->wtbl_work);
 
        return 0;
 }
index 0ba28d3..f70a7d9 100644 (file)
@@ -349,11 +349,10 @@ alloc_queues:
 error_freeq:
        mt76u_queues_deinit(&dev->mt76);
 error:
-       mt76u_deinit(&dev->mt76);
        usb_set_intfdata(usb_intf, NULL);
        usb_put_dev(interface_to_usbdev(usb_intf));
 
-       ieee80211_free_hw(mdev->hw);
+       mt76_free_device(&dev->mt76);
 
        return ret;
 }
@@ -371,8 +370,7 @@ static void mt7663u_disconnect(struct usb_interface *usb_intf)
        usb_set_intfdata(usb_intf, NULL);
        usb_put_dev(interface_to_usbdev(usb_intf));
 
-       mt76u_deinit(&dev->mt76);
-       ieee80211_free_hw(dev->mt76.hw);
+       mt76_free_device(&dev->mt76);
 }
 
 #ifdef CONFIG_PM
index 5535b9c..ce6b286 100644 (file)
@@ -277,9 +277,8 @@ static int mt76x0u_probe(struct usb_interface *usb_intf,
 err:
        usb_set_intfdata(usb_intf, NULL);
        usb_put_dev(interface_to_usbdev(usb_intf));
-       mt76u_deinit(&dev->mt76);
+       mt76_free_device(&dev->mt76);
 
-       ieee80211_free_hw(mdev->hw);
        return ret;
 }
 
@@ -297,8 +296,7 @@ static void mt76x0_disconnect(struct usb_interface *usb_intf)
        usb_set_intfdata(usb_intf, NULL);
        usb_put_dev(interface_to_usbdev(usb_intf));
 
-       mt76u_deinit(&dev->mt76);
-       ieee80211_free_hw(dev->mt76.hw);
+       mt76_free_device(&dev->mt76);
 }
 
 static int __maybe_unused mt76x0_suspend(struct usb_interface *usb_intf,
index b27acf1..4e003c7 100644 (file)
@@ -75,8 +75,7 @@ static int mt76x2u_probe(struct usb_interface *intf,
        return 0;
 
 err:
-       ieee80211_free_hw(mt76_hw(dev));
-       mt76u_deinit(&dev->mt76);
+       mt76_free_device(&dev->mt76);
        usb_set_intfdata(intf, NULL);
        usb_put_dev(udev);
 
@@ -92,9 +91,7 @@ static void mt76x2u_disconnect(struct usb_interface *intf)
        set_bit(MT76_REMOVED, &dev->mphy.state);
        ieee80211_unregister_hw(hw);
        mt76x2u_cleanup(dev);
-       mt76u_deinit(&dev->mt76);
-
-       ieee80211_free_hw(hw);
+       mt76_free_device(&dev->mt76);
        usb_set_intfdata(intf, NULL);
        usb_put_dev(udev);
 }
index 0ff3096..84e2fd0 100644 (file)
@@ -842,7 +842,7 @@ static void mt76u_tx_tasklet(unsigned long data)
 
                if (dev->drv->tx_status_data &&
                    !test_and_set_bit(MT76_READING_STATS, &dev->phy.state))
-                       queue_work(dev->usb.wq, &dev->usb.stat_work);
+                       queue_work(dev->wq, &dev->usb.stat_work);
                if (wake)
                        ieee80211_wake_queue(dev->hw, i);
        }
@@ -868,7 +868,7 @@ static void mt76u_tx_status_data(struct work_struct *work)
        }
 
        if (count && test_bit(MT76_STATE_RUNNING, &dev->phy.state))
-               queue_work(usb->wq, &usb->stat_work);
+               queue_work(dev->wq, &usb->stat_work);
        else
                clear_bit(MT76_READING_STATS, &dev->phy.state);
 }
@@ -1132,15 +1132,6 @@ static const struct mt76_queue_ops usb_queue_ops = {
        .kick = mt76u_tx_kick,
 };
 
-void mt76u_deinit(struct mt76_dev *dev)
-{
-       if (dev->usb.wq) {
-               destroy_workqueue(dev->usb.wq);
-               dev->usb.wq = NULL;
-       }
-}
-EXPORT_SYMBOL_GPL(mt76u_deinit);
-
 int mt76u_init(struct mt76_dev *dev,
               struct usb_interface *intf, bool ext)
 {
@@ -1163,10 +1154,6 @@ int mt76u_init(struct mt76_dev *dev,
        tasklet_init(&dev->tx_tasklet, mt76u_tx_tasklet, (unsigned long)dev);
        INIT_WORK(&usb->stat_work, mt76u_tx_status_data);
 
-       usb->wq = alloc_workqueue("mt76u", WQ_UNBOUND, 0);
-       if (!usb->wq)
-               return -ENOMEM;
-
        usb->data_len = usb_maxpacket(udev, usb_sndctrlpipe(udev, 0), 1);
        if (usb->data_len < 32)
                usb->data_len = 32;
@@ -1190,7 +1177,8 @@ int mt76u_init(struct mt76_dev *dev,
        return 0;
 
 error:
-       mt76u_deinit(dev);
+       destroy_workqueue(dev->wq);
+
        return err;
 }
 EXPORT_SYMBOL_GPL(mt76u_init);