aboutsummaryrefslogtreecommitdiffstats
path: root/package/kernel/mac80211/patches/357-0008-brcmfmac-move-scheduled-scan-activation-to-pno-sourc.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/kernel/mac80211/patches/357-0008-brcmfmac-move-scheduled-scan-activation-to-pno-sourc.patch')
-rw-r--r--package/kernel/mac80211/patches/357-0008-brcmfmac-move-scheduled-scan-activation-to-pno-sourc.patch292
1 files changed, 292 insertions, 0 deletions
diff --git a/package/kernel/mac80211/patches/357-0008-brcmfmac-move-scheduled-scan-activation-to-pno-sourc.patch b/package/kernel/mac80211/patches/357-0008-brcmfmac-move-scheduled-scan-activation-to-pno-sourc.patch
new file mode 100644
index 0000000000..6dcea2832a
--- /dev/null
+++ b/package/kernel/mac80211/patches/357-0008-brcmfmac-move-scheduled-scan-activation-to-pno-sourc.patch
@@ -0,0 +1,292 @@
+From 3e48611d31dd333be01576902f2dc11adefc9a06 Mon Sep 17 00:00:00 2001
+From: Arend Van Spriel <arend.vanspriel@broadcom.com>
+Date: Wed, 23 Nov 2016 10:25:27 +0000
+Subject: [PATCH] brcmfmac: move scheduled scan activation to pno source file
+
+Rework .sched_scan_start() callback moving actual configuration of
+the device in pno source file.
+
+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/cfg80211.c | 65 +-----------
+ .../net/wireless/broadcom/brcm80211/brcmfmac/pno.c | 110 +++++++++++++++++----
+ .../net/wireless/broadcom/brcm80211/brcmfmac/pno.h | 29 +-----
+ 3 files changed, 94 insertions(+), 110 deletions(-)
+
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
+@@ -42,7 +42,6 @@
+ #include "common.h"
+
+ #define BRCMF_SCAN_IE_LEN_MAX 2048
+-#define BRCMF_SCHED_SCAN_PERIOD 30
+
+ #define WPA_OUI "\x00\x50\xF2" /* WPA OUI */
+ #define WPA_OUI_TYPE 1
+@@ -3342,24 +3341,6 @@ free_req:
+ return err;
+ }
+
+-static bool brcmf_is_ssid_active(struct cfg80211_ssid *ssid,
+- struct cfg80211_sched_scan_request *req)
+-{
+- int i;
+-
+- if (!ssid || !req->ssids || !req->n_ssids)
+- return false;
+-
+- for (i = 0; i < req->n_ssids; i++) {
+- if (ssid->ssid_len == req->ssids[i].ssid_len) {
+- if (!strncmp(ssid->ssid, req->ssids[i].ssid,
+- ssid->ssid_len))
+- return true;
+- }
+- }
+- return false;
+-}
+-
+ static int
+ brcmf_cfg80211_sched_scan_start(struct wiphy *wiphy,
+ struct net_device *ndev,
+@@ -3367,9 +3348,6 @@ brcmf_cfg80211_sched_scan_start(struct w
+ {
+ struct brcmf_if *ifp = netdev_priv(ndev);
+ struct brcmf_cfg80211_info *cfg = wiphy_priv(wiphy);
+- struct cfg80211_ssid *ssid;
+- int i;
+- int ret = 0;
+
+ brcmf_dbg(SCAN, "Enter n_match_sets:%d n_ssids:%d\n",
+ req->n_match_sets, req->n_ssids);
+@@ -3389,48 +3367,7 @@ brcmf_cfg80211_sched_scan_start(struct w
+ return -EINVAL;
+ }
+
+- /* clean up everything */
+- ret = brcmf_pno_clean(ifp);
+- if (ret < 0) {
+- brcmf_err("failed error=%d\n", ret);
+- return ret;
+- }
+-
+- /* configure pno */
+- ret = brcmf_pno_config(ifp, BRCMF_SCHED_SCAN_PERIOD, 0, 0);
+- if (ret < 0)
+- return ret;
+-
+- /* configure random mac */
+- if (req->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
+- ret = brcmf_pno_set_random(ifp, req->mac_addr,
+- req->mac_addr_mask);
+- if (ret < 0)
+- return ret;
+- }
+-
+- /* configure each match set */
+- for (i = 0; i < req->n_match_sets; i++) {
+-
+- ssid = &req->match_sets[i].ssid;
+-
+- if (!ssid->ssid_len) {
+- brcmf_err("skip broadcast ssid\n");
+- continue;
+- }
+-
+- ret = brcmf_pno_add_ssid(ifp, ssid,
+- brcmf_is_ssid_active(ssid, req));
+- if (ret < 0)
+- brcmf_dbg(SCAN, ">>> PNO filter %s for ssid (%s)\n",
+- ret == 0 ? "set" : "failed", ssid->ssid);
+- }
+- /* Enable the PNO */
+- ret = brcmf_fil_iovar_int_set(ifp, "pfn", 1);
+- if (ret < 0)
+- brcmf_err("PNO enable failed!! ret=%d\n", ret);
+-
+- return ret;
++ return brcmf_pno_start_sched_scan(ifp, req);
+ }
+
+ static int brcmf_cfg80211_sched_scan_stop(struct wiphy *wiphy,
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c
+@@ -32,25 +32,10 @@
+ #define BRCMF_PNO_SCAN_INCOMPLETE 0
+ #define BRCMF_PNO_WPA_AUTH_ANY 0xFFFFFFFF
+ #define BRCMF_PNO_HIDDEN_BIT 2
++#define BRCMF_PNO_SCHED_SCAN_PERIOD 30
+
+-int brcmf_pno_clean(struct brcmf_if *ifp)
+-{
+- int ret;
+-
+- /* Disable pfn */
+- ret = brcmf_fil_iovar_int_set(ifp, "pfn", 0);
+- if (ret == 0) {
+- /* clear pfn */
+- ret = brcmf_fil_iovar_data_set(ifp, "pfnclear", NULL, 0);
+- }
+- if (ret < 0)
+- brcmf_err("failed code %d\n", ret);
+-
+- return ret;
+-}
+-
+-int brcmf_pno_config(struct brcmf_if *ifp, u32 scan_freq,
+- u32 mscan, u32 bestn)
++static int brcmf_pno_config(struct brcmf_if *ifp, u32 scan_freq,
++ u32 mscan, u32 bestn)
+ {
+ struct brcmf_pno_param_le pfn_param;
+ u16 flags;
+@@ -102,7 +87,8 @@ exit:
+ return err;
+ }
+
+-int brcmf_pno_set_random(struct brcmf_if *ifp, u8 *mac_addr, u8 *mac_mask)
++static int brcmf_pno_set_random(struct brcmf_if *ifp, u8 *mac_addr,
++ u8 *mac_mask)
+ {
+ struct brcmf_pno_macaddr_le pfn_mac;
+ int err, i;
+@@ -128,8 +114,8 @@ int brcmf_pno_set_random(struct brcmf_if
+ return err;
+ }
+
+-int brcmf_pno_add_ssid(struct brcmf_if *ifp, struct cfg80211_ssid *ssid,
+- bool active)
++static int brcmf_pno_add_ssid(struct brcmf_if *ifp, struct cfg80211_ssid *ssid,
++ bool active)
+ {
+ struct brcmf_pno_net_param_le pfn;
+
+@@ -144,3 +130,85 @@ int brcmf_pno_add_ssid(struct brcmf_if *
+ return brcmf_fil_iovar_data_set(ifp, "pfn_add", &pfn, sizeof(pfn));
+ }
+
++static bool brcmf_is_ssid_active(struct cfg80211_ssid *ssid,
++ struct cfg80211_sched_scan_request *req)
++{
++ int i;
++
++ if (!ssid || !req->ssids || !req->n_ssids)
++ return false;
++
++ for (i = 0; i < req->n_ssids; i++) {
++ if (ssid->ssid_len == req->ssids[i].ssid_len) {
++ if (!strncmp(ssid->ssid, req->ssids[i].ssid,
++ ssid->ssid_len))
++ return true;
++ }
++ }
++ return false;
++}
++
++int brcmf_pno_clean(struct brcmf_if *ifp)
++{
++ int ret;
++
++ /* Disable pfn */
++ ret = brcmf_fil_iovar_int_set(ifp, "pfn", 0);
++ if (ret == 0) {
++ /* clear pfn */
++ ret = brcmf_fil_iovar_data_set(ifp, "pfnclear", NULL, 0);
++ }
++ if (ret < 0)
++ brcmf_err("failed code %d\n", ret);
++
++ return ret;
++}
++
++int brcmf_pno_start_sched_scan(struct brcmf_if *ifp,
++ struct cfg80211_sched_scan_request *req)
++{
++ struct cfg80211_ssid *ssid;
++ int i, ret;
++
++ /* clean up everything */
++ ret = brcmf_pno_clean(ifp);
++ if (ret < 0) {
++ brcmf_err("failed error=%d\n", ret);
++ return ret;
++ }
++
++ /* configure pno */
++ ret = brcmf_pno_config(ifp, BRCMF_PNO_SCHED_SCAN_PERIOD, 0, 0);
++ if (ret < 0)
++ return ret;
++
++ /* configure random mac */
++ if (req->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
++ ret = brcmf_pno_set_random(ifp, req->mac_addr,
++ req->mac_addr_mask);
++ if (ret < 0)
++ return ret;
++ }
++
++ /* configure each match set */
++ for (i = 0; i < req->n_match_sets; i++) {
++ ssid = &req->match_sets[i].ssid;
++ if (!ssid->ssid_len) {
++ brcmf_err("skip broadcast ssid\n");
++ continue;
++ }
++
++ ret = brcmf_pno_add_ssid(ifp, ssid,
++ brcmf_is_ssid_active(ssid, req));
++ if (ret < 0)
++ brcmf_dbg(SCAN, ">>> PNO filter %s for ssid (%s)\n",
++ ret == 0 ? "set" : "failed", ssid->ssid);
++ }
++ /* Enable the PNO */
++ ret = brcmf_fil_iovar_int_set(ifp, "pfn", 1);
++ if (ret < 0)
++ brcmf_err("PNO enable failed!! ret=%d\n", ret);
++
++ return ret;
++}
++
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.h
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.h
+@@ -27,33 +27,12 @@
+ int brcmf_pno_clean(struct brcmf_if *ifp);
+
+ /**
+- * brcmf_pno_config - configure pno parameters.
++ * brcmf_pno_start_sched_scan - initiate scheduled scan on device.
+ *
+ * @ifp: interface object used.
+- * @scan_freq: scan frequency period in seconds.
+- * @mscan: maximum number of scans stored in firmware.
+- * @bestn: maximum number of APs per scan stored in firmware.
++ * @req: configuration parameters for scheduled scan.
+ */
+-int brcmf_pno_config(struct brcmf_if *ifp, u32 scan_freq,
+- u32 mscan, u32 bestn);
+-
+-/**
+- * brcmf_pno_set_random - setup randomisation mac address for pno.
+- *
+- * @ifp: interface object used.
+- * @mac_addr: MAC address used with randomisation.
+- * @mac_mask: MAC address mask used for randomisation.
+- */
+-int brcmf_pno_set_random(struct brcmf_if *ifp, u8 *mac_addr, u8 *mac_mask);
+-
+-/**
+- * brcmf_pno_add_ssid - add ssid for pno in firmware.
+- *
+- * @ifp: interface object used.
+- * @ssid: ssid information.
+- * @active: indicate this ssid needs to be actively probed.
+- */
+-int brcmf_pno_add_ssid(struct brcmf_if *ifp, struct cfg80211_ssid *ssid,
+- bool active);
++int brcmf_pno_start_sched_scan(struct brcmf_if *ifp,
++ struct cfg80211_sched_scan_request *req);
+
+ #endif /* _BRCMF_PNO_H */