Lines Matching full:ab
142 int ath11k_pcic_init_msi_config(struct ath11k_base *ab) in ath11k_pcic_init_msi_config() argument
150 if (msi_config->hw_rev == ab->hw_rev) in ath11k_pcic_init_msi_config()
155 ath11k_err(ab, "failed to fetch msi config, unsupported hw version: 0x%x\n", in ath11k_pcic_init_msi_config()
156 ab->hw_rev); in ath11k_pcic_init_msi_config()
160 ab->pci.msi.config = msi_config; in ath11k_pcic_init_msi_config()
165 static void __ath11k_pcic_write32(struct ath11k_base *ab, u32 offset, u32 value) in __ath11k_pcic_write32() argument
168 iowrite32(value, ab->mem + offset); in __ath11k_pcic_write32()
170 ab->pci.ops->window_write32(ab, offset, value); in __ath11k_pcic_write32()
173 void ath11k_pcic_write32(struct ath11k_base *ab, u32 offset, u32 value) in ath11k_pcic_write32() argument
181 wakeup_required = test_bit(ATH11K_FLAG_DEVICE_INIT_DONE, &ab->dev_flags) && in ath11k_pcic_write32()
183 if (wakeup_required && ab->pci.ops->wakeup) in ath11k_pcic_write32()
184 ret = ab->pci.ops->wakeup(ab); in ath11k_pcic_write32()
186 __ath11k_pcic_write32(ab, offset, value); in ath11k_pcic_write32()
188 if (wakeup_required && !ret && ab->pci.ops->release) in ath11k_pcic_write32()
189 ab->pci.ops->release(ab); in ath11k_pcic_write32()
193 static u32 __ath11k_pcic_read32(struct ath11k_base *ab, u32 offset) in __ath11k_pcic_read32() argument
198 val = ioread32(ab->mem + offset); in __ath11k_pcic_read32()
200 val = ab->pci.ops->window_read32(ab, offset); in __ath11k_pcic_read32()
205 u32 ath11k_pcic_read32(struct ath11k_base *ab, u32 offset) in ath11k_pcic_read32() argument
214 wakeup_required = test_bit(ATH11K_FLAG_DEVICE_INIT_DONE, &ab->dev_flags) && in ath11k_pcic_read32()
216 if (wakeup_required && ab->pci.ops->wakeup) in ath11k_pcic_read32()
217 ret = ab->pci.ops->wakeup(ab); in ath11k_pcic_read32()
219 val = __ath11k_pcic_read32(ab, offset); in ath11k_pcic_read32()
221 if (wakeup_required && !ret && ab->pci.ops->release) in ath11k_pcic_read32()
222 ab->pci.ops->release(ab); in ath11k_pcic_read32()
228 int ath11k_pcic_read(struct ath11k_base *ab, void *buf, u32 start, u32 end) in ath11k_pcic_read() argument
238 wakeup_required = test_bit(ATH11K_FLAG_DEVICE_INIT_DONE, &ab->dev_flags) && in ath11k_pcic_read()
240 if (wakeup_required && ab->pci.ops->wakeup) { in ath11k_pcic_read()
241 ret = ab->pci.ops->wakeup(ab); in ath11k_pcic_read()
243 ath11k_warn(ab, in ath11k_pcic_read()
257 *data++ = __ath11k_pcic_read32(ab, i); in ath11k_pcic_read()
259 if (wakeup_required && ab->pci.ops->release) in ath11k_pcic_read()
260 ab->pci.ops->release(ab); in ath11k_pcic_read()
266 void ath11k_pcic_get_msi_address(struct ath11k_base *ab, u32 *msi_addr_lo, in ath11k_pcic_get_msi_address() argument
269 *msi_addr_lo = ab->pci.msi.addr_lo; in ath11k_pcic_get_msi_address()
270 *msi_addr_hi = ab->pci.msi.addr_hi; in ath11k_pcic_get_msi_address()
274 int ath11k_pcic_get_user_msi_assignment(struct ath11k_base *ab, char *user_name, in ath11k_pcic_get_user_msi_assignment() argument
278 const struct ath11k_msi_config *msi_config = ab->pci.msi.config; in ath11k_pcic_get_user_msi_assignment()
285 *user_base_data = *base_vector + ab->pci.msi.ep_base_data; in ath11k_pcic_get_user_msi_assignment()
287 ath11k_dbg(ab, ATH11K_DBG_PCI, in ath11k_pcic_get_user_msi_assignment()
296 ath11k_err(ab, "Failed to find MSI assignment for %s!\n", user_name); in ath11k_pcic_get_user_msi_assignment()
302 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
306 for (i = 0, msi_data_idx = 0; i < ab->hw_params.ce_count; i++) { in ath11k_pcic_get_ce_msi_idx()
307 if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR) in ath11k_pcic_get_ce_msi_idx()
319 static void ath11k_pcic_free_ext_irq(struct ath11k_base *ab) in ath11k_pcic_free_ext_irq() argument
324 struct ath11k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i]; in ath11k_pcic_free_ext_irq()
327 free_irq(ab->irq_num[irq_grp->irqs[j]], irq_grp); in ath11k_pcic_free_ext_irq()
334 void ath11k_pcic_free_irq(struct ath11k_base *ab) in ath11k_pcic_free_irq() argument
338 for (i = 0; i < ab->hw_params.ce_count; i++) { in ath11k_pcic_free_irq()
339 if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR) in ath11k_pcic_free_irq()
342 free_irq(ab->irq_num[irq_idx], &ab->ce.ce_pipe[i]); in ath11k_pcic_free_irq()
345 ath11k_pcic_free_ext_irq(ab); in ath11k_pcic_free_irq()
349 static void ath11k_pcic_ce_irq_enable(struct ath11k_base *ab, u16 ce_id) in ath11k_pcic_ce_irq_enable() argument
356 if (!test_bit(ATH11K_FLAG_MULTI_MSI_VECTORS, &ab->dev_flags)) in ath11k_pcic_ce_irq_enable()
360 enable_irq(ab->irq_num[irq_idx]); in ath11k_pcic_ce_irq_enable()
363 static void ath11k_pcic_ce_irq_disable(struct ath11k_base *ab, u16 ce_id) in ath11k_pcic_ce_irq_disable() argument
370 if (!test_bit(ATH11K_FLAG_MULTI_MSI_VECTORS, &ab->dev_flags)) in ath11k_pcic_ce_irq_disable()
374 disable_irq_nosync(ab->irq_num[irq_idx]); in ath11k_pcic_ce_irq_disable()
377 static void ath11k_pcic_ce_irqs_disable(struct ath11k_base *ab) in ath11k_pcic_ce_irqs_disable() argument
381 clear_bit(ATH11K_FLAG_CE_IRQ_ENABLED, &ab->dev_flags); in ath11k_pcic_ce_irqs_disable()
383 for (i = 0; i < ab->hw_params.ce_count; i++) { in ath11k_pcic_ce_irqs_disable()
384 if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR) in ath11k_pcic_ce_irqs_disable()
386 ath11k_pcic_ce_irq_disable(ab, i); in ath11k_pcic_ce_irqs_disable()
390 static void ath11k_pcic_sync_ce_irqs(struct ath11k_base *ab) in ath11k_pcic_sync_ce_irqs() argument
395 for (i = 0; i < ab->hw_params.ce_count; i++) { in ath11k_pcic_sync_ce_irqs()
396 if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR) in ath11k_pcic_sync_ce_irqs()
400 synchronize_irq(ab->irq_num[irq_idx]); in ath11k_pcic_sync_ce_irqs()
409 ath11k_ce_per_engine_service(ce_pipe->ab, ce_pipe->pipe_num); in ath11k_pcic_ce_tasklet()
411 enable_irq(ce_pipe->ab->irq_num[irq_idx]); in ath11k_pcic_ce_tasklet()
417 struct ath11k_base *ab = ce_pipe->ab; in ath11k_pcic_ce_interrupt_handler() local
420 if (!test_bit(ATH11K_FLAG_CE_IRQ_ENABLED, &ab->dev_flags)) in ath11k_pcic_ce_interrupt_handler()
426 disable_irq_nosync(ab->irq_num[irq_idx]); in ath11k_pcic_ce_interrupt_handler()
435 struct ath11k_base *ab = irq_grp->ab; in ath11k_pcic_ext_grp_disable() local
441 if (!test_bit(ATH11K_FLAG_MULTI_MSI_VECTORS, &ab->dev_flags)) in ath11k_pcic_ext_grp_disable()
445 disable_irq_nosync(irq_grp->ab->irq_num[irq_grp->irqs[i]]); in ath11k_pcic_ext_grp_disable()
448 static void __ath11k_pcic_ext_irq_disable(struct ath11k_base *ab) in __ath11k_pcic_ext_irq_disable() argument
452 clear_bit(ATH11K_FLAG_EXT_IRQ_ENABLED, &ab->dev_flags); in __ath11k_pcic_ext_irq_disable()
455 struct ath11k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i]; in __ath11k_pcic_ext_irq_disable()
469 struct ath11k_base *ab = irq_grp->ab; in ath11k_pcic_ext_grp_enable() local
475 if (!test_bit(ATH11K_FLAG_MULTI_MSI_VECTORS, &ab->dev_flags)) in ath11k_pcic_ext_grp_enable()
479 enable_irq(irq_grp->ab->irq_num[irq_grp->irqs[i]]); in ath11k_pcic_ext_grp_enable()
482 void ath11k_pcic_ext_irq_enable(struct ath11k_base *ab) in ath11k_pcic_ext_irq_enable() argument
487 struct ath11k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i]; in ath11k_pcic_ext_irq_enable()
496 set_bit(ATH11K_FLAG_EXT_IRQ_ENABLED, &ab->dev_flags); in ath11k_pcic_ext_irq_enable()
500 static void ath11k_pcic_sync_ext_irqs(struct ath11k_base *ab) in ath11k_pcic_sync_ext_irqs() argument
505 struct ath11k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i]; in ath11k_pcic_sync_ext_irqs()
509 synchronize_irq(ab->irq_num[irq_idx]); in ath11k_pcic_sync_ext_irqs()
514 void ath11k_pcic_ext_irq_disable(struct ath11k_base *ab) in ath11k_pcic_ext_irq_disable() argument
516 __ath11k_pcic_ext_irq_disable(ab); in ath11k_pcic_ext_irq_disable()
517 ath11k_pcic_sync_ext_irqs(ab); in ath11k_pcic_ext_irq_disable()
526 struct ath11k_base *ab = irq_grp->ab; in ath11k_pcic_ext_grp_napi_poll() local
530 work_done = ath11k_dp_service_srng(ab, irq_grp, budget); in ath11k_pcic_ext_grp_napi_poll()
534 enable_irq(irq_grp->ab->irq_num[irq_grp->irqs[i]]); in ath11k_pcic_ext_grp_napi_poll()
546 struct ath11k_base *ab = irq_grp->ab; in ath11k_pcic_ext_interrupt_handler() local
549 if (!test_bit(ATH11K_FLAG_EXT_IRQ_ENABLED, &ab->dev_flags)) in ath11k_pcic_ext_interrupt_handler()
552 ath11k_dbg(irq_grp->ab, ATH11K_DBG_PCI, "ext irq %d\n", irq); in ath11k_pcic_ext_interrupt_handler()
558 disable_irq_nosync(irq_grp->ab->irq_num[irq_grp->irqs[i]]); in ath11k_pcic_ext_interrupt_handler()
566 ath11k_pcic_get_msi_irq(struct ath11k_base *ab, unsigned int vector) in ath11k_pcic_get_msi_irq() argument
568 return ab->pci.ops->get_msi_irq(ab, vector); in ath11k_pcic_get_msi_irq()
571 static int ath11k_pcic_ext_irq_config(struct ath11k_base *ab) in ath11k_pcic_ext_irq_config() argument
578 ret = ath11k_pcic_get_user_msi_assignment(ab, "DP", &num_vectors, in ath11k_pcic_ext_irq_config()
585 if (!test_bit(ATH11K_FLAG_MULTI_MSI_VECTORS, &ab->dev_flags)) in ath11k_pcic_ext_irq_config()
589 irq_grp = &ab->ext_irq_grp[i]; in ath11k_pcic_ext_irq_config()
592 irq_grp->ab = ab; in ath11k_pcic_ext_irq_config()
603 if (ab->hw_params.ring_mask->tx[i] || in ath11k_pcic_ext_irq_config()
604 ab->hw_params.ring_mask->rx[i] || in ath11k_pcic_ext_irq_config()
605 ab->hw_params.ring_mask->rx_err[i] || in ath11k_pcic_ext_irq_config()
606 ab->hw_params.ring_mask->rx_wbm_rel[i] || in ath11k_pcic_ext_irq_config()
607 ab->hw_params.ring_mask->reo_status[i] || in ath11k_pcic_ext_irq_config()
608 ab->hw_params.ring_mask->rxdma2host[i] || in ath11k_pcic_ext_irq_config()
609 ab->hw_params.ring_mask->host2rxdma[i] || in ath11k_pcic_ext_irq_config()
610 ab->hw_params.ring_mask->rx_mon_status[i]) { in ath11k_pcic_ext_irq_config()
620 int irq = ath11k_pcic_get_msi_irq(ab, vector); in ath11k_pcic_ext_irq_config()
627 ab->irq_num[irq_idx] = irq; in ath11k_pcic_ext_irq_config()
629 ath11k_dbg(ab, ATH11K_DBG_PCI, in ath11k_pcic_ext_irq_config()
636 ath11k_err(ab, "failed request irq %d: %d\n", in ath11k_pcic_ext_irq_config()
639 irq_grp = &ab->ext_irq_grp[n]; in ath11k_pcic_ext_irq_config()
654 irq_grp = &ab->ext_irq_grp[n]; in ath11k_pcic_ext_irq_config()
660 int ath11k_pcic_config_irq(struct ath11k_base *ab) in ath11k_pcic_config_irq() argument
670 ret = ath11k_pcic_get_user_msi_assignment(ab, "CE", &msi_data_count, in ath11k_pcic_config_irq()
676 if (!test_bit(ATH11K_FLAG_MULTI_MSI_VECTORS, &ab->dev_flags)) in ath11k_pcic_config_irq()
680 for (i = 0, msi_data_idx = 0; i < ab->hw_params.ce_count; i++) { in ath11k_pcic_config_irq()
681 if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR) in ath11k_pcic_config_irq()
685 irq = ath11k_pcic_get_msi_irq(ab, msi_data); in ath11k_pcic_config_irq()
689 ce_pipe = &ab->ce.ce_pipe[i]; in ath11k_pcic_config_irq()
698 ath11k_err(ab, "failed to request irq %d: %d\n", in ath11k_pcic_config_irq()
703 ab->irq_num[irq_idx] = irq; in ath11k_pcic_config_irq()
706 ath11k_pcic_ce_irq_disable(ab, i); in ath11k_pcic_config_irq()
709 ret = ath11k_pcic_ext_irq_config(ab); in ath11k_pcic_config_irq()
717 void ath11k_pcic_ce_irqs_enable(struct ath11k_base *ab) in ath11k_pcic_ce_irqs_enable() argument
721 set_bit(ATH11K_FLAG_CE_IRQ_ENABLED, &ab->dev_flags); in ath11k_pcic_ce_irqs_enable()
723 for (i = 0; i < ab->hw_params.ce_count; i++) { in ath11k_pcic_ce_irqs_enable()
724 if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR) in ath11k_pcic_ce_irqs_enable()
726 ath11k_pcic_ce_irq_enable(ab, i); in ath11k_pcic_ce_irqs_enable()
731 static void ath11k_pcic_kill_tasklets(struct ath11k_base *ab) in ath11k_pcic_kill_tasklets() argument
735 for (i = 0; i < ab->hw_params.ce_count; i++) { in ath11k_pcic_kill_tasklets()
736 struct ath11k_ce_pipe *ce_pipe = &ab->ce.ce_pipe[i]; in ath11k_pcic_kill_tasklets()
738 if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR) in ath11k_pcic_kill_tasklets()
745 void ath11k_pcic_ce_irq_disable_sync(struct ath11k_base *ab) in ath11k_pcic_ce_irq_disable_sync() argument
747 ath11k_pcic_ce_irqs_disable(ab); in ath11k_pcic_ce_irq_disable_sync()
748 ath11k_pcic_sync_ce_irqs(ab); in ath11k_pcic_ce_irq_disable_sync()
749 ath11k_pcic_kill_tasklets(ab); in ath11k_pcic_ce_irq_disable_sync()
753 void ath11k_pcic_stop(struct ath11k_base *ab) in ath11k_pcic_stop() argument
755 ath11k_pcic_ce_irq_disable_sync(ab); in ath11k_pcic_stop()
756 ath11k_ce_cleanup_pipes(ab); in ath11k_pcic_stop()
760 int ath11k_pcic_start(struct ath11k_base *ab) in ath11k_pcic_start() argument
762 set_bit(ATH11K_FLAG_DEVICE_INIT_DONE, &ab->dev_flags); in ath11k_pcic_start()
764 ath11k_pcic_ce_irqs_enable(ab); in ath11k_pcic_start()
765 ath11k_ce_rx_post_buf(ab); in ath11k_pcic_start()
771 int ath11k_pcic_map_service_to_pipe(struct ath11k_base *ab, u16 service_id, in ath11k_pcic_map_service_to_pipe() argument
778 for (i = 0; i < ab->hw_params.svc_to_ce_map_len; i++) { in ath11k_pcic_map_service_to_pipe()
779 entry = &ab->hw_params.svc_to_ce_map[i]; in ath11k_pcic_map_service_to_pipe()
815 int ath11k_pcic_register_pci_ops(struct ath11k_base *ab, in ath11k_pcic_register_pci_ops() argument
826 ab->pci.ops = pci_ops; in ath11k_pcic_register_pci_ops()
831 void ath11k_pci_enable_ce_irqs_except_wake_irq(struct ath11k_base *ab) in ath11k_pci_enable_ce_irqs_except_wake_irq() argument
835 for (i = 0; i < ab->hw_params.ce_count; i++) { in ath11k_pci_enable_ce_irqs_except_wake_irq()
836 if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR || in ath11k_pci_enable_ce_irqs_except_wake_irq()
839 ath11k_pcic_ce_irq_enable(ab, i); in ath11k_pci_enable_ce_irqs_except_wake_irq()
844 void ath11k_pci_disable_ce_irqs_except_wake_irq(struct ath11k_base *ab) in ath11k_pci_disable_ce_irqs_except_wake_irq() argument
850 for (i = 0; i < ab->hw_params.ce_count; i++) { in ath11k_pci_disable_ce_irqs_except_wake_irq()
851 ce_pipe = &ab->ce.ce_pipe[i]; in ath11k_pci_disable_ce_irqs_except_wake_irq()
854 if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR || in ath11k_pci_disable_ce_irqs_except_wake_irq()
858 disable_irq_nosync(ab->irq_num[irq_idx]); in ath11k_pci_disable_ce_irqs_except_wake_irq()
859 synchronize_irq(ab->irq_num[irq_idx]); in ath11k_pci_disable_ce_irqs_except_wake_irq()