Skip to content

Commit d04ca38

Browse files
Stanislaw GruszkaKalle Valo
authored andcommitted
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: Stanislaw Gruszka <sgruszka@redhat.com> Acked-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
1 parent 8c22d81 commit d04ca38

File tree

1 file changed

+29
-17
lines changed
  • drivers/net/wireless/mediatek/mt76/mt76x0

1 file changed

+29
-17
lines changed

drivers/net/wireless/mediatek/mt76/mt76x0/usb.c

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -158,39 +158,49 @@ static const struct ieee80211_ops mt76x0u_ops = {
158158
.get_txpower = mt76x02_get_txpower,
159159
};
160160

161-
static int mt76x0u_register_device(struct mt76x02_dev *dev)
161+
static int mt76x0u_init_hardware(struct mt76x02_dev *dev)
162162
{
163-
struct ieee80211_hw *hw = dev->mt76.hw;
164163
int err;
165164

166-
err = mt76u_alloc_queues(&dev->mt76);
167-
if (err < 0)
168-
goto out_err;
169-
170-
err = mt76u_mcu_init_rx(&dev->mt76);
171-
if (err < 0)
172-
goto out_err;
173-
174165
mt76x0_chip_onoff(dev, true, true);
175-
if (!mt76x02_wait_for_mac(&dev->mt76)) {
176-
err = -ETIMEDOUT;
177-
goto out_err;
178-
}
166+
167+
if (!mt76x02_wait_for_mac(&dev->mt76))
168+
return -ETIMEDOUT;
179169

180170
err = mt76x0u_mcu_init(dev);
181171
if (err < 0)
182-
goto out_err;
172+
return err;
183173

184174
mt76x0_init_usb_dma(dev);
185175
err = mt76x0_init_hardware(dev);
186176
if (err < 0)
187-
goto out_err;
177+
return err;
188178

189179
mt76_rmw(dev, MT_US_CYC_CFG, MT_US_CYC_CNT, 0x1e);
190180
mt76_wr(dev, MT_TXOP_CTRL_CFG,
191181
FIELD_PREP(MT_TXOP_TRUN_EN, 0x3f) |
192182
FIELD_PREP(MT_TXOP_EXT_CCA_DLY, 0x58));
193183

184+
return 0;
185+
}
186+
187+
static int mt76x0u_register_device(struct mt76x02_dev *dev)
188+
{
189+
struct ieee80211_hw *hw = dev->mt76.hw;
190+
int err;
191+
192+
err = mt76u_alloc_queues(&dev->mt76);
193+
if (err < 0)
194+
goto out_err;
195+
196+
err = mt76u_mcu_init_rx(&dev->mt76);
197+
if (err < 0)
198+
goto out_err;
199+
200+
err = mt76x0u_init_hardware(dev);
201+
if (err < 0)
202+
goto out_err;
203+
194204
err = mt76x0_register_device(dev);
195205
if (err < 0)
196206
goto out_err;
@@ -301,6 +311,8 @@ static int __maybe_unused mt76x0_suspend(struct usb_interface *usb_intf,
301311

302312
mt76u_stop_queues(&dev->mt76);
303313
mt76x0u_mac_stop(dev);
314+
clear_bit(MT76_STATE_MCU_RUNNING, &dev->mt76.state);
315+
mt76x0_chip_onoff(dev, false, false);
304316
usb_kill_urb(usb->mcu.res.urb);
305317

306318
return 0;
@@ -328,7 +340,7 @@ static int __maybe_unused mt76x0_resume(struct usb_interface *usb_intf)
328340
tasklet_enable(&usb->rx_tasklet);
329341
tasklet_enable(&usb->tx_tasklet);
330342

331-
ret = mt76x0_init_hardware(dev);
343+
ret = mt76x0u_init_hardware(dev);
332344
if (ret)
333345
goto err;
334346

0 commit comments

Comments
 (0)