diff options
Diffstat (limited to 'package/kernel/mac80211/patches/357-0009-brcmfmac-use-provided-channels-for-scheduled-scan.patch')
-rw-r--r-- | package/kernel/mac80211/patches/357-0009-brcmfmac-use-provided-channels-for-scheduled-scan.patch | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/package/kernel/mac80211/patches/357-0009-brcmfmac-use-provided-channels-for-scheduled-scan.patch b/package/kernel/mac80211/patches/357-0009-brcmfmac-use-provided-channels-for-scheduled-scan.patch new file mode 100644 index 0000000000..fae844c02a --- /dev/null +++ b/package/kernel/mac80211/patches/357-0009-brcmfmac-use-provided-channels-for-scheduled-scan.patch @@ -0,0 +1,111 @@ +From 331e789443618ca9cc3ed48ada4e670225cca036 Mon Sep 17 00:00:00 2001 +From: Arend Van Spriel <arend.vanspriel@broadcom.com> +Date: Wed, 23 Nov 2016 10:25:28 +0000 +Subject: [PATCH] brcmfmac: use provided channels for scheduled scan + +User-space can provide list of channels in the schedule scan request. +This was ignored so all channels supported and allowed by the device +were used. This patch configures the device to use the channels as +listed in the request. + +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> +--- + .../broadcom/brcm80211/brcmfmac/fwil_types.h | 16 +++++++++++++ + .../net/wireless/broadcom/brcm80211/brcmfmac/pno.c | 26 +++++++++++++++++++++- + 2 files changed, 41 insertions(+), 1 deletion(-) + +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h +@@ -131,6 +131,7 @@ + #define BRCMF_TXBF_MU_BFR_CAP BIT(1) + + #define BRCMF_MAXPMKID 16 /* max # PMKID cache entries */ ++#define BRCMF_NUMCHANNELS 64 + + #define BRCMF_PFN_MACADDR_CFG_VER 1 + #define BRCMF_PFN_MAC_OUI_ONLY BIT(0) +@@ -719,6 +720,21 @@ struct brcmf_pno_param_le { + }; + + /** ++ * struct brcmf_pno_config_le - PNO channel configuration. ++ * ++ * @reporttype: determines what is reported. ++ * @channel_num: number of channels specified in @channel_list. ++ * @channel_list: channels to use in PNO scan. ++ * @flags: reserved. ++ */ ++struct brcmf_pno_config_le { ++ __le32 reporttype; ++ __le32 channel_num; ++ __le16 channel_list[BRCMF_NUMCHANNELS]; ++ __le32 flags; ++}; ++ ++/** + * struct brcmf_pno_net_param_le - scan parameters per preferred network. + * + * @ssid: ssid name and its length. +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c +@@ -18,9 +18,10 @@ + + #include "core.h" + #include "debug.h" +-#include "pno.h" + #include "fwil.h" + #include "fwil_types.h" ++#include "cfg80211.h" ++#include "pno.h" + + #define BRCMF_PNO_VERSION 2 + #define BRCMF_PNO_REPEAT 4 +@@ -34,6 +35,15 @@ + #define BRCMF_PNO_HIDDEN_BIT 2 + #define BRCMF_PNO_SCHED_SCAN_PERIOD 30 + ++static int brcmf_pno_channel_config(struct brcmf_if *ifp, ++ struct brcmf_pno_config_le *cfg) ++{ ++ cfg->reporttype = 0; ++ cfg->flags = 0; ++ ++ return brcmf_fil_iovar_data_set(ifp, "pfn_cfg", cfg, sizeof(*cfg)); ++} ++ + static int brcmf_pno_config(struct brcmf_if *ifp, u32 scan_freq, + u32 mscan, u32 bestn) + { +@@ -167,7 +177,10 @@ int brcmf_pno_clean(struct brcmf_if *ifp + int brcmf_pno_start_sched_scan(struct brcmf_if *ifp, + struct cfg80211_sched_scan_request *req) + { ++ struct brcmu_d11inf *d11inf; ++ struct brcmf_pno_config_le pno_cfg; + struct cfg80211_ssid *ssid; ++ u16 chan; + int i, ret; + + /* clean up everything */ +@@ -190,6 +203,17 @@ int brcmf_pno_start_sched_scan(struct br + return ret; + } + ++ /* configure channels to use */ ++ d11inf = &ifp->drvr->config->d11inf; ++ for (i = 0; i < req->n_channels; i++) { ++ chan = req->channels[i]->hw_value; ++ pno_cfg.channel_list[i] = cpu_to_le16(chan); ++ } ++ if (req->n_channels) { ++ pno_cfg.channel_num = cpu_to_le32(req->n_channels); ++ brcmf_pno_channel_config(ifp, &pno_cfg); ++ } ++ + /* configure each match set */ + for (i = 0; i < req->n_match_sets; i++) { + ssid = &req->match_sets[i].ssid; |