Merge "wil6210: stop TX queues when suspending"

This commit is contained in:
Linux Build Service Account 2017-06-06 21:33:14 -07:00 committed by Gerrit - the friendly Code Review server
commit ceffb12dba
2 changed files with 16 additions and 2 deletions

View file

@ -98,6 +98,10 @@ static int wil_resume_keep_radio_on(struct wil6210_priv *wil)
} }
} }
/* Wake all queues */
if (test_bit(wil_status_fwconnected, wil->status))
wil_update_net_queues_bh(wil, NULL, false);
out: out:
if (rc) if (rc)
set_bit(wil_status_suspended, wil->status); set_bit(wil_status_suspended, wil->status);
@ -113,6 +117,7 @@ static int wil_suspend_keep_radio_on(struct wil6210_priv *wil)
/* Prevent handling of new tx and wmi commands */ /* Prevent handling of new tx and wmi commands */
set_bit(wil_status_suspending, wil->status); set_bit(wil_status_suspending, wil->status);
wil_update_net_queues_bh(wil, NULL, true);
if (!wil_is_tx_idle(wil)) { if (!wil_is_tx_idle(wil)) {
wil_dbg_pm(wil, "Pending TX data, reject suspend\n"); wil_dbg_pm(wil, "Pending TX data, reject suspend\n");
@ -201,13 +206,17 @@ resume_after_fail:
clear_bit(wil_status_suspending, wil->status); clear_bit(wil_status_suspending, wil->status);
rc = wmi_resume(wil); rc = wmi_resume(wil);
/* if resume succeeded, reject the suspend */ /* if resume succeeded, reject the suspend */
if (!rc) if (!rc) {
rc = -EBUSY; rc = -EBUSY;
if (test_bit(wil_status_fwconnected, wil->status))
wil_update_net_queues_bh(wil, NULL, false);
}
return rc; return rc;
reject_suspend: reject_suspend:
clear_bit(wil_status_suspending, wil->status); clear_bit(wil_status_suspending, wil->status);
if (test_bit(wil_status_fwconnected, wil->status))
wil_update_net_queues_bh(wil, NULL, false);
return -EBUSY; return -EBUSY;
} }

View file

@ -1930,6 +1930,11 @@ static inline void __wil_update_net_queues(struct wil6210_priv *wil,
return; return;
} }
/* Do not wake the queues in suspend flow */
if (test_bit(wil_status_suspending, wil->status) ||
test_bit(wil_status_suspended, wil->status))
return;
/* check wake */ /* check wake */
for (i = 0; i < WIL6210_MAX_TX_RINGS; i++) { for (i = 0; i < WIL6210_MAX_TX_RINGS; i++) {
struct vring *cur_vring = &wil->vring_tx[i]; struct vring *cur_vring = &wil->vring_tx[i];