wifi: ath12k: refactor DP Rxdma ring structure
authorKarthikeyan Periyasamy <quic_periyasa@quicinc.com>
Wed, 22 Nov 2023 18:31:02 +0000 (20:31 +0200)
committerKalle Valo <quic_kvalo@quicinc.com>
Wed, 29 Nov 2023 11:27:07 +0000 (13:27 +0200)
Currently data path Rxdma ring structure store the IDR buffer and lock.
These IDR handling is needed only for SW cookie conversion and not
needed for HW cookie conversion. REO Rxdma ring use the HW cookie
conversion and monitor Rxdma ring use the SW cookie conversion.
Since idr not needed for REO Rxdma ring, remove the IDR data entity
from the data path Rxdma ring structure. Introduce the new data path ring
structure for monitor rxmda rings since it need IDR data entity.

Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.1.1-00125-QCAHKSWPL_SILICONZ-1

Signed-off-by: Karthikeyan Periyasamy <quic_periyasa@quicinc.com>
Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
Link: https://lore.kernel.org/r/20231111043934.20485-5-quic_periyasa@quicinc.com
drivers/net/wireless/ath/ath12k/dp.h
drivers/net/wireless/ath/ath12k/dp_mon.c
drivers/net/wireless/ath/ath12k/dp_mon.h
drivers/net/wireless/ath/ath12k/dp_rx.c

index 61f765432516bb2f0a8864754437b1f60e500695..1df3cdd461400aec42207118b5a113f5f83a876a 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef ATH12K_DP_H
@@ -31,7 +31,7 @@ struct dp_srng {
        u32 ring_id;
 };
 
-struct dp_rxdma_ring {
+struct dp_rxdma_mon_ring {
        struct dp_srng refill_buf_ring;
        struct idr bufs_idr;
        /* Protects bufs_idr */
@@ -39,6 +39,11 @@ struct dp_rxdma_ring {
        int bufs_max;
 };
 
+struct dp_rxdma_ring {
+       struct dp_srng refill_buf_ring;
+       int bufs_max;
+};
+
 #define ATH12K_TX_COMPL_NEXT(x)        (((x) + 1) % DP_TX_COMP_RING_SIZE)
 
 struct dp_tx_ring {
@@ -353,8 +358,8 @@ struct ath12k_dp {
        struct dp_rxdma_ring rx_refill_buf_ring;
        struct dp_srng rx_mac_buf_ring[MAX_RXDMA_PER_PDEV];
        struct dp_srng rxdma_err_dst_ring[MAX_RXDMA_PER_PDEV];
-       struct dp_rxdma_ring rxdma_mon_buf_ring;
-       struct dp_rxdma_ring tx_mon_buf_ring;
+       struct dp_rxdma_mon_ring rxdma_mon_buf_ring;
+       struct dp_rxdma_mon_ring tx_mon_buf_ring;
        struct ath12k_reo_q_addr_lut reoq_lut;
 };
 
index f44bc5494ce7358e9b7f456ccfd22f7cfa3f0864..98d7c8e2c0eb85eb3e3b211df250b92b2b50322a 100644 (file)
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include "dp_mon.h"
@@ -797,7 +797,7 @@ ath12k_dp_mon_rx_parse_status_tlv(struct ath12k_base *ab,
                /* TODO: add msdu start parsing logic */
                break;
        case HAL_MON_BUF_ADDR: {
-               struct dp_rxdma_ring *buf_ring = &ab->dp.rxdma_mon_buf_ring;
+               struct dp_rxdma_mon_ring *buf_ring = &ab->dp.rxdma_mon_buf_ring;
                struct dp_mon_packet_info *packet_info =
                        (struct dp_mon_packet_info *)tlv_data;
                int buf_id = u32_get_bits(packet_info->cookie,
@@ -1259,7 +1259,7 @@ ath12k_dp_mon_rx_parse_mon_status(struct ath12k *ar,
 }
 
 int ath12k_dp_mon_buf_replenish(struct ath12k_base *ab,
-                               struct dp_rxdma_ring *buf_ring,
+                               struct dp_rxdma_mon_ring *buf_ring,
                                int req_entries)
 {
        struct hal_mon_buf_ring *mon_buf;
@@ -1902,7 +1902,7 @@ ath12k_dp_mon_tx_parse_status_tlv(struct ath12k_base *ab,
        }
 
        case HAL_MON_BUF_ADDR: {
-               struct dp_rxdma_ring *buf_ring = &ab->dp.tx_mon_buf_ring;
+               struct dp_rxdma_mon_ring *buf_ring = &ab->dp.tx_mon_buf_ring;
                struct dp_mon_packet_info *packet_info =
                        (struct dp_mon_packet_info *)tlv_data;
                int buf_id = u32_get_bits(packet_info->cookie,
@@ -2067,7 +2067,7 @@ int ath12k_dp_mon_srng_process(struct ath12k *ar, int mac_id, int *budget,
        struct ath12k_skb_rxcb *rxcb;
        struct dp_srng *mon_dst_ring;
        struct hal_srng *srng;
-       struct dp_rxdma_ring *buf_ring;
+       struct dp_rxdma_mon_ring *buf_ring;
        u64 cookie;
        u32 ppdu_id;
        int num_buffs_reaped = 0, srng_id, buf_id;
@@ -2480,7 +2480,7 @@ int ath12k_dp_mon_rx_process_stats(struct ath12k *ar, int mac_id,
        struct ath12k_skb_rxcb *rxcb;
        struct dp_srng *mon_dst_ring;
        struct hal_srng *srng;
-       struct dp_rxdma_ring *buf_ring;
+       struct dp_rxdma_mon_ring *buf_ring;
        struct ath12k_sta *arsta = NULL;
        struct ath12k_peer *peer;
        u64 cookie;
index c18c385798a110d7710d9021b1017992a29e2215..fb9e9c176ce57b402bc729fc64f8ca3edd6861be 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef ATH12K_DP_MON_H
@@ -80,7 +80,7 @@ ath12k_dp_mon_rx_parse_mon_status(struct ath12k *ar,
                                  int mac_id, struct sk_buff *skb,
                                  struct napi_struct *napi);
 int ath12k_dp_mon_buf_replenish(struct ath12k_base *ab,
-                               struct dp_rxdma_ring *buf_ring,
+                               struct dp_rxdma_mon_ring *buf_ring,
                                int req_entries);
 int ath12k_dp_mon_srng_process(struct ath12k *ar, int mac_id,
                               int *budget, enum dp_monitor_mode monitor_mode,
index 2098a5f8fb707449e2e96dacb568917e3d4bd435..fb02238798d797ca789a11fbd0e4ee45f0b11dce 100644 (file)
@@ -364,8 +364,8 @@ fail_free_skb:
        return req_entries - num_remain;
 }
 
-static int ath12k_dp_rxdma_buf_ring_free(struct ath12k_base *ab,
-                                        struct dp_rxdma_ring *rx_ring)
+static int ath12k_dp_rxdma_mon_buf_ring_free(struct ath12k_base *ab,
+                                            struct dp_rxdma_mon_ring *rx_ring)
 {
        struct sk_buff *skb;
        int buf_id;
@@ -390,44 +390,49 @@ static int ath12k_dp_rxdma_buf_ring_free(struct ath12k_base *ab,
 static int ath12k_dp_rxdma_buf_free(struct ath12k_base *ab)
 {
        struct ath12k_dp *dp = &ab->dp;
-       struct dp_rxdma_ring *rx_ring = &dp->rx_refill_buf_ring;
 
-       ath12k_dp_rxdma_buf_ring_free(ab, rx_ring);
+       ath12k_dp_rxdma_mon_buf_ring_free(ab, &dp->rxdma_mon_buf_ring);
+
+       ath12k_dp_rxdma_mon_buf_ring_free(ab, &dp->tx_mon_buf_ring);
+
+       return 0;
+}
+
+static int ath12k_dp_rxdma_mon_ring_buf_setup(struct ath12k_base *ab,
+                                             struct dp_rxdma_mon_ring *rx_ring,
+                                             u32 ringtype)
+{
+       int num_entries;
 
-       rx_ring = &dp->rxdma_mon_buf_ring;
-       ath12k_dp_rxdma_buf_ring_free(ab, rx_ring);
+       num_entries = rx_ring->refill_buf_ring.size /
+               ath12k_hal_srng_get_entrysize(ab, ringtype);
 
-       rx_ring = &dp->tx_mon_buf_ring;
-       ath12k_dp_rxdma_buf_ring_free(ab, rx_ring);
+       rx_ring->bufs_max = num_entries;
+       ath12k_dp_mon_buf_replenish(ab, rx_ring, num_entries);
 
        return 0;
 }
 
 static int ath12k_dp_rxdma_ring_buf_setup(struct ath12k_base *ab,
-                                         struct dp_rxdma_ring *rx_ring,
-                                         u32 ringtype)
+                                         struct dp_rxdma_ring *rx_ring)
 {
        int num_entries;
 
        num_entries = rx_ring->refill_buf_ring.size /
-               ath12k_hal_srng_get_entrysize(ab, ringtype);
+               ath12k_hal_srng_get_entrysize(ab, HAL_RXDMA_BUF);
 
        rx_ring->bufs_max = num_entries;
-       if ((ringtype == HAL_RXDMA_MONITOR_BUF) || (ringtype == HAL_TX_MONITOR_BUF))
-               ath12k_dp_mon_buf_replenish(ab, rx_ring, num_entries);
-       else
-               ath12k_dp_rx_bufs_replenish(ab, rx_ring, num_entries);
+       ath12k_dp_rx_bufs_replenish(ab, rx_ring, num_entries);
+
        return 0;
 }
 
 static int ath12k_dp_rxdma_buf_setup(struct ath12k_base *ab)
 {
        struct ath12k_dp *dp = &ab->dp;
-       struct dp_rxdma_ring *rx_ring = &dp->rx_refill_buf_ring;
        int ret;
 
-       ret = ath12k_dp_rxdma_ring_buf_setup(ab, rx_ring,
-                                            HAL_RXDMA_BUF);
+       ret = ath12k_dp_rxdma_ring_buf_setup(ab, &dp->rx_refill_buf_ring);
        if (ret) {
                ath12k_warn(ab,
                            "failed to setup HAL_RXDMA_BUF\n");
@@ -435,18 +440,18 @@ static int ath12k_dp_rxdma_buf_setup(struct ath12k_base *ab)
        }
 
        if (ab->hw_params->rxdma1_enable) {
-               rx_ring = &dp->rxdma_mon_buf_ring;
-               ret = ath12k_dp_rxdma_ring_buf_setup(ab, rx_ring,
-                                                    HAL_RXDMA_MONITOR_BUF);
+               ret = ath12k_dp_rxdma_mon_ring_buf_setup(ab,
+                                                        &dp->rxdma_mon_buf_ring,
+                                                        HAL_RXDMA_MONITOR_BUF);
                if (ret) {
                        ath12k_warn(ab,
                                    "failed to setup HAL_RXDMA_MONITOR_BUF\n");
                        return ret;
                }
 
-               rx_ring = &dp->tx_mon_buf_ring;
-               ret = ath12k_dp_rxdma_ring_buf_setup(ab, rx_ring,
-                                                    HAL_TX_MONITOR_BUF);
+               ret = ath12k_dp_rxdma_mon_ring_buf_setup(ab,
+                                                        &dp->tx_mon_buf_ring,
+                                                        HAL_TX_MONITOR_BUF);
                if (ret) {
                        ath12k_warn(ab,
                                    "failed to setup HAL_TX_MONITOR_BUF\n");
@@ -4060,9 +4065,6 @@ int ath12k_dp_rx_alloc(struct ath12k_base *ab)
        struct ath12k_dp *dp = &ab->dp;
        int i, ret;
 
-       idr_init(&dp->rx_refill_buf_ring.bufs_idr);
-       spin_lock_init(&dp->rx_refill_buf_ring.idr_lock);
-
        idr_init(&dp->rxdma_mon_buf_ring.bufs_idr);
        spin_lock_init(&dp->rxdma_mon_buf_ring.idr_lock);