Lines Matching refs:wil

39 int wil_set_capabilities(struct wil6210_priv *wil)  in wil_set_capabilities()  argument
42 u32 jtag_id = wil_r(wil, RGF_USER_JTAG_DEV_ID); in wil_set_capabilities()
43 u8 chip_revision = (wil_r(wil, RGF_USER_REVISION_ID) & in wil_set_capabilities()
48 bitmap_zero(wil->hw_capa, hw_capa_last); in wil_set_capabilities()
49 bitmap_zero(wil->fw_capabilities, WMI_FW_CAPABILITY_MAX); in wil_set_capabilities()
50 bitmap_zero(wil->platform_capa, WIL_PLATFORM_CAPA_MAX); in wil_set_capabilities()
51 wil->wil_fw_name = ftm_mode ? WIL_FW_NAME_FTM_DEFAULT : in wil_set_capabilities()
53 wil->chip_revision = chip_revision; in wil_set_capabilities()
61 wil->hw_name = "Sparrow D0"; in wil_set_capabilities()
62 wil->hw_version = HW_VER_SPARROW_D0; in wil_set_capabilities()
66 if (wil_fw_verify_file_exists(wil, wil_fw_name)) in wil_set_capabilities()
67 wil->wil_fw_name = wil_fw_name; in wil_set_capabilities()
70 wil_err(wil, "mac_rgf_ext section not found in fw_mapping\n"); in wil_set_capabilities()
76 wil->hw_name = "Sparrow B0"; in wil_set_capabilities()
77 wil->hw_version = HW_VER_SPARROW_B0; in wil_set_capabilities()
80 wil->hw_name = "Unknown"; in wil_set_capabilities()
81 wil->hw_version = HW_VER_UNKNOWN; in wil_set_capabilities()
84 wil->rgf_fw_assert_code_addr = SPARROW_RGF_FW_ASSERT_CODE; in wil_set_capabilities()
85 wil->rgf_ucode_assert_code_addr = SPARROW_RGF_UCODE_ASSERT_CODE; in wil_set_capabilities()
88 wil->hw_name = "Talyn-MA"; in wil_set_capabilities()
89 wil->hw_version = HW_VER_TALYN; in wil_set_capabilities()
91 wil->rgf_fw_assert_code_addr = TALYN_RGF_FW_ASSERT_CODE; in wil_set_capabilities()
92 wil->rgf_ucode_assert_code_addr = TALYN_RGF_UCODE_ASSERT_CODE; in wil_set_capabilities()
93 if (wil_r(wil, RGF_USER_OTP_HW_RD_MACHINE_1) & in wil_set_capabilities()
95 set_bit(hw_capa_no_flash, wil->hw_capa); in wil_set_capabilities()
98 if (wil_fw_verify_file_exists(wil, wil_fw_name)) in wil_set_capabilities()
99 wil->wil_fw_name = wil_fw_name; in wil_set_capabilities()
102 wil->hw_name = "Talyn-MB"; in wil_set_capabilities()
103 wil->hw_version = HW_VER_TALYN_MB; in wil_set_capabilities()
106 wil->rgf_fw_assert_code_addr = TALYN_RGF_FW_ASSERT_CODE; in wil_set_capabilities()
107 wil->rgf_ucode_assert_code_addr = TALYN_RGF_UCODE_ASSERT_CODE; in wil_set_capabilities()
108 set_bit(hw_capa_no_flash, wil->hw_capa); in wil_set_capabilities()
109 wil->use_enhanced_dma_hw = true; in wil_set_capabilities()
110 wil->use_rx_hw_reordering = true; in wil_set_capabilities()
113 if (wil_fw_verify_file_exists(wil, wil_fw_name)) in wil_set_capabilities()
114 wil->wil_fw_name = wil_fw_name; in wil_set_capabilities()
117 wil_err(wil, "Unknown board hardware, chip_id 0x%08x, chip_revision 0x%08x\n", in wil_set_capabilities()
119 wil->hw_name = "Unknown"; in wil_set_capabilities()
120 wil->hw_version = HW_VER_UNKNOWN; in wil_set_capabilities()
124 wil_init_txrx_ops(wil); in wil_set_capabilities()
128 wil_err(wil, "fw_code section not found in fw_mapping\n"); in wil_set_capabilities()
131 wil->iccm_base = iccm_section->host; in wil_set_capabilities()
133 wil_info(wil, "Board hardware is %s, flash %sexist\n", wil->hw_name, in wil_set_capabilities()
134 test_bit(hw_capa_no_flash, wil->hw_capa) ? "doesn't " : ""); in wil_set_capabilities()
137 if (wil->platform_ops.get_capa) { in wil_set_capabilities()
139 wil->platform_ops.get_capa(wil->platform_handle); in wil_set_capabilities()
140 memcpy(wil->platform_capa, &platform_capa, in wil_set_capabilities()
141 min(sizeof(wil->platform_capa), sizeof(platform_capa))); in wil_set_capabilities()
145 wil_request_firmware(wil, wil->wil_fw_name, false); in wil_set_capabilities()
146 wil_refresh_fw_capabilities(wil); in wil_set_capabilities()
151 void wil_disable_irq(struct wil6210_priv *wil) in wil_disable_irq() argument
153 int irq = wil->pdev->irq; in wil_disable_irq()
156 if (wil->n_msi == 3) { in wil_disable_irq()
162 void wil_enable_irq(struct wil6210_priv *wil) in wil_enable_irq() argument
164 int irq = wil->pdev->irq; in wil_enable_irq()
167 if (wil->n_msi == 3) { in wil_enable_irq()
173 static void wil_remove_all_additional_vifs(struct wil6210_priv *wil) in wil_remove_all_additional_vifs() argument
178 for (i = 1; i < wil->max_vifs; i++) { in wil_remove_all_additional_vifs()
179 vif = wil->vifs[i]; in wil_remove_all_additional_vifs()
182 wil_vif_remove(wil, vif->mid); in wil_remove_all_additional_vifs()
188 static int wil_if_pcie_enable(struct wil6210_priv *wil) in wil_if_pcie_enable() argument
190 struct pci_dev *pdev = wil->pdev; in wil_if_pcie_enable()
198 wil_dbg_misc(wil, "if_pcie_enable\n"); in wil_if_pcie_enable()
206 wil_dbg_misc(wil, "Setup %d MSI interrupts\n", n_msi); in wil_if_pcie_enable()
209 wil_dbg_misc(wil, "MSI interrupts disabled, use INTx\n"); in wil_if_pcie_enable()
212 wil_err(wil, "Invalid n_msi=%d, default to 1\n", n_msi); in wil_if_pcie_enable()
218 wil_err(wil, "3 MSI mode failed, try 1 MSI\n"); in wil_if_pcie_enable()
223 wil_err(wil, "pci_enable_msi failed, use INTx\n"); in wil_if_pcie_enable()
227 wil->n_msi = n_msi; in wil_if_pcie_enable()
229 if (wil->n_msi == 0 && msi_only) { in wil_if_pcie_enable()
230 wil_err(wil, "Interrupt pin not routed, unable to use INTx\n"); in wil_if_pcie_enable()
235 rc = wil6210_init_irq(wil, pdev->irq); in wil_if_pcie_enable()
240 mutex_lock(&wil->mutex); in wil_if_pcie_enable()
241 rc = wil_reset(wil, false); in wil_if_pcie_enable()
242 mutex_unlock(&wil->mutex); in wil_if_pcie_enable()
249 wil6210_fini_irq(wil, pdev->irq); in wil_if_pcie_enable()
258 static int wil_if_pcie_disable(struct wil6210_priv *wil) in wil_if_pcie_disable() argument
260 struct pci_dev *pdev = wil->pdev; in wil_if_pcie_disable()
262 wil_dbg_misc(wil, "if_pcie_disable\n"); in wil_if_pcie_disable()
266 wil6210_fini_irq(wil, pdev->irq); in wil_if_pcie_disable()
276 struct wil6210_priv *wil = wil_handle; in wil_platform_rop_ramdump() local
278 if (!wil) in wil_platform_rop_ramdump()
281 return wil_fw_copy_crash_dump(wil, buf, size); in wil_platform_rop_ramdump()
286 struct wil6210_priv *wil = wil_handle; in wil_platform_rop_fw_recovery() local
288 if (!wil) in wil_platform_rop_fw_recovery()
291 wil_fw_error_recovery(wil); in wil_platform_rop_fw_recovery()
296 static void wil_platform_ops_uninit(struct wil6210_priv *wil) in wil_platform_ops_uninit() argument
298 if (wil->platform_ops.uninit) in wil_platform_ops_uninit()
299 wil->platform_ops.uninit(wil->platform_handle); in wil_platform_ops_uninit()
300 memset(&wil->platform_ops, 0, sizeof(wil->platform_ops)); in wil_platform_ops_uninit()
305 struct wil6210_priv *wil; in wil_pcie_probe() local
329 wil = wil_if_alloc(dev); in wil_pcie_probe()
330 if (IS_ERR(wil)) { in wil_pcie_probe()
331 rc = (int)PTR_ERR(wil); in wil_pcie_probe()
336 wil->pdev = pdev; in wil_pcie_probe()
337 pci_set_drvdata(pdev, wil); in wil_pcie_probe()
338 wil->bar_size = bar_size; in wil_pcie_probe()
341 wil->platform_handle = in wil_pcie_probe()
342 wil_platform_init(&pdev->dev, &wil->platform_ops, &rops, wil); in wil_pcie_probe()
343 if (!wil->platform_handle) { in wil_pcie_probe()
345 wil_err(wil, "wil_platform_init failed\n"); in wil_pcie_probe()
351 wil_err(wil, in wil_pcie_probe()
360 wil_err(wil, in wil_pcie_probe()
369 wil_err(wil, "pci_request_region failed\n"); in wil_pcie_probe()
374 wil->csr = pci_ioremap_bar(pdev, 0); in wil_pcie_probe()
375 if (!wil->csr) { in wil_pcie_probe()
376 wil_err(wil, "pci_ioremap_bar failed\n"); in wil_pcie_probe()
381 wil_info(wil, "CSR at %pR -> 0x%p\n", &pdev->resource[0], wil->csr); in wil_pcie_probe()
383 rc = wil_set_capabilities(wil); in wil_pcie_probe()
385 wil_err(wil, "wil_set_capabilities failed, rc %d\n", rc); in wil_pcie_probe()
392 start_idx = wil->use_enhanced_dma_hw ? 0 : 1; in wil_pcie_probe()
403 wil->dma_addr_size = dma_addr_size[i]; in wil_pcie_probe()
407 if (wil->dma_addr_size == 0) in wil_pcie_probe()
410 wil6210_clear_irq(wil); in wil_pcie_probe()
413 rc = wil_if_pcie_enable(wil); in wil_pcie_probe()
415 wil_err(wil, "Enable device failed\n"); in wil_pcie_probe()
420 rc = wil_if_add(wil); in wil_pcie_probe()
422 wil_err(wil, "wil_if_add failed: %d\n", rc); in wil_pcie_probe()
427 if (test_bit(WMI_FW_CAPABILITY_WMI_ONLY, wil->fw_capabilities)) { in wil_pcie_probe()
428 wil_dbg_misc(wil, "Loading WMI only FW\n"); in wil_pcie_probe()
429 mutex_lock(&wil->mutex); in wil_pcie_probe()
430 rc = wil_reset(wil, true); in wil_pcie_probe()
431 mutex_unlock(&wil->mutex); in wil_pcie_probe()
433 wil_err(wil, "failed to load WMI only FW\n"); in wil_pcie_probe()
439 wil->pm_notify.notifier_call = wil6210_pm_notify; in wil_pcie_probe()
441 rc = register_pm_notifier(&wil->pm_notify); in wil_pcie_probe()
446 wil_err(wil, "register_pm_notifier failed: %d\n", rc); in wil_pcie_probe()
448 wil6210_debugfs_init(wil); in wil_pcie_probe()
450 wil_pm_runtime_allow(wil); in wil_pcie_probe()
455 wil_if_remove(wil); in wil_pcie_probe()
457 wil_if_pcie_disable(wil); in wil_pcie_probe()
459 pci_iounmap(pdev, wil->csr); in wil_pcie_probe()
465 wil_platform_ops_uninit(wil); in wil_pcie_probe()
467 wil_if_free(wil); in wil_pcie_probe()
474 struct wil6210_priv *wil = pci_get_drvdata(pdev); in wil_pcie_remove() local
475 void __iomem *csr = wil->csr; in wil_pcie_remove()
477 wil_dbg_misc(wil, "pcie_remove\n"); in wil_pcie_remove()
479 unregister_pm_notifier(&wil->pm_notify); in wil_pcie_remove()
481 wil_pm_runtime_forbid(wil); in wil_pcie_remove()
483 wil6210_debugfs_remove(wil); in wil_pcie_remove()
485 wil_p2p_wdev_free(wil); in wil_pcie_remove()
486 wil_remove_all_additional_vifs(wil); in wil_pcie_remove()
488 wil_if_remove(wil); in wil_pcie_remove()
489 wil_if_pcie_disable(wil); in wil_pcie_remove()
493 wil_platform_ops_uninit(wil); in wil_pcie_remove()
494 wil_if_free(wil); in wil_pcie_remove()
509 struct wil6210_priv *wil = pci_get_drvdata(pdev); in wil6210_suspend() local
512 wil_dbg_pm(wil, "suspend: %s\n", is_runtime ? "runtime" : "system"); in wil6210_suspend()
514 mutex_lock(&wil->vif_mutex); in wil6210_suspend()
515 active_ifaces = wil_has_active_ifaces(wil, true, false); in wil6210_suspend()
516 mutex_unlock(&wil->vif_mutex); in wil6210_suspend()
517 keep_radio_on = active_ifaces && wil->keep_radio_on_during_sleep; in wil6210_suspend()
519 rc = wil_can_suspend(wil, is_runtime); in wil6210_suspend()
523 rc = wil_suspend(wil, is_runtime, keep_radio_on); in wil6210_suspend()
531 wil->suspend_stats.r_off.successful_suspends++; in wil6210_suspend()
533 wil->suspend_stats.r_on.successful_suspends++; in wil6210_suspend()
544 struct wil6210_priv *wil = pci_get_drvdata(pdev); in wil6210_resume() local
547 wil_dbg_pm(wil, "resume: %s\n", is_runtime ? "runtime" : "system"); in wil6210_resume()
549 mutex_lock(&wil->vif_mutex); in wil6210_resume()
550 active_ifaces = wil_has_active_ifaces(wil, true, false); in wil6210_resume()
551 mutex_unlock(&wil->vif_mutex); in wil6210_resume()
552 keep_radio_on = active_ifaces && wil->keep_radio_on_during_sleep; in wil6210_resume()
560 rc = wil_resume(wil, is_runtime, keep_radio_on); in wil6210_resume()
562 wil_err(wil, "device failed to resume (%d)\n", rc); in wil6210_resume()
565 wil->suspend_stats.r_off.failed_resumes++; in wil6210_resume()
567 wil->suspend_stats.r_on.failed_resumes++; in wil6210_resume()
571 wil->suspend_stats.r_on.successful_resumes++; in wil6210_resume()
573 wil->suspend_stats.r_off.successful_resumes++; in wil6210_resume()
582 struct wil6210_priv *wil = container_of( in wil6210_pm_notify() local
587 wil_dbg_pm(wil, "pm_notify: mode (%ld)\n", mode); in wil6210_pm_notify()
593 rc = wil_can_suspend(wil, false); in wil6210_pm_notify()
597 if (wil->platform_ops.notify) in wil6210_pm_notify()
598 rc = wil->platform_ops.notify(wil->platform_handle, in wil6210_pm_notify()
605 if (wil->platform_ops.notify) in wil6210_pm_notify()
606 rc = wil->platform_ops.notify(wil->platform_handle, in wil6210_pm_notify()
610 wil_dbg_pm(wil, "unhandled notify mode %ld\n", mode); in wil6210_pm_notify()
614 wil_dbg_pm(wil, "notification mode %ld: rc (%d)\n", mode, rc); in wil6210_pm_notify()
631 struct wil6210_priv *wil = pci_get_drvdata(pdev); in wil6210_pm_runtime_idle() local
633 wil_dbg_pm(wil, "Runtime idle\n"); in wil6210_pm_runtime_idle()
635 return wil_can_suspend(wil, true); in wil6210_pm_runtime_idle()
646 struct wil6210_priv *wil = pci_get_drvdata(pdev); in wil6210_pm_runtime_suspend() local
648 if (test_bit(wil_status_suspended, wil->status)) { in wil6210_pm_runtime_suspend()
649 wil_dbg_pm(wil, "trying to suspend while suspended\n"); in wil6210_pm_runtime_suspend()