Loading drivers/net/wireless/ath/wil6210/pm.c +20 −14 Original line number Diff line number Diff line Loading @@ -80,6 +80,8 @@ static int wil_resume_keep_radio_on(struct wil6210_priv *wil) wil_c(wil, RGF_USER_CLKS_CTL_0, BIT_USER_CLKS_RST_PWGD); wil_unmask_irq(wil); wil6210_bus_request(wil, wil->bus_request_kbps_pre_suspend); /* Send WMI resume request to the device */ rc = wmi_resume(wil); if (rc) { Loading @@ -96,7 +98,9 @@ static int wil_resume_keep_radio_on(struct wil6210_priv *wil) } } wil6210_bus_request(wil, wil->bus_request_kbps_pre_suspend); /* Wake all queues */ if (test_bit(wil_status_fwconnected, wil->status)) wil_update_net_queues_bh(wil, NULL, false); out: if (rc) Loading @@ -113,6 +117,7 @@ static int wil_suspend_keep_radio_on(struct wil6210_priv *wil) /* Prevent handling of new tx and wmi commands */ set_bit(wil_status_suspending, wil->status); wil_update_net_queues_bh(wil, NULL, true); if (!wil_is_tx_idle(wil)) { wil_dbg_pm(wil, "Pending TX data, reject suspend\n"); Loading Loading @@ -175,42 +180,43 @@ static int wil_suspend_keep_radio_on(struct wil6210_priv *wil) /* Disable device reset on PERST */ wil_s(wil, RGF_USER_CLKS_CTL_0, BIT_USER_CLKS_RST_PWGD); /* Save the current bus request to return to the same in resume */ wil->bus_request_kbps_pre_suspend = wil->bus_request_kbps; wil6210_bus_request(wil, 0); if (wil->platform_ops.suspend) { rc = wil->platform_ops.suspend(wil->platform_handle, true); if (rc) { wil_err(wil, "platform device failed to suspend (%d)\n", rc); wil->suspend_stats.failed_suspends++; clear_bit(wil_status_suspending, wil->status); rc = wil_resume_keep_radio_on(wil); /* if resume succeeded, reject the suspend */ if (!rc) rc = -EBUSY; goto out; wil_c(wil, RGF_USER_CLKS_CTL_0, BIT_USER_CLKS_RST_PWGD); wil_unmask_irq(wil); goto resume_after_fail; } } /* Save the current bus request to return to the same in resume */ wil->bus_request_kbps_pre_suspend = wil->bus_request_kbps; wil6210_bus_request(wil, 0); set_bit(wil_status_suspended, wil->status); clear_bit(wil_status_suspending, wil->status); return rc; resume_after_fail: set_bit(wil_status_resuming, wil->status); clear_bit(wil_status_suspending, wil->status); rc = wmi_resume(wil); /* if resume succeeded, reject the suspend */ if (!rc) if (!rc) { rc = -EBUSY; out: if (test_bit(wil_status_fwconnected, wil->status)) wil_update_net_queues_bh(wil, NULL, false); } return rc; reject_suspend: 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; } Loading drivers/net/wireless/ath/wil6210/txrx.c +5 −0 Original line number Diff line number Diff line Loading @@ -1930,6 +1930,11 @@ static inline void __wil_update_net_queues(struct wil6210_priv *wil, 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 */ for (i = 0; i < WIL6210_MAX_TX_RINGS; i++) { struct vring *cur_vring = &wil->vring_tx[i]; Loading Loading
drivers/net/wireless/ath/wil6210/pm.c +20 −14 Original line number Diff line number Diff line Loading @@ -80,6 +80,8 @@ static int wil_resume_keep_radio_on(struct wil6210_priv *wil) wil_c(wil, RGF_USER_CLKS_CTL_0, BIT_USER_CLKS_RST_PWGD); wil_unmask_irq(wil); wil6210_bus_request(wil, wil->bus_request_kbps_pre_suspend); /* Send WMI resume request to the device */ rc = wmi_resume(wil); if (rc) { Loading @@ -96,7 +98,9 @@ static int wil_resume_keep_radio_on(struct wil6210_priv *wil) } } wil6210_bus_request(wil, wil->bus_request_kbps_pre_suspend); /* Wake all queues */ if (test_bit(wil_status_fwconnected, wil->status)) wil_update_net_queues_bh(wil, NULL, false); out: if (rc) Loading @@ -113,6 +117,7 @@ static int wil_suspend_keep_radio_on(struct wil6210_priv *wil) /* Prevent handling of new tx and wmi commands */ set_bit(wil_status_suspending, wil->status); wil_update_net_queues_bh(wil, NULL, true); if (!wil_is_tx_idle(wil)) { wil_dbg_pm(wil, "Pending TX data, reject suspend\n"); Loading Loading @@ -175,42 +180,43 @@ static int wil_suspend_keep_radio_on(struct wil6210_priv *wil) /* Disable device reset on PERST */ wil_s(wil, RGF_USER_CLKS_CTL_0, BIT_USER_CLKS_RST_PWGD); /* Save the current bus request to return to the same in resume */ wil->bus_request_kbps_pre_suspend = wil->bus_request_kbps; wil6210_bus_request(wil, 0); if (wil->platform_ops.suspend) { rc = wil->platform_ops.suspend(wil->platform_handle, true); if (rc) { wil_err(wil, "platform device failed to suspend (%d)\n", rc); wil->suspend_stats.failed_suspends++; clear_bit(wil_status_suspending, wil->status); rc = wil_resume_keep_radio_on(wil); /* if resume succeeded, reject the suspend */ if (!rc) rc = -EBUSY; goto out; wil_c(wil, RGF_USER_CLKS_CTL_0, BIT_USER_CLKS_RST_PWGD); wil_unmask_irq(wil); goto resume_after_fail; } } /* Save the current bus request to return to the same in resume */ wil->bus_request_kbps_pre_suspend = wil->bus_request_kbps; wil6210_bus_request(wil, 0); set_bit(wil_status_suspended, wil->status); clear_bit(wil_status_suspending, wil->status); return rc; resume_after_fail: set_bit(wil_status_resuming, wil->status); clear_bit(wil_status_suspending, wil->status); rc = wmi_resume(wil); /* if resume succeeded, reject the suspend */ if (!rc) if (!rc) { rc = -EBUSY; out: if (test_bit(wil_status_fwconnected, wil->status)) wil_update_net_queues_bh(wil, NULL, false); } return rc; reject_suspend: 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; } Loading
drivers/net/wireless/ath/wil6210/txrx.c +5 −0 Original line number Diff line number Diff line Loading @@ -1930,6 +1930,11 @@ static inline void __wil_update_net_queues(struct wil6210_priv *wil, 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 */ for (i = 0; i < WIL6210_MAX_TX_RINGS; i++) { struct vring *cur_vring = &wil->vring_tx[i]; Loading