aboutsummaryrefslogtreecommitdiffstats
path: root/package/kernel/mac80211/patches/357-0009-brcmfmac-use-provided-channels-for-scheduled-scan.patch
diff options
context:
space:
mode:
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.patch111
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;