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