Lines Matching refs:ab

120 int ath11k_pcic_init_msi_config(struct ath11k_base *ab)  in ath11k_pcic_init_msi_config()  argument
128 if (msi_config->hw_rev == ab->hw_rev) in ath11k_pcic_init_msi_config()
133 ath11k_err(ab, "failed to fetch msi config, unsupported hw version: 0x%x\n", in ath11k_pcic_init_msi_config()
134 ab->hw_rev); in ath11k_pcic_init_msi_config()
138 ab->pci.msi.config = msi_config; in ath11k_pcic_init_msi_config()
143 static void __ath11k_pcic_write32(struct ath11k_base *ab, u32 offset, u32 value) in __ath11k_pcic_write32() argument
146 iowrite32(value, ab->mem + offset); in __ath11k_pcic_write32()
148 ab->pci.ops->window_write32(ab, offset, value); in __ath11k_pcic_write32()
151 void ath11k_pcic_write32(struct ath11k_base *ab, u32 offset, u32 value) in ath11k_pcic_write32() argument
159 wakeup_required = test_bit(ATH11K_FLAG_DEVICE_INIT_DONE, &ab->dev_flags) && in ath11k_pcic_write32()
161 if (wakeup_required && ab->pci.ops->wakeup) in ath11k_pcic_write32()
162 ret = ab->pci.ops->wakeup(ab); in ath11k_pcic_write32()
164 __ath11k_pcic_write32(ab, offset, value); in ath11k_pcic_write32()
166 if (wakeup_required && !ret && ab->pci.ops->release) in ath11k_pcic_write32()
167 ab->pci.ops->release(ab); in ath11k_pcic_write32()
171 static u32 __ath11k_pcic_read32(struct ath11k_base *ab, u32 offset) in __ath11k_pcic_read32() argument
176 val = ioread32(ab->mem + offset); in __ath11k_pcic_read32()
178 val = ab->pci.ops->window_read32(ab, offset); in __ath11k_pcic_read32()
183 u32 ath11k_pcic_read32(struct ath11k_base *ab, u32 offset) in ath11k_pcic_read32() argument
192 wakeup_required = test_bit(ATH11K_FLAG_DEVICE_INIT_DONE, &ab->dev_flags) && in ath11k_pcic_read32()
194 if (wakeup_required && ab->pci.ops->wakeup) in ath11k_pcic_read32()
195 ret = ab->pci.ops->wakeup(ab); in ath11k_pcic_read32()
197 val = __ath11k_pcic_read32(ab, offset); in ath11k_pcic_read32()
199 if (wakeup_required && !ret && ab->pci.ops->release) in ath11k_pcic_read32()
200 ab->pci.ops->release(ab); in ath11k_pcic_read32()
206 int ath11k_pcic_read(struct ath11k_base *ab, void *buf, u32 start, u32 end) in ath11k_pcic_read() argument
216 wakeup_required = test_bit(ATH11K_FLAG_DEVICE_INIT_DONE, &ab->dev_flags) && in ath11k_pcic_read()
218 if (wakeup_required && ab->pci.ops->wakeup) { in ath11k_pcic_read()
219 ret = ab->pci.ops->wakeup(ab); in ath11k_pcic_read()
221 ath11k_warn(ab, in ath11k_pcic_read()
235 *data++ = __ath11k_pcic_read32(ab, i); in ath11k_pcic_read()
237 if (wakeup_required && ab->pci.ops->release) in ath11k_pcic_read()
238 ab->pci.ops->release(ab); in ath11k_pcic_read()
244 void ath11k_pcic_get_msi_address(struct ath11k_base *ab, u32 *msi_addr_lo, in ath11k_pcic_get_msi_address() argument
247 *msi_addr_lo = ab->pci.msi.addr_lo; in ath11k_pcic_get_msi_address()
248 *msi_addr_hi = ab->pci.msi.addr_hi; in ath11k_pcic_get_msi_address()
252 int ath11k_pcic_get_user_msi_assignment(struct ath11k_base *ab, char *user_name, in ath11k_pcic_get_user_msi_assignment() argument
256 const struct ath11k_msi_config *msi_config = ab->pci.msi.config; in ath11k_pcic_get_user_msi_assignment()
263 *user_base_data = *base_vector + ab->pci.msi.ep_base_data; in ath11k_pcic_get_user_msi_assignment()
265 ath11k_dbg(ab, ATH11K_DBG_PCI, in ath11k_pcic_get_user_msi_assignment()
274 ath11k_err(ab, "Failed to find MSI assignment for %s!\n", user_name); in ath11k_pcic_get_user_msi_assignment()
280 void ath11k_pcic_get_ce_msi_idx(struct ath11k_base *ab, u32 ce_id, u32 *msi_idx) in ath11k_pcic_get_ce_msi_idx() argument
284 for (i = 0, msi_data_idx = 0; i < ab->hw_params.ce_count; i++) { in ath11k_pcic_get_ce_msi_idx()
285 if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR) in ath11k_pcic_get_ce_msi_idx()
297 static void ath11k_pcic_free_ext_irq(struct ath11k_base *ab) in ath11k_pcic_free_ext_irq() argument
302 struct ath11k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i]; in ath11k_pcic_free_ext_irq()
305 free_irq(ab->irq_num[irq_grp->irqs[j]], irq_grp); in ath11k_pcic_free_ext_irq()
311 void ath11k_pcic_free_irq(struct ath11k_base *ab) in ath11k_pcic_free_irq() argument
315 for (i = 0; i < ab->hw_params.ce_count; i++) { in ath11k_pcic_free_irq()
316 if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR) in ath11k_pcic_free_irq()
319 free_irq(ab->irq_num[irq_idx], &ab->ce.ce_pipe[i]); in ath11k_pcic_free_irq()
322 ath11k_pcic_free_ext_irq(ab); in ath11k_pcic_free_irq()
326 static void ath11k_pcic_ce_irq_enable(struct ath11k_base *ab, u16 ce_id) in ath11k_pcic_ce_irq_enable() argument
333 if (!test_bit(ATH11K_FLAG_MULTI_MSI_VECTORS, &ab->dev_flags)) in ath11k_pcic_ce_irq_enable()
337 enable_irq(ab->irq_num[irq_idx]); in ath11k_pcic_ce_irq_enable()
340 static void ath11k_pcic_ce_irq_disable(struct ath11k_base *ab, u16 ce_id) in ath11k_pcic_ce_irq_disable() argument
347 if (!test_bit(ATH11K_FLAG_MULTI_MSI_VECTORS, &ab->dev_flags)) in ath11k_pcic_ce_irq_disable()
351 disable_irq_nosync(ab->irq_num[irq_idx]); in ath11k_pcic_ce_irq_disable()
354 static void ath11k_pcic_ce_irqs_disable(struct ath11k_base *ab) in ath11k_pcic_ce_irqs_disable() argument
358 clear_bit(ATH11K_FLAG_CE_IRQ_ENABLED, &ab->dev_flags); in ath11k_pcic_ce_irqs_disable()
360 for (i = 0; i < ab->hw_params.ce_count; i++) { in ath11k_pcic_ce_irqs_disable()
361 if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR) in ath11k_pcic_ce_irqs_disable()
363 ath11k_pcic_ce_irq_disable(ab, i); in ath11k_pcic_ce_irqs_disable()
367 static void ath11k_pcic_sync_ce_irqs(struct ath11k_base *ab) in ath11k_pcic_sync_ce_irqs() argument
372 for (i = 0; i < ab->hw_params.ce_count; i++) { in ath11k_pcic_sync_ce_irqs()
373 if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR) in ath11k_pcic_sync_ce_irqs()
377 synchronize_irq(ab->irq_num[irq_idx]); in ath11k_pcic_sync_ce_irqs()
386 ath11k_ce_per_engine_service(ce_pipe->ab, ce_pipe->pipe_num); in ath11k_pcic_ce_tasklet()
388 enable_irq(ce_pipe->ab->irq_num[irq_idx]); in ath11k_pcic_ce_tasklet()
394 struct ath11k_base *ab = ce_pipe->ab; in ath11k_pcic_ce_interrupt_handler() local
397 if (!test_bit(ATH11K_FLAG_CE_IRQ_ENABLED, &ab->dev_flags)) in ath11k_pcic_ce_interrupt_handler()
403 disable_irq_nosync(ab->irq_num[irq_idx]); in ath11k_pcic_ce_interrupt_handler()
412 struct ath11k_base *ab = irq_grp->ab; in ath11k_pcic_ext_grp_disable() local
418 if (!test_bit(ATH11K_FLAG_MULTI_MSI_VECTORS, &ab->dev_flags)) in ath11k_pcic_ext_grp_disable()
422 disable_irq_nosync(irq_grp->ab->irq_num[irq_grp->irqs[i]]); in ath11k_pcic_ext_grp_disable()
446 struct ath11k_base *ab = irq_grp->ab; in ath11k_pcic_ext_grp_enable() local
452 if (!test_bit(ATH11K_FLAG_MULTI_MSI_VECTORS, &ab->dev_flags)) in ath11k_pcic_ext_grp_enable()
456 enable_irq(irq_grp->ab->irq_num[irq_grp->irqs[i]]); in ath11k_pcic_ext_grp_enable()
459 void ath11k_pcic_ext_irq_enable(struct ath11k_base *ab) in ath11k_pcic_ext_irq_enable() argument
464 struct ath11k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i]; in ath11k_pcic_ext_irq_enable()
473 set_bit(ATH11K_FLAG_EXT_IRQ_ENABLED, &ab->dev_flags); in ath11k_pcic_ext_irq_enable()
477 static void ath11k_pcic_sync_ext_irqs(struct ath11k_base *ab) in ath11k_pcic_sync_ext_irqs() argument
482 struct ath11k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i]; in ath11k_pcic_sync_ext_irqs()
486 synchronize_irq(ab->irq_num[irq_idx]); in ath11k_pcic_sync_ext_irqs()
491 void ath11k_pcic_ext_irq_disable(struct ath11k_base *ab) in ath11k_pcic_ext_irq_disable() argument
493 __ath11k_pcic_ext_irq_disable(ab); in ath11k_pcic_ext_irq_disable()
494 ath11k_pcic_sync_ext_irqs(ab); in ath11k_pcic_ext_irq_disable()
503 struct ath11k_base *ab = irq_grp->ab; in ath11k_pcic_ext_grp_napi_poll() local
507 work_done = ath11k_dp_service_srng(ab, irq_grp, budget); in ath11k_pcic_ext_grp_napi_poll()
511 enable_irq(irq_grp->ab->irq_num[irq_grp->irqs[i]]); in ath11k_pcic_ext_grp_napi_poll()
523 struct ath11k_base *ab = irq_grp->ab; in ath11k_pcic_ext_interrupt_handler() local
526 if (!test_bit(ATH11K_FLAG_EXT_IRQ_ENABLED, &ab->dev_flags)) in ath11k_pcic_ext_interrupt_handler()
529 ath11k_dbg(irq_grp->ab, ATH11K_DBG_PCI, "ext irq %d\n", irq); in ath11k_pcic_ext_interrupt_handler()
535 disable_irq_nosync(irq_grp->ab->irq_num[irq_grp->irqs[i]]); in ath11k_pcic_ext_interrupt_handler()
543 ath11k_pcic_get_msi_irq(struct ath11k_base *ab, unsigned int vector) in ath11k_pcic_get_msi_irq() argument
545 return ab->pci.ops->get_msi_irq(ab, vector); in ath11k_pcic_get_msi_irq()
548 static int ath11k_pcic_ext_irq_config(struct ath11k_base *ab) in ath11k_pcic_ext_irq_config() argument
554 ret = ath11k_pcic_get_user_msi_assignment(ab, "DP", &num_vectors, in ath11k_pcic_ext_irq_config()
561 if (!test_bit(ATH11K_FLAG_MULTI_MSI_VECTORS, &ab->dev_flags)) in ath11k_pcic_ext_irq_config()
565 struct ath11k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i]; in ath11k_pcic_ext_irq_config()
568 irq_grp->ab = ab; in ath11k_pcic_ext_irq_config()
574 if (ab->hw_params.ring_mask->tx[i] || in ath11k_pcic_ext_irq_config()
575 ab->hw_params.ring_mask->rx[i] || in ath11k_pcic_ext_irq_config()
576 ab->hw_params.ring_mask->rx_err[i] || in ath11k_pcic_ext_irq_config()
577 ab->hw_params.ring_mask->rx_wbm_rel[i] || in ath11k_pcic_ext_irq_config()
578 ab->hw_params.ring_mask->reo_status[i] || in ath11k_pcic_ext_irq_config()
579 ab->hw_params.ring_mask->rxdma2host[i] || in ath11k_pcic_ext_irq_config()
580 ab->hw_params.ring_mask->host2rxdma[i] || in ath11k_pcic_ext_irq_config()
581 ab->hw_params.ring_mask->rx_mon_status[i]) { in ath11k_pcic_ext_irq_config()
591 int irq = ath11k_pcic_get_msi_irq(ab, vector); in ath11k_pcic_ext_irq_config()
596 ab->irq_num[irq_idx] = irq; in ath11k_pcic_ext_irq_config()
598 ath11k_dbg(ab, ATH11K_DBG_PCI, in ath11k_pcic_ext_irq_config()
605 ath11k_err(ab, "failed request irq %d: %d\n", in ath11k_pcic_ext_irq_config()
616 int ath11k_pcic_config_irq(struct ath11k_base *ab) in ath11k_pcic_config_irq() argument
626 ret = ath11k_pcic_get_user_msi_assignment(ab, "CE", &msi_data_count, in ath11k_pcic_config_irq()
632 if (!test_bit(ATH11K_FLAG_MULTI_MSI_VECTORS, &ab->dev_flags)) in ath11k_pcic_config_irq()
636 for (i = 0, msi_data_idx = 0; i < ab->hw_params.ce_count; i++) { in ath11k_pcic_config_irq()
637 if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR) in ath11k_pcic_config_irq()
641 irq = ath11k_pcic_get_msi_irq(ab, msi_data); in ath11k_pcic_config_irq()
645 ce_pipe = &ab->ce.ce_pipe[i]; in ath11k_pcic_config_irq()
654 ath11k_err(ab, "failed to request irq %d: %d\n", in ath11k_pcic_config_irq()
659 ab->irq_num[irq_idx] = irq; in ath11k_pcic_config_irq()
662 ath11k_pcic_ce_irq_disable(ab, i); in ath11k_pcic_config_irq()
665 ret = ath11k_pcic_ext_irq_config(ab); in ath11k_pcic_config_irq()
673 void ath11k_pcic_ce_irqs_enable(struct ath11k_base *ab) in ath11k_pcic_ce_irqs_enable() argument
677 set_bit(ATH11K_FLAG_CE_IRQ_ENABLED, &ab->dev_flags); in ath11k_pcic_ce_irqs_enable()
679 for (i = 0; i < ab->hw_params.ce_count; i++) { in ath11k_pcic_ce_irqs_enable()
680 if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR) in ath11k_pcic_ce_irqs_enable()
682 ath11k_pcic_ce_irq_enable(ab, i); in ath11k_pcic_ce_irqs_enable()
687 static void ath11k_pcic_kill_tasklets(struct ath11k_base *ab) in ath11k_pcic_kill_tasklets() argument
691 for (i = 0; i < ab->hw_params.ce_count; i++) { in ath11k_pcic_kill_tasklets()
692 struct ath11k_ce_pipe *ce_pipe = &ab->ce.ce_pipe[i]; in ath11k_pcic_kill_tasklets()
694 if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR) in ath11k_pcic_kill_tasklets()
701 void ath11k_pcic_ce_irq_disable_sync(struct ath11k_base *ab) in ath11k_pcic_ce_irq_disable_sync() argument
703 ath11k_pcic_ce_irqs_disable(ab); in ath11k_pcic_ce_irq_disable_sync()
704 ath11k_pcic_sync_ce_irqs(ab); in ath11k_pcic_ce_irq_disable_sync()
705 ath11k_pcic_kill_tasklets(ab); in ath11k_pcic_ce_irq_disable_sync()
709 void ath11k_pcic_stop(struct ath11k_base *ab) in ath11k_pcic_stop() argument
711 ath11k_pcic_ce_irq_disable_sync(ab); in ath11k_pcic_stop()
712 ath11k_ce_cleanup_pipes(ab); in ath11k_pcic_stop()
716 int ath11k_pcic_start(struct ath11k_base *ab) in ath11k_pcic_start() argument
718 set_bit(ATH11K_FLAG_DEVICE_INIT_DONE, &ab->dev_flags); in ath11k_pcic_start()
720 ath11k_pcic_ce_irqs_enable(ab); in ath11k_pcic_start()
721 ath11k_ce_rx_post_buf(ab); in ath11k_pcic_start()
727 int ath11k_pcic_map_service_to_pipe(struct ath11k_base *ab, u16 service_id, in ath11k_pcic_map_service_to_pipe() argument
734 for (i = 0; i < ab->hw_params.svc_to_ce_map_len; i++) { in ath11k_pcic_map_service_to_pipe()
735 entry = &ab->hw_params.svc_to_ce_map[i]; in ath11k_pcic_map_service_to_pipe()
771 int ath11k_pcic_register_pci_ops(struct ath11k_base *ab, in ath11k_pcic_register_pci_ops() argument
782 ab->pci.ops = pci_ops; in ath11k_pcic_register_pci_ops()
787 void ath11k_pci_enable_ce_irqs_except_wake_irq(struct ath11k_base *ab) in ath11k_pci_enable_ce_irqs_except_wake_irq() argument
791 for (i = 0; i < ab->hw_params.ce_count; i++) { in ath11k_pci_enable_ce_irqs_except_wake_irq()
792 if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR || in ath11k_pci_enable_ce_irqs_except_wake_irq()
795 ath11k_pcic_ce_irq_enable(ab, i); in ath11k_pci_enable_ce_irqs_except_wake_irq()
800 void ath11k_pci_disable_ce_irqs_except_wake_irq(struct ath11k_base *ab) in ath11k_pci_disable_ce_irqs_except_wake_irq() argument
806 for (i = 0; i < ab->hw_params.ce_count; i++) { in ath11k_pci_disable_ce_irqs_except_wake_irq()
807 ce_pipe = &ab->ce.ce_pipe[i]; in ath11k_pci_disable_ce_irqs_except_wake_irq()
810 if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR || in ath11k_pci_disable_ce_irqs_except_wake_irq()
814 disable_irq_nosync(ab->irq_num[irq_idx]); in ath11k_pci_disable_ce_irqs_except_wake_irq()
815 synchronize_irq(ab->irq_num[irq_idx]); in ath11k_pci_disable_ce_irqs_except_wake_irq()