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