ath11k: process both lmac rings for QCA6390
authorCarl Huang <cjhuang@codeaurora.org>
Mon, 17 Aug 2020 10:31:54 +0000 (13:31 +0300)
committerKalle Valo <kvalo@codeaurora.org>
Tue, 18 Aug 2020 09:47:04 +0000 (12:47 +0300)
For QCA6390, the num_radios is 1 but it needs to process 2 lmac rings.
So use NUM_RXDMA_PER_PDEV to do another loop.

Tested-on: QCA6390 hw2.0 PCI WLAN.HST.1.0.1-01740-QCAHSTSWPLZ_V2_TO_X86-1
Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.1.0.1-01238-QCAHKSWPL_SILICONZ-2

Signed-off-by: Carl Huang <cjhuang@codeaurora.org>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/1597555891-26112-8-git-send-email-kvalo@codeaurora.org
drivers/net/wireless/ath/ath11k/dp.c

index fb82c4f..b0ea595 100644 (file)
@@ -731,7 +731,7 @@ int ath11k_dp_service_srng(struct ath11k_base *ab,
        struct napi_struct *napi = &irq_grp->napi;
        int grp_id = irq_grp->grp_id;
        int work_done = 0;
-       int i = 0;
+       int i = 0, j;
        int tot_work_done = 0;
 
        while (ab->hw_params.ring_mask->tx[grp_id] >> i) {
@@ -770,17 +770,23 @@ int ath11k_dp_service_srng(struct ath11k_base *ab,
        }
 
        if (ab->hw_params.ring_mask->rx_mon_status[grp_id]) {
-               for (i = 0; i <  ab->num_radios; i++) {
-                       if (ab->hw_params.ring_mask->rx_mon_status[grp_id] & BIT(i)) {
-                               work_done =
-                               ath11k_dp_rx_process_mon_rings(ab,
-                                                              i, napi,
-                                                              budget);
-                               budget -= work_done;
-                               tot_work_done += work_done;
+               for (i = 0; i < ab->num_radios; i++) {
+                       for (j = 0; j < ab->hw_params.num_rxmda_per_pdev; j++) {
+                               int id = i * ab->hw_params.num_rxmda_per_pdev + j;
+
+                               if (ab->hw_params.ring_mask->rx_mon_status[grp_id] &
+                                       BIT(id)) {
+                                       work_done =
+                                       ath11k_dp_rx_process_mon_rings(ab,
+                                                                      id,
+                                                                      napi, budget);
+                                       budget -= work_done;
+                                       tot_work_done += work_done;
+
+                                       if (budget <= 0)
+                                               goto done;
+                               }
                        }
-                       if (budget <= 0)
-                               goto done;
                }
        }
 
@@ -788,22 +794,27 @@ int ath11k_dp_service_srng(struct ath11k_base *ab,
                ath11k_dp_process_reo_status(ab);
 
        for (i = 0; i < ab->num_radios; i++) {
-               if (ab->hw_params.ring_mask->rxdma2host[grp_id] & BIT(i)) {
-                       work_done = ath11k_dp_process_rxdma_err(ab, i, budget);
-                       budget -= work_done;
-                       tot_work_done += work_done;
-               }
+               for (j = 0; j < ab->hw_params.num_rxmda_per_pdev; j++) {
+                       int id = i * ab->hw_params.num_rxmda_per_pdev + j;
 
-               if (budget <= 0)
-                       goto done;
+                       if (ab->hw_params.ring_mask->rxdma2host[grp_id] & BIT(id)) {
+                               work_done = ath11k_dp_process_rxdma_err(ab, id, budget);
+                               budget -= work_done;
+                               tot_work_done += work_done;
+                       }
 
-               if (ab->hw_params.ring_mask->host2rxdma[grp_id] & BIT(i)) {
-                       struct ath11k_pdev_dp *dp = &ab->pdevs[i].ar->dp;
-                       struct dp_rxdma_ring *rx_ring = &dp->rx_refill_buf_ring;
+                       if (budget <= 0)
+                               goto done;
+
+                       if (ab->hw_params.ring_mask->host2rxdma[grp_id] & BIT(id)) {
+                               struct ath11k *ar = ath11k_ab_to_ar(ab, id);
+                               struct ath11k_pdev_dp *dp = &ar->dp;
+                               struct dp_rxdma_ring *rx_ring = &dp->rx_refill_buf_ring;
 
-                       ath11k_dp_rxbufs_replenish(ab, i, rx_ring, 0,
-                                                  HAL_RX_BUF_RBM_SW3_BM,
-                                                  GFP_ATOMIC);
+                               ath11k_dp_rxbufs_replenish(ab, id, rx_ring, 0,
+                                                          HAL_RX_BUF_RBM_SW3_BM,
+                                                          GFP_ATOMIC);
+                       }
                }
        }
        /* TODO: Implement handler for other interrupts */