Lines Matching refs:ab

143 ath11k_ahb_get_msi_irq_wcn6750(struct ath11k_base *ab, unsigned int vector)  in ath11k_ahb_get_msi_irq_wcn6750()  argument
145 return ab->pci.msi.irqs[vector]; in ath11k_ahb_get_msi_irq_wcn6750()
149 ath11k_ahb_get_window_start_wcn6750(struct ath11k_base *ab, u32 offset) in ath11k_ahb_get_window_start_wcn6750() argument
157 else if ((offset ^ HAL_SEQ_WCSS_UMAC_CE0_SRC_REG(ab)) < in ath11k_ahb_get_window_start_wcn6750()
165 ath11k_ahb_window_write32_wcn6750(struct ath11k_base *ab, u32 offset, u32 value) in ath11k_ahb_window_write32_wcn6750() argument
170 window_start = ath11k_ahb_get_window_start_wcn6750(ab, offset); in ath11k_ahb_window_write32_wcn6750()
172 iowrite32(value, ab->mem + window_start + in ath11k_ahb_window_write32_wcn6750()
176 static u32 ath11k_ahb_window_read32_wcn6750(struct ath11k_base *ab, u32 offset) in ath11k_ahb_window_read32_wcn6750() argument
182 window_start = ath11k_ahb_get_window_start_wcn6750(ab, offset); in ath11k_ahb_window_read32_wcn6750()
184 val = ioread32(ab->mem + window_start + in ath11k_ahb_window_read32_wcn6750()
197 static inline u32 ath11k_ahb_read32(struct ath11k_base *ab, u32 offset) in ath11k_ahb_read32() argument
199 return ioread32(ab->mem + offset); in ath11k_ahb_read32()
202 static inline void ath11k_ahb_write32(struct ath11k_base *ab, u32 offset, u32 value) in ath11k_ahb_write32() argument
204 iowrite32(value, ab->mem + offset); in ath11k_ahb_write32()
207 static void ath11k_ahb_kill_tasklets(struct ath11k_base *ab) in ath11k_ahb_kill_tasklets() argument
211 for (i = 0; i < ab->hw_params.ce_count; i++) { in ath11k_ahb_kill_tasklets()
212 struct ath11k_ce_pipe *ce_pipe = &ab->ce.ce_pipe[i]; in ath11k_ahb_kill_tasklets()
214 if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR) in ath11k_ahb_kill_tasklets()
226 disable_irq_nosync(irq_grp->ab->irq_num[irq_grp->irqs[i]]); in ath11k_ahb_ext_grp_disable()
229 static void __ath11k_ahb_ext_irq_disable(struct ath11k_base *ab) in __ath11k_ahb_ext_irq_disable() argument
234 struct ath11k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i]; in __ath11k_ahb_ext_irq_disable()
251 enable_irq(irq_grp->ab->irq_num[irq_grp->irqs[i]]); in ath11k_ahb_ext_grp_enable()
254 static void ath11k_ahb_setbit32(struct ath11k_base *ab, u8 bit, u32 offset) in ath11k_ahb_setbit32() argument
258 val = ath11k_ahb_read32(ab, offset); in ath11k_ahb_setbit32()
259 ath11k_ahb_write32(ab, offset, val | BIT(bit)); in ath11k_ahb_setbit32()
262 static void ath11k_ahb_clearbit32(struct ath11k_base *ab, u8 bit, u32 offset) in ath11k_ahb_clearbit32() argument
266 val = ath11k_ahb_read32(ab, offset); in ath11k_ahb_clearbit32()
267 ath11k_ahb_write32(ab, offset, val & ~BIT(bit)); in ath11k_ahb_clearbit32()
270 static void ath11k_ahb_ce_irq_enable(struct ath11k_base *ab, u16 ce_id) in ath11k_ahb_ce_irq_enable() argument
273 const struct ce_ie_addr *ce_ie_addr = ab->hw_params.ce_ie_addr; in ath11k_ahb_ce_irq_enable()
276 ie1_reg_addr = ce_ie_addr->ie1_reg_addr + ATH11K_CE_OFFSET(ab); in ath11k_ahb_ce_irq_enable()
277 ie2_reg_addr = ce_ie_addr->ie2_reg_addr + ATH11K_CE_OFFSET(ab); in ath11k_ahb_ce_irq_enable()
278 ie3_reg_addr = ce_ie_addr->ie3_reg_addr + ATH11K_CE_OFFSET(ab); in ath11k_ahb_ce_irq_enable()
280 ce_attr = &ab->hw_params.host_ce_config[ce_id]; in ath11k_ahb_ce_irq_enable()
282 ath11k_ahb_setbit32(ab, ce_id, ie1_reg_addr); in ath11k_ahb_ce_irq_enable()
285 ath11k_ahb_setbit32(ab, ce_id, ie2_reg_addr); in ath11k_ahb_ce_irq_enable()
286 ath11k_ahb_setbit32(ab, ce_id + CE_HOST_IE_3_SHIFT, in ath11k_ahb_ce_irq_enable()
291 static void ath11k_ahb_ce_irq_disable(struct ath11k_base *ab, u16 ce_id) in ath11k_ahb_ce_irq_disable() argument
294 const struct ce_ie_addr *ce_ie_addr = ab->hw_params.ce_ie_addr; in ath11k_ahb_ce_irq_disable()
297 ie1_reg_addr = ce_ie_addr->ie1_reg_addr + ATH11K_CE_OFFSET(ab); in ath11k_ahb_ce_irq_disable()
298 ie2_reg_addr = ce_ie_addr->ie2_reg_addr + ATH11K_CE_OFFSET(ab); in ath11k_ahb_ce_irq_disable()
299 ie3_reg_addr = ce_ie_addr->ie3_reg_addr + ATH11K_CE_OFFSET(ab); in ath11k_ahb_ce_irq_disable()
301 ce_attr = &ab->hw_params.host_ce_config[ce_id]; in ath11k_ahb_ce_irq_disable()
303 ath11k_ahb_clearbit32(ab, ce_id, ie1_reg_addr); in ath11k_ahb_ce_irq_disable()
306 ath11k_ahb_clearbit32(ab, ce_id, ie2_reg_addr); in ath11k_ahb_ce_irq_disable()
307 ath11k_ahb_clearbit32(ab, ce_id + CE_HOST_IE_3_SHIFT, in ath11k_ahb_ce_irq_disable()
312 static void ath11k_ahb_sync_ce_irqs(struct ath11k_base *ab) in ath11k_ahb_sync_ce_irqs() argument
317 for (i = 0; i < ab->hw_params.ce_count; i++) { in ath11k_ahb_sync_ce_irqs()
318 if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR) in ath11k_ahb_sync_ce_irqs()
322 synchronize_irq(ab->irq_num[irq_idx]); in ath11k_ahb_sync_ce_irqs()
326 static void ath11k_ahb_sync_ext_irqs(struct ath11k_base *ab) in ath11k_ahb_sync_ext_irqs() argument
332 struct ath11k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i]; in ath11k_ahb_sync_ext_irqs()
336 synchronize_irq(ab->irq_num[irq_idx]); in ath11k_ahb_sync_ext_irqs()
341 static void ath11k_ahb_ce_irqs_enable(struct ath11k_base *ab) in ath11k_ahb_ce_irqs_enable() argument
345 for (i = 0; i < ab->hw_params.ce_count; i++) { in ath11k_ahb_ce_irqs_enable()
346 if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR) in ath11k_ahb_ce_irqs_enable()
348 ath11k_ahb_ce_irq_enable(ab, i); in ath11k_ahb_ce_irqs_enable()
352 static void ath11k_ahb_ce_irqs_disable(struct ath11k_base *ab) in ath11k_ahb_ce_irqs_disable() argument
356 for (i = 0; i < ab->hw_params.ce_count; i++) { in ath11k_ahb_ce_irqs_disable()
357 if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR) in ath11k_ahb_ce_irqs_disable()
359 ath11k_ahb_ce_irq_disable(ab, i); in ath11k_ahb_ce_irqs_disable()
363 static int ath11k_ahb_start(struct ath11k_base *ab) in ath11k_ahb_start() argument
365 ath11k_ahb_ce_irqs_enable(ab); in ath11k_ahb_start()
366 ath11k_ce_rx_post_buf(ab); in ath11k_ahb_start()
371 static void ath11k_ahb_ext_irq_enable(struct ath11k_base *ab) in ath11k_ahb_ext_irq_enable() argument
376 struct ath11k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i]; in ath11k_ahb_ext_irq_enable()
387 static void ath11k_ahb_ext_irq_disable(struct ath11k_base *ab) in ath11k_ahb_ext_irq_disable() argument
389 __ath11k_ahb_ext_irq_disable(ab); in ath11k_ahb_ext_irq_disable()
390 ath11k_ahb_sync_ext_irqs(ab); in ath11k_ahb_ext_irq_disable()
393 static void ath11k_ahb_stop(struct ath11k_base *ab) in ath11k_ahb_stop() argument
395 if (!test_bit(ATH11K_FLAG_CRASH_FLUSH, &ab->dev_flags)) in ath11k_ahb_stop()
396 ath11k_ahb_ce_irqs_disable(ab); in ath11k_ahb_stop()
397 ath11k_ahb_sync_ce_irqs(ab); in ath11k_ahb_stop()
398 ath11k_ahb_kill_tasklets(ab); in ath11k_ahb_stop()
399 del_timer_sync(&ab->rx_replenish_retry); in ath11k_ahb_stop()
400 ath11k_ce_cleanup_pipes(ab); in ath11k_ahb_stop()
403 static int ath11k_ahb_power_up(struct ath11k_base *ab) in ath11k_ahb_power_up() argument
405 struct ath11k_ahb *ab_ahb = ath11k_ahb_priv(ab); in ath11k_ahb_power_up()
410 ath11k_err(ab, "failed to boot the remote processor Q6\n"); in ath11k_ahb_power_up()
415 static void ath11k_ahb_power_down(struct ath11k_base *ab) in ath11k_ahb_power_down() argument
417 struct ath11k_ahb *ab_ahb = ath11k_ahb_priv(ab); in ath11k_ahb_power_down()
422 static int ath11k_ahb_fwreset_from_cold_boot(struct ath11k_base *ab) in ath11k_ahb_fwreset_from_cold_boot() argument
426 if (ath11k_cold_boot_cal == 0 || ab->qmi.cal_done || in ath11k_ahb_fwreset_from_cold_boot()
427 ab->hw_params.cold_boot_calib == 0 || in ath11k_ahb_fwreset_from_cold_boot()
428 ab->hw_params.cbcal_restart_fw == 0) in ath11k_ahb_fwreset_from_cold_boot()
431 ath11k_dbg(ab, ATH11K_DBG_AHB, "wait for cold boot done\n"); in ath11k_ahb_fwreset_from_cold_boot()
432 timeout = wait_event_timeout(ab->qmi.cold_boot_waitq, in ath11k_ahb_fwreset_from_cold_boot()
433 (ab->qmi.cal_done == 1), in ath11k_ahb_fwreset_from_cold_boot()
437 ath11k_warn(ab, "Coldboot Calibration failed timed out\n"); in ath11k_ahb_fwreset_from_cold_boot()
441 ath11k_ahb_power_down(ab); in ath11k_ahb_fwreset_from_cold_boot()
442 ath11k_ahb_power_up(ab); in ath11k_ahb_fwreset_from_cold_boot()
444 ath11k_dbg(ab, ATH11K_DBG_AHB, "exited from cold boot mode\n"); in ath11k_ahb_fwreset_from_cold_boot()
448 static void ath11k_ahb_init_qmi_ce_config(struct ath11k_base *ab) in ath11k_ahb_init_qmi_ce_config() argument
450 struct ath11k_qmi_ce_cfg *cfg = &ab->qmi.ce_cfg; in ath11k_ahb_init_qmi_ce_config()
452 cfg->tgt_ce_len = ab->hw_params.target_ce_count; in ath11k_ahb_init_qmi_ce_config()
453 cfg->tgt_ce = ab->hw_params.target_ce_config; in ath11k_ahb_init_qmi_ce_config()
454 cfg->svc_to_ce_map_len = ab->hw_params.svc_to_ce_map_len; in ath11k_ahb_init_qmi_ce_config()
455 cfg->svc_to_ce_map = ab->hw_params.svc_to_ce_map; in ath11k_ahb_init_qmi_ce_config()
456 ab->qmi.service_ins_id = ab->hw_params.qmi_service_ins_id; in ath11k_ahb_init_qmi_ce_config()
459 static void ath11k_ahb_free_ext_irq(struct ath11k_base *ab) in ath11k_ahb_free_ext_irq() argument
464 struct ath11k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i]; in ath11k_ahb_free_ext_irq()
467 free_irq(ab->irq_num[irq_grp->irqs[j]], irq_grp); in ath11k_ahb_free_ext_irq()
473 static void ath11k_ahb_free_irq(struct ath11k_base *ab) in ath11k_ahb_free_irq() argument
478 if (ab->hw_params.hybrid_bus_type) in ath11k_ahb_free_irq()
479 return ath11k_pcic_free_irq(ab); in ath11k_ahb_free_irq()
481 for (i = 0; i < ab->hw_params.ce_count; i++) { in ath11k_ahb_free_irq()
482 if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR) in ath11k_ahb_free_irq()
485 free_irq(ab->irq_num[irq_idx], &ab->ce.ce_pipe[i]); in ath11k_ahb_free_irq()
488 ath11k_ahb_free_ext_irq(ab); in ath11k_ahb_free_irq()
495 ath11k_ce_per_engine_service(ce_pipe->ab, ce_pipe->pipe_num); in ath11k_ahb_ce_tasklet()
497 ath11k_ahb_ce_irq_enable(ce_pipe->ab, ce_pipe->pipe_num); in ath11k_ahb_ce_tasklet()
507 ath11k_ahb_ce_irq_disable(ce_pipe->ab, ce_pipe->pipe_num); in ath11k_ahb_ce_interrupt_handler()
519 struct ath11k_base *ab = irq_grp->ab; in ath11k_ahb_ext_grp_napi_poll() local
522 work_done = ath11k_dp_service_srng(ab, irq_grp, budget); in ath11k_ahb_ext_grp_napi_poll()
548 static int ath11k_ahb_config_ext_irq(struct ath11k_base *ab) in ath11k_ahb_config_ext_irq() argument
550 struct ath11k_hw_params *hw = &ab->hw_params; in ath11k_ahb_config_ext_irq()
556 struct ath11k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i]; in ath11k_ahb_config_ext_irq()
559 irq_grp->ab = ab; in ath11k_ahb_config_ext_irq()
566 if (ab->hw_params.ring_mask->tx[i] & BIT(j)) { in ath11k_ahb_config_ext_irq()
571 if (ab->hw_params.ring_mask->rx[i] & BIT(j)) { in ath11k_ahb_config_ext_irq()
576 if (ab->hw_params.ring_mask->rx_err[i] & BIT(j)) in ath11k_ahb_config_ext_irq()
579 if (ab->hw_params.ring_mask->rx_wbm_rel[i] & BIT(j)) in ath11k_ahb_config_ext_irq()
582 if (ab->hw_params.ring_mask->reo_status[i] & BIT(j)) in ath11k_ahb_config_ext_irq()
585 if (j < ab->hw_params.max_radios) { in ath11k_ahb_config_ext_irq()
586 if (ab->hw_params.ring_mask->rxdma2host[i] & BIT(j)) { in ath11k_ahb_config_ext_irq()
592 if (ab->hw_params.ring_mask->host2rxdma[i] & BIT(j)) { in ath11k_ahb_config_ext_irq()
598 if (ab->hw_params.ring_mask->rx_mon_status[i] & BIT(j)) { in ath11k_ahb_config_ext_irq()
613 irq = platform_get_irq_byname(ab->pdev, in ath11k_ahb_config_ext_irq()
615 ab->irq_num[irq_idx] = irq; in ath11k_ahb_config_ext_irq()
621 ath11k_err(ab, "failed request_irq for %d\n", in ath11k_ahb_config_ext_irq()
630 static int ath11k_ahb_config_irq(struct ath11k_base *ab) in ath11k_ahb_config_irq() argument
635 if (ab->hw_params.hybrid_bus_type) in ath11k_ahb_config_irq()
636 return ath11k_pcic_config_irq(ab); in ath11k_ahb_config_irq()
639 for (i = 0; i < ab->hw_params.ce_count; i++) { in ath11k_ahb_config_irq()
640 struct ath11k_ce_pipe *ce_pipe = &ab->ce.ce_pipe[i]; in ath11k_ahb_config_irq()
642 if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR) in ath11k_ahb_config_irq()
648 irq = platform_get_irq_byname(ab->pdev, irq_name[irq_idx]); in ath11k_ahb_config_irq()
655 ab->irq_num[irq_idx] = irq; in ath11k_ahb_config_irq()
659 ret = ath11k_ahb_config_ext_irq(ab); in ath11k_ahb_config_irq()
664 static int ath11k_ahb_map_service_to_pipe(struct ath11k_base *ab, u16 service_id, in ath11k_ahb_map_service_to_pipe() argument
671 for (i = 0; i < ab->hw_params.svc_to_ce_map_len; i++) { in ath11k_ahb_map_service_to_pipe()
672 entry = &ab->hw_params.svc_to_ce_map[i]; in ath11k_ahb_map_service_to_pipe()
707 static int ath11k_ahb_hif_suspend(struct ath11k_base *ab) in ath11k_ahb_hif_suspend() argument
709 struct ath11k_ahb *ab_ahb = ath11k_ahb_priv(ab); in ath11k_ahb_hif_suspend()
714 if (!device_may_wakeup(ab->dev)) in ath11k_ahb_hif_suspend()
717 wake_irq = ab->irq_num[ATH11K_PCI_IRQ_CE0_OFFSET + ATH11K_PCI_CE_WAKE_IRQ]; in ath11k_ahb_hif_suspend()
721 ath11k_err(ab, "failed to enable wakeup irq :%d\n", ret); in ath11k_ahb_hif_suspend()
733 ath11k_err(ab, "failed to send smp2p power save enter cmd :%d\n", ret); in ath11k_ahb_hif_suspend()
737 ath11k_dbg(ab, ATH11K_DBG_AHB, "ahb device suspended\n"); in ath11k_ahb_hif_suspend()
742 static int ath11k_ahb_hif_resume(struct ath11k_base *ab) in ath11k_ahb_hif_resume() argument
744 struct ath11k_ahb *ab_ahb = ath11k_ahb_priv(ab); in ath11k_ahb_hif_resume()
749 if (!device_may_wakeup(ab->dev)) in ath11k_ahb_hif_resume()
752 wake_irq = ab->irq_num[ATH11K_PCI_IRQ_CE0_OFFSET + ATH11K_PCI_CE_WAKE_IRQ]; in ath11k_ahb_hif_resume()
756 ath11k_err(ab, "failed to disable wakeup irq: %d\n", ret); in ath11k_ahb_hif_resume()
760 reinit_completion(&ab->wow.wakeup_completed); in ath11k_ahb_hif_resume()
770 ath11k_err(ab, "failed to send smp2p power save enter cmd :%d\n", ret); in ath11k_ahb_hif_resume()
774 ret = wait_for_completion_timeout(&ab->wow.wakeup_completed, 3 * HZ); in ath11k_ahb_hif_resume()
776 ath11k_warn(ab, "timed out while waiting for wow wakeup completion\n"); in ath11k_ahb_hif_resume()
780 ath11k_dbg(ab, ATH11K_DBG_AHB, "ahb device resumed\n"); in ath11k_ahb_hif_resume()
817 static int ath11k_core_get_rproc(struct ath11k_base *ab) in ath11k_core_get_rproc() argument
819 struct ath11k_ahb *ab_ahb = ath11k_ahb_priv(ab); in ath11k_core_get_rproc()
820 struct device *dev = ab->dev; in ath11k_core_get_rproc()
825 ath11k_err(ab, "failed to get q6_rproc handle\n"); in ath11k_core_get_rproc()
831 ath11k_err(ab, "failed to get rproc\n"); in ath11k_core_get_rproc()
839 static int ath11k_ahb_setup_msi_resources(struct ath11k_base *ab) in ath11k_ahb_setup_msi_resources() argument
841 struct platform_device *pdev = ab->pdev; in ath11k_ahb_setup_msi_resources()
849 ret = ath11k_pcic_init_msi_config(ab); in ath11k_ahb_setup_msi_resources()
851 ath11k_err(ab, "failed to init msi config: %d\n", ret); in ath11k_ahb_setup_msi_resources()
857 ath11k_err(ab, "failed to fetch msi_addr\n"); in ath11k_ahb_setup_msi_resources()
862 msi_addr_iova = dma_map_resource(ab->dev, msi_addr_pa, PAGE_SIZE, in ath11k_ahb_setup_msi_resources()
864 if (dma_mapping_error(ab->dev, msi_addr_iova)) in ath11k_ahb_setup_msi_resources()
867 ab->pci.msi.addr_lo = lower_32_bits(msi_addr_iova); in ath11k_ahb_setup_msi_resources()
868 ab->pci.msi.addr_hi = upper_32_bits(msi_addr_iova); in ath11k_ahb_setup_msi_resources()
870 ret = of_property_read_u32_index(ab->dev->of_node, "interrupts", 1, &int_prop); in ath11k_ahb_setup_msi_resources()
874 ab->pci.msi.ep_base_data = int_prop + 32; in ath11k_ahb_setup_msi_resources()
876 for (i = 0; i < ab->pci.msi.config->total_vectors; i++) { in ath11k_ahb_setup_msi_resources()
881 ab->pci.msi.irqs[i] = res->start; in ath11k_ahb_setup_msi_resources()
884 set_bit(ATH11K_FLAG_MULTI_MSI_VECTORS, &ab->dev_flags); in ath11k_ahb_setup_msi_resources()
889 static int ath11k_ahb_setup_smp2p_handle(struct ath11k_base *ab) in ath11k_ahb_setup_smp2p_handle() argument
891 struct ath11k_ahb *ab_ahb = ath11k_ahb_priv(ab); in ath11k_ahb_setup_smp2p_handle()
893 if (!ab->hw_params.smp2p_wow_exit) in ath11k_ahb_setup_smp2p_handle()
896 ab_ahb->smp2p_info.smem_state = qcom_smem_state_get(ab->dev, "wlan-smp2p-out", in ath11k_ahb_setup_smp2p_handle()
899 ath11k_err(ab, "failed to fetch smem state: %ld\n", in ath11k_ahb_setup_smp2p_handle()
907 static void ath11k_ahb_release_smp2p_handle(struct ath11k_base *ab) in ath11k_ahb_release_smp2p_handle() argument
909 struct ath11k_ahb *ab_ahb = ath11k_ahb_priv(ab); in ath11k_ahb_release_smp2p_handle()
911 if (!ab->hw_params.smp2p_wow_exit) in ath11k_ahb_release_smp2p_handle()
917 static int ath11k_ahb_setup_resources(struct ath11k_base *ab) in ath11k_ahb_setup_resources() argument
919 struct platform_device *pdev = ab->pdev; in ath11k_ahb_setup_resources()
923 if (ab->hw_params.hybrid_bus_type) in ath11k_ahb_setup_resources()
924 return ath11k_ahb_setup_msi_resources(ab); in ath11k_ahb_setup_resources()
932 ab->mem = mem; in ath11k_ahb_setup_resources()
933 ab->mem_len = resource_size(mem_res); in ath11k_ahb_setup_resources()
938 static int ath11k_ahb_setup_msa_resources(struct ath11k_base *ab) in ath11k_ahb_setup_msa_resources() argument
940 struct ath11k_ahb *ab_ahb = ath11k_ahb_priv(ab); in ath11k_ahb_setup_msa_resources()
941 struct device *dev = ab->dev; in ath11k_ahb_setup_msa_resources()
977 static int ath11k_ahb_fw_resources_init(struct ath11k_base *ab) in ath11k_ahb_fw_resources_init() argument
979 struct ath11k_ahb *ab_ahb = ath11k_ahb_priv(ab); in ath11k_ahb_fw_resources_init()
980 struct device *host_dev = ab->dev; in ath11k_ahb_fw_resources_init()
990 if (!ab->hw_params.fixed_fw_mem) in ath11k_ahb_fw_resources_init()
993 ret = ath11k_ahb_setup_msa_resources(ab); in ath11k_ahb_fw_resources_init()
995 ath11k_err(ab, "failed to setup msa resources\n"); in ath11k_ahb_fw_resources_init()
1018 ath11k_err(ab, "dma configure fail: %d\n", ret); in ath11k_ahb_fw_resources_init()
1026 ath11k_err(ab, "failed to allocate iommu domain\n"); in ath11k_ahb_fw_resources_init()
1033 ath11k_err(ab, "could not attach device: %d\n", ret); in ath11k_ahb_fw_resources_init()
1041 ath11k_err(ab, "failed to map firmware region: %d\n", ret); in ath11k_ahb_fw_resources_init()
1049 ath11k_err(ab, "failed to map firmware CE region: %d\n", ret); in ath11k_ahb_fw_resources_init()
1075 static int ath11k_ahb_fw_resource_deinit(struct ath11k_base *ab) in ath11k_ahb_fw_resource_deinit() argument
1077 struct ath11k_ahb *ab_ahb = ath11k_ahb_priv(ab); in ath11k_ahb_fw_resource_deinit()
1088 ath11k_err(ab, "failed to unmap firmware: %zu\n", in ath11k_ahb_fw_resource_deinit()
1093 ath11k_err(ab, "failed to unmap firmware CE memory: %zu\n", in ath11k_ahb_fw_resource_deinit()
1106 struct ath11k_base *ab; in ath11k_ahb_probe() local
1142 ab = ath11k_core_alloc(&pdev->dev, sizeof(struct ath11k_ahb), in ath11k_ahb_probe()
1144 if (!ab) { in ath11k_ahb_probe()
1149 ab->hif.ops = hif_ops; in ath11k_ahb_probe()
1150 ab->pdev = pdev; in ath11k_ahb_probe()
1151 ab->hw_rev = hw_rev; in ath11k_ahb_probe()
1152 platform_set_drvdata(pdev, ab); in ath11k_ahb_probe()
1154 ret = ath11k_pcic_register_pci_ops(ab, pci_ops); in ath11k_ahb_probe()
1156 ath11k_err(ab, "failed to register PCI ops: %d\n", ret); in ath11k_ahb_probe()
1160 ret = ath11k_core_pre_init(ab); in ath11k_ahb_probe()
1164 ret = ath11k_ahb_setup_resources(ab); in ath11k_ahb_probe()
1168 ab->mem_ce = ab->mem; in ath11k_ahb_probe()
1170 if (ab->hw_params.ce_remap) { in ath11k_ahb_probe()
1171 const struct ce_remap *ce_remap = ab->hw_params.ce_remap; in ath11k_ahb_probe()
1176 ab->mem_ce = ioremap(ce_remap->base, ce_remap->size); in ath11k_ahb_probe()
1177 if (IS_ERR(ab->mem_ce)) { in ath11k_ahb_probe()
1184 ret = ath11k_ahb_fw_resources_init(ab); in ath11k_ahb_probe()
1188 ret = ath11k_ahb_setup_smp2p_handle(ab); in ath11k_ahb_probe()
1192 ret = ath11k_hal_srng_init(ab); in ath11k_ahb_probe()
1196 ret = ath11k_ce_alloc_pipes(ab); in ath11k_ahb_probe()
1198 ath11k_err(ab, "failed to allocate ce pipes: %d\n", ret); in ath11k_ahb_probe()
1202 ath11k_ahb_init_qmi_ce_config(ab); in ath11k_ahb_probe()
1204 ret = ath11k_core_get_rproc(ab); in ath11k_ahb_probe()
1206 ath11k_err(ab, "failed to get rproc: %d\n", ret); in ath11k_ahb_probe()
1210 ret = ath11k_core_init(ab); in ath11k_ahb_probe()
1212 ath11k_err(ab, "failed to init core: %d\n", ret); in ath11k_ahb_probe()
1216 ret = ath11k_ahb_config_irq(ab); in ath11k_ahb_probe()
1218 ath11k_err(ab, "failed to configure irq: %d\n", ret); in ath11k_ahb_probe()
1222 ath11k_ahb_fwreset_from_cold_boot(ab); in ath11k_ahb_probe()
1227 ath11k_ce_free_pipes(ab); in ath11k_ahb_probe()
1230 ath11k_hal_srng_deinit(ab); in ath11k_ahb_probe()
1233 ath11k_ahb_release_smp2p_handle(ab); in ath11k_ahb_probe()
1236 ath11k_ahb_fw_resource_deinit(ab); in ath11k_ahb_probe()
1239 ath11k_core_free(ab); in ath11k_ahb_probe()
1245 static void ath11k_ahb_remove_prepare(struct ath11k_base *ab) in ath11k_ahb_remove_prepare() argument
1249 if (test_bit(ATH11K_FLAG_RECOVERY, &ab->dev_flags)) { in ath11k_ahb_remove_prepare()
1250 left = wait_for_completion_timeout(&ab->driver_recovery, in ath11k_ahb_remove_prepare()
1253 ath11k_warn(ab, "failed to receive recovery response completion\n"); in ath11k_ahb_remove_prepare()
1256 set_bit(ATH11K_FLAG_UNREGISTERING, &ab->dev_flags); in ath11k_ahb_remove_prepare()
1257 cancel_work_sync(&ab->restart_work); in ath11k_ahb_remove_prepare()
1258 cancel_work_sync(&ab->qmi.event_work); in ath11k_ahb_remove_prepare()
1261 static void ath11k_ahb_free_resources(struct ath11k_base *ab) in ath11k_ahb_free_resources() argument
1263 struct platform_device *pdev = ab->pdev; in ath11k_ahb_free_resources()
1265 ath11k_ahb_free_irq(ab); in ath11k_ahb_free_resources()
1266 ath11k_hal_srng_deinit(ab); in ath11k_ahb_free_resources()
1267 ath11k_ahb_release_smp2p_handle(ab); in ath11k_ahb_free_resources()
1268 ath11k_ahb_fw_resource_deinit(ab); in ath11k_ahb_free_resources()
1269 ath11k_ce_free_pipes(ab); in ath11k_ahb_free_resources()
1271 if (ab->hw_params.ce_remap) in ath11k_ahb_free_resources()
1272 iounmap(ab->mem_ce); in ath11k_ahb_free_resources()
1274 ath11k_core_free(ab); in ath11k_ahb_free_resources()
1280 struct ath11k_base *ab = platform_get_drvdata(pdev); in ath11k_ahb_remove() local
1282 if (test_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags)) { in ath11k_ahb_remove()
1283 ath11k_ahb_power_down(ab); in ath11k_ahb_remove()
1284 ath11k_debugfs_soc_destroy(ab); in ath11k_ahb_remove()
1285 ath11k_qmi_deinit_service(ab); in ath11k_ahb_remove()
1289 ath11k_ahb_remove_prepare(ab); in ath11k_ahb_remove()
1290 ath11k_core_deinit(ab); in ath11k_ahb_remove()
1293 ath11k_ahb_free_resources(ab); in ath11k_ahb_remove()
1300 struct ath11k_base *ab = platform_get_drvdata(pdev); in ath11k_ahb_shutdown() local
1306 ath11k_ahb_remove_prepare(ab); in ath11k_ahb_shutdown()
1308 if (!(test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags))) in ath11k_ahb_shutdown()
1311 ath11k_core_deinit(ab); in ath11k_ahb_shutdown()
1314 ath11k_ahb_free_resources(ab); in ath11k_ahb_shutdown()