ath11k: fix parsing PPDU_CTRL type in pktlog
authorAnilkumar Kolli <akolli@codeaurora.org>
Wed, 5 Feb 2020 07:15:59 +0000 (12:45 +0530)
committerKalle Valo <kvalo@codeaurora.org>
Tue, 11 Feb 2020 18:33:34 +0000 (20:33 +0200)
PPDU_CTRL type is missing in current pktlog dumps.
PPDU_CTRL is sent on CE5 with len 2560 bytes, current
driver ignores the payload len greter than 2048.
PPDU_CTRL of 2560 bytes is sent in two fragments of len 2028
and 532 bytes, but firmware reports pkt header has length as 2560
for both of the fragments.

Signed-off-by: Anilkumar Kolli <akolli@codeaurora.org>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/ath/ath11k/debug.h
drivers/net/wireless/ath/ath11k/dp_rx.c

index 8e8d558..427d3ac 100644 (file)
@@ -68,12 +68,19 @@ struct debug_htt_stats_req {
        u8 buf[0];
 };
 
-#define ATH11K_HTT_STATS_BUF_SIZE (1024 * 512)
+struct ath_pktlog_hdr {
+       u16 flags;
+       u16 missed_cnt;
+       u16 log_type;
+       u16 size;
+       u32 timestamp;
+       u32 type_specific_data;
+       u8 payload[0];
+};
 
+#define ATH11K_HTT_STATS_BUF_SIZE (1024 * 512)
 #define ATH11K_FW_STATS_BUF_SIZE (1024 * 1024)
 
-#define ATH11K_HTT_PKTLOG_MAX_SIZE 2048
-
 enum ath11k_pktlog_filter {
        ATH11K_PKTLOG_RX                = 0x000000001,
        ATH11K_PKTLOG_TX                = 0x000000002,
index 9cf331b..6dfaea1 100644 (file)
@@ -1300,18 +1300,10 @@ exit:
 static void ath11k_htt_pktlog(struct ath11k_base *ab, struct sk_buff *skb)
 {
        struct htt_pktlog_msg *data = (struct htt_pktlog_msg *)skb->data;
+       struct ath_pktlog_hdr *hdr = (struct ath_pktlog_hdr *)data;
        struct ath11k *ar;
-       u32 len;
        u8 pdev_id;
 
-       len = FIELD_GET(HTT_T2H_PPDU_STATS_INFO_PAYLOAD_SIZE, data->hdr);
-       if (len > ATH11K_HTT_PKTLOG_MAX_SIZE) {
-               ath11k_warn(ab, "htt pktlog buffer size %d, expected < %d\n",
-                           len,
-                           ATH11K_HTT_PKTLOG_MAX_SIZE);
-               return;
-       }
-
        pdev_id = FIELD_GET(HTT_T2H_PPDU_STATS_INFO_PDEV_ID, data->hdr);
        ar = ath11k_mac_get_ar_by_pdev_id(ab, pdev_id);
        if (!ar) {
@@ -1319,7 +1311,7 @@ static void ath11k_htt_pktlog(struct ath11k_base *ab, struct sk_buff *skb)
                return;
        }
 
-       trace_ath11k_htt_pktlog(ar, data->payload, len);
+       trace_ath11k_htt_pktlog(ar, data->payload, hdr->size);
 }
 
 void ath11k_dp_htt_htc_t2h_msg_handler(struct ath11k_base *ab,