Oliver Neukum 83c577
From c7cee9c0f499f27ec6de06bea664b61320534768 Mon Sep 17 00:00:00 2001
Oliver Neukum 83c577
From: Rakesh Pillai <pillair@codeaurora.org>
Oliver Neukum 83c577
Date: Tue, 24 Nov 2020 17:59:17 +0200
Oliver Neukum 83c577
Subject: [PATCH] ath10k: Fix the parsing error in service available event
Oliver Neukum 83c577
Git-commit: c7cee9c0f499f27ec6de06bea664b61320534768
Oliver Neukum 83c577
References: git-fixes
Oliver Neukum 83c577
Patch-mainline: v5.11-rc1
Oliver Neukum 83c577
Oliver Neukum 83c577
The wmi service available event has been
Oliver Neukum 83c577
extended to contain extra 128 bit for new services
Oliver Neukum 83c577
to be indicated by firmware.
Oliver Neukum 83c577
Oliver Neukum 83c577
Currently the presence of any optional TLVs in
Oliver Neukum 83c577
the wmi service available event leads to a parsing
Oliver Neukum 83c577
error with the below error message:
Oliver Neukum 83c577
ath10k_snoc 18800000.wifi: failed to parse svc_avail tlv: -71
Oliver Neukum 83c577
Oliver Neukum 83c577
The wmi service available event parsing should
Oliver Neukum 83c577
not return error for the newly added optional TLV.
Oliver Neukum 83c577
Fix this parsing for service available event message.
Oliver Neukum 83c577
Oliver Neukum 83c577
Tested-on: WCN3990 hw1.0 SNOC WLAN.HL.3.2.2-00720-QCAHLSWMTPL-1
Oliver Neukum 83c577
Oliver Neukum 83c577
Fixes: cea19a6ce8bf ("ath10k: add WMI_SERVICE_AVAILABLE_EVENT support")
Oliver Neukum 83c577
Signed-off-by: Rakesh Pillai <pillair@codeaurora.org>
Oliver Neukum 83c577
Reviewed-by: Douglas Anderson <dianders@chromium.org>
Oliver Neukum 83c577
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Oliver Neukum 83c577
Link: https://lore.kernel.org/r/1605501291-23040-1-git-send-email-pillair@codeaurora.org
Oliver Neukum 83c577
Signed-off-by: Oliver Neukum <oneukum@suse.com>
Oliver Neukum 83c577
---
Oliver Neukum 83c577
 drivers/net/wireless/ath/ath10k/wmi-tlv.c | 4 +++-
Oliver Neukum 83c577
 drivers/net/wireless/ath/ath10k/wmi.c     | 9 +++++++--
Oliver Neukum 83c577
 drivers/net/wireless/ath/ath10k/wmi.h     | 1 +
Oliver Neukum 83c577
 3 files changed, 11 insertions(+), 3 deletions(-)
Oliver Neukum 83c577
Oliver Neukum 83c577
diff --git a/drivers/net/wireless/ath/ath10k/wmi-tlv.c b/drivers/net/wireless/ath/ath10k/wmi-tlv.c
Oliver Neukum 83c577
index 932266d1111b..7b5834157fe5 100644
Oliver Neukum 83c577
--- a/drivers/net/wireless/ath/ath10k/wmi-tlv.c
Oliver Neukum 83c577
+++ b/drivers/net/wireless/ath/ath10k/wmi-tlv.c
Oliver Neukum 83c577
@@ -1401,13 +1401,15 @@ static int ath10k_wmi_tlv_svc_avail_parse(struct ath10k *ar, u16 tag, u16 len,
Oliver Neukum 83c577
 
Oliver Neukum 83c577
 	switch (tag) {
Oliver Neukum 83c577
 	case WMI_TLV_TAG_STRUCT_SERVICE_AVAILABLE_EVENT:
Oliver Neukum 83c577
+		arg->service_map_ext_valid = true;
Oliver Neukum 83c577
 		arg->service_map_ext_len = *(__le32 *)ptr;
Oliver Neukum 83c577
 		arg->service_map_ext = ptr + sizeof(__le32);
Oliver Neukum 83c577
 		return 0;
Oliver Neukum 83c577
 	default:
Oliver Neukum 83c577
 		break;
Oliver Neukum 83c577
 	}
Oliver Neukum 83c577
-	return -EPROTO;
Oliver Neukum 83c577
+
Oliver Neukum 83c577
+	return 0;
Oliver Neukum 83c577
 }
Oliver Neukum 83c577
 
Oliver Neukum 83c577
 static int ath10k_wmi_tlv_op_pull_svc_avail(struct ath10k *ar,
Oliver Neukum 83c577
diff --git a/drivers/net/wireless/ath/ath10k/wmi.c b/drivers/net/wireless/ath/ath10k/wmi.c
Oliver Neukum 83c577
index c521f0b27831..c491acebdb46 100644
Oliver Neukum 83c577
--- a/drivers/net/wireless/ath/ath10k/wmi.c
Oliver Neukum 83c577
+++ b/drivers/net/wireless/ath/ath10k/wmi.c
Oliver Neukum 83c577
@@ -5751,8 +5751,13 @@ void ath10k_wmi_event_service_available(struct ath10k *ar, struct sk_buff *skb)
Oliver Neukum 83c577
 			    ret);
Oliver Neukum 83c577
 	}
Oliver Neukum 83c577
 
Oliver Neukum 83c577
-	ath10k_wmi_map_svc_ext(ar, arg.service_map_ext, ar->wmi.svc_map,
Oliver Neukum 83c577
-			       __le32_to_cpu(arg.service_map_ext_len));
Oliver Neukum 83c577
+	/*
Oliver Neukum 83c577
+	 * Initialization of "arg.service_map_ext_valid" to ZERO is necessary
Oliver Neukum 83c577
+	 * for the below logic to work.
Oliver Neukum 83c577
+	 */
Oliver Neukum 83c577
+	if (arg.service_map_ext_valid)
Oliver Neukum 83c577
+		ath10k_wmi_map_svc_ext(ar, arg.service_map_ext, ar->wmi.svc_map,
Oliver Neukum 83c577
+				       __le32_to_cpu(arg.service_map_ext_len));
Oliver Neukum 83c577
 }
Oliver Neukum 83c577
 
Oliver Neukum 83c577
 static int ath10k_wmi_event_temperature(struct ath10k *ar, struct sk_buff *skb)
Oliver Neukum 83c577
diff --git a/drivers/net/wireless/ath/ath10k/wmi.h b/drivers/net/wireless/ath/ath10k/wmi.h
Oliver Neukum 83c577
index c32aabea8293..d870f7067cb7 100644
Oliver Neukum 83c577
--- a/drivers/net/wireless/ath/ath10k/wmi.h
Oliver Neukum 83c577
+++ b/drivers/net/wireless/ath/ath10k/wmi.h
Oliver Neukum 83c577
@@ -6919,6 +6919,7 @@ struct wmi_svc_rdy_ev_arg {
Oliver Neukum 83c577
 };
Oliver Neukum 83c577
 
Oliver Neukum 83c577
 struct wmi_svc_avail_ev_arg {
Oliver Neukum 83c577
+	bool service_map_ext_valid;
Oliver Neukum 83c577
 	__le32 service_map_ext_len;
Oliver Neukum 83c577
 	const __le32 *service_map_ext;
Oliver Neukum 83c577
 };
Oliver Neukum 83c577
-- 
Oliver Neukum 83c577
2.40.0
Oliver Neukum 83c577