Lines Matching refs:wil

24 static void wil_pm_wake_connected_net_queues(struct wil6210_priv *wil)  in wil_pm_wake_connected_net_queues()  argument
28 mutex_lock(&wil->vif_mutex); in wil_pm_wake_connected_net_queues()
29 for (i = 0; i < wil->max_vifs; i++) { in wil_pm_wake_connected_net_queues()
30 struct wil6210_vif *vif = wil->vifs[i]; in wil_pm_wake_connected_net_queues()
33 wil_update_net_queues_bh(wil, vif, NULL, false); in wil_pm_wake_connected_net_queues()
35 mutex_unlock(&wil->vif_mutex); in wil_pm_wake_connected_net_queues()
38 static void wil_pm_stop_all_net_queues(struct wil6210_priv *wil) in wil_pm_stop_all_net_queues() argument
42 mutex_lock(&wil->vif_mutex); in wil_pm_stop_all_net_queues()
43 for (i = 0; i < wil->max_vifs; i++) { in wil_pm_stop_all_net_queues()
44 struct wil6210_vif *vif = wil->vifs[i]; in wil_pm_stop_all_net_queues()
47 wil_update_net_queues_bh(wil, vif, NULL, true); in wil_pm_stop_all_net_queues()
49 mutex_unlock(&wil->vif_mutex); in wil_pm_stop_all_net_queues()
53 wil_can_suspend_vif(struct wil6210_priv *wil, struct wil6210_vif *vif, in wil_can_suspend_vif() argument
60 wil_dbg_pm(wil, "Sniffer\n"); in wil_can_suspend_vif()
67 wil_dbg_pm(wil, "Delay suspend when connecting\n"); in wil_can_suspend_vif()
71 wil_dbg_pm(wil, "STA-like interface\n"); in wil_can_suspend_vif()
77 wil_dbg_pm(wil, "AP-like interface\n"); in wil_can_suspend_vif()
84 int wil_can_suspend(struct wil6210_priv *wil, bool is_runtime) in wil_can_suspend() argument
88 wil->fw_capabilities); in wil_can_suspend()
91 wil_dbg_pm(wil, "can_suspend: %s\n", is_runtime ? "runtime" : "system"); in wil_can_suspend()
94 wil_dbg_pm(wil, "Deny any suspend - %s mode\n", in wil_can_suspend()
99 if (is_runtime && !wil->platform_ops.suspend) { in wil_can_suspend()
104 mutex_lock(&wil->vif_mutex); in wil_can_suspend()
105 active_ifaces = wil_has_active_ifaces(wil, true, false); in wil_can_suspend()
106 mutex_unlock(&wil->vif_mutex); in wil_can_suspend()
110 wil_dbg_pm(wil, "Interface is down\n"); in wil_can_suspend()
113 if (test_bit(wil_status_resetting, wil->status)) { in wil_can_suspend()
114 wil_dbg_pm(wil, "Delay suspend when resetting\n"); in wil_can_suspend()
118 if (wil->recovery_state != fw_recovery_idle) { in wil_can_suspend()
119 wil_dbg_pm(wil, "Delay suspend during recovery\n"); in wil_can_suspend()
125 mutex_lock(&wil->vif_mutex); in wil_can_suspend()
126 for (i = 0; i < wil->max_vifs; i++) { in wil_can_suspend()
127 struct wil6210_vif *vif = wil->vifs[i]; in wil_can_suspend()
131 if (!wil_can_suspend_vif(wil, vif, is_runtime)) { in wil_can_suspend()
133 mutex_unlock(&wil->vif_mutex); in wil_can_suspend()
137 mutex_unlock(&wil->vif_mutex); in wil_can_suspend()
140 wil_dbg_pm(wil, "can_suspend: %s => %s (%d)\n", in wil_can_suspend()
144 wil->suspend_stats.rejected_by_host++; in wil_can_suspend()
149 static int wil_resume_keep_radio_on(struct wil6210_priv *wil) in wil_resume_keep_radio_on() argument
156 set_bit(wil_status_resuming, wil->status); in wil_resume_keep_radio_on()
157 clear_bit(wil_status_suspended, wil->status); in wil_resume_keep_radio_on()
158 wil_c(wil, RGF_USER_CLKS_CTL_0, BIT_USER_CLKS_RST_PWGD); in wil_resume_keep_radio_on()
159 wil_unmask_irq(wil); in wil_resume_keep_radio_on()
161 wil6210_bus_request(wil, wil->bus_request_kbps_pre_suspend); in wil_resume_keep_radio_on()
164 rc = wmi_resume(wil); in wil_resume_keep_radio_on()
166 wil_err(wil, "device failed to resume (%d)\n", rc); in wil_resume_keep_radio_on()
169 rc = wil_down(wil); in wil_resume_keep_radio_on()
171 wil_err(wil, "wil_down failed (%d)\n", rc); in wil_resume_keep_radio_on()
174 rc = wil_up(wil); in wil_resume_keep_radio_on()
176 wil_err(wil, "wil_up failed (%d)\n", rc); in wil_resume_keep_radio_on()
182 wil_pm_wake_connected_net_queues(wil); in wil_resume_keep_radio_on()
186 set_bit(wil_status_suspended, wil->status); in wil_resume_keep_radio_on()
190 static int wil_suspend_keep_radio_on(struct wil6210_priv *wil) in wil_suspend_keep_radio_on() argument
195 wil_dbg_pm(wil, "suspend keep radio on\n"); in wil_suspend_keep_radio_on()
198 set_bit(wil_status_suspending, wil->status); in wil_suspend_keep_radio_on()
199 if (test_bit(wil_status_collecting_dumps, wil->status)) { in wil_suspend_keep_radio_on()
201 wil_dbg_pm(wil, "reject suspend while collecting crash dump\n"); in wil_suspend_keep_radio_on()
202 clear_bit(wil_status_suspending, wil->status); in wil_suspend_keep_radio_on()
203 wil->suspend_stats.rejected_by_host++; in wil_suspend_keep_radio_on()
206 wil_pm_stop_all_net_queues(wil); in wil_suspend_keep_radio_on()
208 if (!wil_is_tx_idle(wil)) { in wil_suspend_keep_radio_on()
209 wil_dbg_pm(wil, "Pending TX data, reject suspend\n"); in wil_suspend_keep_radio_on()
210 wil->suspend_stats.rejected_by_host++; in wil_suspend_keep_radio_on()
214 if (!wil->txrx_ops.is_rx_idle(wil)) { in wil_suspend_keep_radio_on()
215 wil_dbg_pm(wil, "Pending RX data, reject suspend\n"); in wil_suspend_keep_radio_on()
216 wil->suspend_stats.rejected_by_host++; in wil_suspend_keep_radio_on()
220 if (!wil_is_wmi_idle(wil)) { in wil_suspend_keep_radio_on()
221 wil_dbg_pm(wil, "Pending WMI events, reject suspend\n"); in wil_suspend_keep_radio_on()
222 wil->suspend_stats.rejected_by_host++; in wil_suspend_keep_radio_on()
227 rc = wmi_suspend(wil); in wil_suspend_keep_radio_on()
229 wil_dbg_pm(wil, "wmi_suspend failed, reject suspend (%d)\n", in wil_suspend_keep_radio_on()
237 if (test_bit(wil_status_napi_en, wil->status)) { in wil_suspend_keep_radio_on()
238 while (!wil->txrx_ops.is_rx_idle(wil)) { in wil_suspend_keep_radio_on()
240 if (wil->txrx_ops.is_rx_idle(wil)) in wil_suspend_keep_radio_on()
242 wil_err(wil, in wil_suspend_keep_radio_on()
244 wil->suspend_stats.r_on.failed_suspends++; in wil_suspend_keep_radio_on()
247 wil_dbg_ratelimited(wil, "rx vring is not empty -> NAPI\n"); in wil_suspend_keep_radio_on()
248 napi_synchronize(&wil->napi_rx); in wil_suspend_keep_radio_on()
258 if (!wil_is_wmi_idle(wil)) { in wil_suspend_keep_radio_on()
259 wil_err(wil, "suspend failed due to pending WMI events\n"); in wil_suspend_keep_radio_on()
260 wil->suspend_stats.r_on.failed_suspends++; in wil_suspend_keep_radio_on()
264 wil_mask_irq(wil); in wil_suspend_keep_radio_on()
267 wil_s(wil, RGF_USER_CLKS_CTL_0, BIT_USER_CLKS_RST_PWGD); in wil_suspend_keep_radio_on()
269 if (wil->platform_ops.suspend) { in wil_suspend_keep_radio_on()
270 rc = wil->platform_ops.suspend(wil->platform_handle, true); in wil_suspend_keep_radio_on()
272 wil_err(wil, "platform device failed to suspend (%d)\n", in wil_suspend_keep_radio_on()
274 wil->suspend_stats.r_on.failed_suspends++; in wil_suspend_keep_radio_on()
275 wil_c(wil, RGF_USER_CLKS_CTL_0, BIT_USER_CLKS_RST_PWGD); in wil_suspend_keep_radio_on()
276 wil_unmask_irq(wil); in wil_suspend_keep_radio_on()
282 wil->bus_request_kbps_pre_suspend = wil->bus_request_kbps; in wil_suspend_keep_radio_on()
283 wil6210_bus_request(wil, 0); in wil_suspend_keep_radio_on()
285 set_bit(wil_status_suspended, wil->status); in wil_suspend_keep_radio_on()
286 clear_bit(wil_status_suspending, wil->status); in wil_suspend_keep_radio_on()
291 set_bit(wil_status_resuming, wil->status); in wil_suspend_keep_radio_on()
292 clear_bit(wil_status_suspending, wil->status); in wil_suspend_keep_radio_on()
293 rc = wmi_resume(wil); in wil_suspend_keep_radio_on()
297 wil_pm_wake_connected_net_queues(wil); in wil_suspend_keep_radio_on()
302 clear_bit(wil_status_suspending, wil->status); in wil_suspend_keep_radio_on()
303 wil_pm_wake_connected_net_queues(wil); in wil_suspend_keep_radio_on()
307 static int wil_suspend_radio_off(struct wil6210_priv *wil) in wil_suspend_radio_off() argument
312 wil_dbg_pm(wil, "suspend radio off\n"); in wil_suspend_radio_off()
314 set_bit(wil_status_suspending, wil->status); in wil_suspend_radio_off()
315 if (test_bit(wil_status_collecting_dumps, wil->status)) { in wil_suspend_radio_off()
317 wil_dbg_pm(wil, "reject suspend while collecting crash dump\n"); in wil_suspend_radio_off()
318 clear_bit(wil_status_suspending, wil->status); in wil_suspend_radio_off()
319 wil->suspend_stats.rejected_by_host++; in wil_suspend_radio_off()
324 mutex_lock(&wil->vif_mutex); in wil_suspend_radio_off()
325 active_ifaces = wil_has_active_ifaces(wil, true, false); in wil_suspend_radio_off()
326 mutex_unlock(&wil->vif_mutex); in wil_suspend_radio_off()
329 rc = wil_down(wil); in wil_suspend_radio_off()
331 wil_err(wil, "wil_down : %d\n", rc); in wil_suspend_radio_off()
332 wil->suspend_stats.r_off.failed_suspends++; in wil_suspend_radio_off()
338 wil_dbg_pm(wil, "Disabling PCIe IRQ before suspending\n"); in wil_suspend_radio_off()
339 wil_disable_irq(wil); in wil_suspend_radio_off()
341 if (wil->platform_ops.suspend) { in wil_suspend_radio_off()
342 rc = wil->platform_ops.suspend(wil->platform_handle, false); in wil_suspend_radio_off()
344 wil_enable_irq(wil); in wil_suspend_radio_off()
345 wil->suspend_stats.r_off.failed_suspends++; in wil_suspend_radio_off()
350 set_bit(wil_status_suspended, wil->status); in wil_suspend_radio_off()
353 clear_bit(wil_status_suspending, wil->status); in wil_suspend_radio_off()
354 wil_dbg_pm(wil, "suspend radio off: %d\n", rc); in wil_suspend_radio_off()
359 static int wil_resume_radio_off(struct wil6210_priv *wil) in wil_resume_radio_off() argument
364 wil_dbg_pm(wil, "Enabling PCIe IRQ\n"); in wil_resume_radio_off()
365 wil_enable_irq(wil); in wil_resume_radio_off()
371 mutex_lock(&wil->vif_mutex); in wil_resume_radio_off()
372 active_ifaces = wil_has_active_ifaces(wil, true, false); in wil_resume_radio_off()
373 mutex_unlock(&wil->vif_mutex); in wil_resume_radio_off()
375 rc = wil_up(wil); in wil_resume_radio_off()
377 clear_bit(wil_status_suspended, wil->status); in wil_resume_radio_off()
382 int wil_suspend(struct wil6210_priv *wil, bool is_runtime, bool keep_radio_on) in wil_suspend() argument
386 wil_dbg_pm(wil, "suspend: %s\n", is_runtime ? "runtime" : "system"); in wil_suspend()
388 if (test_bit(wil_status_suspended, wil->status)) { in wil_suspend()
389 wil_dbg_pm(wil, "trying to suspend while suspended\n"); in wil_suspend()
394 rc = wil_suspend_radio_off(wil); in wil_suspend()
396 rc = wil_suspend_keep_radio_on(wil); in wil_suspend()
398 wil_dbg_pm(wil, "suspend: %s => %d\n", in wil_suspend()
404 int wil_resume(struct wil6210_priv *wil, bool is_runtime, bool keep_radio_on) in wil_resume() argument
408 wil_dbg_pm(wil, "resume: %s\n", is_runtime ? "runtime" : "system"); in wil_resume()
410 if (wil->platform_ops.resume) { in wil_resume()
411 rc = wil->platform_ops.resume(wil->platform_handle, in wil_resume()
414 wil_err(wil, "platform_ops.resume : %d\n", rc); in wil_resume()
420 rc = wil_resume_keep_radio_on(wil); in wil_resume()
422 rc = wil_resume_radio_off(wil); in wil_resume()
425 wil_dbg_pm(wil, "resume: %s => %d\n", is_runtime ? "runtime" : "system", in wil_resume()
430 void wil_pm_runtime_allow(struct wil6210_priv *wil) in wil_pm_runtime_allow() argument
432 struct device *dev = wil_to_dev(wil); in wil_pm_runtime_allow()
440 void wil_pm_runtime_forbid(struct wil6210_priv *wil) in wil_pm_runtime_forbid() argument
442 struct device *dev = wil_to_dev(wil); in wil_pm_runtime_forbid()
448 int wil_pm_runtime_get(struct wil6210_priv *wil) in wil_pm_runtime_get() argument
451 struct device *dev = wil_to_dev(wil); in wil_pm_runtime_get()
455 wil_err(wil, "pm_runtime_get_sync() failed, rc = %d\n", rc); in wil_pm_runtime_get()
463 void wil_pm_runtime_put(struct wil6210_priv *wil) in wil_pm_runtime_put() argument
465 struct device *dev = wil_to_dev(wil); in wil_pm_runtime_put()