|
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 |
|