]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: ath12k: Move MPDU pop functionality to Wi-Fi 7 module
authorAlok Singh <quic_aloksing@quicinc.com>
Mon, 10 Nov 2025 10:37:04 +0000 (16:07 +0530)
committerJeff Johnson <jeff.johnson@oss.qualcomm.com>
Tue, 11 Nov 2025 15:21:32 +0000 (07:21 -0800)
Separate Wi-Fi 7-specific monitor code from ath12k common
code to improve modularity.

Move the following monitor MPDU pop function to the new
file wifi7/dp_mon.c and rename them with the ath12k_wifi7_ prefix:
- ath12k_dp_rx_mon_mpdu_pop()

Export helper functions required by the ath12k_wifi7 module.

Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.5-01651-QCAHKSWPL_SILICONZ-1

Signed-off-by: Alok Singh <quic_aloksing@quicinc.com>
Reviewed-by: Vasanthakumar Thiagarajan <vasanthakumar.thiagarajan@oss.qualcomm.com>
Reviewed-by: Baochen Qiang <baochen.qiang@oss.qualcomm.com>
Link: https://patch.msgid.link/20251110103713.3484779-4-quic_aloksing@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
drivers/net/wireless/ath/ath12k/hal.h
drivers/net/wireless/ath/ath12k/wifi7/dp_mon.c
drivers/net/wireless/ath/ath12k/wifi7/dp_rx.c
drivers/net/wireless/ath/ath12k/wifi7/dp_rx.h
drivers/net/wireless/ath/ath12k/wifi7/hal_rx.h

index 37a5d46b1ca4bcec2915f093027b4f0827d91cbd..16361dd77a6ae4b927e6b100d097d535cb00fc72 100644 (file)
 #define ATH12K_LE64_DEC_ENC(value, dec_bits, enc_bits) \
                u32_encode_bits(le64_get_bits(value, dec_bits), enc_bits)
 
-static bool ath12k_dp_rxdesc_mpdu_valid(struct ath12k_base *ab,
-                                       struct hal_rx_desc *rx_desc)
-{
-       u32 tlv_tag;
-
-       tlv_tag = ab->hal.ops->rx_desc_get_mpdu_start_tag(rx_desc);
-
-       return tlv_tag == HAL_RX_MPDU_START;
-}
-
 static void
 ath12k_dp_mon_rx_handle_ofdma_info(const struct hal_rx_ppdu_end_user_stats *ppdu_end_user,
                                   struct hal_rx_user_status *rx_user_status)
@@ -1807,7 +1797,7 @@ fail_alloc_skb:
 }
 EXPORT_SYMBOL(ath12k_dp_rx_alloc_mon_status_buf);
 
-static u32 ath12k_dp_mon_comp_ppduid(u32 msdu_ppdu_id, u32 *ppdu_id)
+u32 ath12k_dp_mon_comp_ppduid(u32 msdu_ppdu_id, u32 *ppdu_id)
 {
        u32 ret = 0;
 
@@ -1826,8 +1816,8 @@ static u32 ath12k_dp_mon_comp_ppduid(u32 msdu_ppdu_id, u32 *ppdu_id)
        }
        return ret;
 }
+EXPORT_SYMBOL(ath12k_dp_mon_comp_ppduid);
 
-static
 void ath12k_dp_mon_next_link_desc_get(struct ath12k_base *ab,
                                      struct hal_rx_msdu_link *msdu_link,
                                      dma_addr_t *paddr, u32 *sw_cookie, u8 *rbm,
@@ -1841,6 +1831,7 @@ void ath12k_dp_mon_next_link_desc_get(struct ath12k_base *ab,
 
        *pp_buf_addr_info = buf_addr_info;
 }
+EXPORT_SYMBOL(ath12k_dp_mon_next_link_desc_get);
 
 static void
 ath12k_dp_mon_fill_rx_rate(struct ath12k_pdev_dp *dp_pdev,
@@ -2400,7 +2391,7 @@ EXPORT_SYMBOL(ath12k_dp_pkt_set_pktlen);
  */
 #define RXDMA_DATA_DMA_BLOCK_SIZE 128
 
-static void
+void
 ath12k_dp_mon_get_buf_len(struct hal_rx_msdu_desc_info *info,
                          bool *is_frag, u32 *total_len,
                          u32 *frag_len, u32 *msdu_cnt)
@@ -2420,6 +2411,7 @@ ath12k_dp_mon_get_buf_len(struct hal_rx_msdu_desc_info *info,
                *msdu_cnt -= 1;
        }
 }
+EXPORT_SYMBOL(ath12k_dp_mon_get_buf_len);
 
 static int
 ath12k_dp_mon_parse_status_buf(struct ath12k_pdev_dp *dp_pdev,
@@ -3649,192 +3641,3 @@ ath12k_dp_mon_rx_update_peer_mu_stats(struct ath12k_base *ab,
                ath12k_dp_mon_rx_update_user_stats(ab, ppdu_info, i);
 }
 EXPORT_SYMBOL(ath12k_dp_mon_rx_update_peer_mu_stats);
-
-u32
-ath12k_dp_rx_mon_mpdu_pop(struct ath12k *ar, int mac_id,
-                         void *ring_entry, struct sk_buff **head_msdu,
-                         struct sk_buff **tail_msdu,
-                         struct list_head *used_list,
-                         u32 *npackets, u32 *ppdu_id)
-{
-       struct ath12k_mon_data *pmon = (struct ath12k_mon_data *)&ar->dp.mon_data;
-       struct ath12k_base *ab = ar->ab;
-       struct ath12k_dp *dp = ath12k_ab_to_dp(ab);
-       struct ath12k_buffer_addr *p_buf_addr_info, *p_last_buf_addr_info;
-       u32 msdu_ppdu_id = 0, msdu_cnt = 0, total_len = 0, frag_len = 0;
-       u32 rx_buf_size, rx_pkt_offset, sw_cookie;
-       bool is_frag, is_first_msdu, drop_mpdu = false;
-       struct hal_reo_entrance_ring *ent_desc =
-               (struct hal_reo_entrance_ring *)ring_entry;
-       u32 rx_bufs_used = 0, i = 0, desc_bank = 0;
-       struct hal_rx_desc *rx_desc, *tail_rx_desc;
-       struct hal_rx_msdu_link *msdu_link_desc;
-       struct sk_buff *msdu = NULL, *last = NULL;
-       struct ath12k_rx_desc_info *desc_info;
-       struct ath12k_buffer_addr buf_info;
-       struct hal_rx_msdu_list msdu_list;
-       struct ath12k_skb_rxcb *rxcb;
-       u16 num_msdus = 0;
-       dma_addr_t paddr;
-       u8 rbm;
-
-       ath12k_hal_rx_reo_ent_buf_paddr_get(&ab->hal, ring_entry, &paddr,
-                                           &sw_cookie,
-                                           &p_last_buf_addr_info, &rbm,
-                                           &msdu_cnt);
-
-       spin_lock_bh(&pmon->mon_lock);
-
-       if (le32_get_bits(ent_desc->info1,
-                         HAL_REO_ENTR_RING_INFO1_RXDMA_PUSH_REASON) ==
-                         HAL_REO_DEST_RING_PUSH_REASON_ERR_DETECTED) {
-               u8 rxdma_err = le32_get_bits(ent_desc->info1,
-                                            HAL_REO_ENTR_RING_INFO1_RXDMA_ERROR_CODE);
-               if (rxdma_err == HAL_REO_ENTR_RING_RXDMA_ECODE_FLUSH_REQUEST_ERR ||
-                   rxdma_err == HAL_REO_ENTR_RING_RXDMA_ECODE_MPDU_LEN_ERR ||
-                   rxdma_err == HAL_REO_ENTR_RING_RXDMA_ECODE_OVERFLOW_ERR) {
-                       drop_mpdu = true;
-                       pmon->rx_mon_stats.dest_mpdu_drop++;
-               }
-       }
-
-       is_frag = false;
-       is_first_msdu = true;
-       rx_pkt_offset = sizeof(struct hal_rx_desc);
-
-       do {
-               if (pmon->mon_last_linkdesc_paddr == paddr) {
-                       pmon->rx_mon_stats.dup_mon_linkdesc_cnt++;
-                       spin_unlock_bh(&pmon->mon_lock);
-                       return rx_bufs_used;
-               }
-
-               desc_bank = u32_get_bits(sw_cookie, DP_LINK_DESC_BANK_MASK);
-               msdu_link_desc =
-                       dp->link_desc_banks[desc_bank].vaddr +
-                       (paddr - dp->link_desc_banks[desc_bank].paddr);
-
-               ath12k_hal_rx_msdu_list_get(&ar->ab->hal, ar, msdu_link_desc, &msdu_list,
-                                           &num_msdus);
-               desc_info = ath12k_dp_get_rx_desc(ar->ab->dp,
-                                                 msdu_list.sw_cookie[num_msdus - 1]);
-               tail_rx_desc = (struct hal_rx_desc *)(desc_info->skb)->data;
-
-               for (i = 0; i < num_msdus; i++) {
-                       u32 l2_hdr_offset;
-
-                       if (pmon->mon_last_buf_cookie == msdu_list.sw_cookie[i]) {
-                               ath12k_dbg(ar->ab, ATH12K_DBG_DATA,
-                                          "i %d last_cookie %d is same\n",
-                                          i, pmon->mon_last_buf_cookie);
-                               drop_mpdu = true;
-                               pmon->rx_mon_stats.dup_mon_buf_cnt++;
-                               continue;
-                       }
-
-                       desc_info =
-                               ath12k_dp_get_rx_desc(ar->ab->dp, msdu_list.sw_cookie[i]);
-                       msdu = desc_info->skb;
-
-                       if (!msdu) {
-                               ath12k_dbg(ar->ab, ATH12K_DBG_DATA,
-                                          "msdu_pop: invalid msdu (%d/%d)\n",
-                                          i + 1, num_msdus);
-                               goto next_msdu;
-                       }
-                       rxcb = ATH12K_SKB_RXCB(msdu);
-                       if (rxcb->paddr != msdu_list.paddr[i]) {
-                               ath12k_dbg(ar->ab, ATH12K_DBG_DATA,
-                                          "i %d paddr %lx != %lx\n",
-                                          i, (unsigned long)rxcb->paddr,
-                                          (unsigned long)msdu_list.paddr[i]);
-                               drop_mpdu = true;
-                               continue;
-                       }
-                       if (!rxcb->unmapped) {
-                               dma_unmap_single(ar->ab->dev, rxcb->paddr,
-                                                msdu->len +
-                                                skb_tailroom(msdu),
-                                                DMA_FROM_DEVICE);
-                               rxcb->unmapped = 1;
-                       }
-                       if (drop_mpdu) {
-                               ath12k_dbg(ar->ab, ATH12K_DBG_DATA,
-                                          "i %d drop msdu %p *ppdu_id %x\n",
-                                          i, msdu, *ppdu_id);
-                               dev_kfree_skb_any(msdu);
-                               msdu = NULL;
-                               goto next_msdu;
-                       }
-
-                       rx_desc = (struct hal_rx_desc *)msdu->data;
-                       l2_hdr_offset = ath12k_dp_rx_h_l3pad(ar->ab, tail_rx_desc);
-                       if (is_first_msdu) {
-                               if (!ath12k_dp_rxdesc_mpdu_valid(ar->ab, rx_desc)) {
-                                       drop_mpdu = true;
-                                       dev_kfree_skb_any(msdu);
-                                       msdu = NULL;
-                                       pmon->mon_last_linkdesc_paddr = paddr;
-                                       goto next_msdu;
-                               }
-                               msdu_ppdu_id =
-                                       ath12k_dp_rxdesc_get_ppduid(ar->ab, rx_desc);
-
-                               if (ath12k_dp_mon_comp_ppduid(msdu_ppdu_id,
-                                                             ppdu_id)) {
-                                       spin_unlock_bh(&pmon->mon_lock);
-                                       return rx_bufs_used;
-                               }
-                               pmon->mon_last_linkdesc_paddr = paddr;
-                               is_first_msdu = false;
-                       }
-                       ath12k_dp_mon_get_buf_len(&msdu_list.msdu_info[i],
-                                                 &is_frag, &total_len,
-                                                 &frag_len, &msdu_cnt);
-                       rx_buf_size = rx_pkt_offset + l2_hdr_offset + frag_len;
-
-                       if (ath12k_dp_pkt_set_pktlen(msdu, rx_buf_size)) {
-                               dev_kfree_skb_any(msdu);
-                               goto next_msdu;
-                       }
-
-                       if (!(*head_msdu))
-                               *head_msdu = msdu;
-                       else if (last)
-                               last->next = msdu;
-
-                       last = msdu;
-next_msdu:
-                       pmon->mon_last_buf_cookie = msdu_list.sw_cookie[i];
-                       rx_bufs_used++;
-                       desc_info->skb = NULL;
-                       list_add_tail(&desc_info->list, used_list);
-               }
-
-               ath12k_hal_rx_buf_addr_info_set(&ab->hal, &buf_info, paddr,
-                                               sw_cookie, rbm);
-
-               ath12k_dp_mon_next_link_desc_get(ab, msdu_link_desc, &paddr,
-                                                &sw_cookie, &rbm,
-                                                &p_buf_addr_info);
-
-               ath12k_dp_arch_rx_link_desc_return(ar->ab->dp, &buf_info,
-                                                  HAL_WBM_REL_BM_ACT_PUT_IN_IDLE);
-
-               p_last_buf_addr_info = p_buf_addr_info;
-
-       } while (paddr && msdu_cnt);
-
-       spin_unlock_bh(&pmon->mon_lock);
-
-       if (last)
-               last->next = NULL;
-
-       *tail_msdu = msdu;
-
-       if (msdu_cnt == 0)
-               *npackets = 1;
-
-       return rx_bufs_used;
-}
-EXPORT_SYMBOL(ath12k_dp_rx_mon_mpdu_pop);
index 726434ab74acaae34d0ab5e9012bc53edf1c8dbe..425bec6f0f3ca375680817cde50b7a0a73643d6c 100644 (file)
@@ -101,12 +101,6 @@ ath12k_dp_mon_rx_update_peer_mu_stats(struct ath12k_base *ab,
                                      struct hal_rx_mon_ppdu_info *ppdu_info);
 void ath12k_dp_mon_rx_update_peer_su_stats(struct ath12k_dp_link_peer *peer,
                                           struct hal_rx_mon_ppdu_info *ppdu_info);
-u32
-ath12k_dp_rx_mon_mpdu_pop(struct ath12k *ar, int mac_id,
-                         void *ring_entry, struct sk_buff **head_msdu,
-                         struct sk_buff **tail_msdu,
-                         struct list_head *used_list,
-                         u32 *npackets, u32 *ppdu_id);
 int ath12k_dp_pkt_set_pktlen(struct sk_buff *skb, u32 len);
 int ath12k_dp_mon_rx_deliver(struct ath12k_pdev_dp *dp_pdev,
                             struct dp_mon_mpdu *mon_mpdu,
@@ -125,4 +119,13 @@ struct sk_buff
 *ath12k_dp_rx_alloc_mon_status_buf(struct ath12k_base *ab,
                                   struct dp_rxdma_mon_ring *rx_ring,
                                   int *buf_id);
+void
+ath12k_dp_mon_get_buf_len(struct hal_rx_msdu_desc_info *info,
+                         bool *is_frag, u32 *total_len,
+                         u32 *frag_len, u32 *msdu_cnt);
+void ath12k_dp_mon_next_link_desc_get(struct ath12k_base *ab,
+                                     struct hal_rx_msdu_link *msdu_link,
+                                     dma_addr_t *paddr, u32 *sw_cookie, u8 *rbm,
+                                     struct ath12k_buffer_addr **pp_buf_addr_info);
+u32 ath12k_dp_mon_comp_ppduid(u32 msdu_ppdu_id, u32 *ppdu_id);
 #endif
index 071f4897e4cd0d3d408caa2cb3bc2aab336ea268..1d22173975f0fb86adeb4df3e9ebc2128502cda1 100644 (file)
@@ -592,6 +592,11 @@ struct hal_rx_eht_info {
        u32 user_info[EHT_MAX_USER_INFO];
 };
 
+struct hal_rx_msdu_desc_info {
+       u32 msdu_flags;
+       u16 msdu_len; /* 14 bits for length */
+};
+
 struct hal_rx_mon_ppdu_info {
        u32 ppdu_id;
        u32 last_ppdu_id;
index ffebeb1652e7b8ca673211b29589a205a555fd98..dae3f262cc5071d8b55860e70960d184ab3cc902 100644 (file)
@@ -19,6 +19,196 @@ ath12k_wifi7_dp_mon_rx_memset_ppdu_info(struct hal_rx_mon_ppdu_info *ppdu_info)
        ppdu_info->peer_id = HAL_INVALID_PEERID;
 }
 
+static u32
+ath12k_wifi7_dp_rx_mon_mpdu_pop(struct ath12k *ar, int mac_id,
+                               void *ring_entry, struct sk_buff **head_msdu,
+                               struct sk_buff **tail_msdu,
+                               struct list_head *used_list,
+                               u32 *npackets, u32 *ppdu_id)
+{
+       struct ath12k_mon_data *pmon = (struct ath12k_mon_data *)&ar->dp.mon_data;
+       struct ath12k_base *ab = ar->ab;
+       struct ath12k_dp *dp = ath12k_ab_to_dp(ab);
+       struct ath12k_buffer_addr *p_buf_addr_info, *p_last_buf_addr_info;
+       u32 msdu_ppdu_id = 0, msdu_cnt = 0, total_len = 0, frag_len = 0;
+       u32 rx_buf_size, rx_pkt_offset, sw_cookie;
+       bool is_frag, is_first_msdu, drop_mpdu = false;
+       struct hal_reo_entrance_ring *ent_desc =
+               (struct hal_reo_entrance_ring *)ring_entry;
+       u32 rx_bufs_used = 0, i = 0, desc_bank = 0;
+       struct hal_rx_desc *rx_desc, *tail_rx_desc;
+       struct hal_rx_msdu_link *msdu_link_desc;
+       struct sk_buff *msdu = NULL, *last = NULL;
+       struct ath12k_rx_desc_info *desc_info;
+       struct ath12k_buffer_addr buf_info;
+       struct hal_rx_msdu_list msdu_list;
+       struct ath12k_skb_rxcb *rxcb;
+       u16 num_msdus = 0;
+       dma_addr_t paddr;
+       u8 rbm;
+
+       ath12k_wifi7_hal_rx_reo_ent_buf_paddr_get(ring_entry, &paddr,
+                                                 &sw_cookie,
+                                                 &p_last_buf_addr_info,
+                                                 &rbm,
+                                                 &msdu_cnt);
+
+       spin_lock_bh(&pmon->mon_lock);
+
+       if (le32_get_bits(ent_desc->info1,
+                         HAL_REO_ENTR_RING_INFO1_RXDMA_PUSH_REASON) ==
+                         HAL_REO_DEST_RING_PUSH_REASON_ERR_DETECTED) {
+               u8 rxdma_err = le32_get_bits(ent_desc->info1,
+                                            HAL_REO_ENTR_RING_INFO1_RXDMA_ERROR_CODE);
+               if (rxdma_err == HAL_REO_ENTR_RING_RXDMA_ECODE_FLUSH_REQUEST_ERR ||
+                   rxdma_err == HAL_REO_ENTR_RING_RXDMA_ECODE_MPDU_LEN_ERR ||
+                   rxdma_err == HAL_REO_ENTR_RING_RXDMA_ECODE_OVERFLOW_ERR) {
+                       drop_mpdu = true;
+                       pmon->rx_mon_stats.dest_mpdu_drop++;
+               }
+       }
+
+       is_frag = false;
+       is_first_msdu = true;
+       rx_pkt_offset = sizeof(struct hal_rx_desc);
+
+       do {
+               if (pmon->mon_last_linkdesc_paddr == paddr) {
+                       pmon->rx_mon_stats.dup_mon_linkdesc_cnt++;
+                       spin_unlock_bh(&pmon->mon_lock);
+                       return rx_bufs_used;
+               }
+
+               desc_bank = u32_get_bits(sw_cookie, DP_LINK_DESC_BANK_MASK);
+               msdu_link_desc =
+                       dp->link_desc_banks[desc_bank].vaddr +
+                       (paddr - dp->link_desc_banks[desc_bank].paddr);
+
+               ath12k_wifi7_hal_rx_msdu_list_get(ar, msdu_link_desc, &msdu_list,
+                                                 &num_msdus);
+               desc_info = ath12k_dp_get_rx_desc(ar->ab->dp,
+                                                 msdu_list.sw_cookie[num_msdus - 1]);
+               tail_rx_desc = (struct hal_rx_desc *)(desc_info->skb)->data;
+
+               for (i = 0; i < num_msdus; i++) {
+                       u32 l2_hdr_offset;
+
+                       if (pmon->mon_last_buf_cookie == msdu_list.sw_cookie[i]) {
+                               ath12k_dbg(ar->ab, ATH12K_DBG_DATA,
+                                          "i %d last_cookie %d is same\n",
+                                          i, pmon->mon_last_buf_cookie);
+                               drop_mpdu = true;
+                               pmon->rx_mon_stats.dup_mon_buf_cnt++;
+                               continue;
+                       }
+
+                       desc_info =
+                               ath12k_dp_get_rx_desc(ar->ab->dp, msdu_list.sw_cookie[i]);
+                       msdu = desc_info->skb;
+
+                       if (!msdu) {
+                               ath12k_dbg(ar->ab, ATH12K_DBG_DATA,
+                                          "msdu_pop: invalid msdu (%d/%d)\n",
+                                          i + 1, num_msdus);
+                               goto next_msdu;
+                       }
+                       rxcb = ATH12K_SKB_RXCB(msdu);
+                       if (rxcb->paddr != msdu_list.paddr[i]) {
+                               ath12k_dbg(ar->ab, ATH12K_DBG_DATA,
+                                          "i %d paddr %lx != %lx\n",
+                                          i, (unsigned long)rxcb->paddr,
+                                          (unsigned long)msdu_list.paddr[i]);
+                               drop_mpdu = true;
+                               continue;
+                       }
+                       if (!rxcb->unmapped) {
+                               dma_unmap_single(ar->ab->dev, rxcb->paddr,
+                                                msdu->len +
+                                                skb_tailroom(msdu),
+                                                DMA_FROM_DEVICE);
+                               rxcb->unmapped = 1;
+                       }
+                       if (drop_mpdu) {
+                               ath12k_dbg(ar->ab, ATH12K_DBG_DATA,
+                                          "i %d drop msdu %p *ppdu_id %x\n",
+                                          i, msdu, *ppdu_id);
+                               dev_kfree_skb_any(msdu);
+                               msdu = NULL;
+                               goto next_msdu;
+                       }
+
+                       rx_desc = (struct hal_rx_desc *)msdu->data;
+                       l2_hdr_offset = ath12k_dp_rx_h_l3pad(ar->ab, tail_rx_desc);
+                       if (is_first_msdu) {
+                               if (!ath12k_wifi7_dp_rxdesc_mpdu_valid(ar->ab,
+                                                                      rx_desc)) {
+                                       drop_mpdu = true;
+                                       dev_kfree_skb_any(msdu);
+                                       msdu = NULL;
+                                       pmon->mon_last_linkdesc_paddr = paddr;
+                                       goto next_msdu;
+                               }
+                               msdu_ppdu_id =
+                                       ath12k_dp_rxdesc_get_ppduid(ar->ab, rx_desc);
+
+                               if (ath12k_dp_mon_comp_ppduid(msdu_ppdu_id,
+                                                             ppdu_id)) {
+                                       spin_unlock_bh(&pmon->mon_lock);
+                                       return rx_bufs_used;
+                               }
+                               pmon->mon_last_linkdesc_paddr = paddr;
+                               is_first_msdu = false;
+                       }
+                       ath12k_dp_mon_get_buf_len(&msdu_list.msdu_info[i],
+                                                 &is_frag, &total_len,
+                                                 &frag_len, &msdu_cnt);
+                       rx_buf_size = rx_pkt_offset + l2_hdr_offset + frag_len;
+
+                       if (ath12k_dp_pkt_set_pktlen(msdu, rx_buf_size)) {
+                               dev_kfree_skb_any(msdu);
+                               goto next_msdu;
+                       }
+
+                       if (!(*head_msdu))
+                               *head_msdu = msdu;
+                       else if (last)
+                               last->next = msdu;
+
+                       last = msdu;
+next_msdu:
+                       pmon->mon_last_buf_cookie = msdu_list.sw_cookie[i];
+                       rx_bufs_used++;
+                       desc_info->skb = NULL;
+                       list_add_tail(&desc_info->list, used_list);
+               }
+
+               ath12k_wifi7_hal_rx_buf_addr_info_set(&buf_info, paddr,
+                                                     sw_cookie, rbm);
+
+               ath12k_dp_mon_next_link_desc_get(ab, msdu_link_desc, &paddr,
+                                                &sw_cookie, &rbm,
+                                                &p_buf_addr_info);
+
+               ath12k_dp_arch_rx_link_desc_return(ar->ab->dp, &buf_info,
+                                                  HAL_WBM_REL_BM_ACT_PUT_IN_IDLE);
+
+               p_last_buf_addr_info = p_buf_addr_info;
+
+       } while (paddr && msdu_cnt);
+
+       spin_unlock_bh(&pmon->mon_lock);
+
+       if (last)
+               last->next = NULL;
+
+       *tail_msdu = msdu;
+
+       if (msdu_cnt == 0)
+               *npackets = 1;
+
+       return rx_bufs_used;
+}
+
 /* The destination ring processing is stuck if the destination is not
  * moving while status ring moves 16 PPDU. The destination ring processing
  * skips this destination ring PPDU as a workaround.
@@ -58,10 +248,13 @@ ath12k_wifi7_dp_rx_mon_dest_process(struct ath12k *ar, int mac_id,
                head_msdu = NULL;
                tail_msdu = NULL;
 
-               mpdu_rx_bufs_used = ath12k_dp_rx_mon_mpdu_pop(ar, mac_id, ring_entry,
-                                                             &head_msdu, &tail_msdu,
-                                                             &rx_desc_used_list,
-                                                             &npackets, &ppdu_id);
+               mpdu_rx_bufs_used = ath12k_wifi7_dp_rx_mon_mpdu_pop(ar, mac_id,
+                                                                   ring_entry,
+                                                                   &head_msdu,
+                                                                   &tail_msdu,
+                                                                   &rx_desc_used_list,
+                                                                   &npackets,
+                                                                   &ppdu_id);
 
                rx_bufs_used += mpdu_rx_bufs_used;
 
index 2138b20a04d57ec278b3b7c1f788616eaf65cfa9..08dcf170b801d6f4c92f5b3131135ddd5b62f9b7 100644 (file)
@@ -2141,3 +2141,14 @@ void ath12k_wifi7_dp_rx_process_reo_status(struct ath12k_dp *dp)
 
        spin_unlock_bh(&srng->lock);
 }
+
+bool
+ath12k_wifi7_dp_rxdesc_mpdu_valid(struct ath12k_base *ab,
+                                 struct hal_rx_desc *rx_desc)
+{
+       u32 tlv_tag;
+
+       tlv_tag = ab->hal.ops->rx_desc_get_mpdu_start_tag(rx_desc);
+
+       return tlv_tag == HAL_RX_MPDU_START;
+}
index b92f9cf173dc84d8f6de9751ed6ddb6643c04fef..2d3eb2313b2f75b2c50bdb4f7cd06e71f8d9c6f9 100644 (file)
@@ -49,6 +49,9 @@ int ath12k_wifi7_peer_rx_tid_reo_update(struct ath12k_dp *dp,
                                        struct ath12k_dp_rx_tid *rx_tid,
                                        u32 ba_win_sz, u16 ssn,
                                        bool update_ssn);
+bool
+ath12k_wifi7_dp_rxdesc_mpdu_valid(struct ath12k_base *ab,
+                                 struct hal_rx_desc *rx_desc);
 static inline
 void ath12k_wifi7_dp_extract_rx_desc_data(struct ath12k_hal *hal,
                                          struct hal_rx_desc_data *rx_info,
index 2715b7d52cfc901d61e2b72d3515f2dcbff76f0e..c5a2125a04af0f4f9e9de7a11656deaed9bd7802 100644 (file)
@@ -313,11 +313,6 @@ struct hal_rx_rxpcu_classification_overview {
        u32 rsvd0;
 } __packed;
 
-struct hal_rx_msdu_desc_info {
-       u32 msdu_flags;
-       u16 msdu_len; /* 14 bits for length */
-};
-
 #define HAL_RX_NUM_MSDU_DESC 6
 struct hal_rx_msdu_list {
        struct hal_rx_msdu_desc_info msdu_info[HAL_RX_NUM_MSDU_DESC];