OSDN Git Service

mt76x0: usb: move initialization code in usb.c
authorLorenzo Bianconi <lorenzo.bianconi@redhat.com>
Fri, 28 Sep 2018 11:39:00 +0000 (13:39 +0200)
committerFelix Fietkau <nbd@nbd.name>
Mon, 1 Oct 2018 10:34:36 +0000 (12:34 +0200)
Move usb initialization code in mt76x0-usb module in
order to remove usb dependency from generic init code
(not completed yet). Moreover fix a memory leak in usb probe
if mt76x02_wait_for_mac fails

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

index 0fd4b4c..1d20ed5 100644 (file)
@@ -109,33 +109,6 @@ static void mt76x0_reset_csr_bbp(struct mt76x0_dev *dev)
        msleep(200);
 }
 
-static void mt76x0_init_usb_dma(struct mt76x0_dev *dev)
-{
-       u32 val;
-
-       val = mt76_rr(dev, MT_USB_DMA_CFG);
-
-       val |= MT_USB_DMA_CFG_RX_BULK_EN |
-              MT_USB_DMA_CFG_TX_BULK_EN;
-
-       /* disable AGGR_BULK_RX in order to receive one
-        * frame in each rx urb and avoid copies
-        */
-       val &= ~MT_USB_DMA_CFG_RX_BULK_AGG_EN;
-       mt76_wr(dev, MT_USB_DMA_CFG, val);
-
-       val = mt76_rr(dev, MT_COM_REG0);
-       if (val & 1)
-               dev_dbg(dev->mt76.dev, "MCU not ready\n");
-
-       val = mt76_rr(dev, MT_USB_DMA_CFG);
-
-       val |= MT_USB_DMA_CFG_RX_DROP_OR_PAD;
-       mt76_wr(dev, MT_USB_DMA_CFG, val);
-       val &= ~MT_USB_DMA_CFG_RX_DROP_OR_PAD;
-       mt76_wr(dev, MT_USB_DMA_CFG, val);
-}
-
 #define RANDOM_WRITE(dev, tab)                 \
        mt76_wr_rp(dev, MT_MCU_MEMMAP_WLAN,     \
                   tab, ARRAY_SIZE(tab))
@@ -347,8 +320,6 @@ int mt76x0_init_hardware(struct mt76x0_dev *dev)
                return -ETIMEDOUT;
 
        mt76x0_reset_csr_bbp(dev);
-       mt76x0_init_usb_dma(dev);
-
        ret = mt76x02_mcu_function_select(&dev->mt76, Q_SELECT, 1, false);
        if (ret)
                return ret;
@@ -381,12 +352,6 @@ int mt76x0_init_hardware(struct mt76x0_dev *dev)
 
        mt76x0_reset_counters(dev);
 
-       mt76_rmw(dev, MT_US_CYC_CFG, MT_US_CYC_CNT, 0x1e);
-
-       mt76_wr(dev, MT_TXOP_CTRL_CFG,
-                  FIELD_PREP(MT_TXOP_TRUN_EN, 0x3f) |
-                  FIELD_PREP(MT_TXOP_EXT_CCA_DLY, 0x58));
-
        ret = mt76x0_eeprom_init(dev);
        if (ret)
                return ret;
@@ -397,15 +362,6 @@ int mt76x0_init_hardware(struct mt76x0_dev *dev)
 }
 EXPORT_SYMBOL_GPL(mt76x0_init_hardware);
 
-void mt76x0_cleanup(struct mt76x0_dev *dev)
-{
-       clear_bit(MT76_STATE_INITIALIZED, &dev->mt76.state);
-       mt76x0_chip_onoff(dev, false, false);
-       mt76u_queues_deinit(&dev->mt76);
-       mt76u_mcu_deinit(&dev->mt76);
-}
-EXPORT_SYMBOL_GPL(mt76x0_cleanup);
-
 struct mt76x0_dev *
 mt76x0_alloc_device(struct device *pdev, const struct mt76_driver_ops *drv_ops)
 {
@@ -437,10 +393,6 @@ int mt76x0_register_device(struct mt76x0_dev *dev)
        struct wiphy *wiphy = hw->wiphy;
        int ret;
 
-       ret = mt76x0_init_hardware(dev);
-       if (ret)
-               return ret;
-
        /* Reserve WCID 0 for mcast - thanks to this APs WCID will go to
         * entry no. 1 like it does in the vendor driver.
         */
@@ -475,12 +427,6 @@ int mt76x0_register_device(struct mt76x0_dev *dev)
        if (mdev->cap.has_5ghz)
                mt76x0_vht_cap_mask(&dev->mt76.sband_5g.sband);
 
-       /* check hw sg support in order to enable AMSDU */
-       if (mt76u_check_sg(mdev))
-               hw->max_tx_fragments = MT_SG_MAX_SIZE;
-       else
-               hw->max_tx_fragments = 1;
-
        mt76x0_init_debugfs(dev);
 
        return 0;
index 66fcb90..e2e23df 100644 (file)
@@ -130,7 +130,6 @@ struct mt76x0_dev *
 mt76x0_alloc_device(struct device *pdev, const struct mt76_driver_ops *drv_ops);
 int mt76x0_init_hardware(struct mt76x0_dev *dev);
 int mt76x0_register_device(struct mt76x0_dev *dev);
-void mt76x0_cleanup(struct mt76x0_dev *dev);
 void mt76x0_chip_onoff(struct mt76x0_dev *dev, bool enable, bool reset);
 
 int mt76x0_mac_start(struct mt76x0_dev *dev);
index 7ad4dac..3ed2e1a 100644 (file)
@@ -49,6 +49,93 @@ static struct usb_device_id mt76x0_device_table[] = {
        { 0, }
 };
 
+static void mt76x0_init_usb_dma(struct mt76x0_dev *dev)
+{
+       u32 val;
+
+       val = mt76_rr(dev, MT_USB_DMA_CFG);
+
+       val |= MT_USB_DMA_CFG_RX_BULK_EN |
+              MT_USB_DMA_CFG_TX_BULK_EN;
+
+       /* disable AGGR_BULK_RX in order to receive one
+        * frame in each rx urb and avoid copies
+        */
+       val &= ~MT_USB_DMA_CFG_RX_BULK_AGG_EN;
+       mt76_wr(dev, MT_USB_DMA_CFG, val);
+
+       val = mt76_rr(dev, MT_COM_REG0);
+       if (val & 1)
+               dev_dbg(dev->mt76.dev, "MCU not ready\n");
+
+       val = mt76_rr(dev, MT_USB_DMA_CFG);
+
+       val |= MT_USB_DMA_CFG_RX_DROP_OR_PAD;
+       mt76_wr(dev, MT_USB_DMA_CFG, val);
+       val &= ~MT_USB_DMA_CFG_RX_DROP_OR_PAD;
+       mt76_wr(dev, MT_USB_DMA_CFG, val);
+}
+
+static void mt76x0u_cleanup(struct mt76x0_dev *dev)
+{
+       clear_bit(MT76_STATE_INITIALIZED, &dev->mt76.state);
+       mt76x0_chip_onoff(dev, false, false);
+       mt76u_queues_deinit(&dev->mt76);
+       mt76u_mcu_deinit(&dev->mt76);
+}
+
+static int mt76x0u_register_device(struct mt76x0_dev *dev)
+{
+       struct ieee80211_hw *hw = dev->mt76.hw;
+       int err;
+
+       err = mt76u_mcu_init_rx(&dev->mt76);
+       if (err < 0)
+               return err;
+
+       err = mt76u_alloc_queues(&dev->mt76);
+       if (err < 0)
+               return err;
+
+       mt76x0_chip_onoff(dev, true, true);
+       if (!mt76x02_wait_for_mac(&dev->mt76)) {
+               err = -ETIMEDOUT;
+               goto err;
+       }
+
+       err = mt76x0u_mcu_init(dev);
+       if (err < 0)
+               goto err;
+
+       mt76x0_init_usb_dma(dev);
+       err = mt76x0_init_hardware(dev);
+       if (err < 0)
+               goto err;
+
+       mt76_rmw(dev, MT_US_CYC_CFG, MT_US_CYC_CNT, 0x1e);
+       mt76_wr(dev, MT_TXOP_CTRL_CFG,
+               FIELD_PREP(MT_TXOP_TRUN_EN, 0x3f) |
+               FIELD_PREP(MT_TXOP_EXT_CCA_DLY, 0x58));
+
+       err = mt76x0_register_device(dev);
+       if (err < 0)
+               goto err;
+
+       /* check hw sg support in order to enable AMSDU */
+       if (mt76u_check_sg(&dev->mt76))
+               hw->max_tx_fragments = MT_SG_MAX_SIZE;
+       else
+               hw->max_tx_fragments = 1;
+
+       set_bit(MT76_STATE_INITIALIZED, &dev->mt76.state);
+
+       return 0;
+
+err:
+       mt76x0u_cleanup(dev);
+       return err;
+}
+
 static int mt76x0u_probe(struct usb_interface *usb_intf,
                         const struct usb_device_id *id)
 {
@@ -98,32 +185,12 @@ static int mt76x0u_probe(struct usb_interface *usb_intf,
        if (!(mt76_rr(dev, MT_EFUSE_CTRL) & MT_EFUSE_CTRL_SEL))
                dev_warn(dev->mt76.dev, "Warning: eFUSE not present\n");
 
-       ret = mt76u_alloc_queues(&dev->mt76);
+       ret = mt76x0u_register_device(dev);
        if (ret < 0)
                goto err;
 
-       ret = mt76u_mcu_init_rx(&dev->mt76);
-       if (ret < 0)
-               goto err;
-
-       mt76x0_chip_onoff(dev, true, true);
-
-       if (!mt76x02_wait_for_mac(&dev->mt76))
-               return -ETIMEDOUT;
-
-       ret = mt76x0u_mcu_init(dev);
-       if (ret)
-               goto err_hw;
-
-       ret = mt76x0_register_device(dev);
-       if (ret)
-               goto err_hw;
-
-       set_bit(MT76_STATE_INITIALIZED, &dev->mt76.state);
-
        return 0;
-err_hw:
-       mt76x0_cleanup(dev);
+
 err:
        usb_set_intfdata(usb_intf, NULL);
        usb_put_dev(interface_to_usbdev(usb_intf));
@@ -141,7 +208,7 @@ static void mt76x0_disconnect(struct usb_interface *usb_intf)
                return;
 
        ieee80211_unregister_hw(dev->mt76.hw);
-       mt76x0_cleanup(dev);
+       mt76x0u_cleanup(dev);
 
        usb_set_intfdata(usb_intf, NULL);
        usb_put_dev(interface_to_usbdev(usb_intf));
@@ -190,7 +257,7 @@ static int __maybe_unused mt76x0_resume(struct usb_interface *usb_intf)
 
        return 0;
 err:
-       mt76x0_cleanup(dev);
+       mt76x0u_cleanup(dev);
        return ret;
 }