Lines Matching +full:reo2host +full:- +full:destination +full:- +full:ring1
1 // SPDX-License-Identifier: BSD-3-Clause-Clear
3 * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
4 * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
12 #include <linux/dma-mapping.h>
28 { .compatible = "qcom,ipq8074-wifi",
31 { .compatible = "qcom,ipq6018-wifi",
34 { .compatible = "qcom,wcn6750-wifi",
37 { .compatible = "qcom,ipq5018-wifi",
48 "misc-pulse1",
49 "misc-latch",
50 "sw-exception",
64 "host2wbm-desc-feed",
65 "host2reo-re-injection",
66 "host2reo-command",
67 "host2rxdma-monitor-ring3",
68 "host2rxdma-monitor-ring2",
69 "host2rxdma-monitor-ring1",
70 "reo2ost-exception",
71 "wbm2host-rx-release",
72 "reo2host-status",
73 "reo2host-destination-ring4",
74 "reo2host-destination-ring3",
75 "reo2host-destination-ring2",
76 "reo2host-destination-ring1",
77 "rxdma2host-monitor-destination-mac3",
78 "rxdma2host-monitor-destination-mac2",
79 "rxdma2host-monitor-destination-mac1",
80 "ppdu-end-interrupts-mac3",
81 "ppdu-end-interrupts-mac2",
82 "ppdu-end-interrupts-mac1",
83 "rxdma2host-monitor-status-ring-mac3",
84 "rxdma2host-monitor-status-ring-mac2",
85 "rxdma2host-monitor-status-ring-mac1",
86 "host2rxdma-host-buf-ring-mac3",
87 "host2rxdma-host-buf-ring-mac2",
88 "host2rxdma-host-buf-ring-mac1",
89 "rxdma2host-destination-ring-mac3",
90 "rxdma2host-destination-ring-mac2",
91 "rxdma2host-destination-ring-mac1",
92 "host2tcl-input-ring4",
93 "host2tcl-input-ring3",
94 "host2tcl-input-ring2",
95 "host2tcl-input-ring1",
96 "wbm2host-tx-completions-ring3",
97 "wbm2host-tx-completions-ring2",
98 "wbm2host-tx-completions-ring1",
99 "tcl2host-status-ring",
102 /* enum ext_irq_num - irq numbers that can be used by external modules
147 return ab->pci.msi.irqs[vector]; in ath11k_ahb_get_msi_irq_wcn6750()
174 iowrite32(value, ab->mem + window_start + in ath11k_ahb_window_write32_wcn6750()
186 val = ioread32(ab->mem + window_start + in ath11k_ahb_window_read32_wcn6750()
201 return ioread32(ab->mem + offset); in ath11k_ahb_read32()
206 iowrite32(value, ab->mem + offset); in ath11k_ahb_write32()
213 for (i = 0; i < ab->hw_params.ce_count; i++) { in ath11k_ahb_kill_tasklets()
214 struct ath11k_ce_pipe *ce_pipe = &ab->ce.ce_pipe[i]; in ath11k_ahb_kill_tasklets()
219 tasklet_kill(&ce_pipe->intr_tq); in ath11k_ahb_kill_tasklets()
227 for (i = 0; i < irq_grp->num_irq; i++) in ath11k_ahb_ext_grp_disable()
228 disable_irq_nosync(irq_grp->ab->irq_num[irq_grp->irqs[i]]); in ath11k_ahb_ext_grp_disable()
236 struct ath11k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i]; in __ath11k_ahb_ext_irq_disable()
240 if (irq_grp->napi_enabled) { in __ath11k_ahb_ext_irq_disable()
241 napi_synchronize(&irq_grp->napi); in __ath11k_ahb_ext_irq_disable()
242 napi_disable(&irq_grp->napi); in __ath11k_ahb_ext_irq_disable()
243 irq_grp->napi_enabled = false; in __ath11k_ahb_ext_irq_disable()
252 for (i = 0; i < irq_grp->num_irq; i++) in ath11k_ahb_ext_grp_enable()
253 enable_irq(irq_grp->ab->irq_num[irq_grp->irqs[i]]); in ath11k_ahb_ext_grp_enable()
275 const struct ce_ie_addr *ce_ie_addr = ab->hw_params.ce_ie_addr; in ath11k_ahb_ce_irq_enable()
278 ie1_reg_addr = ce_ie_addr->ie1_reg_addr + ATH11K_CE_OFFSET(ab); in ath11k_ahb_ce_irq_enable()
279 ie2_reg_addr = ce_ie_addr->ie2_reg_addr + ATH11K_CE_OFFSET(ab); in ath11k_ahb_ce_irq_enable()
280 ie3_reg_addr = ce_ie_addr->ie3_reg_addr + ATH11K_CE_OFFSET(ab); in ath11k_ahb_ce_irq_enable()
282 ce_attr = &ab->hw_params.host_ce_config[ce_id]; in ath11k_ahb_ce_irq_enable()
283 if (ce_attr->src_nentries) in ath11k_ahb_ce_irq_enable()
286 if (ce_attr->dest_nentries) { in ath11k_ahb_ce_irq_enable()
296 const struct ce_ie_addr *ce_ie_addr = ab->hw_params.ce_ie_addr; in ath11k_ahb_ce_irq_disable()
299 ie1_reg_addr = ce_ie_addr->ie1_reg_addr + ATH11K_CE_OFFSET(ab); in ath11k_ahb_ce_irq_disable()
300 ie2_reg_addr = ce_ie_addr->ie2_reg_addr + ATH11K_CE_OFFSET(ab); in ath11k_ahb_ce_irq_disable()
301 ie3_reg_addr = ce_ie_addr->ie3_reg_addr + ATH11K_CE_OFFSET(ab); in ath11k_ahb_ce_irq_disable()
303 ce_attr = &ab->hw_params.host_ce_config[ce_id]; in ath11k_ahb_ce_irq_disable()
304 if (ce_attr->src_nentries) in ath11k_ahb_ce_irq_disable()
307 if (ce_attr->dest_nentries) { in ath11k_ahb_ce_irq_disable()
319 for (i = 0; i < ab->hw_params.ce_count; i++) { in ath11k_ahb_sync_ce_irqs()
324 synchronize_irq(ab->irq_num[irq_idx]); in ath11k_ahb_sync_ce_irqs()
334 struct ath11k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i]; in ath11k_ahb_sync_ext_irqs()
336 for (j = 0; j < irq_grp->num_irq; j++) { in ath11k_ahb_sync_ext_irqs()
337 irq_idx = irq_grp->irqs[j]; in ath11k_ahb_sync_ext_irqs()
338 synchronize_irq(ab->irq_num[irq_idx]); in ath11k_ahb_sync_ext_irqs()
347 for (i = 0; i < ab->hw_params.ce_count; i++) { in ath11k_ahb_ce_irqs_enable()
358 for (i = 0; i < ab->hw_params.ce_count; i++) { in ath11k_ahb_ce_irqs_disable()
378 struct ath11k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i]; in ath11k_ahb_ext_irq_enable()
380 if (!irq_grp->napi_enabled) { in ath11k_ahb_ext_irq_enable()
381 napi_enable(&irq_grp->napi); in ath11k_ahb_ext_irq_enable()
382 irq_grp->napi_enabled = true; in ath11k_ahb_ext_irq_enable()
396 if (!test_bit(ATH11K_FLAG_CRASH_FLUSH, &ab->dev_flags)) in ath11k_ahb_stop()
400 del_timer_sync(&ab->rx_replenish_retry); in ath11k_ahb_stop()
409 ret = rproc_boot(ab_ahb->tgt_rproc); in ath11k_ahb_power_up()
420 rproc_shutdown(ab_ahb->tgt_rproc); in ath11k_ahb_power_down()
425 struct ath11k_qmi_ce_cfg *cfg = &ab->qmi.ce_cfg; in ath11k_ahb_init_qmi_ce_config()
427 cfg->tgt_ce_len = ab->hw_params.target_ce_count; in ath11k_ahb_init_qmi_ce_config()
428 cfg->tgt_ce = ab->hw_params.target_ce_config; in ath11k_ahb_init_qmi_ce_config()
429 cfg->svc_to_ce_map_len = ab->hw_params.svc_to_ce_map_len; in ath11k_ahb_init_qmi_ce_config()
430 cfg->svc_to_ce_map = ab->hw_params.svc_to_ce_map; in ath11k_ahb_init_qmi_ce_config()
431 ab->qmi.service_ins_id = ab->hw_params.qmi_service_ins_id; in ath11k_ahb_init_qmi_ce_config()
439 struct ath11k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i]; in ath11k_ahb_free_ext_irq()
441 for (j = 0; j < irq_grp->num_irq; j++) in ath11k_ahb_free_ext_irq()
442 free_irq(ab->irq_num[irq_grp->irqs[j]], irq_grp); in ath11k_ahb_free_ext_irq()
444 netif_napi_del(&irq_grp->napi); in ath11k_ahb_free_ext_irq()
453 if (ab->hw_params.hybrid_bus_type) in ath11k_ahb_free_irq()
456 for (i = 0; i < ab->hw_params.ce_count; i++) { in ath11k_ahb_free_irq()
460 free_irq(ab->irq_num[irq_idx], &ab->ce.ce_pipe[i]); in ath11k_ahb_free_irq()
470 ath11k_ce_per_engine_service(ce_pipe->ab, ce_pipe->pipe_num); in ath11k_ahb_ce_tasklet()
472 ath11k_ahb_ce_irq_enable(ce_pipe->ab, ce_pipe->pipe_num); in ath11k_ahb_ce_tasklet()
480 ce_pipe->timestamp = jiffies; in ath11k_ahb_ce_interrupt_handler()
482 ath11k_ahb_ce_irq_disable(ce_pipe->ab, ce_pipe->pipe_num); in ath11k_ahb_ce_interrupt_handler()
484 tasklet_schedule(&ce_pipe->intr_tq); in ath11k_ahb_ce_interrupt_handler()
494 struct ath11k_base *ab = irq_grp->ab; in ath11k_ahb_ext_grp_napi_poll()
514 irq_grp->timestamp = jiffies; in ath11k_ahb_ext_interrupt_handler()
518 napi_schedule(&irq_grp->napi); in ath11k_ahb_ext_interrupt_handler()
525 struct ath11k_hw_params *hw = &ab->hw_params; in ath11k_ahb_config_ext_irq()
531 struct ath11k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i]; in ath11k_ahb_config_ext_irq()
534 irq_grp->ab = ab; in ath11k_ahb_config_ext_irq()
535 irq_grp->grp_id = i; in ath11k_ahb_config_ext_irq()
536 init_dummy_netdev(&irq_grp->napi_ndev); in ath11k_ahb_config_ext_irq()
537 netif_napi_add(&irq_grp->napi_ndev, &irq_grp->napi, in ath11k_ahb_config_ext_irq()
541 if (ab->hw_params.ring_mask->tx[i] & BIT(j)) { in ath11k_ahb_config_ext_irq()
542 irq_grp->irqs[num_irq++] = in ath11k_ahb_config_ext_irq()
543 wbm2host_tx_completions_ring1 - j; in ath11k_ahb_config_ext_irq()
546 if (ab->hw_params.ring_mask->rx[i] & BIT(j)) { in ath11k_ahb_config_ext_irq()
547 irq_grp->irqs[num_irq++] = in ath11k_ahb_config_ext_irq()
548 reo2host_destination_ring1 - j; in ath11k_ahb_config_ext_irq()
551 if (ab->hw_params.ring_mask->rx_err[i] & BIT(j)) in ath11k_ahb_config_ext_irq()
552 irq_grp->irqs[num_irq++] = reo2host_exception; in ath11k_ahb_config_ext_irq()
554 if (ab->hw_params.ring_mask->rx_wbm_rel[i] & BIT(j)) in ath11k_ahb_config_ext_irq()
555 irq_grp->irqs[num_irq++] = wbm2host_rx_release; in ath11k_ahb_config_ext_irq()
557 if (ab->hw_params.ring_mask->reo_status[i] & BIT(j)) in ath11k_ahb_config_ext_irq()
558 irq_grp->irqs[num_irq++] = reo2host_status; in ath11k_ahb_config_ext_irq()
560 if (j < ab->hw_params.max_radios) { in ath11k_ahb_config_ext_irq()
561 if (ab->hw_params.ring_mask->rxdma2host[i] & BIT(j)) { in ath11k_ahb_config_ext_irq()
562 irq_grp->irqs[num_irq++] = in ath11k_ahb_config_ext_irq()
563 rxdma2host_destination_ring_mac1 - in ath11k_ahb_config_ext_irq()
567 if (ab->hw_params.ring_mask->host2rxdma[i] & BIT(j)) { in ath11k_ahb_config_ext_irq()
568 irq_grp->irqs[num_irq++] = in ath11k_ahb_config_ext_irq()
569 host2rxdma_host_buf_ring_mac1 - in ath11k_ahb_config_ext_irq()
573 if (ab->hw_params.ring_mask->rx_mon_status[i] & BIT(j)) { in ath11k_ahb_config_ext_irq()
574 irq_grp->irqs[num_irq++] = in ath11k_ahb_config_ext_irq()
575 ppdu_end_interrupts_mac1 - in ath11k_ahb_config_ext_irq()
577 irq_grp->irqs[num_irq++] = in ath11k_ahb_config_ext_irq()
578 rxdma2host_monitor_status_ring_mac1 - in ath11k_ahb_config_ext_irq()
583 irq_grp->num_irq = num_irq; in ath11k_ahb_config_ext_irq()
585 for (j = 0; j < irq_grp->num_irq; j++) { in ath11k_ahb_config_ext_irq()
586 int irq_idx = irq_grp->irqs[j]; in ath11k_ahb_config_ext_irq()
588 irq = platform_get_irq_byname(ab->pdev, in ath11k_ahb_config_ext_irq()
590 ab->irq_num[irq_idx] = irq; in ath11k_ahb_config_ext_irq()
610 if (ab->hw_params.hybrid_bus_type) in ath11k_ahb_config_irq()
614 for (i = 0; i < ab->hw_params.ce_count; i++) { in ath11k_ahb_config_irq()
615 struct ath11k_ce_pipe *ce_pipe = &ab->ce.ce_pipe[i]; in ath11k_ahb_config_irq()
622 tasklet_setup(&ce_pipe->intr_tq, ath11k_ahb_ce_tasklet); in ath11k_ahb_config_irq()
623 irq = platform_get_irq_byname(ab->pdev, irq_name[irq_idx]); in ath11k_ahb_config_irq()
630 ab->irq_num[irq_idx] = irq; in ath11k_ahb_config_irq()
646 for (i = 0; i < ab->hw_params.svc_to_ce_map_len; i++) { in ath11k_ahb_map_service_to_pipe()
647 entry = &ab->hw_params.svc_to_ce_map[i]; in ath11k_ahb_map_service_to_pipe()
649 if (__le32_to_cpu(entry->service_id) != service_id) in ath11k_ahb_map_service_to_pipe()
652 switch (__le32_to_cpu(entry->pipedir)) { in ath11k_ahb_map_service_to_pipe()
657 *dl_pipe = __le32_to_cpu(entry->pipenum); in ath11k_ahb_map_service_to_pipe()
662 *ul_pipe = __le32_to_cpu(entry->pipenum); in ath11k_ahb_map_service_to_pipe()
668 *dl_pipe = __le32_to_cpu(entry->pipenum); in ath11k_ahb_map_service_to_pipe()
669 *ul_pipe = __le32_to_cpu(entry->pipenum); in ath11k_ahb_map_service_to_pipe()
677 return -ENOENT; in ath11k_ahb_map_service_to_pipe()
689 if (!device_may_wakeup(ab->dev)) in ath11k_ahb_hif_suspend()
690 return -EPERM; in ath11k_ahb_hif_suspend()
692 wake_irq = ab->irq_num[ATH11K_PCI_IRQ_CE0_OFFSET + ATH11K_PCI_CE_WAKE_IRQ]; in ath11k_ahb_hif_suspend()
700 value = u32_encode_bits(ab_ahb->smp2p_info.seq_no++, in ath11k_ahb_hif_suspend()
705 ret = qcom_smem_state_update_bits(ab_ahb->smp2p_info.smem_state, in ath11k_ahb_hif_suspend()
724 if (!device_may_wakeup(ab->dev)) in ath11k_ahb_hif_resume()
725 return -EPERM; in ath11k_ahb_hif_resume()
727 wake_irq = ab->irq_num[ATH11K_PCI_IRQ_CE0_OFFSET + ATH11K_PCI_CE_WAKE_IRQ]; in ath11k_ahb_hif_resume()
735 reinit_completion(&ab->wow.wakeup_completed); in ath11k_ahb_hif_resume()
737 value = u32_encode_bits(ab_ahb->smp2p_info.seq_no++, in ath11k_ahb_hif_resume()
742 ret = qcom_smem_state_update_bits(ab_ahb->smp2p_info.smem_state, in ath11k_ahb_hif_resume()
749 ret = wait_for_completion_timeout(&ab->wow.wakeup_completed, 3 * HZ); in ath11k_ahb_hif_resume()
752 return -ETIMEDOUT; in ath11k_ahb_hif_resume()
795 struct device *dev = ab->dev; in ath11k_core_get_rproc()
799 if (of_property_read_u32(dev->of_node, "qcom,rproc", &rproc_phandle)) { in ath11k_core_get_rproc()
801 return -ENOENT; in ath11k_core_get_rproc()
807 return -EPROBE_DEFER; in ath11k_core_get_rproc()
809 ab_ahb->tgt_rproc = prproc; in ath11k_core_get_rproc()
816 struct platform_device *pdev = ab->pdev; in ath11k_ahb_setup_msi_resources()
833 return -ENOENT; in ath11k_ahb_setup_msi_resources()
836 msi_addr_pa = res->start; in ath11k_ahb_setup_msi_resources()
837 msi_addr_iova = dma_map_resource(ab->dev, msi_addr_pa, PAGE_SIZE, in ath11k_ahb_setup_msi_resources()
839 if (dma_mapping_error(ab->dev, msi_addr_iova)) in ath11k_ahb_setup_msi_resources()
840 return -ENOMEM; in ath11k_ahb_setup_msi_resources()
842 ab->pci.msi.addr_lo = lower_32_bits(msi_addr_iova); in ath11k_ahb_setup_msi_resources()
843 ab->pci.msi.addr_hi = upper_32_bits(msi_addr_iova); in ath11k_ahb_setup_msi_resources()
845 ret = of_property_read_u32_index(ab->dev->of_node, "interrupts", 1, &int_prop); in ath11k_ahb_setup_msi_resources()
849 ab->pci.msi.ep_base_data = int_prop + 32; in ath11k_ahb_setup_msi_resources()
851 for (i = 0; i < ab->pci.msi.config->total_vectors; i++) { in ath11k_ahb_setup_msi_resources()
856 ab->pci.msi.irqs[i] = ret; in ath11k_ahb_setup_msi_resources()
859 set_bit(ATH11K_FLAG_MULTI_MSI_VECTORS, &ab->dev_flags); in ath11k_ahb_setup_msi_resources()
868 if (!ab->hw_params.smp2p_wow_exit) in ath11k_ahb_setup_smp2p_handle()
871 ab_ahb->smp2p_info.smem_state = qcom_smem_state_get(ab->dev, "wlan-smp2p-out", in ath11k_ahb_setup_smp2p_handle()
872 &ab_ahb->smp2p_info.smem_bit); in ath11k_ahb_setup_smp2p_handle()
873 if (IS_ERR(ab_ahb->smp2p_info.smem_state)) { in ath11k_ahb_setup_smp2p_handle()
875 PTR_ERR(ab_ahb->smp2p_info.smem_state)); in ath11k_ahb_setup_smp2p_handle()
876 return PTR_ERR(ab_ahb->smp2p_info.smem_state); in ath11k_ahb_setup_smp2p_handle()
886 if (!ab->hw_params.smp2p_wow_exit) in ath11k_ahb_release_smp2p_handle()
889 qcom_smem_state_put(ab_ahb->smp2p_info.smem_state); in ath11k_ahb_release_smp2p_handle()
894 struct platform_device *pdev = ab->pdev; in ath11k_ahb_setup_resources()
898 if (ab->hw_params.hybrid_bus_type) in ath11k_ahb_setup_resources()
903 dev_err(&pdev->dev, "ioremap error\n"); in ath11k_ahb_setup_resources()
907 ab->mem = mem; in ath11k_ahb_setup_resources()
908 ab->mem_len = resource_size(mem_res); in ath11k_ahb_setup_resources()
916 struct device *dev = ab->dev; in ath11k_ahb_setup_msa_resources()
921 node = of_parse_phandle(dev->of_node, "memory-region", 0); in ath11k_ahb_setup_msa_resources()
923 return -ENOENT; in ath11k_ahb_setup_msa_resources()
932 ab_ahb->fw.msa_paddr = r.start; in ath11k_ahb_setup_msa_resources()
933 ab_ahb->fw.msa_size = resource_size(&r); in ath11k_ahb_setup_msa_resources()
935 node = of_parse_phandle(dev->of_node, "memory-region", 1); in ath11k_ahb_setup_msa_resources()
937 return -ENOENT; in ath11k_ahb_setup_msa_resources()
946 ab_ahb->fw.ce_paddr = r.start; in ath11k_ahb_setup_msa_resources()
947 ab_ahb->fw.ce_size = resource_size(&r); in ath11k_ahb_setup_msa_resources()
955 struct device *host_dev = ab->dev; in ath11k_ahb_fw_resources_init()
965 if (!ab->hw_params.fixed_fw_mem) in ath11k_ahb_fw_resources_init()
974 node = of_get_child_by_name(host_dev->of_node, "wifi-firmware"); in ath11k_ahb_fw_resources_init()
976 ab_ahb->fw.use_tz = true; in ath11k_ahb_fw_resources_init()
980 info.fwnode = &node->fwnode; in ath11k_ahb_fw_resources_init()
982 info.name = node->name; in ath11k_ahb_fw_resources_init()
991 ret = of_dma_configure(&pdev->dev, node, true); in ath11k_ahb_fw_resources_init()
997 ab_ahb->fw.dev = &pdev->dev; in ath11k_ahb_fw_resources_init()
1002 ret = -ENOMEM; in ath11k_ahb_fw_resources_init()
1006 ret = iommu_attach_device(iommu_dom, ab_ahb->fw.dev); in ath11k_ahb_fw_resources_init()
1012 ret = iommu_map(iommu_dom, ab_ahb->fw.msa_paddr, in ath11k_ahb_fw_resources_init()
1013 ab_ahb->fw.msa_paddr, ab_ahb->fw.msa_size, in ath11k_ahb_fw_resources_init()
1020 ret = iommu_map(iommu_dom, ab_ahb->fw.ce_paddr, in ath11k_ahb_fw_resources_init()
1021 ab_ahb->fw.ce_paddr, ab_ahb->fw.ce_size, in ath11k_ahb_fw_resources_init()
1028 ab_ahb->fw.use_tz = false; in ath11k_ahb_fw_resources_init()
1029 ab_ahb->fw.iommu_domain = iommu_dom; in ath11k_ahb_fw_resources_init()
1035 iommu_unmap(iommu_dom, ab_ahb->fw.msa_paddr, ab_ahb->fw.msa_size); in ath11k_ahb_fw_resources_init()
1038 iommu_detach_device(iommu_dom, ab_ahb->fw.dev); in ath11k_ahb_fw_resources_init()
1059 if (!ab->hw_params.fixed_fw_mem) in ath11k_ahb_fw_resource_deinit()
1062 if (ab_ahb->fw.use_tz) in ath11k_ahb_fw_resource_deinit()
1065 iommu = ab_ahb->fw.iommu_domain; in ath11k_ahb_fw_resource_deinit()
1067 unmapped_size = iommu_unmap(iommu, ab_ahb->fw.msa_paddr, ab_ahb->fw.msa_size); in ath11k_ahb_fw_resource_deinit()
1068 if (unmapped_size != ab_ahb->fw.msa_size) in ath11k_ahb_fw_resource_deinit()
1072 unmapped_size = iommu_unmap(iommu, ab_ahb->fw.ce_paddr, ab_ahb->fw.ce_size); in ath11k_ahb_fw_resource_deinit()
1073 if (unmapped_size != ab_ahb->fw.ce_size) in ath11k_ahb_fw_resource_deinit()
1077 iommu_detach_device(iommu, ab_ahb->fw.dev); in ath11k_ahb_fw_resource_deinit()
1080 platform_device_unregister(to_platform_device(ab_ahb->fw.dev)); in ath11k_ahb_fw_resource_deinit()
1093 hw_rev = (uintptr_t)device_get_match_data(&pdev->dev); in ath11k_ahb_probe()
1107 dev_err(&pdev->dev, "unsupported device type %d\n", hw_rev); in ath11k_ahb_probe()
1108 return -EOPNOTSUPP; in ath11k_ahb_probe()
1111 ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)); in ath11k_ahb_probe()
1113 dev_err(&pdev->dev, "failed to set 32-bit consistent dma\n"); in ath11k_ahb_probe()
1117 ab = ath11k_core_alloc(&pdev->dev, sizeof(struct ath11k_ahb), in ath11k_ahb_probe()
1120 dev_err(&pdev->dev, "failed to allocate ath11k base\n"); in ath11k_ahb_probe()
1121 return -ENOMEM; in ath11k_ahb_probe()
1124 ab->hif.ops = hif_ops; in ath11k_ahb_probe()
1125 ab->pdev = pdev; in ath11k_ahb_probe()
1126 ab->hw_rev = hw_rev; in ath11k_ahb_probe()
1127 ab->fw_mode = ATH11K_FIRMWARE_MODE_NORMAL; in ath11k_ahb_probe()
1144 ab->mem_ce = ab->mem; in ath11k_ahb_probe()
1146 if (ab->hw_params.ce_remap) { in ath11k_ahb_probe()
1147 const struct ce_remap *ce_remap = ab->hw_params.ce_remap; in ath11k_ahb_probe()
1152 ab->mem_ce = ioremap(ce_remap->base, ce_remap->size); in ath11k_ahb_probe()
1153 if (!ab->mem_ce) { in ath11k_ahb_probe()
1154 dev_err(&pdev->dev, "ce ioremap error\n"); in ath11k_ahb_probe()
1155 ret = -ENOMEM; in ath11k_ahb_probe()
1225 if (test_bit(ATH11K_FLAG_RECOVERY, &ab->dev_flags)) { in ath11k_ahb_remove_prepare()
1226 left = wait_for_completion_timeout(&ab->driver_recovery, in ath11k_ahb_remove_prepare()
1232 set_bit(ATH11K_FLAG_UNREGISTERING, &ab->dev_flags); in ath11k_ahb_remove_prepare()
1233 cancel_work_sync(&ab->restart_work); in ath11k_ahb_remove_prepare()
1234 cancel_work_sync(&ab->qmi.event_work); in ath11k_ahb_remove_prepare()
1239 struct platform_device *pdev = ab->pdev; in ath11k_ahb_free_resources()
1247 if (ab->hw_params.ce_remap) in ath11k_ahb_free_resources()
1248 iounmap(ab->mem_ce); in ath11k_ahb_free_resources()
1258 if (test_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags)) { in ath11k_ahb_remove()
1282 if (!(test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags))) in ath11k_ahb_shutdown()