Lines Matching full:ab

137 static inline u32 ath11k_ahb_read32(struct ath11k_base *ab, u32 offset)  in ath11k_ahb_read32()  argument
139 return ioread32(ab->mem + offset); in ath11k_ahb_read32()
142 static inline void ath11k_ahb_write32(struct ath11k_base *ab, u32 offset, u32 value) in ath11k_ahb_write32() argument
144 iowrite32(value, ab->mem + offset); in ath11k_ahb_write32()
147 static void ath11k_ahb_kill_tasklets(struct ath11k_base *ab) in ath11k_ahb_kill_tasklets() argument
151 for (i = 0; i < ab->hw_params.ce_count; i++) { in ath11k_ahb_kill_tasklets()
152 struct ath11k_ce_pipe *ce_pipe = &ab->ce.ce_pipe[i]; in ath11k_ahb_kill_tasklets()
154 if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR) in ath11k_ahb_kill_tasklets()
166 disable_irq_nosync(irq_grp->ab->irq_num[irq_grp->irqs[i]]); in ath11k_ahb_ext_grp_disable()
169 static void __ath11k_ahb_ext_irq_disable(struct ath11k_base *ab) in __ath11k_ahb_ext_irq_disable() argument
174 struct ath11k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i]; in __ath11k_ahb_ext_irq_disable()
188 enable_irq(irq_grp->ab->irq_num[irq_grp->irqs[i]]); in ath11k_ahb_ext_grp_enable()
191 static void ath11k_ahb_setbit32(struct ath11k_base *ab, u8 bit, u32 offset) in ath11k_ahb_setbit32() argument
195 val = ath11k_ahb_read32(ab, offset); in ath11k_ahb_setbit32()
196 ath11k_ahb_write32(ab, offset, val | BIT(bit)); in ath11k_ahb_setbit32()
199 static void ath11k_ahb_clearbit32(struct ath11k_base *ab, u8 bit, u32 offset) in ath11k_ahb_clearbit32() argument
203 val = ath11k_ahb_read32(ab, offset); in ath11k_ahb_clearbit32()
204 ath11k_ahb_write32(ab, offset, val & ~BIT(bit)); in ath11k_ahb_clearbit32()
207 static void ath11k_ahb_ce_irq_enable(struct ath11k_base *ab, u16 ce_id) in ath11k_ahb_ce_irq_enable() argument
211 ce_config = &ab->hw_params.target_ce_config[ce_id]; in ath11k_ahb_ce_irq_enable()
213 ath11k_ahb_setbit32(ab, ce_id, CE_HOST_IE_ADDRESS); in ath11k_ahb_ce_irq_enable()
216 ath11k_ahb_setbit32(ab, ce_id, CE_HOST_IE_2_ADDRESS); in ath11k_ahb_ce_irq_enable()
217 ath11k_ahb_setbit32(ab, ce_id + CE_HOST_IE_3_SHIFT, in ath11k_ahb_ce_irq_enable()
222 static void ath11k_ahb_ce_irq_disable(struct ath11k_base *ab, u16 ce_id) in ath11k_ahb_ce_irq_disable() argument
226 ce_config = &ab->hw_params.target_ce_config[ce_id]; in ath11k_ahb_ce_irq_disable()
228 ath11k_ahb_clearbit32(ab, ce_id, CE_HOST_IE_ADDRESS); in ath11k_ahb_ce_irq_disable()
231 ath11k_ahb_clearbit32(ab, ce_id, CE_HOST_IE_2_ADDRESS); in ath11k_ahb_ce_irq_disable()
232 ath11k_ahb_clearbit32(ab, ce_id + CE_HOST_IE_3_SHIFT, in ath11k_ahb_ce_irq_disable()
237 static void ath11k_ahb_sync_ce_irqs(struct ath11k_base *ab) in ath11k_ahb_sync_ce_irqs() argument
242 for (i = 0; i < ab->hw_params.ce_count; i++) { in ath11k_ahb_sync_ce_irqs()
243 if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR) in ath11k_ahb_sync_ce_irqs()
247 synchronize_irq(ab->irq_num[irq_idx]); in ath11k_ahb_sync_ce_irqs()
251 static void ath11k_ahb_sync_ext_irqs(struct ath11k_base *ab) in ath11k_ahb_sync_ext_irqs() argument
257 struct ath11k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i]; in ath11k_ahb_sync_ext_irqs()
261 synchronize_irq(ab->irq_num[irq_idx]); in ath11k_ahb_sync_ext_irqs()
266 static void ath11k_ahb_ce_irqs_enable(struct ath11k_base *ab) in ath11k_ahb_ce_irqs_enable() argument
270 for (i = 0; i < ab->hw_params.ce_count; i++) { in ath11k_ahb_ce_irqs_enable()
271 if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR) in ath11k_ahb_ce_irqs_enable()
273 ath11k_ahb_ce_irq_enable(ab, i); in ath11k_ahb_ce_irqs_enable()
277 static void ath11k_ahb_ce_irqs_disable(struct ath11k_base *ab) in ath11k_ahb_ce_irqs_disable() argument
281 for (i = 0; i < ab->hw_params.ce_count; i++) { in ath11k_ahb_ce_irqs_disable()
282 if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR) in ath11k_ahb_ce_irqs_disable()
284 ath11k_ahb_ce_irq_disable(ab, i); in ath11k_ahb_ce_irqs_disable()
288 static int ath11k_ahb_start(struct ath11k_base *ab) in ath11k_ahb_start() argument
290 ath11k_ahb_ce_irqs_enable(ab); in ath11k_ahb_start()
291 ath11k_ce_rx_post_buf(ab); in ath11k_ahb_start()
296 static void ath11k_ahb_ext_irq_enable(struct ath11k_base *ab) in ath11k_ahb_ext_irq_enable() argument
301 struct ath11k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i]; in ath11k_ahb_ext_irq_enable()
308 static void ath11k_ahb_ext_irq_disable(struct ath11k_base *ab) in ath11k_ahb_ext_irq_disable() argument
310 __ath11k_ahb_ext_irq_disable(ab); in ath11k_ahb_ext_irq_disable()
311 ath11k_ahb_sync_ext_irqs(ab); in ath11k_ahb_ext_irq_disable()
314 static void ath11k_ahb_stop(struct ath11k_base *ab) in ath11k_ahb_stop() argument
316 if (!test_bit(ATH11K_FLAG_CRASH_FLUSH, &ab->dev_flags)) in ath11k_ahb_stop()
317 ath11k_ahb_ce_irqs_disable(ab); in ath11k_ahb_stop()
318 ath11k_ahb_sync_ce_irqs(ab); in ath11k_ahb_stop()
319 ath11k_ahb_kill_tasklets(ab); in ath11k_ahb_stop()
320 del_timer_sync(&ab->rx_replenish_retry); in ath11k_ahb_stop()
321 ath11k_ce_cleanup_pipes(ab); in ath11k_ahb_stop()
324 static int ath11k_ahb_power_up(struct ath11k_base *ab) in ath11k_ahb_power_up() argument
326 struct ath11k_ahb *ab_ahb = ath11k_ahb_priv(ab); in ath11k_ahb_power_up()
331 ath11k_err(ab, "failed to boot the remote processor Q6\n"); in ath11k_ahb_power_up()
336 static void ath11k_ahb_power_down(struct ath11k_base *ab) in ath11k_ahb_power_down() argument
338 struct ath11k_ahb *ab_ahb = ath11k_ahb_priv(ab); in ath11k_ahb_power_down()
343 static int ath11k_ahb_fwreset_from_cold_boot(struct ath11k_base *ab) in ath11k_ahb_fwreset_from_cold_boot() argument
347 if (ath11k_cold_boot_cal == 0 || ab->qmi.cal_done || in ath11k_ahb_fwreset_from_cold_boot()
348 ab->hw_params.cold_boot_calib == 0) in ath11k_ahb_fwreset_from_cold_boot()
351 ath11k_dbg(ab, ATH11K_DBG_AHB, "wait for cold boot done\n"); in ath11k_ahb_fwreset_from_cold_boot()
352 timeout = wait_event_timeout(ab->qmi.cold_boot_waitq, in ath11k_ahb_fwreset_from_cold_boot()
353 (ab->qmi.cal_done == 1), in ath11k_ahb_fwreset_from_cold_boot()
357 ath11k_warn(ab, "Coldboot Calibration failed timed out\n"); in ath11k_ahb_fwreset_from_cold_boot()
361 ath11k_ahb_power_down(ab); in ath11k_ahb_fwreset_from_cold_boot()
362 ath11k_ahb_power_up(ab); in ath11k_ahb_fwreset_from_cold_boot()
364 ath11k_dbg(ab, ATH11K_DBG_AHB, "exited from cold boot mode\n"); in ath11k_ahb_fwreset_from_cold_boot()
368 static void ath11k_ahb_init_qmi_ce_config(struct ath11k_base *ab) in ath11k_ahb_init_qmi_ce_config() argument
370 struct ath11k_qmi_ce_cfg *cfg = &ab->qmi.ce_cfg; in ath11k_ahb_init_qmi_ce_config()
372 cfg->tgt_ce_len = ab->hw_params.target_ce_count; in ath11k_ahb_init_qmi_ce_config()
373 cfg->tgt_ce = ab->hw_params.target_ce_config; in ath11k_ahb_init_qmi_ce_config()
374 cfg->svc_to_ce_map_len = ab->hw_params.svc_to_ce_map_len; in ath11k_ahb_init_qmi_ce_config()
375 cfg->svc_to_ce_map = ab->hw_params.svc_to_ce_map; in ath11k_ahb_init_qmi_ce_config()
376 ab->qmi.service_ins_id = ab->hw_params.qmi_service_ins_id; in ath11k_ahb_init_qmi_ce_config()
379 static void ath11k_ahb_free_ext_irq(struct ath11k_base *ab) in ath11k_ahb_free_ext_irq() argument
384 struct ath11k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i]; in ath11k_ahb_free_ext_irq()
387 free_irq(ab->irq_num[irq_grp->irqs[j]], irq_grp); in ath11k_ahb_free_ext_irq()
391 static void ath11k_ahb_free_irq(struct ath11k_base *ab) in ath11k_ahb_free_irq() argument
396 for (i = 0; i < ab->hw_params.ce_count; i++) { in ath11k_ahb_free_irq()
397 if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR) in ath11k_ahb_free_irq()
400 free_irq(ab->irq_num[irq_idx], &ab->ce.ce_pipe[i]); in ath11k_ahb_free_irq()
403 ath11k_ahb_free_ext_irq(ab); in ath11k_ahb_free_irq()
410 ath11k_ce_per_engine_service(ce_pipe->ab, ce_pipe->pipe_num); in ath11k_ahb_ce_tasklet()
412 ath11k_ahb_ce_irq_enable(ce_pipe->ab, ce_pipe->pipe_num); in ath11k_ahb_ce_tasklet()
422 ath11k_ahb_ce_irq_disable(ce_pipe->ab, ce_pipe->pipe_num); in ath11k_ahb_ce_interrupt_handler()
434 struct ath11k_base *ab = irq_grp->ab; in ath11k_ahb_ext_grp_napi_poll() local
437 work_done = ath11k_dp_service_srng(ab, irq_grp, budget); in ath11k_ahb_ext_grp_napi_poll()
463 static int ath11k_ahb_ext_irq_config(struct ath11k_base *ab) in ath11k_ahb_ext_irq_config() argument
465 struct ath11k_hw_params *hw = &ab->hw_params; in ath11k_ahb_ext_irq_config()
471 struct ath11k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i]; in ath11k_ahb_ext_irq_config()
474 irq_grp->ab = ab; in ath11k_ahb_ext_irq_config()
481 if (ab->hw_params.ring_mask->tx[i] & BIT(j)) { in ath11k_ahb_ext_irq_config()
486 if (ab->hw_params.ring_mask->rx[i] & BIT(j)) { in ath11k_ahb_ext_irq_config()
491 if (ab->hw_params.ring_mask->rx_err[i] & BIT(j)) in ath11k_ahb_ext_irq_config()
494 if (ab->hw_params.ring_mask->rx_wbm_rel[i] & BIT(j)) in ath11k_ahb_ext_irq_config()
497 if (ab->hw_params.ring_mask->reo_status[i] & BIT(j)) in ath11k_ahb_ext_irq_config()
500 if (j < ab->hw_params.max_radios) { in ath11k_ahb_ext_irq_config()
501 if (ab->hw_params.ring_mask->rxdma2host[i] & BIT(j)) { in ath11k_ahb_ext_irq_config()
507 if (ab->hw_params.ring_mask->host2rxdma[i] & BIT(j)) { in ath11k_ahb_ext_irq_config()
513 if (ab->hw_params.ring_mask->rx_mon_status[i] & BIT(j)) { in ath11k_ahb_ext_irq_config()
528 irq = platform_get_irq_byname(ab->pdev, in ath11k_ahb_ext_irq_config()
530 ab->irq_num[irq_idx] = irq; in ath11k_ahb_ext_irq_config()
536 ath11k_err(ab, "failed request_irq for %d\n", in ath11k_ahb_ext_irq_config()
545 static int ath11k_ahb_config_irq(struct ath11k_base *ab) in ath11k_ahb_config_irq() argument
551 for (i = 0; i < ab->hw_params.ce_count; i++) { in ath11k_ahb_config_irq()
552 struct ath11k_ce_pipe *ce_pipe = &ab->ce.ce_pipe[i]; in ath11k_ahb_config_irq()
554 if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR) in ath11k_ahb_config_irq()
560 irq = platform_get_irq_byname(ab->pdev, irq_name[irq_idx]); in ath11k_ahb_config_irq()
567 ab->irq_num[irq_idx] = irq; in ath11k_ahb_config_irq()
571 ret = ath11k_ahb_ext_irq_config(ab); in ath11k_ahb_config_irq()
576 static int ath11k_ahb_map_service_to_pipe(struct ath11k_base *ab, u16 service_id, in ath11k_ahb_map_service_to_pipe() argument
583 for (i = 0; i < ab->hw_params.svc_to_ce_map_len; i++) { in ath11k_ahb_map_service_to_pipe()
584 entry = &ab->hw_params.svc_to_ce_map[i]; in ath11k_ahb_map_service_to_pipe()
631 static int ath11k_core_get_rproc(struct ath11k_base *ab) in ath11k_core_get_rproc() argument
633 struct ath11k_ahb *ab_ahb = ath11k_ahb_priv(ab); in ath11k_core_get_rproc()
634 struct device *dev = ab->dev; in ath11k_core_get_rproc()
639 ath11k_err(ab, "failed to get q6_rproc handle\n"); in ath11k_core_get_rproc()
645 ath11k_err(ab, "failed to get rproc\n"); in ath11k_core_get_rproc()
655 struct ath11k_base *ab; in ath11k_ahb_probe() local
679 ab = ath11k_core_alloc(&pdev->dev, sizeof(struct ath11k_ahb), in ath11k_ahb_probe()
682 if (!ab) { in ath11k_ahb_probe()
687 ab->hif.ops = &ath11k_ahb_hif_ops; in ath11k_ahb_probe()
688 ab->pdev = pdev; in ath11k_ahb_probe()
689 ab->hw_rev = (enum ath11k_hw_rev)of_id->data; in ath11k_ahb_probe()
690 ab->mem = mem; in ath11k_ahb_probe()
691 ab->mem_len = resource_size(mem_res); in ath11k_ahb_probe()
692 platform_set_drvdata(pdev, ab); in ath11k_ahb_probe()
694 ret = ath11k_core_pre_init(ab); in ath11k_ahb_probe()
698 ret = ath11k_hal_srng_init(ab); in ath11k_ahb_probe()
702 ret = ath11k_ce_alloc_pipes(ab); in ath11k_ahb_probe()
704 ath11k_err(ab, "failed to allocate ce pipes: %d\n", ret); in ath11k_ahb_probe()
708 ath11k_ahb_init_qmi_ce_config(ab); in ath11k_ahb_probe()
710 ret = ath11k_core_get_rproc(ab); in ath11k_ahb_probe()
712 ath11k_err(ab, "failed to get rproc: %d\n", ret); in ath11k_ahb_probe()
716 ret = ath11k_core_init(ab); in ath11k_ahb_probe()
718 ath11k_err(ab, "failed to init core: %d\n", ret); in ath11k_ahb_probe()
722 ret = ath11k_ahb_config_irq(ab); in ath11k_ahb_probe()
724 ath11k_err(ab, "failed to configure irq: %d\n", ret); in ath11k_ahb_probe()
728 ath11k_ahb_fwreset_from_cold_boot(ab); in ath11k_ahb_probe()
733 ath11k_ce_free_pipes(ab); in ath11k_ahb_probe()
736 ath11k_hal_srng_deinit(ab); in ath11k_ahb_probe()
739 ath11k_core_free(ab); in ath11k_ahb_probe()
747 struct ath11k_base *ab = platform_get_drvdata(pdev); in ath11k_ahb_remove() local
750 if (test_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags)) { in ath11k_ahb_remove()
751 ath11k_ahb_power_down(ab); in ath11k_ahb_remove()
752 ath11k_debugfs_soc_destroy(ab); in ath11k_ahb_remove()
753 ath11k_qmi_deinit_service(ab); in ath11k_ahb_remove()
757 reinit_completion(&ab->driver_recovery); in ath11k_ahb_remove()
759 if (test_bit(ATH11K_FLAG_RECOVERY, &ab->dev_flags)) { in ath11k_ahb_remove()
760 left = wait_for_completion_timeout(&ab->driver_recovery, in ath11k_ahb_remove()
763 ath11k_warn(ab, "failed to receive recovery response completion\n"); in ath11k_ahb_remove()
766 set_bit(ATH11K_FLAG_UNREGISTERING, &ab->dev_flags); in ath11k_ahb_remove()
767 cancel_work_sync(&ab->restart_work); in ath11k_ahb_remove()
769 ath11k_core_deinit(ab); in ath11k_ahb_remove()
771 ath11k_ahb_free_irq(ab); in ath11k_ahb_remove()
772 ath11k_hal_srng_deinit(ab); in ath11k_ahb_remove()
773 ath11k_ce_free_pipes(ab); in ath11k_ahb_remove()
774 ath11k_core_free(ab); in ath11k_ahb_remove()