Message ID | 1549378057-13790-1-git-send-email-sgruszka@redhat.com (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | Kalle Valo |
Headers | show |
Series | [5.0] mt76x0u: fix suspend/resume | expand |
> We need to reset MCU and do other initalizations on resume otherwise > MT7610U device will fail to initalize, 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: Stanislaw Gruszka <sgruszka@redhat.com> > --- > .../net/wireless/mediatek/mt76/mt76x0/usb.c | 43 +++++++++++++------ > 1 file changed, 29 insertions(+), 14 deletions(-) > > diff --git a/drivers/net/wireless/mediatek/mt76/mt76x0/usb.c b/drivers/net/wireless/mediatek/mt76/mt76x0/usb.c > index 0e6b43bb4678..bd1dedcb7952 100644 > --- a/drivers/net/wireless/mediatek/mt76/mt76x0/usb.c > +++ b/drivers/net/wireless/mediatek/mt76/mt76x0/usb.c > @@ -158,39 +158,52 @@ static const struct ieee80211_ops mt76x0u_ops = { > .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; > > - 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); > + Why this new line here? it is not related to the patch > if (!mt76x02_wait_for_mac(&dev->mt76)) { > err = -ETIMEDOUT; > - goto out_err; > + return err; just return -ETIMEDOUT here For the rest looks good to me Regards, Lorenzo > } > > err = mt76x0u_mcu_init(dev); > if (err < 0) > - goto out_err; > + return err; > > mt76x0_init_usb_dma(dev); > + > err = mt76x0_init_hardware(dev); > if (err < 0) > - goto out_err; > + return err; >
diff --git a/drivers/net/wireless/mediatek/mt76/mt76x0/usb.c b/drivers/net/wireless/mediatek/mt76/mt76x0/usb.c index 0e6b43bb4678..bd1dedcb7952 100644 --- a/drivers/net/wireless/mediatek/mt76/mt76x0/usb.c +++ b/drivers/net/wireless/mediatek/mt76/mt76x0/usb.c @@ -158,39 +158,52 @@ static const struct ieee80211_ops mt76x0u_ops = { .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; - 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); + if (!mt76x02_wait_for_mac(&dev->mt76)) { err = -ETIMEDOUT; - goto out_err; + return err; } err = mt76x0u_mcu_init(dev); if (err < 0) - goto out_err; + return err; mt76x0_init_usb_dma(dev); + err = mt76x0_init_hardware(dev); if (err < 0) - goto out_err; + return 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)); + 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); if (err < 0) goto out_err; @@ -301,6 +314,8 @@ static int __maybe_unused mt76x0_suspend(struct usb_interface *usb_intf, mt76u_stop_queues(&dev->mt76); 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); return 0; @@ -328,7 +343,7 @@ static int __maybe_unused mt76x0_resume(struct usb_interface *usb_intf) tasklet_enable(&usb->rx_tasklet); tasklet_enable(&usb->tx_tasklet); - ret = mt76x0_init_hardware(dev); + ret = mt76x0u_init_hardware(dev); if (ret) goto err;
We need to reset MCU and do other initalizations on resume otherwise MT7610U device will fail to initalize, 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: Stanislaw Gruszka <sgruszka@redhat.com> --- .../net/wireless/mediatek/mt76/mt76x0/usb.c | 43 +++++++++++++------ 1 file changed, 29 insertions(+), 14 deletions(-)