wifi: ath12k: Refactor tx descriptor handling in tx completion handler
authorP Praneesh <praneesh.p@oss.qualcomm.com>
Fri, 11 Apr 2025 06:01:52 +0000 (11:31 +0530)
committerJeff Johnson <jeff.johnson@oss.qualcomm.com>
Thu, 17 Apr 2025 22:49:32 +0000 (15:49 -0700)
Current code uses mac_id and msdu parameters in ath12k_dp_tx_free_txbuf()
and ath12k_dp_tx_process_htt_tx_complete(). Since these parameters are
already encapsulated by struct ath12k_dp_tx_desc, passing them individually
results in redundant arguments.

Introduce struct ath12k_tx_desc_params to capture the skb, mac_id, and pass
it to the corresponding functions. Refactor these functions to use struct
ath12k_tx_desc_params instead, reducing the number of arguments and improving
function argument handling efficiency. Additionally, use struct
ath12k_tx_desc_params in ath12k_dp_tx_htt_tx_complete_buf() and
ath12k_dp_tx_complete_msdu(), which will be utilized for fetching extended skb
in a future patch.

Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.4.1-00199-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 <praneesh.p@oss.qualcomm.com>
Reviewed-by: Vasanthakumar Thiagarajan <vasanthakumar.thiagarajan@oss.qualcomm.com>
Link: https://patch.msgid.link/20250411060154.1388159-3-praneesh.p@oss.qualcomm.com
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
drivers/net/wireless/ath/ath12k/dp.h
drivers/net/wireless/ath/ath12k/dp_tx.c

index 6ce5f85..241da2a 100644 (file)
@@ -301,6 +301,11 @@ struct ath12k_tx_desc_info {
        u8 pool_id;
 };
 
+struct ath12k_tx_desc_params {
+       struct sk_buff *skb;
+       u8 mac_id;
+};
+
 struct ath12k_spt_info {
        dma_addr_t paddr;
        u64 *vaddr;
index 9d58a9a..a272d5b 100644 (file)
@@ -513,12 +513,13 @@ fail_remove_tx_buf:
 }
 
 static void ath12k_dp_tx_free_txbuf(struct ath12k_base *ab,
-                                   struct sk_buff *msdu, u8 mac_id,
-                                   struct dp_tx_ring *tx_ring)
+                                   struct dp_tx_ring *tx_ring,
+                                   struct ath12k_tx_desc_params *desc_params)
 {
        struct ath12k *ar;
+       struct sk_buff *msdu = desc_params->skb;
        struct ath12k_skb_cb *skb_cb;
-       u8 pdev_id = ath12k_hw_mac_id_to_pdev_id(ab->hw_params, mac_id);
+       u8 pdev_id = ath12k_hw_mac_id_to_pdev_id(ab->hw_params, desc_params->mac_id);
 
        skb_cb = ATH12K_SKB_CB(msdu);
        ar = ab->pdevs[pdev_id].ar;
@@ -536,7 +537,7 @@ static void ath12k_dp_tx_free_txbuf(struct ath12k_base *ab,
 
 static void
 ath12k_dp_tx_htt_tx_complete_buf(struct ath12k_base *ab,
-                                struct sk_buff *msdu,
+                                struct ath12k_tx_desc_params *desc_params,
                                 struct dp_tx_ring *tx_ring,
                                 struct ath12k_dp_htt_wbm_tx_status *ts)
 {
@@ -546,6 +547,7 @@ ath12k_dp_tx_htt_tx_complete_buf(struct ath12k_base *ab,
        struct ieee80211_vif *vif;
        struct ath12k_vif *ahvif;
        struct ath12k *ar;
+       struct sk_buff *msdu = desc_params->skb;
 
        skb_cb = ATH12K_SKB_CB(msdu);
        info = IEEE80211_SKB_CB(msdu);
@@ -594,10 +596,9 @@ ath12k_dp_tx_htt_tx_complete_buf(struct ath12k_base *ab,
 }
 
 static void
-ath12k_dp_tx_process_htt_tx_complete(struct ath12k_base *ab,
-                                    void *desc, u8 mac_id,
-                                    struct sk_buff *msdu,
-                                    struct dp_tx_ring *tx_ring)
+ath12k_dp_tx_process_htt_tx_complete(struct ath12k_base *ab, void *desc,
+                                    struct dp_tx_ring *tx_ring,
+                                    struct ath12k_tx_desc_params *desc_params)
 {
        struct htt_tx_wbm_completion *status_desc;
        struct ath12k_dp_htt_wbm_tx_status ts = {0};
@@ -613,14 +614,14 @@ ath12k_dp_tx_process_htt_tx_complete(struct ath12k_base *ab,
                ts.acked = (wbm_status == HAL_WBM_REL_HTT_TX_COMP_STATUS_OK);
                ts.ack_rssi = le32_get_bits(status_desc->info2,
                                            HTT_TX_WBM_COMP_INFO2_ACK_RSSI);
-               ath12k_dp_tx_htt_tx_complete_buf(ab, msdu, tx_ring, &ts);
+               ath12k_dp_tx_htt_tx_complete_buf(ab, desc_params, tx_ring, &ts);
                break;
        case HAL_WBM_REL_HTT_TX_COMP_STATUS_DROP:
        case HAL_WBM_REL_HTT_TX_COMP_STATUS_TTL:
        case HAL_WBM_REL_HTT_TX_COMP_STATUS_REINJ:
        case HAL_WBM_REL_HTT_TX_COMP_STATUS_INSPECT:
        case HAL_WBM_REL_HTT_TX_COMP_STATUS_VDEVID_MISMATCH:
-               ath12k_dp_tx_free_txbuf(ab, msdu, mac_id, tx_ring);
+               ath12k_dp_tx_free_txbuf(ab, tx_ring, desc_params);
                break;
        case HAL_WBM_REL_HTT_TX_COMP_STATUS_MEC_NOTIFY:
                /* This event is to be handled only when the driver decides to
@@ -752,7 +753,7 @@ static void ath12k_dp_tx_update_txcompl(struct ath12k *ar, struct hal_tx_status
 }
 
 static void ath12k_dp_tx_complete_msdu(struct ath12k *ar,
-                                      struct sk_buff *msdu,
+                                      struct ath12k_tx_desc_params *desc_params,
                                       struct hal_tx_status *ts)
 {
        struct ath12k_base *ab = ar->ab;
@@ -762,6 +763,7 @@ static void ath12k_dp_tx_complete_msdu(struct ath12k *ar,
        struct ath12k_skb_cb *skb_cb;
        struct ieee80211_vif *vif;
        struct ath12k_vif *ahvif;
+       struct sk_buff *msdu = desc_params->skb;
 
        if (WARN_ON_ONCE(ts->buf_rel_source != HAL_WBM_REL_SRC_MODULE_TQM)) {
                /* Must not happen */
@@ -891,11 +893,11 @@ void ath12k_dp_tx_completion_handler(struct ath12k_base *ab, int ring_id)
        int hal_ring_id = dp->tx_ring[ring_id].tcl_comp_ring.ring_id;
        struct hal_srng *status_ring = &ab->hal.srng_list[hal_ring_id];
        struct ath12k_tx_desc_info *tx_desc = NULL;
-       struct sk_buff *msdu;
        struct hal_tx_status ts = { 0 };
+       struct ath12k_tx_desc_params desc_params;
        struct dp_tx_ring *tx_ring = &dp->tx_ring[ring_id];
        struct hal_wbm_release_ring *desc;
-       u8 mac_id, pdev_id;
+       u8 pdev_id;
        u64 desc_va;
 
        spin_lock_bh(&status_ring->lock);
@@ -949,28 +951,26 @@ void ath12k_dp_tx_completion_handler(struct ath12k_base *ab, int ring_id)
                        continue;
                }
 
-               msdu = tx_desc->skb;
-               mac_id = tx_desc->mac_id;
+               desc_params.mac_id = tx_desc->mac_id;
+               desc_params.skb = tx_desc->skb;
 
                /* Release descriptor as soon as extracting necessary info
                 * to reduce contention
                 */
                ath12k_dp_tx_release_txbuf(dp, tx_desc, tx_desc->pool_id);
                if (ts.buf_rel_source == HAL_WBM_REL_SRC_MODULE_FW) {
-                       ath12k_dp_tx_process_htt_tx_complete(ab,
-                                                            (void *)tx_status,
-                                                            mac_id, msdu,
-                                                            tx_ring);
+                       ath12k_dp_tx_process_htt_tx_complete(ab, (void *)tx_status,
+                                                            tx_ring, &desc_params);
                        continue;
                }
 
-               pdev_id = ath12k_hw_mac_id_to_pdev_id(ab->hw_params, mac_id);
+               pdev_id = ath12k_hw_mac_id_to_pdev_id(ab->hw_params, desc_params.mac_id);
                ar = ab->pdevs[pdev_id].ar;
 
                if (atomic_dec_and_test(&ar->dp.num_tx_pending))
                        wake_up(&ar->dp.tx_empty_waitq);
 
-               ath12k_dp_tx_complete_msdu(ar, msdu, &ts);
+               ath12k_dp_tx_complete_msdu(ar, &desc_params, &ts);
        }
 }