wifi: ath12k: Add support for parsing 64-bit TLVs
authorP Praneesh <quic_ppranees@quicinc.com>
Tue, 17 Dec 2024 09:50:58 +0000 (15:20 +0530)
committerJeff Johnson <jeff.johnson@oss.qualcomm.com>
Thu, 19 Dec 2024 17:41:04 +0000 (09:41 -0800)
There is mismatch between the format of monitor destination TLVs received
and the expected format by the current implementation. The received TLVs
are in 64-bit format, while the implementation is designed to handle
32-bit TLVs. This leads to incorrect parsing. Fix it by adding support
for parsing 64-bit TLVs.

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>
Acked-by: Kalle Valo <kvalo@kernel.org>
Acked-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
Link: https://patch.msgid.link/20241217095058.2725755-1-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/hal_desc.h

index 2d53404095d6be71adb304c67f6cda8c144b5272..c6cc4a1a5230492ffb9e91d45cf43df4af73602c 100644 (file)
@@ -1205,19 +1205,19 @@ ath12k_dp_mon_parse_rx_dest(struct ath12k_base *ab, struct ath12k_mon_data *pmon
                            struct sk_buff *skb)
 {
        struct hal_rx_mon_ppdu_info *ppdu_info = &pmon->mon_ppdu_info;
-       struct hal_tlv_hdr *tlv;
+       struct hal_tlv_64_hdr *tlv;
        enum hal_rx_mon_status hal_status;
-       u32 tlv_userid = 0;
+       u32 tlv_userid;
        u16 tlv_tag, tlv_len;
        u8 *ptr = skb->data;
 
        memset(ppdu_info, 0, sizeof(struct hal_rx_mon_ppdu_info));
 
        do {
-               tlv = (struct hal_tlv_hdr *)ptr;
-               tlv_tag = le32_get_bits(tlv->tl, HAL_TLV_HDR_TAG);
-               tlv_len = le32_get_bits(tlv->tl, HAL_TLV_HDR_LEN);
-               tlv_userid = le32_get_bits(tlv->tl, HAL_TLV_USR_ID);
+               tlv = (struct hal_tlv_64_hdr *)ptr;
+               tlv_tag = le64_get_bits(tlv->tl, HAL_TLV_64_HDR_TAG);
+               tlv_len = le64_get_bits(tlv->tl, HAL_TLV_64_HDR_LEN);
+               tlv_userid = le64_get_bits(tlv->tl, HAL_TLV_64_USR_ID);
                ptr += sizeof(*tlv);
 
                /* The actual length of PPDU_END is the combined length of many PHY
@@ -1232,7 +1232,7 @@ ath12k_dp_mon_parse_rx_dest(struct ath12k_base *ab, struct ath12k_mon_data *pmon
                hal_status = ath12k_dp_mon_rx_parse_status_tlv(ab, pmon,
                                                               tlv_tag, ptr, tlv_userid);
                ptr += tlv_len;
-               ptr = PTR_ALIGN(ptr, HAL_TLV_ALIGN);
+               ptr = PTR_ALIGN(ptr, HAL_TLV_64_ALIGN);
 
                if ((ptr - skb->data) >= DP_RX_BUFFER_SIZE)
                        break;
index a460d432288fa1c716a9bc722fb2817ff7091fc0..b90a6da72e297226606380110f5d30e5a06d6871 100644 (file)
@@ -579,6 +579,8 @@ struct hal_tlv_hdr {
 
 #define HAL_TLV_64_HDR_TAG             GENMASK(9, 1)
 #define HAL_TLV_64_HDR_LEN             GENMASK(21, 10)
+#define HAL_TLV_64_USR_ID              GENMASK(31, 26)
+#define HAL_TLV_64_ALIGN               8
 
 struct hal_tlv_64_hdr {
        __le64 tl;