mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-24 07:46:48 +00:00
85d128f145
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
112 lines
3.4 KiB
Diff
112 lines
3.4 KiB
Diff
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;
|