]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commitdiff
ath10k: Fix the parsing error in service available event
authorRakesh Pillai <pillair@codeaurora.org>
Tue, 24 Nov 2020 15:59:17 +0000 (17:59 +0200)
committerKleber Sacilotto de Souza <kleber.souza@canonical.com>
Wed, 20 Jan 2021 13:25:53 +0000 (14:25 +0100)
BugLink: https://bugs.launchpad.net/bugs/1910822
[ Upstream commit c7cee9c0f499f27ec6de06bea664b61320534768 ]

The wmi service available event has been
extended to contain extra 128 bit for new services
to be indicated by firmware.

Currently the presence of any optional TLVs in
the wmi service available event leads to a parsing
error with the below error message:
ath10k_snoc 18800000.wifi: failed to parse svc_avail tlv: -71

The wmi service available event parsing should
not return error for the newly added optional TLV.
Fix this parsing for service available event message.

Tested-on: WCN3990 hw1.0 SNOC WLAN.HL.3.2.2-00720-QCAHLSWMTPL-1

Fixes: cea19a6ce8bf ("ath10k: add WMI_SERVICE_AVAILABLE_EVENT support")
Signed-off-by: Rakesh Pillai <pillair@codeaurora.org>
Reviewed-by: Douglas Anderson <dianders@chromium.org>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/1605501291-23040-1-git-send-email-pillair@codeaurora.org
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Kelsey Skunberg <kelsey.skunberg@canonical.com>
drivers/net/wireless/ath/ath10k/wmi-tlv.c
drivers/net/wireless/ath/ath10k/wmi.c
drivers/net/wireless/ath/ath10k/wmi.h

index 77c19341b86ffa07d9cc4f0b2639046c1707432b..890af91b75707a48745b250869c3f28b1429d8ba 100644 (file)
@@ -1307,13 +1307,15 @@ static int ath10k_wmi_tlv_svc_avail_parse(struct ath10k *ar, u16 tag, u16 len,
 
        switch (tag) {
        case WMI_TLV_TAG_STRUCT_SERVICE_AVAILABLE_EVENT:
+               arg->service_map_ext_valid = true;
                arg->service_map_ext_len = *(__le32 *)ptr;
                arg->service_map_ext = ptr + sizeof(__le32);
                return 0;
        default:
                break;
        }
-       return -EPROTO;
+
+       return 0;
 }
 
 static int ath10k_wmi_tlv_op_pull_svc_avail(struct ath10k *ar,
index 7005b07beee2fba6d8a0be0e75fe20732de22226..0056014eaf3656baac376e2c50e0b2c531efa59c 100644 (file)
@@ -5668,8 +5668,13 @@ void ath10k_wmi_event_service_available(struct ath10k *ar, struct sk_buff *skb)
                            ret);
        }
 
-       ath10k_wmi_map_svc_ext(ar, arg.service_map_ext, ar->wmi.svc_map,
-                              __le32_to_cpu(arg.service_map_ext_len));
+       /*
+        * Initialization of "arg.service_map_ext_valid" to ZERO is necessary
+        * for the below logic to work.
+        */
+       if (arg.service_map_ext_valid)
+               ath10k_wmi_map_svc_ext(ar, arg.service_map_ext, ar->wmi.svc_map,
+                                      __le32_to_cpu(arg.service_map_ext_len));
 }
 
 static int ath10k_wmi_event_temperature(struct ath10k *ar, struct sk_buff *skb)
index c1c9053d17655524a0cc006c64c2da408487840c..cfc7b8c83d4e673c038f342de4362c141430ed56 100644 (file)
@@ -6860,6 +6860,7 @@ struct wmi_svc_rdy_ev_arg {
 };
 
 struct wmi_svc_avail_ev_arg {
+       bool service_map_ext_valid;
        __le32 service_map_ext_len;
        const __le32 *service_map_ext;
 };