aboutsummaryrefslogtreecommitdiffstats
path: root/package/kernel/mac80211/patches/357-0006-brcmfmac-make-internal-escan-more-generic.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/kernel/mac80211/patches/357-0006-brcmfmac-make-internal-escan-more-generic.patch')
-rw-r--r--package/kernel/mac80211/patches/357-0006-brcmfmac-make-internal-escan-more-generic.patch306
1 files changed, 0 insertions, 306 deletions
diff --git a/package/kernel/mac80211/patches/357-0006-brcmfmac-make-internal-escan-more-generic.patch b/package/kernel/mac80211/patches/357-0006-brcmfmac-make-internal-escan-more-generic.patch
deleted file mode 100644
index 84a69f0739..0000000000
--- a/package/kernel/mac80211/patches/357-0006-brcmfmac-make-internal-escan-more-generic.patch
+++ /dev/null
@@ -1,306 +0,0 @@
-From fa85b30a908455ff25def3a5f319aad272ef4862 Mon Sep 17 00:00:00 2001
-From: Arend Van Spriel <arend.vanspriel@broadcom.com>
-Date: Wed, 23 Nov 2016 10:25:25 +0000
-Subject: [PATCH] brcmfmac: make internal escan more generic
-
-For scheduled scan we initiate an escan in firmware to obtain more
-info missing from the scheduled scan notification we get from firmware.
-For upcoming functionality this is also required so make it a bit
-more generic.
-
-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 | 187 ++++++++++++---------
- .../broadcom/brcm80211/brcmfmac/cfg80211.h | 4 +-
- 2 files changed, 109 insertions(+), 82 deletions(-)
-
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -757,12 +757,12 @@ s32 brcmf_notify_escan_complete(struct b
- brcmf_scan_config_mpc(ifp, 1);
-
- /*
-- * e-scan can be initiated by scheduled scan
-+ * e-scan can be initiated internally
- * which takes precedence.
- */
-- if (cfg->sched_escan) {
-+ if (cfg->internal_escan) {
- brcmf_dbg(SCAN, "scheduled scan completed\n");
-- cfg->sched_escan = false;
-+ cfg->internal_escan = false;
- if (!aborted)
- cfg80211_sched_scan_results(cfg_to_wiphy(cfg));
- } else if (scan_request) {
-@@ -3013,7 +3013,7 @@ void brcmf_abort_scanning(struct brcmf_c
- struct escan_info *escan = &cfg->escan_info;
-
- set_bit(BRCMF_SCAN_STATUS_ABORT, &cfg->scan_status);
-- if (cfg->scan_request) {
-+ if (cfg->internal_escan || cfg->scan_request) {
- escan->escan_state = WL_ESCAN_STATE_IDLE;
- brcmf_notify_escan_complete(cfg, escan->ifp, true, true);
- }
-@@ -3036,7 +3036,7 @@ static void brcmf_escan_timeout(unsigned
- struct brcmf_cfg80211_info *cfg =
- (struct brcmf_cfg80211_info *)data;
-
-- if (cfg->scan_request) {
-+ if (cfg->internal_escan || cfg->scan_request) {
- brcmf_err("timer expired\n");
- schedule_work(&cfg->escan_timeout_work);
- }
-@@ -3119,7 +3119,7 @@ brcmf_cfg80211_escan_handler(struct brcm
- if (brcmf_p2p_scan_finding_common_channel(cfg, bss_info_le))
- goto exit;
-
-- if (!cfg->scan_request) {
-+ if (!cfg->internal_escan && !cfg->scan_request) {
- brcmf_dbg(SCAN, "result without cfg80211 request\n");
- goto exit;
- }
-@@ -3165,7 +3165,7 @@ brcmf_cfg80211_escan_handler(struct brcm
- cfg->escan_info.escan_state = WL_ESCAN_STATE_IDLE;
- if (brcmf_p2p_scan_finding_common_channel(cfg, NULL))
- goto exit;
-- if (cfg->scan_request) {
-+ if (cfg->internal_escan || cfg->scan_request) {
- brcmf_inform_bss(cfg);
- aborted = status != BRCMF_E_STATUS_SUCCESS;
- brcmf_notify_escan_complete(cfg, ifp, aborted, false);
-@@ -3190,6 +3190,73 @@ static void brcmf_init_escan(struct brcm
- brcmf_cfg80211_escan_timeout_worker);
- }
-
-+static struct cfg80211_scan_request *
-+brcmf_alloc_internal_escan_request(struct wiphy *wiphy, u32 n_netinfo) {
-+ struct cfg80211_scan_request *req;
-+ size_t req_size;
-+
-+ req_size = sizeof(*req) +
-+ n_netinfo * sizeof(req->channels[0]) +
-+ n_netinfo * sizeof(*req->ssids);
-+
-+ req = kzalloc(req_size, GFP_KERNEL);
-+ if (req) {
-+ req->wiphy = wiphy;
-+ req->ssids = (void *)(&req->channels[0]) +
-+ n_netinfo * sizeof(req->channels[0]);
-+ }
-+ return req;
-+}
-+
-+static int brcmf_internal_escan_add_info(struct cfg80211_scan_request *req,
-+ u8 *ssid, u8 ssid_len, u8 channel)
-+{
-+ struct ieee80211_channel *chan;
-+ enum nl80211_band band;
-+ int freq;
-+
-+ if (channel <= CH_MAX_2G_CHANNEL)
-+ band = NL80211_BAND_2GHZ;
-+ else
-+ band = NL80211_BAND_5GHZ;
-+
-+ freq = ieee80211_channel_to_frequency(channel, band);
-+ if (!freq)
-+ return -EINVAL;
-+
-+ chan = ieee80211_get_channel(req->wiphy, freq);
-+ if (!chan)
-+ return -EINVAL;
-+
-+ req->channels[req->n_channels++] = chan;
-+ memcpy(req->ssids[req->n_ssids].ssid, ssid, ssid_len);
-+ req->ssids[req->n_ssids++].ssid_len = ssid_len;
-+
-+ return 0;
-+}
-+
-+static int brcmf_start_internal_escan(struct brcmf_if *ifp,
-+ struct cfg80211_scan_request *request)
-+{
-+ struct brcmf_cfg80211_info *cfg = ifp->drvr->config;
-+ int err;
-+
-+ if (test_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status)) {
-+ /* Abort any on-going scan */
-+ brcmf_abort_scanning(cfg);
-+ }
-+
-+ set_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status);
-+ cfg->escan_info.run = brcmf_run_escan;
-+ err = brcmf_do_escan(ifp, request);
-+ if (err) {
-+ clear_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status);
-+ return err;
-+ }
-+ cfg->internal_escan = true;
-+ return 0;
-+}
-+
- /* 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
-@@ -3203,12 +3270,8 @@ brcmf_notify_sched_scan_results(struct b
- struct brcmf_cfg80211_info *cfg = ifp->drvr->config;
- struct brcmf_pno_net_info_le *netinfo, *netinfo_start;
- struct cfg80211_scan_request *request = NULL;
-- struct cfg80211_ssid *ssid = NULL;
-- struct ieee80211_channel *channel = NULL;
- struct wiphy *wiphy = cfg_to_wiphy(cfg);
-- int err = 0;
-- int channel_req = 0;
-- int band = 0;
-+ int i, err = 0;
- struct brcmf_pno_scanresults_le *pfn_result;
- u32 result_count;
- u32 status;
-@@ -3234,83 +3297,47 @@ brcmf_notify_sched_scan_results(struct b
- */
- WARN_ON(status != BRCMF_PNO_SCAN_COMPLETE);
- brcmf_dbg(SCAN, "PFN NET FOUND event. count: %d\n", result_count);
-- if (result_count > 0) {
-- int i;
--
-- request = kzalloc(sizeof(*request), GFP_KERNEL);
-- ssid = kcalloc(result_count, sizeof(*ssid), GFP_KERNEL);
-- channel = kcalloc(result_count, sizeof(*channel), GFP_KERNEL);
-- if (!request || !ssid || !channel) {
-- err = -ENOMEM;
-- goto out_err;
-- }
-+ if (!result_count) {
-+ brcmf_err("FALSE PNO Event. (pfn_count == 0)\n");
-+ goto out_err;
-+ }
-+ request = brcmf_alloc_internal_escan_request(wiphy,
-+ result_count);
-+ if (!request) {
-+ err = -ENOMEM;
-+ goto out_err;
-+ }
-
-- request->wiphy = wiphy;
-- data += sizeof(struct brcmf_pno_scanresults_le);
-- netinfo_start = (struct brcmf_pno_net_info_le *)data;
--
-- for (i = 0; i < result_count; i++) {
-- netinfo = &netinfo_start[i];
-- if (!netinfo) {
-- brcmf_err("Invalid netinfo ptr. index: %d\n",
-- i);
-- err = -EINVAL;
-- goto out_err;
-- }
-+ data += sizeof(struct brcmf_pno_scanresults_le);
-+ netinfo_start = (struct brcmf_pno_net_info_le *)data;
-
-- brcmf_dbg(SCAN, "SSID:%s Channel:%d\n",
-- netinfo->SSID, netinfo->channel);
-- memcpy(ssid[i].ssid, netinfo->SSID, netinfo->SSID_len);
-- ssid[i].ssid_len = netinfo->SSID_len;
-- request->n_ssids++;
--
-- channel_req = netinfo->channel;
-- if (channel_req <= CH_MAX_2G_CHANNEL)
-- band = NL80211_BAND_2GHZ;
-- else
-- band = NL80211_BAND_5GHZ;
-- channel[i].center_freq =
-- ieee80211_channel_to_frequency(channel_req,
-- band);
-- channel[i].band = band;
-- channel[i].flags |= IEEE80211_CHAN_NO_HT40;
-- request->channels[i] = &channel[i];
-- request->n_channels++;
-- }
--
-- /* assign parsed ssid array */
-- if (request->n_ssids)
-- request->ssids = &ssid[0];
--
-- if (test_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status)) {
-- /* Abort any on-going scan */
-- brcmf_abort_scanning(cfg);
-+ for (i = 0; i < result_count; i++) {
-+ netinfo = &netinfo_start[i];
-+ if (!netinfo) {
-+ brcmf_err("Invalid netinfo ptr. index: %d\n",
-+ i);
-+ err = -EINVAL;
-+ goto out_err;
- }
-
-- set_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status);
-- cfg->escan_info.run = brcmf_run_escan;
-- err = brcmf_do_escan(ifp, request);
-- if (err) {
-- clear_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status);
-+ brcmf_dbg(SCAN, "SSID:%.32s Channel:%d\n",
-+ netinfo->SSID, netinfo->channel);
-+ err = brcmf_internal_escan_add_info(request,
-+ netinfo->SSID,
-+ netinfo->SSID_len,
-+ netinfo->channel);
-+ if (err)
- goto out_err;
-- }
-- cfg->sched_escan = true;
-- cfg->scan_request = request;
-- } else {
-- brcmf_err("FALSE PNO Event. (pfn_count == 0)\n");
-- goto out_err;
- }
-
-- kfree(ssid);
-- kfree(channel);
-- kfree(request);
-- return 0;
-+ err = brcmf_start_internal_escan(ifp, request);
-+ if (!err)
-+ goto free_req;
-
- out_err:
-- kfree(ssid);
-- kfree(channel);
-- kfree(request);
- cfg80211_sched_scan_stopped(wiphy);
-+free_req:
-+ kfree(request);
- return err;
- }
-
-@@ -3405,7 +3432,7 @@ static int brcmf_cfg80211_sched_scan_sto
-
- brcmf_dbg(SCAN, "enter\n");
- brcmf_pno_clean(ifp);
-- if (cfg->sched_escan)
-+ if (cfg->internal_escan)
- brcmf_notify_escan_complete(cfg, ifp, true, true);
- return 0;
- }
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-@@ -271,7 +271,7 @@ struct brcmf_cfg80211_wowl {
- * @pub: common driver information.
- * @channel: current channel.
- * @active_scan: current scan mode.
-- * @sched_escan: e-scan for scheduled scan support running.
-+ * @internal_escan: indicates internally initiated e-scan is running.
- * @ibss_starter: indicates this sta is ibss starter.
- * @pwr_save: indicate whether dongle to support power save mode.
- * @dongle_up: indicate whether dongle up or not.
-@@ -303,7 +303,7 @@ struct brcmf_cfg80211_info {
- struct brcmf_pub *pub;
- u32 channel;
- bool active_scan;
-- bool sched_escan;
-+ bool internal_escan;
- bool ibss_starter;
- bool pwr_save;
- bool dongle_up;