Lines Matching refs:wil

143 static void wil_disconnect_cid(struct wil6210_priv *wil, int cid,  in wil_disconnect_cid()  argument
148 struct net_device *ndev = wil_to_ndev(wil); in wil_disconnect_cid()
149 struct wireless_dev *wdev = wil->wdev; in wil_disconnect_cid()
150 struct wil_sta_info *sta = &wil->sta[cid]; in wil_disconnect_cid()
153 wil_dbg_misc(wil, "%s(CID %d, status %d)\n", __func__, cid, in wil_disconnect_cid()
158 wmi_disconnect_sta(wil, sta->addr, reason_code); in wil_disconnect_cid()
179 wil_tid_ampdu_rx_free(wil, r); in wil_disconnect_cid()
183 for (i = 0; i < ARRAY_SIZE(wil->vring_tx); i++) { in wil_disconnect_cid()
184 if (wil->vring2cid_tid[i][0] == cid) in wil_disconnect_cid()
185 wil_vring_fini_tx(wil, i); in wil_disconnect_cid()
190 static void _wil6210_disconnect(struct wil6210_priv *wil, const u8 *bssid, in _wil6210_disconnect() argument
194 struct net_device *ndev = wil_to_ndev(wil); in _wil6210_disconnect()
195 struct wireless_dev *wdev = wil->wdev; in _wil6210_disconnect()
198 wil_dbg_misc(wil, "%s(bssid=%pM, reason=%d, ev%s)\n", __func__, bssid, in _wil6210_disconnect()
213 cid = wil_find_cid(wil, bssid); in _wil6210_disconnect()
214 wil_dbg_misc(wil, "Disconnect %pM, CID=%d, reason=%d\n", in _wil6210_disconnect()
217 wil_disconnect_cid(wil, cid, reason_code, from_event); in _wil6210_disconnect()
219 wil_dbg_misc(wil, "Disconnect all\n"); in _wil6210_disconnect()
221 wil_disconnect_cid(wil, cid, reason_code, from_event); in _wil6210_disconnect()
228 wil_bcast_fini(wil); in _wil6210_disconnect()
232 if (test_bit(wil_status_fwconnected, wil->status)) { in _wil6210_disconnect()
233 clear_bit(wil_status_fwconnected, wil->status); in _wil6210_disconnect()
236 } else if (test_bit(wil_status_fwconnecting, wil->status)) { in _wil6210_disconnect()
241 clear_bit(wil_status_fwconnecting, wil->status); in _wil6210_disconnect()
250 struct wil6210_priv *wil = container_of(work, in wil_disconnect_worker() local
253 mutex_lock(&wil->mutex); in wil_disconnect_worker()
254 _wil6210_disconnect(wil, NULL, WLAN_REASON_UNSPECIFIED, false); in wil_disconnect_worker()
255 mutex_unlock(&wil->mutex); in wil_disconnect_worker()
260 struct wil6210_priv *wil = (void *)x; in wil_connect_timer_fn() local
262 wil_dbg_misc(wil, "Connect timeout\n"); in wil_connect_timer_fn()
267 schedule_work(&wil->disconnect_worker); in wil_connect_timer_fn()
272 struct wil6210_priv *wil = (void *)x; in wil_scan_timer_fn() local
274 clear_bit(wil_status_fwready, wil->status); in wil_scan_timer_fn()
275 wil_err(wil, "Scan timeout detected, start fw error recovery\n"); in wil_scan_timer_fn()
276 wil_fw_error_recovery(wil); in wil_scan_timer_fn()
279 static int wil_wait_for_recovery(struct wil6210_priv *wil) in wil_wait_for_recovery() argument
281 if (wait_event_interruptible(wil->wq, wil->recovery_state != in wil_wait_for_recovery()
283 wil_err(wil, "Interrupt, canceling recovery\n"); in wil_wait_for_recovery()
286 if (wil->recovery_state != fw_recovery_running) { in wil_wait_for_recovery()
287 wil_info(wil, "Recovery cancelled\n"); in wil_wait_for_recovery()
290 wil_info(wil, "Proceed with recovery\n"); in wil_wait_for_recovery()
294 void wil_set_recovery_state(struct wil6210_priv *wil, int state) in wil_set_recovery_state() argument
296 wil_dbg_misc(wil, "%s(%d -> %d)\n", __func__, in wil_set_recovery_state()
297 wil->recovery_state, state); in wil_set_recovery_state()
299 wil->recovery_state = state; in wil_set_recovery_state()
300 wake_up_interruptible(&wil->wq); in wil_set_recovery_state()
305 struct wil6210_priv *wil = container_of(work, struct wil6210_priv, in wil_fw_error_worker() local
307 struct wireless_dev *wdev = wil->wdev; in wil_fw_error_worker()
309 wil_dbg_misc(wil, "fw error worker\n"); in wil_fw_error_worker()
311 if (!netif_running(wil_to_ndev(wil))) { in wil_fw_error_worker()
312 wil_info(wil, "No recovery - interface is down\n"); in wil_fw_error_worker()
319 if (time_is_after_jiffies(wil->last_fw_recovery + in wil_fw_error_worker()
321 wil->recovery_count++; in wil_fw_error_worker()
323 wil->recovery_count = 1; /* fw was alive for a long time */ in wil_fw_error_worker()
325 if (wil->recovery_count > WIL6210_FW_RECOVERY_RETRIES) { in wil_fw_error_worker()
326 wil_err(wil, "too many recovery attempts (%d), giving up\n", in wil_fw_error_worker()
327 wil->recovery_count); in wil_fw_error_worker()
331 wil->last_fw_recovery = jiffies; in wil_fw_error_worker()
333 mutex_lock(&wil->mutex); in wil_fw_error_worker()
338 wil_info(wil, "fw error recovery requested (try %d)...\n", in wil_fw_error_worker()
339 wil->recovery_count); in wil_fw_error_worker()
341 wil->recovery_state = fw_recovery_running; in wil_fw_error_worker()
342 if (0 != wil_wait_for_recovery(wil)) in wil_fw_error_worker()
345 __wil_down(wil); in wil_fw_error_worker()
346 __wil_up(wil); in wil_fw_error_worker()
350 wil_info(wil, "No recovery for AP-like interface\n"); in wil_fw_error_worker()
354 wil_err(wil, "No recovery - unknown interface type %d\n", in wil_fw_error_worker()
358 mutex_unlock(&wil->mutex); in wil_fw_error_worker()
361 static int wil_find_free_vring(struct wil6210_priv *wil) in wil_find_free_vring() argument
366 if (!wil->vring_tx[i].va) in wil_find_free_vring()
372 int wil_bcast_init(struct wil6210_priv *wil) in wil_bcast_init() argument
374 int ri = wil->bcast_vring, rc; in wil_bcast_init()
376 if ((ri >= 0) && wil->vring_tx[ri].va) in wil_bcast_init()
379 ri = wil_find_free_vring(wil); in wil_bcast_init()
383 wil->bcast_vring = ri; in wil_bcast_init()
384 rc = wil_vring_init_bcast(wil, ri, 1 << bcast_ring_order); in wil_bcast_init()
386 wil->bcast_vring = -1; in wil_bcast_init()
391 void wil_bcast_fini(struct wil6210_priv *wil) in wil_bcast_fini() argument
393 int ri = wil->bcast_vring; in wil_bcast_fini()
398 wil->bcast_vring = -1; in wil_bcast_fini()
399 wil_vring_fini_tx(wil, ri); in wil_bcast_fini()
405 struct wil6210_priv *wil = container_of(work, struct wil6210_priv, in wil_connect_worker() local
407 struct net_device *ndev = wil_to_ndev(wil); in wil_connect_worker()
409 int cid = wil->pending_connect_cid; in wil_connect_worker()
410 int ringid = wil_find_free_vring(wil); in wil_connect_worker()
413 wil_err(wil, "No connection pending\n"); in wil_connect_worker()
417 wil_dbg_wmi(wil, "Configure for connection CID %d\n", cid); in wil_connect_worker()
419 rc = wil_vring_init_tx(wil, ringid, 1 << tx_ring_order, cid, 0); in wil_connect_worker()
420 wil->pending_connect_cid = -1; in wil_connect_worker()
422 wil->sta[cid].status = wil_sta_connected; in wil_connect_worker()
425 wil_disconnect_cid(wil, cid, WLAN_REASON_UNSPECIFIED, true); in wil_connect_worker()
429 int wil_priv_init(struct wil6210_priv *wil) in wil_priv_init() argument
433 wil_dbg_misc(wil, "%s()\n", __func__); in wil_priv_init()
435 memset(wil->sta, 0, sizeof(wil->sta)); in wil_priv_init()
437 spin_lock_init(&wil->sta[i].tid_rx_lock); in wil_priv_init()
439 mutex_init(&wil->mutex); in wil_priv_init()
440 mutex_init(&wil->wmi_mutex); in wil_priv_init()
441 mutex_init(&wil->back_rx_mutex); in wil_priv_init()
442 mutex_init(&wil->back_tx_mutex); in wil_priv_init()
443 mutex_init(&wil->probe_client_mutex); in wil_priv_init()
445 init_completion(&wil->wmi_ready); in wil_priv_init()
446 init_completion(&wil->wmi_call); in wil_priv_init()
448 wil->pending_connect_cid = -1; in wil_priv_init()
449 wil->bcast_vring = -1; in wil_priv_init()
450 setup_timer(&wil->connect_timer, wil_connect_timer_fn, (ulong)wil); in wil_priv_init()
451 setup_timer(&wil->scan_timer, wil_scan_timer_fn, (ulong)wil); in wil_priv_init()
453 INIT_WORK(&wil->connect_worker, wil_connect_worker); in wil_priv_init()
454 INIT_WORK(&wil->disconnect_worker, wil_disconnect_worker); in wil_priv_init()
455 INIT_WORK(&wil->wmi_event_worker, wmi_event_worker); in wil_priv_init()
456 INIT_WORK(&wil->fw_error_worker, wil_fw_error_worker); in wil_priv_init()
457 INIT_WORK(&wil->back_rx_worker, wil_back_rx_worker); in wil_priv_init()
458 INIT_WORK(&wil->back_tx_worker, wil_back_tx_worker); in wil_priv_init()
459 INIT_WORK(&wil->probe_client_worker, wil_probe_client_worker); in wil_priv_init()
461 INIT_LIST_HEAD(&wil->pending_wmi_ev); in wil_priv_init()
462 INIT_LIST_HEAD(&wil->back_rx_pending); in wil_priv_init()
463 INIT_LIST_HEAD(&wil->back_tx_pending); in wil_priv_init()
464 INIT_LIST_HEAD(&wil->probe_client_pending); in wil_priv_init()
465 spin_lock_init(&wil->wmi_ev_lock); in wil_priv_init()
466 init_waitqueue_head(&wil->wq); in wil_priv_init()
468 wil->wmi_wq = create_singlethread_workqueue(WIL_NAME "_wmi"); in wil_priv_init()
469 if (!wil->wmi_wq) in wil_priv_init()
472 wil->wq_service = create_singlethread_workqueue(WIL_NAME "_service"); in wil_priv_init()
473 if (!wil->wq_service) in wil_priv_init()
476 wil->last_fw_recovery = jiffies; in wil_priv_init()
477 wil->tx_interframe_timeout = WIL6210_ITR_TX_INTERFRAME_TIMEOUT_DEFAULT; in wil_priv_init()
478 wil->rx_interframe_timeout = WIL6210_ITR_RX_INTERFRAME_TIMEOUT_DEFAULT; in wil_priv_init()
479 wil->tx_max_burst_duration = WIL6210_ITR_TX_MAX_BURST_DURATION_DEFAULT; in wil_priv_init()
480 wil->rx_max_burst_duration = WIL6210_ITR_RX_MAX_BURST_DURATION_DEFAULT; in wil_priv_init()
487 destroy_workqueue(wil->wmi_wq); in wil_priv_init()
502 void wil6210_disconnect(struct wil6210_priv *wil, const u8 *bssid, in wil6210_disconnect() argument
505 wil_dbg_misc(wil, "%s()\n", __func__); in wil6210_disconnect()
507 del_timer_sync(&wil->connect_timer); in wil6210_disconnect()
508 _wil6210_disconnect(wil, bssid, reason_code, from_event); in wil6210_disconnect()
511 void wil_priv_deinit(struct wil6210_priv *wil) in wil_priv_deinit() argument
513 wil_dbg_misc(wil, "%s()\n", __func__); in wil_priv_deinit()
515 wil_set_recovery_state(wil, fw_recovery_idle); in wil_priv_deinit()
516 del_timer_sync(&wil->scan_timer); in wil_priv_deinit()
517 cancel_work_sync(&wil->disconnect_worker); in wil_priv_deinit()
518 cancel_work_sync(&wil->fw_error_worker); in wil_priv_deinit()
519 mutex_lock(&wil->mutex); in wil_priv_deinit()
520 wil6210_disconnect(wil, NULL, WLAN_REASON_DEAUTH_LEAVING, false); in wil_priv_deinit()
521 mutex_unlock(&wil->mutex); in wil_priv_deinit()
522 wmi_event_flush(wil); in wil_priv_deinit()
523 wil_back_rx_flush(wil); in wil_priv_deinit()
524 cancel_work_sync(&wil->back_rx_worker); in wil_priv_deinit()
525 wil_back_tx_flush(wil); in wil_priv_deinit()
526 cancel_work_sync(&wil->back_tx_worker); in wil_priv_deinit()
527 wil_probe_client_flush(wil); in wil_priv_deinit()
528 cancel_work_sync(&wil->probe_client_worker); in wil_priv_deinit()
529 destroy_workqueue(wil->wq_service); in wil_priv_deinit()
530 destroy_workqueue(wil->wmi_wq); in wil_priv_deinit()
533 static inline void wil_halt_cpu(struct wil6210_priv *wil) in wil_halt_cpu() argument
535 wil_w(wil, RGF_USER_USER_CPU_0, BIT_USER_USER_CPU_MAN_RST); in wil_halt_cpu()
536 wil_w(wil, RGF_USER_MAC_CPU_0, BIT_USER_MAC_CPU_MAN_RST); in wil_halt_cpu()
539 static inline void wil_release_cpu(struct wil6210_priv *wil) in wil_release_cpu() argument
542 wil_w(wil, RGF_USER_USER_CPU_0, 1); in wil_release_cpu()
545 static int wil_target_reset(struct wil6210_priv *wil) in wil_target_reset() argument
550 wil_dbg_misc(wil, "Resetting \"%s\"...\n", wil->hw_name); in wil_target_reset()
553 wil_s(wil, RGF_HP_CTRL, BIT(15)); in wil_target_reset()
554 wil_s(wil, RGF_USER_CLKS_CTL_SW_RST_MASK_0, BIT_HPAL_PERST_FROM_PAD); in wil_target_reset()
555 wil_s(wil, RGF_USER_CLKS_CTL_SW_RST_MASK_0, BIT_CAR_PERST_RST); in wil_target_reset()
557 wil_halt_cpu(wil); in wil_target_reset()
560 wil_w(wil, RGF_USER_BL + in wil_target_reset()
563 wil_c(wil, RGF_USER_USAGE_6, BIT(0)); in wil_target_reset()
565 wil_s(wil, RGF_CAF_OSC_CONTROL, BIT_CAF_OSC_XTAL_EN); in wil_target_reset()
568 x = wil_r(wil, RGF_CAF_PLL_LOCK_STATUS); in wil_target_reset()
570 wil_err(wil, "Xtal stabilization timeout\n" in wil_target_reset()
575 wil_c(wil, RGF_USER_SPARROW_M_4, BIT_SPARROW_M_4_SEL_SLEEP_OR_REF); in wil_target_reset()
577 wil_c(wil, RGF_USER_CLKS_CTL_0, BIT_USER_CLKS_CAR_AHB_SW_SEL); in wil_target_reset()
579 wil_w(wil, RGF_USER_CLKS_CTL_EXT_SW_RST_VEC_0, 0x3ff81f); in wil_target_reset()
580 wil_w(wil, RGF_USER_CLKS_CTL_EXT_SW_RST_VEC_1, 0xf); in wil_target_reset()
582 wil_w(wil, RGF_USER_CLKS_CTL_SW_RST_VEC_2, 0xFE000000); in wil_target_reset()
583 wil_w(wil, RGF_USER_CLKS_CTL_SW_RST_VEC_1, 0x0000003F); in wil_target_reset()
584 wil_w(wil, RGF_USER_CLKS_CTL_SW_RST_VEC_3, 0x000000f0); in wil_target_reset()
585 wil_w(wil, RGF_USER_CLKS_CTL_SW_RST_VEC_0, 0xFFE7FE00); in wil_target_reset()
587 wil_w(wil, RGF_USER_CLKS_CTL_EXT_SW_RST_VEC_0, 0x0); in wil_target_reset()
588 wil_w(wil, RGF_USER_CLKS_CTL_EXT_SW_RST_VEC_1, 0x0); in wil_target_reset()
590 wil_w(wil, RGF_USER_CLKS_CTL_SW_RST_VEC_3, 0); in wil_target_reset()
591 wil_w(wil, RGF_USER_CLKS_CTL_SW_RST_VEC_2, 0); in wil_target_reset()
592 wil_w(wil, RGF_USER_CLKS_CTL_SW_RST_VEC_1, 0); in wil_target_reset()
593 wil_w(wil, RGF_USER_CLKS_CTL_SW_RST_VEC_0, 0); in wil_target_reset()
595 wil_w(wil, RGF_USER_CLKS_CTL_SW_RST_VEC_3, 0x00000003); in wil_target_reset()
597 wil_w(wil, RGF_USER_CLKS_CTL_SW_RST_VEC_2, 0x00008000); in wil_target_reset()
599 wil_w(wil, RGF_USER_CLKS_CTL_SW_RST_VEC_0, 0); in wil_target_reset()
604 x = wil_r(wil, RGF_USER_BL + in wil_target_reset()
608 wil_dbg_misc(wil, "BL.ready 0x%08x => 0x%08x\n", x1, x); in wil_target_reset()
612 wil_err(wil, "Reset not completed, bl.ready 0x%08x\n", in wil_target_reset()
618 wil_c(wil, RGF_USER_CLKS_CTL_0, BIT_USER_CLKS_RST_PWGD); in wil_target_reset()
621 wil_s(wil, RGF_DMA_OFUL_NID_0, BIT_DMA_OFUL_NID_0_RX_EXT_TR_EN | in wil_target_reset()
624 wil_dbg_misc(wil, "Reset completed in %d ms\n", delay * RST_DELAY); in wil_target_reset()
637 static int wil_get_bl_info(struct wil6210_priv *wil) in wil_get_bl_info() argument
639 struct net_device *ndev = wil_to_ndev(wil); in wil_get_bl_info()
648 wil_memcpy_fromio_32(&bl, wil->csr + HOSTADDR(RGF_USER_BL), in wil_get_bl_info()
657 wil_info(wil, in wil_get_bl_info()
661 wil_info(wil, "Boot Loader build unknown for struct v0\n"); in wil_get_bl_info()
668 wil_info(wil, in wil_get_bl_info()
673 wil_info(wil, "Boot Loader build %d.%d.%d.%d\n", in wil_get_bl_info()
679 wil_err(wil, "BL: Invalid MAC %pM\n", mac); in wil_get_bl_info()
688 wil_err(wil, "RF communication error 0x%04x", in wil_get_bl_info()
696 static void wil_bl_crash_info(struct wil6210_priv *wil, bool is_err) in wil_bl_crash_info() argument
699 u32 bl_ver = wil_r(wil, RGF_USER_BL + in wil_bl_crash_info()
706 bl_assert_code = wil_r(wil, RGF_USER_BL + in wil_bl_crash_info()
709 bl_assert_blink = wil_r(wil, RGF_USER_BL + in wil_bl_crash_info()
712 bl_magic_number = wil_r(wil, RGF_USER_BL + in wil_bl_crash_info()
717 wil_err(wil, in wil_bl_crash_info()
721 wil_dbg_misc(wil, in wil_bl_crash_info()
727 static int wil_wait_for_fw_ready(struct wil6210_priv *wil) in wil_wait_for_fw_ready() argument
730 ulong left = wait_for_completion_timeout(&wil->wmi_ready, to); in wil_wait_for_fw_ready()
733 wil_err(wil, "Firmware not ready\n"); in wil_wait_for_fw_ready()
736 wil_info(wil, "FW ready after %d ms. HW version 0x%08x\n", in wil_wait_for_fw_ready()
737 jiffies_to_msecs(to-left), wil->hw_version); in wil_wait_for_fw_ready()
747 int wil_reset(struct wil6210_priv *wil, bool load_fw) in wil_reset() argument
751 wil_dbg_misc(wil, "%s()\n", __func__); in wil_reset()
753 WARN_ON(!mutex_is_locked(&wil->mutex)); in wil_reset()
754 WARN_ON(test_bit(wil_status_napi_en, wil->status)); in wil_reset()
760 struct net_device *ndev = wil_to_ndev(wil); in wil_reset()
767 if (wil->hw_version == HW_VER_UNKNOWN) in wil_reset()
770 set_bit(wil_status_resetting, wil->status); in wil_reset()
772 cancel_work_sync(&wil->disconnect_worker); in wil_reset()
773 wil6210_disconnect(wil, NULL, WLAN_REASON_DEAUTH_LEAVING, false); in wil_reset()
774 wil_bcast_fini(wil); in wil_reset()
777 bitmap_zero(wil->status, wil_status_last); in wil_reset()
779 if (wil->scan_request) { in wil_reset()
780 wil_dbg_misc(wil, "Abort scan_request 0x%p\n", in wil_reset()
781 wil->scan_request); in wil_reset()
782 del_timer_sync(&wil->scan_timer); in wil_reset()
783 cfg80211_scan_done(wil->scan_request, true); in wil_reset()
784 wil->scan_request = NULL; in wil_reset()
787 wil_mask_irq(wil); in wil_reset()
789 wmi_event_flush(wil); in wil_reset()
791 flush_workqueue(wil->wq_service); in wil_reset()
792 flush_workqueue(wil->wmi_wq); in wil_reset()
794 wil_bl_crash_info(wil, false); in wil_reset()
795 rc = wil_target_reset(wil); in wil_reset()
796 wil_rx_fini(wil); in wil_reset()
798 wil_bl_crash_info(wil, true); in wil_reset()
802 rc = wil_get_bl_info(wil); in wil_reset()
809 wil_info(wil, "Use firmware <%s> + board <%s>\n", WIL_FW_NAME, in wil_reset()
812 wil_halt_cpu(wil); in wil_reset()
814 rc = wil_request_firmware(wil, WIL_FW_NAME); in wil_reset()
817 rc = wil_request_firmware(wil, WIL_FW2_NAME); in wil_reset()
822 wil_s(wil, RGF_USER_USAGE_6, 1); in wil_reset()
827 wil6210_clear_irq(wil); in wil_reset()
830 wil_s(wil, RGF_CAF_ICR + offsetof(struct RGF_ICR, ICR), 0); in wil_reset()
831 wil_w(wil, RGF_CAF_ICR + offsetof(struct RGF_ICR, IMV), ~0); in wil_reset()
833 wil_release_cpu(wil); in wil_reset()
837 wil->pending_connect_cid = -1; in wil_reset()
838 wil->ap_isolate = 0; in wil_reset()
839 reinit_completion(&wil->wmi_ready); in wil_reset()
840 reinit_completion(&wil->wmi_call); in wil_reset()
843 wil_configure_interrupt_moderation(wil); in wil_reset()
844 wil_unmask_irq(wil); in wil_reset()
847 rc = wil_wait_for_fw_ready(wil); in wil_reset()
849 rc = wmi_echo(wil); in wil_reset()
855 void wil_fw_error_recovery(struct wil6210_priv *wil) in wil_fw_error_recovery() argument
857 wil_dbg_misc(wil, "starting fw error recovery\n"); in wil_fw_error_recovery()
859 if (test_bit(wil_status_resetting, wil->status)) { in wil_fw_error_recovery()
860 wil_info(wil, "Reset already in progress\n"); in wil_fw_error_recovery()
864 wil->recovery_state = fw_recovery_pending; in wil_fw_error_recovery()
865 schedule_work(&wil->fw_error_worker); in wil_fw_error_recovery()
868 int __wil_up(struct wil6210_priv *wil) in __wil_up() argument
870 struct net_device *ndev = wil_to_ndev(wil); in __wil_up()
871 struct wireless_dev *wdev = wil->wdev; in __wil_up()
874 WARN_ON(!mutex_is_locked(&wil->mutex)); in __wil_up()
876 rc = wil_reset(wil, true); in __wil_up()
881 rc = wil_rx_init(wil, 1 << rx_ring_order); in __wil_up()
887 wil_dbg_misc(wil, "type: STATION\n"); in __wil_up()
891 wil_dbg_misc(wil, "type: AP\n"); in __wil_up()
895 wil_dbg_misc(wil, "type: P2P_CLIENT\n"); in __wil_up()
899 wil_dbg_misc(wil, "type: P2P_GO\n"); in __wil_up()
903 wil_dbg_misc(wil, "type: Monitor\n"); in __wil_up()
912 wmi_set_mac_address(wil, ndev->dev_addr); in __wil_up()
914 wil_dbg_misc(wil, "NAPI enable\n"); in __wil_up()
915 napi_enable(&wil->napi_rx); in __wil_up()
916 napi_enable(&wil->napi_tx); in __wil_up()
917 set_bit(wil_status_napi_en, wil->status); in __wil_up()
919 if (wil->platform_ops.bus_request) in __wil_up()
920 wil->platform_ops.bus_request(wil->platform_handle, in __wil_up()
926 int wil_up(struct wil6210_priv *wil) in wil_up() argument
930 wil_dbg_misc(wil, "%s()\n", __func__); in wil_up()
932 mutex_lock(&wil->mutex); in wil_up()
933 rc = __wil_up(wil); in wil_up()
934 mutex_unlock(&wil->mutex); in wil_up()
939 int __wil_down(struct wil6210_priv *wil) in __wil_down() argument
944 WARN_ON(!mutex_is_locked(&wil->mutex)); in __wil_down()
946 if (wil->platform_ops.bus_request) in __wil_down()
947 wil->platform_ops.bus_request(wil->platform_handle, 0); in __wil_down()
949 wil_disable_irq(wil); in __wil_down()
950 if (test_and_clear_bit(wil_status_napi_en, wil->status)) { in __wil_down()
951 napi_disable(&wil->napi_rx); in __wil_down()
952 napi_disable(&wil->napi_tx); in __wil_down()
953 wil_dbg_misc(wil, "NAPI disable\n"); in __wil_down()
955 wil_enable_irq(wil); in __wil_down()
957 if (wil->scan_request) { in __wil_down()
958 wil_dbg_misc(wil, "Abort scan_request 0x%p\n", in __wil_down()
959 wil->scan_request); in __wil_down()
960 del_timer_sync(&wil->scan_timer); in __wil_down()
961 cfg80211_scan_done(wil->scan_request, true); in __wil_down()
962 wil->scan_request = NULL; in __wil_down()
965 if (test_bit(wil_status_fwconnected, wil->status) || in __wil_down()
966 test_bit(wil_status_fwconnecting, wil->status)) in __wil_down()
967 wmi_send(wil, WMI_DISCONNECT_CMDID, NULL, 0); in __wil_down()
970 mutex_unlock(&wil->mutex); in __wil_down()
972 int idle = !test_bit(wil_status_fwconnected, wil->status) && in __wil_down()
973 !test_bit(wil_status_fwconnecting, wil->status); in __wil_down()
978 mutex_lock(&wil->mutex); in __wil_down()
981 wil_err(wil, "timeout waiting for idle FW/HW\n"); in __wil_down()
983 wil_reset(wil, false); in __wil_down()
988 int wil_down(struct wil6210_priv *wil) in wil_down() argument
992 wil_dbg_misc(wil, "%s()\n", __func__); in wil_down()
994 wil_set_recovery_state(wil, fw_recovery_idle); in wil_down()
995 mutex_lock(&wil->mutex); in wil_down()
996 rc = __wil_down(wil); in wil_down()
997 mutex_unlock(&wil->mutex); in wil_down()
1002 int wil_find_cid(struct wil6210_priv *wil, const u8 *mac) in wil_find_cid() argument
1007 for (i = 0; i < ARRAY_SIZE(wil->sta); i++) { in wil_find_cid()
1008 if ((wil->sta[i].status != wil_sta_unused) && in wil_find_cid()
1009 ether_addr_equal(wil->sta[i].addr, mac)) { in wil_find_cid()