]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: ath12k: parse msdu_end tlv in ath12k_dp_mon_rx_parse_status_tlv()
authorKang Yang <kang.yang@oss.qualcomm.com>
Mon, 21 Apr 2025 02:34:32 +0000 (10:34 +0800)
committerJeff Johnson <jeff.johnson@oss.qualcomm.com>
Fri, 16 May 2025 19:38:54 +0000 (12:38 -0700)
Currently, error bitmap and decap format are parsed in
ath12k_dp_mon_parse_rx_dest_tlv(). Then stored into dp_rx_mon_mpdu_list.
ath12k_dp_mon_parse_rx_dest_tlv() and dp_rx_mon_mpdu_list are only used
by QCN9274.

For WCN7850, error bitmap and decap format are also needed. So need to
parse MSDU END TLV in ath12k_dp_mon_rx_parse_status_tlv(), this is the
common function for WCN7850 and QCN9274. Then store error bitmap and
decap format so that QCN9274 can fetch them when processing MSDU payload.

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

Signed-off-by: Kang Yang <kang.yang@oss.qualcomm.com>
Reviewed-by: Vasanthakumar Thiagarajan <vasanthakumar.thiagarajan@oss.qualcomm.com>
Link: https://patch.msgid.link/20250421023444.1778-2-kang.yang@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_mon.c

index 706d766d8c81a59df3e650f65e386094aa6af9ee..2ce6f0d7574fcfddf23b5e1414357d9c24cda68b 100644 (file)
@@ -121,6 +121,8 @@ struct ath12k_mon_data {
        u32 mon_last_buf_cookie;
        u64 mon_last_linkdesc_paddr;
        u16 chan_noise_floor;
+       u32 err_bitmap;
+       u8 decap_format;
 
        struct ath12k_pdev_mon_stats rx_mon_stats;
        /* lock for monitor data */
index 17117315ec7bc86c3c3f97a937ecc8bc6d8cf1be..7404d21eed3be144d5f104f3b1f1f6253b872287 100644 (file)
@@ -1416,6 +1416,40 @@ ath12k_dp_mon_hal_rx_parse_user_info(const struct hal_receive_user_info *rx_usr_
        }
 }
 
+static void ath12k_dp_mon_parse_rx_msdu_end_err(u32 info, u32 *errmap)
+{
+       if (info & RX_MSDU_END_INFO13_FCS_ERR)
+               *errmap |= HAL_RX_MPDU_ERR_FCS;
+
+       if (info & RX_MSDU_END_INFO13_DECRYPT_ERR)
+               *errmap |= HAL_RX_MPDU_ERR_DECRYPT;
+
+       if (info & RX_MSDU_END_INFO13_TKIP_MIC_ERR)
+               *errmap |= HAL_RX_MPDU_ERR_TKIP_MIC;
+
+       if (info & RX_MSDU_END_INFO13_A_MSDU_ERROR)
+               *errmap |= HAL_RX_MPDU_ERR_AMSDU_ERR;
+
+       if (info & RX_MSDU_END_INFO13_OVERFLOW_ERR)
+               *errmap |= HAL_RX_MPDU_ERR_OVERFLOW;
+
+       if (info & RX_MSDU_END_INFO13_MSDU_LEN_ERR)
+               *errmap |= HAL_RX_MPDU_ERR_MSDU_LEN;
+
+       if (info & RX_MSDU_END_INFO13_MPDU_LEN_ERR)
+               *errmap |= HAL_RX_MPDU_ERR_MPDU_LEN;
+}
+
+static void
+ath12k_dp_mon_parse_status_msdu_end(struct ath12k_mon_data *pmon,
+                                   const struct hal_rx_msdu_end *msdu_end)
+{
+       ath12k_dp_mon_parse_rx_msdu_end_err(__le32_to_cpu(msdu_end->info2),
+                                           &pmon->err_bitmap);
+       pmon->decap_format = le32_get_bits(msdu_end->info1,
+                                          RX_MSDU_END_INFO11_DECAP_FORMAT);
+}
+
 static enum hal_rx_mon_status
 ath12k_dp_mon_rx_parse_status_tlv(struct ath12k *ar,
                                  struct ath12k_mon_data *pmon,
@@ -1655,6 +1689,7 @@ ath12k_dp_mon_rx_parse_status_tlv(struct ath12k *ar,
        case HAL_MON_BUF_ADDR:
                return HAL_RX_MON_STATUS_BUF_ADDR;
        case HAL_RX_MSDU_END:
+               ath12k_dp_mon_parse_status_msdu_end(pmon, tlv_data);
                return HAL_RX_MON_STATUS_MSDU_END;
        case HAL_RX_MPDU_END:
                return HAL_RX_MON_STATUS_MPDU_END;
@@ -2223,45 +2258,6 @@ static int ath12k_dp_pkt_set_pktlen(struct sk_buff *skb, u32 len)
        return 0;
 }
 
-static void ath12k_dp_mon_parse_rx_msdu_end_err(u32 info, u32 *errmap)
-{
-       if (info & RX_MSDU_END_INFO13_FCS_ERR)
-               *errmap |= HAL_RX_MPDU_ERR_FCS;
-
-       if (info & RX_MSDU_END_INFO13_DECRYPT_ERR)
-               *errmap |= HAL_RX_MPDU_ERR_DECRYPT;
-
-       if (info & RX_MSDU_END_INFO13_TKIP_MIC_ERR)
-               *errmap |= HAL_RX_MPDU_ERR_TKIP_MIC;
-
-       if (info & RX_MSDU_END_INFO13_A_MSDU_ERROR)
-               *errmap |= HAL_RX_MPDU_ERR_AMSDU_ERR;
-
-       if (info & RX_MSDU_END_INFO13_OVERFLOW_ERR)
-               *errmap |= HAL_RX_MPDU_ERR_OVERFLOW;
-
-       if (info & RX_MSDU_END_INFO13_MSDU_LEN_ERR)
-               *errmap |= HAL_RX_MPDU_ERR_MSDU_LEN;
-
-       if (info & RX_MSDU_END_INFO13_MPDU_LEN_ERR)
-               *errmap |= HAL_RX_MPDU_ERR_MPDU_LEN;
-}
-
-static int
-ath12k_dp_mon_parse_status_msdu_end(struct ath12k_mon_data *pmon,
-                                   const struct hal_rx_msdu_end *msdu_end)
-{
-       struct dp_mon_mpdu *mon_mpdu = pmon->mon_mpdu;
-
-       ath12k_dp_mon_parse_rx_msdu_end_err(__le32_to_cpu(msdu_end->info2),
-                                           &mon_mpdu->err_bitmap);
-
-       mon_mpdu->decap_format = le32_get_bits(msdu_end->info1,
-                                              RX_MSDU_END_INFO11_DECAP_FORMAT);
-
-       return 0;
-}
-
 static int
 ath12k_dp_mon_parse_status_buf(struct ath12k *ar,
                               struct ath12k_mon_data *pmon,
@@ -2335,7 +2331,9 @@ ath12k_dp_mon_parse_rx_dest_tlv(struct ath12k *ar,
                pmon->mon_mpdu = NULL;
                break;
        case HAL_RX_MON_STATUS_MSDU_END:
-               return ath12k_dp_mon_parse_status_msdu_end(pmon, tlv_data);
+               pmon->mon_mpdu->decap_format = pmon->decap_format;
+               pmon->mon_mpdu->err_bitmap = pmon->err_bitmap;
+               break;
        default:
                break;
        }