brcmfmac: fix scheduled scan result handling for newer chips
authorArend Van Spriel <arend.vanspriel@broadcom.com>
Wed, 23 Nov 2016 10:25:31 +0000 (10:25 +0000)
committerKalle Valo <kvalo@codeaurora.org>
Tue, 29 Nov 2016 15:29:31 +0000 (17:29 +0200)
The scan results for scheduled scan as retrieved from the device
have changed. A field has been added which is not needed. However,
the appended info is. Luckily they are versioned so check that to
find out the location of the appended data.

Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
Reviewed-by: Franky Lin <franky.lin@broadcom.com>
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h

index cc12b14c0f032815a4a7d1b77c2ac793d453e3b6..f28f03a6fbfb3ecd5e129739976576ec32dd5738 100644 (file)
@@ -3257,6 +3257,28 @@ static int brcmf_start_internal_escan(struct brcmf_if *ifp,
        return 0;
 }
 
+static struct brcmf_pno_net_info_le *
+brcmf_get_netinfo_array(struct brcmf_pno_scanresults_le *pfn_v1)
+{
+       struct brcmf_pno_scanresults_v2_le *pfn_v2;
+       struct brcmf_pno_net_info_le *netinfo;
+
+       switch (pfn_v1->version) {
+       default:
+               WARN_ON(1);
+               /* fall-thru */
+       case cpu_to_le32(1):
+               netinfo = (struct brcmf_pno_net_info_le *)(pfn_v1 + 1);
+               break;
+       case cpu_to_le32(2):
+               pfn_v2 = (struct brcmf_pno_scanresults_v2_le *)pfn_v1;
+               netinfo = (struct brcmf_pno_net_info_le *)(pfn_v2 + 1);
+               break;
+       }
+
+       return netinfo;
+}
+
 /* PFN result doesn't have all the info which are required by the supplicant
  * (For e.g IEs) Do a target Escan so that sched scan results are reported
  * via wl_inform_single_bss in the required format. Escan does require the
@@ -3309,7 +3331,7 @@ brcmf_notify_sched_scan_results(struct brcmf_if *ifp,
        }
 
        data += sizeof(struct brcmf_pno_scanresults_le);
-       netinfo_start = (struct brcmf_pno_net_info_le *)data;
+       netinfo_start = brcmf_get_netinfo_array(pfn_result);
 
        for (i = 0; i < result_count; i++) {
                netinfo = &netinfo_start[i];
index 64aed2d0b9ede22fe5ee0751b388014ce002344c..9a1eb5ab6c4b11c4ef822ea65fe1a4db4fe473f3 100644 (file)
@@ -785,6 +785,13 @@ struct brcmf_pno_scanresults_le {
        __le32 count;
 };
 
+struct brcmf_pno_scanresults_v2_le {
+       __le32 version;
+       __le32 status;
+       __le32 count;
+       __le32 scan_ch_bucket;
+};
+
 /**
  * struct brcmf_pno_macaddr_le - to configure PNO macaddr randomization.
  *