Commit d04ca383 authored by Stanislaw Gruszka's avatar Stanislaw Gruszka Committed by Kalle Valo

mt76x0u: fix suspend/resume

We need to reset MCU and do other initializations on resume otherwise
MT7610U device will fail to initialize, what cause system hung due to
USB requests timeouts.

Patch fixes 4.19 -> 4.20 regression.

Cc: stable@vger.kernel.org # 4.20+
Signed-off-by: default avatarStanislaw Gruszka <sgruszka@redhat.com>
Acked-by: default avatarLorenzo Bianconi <lorenzo.bianconi@redhat.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent 8c22d81d
...@@ -158,39 +158,49 @@ static const struct ieee80211_ops mt76x0u_ops = { ...@@ -158,39 +158,49 @@ static const struct ieee80211_ops mt76x0u_ops = {
.get_txpower = mt76x02_get_txpower, .get_txpower = mt76x02_get_txpower,
}; };
static int mt76x0u_register_device(struct mt76x02_dev *dev) static int mt76x0u_init_hardware(struct mt76x02_dev *dev)
{ {
struct ieee80211_hw *hw = dev->mt76.hw;
int err; int err;
err = mt76u_alloc_queues(&dev->mt76);
if (err < 0)
goto out_err;
err = mt76u_mcu_init_rx(&dev->mt76);
if (err < 0)
goto out_err;
mt76x0_chip_onoff(dev, true, true); mt76x0_chip_onoff(dev, true, true);
if (!mt76x02_wait_for_mac(&dev->mt76)) {
err = -ETIMEDOUT; if (!mt76x02_wait_for_mac(&dev->mt76))
goto out_err; return -ETIMEDOUT;
}
err = mt76x0u_mcu_init(dev); err = mt76x0u_mcu_init(dev);
if (err < 0) if (err < 0)
goto out_err; return err;
mt76x0_init_usb_dma(dev); mt76x0_init_usb_dma(dev);
err = mt76x0_init_hardware(dev); err = mt76x0_init_hardware(dev);
if (err < 0) if (err < 0)
goto out_err; return err;
mt76_rmw(dev, MT_US_CYC_CFG, MT_US_CYC_CNT, 0x1e); mt76_rmw(dev, MT_US_CYC_CFG, MT_US_CYC_CNT, 0x1e);
mt76_wr(dev, MT_TXOP_CTRL_CFG, mt76_wr(dev, MT_TXOP_CTRL_CFG,
FIELD_PREP(MT_TXOP_TRUN_EN, 0x3f) | FIELD_PREP(MT_TXOP_TRUN_EN, 0x3f) |
FIELD_PREP(MT_TXOP_EXT_CCA_DLY, 0x58)); FIELD_PREP(MT_TXOP_EXT_CCA_DLY, 0x58));
return 0;
}
static int mt76x0u_register_device(struct mt76x02_dev *dev)
{
struct ieee80211_hw *hw = dev->mt76.hw;
int err;
err = mt76u_alloc_queues(&dev->mt76);
if (err < 0)
goto out_err;
err = mt76u_mcu_init_rx(&dev->mt76);
if (err < 0)
goto out_err;
err = mt76x0u_init_hardware(dev);
if (err < 0)
goto out_err;
err = mt76x0_register_device(dev); err = mt76x0_register_device(dev);
if (err < 0) if (err < 0)
goto out_err; goto out_err;
...@@ -301,6 +311,8 @@ static int __maybe_unused mt76x0_suspend(struct usb_interface *usb_intf, ...@@ -301,6 +311,8 @@ static int __maybe_unused mt76x0_suspend(struct usb_interface *usb_intf,
mt76u_stop_queues(&dev->mt76); mt76u_stop_queues(&dev->mt76);
mt76x0u_mac_stop(dev); mt76x0u_mac_stop(dev);
clear_bit(MT76_STATE_MCU_RUNNING, &dev->mt76.state);
mt76x0_chip_onoff(dev, false, false);
usb_kill_urb(usb->mcu.res.urb); usb_kill_urb(usb->mcu.res.urb);
return 0; return 0;
...@@ -328,7 +340,7 @@ static int __maybe_unused mt76x0_resume(struct usb_interface *usb_intf) ...@@ -328,7 +340,7 @@ static int __maybe_unused mt76x0_resume(struct usb_interface *usb_intf)
tasklet_enable(&usb->rx_tasklet); tasklet_enable(&usb->rx_tasklet);
tasklet_enable(&usb->tx_tasklet); tasklet_enable(&usb->tx_tasklet);
ret = mt76x0_init_hardware(dev); ret = mt76x0u_init_hardware(dev);
if (ret) if (ret)
goto err; goto err;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment