]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
Merge branch 'for-4.8/core' of git://git.kernel.dk/linux-block
[karo-tx-linux.git] / drivers / net / wireless / broadcom / brcm80211 / brcmfmac / cfg80211.c
1 /*
2  * Copyright (c) 2010 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 /* Toplevel file. Relies on dhd_linux.c to send commands to the dongle. */
18
19 #include <linux/kernel.h>
20 #include <linux/etherdevice.h>
21 #include <linux/module.h>
22 #include <linux/vmalloc.h>
23 #include <net/cfg80211.h>
24 #include <net/netlink.h>
25
26 #include <brcmu_utils.h>
27 #include <defs.h>
28 #include <brcmu_wifi.h>
29 #include "core.h"
30 #include "debug.h"
31 #include "tracepoint.h"
32 #include "fwil_types.h"
33 #include "p2p.h"
34 #include "btcoex.h"
35 #include "cfg80211.h"
36 #include "feature.h"
37 #include "fwil.h"
38 #include "proto.h"
39 #include "vendor.h"
40 #include "bus.h"
41 #include "common.h"
42
43 #define BRCMF_SCAN_IE_LEN_MAX           2048
44 #define BRCMF_PNO_VERSION               2
45 #define BRCMF_PNO_TIME                  30
46 #define BRCMF_PNO_REPEAT                4
47 #define BRCMF_PNO_FREQ_EXPO_MAX         3
48 #define BRCMF_PNO_MAX_PFN_COUNT         16
49 #define BRCMF_PNO_ENABLE_ADAPTSCAN_BIT  6
50 #define BRCMF_PNO_HIDDEN_BIT            2
51 #define BRCMF_PNO_WPA_AUTH_ANY          0xFFFFFFFF
52 #define BRCMF_PNO_SCAN_COMPLETE         1
53 #define BRCMF_PNO_SCAN_INCOMPLETE       0
54
55 #define WPA_OUI                         "\x00\x50\xF2"  /* WPA OUI */
56 #define WPA_OUI_TYPE                    1
57 #define RSN_OUI                         "\x00\x0F\xAC"  /* RSN OUI */
58 #define WME_OUI_TYPE                    2
59 #define WPS_OUI_TYPE                    4
60
61 #define VS_IE_FIXED_HDR_LEN             6
62 #define WPA_IE_VERSION_LEN              2
63 #define WPA_IE_MIN_OUI_LEN              4
64 #define WPA_IE_SUITE_COUNT_LEN          2
65
66 #define WPA_CIPHER_NONE                 0       /* None */
67 #define WPA_CIPHER_WEP_40               1       /* WEP (40-bit) */
68 #define WPA_CIPHER_TKIP                 2       /* TKIP: default for WPA */
69 #define WPA_CIPHER_AES_CCM              4       /* AES (CCM) */
70 #define WPA_CIPHER_WEP_104              5       /* WEP (104-bit) */
71
72 #define RSN_AKM_NONE                    0       /* None (IBSS) */
73 #define RSN_AKM_UNSPECIFIED             1       /* Over 802.1x */
74 #define RSN_AKM_PSK                     2       /* Pre-shared Key */
75 #define RSN_AKM_SHA256_1X               5       /* SHA256, 802.1X */
76 #define RSN_AKM_SHA256_PSK              6       /* SHA256, Pre-shared Key */
77 #define RSN_CAP_LEN                     2       /* Length of RSN capabilities */
78 #define RSN_CAP_PTK_REPLAY_CNTR_MASK    (BIT(2) | BIT(3))
79 #define RSN_CAP_MFPR_MASK               BIT(6)
80 #define RSN_CAP_MFPC_MASK               BIT(7)
81 #define RSN_PMKID_COUNT_LEN             2
82
83 #define VNDR_IE_CMD_LEN                 4       /* length of the set command
84                                                  * string :"add", "del" (+ NUL)
85                                                  */
86 #define VNDR_IE_COUNT_OFFSET            4
87 #define VNDR_IE_PKTFLAG_OFFSET          8
88 #define VNDR_IE_VSIE_OFFSET             12
89 #define VNDR_IE_HDR_SIZE                12
90 #define VNDR_IE_PARSE_LIMIT             5
91
92 #define DOT11_MGMT_HDR_LEN              24      /* d11 management header len */
93 #define DOT11_BCN_PRB_FIXED_LEN         12      /* beacon/probe fixed length */
94
95 #define BRCMF_SCAN_JOIN_ACTIVE_DWELL_TIME_MS    320
96 #define BRCMF_SCAN_JOIN_PASSIVE_DWELL_TIME_MS   400
97 #define BRCMF_SCAN_JOIN_PROBE_INTERVAL_MS       20
98
99 #define BRCMF_SCAN_CHANNEL_TIME         40
100 #define BRCMF_SCAN_UNASSOC_TIME         40
101 #define BRCMF_SCAN_PASSIVE_TIME         120
102
103 #define BRCMF_ND_INFO_TIMEOUT           msecs_to_jiffies(2000)
104
105 #define BRCMF_ASSOC_PARAMS_FIXED_SIZE \
106         (sizeof(struct brcmf_assoc_params_le) - sizeof(u16))
107
108 static bool check_vif_up(struct brcmf_cfg80211_vif *vif)
109 {
110         if (!test_bit(BRCMF_VIF_STATUS_READY, &vif->sme_state)) {
111                 brcmf_dbg(INFO, "device is not ready : status (%lu)\n",
112                           vif->sme_state);
113                 return false;
114         }
115         return true;
116 }
117
118 #define RATE_TO_BASE100KBPS(rate)   (((rate) * 10) / 2)
119 #define RATETAB_ENT(_rateid, _flags) \
120         {                                                               \
121                 .bitrate        = RATE_TO_BASE100KBPS(_rateid),     \
122                 .hw_value       = (_rateid),                            \
123                 .flags          = (_flags),                             \
124         }
125
126 static struct ieee80211_rate __wl_rates[] = {
127         RATETAB_ENT(BRCM_RATE_1M, 0),
128         RATETAB_ENT(BRCM_RATE_2M, IEEE80211_RATE_SHORT_PREAMBLE),
129         RATETAB_ENT(BRCM_RATE_5M5, IEEE80211_RATE_SHORT_PREAMBLE),
130         RATETAB_ENT(BRCM_RATE_11M, IEEE80211_RATE_SHORT_PREAMBLE),
131         RATETAB_ENT(BRCM_RATE_6M, 0),
132         RATETAB_ENT(BRCM_RATE_9M, 0),
133         RATETAB_ENT(BRCM_RATE_12M, 0),
134         RATETAB_ENT(BRCM_RATE_18M, 0),
135         RATETAB_ENT(BRCM_RATE_24M, 0),
136         RATETAB_ENT(BRCM_RATE_36M, 0),
137         RATETAB_ENT(BRCM_RATE_48M, 0),
138         RATETAB_ENT(BRCM_RATE_54M, 0),
139 };
140
141 #define wl_g_rates              (__wl_rates + 0)
142 #define wl_g_rates_size         ARRAY_SIZE(__wl_rates)
143 #define wl_a_rates              (__wl_rates + 4)
144 #define wl_a_rates_size         (wl_g_rates_size - 4)
145
146 #define CHAN2G(_channel, _freq) {                               \
147         .band                   = NL80211_BAND_2GHZ,            \
148         .center_freq            = (_freq),                      \
149         .hw_value               = (_channel),                   \
150         .flags                  = IEEE80211_CHAN_DISABLED,      \
151         .max_antenna_gain       = 0,                            \
152         .max_power              = 30,                           \
153 }
154
155 #define CHAN5G(_channel) {                                      \
156         .band                   = NL80211_BAND_5GHZ,            \
157         .center_freq            = 5000 + (5 * (_channel)),      \
158         .hw_value               = (_channel),                   \
159         .flags                  = IEEE80211_CHAN_DISABLED,      \
160         .max_antenna_gain       = 0,                            \
161         .max_power              = 30,                           \
162 }
163
164 static struct ieee80211_channel __wl_2ghz_channels[] = {
165         CHAN2G(1, 2412), CHAN2G(2, 2417), CHAN2G(3, 2422), CHAN2G(4, 2427),
166         CHAN2G(5, 2432), CHAN2G(6, 2437), CHAN2G(7, 2442), CHAN2G(8, 2447),
167         CHAN2G(9, 2452), CHAN2G(10, 2457), CHAN2G(11, 2462), CHAN2G(12, 2467),
168         CHAN2G(13, 2472), CHAN2G(14, 2484)
169 };
170
171 static struct ieee80211_channel __wl_5ghz_channels[] = {
172         CHAN5G(34), CHAN5G(36), CHAN5G(38), CHAN5G(40), CHAN5G(42),
173         CHAN5G(44), CHAN5G(46), CHAN5G(48), CHAN5G(52), CHAN5G(56),
174         CHAN5G(60), CHAN5G(64), CHAN5G(100), CHAN5G(104), CHAN5G(108),
175         CHAN5G(112), CHAN5G(116), CHAN5G(120), CHAN5G(124), CHAN5G(128),
176         CHAN5G(132), CHAN5G(136), CHAN5G(140), CHAN5G(144), CHAN5G(149),
177         CHAN5G(153), CHAN5G(157), CHAN5G(161), CHAN5G(165)
178 };
179
180 /* Band templates duplicated per wiphy. The channel info
181  * above is added to the band during setup.
182  */
183 static const struct ieee80211_supported_band __wl_band_2ghz = {
184         .band = NL80211_BAND_2GHZ,
185         .bitrates = wl_g_rates,
186         .n_bitrates = wl_g_rates_size,
187 };
188
189 static const struct ieee80211_supported_band __wl_band_5ghz = {
190         .band = NL80211_BAND_5GHZ,
191         .bitrates = wl_a_rates,
192         .n_bitrates = wl_a_rates_size,
193 };
194
195 /* This is to override regulatory domains defined in cfg80211 module (reg.c)
196  * By default world regulatory domain defined in reg.c puts the flags
197  * NL80211_RRF_NO_IR for 5GHz channels (for * 36..48 and 149..165).
198  * With respect to these flags, wpa_supplicant doesn't * start p2p
199  * operations on 5GHz channels. All the changes in world regulatory
200  * domain are to be done here.
201  */
202 static const struct ieee80211_regdomain brcmf_regdom = {
203         .n_reg_rules = 4,
204         .alpha2 =  "99",
205         .reg_rules = {
206                 /* IEEE 802.11b/g, channels 1..11 */
207                 REG_RULE(2412-10, 2472+10, 40, 6, 20, 0),
208                 /* If any */
209                 /* IEEE 802.11 channel 14 - Only JP enables
210                  * this and for 802.11b only
211                  */
212                 REG_RULE(2484-10, 2484+10, 20, 6, 20, 0),
213                 /* IEEE 802.11a, channel 36..64 */
214                 REG_RULE(5150-10, 5350+10, 80, 6, 20, 0),
215                 /* IEEE 802.11a, channel 100..165 */
216                 REG_RULE(5470-10, 5850+10, 80, 6, 20, 0), }
217 };
218
219 /* Note: brcmf_cipher_suites is an array of int defining which cipher suites
220  * are supported. A pointer to this array and the number of entries is passed
221  * on to upper layers. AES_CMAC defines whether or not the driver supports MFP.
222  * So the cipher suite AES_CMAC has to be the last one in the array, and when
223  * device does not support MFP then the number of suites will be decreased by 1
224  */
225 static const u32 brcmf_cipher_suites[] = {
226         WLAN_CIPHER_SUITE_WEP40,
227         WLAN_CIPHER_SUITE_WEP104,
228         WLAN_CIPHER_SUITE_TKIP,
229         WLAN_CIPHER_SUITE_CCMP,
230         /* Keep as last entry: */
231         WLAN_CIPHER_SUITE_AES_CMAC
232 };
233
234 /* Vendor specific ie. id = 221, oui and type defines exact ie */
235 struct brcmf_vs_tlv {
236         u8 id;
237         u8 len;
238         u8 oui[3];
239         u8 oui_type;
240 };
241
242 struct parsed_vndr_ie_info {
243         u8 *ie_ptr;
244         u32 ie_len;     /* total length including id & length field */
245         struct brcmf_vs_tlv vndrie;
246 };
247
248 struct parsed_vndr_ies {
249         u32 count;
250         struct parsed_vndr_ie_info ie_info[VNDR_IE_PARSE_LIMIT];
251 };
252
253 static u8 nl80211_band_to_fwil(enum nl80211_band band)
254 {
255         switch (band) {
256         case NL80211_BAND_2GHZ:
257                 return WLC_BAND_2G;
258         case NL80211_BAND_5GHZ:
259                 return WLC_BAND_5G;
260         default:
261                 WARN_ON(1);
262                 break;
263         }
264         return 0;
265 }
266
267 static u16 chandef_to_chanspec(struct brcmu_d11inf *d11inf,
268                                struct cfg80211_chan_def *ch)
269 {
270         struct brcmu_chan ch_inf;
271         s32 primary_offset;
272
273         brcmf_dbg(TRACE, "chandef: control %d center %d width %d\n",
274                   ch->chan->center_freq, ch->center_freq1, ch->width);
275         ch_inf.chnum = ieee80211_frequency_to_channel(ch->center_freq1);
276         primary_offset = ch->chan->center_freq - ch->center_freq1;
277         switch (ch->width) {
278         case NL80211_CHAN_WIDTH_20:
279         case NL80211_CHAN_WIDTH_20_NOHT:
280                 ch_inf.bw = BRCMU_CHAN_BW_20;
281                 WARN_ON(primary_offset != 0);
282                 break;
283         case NL80211_CHAN_WIDTH_40:
284                 ch_inf.bw = BRCMU_CHAN_BW_40;
285                 if (primary_offset > 0)
286                         ch_inf.sb = BRCMU_CHAN_SB_U;
287                 else
288                         ch_inf.sb = BRCMU_CHAN_SB_L;
289                 break;
290         case NL80211_CHAN_WIDTH_80:
291                 ch_inf.bw = BRCMU_CHAN_BW_80;
292                 if (primary_offset == -30)
293                         ch_inf.sb = BRCMU_CHAN_SB_LL;
294                 else if (primary_offset == -10)
295                         ch_inf.sb = BRCMU_CHAN_SB_LU;
296                 else if (primary_offset == 10)
297                         ch_inf.sb = BRCMU_CHAN_SB_UL;
298                 else
299                         ch_inf.sb = BRCMU_CHAN_SB_UU;
300                 break;
301         case NL80211_CHAN_WIDTH_80P80:
302         case NL80211_CHAN_WIDTH_160:
303         case NL80211_CHAN_WIDTH_5:
304         case NL80211_CHAN_WIDTH_10:
305         default:
306                 WARN_ON_ONCE(1);
307         }
308         switch (ch->chan->band) {
309         case NL80211_BAND_2GHZ:
310                 ch_inf.band = BRCMU_CHAN_BAND_2G;
311                 break;
312         case NL80211_BAND_5GHZ:
313                 ch_inf.band = BRCMU_CHAN_BAND_5G;
314                 break;
315         case NL80211_BAND_60GHZ:
316         default:
317                 WARN_ON_ONCE(1);
318         }
319         d11inf->encchspec(&ch_inf);
320
321         return ch_inf.chspec;
322 }
323
324 u16 channel_to_chanspec(struct brcmu_d11inf *d11inf,
325                         struct ieee80211_channel *ch)
326 {
327         struct brcmu_chan ch_inf;
328
329         ch_inf.chnum = ieee80211_frequency_to_channel(ch->center_freq);
330         ch_inf.bw = BRCMU_CHAN_BW_20;
331         d11inf->encchspec(&ch_inf);
332
333         return ch_inf.chspec;
334 }
335
336 /* Traverse a string of 1-byte tag/1-byte length/variable-length value
337  * triples, returning a pointer to the substring whose first element
338  * matches tag
339  */
340 const struct brcmf_tlv *
341 brcmf_parse_tlvs(const void *buf, int buflen, uint key)
342 {
343         const struct brcmf_tlv *elt = buf;
344         int totlen = buflen;
345
346         /* find tagged parameter */
347         while (totlen >= TLV_HDR_LEN) {
348                 int len = elt->len;
349
350                 /* validate remaining totlen */
351                 if ((elt->id == key) && (totlen >= (len + TLV_HDR_LEN)))
352                         return elt;
353
354                 elt = (struct brcmf_tlv *)((u8 *)elt + (len + TLV_HDR_LEN));
355                 totlen -= (len + TLV_HDR_LEN);
356         }
357
358         return NULL;
359 }
360
361 /* Is any of the tlvs the expected entry? If
362  * not update the tlvs buffer pointer/length.
363  */
364 static bool
365 brcmf_tlv_has_ie(const u8 *ie, const u8 **tlvs, u32 *tlvs_len,
366                  const u8 *oui, u32 oui_len, u8 type)
367 {
368         /* If the contents match the OUI and the type */
369         if (ie[TLV_LEN_OFF] >= oui_len + 1 &&
370             !memcmp(&ie[TLV_BODY_OFF], oui, oui_len) &&
371             type == ie[TLV_BODY_OFF + oui_len]) {
372                 return true;
373         }
374
375         if (tlvs == NULL)
376                 return false;
377         /* point to the next ie */
378         ie += ie[TLV_LEN_OFF] + TLV_HDR_LEN;
379         /* calculate the length of the rest of the buffer */
380         *tlvs_len -= (int)(ie - *tlvs);
381         /* update the pointer to the start of the buffer */
382         *tlvs = ie;
383
384         return false;
385 }
386
387 static struct brcmf_vs_tlv *
388 brcmf_find_wpaie(const u8 *parse, u32 len)
389 {
390         const struct brcmf_tlv *ie;
391
392         while ((ie = brcmf_parse_tlvs(parse, len, WLAN_EID_VENDOR_SPECIFIC))) {
393                 if (brcmf_tlv_has_ie((const u8 *)ie, &parse, &len,
394                                      WPA_OUI, TLV_OUI_LEN, WPA_OUI_TYPE))
395                         return (struct brcmf_vs_tlv *)ie;
396         }
397         return NULL;
398 }
399
400 static struct brcmf_vs_tlv *
401 brcmf_find_wpsie(const u8 *parse, u32 len)
402 {
403         const struct brcmf_tlv *ie;
404
405         while ((ie = brcmf_parse_tlvs(parse, len, WLAN_EID_VENDOR_SPECIFIC))) {
406                 if (brcmf_tlv_has_ie((u8 *)ie, &parse, &len,
407                                      WPA_OUI, TLV_OUI_LEN, WPS_OUI_TYPE))
408                         return (struct brcmf_vs_tlv *)ie;
409         }
410         return NULL;
411 }
412
413 static int brcmf_vif_change_validate(struct brcmf_cfg80211_info *cfg,
414                                      struct brcmf_cfg80211_vif *vif,
415                                      enum nl80211_iftype new_type)
416 {
417         int iftype_num[NUM_NL80211_IFTYPES];
418         struct brcmf_cfg80211_vif *pos;
419         bool check_combos = false;
420         int ret = 0;
421
422         memset(&iftype_num[0], 0, sizeof(iftype_num));
423         list_for_each_entry(pos, &cfg->vif_list, list)
424                 if (pos == vif) {
425                         iftype_num[new_type]++;
426                 } else {
427                         /* concurrent interfaces so need check combinations */
428                         check_combos = true;
429                         iftype_num[pos->wdev.iftype]++;
430                 }
431
432         if (check_combos)
433                 ret = cfg80211_check_combinations(cfg->wiphy, 1, 0, iftype_num);
434
435         return ret;
436 }
437
438 static int brcmf_vif_add_validate(struct brcmf_cfg80211_info *cfg,
439                                   enum nl80211_iftype new_type)
440 {
441         int iftype_num[NUM_NL80211_IFTYPES];
442         struct brcmf_cfg80211_vif *pos;
443
444         memset(&iftype_num[0], 0, sizeof(iftype_num));
445         list_for_each_entry(pos, &cfg->vif_list, list)
446                 iftype_num[pos->wdev.iftype]++;
447
448         iftype_num[new_type]++;
449         return cfg80211_check_combinations(cfg->wiphy, 1, 0, iftype_num);
450 }
451
452 static void convert_key_from_CPU(struct brcmf_wsec_key *key,
453                                  struct brcmf_wsec_key_le *key_le)
454 {
455         key_le->index = cpu_to_le32(key->index);
456         key_le->len = cpu_to_le32(key->len);
457         key_le->algo = cpu_to_le32(key->algo);
458         key_le->flags = cpu_to_le32(key->flags);
459         key_le->rxiv.hi = cpu_to_le32(key->rxiv.hi);
460         key_le->rxiv.lo = cpu_to_le16(key->rxiv.lo);
461         key_le->iv_initialized = cpu_to_le32(key->iv_initialized);
462         memcpy(key_le->data, key->data, sizeof(key->data));
463         memcpy(key_le->ea, key->ea, sizeof(key->ea));
464 }
465
466 static int
467 send_key_to_dongle(struct brcmf_if *ifp, struct brcmf_wsec_key *key)
468 {
469         int err;
470         struct brcmf_wsec_key_le key_le;
471
472         convert_key_from_CPU(key, &key_le);
473
474         brcmf_netdev_wait_pend8021x(ifp);
475
476         err = brcmf_fil_bsscfg_data_set(ifp, "wsec_key", &key_le,
477                                         sizeof(key_le));
478
479         if (err)
480                 brcmf_err("wsec_key error (%d)\n", err);
481         return err;
482 }
483
484 static s32
485 brcmf_configure_arp_nd_offload(struct brcmf_if *ifp, bool enable)
486 {
487         s32 err;
488         u32 mode;
489
490         if (enable)
491                 mode = BRCMF_ARP_OL_AGENT | BRCMF_ARP_OL_PEER_AUTO_REPLY;
492         else
493                 mode = 0;
494
495         /* Try to set and enable ARP offload feature, this may fail, then it  */
496         /* is simply not supported and err 0 will be returned                 */
497         err = brcmf_fil_iovar_int_set(ifp, "arp_ol", mode);
498         if (err) {
499                 brcmf_dbg(TRACE, "failed to set ARP offload mode to 0x%x, err = %d\n",
500                           mode, err);
501                 err = 0;
502         } else {
503                 err = brcmf_fil_iovar_int_set(ifp, "arpoe", enable);
504                 if (err) {
505                         brcmf_dbg(TRACE, "failed to configure (%d) ARP offload err = %d\n",
506                                   enable, err);
507                         err = 0;
508                 } else
509                         brcmf_dbg(TRACE, "successfully configured (%d) ARP offload to 0x%x\n",
510                                   enable, mode);
511         }
512
513         err = brcmf_fil_iovar_int_set(ifp, "ndoe", enable);
514         if (err) {
515                 brcmf_dbg(TRACE, "failed to configure (%d) ND offload err = %d\n",
516                           enable, err);
517                 err = 0;
518         } else
519                 brcmf_dbg(TRACE, "successfully configured (%d) ND offload to 0x%x\n",
520                           enable, mode);
521
522         return err;
523 }
524
525 static void
526 brcmf_cfg80211_update_proto_addr_mode(struct wireless_dev *wdev)
527 {
528         struct brcmf_cfg80211_vif *vif;
529         struct brcmf_if *ifp;
530
531         vif = container_of(wdev, struct brcmf_cfg80211_vif, wdev);
532         ifp = vif->ifp;
533
534         if ((wdev->iftype == NL80211_IFTYPE_ADHOC) ||
535             (wdev->iftype == NL80211_IFTYPE_AP) ||
536             (wdev->iftype == NL80211_IFTYPE_P2P_GO))
537                 brcmf_proto_configure_addr_mode(ifp->drvr, ifp->ifidx,
538                                                 ADDR_DIRECT);
539         else
540                 brcmf_proto_configure_addr_mode(ifp->drvr, ifp->ifidx,
541                                                 ADDR_INDIRECT);
542 }
543
544 static int brcmf_cfg80211_request_ap_if(struct brcmf_if *ifp)
545 {
546         struct brcmf_mbss_ssid_le mbss_ssid_le;
547         int bsscfgidx;
548         int err;
549
550         memset(&mbss_ssid_le, 0, sizeof(mbss_ssid_le));
551         bsscfgidx = brcmf_get_next_free_bsscfgidx(ifp->drvr);
552         if (bsscfgidx < 0)
553                 return bsscfgidx;
554
555         mbss_ssid_le.bsscfgidx = cpu_to_le32(bsscfgidx);
556         mbss_ssid_le.SSID_len = cpu_to_le32(5);
557         sprintf(mbss_ssid_le.SSID, "ssid%d" , bsscfgidx);
558
559         err = brcmf_fil_bsscfg_data_set(ifp, "bsscfg:ssid", &mbss_ssid_le,
560                                         sizeof(mbss_ssid_le));
561         if (err < 0)
562                 brcmf_err("setting ssid failed %d\n", err);
563
564         return err;
565 }
566
567 /**
568  * brcmf_ap_add_vif() - create a new AP virtual interface for multiple BSS
569  *
570  * @wiphy: wiphy device of new interface.
571  * @name: name of the new interface.
572  * @flags: not used.
573  * @params: contains mac address for AP device.
574  */
575 static
576 struct wireless_dev *brcmf_ap_add_vif(struct wiphy *wiphy, const char *name,
577                                       u32 *flags, struct vif_params *params)
578 {
579         struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
580         struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg));
581         struct brcmf_cfg80211_vif *vif;
582         int err;
583
584         if (brcmf_cfg80211_vif_event_armed(cfg))
585                 return ERR_PTR(-EBUSY);
586
587         brcmf_dbg(INFO, "Adding vif \"%s\"\n", name);
588
589         vif = brcmf_alloc_vif(cfg, NL80211_IFTYPE_AP, false);
590         if (IS_ERR(vif))
591                 return (struct wireless_dev *)vif;
592
593         brcmf_cfg80211_arm_vif_event(cfg, vif);
594
595         err = brcmf_cfg80211_request_ap_if(ifp);
596         if (err) {
597                 brcmf_cfg80211_arm_vif_event(cfg, NULL);
598                 goto fail;
599         }
600
601         /* wait for firmware event */
602         err = brcmf_cfg80211_wait_vif_event(cfg, BRCMF_E_IF_ADD,
603                                             BRCMF_VIF_EVENT_TIMEOUT);
604         brcmf_cfg80211_arm_vif_event(cfg, NULL);
605         if (!err) {
606                 brcmf_err("timeout occurred\n");
607                 err = -EIO;
608                 goto fail;
609         }
610
611         /* interface created in firmware */
612         ifp = vif->ifp;
613         if (!ifp) {
614                 brcmf_err("no if pointer provided\n");
615                 err = -ENOENT;
616                 goto fail;
617         }
618
619         strncpy(ifp->ndev->name, name, sizeof(ifp->ndev->name) - 1);
620         err = brcmf_net_attach(ifp, true);
621         if (err) {
622                 brcmf_err("Registering netdevice failed\n");
623                 goto fail;
624         }
625
626         return &ifp->vif->wdev;
627
628 fail:
629         brcmf_free_vif(vif);
630         return ERR_PTR(err);
631 }
632
633 static bool brcmf_is_apmode(struct brcmf_cfg80211_vif *vif)
634 {
635         enum nl80211_iftype iftype;
636
637         iftype = vif->wdev.iftype;
638         return iftype == NL80211_IFTYPE_AP || iftype == NL80211_IFTYPE_P2P_GO;
639 }
640
641 static bool brcmf_is_ibssmode(struct brcmf_cfg80211_vif *vif)
642 {
643         return vif->wdev.iftype == NL80211_IFTYPE_ADHOC;
644 }
645
646 static struct wireless_dev *brcmf_cfg80211_add_iface(struct wiphy *wiphy,
647                                                      const char *name,
648                                                      unsigned char name_assign_type,
649                                                      enum nl80211_iftype type,
650                                                      u32 *flags,
651                                                      struct vif_params *params)
652 {
653         struct wireless_dev *wdev;
654         int err;
655
656         brcmf_dbg(TRACE, "enter: %s type %d\n", name, type);
657         err = brcmf_vif_add_validate(wiphy_to_cfg(wiphy), type);
658         if (err) {
659                 brcmf_err("iface validation failed: err=%d\n", err);
660                 return ERR_PTR(err);
661         }
662         switch (type) {
663         case NL80211_IFTYPE_ADHOC:
664         case NL80211_IFTYPE_STATION:
665         case NL80211_IFTYPE_AP_VLAN:
666         case NL80211_IFTYPE_WDS:
667         case NL80211_IFTYPE_MONITOR:
668         case NL80211_IFTYPE_MESH_POINT:
669                 return ERR_PTR(-EOPNOTSUPP);
670         case NL80211_IFTYPE_AP:
671                 wdev = brcmf_ap_add_vif(wiphy, name, flags, params);
672                 if (!IS_ERR(wdev))
673                         brcmf_cfg80211_update_proto_addr_mode(wdev);
674                 return wdev;
675         case NL80211_IFTYPE_P2P_CLIENT:
676         case NL80211_IFTYPE_P2P_GO:
677         case NL80211_IFTYPE_P2P_DEVICE:
678                 wdev = brcmf_p2p_add_vif(wiphy, name, name_assign_type, type, flags, params);
679                 if (!IS_ERR(wdev))
680                         brcmf_cfg80211_update_proto_addr_mode(wdev);
681                 return wdev;
682         case NL80211_IFTYPE_UNSPECIFIED:
683         default:
684                 return ERR_PTR(-EINVAL);
685         }
686 }
687
688 static void brcmf_scan_config_mpc(struct brcmf_if *ifp, int mpc)
689 {
690         if (brcmf_feat_is_quirk_enabled(ifp, BRCMF_FEAT_QUIRK_NEED_MPC))
691                 brcmf_set_mpc(ifp, mpc);
692 }
693
694 void brcmf_set_mpc(struct brcmf_if *ifp, int mpc)
695 {
696         s32 err = 0;
697
698         if (check_vif_up(ifp->vif)) {
699                 err = brcmf_fil_iovar_int_set(ifp, "mpc", mpc);
700                 if (err) {
701                         brcmf_err("fail to set mpc\n");
702                         return;
703                 }
704                 brcmf_dbg(INFO, "MPC : %d\n", mpc);
705         }
706 }
707
708 s32 brcmf_notify_escan_complete(struct brcmf_cfg80211_info *cfg,
709                                 struct brcmf_if *ifp, bool aborted,
710                                 bool fw_abort)
711 {
712         struct brcmf_scan_params_le params_le;
713         struct cfg80211_scan_request *scan_request;
714         s32 err = 0;
715
716         brcmf_dbg(SCAN, "Enter\n");
717
718         /* clear scan request, because the FW abort can cause a second call */
719         /* to this functon and might cause a double cfg80211_scan_done      */
720         scan_request = cfg->scan_request;
721         cfg->scan_request = NULL;
722
723         if (timer_pending(&cfg->escan_timeout))
724                 del_timer_sync(&cfg->escan_timeout);
725
726         if (fw_abort) {
727                 /* Do a scan abort to stop the driver's scan engine */
728                 brcmf_dbg(SCAN, "ABORT scan in firmware\n");
729                 memset(&params_le, 0, sizeof(params_le));
730                 eth_broadcast_addr(params_le.bssid);
731                 params_le.bss_type = DOT11_BSSTYPE_ANY;
732                 params_le.scan_type = 0;
733                 params_le.channel_num = cpu_to_le32(1);
734                 params_le.nprobes = cpu_to_le32(1);
735                 params_le.active_time = cpu_to_le32(-1);
736                 params_le.passive_time = cpu_to_le32(-1);
737                 params_le.home_time = cpu_to_le32(-1);
738                 /* Scan is aborted by setting channel_list[0] to -1 */
739                 params_le.channel_list[0] = cpu_to_le16(-1);
740                 /* E-Scan (or anyother type) can be aborted by SCAN */
741                 err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SCAN,
742                                              &params_le, sizeof(params_le));
743                 if (err)
744                         brcmf_err("Scan abort  failed\n");
745         }
746
747         brcmf_scan_config_mpc(ifp, 1);
748
749         /*
750          * e-scan can be initiated by scheduled scan
751          * which takes precedence.
752          */
753         if (cfg->sched_escan) {
754                 brcmf_dbg(SCAN, "scheduled scan completed\n");
755                 cfg->sched_escan = false;
756                 if (!aborted)
757                         cfg80211_sched_scan_results(cfg_to_wiphy(cfg));
758         } else if (scan_request) {
759                 brcmf_dbg(SCAN, "ESCAN Completed scan: %s\n",
760                           aborted ? "Aborted" : "Done");
761                 cfg80211_scan_done(scan_request, aborted);
762         }
763         if (!test_and_clear_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status))
764                 brcmf_dbg(SCAN, "Scan complete, probably P2P scan\n");
765
766         return err;
767 }
768
769 static
770 int brcmf_cfg80211_del_iface(struct wiphy *wiphy, struct wireless_dev *wdev)
771 {
772         struct brcmf_cfg80211_info *cfg = wiphy_priv(wiphy);
773         struct net_device *ndev = wdev->netdev;
774
775         /* vif event pending in firmware */
776         if (brcmf_cfg80211_vif_event_armed(cfg))
777                 return -EBUSY;
778
779         if (ndev) {
780                 if (test_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status) &&
781                     cfg->escan_info.ifp == netdev_priv(ndev))
782                         brcmf_notify_escan_complete(cfg, netdev_priv(ndev),
783                                                     true, true);
784
785                 brcmf_fil_iovar_int_set(netdev_priv(ndev), "mpc", 1);
786         }
787
788         switch (wdev->iftype) {
789         case NL80211_IFTYPE_ADHOC:
790         case NL80211_IFTYPE_STATION:
791         case NL80211_IFTYPE_AP:
792         case NL80211_IFTYPE_AP_VLAN:
793         case NL80211_IFTYPE_WDS:
794         case NL80211_IFTYPE_MONITOR:
795         case NL80211_IFTYPE_MESH_POINT:
796                 return -EOPNOTSUPP;
797         case NL80211_IFTYPE_P2P_CLIENT:
798         case NL80211_IFTYPE_P2P_GO:
799         case NL80211_IFTYPE_P2P_DEVICE:
800                 return brcmf_p2p_del_vif(wiphy, wdev);
801         case NL80211_IFTYPE_UNSPECIFIED:
802         default:
803                 return -EINVAL;
804         }
805         return -EOPNOTSUPP;
806 }
807
808 static s32
809 brcmf_cfg80211_change_iface(struct wiphy *wiphy, struct net_device *ndev,
810                          enum nl80211_iftype type, u32 *flags,
811                          struct vif_params *params)
812 {
813         struct brcmf_cfg80211_info *cfg = wiphy_priv(wiphy);
814         struct brcmf_if *ifp = netdev_priv(ndev);
815         struct brcmf_cfg80211_vif *vif = ifp->vif;
816         s32 infra = 0;
817         s32 ap = 0;
818         s32 err = 0;
819
820         brcmf_dbg(TRACE, "Enter, bsscfgidx=%d, type=%d\n", ifp->bsscfgidx,
821                   type);
822
823         /* WAR: There are a number of p2p interface related problems which
824          * need to be handled initially (before doing the validate).
825          * wpa_supplicant tends to do iface changes on p2p device/client/go
826          * which are not always possible/allowed. However we need to return
827          * OK otherwise the wpa_supplicant wont start. The situation differs
828          * on configuration and setup (p2pon=1 module param). The first check
829          * is to see if the request is a change to station for p2p iface.
830          */
831         if ((type == NL80211_IFTYPE_STATION) &&
832             ((vif->wdev.iftype == NL80211_IFTYPE_P2P_CLIENT) ||
833              (vif->wdev.iftype == NL80211_IFTYPE_P2P_GO) ||
834              (vif->wdev.iftype == NL80211_IFTYPE_P2P_DEVICE))) {
835                 brcmf_dbg(TRACE, "Ignoring cmd for p2p if\n");
836                 /* Now depending on whether module param p2pon=1 was used the
837                  * response needs to be either 0 or EOPNOTSUPP. The reason is
838                  * that if p2pon=1 is used, but a newer supplicant is used then
839                  * we should return an error, as this combination wont work.
840                  * In other situations 0 is returned and supplicant will start
841                  * normally. It will give a trace in cfg80211, but it is the
842                  * only way to get it working. Unfortunately this will result
843                  * in situation where we wont support new supplicant in
844                  * combination with module param p2pon=1, but that is the way
845                  * it is. If the user tries this then unloading of driver might
846                  * fail/lock.
847                  */
848                 if (cfg->p2p.p2pdev_dynamically)
849                         return -EOPNOTSUPP;
850                 else
851                         return 0;
852         }
853         err = brcmf_vif_change_validate(wiphy_to_cfg(wiphy), vif, type);
854         if (err) {
855                 brcmf_err("iface validation failed: err=%d\n", err);
856                 return err;
857         }
858         switch (type) {
859         case NL80211_IFTYPE_MONITOR:
860         case NL80211_IFTYPE_WDS:
861                 brcmf_err("type (%d) : currently we do not support this type\n",
862                           type);
863                 return -EOPNOTSUPP;
864         case NL80211_IFTYPE_ADHOC:
865                 infra = 0;
866                 break;
867         case NL80211_IFTYPE_STATION:
868                 infra = 1;
869                 break;
870         case NL80211_IFTYPE_AP:
871         case NL80211_IFTYPE_P2P_GO:
872                 ap = 1;
873                 break;
874         default:
875                 err = -EINVAL;
876                 goto done;
877         }
878
879         if (ap) {
880                 if (type == NL80211_IFTYPE_P2P_GO) {
881                         brcmf_dbg(INFO, "IF Type = P2P GO\n");
882                         err = brcmf_p2p_ifchange(cfg, BRCMF_FIL_P2P_IF_GO);
883                 }
884                 if (!err) {
885                         brcmf_dbg(INFO, "IF Type = AP\n");
886                 }
887         } else {
888                 err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_INFRA, infra);
889                 if (err) {
890                         brcmf_err("WLC_SET_INFRA error (%d)\n", err);
891                         err = -EAGAIN;
892                         goto done;
893                 }
894                 brcmf_dbg(INFO, "IF Type = %s\n", brcmf_is_ibssmode(vif) ?
895                           "Adhoc" : "Infra");
896         }
897         ndev->ieee80211_ptr->iftype = type;
898
899         brcmf_cfg80211_update_proto_addr_mode(&vif->wdev);
900
901 done:
902         brcmf_dbg(TRACE, "Exit\n");
903
904         return err;
905 }
906
907 static void brcmf_escan_prep(struct brcmf_cfg80211_info *cfg,
908                              struct brcmf_scan_params_le *params_le,
909                              struct cfg80211_scan_request *request)
910 {
911         u32 n_ssids;
912         u32 n_channels;
913         s32 i;
914         s32 offset;
915         u16 chanspec;
916         char *ptr;
917         struct brcmf_ssid_le ssid_le;
918
919         eth_broadcast_addr(params_le->bssid);
920         params_le->bss_type = DOT11_BSSTYPE_ANY;
921         params_le->scan_type = 0;
922         params_le->channel_num = 0;
923         params_le->nprobes = cpu_to_le32(-1);
924         params_le->active_time = cpu_to_le32(-1);
925         params_le->passive_time = cpu_to_le32(-1);
926         params_le->home_time = cpu_to_le32(-1);
927         memset(&params_le->ssid_le, 0, sizeof(params_le->ssid_le));
928
929         /* if request is null exit so it will be all channel broadcast scan */
930         if (!request)
931                 return;
932
933         n_ssids = request->n_ssids;
934         n_channels = request->n_channels;
935         /* Copy channel array if applicable */
936         brcmf_dbg(SCAN, "### List of channelspecs to scan ### %d\n",
937                   n_channels);
938         if (n_channels > 0) {
939                 for (i = 0; i < n_channels; i++) {
940                         chanspec = channel_to_chanspec(&cfg->d11inf,
941                                                        request->channels[i]);
942                         brcmf_dbg(SCAN, "Chan : %d, Channel spec: %x\n",
943                                   request->channels[i]->hw_value, chanspec);
944                         params_le->channel_list[i] = cpu_to_le16(chanspec);
945                 }
946         } else {
947                 brcmf_dbg(SCAN, "Scanning all channels\n");
948         }
949         /* Copy ssid array if applicable */
950         brcmf_dbg(SCAN, "### List of SSIDs to scan ### %d\n", n_ssids);
951         if (n_ssids > 0) {
952                 offset = offsetof(struct brcmf_scan_params_le, channel_list) +
953                                 n_channels * sizeof(u16);
954                 offset = roundup(offset, sizeof(u32));
955                 ptr = (char *)params_le + offset;
956                 for (i = 0; i < n_ssids; i++) {
957                         memset(&ssid_le, 0, sizeof(ssid_le));
958                         ssid_le.SSID_len =
959                                         cpu_to_le32(request->ssids[i].ssid_len);
960                         memcpy(ssid_le.SSID, request->ssids[i].ssid,
961                                request->ssids[i].ssid_len);
962                         if (!ssid_le.SSID_len)
963                                 brcmf_dbg(SCAN, "%d: Broadcast scan\n", i);
964                         else
965                                 brcmf_dbg(SCAN, "%d: scan for  %s size =%d\n",
966                                           i, ssid_le.SSID, ssid_le.SSID_len);
967                         memcpy(ptr, &ssid_le, sizeof(ssid_le));
968                         ptr += sizeof(ssid_le);
969                 }
970         } else {
971                 brcmf_dbg(SCAN, "Broadcast scan %p\n", request->ssids);
972                 if ((request->ssids) && request->ssids->ssid_len) {
973                         brcmf_dbg(SCAN, "SSID %s len=%d\n",
974                                   params_le->ssid_le.SSID,
975                                   request->ssids->ssid_len);
976                         params_le->ssid_le.SSID_len =
977                                 cpu_to_le32(request->ssids->ssid_len);
978                         memcpy(&params_le->ssid_le.SSID, request->ssids->ssid,
979                                 request->ssids->ssid_len);
980                 }
981         }
982         /* Adding mask to channel numbers */
983         params_le->channel_num =
984                 cpu_to_le32((n_ssids << BRCMF_SCAN_PARAMS_NSSID_SHIFT) |
985                         (n_channels & BRCMF_SCAN_PARAMS_COUNT_MASK));
986 }
987
988 static s32
989 brcmf_run_escan(struct brcmf_cfg80211_info *cfg, struct brcmf_if *ifp,
990                 struct cfg80211_scan_request *request)
991 {
992         s32 params_size = BRCMF_SCAN_PARAMS_FIXED_SIZE +
993                           offsetof(struct brcmf_escan_params_le, params_le);
994         struct brcmf_escan_params_le *params;
995         s32 err = 0;
996
997         brcmf_dbg(SCAN, "E-SCAN START\n");
998
999         if (request != NULL) {
1000                 /* Allocate space for populating ssids in struct */
1001                 params_size += sizeof(u32) * ((request->n_channels + 1) / 2);
1002
1003                 /* Allocate space for populating ssids in struct */
1004                 params_size += sizeof(struct brcmf_ssid_le) * request->n_ssids;
1005         }
1006
1007         params = kzalloc(params_size, GFP_KERNEL);
1008         if (!params) {
1009                 err = -ENOMEM;
1010                 goto exit;
1011         }
1012         BUG_ON(params_size + sizeof("escan") >= BRCMF_DCMD_MEDLEN);
1013         brcmf_escan_prep(cfg, &params->params_le, request);
1014         params->version = cpu_to_le32(BRCMF_ESCAN_REQ_VERSION);
1015         params->action = cpu_to_le16(WL_ESCAN_ACTION_START);
1016         params->sync_id = cpu_to_le16(0x1234);
1017
1018         err = brcmf_fil_iovar_data_set(ifp, "escan", params, params_size);
1019         if (err) {
1020                 if (err == -EBUSY)
1021                         brcmf_dbg(INFO, "system busy : escan canceled\n");
1022                 else
1023                         brcmf_err("error (%d)\n", err);
1024         }
1025
1026         kfree(params);
1027 exit:
1028         return err;
1029 }
1030
1031 static s32
1032 brcmf_do_escan(struct brcmf_cfg80211_info *cfg, struct wiphy *wiphy,
1033                struct brcmf_if *ifp, struct cfg80211_scan_request *request)
1034 {
1035         s32 err;
1036         u32 passive_scan;
1037         struct brcmf_scan_results *results;
1038         struct escan_info *escan = &cfg->escan_info;
1039
1040         brcmf_dbg(SCAN, "Enter\n");
1041         escan->ifp = ifp;
1042         escan->wiphy = wiphy;
1043         escan->escan_state = WL_ESCAN_STATE_SCANNING;
1044         passive_scan = cfg->active_scan ? 0 : 1;
1045         err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_PASSIVE_SCAN,
1046                                     passive_scan);
1047         if (err) {
1048                 brcmf_err("error (%d)\n", err);
1049                 return err;
1050         }
1051         brcmf_scan_config_mpc(ifp, 0);
1052         results = (struct brcmf_scan_results *)cfg->escan_info.escan_buf;
1053         results->version = 0;
1054         results->count = 0;
1055         results->buflen = WL_ESCAN_RESULTS_FIXED_SIZE;
1056
1057         err = escan->run(cfg, ifp, request);
1058         if (err)
1059                 brcmf_scan_config_mpc(ifp, 1);
1060         return err;
1061 }
1062
1063 static s32
1064 brcmf_cfg80211_escan(struct wiphy *wiphy, struct brcmf_cfg80211_vif *vif,
1065                      struct cfg80211_scan_request *request,
1066                      struct cfg80211_ssid *this_ssid)
1067 {
1068         struct brcmf_if *ifp = vif->ifp;
1069         struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
1070         struct cfg80211_ssid *ssids;
1071         u32 passive_scan;
1072         bool escan_req;
1073         bool spec_scan;
1074         s32 err;
1075         struct brcmf_ssid_le ssid_le;
1076         u32 SSID_len;
1077
1078         brcmf_dbg(SCAN, "START ESCAN\n");
1079
1080         if (test_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status)) {
1081                 brcmf_err("Scanning already: status (%lu)\n", cfg->scan_status);
1082                 return -EAGAIN;
1083         }
1084         if (test_bit(BRCMF_SCAN_STATUS_ABORT, &cfg->scan_status)) {
1085                 brcmf_err("Scanning being aborted: status (%lu)\n",
1086                           cfg->scan_status);
1087                 return -EAGAIN;
1088         }
1089         if (test_bit(BRCMF_SCAN_STATUS_SUPPRESS, &cfg->scan_status)) {
1090                 brcmf_err("Scanning suppressed: status (%lu)\n",
1091                           cfg->scan_status);
1092                 return -EAGAIN;
1093         }
1094         if (test_bit(BRCMF_VIF_STATUS_CONNECTING, &ifp->vif->sme_state)) {
1095                 brcmf_err("Connecting: status (%lu)\n", ifp->vif->sme_state);
1096                 return -EAGAIN;
1097         }
1098
1099         /* If scan req comes for p2p0, send it over primary I/F */
1100         if (vif == cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE].vif)
1101                 vif = cfg->p2p.bss_idx[P2PAPI_BSSCFG_PRIMARY].vif;
1102
1103         escan_req = false;
1104         if (request) {
1105                 /* scan bss */
1106                 ssids = request->ssids;
1107                 escan_req = true;
1108         } else {
1109                 /* scan in ibss */
1110                 /* we don't do escan in ibss */
1111                 ssids = this_ssid;
1112         }
1113
1114         cfg->scan_request = request;
1115         set_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status);
1116         if (escan_req) {
1117                 cfg->escan_info.run = brcmf_run_escan;
1118                 err = brcmf_p2p_scan_prep(wiphy, request, vif);
1119                 if (err)
1120                         goto scan_out;
1121
1122                 err = brcmf_do_escan(cfg, wiphy, vif->ifp, request);
1123                 if (err)
1124                         goto scan_out;
1125         } else {
1126                 brcmf_dbg(SCAN, "ssid \"%s\", ssid_len (%d)\n",
1127                           ssids->ssid, ssids->ssid_len);
1128                 memset(&ssid_le, 0, sizeof(ssid_le));
1129                 SSID_len = min_t(u8, sizeof(ssid_le.SSID), ssids->ssid_len);
1130                 ssid_le.SSID_len = cpu_to_le32(0);
1131                 spec_scan = false;
1132                 if (SSID_len) {
1133                         memcpy(ssid_le.SSID, ssids->ssid, SSID_len);
1134                         ssid_le.SSID_len = cpu_to_le32(SSID_len);
1135                         spec_scan = true;
1136                 } else
1137                         brcmf_dbg(SCAN, "Broadcast scan\n");
1138
1139                 passive_scan = cfg->active_scan ? 0 : 1;
1140                 err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_PASSIVE_SCAN,
1141                                             passive_scan);
1142                 if (err) {
1143                         brcmf_err("WLC_SET_PASSIVE_SCAN error (%d)\n", err);
1144                         goto scan_out;
1145                 }
1146                 brcmf_scan_config_mpc(ifp, 0);
1147                 err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SCAN, &ssid_le,
1148                                              sizeof(ssid_le));
1149                 if (err) {
1150                         if (err == -EBUSY)
1151                                 brcmf_dbg(INFO, "BUSY: scan for \"%s\" canceled\n",
1152                                           ssid_le.SSID);
1153                         else
1154                                 brcmf_err("WLC_SCAN error (%d)\n", err);
1155
1156                         brcmf_scan_config_mpc(ifp, 1);
1157                         goto scan_out;
1158                 }
1159         }
1160
1161         /* Arm scan timeout timer */
1162         mod_timer(&cfg->escan_timeout, jiffies +
1163                         BRCMF_ESCAN_TIMER_INTERVAL_MS * HZ / 1000);
1164
1165         return 0;
1166
1167 scan_out:
1168         clear_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status);
1169         cfg->scan_request = NULL;
1170         return err;
1171 }
1172
1173 static s32
1174 brcmf_cfg80211_scan(struct wiphy *wiphy, struct cfg80211_scan_request *request)
1175 {
1176         struct brcmf_cfg80211_vif *vif;
1177         s32 err = 0;
1178
1179         brcmf_dbg(TRACE, "Enter\n");
1180         vif = container_of(request->wdev, struct brcmf_cfg80211_vif, wdev);
1181         if (!check_vif_up(vif))
1182                 return -EIO;
1183
1184         err = brcmf_cfg80211_escan(wiphy, vif, request, NULL);
1185
1186         if (err)
1187                 brcmf_err("scan error (%d)\n", err);
1188
1189         brcmf_dbg(TRACE, "Exit\n");
1190         return err;
1191 }
1192
1193 static s32 brcmf_set_rts(struct net_device *ndev, u32 rts_threshold)
1194 {
1195         s32 err = 0;
1196
1197         err = brcmf_fil_iovar_int_set(netdev_priv(ndev), "rtsthresh",
1198                                       rts_threshold);
1199         if (err)
1200                 brcmf_err("Error (%d)\n", err);
1201
1202         return err;
1203 }
1204
1205 static s32 brcmf_set_frag(struct net_device *ndev, u32 frag_threshold)
1206 {
1207         s32 err = 0;
1208
1209         err = brcmf_fil_iovar_int_set(netdev_priv(ndev), "fragthresh",
1210                                       frag_threshold);
1211         if (err)
1212                 brcmf_err("Error (%d)\n", err);
1213
1214         return err;
1215 }
1216
1217 static s32 brcmf_set_retry(struct net_device *ndev, u32 retry, bool l)
1218 {
1219         s32 err = 0;
1220         u32 cmd = (l ? BRCMF_C_SET_LRL : BRCMF_C_SET_SRL);
1221
1222         err = brcmf_fil_cmd_int_set(netdev_priv(ndev), cmd, retry);
1223         if (err) {
1224                 brcmf_err("cmd (%d) , error (%d)\n", cmd, err);
1225                 return err;
1226         }
1227         return err;
1228 }
1229
1230 static s32 brcmf_cfg80211_set_wiphy_params(struct wiphy *wiphy, u32 changed)
1231 {
1232         struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
1233         struct net_device *ndev = cfg_to_ndev(cfg);
1234         struct brcmf_if *ifp = netdev_priv(ndev);
1235         s32 err = 0;
1236
1237         brcmf_dbg(TRACE, "Enter\n");
1238         if (!check_vif_up(ifp->vif))
1239                 return -EIO;
1240
1241         if (changed & WIPHY_PARAM_RTS_THRESHOLD &&
1242             (cfg->conf->rts_threshold != wiphy->rts_threshold)) {
1243                 cfg->conf->rts_threshold = wiphy->rts_threshold;
1244                 err = brcmf_set_rts(ndev, cfg->conf->rts_threshold);
1245                 if (!err)
1246                         goto done;
1247         }
1248         if (changed & WIPHY_PARAM_FRAG_THRESHOLD &&
1249             (cfg->conf->frag_threshold != wiphy->frag_threshold)) {
1250                 cfg->conf->frag_threshold = wiphy->frag_threshold;
1251                 err = brcmf_set_frag(ndev, cfg->conf->frag_threshold);
1252                 if (!err)
1253                         goto done;
1254         }
1255         if (changed & WIPHY_PARAM_RETRY_LONG
1256             && (cfg->conf->retry_long != wiphy->retry_long)) {
1257                 cfg->conf->retry_long = wiphy->retry_long;
1258                 err = brcmf_set_retry(ndev, cfg->conf->retry_long, true);
1259                 if (!err)
1260                         goto done;
1261         }
1262         if (changed & WIPHY_PARAM_RETRY_SHORT
1263             && (cfg->conf->retry_short != wiphy->retry_short)) {
1264                 cfg->conf->retry_short = wiphy->retry_short;
1265                 err = brcmf_set_retry(ndev, cfg->conf->retry_short, false);
1266                 if (!err)
1267                         goto done;
1268         }
1269
1270 done:
1271         brcmf_dbg(TRACE, "Exit\n");
1272         return err;
1273 }
1274
1275 static void brcmf_init_prof(struct brcmf_cfg80211_profile *prof)
1276 {
1277         memset(prof, 0, sizeof(*prof));
1278 }
1279
1280 static u16 brcmf_map_fw_linkdown_reason(const struct brcmf_event_msg *e)
1281 {
1282         u16 reason;
1283
1284         switch (e->event_code) {
1285         case BRCMF_E_DEAUTH:
1286         case BRCMF_E_DEAUTH_IND:
1287         case BRCMF_E_DISASSOC_IND:
1288                 reason = e->reason;
1289                 break;
1290         case BRCMF_E_LINK:
1291         default:
1292                 reason = 0;
1293                 break;
1294         }
1295         return reason;
1296 }
1297
1298 static void brcmf_link_down(struct brcmf_cfg80211_vif *vif, u16 reason)
1299 {
1300         struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(vif->wdev.wiphy);
1301         s32 err = 0;
1302
1303         brcmf_dbg(TRACE, "Enter\n");
1304
1305         if (test_and_clear_bit(BRCMF_VIF_STATUS_CONNECTED, &vif->sme_state)) {
1306                 brcmf_dbg(INFO, "Call WLC_DISASSOC to stop excess roaming\n ");
1307                 err = brcmf_fil_cmd_data_set(vif->ifp,
1308                                              BRCMF_C_DISASSOC, NULL, 0);
1309                 if (err) {
1310                         brcmf_err("WLC_DISASSOC failed (%d)\n", err);
1311                 }
1312                 if ((vif->wdev.iftype == NL80211_IFTYPE_STATION) ||
1313                     (vif->wdev.iftype == NL80211_IFTYPE_P2P_CLIENT))
1314                         cfg80211_disconnected(vif->wdev.netdev, reason, NULL, 0,
1315                                               true, GFP_KERNEL);
1316         }
1317         clear_bit(BRCMF_VIF_STATUS_CONNECTING, &vif->sme_state);
1318         clear_bit(BRCMF_SCAN_STATUS_SUPPRESS, &cfg->scan_status);
1319         brcmf_btcoex_set_mode(vif, BRCMF_BTCOEX_ENABLED, 0);
1320         brcmf_dbg(TRACE, "Exit\n");
1321 }
1322
1323 static s32
1324 brcmf_cfg80211_join_ibss(struct wiphy *wiphy, struct net_device *ndev,
1325                       struct cfg80211_ibss_params *params)
1326 {
1327         struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
1328         struct brcmf_if *ifp = netdev_priv(ndev);
1329         struct brcmf_cfg80211_profile *profile = &ifp->vif->profile;
1330         struct brcmf_join_params join_params;
1331         size_t join_params_size = 0;
1332         s32 err = 0;
1333         s32 wsec = 0;
1334         s32 bcnprd;
1335         u16 chanspec;
1336         u32 ssid_len;
1337
1338         brcmf_dbg(TRACE, "Enter\n");
1339         if (!check_vif_up(ifp->vif))
1340                 return -EIO;
1341
1342         if (params->ssid)
1343                 brcmf_dbg(CONN, "SSID: %s\n", params->ssid);
1344         else {
1345                 brcmf_dbg(CONN, "SSID: NULL, Not supported\n");
1346                 return -EOPNOTSUPP;
1347         }
1348
1349         set_bit(BRCMF_VIF_STATUS_CONNECTING, &ifp->vif->sme_state);
1350
1351         if (params->bssid)
1352                 brcmf_dbg(CONN, "BSSID: %pM\n", params->bssid);
1353         else
1354                 brcmf_dbg(CONN, "No BSSID specified\n");
1355
1356         if (params->chandef.chan)
1357                 brcmf_dbg(CONN, "channel: %d\n",
1358                           params->chandef.chan->center_freq);
1359         else
1360                 brcmf_dbg(CONN, "no channel specified\n");
1361
1362         if (params->channel_fixed)
1363                 brcmf_dbg(CONN, "fixed channel required\n");
1364         else
1365                 brcmf_dbg(CONN, "no fixed channel required\n");
1366
1367         if (params->ie && params->ie_len)
1368                 brcmf_dbg(CONN, "ie len: %d\n", params->ie_len);
1369         else
1370                 brcmf_dbg(CONN, "no ie specified\n");
1371
1372         if (params->beacon_interval)
1373                 brcmf_dbg(CONN, "beacon interval: %d\n",
1374                           params->beacon_interval);
1375         else
1376                 brcmf_dbg(CONN, "no beacon interval specified\n");
1377
1378         if (params->basic_rates)
1379                 brcmf_dbg(CONN, "basic rates: %08X\n", params->basic_rates);
1380         else
1381                 brcmf_dbg(CONN, "no basic rates specified\n");
1382
1383         if (params->privacy)
1384                 brcmf_dbg(CONN, "privacy required\n");
1385         else
1386                 brcmf_dbg(CONN, "no privacy required\n");
1387
1388         /* Configure Privacy for starter */
1389         if (params->privacy)
1390                 wsec |= WEP_ENABLED;
1391
1392         err = brcmf_fil_iovar_int_set(ifp, "wsec", wsec);
1393         if (err) {
1394                 brcmf_err("wsec failed (%d)\n", err);
1395                 goto done;
1396         }
1397
1398         /* Configure Beacon Interval for starter */
1399         if (params->beacon_interval)
1400                 bcnprd = params->beacon_interval;
1401         else
1402                 bcnprd = 100;
1403
1404         err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_BCNPRD, bcnprd);
1405         if (err) {
1406                 brcmf_err("WLC_SET_BCNPRD failed (%d)\n", err);
1407                 goto done;
1408         }
1409
1410         /* Configure required join parameter */
1411         memset(&join_params, 0, sizeof(struct brcmf_join_params));
1412
1413         /* SSID */
1414         ssid_len = min_t(u32, params->ssid_len, IEEE80211_MAX_SSID_LEN);
1415         memcpy(join_params.ssid_le.SSID, params->ssid, ssid_len);
1416         join_params.ssid_le.SSID_len = cpu_to_le32(ssid_len);
1417         join_params_size = sizeof(join_params.ssid_le);
1418
1419         /* BSSID */
1420         if (params->bssid) {
1421                 memcpy(join_params.params_le.bssid, params->bssid, ETH_ALEN);
1422                 join_params_size += BRCMF_ASSOC_PARAMS_FIXED_SIZE;
1423                 memcpy(profile->bssid, params->bssid, ETH_ALEN);
1424         } else {
1425                 eth_broadcast_addr(join_params.params_le.bssid);
1426                 eth_zero_addr(profile->bssid);
1427         }
1428
1429         /* Channel */
1430         if (params->chandef.chan) {
1431                 u32 target_channel;
1432
1433                 cfg->channel =
1434                         ieee80211_frequency_to_channel(
1435                                 params->chandef.chan->center_freq);
1436                 if (params->channel_fixed) {
1437                         /* adding chanspec */
1438                         chanspec = chandef_to_chanspec(&cfg->d11inf,
1439                                                        &params->chandef);
1440                         join_params.params_le.chanspec_list[0] =
1441                                 cpu_to_le16(chanspec);
1442                         join_params.params_le.chanspec_num = cpu_to_le32(1);
1443                         join_params_size += sizeof(join_params.params_le);
1444                 }
1445
1446                 /* set channel for starter */
1447                 target_channel = cfg->channel;
1448                 err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_CHANNEL,
1449                                             target_channel);
1450                 if (err) {
1451                         brcmf_err("WLC_SET_CHANNEL failed (%d)\n", err);
1452                         goto done;
1453                 }
1454         } else
1455                 cfg->channel = 0;
1456
1457         cfg->ibss_starter = false;
1458
1459
1460         err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_SSID,
1461                                      &join_params, join_params_size);
1462         if (err) {
1463                 brcmf_err("WLC_SET_SSID failed (%d)\n", err);
1464                 goto done;
1465         }
1466
1467 done:
1468         if (err)
1469                 clear_bit(BRCMF_VIF_STATUS_CONNECTING, &ifp->vif->sme_state);
1470         brcmf_dbg(TRACE, "Exit\n");
1471         return err;
1472 }
1473
1474 static s32
1475 brcmf_cfg80211_leave_ibss(struct wiphy *wiphy, struct net_device *ndev)
1476 {
1477         struct brcmf_if *ifp = netdev_priv(ndev);
1478
1479         brcmf_dbg(TRACE, "Enter\n");
1480         if (!check_vif_up(ifp->vif)) {
1481                 /* When driver is being unloaded, it can end up here. If an
1482                  * error is returned then later on a debug trace in the wireless
1483                  * core module will be printed. To avoid this 0 is returned.
1484                  */
1485                 return 0;
1486         }
1487
1488         brcmf_link_down(ifp->vif, WLAN_REASON_DEAUTH_LEAVING);
1489         brcmf_net_setcarrier(ifp, false);
1490
1491         brcmf_dbg(TRACE, "Exit\n");
1492
1493         return 0;
1494 }
1495
1496 static s32 brcmf_set_wpa_version(struct net_device *ndev,
1497                                  struct cfg80211_connect_params *sme)
1498 {
1499         struct brcmf_cfg80211_profile *profile = ndev_to_prof(ndev);
1500         struct brcmf_cfg80211_security *sec;
1501         s32 val = 0;
1502         s32 err = 0;
1503
1504         if (sme->crypto.wpa_versions & NL80211_WPA_VERSION_1)
1505                 val = WPA_AUTH_PSK | WPA_AUTH_UNSPECIFIED;
1506         else if (sme->crypto.wpa_versions & NL80211_WPA_VERSION_2)
1507                 val = WPA2_AUTH_PSK | WPA2_AUTH_UNSPECIFIED;
1508         else
1509                 val = WPA_AUTH_DISABLED;
1510         brcmf_dbg(CONN, "setting wpa_auth to 0x%0x\n", val);
1511         err = brcmf_fil_bsscfg_int_set(netdev_priv(ndev), "wpa_auth", val);
1512         if (err) {
1513                 brcmf_err("set wpa_auth failed (%d)\n", err);
1514                 return err;
1515         }
1516         sec = &profile->sec;
1517         sec->wpa_versions = sme->crypto.wpa_versions;
1518         return err;
1519 }
1520
1521 static s32 brcmf_set_auth_type(struct net_device *ndev,
1522                                struct cfg80211_connect_params *sme)
1523 {
1524         struct brcmf_cfg80211_profile *profile = ndev_to_prof(ndev);
1525         struct brcmf_cfg80211_security *sec;
1526         s32 val = 0;
1527         s32 err = 0;
1528
1529         switch (sme->auth_type) {
1530         case NL80211_AUTHTYPE_OPEN_SYSTEM:
1531                 val = 0;
1532                 brcmf_dbg(CONN, "open system\n");
1533                 break;
1534         case NL80211_AUTHTYPE_SHARED_KEY:
1535                 val = 1;
1536                 brcmf_dbg(CONN, "shared key\n");
1537                 break;
1538         case NL80211_AUTHTYPE_AUTOMATIC:
1539                 val = 2;
1540                 brcmf_dbg(CONN, "automatic\n");
1541                 break;
1542         case NL80211_AUTHTYPE_NETWORK_EAP:
1543                 brcmf_dbg(CONN, "network eap\n");
1544         default:
1545                 val = 2;
1546                 brcmf_err("invalid auth type (%d)\n", sme->auth_type);
1547                 break;
1548         }
1549
1550         err = brcmf_fil_bsscfg_int_set(netdev_priv(ndev), "auth", val);
1551         if (err) {
1552                 brcmf_err("set auth failed (%d)\n", err);
1553                 return err;
1554         }
1555         sec = &profile->sec;
1556         sec->auth_type = sme->auth_type;
1557         return err;
1558 }
1559
1560 static s32
1561 brcmf_set_wsec_mode(struct net_device *ndev,
1562                     struct cfg80211_connect_params *sme)
1563 {
1564         struct brcmf_cfg80211_profile *profile = ndev_to_prof(ndev);
1565         struct brcmf_cfg80211_security *sec;
1566         s32 pval = 0;
1567         s32 gval = 0;
1568         s32 wsec;
1569         s32 err = 0;
1570
1571         if (sme->crypto.n_ciphers_pairwise) {
1572                 switch (sme->crypto.ciphers_pairwise[0]) {
1573                 case WLAN_CIPHER_SUITE_WEP40:
1574                 case WLAN_CIPHER_SUITE_WEP104:
1575                         pval = WEP_ENABLED;
1576                         break;
1577                 case WLAN_CIPHER_SUITE_TKIP:
1578                         pval = TKIP_ENABLED;
1579                         break;
1580                 case WLAN_CIPHER_SUITE_CCMP:
1581                         pval = AES_ENABLED;
1582                         break;
1583                 case WLAN_CIPHER_SUITE_AES_CMAC:
1584                         pval = AES_ENABLED;
1585                         break;
1586                 default:
1587                         brcmf_err("invalid cipher pairwise (%d)\n",
1588                                   sme->crypto.ciphers_pairwise[0]);
1589                         return -EINVAL;
1590                 }
1591         }
1592         if (sme->crypto.cipher_group) {
1593                 switch (sme->crypto.cipher_group) {
1594                 case WLAN_CIPHER_SUITE_WEP40:
1595                 case WLAN_CIPHER_SUITE_WEP104:
1596                         gval = WEP_ENABLED;
1597                         break;
1598                 case WLAN_CIPHER_SUITE_TKIP:
1599                         gval = TKIP_ENABLED;
1600                         break;
1601                 case WLAN_CIPHER_SUITE_CCMP:
1602                         gval = AES_ENABLED;
1603                         break;
1604                 case WLAN_CIPHER_SUITE_AES_CMAC:
1605                         gval = AES_ENABLED;
1606                         break;
1607                 default:
1608                         brcmf_err("invalid cipher group (%d)\n",
1609                                   sme->crypto.cipher_group);
1610                         return -EINVAL;
1611                 }
1612         }
1613
1614         brcmf_dbg(CONN, "pval (%d) gval (%d)\n", pval, gval);
1615         /* In case of privacy, but no security and WPS then simulate */
1616         /* setting AES. WPS-2.0 allows no security                   */
1617         if (brcmf_find_wpsie(sme->ie, sme->ie_len) && !pval && !gval &&
1618             sme->privacy)
1619                 pval = AES_ENABLED;
1620
1621         wsec = pval | gval;
1622         err = brcmf_fil_bsscfg_int_set(netdev_priv(ndev), "wsec", wsec);
1623         if (err) {
1624                 brcmf_err("error (%d)\n", err);
1625                 return err;
1626         }
1627
1628         sec = &profile->sec;
1629         sec->cipher_pairwise = sme->crypto.ciphers_pairwise[0];
1630         sec->cipher_group = sme->crypto.cipher_group;
1631
1632         return err;
1633 }
1634
1635 static s32
1636 brcmf_set_key_mgmt(struct net_device *ndev, struct cfg80211_connect_params *sme)
1637 {
1638         struct brcmf_if *ifp = netdev_priv(ndev);
1639         s32 val;
1640         s32 err;
1641         const struct brcmf_tlv *rsn_ie;
1642         const u8 *ie;
1643         u32 ie_len;
1644         u32 offset;
1645         u16 rsn_cap;
1646         u32 mfp;
1647         u16 count;
1648
1649         if (!sme->crypto.n_akm_suites)
1650                 return 0;
1651
1652         err = brcmf_fil_bsscfg_int_get(netdev_priv(ndev), "wpa_auth", &val);
1653         if (err) {
1654                 brcmf_err("could not get wpa_auth (%d)\n", err);
1655                 return err;
1656         }
1657         if (val & (WPA_AUTH_PSK | WPA_AUTH_UNSPECIFIED)) {
1658                 switch (sme->crypto.akm_suites[0]) {
1659                 case WLAN_AKM_SUITE_8021X:
1660                         val = WPA_AUTH_UNSPECIFIED;
1661                         break;
1662                 case WLAN_AKM_SUITE_PSK:
1663                         val = WPA_AUTH_PSK;
1664                         break;
1665                 default:
1666                         brcmf_err("invalid cipher group (%d)\n",
1667                                   sme->crypto.cipher_group);
1668                         return -EINVAL;
1669                 }
1670         } else if (val & (WPA2_AUTH_PSK | WPA2_AUTH_UNSPECIFIED)) {
1671                 switch (sme->crypto.akm_suites[0]) {
1672                 case WLAN_AKM_SUITE_8021X:
1673                         val = WPA2_AUTH_UNSPECIFIED;
1674                         break;
1675                 case WLAN_AKM_SUITE_8021X_SHA256:
1676                         val = WPA2_AUTH_1X_SHA256;
1677                         break;
1678                 case WLAN_AKM_SUITE_PSK_SHA256:
1679                         val = WPA2_AUTH_PSK_SHA256;
1680                         break;
1681                 case WLAN_AKM_SUITE_PSK:
1682                         val = WPA2_AUTH_PSK;
1683                         break;
1684                 default:
1685                         brcmf_err("invalid cipher group (%d)\n",
1686                                   sme->crypto.cipher_group);
1687                         return -EINVAL;
1688                 }
1689         }
1690
1691         if (!brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MFP))
1692                 goto skip_mfp_config;
1693         /* The MFP mode (1 or 2) needs to be determined, parse IEs. The
1694          * IE will not be verified, just a quick search for MFP config
1695          */
1696         rsn_ie = brcmf_parse_tlvs((const u8 *)sme->ie, sme->ie_len,
1697                                   WLAN_EID_RSN);
1698         if (!rsn_ie)
1699                 goto skip_mfp_config;
1700         ie = (const u8 *)rsn_ie;
1701         ie_len = rsn_ie->len + TLV_HDR_LEN;
1702         /* Skip unicast suite */
1703         offset = TLV_HDR_LEN + WPA_IE_VERSION_LEN + WPA_IE_MIN_OUI_LEN;
1704         if (offset + WPA_IE_SUITE_COUNT_LEN >= ie_len)
1705                 goto skip_mfp_config;
1706         /* Skip multicast suite */
1707         count = ie[offset] + (ie[offset + 1] << 8);
1708         offset += WPA_IE_SUITE_COUNT_LEN + (count * WPA_IE_MIN_OUI_LEN);
1709         if (offset + WPA_IE_SUITE_COUNT_LEN >= ie_len)
1710                 goto skip_mfp_config;
1711         /* Skip auth key management suite(s) */
1712         count = ie[offset] + (ie[offset + 1] << 8);
1713         offset += WPA_IE_SUITE_COUNT_LEN + (count * WPA_IE_MIN_OUI_LEN);
1714         if (offset + WPA_IE_SUITE_COUNT_LEN > ie_len)
1715                 goto skip_mfp_config;
1716         /* Ready to read capabilities */
1717         mfp = BRCMF_MFP_NONE;
1718         rsn_cap = ie[offset] + (ie[offset + 1] << 8);
1719         if (rsn_cap & RSN_CAP_MFPR_MASK)
1720                 mfp = BRCMF_MFP_REQUIRED;
1721         else if (rsn_cap & RSN_CAP_MFPC_MASK)
1722                 mfp = BRCMF_MFP_CAPABLE;
1723         brcmf_fil_bsscfg_int_set(netdev_priv(ndev), "mfp", mfp);
1724
1725 skip_mfp_config:
1726         brcmf_dbg(CONN, "setting wpa_auth to %d\n", val);
1727         err = brcmf_fil_bsscfg_int_set(netdev_priv(ndev), "wpa_auth", val);
1728         if (err) {
1729                 brcmf_err("could not set wpa_auth (%d)\n", err);
1730                 return err;
1731         }
1732
1733         return err;
1734 }
1735
1736 static s32
1737 brcmf_set_sharedkey(struct net_device *ndev,
1738                     struct cfg80211_connect_params *sme)
1739 {
1740         struct brcmf_cfg80211_profile *profile = ndev_to_prof(ndev);
1741         struct brcmf_cfg80211_security *sec;
1742         struct brcmf_wsec_key key;
1743         s32 val;
1744         s32 err = 0;
1745
1746         brcmf_dbg(CONN, "key len (%d)\n", sme->key_len);
1747
1748         if (sme->key_len == 0)
1749                 return 0;
1750
1751         sec = &profile->sec;
1752         brcmf_dbg(CONN, "wpa_versions 0x%x cipher_pairwise 0x%x\n",
1753                   sec->wpa_versions, sec->cipher_pairwise);
1754
1755         if (sec->wpa_versions & (NL80211_WPA_VERSION_1 | NL80211_WPA_VERSION_2))
1756                 return 0;
1757
1758         if (!(sec->cipher_pairwise &
1759             (WLAN_CIPHER_SUITE_WEP40 | WLAN_CIPHER_SUITE_WEP104)))
1760                 return 0;
1761
1762         memset(&key, 0, sizeof(key));
1763         key.len = (u32) sme->key_len;
1764         key.index = (u32) sme->key_idx;
1765         if (key.len > sizeof(key.data)) {
1766                 brcmf_err("Too long key length (%u)\n", key.len);
1767                 return -EINVAL;
1768         }
1769         memcpy(key.data, sme->key, key.len);
1770         key.flags = BRCMF_PRIMARY_KEY;
1771         switch (sec->cipher_pairwise) {
1772         case WLAN_CIPHER_SUITE_WEP40:
1773                 key.algo = CRYPTO_ALGO_WEP1;
1774                 break;
1775         case WLAN_CIPHER_SUITE_WEP104:
1776                 key.algo = CRYPTO_ALGO_WEP128;
1777                 break;
1778         default:
1779                 brcmf_err("Invalid algorithm (%d)\n",
1780                           sme->crypto.ciphers_pairwise[0]);
1781                 return -EINVAL;
1782         }
1783         /* Set the new key/index */
1784         brcmf_dbg(CONN, "key length (%d) key index (%d) algo (%d)\n",
1785                   key.len, key.index, key.algo);
1786         brcmf_dbg(CONN, "key \"%s\"\n", key.data);
1787         err = send_key_to_dongle(netdev_priv(ndev), &key);
1788         if (err)
1789                 return err;
1790
1791         if (sec->auth_type == NL80211_AUTHTYPE_SHARED_KEY) {
1792                 brcmf_dbg(CONN, "set auth_type to shared key\n");
1793                 val = WL_AUTH_SHARED_KEY;       /* shared key */
1794                 err = brcmf_fil_bsscfg_int_set(netdev_priv(ndev), "auth", val);
1795                 if (err)
1796                         brcmf_err("set auth failed (%d)\n", err);
1797         }
1798         return err;
1799 }
1800
1801 static
1802 enum nl80211_auth_type brcmf_war_auth_type(struct brcmf_if *ifp,
1803                                            enum nl80211_auth_type type)
1804 {
1805         if (type == NL80211_AUTHTYPE_AUTOMATIC &&
1806             brcmf_feat_is_quirk_enabled(ifp, BRCMF_FEAT_QUIRK_AUTO_AUTH)) {
1807                 brcmf_dbg(CONN, "WAR: use OPEN instead of AUTO\n");
1808                 type = NL80211_AUTHTYPE_OPEN_SYSTEM;
1809         }
1810         return type;
1811 }
1812
1813 static void brcmf_set_join_pref(struct brcmf_if *ifp,
1814                                 struct cfg80211_bss_selection *bss_select)
1815 {
1816         struct brcmf_join_pref_params join_pref_params[2];
1817         enum nl80211_band band;
1818         int err, i = 0;
1819
1820         join_pref_params[i].len = 2;
1821         join_pref_params[i].rssi_gain = 0;
1822
1823         if (bss_select->behaviour != NL80211_BSS_SELECT_ATTR_BAND_PREF)
1824                 brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_ASSOC_PREFER, WLC_BAND_AUTO);
1825
1826         switch (bss_select->behaviour) {
1827         case __NL80211_BSS_SELECT_ATTR_INVALID:
1828                 brcmf_c_set_joinpref_default(ifp);
1829                 return;
1830         case NL80211_BSS_SELECT_ATTR_BAND_PREF:
1831                 join_pref_params[i].type = BRCMF_JOIN_PREF_BAND;
1832                 band = bss_select->param.band_pref;
1833                 join_pref_params[i].band = nl80211_band_to_fwil(band);
1834                 i++;
1835                 break;
1836         case NL80211_BSS_SELECT_ATTR_RSSI_ADJUST:
1837                 join_pref_params[i].type = BRCMF_JOIN_PREF_RSSI_DELTA;
1838                 band = bss_select->param.adjust.band;
1839                 join_pref_params[i].band = nl80211_band_to_fwil(band);
1840                 join_pref_params[i].rssi_gain = bss_select->param.adjust.delta;
1841                 i++;
1842                 break;
1843         case NL80211_BSS_SELECT_ATTR_RSSI:
1844         default:
1845                 break;
1846         }
1847         join_pref_params[i].type = BRCMF_JOIN_PREF_RSSI;
1848         join_pref_params[i].len = 2;
1849         join_pref_params[i].rssi_gain = 0;
1850         join_pref_params[i].band = 0;
1851         err = brcmf_fil_iovar_data_set(ifp, "join_pref", join_pref_params,
1852                                        sizeof(join_pref_params));
1853         if (err)
1854                 brcmf_err("Set join_pref error (%d)\n", err);
1855 }
1856
1857 static s32
1858 brcmf_cfg80211_connect(struct wiphy *wiphy, struct net_device *ndev,
1859                        struct cfg80211_connect_params *sme)
1860 {
1861         struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
1862         struct brcmf_if *ifp = netdev_priv(ndev);
1863         struct ieee80211_channel *chan = sme->channel;
1864         struct brcmf_join_params join_params;
1865         size_t join_params_size;
1866         const struct brcmf_tlv *rsn_ie;
1867         const struct brcmf_vs_tlv *wpa_ie;
1868         const void *ie;
1869         u32 ie_len;
1870         struct brcmf_ext_join_params_le *ext_join_params;
1871         u16 chanspec;
1872         s32 err = 0;
1873         u32 ssid_len;
1874
1875         brcmf_dbg(TRACE, "Enter\n");
1876         if (!check_vif_up(ifp->vif))
1877                 return -EIO;
1878
1879         if (!sme->ssid) {
1880                 brcmf_err("Invalid ssid\n");
1881                 return -EOPNOTSUPP;
1882         }
1883
1884         if (ifp->vif == cfg->p2p.bss_idx[P2PAPI_BSSCFG_PRIMARY].vif) {
1885                 /* A normal (non P2P) connection request setup. */
1886                 ie = NULL;
1887                 ie_len = 0;
1888                 /* find the WPA_IE */
1889                 wpa_ie = brcmf_find_wpaie((u8 *)sme->ie, sme->ie_len);
1890                 if (wpa_ie) {
1891                         ie = wpa_ie;
1892                         ie_len = wpa_ie->len + TLV_HDR_LEN;
1893                 } else {
1894                         /* find the RSN_IE */
1895                         rsn_ie = brcmf_parse_tlvs((const u8 *)sme->ie,
1896                                                   sme->ie_len,
1897                                                   WLAN_EID_RSN);
1898                         if (rsn_ie) {
1899                                 ie = rsn_ie;
1900                                 ie_len = rsn_ie->len + TLV_HDR_LEN;
1901                         }
1902                 }
1903                 brcmf_fil_iovar_data_set(ifp, "wpaie", ie, ie_len);
1904         }
1905
1906         err = brcmf_vif_set_mgmt_ie(ifp->vif, BRCMF_VNDR_IE_ASSOCREQ_FLAG,
1907                                     sme->ie, sme->ie_len);
1908         if (err)
1909                 brcmf_err("Set Assoc REQ IE Failed\n");
1910         else
1911                 brcmf_dbg(TRACE, "Applied Vndr IEs for Assoc request\n");
1912
1913         set_bit(BRCMF_VIF_STATUS_CONNECTING, &ifp->vif->sme_state);
1914
1915         if (chan) {
1916                 cfg->channel =
1917                         ieee80211_frequency_to_channel(chan->center_freq);
1918                 chanspec = channel_to_chanspec(&cfg->d11inf, chan);
1919                 brcmf_dbg(CONN, "channel=%d, center_req=%d, chanspec=0x%04x\n",
1920                           cfg->channel, chan->center_freq, chanspec);
1921         } else {
1922                 cfg->channel = 0;
1923                 chanspec = 0;
1924         }
1925
1926         brcmf_dbg(INFO, "ie (%p), ie_len (%zd)\n", sme->ie, sme->ie_len);
1927
1928         err = brcmf_set_wpa_version(ndev, sme);
1929         if (err) {
1930                 brcmf_err("wl_set_wpa_version failed (%d)\n", err);
1931                 goto done;
1932         }
1933
1934         sme->auth_type = brcmf_war_auth_type(ifp, sme->auth_type);
1935         err = brcmf_set_auth_type(ndev, sme);
1936         if (err) {
1937                 brcmf_err("wl_set_auth_type failed (%d)\n", err);
1938                 goto done;
1939         }
1940
1941         err = brcmf_set_wsec_mode(ndev, sme);
1942         if (err) {
1943                 brcmf_err("wl_set_set_cipher failed (%d)\n", err);
1944                 goto done;
1945         }
1946
1947         err = brcmf_set_key_mgmt(ndev, sme);
1948         if (err) {
1949                 brcmf_err("wl_set_key_mgmt failed (%d)\n", err);
1950                 goto done;
1951         }
1952
1953         err = brcmf_set_sharedkey(ndev, sme);
1954         if (err) {
1955                 brcmf_err("brcmf_set_sharedkey failed (%d)\n", err);
1956                 goto done;
1957         }
1958
1959         /* Join with specific BSSID and cached SSID
1960          * If SSID is zero join based on BSSID only
1961          */
1962         join_params_size = offsetof(struct brcmf_ext_join_params_le, assoc_le) +
1963                 offsetof(struct brcmf_assoc_params_le, chanspec_list);
1964         if (cfg->channel)
1965                 join_params_size += sizeof(u16);
1966         ext_join_params = kzalloc(join_params_size, GFP_KERNEL);
1967         if (ext_join_params == NULL) {
1968                 err = -ENOMEM;
1969                 goto done;
1970         }
1971         ssid_len = min_t(u32, sme->ssid_len, IEEE80211_MAX_SSID_LEN);
1972         ext_join_params->ssid_le.SSID_len = cpu_to_le32(ssid_len);
1973         memcpy(&ext_join_params->ssid_le.SSID, sme->ssid, ssid_len);
1974         if (ssid_len < IEEE80211_MAX_SSID_LEN)
1975                 brcmf_dbg(CONN, "SSID \"%s\", len (%d)\n",
1976                           ext_join_params->ssid_le.SSID, ssid_len);
1977
1978         /* Set up join scan parameters */
1979         ext_join_params->scan_le.scan_type = -1;
1980         ext_join_params->scan_le.home_time = cpu_to_le32(-1);
1981
1982         if (sme->bssid)
1983                 memcpy(&ext_join_params->assoc_le.bssid, sme->bssid, ETH_ALEN);
1984         else
1985                 eth_broadcast_addr(ext_join_params->assoc_le.bssid);
1986
1987         if (cfg->channel) {
1988                 ext_join_params->assoc_le.chanspec_num = cpu_to_le32(1);
1989
1990                 ext_join_params->assoc_le.chanspec_list[0] =
1991                         cpu_to_le16(chanspec);
1992                 /* Increase dwell time to receive probe response or detect
1993                  * beacon from target AP at a noisy air only during connect
1994                  * command.
1995                  */
1996                 ext_join_params->scan_le.active_time =
1997                         cpu_to_le32(BRCMF_SCAN_JOIN_ACTIVE_DWELL_TIME_MS);
1998                 ext_join_params->scan_le.passive_time =
1999                         cpu_to_le32(BRCMF_SCAN_JOIN_PASSIVE_DWELL_TIME_MS);
2000                 /* To sync with presence period of VSDB GO send probe request
2001                  * more frequently. Probe request will be stopped when it gets
2002                  * probe response from target AP/GO.
2003                  */
2004                 ext_join_params->scan_le.nprobes =
2005                         cpu_to_le32(BRCMF_SCAN_JOIN_ACTIVE_DWELL_TIME_MS /
2006                                     BRCMF_SCAN_JOIN_PROBE_INTERVAL_MS);
2007         } else {
2008                 ext_join_params->scan_le.active_time = cpu_to_le32(-1);
2009                 ext_join_params->scan_le.passive_time = cpu_to_le32(-1);
2010                 ext_join_params->scan_le.nprobes = cpu_to_le32(-1);
2011         }
2012
2013         brcmf_set_join_pref(ifp, &sme->bss_select);
2014
2015         err  = brcmf_fil_bsscfg_data_set(ifp, "join", ext_join_params,
2016                                          join_params_size);
2017         kfree(ext_join_params);
2018         if (!err)
2019                 /* This is it. join command worked, we are done */
2020                 goto done;
2021
2022         /* join command failed, fallback to set ssid */
2023         memset(&join_params, 0, sizeof(join_params));
2024         join_params_size = sizeof(join_params.ssid_le);
2025
2026         memcpy(&join_params.ssid_le.SSID, sme->ssid, ssid_len);
2027         join_params.ssid_le.SSID_len = cpu_to_le32(ssid_len);
2028
2029         if (sme->bssid)
2030                 memcpy(join_params.params_le.bssid, sme->bssid, ETH_ALEN);
2031         else
2032                 eth_broadcast_addr(join_params.params_le.bssid);
2033
2034         if (cfg->channel) {
2035                 join_params.params_le.chanspec_list[0] = cpu_to_le16(chanspec);
2036                 join_params.params_le.chanspec_num = cpu_to_le32(1);
2037                 join_params_size += sizeof(join_params.params_le);
2038         }
2039         err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_SSID,
2040                                      &join_params, join_params_size);
2041         if (err)
2042                 brcmf_err("BRCMF_C_SET_SSID failed (%d)\n", err);
2043
2044 done:
2045         if (err)
2046                 clear_bit(BRCMF_VIF_STATUS_CONNECTING, &ifp->vif->sme_state);
2047         brcmf_dbg(TRACE, "Exit\n");
2048         return err;
2049 }
2050
2051 static s32
2052 brcmf_cfg80211_disconnect(struct wiphy *wiphy, struct net_device *ndev,
2053                        u16 reason_code)
2054 {
2055         struct brcmf_if *ifp = netdev_priv(ndev);
2056         struct brcmf_cfg80211_profile *profile = &ifp->vif->profile;
2057         struct brcmf_scb_val_le scbval;
2058         s32 err = 0;
2059
2060         brcmf_dbg(TRACE, "Enter. Reason code = %d\n", reason_code);
2061         if (!check_vif_up(ifp->vif))
2062                 return -EIO;
2063
2064         clear_bit(BRCMF_VIF_STATUS_CONNECTED, &ifp->vif->sme_state);
2065         clear_bit(BRCMF_VIF_STATUS_CONNECTING, &ifp->vif->sme_state);
2066         cfg80211_disconnected(ndev, reason_code, NULL, 0, true, GFP_KERNEL);
2067
2068         memcpy(&scbval.ea, &profile->bssid, ETH_ALEN);
2069         scbval.val = cpu_to_le32(reason_code);
2070         err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_DISASSOC,
2071                                      &scbval, sizeof(scbval));
2072         if (err)
2073                 brcmf_err("error (%d)\n", err);
2074
2075         brcmf_dbg(TRACE, "Exit\n");
2076         return err;
2077 }
2078
2079 static s32
2080 brcmf_cfg80211_set_tx_power(struct wiphy *wiphy, struct wireless_dev *wdev,
2081                             enum nl80211_tx_power_setting type, s32 mbm)
2082 {
2083         struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
2084         struct net_device *ndev = cfg_to_ndev(cfg);
2085         struct brcmf_if *ifp = netdev_priv(ndev);
2086         s32 err;
2087         s32 disable;
2088         u32 qdbm = 127;
2089
2090         brcmf_dbg(TRACE, "Enter %d %d\n", type, mbm);
2091         if (!check_vif_up(ifp->vif))
2092                 return -EIO;
2093
2094         switch (type) {
2095         case NL80211_TX_POWER_AUTOMATIC:
2096                 break;
2097         case NL80211_TX_POWER_LIMITED:
2098         case NL80211_TX_POWER_FIXED:
2099                 if (mbm < 0) {
2100                         brcmf_err("TX_POWER_FIXED - dbm is negative\n");
2101                         err = -EINVAL;
2102                         goto done;
2103                 }
2104                 qdbm =  MBM_TO_DBM(4 * mbm);
2105                 if (qdbm > 127)
2106                         qdbm = 127;
2107                 qdbm |= WL_TXPWR_OVERRIDE;
2108                 break;
2109         default:
2110                 brcmf_err("Unsupported type %d\n", type);
2111                 err = -EINVAL;
2112                 goto done;
2113         }
2114         /* Make sure radio is off or on as far as software is concerned */
2115         disable = WL_RADIO_SW_DISABLE << 16;
2116         err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_RADIO, disable);
2117         if (err)
2118                 brcmf_err("WLC_SET_RADIO error (%d)\n", err);
2119
2120         err = brcmf_fil_iovar_int_set(ifp, "qtxpower", qdbm);
2121         if (err)
2122                 brcmf_err("qtxpower error (%d)\n", err);
2123
2124 done:
2125         brcmf_dbg(TRACE, "Exit %d (qdbm)\n", qdbm & ~WL_TXPWR_OVERRIDE);
2126         return err;
2127 }
2128
2129 static s32
2130 brcmf_cfg80211_get_tx_power(struct wiphy *wiphy, struct wireless_dev *wdev,
2131                             s32 *dbm)
2132 {
2133         struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
2134         struct net_device *ndev = cfg_to_ndev(cfg);
2135         struct brcmf_if *ifp = netdev_priv(ndev);
2136         s32 qdbm = 0;
2137         s32 err;
2138
2139         brcmf_dbg(TRACE, "Enter\n");
2140         if (!check_vif_up(ifp->vif))
2141                 return -EIO;
2142
2143         err = brcmf_fil_iovar_int_get(ifp, "qtxpower", &qdbm);
2144         if (err) {
2145                 brcmf_err("error (%d)\n", err);
2146                 goto done;
2147         }
2148         *dbm = (qdbm & ~WL_TXPWR_OVERRIDE) / 4;
2149
2150 done:
2151         brcmf_dbg(TRACE, "Exit (0x%x %d)\n", qdbm, *dbm);
2152         return err;
2153 }
2154
2155 static s32
2156 brcmf_cfg80211_config_default_key(struct wiphy *wiphy, struct net_device *ndev,
2157                                   u8 key_idx, bool unicast, bool multicast)
2158 {
2159         struct brcmf_if *ifp = netdev_priv(ndev);
2160         u32 index;
2161         u32 wsec;
2162         s32 err = 0;
2163
2164         brcmf_dbg(TRACE, "Enter\n");
2165         brcmf_dbg(CONN, "key index (%d)\n", key_idx);
2166         if (!check_vif_up(ifp->vif))
2167                 return -EIO;
2168
2169         err = brcmf_fil_bsscfg_int_get(ifp, "wsec", &wsec);
2170         if (err) {
2171                 brcmf_err("WLC_GET_WSEC error (%d)\n", err);
2172                 goto done;
2173         }
2174
2175         if (wsec & WEP_ENABLED) {
2176                 /* Just select a new current key */
2177                 index = key_idx;
2178                 err = brcmf_fil_cmd_int_set(ifp,
2179                                             BRCMF_C_SET_KEY_PRIMARY, index);
2180                 if (err)
2181                         brcmf_err("error (%d)\n", err);
2182         }
2183 done:
2184         brcmf_dbg(TRACE, "Exit\n");
2185         return err;
2186 }
2187
2188 static s32
2189 brcmf_cfg80211_del_key(struct wiphy *wiphy, struct net_device *ndev,
2190                        u8 key_idx, bool pairwise, const u8 *mac_addr)
2191 {
2192         struct brcmf_if *ifp = netdev_priv(ndev);
2193         struct brcmf_wsec_key *key;
2194         s32 err;
2195
2196         brcmf_dbg(TRACE, "Enter\n");
2197         brcmf_dbg(CONN, "key index (%d)\n", key_idx);
2198
2199         if (!check_vif_up(ifp->vif))
2200                 return -EIO;
2201
2202         if (key_idx >= BRCMF_MAX_DEFAULT_KEYS) {
2203                 /* we ignore this key index in this case */
2204                 return -EINVAL;
2205         }
2206
2207         key = &ifp->vif->profile.key[key_idx];
2208
2209         if (key->algo == CRYPTO_ALGO_OFF) {
2210                 brcmf_dbg(CONN, "Ignore clearing of (never configured) key\n");
2211                 return -EINVAL;
2212         }
2213
2214         memset(key, 0, sizeof(*key));
2215         key->index = (u32)key_idx;
2216         key->flags = BRCMF_PRIMARY_KEY;
2217
2218         /* Clear the key/index */
2219         err = send_key_to_dongle(ifp, key);
2220
2221         brcmf_dbg(TRACE, "Exit\n");
2222         return err;
2223 }
2224
2225 static s32
2226 brcmf_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev,
2227                        u8 key_idx, bool pairwise, const u8 *mac_addr,
2228                        struct key_params *params)
2229 {
2230         struct brcmf_if *ifp = netdev_priv(ndev);
2231         struct brcmf_wsec_key *key;
2232         s32 val;
2233         s32 wsec;
2234         s32 err;
2235         u8 keybuf[8];
2236         bool ext_key;
2237
2238         brcmf_dbg(TRACE, "Enter\n");
2239         brcmf_dbg(CONN, "key index (%d)\n", key_idx);
2240         if (!check_vif_up(ifp->vif))
2241                 return -EIO;
2242
2243         if (key_idx >= BRCMF_MAX_DEFAULT_KEYS) {
2244                 /* we ignore this key index in this case */
2245                 brcmf_err("invalid key index (%d)\n", key_idx);
2246                 return -EINVAL;
2247         }
2248
2249         if (params->key_len == 0)
2250                 return brcmf_cfg80211_del_key(wiphy, ndev, key_idx, pairwise,
2251                                               mac_addr);
2252
2253         if (params->key_len > sizeof(key->data)) {
2254                 brcmf_err("Too long key length (%u)\n", params->key_len);
2255                 return -EINVAL;
2256         }
2257
2258         ext_key = false;
2259         if (mac_addr && (params->cipher != WLAN_CIPHER_SUITE_WEP40) &&
2260             (params->cipher != WLAN_CIPHER_SUITE_WEP104)) {
2261                 brcmf_dbg(TRACE, "Ext key, mac %pM", mac_addr);
2262                 ext_key = true;
2263         }
2264
2265         key = &ifp->vif->profile.key[key_idx];
2266         memset(key, 0, sizeof(*key));
2267         if ((ext_key) && (!is_multicast_ether_addr(mac_addr)))
2268                 memcpy((char *)&key->ea, (void *)mac_addr, ETH_ALEN);
2269         key->len = params->key_len;
2270         key->index = key_idx;
2271         memcpy(key->data, params->key, key->len);
2272         if (!ext_key)
2273                 key->flags = BRCMF_PRIMARY_KEY;
2274
2275         switch (params->cipher) {
2276         case WLAN_CIPHER_SUITE_WEP40:
2277                 key->algo = CRYPTO_ALGO_WEP1;
2278                 val = WEP_ENABLED;
2279                 brcmf_dbg(CONN, "WLAN_CIPHER_SUITE_WEP40\n");
2280                 break;
2281         case WLAN_CIPHER_SUITE_WEP104:
2282                 key->algo = CRYPTO_ALGO_WEP128;
2283                 val = WEP_ENABLED;
2284                 brcmf_dbg(CONN, "WLAN_CIPHER_SUITE_WEP104\n");
2285                 break;
2286         case WLAN_CIPHER_SUITE_TKIP:
2287                 if (!brcmf_is_apmode(ifp->vif)) {
2288                         brcmf_dbg(CONN, "Swapping RX/TX MIC key\n");
2289                         memcpy(keybuf, &key->data[24], sizeof(keybuf));
2290                         memcpy(&key->data[24], &key->data[16], sizeof(keybuf));
2291                         memcpy(&key->data[16], keybuf, sizeof(keybuf));
2292                 }
2293                 key->algo = CRYPTO_ALGO_TKIP;
2294                 val = TKIP_ENABLED;
2295                 brcmf_dbg(CONN, "WLAN_CIPHER_SUITE_TKIP\n");
2296                 break;
2297         case WLAN_CIPHER_SUITE_AES_CMAC:
2298                 key->algo = CRYPTO_ALGO_AES_CCM;
2299                 val = AES_ENABLED;
2300                 brcmf_dbg(CONN, "WLAN_CIPHER_SUITE_AES_CMAC\n");
2301                 break;
2302         case WLAN_CIPHER_SUITE_CCMP:
2303                 key->algo = CRYPTO_ALGO_AES_CCM;
2304                 val = AES_ENABLED;
2305                 brcmf_dbg(CONN, "WLAN_CIPHER_SUITE_CCMP\n");
2306                 break;
2307         default:
2308                 brcmf_err("Invalid cipher (0x%x)\n", params->cipher);
2309                 err = -EINVAL;
2310                 goto done;
2311         }
2312
2313         err = send_key_to_dongle(ifp, key);
2314         if (ext_key || err)
2315                 goto done;
2316
2317         err = brcmf_fil_bsscfg_int_get(ifp, "wsec", &wsec);
2318         if (err) {
2319                 brcmf_err("get wsec error (%d)\n", err);
2320                 goto done;
2321         }
2322         wsec |= val;
2323         err = brcmf_fil_bsscfg_int_set(ifp, "wsec", wsec);
2324         if (err) {
2325                 brcmf_err("set wsec error (%d)\n", err);
2326                 goto done;
2327         }
2328
2329 done:
2330         brcmf_dbg(TRACE, "Exit\n");
2331         return err;
2332 }
2333
2334 static s32
2335 brcmf_cfg80211_get_key(struct wiphy *wiphy, struct net_device *ndev, u8 key_idx,
2336                        bool pairwise, const u8 *mac_addr, void *cookie,
2337                        void (*callback)(void *cookie,
2338                                         struct key_params *params))
2339 {
2340         struct key_params params;
2341         struct brcmf_if *ifp = netdev_priv(ndev);
2342         struct brcmf_cfg80211_profile *profile = &ifp->vif->profile;
2343         struct brcmf_cfg80211_security *sec;
2344         s32 wsec;
2345         s32 err = 0;
2346
2347         brcmf_dbg(TRACE, "Enter\n");
2348         brcmf_dbg(CONN, "key index (%d)\n", key_idx);
2349         if (!check_vif_up(ifp->vif))
2350                 return -EIO;
2351
2352         memset(&params, 0, sizeof(params));
2353
2354         err = brcmf_fil_bsscfg_int_get(ifp, "wsec", &wsec);
2355         if (err) {
2356                 brcmf_err("WLC_GET_WSEC error (%d)\n", err);
2357                 /* Ignore this error, may happen during DISASSOC */
2358                 err = -EAGAIN;
2359                 goto done;
2360         }
2361         if (wsec & WEP_ENABLED) {
2362                 sec = &profile->sec;
2363                 if (sec->cipher_pairwise & WLAN_CIPHER_SUITE_WEP40) {
2364                         params.cipher = WLAN_CIPHER_SUITE_WEP40;
2365                         brcmf_dbg(CONN, "WLAN_CIPHER_SUITE_WEP40\n");
2366                 } else if (sec->cipher_pairwise & WLAN_CIPHER_SUITE_WEP104) {
2367                         params.cipher = WLAN_CIPHER_SUITE_WEP104;
2368                         brcmf_dbg(CONN, "WLAN_CIPHER_SUITE_WEP104\n");
2369                 }
2370         } else if (wsec & TKIP_ENABLED) {
2371                 params.cipher = WLAN_CIPHER_SUITE_TKIP;
2372                 brcmf_dbg(CONN, "WLAN_CIPHER_SUITE_TKIP\n");
2373         } else if (wsec & AES_ENABLED) {
2374                 params.cipher = WLAN_CIPHER_SUITE_AES_CMAC;
2375                 brcmf_dbg(CONN, "WLAN_CIPHER_SUITE_AES_CMAC\n");
2376         } else  {
2377                 brcmf_err("Invalid algo (0x%x)\n", wsec);
2378                 err = -EINVAL;
2379                 goto done;
2380         }
2381         callback(cookie, &params);
2382
2383 done:
2384         brcmf_dbg(TRACE, "Exit\n");
2385         return err;
2386 }
2387
2388 static s32
2389 brcmf_cfg80211_config_default_mgmt_key(struct wiphy *wiphy,
2390                                        struct net_device *ndev, u8 key_idx)
2391 {
2392         struct brcmf_if *ifp = netdev_priv(ndev);
2393
2394         brcmf_dbg(TRACE, "Enter key_idx %d\n", key_idx);
2395
2396         if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MFP))
2397                 return 0;
2398
2399         brcmf_dbg(INFO, "Not supported\n");
2400
2401         return -EOPNOTSUPP;
2402 }
2403
2404 static void
2405 brcmf_cfg80211_reconfigure_wep(struct brcmf_if *ifp)
2406 {
2407         s32 err;
2408         u8 key_idx;
2409         struct brcmf_wsec_key *key;
2410         s32 wsec;
2411
2412         for (key_idx = 0; key_idx < BRCMF_MAX_DEFAULT_KEYS; key_idx++) {
2413                 key = &ifp->vif->profile.key[key_idx];
2414                 if ((key->algo == CRYPTO_ALGO_WEP1) ||
2415                     (key->algo == CRYPTO_ALGO_WEP128))
2416                         break;
2417         }
2418         if (key_idx == BRCMF_MAX_DEFAULT_KEYS)
2419                 return;
2420
2421         err = send_key_to_dongle(ifp, key);
2422         if (err) {
2423                 brcmf_err("Setting WEP key failed (%d)\n", err);
2424                 return;
2425         }
2426         err = brcmf_fil_bsscfg_int_get(ifp, "wsec", &wsec);
2427         if (err) {
2428                 brcmf_err("get wsec error (%d)\n", err);
2429                 return;
2430         }
2431         wsec |= WEP_ENABLED;
2432         err = brcmf_fil_bsscfg_int_set(ifp, "wsec", wsec);
2433         if (err)
2434                 brcmf_err("set wsec error (%d)\n", err);
2435 }
2436
2437 static void brcmf_convert_sta_flags(u32 fw_sta_flags, struct station_info *si)
2438 {
2439         struct nl80211_sta_flag_update *sfu;
2440
2441         brcmf_dbg(TRACE, "flags %08x\n", fw_sta_flags);
2442         si->filled |= BIT(NL80211_STA_INFO_STA_FLAGS);
2443         sfu = &si->sta_flags;
2444         sfu->mask = BIT(NL80211_STA_FLAG_WME) |
2445                     BIT(NL80211_STA_FLAG_AUTHENTICATED) |
2446                     BIT(NL80211_STA_FLAG_ASSOCIATED) |
2447                     BIT(NL80211_STA_FLAG_AUTHORIZED);
2448         if (fw_sta_flags & BRCMF_STA_WME)
2449                 sfu->set |= BIT(NL80211_STA_FLAG_WME);
2450         if (fw_sta_flags & BRCMF_STA_AUTHE)
2451                 sfu->set |= BIT(NL80211_STA_FLAG_AUTHENTICATED);
2452         if (fw_sta_flags & BRCMF_STA_ASSOC)
2453                 sfu->set |= BIT(NL80211_STA_FLAG_ASSOCIATED);
2454         if (fw_sta_flags & BRCMF_STA_AUTHO)
2455                 sfu->set |= BIT(NL80211_STA_FLAG_AUTHORIZED);
2456 }
2457
2458 static void brcmf_fill_bss_param(struct brcmf_if *ifp, struct station_info *si)
2459 {
2460         struct {
2461                 __le32 len;
2462                 struct brcmf_bss_info_le bss_le;
2463         } *buf;
2464         u16 capability;
2465         int err;
2466
2467         buf = kzalloc(WL_BSS_INFO_MAX, GFP_KERNEL);
2468         if (!buf)
2469                 return;
2470
2471         buf->len = cpu_to_le32(WL_BSS_INFO_MAX);
2472         err = brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_BSS_INFO, buf,
2473                                      WL_BSS_INFO_MAX);
2474         if (err) {
2475                 brcmf_err("Failed to get bss info (%d)\n", err);
2476                 return;
2477         }
2478         si->filled |= BIT(NL80211_STA_INFO_BSS_PARAM);
2479         si->bss_param.beacon_interval = le16_to_cpu(buf->bss_le.beacon_period);
2480         si->bss_param.dtim_period = buf->bss_le.dtim_period;
2481         capability = le16_to_cpu(buf->bss_le.capability);
2482         if (capability & IEEE80211_HT_STBC_PARAM_DUAL_CTS_PROT)
2483                 si->bss_param.flags |= BSS_PARAM_FLAGS_CTS_PROT;
2484         if (capability & WLAN_CAPABILITY_SHORT_PREAMBLE)
2485                 si->bss_param.flags |= BSS_PARAM_FLAGS_SHORT_PREAMBLE;
2486         if (capability & WLAN_CAPABILITY_SHORT_SLOT_TIME)
2487                 si->bss_param.flags |= BSS_PARAM_FLAGS_SHORT_SLOT_TIME;
2488 }
2489
2490 static s32
2491 brcmf_cfg80211_get_station_ibss(struct brcmf_if *ifp,
2492                                 struct station_info *sinfo)
2493 {
2494         struct brcmf_scb_val_le scbval;
2495         struct brcmf_pktcnt_le pktcnt;
2496         s32 err;
2497         u32 rate;
2498         u32 rssi;
2499
2500         /* Get the current tx rate */
2501         err = brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_RATE, &rate);
2502         if (err < 0) {
2503                 brcmf_err("BRCMF_C_GET_RATE error (%d)\n", err);
2504                 return err;
2505         }
2506         sinfo->filled |= BIT(NL80211_STA_INFO_TX_BITRATE);
2507         sinfo->txrate.legacy = rate * 5;
2508
2509         memset(&scbval, 0, sizeof(scbval));
2510         err = brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_RSSI, &scbval,
2511                                      sizeof(scbval));
2512         if (err) {
2513                 brcmf_err("BRCMF_C_GET_RSSI error (%d)\n", err);
2514                 return err;
2515         }
2516         rssi = le32_to_cpu(scbval.val);
2517         sinfo->filled |= BIT(NL80211_STA_INFO_SIGNAL);
2518         sinfo->signal = rssi;
2519
2520         err = brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_GET_PKTCNTS, &pktcnt,
2521                                      sizeof(pktcnt));
2522         if (err) {
2523                 brcmf_err("BRCMF_C_GET_GET_PKTCNTS error (%d)\n", err);
2524                 return err;
2525         }
2526         sinfo->filled |= BIT(NL80211_STA_INFO_RX_PACKETS) |
2527                          BIT(NL80211_STA_INFO_RX_DROP_MISC) |
2528                          BIT(NL80211_STA_INFO_TX_PACKETS) |
2529                          BIT(NL80211_STA_INFO_TX_FAILED);
2530         sinfo->rx_packets = le32_to_cpu(pktcnt.rx_good_pkt);
2531         sinfo->rx_dropped_misc = le32_to_cpu(pktcnt.rx_bad_pkt);
2532         sinfo->tx_packets = le32_to_cpu(pktcnt.tx_good_pkt);
2533         sinfo->tx_failed  = le32_to_cpu(pktcnt.tx_bad_pkt);
2534
2535         return 0;
2536 }
2537
2538 static s32
2539 brcmf_cfg80211_get_station(struct wiphy *wiphy, struct net_device *ndev,
2540                            const u8 *mac, struct station_info *sinfo)
2541 {
2542         struct brcmf_if *ifp = netdev_priv(ndev);
2543         struct brcmf_scb_val_le scb_val;
2544         s32 err = 0;
2545         struct brcmf_sta_info_le sta_info_le;
2546         u32 sta_flags;
2547         u32 is_tdls_peer;
2548         s32 total_rssi;
2549         s32 count_rssi;
2550         int rssi;
2551         u32 i;
2552
2553         brcmf_dbg(TRACE, "Enter, MAC %pM\n", mac);
2554         if (!check_vif_up(ifp->vif))
2555                 return -EIO;
2556
2557         if (brcmf_is_ibssmode(ifp->vif))
2558                 return brcmf_cfg80211_get_station_ibss(ifp, sinfo);
2559
2560         memset(&sta_info_le, 0, sizeof(sta_info_le));
2561         memcpy(&sta_info_le, mac, ETH_ALEN);
2562         err = brcmf_fil_iovar_data_get(ifp, "tdls_sta_info",
2563                                        &sta_info_le,
2564                                        sizeof(sta_info_le));
2565         is_tdls_peer = !err;
2566         if (err) {
2567                 err = brcmf_fil_iovar_data_get(ifp, "sta_info",
2568                                                &sta_info_le,
2569                                                sizeof(sta_info_le));
2570                 if (err < 0) {
2571                         brcmf_err("GET STA INFO failed, %d\n", err);
2572                         goto done;
2573                 }
2574         }
2575         brcmf_dbg(TRACE, "version %d\n", le16_to_cpu(sta_info_le.ver));
2576         sinfo->filled = BIT(NL80211_STA_INFO_INACTIVE_TIME);
2577         sinfo->inactive_time = le32_to_cpu(sta_info_le.idle) * 1000;
2578         sta_flags = le32_to_cpu(sta_info_le.flags);
2579         brcmf_convert_sta_flags(sta_flags, sinfo);
2580         sinfo->sta_flags.mask |= BIT(NL80211_STA_FLAG_TDLS_PEER);
2581         if (is_tdls_peer)
2582                 sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_TDLS_PEER);
2583         else
2584                 sinfo->sta_flags.set &= ~BIT(NL80211_STA_FLAG_TDLS_PEER);
2585         if (sta_flags & BRCMF_STA_ASSOC) {
2586                 sinfo->filled |= BIT(NL80211_STA_INFO_CONNECTED_TIME);
2587                 sinfo->connected_time = le32_to_cpu(sta_info_le.in);
2588                 brcmf_fill_bss_param(ifp, sinfo);
2589         }
2590         if (sta_flags & BRCMF_STA_SCBSTATS) {
2591                 sinfo->filled |= BIT(NL80211_STA_INFO_TX_FAILED);
2592                 sinfo->tx_failed = le32_to_cpu(sta_info_le.tx_failures);
2593                 sinfo->filled |= BIT(NL80211_STA_INFO_TX_PACKETS);
2594                 sinfo->tx_packets = le32_to_cpu(sta_info_le.tx_pkts);
2595                 sinfo->tx_packets += le32_to_cpu(sta_info_le.tx_mcast_pkts);
2596                 sinfo->filled |= BIT(NL80211_STA_INFO_RX_PACKETS);
2597                 sinfo->rx_packets = le32_to_cpu(sta_info_le.rx_ucast_pkts);
2598                 sinfo->rx_packets += le32_to_cpu(sta_info_le.rx_mcast_pkts);
2599                 if (sinfo->tx_packets) {
2600                         sinfo->filled |= BIT(NL80211_STA_INFO_TX_BITRATE);
2601                         sinfo->txrate.legacy =
2602                                 le32_to_cpu(sta_info_le.tx_rate) / 100;
2603                 }
2604                 if (sinfo->rx_packets) {
2605                         sinfo->filled |= BIT(NL80211_STA_INFO_RX_BITRATE);
2606                         sinfo->rxrate.legacy =
2607                                 le32_to_cpu(sta_info_le.rx_rate) / 100;
2608                 }
2609                 if (le16_to_cpu(sta_info_le.ver) >= 4) {
2610                         sinfo->filled |= BIT(NL80211_STA_INFO_TX_BYTES);
2611                         sinfo->tx_bytes = le64_to_cpu(sta_info_le.tx_tot_bytes);
2612                         sinfo->filled |= BIT(NL80211_STA_INFO_RX_BYTES);
2613                         sinfo->rx_bytes = le64_to_cpu(sta_info_le.rx_tot_bytes);
2614                 }
2615                 total_rssi = 0;
2616                 count_rssi = 0;
2617                 for (i = 0; i < BRCMF_ANT_MAX; i++) {
2618                         if (sta_info_le.rssi[i]) {
2619                                 sinfo->chain_signal_avg[count_rssi] =
2620                                         sta_info_le.rssi[i];
2621                                 sinfo->chain_signal[count_rssi] =
2622                                         sta_info_le.rssi[i];
2623                                 total_rssi += sta_info_le.rssi[i];
2624                                 count_rssi++;
2625                         }
2626                 }
2627                 if (count_rssi) {
2628                         sinfo->filled |= BIT(NL80211_STA_INFO_CHAIN_SIGNAL);
2629                         sinfo->chains = count_rssi;
2630
2631                         sinfo->filled |= BIT(NL80211_STA_INFO_SIGNAL);
2632                         total_rssi /= count_rssi;
2633                         sinfo->signal = total_rssi;
2634                 } else if (test_bit(BRCMF_VIF_STATUS_CONNECTED,
2635                         &ifp->vif->sme_state)) {
2636                         memset(&scb_val, 0, sizeof(scb_val));
2637                         err = brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_RSSI,
2638                                                      &scb_val, sizeof(scb_val));
2639                         if (err) {
2640                                 brcmf_err("Could not get rssi (%d)\n", err);
2641                                 goto done;
2642                         } else {
2643                                 rssi = le32_to_cpu(scb_val.val);
2644                                 sinfo->filled |= BIT(NL80211_STA_INFO_SIGNAL);
2645                                 sinfo->signal = rssi;
2646                                 brcmf_dbg(CONN, "RSSI %d dBm\n", rssi);
2647                         }
2648                 }
2649         }
2650 done:
2651         brcmf_dbg(TRACE, "Exit\n");
2652         return err;
2653 }
2654
2655 static int
2656 brcmf_cfg80211_dump_station(struct wiphy *wiphy, struct net_device *ndev,
2657                             int idx, u8 *mac, struct station_info *sinfo)
2658 {
2659         struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
2660         struct brcmf_if *ifp = netdev_priv(ndev);
2661         s32 err;
2662
2663         brcmf_dbg(TRACE, "Enter, idx %d\n", idx);
2664
2665         if (idx == 0) {
2666                 cfg->assoclist.count = cpu_to_le32(BRCMF_MAX_ASSOCLIST);
2667                 err = brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_ASSOCLIST,
2668                                              &cfg->assoclist,
2669                                              sizeof(cfg->assoclist));
2670                 if (err) {
2671                         brcmf_err("BRCMF_C_GET_ASSOCLIST unsupported, err=%d\n",
2672                                   err);
2673                         cfg->assoclist.count = 0;
2674                         return -EOPNOTSUPP;
2675                 }
2676         }
2677         if (idx < le32_to_cpu(cfg->assoclist.count)) {
2678                 memcpy(mac, cfg->assoclist.mac[idx], ETH_ALEN);
2679                 return brcmf_cfg80211_get_station(wiphy, ndev, mac, sinfo);
2680         }
2681         return -ENOENT;
2682 }
2683
2684 static s32
2685 brcmf_cfg80211_set_power_mgmt(struct wiphy *wiphy, struct net_device *ndev,
2686                            bool enabled, s32 timeout)
2687 {
2688         s32 pm;
2689         s32 err = 0;
2690         struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
2691         struct brcmf_if *ifp = netdev_priv(ndev);
2692
2693         brcmf_dbg(TRACE, "Enter\n");
2694
2695         /*
2696          * Powersave enable/disable request is coming from the
2697          * cfg80211 even before the interface is up. In that
2698          * scenario, driver will be storing the power save
2699          * preference in cfg struct to apply this to
2700          * FW later while initializing the dongle
2701          */
2702         cfg->pwr_save = enabled;
2703         if (!check_vif_up(ifp->vif)) {
2704
2705                 brcmf_dbg(INFO, "Device is not ready, storing the value in cfg_info struct\n");
2706                 goto done;
2707         }
2708
2709         pm = enabled ? PM_FAST : PM_OFF;
2710         /* Do not enable the power save after assoc if it is a p2p interface */
2711         if (ifp->vif->wdev.iftype == NL80211_IFTYPE_P2P_CLIENT) {
2712                 brcmf_dbg(INFO, "Do not enable power save for P2P clients\n");
2713                 pm = PM_OFF;
2714         }
2715         brcmf_dbg(INFO, "power save %s\n", (pm ? "enabled" : "disabled"));
2716
2717         err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_PM, pm);
2718         if (err) {
2719                 if (err == -ENODEV)
2720                         brcmf_err("net_device is not ready yet\n");
2721                 else
2722                         brcmf_err("error (%d)\n", err);
2723         }
2724 done:
2725         brcmf_dbg(TRACE, "Exit\n");
2726         return err;
2727 }
2728
2729 static s32 brcmf_inform_single_bss(struct brcmf_cfg80211_info *cfg,
2730                                    struct brcmf_bss_info_le *bi)
2731 {
2732         struct wiphy *wiphy = cfg_to_wiphy(cfg);
2733         struct ieee80211_channel *notify_channel;
2734         struct cfg80211_bss *bss;
2735         struct ieee80211_supported_band *band;
2736         struct brcmu_chan ch;
2737         u16 channel;
2738         u32 freq;
2739         u16 notify_capability;
2740         u16 notify_interval;
2741         u8 *notify_ie;
2742         size_t notify_ielen;
2743         s32 notify_signal;
2744
2745         if (le32_to_cpu(bi->length) > WL_BSS_INFO_MAX) {
2746                 brcmf_err("Bss info is larger than buffer. Discarding\n");
2747                 return 0;
2748         }
2749
2750         if (!bi->ctl_ch) {
2751                 ch.chspec = le16_to_cpu(bi->chanspec);
2752                 cfg->d11inf.decchspec(&ch);
2753                 bi->ctl_ch = ch.chnum;
2754         }
2755         channel = bi->ctl_ch;
2756
2757         if (channel <= CH_MAX_2G_CHANNEL)
2758                 band = wiphy->bands[NL80211_BAND_2GHZ];
2759         else
2760                 band = wiphy->bands[NL80211_BAND_5GHZ];
2761
2762         freq = ieee80211_channel_to_frequency(channel, band->band);
2763         notify_channel = ieee80211_get_channel(wiphy, freq);
2764
2765         notify_capability = le16_to_cpu(bi->capability);
2766         notify_interval = le16_to_cpu(bi->beacon_period);
2767         notify_ie = (u8 *)bi + le16_to_cpu(bi->ie_offset);
2768         notify_ielen = le32_to_cpu(bi->ie_length);
2769         notify_signal = (s16)le16_to_cpu(bi->RSSI) * 100;
2770
2771         brcmf_dbg(CONN, "bssid: %pM\n", bi->BSSID);
2772         brcmf_dbg(CONN, "Channel: %d(%d)\n", channel, freq);
2773         brcmf_dbg(CONN, "Capability: %X\n", notify_capability);
2774         brcmf_dbg(CONN, "Beacon interval: %d\n", notify_interval);
2775         brcmf_dbg(CONN, "Signal: %d\n", notify_signal);
2776
2777         bss = cfg80211_inform_bss(wiphy, notify_channel,
2778                                   CFG80211_BSS_FTYPE_UNKNOWN,
2779                                   (const u8 *)bi->BSSID,
2780                                   0, notify_capability,
2781                                   notify_interval, notify_ie,
2782                                   notify_ielen, notify_signal,
2783                                   GFP_KERNEL);
2784
2785         if (!bss)
2786                 return -ENOMEM;
2787
2788         cfg80211_put_bss(wiphy, bss);
2789
2790         return 0;
2791 }
2792
2793 static struct brcmf_bss_info_le *
2794 next_bss_le(struct brcmf_scan_results *list, struct brcmf_bss_info_le *bss)
2795 {
2796         if (bss == NULL)
2797                 return list->bss_info_le;
2798         return (struct brcmf_bss_info_le *)((unsigned long)bss +
2799                                             le32_to_cpu(bss->length));
2800 }
2801
2802 static s32 brcmf_inform_bss(struct brcmf_cfg80211_info *cfg)
2803 {
2804         struct brcmf_scan_results *bss_list;
2805         struct brcmf_bss_info_le *bi = NULL;    /* must be initialized */
2806         s32 err = 0;
2807         int i;
2808
2809         bss_list = (struct brcmf_scan_results *)cfg->escan_info.escan_buf;
2810         if (bss_list->count != 0 &&
2811             bss_list->version != BRCMF_BSS_INFO_VERSION) {
2812                 brcmf_err("Version %d != WL_BSS_INFO_VERSION\n",
2813                           bss_list->version);
2814                 return -EOPNOTSUPP;
2815         }
2816         brcmf_dbg(SCAN, "scanned AP count (%d)\n", bss_list->count);
2817         for (i = 0; i < bss_list->count; i++) {
2818                 bi = next_bss_le(bss_list, bi);
2819                 err = brcmf_inform_single_bss(cfg, bi);
2820                 if (err)
2821                         break;
2822         }
2823         return err;
2824 }
2825
2826 static s32 brcmf_inform_ibss(struct brcmf_cfg80211_info *cfg,
2827                              struct net_device *ndev, const u8 *bssid)
2828 {
2829         struct wiphy *wiphy = cfg_to_wiphy(cfg);
2830         struct ieee80211_channel *notify_channel;
2831         struct brcmf_bss_info_le *bi = NULL;
2832         struct ieee80211_supported_band *band;
2833         struct cfg80211_bss *bss;
2834         struct brcmu_chan ch;
2835         u8 *buf = NULL;
2836         s32 err = 0;
2837         u32 freq;
2838         u16 notify_capability;
2839         u16 notify_interval;
2840         u8 *notify_ie;
2841         size_t notify_ielen;
2842         s32 notify_signal;
2843
2844         brcmf_dbg(TRACE, "Enter\n");
2845
2846         buf = kzalloc(WL_BSS_INFO_MAX, GFP_KERNEL);
2847         if (buf == NULL) {
2848                 err = -ENOMEM;
2849                 goto CleanUp;
2850         }
2851
2852         *(__le32 *)buf = cpu_to_le32(WL_BSS_INFO_MAX);
2853
2854         err = brcmf_fil_cmd_data_get(netdev_priv(ndev), BRCMF_C_GET_BSS_INFO,
2855                                      buf, WL_BSS_INFO_MAX);
2856         if (err) {
2857                 brcmf_err("WLC_GET_BSS_INFO failed: %d\n", err);
2858                 goto CleanUp;
2859         }
2860
2861         bi = (struct brcmf_bss_info_le *)(buf + 4);
2862
2863         ch.chspec = le16_to_cpu(bi->chanspec);
2864         cfg->d11inf.decchspec(&ch);
2865
2866         if (ch.band == BRCMU_CHAN_BAND_2G)
2867                 band = wiphy->bands[NL80211_BAND_2GHZ];
2868         else
2869                 band = wiphy->bands[NL80211_BAND_5GHZ];
2870
2871         freq = ieee80211_channel_to_frequency(ch.chnum, band->band);
2872         cfg->channel = freq;
2873         notify_channel = ieee80211_get_channel(wiphy, freq);
2874
2875         notify_capability = le16_to_cpu(bi->capability);
2876         notify_interval = le16_to_cpu(bi->beacon_period);
2877         notify_ie = (u8 *)bi + le16_to_cpu(bi->ie_offset);
2878         notify_ielen = le32_to_cpu(bi->ie_length);
2879         notify_signal = (s16)le16_to_cpu(bi->RSSI) * 100;
2880
2881         brcmf_dbg(CONN, "channel: %d(%d)\n", ch.chnum, freq);
2882         brcmf_dbg(CONN, "capability: %X\n", notify_capability);
2883         brcmf_dbg(CONN, "beacon interval: %d\n", notify_interval);
2884         brcmf_dbg(CONN, "signal: %d\n", notify_signal);
2885
2886         bss = cfg80211_inform_bss(wiphy, notify_channel,
2887                                   CFG80211_BSS_FTYPE_UNKNOWN, bssid, 0,
2888                                   notify_capability, notify_interval,
2889                                   notify_ie, notify_ielen, notify_signal,
2890                                   GFP_KERNEL);
2891
2892         if (!bss) {
2893                 err = -ENOMEM;
2894                 goto CleanUp;
2895         }
2896
2897         cfg80211_put_bss(wiphy, bss);
2898
2899 CleanUp:
2900
2901         kfree(buf);
2902
2903         brcmf_dbg(TRACE, "Exit\n");
2904
2905         return err;
2906 }
2907
2908 static s32 brcmf_update_bss_info(struct brcmf_cfg80211_info *cfg,
2909                                  struct brcmf_if *ifp)
2910 {
2911         struct brcmf_bss_info_le *bi;
2912         const struct brcmf_tlv *tim;
2913         u16 beacon_interval;
2914         u8 dtim_period;
2915         size_t ie_len;
2916         u8 *ie;
2917         s32 err = 0;
2918
2919         brcmf_dbg(TRACE, "Enter\n");
2920         if (brcmf_is_ibssmode(ifp->vif))
2921                 return err;
2922
2923         *(__le32 *)cfg->extra_buf = cpu_to_le32(WL_EXTRA_BUF_MAX);
2924         err = brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_BSS_INFO,
2925                                      cfg->extra_buf, WL_EXTRA_BUF_MAX);
2926         if (err) {
2927                 brcmf_err("Could not get bss info %d\n", err);
2928                 goto update_bss_info_out;
2929         }
2930
2931         bi = (struct brcmf_bss_info_le *)(cfg->extra_buf + 4);
2932         err = brcmf_inform_single_bss(cfg, bi);
2933         if (err)
2934                 goto update_bss_info_out;
2935
2936         ie = ((u8 *)bi) + le16_to_cpu(bi->ie_offset);
2937         ie_len = le32_to_cpu(bi->ie_length);
2938         beacon_interval = le16_to_cpu(bi->beacon_period);
2939
2940         tim = brcmf_parse_tlvs(ie, ie_len, WLAN_EID_TIM);
2941         if (tim)
2942                 dtim_period = tim->data[1];
2943         else {
2944                 /*
2945                 * active scan was done so we could not get dtim
2946                 * information out of probe response.
2947                 * so we speficially query dtim information to dongle.
2948                 */
2949                 u32 var;
2950                 err = brcmf_fil_iovar_int_get(ifp, "dtim_assoc", &var);
2951                 if (err) {
2952                         brcmf_err("wl dtim_assoc failed (%d)\n", err);
2953                         goto update_bss_info_out;
2954                 }
2955                 dtim_period = (u8)var;
2956         }
2957
2958 update_bss_info_out:
2959         brcmf_dbg(TRACE, "Exit");
2960         return err;
2961 }
2962
2963 void brcmf_abort_scanning(struct brcmf_cfg80211_info *cfg)
2964 {
2965         struct escan_info *escan = &cfg->escan_info;
2966
2967         set_bit(BRCMF_SCAN_STATUS_ABORT, &cfg->scan_status);
2968         if (cfg->scan_request) {
2969                 escan->escan_state = WL_ESCAN_STATE_IDLE;
2970                 brcmf_notify_escan_complete(cfg, escan->ifp, true, true);
2971         }
2972         clear_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status);
2973         clear_bit(BRCMF_SCAN_STATUS_ABORT, &cfg->scan_status);
2974 }
2975
2976 static void brcmf_cfg80211_escan_timeout_worker(struct work_struct *work)
2977 {
2978         struct brcmf_cfg80211_info *cfg =
2979                         container_of(work, struct brcmf_cfg80211_info,
2980                                      escan_timeout_work);
2981
2982         brcmf_inform_bss(cfg);
2983         brcmf_notify_escan_complete(cfg, cfg->escan_info.ifp, true, true);
2984 }
2985
2986 static void brcmf_escan_timeout(unsigned long data)
2987 {
2988         struct brcmf_cfg80211_info *cfg =
2989                         (struct brcmf_cfg80211_info *)data;
2990
2991         if (cfg->scan_request) {
2992                 brcmf_err("timer expired\n");
2993                 schedule_work(&cfg->escan_timeout_work);
2994         }
2995 }
2996
2997 static s32
2998 brcmf_compare_update_same_bss(struct brcmf_cfg80211_info *cfg,
2999                               struct brcmf_bss_info_le *bss,
3000                               struct brcmf_bss_info_le *bss_info_le)
3001 {
3002         struct brcmu_chan ch_bss, ch_bss_info_le;
3003
3004         ch_bss.chspec = le16_to_cpu(bss->chanspec);
3005         cfg->d11inf.decchspec(&ch_bss);
3006         ch_bss_info_le.chspec = le16_to_cpu(bss_info_le->chanspec);
3007         cfg->d11inf.decchspec(&ch_bss_info_le);
3008
3009         if (!memcmp(&bss_info_le->BSSID, &bss->BSSID, ETH_ALEN) &&
3010                 ch_bss.band == ch_bss_info_le.band &&
3011                 bss_info_le->SSID_len == bss->SSID_len &&
3012                 !memcmp(bss_info_le->SSID, bss->SSID, bss_info_le->SSID_len)) {
3013                 if ((bss->flags & BRCMF_BSS_RSSI_ON_CHANNEL) ==
3014                         (bss_info_le->flags & BRCMF_BSS_RSSI_ON_CHANNEL)) {
3015                         s16 bss_rssi = le16_to_cpu(bss->RSSI);
3016                         s16 bss_info_rssi = le16_to_cpu(bss_info_le->RSSI);
3017
3018                         /* preserve max RSSI if the measurements are
3019                         * both on-channel or both off-channel
3020                         */
3021                         if (bss_info_rssi > bss_rssi)
3022                                 bss->RSSI = bss_info_le->RSSI;
3023                 } else if ((bss->flags & BRCMF_BSS_RSSI_ON_CHANNEL) &&
3024                         (bss_info_le->flags & BRCMF_BSS_RSSI_ON_CHANNEL) == 0) {
3025                         /* preserve the on-channel rssi measurement
3026                         * if the new measurement is off channel
3027                         */
3028                         bss->RSSI = bss_info_le->RSSI;
3029                         bss->flags |= BRCMF_BSS_RSSI_ON_CHANNEL;
3030                 }
3031                 return 1;
3032         }
3033         return 0;
3034 }
3035
3036 static s32
3037 brcmf_cfg80211_escan_handler(struct brcmf_if *ifp,
3038                              const struct brcmf_event_msg *e, void *data)
3039 {
3040         struct brcmf_cfg80211_info *cfg = ifp->drvr->config;
3041         s32 status;
3042         struct brcmf_escan_result_le *escan_result_le;
3043         struct brcmf_bss_info_le *bss_info_le;
3044         struct brcmf_bss_info_le *bss = NULL;
3045         u32 bi_length;
3046         struct brcmf_scan_results *list;
3047         u32 i;
3048         bool aborted;
3049
3050         status = e->status;
3051
3052         if (!test_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status)) {
3053                 brcmf_err("scan not ready, bsscfgidx=%d\n", ifp->bsscfgidx);
3054                 return -EPERM;
3055         }
3056
3057         if (status == BRCMF_E_STATUS_PARTIAL) {
3058                 brcmf_dbg(SCAN, "ESCAN Partial result\n");
3059                 escan_result_le = (struct brcmf_escan_result_le *) data;
3060                 if (!escan_result_le) {
3061                         brcmf_err("Invalid escan result (NULL pointer)\n");
3062                         goto exit;
3063                 }
3064                 if (le16_to_cpu(escan_result_le->bss_count) != 1) {
3065                         brcmf_err("Invalid bss_count %d: ignoring\n",
3066                                   escan_result_le->bss_count);
3067                         goto exit;
3068                 }
3069                 bss_info_le = &escan_result_le->bss_info_le;
3070
3071                 if (brcmf_p2p_scan_finding_common_channel(cfg, bss_info_le))
3072                         goto exit;
3073
3074                 if (!cfg->scan_request) {
3075                         brcmf_dbg(SCAN, "result without cfg80211 request\n");
3076                         goto exit;
3077                 }
3078
3079                 bi_length = le32_to_cpu(bss_info_le->length);
3080                 if (bi_length != (le32_to_cpu(escan_result_le->buflen) -
3081                                         WL_ESCAN_RESULTS_FIXED_SIZE)) {
3082                         brcmf_err("Invalid bss_info length %d: ignoring\n",
3083                                   bi_length);
3084                         goto exit;
3085                 }
3086
3087                 if (!(cfg_to_wiphy(cfg)->interface_modes &
3088                                         BIT(NL80211_IFTYPE_ADHOC))) {
3089                         if (le16_to_cpu(bss_info_le->capability) &
3090                                                 WLAN_CAPABILITY_IBSS) {
3091                                 brcmf_err("Ignoring IBSS result\n");
3092                                 goto exit;
3093                         }
3094                 }
3095
3096                 list = (struct brcmf_scan_results *)
3097                                 cfg->escan_info.escan_buf;
3098                 if (bi_length > BRCMF_ESCAN_BUF_SIZE - list->buflen) {
3099                         brcmf_err("Buffer is too small: ignoring\n");
3100                         goto exit;
3101                 }
3102
3103                 for (i = 0; i < list->count; i++) {
3104                         bss = bss ? (struct brcmf_bss_info_le *)
3105                                 ((unsigned char *)bss +
3106                                 le32_to_cpu(bss->length)) : list->bss_info_le;
3107                         if (brcmf_compare_update_same_bss(cfg, bss,
3108                                                           bss_info_le))
3109                                 goto exit;
3110                 }
3111                 memcpy(&cfg->escan_info.escan_buf[list->buflen], bss_info_le,
3112                        bi_length);
3113                 list->version = le32_to_cpu(bss_info_le->version);
3114                 list->buflen += bi_length;
3115                 list->count++;
3116         } else {
3117                 cfg->escan_info.escan_state = WL_ESCAN_STATE_IDLE;
3118                 if (brcmf_p2p_scan_finding_common_channel(cfg, NULL))
3119                         goto exit;
3120                 if (cfg->scan_request) {
3121                         brcmf_inform_bss(cfg);
3122                         aborted = status != BRCMF_E_STATUS_SUCCESS;
3123                         brcmf_notify_escan_complete(cfg, ifp, aborted, false);
3124                 } else
3125                         brcmf_dbg(SCAN, "Ignored scan complete result 0x%x\n",
3126                                   status);
3127         }
3128 exit:
3129         return 0;
3130 }
3131
3132 static void brcmf_init_escan(struct brcmf_cfg80211_info *cfg)
3133 {
3134         brcmf_fweh_register(cfg->pub, BRCMF_E_ESCAN_RESULT,
3135                             brcmf_cfg80211_escan_handler);
3136         cfg->escan_info.escan_state = WL_ESCAN_STATE_IDLE;
3137         /* Init scan_timeout timer */
3138         init_timer(&cfg->escan_timeout);
3139         cfg->escan_timeout.data = (unsigned long) cfg;
3140         cfg->escan_timeout.function = brcmf_escan_timeout;
3141         INIT_WORK(&cfg->escan_timeout_work,
3142                   brcmf_cfg80211_escan_timeout_worker);
3143 }
3144
3145 /* PFN result doesn't have all the info which are required by the supplicant
3146  * (For e.g IEs) Do a target Escan so that sched scan results are reported
3147  * via wl_inform_single_bss in the required format. Escan does require the
3148  * scan request in the form of cfg80211_scan_request. For timebeing, create
3149  * cfg80211_scan_request one out of the received PNO event.
3150  */
3151 static s32
3152 brcmf_notify_sched_scan_results(struct brcmf_if *ifp,
3153                                 const struct brcmf_event_msg *e, void *data)
3154 {
3155         struct brcmf_cfg80211_info *cfg = ifp->drvr->config;
3156         struct brcmf_pno_net_info_le *netinfo, *netinfo_start;
3157         struct cfg80211_scan_request *request = NULL;
3158         struct cfg80211_ssid *ssid = NULL;
3159         struct ieee80211_channel *channel = NULL;
3160         struct wiphy *wiphy = cfg_to_wiphy(cfg);
3161         int err = 0;
3162         int channel_req = 0;
3163         int band = 0;
3164         struct brcmf_pno_scanresults_le *pfn_result;
3165         u32 result_count;
3166         u32 status;
3167
3168         brcmf_dbg(SCAN, "Enter\n");
3169
3170         if (e->datalen < (sizeof(*pfn_result) + sizeof(*netinfo))) {
3171                 brcmf_dbg(SCAN, "Event data to small. Ignore\n");
3172                 return 0;
3173         }
3174
3175         if (e->event_code == BRCMF_E_PFN_NET_LOST) {
3176                 brcmf_dbg(SCAN, "PFN NET LOST event. Do Nothing\n");
3177                 return 0;
3178         }
3179
3180         pfn_result = (struct brcmf_pno_scanresults_le *)data;
3181         result_count = le32_to_cpu(pfn_result->count);
3182         status = le32_to_cpu(pfn_result->status);
3183
3184         /* PFN event is limited to fit 512 bytes so we may get
3185          * multiple NET_FOUND events. For now place a warning here.
3186          */
3187         WARN_ON(status != BRCMF_PNO_SCAN_COMPLETE);
3188         brcmf_dbg(SCAN, "PFN NET FOUND event. count: %d\n", result_count);
3189         if (result_count > 0) {
3190                 int i;
3191
3192                 request = kzalloc(sizeof(*request), GFP_KERNEL);
3193                 ssid = kcalloc(result_count, sizeof(*ssid), GFP_KERNEL);
3194                 channel = kcalloc(result_count, sizeof(*channel), GFP_KERNEL);
3195                 if (!request || !ssid || !channel) {
3196                         err = -ENOMEM;
3197                         goto out_err;
3198                 }
3199
3200                 request->wiphy = wiphy;
3201                 data += sizeof(struct brcmf_pno_scanresults_le);
3202                 netinfo_start = (struct brcmf_pno_net_info_le *)data;
3203
3204                 for (i = 0; i < result_count; i++) {
3205                         netinfo = &netinfo_start[i];
3206                         if (!netinfo) {
3207                                 brcmf_err("Invalid netinfo ptr. index: %d\n",
3208                                           i);
3209                                 err = -EINVAL;
3210                                 goto out_err;
3211                         }
3212
3213                         brcmf_dbg(SCAN, "SSID:%s Channel:%d\n",
3214                                   netinfo->SSID, netinfo->channel);
3215                         memcpy(ssid[i].ssid, netinfo->SSID, netinfo->SSID_len);
3216                         ssid[i].ssid_len = netinfo->SSID_len;
3217                         request->n_ssids++;
3218
3219                         channel_req = netinfo->channel;
3220                         if (channel_req <= CH_MAX_2G_CHANNEL)
3221                                 band = NL80211_BAND_2GHZ;
3222                         else
3223                                 band = NL80211_BAND_5GHZ;
3224                         channel[i].center_freq =
3225                                 ieee80211_channel_to_frequency(channel_req,
3226                                                                band);
3227                         channel[i].band = band;
3228                         channel[i].flags |= IEEE80211_CHAN_NO_HT40;
3229                         request->channels[i] = &channel[i];
3230                         request->n_channels++;
3231                 }
3232
3233                 /* assign parsed ssid array */
3234                 if (request->n_ssids)
3235                         request->ssids = &ssid[0];
3236
3237                 if (test_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status)) {
3238                         /* Abort any on-going scan */
3239                         brcmf_abort_scanning(cfg);
3240                 }
3241
3242                 set_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status);
3243                 cfg->escan_info.run = brcmf_run_escan;
3244                 err = brcmf_do_escan(cfg, wiphy, ifp, request);
3245                 if (err) {
3246                         clear_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status);
3247                         goto out_err;
3248                 }
3249                 cfg->sched_escan = true;
3250                 cfg->scan_request = request;
3251         } else {
3252                 brcmf_err("FALSE PNO Event. (pfn_count == 0)\n");
3253                 goto out_err;
3254         }
3255
3256         kfree(ssid);
3257         kfree(channel);
3258         kfree(request);
3259         return 0;
3260
3261 out_err:
3262         kfree(ssid);
3263         kfree(channel);
3264         kfree(request);
3265         cfg80211_sched_scan_stopped(wiphy);
3266         return err;
3267 }
3268
3269 static int brcmf_dev_pno_clean(struct net_device *ndev)
3270 {
3271         int ret;
3272
3273         /* Disable pfn */
3274         ret = brcmf_fil_iovar_int_set(netdev_priv(ndev), "pfn", 0);
3275         if (ret == 0) {
3276                 /* clear pfn */
3277                 ret = brcmf_fil_iovar_data_set(netdev_priv(ndev), "pfnclear",
3278                                                NULL, 0);
3279         }
3280         if (ret < 0)
3281                 brcmf_err("failed code %d\n", ret);
3282
3283         return ret;
3284 }
3285
3286 static int brcmf_dev_pno_config(struct brcmf_if *ifp,
3287                                 struct cfg80211_sched_scan_request *request)
3288 {
3289         struct brcmf_pno_param_le pfn_param;
3290         struct brcmf_pno_macaddr_le pfn_mac;
3291         s32 err;
3292         u8 *mac_mask;
3293         int i;
3294
3295         memset(&pfn_param, 0, sizeof(pfn_param));
3296         pfn_param.version = cpu_to_le32(BRCMF_PNO_VERSION);
3297
3298         /* set extra pno params */
3299         pfn_param.flags = cpu_to_le16(1 << BRCMF_PNO_ENABLE_ADAPTSCAN_BIT);
3300         pfn_param.repeat = BRCMF_PNO_REPEAT;
3301         pfn_param.exp = BRCMF_PNO_FREQ_EXPO_MAX;
3302
3303         /* set up pno scan fr */
3304         pfn_param.scan_freq = cpu_to_le32(BRCMF_PNO_TIME);
3305
3306         err = brcmf_fil_iovar_data_set(ifp, "pfn_set", &pfn_param,
3307                                        sizeof(pfn_param));
3308         if (err) {
3309                 brcmf_err("pfn_set failed, err=%d\n", err);
3310                 return err;
3311         }
3312
3313         /* Find out if mac randomization should be turned on */
3314         if (!(request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR))
3315                 return 0;
3316
3317         pfn_mac.version = BRCMF_PFN_MACADDR_CFG_VER;
3318         pfn_mac.flags = BRCMF_PFN_MAC_OUI_ONLY | BRCMF_PFN_SET_MAC_UNASSOC;
3319
3320         memcpy(pfn_mac.mac, request->mac_addr, ETH_ALEN);
3321         mac_mask = request->mac_addr_mask;
3322         for (i = 0; i < ETH_ALEN; i++) {
3323                 pfn_mac.mac[i] &= mac_mask[i];
3324                 pfn_mac.mac[i] |= get_random_int() & ~(mac_mask[i]);
3325         }
3326         /* Clear multi bit */
3327         pfn_mac.mac[0] &= 0xFE;
3328         /* Set locally administered */
3329         pfn_mac.mac[0] |= 0x02;
3330
3331         err = brcmf_fil_iovar_data_set(ifp, "pfn_macaddr", &pfn_mac,
3332                                        sizeof(pfn_mac));
3333         if (err)
3334                 brcmf_err("pfn_macaddr failed, err=%d\n", err);
3335
3336         return err;
3337 }
3338
3339 static int
3340 brcmf_cfg80211_sched_scan_start(struct wiphy *wiphy,
3341                                 struct net_device *ndev,
3342                                 struct cfg80211_sched_scan_request *request)
3343 {
3344         struct brcmf_if *ifp = netdev_priv(ndev);
3345         struct brcmf_cfg80211_info *cfg = wiphy_priv(wiphy);
3346         struct brcmf_pno_net_param_le pfn;
3347         int i;
3348         int ret = 0;
3349
3350         brcmf_dbg(SCAN, "Enter n_match_sets:%d n_ssids:%d\n",
3351                   request->n_match_sets, request->n_ssids);
3352         if (test_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status)) {
3353                 brcmf_err("Scanning already: status (%lu)\n", cfg->scan_status);
3354                 return -EAGAIN;
3355         }
3356         if (test_bit(BRCMF_SCAN_STATUS_SUPPRESS, &cfg->scan_status)) {
3357                 brcmf_err("Scanning suppressed: status (%lu)\n",
3358                           cfg->scan_status);
3359                 return -EAGAIN;
3360         }
3361
3362         if (!request->n_ssids || !request->n_match_sets) {
3363                 brcmf_dbg(SCAN, "Invalid sched scan req!! n_ssids:%d\n",
3364                           request->n_ssids);
3365                 return -EINVAL;
3366         }
3367
3368         if (request->n_ssids > 0) {
3369                 for (i = 0; i < request->n_ssids; i++) {
3370                         /* Active scan req for ssids */
3371                         brcmf_dbg(SCAN, ">>> Active scan req for ssid (%s)\n",
3372                                   request->ssids[i].ssid);
3373
3374                         /* match_set ssids is a supert set of n_ssid list,
3375                          * so we need not add these set separately.
3376                          */
3377                 }
3378         }
3379
3380         if (request->n_match_sets > 0) {
3381                 /* clean up everything */
3382                 ret = brcmf_dev_pno_clean(ndev);
3383                 if  (ret < 0) {
3384                         brcmf_err("failed error=%d\n", ret);
3385                         return ret;
3386                 }
3387
3388                 /* configure pno */
3389                 if (brcmf_dev_pno_config(ifp, request))
3390                         return -EINVAL;
3391
3392                 /* configure each match set */
3393                 for (i = 0; i < request->n_match_sets; i++) {
3394                         struct cfg80211_ssid *ssid;
3395                         u32 ssid_len;
3396
3397                         ssid = &request->match_sets[i].ssid;
3398                         ssid_len = ssid->ssid_len;
3399
3400                         if (!ssid_len) {
3401                                 brcmf_err("skip broadcast ssid\n");
3402                                 continue;
3403                         }
3404                         pfn.auth = cpu_to_le32(WLAN_AUTH_OPEN);
3405                         pfn.wpa_auth = cpu_to_le32(BRCMF_PNO_WPA_AUTH_ANY);
3406                         pfn.wsec = cpu_to_le32(0);
3407                         pfn.infra = cpu_to_le32(1);
3408                         pfn.flags = cpu_to_le32(1 << BRCMF_PNO_HIDDEN_BIT);
3409                         pfn.ssid.SSID_len = cpu_to_le32(ssid_len);
3410                         memcpy(pfn.ssid.SSID, ssid->ssid, ssid_len);
3411                         ret = brcmf_fil_iovar_data_set(ifp, "pfn_add", &pfn,
3412                                                        sizeof(pfn));
3413                         brcmf_dbg(SCAN, ">>> PNO filter %s for ssid (%s)\n",
3414                                   ret == 0 ? "set" : "failed", ssid->ssid);
3415                 }
3416                 /* Enable the PNO */
3417                 if (brcmf_fil_iovar_int_set(ifp, "pfn", 1) < 0) {
3418                         brcmf_err("PNO enable failed!! ret=%d\n", ret);
3419                         return -EINVAL;
3420                 }
3421         } else {
3422                 return -EINVAL;
3423         }
3424
3425         return 0;
3426 }
3427
3428 static int brcmf_cfg80211_sched_scan_stop(struct wiphy *wiphy,
3429                                           struct net_device *ndev)
3430 {
3431         struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
3432
3433         brcmf_dbg(SCAN, "enter\n");
3434         brcmf_dev_pno_clean(ndev);
3435         if (cfg->sched_escan)
3436                 brcmf_notify_escan_complete(cfg, netdev_priv(ndev), true, true);
3437         return 0;
3438 }
3439
3440 static __always_inline void brcmf_delay(u32 ms)
3441 {
3442         if (ms < 1000 / HZ) {
3443                 cond_resched();
3444                 mdelay(ms);
3445         } else {
3446                 msleep(ms);
3447         }
3448 }
3449
3450 static s32 brcmf_config_wowl_pattern(struct brcmf_if *ifp, u8 cmd[4],
3451                                      u8 *pattern, u32 patternsize, u8 *mask,
3452                                      u32 packet_offset)
3453 {
3454         struct brcmf_fil_wowl_pattern_le *filter;
3455         u32 masksize;
3456         u32 patternoffset;
3457         u8 *buf;
3458         u32 bufsize;
3459         s32 ret;
3460
3461         masksize = (patternsize + 7) / 8;
3462         patternoffset = sizeof(*filter) - sizeof(filter->cmd) + masksize;
3463
3464         bufsize = sizeof(*filter) + patternsize + masksize;
3465         buf = kzalloc(bufsize, GFP_KERNEL);
3466         if (!buf)
3467                 return -ENOMEM;
3468         filter = (struct brcmf_fil_wowl_pattern_le *)buf;
3469
3470         memcpy(filter->cmd, cmd, 4);
3471         filter->masksize = cpu_to_le32(masksize);
3472         filter->offset = cpu_to_le32(packet_offset);
3473         filter->patternoffset = cpu_to_le32(patternoffset);
3474         filter->patternsize = cpu_to_le32(patternsize);
3475         filter->type = cpu_to_le32(BRCMF_WOWL_PATTERN_TYPE_BITMAP);
3476
3477         if ((mask) && (masksize))
3478                 memcpy(buf + sizeof(*filter), mask, masksize);
3479         if ((pattern) && (patternsize))
3480                 memcpy(buf + sizeof(*filter) + masksize, pattern, patternsize);
3481
3482         ret = brcmf_fil_iovar_data_set(ifp, "wowl_pattern", buf, bufsize);
3483
3484         kfree(buf);
3485         return ret;
3486 }
3487
3488 static s32
3489 brcmf_wowl_nd_results(struct brcmf_if *ifp, const struct brcmf_event_msg *e,
3490                       void *data)
3491 {
3492         struct brcmf_cfg80211_info *cfg = ifp->drvr->config;
3493         struct brcmf_pno_scanresults_le *pfn_result;
3494         struct brcmf_pno_net_info_le *netinfo;
3495
3496         brcmf_dbg(SCAN, "Enter\n");
3497
3498         if (e->datalen < (sizeof(*pfn_result) + sizeof(*netinfo))) {
3499                 brcmf_dbg(SCAN, "Event data to small. Ignore\n");
3500                 return 0;
3501         }
3502
3503         pfn_result = (struct brcmf_pno_scanresults_le *)data;
3504
3505         if (e->event_code == BRCMF_E_PFN_NET_LOST) {
3506                 brcmf_dbg(SCAN, "PFN NET LOST event. Ignore\n");
3507                 return 0;
3508         }
3509
3510         if (le32_to_cpu(pfn_result->count) < 1) {
3511                 brcmf_err("Invalid result count, expected 1 (%d)\n",
3512                           le32_to_cpu(pfn_result->count));
3513                 return -EINVAL;
3514         }
3515
3516         data += sizeof(struct brcmf_pno_scanresults_le);
3517         netinfo = (struct brcmf_pno_net_info_le *)data;
3518         memcpy(cfg->wowl.nd->ssid.ssid, netinfo->SSID, netinfo->SSID_len);
3519         cfg->wowl.nd->ssid.ssid_len = netinfo->SSID_len;
3520         cfg->wowl.nd->n_channels = 1;
3521         cfg->wowl.nd->channels[0] =
3522                 ieee80211_channel_to_frequency(netinfo->channel,
3523                         netinfo->channel <= CH_MAX_2G_CHANNEL ?
3524                                         NL80211_BAND_2GHZ : NL80211_BAND_5GHZ);
3525         cfg->wowl.nd_info->n_matches = 1;
3526         cfg->wowl.nd_info->matches[0] = cfg->wowl.nd;
3527
3528         /* Inform (the resume task) that the net detect information was recvd */
3529         cfg->wowl.nd_data_completed = true;
3530         wake_up(&cfg->wowl.nd_data_wait);
3531
3532         return 0;
3533 }
3534
3535 #ifdef CONFIG_PM
3536
3537 static void brcmf_report_wowl_wakeind(struct wiphy *wiphy, struct brcmf_if *ifp)
3538 {
3539         struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
3540         struct brcmf_wowl_wakeind_le wake_ind_le;
3541         struct cfg80211_wowlan_wakeup wakeup_data;
3542         struct cfg80211_wowlan_wakeup *wakeup;
3543         u32 wakeind;
3544         s32 err;
3545         int timeout;
3546
3547         err = brcmf_fil_iovar_data_get(ifp, "wowl_wakeind", &wake_ind_le,
3548                                        sizeof(wake_ind_le));
3549         if (err) {
3550                 brcmf_err("Get wowl_wakeind failed, err = %d\n", err);
3551                 return;
3552         }
3553
3554         wakeind = le32_to_cpu(wake_ind_le.ucode_wakeind);
3555         if (wakeind & (BRCMF_WOWL_MAGIC | BRCMF_WOWL_DIS | BRCMF_WOWL_BCN |
3556                        BRCMF_WOWL_RETR | BRCMF_WOWL_NET |
3557                        BRCMF_WOWL_PFN_FOUND)) {
3558                 wakeup = &wakeup_data;
3559                 memset(&wakeup_data, 0, sizeof(wakeup_data));
3560                 wakeup_data.pattern_idx = -1;
3561
3562                 if (wakeind & BRCMF_WOWL_MAGIC) {
3563                         brcmf_dbg(INFO, "WOWL Wake indicator: BRCMF_WOWL_MAGIC\n");
3564                         wakeup_data.magic_pkt = true;
3565                 }
3566                 if (wakeind & BRCMF_WOWL_DIS) {
3567                         brcmf_dbg(INFO, "WOWL Wake indicator: BRCMF_WOWL_DIS\n");
3568                         wakeup_data.disconnect = true;
3569                 }
3570                 if (wakeind & BRCMF_WOWL_BCN) {
3571                         brcmf_dbg(INFO, "WOWL Wake indicator: BRCMF_WOWL_BCN\n");
3572                         wakeup_data.disconnect = true;
3573                 }
3574                 if (wakeind & BRCMF_WOWL_RETR) {
3575                         brcmf_dbg(INFO, "WOWL Wake indicator: BRCMF_WOWL_RETR\n");
3576                         wakeup_data.disconnect = true;
3577                 }
3578                 if (wakeind & BRCMF_WOWL_NET) {
3579                         brcmf_dbg(INFO, "WOWL Wake indicator: BRCMF_WOWL_NET\n");
3580                         /* For now always map to pattern 0, no API to get
3581                          * correct information available at the moment.
3582                          */
3583                         wakeup_data.pattern_idx = 0;
3584                 }
3585                 if (wakeind & BRCMF_WOWL_PFN_FOUND) {
3586                         brcmf_dbg(INFO, "WOWL Wake indicator: BRCMF_WOWL_PFN_FOUND\n");
3587                         timeout = wait_event_timeout(cfg->wowl.nd_data_wait,
3588                                 cfg->wowl.nd_data_completed,
3589                                 BRCMF_ND_INFO_TIMEOUT);
3590                         if (!timeout)
3591                                 brcmf_err("No result for wowl net detect\n");
3592                         else
3593                                 wakeup_data.net_detect = cfg->wowl.nd_info;
3594                 }
3595                 if (wakeind & BRCMF_WOWL_GTK_FAILURE) {
3596                         brcmf_dbg(INFO, "WOWL Wake indicator: BRCMF_WOWL_GTK_FAILURE\n");
3597                         wakeup_data.gtk_rekey_failure = true;
3598                 }
3599         } else {
3600                 wakeup = NULL;
3601         }
3602         cfg80211_report_wowlan_wakeup(&ifp->vif->wdev, wakeup, GFP_KERNEL);
3603 }
3604
3605 #else
3606
3607 static void brcmf_report_wowl_wakeind(struct wiphy *wiphy, struct brcmf_if *ifp)
3608 {
3609 }
3610
3611 #endif /* CONFIG_PM */
3612
3613 static s32 brcmf_cfg80211_resume(struct wiphy *wiphy)
3614 {
3615         struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
3616         struct net_device *ndev = cfg_to_ndev(cfg);
3617         struct brcmf_if *ifp = netdev_priv(ndev);
3618
3619         brcmf_dbg(TRACE, "Enter\n");
3620
3621         if (cfg->wowl.active) {
3622                 brcmf_report_wowl_wakeind(wiphy, ifp);
3623                 brcmf_fil_iovar_int_set(ifp, "wowl_clear", 0);
3624                 brcmf_config_wowl_pattern(ifp, "clr", NULL, 0, NULL, 0);
3625                 if (!brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_ARP_ND))
3626                         brcmf_configure_arp_nd_offload(ifp, true);
3627                 brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_PM,
3628                                       cfg->wowl.pre_pmmode);
3629                 cfg->wowl.active = false;
3630                 if (cfg->wowl.nd_enabled) {
3631                         brcmf_cfg80211_sched_scan_stop(cfg->wiphy, ifp->ndev);
3632                         brcmf_fweh_unregister(cfg->pub, BRCMF_E_PFN_NET_FOUND);
3633                         brcmf_fweh_register(cfg->pub, BRCMF_E_PFN_NET_FOUND,
3634                                             brcmf_notify_sched_scan_results);
3635                         cfg->wowl.nd_enabled = false;
3636                 }
3637         }
3638         return 0;
3639 }
3640
3641 static void brcmf_configure_wowl(struct brcmf_cfg80211_info *cfg,
3642                                  struct brcmf_if *ifp,
3643                                  struct cfg80211_wowlan *wowl)
3644 {
3645         u32 wowl_config;
3646         u32 i;
3647
3648         brcmf_dbg(TRACE, "Suspend, wowl config.\n");
3649
3650         if (!brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_ARP_ND))
3651                 brcmf_configure_arp_nd_offload(ifp, false);
3652         brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_PM, &cfg->wowl.pre_pmmode);
3653         brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_PM, PM_MAX);
3654
3655         wowl_config = 0;
3656         if (wowl->disconnect)
3657                 wowl_config = BRCMF_WOWL_DIS | BRCMF_WOWL_BCN | BRCMF_WOWL_RETR;
3658         if (wowl->magic_pkt)
3659                 wowl_config |= BRCMF_WOWL_MAGIC;
3660         if ((wowl->patterns) && (wowl->n_patterns)) {
3661                 wowl_config |= BRCMF_WOWL_NET;
3662                 for (i = 0; i < wowl->n_patterns; i++) {
3663                         brcmf_config_wowl_pattern(ifp, "add",
3664                                 (u8 *)wowl->patterns[i].pattern,
3665                                 wowl->patterns[i].pattern_len,
3666                                 (u8 *)wowl->patterns[i].mask,
3667                                 wowl->patterns[i].pkt_offset);
3668                 }
3669         }
3670         if (wowl->nd_config) {
3671                 brcmf_cfg80211_sched_scan_start(cfg->wiphy, ifp->ndev,
3672                                                 wowl->nd_config);
3673                 wowl_config |= BRCMF_WOWL_PFN_FOUND;
3674
3675                 cfg->wowl.nd_data_completed = false;
3676                 cfg->wowl.nd_enabled = true;
3677                 /* Now reroute the event for PFN to the wowl function. */
3678                 brcmf_fweh_unregister(cfg->pub, BRCMF_E_PFN_NET_FOUND);
3679                 brcmf_fweh_register(cfg->pub, BRCMF_E_PFN_NET_FOUND,
3680                                     brcmf_wowl_nd_results);
3681         }
3682         if (wowl->gtk_rekey_failure)
3683                 wowl_config |= BRCMF_WOWL_GTK_FAILURE;
3684         if (!test_bit(BRCMF_VIF_STATUS_CONNECTED, &ifp->vif->sme_state))
3685                 wowl_config |= BRCMF_WOWL_UNASSOC;
3686
3687         brcmf_fil_iovar_data_set(ifp, "wowl_wakeind", "clear",
3688                                  sizeof(struct brcmf_wowl_wakeind_le));
3689         brcmf_fil_iovar_int_set(ifp, "wowl", wowl_config);
3690         brcmf_fil_iovar_int_set(ifp, "wowl_activate", 1);
3691         brcmf_bus_wowl_config(cfg->pub->bus_if, true);
3692         cfg->wowl.active = true;
3693 }
3694
3695 static s32 brcmf_cfg80211_suspend(struct wiphy *wiphy,
3696                                   struct cfg80211_wowlan *wowl)
3697 {
3698         struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
3699         struct net_device *ndev = cfg_to_ndev(cfg);
3700         struct brcmf_if *ifp = netdev_priv(ndev);
3701         struct brcmf_cfg80211_vif *vif;
3702
3703         brcmf_dbg(TRACE, "Enter\n");
3704
3705         /* if the primary net_device is not READY there is nothing
3706          * we can do but pray resume goes smoothly.
3707          */
3708         if (!check_vif_up(ifp->vif))
3709                 goto exit;
3710
3711         /* Stop scheduled scan */
3712         if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_PNO))
3713                 brcmf_cfg80211_sched_scan_stop(wiphy, ndev);
3714
3715         /* end any scanning */
3716         if (test_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status))
3717                 brcmf_abort_scanning(cfg);
3718
3719         if (wowl == NULL) {
3720                 brcmf_bus_wowl_config(cfg->pub->bus_if, false);
3721                 list_for_each_entry(vif, &cfg->vif_list, list) {
3722                         if (!test_bit(BRCMF_VIF_STATUS_READY, &vif->sme_state))
3723                                 continue;
3724                         /* While going to suspend if associated with AP
3725                          * disassociate from AP to save power while system is
3726                          * in suspended state
3727                          */
3728                         brcmf_link_down(vif, WLAN_REASON_UNSPECIFIED);
3729                         /* Make sure WPA_Supplicant receives all the event
3730                          * generated due to DISASSOC call to the fw to keep
3731                          * the state fw and WPA_Supplicant state consistent
3732                          */
3733                         brcmf_delay(500);
3734                 }
3735                 /* Configure MPC */
3736                 brcmf_set_mpc(ifp, 1);
3737
3738         } else {
3739                 /* Configure WOWL paramaters */
3740                 brcmf_configure_wowl(cfg, ifp, wowl);
3741         }
3742
3743 exit:
3744         brcmf_dbg(TRACE, "Exit\n");
3745         /* clear any scanning activity */
3746         cfg->scan_status = 0;
3747         return 0;
3748 }
3749
3750 static __used s32
3751 brcmf_update_pmklist(struct brcmf_cfg80211_info *cfg, struct brcmf_if *ifp)
3752 {
3753         struct brcmf_pmk_list_le *pmk_list;
3754         int i;
3755         u32 npmk;
3756         s32 err;
3757
3758         pmk_list = &cfg->pmk_list;
3759         npmk = le32_to_cpu(pmk_list->npmk);
3760
3761         brcmf_dbg(CONN, "No of elements %d\n", npmk);
3762         for (i = 0; i < npmk; i++)
3763                 brcmf_dbg(CONN, "PMK[%d]: %pM\n", i, &pmk_list->pmk[i].bssid);
3764
3765         err = brcmf_fil_iovar_data_set(ifp, "pmkid_info", pmk_list,
3766                                        sizeof(*pmk_list));
3767
3768         return err;
3769 }
3770
3771 static s32
3772 brcmf_cfg80211_set_pmksa(struct wiphy *wiphy, struct net_device *ndev,
3773                          struct cfg80211_pmksa *pmksa)
3774 {
3775         struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
3776         struct brcmf_if *ifp = netdev_priv(ndev);
3777         struct brcmf_pmksa *pmk = &cfg->pmk_list.pmk[0];
3778         s32 err;
3779         u32 npmk, i;
3780
3781         brcmf_dbg(TRACE, "Enter\n");
3782         if (!check_vif_up(ifp->vif))
3783                 return -EIO;
3784
3785         npmk = le32_to_cpu(cfg->pmk_list.npmk);
3786         for (i = 0; i < npmk; i++)
3787                 if (!memcmp(pmksa->bssid, pmk[i].bssid, ETH_ALEN))
3788                         break;
3789         if (i < BRCMF_MAXPMKID) {
3790                 memcpy(pmk[i].bssid, pmksa->bssid, ETH_ALEN);
3791                 memcpy(pmk[i].pmkid, pmksa->pmkid, WLAN_PMKID_LEN);
3792                 if (i == npmk) {
3793                         npmk++;
3794                         cfg->pmk_list.npmk = cpu_to_le32(npmk);
3795                 }
3796         } else {
3797                 brcmf_err("Too many PMKSA entries cached %d\n", npmk);
3798                 return -EINVAL;
3799         }
3800
3801         brcmf_dbg(CONN, "set_pmksa - PMK bssid: %pM =\n", pmk[npmk].bssid);
3802         for (i = 0; i < WLAN_PMKID_LEN; i += 4)
3803                 brcmf_dbg(CONN, "%02x %02x %02x %02x\n", pmk[npmk].pmkid[i],
3804                           pmk[npmk].pmkid[i + 1], pmk[npmk].pmkid[i + 2],
3805                           pmk[npmk].pmkid[i + 3]);
3806
3807         err = brcmf_update_pmklist(cfg, ifp);
3808
3809         brcmf_dbg(TRACE, "Exit\n");
3810         return err;
3811 }
3812
3813 static s32
3814 brcmf_cfg80211_del_pmksa(struct wiphy *wiphy, struct net_device *ndev,
3815                          struct cfg80211_pmksa *pmksa)
3816 {
3817         struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
3818         struct brcmf_if *ifp = netdev_priv(ndev);
3819         struct brcmf_pmksa *pmk = &cfg->pmk_list.pmk[0];
3820         s32 err;
3821         u32 npmk, i;
3822
3823         brcmf_dbg(TRACE, "Enter\n");
3824         if (!check_vif_up(ifp->vif))
3825                 return -EIO;
3826
3827         brcmf_dbg(CONN, "del_pmksa - PMK bssid = %pM\n", &pmksa->bssid);
3828
3829         npmk = le32_to_cpu(cfg->pmk_list.npmk);
3830         for (i = 0; i < npmk; i++)
3831                 if (!memcmp(&pmksa->bssid, &pmk[i].bssid, ETH_ALEN))
3832                         break;
3833
3834         if ((npmk > 0) && (i < npmk)) {
3835                 for (; i < (npmk - 1); i++) {
3836                         memcpy(&pmk[i].bssid, &pmk[i + 1].bssid, ETH_ALEN);
3837                         memcpy(&pmk[i].pmkid, &pmk[i + 1].pmkid,
3838                                WLAN_PMKID_LEN);
3839                 }
3840                 memset(&pmk[i], 0, sizeof(*pmk));
3841                 cfg->pmk_list.npmk = cpu_to_le32(npmk - 1);
3842         } else {
3843                 brcmf_err("Cache entry not found\n");
3844                 return -EINVAL;
3845         }
3846
3847         err = brcmf_update_pmklist(cfg, ifp);
3848
3849         brcmf_dbg(TRACE, "Exit\n");
3850         return err;
3851
3852 }
3853
3854 static s32
3855 brcmf_cfg80211_flush_pmksa(struct wiphy *wiphy, struct net_device *ndev)
3856 {
3857         struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
3858         struct brcmf_if *ifp = netdev_priv(ndev);
3859         s32 err;
3860
3861         brcmf_dbg(TRACE, "Enter\n");
3862         if (!check_vif_up(ifp->vif))
3863                 return -EIO;
3864
3865         memset(&cfg->pmk_list, 0, sizeof(cfg->pmk_list));
3866         err = brcmf_update_pmklist(cfg, ifp);
3867
3868         brcmf_dbg(TRACE, "Exit\n");
3869         return err;
3870
3871 }
3872
3873 static s32 brcmf_configure_opensecurity(struct brcmf_if *ifp)
3874 {
3875         s32 err;
3876
3877         /* set auth */
3878         err = brcmf_fil_bsscfg_int_set(ifp, "auth", 0);
3879         if (err < 0) {
3880                 brcmf_err("auth error %d\n", err);
3881                 return err;
3882         }
3883         /* set wsec */
3884         err = brcmf_fil_bsscfg_int_set(ifp, "wsec", 0);
3885         if (err < 0) {
3886                 brcmf_err("wsec error %d\n", err);
3887                 return err;
3888         }
3889         /* set upper-layer auth */
3890         err = brcmf_fil_bsscfg_int_set(ifp, "wpa_auth", WPA_AUTH_NONE);
3891         if (err < 0) {
3892                 brcmf_err("wpa_auth error %d\n", err);
3893                 return err;
3894         }
3895
3896         return 0;
3897 }
3898
3899 static bool brcmf_valid_wpa_oui(u8 *oui, bool is_rsn_ie)
3900 {
3901         if (is_rsn_ie)
3902                 return (memcmp(oui, RSN_OUI, TLV_OUI_LEN) == 0);
3903
3904         return (memcmp(oui, WPA_OUI, TLV_OUI_LEN) == 0);
3905 }
3906
3907 static s32
3908 brcmf_configure_wpaie(struct brcmf_if *ifp,
3909                       const struct brcmf_vs_tlv *wpa_ie,
3910                       bool is_rsn_ie)
3911 {
3912         u32 auth = 0; /* d11 open authentication */
3913         u16 count;
3914         s32 err = 0;
3915         s32 len;
3916         u32 i;
3917         u32 wsec;
3918         u32 pval = 0;
3919         u32 gval = 0;
3920         u32 wpa_auth = 0;
3921         u32 offset;
3922         u8 *data;
3923         u16 rsn_cap;
3924         u32 wme_bss_disable;
3925         u32 mfp;
3926
3927         brcmf_dbg(TRACE, "Enter\n");
3928         if (wpa_ie == NULL)
3929                 goto exit;
3930
3931         len = wpa_ie->len + TLV_HDR_LEN;
3932         data = (u8 *)wpa_ie;
3933         offset = TLV_HDR_LEN;
3934         if (!is_rsn_ie)
3935                 offset += VS_IE_FIXED_HDR_LEN;
3936         else
3937                 offset += WPA_IE_VERSION_LEN;
3938
3939         /* check for multicast cipher suite */
3940         if (offset + WPA_IE_MIN_OUI_LEN > len) {
3941                 err = -EINVAL;
3942                 brcmf_err("no multicast cipher suite\n");
3943                 goto exit;
3944         }
3945
3946         if (!brcmf_valid_wpa_oui(&data[offset], is_rsn_ie)) {
3947                 err = -EINVAL;
3948                 brcmf_err("ivalid OUI\n");
3949                 goto exit;
3950         }
3951         offset += TLV_OUI_LEN;
3952
3953         /* pick up multicast cipher */
3954         switch (data[offset]) {
3955         case WPA_CIPHER_NONE:
3956                 gval = 0;
3957                 break;
3958         case WPA_CIPHER_WEP_40:
3959         case WPA_CIPHER_WEP_104:
3960                 gval = WEP_ENABLED;
3961                 break;
3962         case WPA_CIPHER_TKIP:
3963                 gval = TKIP_ENABLED;
3964                 break;
3965         case WPA_CIPHER_AES_CCM:
3966                 gval = AES_ENABLED;
3967                 break;
3968         default:
3969                 err = -EINVAL;
3970                 brcmf_err("Invalid multi cast cipher info\n");
3971                 goto exit;
3972         }
3973
3974         offset++;
3975         /* walk thru unicast cipher list and pick up what we recognize */
3976         count = data[offset] + (data[offset + 1] << 8);
3977         offset += WPA_IE_SUITE_COUNT_LEN;
3978         /* Check for unicast suite(s) */
3979         if (offset + (WPA_IE_MIN_OUI_LEN * count) > len) {
3980                 err = -EINVAL;
3981                 brcmf_err("no unicast cipher suite\n");
3982                 goto exit;
3983         }
3984         for (i = 0; i < count; i++) {
3985                 if (!brcmf_valid_wpa_oui(&data[offset], is_rsn_ie)) {
3986                         err = -EINVAL;
3987                         brcmf_err("ivalid OUI\n");
3988                         goto exit;
3989                 }
3990                 offset += TLV_OUI_LEN;
3991                 switch (data[offset]) {
3992                 case WPA_CIPHER_NONE:
3993                         break;
3994                 case WPA_CIPHER_WEP_40:
3995                 case WPA_CIPHER_WEP_104:
3996                         pval |= WEP_ENABLED;
3997                         break;
3998                 case WPA_CIPHER_TKIP:
3999                         pval |= TKIP_ENABLED;
4000                         break;
4001                 case WPA_CIPHER_AES_CCM:
4002                         pval |= AES_ENABLED;
4003                         break;
4004                 default:
4005                         brcmf_err("Ivalid unicast security info\n");
4006                 }
4007                 offset++;
4008         }
4009         /* walk thru auth management suite list and pick up what we recognize */
4010         count = data[offset] + (data[offset + 1] << 8);
4011         offset += WPA_IE_SUITE_COUNT_LEN;
4012         /* Check for auth key management suite(s) */
4013         if (offset + (WPA_IE_MIN_OUI_LEN * count) > len) {
4014                 err = -EINVAL;
4015                 brcmf_err("no auth key mgmt suite\n");
4016                 goto exit;
4017         }
4018         for (i = 0; i < count; i++) {
4019                 if (!brcmf_valid_wpa_oui(&data[offset], is_rsn_ie)) {
4020                         err = -EINVAL;
4021                         brcmf_err("ivalid OUI\n");
4022                         goto exit;
4023                 }
4024                 offset += TLV_OUI_LEN;
4025                 switch (data[offset]) {
4026                 case RSN_AKM_NONE:
4027                         brcmf_dbg(TRACE, "RSN_AKM_NONE\n");
4028                         wpa_auth |= WPA_AUTH_NONE;
4029                         break;
4030                 case RSN_AKM_UNSPECIFIED:
4031                         brcmf_dbg(TRACE, "RSN_AKM_UNSPECIFIED\n");
4032                         is_rsn_ie ? (wpa_auth |= WPA2_AUTH_UNSPECIFIED) :
4033                                     (wpa_auth |= WPA_AUTH_UNSPECIFIED);
4034                         break;
4035                 case RSN_AKM_PSK:
4036                         brcmf_dbg(TRACE, "RSN_AKM_PSK\n");
4037                         is_rsn_ie ? (wpa_auth |= WPA2_AUTH_PSK) :
4038                                     (wpa_auth |= WPA_AUTH_PSK);
4039                         break;
4040                 case RSN_AKM_SHA256_PSK:
4041                         brcmf_dbg(TRACE, "RSN_AKM_MFP_PSK\n");
4042                         wpa_auth |= WPA2_AUTH_PSK_SHA256;
4043                         break;
4044                 case RSN_AKM_SHA256_1X:
4045                         brcmf_dbg(TRACE, "RSN_AKM_MFP_1X\n");
4046                         wpa_auth |= WPA2_AUTH_1X_SHA256;
4047                         break;
4048                 default:
4049                         brcmf_err("Ivalid key mgmt info\n");
4050                 }
4051                 offset++;
4052         }
4053
4054         mfp = BRCMF_MFP_NONE;
4055         if (is_rsn_ie) {
4056                 wme_bss_disable = 1;
4057                 if ((offset + RSN_CAP_LEN) <= len) {
4058                         rsn_cap = data[offset] + (data[offset + 1] << 8);
4059                         if (rsn_cap & RSN_CAP_PTK_REPLAY_CNTR_MASK)
4060                                 wme_bss_disable = 0;
4061                         if (rsn_cap & RSN_CAP_MFPR_MASK) {
4062                                 brcmf_dbg(TRACE, "MFP Required\n");
4063                                 mfp = BRCMF_MFP_REQUIRED;
4064                                 /* Firmware only supports mfp required in
4065                                  * combination with WPA2_AUTH_PSK_SHA256 or
4066                                  * WPA2_AUTH_1X_SHA256.
4067                                  */
4068                                 if (!(wpa_auth & (WPA2_AUTH_PSK_SHA256 |
4069                                                   WPA2_AUTH_1X_SHA256))) {
4070                                         err = -EINVAL;
4071                                         goto exit;
4072                                 }
4073                                 /* Firmware has requirement that WPA2_AUTH_PSK/
4074                                  * WPA2_AUTH_UNSPECIFIED be set, if SHA256 OUI
4075                                  * is to be included in the rsn ie.
4076                                  */
4077                                 if (wpa_auth & WPA2_AUTH_PSK_SHA256)
4078                                         wpa_auth |= WPA2_AUTH_PSK;
4079                                 else if (wpa_auth & WPA2_AUTH_1X_SHA256)
4080                                         wpa_auth |= WPA2_AUTH_UNSPECIFIED;
4081                         } else if (rsn_cap & RSN_CAP_MFPC_MASK) {
4082                                 brcmf_dbg(TRACE, "MFP Capable\n");
4083                                 mfp = BRCMF_MFP_CAPABLE;
4084                         }
4085                 }
4086                 offset += RSN_CAP_LEN;
4087                 /* set wme_bss_disable to sync RSN Capabilities */
4088                 err = brcmf_fil_bsscfg_int_set(ifp, "wme_bss_disable",
4089                                                wme_bss_disable);
4090                 if (err < 0) {
4091                         brcmf_err("wme_bss_disable error %d\n", err);
4092                         goto exit;
4093                 }
4094
4095                 /* Skip PMKID cnt as it is know to be 0 for AP. */
4096                 offset += RSN_PMKID_COUNT_LEN;
4097
4098                 /* See if there is BIP wpa suite left for MFP */
4099                 if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MFP) &&
4100                     ((offset + WPA_IE_MIN_OUI_LEN) <= len)) {
4101                         err = brcmf_fil_bsscfg_data_set(ifp, "bip",
4102                                                         &data[offset],
4103                                                         WPA_IE_MIN_OUI_LEN);
4104                         if (err < 0) {
4105                                 brcmf_err("bip error %d\n", err);
4106                                 goto exit;
4107                         }
4108                 }
4109         }
4110         /* FOR WPS , set SES_OW_ENABLED */
4111         wsec = (pval | gval | SES_OW_ENABLED);
4112
4113         /* set auth */
4114         err = brcmf_fil_bsscfg_int_set(ifp, "auth", auth);
4115         if (err < 0) {
4116                 brcmf_err("auth error %d\n", err);
4117                 goto exit;
4118         }
4119         /* set wsec */
4120         err = brcmf_fil_bsscfg_int_set(ifp, "wsec", wsec);
4121         if (err < 0) {
4122                 brcmf_err("wsec error %d\n", err);
4123                 goto exit;
4124         }
4125         /* Configure MFP, this needs to go after wsec otherwise the wsec command
4126          * will overwrite the values set by MFP
4127          */
4128         if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MFP)) {
4129                 err = brcmf_fil_bsscfg_int_set(ifp, "mfp", mfp);
4130                 if (err < 0) {
4131                         brcmf_err("mfp error %d\n", err);
4132                         goto exit;
4133                 }
4134         }
4135         /* set upper-layer auth */
4136         err = brcmf_fil_bsscfg_int_set(ifp, "wpa_auth", wpa_auth);
4137         if (err < 0) {
4138                 brcmf_err("wpa_auth error %d\n", err);
4139                 goto exit;
4140         }
4141
4142 exit:
4143         return err;
4144 }
4145
4146 static s32
4147 brcmf_parse_vndr_ies(const u8 *vndr_ie_buf, u32 vndr_ie_len,
4148                      struct parsed_vndr_ies *vndr_ies)
4149 {
4150         struct brcmf_vs_tlv *vndrie;
4151         struct brcmf_tlv *ie;
4152         struct parsed_vndr_ie_info *parsed_info;
4153         s32 remaining_len;
4154
4155         remaining_len = (s32)vndr_ie_len;
4156         memset(vndr_ies, 0, sizeof(*vndr_ies));
4157
4158         ie = (struct brcmf_tlv *)vndr_ie_buf;
4159         while (ie) {
4160                 if (ie->id != WLAN_EID_VENDOR_SPECIFIC)
4161                         goto next;
4162                 vndrie = (struct brcmf_vs_tlv *)ie;
4163                 /* len should be bigger than OUI length + one */
4164                 if (vndrie->len < (VS_IE_FIXED_HDR_LEN - TLV_HDR_LEN + 1)) {
4165                         brcmf_err("invalid vndr ie. length is too small %d\n",
4166                                   vndrie->len);
4167                         goto next;
4168                 }
4169                 /* if wpa or wme ie, do not add ie */
4170                 if (!memcmp(vndrie->oui, (u8 *)WPA_OUI, TLV_OUI_LEN) &&
4171                     ((vndrie->oui_type == WPA_OUI_TYPE) ||
4172                     (vndrie->oui_type == WME_OUI_TYPE))) {
4173                         brcmf_dbg(TRACE, "Found WPA/WME oui. Do not add it\n");
4174                         goto next;
4175                 }
4176
4177                 parsed_info = &vndr_ies->ie_info[vndr_ies->count];
4178
4179                 /* save vndr ie information */
4180                 parsed_info->ie_ptr = (char *)vndrie;
4181                 parsed_info->ie_len = vndrie->len + TLV_HDR_LEN;
4182                 memcpy(&parsed_info->vndrie, vndrie, sizeof(*vndrie));
4183
4184                 vndr_ies->count++;
4185
4186                 brcmf_dbg(TRACE, "** OUI %02x %02x %02x, type 0x%02x\n",
4187                           parsed_info->vndrie.oui[0],
4188                           parsed_info->vndrie.oui[1],
4189                           parsed_info->vndrie.oui[2],
4190                           parsed_info->vndrie.oui_type);
4191
4192                 if (vndr_ies->count >= VNDR_IE_PARSE_LIMIT)
4193                         break;
4194 next:
4195                 remaining_len -= (ie->len + TLV_HDR_LEN);
4196                 if (remaining_len <= TLV_HDR_LEN)
4197                         ie = NULL;
4198                 else
4199                         ie = (struct brcmf_tlv *)(((u8 *)ie) + ie->len +
4200                                 TLV_HDR_LEN);
4201         }
4202         return 0;
4203 }
4204
4205 static u32
4206 brcmf_vndr_ie(u8 *iebuf, s32 pktflag, u8 *ie_ptr, u32 ie_len, s8 *add_del_cmd)
4207 {
4208
4209         strncpy(iebuf, add_del_cmd, VNDR_IE_CMD_LEN - 1);
4210         iebuf[VNDR_IE_CMD_LEN - 1] = '\0';
4211
4212         put_unaligned_le32(1, &iebuf[VNDR_IE_COUNT_OFFSET]);
4213
4214         put_unaligned_le32(pktflag, &iebuf[VNDR_IE_PKTFLAG_OFFSET]);
4215
4216         memcpy(&iebuf[VNDR_IE_VSIE_OFFSET], ie_ptr, ie_len);
4217
4218         return ie_len + VNDR_IE_HDR_SIZE;
4219 }
4220
4221 s32 brcmf_vif_set_mgmt_ie(struct brcmf_cfg80211_vif *vif, s32 pktflag,
4222                           const u8 *vndr_ie_buf, u32 vndr_ie_len)
4223 {
4224         struct brcmf_if *ifp;
4225         struct vif_saved_ie *saved_ie;
4226         s32 err = 0;
4227         u8  *iovar_ie_buf;
4228         u8  *curr_ie_buf;
4229         u8  *mgmt_ie_buf = NULL;
4230         int mgmt_ie_buf_len;
4231         u32 *mgmt_ie_len;
4232         u32 del_add_ie_buf_len = 0;
4233         u32 total_ie_buf_len = 0;
4234         u32 parsed_ie_buf_len = 0;
4235         struct parsed_vndr_ies old_vndr_ies;
4236         struct parsed_vndr_ies new_vndr_ies;
4237         struct parsed_vndr_ie_info *vndrie_info;
4238         s32 i;
4239         u8 *ptr;
4240         int remained_buf_len;
4241
4242         if (!vif)
4243                 return -ENODEV;
4244         ifp = vif->ifp;
4245         saved_ie = &vif->saved_ie;
4246
4247         brcmf_dbg(TRACE, "bsscfgidx %d, pktflag : 0x%02X\n", ifp->bsscfgidx,
4248                   pktflag);
4249         iovar_ie_buf = kzalloc(WL_EXTRA_BUF_MAX, GFP_KERNEL);
4250         if (!iovar_ie_buf)
4251                 return -ENOMEM;
4252         curr_ie_buf = iovar_ie_buf;
4253         switch (pktflag) {
4254         case BRCMF_VNDR_IE_PRBREQ_FLAG:
4255                 mgmt_ie_buf = saved_ie->probe_req_ie;
4256                 mgmt_ie_len = &saved_ie->probe_req_ie_len;
4257                 mgmt_ie_buf_len = sizeof(saved_ie->probe_req_ie);
4258                 break;
4259         case BRCMF_VNDR_IE_PRBRSP_FLAG:
4260                 mgmt_ie_buf = saved_ie->probe_res_ie;
4261                 mgmt_ie_len = &saved_ie->probe_res_ie_len;
4262                 mgmt_ie_buf_len = sizeof(saved_ie->probe_res_ie);
4263                 break;
4264         case BRCMF_VNDR_IE_BEACON_FLAG:
4265                 mgmt_ie_buf = saved_ie->beacon_ie;
4266                 mgmt_ie_len = &saved_ie->beacon_ie_len;
4267                 mgmt_ie_buf_len = sizeof(saved_ie->beacon_ie);
4268                 break;
4269         case BRCMF_VNDR_IE_ASSOCREQ_FLAG:
4270                 mgmt_ie_buf = saved_ie->assoc_req_ie;
4271                 mgmt_ie_len = &saved_ie->assoc_req_ie_len;
4272                 mgmt_ie_buf_len = sizeof(saved_ie->assoc_req_ie);
4273                 break;
4274         default:
4275                 err = -EPERM;
4276                 brcmf_err("not suitable type\n");
4277                 goto exit;
4278         }
4279
4280         if (vndr_ie_len > mgmt_ie_buf_len) {
4281                 err = -ENOMEM;
4282                 brcmf_err("extra IE size too big\n");
4283                 goto exit;
4284         }
4285
4286         /* parse and save new vndr_ie in curr_ie_buff before comparing it */
4287         if (vndr_ie_buf && vndr_ie_len && curr_ie_buf) {
4288                 ptr = curr_ie_buf;
4289                 brcmf_parse_vndr_ies(vndr_ie_buf, vndr_ie_len, &new_vndr_ies);
4290                 for (i = 0; i < new_vndr_ies.count; i++) {
4291                         vndrie_info = &new_vndr_ies.ie_info[i];
4292                         memcpy(ptr + parsed_ie_buf_len, vndrie_info->ie_ptr,
4293                                vndrie_info->ie_len);
4294                         parsed_ie_buf_len += vndrie_info->ie_len;
4295                 }
4296         }
4297
4298         if (mgmt_ie_buf && *mgmt_ie_len) {
4299                 if (parsed_ie_buf_len && (parsed_ie_buf_len == *mgmt_ie_len) &&
4300                     (memcmp(mgmt_ie_buf, curr_ie_buf,
4301                             parsed_ie_buf_len) == 0)) {
4302                         brcmf_dbg(TRACE, "Previous mgmt IE equals to current IE\n");
4303                         goto exit;
4304                 }
4305
4306                 /* parse old vndr_ie */
4307                 brcmf_parse_vndr_ies(mgmt_ie_buf, *mgmt_ie_len, &old_vndr_ies);
4308
4309                 /* make a command to delete old ie */
4310                 for (i = 0; i < old_vndr_ies.count; i++) {
4311                         vndrie_info = &old_vndr_ies.ie_info[i];
4312
4313                         brcmf_dbg(TRACE, "DEL ID : %d, Len: %d , OUI:%02x:%02x:%02x\n",
4314                                   vndrie_info->vndrie.id,
4315                                   vndrie_info->vndrie.len,
4316                                   vndrie_info->vndrie.oui[0],
4317                                   vndrie_info->vndrie.oui[1],
4318                                   vndrie_info->vndrie.oui[2]);
4319
4320                         del_add_ie_buf_len = brcmf_vndr_ie(curr_ie_buf, pktflag,
4321                                                            vndrie_info->ie_ptr,
4322                                                            vndrie_info->ie_len,
4323                                                            "del");
4324                         curr_ie_buf += del_add_ie_buf_len;
4325                         total_ie_buf_len += del_add_ie_buf_len;
4326                 }
4327         }
4328
4329         *mgmt_ie_len = 0;
4330         /* Add if there is any extra IE */
4331         if (mgmt_ie_buf && parsed_ie_buf_len) {
4332                 ptr = mgmt_ie_buf;
4333
4334                 remained_buf_len = mgmt_ie_buf_len;
4335
4336                 /* make a command to add new ie */
4337                 for (i = 0; i < new_vndr_ies.count; i++) {
4338                         vndrie_info = &new_vndr_ies.ie_info[i];
4339
4340                         /* verify remained buf size before copy data */
4341                         if (remained_buf_len < (vndrie_info->vndrie.len +
4342                                                         VNDR_IE_VSIE_OFFSET)) {
4343                                 brcmf_err("no space in mgmt_ie_buf: len left %d",
4344                                           remained_buf_len);
4345                                 break;
4346                         }
4347                         remained_buf_len -= (vndrie_info->ie_len +
4348                                              VNDR_IE_VSIE_OFFSET);
4349
4350                         brcmf_dbg(TRACE, "ADDED ID : %d, Len: %d, OUI:%02x:%02x:%02x\n",
4351                                   vndrie_info->vndrie.id,
4352                                   vndrie_info->vndrie.len,
4353                                   vndrie_info->vndrie.oui[0],
4354                                   vndrie_info->vndrie.oui[1],
4355                                   vndrie_info->vndrie.oui[2]);
4356
4357                         del_add_ie_buf_len = brcmf_vndr_ie(curr_ie_buf, pktflag,
4358                                                            vndrie_info->ie_ptr,
4359                                                            vndrie_info->ie_len,
4360                                                            "add");
4361
4362                         /* save the parsed IE in wl struct */
4363                         memcpy(ptr + (*mgmt_ie_len), vndrie_info->ie_ptr,
4364                                vndrie_info->ie_len);
4365                         *mgmt_ie_len += vndrie_info->ie_len;
4366
4367                         curr_ie_buf += del_add_ie_buf_len;
4368                         total_ie_buf_len += del_add_ie_buf_len;
4369                 }
4370         }
4371         if (total_ie_buf_len) {
4372                 err  = brcmf_fil_bsscfg_data_set(ifp, "vndr_ie", iovar_ie_buf,
4373                                                  total_ie_buf_len);
4374                 if (err)
4375                         brcmf_err("vndr ie set error : %d\n", err);
4376         }
4377
4378 exit:
4379         kfree(iovar_ie_buf);
4380         return err;
4381 }
4382
4383 s32 brcmf_vif_clear_mgmt_ies(struct brcmf_cfg80211_vif *vif)
4384 {
4385         s32 pktflags[] = {
4386                 BRCMF_VNDR_IE_PRBREQ_FLAG,
4387                 BRCMF_VNDR_IE_PRBRSP_FLAG,
4388                 BRCMF_VNDR_IE_BEACON_FLAG
4389         };
4390         int i;
4391
4392         for (i = 0; i < ARRAY_SIZE(pktflags); i++)
4393                 brcmf_vif_set_mgmt_ie(vif, pktflags[i], NULL, 0);
4394
4395         memset(&vif->saved_ie, 0, sizeof(vif->saved_ie));
4396         return 0;
4397 }
4398
4399 static s32
4400 brcmf_config_ap_mgmt_ie(struct brcmf_cfg80211_vif *vif,
4401                         struct cfg80211_beacon_data *beacon)
4402 {
4403         s32 err;
4404
4405         /* Set Beacon IEs to FW */
4406         err = brcmf_vif_set_mgmt_ie(vif, BRCMF_VNDR_IE_BEACON_FLAG,
4407                                     beacon->tail, beacon->tail_len);
4408         if (err) {
4409                 brcmf_err("Set Beacon IE Failed\n");
4410                 return err;
4411         }
4412         brcmf_dbg(TRACE, "Applied Vndr IEs for Beacon\n");
4413
4414         /* Set Probe Response IEs to FW */
4415         err = brcmf_vif_set_mgmt_ie(vif, BRCMF_VNDR_IE_PRBRSP_FLAG,
4416                                     beacon->proberesp_ies,
4417                                     beacon->proberesp_ies_len);
4418         if (err)
4419                 brcmf_err("Set Probe Resp IE Failed\n");
4420         else
4421                 brcmf_dbg(TRACE, "Applied Vndr IEs for Probe Resp\n");
4422
4423         return err;
4424 }
4425
4426 static s32
4427 brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,
4428                         struct cfg80211_ap_settings *settings)
4429 {
4430         s32 ie_offset;
4431         struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
4432         struct brcmf_if *ifp = netdev_priv(ndev);
4433         const struct brcmf_tlv *ssid_ie;
4434         const struct brcmf_tlv *country_ie;
4435         struct brcmf_ssid_le ssid_le;
4436         s32 err = -EPERM;
4437         const struct brcmf_tlv *rsn_ie;
4438         const struct brcmf_vs_tlv *wpa_ie;
4439         struct brcmf_join_params join_params;
4440         enum nl80211_iftype dev_role;
4441         struct brcmf_fil_bss_enable_le bss_enable;
4442         u16 chanspec;
4443         bool mbss;
4444         int is_11d;
4445
4446         brcmf_dbg(TRACE, "ctrlchn=%d, center=%d, bw=%d, beacon_interval=%d, dtim_period=%d,\n",
4447                   settings->chandef.chan->hw_value,
4448                   settings->chandef.center_freq1, settings->chandef.width,
4449                   settings->beacon_interval, settings->dtim_period);
4450         brcmf_dbg(TRACE, "ssid=%s(%zu), auth_type=%d, inactivity_timeout=%d\n",
4451                   settings->ssid, settings->ssid_len, settings->auth_type,
4452                   settings->inactivity_timeout);
4453         dev_role = ifp->vif->wdev.iftype;
4454         mbss = ifp->vif->mbss;
4455
4456         /* store current 11d setting */
4457         brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_REGULATORY, &ifp->vif->is_11d);
4458         country_ie = brcmf_parse_tlvs((u8 *)settings->beacon.tail,
4459                                       settings->beacon.tail_len,
4460                                       WLAN_EID_COUNTRY);
4461         is_11d = country_ie ? 1 : 0;
4462
4463         memset(&ssid_le, 0, sizeof(ssid_le));
4464         if (settings->ssid == NULL || settings->ssid_len == 0) {
4465                 ie_offset = DOT11_MGMT_HDR_LEN + DOT11_BCN_PRB_FIXED_LEN;
4466                 ssid_ie = brcmf_parse_tlvs(
4467                                 (u8 *)&settings->beacon.head[ie_offset],
4468                                 settings->beacon.head_len - ie_offset,
4469                                 WLAN_EID_SSID);
4470                 if (!ssid_ie)
4471                         return -EINVAL;
4472
4473                 memcpy(ssid_le.SSID, ssid_ie->data, ssid_ie->len);
4474                 ssid_le.SSID_len = cpu_to_le32(ssid_ie->len);
4475                 brcmf_dbg(TRACE, "SSID is (%s) in Head\n", ssid_le.SSID);
4476         } else {
4477                 memcpy(ssid_le.SSID, settings->ssid, settings->ssid_len);
4478                 ssid_le.SSID_len = cpu_to_le32((u32)settings->ssid_len);
4479         }
4480
4481         if (!mbss) {
4482                 brcmf_set_mpc(ifp, 0);
4483                 brcmf_configure_arp_nd_offload(ifp, false);
4484         }
4485
4486         /* find the RSN_IE */
4487         rsn_ie = brcmf_parse_tlvs((u8 *)settings->beacon.tail,
4488                                   settings->beacon.tail_len, WLAN_EID_RSN);
4489
4490         /* find the WPA_IE */
4491         wpa_ie = brcmf_find_wpaie((u8 *)settings->beacon.tail,
4492                                   settings->beacon.tail_len);
4493
4494         if ((wpa_ie != NULL || rsn_ie != NULL)) {
4495                 brcmf_dbg(TRACE, "WPA(2) IE is found\n");
4496                 if (wpa_ie != NULL) {
4497                         /* WPA IE */
4498                         err = brcmf_configure_wpaie(ifp, wpa_ie, false);
4499                         if (err < 0)
4500                                 goto exit;
4501                 } else {
4502                         struct brcmf_vs_tlv *tmp_ie;
4503
4504                         tmp_ie = (struct brcmf_vs_tlv *)rsn_ie;
4505
4506                         /* RSN IE */
4507                         err = brcmf_configure_wpaie(ifp, tmp_ie, true);
4508                         if (err < 0)
4509                                 goto exit;
4510                 }
4511         } else {
4512                 brcmf_dbg(TRACE, "No WPA(2) IEs found\n");
4513                 brcmf_configure_opensecurity(ifp);
4514         }
4515
4516         brcmf_config_ap_mgmt_ie(ifp->vif, &settings->beacon);
4517
4518         if (!mbss) {
4519                 chanspec = chandef_to_chanspec(&cfg->d11inf,
4520                                                &settings->chandef);
4521                 err = brcmf_fil_iovar_int_set(ifp, "chanspec", chanspec);
4522                 if (err < 0) {
4523                         brcmf_err("Set Channel failed: chspec=%d, %d\n",
4524                                   chanspec, err);
4525                         goto exit;
4526                 }
4527
4528                 if (is_11d != ifp->vif->is_11d) {
4529                         err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_REGULATORY,
4530                                                     is_11d);
4531                         if (err < 0) {
4532                                 brcmf_err("Regulatory Set Error, %d\n", err);
4533                                 goto exit;
4534                         }
4535                 }
4536                 if (settings->beacon_interval) {
4537                         err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_BCNPRD,
4538                                                     settings->beacon_interval);
4539                         if (err < 0) {
4540                                 brcmf_err("Beacon Interval Set Error, %d\n",
4541                                           err);
4542                                 goto exit;
4543                         }
4544                 }
4545                 if (settings->dtim_period) {
4546                         err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_DTIMPRD,
4547                                                     settings->dtim_period);
4548                         if (err < 0) {
4549                                 brcmf_err("DTIM Interval Set Error, %d\n", err);
4550                                 goto exit;
4551                         }
4552                 }
4553
4554                 if ((dev_role == NL80211_IFTYPE_AP) &&
4555                     ((ifp->ifidx == 0) ||
4556                      !brcmf_feat_is_enabled(ifp, BRCMF_FEAT_RSDB))) {
4557                         err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_DOWN, 1);
4558                         if (err < 0) {
4559                                 brcmf_err("BRCMF_C_DOWN error %d\n", err);
4560                                 goto exit;
4561                         }
4562                         brcmf_fil_iovar_int_set(ifp, "apsta", 0);
4563                 }
4564
4565                 err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_INFRA, 1);
4566                 if (err < 0) {
4567                         brcmf_err("SET INFRA error %d\n", err);
4568                         goto exit;
4569                 }
4570         } else if (WARN_ON(is_11d != ifp->vif->is_11d)) {
4571                 /* Multiple-BSS should use same 11d configuration */
4572                 err = -EINVAL;
4573                 goto exit;
4574         }
4575         if (dev_role == NL80211_IFTYPE_AP) {
4576                 if ((brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MBSS)) && (!mbss))
4577                         brcmf_fil_iovar_int_set(ifp, "mbss", 1);
4578
4579                 err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_AP, 1);
4580                 if (err < 0) {
4581                         brcmf_err("setting AP mode failed %d\n", err);
4582                         goto exit;
4583                 }
4584                 err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_UP, 1);
4585                 if (err < 0) {
4586                         brcmf_err("BRCMF_C_UP error (%d)\n", err);
4587                         goto exit;
4588                 }
4589                 /* On DOWN the firmware removes the WEP keys, reconfigure
4590                  * them if they were set.
4591                  */
4592                 brcmf_cfg80211_reconfigure_wep(ifp);
4593
4594                 memset(&join_params, 0, sizeof(join_params));
4595                 /* join parameters starts with ssid */
4596                 memcpy(&join_params.ssid_le, &ssid_le, sizeof(ssid_le));
4597                 /* create softap */
4598                 err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_SSID,
4599                                              &join_params, sizeof(join_params));
4600                 if (err < 0) {
4601                         brcmf_err("SET SSID error (%d)\n", err);
4602                         goto exit;
4603                 }
4604                 brcmf_dbg(TRACE, "AP mode configuration complete\n");
4605         } else {
4606                 err = brcmf_fil_bsscfg_data_set(ifp, "ssid", &ssid_le,
4607                                                 sizeof(ssid_le));
4608                 if (err < 0) {
4609                         brcmf_err("setting ssid failed %d\n", err);
4610                         goto exit;
4611                 }
4612                 bss_enable.bsscfgidx = cpu_to_le32(ifp->bsscfgidx);
4613                 bss_enable.enable = cpu_to_le32(1);
4614                 err = brcmf_fil_iovar_data_set(ifp, "bss", &bss_enable,
4615                                                sizeof(bss_enable));
4616                 if (err < 0) {
4617                         brcmf_err("bss_enable config failed %d\n", err);
4618                         goto exit;
4619                 }
4620
4621                 brcmf_dbg(TRACE, "GO mode configuration complete\n");
4622         }
4623         set_bit(BRCMF_VIF_STATUS_AP_CREATED, &ifp->vif->sme_state);
4624         brcmf_net_setcarrier(ifp, true);
4625
4626 exit:
4627         if ((err) && (!mbss)) {
4628                 brcmf_set_mpc(ifp, 1);
4629                 brcmf_configure_arp_nd_offload(ifp, true);
4630         }
4631         return err;
4632 }
4633
4634 static int brcmf_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *ndev)
4635 {
4636         struct brcmf_if *ifp = netdev_priv(ndev);
4637         s32 err;
4638         struct brcmf_fil_bss_enable_le bss_enable;
4639         struct brcmf_join_params join_params;
4640
4641         brcmf_dbg(TRACE, "Enter\n");
4642
4643         if (ifp->vif->wdev.iftype == NL80211_IFTYPE_AP) {
4644                 /* Due to most likely deauths outstanding we sleep */
4645                 /* first to make sure they get processed by fw. */
4646                 msleep(400);
4647
4648                 if (ifp->vif->mbss) {
4649                         err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_DOWN, 1);
4650                         return err;
4651                 }
4652
4653                 memset(&join_params, 0, sizeof(join_params));
4654                 err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_SSID,
4655                                              &join_params, sizeof(join_params));
4656                 if (err < 0)
4657                         brcmf_err("SET SSID error (%d)\n", err);
4658                 err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_DOWN, 1);
4659                 if (err < 0)
4660                         brcmf_err("BRCMF_C_DOWN error %d\n", err);
4661                 err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_AP, 0);
4662                 if (err < 0)
4663                         brcmf_err("setting AP mode failed %d\n", err);
4664                 err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_INFRA, 0);
4665                 if (err < 0)
4666                         brcmf_err("setting INFRA mode failed %d\n", err);
4667                 if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MBSS))
4668                         brcmf_fil_iovar_int_set(ifp, "mbss", 0);
4669                 err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_REGULATORY,
4670                                             ifp->vif->is_11d);
4671                 if (err < 0)
4672                         brcmf_err("restoring REGULATORY setting failed %d\n",
4673                                   err);
4674                 /* Bring device back up so it can be used again */
4675                 err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_UP, 1);
4676                 if (err < 0)
4677                         brcmf_err("BRCMF_C_UP error %d\n", err);
4678         } else {
4679                 bss_enable.bsscfgidx = cpu_to_le32(ifp->bsscfgidx);
4680                 bss_enable.enable = cpu_to_le32(0);
4681                 err = brcmf_fil_iovar_data_set(ifp, "bss", &bss_enable,
4682                                                sizeof(bss_enable));
4683                 if (err < 0)
4684                         brcmf_err("bss_enable config failed %d\n", err);
4685         }
4686         brcmf_set_mpc(ifp, 1);
4687         brcmf_configure_arp_nd_offload(ifp, true);
4688         clear_bit(BRCMF_VIF_STATUS_AP_CREATED, &ifp->vif->sme_state);
4689         brcmf_net_setcarrier(ifp, false);
4690
4691         return err;
4692 }
4693
4694 static s32
4695 brcmf_cfg80211_change_beacon(struct wiphy *wiphy, struct net_device *ndev,
4696                              struct cfg80211_beacon_data *info)
4697 {
4698         struct brcmf_if *ifp = netdev_priv(ndev);
4699         s32 err;
4700
4701         brcmf_dbg(TRACE, "Enter\n");
4702
4703         err = brcmf_config_ap_mgmt_ie(ifp->vif, info);
4704
4705         return err;
4706 }
4707
4708 static int
4709 brcmf_cfg80211_del_station(struct wiphy *wiphy, struct net_device *ndev,
4710                            struct station_del_parameters *params)
4711 {
4712         struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
4713         struct brcmf_scb_val_le scbval;
4714         struct brcmf_if *ifp = netdev_priv(ndev);
4715         s32 err;
4716
4717         if (!params->mac)
4718                 return -EFAULT;
4719
4720         brcmf_dbg(TRACE, "Enter %pM\n", params->mac);
4721
4722         if (ifp->vif == cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE].vif)
4723                 ifp = cfg->p2p.bss_idx[P2PAPI_BSSCFG_PRIMARY].vif->ifp;
4724         if (!check_vif_up(ifp->vif))
4725                 return -EIO;
4726
4727         memcpy(&scbval.ea, params->mac, ETH_ALEN);
4728         scbval.val = cpu_to_le32(params->reason_code);
4729         err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SCB_DEAUTHENTICATE_FOR_REASON,
4730                                      &scbval, sizeof(scbval));
4731         if (err)
4732                 brcmf_err("SCB_DEAUTHENTICATE_FOR_REASON failed %d\n", err);
4733
4734         brcmf_dbg(TRACE, "Exit\n");
4735         return err;
4736 }
4737
4738 static int
4739 brcmf_cfg80211_change_station(struct wiphy *wiphy, struct net_device *ndev,
4740                               const u8 *mac, struct station_parameters *params)
4741 {
4742         struct brcmf_if *ifp = netdev_priv(ndev);
4743         s32 err;
4744
4745         brcmf_dbg(TRACE, "Enter, MAC %pM, mask 0x%04x set 0x%04x\n", mac,
4746                   params->sta_flags_mask, params->sta_flags_set);
4747
4748         /* Ignore all 00 MAC */
4749         if (is_zero_ether_addr(mac))
4750                 return 0;
4751
4752         if (!(params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED)))
4753                 return 0;
4754
4755         if (params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED))
4756                 err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_SCB_AUTHORIZE,
4757                                              (void *)mac, ETH_ALEN);
4758         else
4759                 err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_SCB_DEAUTHORIZE,
4760                                              (void *)mac, ETH_ALEN);
4761         if (err < 0)
4762                 brcmf_err("Setting SCB (de-)authorize failed, %d\n", err);
4763
4764         return err;
4765 }
4766
4767 static void
4768 brcmf_cfg80211_mgmt_frame_register(struct wiphy *wiphy,
4769                                    struct wireless_dev *wdev,
4770                                    u16 frame_type, bool reg)
4771 {
4772         struct brcmf_cfg80211_vif *vif;
4773         u16 mgmt_type;
4774
4775         brcmf_dbg(TRACE, "Enter, frame_type %04x, reg=%d\n", frame_type, reg);
4776
4777         mgmt_type = (frame_type & IEEE80211_FCTL_STYPE) >> 4;
4778         vif = container_of(wdev, struct brcmf_cfg80211_vif, wdev);
4779         if (reg)
4780                 vif->mgmt_rx_reg |= BIT(mgmt_type);
4781         else
4782                 vif->mgmt_rx_reg &= ~BIT(mgmt_type);
4783 }
4784
4785
4786 static int
4787 brcmf_cfg80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
4788                        struct cfg80211_mgmt_tx_params *params, u64 *cookie)
4789 {
4790         struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
4791         struct ieee80211_channel *chan = params->chan;
4792         const u8 *buf = params->buf;
4793         size_t len = params->len;
4794         const struct ieee80211_mgmt *mgmt;
4795         struct brcmf_cfg80211_vif *vif;
4796         s32 err = 0;
4797         s32 ie_offset;
4798         s32 ie_len;
4799         struct brcmf_fil_action_frame_le *action_frame;
4800         struct brcmf_fil_af_params_le *af_params;
4801         bool ack;
4802         s32 chan_nr;
4803         u32 freq;
4804
4805         brcmf_dbg(TRACE, "Enter\n");
4806
4807         *cookie = 0;
4808
4809         mgmt = (const struct ieee80211_mgmt *)buf;
4810
4811         if (!ieee80211_is_mgmt(mgmt->frame_control)) {
4812                 brcmf_err("Driver only allows MGMT packet type\n");
4813                 return -EPERM;
4814         }
4815
4816         vif = container_of(wdev, struct brcmf_cfg80211_vif, wdev);
4817
4818         if (ieee80211_is_probe_resp(mgmt->frame_control)) {
4819                 /* Right now the only reason to get a probe response */
4820                 /* is for p2p listen response or for p2p GO from     */
4821                 /* wpa_supplicant. Unfortunately the probe is send   */
4822                 /* on primary ndev, while dongle wants it on the p2p */
4823                 /* vif. Since this is only reason for a probe        */
4824                 /* response to be sent, the vif is taken from cfg.   */
4825                 /* If ever desired to send proberesp for non p2p     */
4826                 /* response then data should be checked for          */
4827                 /* "DIRECT-". Note in future supplicant will take    */
4828                 /* dedicated p2p wdev to do this and then this 'hack'*/
4829                 /* is not needed anymore.                            */
4830                 ie_offset =  DOT11_MGMT_HDR_LEN +
4831                              DOT11_BCN_PRB_FIXED_LEN;
4832                 ie_len = len - ie_offset;
4833                 if (vif == cfg->p2p.bss_idx[P2PAPI_BSSCFG_PRIMARY].vif)
4834                         vif = cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE].vif;
4835                 err = brcmf_vif_set_mgmt_ie(vif,
4836                                             BRCMF_VNDR_IE_PRBRSP_FLAG,
4837                                             &buf[ie_offset],
4838                                             ie_len);
4839                 cfg80211_mgmt_tx_status(wdev, *cookie, buf, len, true,
4840                                         GFP_KERNEL);
4841         } else if (ieee80211_is_action(mgmt->frame_control)) {
4842                 af_params = kzalloc(sizeof(*af_params), GFP_KERNEL);
4843                 if (af_params == NULL) {
4844                         brcmf_err("unable to allocate frame\n");
4845                         err = -ENOMEM;
4846                         goto exit;
4847                 }
4848                 action_frame = &af_params->action_frame;
4849                 /* Add the packet Id */
4850                 action_frame->packet_id = cpu_to_le32(*cookie);
4851                 /* Add BSSID */
4852                 memcpy(&action_frame->da[0], &mgmt->da[0], ETH_ALEN);
4853                 memcpy(&af_params->bssid[0], &mgmt->bssid[0], ETH_ALEN);
4854                 /* Add the length exepted for 802.11 header  */
4855                 action_frame->len = cpu_to_le16(len - DOT11_MGMT_HDR_LEN);
4856                 /* Add the channel. Use the one specified as parameter if any or
4857                  * the current one (got from the firmware) otherwise
4858                  */
4859                 if (chan)
4860                         freq = chan->center_freq;
4861                 else
4862                         brcmf_fil_cmd_int_get(vif->ifp, BRCMF_C_GET_CHANNEL,
4863                                               &freq);
4864                 chan_nr = ieee80211_frequency_to_channel(freq);
4865                 af_params->channel = cpu_to_le32(chan_nr);
4866
4867                 memcpy(action_frame->data, &buf[DOT11_MGMT_HDR_LEN],
4868                        le16_to_cpu(action_frame->len));
4869
4870                 brcmf_dbg(TRACE, "Action frame, cookie=%lld, len=%d, freq=%d\n",
4871                           *cookie, le16_to_cpu(action_frame->len), freq);
4872
4873                 ack = brcmf_p2p_send_action_frame(cfg, cfg_to_ndev(cfg),
4874                                                   af_params);
4875
4876                 cfg80211_mgmt_tx_status(wdev, *cookie, buf, len, ack,
4877                                         GFP_KERNEL);
4878                 kfree(af_params);
4879         } else {
4880                 brcmf_dbg(TRACE, "Unhandled, fc=%04x!!\n", mgmt->frame_control);
4881                 brcmf_dbg_hex_dump(true, buf, len, "payload, len=%Zu\n", len);
4882         }
4883
4884 exit:
4885         return err;
4886 }
4887
4888
4889 static int
4890 brcmf_cfg80211_cancel_remain_on_channel(struct wiphy *wiphy,
4891                                         struct wireless_dev *wdev,
4892                                         u64 cookie)
4893 {
4894         struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
4895         struct brcmf_cfg80211_vif *vif;
4896         int err = 0;
4897
4898         brcmf_dbg(TRACE, "Enter p2p listen cancel\n");
4899
4900         vif = cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE].vif;
4901         if (vif == NULL) {
4902                 brcmf_err("No p2p device available for probe response\n");
4903                 err = -ENODEV;
4904                 goto exit;
4905         }
4906         brcmf_p2p_cancel_remain_on_channel(vif->ifp);
4907 exit:
4908         return err;
4909 }
4910
4911 static int brcmf_cfg80211_crit_proto_start(struct wiphy *wiphy,
4912                                            struct wireless_dev *wdev,
4913                                            enum nl80211_crit_proto_id proto,
4914                                            u16 duration)
4915 {
4916         struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
4917         struct brcmf_cfg80211_vif *vif;
4918
4919         vif = container_of(wdev, struct brcmf_cfg80211_vif, wdev);
4920
4921         /* only DHCP support for now */
4922         if (proto != NL80211_CRIT_PROTO_DHCP)
4923                 return -EINVAL;
4924
4925         /* suppress and abort scanning */
4926         set_bit(BRCMF_SCAN_STATUS_SUPPRESS, &cfg->scan_status);
4927         brcmf_abort_scanning(cfg);
4928
4929         return brcmf_btcoex_set_mode(vif, BRCMF_BTCOEX_DISABLED, duration);
4930 }
4931
4932 static void brcmf_cfg80211_crit_proto_stop(struct wiphy *wiphy,
4933                                            struct wireless_dev *wdev)
4934 {
4935         struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
4936         struct brcmf_cfg80211_vif *vif;
4937
4938         vif = container_of(wdev, struct brcmf_cfg80211_vif, wdev);
4939
4940         brcmf_btcoex_set_mode(vif, BRCMF_BTCOEX_ENABLED, 0);
4941         clear_bit(BRCMF_SCAN_STATUS_SUPPRESS, &cfg->scan_status);
4942 }
4943
4944 static s32
4945 brcmf_notify_tdls_peer_event(struct brcmf_if *ifp,
4946                              const struct brcmf_event_msg *e, void *data)
4947 {
4948         switch (e->reason) {
4949         case BRCMF_E_REASON_TDLS_PEER_DISCOVERED:
4950                 brcmf_dbg(TRACE, "TDLS Peer Discovered\n");
4951                 break;
4952         case BRCMF_E_REASON_TDLS_PEER_CONNECTED:
4953                 brcmf_dbg(TRACE, "TDLS Peer Connected\n");
4954                 brcmf_proto_add_tdls_peer(ifp->drvr, ifp->ifidx, (u8 *)e->addr);
4955                 break;
4956         case BRCMF_E_REASON_TDLS_PEER_DISCONNECTED:
4957                 brcmf_dbg(TRACE, "TDLS Peer Disconnected\n");
4958                 brcmf_proto_delete_peer(ifp->drvr, ifp->ifidx, (u8 *)e->addr);
4959                 break;
4960         }
4961
4962         return 0;
4963 }
4964
4965 static int brcmf_convert_nl80211_tdls_oper(enum nl80211_tdls_operation oper)
4966 {
4967         int ret;
4968
4969         switch (oper) {
4970         case NL80211_TDLS_DISCOVERY_REQ:
4971                 ret = BRCMF_TDLS_MANUAL_EP_DISCOVERY;
4972                 break;
4973         case NL80211_TDLS_SETUP:
4974                 ret = BRCMF_TDLS_MANUAL_EP_CREATE;
4975                 break;
4976         case NL80211_TDLS_TEARDOWN:
4977                 ret = BRCMF_TDLS_MANUAL_EP_DELETE;
4978                 break;
4979         default:
4980                 brcmf_err("unsupported operation: %d\n", oper);
4981                 ret = -EOPNOTSUPP;
4982         }
4983         return ret;
4984 }
4985
4986 static int brcmf_cfg80211_tdls_oper(struct wiphy *wiphy,
4987                                     struct net_device *ndev, const u8 *peer,
4988                                     enum nl80211_tdls_operation oper)
4989 {
4990         struct brcmf_if *ifp;
4991         struct brcmf_tdls_iovar_le info;
4992         int ret = 0;
4993
4994         ret = brcmf_convert_nl80211_tdls_oper(oper);
4995         if (ret < 0)
4996                 return ret;
4997
4998         ifp = netdev_priv(ndev);
4999         memset(&info, 0, sizeof(info));
5000         info.mode = (u8)ret;
5001         if (peer)
5002                 memcpy(info.ea, peer, ETH_ALEN);
5003
5004         ret = brcmf_fil_iovar_data_set(ifp, "tdls_endpoint",
5005                                        &info, sizeof(info));
5006         if (ret < 0)
5007                 brcmf_err("tdls_endpoint iovar failed: ret=%d\n", ret);
5008
5009         return ret;
5010 }
5011
5012 #ifdef CONFIG_PM
5013 static int
5014 brcmf_cfg80211_set_rekey_data(struct wiphy *wiphy, struct net_device *ndev,
5015                               struct cfg80211_gtk_rekey_data *gtk)
5016 {
5017         struct brcmf_if *ifp = netdev_priv(ndev);
5018         struct brcmf_gtk_keyinfo_le gtk_le;
5019         int ret;
5020
5021         brcmf_dbg(TRACE, "Enter, bssidx=%d\n", ifp->bsscfgidx);
5022
5023         memcpy(gtk_le.kck, gtk->kck, sizeof(gtk_le.kck));
5024         memcpy(gtk_le.kek, gtk->kek, sizeof(gtk_le.kek));
5025         memcpy(gtk_le.replay_counter, gtk->replay_ctr,
5026                sizeof(gtk_le.replay_counter));
5027
5028         ret = brcmf_fil_iovar_data_set(ifp, "gtk_key_info", &gtk_le,
5029                                        sizeof(gtk_le));
5030         if (ret < 0)
5031                 brcmf_err("gtk_key_info iovar failed: ret=%d\n", ret);
5032
5033         return ret;
5034 }
5035 #endif
5036
5037 static struct cfg80211_ops brcmf_cfg80211_ops = {
5038         .add_virtual_intf = brcmf_cfg80211_add_iface,
5039         .del_virtual_intf = brcmf_cfg80211_del_iface,
5040         .change_virtual_intf = brcmf_cfg80211_change_iface,
5041         .scan = brcmf_cfg80211_scan,
5042         .set_wiphy_params = brcmf_cfg80211_set_wiphy_params,
5043         .join_ibss = brcmf_cfg80211_join_ibss,
5044         .leave_ibss = brcmf_cfg80211_leave_ibss,
5045         .get_station = brcmf_cfg80211_get_station,
5046         .dump_station = brcmf_cfg80211_dump_station,
5047         .set_tx_power = brcmf_cfg80211_set_tx_power,
5048         .get_tx_power = brcmf_cfg80211_get_tx_power,
5049         .add_key = brcmf_cfg80211_add_key,
5050         .del_key = brcmf_cfg80211_del_key,
5051         .get_key = brcmf_cfg80211_get_key,
5052         .set_default_key = brcmf_cfg80211_config_default_key,
5053         .set_default_mgmt_key = brcmf_cfg80211_config_default_mgmt_key,
5054         .set_power_mgmt = brcmf_cfg80211_set_power_mgmt,
5055         .connect = brcmf_cfg80211_connect,
5056         .disconnect = brcmf_cfg80211_disconnect,
5057         .suspend = brcmf_cfg80211_suspend,
5058         .resume = brcmf_cfg80211_resume,
5059         .set_pmksa = brcmf_cfg80211_set_pmksa,
5060         .del_pmksa = brcmf_cfg80211_del_pmksa,
5061         .flush_pmksa = brcmf_cfg80211_flush_pmksa,
5062         .start_ap = brcmf_cfg80211_start_ap,
5063         .stop_ap = brcmf_cfg80211_stop_ap,
5064         .change_beacon = brcmf_cfg80211_change_beacon,
5065         .del_station = brcmf_cfg80211_del_station,
5066         .change_station = brcmf_cfg80211_change_station,
5067         .sched_scan_start = brcmf_cfg80211_sched_scan_start,
5068         .sched_scan_stop = brcmf_cfg80211_sched_scan_stop,
5069         .mgmt_frame_register = brcmf_cfg80211_mgmt_frame_register,
5070         .mgmt_tx = brcmf_cfg80211_mgmt_tx,
5071         .remain_on_channel = brcmf_p2p_remain_on_channel,
5072         .cancel_remain_on_channel = brcmf_cfg80211_cancel_remain_on_channel,
5073         .start_p2p_device = brcmf_p2p_start_device,
5074         .stop_p2p_device = brcmf_p2p_stop_device,
5075         .crit_proto_start = brcmf_cfg80211_crit_proto_start,
5076         .crit_proto_stop = brcmf_cfg80211_crit_proto_stop,
5077         .tdls_oper = brcmf_cfg80211_tdls_oper,
5078 };
5079
5080 struct brcmf_cfg80211_vif *brcmf_alloc_vif(struct brcmf_cfg80211_info *cfg,
5081                                            enum nl80211_iftype type,
5082                                            bool pm_block)
5083 {
5084         struct brcmf_cfg80211_vif *vif_walk;
5085         struct brcmf_cfg80211_vif *vif;
5086         bool mbss;
5087
5088         brcmf_dbg(TRACE, "allocating virtual interface (size=%zu)\n",
5089                   sizeof(*vif));
5090         vif = kzalloc(sizeof(*vif), GFP_KERNEL);
5091         if (!vif)
5092                 return ERR_PTR(-ENOMEM);
5093
5094         vif->wdev.wiphy = cfg->wiphy;
5095         vif->wdev.iftype = type;
5096
5097         vif->pm_block = pm_block;
5098
5099         brcmf_init_prof(&vif->profile);
5100
5101         if (type == NL80211_IFTYPE_AP) {
5102                 mbss = false;
5103                 list_for_each_entry(vif_walk, &cfg->vif_list, list) {
5104                         if (vif_walk->wdev.iftype == NL80211_IFTYPE_AP) {
5105                                 mbss = true;
5106                                 break;
5107                         }
5108                 }
5109                 vif->mbss = mbss;
5110         }
5111
5112         list_add_tail(&vif->list, &cfg->vif_list);
5113         return vif;
5114 }
5115
5116 void brcmf_free_vif(struct brcmf_cfg80211_vif *vif)
5117 {
5118         list_del(&vif->list);
5119         kfree(vif);
5120 }
5121
5122 void brcmf_cfg80211_free_netdev(struct net_device *ndev)
5123 {
5124         struct brcmf_cfg80211_vif *vif;
5125         struct brcmf_if *ifp;
5126
5127         ifp = netdev_priv(ndev);
5128         vif = ifp->vif;
5129
5130         if (vif)
5131                 brcmf_free_vif(vif);
5132         free_netdev(ndev);
5133 }
5134
5135 static bool brcmf_is_linkup(const struct brcmf_event_msg *e)
5136 {
5137         u32 event = e->event_code;
5138         u32 status = e->status;
5139
5140         if (event == BRCMF_E_SET_SSID && status == BRCMF_E_STATUS_SUCCESS) {
5141                 brcmf_dbg(CONN, "Processing set ssid\n");
5142                 return true;
5143         }
5144
5145         return false;
5146 }
5147
5148 static bool brcmf_is_linkdown(const struct brcmf_event_msg *e)
5149 {
5150         u32 event = e->event_code;
5151         u16 flags = e->flags;
5152
5153         if ((event == BRCMF_E_DEAUTH) || (event == BRCMF_E_DEAUTH_IND) ||
5154             (event == BRCMF_E_DISASSOC_IND) ||
5155             ((event == BRCMF_E_LINK) && (!(flags & BRCMF_EVENT_MSG_LINK)))) {
5156                 brcmf_dbg(CONN, "Processing link down\n");
5157                 return true;
5158         }
5159         return false;
5160 }
5161
5162 static bool brcmf_is_nonetwork(struct brcmf_cfg80211_info *cfg,
5163                                const struct brcmf_event_msg *e)
5164 {
5165         u32 event = e->event_code;
5166         u32 status = e->status;
5167
5168         if (event == BRCMF_E_LINK && status == BRCMF_E_STATUS_NO_NETWORKS) {
5169                 brcmf_dbg(CONN, "Processing Link %s & no network found\n",
5170                           e->flags & BRCMF_EVENT_MSG_LINK ? "up" : "down");
5171                 return true;
5172         }
5173
5174         if (event == BRCMF_E_SET_SSID && status != BRCMF_E_STATUS_SUCCESS) {
5175                 brcmf_dbg(CONN, "Processing connecting & no network found\n");
5176                 return true;
5177         }
5178
5179         return false;
5180 }
5181
5182 static void brcmf_clear_assoc_ies(struct brcmf_cfg80211_info *cfg)
5183 {
5184         struct brcmf_cfg80211_connect_info *conn_info = cfg_to_conn(cfg);
5185
5186         kfree(conn_info->req_ie);
5187         conn_info->req_ie = NULL;
5188         conn_info->req_ie_len = 0;
5189         kfree(conn_info->resp_ie);
5190         conn_info->resp_ie = NULL;
5191         conn_info->resp_ie_len = 0;
5192 }
5193
5194 static s32 brcmf_get_assoc_ies(struct brcmf_cfg80211_info *cfg,
5195                                struct brcmf_if *ifp)
5196 {
5197         struct brcmf_cfg80211_assoc_ielen_le *assoc_info;
5198         struct brcmf_cfg80211_connect_info *conn_info = cfg_to_conn(cfg);
5199         u32 req_len;
5200         u32 resp_len;
5201         s32 err = 0;
5202
5203         brcmf_clear_assoc_ies(cfg);
5204
5205         err = brcmf_fil_iovar_data_get(ifp, "assoc_info",
5206                                        cfg->extra_buf, WL_ASSOC_INFO_MAX);
5207         if (err) {
5208                 brcmf_err("could not get assoc info (%d)\n", err);
5209                 return err;
5210         }
5211         assoc_info =
5212                 (struct brcmf_cfg80211_assoc_ielen_le *)cfg->extra_buf;
5213         req_len = le32_to_cpu(assoc_info->req_len);
5214         resp_len = le32_to_cpu(assoc_info->resp_len);
5215         if (req_len) {
5216                 err = brcmf_fil_iovar_data_get(ifp, "assoc_req_ies",
5217                                                cfg->extra_buf,
5218                                                WL_ASSOC_INFO_MAX);
5219                 if (err) {
5220                         brcmf_err("could not get assoc req (%d)\n", err);
5221                         return err;
5222                 }
5223                 conn_info->req_ie_len = req_len;
5224                 conn_info->req_ie =
5225                     kmemdup(cfg->extra_buf, conn_info->req_ie_len,
5226                             GFP_KERNEL);
5227         } else {
5228                 conn_info->req_ie_len = 0;
5229                 conn_info->req_ie = NULL;
5230         }
5231         if (resp_len) {
5232                 err = brcmf_fil_iovar_data_get(ifp, "assoc_resp_ies",
5233                                                cfg->extra_buf,
5234                                                WL_ASSOC_INFO_MAX);
5235                 if (err) {
5236                         brcmf_err("could not get assoc resp (%d)\n", err);
5237                         return err;
5238                 }
5239                 conn_info->resp_ie_len = resp_len;
5240                 conn_info->resp_ie =
5241                     kmemdup(cfg->extra_buf, conn_info->resp_ie_len,
5242                             GFP_KERNEL);
5243         } else {
5244                 conn_info->resp_ie_len = 0;
5245                 conn_info->resp_ie = NULL;
5246         }
5247         brcmf_dbg(CONN, "req len (%d) resp len (%d)\n",
5248                   conn_info->req_ie_len, conn_info->resp_ie_len);
5249
5250         return err;
5251 }
5252
5253 static s32
5254 brcmf_bss_roaming_done(struct brcmf_cfg80211_info *cfg,
5255                        struct net_device *ndev,
5256                        const struct brcmf_event_msg *e)
5257 {
5258         struct brcmf_if *ifp = netdev_priv(ndev);
5259         struct brcmf_cfg80211_profile *profile = &ifp->vif->profile;
5260         struct brcmf_cfg80211_connect_info *conn_info = cfg_to_conn(cfg);
5261         struct wiphy *wiphy = cfg_to_wiphy(cfg);
5262         struct ieee80211_channel *notify_channel = NULL;
5263         struct ieee80211_supported_band *band;
5264         struct brcmf_bss_info_le *bi;
5265         struct brcmu_chan ch;
5266         u32 freq;
5267         s32 err = 0;
5268         u8 *buf;
5269
5270         brcmf_dbg(TRACE, "Enter\n");
5271
5272         brcmf_get_assoc_ies(cfg, ifp);
5273         memcpy(profile->bssid, e->addr, ETH_ALEN);
5274         brcmf_update_bss_info(cfg, ifp);
5275
5276         buf = kzalloc(WL_BSS_INFO_MAX, GFP_KERNEL);
5277         if (buf == NULL) {
5278                 err = -ENOMEM;
5279                 goto done;
5280         }
5281
5282         /* data sent to dongle has to be little endian */
5283         *(__le32 *)buf = cpu_to_le32(WL_BSS_INFO_MAX);
5284         err = brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_BSS_INFO,
5285                                      buf, WL_BSS_INFO_MAX);
5286
5287         if (err)
5288                 goto done;
5289
5290         bi = (struct brcmf_bss_info_le *)(buf + 4);
5291         ch.chspec = le16_to_cpu(bi->chanspec);
5292         cfg->d11inf.decchspec(&ch);
5293
5294         if (ch.band == BRCMU_CHAN_BAND_2G)
5295                 band = wiphy->bands[NL80211_BAND_2GHZ];
5296         else
5297                 band = wiphy->bands[NL80211_BAND_5GHZ];
5298
5299         freq = ieee80211_channel_to_frequency(ch.chnum, band->band);
5300         notify_channel = ieee80211_get_channel(wiphy, freq);
5301
5302 done:
5303         kfree(buf);
5304         cfg80211_roamed(ndev, notify_channel, (u8 *)profile->bssid,
5305                         conn_info->req_ie, conn_info->req_ie_len,
5306                         conn_info->resp_ie, conn_info->resp_ie_len, GFP_KERNEL);
5307         brcmf_dbg(CONN, "Report roaming result\n");
5308
5309         set_bit(BRCMF_VIF_STATUS_CONNECTED, &ifp->vif->sme_state);
5310         brcmf_dbg(TRACE, "Exit\n");
5311         return err;
5312 }
5313
5314 static s32
5315 brcmf_bss_connect_done(struct brcmf_cfg80211_info *cfg,
5316                        struct net_device *ndev, const struct brcmf_event_msg *e,
5317                        bool completed)
5318 {
5319         struct brcmf_if *ifp = netdev_priv(ndev);
5320         struct brcmf_cfg80211_profile *profile = &ifp->vif->profile;
5321         struct brcmf_cfg80211_connect_info *conn_info = cfg_to_conn(cfg);
5322
5323         brcmf_dbg(TRACE, "Enter\n");
5324
5325         if (test_and_clear_bit(BRCMF_VIF_STATUS_CONNECTING,
5326                                &ifp->vif->sme_state)) {
5327                 if (completed) {
5328                         brcmf_get_assoc_ies(cfg, ifp);
5329                         memcpy(profile->bssid, e->addr, ETH_ALEN);
5330                         brcmf_update_bss_info(cfg, ifp);
5331                         set_bit(BRCMF_VIF_STATUS_CONNECTED,
5332                                 &ifp->vif->sme_state);
5333                 }
5334                 cfg80211_connect_result(ndev,
5335                                         (u8 *)profile->bssid,
5336                                         conn_info->req_ie,
5337                                         conn_info->req_ie_len,
5338                                         conn_info->resp_ie,
5339                                         conn_info->resp_ie_len,
5340                                         completed ? WLAN_STATUS_SUCCESS :
5341                                                     WLAN_STATUS_AUTH_TIMEOUT,
5342                                         GFP_KERNEL);
5343                 brcmf_dbg(CONN, "Report connect result - connection %s\n",
5344                           completed ? "succeeded" : "failed");
5345         }
5346         brcmf_dbg(TRACE, "Exit\n");
5347         return 0;
5348 }
5349
5350 static s32
5351 brcmf_notify_connect_status_ap(struct brcmf_cfg80211_info *cfg,
5352                                struct net_device *ndev,
5353                                const struct brcmf_event_msg *e, void *data)
5354 {
5355         struct brcmf_if *ifp = netdev_priv(ndev);
5356         static int generation;
5357         u32 event = e->event_code;
5358         u32 reason = e->reason;
5359         struct station_info sinfo;
5360
5361         brcmf_dbg(CONN, "event %d, reason %d\n", event, reason);
5362         if (event == BRCMF_E_LINK && reason == BRCMF_E_REASON_LINK_BSSCFG_DIS &&
5363             ndev != cfg_to_ndev(cfg)) {
5364                 brcmf_dbg(CONN, "AP mode link down\n");
5365                 complete(&cfg->vif_disabled);
5366                 if (ifp->vif->mbss)
5367                         brcmf_remove_interface(ifp);
5368                 return 0;
5369         }
5370
5371         if (((event == BRCMF_E_ASSOC_IND) || (event == BRCMF_E_REASSOC_IND)) &&
5372             (reason == BRCMF_E_STATUS_SUCCESS)) {
5373                 memset(&sinfo, 0, sizeof(sinfo));
5374                 if (!data) {
5375                         brcmf_err("No IEs present in ASSOC/REASSOC_IND");
5376                         return -EINVAL;
5377                 }
5378                 sinfo.assoc_req_ies = data;
5379                 sinfo.assoc_req_ies_len = e->datalen;
5380                 generation++;
5381                 sinfo.generation = generation;
5382                 cfg80211_new_sta(ndev, e->addr, &sinfo, GFP_KERNEL);
5383         } else if ((event == BRCMF_E_DISASSOC_IND) ||
5384                    (event == BRCMF_E_DEAUTH_IND) ||
5385                    (event == BRCMF_E_DEAUTH)) {
5386                 cfg80211_del_sta(ndev, e->addr, GFP_KERNEL);
5387         }
5388         return 0;
5389 }
5390
5391 static s32
5392 brcmf_notify_connect_status(struct brcmf_if *ifp,
5393                             const struct brcmf_event_msg *e, void *data)
5394 {
5395         struct brcmf_cfg80211_info *cfg = ifp->drvr->config;
5396         struct net_device *ndev = ifp->ndev;
5397         struct brcmf_cfg80211_profile *profile = &ifp->vif->profile;
5398         struct ieee80211_channel *chan;
5399         s32 err = 0;
5400
5401         if ((e->event_code == BRCMF_E_DEAUTH) ||
5402             (e->event_code == BRCMF_E_DEAUTH_IND) ||
5403             (e->event_code == BRCMF_E_DISASSOC_IND) ||
5404             ((e->event_code == BRCMF_E_LINK) && (!e->flags))) {
5405                 brcmf_proto_delete_peer(ifp->drvr, ifp->ifidx, (u8 *)e->addr);
5406         }
5407
5408         if (brcmf_is_apmode(ifp->vif)) {
5409                 err = brcmf_notify_connect_status_ap(cfg, ndev, e, data);
5410         } else if (brcmf_is_linkup(e)) {
5411                 brcmf_dbg(CONN, "Linkup\n");
5412                 if (brcmf_is_ibssmode(ifp->vif)) {
5413                         brcmf_inform_ibss(cfg, ndev, e->addr);
5414                         chan = ieee80211_get_channel(cfg->wiphy, cfg->channel);
5415                         memcpy(profile->bssid, e->addr, ETH_ALEN);
5416                         cfg80211_ibss_joined(ndev, e->addr, chan, GFP_KERNEL);
5417                         clear_bit(BRCMF_VIF_STATUS_CONNECTING,
5418                                   &ifp->vif->sme_state);
5419                         set_bit(BRCMF_VIF_STATUS_CONNECTED,
5420                                 &ifp->vif->sme_state);
5421                 } else
5422                         brcmf_bss_connect_done(cfg, ndev, e, true);
5423                 brcmf_net_setcarrier(ifp, true);
5424         } else if (brcmf_is_linkdown(e)) {
5425                 brcmf_dbg(CONN, "Linkdown\n");
5426                 if (!brcmf_is_ibssmode(ifp->vif)) {
5427                         brcmf_bss_connect_done(cfg, ndev, e, false);
5428                         brcmf_link_down(ifp->vif,
5429                                         brcmf_map_fw_linkdown_reason(e));
5430                         brcmf_init_prof(ndev_to_prof(ndev));
5431                         if (ndev != cfg_to_ndev(cfg))
5432                                 complete(&cfg->vif_disabled);
5433                         brcmf_net_setcarrier(ifp, false);
5434                 }
5435         } else if (brcmf_is_nonetwork(cfg, e)) {
5436                 if (brcmf_is_ibssmode(ifp->vif))
5437                         clear_bit(BRCMF_VIF_STATUS_CONNECTING,
5438                                   &ifp->vif->sme_state);
5439                 else
5440                         brcmf_bss_connect_done(cfg, ndev, e, false);
5441         }
5442
5443         return err;
5444 }
5445
5446 static s32
5447 brcmf_notify_roaming_status(struct brcmf_if *ifp,
5448                             const struct brcmf_event_msg *e, void *data)
5449 {
5450         struct brcmf_cfg80211_info *cfg = ifp->drvr->config;
5451         u32 event = e->event_code;
5452         u32 status = e->status;
5453
5454         if (event == BRCMF_E_ROAM && status == BRCMF_E_STATUS_SUCCESS) {
5455                 if (test_bit(BRCMF_VIF_STATUS_CONNECTED, &ifp->vif->sme_state))
5456                         brcmf_bss_roaming_done(cfg, ifp->ndev, e);
5457                 else
5458                         brcmf_bss_connect_done(cfg, ifp->ndev, e, true);
5459         }
5460
5461         return 0;
5462 }
5463
5464 static s32
5465 brcmf_notify_mic_status(struct brcmf_if *ifp,
5466                         const struct brcmf_event_msg *e, void *data)
5467 {
5468         u16 flags = e->flags;
5469         enum nl80211_key_type key_type;
5470
5471         if (flags & BRCMF_EVENT_MSG_GROUP)
5472                 key_type = NL80211_KEYTYPE_GROUP;
5473         else
5474                 key_type = NL80211_KEYTYPE_PAIRWISE;
5475
5476         cfg80211_michael_mic_failure(ifp->ndev, (u8 *)&e->addr, key_type, -1,
5477                                      NULL, GFP_KERNEL);
5478
5479         return 0;
5480 }
5481
5482 static s32 brcmf_notify_vif_event(struct brcmf_if *ifp,
5483                                   const struct brcmf_event_msg *e, void *data)
5484 {
5485         struct brcmf_cfg80211_info *cfg = ifp->drvr->config;
5486         struct brcmf_if_event *ifevent = (struct brcmf_if_event *)data;
5487         struct brcmf_cfg80211_vif_event *event = &cfg->vif_event;
5488         struct brcmf_cfg80211_vif *vif;
5489
5490         brcmf_dbg(TRACE, "Enter: action %u flags %u ifidx %u bsscfgidx %u\n",
5491                   ifevent->action, ifevent->flags, ifevent->ifidx,
5492                   ifevent->bsscfgidx);
5493
5494         mutex_lock(&event->vif_event_lock);
5495         event->action = ifevent->action;
5496         vif = event->vif;
5497
5498         switch (ifevent->action) {
5499         case BRCMF_E_IF_ADD:
5500                 /* waiting process may have timed out */
5501                 if (!cfg->vif_event.vif) {
5502                         mutex_unlock(&event->vif_event_lock);
5503                         return -EBADF;
5504                 }
5505
5506                 ifp->vif = vif;
5507                 vif->ifp = ifp;
5508                 if (ifp->ndev) {
5509                         vif->wdev.netdev = ifp->ndev;
5510                         ifp->ndev->ieee80211_ptr = &vif->wdev;
5511                         SET_NETDEV_DEV(ifp->ndev, wiphy_dev(cfg->wiphy));
5512                 }
5513                 mutex_unlock(&event->vif_event_lock);
5514                 wake_up(&event->vif_wq);
5515                 return 0;
5516
5517         case BRCMF_E_IF_DEL:
5518                 mutex_unlock(&event->vif_event_lock);
5519                 /* event may not be upon user request */
5520                 if (brcmf_cfg80211_vif_event_armed(cfg))
5521                         wake_up(&event->vif_wq);
5522                 return 0;
5523
5524         case BRCMF_E_IF_CHANGE:
5525                 mutex_unlock(&event->vif_event_lock);
5526                 wake_up(&event->vif_wq);
5527                 return 0;
5528
5529         default:
5530                 mutex_unlock(&event->vif_event_lock);
5531                 break;
5532         }
5533         return -EINVAL;
5534 }
5535
5536 static void brcmf_init_conf(struct brcmf_cfg80211_conf *conf)
5537 {
5538         conf->frag_threshold = (u32)-1;
5539         conf->rts_threshold = (u32)-1;
5540         conf->retry_short = (u32)-1;
5541         conf->retry_long = (u32)-1;
5542 }
5543
5544 static void brcmf_register_event_handlers(struct brcmf_cfg80211_info *cfg)
5545 {
5546         brcmf_fweh_register(cfg->pub, BRCMF_E_LINK,
5547                             brcmf_notify_connect_status);
5548         brcmf_fweh_register(cfg->pub, BRCMF_E_DEAUTH_IND,
5549                             brcmf_notify_connect_status);
5550         brcmf_fweh_register(cfg->pub, BRCMF_E_DEAUTH,
5551                             brcmf_notify_connect_status);
5552         brcmf_fweh_register(cfg->pub, BRCMF_E_DISASSOC_IND,
5553                             brcmf_notify_connect_status);
5554         brcmf_fweh_register(cfg->pub, BRCMF_E_ASSOC_IND,
5555                             brcmf_notify_connect_status);
5556         brcmf_fweh_register(cfg->pub, BRCMF_E_REASSOC_IND,
5557                             brcmf_notify_connect_status);
5558         brcmf_fweh_register(cfg->pub, BRCMF_E_ROAM,
5559                             brcmf_notify_roaming_status);
5560         brcmf_fweh_register(cfg->pub, BRCMF_E_MIC_ERROR,
5561                             brcmf_notify_mic_status);
5562         brcmf_fweh_register(cfg->pub, BRCMF_E_SET_SSID,
5563                             brcmf_notify_connect_status);
5564         brcmf_fweh_register(cfg->pub, BRCMF_E_PFN_NET_FOUND,
5565                             brcmf_notify_sched_scan_results);
5566         brcmf_fweh_register(cfg->pub, BRCMF_E_IF,
5567                             brcmf_notify_vif_event);
5568         brcmf_fweh_register(cfg->pub, BRCMF_E_P2P_PROBEREQ_MSG,
5569                             brcmf_p2p_notify_rx_mgmt_p2p_probereq);
5570         brcmf_fweh_register(cfg->pub, BRCMF_E_P2P_DISC_LISTEN_COMPLETE,
5571                             brcmf_p2p_notify_listen_complete);
5572         brcmf_fweh_register(cfg->pub, BRCMF_E_ACTION_FRAME_RX,
5573                             brcmf_p2p_notify_action_frame_rx);
5574         brcmf_fweh_register(cfg->pub, BRCMF_E_ACTION_FRAME_COMPLETE,
5575                             brcmf_p2p_notify_action_tx_complete);
5576         brcmf_fweh_register(cfg->pub, BRCMF_E_ACTION_FRAME_OFF_CHAN_COMPLETE,
5577                             brcmf_p2p_notify_action_tx_complete);
5578 }
5579
5580 static void brcmf_deinit_priv_mem(struct brcmf_cfg80211_info *cfg)
5581 {
5582         kfree(cfg->conf);
5583         cfg->conf = NULL;
5584         kfree(cfg->extra_buf);
5585         cfg->extra_buf = NULL;
5586         kfree(cfg->wowl.nd);
5587         cfg->wowl.nd = NULL;
5588         kfree(cfg->wowl.nd_info);
5589         cfg->wowl.nd_info = NULL;
5590         kfree(cfg->escan_info.escan_buf);
5591         cfg->escan_info.escan_buf = NULL;
5592 }
5593
5594 static s32 brcmf_init_priv_mem(struct brcmf_cfg80211_info *cfg)
5595 {
5596         cfg->conf = kzalloc(sizeof(*cfg->conf), GFP_KERNEL);
5597         if (!cfg->conf)
5598                 goto init_priv_mem_out;
5599         cfg->extra_buf = kzalloc(WL_EXTRA_BUF_MAX, GFP_KERNEL);
5600         if (!cfg->extra_buf)
5601                 goto init_priv_mem_out;
5602         cfg->wowl.nd = kzalloc(sizeof(*cfg->wowl.nd) + sizeof(u32), GFP_KERNEL);
5603         if (!cfg->wowl.nd)
5604                 goto init_priv_mem_out;
5605         cfg->wowl.nd_info = kzalloc(sizeof(*cfg->wowl.nd_info) +
5606                                     sizeof(struct cfg80211_wowlan_nd_match *),
5607                                     GFP_KERNEL);
5608         if (!cfg->wowl.nd_info)
5609                 goto init_priv_mem_out;
5610         cfg->escan_info.escan_buf = kzalloc(BRCMF_ESCAN_BUF_SIZE, GFP_KERNEL);
5611         if (!cfg->escan_info.escan_buf)
5612                 goto init_priv_mem_out;
5613
5614         return 0;
5615
5616 init_priv_mem_out:
5617         brcmf_deinit_priv_mem(cfg);
5618
5619         return -ENOMEM;
5620 }
5621
5622 static s32 wl_init_priv(struct brcmf_cfg80211_info *cfg)
5623 {
5624         s32 err = 0;
5625
5626         cfg->scan_request = NULL;
5627         cfg->pwr_save = true;
5628         cfg->active_scan = true;        /* we do active scan per default */
5629         cfg->dongle_up = false;         /* dongle is not up yet */
5630         err = brcmf_init_priv_mem(cfg);
5631         if (err)
5632                 return err;
5633         brcmf_register_event_handlers(cfg);
5634         mutex_init(&cfg->usr_sync);
5635         brcmf_init_escan(cfg);
5636         brcmf_init_conf(cfg->conf);
5637         init_completion(&cfg->vif_disabled);
5638         return err;
5639 }
5640
5641 static void wl_deinit_priv(struct brcmf_cfg80211_info *cfg)
5642 {
5643         cfg->dongle_up = false; /* dongle down */
5644         brcmf_abort_scanning(cfg);
5645         brcmf_deinit_priv_mem(cfg);
5646 }
5647
5648 static void init_vif_event(struct brcmf_cfg80211_vif_event *event)
5649 {
5650         init_waitqueue_head(&event->vif_wq);
5651         mutex_init(&event->vif_event_lock);
5652 }
5653
5654 static s32 brcmf_dongle_roam(struct brcmf_if *ifp)
5655 {
5656         s32 err;
5657         u32 bcn_timeout;
5658         __le32 roamtrigger[2];
5659         __le32 roam_delta[2];
5660
5661         /* Configure beacon timeout value based upon roaming setting */
5662         if (ifp->drvr->settings->roamoff)
5663                 bcn_timeout = BRCMF_DEFAULT_BCN_TIMEOUT_ROAM_OFF;
5664         else
5665                 bcn_timeout = BRCMF_DEFAULT_BCN_TIMEOUT_ROAM_ON;
5666         err = brcmf_fil_iovar_int_set(ifp, "bcn_timeout", bcn_timeout);
5667         if (err) {
5668                 brcmf_err("bcn_timeout error (%d)\n", err);
5669                 goto roam_setup_done;
5670         }
5671
5672         /* Enable/Disable built-in roaming to allow supplicant to take care of
5673          * roaming.
5674          */
5675         brcmf_dbg(INFO, "Internal Roaming = %s\n",
5676                   ifp->drvr->settings->roamoff ? "Off" : "On");
5677         err = brcmf_fil_iovar_int_set(ifp, "roam_off",
5678                                       ifp->drvr->settings->roamoff);
5679         if (err) {
5680                 brcmf_err("roam_off error (%d)\n", err);
5681                 goto roam_setup_done;
5682         }
5683
5684         roamtrigger[0] = cpu_to_le32(WL_ROAM_TRIGGER_LEVEL);
5685         roamtrigger[1] = cpu_to_le32(BRCM_BAND_ALL);
5686         err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_ROAM_TRIGGER,
5687                                      (void *)roamtrigger, sizeof(roamtrigger));
5688         if (err) {
5689                 brcmf_err("WLC_SET_ROAM_TRIGGER error (%d)\n", err);
5690                 goto roam_setup_done;
5691         }
5692
5693         roam_delta[0] = cpu_to_le32(WL_ROAM_DELTA);
5694         roam_delta[1] = cpu_to_le32(BRCM_BAND_ALL);
5695         err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_ROAM_DELTA,
5696                                      (void *)roam_delta, sizeof(roam_delta));
5697         if (err) {
5698                 brcmf_err("WLC_SET_ROAM_DELTA error (%d)\n", err);
5699                 goto roam_setup_done;
5700         }
5701
5702 roam_setup_done:
5703         return err;
5704 }
5705
5706 static s32
5707 brcmf_dongle_scantime(struct brcmf_if *ifp)
5708 {
5709         s32 err = 0;
5710
5711         err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_SCAN_CHANNEL_TIME,
5712                                     BRCMF_SCAN_CHANNEL_TIME);
5713         if (err) {
5714                 brcmf_err("Scan assoc time error (%d)\n", err);
5715                 goto dongle_scantime_out;
5716         }
5717         err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_SCAN_UNASSOC_TIME,
5718                                     BRCMF_SCAN_UNASSOC_TIME);
5719         if (err) {
5720                 brcmf_err("Scan unassoc time error (%d)\n", err);
5721                 goto dongle_scantime_out;
5722         }
5723
5724         err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_SCAN_PASSIVE_TIME,
5725                                     BRCMF_SCAN_PASSIVE_TIME);
5726         if (err) {
5727                 brcmf_err("Scan passive time error (%d)\n", err);
5728                 goto dongle_scantime_out;
5729         }
5730
5731 dongle_scantime_out:
5732         return err;
5733 }
5734
5735 static void brcmf_update_bw40_channel_flag(struct ieee80211_channel *channel,
5736                                            struct brcmu_chan *ch)
5737 {
5738         u32 ht40_flag;
5739
5740         ht40_flag = channel->flags & IEEE80211_CHAN_NO_HT40;
5741         if (ch->sb == BRCMU_CHAN_SB_U) {
5742                 if (ht40_flag == IEEE80211_CHAN_NO_HT40)
5743                         channel->flags &= ~IEEE80211_CHAN_NO_HT40;
5744                 channel->flags |= IEEE80211_CHAN_NO_HT40PLUS;
5745         } else {
5746                 /* It should be one of
5747                  * IEEE80211_CHAN_NO_HT40 or
5748                  * IEEE80211_CHAN_NO_HT40PLUS
5749                  */
5750                 channel->flags &= ~IEEE80211_CHAN_NO_HT40;
5751                 if (ht40_flag == IEEE80211_CHAN_NO_HT40)
5752                         channel->flags |= IEEE80211_CHAN_NO_HT40MINUS;
5753         }
5754 }
5755
5756 static int brcmf_construct_chaninfo(struct brcmf_cfg80211_info *cfg,
5757                                     u32 bw_cap[])
5758 {
5759         struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg));
5760         struct ieee80211_supported_band *band;
5761         struct ieee80211_channel *channel;
5762         struct wiphy *wiphy;
5763         struct brcmf_chanspec_list *list;
5764         struct brcmu_chan ch;
5765         int err;
5766         u8 *pbuf;
5767         u32 i, j;
5768         u32 total;
5769         u32 chaninfo;
5770         u32 index;
5771
5772         pbuf = kzalloc(BRCMF_DCMD_MEDLEN, GFP_KERNEL);
5773
5774         if (pbuf == NULL)
5775                 return -ENOMEM;
5776
5777         list = (struct brcmf_chanspec_list *)pbuf;
5778
5779         err = brcmf_fil_iovar_data_get(ifp, "chanspecs", pbuf,
5780                                        BRCMF_DCMD_MEDLEN);
5781         if (err) {
5782                 brcmf_err("get chanspecs error (%d)\n", err);
5783                 goto fail_pbuf;
5784         }
5785
5786         wiphy = cfg_to_wiphy(cfg);
5787         band = wiphy->bands[NL80211_BAND_2GHZ];
5788         if (band)
5789                 for (i = 0; i < band->n_channels; i++)
5790                         band->channels[i].flags = IEEE80211_CHAN_DISABLED;
5791         band = wiphy->bands[NL80211_BAND_5GHZ];
5792         if (band)
5793                 for (i = 0; i < band->n_channels; i++)
5794                         band->channels[i].flags = IEEE80211_CHAN_DISABLED;
5795
5796         total = le32_to_cpu(list->count);
5797         for (i = 0; i < total; i++) {
5798                 ch.chspec = (u16)le32_to_cpu(list->element[i]);
5799                 cfg->d11inf.decchspec(&ch);
5800
5801                 if (ch.band == BRCMU_CHAN_BAND_2G) {
5802                         band = wiphy->bands[NL80211_BAND_2GHZ];
5803                 } else if (ch.band == BRCMU_CHAN_BAND_5G) {
5804                         band = wiphy->bands[NL80211_BAND_5GHZ];
5805                 } else {
5806                         brcmf_err("Invalid channel Spec. 0x%x.\n", ch.chspec);
5807                         continue;
5808                 }
5809                 if (!band)
5810                         continue;
5811                 if (!(bw_cap[band->band] & WLC_BW_40MHZ_BIT) &&
5812                     ch.bw == BRCMU_CHAN_BW_40)
5813                         continue;
5814                 if (!(bw_cap[band->band] & WLC_BW_80MHZ_BIT) &&
5815                     ch.bw == BRCMU_CHAN_BW_80)
5816                         continue;
5817
5818                 channel = band->channels;
5819                 index = band->n_channels;
5820                 for (j = 0; j < band->n_channels; j++) {
5821                         if (channel[j].hw_value == ch.chnum) {
5822                                 index = j;
5823                                 break;
5824                         }
5825                 }
5826                 channel[index].center_freq =
5827                         ieee80211_channel_to_frequency(ch.chnum, band->band);
5828                 channel[index].hw_value = ch.chnum;
5829
5830                 /* assuming the chanspecs order is HT20,
5831                  * HT40 upper, HT40 lower, and VHT80.
5832                  */
5833                 if (ch.bw == BRCMU_CHAN_BW_80) {
5834                         channel[index].flags &= ~IEEE80211_CHAN_NO_80MHZ;
5835                 } else if (ch.bw == BRCMU_CHAN_BW_40) {
5836                         brcmf_update_bw40_channel_flag(&channel[index], &ch);
5837                 } else {
5838                         /* enable the channel and disable other bandwidths
5839                          * for now as mentioned order assure they are enabled
5840                          * for subsequent chanspecs.
5841                          */
5842                         channel[index].flags = IEEE80211_CHAN_NO_HT40 |
5843                                                IEEE80211_CHAN_NO_80MHZ;
5844                         ch.bw = BRCMU_CHAN_BW_20;
5845                         cfg->d11inf.encchspec(&ch);
5846                         chaninfo = ch.chspec;
5847                         err = brcmf_fil_bsscfg_int_get(ifp, "per_chan_info",
5848                                                        &chaninfo);
5849                         if (!err) {
5850                                 if (chaninfo & WL_CHAN_RADAR)
5851                                         channel[index].flags |=
5852                                                 (IEEE80211_CHAN_RADAR |
5853                                                  IEEE80211_CHAN_NO_IR);
5854                                 if (chaninfo & WL_CHAN_PASSIVE)
5855                                         channel[index].flags |=
5856                                                 IEEE80211_CHAN_NO_IR;
5857                         }
5858                 }
5859         }
5860
5861 fail_pbuf:
5862         kfree(pbuf);
5863         return err;
5864 }
5865
5866 static int brcmf_enable_bw40_2g(struct brcmf_cfg80211_info *cfg)
5867 {
5868         struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg));
5869         struct ieee80211_supported_band *band;
5870         struct brcmf_fil_bwcap_le band_bwcap;
5871         struct brcmf_chanspec_list *list;
5872         u8 *pbuf;
5873         u32 val;
5874         int err;
5875         struct brcmu_chan ch;
5876         u32 num_chan;
5877         int i, j;
5878
5879         /* verify support for bw_cap command */
5880         val = WLC_BAND_5G;
5881         err = brcmf_fil_iovar_int_get(ifp, "bw_cap", &val);
5882
5883         if (!err) {
5884                 /* only set 2G bandwidth using bw_cap command */
5885                 band_bwcap.band = cpu_to_le32(WLC_BAND_2G);
5886                 band_bwcap.bw_cap = cpu_to_le32(WLC_BW_CAP_40MHZ);
5887                 err = brcmf_fil_iovar_data_set(ifp, "bw_cap", &band_bwcap,
5888                                                sizeof(band_bwcap));
5889         } else {
5890                 brcmf_dbg(INFO, "fallback to mimo_bw_cap\n");
5891                 val = WLC_N_BW_40ALL;
5892                 err = brcmf_fil_iovar_int_set(ifp, "mimo_bw_cap", val);
5893         }
5894
5895         if (!err) {
5896                 /* update channel info in 2G band */
5897                 pbuf = kzalloc(BRCMF_DCMD_MEDLEN, GFP_KERNEL);
5898
5899                 if (pbuf == NULL)
5900                         return -ENOMEM;
5901
5902                 ch.band = BRCMU_CHAN_BAND_2G;
5903                 ch.bw = BRCMU_CHAN_BW_40;
5904                 ch.sb = BRCMU_CHAN_SB_NONE;
5905                 ch.chnum = 0;
5906                 cfg->d11inf.encchspec(&ch);
5907
5908                 /* pass encoded chanspec in query */
5909                 *(__le16 *)pbuf = cpu_to_le16(ch.chspec);
5910
5911                 err = brcmf_fil_iovar_data_get(ifp, "chanspecs", pbuf,
5912                                                BRCMF_DCMD_MEDLEN);
5913                 if (err) {
5914                         brcmf_err("get chanspecs error (%d)\n", err);
5915                         kfree(pbuf);
5916                         return err;
5917                 }
5918
5919                 band = cfg_to_wiphy(cfg)->bands[NL80211_BAND_2GHZ];
5920                 list = (struct brcmf_chanspec_list *)pbuf;
5921                 num_chan = le32_to_cpu(list->count);
5922                 for (i = 0; i < num_chan; i++) {
5923                         ch.chspec = (u16)le32_to_cpu(list->element[i]);
5924                         cfg->d11inf.decchspec(&ch);
5925                         if (WARN_ON(ch.band != BRCMU_CHAN_BAND_2G))
5926                                 continue;
5927                         if (WARN_ON(ch.bw != BRCMU_CHAN_BW_40))
5928                                 continue;
5929                         for (j = 0; j < band->n_channels; j++) {
5930                                 if (band->channels[j].hw_value == ch.chnum)
5931                                         break;
5932                         }
5933                         if (WARN_ON(j == band->n_channels))
5934                                 continue;
5935
5936                         brcmf_update_bw40_channel_flag(&band->channels[j], &ch);
5937                 }
5938                 kfree(pbuf);
5939         }
5940         return err;
5941 }
5942
5943 static void brcmf_get_bwcap(struct brcmf_if *ifp, u32 bw_cap[])
5944 {
5945         u32 band, mimo_bwcap;
5946         int err;
5947
5948         band = WLC_BAND_2G;
5949         err = brcmf_fil_iovar_int_get(ifp, "bw_cap", &band);
5950         if (!err) {
5951                 bw_cap[NL80211_BAND_2GHZ] = band;
5952                 band = WLC_BAND_5G;
5953                 err = brcmf_fil_iovar_int_get(ifp, "bw_cap", &band);
5954                 if (!err) {
5955                         bw_cap[NL80211_BAND_5GHZ] = band;
5956                         return;
5957                 }
5958                 WARN_ON(1);
5959                 return;
5960         }
5961         brcmf_dbg(INFO, "fallback to mimo_bw_cap info\n");
5962         mimo_bwcap = 0;
5963         err = brcmf_fil_iovar_int_get(ifp, "mimo_bw_cap", &mimo_bwcap);
5964         if (err)
5965                 /* assume 20MHz if firmware does not give a clue */
5966                 mimo_bwcap = WLC_N_BW_20ALL;
5967
5968         switch (mimo_bwcap) {
5969         case WLC_N_BW_40ALL:
5970                 bw_cap[NL80211_BAND_2GHZ] |= WLC_BW_40MHZ_BIT;
5971                 /* fall-thru */
5972         case WLC_N_BW_20IN2G_40IN5G:
5973                 bw_cap[NL80211_BAND_5GHZ] |= WLC_BW_40MHZ_BIT;
5974                 /* fall-thru */
5975         case WLC_N_BW_20ALL:
5976                 bw_cap[NL80211_BAND_2GHZ] |= WLC_BW_20MHZ_BIT;
5977                 bw_cap[NL80211_BAND_5GHZ] |= WLC_BW_20MHZ_BIT;
5978                 break;
5979         default:
5980                 brcmf_err("invalid mimo_bw_cap value\n");
5981         }
5982 }
5983
5984 static void brcmf_update_ht_cap(struct ieee80211_supported_band *band,
5985                                 u32 bw_cap[2], u32 nchain)
5986 {
5987         band->ht_cap.ht_supported = true;
5988         if (bw_cap[band->band] & WLC_BW_40MHZ_BIT) {
5989                 band->ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
5990                 band->ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
5991         }
5992         band->ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
5993         band->ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
5994         band->ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
5995         band->ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_16;
5996         memset(band->ht_cap.mcs.rx_mask, 0xff, nchain);
5997         band->ht_cap.mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
5998 }
5999
6000 static __le16 brcmf_get_mcs_map(u32 nchain, enum ieee80211_vht_mcs_support supp)
6001 {
6002         u16 mcs_map;
6003         int i;
6004
6005         for (i = 0, mcs_map = 0xFFFF; i < nchain; i++)
6006                 mcs_map = (mcs_map << 2) | supp;
6007
6008         return cpu_to_le16(mcs_map);
6009 }
6010
6011 static void brcmf_update_vht_cap(struct ieee80211_supported_band *band,
6012                                  u32 bw_cap[2], u32 nchain, u32 txstreams,
6013                                  u32 txbf_bfe_cap, u32 txbf_bfr_cap)
6014 {
6015         __le16 mcs_map;
6016
6017         /* not allowed in 2.4G band */
6018         if (band->band == NL80211_BAND_2GHZ)
6019                 return;
6020
6021         band->vht_cap.vht_supported = true;
6022         /* 80MHz is mandatory */
6023         band->vht_cap.cap |= IEEE80211_VHT_CAP_SHORT_GI_80;
6024         if (bw_cap[band->band] & WLC_BW_160MHZ_BIT) {
6025                 band->vht_cap.cap |= IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ;
6026                 band->vht_cap.cap |= IEEE80211_VHT_CAP_SHORT_GI_160;
6027         }
6028         /* all support 256-QAM */
6029         mcs_map = brcmf_get_mcs_map(nchain, IEEE80211_VHT_MCS_SUPPORT_0_9);
6030         band->vht_cap.vht_mcs.rx_mcs_map = mcs_map;
6031         band->vht_cap.vht_mcs.tx_mcs_map = mcs_map;
6032
6033         /* Beamforming support information */
6034         if (txbf_bfe_cap & BRCMF_TXBF_SU_BFE_CAP)
6035                 band->vht_cap.cap |= IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE;
6036         if (txbf_bfe_cap & BRCMF_TXBF_MU_BFE_CAP)
6037                 band->vht_cap.cap |= IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE;
6038         if (txbf_bfr_cap & BRCMF_TXBF_SU_BFR_CAP)
6039                 band->vht_cap.cap |= IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE;
6040         if (txbf_bfr_cap & BRCMF_TXBF_MU_BFR_CAP)
6041                 band->vht_cap.cap |= IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE;
6042
6043         if ((txbf_bfe_cap || txbf_bfr_cap) && (txstreams > 1)) {
6044                 band->vht_cap.cap |=
6045                         (2 << IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT);
6046                 band->vht_cap.cap |= ((txstreams - 1) <<
6047                                 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT);
6048                 band->vht_cap.cap |=
6049                         IEEE80211_VHT_CAP_VHT_LINK_ADAPTATION_VHT_MRQ_MFB;
6050         }
6051 }
6052
6053 static int brcmf_setup_wiphybands(struct wiphy *wiphy)
6054 {
6055         struct brcmf_cfg80211_info *cfg = wiphy_priv(wiphy);
6056         struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg));
6057         u32 nmode = 0;
6058         u32 vhtmode = 0;
6059         u32 bw_cap[2] = { WLC_BW_20MHZ_BIT, WLC_BW_20MHZ_BIT };
6060         u32 rxchain;
6061         u32 nchain;
6062         int err;
6063         s32 i;
6064         struct ieee80211_supported_band *band;
6065         u32 txstreams = 0;
6066         u32 txbf_bfe_cap = 0;
6067         u32 txbf_bfr_cap = 0;
6068
6069         (void)brcmf_fil_iovar_int_get(ifp, "vhtmode", &vhtmode);
6070         err = brcmf_fil_iovar_int_get(ifp, "nmode", &nmode);
6071         if (err) {
6072                 brcmf_err("nmode error (%d)\n", err);
6073         } else {
6074                 brcmf_get_bwcap(ifp, bw_cap);
6075         }
6076         brcmf_dbg(INFO, "nmode=%d, vhtmode=%d, bw_cap=(%d, %d)\n",
6077                   nmode, vhtmode, bw_cap[NL80211_BAND_2GHZ],
6078                   bw_cap[NL80211_BAND_5GHZ]);
6079
6080         err = brcmf_fil_iovar_int_get(ifp, "rxchain", &rxchain);
6081         if (err) {
6082                 brcmf_err("rxchain error (%d)\n", err);
6083                 nchain = 1;
6084         } else {
6085                 for (nchain = 0; rxchain; nchain++)
6086                         rxchain = rxchain & (rxchain - 1);
6087         }
6088         brcmf_dbg(INFO, "nchain=%d\n", nchain);
6089
6090         err = brcmf_construct_chaninfo(cfg, bw_cap);
6091         if (err) {
6092                 brcmf_err("brcmf_construct_chaninfo failed (%d)\n", err);
6093                 return err;
6094         }
6095
6096         if (vhtmode) {
6097                 (void)brcmf_fil_iovar_int_get(ifp, "txstreams", &txstreams);
6098                 (void)brcmf_fil_iovar_int_get(ifp, "txbf_bfe_cap",
6099                                               &txbf_bfe_cap);
6100                 (void)brcmf_fil_iovar_int_get(ifp, "txbf_bfr_cap",
6101                                               &txbf_bfr_cap);
6102         }
6103
6104         wiphy = cfg_to_wiphy(cfg);
6105         for (i = 0; i < ARRAY_SIZE(wiphy->bands); i++) {
6106                 band = wiphy->bands[i];
6107                 if (band == NULL)
6108                         continue;
6109
6110                 if (nmode)
6111                         brcmf_update_ht_cap(band, bw_cap, nchain);
6112                 if (vhtmode)
6113                         brcmf_update_vht_cap(band, bw_cap, nchain, txstreams,
6114                                              txbf_bfe_cap, txbf_bfr_cap);
6115         }
6116
6117         return 0;
6118 }
6119
6120 static const struct ieee80211_txrx_stypes
6121 brcmf_txrx_stypes[NUM_NL80211_IFTYPES] = {
6122         [NL80211_IFTYPE_STATION] = {
6123                 .tx = 0xffff,
6124                 .rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
6125                       BIT(IEEE80211_STYPE_PROBE_REQ >> 4)
6126         },
6127         [NL80211_IFTYPE_P2P_CLIENT] = {
6128                 .tx = 0xffff,
6129                 .rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
6130                       BIT(IEEE80211_STYPE_PROBE_REQ >> 4)
6131         },
6132         [NL80211_IFTYPE_P2P_GO] = {
6133                 .tx = 0xffff,
6134                 .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) |
6135                       BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) |
6136                       BIT(IEEE80211_STYPE_PROBE_REQ >> 4) |
6137                       BIT(IEEE80211_STYPE_DISASSOC >> 4) |
6138                       BIT(IEEE80211_STYPE_AUTH >> 4) |
6139                       BIT(IEEE80211_STYPE_DEAUTH >> 4) |
6140                       BIT(IEEE80211_STYPE_ACTION >> 4)
6141         },
6142         [NL80211_IFTYPE_P2P_DEVICE] = {
6143                 .tx = 0xffff,
6144                 .rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
6145                       BIT(IEEE80211_STYPE_PROBE_REQ >> 4)
6146         }
6147 };
6148
6149 /**
6150  * brcmf_setup_ifmodes() - determine interface modes and combinations.
6151  *
6152  * @wiphy: wiphy object.
6153  * @ifp: interface object needed for feat module api.
6154  *
6155  * The interface modes and combinations are determined dynamically here
6156  * based on firmware functionality.
6157  *
6158  * no p2p and no mbss:
6159  *
6160  *      #STA <= 1, #AP <= 1, channels = 1, 2 total
6161  *
6162  * no p2p and mbss:
6163  *
6164  *      #STA <= 1, #AP <= 1, channels = 1, 2 total
6165  *      #AP <= 4, matching BI, channels = 1, 4 total
6166  *
6167  * p2p, no mchan, and mbss:
6168  *
6169  *      #STA <= 1, #P2P-DEV <= 1, #{P2P-CL, P2P-GO} <= 1, channels = 1, 3 total
6170  *      #STA <= 1, #P2P-DEV <= 1, #AP <= 1, #P2P-CL <= 1, channels = 1, 4 total
6171  *      #AP <= 4, matching BI, channels = 1, 4 total
6172  *
6173  * p2p, mchan, and mbss:
6174  *
6175  *      #STA <= 1, #P2P-DEV <= 1, #{P2P-CL, P2P-GO} <= 1, channels = 2, 3 total
6176  *      #STA <= 1, #P2P-DEV <= 1, #AP <= 1, #P2P-CL <= 1, channels = 1, 4 total
6177  *      #AP <= 4, matching BI, channels = 1, 4 total
6178  */
6179 static int brcmf_setup_ifmodes(struct wiphy *wiphy, struct brcmf_if *ifp)
6180 {
6181         struct ieee80211_iface_combination *combo = NULL;
6182         struct ieee80211_iface_limit *c0_limits = NULL;
6183         struct ieee80211_iface_limit *p2p_limits = NULL;
6184         struct ieee80211_iface_limit *mbss_limits = NULL;
6185         bool mbss, p2p;
6186         int i, c, n_combos;
6187
6188         mbss = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MBSS);
6189         p2p = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_P2P);
6190
6191         n_combos = 1 + !!p2p + !!mbss;
6192         combo = kcalloc(n_combos, sizeof(*combo), GFP_KERNEL);
6193         if (!combo)
6194                 goto err;
6195
6196         c0_limits = kcalloc(p2p ? 3 : 2, sizeof(*c0_limits), GFP_KERNEL);
6197         if (!c0_limits)
6198                 goto err;
6199
6200         if (p2p) {
6201                 p2p_limits = kcalloc(4, sizeof(*p2p_limits), GFP_KERNEL);
6202                 if (!p2p_limits)
6203                         goto err;
6204         }
6205
6206         if (mbss) {
6207                 mbss_limits = kcalloc(1, sizeof(*mbss_limits), GFP_KERNEL);
6208                 if (!mbss_limits)
6209                         goto err;
6210         }
6211
6212         wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
6213                                  BIT(NL80211_IFTYPE_ADHOC) |
6214                                  BIT(NL80211_IFTYPE_AP);
6215
6216         c = 0;
6217         i = 0;
6218         combo[c].num_different_channels = 1;
6219         c0_limits[i].max = 1;
6220         c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
6221         if (p2p) {
6222                 if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MCHAN))
6223                         combo[c].num_different_channels = 2;
6224                 wiphy->interface_modes |= BIT(NL80211_IFTYPE_P2P_CLIENT) |
6225                                           BIT(NL80211_IFTYPE_P2P_GO) |
6226                                           BIT(NL80211_IFTYPE_P2P_DEVICE);
6227                 c0_limits[i].max = 1;
6228                 c0_limits[i++].types = BIT(NL80211_IFTYPE_P2P_DEVICE);
6229                 c0_limits[i].max = 1;
6230                 c0_limits[i++].types = BIT(NL80211_IFTYPE_P2P_CLIENT) |
6231                                        BIT(NL80211_IFTYPE_P2P_GO);
6232         } else {
6233                 c0_limits[i].max = 1;
6234                 c0_limits[i++].types = BIT(NL80211_IFTYPE_AP);
6235         }
6236         combo[c].max_interfaces = i;
6237         combo[c].n_limits = i;
6238         combo[c].limits = c0_limits;
6239
6240         if (p2p) {
6241                 c++;
6242                 i = 0;
6243                 combo[c].num_different_channels = 1;
6244                 p2p_limits[i].max = 1;
6245                 p2p_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
6246                 p2p_limits[i].max = 1;
6247                 p2p_limits[i++].types = BIT(NL80211_IFTYPE_AP);
6248                 p2p_limits[i].max = 1;
6249                 p2p_limits[i++].types = BIT(NL80211_IFTYPE_P2P_CLIENT);
6250                 p2p_limits[i].max = 1;
6251                 p2p_limits[i++].types = BIT(NL80211_IFTYPE_P2P_DEVICE);
6252                 combo[c].max_interfaces = i;
6253                 combo[c].n_limits = i;
6254                 combo[c].limits = p2p_limits;
6255         }
6256
6257         if (mbss) {
6258                 c++;
6259                 combo[c].beacon_int_infra_match = true;
6260                 combo[c].num_different_channels = 1;
6261                 mbss_limits[0].max = 4;
6262                 mbss_limits[0].types = BIT(NL80211_IFTYPE_AP);
6263                 combo[c].max_interfaces = 4;
6264                 combo[c].n_limits = 1;
6265                 combo[c].limits = mbss_limits;
6266         }
6267         wiphy->n_iface_combinations = n_combos;
6268         wiphy->iface_combinations = combo;
6269         return 0;
6270
6271 err:
6272         kfree(c0_limits);
6273         kfree(p2p_limits);
6274         kfree(mbss_limits);
6275         kfree(combo);
6276         return -ENOMEM;
6277 }
6278
6279 static void brcmf_wiphy_pno_params(struct wiphy *wiphy)
6280 {
6281         /* scheduled scan settings */
6282         wiphy->max_sched_scan_ssids = BRCMF_PNO_MAX_PFN_COUNT;
6283         wiphy->max_match_sets = BRCMF_PNO_MAX_PFN_COUNT;
6284         wiphy->max_sched_scan_ie_len = BRCMF_SCAN_IE_LEN_MAX;
6285         wiphy->flags |= WIPHY_FLAG_SUPPORTS_SCHED_SCAN;
6286 }
6287
6288 #ifdef CONFIG_PM
6289 static struct wiphy_wowlan_support brcmf_wowlan_support = {
6290         .flags = WIPHY_WOWLAN_MAGIC_PKT | WIPHY_WOWLAN_DISCONNECT,
6291         .n_patterns = BRCMF_WOWL_MAXPATTERNS,
6292         .pattern_max_len = BRCMF_WOWL_MAXPATTERNSIZE,
6293         .pattern_min_len = 1,
6294         .max_pkt_offset = 1500,
6295 };
6296 #endif
6297
6298 static void brcmf_wiphy_wowl_params(struct wiphy *wiphy, struct brcmf_if *ifp)
6299 {
6300 #ifdef CONFIG_PM
6301         struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
6302
6303         if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_PNO)) {
6304                 if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_ND)) {
6305                         brcmf_wowlan_support.flags |= WIPHY_WOWLAN_NET_DETECT;
6306                         init_waitqueue_head(&cfg->wowl.nd_data_wait);
6307                 }
6308         }
6309         if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_GTK)) {
6310                 brcmf_wowlan_support.flags |= WIPHY_WOWLAN_SUPPORTS_GTK_REKEY;
6311                 brcmf_wowlan_support.flags |= WIPHY_WOWLAN_GTK_REKEY_FAILURE;
6312         }
6313
6314         wiphy->wowlan = &brcmf_wowlan_support;
6315 #endif
6316 }
6317
6318 static int brcmf_setup_wiphy(struct wiphy *wiphy, struct brcmf_if *ifp)
6319 {
6320         struct brcmf_pub *drvr = ifp->drvr;
6321         const struct ieee80211_iface_combination *combo;
6322         struct ieee80211_supported_band *band;
6323         u16 max_interfaces = 0;
6324         __le32 bandlist[3];
6325         u32 n_bands;
6326         int err, i;
6327
6328         wiphy->max_scan_ssids = WL_NUM_SCAN_MAX;
6329         wiphy->max_scan_ie_len = BRCMF_SCAN_IE_LEN_MAX;
6330         wiphy->max_num_pmkids = BRCMF_MAXPMKID;
6331
6332         err = brcmf_setup_ifmodes(wiphy, ifp);
6333         if (err)
6334                 return err;
6335
6336         for (i = 0, combo = wiphy->iface_combinations;
6337              i < wiphy->n_iface_combinations; i++, combo++) {
6338                 max_interfaces = max(max_interfaces, combo->max_interfaces);
6339         }
6340
6341         for (i = 0; i < max_interfaces && i < ARRAY_SIZE(drvr->addresses);
6342              i++) {
6343                 u8 *addr = drvr->addresses[i].addr;
6344
6345                 memcpy(addr, drvr->mac, ETH_ALEN);
6346                 if (i) {
6347                         addr[0] |= BIT(1);
6348                         addr[ETH_ALEN - 1] ^= i;
6349                 }
6350         }
6351         wiphy->addresses = drvr->addresses;
6352         wiphy->n_addresses = i;
6353
6354         wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM;
6355         wiphy->cipher_suites = brcmf_cipher_suites;
6356         wiphy->n_cipher_suites = ARRAY_SIZE(brcmf_cipher_suites);
6357         if (!brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MFP))
6358                 wiphy->n_cipher_suites--;
6359         wiphy->bss_select_support = BIT(NL80211_BSS_SELECT_ATTR_RSSI) |
6360                                     BIT(NL80211_BSS_SELECT_ATTR_BAND_PREF) |
6361                                     BIT(NL80211_BSS_SELECT_ATTR_RSSI_ADJUST);
6362
6363         wiphy->flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT |
6364                         WIPHY_FLAG_OFFCHAN_TX |
6365                         WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
6366         if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_TDLS))
6367                 wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS;
6368         if (!ifp->drvr->settings->roamoff)
6369                 wiphy->flags |= WIPHY_FLAG_SUPPORTS_FW_ROAM;
6370         wiphy->mgmt_stypes = brcmf_txrx_stypes;
6371         wiphy->max_remain_on_channel_duration = 5000;
6372         if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_PNO))
6373                 brcmf_wiphy_pno_params(wiphy);
6374
6375         /* vendor commands/events support */
6376         wiphy->vendor_commands = brcmf_vendor_cmds;
6377         wiphy->n_vendor_commands = BRCMF_VNDR_CMDS_LAST - 1;
6378
6379         if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL))
6380                 brcmf_wiphy_wowl_params(wiphy, ifp);
6381         err = brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_BANDLIST, &bandlist,
6382                                      sizeof(bandlist));
6383         if (err) {
6384                 brcmf_err("could not obtain band info: err=%d\n", err);
6385                 return err;
6386         }
6387         /* first entry in bandlist is number of bands */
6388         n_bands = le32_to_cpu(bandlist[0]);
6389         for (i = 1; i <= n_bands && i < ARRAY_SIZE(bandlist); i++) {
6390                 if (bandlist[i] == cpu_to_le32(WLC_BAND_2G)) {
6391                         band = kmemdup(&__wl_band_2ghz, sizeof(__wl_band_2ghz),
6392                                        GFP_KERNEL);
6393                         if (!band)
6394                                 return -ENOMEM;
6395
6396                         band->channels = kmemdup(&__wl_2ghz_channels,
6397                                                  sizeof(__wl_2ghz_channels),
6398                                                  GFP_KERNEL);
6399                         if (!band->channels) {
6400                                 kfree(band);
6401                                 return -ENOMEM;
6402                         }
6403
6404                         band->n_channels = ARRAY_SIZE(__wl_2ghz_channels);
6405                         wiphy->bands[NL80211_BAND_2GHZ] = band;
6406                 }
6407                 if (bandlist[i] == cpu_to_le32(WLC_BAND_5G)) {
6408                         band = kmemdup(&__wl_band_5ghz, sizeof(__wl_band_5ghz),
6409                                        GFP_KERNEL);
6410                         if (!band)
6411                                 return -ENOMEM;
6412
6413                         band->channels = kmemdup(&__wl_5ghz_channels,
6414                                                  sizeof(__wl_5ghz_channels),
6415                                                  GFP_KERNEL);
6416                         if (!band->channels) {
6417                                 kfree(band);
6418                                 return -ENOMEM;
6419                         }
6420
6421                         band->n_channels = ARRAY_SIZE(__wl_5ghz_channels);
6422                         wiphy->bands[NL80211_BAND_5GHZ] = band;
6423                 }
6424         }
6425         err = brcmf_setup_wiphybands(wiphy);
6426         return err;
6427 }
6428
6429 static s32 brcmf_config_dongle(struct brcmf_cfg80211_info *cfg)
6430 {
6431         struct net_device *ndev;
6432         struct wireless_dev *wdev;
6433         struct brcmf_if *ifp;
6434         s32 power_mode;
6435         s32 err = 0;
6436
6437         if (cfg->dongle_up)
6438                 return err;
6439
6440         ndev = cfg_to_ndev(cfg);
6441         wdev = ndev->ieee80211_ptr;
6442         ifp = netdev_priv(ndev);
6443
6444         /* make sure RF is ready for work */
6445         brcmf_fil_cmd_int_set(ifp, BRCMF_C_UP, 0);
6446
6447         brcmf_dongle_scantime(ifp);
6448
6449         power_mode = cfg->pwr_save ? PM_FAST : PM_OFF;
6450         err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_PM, power_mode);
6451         if (err)
6452                 goto default_conf_out;
6453         brcmf_dbg(INFO, "power save set to %s\n",
6454                   (power_mode ? "enabled" : "disabled"));
6455
6456         err = brcmf_dongle_roam(ifp);
6457         if (err)
6458                 goto default_conf_out;
6459         err = brcmf_cfg80211_change_iface(wdev->wiphy, ndev, wdev->iftype,
6460                                           NULL, NULL);
6461         if (err)
6462                 goto default_conf_out;
6463
6464         brcmf_configure_arp_nd_offload(ifp, true);
6465
6466         cfg->dongle_up = true;
6467 default_conf_out:
6468
6469         return err;
6470
6471 }
6472
6473 static s32 __brcmf_cfg80211_up(struct brcmf_if *ifp)
6474 {
6475         set_bit(BRCMF_VIF_STATUS_READY, &ifp->vif->sme_state);
6476
6477         return brcmf_config_dongle(ifp->drvr->config);
6478 }
6479
6480 static s32 __brcmf_cfg80211_down(struct brcmf_if *ifp)
6481 {
6482         struct brcmf_cfg80211_info *cfg = ifp->drvr->config;
6483
6484         /*
6485          * While going down, if associated with AP disassociate
6486          * from AP to save power
6487          */
6488         if (check_vif_up(ifp->vif)) {
6489                 brcmf_link_down(ifp->vif, WLAN_REASON_UNSPECIFIED);
6490
6491                 /* Make sure WPA_Supplicant receives all the event
6492                    generated due to DISASSOC call to the fw to keep
6493                    the state fw and WPA_Supplicant state consistent
6494                  */
6495                 brcmf_delay(500);
6496         }
6497
6498         brcmf_abort_scanning(cfg);
6499         clear_bit(BRCMF_VIF_STATUS_READY, &ifp->vif->sme_state);
6500
6501         return 0;
6502 }
6503
6504 s32 brcmf_cfg80211_up(struct net_device *ndev)
6505 {
6506         struct brcmf_if *ifp = netdev_priv(ndev);
6507         struct brcmf_cfg80211_info *cfg = ifp->drvr->config;
6508         s32 err = 0;
6509
6510         mutex_lock(&cfg->usr_sync);
6511         err = __brcmf_cfg80211_up(ifp);
6512         mutex_unlock(&cfg->usr_sync);
6513
6514         return err;
6515 }
6516
6517 s32 brcmf_cfg80211_down(struct net_device *ndev)
6518 {
6519         struct brcmf_if *ifp = netdev_priv(ndev);
6520         struct brcmf_cfg80211_info *cfg = ifp->drvr->config;
6521         s32 err = 0;
6522
6523         mutex_lock(&cfg->usr_sync);
6524         err = __brcmf_cfg80211_down(ifp);
6525         mutex_unlock(&cfg->usr_sync);
6526
6527         return err;
6528 }
6529
6530 enum nl80211_iftype brcmf_cfg80211_get_iftype(struct brcmf_if *ifp)
6531 {
6532         struct wireless_dev *wdev = &ifp->vif->wdev;
6533
6534         return wdev->iftype;
6535 }
6536
6537 bool brcmf_get_vif_state_any(struct brcmf_cfg80211_info *cfg,
6538                              unsigned long state)
6539 {
6540         struct brcmf_cfg80211_vif *vif;
6541
6542         list_for_each_entry(vif, &cfg->vif_list, list) {
6543                 if (test_bit(state, &vif->sme_state))
6544                         return true;
6545         }
6546         return false;
6547 }
6548
6549 static inline bool vif_event_equals(struct brcmf_cfg80211_vif_event *event,
6550                                     u8 action)
6551 {
6552         u8 evt_action;
6553
6554         mutex_lock(&event->vif_event_lock);
6555         evt_action = event->action;
6556         mutex_unlock(&event->vif_event_lock);
6557         return evt_action == action;
6558 }
6559
6560 void brcmf_cfg80211_arm_vif_event(struct brcmf_cfg80211_info *cfg,
6561                                   struct brcmf_cfg80211_vif *vif)
6562 {
6563         struct brcmf_cfg80211_vif_event *event = &cfg->vif_event;
6564
6565         mutex_lock(&event->vif_event_lock);
6566         event->vif = vif;
6567         event->action = 0;
6568         mutex_unlock(&event->vif_event_lock);
6569 }
6570
6571 bool brcmf_cfg80211_vif_event_armed(struct brcmf_cfg80211_info *cfg)
6572 {
6573         struct brcmf_cfg80211_vif_event *event = &cfg->vif_event;
6574         bool armed;
6575
6576         mutex_lock(&event->vif_event_lock);
6577         armed = event->vif != NULL;
6578         mutex_unlock(&event->vif_event_lock);
6579
6580         return armed;
6581 }
6582
6583 int brcmf_cfg80211_wait_vif_event(struct brcmf_cfg80211_info *cfg,
6584                                   u8 action, ulong timeout)
6585 {
6586         struct brcmf_cfg80211_vif_event *event = &cfg->vif_event;
6587
6588         return wait_event_timeout(event->vif_wq,
6589                                   vif_event_equals(event, action), timeout);
6590 }
6591
6592 static s32 brcmf_translate_country_code(struct brcmf_pub *drvr, char alpha2[2],
6593                                         struct brcmf_fil_country_le *ccreq)
6594 {
6595         struct brcmfmac_pd_cc *country_codes;
6596         struct brcmfmac_pd_cc_entry *cc;
6597         s32 found_index;
6598         int i;
6599
6600         country_codes = drvr->settings->country_codes;
6601         if (!country_codes) {
6602                 brcmf_dbg(TRACE, "No country codes configured for device\n");
6603                 return -EINVAL;
6604         }
6605
6606         if ((alpha2[0] == ccreq->country_abbrev[0]) &&
6607             (alpha2[1] == ccreq->country_abbrev[1])) {
6608                 brcmf_dbg(TRACE, "Country code already set\n");
6609                 return -EAGAIN;
6610         }
6611
6612         found_index = -1;
6613         for (i = 0; i < country_codes->table_size; i++) {
6614                 cc = &country_codes->table[i];
6615                 if ((cc->iso3166[0] == '\0') && (found_index == -1))
6616                         found_index = i;
6617                 if ((cc->iso3166[0] == alpha2[0]) &&
6618                     (cc->iso3166[1] == alpha2[1])) {
6619                         found_index = i;
6620                         break;
6621                 }
6622         }
6623         if (found_index == -1) {
6624                 brcmf_dbg(TRACE, "No country code match found\n");
6625                 return -EINVAL;
6626         }
6627         memset(ccreq, 0, sizeof(*ccreq));
6628         ccreq->rev = cpu_to_le32(country_codes->table[found_index].rev);
6629         memcpy(ccreq->ccode, country_codes->table[found_index].cc,
6630                BRCMF_COUNTRY_BUF_SZ);
6631         ccreq->country_abbrev[0] = alpha2[0];
6632         ccreq->country_abbrev[1] = alpha2[1];
6633         ccreq->country_abbrev[2] = 0;
6634
6635         return 0;
6636 }
6637
6638 static void brcmf_cfg80211_reg_notifier(struct wiphy *wiphy,
6639                                         struct regulatory_request *req)
6640 {
6641         struct brcmf_cfg80211_info *cfg = wiphy_priv(wiphy);
6642         struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg));
6643         struct brcmf_fil_country_le ccreq;
6644         s32 err;
6645         int i;
6646
6647         /* ignore non-ISO3166 country codes */
6648         for (i = 0; i < sizeof(req->alpha2); i++)
6649                 if (req->alpha2[i] < 'A' || req->alpha2[i] > 'Z') {
6650                         brcmf_err("not a ISO3166 code (0x%02x 0x%02x)\n",
6651                                   req->alpha2[0], req->alpha2[1]);
6652                         return;
6653                 }
6654
6655         brcmf_dbg(TRACE, "Enter: initiator=%d, alpha=%c%c\n", req->initiator,
6656                   req->alpha2[0], req->alpha2[1]);
6657
6658         err = brcmf_fil_iovar_data_get(ifp, "country", &ccreq, sizeof(ccreq));
6659         if (err) {
6660                 brcmf_err("Country code iovar returned err = %d\n", err);
6661                 return;
6662         }
6663
6664         err = brcmf_translate_country_code(ifp->drvr, req->alpha2, &ccreq);
6665         if (err)
6666                 return;
6667
6668         err = brcmf_fil_iovar_data_set(ifp, "country", &ccreq, sizeof(ccreq));
6669         if (err) {
6670                 brcmf_err("Firmware rejected country setting\n");
6671                 return;
6672         }
6673         brcmf_setup_wiphybands(wiphy);
6674 }
6675
6676 static void brcmf_free_wiphy(struct wiphy *wiphy)
6677 {
6678         int i;
6679
6680         if (!wiphy)
6681                 return;
6682
6683         if (wiphy->iface_combinations) {
6684                 for (i = 0; i < wiphy->n_iface_combinations; i++)
6685                         kfree(wiphy->iface_combinations[i].limits);
6686         }
6687         kfree(wiphy->iface_combinations);
6688         if (wiphy->bands[NL80211_BAND_2GHZ]) {
6689                 kfree(wiphy->bands[NL80211_BAND_2GHZ]->channels);
6690                 kfree(wiphy->bands[NL80211_BAND_2GHZ]);
6691         }
6692         if (wiphy->bands[NL80211_BAND_5GHZ]) {
6693                 kfree(wiphy->bands[NL80211_BAND_5GHZ]->channels);
6694                 kfree(wiphy->bands[NL80211_BAND_5GHZ]);
6695         }
6696         wiphy_free(wiphy);
6697 }
6698
6699 struct brcmf_cfg80211_info *brcmf_cfg80211_attach(struct brcmf_pub *drvr,
6700                                                   struct device *busdev,
6701                                                   bool p2pdev_forced)
6702 {
6703         struct net_device *ndev = brcmf_get_ifp(drvr, 0)->ndev;
6704         struct brcmf_cfg80211_info *cfg;
6705         struct wiphy *wiphy;
6706         struct cfg80211_ops *ops;
6707         struct brcmf_cfg80211_vif *vif;
6708         struct brcmf_if *ifp;
6709         s32 err = 0;
6710         s32 io_type;
6711         u16 *cap = NULL;
6712
6713         if (!ndev) {
6714                 brcmf_err("ndev is invalid\n");
6715                 return NULL;
6716         }
6717
6718         ops = kzalloc(sizeof(*ops), GFP_KERNEL);
6719         if (!ops)
6720                 return NULL;
6721
6722         memcpy(ops, &brcmf_cfg80211_ops, sizeof(*ops));
6723         ifp = netdev_priv(ndev);
6724 #ifdef CONFIG_PM
6725         if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_GTK))
6726                 ops->set_rekey_data = brcmf_cfg80211_set_rekey_data;
6727 #endif
6728         wiphy = wiphy_new(ops, sizeof(struct brcmf_cfg80211_info));
6729         if (!wiphy) {
6730                 brcmf_err("Could not allocate wiphy device\n");
6731                 return NULL;
6732         }
6733         memcpy(wiphy->perm_addr, drvr->mac, ETH_ALEN);
6734         set_wiphy_dev(wiphy, busdev);
6735
6736         cfg = wiphy_priv(wiphy);
6737         cfg->wiphy = wiphy;
6738         cfg->ops = ops;
6739         cfg->pub = drvr;
6740         init_vif_event(&cfg->vif_event);
6741         INIT_LIST_HEAD(&cfg->vif_list);
6742
6743         vif = brcmf_alloc_vif(cfg, NL80211_IFTYPE_STATION, false);
6744         if (IS_ERR(vif))
6745                 goto wiphy_out;
6746
6747         vif->ifp = ifp;
6748         vif->wdev.netdev = ndev;
6749         ndev->ieee80211_ptr = &vif->wdev;
6750         SET_NETDEV_DEV(ndev, wiphy_dev(cfg->wiphy));
6751
6752         err = wl_init_priv(cfg);
6753         if (err) {
6754                 brcmf_err("Failed to init iwm_priv (%d)\n", err);
6755                 brcmf_free_vif(vif);
6756                 goto wiphy_out;
6757         }
6758         ifp->vif = vif;
6759
6760         /* determine d11 io type before wiphy setup */
6761         err = brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_VERSION, &io_type);
6762         if (err) {
6763                 brcmf_err("Failed to get D11 version (%d)\n", err);
6764                 goto priv_out;
6765         }
6766         cfg->d11inf.io_type = (u8)io_type;
6767         brcmu_d11_attach(&cfg->d11inf);
6768
6769         err = brcmf_setup_wiphy(wiphy, ifp);
6770         if (err < 0)
6771                 goto priv_out;
6772
6773         brcmf_dbg(INFO, "Registering custom regulatory\n");
6774         wiphy->reg_notifier = brcmf_cfg80211_reg_notifier;
6775         wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG;
6776         wiphy_apply_custom_regulatory(wiphy, &brcmf_regdom);
6777
6778         /* firmware defaults to 40MHz disabled in 2G band. We signal
6779          * cfg80211 here that we do and have it decide we can enable
6780          * it. But first check if device does support 2G operation.
6781          */
6782         if (wiphy->bands[NL80211_BAND_2GHZ]) {
6783                 cap = &wiphy->bands[NL80211_BAND_2GHZ]->ht_cap.cap;
6784                 *cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
6785         }
6786         err = wiphy_register(wiphy);
6787         if (err < 0) {
6788                 brcmf_err("Could not register wiphy device (%d)\n", err);
6789                 goto priv_out;
6790         }
6791
6792         /* If cfg80211 didn't disable 40MHz HT CAP in wiphy_register(),
6793          * setup 40MHz in 2GHz band and enable OBSS scanning.
6794          */
6795         if (cap && (*cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40)) {
6796                 err = brcmf_enable_bw40_2g(cfg);
6797                 if (!err)
6798                         err = brcmf_fil_iovar_int_set(ifp, "obss_coex",
6799                                                       BRCMF_OBSS_COEX_AUTO);
6800                 else
6801                         *cap &= ~IEEE80211_HT_CAP_SUP_WIDTH_20_40;
6802         }
6803         /* p2p might require that "if-events" get processed by fweh. So
6804          * activate the already registered event handlers now and activate
6805          * the rest when initialization has completed. drvr->config needs to
6806          * be assigned before activating events.
6807          */
6808         drvr->config = cfg;
6809         err = brcmf_fweh_activate_events(ifp);
6810         if (err) {
6811                 brcmf_err("FWEH activation failed (%d)\n", err);
6812                 goto wiphy_unreg_out;
6813         }
6814
6815         err = brcmf_p2p_attach(cfg, p2pdev_forced);
6816         if (err) {
6817                 brcmf_err("P2P initilisation failed (%d)\n", err);
6818                 goto wiphy_unreg_out;
6819         }
6820         err = brcmf_btcoex_attach(cfg);
6821         if (err) {
6822                 brcmf_err("BT-coex initialisation failed (%d)\n", err);
6823                 brcmf_p2p_detach(&cfg->p2p);
6824                 goto wiphy_unreg_out;
6825         }
6826
6827         if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_TDLS)) {
6828                 err = brcmf_fil_iovar_int_set(ifp, "tdls_enable", 1);
6829                 if (err) {
6830                         brcmf_dbg(INFO, "TDLS not enabled (%d)\n", err);
6831                         wiphy->flags &= ~WIPHY_FLAG_SUPPORTS_TDLS;
6832                 } else {
6833                         brcmf_fweh_register(cfg->pub, BRCMF_E_TDLS_PEER_EVENT,
6834                                             brcmf_notify_tdls_peer_event);
6835                 }
6836         }
6837
6838         /* (re-) activate FWEH event handling */
6839         err = brcmf_fweh_activate_events(ifp);
6840         if (err) {
6841                 brcmf_err("FWEH activation failed (%d)\n", err);
6842                 goto wiphy_unreg_out;
6843         }
6844
6845         /* Fill in some of the advertised nl80211 supported features */
6846         if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_SCAN_RANDOM_MAC)) {
6847                 wiphy->features |= NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR;
6848 #ifdef CONFIG_PM
6849                 if (wiphy->wowlan &&
6850                     wiphy->wowlan->flags & WIPHY_WOWLAN_NET_DETECT)
6851                         wiphy->features |= NL80211_FEATURE_ND_RANDOM_MAC_ADDR;
6852 #endif
6853         }
6854
6855         return cfg;
6856
6857 wiphy_unreg_out:
6858         wiphy_unregister(cfg->wiphy);
6859 priv_out:
6860         wl_deinit_priv(cfg);
6861         brcmf_free_vif(vif);
6862         ifp->vif = NULL;
6863 wiphy_out:
6864         brcmf_free_wiphy(wiphy);
6865         kfree(ops);
6866         return NULL;
6867 }
6868
6869 void brcmf_cfg80211_detach(struct brcmf_cfg80211_info *cfg)
6870 {
6871         if (!cfg)
6872                 return;
6873
6874         brcmf_btcoex_detach(cfg);
6875         wiphy_unregister(cfg->wiphy);
6876         kfree(cfg->ops);
6877         wl_deinit_priv(cfg);
6878         brcmf_free_wiphy(cfg->wiphy);
6879 }