mt76x0: usb: move initialization code in usb.c
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>
This commit is contained in:
committed by
Felix Fietkau
parent
9f04eb7bb2
commit
faa605bdfa
@@ -109,33 +109,6 @@ static void mt76x0_reset_csr_bbp(struct mt76x0_dev *dev)
|
|||||||
msleep(200);
|
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) \
|
#define RANDOM_WRITE(dev, tab) \
|
||||||
mt76_wr_rp(dev, MT_MCU_MEMMAP_WLAN, \
|
mt76_wr_rp(dev, MT_MCU_MEMMAP_WLAN, \
|
||||||
tab, ARRAY_SIZE(tab))
|
tab, ARRAY_SIZE(tab))
|
||||||
@@ -347,8 +320,6 @@ int mt76x0_init_hardware(struct mt76x0_dev *dev)
|
|||||||
return -ETIMEDOUT;
|
return -ETIMEDOUT;
|
||||||
|
|
||||||
mt76x0_reset_csr_bbp(dev);
|
mt76x0_reset_csr_bbp(dev);
|
||||||
mt76x0_init_usb_dma(dev);
|
|
||||||
|
|
||||||
ret = mt76x02_mcu_function_select(&dev->mt76, Q_SELECT, 1, false);
|
ret = mt76x02_mcu_function_select(&dev->mt76, Q_SELECT, 1, false);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
@@ -381,12 +352,6 @@ int mt76x0_init_hardware(struct mt76x0_dev *dev)
|
|||||||
|
|
||||||
mt76x0_reset_counters(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);
|
ret = mt76x0_eeprom_init(dev);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
@@ -397,15 +362,6 @@ int mt76x0_init_hardware(struct mt76x0_dev *dev)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(mt76x0_init_hardware);
|
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 *
|
struct mt76x0_dev *
|
||||||
mt76x0_alloc_device(struct device *pdev, const struct mt76_driver_ops *drv_ops)
|
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;
|
struct wiphy *wiphy = hw->wiphy;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = mt76x0_init_hardware(dev);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
/* Reserve WCID 0 for mcast - thanks to this APs WCID will go to
|
/* Reserve WCID 0 for mcast - thanks to this APs WCID will go to
|
||||||
* entry no. 1 like it does in the vendor driver.
|
* 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)
|
if (mdev->cap.has_5ghz)
|
||||||
mt76x0_vht_cap_mask(&dev->mt76.sband_5g.sband);
|
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);
|
mt76x0_init_debugfs(dev);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -130,7 +130,6 @@ struct mt76x0_dev *
|
|||||||
mt76x0_alloc_device(struct device *pdev, const struct mt76_driver_ops *drv_ops);
|
mt76x0_alloc_device(struct device *pdev, const struct mt76_driver_ops *drv_ops);
|
||||||
int mt76x0_init_hardware(struct mt76x0_dev *dev);
|
int mt76x0_init_hardware(struct mt76x0_dev *dev);
|
||||||
int mt76x0_register_device(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);
|
void mt76x0_chip_onoff(struct mt76x0_dev *dev, bool enable, bool reset);
|
||||||
|
|
||||||
int mt76x0_mac_start(struct mt76x0_dev *dev);
|
int mt76x0_mac_start(struct mt76x0_dev *dev);
|
||||||
|
|||||||
@@ -49,6 +49,93 @@ static struct usb_device_id mt76x0_device_table[] = {
|
|||||||
{ 0, }
|
{ 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,
|
static int mt76x0u_probe(struct usb_interface *usb_intf,
|
||||||
const struct usb_device_id *id)
|
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))
|
if (!(mt76_rr(dev, MT_EFUSE_CTRL) & MT_EFUSE_CTRL_SEL))
|
||||||
dev_warn(dev->mt76.dev, "Warning: eFUSE not present\n");
|
dev_warn(dev->mt76.dev, "Warning: eFUSE not present\n");
|
||||||
|
|
||||||
ret = mt76u_alloc_queues(&dev->mt76);
|
ret = mt76x0u_register_device(dev);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto err;
|
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;
|
return 0;
|
||||||
err_hw:
|
|
||||||
mt76x0_cleanup(dev);
|
|
||||||
err:
|
err:
|
||||||
usb_set_intfdata(usb_intf, NULL);
|
usb_set_intfdata(usb_intf, NULL);
|
||||||
usb_put_dev(interface_to_usbdev(usb_intf));
|
usb_put_dev(interface_to_usbdev(usb_intf));
|
||||||
@@ -141,7 +208,7 @@ static void mt76x0_disconnect(struct usb_interface *usb_intf)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
ieee80211_unregister_hw(dev->mt76.hw);
|
ieee80211_unregister_hw(dev->mt76.hw);
|
||||||
mt76x0_cleanup(dev);
|
mt76x0u_cleanup(dev);
|
||||||
|
|
||||||
usb_set_intfdata(usb_intf, NULL);
|
usb_set_intfdata(usb_intf, NULL);
|
||||||
usb_put_dev(interface_to_usbdev(usb_intf));
|
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;
|
return 0;
|
||||||
err:
|
err:
|
||||||
mt76x0_cleanup(dev);
|
mt76x0u_cleanup(dev);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user