]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: ath12k: Avoid code duplication in monitor ring processing
authorP Praneesh <quic_ppranees@quicinc.com>
Mon, 23 Dec 2024 06:01:22 +0000 (11:31 +0530)
committerJeff Johnson <jeff.johnson@oss.qualcomm.com>
Sun, 26 Jan 2025 18:41:29 +0000 (10:41 -0800)
The current implementation processes the monitor destination ring using
two separate functions, ath12k_dp_mon_srng_process() for standalone
monitor mode and ath12k_dp_mon_rx_process_stats() for statistics.
However, both functions contain same code which performs monitor ring
reaping and skb data processing. To eliminate redundancy, remove the
duplicate code and use a single function to handle both the cases.

Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1
Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3

Signed-off-by: P Praneesh <quic_ppranees@quicinc.com>
Link: https://patch.msgid.link/20241223060132.3506372-5-quic_ppranees@quicinc.com
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
drivers/net/wireless/ath/ath12k/dp_mon.c
drivers/net/wireless/ath/ath12k/dp_mon.h

index 53f8e8f8959ad6daf7ef135c00c9f9c05501b344..08f92e74feded0bf0ab71269720079a00c873e57 100644 (file)
@@ -2000,116 +2000,6 @@ ath12k_dp_mon_tx_parse_mon_status(struct ath12k *ar,
        return tlv_status;
 }
 
-int ath12k_dp_mon_srng_process(struct ath12k *ar, int *budget,
-                              enum dp_monitor_mode monitor_mode,
-                              struct napi_struct *napi)
-{
-       struct hal_mon_dest_desc *mon_dst_desc;
-       struct ath12k_pdev_dp *pdev_dp = &ar->dp;
-       struct ath12k_mon_data *pmon = (struct ath12k_mon_data *)&pdev_dp->mon_data;
-       struct ath12k_base *ab = ar->ab;
-       struct ath12k_dp *dp = &ab->dp;
-       struct sk_buff *skb;
-       struct ath12k_skb_rxcb *rxcb;
-       struct dp_srng *mon_dst_ring;
-       struct hal_srng *srng;
-       struct dp_rxdma_mon_ring *buf_ring;
-       u64 cookie;
-       u32 ppdu_id;
-       int num_buffs_reaped = 0, srng_id, buf_id;
-       u8 dest_idx = 0, i;
-       bool end_of_ppdu;
-       struct hal_rx_mon_ppdu_info *ppdu_info;
-       struct ath12k_peer *peer = NULL;
-       u8 pdev_idx = ath12k_hw_mac_id_to_pdev_id(ab->hw_params, ar->pdev_idx);
-
-       ppdu_info = &pmon->mon_ppdu_info;
-       memset(ppdu_info, 0, sizeof(*ppdu_info));
-       ppdu_info->peer_id = HAL_INVALID_PEERID;
-
-       srng_id = ath12k_hw_mac_id_to_srng_id(ab->hw_params, pdev_idx);
-
-       if (monitor_mode == ATH12K_DP_RX_MONITOR_MODE) {
-               mon_dst_ring = &pdev_dp->rxdma_mon_dst_ring[srng_id];
-               buf_ring = &dp->rxdma_mon_buf_ring;
-       } else {
-               return 0;
-       }
-
-       srng = &ab->hal.srng_list[mon_dst_ring->ring_id];
-
-       spin_lock_bh(&srng->lock);
-       ath12k_hal_srng_access_begin(ab, srng);
-
-       while (likely(*budget)) {
-               *budget -= 1;
-               mon_dst_desc = ath12k_hal_srng_dst_peek(ab, srng);
-               if (unlikely(!mon_dst_desc))
-                       break;
-
-               cookie = le32_to_cpu(mon_dst_desc->cookie);
-               buf_id = u32_get_bits(cookie, DP_RXDMA_BUF_COOKIE_BUF_ID);
-
-               spin_lock_bh(&buf_ring->idr_lock);
-               skb = idr_remove(&buf_ring->bufs_idr, buf_id);
-               spin_unlock_bh(&buf_ring->idr_lock);
-
-               if (unlikely(!skb)) {
-                       ath12k_warn(ab, "monitor destination with invalid buf_id %d\n",
-                                   buf_id);
-                       goto move_next;
-               }
-
-               rxcb = ATH12K_SKB_RXCB(skb);
-               dma_unmap_single(ab->dev, rxcb->paddr,
-                                skb->len + skb_tailroom(skb),
-                                DMA_FROM_DEVICE);
-
-               pmon->dest_skb_q[dest_idx] = skb;
-               dest_idx++;
-               ppdu_id = le32_to_cpu(mon_dst_desc->ppdu_id);
-               end_of_ppdu = le32_get_bits(mon_dst_desc->info0,
-                                           HAL_MON_DEST_INFO0_END_OF_PPDU);
-               if (!end_of_ppdu)
-                       continue;
-
-               for (i = 0; i < dest_idx; i++) {
-                       skb = pmon->dest_skb_q[i];
-
-                       if (monitor_mode == ATH12K_DP_RX_MONITOR_MODE)
-                               ath12k_dp_mon_rx_parse_mon_status(ar, pmon,
-                                                                 skb, napi);
-                       else
-                               ath12k_dp_mon_tx_parse_mon_status(ar, pmon,
-                                                                 skb, napi, ppdu_id);
-
-                       peer = ath12k_peer_find_by_id(ab, ppdu_info->peer_id);
-
-                       if (!peer || !peer->sta) {
-                               ath12k_dbg(ab, ATH12K_DBG_DATA,
-                                          "failed to find the peer with peer_id %d\n",
-                                          ppdu_info->peer_id);
-                               dev_kfree_skb_any(skb);
-                               continue;
-                       }
-
-                       dev_kfree_skb_any(skb);
-                       pmon->dest_skb_q[i] = NULL;
-               }
-
-               dest_idx = 0;
-move_next:
-               ath12k_dp_mon_buf_replenish(ab, buf_ring, 1);
-               ath12k_hal_srng_src_get_next_entry(ab, srng);
-               num_buffs_reaped++;
-       }
-
-       ath12k_hal_srng_access_end(ab, srng);
-       spin_unlock_bh(&srng->lock);
-
-       return num_buffs_reaped;
-}
-
 static void
 ath12k_dp_mon_rx_update_peer_rate_table_stats(struct ath12k_rx_peer_stats *rx_stats,
                                              struct hal_rx_mon_ppdu_info *ppdu_info,
@@ -2415,8 +2305,8 @@ ath12k_dp_mon_rx_update_peer_mu_stats(struct ath12k *ar,
                ath12k_dp_mon_rx_update_user_stats(ar, ppdu_info, i);
 }
 
-int ath12k_dp_mon_rx_process_stats(struct ath12k *ar, int mac_id,
-                                  struct napi_struct *napi, int *budget)
+int ath12k_dp_mon_srng_process(struct ath12k *ar, int *budget,
+                              struct napi_struct *napi)
 {
        struct ath12k_base *ab = ar->ab;
        struct ath12k_pdev_dp *pdev_dp = &ar->dp;
@@ -2437,8 +2327,9 @@ int ath12k_dp_mon_rx_process_stats(struct ath12k *ar, int mac_id,
        u8 dest_idx = 0, i;
        bool end_of_ppdu;
        u32 hal_status;
+       u8 pdev_idx = ath12k_hw_mac_id_to_pdev_id(ab->hw_params, ar->pdev_idx);
 
-       srng_id = ath12k_hw_mac_id_to_srng_id(ab->hw_params, mac_id);
+       srng_id = ath12k_hw_mac_id_to_srng_id(ab->hw_params, pdev_idx);
        mon_dst_ring = &pdev_dp->rxdma_mon_dst_ring[srng_id];
        buf_ring = &dp->rxdma_mon_buf_ring;
 
@@ -2535,11 +2426,10 @@ int ath12k_dp_mon_process_ring(struct ath12k_base *ab, int mac_id,
        struct ath12k *ar = ath12k_ab_to_ar(ab, mac_id);
        int num_buffs_reaped = 0;
 
-       if (!ar->monitor_started)
-               ath12k_dp_mon_rx_process_stats(ar, mac_id, napi, &budget);
-       else
-               num_buffs_reaped = ath12k_dp_mon_srng_process(ar, &budget,
-                                                             monitor_mode, napi);
+       if (ab->hw_params->rxdma1_enable) {
+               if (monitor_mode == ATH12K_DP_RX_MONITOR_MODE)
+                       num_buffs_reaped = ath12k_dp_mon_srng_process(ar, &budget, napi);
+       }
 
        return num_buffs_reaped;
 }
index 64c959c3645991539b5e8a000647a084360303d4..e4368eb42aca831f2ec6b30846268fedbb82e312 100644 (file)
@@ -82,9 +82,6 @@ ath12k_dp_mon_rx_parse_mon_status(struct ath12k *ar,
 int ath12k_dp_mon_buf_replenish(struct ath12k_base *ab,
                                struct dp_rxdma_mon_ring *buf_ring,
                                int req_entries);
-int ath12k_dp_mon_srng_process(struct ath12k *ar,
-                              int *budget, enum dp_monitor_mode monitor_mode,
-                              struct napi_struct *napi);
 int ath12k_dp_mon_process_ring(struct ath12k_base *ab, int mac_id,
                               struct napi_struct *napi, int budget,
                               enum dp_monitor_mode monitor_mode);
@@ -100,6 +97,5 @@ ath12k_dp_mon_tx_parse_mon_status(struct ath12k *ar,
                                  struct napi_struct *napi,
                                  u32 ppdu_id);
 void ath12k_dp_mon_rx_process_ulofdma(struct hal_rx_mon_ppdu_info *ppdu_info);
-int ath12k_dp_mon_rx_process_stats(struct ath12k *ar, int mac_id,
-                                  struct napi_struct *napi, int *budget);
+int ath12k_dp_mon_srng_process(struct ath12k *ar, int *budget, struct napi_struct *napi);
 #endif