Lines Matching full:ab

144 int ath11k_pcic_init_msi_config(struct ath11k_base *ab)  in ath11k_pcic_init_msi_config()  argument
152 if (msi_config->hw_rev == ab->hw_rev) in ath11k_pcic_init_msi_config()
157 ath11k_err(ab, "failed to fetch msi config, unsupported hw version: 0x%x\n", in ath11k_pcic_init_msi_config()
158 ab->hw_rev); in ath11k_pcic_init_msi_config()
162 ab->pci.msi.config = msi_config; in ath11k_pcic_init_msi_config()
167 static void __ath11k_pcic_write32(struct ath11k_base *ab, u32 offset, u32 value) in __ath11k_pcic_write32() argument
170 iowrite32(value, ab->mem + offset); in __ath11k_pcic_write32()
172 ab->pci.ops->window_write32(ab, offset, value); in __ath11k_pcic_write32()
175 void ath11k_pcic_write32(struct ath11k_base *ab, u32 offset, u32 value) in ath11k_pcic_write32() argument
183 wakeup_required = test_bit(ATH11K_FLAG_DEVICE_INIT_DONE, &ab->dev_flags) && in ath11k_pcic_write32()
185 if (wakeup_required && ab->pci.ops->wakeup) in ath11k_pcic_write32()
186 ret = ab->pci.ops->wakeup(ab); in ath11k_pcic_write32()
188 __ath11k_pcic_write32(ab, offset, value); in ath11k_pcic_write32()
190 if (wakeup_required && !ret && ab->pci.ops->release) in ath11k_pcic_write32()
191 ab->pci.ops->release(ab); in ath11k_pcic_write32()
195 static u32 __ath11k_pcic_read32(struct ath11k_base *ab, u32 offset) in __ath11k_pcic_read32() argument
200 val = ioread32(ab->mem + offset); in __ath11k_pcic_read32()
202 val = ab->pci.ops->window_read32(ab, offset); in __ath11k_pcic_read32()
207 u32 ath11k_pcic_read32(struct ath11k_base *ab, u32 offset) in ath11k_pcic_read32() argument
216 wakeup_required = test_bit(ATH11K_FLAG_DEVICE_INIT_DONE, &ab->dev_flags) && in ath11k_pcic_read32()
218 if (wakeup_required && ab->pci.ops->wakeup) in ath11k_pcic_read32()
219 ret = ab->pci.ops->wakeup(ab); in ath11k_pcic_read32()
221 val = __ath11k_pcic_read32(ab, offset); in ath11k_pcic_read32()
223 if (wakeup_required && !ret && ab->pci.ops->release) in ath11k_pcic_read32()
224 ab->pci.ops->release(ab); in ath11k_pcic_read32()
230 int ath11k_pcic_read(struct ath11k_base *ab, void *buf, u32 start, u32 end) in ath11k_pcic_read() argument
240 wakeup_required = test_bit(ATH11K_FLAG_DEVICE_INIT_DONE, &ab->dev_flags) && in ath11k_pcic_read()
242 if (wakeup_required && ab->pci.ops->wakeup) { in ath11k_pcic_read()
243 ret = ab->pci.ops->wakeup(ab); in ath11k_pcic_read()
245 ath11k_warn(ab, in ath11k_pcic_read()
259 *data++ = __ath11k_pcic_read32(ab, i); in ath11k_pcic_read()
261 if (wakeup_required && ab->pci.ops->release) in ath11k_pcic_read()
262 ab->pci.ops->release(ab); in ath11k_pcic_read()
268 void ath11k_pcic_get_msi_address(struct ath11k_base *ab, u32 *msi_addr_lo, in ath11k_pcic_get_msi_address() argument
271 *msi_addr_lo = ab->pci.msi.addr_lo; in ath11k_pcic_get_msi_address()
272 *msi_addr_hi = ab->pci.msi.addr_hi; in ath11k_pcic_get_msi_address()
276 int ath11k_pcic_get_user_msi_assignment(struct ath11k_base *ab, char *user_name, in ath11k_pcic_get_user_msi_assignment() argument
280 const struct ath11k_msi_config *msi_config = ab->pci.msi.config; in ath11k_pcic_get_user_msi_assignment()
287 *user_base_data = *base_vector + ab->pci.msi.ep_base_data; in ath11k_pcic_get_user_msi_assignment()
289 ath11k_dbg(ab, ATH11K_DBG_PCI, in ath11k_pcic_get_user_msi_assignment()
298 ath11k_err(ab, "Failed to find MSI assignment for %s!\n", user_name); in ath11k_pcic_get_user_msi_assignment()
304 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
308 for (i = 0, msi_data_idx = 0; i < ab->hw_params.ce_count; i++) { in ath11k_pcic_get_ce_msi_idx()
309 if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR) in ath11k_pcic_get_ce_msi_idx()
321 static void ath11k_pcic_free_ext_irq(struct ath11k_base *ab) in ath11k_pcic_free_ext_irq() argument
326 struct ath11k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i]; in ath11k_pcic_free_ext_irq()
329 free_irq(ab->irq_num[irq_grp->irqs[j]], irq_grp); in ath11k_pcic_free_ext_irq()
336 void ath11k_pcic_free_irq(struct ath11k_base *ab) in ath11k_pcic_free_irq() argument
340 for (i = 0; i < ab->hw_params.ce_count; i++) { in ath11k_pcic_free_irq()
341 if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR) in ath11k_pcic_free_irq()
344 free_irq(ab->irq_num[irq_idx], &ab->ce.ce_pipe[i]); in ath11k_pcic_free_irq()
347 ath11k_pcic_free_ext_irq(ab); in ath11k_pcic_free_irq()
351 static void ath11k_pcic_ce_irq_enable(struct ath11k_base *ab, u16 ce_id) in ath11k_pcic_ce_irq_enable() argument
358 if (!test_bit(ATH11K_FLAG_MULTI_MSI_VECTORS, &ab->dev_flags)) in ath11k_pcic_ce_irq_enable()
362 enable_irq(ab->irq_num[irq_idx]); in ath11k_pcic_ce_irq_enable()
365 static void ath11k_pcic_ce_irq_disable(struct ath11k_base *ab, u16 ce_id) in ath11k_pcic_ce_irq_disable() argument
372 if (!test_bit(ATH11K_FLAG_MULTI_MSI_VECTORS, &ab->dev_flags)) in ath11k_pcic_ce_irq_disable()
376 disable_irq_nosync(ab->irq_num[irq_idx]); in ath11k_pcic_ce_irq_disable()
379 static void ath11k_pcic_ce_irqs_disable(struct ath11k_base *ab) in ath11k_pcic_ce_irqs_disable() argument
383 clear_bit(ATH11K_FLAG_CE_IRQ_ENABLED, &ab->dev_flags); in ath11k_pcic_ce_irqs_disable()
385 for (i = 0; i < ab->hw_params.ce_count; i++) { in ath11k_pcic_ce_irqs_disable()
386 if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR) in ath11k_pcic_ce_irqs_disable()
388 ath11k_pcic_ce_irq_disable(ab, i); in ath11k_pcic_ce_irqs_disable()
392 static void ath11k_pcic_sync_ce_irqs(struct ath11k_base *ab) in ath11k_pcic_sync_ce_irqs() argument
397 for (i = 0; i < ab->hw_params.ce_count; i++) { in ath11k_pcic_sync_ce_irqs()
398 if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR) in ath11k_pcic_sync_ce_irqs()
402 synchronize_irq(ab->irq_num[irq_idx]); in ath11k_pcic_sync_ce_irqs()
411 ath11k_ce_per_engine_service(ce_pipe->ab, ce_pipe->pipe_num); in ath11k_pcic_ce_tasklet()
413 enable_irq(ce_pipe->ab->irq_num[irq_idx]); in ath11k_pcic_ce_tasklet()
419 struct ath11k_base *ab = ce_pipe->ab; in ath11k_pcic_ce_interrupt_handler() local
422 if (!test_bit(ATH11K_FLAG_CE_IRQ_ENABLED, &ab->dev_flags)) in ath11k_pcic_ce_interrupt_handler()
428 disable_irq_nosync(ab->irq_num[irq_idx]); in ath11k_pcic_ce_interrupt_handler()
437 struct ath11k_base *ab = irq_grp->ab; in ath11k_pcic_ext_grp_disable() local
443 if (!test_bit(ATH11K_FLAG_MULTI_MSI_VECTORS, &ab->dev_flags)) in ath11k_pcic_ext_grp_disable()
447 disable_irq_nosync(irq_grp->ab->irq_num[irq_grp->irqs[i]]); in ath11k_pcic_ext_grp_disable()
450 static void __ath11k_pcic_ext_irq_disable(struct ath11k_base *ab) in __ath11k_pcic_ext_irq_disable() argument
454 clear_bit(ATH11K_FLAG_EXT_IRQ_ENABLED, &ab->dev_flags); in __ath11k_pcic_ext_irq_disable()
457 struct ath11k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i]; in __ath11k_pcic_ext_irq_disable()
471 struct ath11k_base *ab = irq_grp->ab; in ath11k_pcic_ext_grp_enable() local
477 if (!test_bit(ATH11K_FLAG_MULTI_MSI_VECTORS, &ab->dev_flags)) in ath11k_pcic_ext_grp_enable()
481 enable_irq(irq_grp->ab->irq_num[irq_grp->irqs[i]]); in ath11k_pcic_ext_grp_enable()
484 void ath11k_pcic_ext_irq_enable(struct ath11k_base *ab) in ath11k_pcic_ext_irq_enable() argument
489 struct ath11k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i]; in ath11k_pcic_ext_irq_enable()
498 set_bit(ATH11K_FLAG_EXT_IRQ_ENABLED, &ab->dev_flags); in ath11k_pcic_ext_irq_enable()
502 static void ath11k_pcic_sync_ext_irqs(struct ath11k_base *ab) in ath11k_pcic_sync_ext_irqs() argument
507 struct ath11k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i]; in ath11k_pcic_sync_ext_irqs()
511 synchronize_irq(ab->irq_num[irq_idx]); in ath11k_pcic_sync_ext_irqs()
516 void ath11k_pcic_ext_irq_disable(struct ath11k_base *ab) in ath11k_pcic_ext_irq_disable() argument
518 __ath11k_pcic_ext_irq_disable(ab); in ath11k_pcic_ext_irq_disable()
519 ath11k_pcic_sync_ext_irqs(ab); in ath11k_pcic_ext_irq_disable()
528 struct ath11k_base *ab = irq_grp->ab; in ath11k_pcic_ext_grp_napi_poll() local
532 work_done = ath11k_dp_service_srng(ab, irq_grp, budget); in ath11k_pcic_ext_grp_napi_poll()
536 enable_irq(irq_grp->ab->irq_num[irq_grp->irqs[i]]); in ath11k_pcic_ext_grp_napi_poll()
548 struct ath11k_base *ab = irq_grp->ab; in ath11k_pcic_ext_interrupt_handler() local
551 if (!test_bit(ATH11K_FLAG_EXT_IRQ_ENABLED, &ab->dev_flags)) in ath11k_pcic_ext_interrupt_handler()
554 ath11k_dbg(irq_grp->ab, ATH11K_DBG_PCI, "ext irq %d\n", irq); in ath11k_pcic_ext_interrupt_handler()
560 disable_irq_nosync(irq_grp->ab->irq_num[irq_grp->irqs[i]]); in ath11k_pcic_ext_interrupt_handler()
568 ath11k_pcic_get_msi_irq(struct ath11k_base *ab, unsigned int vector) in ath11k_pcic_get_msi_irq() argument
570 return ab->pci.ops->get_msi_irq(ab, vector); in ath11k_pcic_get_msi_irq()
573 static int ath11k_pcic_ext_irq_config(struct ath11k_base *ab) in ath11k_pcic_ext_irq_config() argument
580 ret = ath11k_pcic_get_user_msi_assignment(ab, "DP", &num_vectors, in ath11k_pcic_ext_irq_config()
587 if (!test_bit(ATH11K_FLAG_MULTI_MSI_VECTORS, &ab->dev_flags)) in ath11k_pcic_ext_irq_config()
591 irq_grp = &ab->ext_irq_grp[i]; in ath11k_pcic_ext_irq_config()
594 irq_grp->ab = ab; in ath11k_pcic_ext_irq_config()
605 if (ab->hw_params.ring_mask->tx[i] || in ath11k_pcic_ext_irq_config()
606 ab->hw_params.ring_mask->rx[i] || in ath11k_pcic_ext_irq_config()
607 ab->hw_params.ring_mask->rx_err[i] || in ath11k_pcic_ext_irq_config()
608 ab->hw_params.ring_mask->rx_wbm_rel[i] || in ath11k_pcic_ext_irq_config()
609 ab->hw_params.ring_mask->reo_status[i] || in ath11k_pcic_ext_irq_config()
610 ab->hw_params.ring_mask->rxdma2host[i] || in ath11k_pcic_ext_irq_config()
611 ab->hw_params.ring_mask->host2rxdma[i] || in ath11k_pcic_ext_irq_config()
612 ab->hw_params.ring_mask->rx_mon_status[i]) { in ath11k_pcic_ext_irq_config()
622 int irq = ath11k_pcic_get_msi_irq(ab, vector); in ath11k_pcic_ext_irq_config()
629 ab->irq_num[irq_idx] = irq; in ath11k_pcic_ext_irq_config()
631 ath11k_dbg(ab, ATH11K_DBG_PCI, in ath11k_pcic_ext_irq_config()
638 ath11k_err(ab, "failed request irq %d: %d\n", in ath11k_pcic_ext_irq_config()
641 irq_grp = &ab->ext_irq_grp[n]; in ath11k_pcic_ext_irq_config()
656 irq_grp = &ab->ext_irq_grp[n]; in ath11k_pcic_ext_irq_config()
662 int ath11k_pcic_config_irq(struct ath11k_base *ab) in ath11k_pcic_config_irq() argument
672 ret = ath11k_pcic_get_user_msi_assignment(ab, "CE", &msi_data_count, in ath11k_pcic_config_irq()
678 if (!test_bit(ATH11K_FLAG_MULTI_MSI_VECTORS, &ab->dev_flags)) in ath11k_pcic_config_irq()
682 for (i = 0, msi_data_idx = 0; i < ab->hw_params.ce_count; i++) { in ath11k_pcic_config_irq()
683 if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR) in ath11k_pcic_config_irq()
687 irq = ath11k_pcic_get_msi_irq(ab, msi_data); in ath11k_pcic_config_irq()
691 ce_pipe = &ab->ce.ce_pipe[i]; in ath11k_pcic_config_irq()
700 ath11k_err(ab, "failed to request irq %d: %d\n", in ath11k_pcic_config_irq()
705 ab->irq_num[irq_idx] = irq; in ath11k_pcic_config_irq()
708 ath11k_pcic_ce_irq_disable(ab, i); in ath11k_pcic_config_irq()
711 ret = ath11k_pcic_ext_irq_config(ab); in ath11k_pcic_config_irq()
719 void ath11k_pcic_ce_irqs_enable(struct ath11k_base *ab) in ath11k_pcic_ce_irqs_enable() argument
723 set_bit(ATH11K_FLAG_CE_IRQ_ENABLED, &ab->dev_flags); in ath11k_pcic_ce_irqs_enable()
725 for (i = 0; i < ab->hw_params.ce_count; i++) { in ath11k_pcic_ce_irqs_enable()
726 if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR) in ath11k_pcic_ce_irqs_enable()
728 ath11k_pcic_ce_irq_enable(ab, i); in ath11k_pcic_ce_irqs_enable()
733 static void ath11k_pcic_kill_tasklets(struct ath11k_base *ab) in ath11k_pcic_kill_tasklets() argument
737 for (i = 0; i < ab->hw_params.ce_count; i++) { in ath11k_pcic_kill_tasklets()
738 struct ath11k_ce_pipe *ce_pipe = &ab->ce.ce_pipe[i]; in ath11k_pcic_kill_tasklets()
740 if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR) in ath11k_pcic_kill_tasklets()
747 void ath11k_pcic_ce_irq_disable_sync(struct ath11k_base *ab) in ath11k_pcic_ce_irq_disable_sync() argument
749 ath11k_pcic_ce_irqs_disable(ab); in ath11k_pcic_ce_irq_disable_sync()
750 ath11k_pcic_sync_ce_irqs(ab); in ath11k_pcic_ce_irq_disable_sync()
751 ath11k_pcic_kill_tasklets(ab); in ath11k_pcic_ce_irq_disable_sync()
755 void ath11k_pcic_stop(struct ath11k_base *ab) in ath11k_pcic_stop() argument
757 ath11k_pcic_ce_irq_disable_sync(ab); in ath11k_pcic_stop()
758 ath11k_ce_cleanup_pipes(ab); in ath11k_pcic_stop()
762 int ath11k_pcic_start(struct ath11k_base *ab) in ath11k_pcic_start() argument
764 set_bit(ATH11K_FLAG_DEVICE_INIT_DONE, &ab->dev_flags); in ath11k_pcic_start()
766 ath11k_pcic_ce_irqs_enable(ab); in ath11k_pcic_start()
767 ath11k_ce_rx_post_buf(ab); in ath11k_pcic_start()
773 int ath11k_pcic_map_service_to_pipe(struct ath11k_base *ab, u16 service_id, in ath11k_pcic_map_service_to_pipe() argument
780 for (i = 0; i < ab->hw_params.svc_to_ce_map_len; i++) { in ath11k_pcic_map_service_to_pipe()
781 entry = &ab->hw_params.svc_to_ce_map[i]; in ath11k_pcic_map_service_to_pipe()
817 int ath11k_pcic_register_pci_ops(struct ath11k_base *ab, in ath11k_pcic_register_pci_ops() argument
828 ab->pci.ops = pci_ops; in ath11k_pcic_register_pci_ops()
833 void ath11k_pci_enable_ce_irqs_except_wake_irq(struct ath11k_base *ab) in ath11k_pci_enable_ce_irqs_except_wake_irq() argument
837 for (i = 0; i < ab->hw_params.ce_count; i++) { in ath11k_pci_enable_ce_irqs_except_wake_irq()
838 if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR || in ath11k_pci_enable_ce_irqs_except_wake_irq()
841 ath11k_pcic_ce_irq_enable(ab, i); in ath11k_pci_enable_ce_irqs_except_wake_irq()
846 void ath11k_pci_disable_ce_irqs_except_wake_irq(struct ath11k_base *ab) in ath11k_pci_disable_ce_irqs_except_wake_irq() argument
852 for (i = 0; i < ab->hw_params.ce_count; i++) { in ath11k_pci_disable_ce_irqs_except_wake_irq()
853 ce_pipe = &ab->ce.ce_pipe[i]; in ath11k_pci_disable_ce_irqs_except_wake_irq()
856 if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR || in ath11k_pci_disable_ce_irqs_except_wake_irq()
860 disable_irq_nosync(ab->irq_num[irq_idx]); in ath11k_pci_disable_ce_irqs_except_wake_irq()
861 synchronize_irq(ab->irq_num[irq_idx]); in ath11k_pci_disable_ce_irqs_except_wake_irq()