aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHante Meuleman <meuleman@broadcom.com>2012-10-22 13:36:14 -0400
committerJohn W. Linville <linville@tuxdriver.com>2012-10-29 15:28:07 -0400
commit81f5dcb8083077ca9bca10ca8e34bc8daf768dce (patch)
tree871af0a3b9a94df2f286ce36d4c9b389887cab41
parent6c4a5f2413da948e7d1d189c9d94f05afde8702a (diff)
brcmfmac: refactor firmware interface layer.
Refactor the functions that are related to getting and setting data to and and from the firmware. Reviewed-by: Arend Van Spriel <arend@broadcom.com> Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com> Signed-off-by: Hante Meuleman <meuleman@broadcom.com> Signed-off-by: Franky Lin <frankyl@broadcom.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/Makefile1
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd.h29
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.c1
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.h3
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c10
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/fwil.c345
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/fwil.h43
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c549
8 files changed, 577 insertions, 404 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/Makefile b/drivers/net/wireless/brcm80211/brcmfmac/Makefile
index 9d5170b6df5..fe80b637c51 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/Makefile
+++ b/drivers/net/wireless/brcm80211/brcmfmac/Makefile
@@ -24,6 +24,7 @@ ccflags-y += -D__CHECK_ENDIAN__
24obj-$(CONFIG_BRCMFMAC) += brcmfmac.o 24obj-$(CONFIG_BRCMFMAC) += brcmfmac.o
25brcmfmac-objs += \ 25brcmfmac-objs += \
26 wl_cfg80211.o \ 26 wl_cfg80211.o \
27 fwil.o \
27 dhd_cdc.o \ 28 dhd_cdc.o \
28 dhd_common.o \ 29 dhd_common.o \
29 dhd_linux.o 30 dhd_linux.o
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd.h b/drivers/net/wireless/brcm80211/brcmfmac/dhd.h
index 0510960ad5f..a73da9dd05e 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd.h
@@ -318,6 +318,12 @@ struct brcmf_event {
318#define BRCMF_E_LINK_ASSOC_REC 3 318#define BRCMF_E_LINK_ASSOC_REC 3
319#define BRCMF_E_LINK_BSSCFG_DIS 4 319#define BRCMF_E_LINK_BSSCFG_DIS 4
320 320
321/* Small, medium and maximum buffer size for dcmd
322 */
323#define BRCMF_DCMD_SMLEN 256
324#define BRCMF_DCMD_MEDLEN 1536
325#define BRCMF_DCMD_MAXLEN 8192
326
321/* Pattern matching filter. Specifies an offset within received packets to 327/* Pattern matching filter. Specifies an offset within received packets to
322 * start matching, the pattern to match, the size of the pattern, and a bitmask 328 * start matching, the pattern to match, the size of the pattern, and a bitmask
323 * that indicates which bits within the pattern should be matched. 329 * that indicates which bits within the pattern should be matched.
@@ -661,6 +667,7 @@ struct brcmf_pub {
661 struct brcmf_if *iflist[BRCMF_MAX_IFS]; 667 struct brcmf_if *iflist[BRCMF_MAX_IFS];
662 668
663 struct mutex proto_block; 669 struct mutex proto_block;
670 unsigned char proto_buf[BRCMF_DCMD_MAXLEN];
664 671
665 struct work_struct setmacaddr_work; 672 struct work_struct setmacaddr_work;
666 struct work_struct multicast_work; 673 struct work_struct multicast_work;
@@ -671,6 +678,22 @@ struct brcmf_pub {
671#endif 678#endif
672}; 679};
673 680
681/* struct brcmf_if - Interface control information
682 *
683 * @drvr: back pointer to brcmf_pub
684 * @ndev: interface net device pointer
685 * @stats: net device statistics
686 * @idx: iface idx in dongle
687 * @mac_addr: assigned MAC address
688 */
689struct brcmf_if {
690 struct brcmf_pub *drvr;
691 struct net_device *ndev;
692 struct net_device_stats stats;
693 int idx;
694 u8 mac_addr[ETH_ALEN];
695};
696
674struct brcmf_if_event { 697struct brcmf_if_event {
675 u8 ifidx; 698 u8 ifidx;
676 u8 action; 699 u8 action;
@@ -701,6 +724,8 @@ extern char *brcmf_ifname(struct brcmf_pub *drvr, int idx);
701/* Query dongle */ 724/* Query dongle */
702extern int brcmf_proto_cdc_query_dcmd(struct brcmf_pub *drvr, int ifidx, 725extern int brcmf_proto_cdc_query_dcmd(struct brcmf_pub *drvr, int ifidx,
703 uint cmd, void *buf, uint len); 726 uint cmd, void *buf, uint len);
727extern int brcmf_proto_cdc_set_dcmd(struct brcmf_pub *drvr, int ifidx, uint cmd,
728 void *buf, uint len);
704 729
705extern int brcmf_ifname2idx(struct brcmf_pub *drvr, char *name); 730extern int brcmf_ifname2idx(struct brcmf_pub *drvr, char *name);
706extern int brcmf_c_host_event(struct brcmf_pub *drvr, int *idx, 731extern int brcmf_c_host_event(struct brcmf_pub *drvr, int *idx,
@@ -713,8 +738,4 @@ extern void brcmf_c_pktfilter_offload_set(struct brcmf_pub *drvr, char *arg);
713extern void brcmf_c_pktfilter_offload_enable(struct brcmf_pub *drvr, char *arg, 738extern void brcmf_c_pktfilter_offload_enable(struct brcmf_pub *drvr, char *arg,
714 int enable, int master_mode); 739 int enable, int master_mode);
715 740
716#define BRCMF_DCMD_SMLEN 256 /* "small" cmd buffer required */
717#define BRCMF_DCMD_MEDLEN 1536 /* "med" cmd buffer required */
718#define BRCMF_DCMD_MAXLEN 8192 /* max length cmd buffer required */
719
720#endif /* _BRCMF_H_ */ 741#endif /* _BRCMF_H_ */
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.c
index 7f89540b56d..fa08058aada 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.c
@@ -18,6 +18,7 @@
18#include <linux/if.h> 18#include <linux/if.h>
19#include <linux/ieee80211.h> 19#include <linux/ieee80211.h>
20#include <linux/module.h> 20#include <linux/module.h>
21#include <linux/netdevice.h>
21 22
22#include <defs.h> 23#include <defs.h>
23#include <brcmu_wifi.h> 24#include <brcmu_wifi.h>
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.h b/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.h
index fb508c2256d..eefa6c2560c 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.h
@@ -31,6 +31,7 @@
31#define BRCMF_EVENT_VAL 0x0800 31#define BRCMF_EVENT_VAL 0x0800
32#define BRCMF_BTA_VAL 0x1000 32#define BRCMF_BTA_VAL 0x1000
33#define BRCMF_ISCAN_VAL 0x2000 33#define BRCMF_ISCAN_VAL 0x2000
34#define BRCMF_FIL_VAL 0x4000
34 35
35#if defined(DEBUG) 36#if defined(DEBUG)
36 37
@@ -56,6 +57,7 @@ do { \
56#define BRCMF_BYTES_ON() (brcmf_msg_level & BRCMF_BYTES_VAL) 57#define BRCMF_BYTES_ON() (brcmf_msg_level & BRCMF_BYTES_VAL)
57#define BRCMF_GLOM_ON() (brcmf_msg_level & BRCMF_GLOM_VAL) 58#define BRCMF_GLOM_ON() (brcmf_msg_level & BRCMF_GLOM_VAL)
58#define BRCMF_EVENT_ON() (brcmf_msg_level & BRCMF_EVENT_VAL) 59#define BRCMF_EVENT_ON() (brcmf_msg_level & BRCMF_EVENT_VAL)
60#define BRCMF_FIL_ON() (brcmf_msg_level & BRCMF_FIL_VAL)
59 61
60#else /* (defined DEBUG) || (defined DEBUG) */ 62#else /* (defined DEBUG) || (defined DEBUG) */
61 63
@@ -67,6 +69,7 @@ do { \
67#define BRCMF_BYTES_ON() 0 69#define BRCMF_BYTES_ON() 0
68#define BRCMF_GLOM_ON() 0 70#define BRCMF_GLOM_ON() 0
69#define BRCMF_EVENT_ON() 0 71#define BRCMF_EVENT_ON() 0
72#define BRCMF_FIL_ON() 0
70 73
71#endif /* defined(DEBUG) */ 74#endif /* defined(DEBUG) */
72 75
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
index c462263e041..189c5be2b05 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
@@ -52,16 +52,6 @@ MODULE_SUPPORTED_DEVICE("Broadcom 802.11n WLAN fullmac cards");
52MODULE_LICENSE("Dual BSD/GPL"); 52MODULE_LICENSE("Dual BSD/GPL");
53 53
54 54
55/* Interface control information */
56struct brcmf_if {
57 struct brcmf_pub *drvr; /* back pointer to brcmf_pub */
58 /* OS/stack specifics */
59 struct net_device *ndev;
60 struct net_device_stats stats;
61 int idx; /* iface idx in dongle */
62 u8 mac_addr[ETH_ALEN]; /* assigned MAC address */
63};
64
65/* Error bits */ 55/* Error bits */
66int brcmf_msg_level = BRCMF_ERROR_VAL; 56int brcmf_msg_level = BRCMF_ERROR_VAL;
67module_param(brcmf_msg_level, int, 0); 57module_param(brcmf_msg_level, int, 0);
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/fwil.c b/drivers/net/wireless/brcm80211/brcmfmac/fwil.c
new file mode 100644
index 00000000000..8528937067d
--- /dev/null
+++ b/drivers/net/wireless/brcm80211/brcmfmac/fwil.c
@@ -0,0 +1,345 @@
1/*
2 * Copyright (c) 2012 Broadcom Corporation
3 *
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
11 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
13 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16
17/* FWIL is the Firmware Interface Layer. In this module the support functions
18 * are located to set and get variables to and from the firmware.
19 */
20
21#include <linux/kernel.h>
22#include <linux/netdevice.h>
23#include <defs.h>
24#include <brcmu_utils.h>
25#include <brcmu_wifi.h>
26#include "dhd.h"
27#include "dhd_bus.h"
28#include "dhd_dbg.h"
29
30
31static s32
32brcmf_fil_cmd_data(struct brcmf_if *ifp, u32 cmd, void *data, u32 len, bool set)
33{
34 struct brcmf_pub *drvr = ifp->drvr;
35 s32 err;
36
37 if (drvr->bus_if->state == BRCMF_BUS_DOWN) {
38 brcmf_dbg(ERROR, "bus is down. we have nothing to do.\n");
39 return -EIO;
40 }
41
42 if (data != NULL)
43 len = min_t(uint, len, BRCMF_DCMD_MAXLEN);
44 if (set)
45 err = brcmf_proto_cdc_set_dcmd(drvr, ifp->idx, cmd, data, len);
46 else
47 err = brcmf_proto_cdc_query_dcmd(drvr, ifp->idx, cmd, data,
48 len);
49
50 if (err >= 0)
51 err = 0;
52 else
53 brcmf_dbg(ERROR, "Failed err=%d\n", err);
54
55 return err;
56}
57
58s32
59brcmf_fil_cmd_data_set(struct net_device *ndev, u32 cmd, void *data, u32 len)
60{
61 struct brcmf_if *ifp = netdev_priv(ndev);
62 s32 err;
63
64 mutex_lock(&ifp->drvr->proto_block);
65
66 brcmf_dbg(FIL, "cmd=%d, len=%d\n", cmd, len);
67 brcmf_dbg_hex_dump(BRCMF_FIL_ON(), data, len, "data");
68
69 err = brcmf_fil_cmd_data(ifp, cmd, data, len, true);
70 mutex_unlock(&ifp->drvr->proto_block);
71
72 return err;
73}
74
75s32
76brcmf_fil_cmd_data_get(struct net_device *ndev, u32 cmd, void *data, u32 len)
77{
78 struct brcmf_if *ifp = netdev_priv(ndev);
79 s32 err;
80
81 mutex_lock(&ifp->drvr->proto_block);
82 err = brcmf_fil_cmd_data(ifp, cmd, data, len, false);
83
84 brcmf_dbg(FIL, "cmd=%d, len=%d\n", cmd, len);
85 brcmf_dbg_hex_dump(BRCMF_FIL_ON(), data, len, "data");
86
87 mutex_unlock(&ifp->drvr->proto_block);
88
89 return err;
90}
91
92
93s32
94brcmf_fil_cmd_int_set(struct net_device *ndev, u32 cmd, u32 data)
95{
96 struct brcmf_if *ifp = netdev_priv(ndev);
97 s32 err;
98 __le32 data_le = cpu_to_le32(data);
99
100 mutex_lock(&ifp->drvr->proto_block);
101 err = brcmf_fil_cmd_data(ifp, cmd, &data_le, sizeof(data_le), true);
102 mutex_unlock(&ifp->drvr->proto_block);
103
104 return err;
105}
106
107s32
108brcmf_fil_cmd_int_get(struct net_device *ndev, u32 cmd, u32 *data)
109{
110 struct brcmf_if *ifp = netdev_priv(ndev);
111 s32 err;
112 __le32 data_le = cpu_to_le32(*data);
113
114 mutex_lock(&ifp->drvr->proto_block);
115 err = brcmf_fil_cmd_data(ifp, cmd, &data_le, sizeof(data_le), false);
116 mutex_unlock(&ifp->drvr->proto_block);
117 *data = le32_to_cpu(data_le);
118
119 return err;
120}
121
122static u32
123brcmf_create_iovar(char *name, char *data, u32 datalen, char *buf, u32 buflen)
124{
125 u32 len;
126
127 len = strlen(name) + 1;
128
129 if ((len + datalen) > buflen)
130 return 0;
131
132 memcpy(buf, name, len);
133
134 /* append data onto the end of the name string */
135 if (data && datalen)
136 memcpy(&buf[len], data, datalen);
137
138 return len + datalen;
139}
140
141
142s32
143brcmf_fil_iovar_data_set(struct net_device *ndev, char *name, void *data,
144 u32 len)
145{
146 struct brcmf_if *ifp = netdev_priv(ndev);
147 struct brcmf_pub *drvr = ifp->drvr;
148 s32 err;
149 u32 buflen;
150
151 mutex_lock(&drvr->proto_block);
152
153 brcmf_dbg(FIL, "name=%s, len=%d\n", name, len);
154 brcmf_dbg_hex_dump(BRCMF_FIL_ON(), data, len, "data");
155
156 buflen = brcmf_create_iovar(name, data, len, drvr->proto_buf,
157 sizeof(drvr->proto_buf));
158 if (buflen) {
159 err = brcmf_fil_cmd_data(ifp, BRCMF_C_SET_VAR, drvr->proto_buf,
160 buflen, true);
161 } else {
162 err = -EPERM;
163 brcmf_dbg(ERROR, "Creating iovar failed\n");
164 }
165
166 mutex_unlock(&drvr->proto_block);
167 return err;
168}
169
170s32
171brcmf_fil_iovar_data_get(struct net_device *ndev, char *name, void *data,
172 u32 len)
173{
174 struct brcmf_if *ifp = netdev_priv(ndev);
175 struct brcmf_pub *drvr = ifp->drvr;
176 s32 err;
177 u32 buflen;
178
179 mutex_lock(&drvr->proto_block);
180
181 buflen = brcmf_create_iovar(name, data, len, drvr->proto_buf,
182 sizeof(drvr->proto_buf));
183 if (buflen) {
184 err = brcmf_fil_cmd_data(ifp, BRCMF_C_GET_VAR, drvr->proto_buf,
185 buflen, false);
186 if (err == 0)
187 memcpy(data, drvr->proto_buf, len);
188 } else {
189 err = -EPERM;
190 brcmf_dbg(ERROR, "Creating iovar failed\n");
191 }
192
193 brcmf_dbg(FIL, "name=%s, len=%d\n", name, len);
194 brcmf_dbg_hex_dump(BRCMF_FIL_ON(), data, len, "data");
195
196 mutex_unlock(&drvr->proto_block);
197 return err;
198}
199
200s32
201brcmf_fil_iovar_int_set(struct net_device *ndev, char *name, u32 data)
202{
203 __le32 data_le = cpu_to_le32(data);
204
205 return brcmf_fil_iovar_data_set(ndev, name, &data_le, sizeof(data_le));
206}
207
208s32
209brcmf_fil_iovar_int_get(struct net_device *ndev, char *name, u32 *data)
210{
211 __le32 data_le = cpu_to_le32(*data);
212 s32 err;
213
214 err = brcmf_fil_iovar_data_get(ndev, name, &data_le, sizeof(data_le));
215 if (err == 0)
216 *data = le32_to_cpu(data_le);
217 return err;
218}
219
220static u32
221brcmf_create_bsscfg(s32 bssidx, char *name, char *data, u32 datalen, char *buf,
222 u32 buflen)
223{
224 const s8 *prefix = "bsscfg:";
225 s8 *p;
226 u32 prefixlen;
227 u32 namelen;
228 u32 iolen;
229 __le32 bssidx_le;
230
231 if (bssidx == 0)
232 return brcmf_create_iovar(name, data, datalen, buf, buflen);
233
234 prefixlen = strlen(prefix);
235 namelen = strlen(name) + 1; /* lengh of iovar name + null */
236 iolen = prefixlen + namelen + sizeof(bssidx_le) + datalen;
237
238 if (buflen < iolen) {
239 brcmf_dbg(ERROR, "buffer is too short\n");
240 return 0;
241 }
242
243 p = buf;
244
245 /* copy prefix, no null */
246 memcpy(p, prefix, prefixlen);
247 p += prefixlen;
248
249 /* copy iovar name including null */
250 memcpy(p, name, namelen);
251 p += namelen;
252
253 /* bss config index as first data */
254 bssidx_le = cpu_to_le32(bssidx);
255 memcpy(p, &bssidx_le, sizeof(bssidx_le));
256 p += sizeof(bssidx_le);
257
258 /* parameter buffer follows */
259 if (datalen)
260 memcpy(p, data, datalen);
261
262 return iolen;
263}
264
265s32
266brcmf_fil_bsscfg_data_set(struct net_device *ndev, s32 bssidx, char *name,
267 void *data, u32 len)
268{
269 struct brcmf_if *ifp = netdev_priv(ndev);
270 struct brcmf_pub *drvr = ifp->drvr;
271 s32 err;
272 u32 buflen;
273
274 mutex_lock(&drvr->proto_block);
275
276 brcmf_dbg(FIL, "bssidx=%d, name=%s, len=%d\n", bssidx, name, len);
277 brcmf_dbg_hex_dump(BRCMF_FIL_ON(), data, len, "data");
278
279 buflen = brcmf_create_bsscfg(bssidx, name, data, len, drvr->proto_buf,
280 sizeof(drvr->proto_buf));
281 if (buflen) {
282 err = brcmf_fil_cmd_data(ifp, BRCMF_C_SET_VAR, drvr->proto_buf,
283 buflen, true);
284 } else {
285 err = -EPERM;
286 brcmf_dbg(ERROR, "Creating bsscfg failed\n");
287 }
288
289 mutex_unlock(&drvr->proto_block);
290 return err;
291}
292
293s32
294brcmf_fil_bsscfg_data_get(struct net_device *ndev, s32 bssidx, char *name,
295 void *data, u32 len)
296{
297 struct brcmf_if *ifp = netdev_priv(ndev);
298 struct brcmf_pub *drvr = ifp->drvr;
299 s32 err;
300 u32 buflen;
301
302 mutex_lock(&drvr->proto_block);
303
304 buflen = brcmf_create_bsscfg(bssidx, name, NULL, len, drvr->proto_buf,
305 sizeof(drvr->proto_buf));
306 if (buflen) {
307 err = brcmf_fil_cmd_data(ifp, BRCMF_C_GET_VAR, drvr->proto_buf,
308 buflen, false);
309 if (err == 0)
310 memcpy(data, drvr->proto_buf, len);
311 } else {
312 err = -EPERM;
313 brcmf_dbg(ERROR, "Creating bsscfg failed\n");
314 }
315 brcmf_dbg(FIL, "bssidx=%d, name=%s, len=%d\n", bssidx, name, len);
316 brcmf_dbg_hex_dump(BRCMF_FIL_ON(), data, len, "data");
317
318 mutex_unlock(&drvr->proto_block);
319 return err;
320
321}
322
323s32
324brcmf_fil_bsscfg_int_set(struct net_device *ndev, s32 bssidx, char *name,
325 u32 data)
326{
327 __le32 data_le = cpu_to_le32(data);
328
329 return brcmf_fil_bsscfg_data_set(ndev, bssidx, name, &data_le,
330 sizeof(data_le));
331}
332
333s32
334brcmf_fil_bsscfg_int_get(struct net_device *ndev, s32 bssidx, char *name,
335 u32 *data)
336{
337 __le32 data_le = cpu_to_le32(*data);
338 s32 err;
339
340 err = brcmf_fil_bsscfg_data_get(ndev, bssidx, name, &data_le,
341 sizeof(data_le));
342 if (err == 0)
343 *data = le32_to_cpu(data_le);
344 return err;
345}
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/fwil.h b/drivers/net/wireless/brcm80211/brcmfmac/fwil.h
new file mode 100644
index 00000000000..54855ef0f0a
--- /dev/null
+++ b/drivers/net/wireless/brcm80211/brcmfmac/fwil.h
@@ -0,0 +1,43 @@
1/*
2 * Copyright (c) 2012 Broadcom Corporation
3 *
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
11 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
13 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16
17#ifndef _fwil_h_
18#define _fwil_h_
19
20s32 brcmf_fil_cmd_data_set(struct net_device *ndev, u32 cmd, void *data,
21 u32 len);
22s32 brcmf_fil_cmd_data_get(struct net_device *ndev, u32 cmd, void *data,
23 u32 len);
24s32 brcmf_fil_cmd_int_set(struct net_device *ndev, u32 cmd, u32 data);
25s32 brcmf_fil_cmd_int_get(struct net_device *ndev, u32 cmd, u32 *data);
26
27s32 brcmf_fil_iovar_data_set(struct net_device *ndev, char *name, void *data,
28 u32 len);
29s32 brcmf_fil_iovar_data_get(struct net_device *ndev, char *name, void *data,
30 u32 len);
31s32 brcmf_fil_iovar_int_set(struct net_device *ndev, char *name, u32 data);
32s32 brcmf_fil_iovar_int_get(struct net_device *ndev, char *name, u32 *data);
33
34s32 brcmf_fil_bsscfg_data_set(struct net_device *ndev, s32 bssidx, char *name,
35 void *data, u32 len);
36s32 brcmf_fil_bsscfg_data_get(struct net_device *ndev, s32 bssidx, char *name,
37 void *data, u32 len);
38s32 brcmf_fil_bsscfg_int_set(struct net_device *ndev, s32 bssidx, char *name,
39 u32 data);
40s32 brcmf_fil_bsscfg_int_get(struct net_device *ndev, s32 bssidx, char *name,
41 u32 *data);
42
43#endif /* _fwil_h_ */
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
index fdbfa204e5d..0beb2c6db2a 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
@@ -35,6 +35,7 @@
35#include <brcmu_wifi.h> 35#include <brcmu_wifi.h>
36#include "dhd.h" 36#include "dhd.h"
37#include "wl_cfg80211.h" 37#include "wl_cfg80211.h"
38#include "fwil.h"
38 39
39#define BRCMF_SCAN_IE_LEN_MAX 2048 40#define BRCMF_SCAN_IE_LEN_MAX 2048
40#define BRCMF_PNO_VERSION 2 41#define BRCMF_PNO_VERSION 2
@@ -391,57 +392,6 @@ static u8 brcmf_mw_to_qdbm(u16 mw)
391 return qdbm; 392 return qdbm;
392} 393}
393 394
394/* function for reading/writing a single u32 from/to the dongle */
395static int
396brcmf_exec_dcmd_u32(struct net_device *ndev, u32 cmd, u32 *par)
397{
398 int err;
399 __le32 par_le = cpu_to_le32(*par);
400
401 err = brcmf_exec_dcmd(ndev, cmd, &par_le, sizeof(__le32));
402 *par = le32_to_cpu(par_le);
403
404 return err;
405}
406
407static s32
408brcmf_dev_iovar_setbuf_bsscfg(struct net_device *ndev, s8 *name,
409 void *param, s32 paramlen,
410 void *buf, s32 buflen, s32 bssidx)
411{
412 s32 err = -ENOMEM;
413 u32 len;
414
415 len = brcmf_c_mkiovar_bsscfg(name, param, paramlen,
416 buf, buflen, bssidx);
417 BUG_ON(!len);
418 if (len > 0)
419 err = brcmf_exec_dcmd(ndev, BRCMF_C_SET_VAR, buf, len);
420 if (err)
421 WL_ERR("error (%d)\n", err);
422
423 return err;
424}
425
426static s32
427brcmf_dev_iovar_getbuf_bsscfg(struct net_device *ndev, s8 *name,
428 void *param, s32 paramlen,
429 void *buf, s32 buflen, s32 bssidx)
430{
431 s32 err = -ENOMEM;
432 u32 len;
433
434 len = brcmf_c_mkiovar_bsscfg(name, param, paramlen,
435 buf, buflen, bssidx);
436 BUG_ON(!len);
437 if (len > 0)
438 err = brcmf_exec_dcmd(ndev, BRCMF_C_GET_VAR, buf, len);
439 if (err)
440 WL_ERR("error (%d)\n", err);
441
442 return err;
443}
444
445static void convert_key_from_CPU(struct brcmf_wsec_key *key, 395static void convert_key_from_CPU(struct brcmf_wsec_key *key,
446 struct brcmf_wsec_key_le *key_le) 396 struct brcmf_wsec_key_le *key_le)
447{ 397{
@@ -465,10 +415,10 @@ send_key_to_dongle(struct brcmf_cfg80211_info *cfg, s32 bssidx,
465 415
466 convert_key_from_CPU(key, &key_le); 416 convert_key_from_CPU(key, &key_le);
467 417
468 err = brcmf_dev_iovar_setbuf_bsscfg(ndev, "wsec_key", &key_le, 418 brcmf_netdev_wait_pend8021x(ndev);
469 sizeof(key_le), 419
470 cfg->extra_buf, 420 err = brcmf_fil_bsscfg_data_set(ndev, bssidx, "wsec_key", &key_le,
471 WL_EXTRA_BUF_MAX, bssidx); 421 sizeof(key_le));
472 422
473 if (err) 423 if (err)
474 WL_ERR("wsec_key error (%d)\n", err); 424 WL_ERR("wsec_key error (%d)\n", err);
@@ -521,7 +471,7 @@ brcmf_cfg80211_change_iface(struct wiphy *wiphy, struct net_device *ndev,
521 } 471 }
522 WL_INFO("IF Type = AP\n"); 472 WL_INFO("IF Type = AP\n");
523 } else { 473 } else {
524 err = brcmf_exec_dcmd_u32(ndev, BRCMF_C_SET_INFRA, &infra); 474 err = brcmf_fil_cmd_int_set(ndev, BRCMF_C_SET_INFRA, infra);
525 if (err) { 475 if (err) {
526 WL_ERR("WLC_SET_INFRA error (%d)\n", err); 476 WL_ERR("WLC_SET_INFRA error (%d)\n", err);
527 err = -EAGAIN; 477 err = -EAGAIN;
@@ -539,82 +489,6 @@ done:
539 return err; 489 return err;
540} 490}
541 491
542static s32 brcmf_dev_intvar_set(struct net_device *ndev, s8 *name, s32 val)
543{
544 s8 buf[BRCMF_DCMD_SMLEN];
545 u32 len;
546 s32 err = 0;
547 __le32 val_le;
548
549 val_le = cpu_to_le32(val);
550 len = brcmf_c_mkiovar(name, (char *)(&val_le), sizeof(val_le), buf,
551 sizeof(buf));
552 BUG_ON(!len);
553
554 err = brcmf_exec_dcmd(ndev, BRCMF_C_SET_VAR, buf, len);
555 if (err)
556 WL_ERR("error (%d)\n", err);
557
558 return err;
559}
560
561static s32
562brcmf_dev_intvar_get(struct net_device *ndev, s8 *name, s32 *retval)
563{
564 union {
565 s8 buf[BRCMF_DCMD_SMLEN];
566 __le32 val;
567 } var;
568 u32 len;
569 u32 data_null;
570 s32 err = 0;
571
572 len =
573 brcmf_c_mkiovar(name, (char *)(&data_null), 0, (char *)(&var),
574 sizeof(var.buf));
575 BUG_ON(!len);
576 err = brcmf_exec_dcmd(ndev, BRCMF_C_GET_VAR, &var, len);
577 if (err)
578 WL_ERR("error (%d)\n", err);
579
580 *retval = le32_to_cpu(var.val);
581
582 return err;
583}
584
585static s32
586brcmf_dev_intvar_set_bsscfg(struct net_device *ndev, s8 *name, u32 val,
587 s32 bssidx)
588{
589 s8 buf[BRCMF_DCMD_SMLEN];
590 __le32 val_le;
591
592 val_le = cpu_to_le32(val);
593
594 return brcmf_dev_iovar_setbuf_bsscfg(ndev, name, &val_le,
595 sizeof(val_le), buf, sizeof(buf),
596 bssidx);
597}
598
599static s32
600brcmf_dev_intvar_get_bsscfg(struct net_device *ndev, s8 *name, s32 *val,
601 s32 bssidx)
602{
603 s8 buf[BRCMF_DCMD_SMLEN];
604 s32 err;
605 __le32 val_le;
606
607 memset(buf, 0, sizeof(buf));
608 err = brcmf_dev_iovar_getbuf_bsscfg(ndev, name, val, sizeof(*val), buf,
609 sizeof(buf), bssidx);
610 if (err == 0) {
611 memcpy(&val_le, buf, sizeof(val_le));
612 *val = le32_to_cpu(val_le);
613 }
614 return err;
615}
616
617
618/* 492/*
619 * For now brcmf_find_bssidx will return 0. Once p2p gets implemented this 493 * For now brcmf_find_bssidx will return 0. Once p2p gets implemented this
620 * should return the ndev matching bssidx. 494 * should return the ndev matching bssidx.
@@ -631,7 +505,7 @@ static void brcmf_set_mpc(struct net_device *ndev, int mpc)
631 struct brcmf_cfg80211_info *cfg = ndev_to_cfg(ndev); 505 struct brcmf_cfg80211_info *cfg = ndev_to_cfg(ndev);
632 506
633 if (test_bit(WL_STATUS_READY, &cfg->status)) { 507 if (test_bit(WL_STATUS_READY, &cfg->status)) {
634 err = brcmf_dev_intvar_set(ndev, "mpc", mpc); 508 err = brcmf_fil_iovar_int_set(ndev, "mpc", mpc);
635 if (err) { 509 if (err) {
636 WL_ERR("fail to set mpc\n"); 510 WL_ERR("fail to set mpc\n");
637 return; 511 return;
@@ -658,30 +532,6 @@ static void brcmf_iscan_prep(struct brcmf_scan_params_le *params_le,
658} 532}
659 533
660static s32 534static s32
661brcmf_dev_iovar_setbuf(struct net_device *ndev, s8 * iovar, void *param,
662 s32 paramlen, void *bufptr, s32 buflen)
663{
664 s32 iolen;
665
666 iolen = brcmf_c_mkiovar(iovar, param, paramlen, bufptr, buflen);
667 BUG_ON(!iolen);
668
669 return brcmf_exec_dcmd(ndev, BRCMF_C_SET_VAR, bufptr, iolen);
670}
671
672static s32
673brcmf_dev_iovar_getbuf(struct net_device *ndev, s8 * iovar, void *param,
674 s32 paramlen, void *bufptr, s32 buflen)
675{
676 s32 iolen;
677
678 iolen = brcmf_c_mkiovar(iovar, param, paramlen, bufptr, buflen);
679 BUG_ON(!iolen);
680
681 return brcmf_exec_dcmd(ndev, BRCMF_C_GET_VAR, bufptr, buflen);
682}
683
684static s32
685brcmf_run_iscan(struct brcmf_cfg80211_iscan_ctrl *iscan, 535brcmf_run_iscan(struct brcmf_cfg80211_iscan_ctrl *iscan,
686 struct brcmf_ssid *ssid, u16 action) 536 struct brcmf_ssid *ssid, u16 action)
687{ 537{
@@ -703,8 +553,8 @@ brcmf_run_iscan(struct brcmf_cfg80211_iscan_ctrl *iscan,
703 params->action = cpu_to_le16(action); 553 params->action = cpu_to_le16(action);
704 params->scan_duration = cpu_to_le16(0); 554 params->scan_duration = cpu_to_le16(0);
705 555
706 err = brcmf_dev_iovar_setbuf(iscan->ndev, "iscan", params, params_size, 556 err = brcmf_fil_iovar_data_set(iscan->ndev, "iscan", params,
707 iscan->dcmd_buf, BRCMF_DCMD_SMLEN); 557 params_size);
708 if (err) { 558 if (err) {
709 if (err == -EBUSY) 559 if (err == -EBUSY)
710 WL_INFO("system busy : iscan canceled\n"); 560 WL_INFO("system busy : iscan canceled\n");
@@ -721,7 +571,7 @@ static s32 brcmf_do_iscan(struct brcmf_cfg80211_info *cfg)
721 struct brcmf_cfg80211_iscan_ctrl *iscan = cfg_to_iscan(cfg); 571 struct brcmf_cfg80211_iscan_ctrl *iscan = cfg_to_iscan(cfg);
722 struct net_device *ndev = cfg_to_ndev(cfg); 572 struct net_device *ndev = cfg_to_ndev(cfg);
723 struct brcmf_ssid ssid; 573 struct brcmf_ssid ssid;
724 __le32 passive_scan; 574 u32 passive_scan;
725 s32 err = 0; 575 s32 err = 0;
726 576
727 /* Broadcast scan by default */ 577 /* Broadcast scan by default */
@@ -729,9 +579,9 @@ static s32 brcmf_do_iscan(struct brcmf_cfg80211_info *cfg)
729 579
730 iscan->state = WL_ISCAN_STATE_SCANING; 580 iscan->state = WL_ISCAN_STATE_SCANING;
731 581
732 passive_scan = cfg->active_scan ? 0 : cpu_to_le32(1); 582 passive_scan = cfg->active_scan ? 0 : 1;
733 err = brcmf_exec_dcmd(cfg_to_ndev(cfg), BRCMF_C_SET_PASSIVE_SCAN, 583 err = brcmf_fil_cmd_int_set(cfg_to_ndev(cfg),
734 &passive_scan, sizeof(passive_scan)); 584 BRCMF_C_SET_PASSIVE_SCAN, passive_scan);
735 if (err) { 585 if (err) {
736 WL_ERR("error (%d)\n", err); 586 WL_ERR("error (%d)\n", err);
737 return err; 587 return err;
@@ -757,7 +607,7 @@ brcmf_cfg80211_iscan(struct wiphy *wiphy, struct net_device *ndev,
757 struct brcmf_cfg80211_info *cfg = ndev_to_cfg(ndev); 607 struct brcmf_cfg80211_info *cfg = ndev_to_cfg(ndev);
758 struct cfg80211_ssid *ssids; 608 struct cfg80211_ssid *ssids;
759 struct brcmf_cfg80211_scan_req *sr = cfg->scan_req_int; 609 struct brcmf_cfg80211_scan_req *sr = cfg->scan_req_int;
760 __le32 passive_scan; 610 u32 passive_scan;
761 bool iscan_req; 611 bool iscan_req;
762 bool spec_scan; 612 bool spec_scan;
763 s32 err = 0; 613 s32 err = 0;
@@ -813,16 +663,16 @@ brcmf_cfg80211_iscan(struct wiphy *wiphy, struct net_device *ndev,
813 WL_SCAN("Broadcast scan\n"); 663 WL_SCAN("Broadcast scan\n");
814 } 664 }
815 665
816 passive_scan = cfg->active_scan ? 0 : cpu_to_le32(1); 666 passive_scan = cfg->active_scan ? 0 : 1;
817 err = brcmf_exec_dcmd(ndev, BRCMF_C_SET_PASSIVE_SCAN, 667 err = brcmf_fil_cmd_int_set(ndev, BRCMF_C_SET_PASSIVE_SCAN,
818 &passive_scan, sizeof(passive_scan)); 668 passive_scan);
819 if (err) { 669 if (err) {
820 WL_ERR("WLC_SET_PASSIVE_SCAN error (%d)\n", err); 670 WL_ERR("WLC_SET_PASSIVE_SCAN error (%d)\n", err);
821 goto scan_out; 671 goto scan_out;
822 } 672 }
823 brcmf_set_mpc(ndev, 0); 673 brcmf_set_mpc(ndev, 0);
824 err = brcmf_exec_dcmd(ndev, BRCMF_C_SCAN, &sr->ssid_le, 674 err = brcmf_fil_cmd_data_set(ndev, BRCMF_C_SCAN, &sr->ssid_le,
825 sizeof(sr->ssid_le)); 675 sizeof(sr->ssid_le));
826 if (err) { 676 if (err) {
827 if (err == -EBUSY) 677 if (err == -EBUSY)
828 WL_INFO("system busy : scan for \"%s\" " 678 WL_INFO("system busy : scan for \"%s\" "
@@ -977,8 +827,8 @@ brcmf_notify_escan_complete(struct brcmf_cfg80211_info *cfg,
977 /* Scan is aborted by setting channel_list[0] to -1 */ 827 /* Scan is aborted by setting channel_list[0] to -1 */
978 params_le.channel_list[0] = cpu_to_le16(-1); 828 params_le.channel_list[0] = cpu_to_le16(-1);
979 /* E-Scan (or anyother type) can be aborted by SCAN */ 829 /* E-Scan (or anyother type) can be aborted by SCAN */
980 err = brcmf_exec_dcmd(ndev, BRCMF_C_SCAN, &params_le, 830 err = brcmf_fil_cmd_data_set(ndev, BRCMF_C_SCAN, &params_le,
981 sizeof(params_le)); 831 sizeof(params_le));
982 if (err) 832 if (err)
983 WL_ERR("Scan abort failed\n"); 833 WL_ERR("Scan abort failed\n");
984 } 834 }
@@ -1036,8 +886,7 @@ brcmf_run_escan(struct brcmf_cfg80211_info *cfg, struct net_device *ndev,
1036 params->action = cpu_to_le16(action); 886 params->action = cpu_to_le16(action);
1037 params->sync_id = cpu_to_le16(0x1234); 887 params->sync_id = cpu_to_le16(0x1234);
1038 888
1039 err = brcmf_dev_iovar_setbuf(ndev, "escan", params, params_size, 889 err = brcmf_fil_iovar_data_set(ndev, "escan", params, params_size);
1040 cfg->escan_ioctl_buf, BRCMF_DCMD_MEDLEN);
1041 if (err) { 890 if (err) {
1042 if (err == -EBUSY) 891 if (err == -EBUSY)
1043 WL_INFO("system busy : escan canceled\n"); 892 WL_INFO("system busy : escan canceled\n");
@@ -1055,16 +904,16 @@ brcmf_do_escan(struct brcmf_cfg80211_info *cfg, struct wiphy *wiphy,
1055 struct net_device *ndev, struct cfg80211_scan_request *request) 904 struct net_device *ndev, struct cfg80211_scan_request *request)
1056{ 905{
1057 s32 err; 906 s32 err;
1058 __le32 passive_scan; 907 u32 passive_scan;
1059 struct brcmf_scan_results *results; 908 struct brcmf_scan_results *results;
1060 909
1061 WL_SCAN("Enter\n"); 910 WL_SCAN("Enter\n");
1062 cfg->escan_info.ndev = ndev; 911 cfg->escan_info.ndev = ndev;
1063 cfg->escan_info.wiphy = wiphy; 912 cfg->escan_info.wiphy = wiphy;
1064 cfg->escan_info.escan_state = WL_ESCAN_STATE_SCANNING; 913 cfg->escan_info.escan_state = WL_ESCAN_STATE_SCANNING;
1065 passive_scan = cfg->active_scan ? 0 : cpu_to_le32(1); 914 passive_scan = cfg->active_scan ? 0 : 1;
1066 err = brcmf_exec_dcmd(ndev, BRCMF_C_SET_PASSIVE_SCAN, 915 err = brcmf_fil_cmd_int_set(ndev, BRCMF_C_SET_PASSIVE_SCAN,
1067 &passive_scan, sizeof(passive_scan)); 916 passive_scan);
1068 if (err) { 917 if (err) {
1069 WL_ERR("error (%d)\n", err); 918 WL_ERR("error (%d)\n", err);
1070 return err; 919 return err;
@@ -1089,7 +938,7 @@ brcmf_cfg80211_escan(struct wiphy *wiphy, struct net_device *ndev,
1089 struct brcmf_cfg80211_info *cfg = ndev_to_cfg(ndev); 938 struct brcmf_cfg80211_info *cfg = ndev_to_cfg(ndev);
1090 struct cfg80211_ssid *ssids; 939 struct cfg80211_ssid *ssids;
1091 struct brcmf_cfg80211_scan_req *sr = cfg->scan_req_int; 940 struct brcmf_cfg80211_scan_req *sr = cfg->scan_req_int;
1092 __le32 passive_scan; 941 u32 passive_scan;
1093 bool escan_req; 942 bool escan_req;
1094 bool spec_scan; 943 bool spec_scan;
1095 s32 err; 944 s32 err;
@@ -1149,16 +998,16 @@ brcmf_cfg80211_escan(struct wiphy *wiphy, struct net_device *ndev,
1149 } else 998 } else
1150 WL_SCAN("Broadcast scan\n"); 999 WL_SCAN("Broadcast scan\n");
1151 1000
1152 passive_scan = cfg->active_scan ? 0 : cpu_to_le32(1); 1001 passive_scan = cfg->active_scan ? 0 : 1;
1153 err = brcmf_exec_dcmd(ndev, BRCMF_C_SET_PASSIVE_SCAN, 1002 err = brcmf_fil_cmd_int_set(ndev, BRCMF_C_SET_PASSIVE_SCAN,
1154 &passive_scan, sizeof(passive_scan)); 1003 passive_scan);
1155 if (err) { 1004 if (err) {
1156 WL_ERR("WLC_SET_PASSIVE_SCAN error (%d)\n", err); 1005 WL_ERR("WLC_SET_PASSIVE_SCAN error (%d)\n", err);
1157 goto scan_out; 1006 goto scan_out;
1158 } 1007 }
1159 brcmf_set_mpc(ndev, 0); 1008 brcmf_set_mpc(ndev, 0);
1160 err = brcmf_exec_dcmd(ndev, BRCMF_C_SCAN, &sr->ssid_le, 1009 err = brcmf_fil_cmd_data_set(ndev, BRCMF_C_SCAN, &sr->ssid_le,
1161 sizeof(sr->ssid_le)); 1010 sizeof(sr->ssid_le));
1162 if (err) { 1011 if (err) {
1163 if (err == -EBUSY) 1012 if (err == -EBUSY)
1164 WL_INFO("BUSY: scan for \"%s\" canceled\n", 1013 WL_INFO("BUSY: scan for \"%s\" canceled\n",
@@ -1210,7 +1059,7 @@ static s32 brcmf_set_rts(struct net_device *ndev, u32 rts_threshold)
1210{ 1059{
1211 s32 err = 0; 1060 s32 err = 0;
1212 1061
1213 err = brcmf_dev_intvar_set(ndev, "rtsthresh", rts_threshold); 1062 err = brcmf_fil_iovar_int_set(ndev, "rtsthresh", rts_threshold);
1214 if (err) 1063 if (err)
1215 WL_ERR("Error (%d)\n", err); 1064 WL_ERR("Error (%d)\n", err);
1216 1065
@@ -1221,7 +1070,7 @@ static s32 brcmf_set_frag(struct net_device *ndev, u32 frag_threshold)
1221{ 1070{
1222 s32 err = 0; 1071 s32 err = 0;
1223 1072
1224 err = brcmf_dev_intvar_set(ndev, "fragthresh", frag_threshold); 1073 err = brcmf_fil_iovar_int_set(ndev, "fragthresh", frag_threshold);
1225 if (err) 1074 if (err)
1226 WL_ERR("Error (%d)\n", err); 1075 WL_ERR("Error (%d)\n", err);
1227 1076
@@ -1233,7 +1082,7 @@ static s32 brcmf_set_retry(struct net_device *ndev, u32 retry, bool l)
1233 s32 err = 0; 1082 s32 err = 0;
1234 u32 cmd = (l ? BRCM_SET_LRL : BRCM_SET_SRL); 1083 u32 cmd = (l ? BRCM_SET_LRL : BRCM_SET_SRL);
1235 1084
1236 err = brcmf_exec_dcmd_u32(ndev, cmd, &retry); 1085 err = brcmf_fil_cmd_int_set(ndev, cmd, retry);
1237 if (err) { 1086 if (err) {
1238 WL_ERR("cmd (%d) , error (%d)\n", cmd, err); 1087 WL_ERR("cmd (%d) , error (%d)\n", cmd, err);
1239 return err; 1088 return err;
@@ -1327,7 +1176,7 @@ static void brcmf_link_down(struct brcmf_cfg80211_info *cfg)
1327 if (cfg->link_up) { 1176 if (cfg->link_up) {
1328 ndev = cfg_to_ndev(cfg); 1177 ndev = cfg_to_ndev(cfg);
1329 WL_INFO("Call WLC_DISASSOC to stop excess roaming\n "); 1178 WL_INFO("Call WLC_DISASSOC to stop excess roaming\n ");
1330 err = brcmf_exec_dcmd(ndev, BRCMF_C_DISASSOC, NULL, 0); 1179 err = brcmf_fil_cmd_data_set(ndev, BRCMF_C_DISASSOC, NULL, 0);
1331 if (err) 1180 if (err)
1332 WL_ERR("WLC_DISASSOC failed (%d)\n", err); 1181 WL_ERR("WLC_DISASSOC failed (%d)\n", err);
1333 cfg->link_up = false; 1182 cfg->link_up = false;
@@ -1399,7 +1248,7 @@ brcmf_cfg80211_join_ibss(struct wiphy *wiphy, struct net_device *ndev,
1399 if (params->privacy) 1248 if (params->privacy)
1400 wsec |= WEP_ENABLED; 1249 wsec |= WEP_ENABLED;
1401 1250
1402 err = brcmf_dev_intvar_set(ndev, "wsec", wsec); 1251 err = brcmf_fil_iovar_int_set(ndev, "wsec", wsec);
1403 if (err) { 1252 if (err) {
1404 WL_ERR("wsec failed (%d)\n", err); 1253 WL_ERR("wsec failed (%d)\n", err);
1405 goto done; 1254 goto done;
@@ -1411,7 +1260,7 @@ brcmf_cfg80211_join_ibss(struct wiphy *wiphy, struct net_device *ndev,
1411 else 1260 else
1412 bcnprd = 100; 1261 bcnprd = 100;
1413 1262
1414 err = brcmf_exec_dcmd_u32(ndev, BRCM_SET_BCNPRD, &bcnprd); 1263 err = brcmf_fil_cmd_int_set(ndev, BRCM_SET_BCNPRD, bcnprd);
1415 if (err) { 1264 if (err) {
1416 WL_ERR("WLC_SET_BCNPRD failed (%d)\n", err); 1265 WL_ERR("WLC_SET_BCNPRD failed (%d)\n", err);
1417 goto done; 1266 goto done;
@@ -1453,8 +1302,8 @@ brcmf_cfg80211_join_ibss(struct wiphy *wiphy, struct net_device *ndev,
1453 1302
1454 /* set channel for starter */ 1303 /* set channel for starter */
1455 target_channel = cfg->channel; 1304 target_channel = cfg->channel;
1456 err = brcmf_exec_dcmd_u32(ndev, BRCM_SET_CHANNEL, 1305 err = brcmf_fil_cmd_int_set(ndev, BRCM_SET_CHANNEL,
1457 &target_channel); 1306 target_channel);
1458 if (err) { 1307 if (err) {
1459 WL_ERR("WLC_SET_CHANNEL failed (%d)\n", err); 1308 WL_ERR("WLC_SET_CHANNEL failed (%d)\n", err);
1460 goto done; 1309 goto done;
@@ -1465,8 +1314,8 @@ brcmf_cfg80211_join_ibss(struct wiphy *wiphy, struct net_device *ndev,
1465 cfg->ibss_starter = false; 1314 cfg->ibss_starter = false;
1466 1315
1467 1316
1468 err = brcmf_exec_dcmd(ndev, BRCMF_C_SET_SSID, 1317 err = brcmf_fil_cmd_data_set(ndev, BRCMF_C_SET_SSID,
1469 &join_params, join_params_size); 1318 &join_params, join_params_size);
1470 if (err) { 1319 if (err) {
1471 WL_ERR("WLC_SET_SSID failed (%d)\n", err); 1320 WL_ERR("WLC_SET_SSID failed (%d)\n", err);
1472 goto done; 1321 goto done;
@@ -1512,7 +1361,7 @@ static s32 brcmf_set_wpa_version(struct net_device *ndev,
1512 else 1361 else
1513 val = WPA_AUTH_DISABLED; 1362 val = WPA_AUTH_DISABLED;
1514 WL_CONN("setting wpa_auth to 0x%0x\n", val); 1363 WL_CONN("setting wpa_auth to 0x%0x\n", val);
1515 err = brcmf_dev_intvar_set(ndev, "wpa_auth", val); 1364 err = brcmf_fil_iovar_int_set(ndev, "wpa_auth", val);
1516 if (err) { 1365 if (err) {
1517 WL_ERR("set wpa_auth failed (%d)\n", err); 1366 WL_ERR("set wpa_auth failed (%d)\n", err);
1518 return err; 1367 return err;
@@ -1552,7 +1401,7 @@ static s32 brcmf_set_auth_type(struct net_device *ndev,
1552 break; 1401 break;
1553 } 1402 }
1554 1403
1555 err = brcmf_dev_intvar_set(ndev, "auth", val); 1404 err = brcmf_fil_iovar_int_set(ndev, "auth", val);
1556 if (err) { 1405 if (err) {
1557 WL_ERR("set auth failed (%d)\n", err); 1406 WL_ERR("set auth failed (%d)\n", err);
1558 return err; 1407 return err;
@@ -1617,7 +1466,7 @@ brcmf_set_set_cipher(struct net_device *ndev,
1617 } 1466 }
1618 1467
1619 WL_CONN("pval (%d) gval (%d)\n", pval, gval); 1468 WL_CONN("pval (%d) gval (%d)\n", pval, gval);
1620 err = brcmf_dev_intvar_set(ndev, "wsec", pval | gval); 1469 err = brcmf_fil_iovar_int_set(ndev, "wsec", pval | gval);
1621 if (err) { 1470 if (err) {
1622 WL_ERR("error (%d)\n", err); 1471 WL_ERR("error (%d)\n", err);
1623 return err; 1472 return err;
@@ -1640,7 +1489,7 @@ brcmf_set_key_mgmt(struct net_device *ndev, struct cfg80211_connect_params *sme)
1640 s32 err = 0; 1489 s32 err = 0;
1641 1490
1642 if (sme->crypto.n_akm_suites) { 1491 if (sme->crypto.n_akm_suites) {
1643 err = brcmf_dev_intvar_get(ndev, "wpa_auth", &val); 1492 err = brcmf_fil_iovar_int_get(ndev, "wpa_auth", &val);
1644 if (err) { 1493 if (err) {
1645 WL_ERR("could not get wpa_auth (%d)\n", err); 1494 WL_ERR("could not get wpa_auth (%d)\n", err);
1646 return err; 1495 return err;
@@ -1674,7 +1523,7 @@ brcmf_set_key_mgmt(struct net_device *ndev, struct cfg80211_connect_params *sme)
1674 } 1523 }
1675 1524
1676 WL_CONN("setting wpa_auth to %d\n", val); 1525 WL_CONN("setting wpa_auth to %d\n", val);
1677 err = brcmf_dev_intvar_set(ndev, "wpa_auth", val); 1526 err = brcmf_fil_iovar_int_set(ndev, "wpa_auth", val);
1678 if (err) { 1527 if (err) {
1679 WL_ERR("could not set wpa_auth (%d)\n", err); 1528 WL_ERR("could not set wpa_auth (%d)\n", err);
1680 return err; 1529 return err;
@@ -1747,7 +1596,7 @@ brcmf_set_sharedkey(struct net_device *ndev,
1747 if (sec->auth_type == NL80211_AUTHTYPE_SHARED_KEY) { 1596 if (sec->auth_type == NL80211_AUTHTYPE_SHARED_KEY) {
1748 WL_CONN("set auth_type to shared key\n"); 1597 WL_CONN("set auth_type to shared key\n");
1749 val = WL_AUTH_SHARED_KEY; /* shared key */ 1598 val = WL_AUTH_SHARED_KEY; /* shared key */
1750 err = brcmf_dev_intvar_set_bsscfg(ndev, "auth", val, bssidx); 1599 err = brcmf_fil_bsscfg_int_set(ndev, bssidx, "auth", val);
1751 if (err) 1600 if (err)
1752 WL_ERR("set auth failed (%d)\n", err); 1601 WL_ERR("set auth failed (%d)\n", err);
1753 } 1602 }
@@ -1835,8 +1684,8 @@ brcmf_cfg80211_connect(struct wiphy *wiphy, struct net_device *ndev,
1835 1684
1836 brcmf_ch_to_chanspec(cfg->channel, 1685 brcmf_ch_to_chanspec(cfg->channel,
1837 &join_params, &join_params_size); 1686 &join_params, &join_params_size);
1838 err = brcmf_exec_dcmd(ndev, BRCMF_C_SET_SSID, 1687 err = brcmf_fil_cmd_data_set(ndev, BRCMF_C_SET_SSID,
1839 &join_params, join_params_size); 1688 &join_params, join_params_size);
1840 if (err) 1689 if (err)
1841 WL_ERR("WLC_SET_SSID failed (%d)\n", err); 1690 WL_ERR("WLC_SET_SSID failed (%d)\n", err);
1842 1691
@@ -1864,8 +1713,8 @@ brcmf_cfg80211_disconnect(struct wiphy *wiphy, struct net_device *ndev,
1864 1713
1865 memcpy(&scbval.ea, &profile->bssid, ETH_ALEN); 1714 memcpy(&scbval.ea, &profile->bssid, ETH_ALEN);
1866 scbval.val = cpu_to_le32(reason_code); 1715 scbval.val = cpu_to_le32(reason_code);
1867 err = brcmf_exec_dcmd(ndev, BRCMF_C_DISASSOC, &scbval, 1716 err = brcmf_fil_cmd_data_set(ndev, BRCMF_C_DISASSOC, &scbval,
1868 sizeof(struct brcmf_scb_val_le)); 1717 sizeof(struct brcmf_scb_val_le));
1869 if (err) 1718 if (err)
1870 WL_ERR("error (%d)\n", err); 1719 WL_ERR("error (%d)\n", err);
1871 1720
@@ -1905,7 +1754,7 @@ brcmf_cfg80211_set_tx_power(struct wiphy *wiphy,
1905 } 1754 }
1906 /* Make sure radio is off or on as far as software is concerned */ 1755 /* Make sure radio is off or on as far as software is concerned */
1907 disable = WL_RADIO_SW_DISABLE << 16; 1756 disable = WL_RADIO_SW_DISABLE << 16;
1908 err = brcmf_exec_dcmd_u32(ndev, BRCMF_C_SET_RADIO, &disable); 1757 err = brcmf_fil_cmd_int_set(ndev, BRCMF_C_SET_RADIO, disable);
1909 if (err) 1758 if (err)
1910 WL_ERR("WLC_SET_RADIO error (%d)\n", err); 1759 WL_ERR("WLC_SET_RADIO error (%d)\n", err);
1911 1760
@@ -1913,7 +1762,7 @@ brcmf_cfg80211_set_tx_power(struct wiphy *wiphy,
1913 txpwrmw = 0xffff; 1762 txpwrmw = 0xffff;
1914 else 1763 else
1915 txpwrmw = (u16) dbm; 1764 txpwrmw = (u16) dbm;
1916 err = brcmf_dev_intvar_set(ndev, "qtxpower", 1765 err = brcmf_fil_iovar_int_set(ndev, "qtxpower",
1917 (s32) (brcmf_mw_to_qdbm(txpwrmw))); 1766 (s32) (brcmf_mw_to_qdbm(txpwrmw)));
1918 if (err) 1767 if (err)
1919 WL_ERR("qtxpower error (%d)\n", err); 1768 WL_ERR("qtxpower error (%d)\n", err);
@@ -1936,7 +1785,7 @@ static s32 brcmf_cfg80211_get_tx_power(struct wiphy *wiphy, s32 *dbm)
1936 if (!check_sys_up(wiphy)) 1785 if (!check_sys_up(wiphy))
1937 return -EIO; 1786 return -EIO;
1938 1787
1939 err = brcmf_dev_intvar_get(ndev, "qtxpower", &txpwrdbm); 1788 err = brcmf_fil_iovar_int_get(ndev, "qtxpower", &txpwrdbm);
1940 if (err) { 1789 if (err) {
1941 WL_ERR("error (%d)\n", err); 1790 WL_ERR("error (%d)\n", err);
1942 goto done; 1791 goto done;
@@ -1966,7 +1815,7 @@ brcmf_cfg80211_config_default_key(struct wiphy *wiphy, struct net_device *ndev,
1966 return -EIO; 1815 return -EIO;
1967 1816
1968 bssidx = brcmf_find_bssidx(cfg, ndev); 1817 bssidx = brcmf_find_bssidx(cfg, ndev);
1969 err = brcmf_dev_intvar_get_bsscfg(ndev, "wsec", &wsec, bssidx); 1818 err = brcmf_fil_bsscfg_int_get(ndev, bssidx, "wsec", &wsec);
1970 if (err) { 1819 if (err) {
1971 WL_ERR("WLC_GET_WSEC error (%d)\n", err); 1820 WL_ERR("WLC_GET_WSEC error (%d)\n", err);
1972 goto done; 1821 goto done;
@@ -1975,8 +1824,8 @@ brcmf_cfg80211_config_default_key(struct wiphy *wiphy, struct net_device *ndev,
1975 if (wsec & WEP_ENABLED) { 1824 if (wsec & WEP_ENABLED) {
1976 /* Just select a new current key */ 1825 /* Just select a new current key */
1977 index = key_idx; 1826 index = key_idx;
1978 err = brcmf_exec_dcmd_u32(ndev, BRCMF_C_SET_KEY_PRIMARY, 1827 err = brcmf_fil_cmd_int_set(ndev, BRCMF_C_SET_KEY_PRIMARY,
1979 &index); 1828 index);
1980 if (err) 1829 if (err)
1981 WL_ERR("error (%d)\n", err); 1830 WL_ERR("error (%d)\n", err);
1982 } 1831 }
@@ -1991,7 +1840,6 @@ brcmf_add_keyext(struct wiphy *wiphy, struct net_device *ndev,
1991{ 1840{
1992 struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy); 1841 struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
1993 struct brcmf_wsec_key key; 1842 struct brcmf_wsec_key key;
1994 struct brcmf_wsec_key_le key_le;
1995 s32 err = 0; 1843 s32 err = 0;
1996 s32 bssidx; 1844 s32 bssidx;
1997 1845
@@ -2061,13 +1909,7 @@ brcmf_add_keyext(struct wiphy *wiphy, struct net_device *ndev,
2061 WL_ERR("Invalid cipher (0x%x)\n", params->cipher); 1909 WL_ERR("Invalid cipher (0x%x)\n", params->cipher);
2062 return -EINVAL; 1910 return -EINVAL;
2063 } 1911 }
2064 convert_key_from_CPU(&key, &key_le); 1912 err = send_key_to_dongle(cfg, bssidx, ndev, &key);
2065
2066 brcmf_netdev_wait_pend8021x(ndev);
2067 err = brcmf_dev_iovar_setbuf_bsscfg(ndev, "wsec_key", &key_le,
2068 sizeof(key_le),
2069 cfg->extra_buf,
2070 WL_EXTRA_BUF_MAX, bssidx);
2071 if (err) 1913 if (err)
2072 WL_ERR("wsec_key error (%d)\n", err); 1914 WL_ERR("wsec_key error (%d)\n", err);
2073 } 1915 }
@@ -2152,13 +1994,13 @@ brcmf_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev,
2152 if (err) 1994 if (err)
2153 goto done; 1995 goto done;
2154 1996
2155 err = brcmf_dev_intvar_get_bsscfg(ndev, "wsec", &wsec, bssidx); 1997 err = brcmf_fil_bsscfg_int_get(ndev, bssidx, "wsec", &wsec);
2156 if (err) { 1998 if (err) {
2157 WL_ERR("get wsec error (%d)\n", err); 1999 WL_ERR("get wsec error (%d)\n", err);
2158 goto done; 2000 goto done;
2159 } 2001 }
2160 wsec |= val; 2002 wsec |= val;
2161 err = brcmf_dev_intvar_set_bsscfg(ndev, "wsec", wsec, bssidx); 2003 err = brcmf_fil_bsscfg_int_set(ndev, bssidx, "wsec", wsec);
2162 if (err) { 2004 if (err) {
2163 WL_ERR("set wsec error (%d)\n", err); 2005 WL_ERR("set wsec error (%d)\n", err);
2164 goto done; 2006 goto done;
@@ -2228,7 +2070,7 @@ brcmf_cfg80211_get_key(struct wiphy *wiphy, struct net_device *ndev,
2228 memset(&params, 0, sizeof(params)); 2070 memset(&params, 0, sizeof(params));
2229 2071
2230 bssidx = brcmf_find_bssidx(cfg, ndev); 2072 bssidx = brcmf_find_bssidx(cfg, ndev);
2231 err = brcmf_dev_intvar_get_bsscfg(ndev, "wsec", &wsec, bssidx); 2073 err = brcmf_fil_bsscfg_int_get(ndev, bssidx, "wsec", &wsec);
2232 if (err) { 2074 if (err) {
2233 WL_ERR("WLC_GET_WSEC error (%d)\n", err); 2075 WL_ERR("WLC_GET_WSEC error (%d)\n", err);
2234 /* Ignore this error, may happen during DISASSOC */ 2076 /* Ignore this error, may happen during DISASSOC */
@@ -2286,27 +2128,25 @@ brcmf_cfg80211_get_station(struct wiphy *wiphy, struct net_device *ndev,
2286 s32 rate; 2128 s32 rate;
2287 s32 err = 0; 2129 s32 err = 0;
2288 u8 *bssid = profile->bssid; 2130 u8 *bssid = profile->bssid;
2289 struct brcmf_sta_info_le *sta_info_le; 2131 struct brcmf_sta_info_le sta_info_le;
2290 2132
2291 WL_TRACE("Enter, MAC %pM\n", mac); 2133 WL_TRACE("Enter, MAC %pM\n", mac);
2292 if (!check_sys_up(wiphy)) 2134 if (!check_sys_up(wiphy))
2293 return -EIO; 2135 return -EIO;
2294 2136
2295 if (cfg->conf->mode == WL_MODE_AP) { 2137 if (cfg->conf->mode == WL_MODE_AP) {
2296 err = brcmf_dev_iovar_getbuf(ndev, "sta_info", mac, ETH_ALEN, 2138 memcpy(&sta_info_le, mac, ETH_ALEN);
2297 cfg->dcmd_buf, 2139 err = brcmf_fil_iovar_data_get(ndev, "sta_info", &sta_info_le,
2298 WL_DCMD_LEN_MAX); 2140 sizeof(sta_info_le));
2299 if (err < 0) { 2141 if (err < 0) {
2300 WL_ERR("GET STA INFO failed, %d\n", err); 2142 WL_ERR("GET STA INFO failed, %d\n", err);
2301 goto done; 2143 goto done;
2302 } 2144 }
2303 sta_info_le = (struct brcmf_sta_info_le *)cfg->dcmd_buf;
2304
2305 sinfo->filled = STATION_INFO_INACTIVE_TIME; 2145 sinfo->filled = STATION_INFO_INACTIVE_TIME;
2306 sinfo->inactive_time = le32_to_cpu(sta_info_le->idle) * 1000; 2146 sinfo->inactive_time = le32_to_cpu(sta_info_le.idle) * 1000;
2307 if (le32_to_cpu(sta_info_le->flags) & BRCMF_STA_ASSOC) { 2147 if (le32_to_cpu(sta_info_le.flags) & BRCMF_STA_ASSOC) {
2308 sinfo->filled |= STATION_INFO_CONNECTED_TIME; 2148 sinfo->filled |= STATION_INFO_CONNECTED_TIME;
2309 sinfo->connected_time = le32_to_cpu(sta_info_le->in); 2149 sinfo->connected_time = le32_to_cpu(sta_info_le.in);
2310 } 2150 }
2311 WL_TRACE("STA idle time : %d ms, connected time :%d sec\n", 2151 WL_TRACE("STA idle time : %d ms, connected time :%d sec\n",
2312 sinfo->inactive_time, sinfo->connected_time); 2152 sinfo->inactive_time, sinfo->connected_time);
@@ -2318,7 +2158,7 @@ brcmf_cfg80211_get_station(struct wiphy *wiphy, struct net_device *ndev,
2318 goto done; 2158 goto done;
2319 } 2159 }
2320 /* Report the current tx rate */ 2160 /* Report the current tx rate */
2321 err = brcmf_exec_dcmd_u32(ndev, BRCMF_C_GET_RATE, &rate); 2161 err = brcmf_fil_cmd_int_get(ndev, BRCMF_C_GET_RATE, &rate);
2322 if (err) { 2162 if (err) {
2323 WL_ERR("Could not get rate (%d)\n", err); 2163 WL_ERR("Could not get rate (%d)\n", err);
2324 goto done; 2164 goto done;
@@ -2330,8 +2170,8 @@ brcmf_cfg80211_get_station(struct wiphy *wiphy, struct net_device *ndev,
2330 2170
2331 if (test_bit(WL_STATUS_CONNECTED, &cfg->status)) { 2171 if (test_bit(WL_STATUS_CONNECTED, &cfg->status)) {
2332 memset(&scb_val, 0, sizeof(scb_val)); 2172 memset(&scb_val, 0, sizeof(scb_val));
2333 err = brcmf_exec_dcmd(ndev, BRCMF_C_GET_RSSI, &scb_val, 2173 err = brcmf_fil_cmd_data_get(ndev, BRCMF_C_GET_RSSI, &scb_val,
2334 sizeof(scb_val)); 2174 sizeof(struct brcmf_scb_val_le));
2335 if (err) { 2175 if (err) {
2336 WL_ERR("Could not get rssi (%d)\n", err); 2176 WL_ERR("Could not get rssi (%d)\n", err);
2337 goto done; 2177 goto done;
@@ -2376,7 +2216,7 @@ brcmf_cfg80211_set_power_mgmt(struct wiphy *wiphy, struct net_device *ndev,
2376 pm = enabled ? PM_FAST : PM_OFF; 2216 pm = enabled ? PM_FAST : PM_OFF;
2377 WL_INFO("power save %s\n", (pm ? "enabled" : "disabled")); 2217 WL_INFO("power save %s\n", (pm ? "enabled" : "disabled"));
2378 2218
2379 err = brcmf_exec_dcmd_u32(ndev, BRCMF_C_SET_PM, &pm); 2219 err = brcmf_fil_cmd_int_set(ndev, BRCMF_C_SET_PM, pm);
2380 if (err) { 2220 if (err) {
2381 if (err == -ENODEV) 2221 if (err == -ENODEV)
2382 WL_ERR("net_device is not ready yet\n"); 2222 WL_ERR("net_device is not ready yet\n");
@@ -2407,8 +2247,8 @@ brcmf_cfg80211_set_bitrate_mask(struct wiphy *wiphy, struct net_device *ndev,
2407 2247
2408 /* addr param is always NULL. ignore it */ 2248 /* addr param is always NULL. ignore it */
2409 /* Get current rateset */ 2249 /* Get current rateset */
2410 err = brcmf_exec_dcmd(ndev, BRCM_GET_CURR_RATESET, &rateset_le, 2250 err = brcmf_fil_cmd_data_get(ndev, BRCM_GET_CURR_RATESET, &rateset_le,
2411 sizeof(rateset_le)); 2251 sizeof(rateset_le));
2412 if (err) { 2252 if (err) {
2413 WL_ERR("could not get current rateset (%d)\n", err); 2253 WL_ERR("could not get current rateset (%d)\n", err);
2414 goto done; 2254 goto done;
@@ -2435,8 +2275,8 @@ brcmf_cfg80211_set_bitrate_mask(struct wiphy *wiphy, struct net_device *ndev,
2435 * Set rate override, 2275 * Set rate override,
2436 * Since the is a/b/g-blind, both a/bg_rate are enforced. 2276 * Since the is a/b/g-blind, both a/bg_rate are enforced.
2437 */ 2277 */
2438 err_bg = brcmf_dev_intvar_set(ndev, "bg_rate", rate); 2278 err_bg = brcmf_fil_iovar_int_set(ndev, "bg_rate", rate);
2439 err_a = brcmf_dev_intvar_set(ndev, "a_rate", rate); 2279 err_a = brcmf_fil_iovar_int_set(ndev, "a_rate", rate);
2440 if (err_bg && err_a) { 2280 if (err_bg && err_a) {
2441 WL_ERR("could not set fixed rate (%d) (%d)\n", err_bg, err_a); 2281 WL_ERR("could not set fixed rate (%d) (%d)\n", err_bg, err_a);
2442 err = err_bg | err_a; 2282 err = err_bg | err_a;
@@ -2565,7 +2405,8 @@ static s32 wl_inform_ibss(struct brcmf_cfg80211_info *cfg,
2565 2405
2566 *(__le32 *)buf = cpu_to_le32(WL_BSS_INFO_MAX); 2406 *(__le32 *)buf = cpu_to_le32(WL_BSS_INFO_MAX);
2567 2407
2568 err = brcmf_exec_dcmd(ndev, BRCMF_C_GET_BSS_INFO, buf, WL_BSS_INFO_MAX); 2408 err = brcmf_fil_cmd_data_get(ndev, BRCMF_C_GET_BSS_INFO, buf,
2409 WL_BSS_INFO_MAX);
2569 if (err) { 2410 if (err) {
2570 WL_ERR("WLC_GET_BSS_INFO failed: %d\n", err); 2411 WL_ERR("WLC_GET_BSS_INFO failed: %d\n", err);
2571 goto CleanUp; 2412 goto CleanUp;
@@ -2706,8 +2547,9 @@ static s32 brcmf_update_bss_info(struct brcmf_cfg80211_info *cfg)
2706 ssid = &profile->ssid; 2547 ssid = &profile->ssid;
2707 2548
2708 *(__le32 *)cfg->extra_buf = cpu_to_le32(WL_EXTRA_BUF_MAX); 2549 *(__le32 *)cfg->extra_buf = cpu_to_le32(WL_EXTRA_BUF_MAX);
2709 err = brcmf_exec_dcmd(cfg_to_ndev(cfg), BRCMF_C_GET_BSS_INFO, 2550 err = brcmf_fil_cmd_data_get(cfg_to_ndev(cfg),
2710 cfg->extra_buf, WL_EXTRA_BUF_MAX); 2551 BRCMF_C_GET_BSS_INFO,
2552 cfg->extra_buf, WL_EXTRA_BUF_MAX);
2711 if (err) { 2553 if (err) {
2712 WL_ERR("Could not get bss info %d\n", err); 2554 WL_ERR("Could not get bss info %d\n", err);
2713 goto update_bss_info_out; 2555 goto update_bss_info_out;
@@ -2732,8 +2574,8 @@ static s32 brcmf_update_bss_info(struct brcmf_cfg80211_info *cfg)
2732 * so we speficially query dtim information to dongle. 2574 * so we speficially query dtim information to dongle.
2733 */ 2575 */
2734 u32 var; 2576 u32 var;
2735 err = brcmf_dev_intvar_get(cfg_to_ndev(cfg), 2577 err = brcmf_fil_iovar_int_get(cfg_to_ndev(cfg),
2736 "dtim_assoc", &var); 2578 "dtim_assoc", &var);
2737 if (err) { 2579 if (err) {
2738 WL_ERR("wl dtim_assoc failed (%d)\n", err); 2580 WL_ERR("wl dtim_assoc failed (%d)\n", err);
2739 goto update_bss_info_out; 2581 goto update_bss_info_out;
@@ -2820,7 +2662,6 @@ static s32
2820brcmf_get_iscan_results(struct brcmf_cfg80211_iscan_ctrl *iscan, u32 *status, 2662brcmf_get_iscan_results(struct brcmf_cfg80211_iscan_ctrl *iscan, u32 *status,
2821 struct brcmf_scan_results **bss_list) 2663 struct brcmf_scan_results **bss_list)
2822{ 2664{
2823 struct brcmf_iscan_results list;
2824 struct brcmf_scan_results *results; 2665 struct brcmf_scan_results *results;
2825 struct brcmf_scan_results_le *results_le; 2666 struct brcmf_scan_results_le *results_le;
2826 struct brcmf_iscan_results *list_buf; 2667 struct brcmf_iscan_results *list_buf;
@@ -2830,15 +2671,13 @@ brcmf_get_iscan_results(struct brcmf_cfg80211_iscan_ctrl *iscan, u32 *status,
2830 list_buf = (struct brcmf_iscan_results *)iscan->scan_buf; 2671 list_buf = (struct brcmf_iscan_results *)iscan->scan_buf;
2831 results = &list_buf->results; 2672 results = &list_buf->results;
2832 results_le = &list_buf->results_le; 2673 results_le = &list_buf->results_le;
2833 results->buflen = BRCMF_ISCAN_RESULTS_FIXED_SIZE; 2674 results_le->buflen = cpu_to_le32(sizeof(iscan->scan_buf));
2834 results->version = 0; 2675 results_le->version = 0;
2835 results->count = 0; 2676 results_le->count = 0;
2836 2677
2837 memset(&list, 0, sizeof(list)); 2678 err = brcmf_fil_iovar_data_get(iscan->ndev, "iscanresults",
2838 list.results_le.buflen = cpu_to_le32(WL_ISCAN_BUF_MAX); 2679 iscan->scan_buf,
2839 err = brcmf_dev_iovar_getbuf(iscan->ndev, "iscanresults", &list, 2680 sizeof(iscan->scan_buf));
2840 BRCMF_ISCAN_RESULTS_FIXED_SIZE,
2841 iscan->scan_buf, WL_ISCAN_BUF_MAX);
2842 if (err) { 2681 if (err) {
2843 WL_ERR("error (%d)\n", err); 2682 WL_ERR("error (%d)\n", err);
2844 return err; 2683 return err;
@@ -3222,42 +3061,6 @@ static s32 brcmf_cfg80211_suspend(struct wiphy *wiphy,
3222} 3061}
3223 3062
3224static __used s32 3063static __used s32
3225brcmf_dev_bufvar_set(struct net_device *ndev, s8 *name, s8 *buf, s32 len)
3226{
3227 struct brcmf_cfg80211_info *cfg = ndev_to_cfg(ndev);
3228 u32 buflen;
3229
3230 buflen = brcmf_c_mkiovar(name, buf, len, cfg->dcmd_buf,
3231 WL_DCMD_LEN_MAX);
3232 BUG_ON(!buflen);
3233
3234 return brcmf_exec_dcmd(ndev, BRCMF_C_SET_VAR, cfg->dcmd_buf,
3235 buflen);
3236}
3237
3238static s32
3239brcmf_dev_bufvar_get(struct net_device *ndev, s8 *name, s8 *buf,
3240 s32 buf_len)
3241{
3242 struct brcmf_cfg80211_info *cfg = ndev_to_cfg(ndev);
3243 u32 len;
3244 s32 err = 0;
3245
3246 len = brcmf_c_mkiovar(name, NULL, 0, cfg->dcmd_buf,
3247 WL_DCMD_LEN_MAX);
3248 BUG_ON(!len);
3249 err = brcmf_exec_dcmd(ndev, BRCMF_C_GET_VAR, cfg->dcmd_buf,
3250 WL_DCMD_LEN_MAX);
3251 if (err) {
3252 WL_ERR("error (%d)\n", err);
3253 return err;
3254 }
3255 memcpy(buf, cfg->dcmd_buf, buf_len);
3256
3257 return err;
3258}
3259
3260static __used s32
3261brcmf_update_pmklist(struct net_device *ndev, 3064brcmf_update_pmklist(struct net_device *ndev,
3262 struct brcmf_cfg80211_pmk_list *pmk_list, s32 err) 3065 struct brcmf_cfg80211_pmk_list *pmk_list, s32 err)
3263{ 3066{
@@ -3275,8 +3078,8 @@ brcmf_update_pmklist(struct net_device *ndev,
3275 } 3078 }
3276 3079
3277 if (!err) 3080 if (!err)
3278 brcmf_dev_bufvar_set(ndev, "pmkid_info", (char *)pmk_list, 3081 brcmf_fil_iovar_data_set(ndev, "pmkid_info", (char *)pmk_list,
3279 sizeof(*pmk_list)); 3082 sizeof(*pmk_list));
3280 3083
3281 return err; 3084 return err;
3282} 3085}
@@ -3512,15 +3315,13 @@ out_err:
3512#ifndef CONFIG_BRCMISCAN 3315#ifndef CONFIG_BRCMISCAN
3513static int brcmf_dev_pno_clean(struct net_device *ndev) 3316static int brcmf_dev_pno_clean(struct net_device *ndev)
3514{ 3317{
3515 char iovbuf[128];
3516 int ret; 3318 int ret;
3517 3319
3518 /* Disable pfn */ 3320 /* Disable pfn */
3519 ret = brcmf_dev_intvar_set(ndev, "pfn", 0); 3321 ret = brcmf_fil_iovar_int_set(ndev, "pfn", 0);
3520 if (ret == 0) { 3322 if (ret == 0) {
3521 /* clear pfn */ 3323 /* clear pfn */
3522 ret = brcmf_dev_iovar_setbuf(ndev, "pfnclear", NULL, 0, 3324 ret = brcmf_fil_iovar_data_set(ndev, "pfnclear", NULL, 0);
3523 iovbuf, sizeof(iovbuf));
3524 } 3325 }
3525 if (ret < 0) 3326 if (ret < 0)
3526 WL_ERR("failed code %d\n", ret); 3327 WL_ERR("failed code %d\n", ret);
@@ -3531,7 +3332,6 @@ static int brcmf_dev_pno_clean(struct net_device *ndev)
3531static int brcmf_dev_pno_config(struct net_device *ndev) 3332static int brcmf_dev_pno_config(struct net_device *ndev)
3532{ 3333{
3533 struct brcmf_pno_param_le pfn_param; 3334 struct brcmf_pno_param_le pfn_param;
3534 char iovbuf[128];
3535 3335
3536 memset(&pfn_param, 0, sizeof(pfn_param)); 3336 memset(&pfn_param, 0, sizeof(pfn_param));
3537 pfn_param.version = cpu_to_le32(BRCMF_PNO_VERSION); 3337 pfn_param.version = cpu_to_le32(BRCMF_PNO_VERSION);
@@ -3544,9 +3344,8 @@ static int brcmf_dev_pno_config(struct net_device *ndev)
3544 /* set up pno scan fr */ 3344 /* set up pno scan fr */
3545 pfn_param.scan_freq = cpu_to_le32(BRCMF_PNO_TIME); 3345 pfn_param.scan_freq = cpu_to_le32(BRCMF_PNO_TIME);
3546 3346
3547 return brcmf_dev_iovar_setbuf(ndev, "pfn_set", 3347 return brcmf_fil_iovar_data_set(ndev, "pfn_set", &pfn_param,
3548 &pfn_param, sizeof(pfn_param), 3348 sizeof(pfn_param));
3549 iovbuf, sizeof(iovbuf));
3550} 3349}
3551 3350
3552static int 3351static int
@@ -3554,7 +3353,6 @@ brcmf_cfg80211_sched_scan_start(struct wiphy *wiphy,
3554 struct net_device *ndev, 3353 struct net_device *ndev,
3555 struct cfg80211_sched_scan_request *request) 3354 struct cfg80211_sched_scan_request *request)
3556{ 3355{
3557 char iovbuf[128];
3558 struct brcmf_cfg80211_info *cfg = wiphy_priv(wiphy); 3356 struct brcmf_cfg80211_info *cfg = wiphy_priv(wiphy);
3559 struct brcmf_pno_net_param_le pfn; 3357 struct brcmf_pno_net_param_le pfn;
3560 int i; 3358 int i;
@@ -3620,15 +3418,14 @@ brcmf_cfg80211_sched_scan_start(struct wiphy *wiphy,
3620 pfn.flags = cpu_to_le32(1 << BRCMF_PNO_HIDDEN_BIT); 3418 pfn.flags = cpu_to_le32(1 << BRCMF_PNO_HIDDEN_BIT);
3621 pfn.ssid.SSID_len = cpu_to_le32(ssid_len); 3419 pfn.ssid.SSID_len = cpu_to_le32(ssid_len);
3622 memcpy(pfn.ssid.SSID, ssid->ssid, ssid_len); 3420 memcpy(pfn.ssid.SSID, ssid->ssid, ssid_len);
3623 ret = brcmf_dev_iovar_setbuf(ndev, "pfn_add", 3421 ret = brcmf_fil_iovar_data_set(ndev, "pfn_add",
3624 &pfn, sizeof(pfn), 3422 &pfn, sizeof(pfn));
3625 iovbuf, sizeof(iovbuf));
3626 WL_SCAN(">>> PNO filter %s for ssid (%s)\n", 3423 WL_SCAN(">>> PNO filter %s for ssid (%s)\n",
3627 ret == 0 ? "set" : "failed", 3424 ret == 0 ? "set" : "failed",
3628 ssid->ssid); 3425 ssid->ssid);
3629 } 3426 }
3630 /* Enable the PNO */ 3427 /* Enable the PNO */
3631 if (brcmf_dev_intvar_set(ndev, "pfn", 1) < 0) { 3428 if (brcmf_fil_iovar_int_set(ndev, "pfn", 1) < 0) {
3632 WL_ERR("PNO enable failed!! ret=%d\n", ret); 3429 WL_ERR("PNO enable failed!! ret=%d\n", ret);
3633 return -EINVAL; 3430 return -EINVAL;
3634 } 3431 }
@@ -3676,20 +3473,19 @@ static s32 brcmf_configure_opensecurity(struct net_device *ndev, s32 bssidx)
3676 s32 err; 3473 s32 err;
3677 3474
3678 /* set auth */ 3475 /* set auth */
3679 err = brcmf_dev_intvar_set_bsscfg(ndev, "auth", 0, bssidx); 3476 err = brcmf_fil_bsscfg_int_set(ndev, bssidx, "auth", 0);
3680 if (err < 0) { 3477 if (err < 0) {
3681 WL_ERR("auth error %d\n", err); 3478 WL_ERR("auth error %d\n", err);
3682 return err; 3479 return err;
3683 } 3480 }
3684 /* set wsec */ 3481 /* set wsec */
3685 err = brcmf_dev_intvar_set_bsscfg(ndev, "wsec", 0, bssidx); 3482 err = brcmf_fil_bsscfg_int_set(ndev, bssidx, "wsec", 0);
3686 if (err < 0) { 3483 if (err < 0) {
3687 WL_ERR("wsec error %d\n", err); 3484 WL_ERR("wsec error %d\n", err);
3688 return err; 3485 return err;
3689 } 3486 }
3690 /* set upper-layer auth */ 3487 /* set upper-layer auth */
3691 err = brcmf_dev_intvar_set_bsscfg(ndev, "wpa_auth", 3488 err = brcmf_fil_bsscfg_int_set(ndev, bssidx, "wpa_auth", WPA_AUTH_NONE);
3692 WPA_AUTH_NONE, bssidx);
3693 if (err < 0) { 3489 if (err < 0) {
3694 WL_ERR("wpa_auth error %d\n", err); 3490 WL_ERR("wpa_auth error %d\n", err);
3695 return err; 3491 return err;
@@ -3850,8 +3646,8 @@ brcmf_configure_wpaie(struct net_device *ndev, struct brcmf_vs_tlv *wpa_ie,
3850 wme_bss_disable = 0; 3646 wme_bss_disable = 0;
3851 } 3647 }
3852 /* set wme_bss_disable to sync RSN Capabilities */ 3648 /* set wme_bss_disable to sync RSN Capabilities */
3853 err = brcmf_dev_intvar_set_bsscfg(ndev, "wme_bss_disable", 3649 err = brcmf_fil_bsscfg_int_set(ndev, bssidx, "wme_bss_disable",
3854 wme_bss_disable, bssidx); 3650 wme_bss_disable);
3855 if (err < 0) { 3651 if (err < 0) {
3856 WL_ERR("wme_bss_disable error %d\n", err); 3652 WL_ERR("wme_bss_disable error %d\n", err);
3857 goto exit; 3653 goto exit;
@@ -3861,19 +3657,19 @@ brcmf_configure_wpaie(struct net_device *ndev, struct brcmf_vs_tlv *wpa_ie,
3861 wsec = (pval | gval | SES_OW_ENABLED); 3657 wsec = (pval | gval | SES_OW_ENABLED);
3862 3658
3863 /* set auth */ 3659 /* set auth */
3864 err = brcmf_dev_intvar_set_bsscfg(ndev, "auth", auth, bssidx); 3660 err = brcmf_fil_bsscfg_int_set(ndev, bssidx, "auth", auth);
3865 if (err < 0) { 3661 if (err < 0) {
3866 WL_ERR("auth error %d\n", err); 3662 WL_ERR("auth error %d\n", err);
3867 goto exit; 3663 goto exit;
3868 } 3664 }
3869 /* set wsec */ 3665 /* set wsec */
3870 err = brcmf_dev_intvar_set_bsscfg(ndev, "wsec", wsec, bssidx); 3666 err = brcmf_fil_bsscfg_int_set(ndev, bssidx, "wsec", wsec);
3871 if (err < 0) { 3667 if (err < 0) {
3872 WL_ERR("wsec error %d\n", err); 3668 WL_ERR("wsec error %d\n", err);
3873 goto exit; 3669 goto exit;
3874 } 3670 }
3875 /* set upper-layer auth */ 3671 /* set upper-layer auth */
3876 err = brcmf_dev_intvar_set_bsscfg(ndev, "wpa_auth", wpa_auth, bssidx); 3672 err = brcmf_fil_bsscfg_int_set(ndev, bssidx, "wpa_auth", wpa_auth);
3877 if (err < 0) { 3673 if (err < 0) {
3878 WL_ERR("wpa_auth error %d\n", err); 3674 WL_ERR("wpa_auth error %d\n", err);
3879 goto exit; 3675 goto exit;
@@ -4103,11 +3899,9 @@ brcmf_set_management_ie(struct brcmf_cfg80211_info *cfg,
4103 } 3899 }
4104 } 3900 }
4105 if (total_ie_buf_len) { 3901 if (total_ie_buf_len) {
4106 err = brcmf_dev_iovar_setbuf_bsscfg(ndev, "vndr_ie", 3902 err = brcmf_fil_bsscfg_data_set(ndev, bssidx, "vndr_ie",
4107 iovar_ie_buf, 3903 iovar_ie_buf,
4108 total_ie_buf_len, 3904 total_ie_buf_len);
4109 cfg->extra_buf,
4110 WL_EXTRA_BUF_MAX, bssidx);
4111 if (err) 3905 if (err)
4112 WL_ERR("vndr ie set error : %d\n", err); 3906 WL_ERR("vndr ie set error : %d\n", err);
4113 } 3907 }
@@ -4124,7 +3918,6 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,
4124 s32 ie_offset; 3918 s32 ie_offset;
4125 struct brcmf_tlv *ssid_ie; 3919 struct brcmf_tlv *ssid_ie;
4126 struct brcmf_ssid_le ssid_le; 3920 struct brcmf_ssid_le ssid_le;
4127 s32 ioctl_value;
4128 s32 err = -EPERM; 3921 s32 err = -EPERM;
4129 struct brcmf_tlv *rsn_ie; 3922 struct brcmf_tlv *rsn_ie;
4130 struct brcmf_vs_tlv *wpa_ie; 3923 struct brcmf_vs_tlv *wpa_ie;
@@ -4163,20 +3956,17 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,
4163 } 3956 }
4164 3957
4165 brcmf_set_mpc(ndev, 0); 3958 brcmf_set_mpc(ndev, 0);
4166 ioctl_value = 1; 3959 err = brcmf_fil_cmd_int_set(ndev, BRCMF_C_DOWN, 1);
4167 err = brcmf_exec_dcmd_u32(ndev, BRCMF_C_DOWN, &ioctl_value);
4168 if (err < 0) { 3960 if (err < 0) {
4169 WL_ERR("BRCMF_C_DOWN error %d\n", err); 3961 WL_ERR("BRCMF_C_DOWN error %d\n", err);
4170 goto exit; 3962 goto exit;
4171 } 3963 }
4172 ioctl_value = 1; 3964 err = brcmf_fil_cmd_int_set(ndev, BRCMF_C_SET_INFRA, 1);
4173 err = brcmf_exec_dcmd_u32(ndev, BRCMF_C_SET_INFRA, &ioctl_value);
4174 if (err < 0) { 3965 if (err < 0) {
4175 WL_ERR("SET INFRA error %d\n", err); 3966 WL_ERR("SET INFRA error %d\n", err);
4176 goto exit; 3967 goto exit;
4177 } 3968 }
4178 ioctl_value = 1; 3969 err = brcmf_fil_cmd_int_set(ndev, BRCMF_C_SET_AP, 1);
4179 err = brcmf_exec_dcmd_u32(ndev, BRCMF_C_SET_AP, &ioctl_value);
4180 if (err < 0) { 3970 if (err < 0) {
4181 WL_ERR("setting AP mode failed %d\n", err); 3971 WL_ERR("setting AP mode failed %d\n", err);
4182 goto exit; 3972 goto exit;
@@ -4245,25 +4035,22 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,
4245 WL_TRACE("Applied Vndr IEs for Probe Resp\n"); 4035 WL_TRACE("Applied Vndr IEs for Probe Resp\n");
4246 4036
4247 if (settings->beacon_interval) { 4037 if (settings->beacon_interval) {
4248 ioctl_value = settings->beacon_interval; 4038 err = brcmf_fil_cmd_int_set(ndev, BRCMF_C_SET_BCNPRD,
4249 err = brcmf_exec_dcmd_u32(ndev, BRCMF_C_SET_BCNPRD, 4039 settings->beacon_interval);
4250 &ioctl_value);
4251 if (err < 0) { 4040 if (err < 0) {
4252 WL_ERR("Beacon Interval Set Error, %d\n", err); 4041 WL_ERR("Beacon Interval Set Error, %d\n", err);
4253 goto exit; 4042 goto exit;
4254 } 4043 }
4255 } 4044 }
4256 if (settings->dtim_period) { 4045 if (settings->dtim_period) {
4257 ioctl_value = settings->dtim_period; 4046 err = brcmf_fil_cmd_int_set(ndev, BRCMF_C_SET_DTIMPRD,
4258 err = brcmf_exec_dcmd_u32(ndev, BRCMF_C_SET_DTIMPRD, 4047 settings->dtim_period);
4259 &ioctl_value);
4260 if (err < 0) { 4048 if (err < 0) {
4261 WL_ERR("DTIM Interval Set Error, %d\n", err); 4049 WL_ERR("DTIM Interval Set Error, %d\n", err);
4262 goto exit; 4050 goto exit;
4263 } 4051 }
4264 } 4052 }
4265 ioctl_value = 1; 4053 err = brcmf_fil_cmd_int_set(ndev, BRCMF_C_UP, 1);
4266 err = brcmf_exec_dcmd_u32(ndev, BRCMF_C_UP, &ioctl_value);
4267 if (err < 0) { 4054 if (err < 0) {
4268 WL_ERR("BRCMF_C_UP error (%d)\n", err); 4055 WL_ERR("BRCMF_C_UP error (%d)\n", err);
4269 goto exit; 4056 goto exit;
@@ -4273,8 +4060,8 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,
4273 /* join parameters starts with ssid */ 4060 /* join parameters starts with ssid */
4274 memcpy(&join_params.ssid_le, &ssid_le, sizeof(ssid_le)); 4061 memcpy(&join_params.ssid_le, &ssid_le, sizeof(ssid_le));
4275 /* create softap */ 4062 /* create softap */
4276 err = brcmf_exec_dcmd(ndev, BRCMF_C_SET_SSID, &join_params, 4063 err = brcmf_fil_cmd_data_set(ndev, BRCMF_C_SET_SSID, &join_params,
4277 sizeof(join_params)); 4064 sizeof(join_params));
4278 if (err < 0) { 4065 if (err < 0) {
4279 WL_ERR("SET SSID error (%d)\n", err); 4066 WL_ERR("SET SSID error (%d)\n", err);
4280 goto exit; 4067 goto exit;
@@ -4291,7 +4078,6 @@ exit:
4291static int brcmf_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *ndev) 4078static int brcmf_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *ndev)
4292{ 4079{
4293 struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy); 4080 struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
4294 s32 ioctl_value;
4295 s32 err = -EPERM; 4081 s32 err = -EPERM;
4296 4082
4297 WL_TRACE("Enter\n"); 4083 WL_TRACE("Enter\n");
@@ -4300,14 +4086,12 @@ static int brcmf_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *ndev)
4300 /* Due to most likely deauths outstanding we sleep */ 4086 /* Due to most likely deauths outstanding we sleep */
4301 /* first to make sure they get processed by fw. */ 4087 /* first to make sure they get processed by fw. */
4302 msleep(400); 4088 msleep(400);
4303 ioctl_value = 0; 4089 err = brcmf_fil_cmd_int_set(ndev, BRCMF_C_SET_AP, 0);
4304 err = brcmf_exec_dcmd_u32(ndev, BRCMF_C_SET_AP, &ioctl_value);
4305 if (err < 0) { 4090 if (err < 0) {
4306 WL_ERR("setting AP mode failed %d\n", err); 4091 WL_ERR("setting AP mode failed %d\n", err);
4307 goto exit; 4092 goto exit;
4308 } 4093 }
4309 ioctl_value = 0; 4094 err = brcmf_fil_cmd_int_set(ndev, BRCMF_C_UP, 0);
4310 err = brcmf_exec_dcmd_u32(ndev, BRCMF_C_UP, &ioctl_value);
4311 if (err < 0) { 4095 if (err < 0) {
4312 WL_ERR("BRCMF_C_UP error %d\n", err); 4096 WL_ERR("BRCMF_C_UP error %d\n", err);
4313 goto exit; 4097 goto exit;
@@ -4337,8 +4121,9 @@ brcmf_cfg80211_del_station(struct wiphy *wiphy, struct net_device *ndev,
4337 4121
4338 memcpy(&scbval.ea, mac, ETH_ALEN); 4122 memcpy(&scbval.ea, mac, ETH_ALEN);
4339 scbval.val = cpu_to_le32(WLAN_REASON_DEAUTH_LEAVING); 4123 scbval.val = cpu_to_le32(WLAN_REASON_DEAUTH_LEAVING);
4340 err = brcmf_exec_dcmd(ndev, BRCMF_C_SCB_DEAUTHENTICATE_FOR_REASON, 4124 err = brcmf_fil_cmd_data_set(ndev,
4341 &scbval, sizeof(scbval)); 4125 BRCMF_C_SCB_DEAUTHENTICATE_FOR_REASON,
4126 &scbval, sizeof(scbval));
4342 if (err) 4127 if (err)
4343 WL_ERR("SCB_DEAUTHENTICATE_FOR_REASON failed %d\n", err); 4128 WL_ERR("SCB_DEAUTHENTICATE_FOR_REASON failed %d\n", err);
4344 4129
@@ -4549,8 +4334,8 @@ static s32 brcmf_get_assoc_ies(struct brcmf_cfg80211_info *cfg)
4549 4334
4550 brcmf_clear_assoc_ies(cfg); 4335 brcmf_clear_assoc_ies(cfg);
4551 4336
4552 err = brcmf_dev_bufvar_get(ndev, "assoc_info", cfg->extra_buf, 4337 err = brcmf_fil_iovar_data_get(ndev, "assoc_info", cfg->extra_buf,
4553 WL_ASSOC_INFO_MAX); 4338 WL_ASSOC_INFO_MAX);
4554 if (err) { 4339 if (err) {
4555 WL_ERR("could not get assoc info (%d)\n", err); 4340 WL_ERR("could not get assoc info (%d)\n", err);
4556 return err; 4341 return err;
@@ -4560,9 +4345,9 @@ static s32 brcmf_get_assoc_ies(struct brcmf_cfg80211_info *cfg)
4560 req_len = le32_to_cpu(assoc_info->req_len); 4345 req_len = le32_to_cpu(assoc_info->req_len);
4561 resp_len = le32_to_cpu(assoc_info->resp_len); 4346 resp_len = le32_to_cpu(assoc_info->resp_len);
4562 if (req_len) { 4347 if (req_len) {
4563 err = brcmf_dev_bufvar_get(ndev, "assoc_req_ies", 4348 err = brcmf_fil_iovar_data_get(ndev, "assoc_req_ies",
4564 cfg->extra_buf, 4349 cfg->extra_buf,
4565 WL_ASSOC_INFO_MAX); 4350 WL_ASSOC_INFO_MAX);
4566 if (err) { 4351 if (err) {
4567 WL_ERR("could not get assoc req (%d)\n", err); 4352 WL_ERR("could not get assoc req (%d)\n", err);
4568 return err; 4353 return err;
@@ -4576,9 +4361,9 @@ static s32 brcmf_get_assoc_ies(struct brcmf_cfg80211_info *cfg)
4576 conn_info->req_ie = NULL; 4361 conn_info->req_ie = NULL;
4577 } 4362 }
4578 if (resp_len) { 4363 if (resp_len) {
4579 err = brcmf_dev_bufvar_get(ndev, "assoc_resp_ies", 4364 err = brcmf_fil_iovar_data_get(ndev, "assoc_resp_ies",
4580 cfg->extra_buf, 4365 cfg->extra_buf,
4581 WL_ASSOC_INFO_MAX); 4366 WL_ASSOC_INFO_MAX);
4582 if (err) { 4367 if (err) {
4583 WL_ERR("could not get assoc resp (%d)\n", err); 4368 WL_ERR("could not get assoc resp (%d)\n", err);
4584 return err; 4369 return err;
@@ -4627,7 +4412,8 @@ brcmf_bss_roaming_done(struct brcmf_cfg80211_info *cfg,
4627 4412
4628 /* data sent to dongle has to be little endian */ 4413 /* data sent to dongle has to be little endian */
4629 *(__le32 *)buf = cpu_to_le32(WL_BSS_INFO_MAX); 4414 *(__le32 *)buf = cpu_to_le32(WL_BSS_INFO_MAX);
4630 err = brcmf_exec_dcmd(ndev, BRCMF_C_GET_BSS_INFO, buf, WL_BSS_INFO_MAX); 4415 err = brcmf_fil_cmd_data_get(ndev, BRCMF_C_GET_BSS_INFO, buf,
4416 WL_BSS_INFO_MAX);
4631 4417
4632 if (err) 4418 if (err)
4633 goto done; 4419 goto done;
@@ -4841,8 +4627,9 @@ brcmf_notify_scan_status(struct brcmf_cfg80211_info *cfg,
4841 goto scan_done_out; 4627 goto scan_done_out;
4842 } 4628 }
4843 4629
4844 err = brcmf_exec_dcmd(ndev, BRCMF_C_GET_CHANNEL, &channel_inform_le, 4630 err = brcmf_fil_cmd_data_get(ndev, BRCMF_C_GET_CHANNEL,
4845 sizeof(channel_inform_le)); 4631 &channel_inform_le,
4632 sizeof(channel_inform_le));
4846 if (err) { 4633 if (err) {
4847 WL_ERR("scan busy (%d)\n", err); 4634 WL_ERR("scan busy (%d)\n", err);
4848 scan_abort = true; 4635 scan_abort = true;
@@ -4856,8 +4643,8 @@ brcmf_notify_scan_status(struct brcmf_cfg80211_info *cfg,
4856 4643
4857 memset(cfg->scan_results, 0, len); 4644 memset(cfg->scan_results, 0, len);
4858 bss_list_le->buflen = cpu_to_le32(len); 4645 bss_list_le->buflen = cpu_to_le32(len);
4859 err = brcmf_exec_dcmd(ndev, BRCMF_C_SCAN_RESULTS, 4646 err = brcmf_fil_cmd_data_get(ndev, BRCMF_C_SCAN_RESULTS,
4860 cfg->scan_results, len); 4647 cfg->scan_results, len);
4861 if (err) { 4648 if (err) {
4862 WL_ERR("%s Scan_results error (%d)\n", ndev->name, err); 4649 WL_ERR("%s Scan_results error (%d)\n", ndev->name, err);
4863 err = -EINVAL; 4650 err = -EINVAL;
@@ -5201,22 +4988,18 @@ brcmf_cfg80211_event(struct net_device *ndev,
5201 4988
5202static s32 brcmf_dongle_eventmsg(struct net_device *ndev) 4989static s32 brcmf_dongle_eventmsg(struct net_device *ndev)
5203{ 4990{
5204 /* Room for "event_msgs" + '\0' + bitvec */
5205 s8 iovbuf[BRCMF_EVENTING_MASK_LEN + 12];
5206 s8 eventmask[BRCMF_EVENTING_MASK_LEN]; 4991 s8 eventmask[BRCMF_EVENTING_MASK_LEN];
5207 s32 err = 0; 4992 s32 err = 0;
5208 4993
5209 WL_TRACE("Enter\n"); 4994 WL_TRACE("Enter\n");
5210 4995
5211 /* Setup event_msgs */ 4996 /* Setup event_msgs */
5212 brcmf_c_mkiovar("event_msgs", eventmask, BRCMF_EVENTING_MASK_LEN, 4997 err = brcmf_fil_iovar_data_get(ndev, "event_msgs", eventmask,
5213 iovbuf, sizeof(iovbuf)); 4998 BRCMF_EVENTING_MASK_LEN);
5214 err = brcmf_exec_dcmd(ndev, BRCMF_C_GET_VAR, iovbuf, sizeof(iovbuf));
5215 if (err) { 4999 if (err) {
5216 WL_ERR("Get event_msgs error (%d)\n", err); 5000 WL_ERR("Get event_msgs error (%d)\n", err);
5217 goto dongle_eventmsg_out; 5001 goto dongle_eventmsg_out;
5218 } 5002 }
5219 memcpy(eventmask, iovbuf, BRCMF_EVENTING_MASK_LEN);
5220 5003
5221 setbit(eventmask, BRCMF_E_SET_SSID); 5004 setbit(eventmask, BRCMF_E_SET_SSID);
5222 setbit(eventmask, BRCMF_E_ROAM); 5005 setbit(eventmask, BRCMF_E_ROAM);
@@ -5240,9 +5023,8 @@ static s32 brcmf_dongle_eventmsg(struct net_device *ndev)
5240 setbit(eventmask, BRCMF_E_ESCAN_RESULT); 5023 setbit(eventmask, BRCMF_E_ESCAN_RESULT);
5241 setbit(eventmask, BRCMF_E_PFN_NET_FOUND); 5024 setbit(eventmask, BRCMF_E_PFN_NET_FOUND);
5242 5025
5243 brcmf_c_mkiovar("event_msgs", eventmask, BRCMF_EVENTING_MASK_LEN, 5026 err = brcmf_fil_iovar_data_set(ndev, "event_msgs", eventmask,
5244 iovbuf, sizeof(iovbuf)); 5027 BRCMF_EVENTING_MASK_LEN);
5245 err = brcmf_exec_dcmd(ndev, BRCMF_C_SET_VAR, iovbuf, sizeof(iovbuf));
5246 if (err) { 5028 if (err) {
5247 WL_ERR("Set event_msgs error (%d)\n", err); 5029 WL_ERR("Set event_msgs error (%d)\n", err);
5248 goto dongle_eventmsg_out; 5030 goto dongle_eventmsg_out;
@@ -5256,23 +5038,16 @@ dongle_eventmsg_out:
5256static s32 5038static s32
5257brcmf_dongle_roam(struct net_device *ndev, u32 roamvar, u32 bcn_timeout) 5039brcmf_dongle_roam(struct net_device *ndev, u32 roamvar, u32 bcn_timeout)
5258{ 5040{
5259 s8 iovbuf[32];
5260 s32 err = 0; 5041 s32 err = 0;
5261 __le32 roamtrigger[2]; 5042 __le32 roamtrigger[2];
5262 __le32 roam_delta[2]; 5043 __le32 roam_delta[2];
5263 __le32 bcn_to_le;
5264 __le32 roamvar_le;
5265 5044
5266 /* 5045 /*
5267 * Setup timeout if Beacons are lost and roam is 5046 * Setup timeout if Beacons are lost and roam is
5268 * off to report link down 5047 * off to report link down
5269 */ 5048 */
5270 if (roamvar) { 5049 if (roamvar) {
5271 bcn_to_le = cpu_to_le32(bcn_timeout); 5050 err = brcmf_fil_iovar_int_set(ndev, "bcn_timeout", bcn_timeout);
5272 brcmf_c_mkiovar("bcn_timeout", (char *)&bcn_to_le,
5273 sizeof(bcn_to_le), iovbuf, sizeof(iovbuf));
5274 err = brcmf_exec_dcmd(ndev, BRCMF_C_SET_VAR,
5275 iovbuf, sizeof(iovbuf));
5276 if (err) { 5051 if (err) {
5277 WL_ERR("bcn_timeout error (%d)\n", err); 5052 WL_ERR("bcn_timeout error (%d)\n", err);
5278 goto dongle_rom_out; 5053 goto dongle_rom_out;
@@ -5284,10 +5059,7 @@ brcmf_dongle_roam(struct net_device *ndev, u32 roamvar, u32 bcn_timeout)
5284 * to take care of roaming 5059 * to take care of roaming
5285 */ 5060 */
5286 WL_INFO("Internal Roaming = %s\n", roamvar ? "Off" : "On"); 5061 WL_INFO("Internal Roaming = %s\n", roamvar ? "Off" : "On");
5287 roamvar_le = cpu_to_le32(roamvar); 5062 err = brcmf_fil_iovar_int_set(ndev, "roam_off", roamvar);
5288 brcmf_c_mkiovar("roam_off", (char *)&roamvar_le,
5289 sizeof(roamvar_le), iovbuf, sizeof(iovbuf));
5290 err = brcmf_exec_dcmd(ndev, BRCMF_C_SET_VAR, iovbuf, sizeof(iovbuf));
5291 if (err) { 5063 if (err) {
5292 WL_ERR("roam_off error (%d)\n", err); 5064 WL_ERR("roam_off error (%d)\n", err);
5293 goto dongle_rom_out; 5065 goto dongle_rom_out;
@@ -5295,8 +5067,8 @@ brcmf_dongle_roam(struct net_device *ndev, u32 roamvar, u32 bcn_timeout)
5295 5067
5296 roamtrigger[0] = cpu_to_le32(WL_ROAM_TRIGGER_LEVEL); 5068 roamtrigger[0] = cpu_to_le32(WL_ROAM_TRIGGER_LEVEL);
5297 roamtrigger[1] = cpu_to_le32(BRCM_BAND_ALL); 5069 roamtrigger[1] = cpu_to_le32(BRCM_BAND_ALL);
5298 err = brcmf_exec_dcmd(ndev, BRCMF_C_SET_ROAM_TRIGGER, 5070 err = brcmf_fil_cmd_data_set(ndev, BRCMF_C_SET_ROAM_TRIGGER,
5299 (void *)roamtrigger, sizeof(roamtrigger)); 5071 (void *)roamtrigger, sizeof(roamtrigger));
5300 if (err) { 5072 if (err) {
5301 WL_ERR("WLC_SET_ROAM_TRIGGER error (%d)\n", err); 5073 WL_ERR("WLC_SET_ROAM_TRIGGER error (%d)\n", err);
5302 goto dongle_rom_out; 5074 goto dongle_rom_out;
@@ -5304,8 +5076,8 @@ brcmf_dongle_roam(struct net_device *ndev, u32 roamvar, u32 bcn_timeout)
5304 5076
5305 roam_delta[0] = cpu_to_le32(WL_ROAM_DELTA); 5077 roam_delta[0] = cpu_to_le32(WL_ROAM_DELTA);
5306 roam_delta[1] = cpu_to_le32(BRCM_BAND_ALL); 5078 roam_delta[1] = cpu_to_le32(BRCM_BAND_ALL);
5307 err = brcmf_exec_dcmd(ndev, BRCMF_C_SET_ROAM_DELTA, 5079 err = brcmf_fil_cmd_data_set(ndev, BRCMF_C_SET_ROAM_DELTA,
5308 (void *)roam_delta, sizeof(roam_delta)); 5080 (void *)roam_delta, sizeof(roam_delta));
5309 if (err) { 5081 if (err) {
5310 WL_ERR("WLC_SET_ROAM_DELTA error (%d)\n", err); 5082 WL_ERR("WLC_SET_ROAM_DELTA error (%d)\n", err);
5311 goto dongle_rom_out; 5083 goto dongle_rom_out;
@@ -5320,12 +5092,9 @@ brcmf_dongle_scantime(struct net_device *ndev, s32 scan_assoc_time,
5320 s32 scan_unassoc_time, s32 scan_passive_time) 5092 s32 scan_unassoc_time, s32 scan_passive_time)
5321{ 5093{
5322 s32 err = 0; 5094 s32 err = 0;
5323 __le32 scan_assoc_tm_le = cpu_to_le32(scan_assoc_time);
5324 __le32 scan_unassoc_tm_le = cpu_to_le32(scan_unassoc_time);
5325 __le32 scan_passive_tm_le = cpu_to_le32(scan_passive_time);
5326 5095
5327 err = brcmf_exec_dcmd(ndev, BRCMF_C_SET_SCAN_CHANNEL_TIME, 5096 err = brcmf_fil_cmd_int_set(ndev, BRCMF_C_SET_SCAN_CHANNEL_TIME,
5328 &scan_assoc_tm_le, sizeof(scan_assoc_tm_le)); 5097 scan_assoc_time);
5329 if (err) { 5098 if (err) {
5330 if (err == -EOPNOTSUPP) 5099 if (err == -EOPNOTSUPP)
5331 WL_INFO("Scan assoc time is not supported\n"); 5100 WL_INFO("Scan assoc time is not supported\n");
@@ -5333,8 +5102,8 @@ brcmf_dongle_scantime(struct net_device *ndev, s32 scan_assoc_time,
5333 WL_ERR("Scan assoc time error (%d)\n", err); 5102 WL_ERR("Scan assoc time error (%d)\n", err);
5334 goto dongle_scantime_out; 5103 goto dongle_scantime_out;
5335 } 5104 }
5336 err = brcmf_exec_dcmd(ndev, BRCMF_C_SET_SCAN_UNASSOC_TIME, 5105 err = brcmf_fil_cmd_int_set(ndev, BRCMF_C_SET_SCAN_UNASSOC_TIME,
5337 &scan_unassoc_tm_le, sizeof(scan_unassoc_tm_le)); 5106 scan_unassoc_time);
5338 if (err) { 5107 if (err) {
5339 if (err == -EOPNOTSUPP) 5108 if (err == -EOPNOTSUPP)
5340 WL_INFO("Scan unassoc time is not supported\n"); 5109 WL_INFO("Scan unassoc time is not supported\n");
@@ -5343,8 +5112,8 @@ brcmf_dongle_scantime(struct net_device *ndev, s32 scan_assoc_time,
5343 goto dongle_scantime_out; 5112 goto dongle_scantime_out;
5344 } 5113 }
5345 5114
5346 err = brcmf_exec_dcmd(ndev, BRCMF_C_SET_SCAN_PASSIVE_TIME, 5115 err = brcmf_fil_cmd_int_set(ndev, BRCMF_C_SET_SCAN_PASSIVE_TIME,
5347 &scan_passive_tm_le, sizeof(scan_passive_tm_le)); 5116 scan_passive_time);
5348 if (err) { 5117 if (err) {
5349 if (err == -EOPNOTSUPP) 5118 if (err == -EOPNOTSUPP)
5350 WL_INFO("Scan passive time is not supported\n"); 5119 WL_INFO("Scan passive time is not supported\n");
@@ -5364,8 +5133,8 @@ static s32 wl_update_wiphybands(struct brcmf_cfg80211_info *cfg)
5364 s8 phy; 5133 s8 phy;
5365 s32 err = 0; 5134 s32 err = 0;
5366 5135
5367 err = brcmf_exec_dcmd(cfg_to_ndev(cfg), BRCM_GET_PHYLIST, 5136 err = brcmf_fil_cmd_data_get(cfg_to_ndev(cfg), BRCM_GET_PHYLIST,
5368 &phy_list, sizeof(phy_list)); 5137 &phy_list, sizeof(phy_list));
5369 if (err) { 5138 if (err) {
5370 WL_ERR("error (%d)\n", err); 5139 WL_ERR("error (%d)\n", err);
5371 return err; 5140 return err;
@@ -5407,7 +5176,7 @@ static s32 brcmf_config_dongle(struct brcmf_cfg80211_info *cfg)
5407 goto default_conf_out; 5176 goto default_conf_out;
5408 5177
5409 power_mode = cfg->pwr_save ? PM_FAST : PM_OFF; 5178 power_mode = cfg->pwr_save ? PM_FAST : PM_OFF;
5410 err = brcmf_exec_dcmd_u32(ndev, BRCMF_C_SET_PM, &power_mode); 5179 err = brcmf_fil_cmd_int_set(ndev, BRCMF_C_SET_PM, power_mode);
5411 if (err) 5180 if (err)
5412 goto default_conf_out; 5181 goto default_conf_out;
5413 WL_INFO("power save set to %s\n", 5182 WL_INFO("power save set to %s\n",