1 /* 2 * Copyright (c) 2004-2011 Atheros Communications Inc. 3 * Copyright (c) 2011-2012 Qualcomm Atheros, Inc. 4 * 5 * Permission to use, copy, modify, and/or distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 19 20 #include <linux/moduleparam.h> 21 #include <linux/inetdevice.h> 22 #include <linux/export.h> 23 #include <linux/sched/signal.h> 24 25 #include "core.h" 26 #include "cfg80211.h" 27 #include "debug.h" 28 #include "hif-ops.h" 29 #include "testmode.h" 30 31 #define RATETAB_ENT(_rate, _rateid, _flags) { \ 32 .bitrate = (_rate), \ 33 .flags = (_flags), \ 34 .hw_value = (_rateid), \ 35 } 36 37 #define CHAN2G(_channel, _freq, _flags) { \ 38 .band = NL80211_BAND_2GHZ, \ 39 .hw_value = (_channel), \ 40 .center_freq = (_freq), \ 41 .flags = (_flags), \ 42 .max_antenna_gain = 0, \ 43 .max_power = 30, \ 44 } 45 46 #define CHAN5G(_channel, _flags) { \ 47 .band = NL80211_BAND_5GHZ, \ 48 .hw_value = (_channel), \ 49 .center_freq = 5000 + (5 * (_channel)), \ 50 .flags = (_flags), \ 51 .max_antenna_gain = 0, \ 52 .max_power = 30, \ 53 } 54 55 #define DEFAULT_BG_SCAN_PERIOD 60 56 57 struct ath6kl_cfg80211_match_probe_ssid { 58 struct cfg80211_ssid ssid; 59 u8 flag; 60 }; 61 62 static struct ieee80211_rate ath6kl_rates[] = { 63 RATETAB_ENT(10, 0x1, 0), 64 RATETAB_ENT(20, 0x2, 0), 65 RATETAB_ENT(55, 0x4, 0), 66 RATETAB_ENT(110, 0x8, 0), 67 RATETAB_ENT(60, 0x10, 0), 68 RATETAB_ENT(90, 0x20, 0), 69 RATETAB_ENT(120, 0x40, 0), 70 RATETAB_ENT(180, 0x80, 0), 71 RATETAB_ENT(240, 0x100, 0), 72 RATETAB_ENT(360, 0x200, 0), 73 RATETAB_ENT(480, 0x400, 0), 74 RATETAB_ENT(540, 0x800, 0), 75 }; 76 77 #define ath6kl_a_rates (ath6kl_rates + 4) 78 #define ath6kl_a_rates_size 8 79 #define ath6kl_g_rates (ath6kl_rates + 0) 80 #define ath6kl_g_rates_size 12 81 82 #define ath6kl_g_htcap IEEE80211_HT_CAP_SGI_20 83 #define ath6kl_a_htcap (IEEE80211_HT_CAP_SUP_WIDTH_20_40 | \ 84 IEEE80211_HT_CAP_SGI_20 | \ 85 IEEE80211_HT_CAP_SGI_40) 86 87 static struct ieee80211_channel ath6kl_2ghz_channels[] = { 88 CHAN2G(1, 2412, 0), 89 CHAN2G(2, 2417, 0), 90 CHAN2G(3, 2422, 0), 91 CHAN2G(4, 2427, 0), 92 CHAN2G(5, 2432, 0), 93 CHAN2G(6, 2437, 0), 94 CHAN2G(7, 2442, 0), 95 CHAN2G(8, 2447, 0), 96 CHAN2G(9, 2452, 0), 97 CHAN2G(10, 2457, 0), 98 CHAN2G(11, 2462, 0), 99 CHAN2G(12, 2467, 0), 100 CHAN2G(13, 2472, 0), 101 CHAN2G(14, 2484, 0), 102 }; 103 104 static struct ieee80211_channel ath6kl_5ghz_a_channels[] = { 105 CHAN5G(36, 0), CHAN5G(40, 0), 106 CHAN5G(44, 0), CHAN5G(48, 0), 107 CHAN5G(52, 0), CHAN5G(56, 0), 108 CHAN5G(60, 0), CHAN5G(64, 0), 109 CHAN5G(100, 0), CHAN5G(104, 0), 110 CHAN5G(108, 0), CHAN5G(112, 0), 111 CHAN5G(116, 0), CHAN5G(120, 0), 112 CHAN5G(124, 0), CHAN5G(128, 0), 113 CHAN5G(132, 0), CHAN5G(136, 0), 114 CHAN5G(140, 0), CHAN5G(149, 0), 115 CHAN5G(153, 0), CHAN5G(157, 0), 116 CHAN5G(161, 0), CHAN5G(165, 0), 117 CHAN5G(184, 0), CHAN5G(188, 0), 118 CHAN5G(192, 0), CHAN5G(196, 0), 119 CHAN5G(200, 0), CHAN5G(204, 0), 120 CHAN5G(208, 0), CHAN5G(212, 0), 121 CHAN5G(216, 0), 122 }; 123 124 static struct ieee80211_supported_band ath6kl_band_2ghz = { 125 .n_channels = ARRAY_SIZE(ath6kl_2ghz_channels), 126 .channels = ath6kl_2ghz_channels, 127 .n_bitrates = ath6kl_g_rates_size, 128 .bitrates = ath6kl_g_rates, 129 .ht_cap.cap = ath6kl_g_htcap, 130 .ht_cap.ht_supported = true, 131 }; 132 133 static struct ieee80211_supported_band ath6kl_band_5ghz = { 134 .n_channels = ARRAY_SIZE(ath6kl_5ghz_a_channels), 135 .channels = ath6kl_5ghz_a_channels, 136 .n_bitrates = ath6kl_a_rates_size, 137 .bitrates = ath6kl_a_rates, 138 .ht_cap.cap = ath6kl_a_htcap, 139 .ht_cap.ht_supported = true, 140 }; 141 142 #define CCKM_KRK_CIPHER_SUITE 0x004096ff /* use for KRK */ 143 144 /* returns true if scheduled scan was stopped */ 145 static bool __ath6kl_cfg80211_sscan_stop(struct ath6kl_vif *vif) 146 { 147 struct ath6kl *ar = vif->ar; 148 149 if (!test_and_clear_bit(SCHED_SCANNING, &vif->flags)) 150 return false; 151 152 timer_delete_sync(&vif->sched_scan_timer); 153 154 if (ar->state == ATH6KL_STATE_RECOVERY) 155 return true; 156 157 ath6kl_wmi_enable_sched_scan_cmd(ar->wmi, vif->fw_vif_idx, false); 158 159 return true; 160 } 161 162 static void ath6kl_cfg80211_sscan_disable(struct ath6kl_vif *vif) 163 { 164 struct ath6kl *ar = vif->ar; 165 bool stopped; 166 167 stopped = __ath6kl_cfg80211_sscan_stop(vif); 168 169 if (!stopped) 170 return; 171 172 cfg80211_sched_scan_stopped(ar->wiphy, 0); 173 } 174 175 static int ath6kl_set_wpa_version(struct ath6kl_vif *vif, 176 enum nl80211_wpa_versions wpa_version) 177 { 178 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: %u\n", __func__, wpa_version); 179 180 if (!wpa_version) { 181 vif->auth_mode = NONE_AUTH; 182 } else if (wpa_version & NL80211_WPA_VERSION_2) { 183 vif->auth_mode = WPA2_AUTH; 184 } else if (wpa_version & NL80211_WPA_VERSION_1) { 185 vif->auth_mode = WPA_AUTH; 186 } else { 187 ath6kl_err("%s: %u not supported\n", __func__, wpa_version); 188 return -ENOTSUPP; 189 } 190 191 return 0; 192 } 193 194 static int ath6kl_set_auth_type(struct ath6kl_vif *vif, 195 enum nl80211_auth_type auth_type) 196 { 197 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: 0x%x\n", __func__, auth_type); 198 199 switch (auth_type) { 200 case NL80211_AUTHTYPE_OPEN_SYSTEM: 201 vif->dot11_auth_mode = OPEN_AUTH; 202 break; 203 case NL80211_AUTHTYPE_SHARED_KEY: 204 vif->dot11_auth_mode = SHARED_AUTH; 205 break; 206 case NL80211_AUTHTYPE_NETWORK_EAP: 207 vif->dot11_auth_mode = LEAP_AUTH; 208 break; 209 210 case NL80211_AUTHTYPE_AUTOMATIC: 211 vif->dot11_auth_mode = OPEN_AUTH | SHARED_AUTH; 212 break; 213 214 default: 215 ath6kl_err("%s: 0x%x not supported\n", __func__, auth_type); 216 return -ENOTSUPP; 217 } 218 219 return 0; 220 } 221 222 static int ath6kl_set_cipher(struct ath6kl_vif *vif, u32 cipher, bool ucast) 223 { 224 u8 *ar_cipher = ucast ? &vif->prwise_crypto : &vif->grp_crypto; 225 u8 *ar_cipher_len = ucast ? &vif->prwise_crypto_len : 226 &vif->grp_crypto_len; 227 228 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: cipher 0x%x, ucast %u\n", 229 __func__, cipher, ucast); 230 231 switch (cipher) { 232 case 0: 233 /* our own hack to use value 0 as no crypto used */ 234 *ar_cipher = NONE_CRYPT; 235 *ar_cipher_len = 0; 236 break; 237 case WLAN_CIPHER_SUITE_WEP40: 238 *ar_cipher = WEP_CRYPT; 239 *ar_cipher_len = 5; 240 break; 241 case WLAN_CIPHER_SUITE_WEP104: 242 *ar_cipher = WEP_CRYPT; 243 *ar_cipher_len = 13; 244 break; 245 case WLAN_CIPHER_SUITE_TKIP: 246 *ar_cipher = TKIP_CRYPT; 247 *ar_cipher_len = 0; 248 break; 249 case WLAN_CIPHER_SUITE_CCMP: 250 *ar_cipher = AES_CRYPT; 251 *ar_cipher_len = 0; 252 break; 253 case WLAN_CIPHER_SUITE_SMS4: 254 *ar_cipher = WAPI_CRYPT; 255 *ar_cipher_len = 0; 256 break; 257 default: 258 ath6kl_err("cipher 0x%x not supported\n", cipher); 259 return -ENOTSUPP; 260 } 261 262 return 0; 263 } 264 265 static void ath6kl_set_key_mgmt(struct ath6kl_vif *vif, u32 key_mgmt) 266 { 267 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: 0x%x\n", __func__, key_mgmt); 268 269 if (key_mgmt == WLAN_AKM_SUITE_PSK) { 270 if (vif->auth_mode == WPA_AUTH) 271 vif->auth_mode = WPA_PSK_AUTH; 272 else if (vif->auth_mode == WPA2_AUTH) 273 vif->auth_mode = WPA2_PSK_AUTH; 274 } else if (key_mgmt == 0x00409600) { 275 if (vif->auth_mode == WPA_AUTH) 276 vif->auth_mode = WPA_AUTH_CCKM; 277 else if (vif->auth_mode == WPA2_AUTH) 278 vif->auth_mode = WPA2_AUTH_CCKM; 279 } else if (key_mgmt != WLAN_AKM_SUITE_8021X) { 280 vif->auth_mode = NONE_AUTH; 281 } 282 } 283 284 static bool ath6kl_cfg80211_ready(struct ath6kl_vif *vif) 285 { 286 struct ath6kl *ar = vif->ar; 287 288 if (!test_bit(WMI_READY, &ar->flag)) { 289 ath6kl_err("wmi is not ready\n"); 290 return false; 291 } 292 293 if (!test_bit(WLAN_ENABLED, &vif->flags)) { 294 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "wlan disabled\n"); 295 return false; 296 } 297 298 return true; 299 } 300 301 static bool ath6kl_is_wpa_ie(const u8 *pos) 302 { 303 return pos[0] == WLAN_EID_VENDOR_SPECIFIC && pos[1] >= 4 && 304 pos[2] == 0x00 && pos[3] == 0x50 && 305 pos[4] == 0xf2 && pos[5] == 0x01; 306 } 307 308 static bool ath6kl_is_rsn_ie(const u8 *pos) 309 { 310 return pos[0] == WLAN_EID_RSN; 311 } 312 313 static bool ath6kl_is_wps_ie(const u8 *pos) 314 { 315 return (pos[0] == WLAN_EID_VENDOR_SPECIFIC && 316 pos[1] >= 4 && 317 pos[2] == 0x00 && pos[3] == 0x50 && pos[4] == 0xf2 && 318 pos[5] == 0x04); 319 } 320 321 static int ath6kl_set_assoc_req_ies(struct ath6kl_vif *vif, const u8 *ies, 322 size_t ies_len) 323 { 324 struct ath6kl *ar = vif->ar; 325 const u8 *pos; 326 u8 *buf = NULL; 327 size_t len = 0; 328 int ret; 329 330 /* 331 * Clear previously set flag 332 */ 333 334 ar->connect_ctrl_flags &= ~CONNECT_WPS_FLAG; 335 336 /* 337 * Filter out RSN/WPA IE(s) 338 */ 339 340 if (ies && ies_len) { 341 buf = kmalloc(ies_len, GFP_KERNEL); 342 if (buf == NULL) 343 return -ENOMEM; 344 pos = ies; 345 346 while (pos + 1 < ies + ies_len) { 347 if (pos + 2 + pos[1] > ies + ies_len) 348 break; 349 if (!(ath6kl_is_wpa_ie(pos) || ath6kl_is_rsn_ie(pos))) { 350 memcpy(buf + len, pos, 2 + pos[1]); 351 len += 2 + pos[1]; 352 } 353 354 if (ath6kl_is_wps_ie(pos)) 355 ar->connect_ctrl_flags |= CONNECT_WPS_FLAG; 356 357 pos += 2 + pos[1]; 358 } 359 } 360 361 ret = ath6kl_wmi_set_appie_cmd(ar->wmi, vif->fw_vif_idx, 362 WMI_FRAME_ASSOC_REQ, buf, len); 363 kfree(buf); 364 return ret; 365 } 366 367 static int ath6kl_nliftype_to_drv_iftype(enum nl80211_iftype type, u8 *nw_type) 368 { 369 switch (type) { 370 case NL80211_IFTYPE_STATION: 371 case NL80211_IFTYPE_P2P_CLIENT: 372 *nw_type = INFRA_NETWORK; 373 break; 374 case NL80211_IFTYPE_ADHOC: 375 *nw_type = ADHOC_NETWORK; 376 break; 377 case NL80211_IFTYPE_AP: 378 case NL80211_IFTYPE_P2P_GO: 379 *nw_type = AP_NETWORK; 380 break; 381 default: 382 ath6kl_err("invalid interface type %u\n", type); 383 return -ENOTSUPP; 384 } 385 386 return 0; 387 } 388 389 static bool ath6kl_is_valid_iftype(struct ath6kl *ar, enum nl80211_iftype type, 390 u8 *if_idx, u8 *nw_type) 391 { 392 int i; 393 394 if (ath6kl_nliftype_to_drv_iftype(type, nw_type)) 395 return false; 396 397 if (ar->ibss_if_active || ((type == NL80211_IFTYPE_ADHOC) && 398 ar->num_vif)) 399 return false; 400 401 if (type == NL80211_IFTYPE_STATION || 402 type == NL80211_IFTYPE_AP || type == NL80211_IFTYPE_ADHOC) { 403 for (i = 0; i < ar->vif_max; i++) { 404 if ((ar->avail_idx_map) & BIT(i)) { 405 *if_idx = i; 406 return true; 407 } 408 } 409 } 410 411 if (type == NL80211_IFTYPE_P2P_CLIENT || 412 type == NL80211_IFTYPE_P2P_GO) { 413 for (i = ar->max_norm_iface; i < ar->vif_max; i++) { 414 if ((ar->avail_idx_map) & BIT(i)) { 415 *if_idx = i; 416 return true; 417 } 418 } 419 } 420 421 return false; 422 } 423 424 static bool ath6kl_is_tx_pending(struct ath6kl *ar) 425 { 426 return ar->tx_pending[ath6kl_wmi_get_control_ep(ar->wmi)] == 0; 427 } 428 429 static void ath6kl_cfg80211_sta_bmiss_enhance(struct ath6kl_vif *vif, 430 bool enable) 431 { 432 int err; 433 434 if (WARN_ON(!test_bit(WMI_READY, &vif->ar->flag))) 435 return; 436 437 if (vif->nw_type != INFRA_NETWORK) 438 return; 439 440 if (!test_bit(ATH6KL_FW_CAPABILITY_BMISS_ENHANCE, 441 vif->ar->fw_capabilities)) 442 return; 443 444 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s fw bmiss enhance\n", 445 enable ? "enable" : "disable"); 446 447 err = ath6kl_wmi_sta_bmiss_enhance_cmd(vif->ar->wmi, 448 vif->fw_vif_idx, enable); 449 if (err) 450 ath6kl_err("failed to %s enhanced bmiss detection: %d\n", 451 enable ? "enable" : "disable", err); 452 } 453 454 static int ath6kl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev, 455 struct cfg80211_connect_params *sme) 456 { 457 struct ath6kl *ar = ath6kl_priv(dev); 458 struct ath6kl_vif *vif = netdev_priv(dev); 459 int status; 460 u8 nw_subtype = (ar->p2p) ? SUBTYPE_P2PDEV : SUBTYPE_NONE; 461 u16 interval; 462 463 ath6kl_cfg80211_sscan_disable(vif); 464 465 vif->sme_state = SME_CONNECTING; 466 467 if (!ath6kl_cfg80211_ready(vif)) 468 return -EIO; 469 470 if (test_bit(DESTROY_IN_PROGRESS, &ar->flag)) { 471 ath6kl_err("destroy in progress\n"); 472 return -EBUSY; 473 } 474 475 if (test_bit(SKIP_SCAN, &ar->flag) && 476 ((sme->channel && sme->channel->center_freq == 0) || 477 (sme->bssid && is_zero_ether_addr(sme->bssid)))) { 478 ath6kl_err("SkipScan: channel or bssid invalid\n"); 479 return -EINVAL; 480 } 481 482 if (down_interruptible(&ar->sem)) { 483 ath6kl_err("busy, couldn't get access\n"); 484 return -ERESTARTSYS; 485 } 486 487 if (test_bit(DESTROY_IN_PROGRESS, &ar->flag)) { 488 ath6kl_err("busy, destroy in progress\n"); 489 up(&ar->sem); 490 return -EBUSY; 491 } 492 493 if (ar->tx_pending[ath6kl_wmi_get_control_ep(ar->wmi)]) { 494 /* 495 * sleep until the command queue drains 496 */ 497 wait_event_interruptible_timeout(ar->event_wq, 498 ath6kl_is_tx_pending(ar), 499 WMI_TIMEOUT); 500 if (signal_pending(current)) { 501 ath6kl_err("cmd queue drain timeout\n"); 502 up(&ar->sem); 503 return -EINTR; 504 } 505 } 506 507 status = ath6kl_set_assoc_req_ies(vif, sme->ie, sme->ie_len); 508 if (status) { 509 up(&ar->sem); 510 return status; 511 } 512 513 if (sme->ie == NULL || sme->ie_len == 0) 514 ar->connect_ctrl_flags &= ~CONNECT_WPS_FLAG; 515 516 if (test_bit(CONNECTED, &vif->flags) && 517 vif->ssid_len == sme->ssid_len && 518 !memcmp(vif->ssid, sme->ssid, vif->ssid_len)) { 519 vif->reconnect_flag = true; 520 status = ath6kl_wmi_reconnect_cmd(ar->wmi, vif->fw_vif_idx, 521 vif->req_bssid, 522 vif->ch_hint); 523 524 up(&ar->sem); 525 if (status) { 526 ath6kl_err("wmi_reconnect_cmd failed\n"); 527 return -EIO; 528 } 529 return 0; 530 } else if (vif->ssid_len == sme->ssid_len && 531 !memcmp(vif->ssid, sme->ssid, vif->ssid_len)) { 532 ath6kl_disconnect(vif); 533 } 534 535 memset(vif->ssid, 0, sizeof(vif->ssid)); 536 vif->ssid_len = sme->ssid_len; 537 memcpy(vif->ssid, sme->ssid, sme->ssid_len); 538 539 if (sme->channel) 540 vif->ch_hint = sme->channel->center_freq; 541 542 memset(vif->req_bssid, 0, sizeof(vif->req_bssid)); 543 if (sme->bssid && !is_broadcast_ether_addr(sme->bssid)) 544 memcpy(vif->req_bssid, sme->bssid, sizeof(vif->req_bssid)); 545 546 ath6kl_set_wpa_version(vif, sme->crypto.wpa_versions); 547 548 status = ath6kl_set_auth_type(vif, sme->auth_type); 549 if (status) { 550 up(&ar->sem); 551 return status; 552 } 553 554 if (sme->crypto.n_ciphers_pairwise) 555 ath6kl_set_cipher(vif, sme->crypto.ciphers_pairwise[0], true); 556 else 557 ath6kl_set_cipher(vif, 0, true); 558 559 ath6kl_set_cipher(vif, sme->crypto.cipher_group, false); 560 561 if (sme->crypto.n_akm_suites) 562 ath6kl_set_key_mgmt(vif, sme->crypto.akm_suites[0]); 563 564 if ((sme->key_len) && 565 (vif->auth_mode == NONE_AUTH) && 566 (vif->prwise_crypto == WEP_CRYPT)) { 567 struct ath6kl_key *key = NULL; 568 569 if (sme->key_idx > WMI_MAX_KEY_INDEX) { 570 ath6kl_err("key index %d out of bounds\n", 571 sme->key_idx); 572 up(&ar->sem); 573 return -ENOENT; 574 } 575 576 key = &vif->keys[sme->key_idx]; 577 key->key_len = sme->key_len; 578 memcpy(key->key, sme->key, key->key_len); 579 key->cipher = vif->prwise_crypto; 580 vif->def_txkey_index = sme->key_idx; 581 582 ath6kl_wmi_addkey_cmd(ar->wmi, vif->fw_vif_idx, sme->key_idx, 583 vif->prwise_crypto, 584 GROUP_USAGE | TX_USAGE, 585 key->key_len, 586 NULL, 0, 587 key->key, KEY_OP_INIT_VAL, NULL, 588 NO_SYNC_WMIFLAG); 589 } 590 591 if (!ar->usr_bss_filter) { 592 clear_bit(CLEAR_BSSFILTER_ON_BEACON, &vif->flags); 593 if (ath6kl_wmi_bssfilter_cmd(ar->wmi, vif->fw_vif_idx, 594 ALL_BSS_FILTER, 0) != 0) { 595 ath6kl_err("couldn't set bss filtering\n"); 596 up(&ar->sem); 597 return -EIO; 598 } 599 } 600 601 vif->nw_type = vif->next_mode; 602 603 /* enable enhanced bmiss detection if applicable */ 604 ath6kl_cfg80211_sta_bmiss_enhance(vif, true); 605 606 if (vif->wdev.iftype == NL80211_IFTYPE_P2P_CLIENT) 607 nw_subtype = SUBTYPE_P2PCLIENT; 608 609 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, 610 "%s: connect called with authmode %d dot11 auth %d" 611 " PW crypto %d PW crypto len %d GRP crypto %d" 612 " GRP crypto len %d channel hint %u\n", 613 __func__, 614 vif->auth_mode, vif->dot11_auth_mode, vif->prwise_crypto, 615 vif->prwise_crypto_len, vif->grp_crypto, 616 vif->grp_crypto_len, vif->ch_hint); 617 618 vif->reconnect_flag = 0; 619 620 if (vif->nw_type == INFRA_NETWORK) { 621 interval = max_t(u16, vif->listen_intvl_t, 622 ATH6KL_MAX_WOW_LISTEN_INTL); 623 status = ath6kl_wmi_listeninterval_cmd(ar->wmi, vif->fw_vif_idx, 624 interval, 625 0); 626 if (status) { 627 ath6kl_err("couldn't set listen intervel\n"); 628 up(&ar->sem); 629 return status; 630 } 631 } 632 633 status = ath6kl_wmi_connect_cmd(ar->wmi, vif->fw_vif_idx, vif->nw_type, 634 vif->dot11_auth_mode, vif->auth_mode, 635 vif->prwise_crypto, 636 vif->prwise_crypto_len, 637 vif->grp_crypto, vif->grp_crypto_len, 638 vif->ssid_len, vif->ssid, 639 vif->req_bssid, vif->ch_hint, 640 ar->connect_ctrl_flags, nw_subtype); 641 642 if (sme->bg_scan_period == 0) { 643 /* disable background scan if period is 0 */ 644 sme->bg_scan_period = 0xffff; 645 } else if (sme->bg_scan_period == -1) { 646 /* configure default value if not specified */ 647 sme->bg_scan_period = DEFAULT_BG_SCAN_PERIOD; 648 } 649 650 ath6kl_wmi_scanparams_cmd(ar->wmi, vif->fw_vif_idx, 0, 0, 651 sme->bg_scan_period, 0, 0, 0, 3, 0, 0, 0); 652 653 up(&ar->sem); 654 655 if (status == -EINVAL) { 656 memset(vif->ssid, 0, sizeof(vif->ssid)); 657 vif->ssid_len = 0; 658 ath6kl_err("invalid request\n"); 659 return -ENOENT; 660 } else if (status) { 661 ath6kl_err("ath6kl_wmi_connect_cmd failed\n"); 662 return -EIO; 663 } 664 665 if ((!(ar->connect_ctrl_flags & CONNECT_DO_WPA_OFFLOAD)) && 666 ((vif->auth_mode == WPA_PSK_AUTH) || 667 (vif->auth_mode == WPA2_PSK_AUTH))) { 668 mod_timer(&vif->disconnect_timer, 669 jiffies + msecs_to_jiffies(DISCON_TIMER_INTVAL)); 670 } 671 672 ar->connect_ctrl_flags &= ~CONNECT_DO_WPA_OFFLOAD; 673 set_bit(CONNECT_PEND, &vif->flags); 674 675 return 0; 676 } 677 678 static struct cfg80211_bss * 679 ath6kl_add_bss_if_needed(struct ath6kl_vif *vif, 680 enum network_type nw_type, 681 const u8 *bssid, 682 struct ieee80211_channel *chan, 683 const u8 *beacon_ie, 684 size_t beacon_ie_len) 685 { 686 struct ath6kl *ar = vif->ar; 687 struct cfg80211_bss *bss; 688 u16 cap_val; 689 enum ieee80211_bss_type bss_type; 690 u8 *ie; 691 692 if (nw_type & ADHOC_NETWORK) { 693 cap_val = WLAN_CAPABILITY_IBSS; 694 bss_type = IEEE80211_BSS_TYPE_IBSS; 695 } else { 696 cap_val = WLAN_CAPABILITY_ESS; 697 bss_type = IEEE80211_BSS_TYPE_ESS; 698 } 699 700 bss = cfg80211_get_bss(ar->wiphy, chan, bssid, 701 vif->ssid, vif->ssid_len, 702 bss_type, IEEE80211_PRIVACY_ANY); 703 if (bss == NULL) { 704 /* 705 * Since cfg80211 may not yet know about the BSS, 706 * generate a partial entry until the first BSS info 707 * event becomes available. 708 * 709 * Prepend SSID element since it is not included in the Beacon 710 * IEs from the target. 711 */ 712 ie = kmalloc(2 + vif->ssid_len + beacon_ie_len, GFP_KERNEL); 713 if (ie == NULL) 714 return NULL; 715 ie[0] = WLAN_EID_SSID; 716 ie[1] = vif->ssid_len; 717 memcpy(ie + 2, vif->ssid, vif->ssid_len); 718 memcpy(ie + 2 + vif->ssid_len, beacon_ie, beacon_ie_len); 719 bss = cfg80211_inform_bss(ar->wiphy, chan, 720 CFG80211_BSS_FTYPE_UNKNOWN, 721 bssid, 0, cap_val, 100, 722 ie, 2 + vif->ssid_len + beacon_ie_len, 723 0, GFP_KERNEL); 724 if (bss) 725 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, 726 "added bss %pM to cfg80211\n", bssid); 727 kfree(ie); 728 } else { 729 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "cfg80211 already has a bss\n"); 730 } 731 732 return bss; 733 } 734 735 void ath6kl_cfg80211_connect_event(struct ath6kl_vif *vif, u16 channel, 736 u8 *bssid, u16 listen_intvl, 737 u16 beacon_intvl, 738 enum network_type nw_type, 739 u8 beacon_ie_len, u8 assoc_req_len, 740 u8 assoc_resp_len, u8 *assoc_info) 741 { 742 struct ieee80211_channel *chan; 743 struct ath6kl *ar = vif->ar; 744 struct cfg80211_bss *bss; 745 746 /* capinfo + listen interval */ 747 u8 assoc_req_ie_offset = sizeof(u16) + sizeof(u16); 748 749 /* capinfo + status code + associd */ 750 u8 assoc_resp_ie_offset = sizeof(u16) + sizeof(u16) + sizeof(u16); 751 752 u8 *assoc_req_ie = assoc_info + beacon_ie_len + assoc_req_ie_offset; 753 u8 *assoc_resp_ie = assoc_info + beacon_ie_len + assoc_req_len + 754 assoc_resp_ie_offset; 755 756 assoc_req_len -= assoc_req_ie_offset; 757 assoc_resp_len -= assoc_resp_ie_offset; 758 759 /* 760 * Store Beacon interval here; DTIM period will be available only once 761 * a Beacon frame from the AP is seen. 762 */ 763 vif->assoc_bss_beacon_int = beacon_intvl; 764 clear_bit(DTIM_PERIOD_AVAIL, &vif->flags); 765 766 if (nw_type & ADHOC_NETWORK) { 767 if (vif->wdev.iftype != NL80211_IFTYPE_ADHOC) { 768 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, 769 "%s: ath6k not in ibss mode\n", __func__); 770 return; 771 } 772 } 773 774 if (nw_type & INFRA_NETWORK) { 775 if (vif->wdev.iftype != NL80211_IFTYPE_STATION && 776 vif->wdev.iftype != NL80211_IFTYPE_P2P_CLIENT) { 777 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, 778 "%s: ath6k not in station mode\n", __func__); 779 return; 780 } 781 } 782 783 chan = ieee80211_get_channel(ar->wiphy, (int) channel); 784 785 bss = ath6kl_add_bss_if_needed(vif, nw_type, bssid, chan, 786 assoc_info, beacon_ie_len); 787 if (!bss) { 788 ath6kl_err("could not add cfg80211 bss entry\n"); 789 return; 790 } 791 792 if (nw_type & ADHOC_NETWORK) { 793 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "ad-hoc %s selected\n", 794 nw_type & ADHOC_CREATOR ? "creator" : "joiner"); 795 cfg80211_ibss_joined(vif->ndev, bssid, chan, GFP_KERNEL); 796 cfg80211_put_bss(ar->wiphy, bss); 797 return; 798 } 799 800 if (vif->sme_state == SME_CONNECTING) { 801 /* inform connect result to cfg80211 */ 802 vif->sme_state = SME_CONNECTED; 803 cfg80211_connect_result(vif->ndev, bssid, 804 assoc_req_ie, assoc_req_len, 805 assoc_resp_ie, assoc_resp_len, 806 WLAN_STATUS_SUCCESS, GFP_KERNEL); 807 cfg80211_put_bss(ar->wiphy, bss); 808 } else if (vif->sme_state == SME_CONNECTED) { 809 struct cfg80211_roam_info roam_info = { 810 .links[0].bss = bss, 811 .req_ie = assoc_req_ie, 812 .req_ie_len = assoc_req_len, 813 .resp_ie = assoc_resp_ie, 814 .resp_ie_len = assoc_resp_len, 815 }; 816 /* inform roam event to cfg80211 */ 817 cfg80211_roamed(vif->ndev, &roam_info, GFP_KERNEL); 818 } 819 } 820 821 static int ath6kl_cfg80211_disconnect(struct wiphy *wiphy, 822 struct net_device *dev, u16 reason_code) 823 { 824 struct ath6kl *ar = ath6kl_priv(dev); 825 struct ath6kl_vif *vif = netdev_priv(dev); 826 827 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: reason=%u\n", __func__, 828 reason_code); 829 830 ath6kl_cfg80211_sscan_disable(vif); 831 832 if (!ath6kl_cfg80211_ready(vif)) 833 return -EIO; 834 835 if (test_bit(DESTROY_IN_PROGRESS, &ar->flag)) { 836 ath6kl_err("busy, destroy in progress\n"); 837 return -EBUSY; 838 } 839 840 if (down_interruptible(&ar->sem)) { 841 ath6kl_err("busy, couldn't get access\n"); 842 return -ERESTARTSYS; 843 } 844 845 vif->reconnect_flag = 0; 846 ath6kl_disconnect(vif); 847 memset(vif->ssid, 0, sizeof(vif->ssid)); 848 vif->ssid_len = 0; 849 850 if (!test_bit(SKIP_SCAN, &ar->flag)) 851 memset(vif->req_bssid, 0, sizeof(vif->req_bssid)); 852 853 up(&ar->sem); 854 855 return 0; 856 } 857 858 void ath6kl_cfg80211_disconnect_event(struct ath6kl_vif *vif, u8 reason, 859 u8 *bssid, u8 assoc_resp_len, 860 u8 *assoc_info, u16 proto_reason) 861 { 862 struct ath6kl *ar = vif->ar; 863 864 if (vif->scan_req) { 865 struct cfg80211_scan_info info = { 866 .aborted = true, 867 }; 868 869 cfg80211_scan_done(vif->scan_req, &info); 870 vif->scan_req = NULL; 871 } 872 873 if (vif->nw_type & ADHOC_NETWORK) { 874 if (vif->wdev.iftype != NL80211_IFTYPE_ADHOC) 875 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, 876 "%s: ath6k not in ibss mode\n", __func__); 877 return; 878 } 879 880 if (vif->nw_type & INFRA_NETWORK) { 881 if (vif->wdev.iftype != NL80211_IFTYPE_STATION && 882 vif->wdev.iftype != NL80211_IFTYPE_P2P_CLIENT) { 883 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, 884 "%s: ath6k not in station mode\n", __func__); 885 return; 886 } 887 } 888 889 clear_bit(CONNECT_PEND, &vif->flags); 890 891 if (vif->sme_state == SME_CONNECTING) { 892 cfg80211_connect_result(vif->ndev, 893 bssid, NULL, 0, 894 NULL, 0, 895 WLAN_STATUS_UNSPECIFIED_FAILURE, 896 GFP_KERNEL); 897 } else if (vif->sme_state == SME_CONNECTED) { 898 cfg80211_disconnected(vif->ndev, proto_reason, 899 NULL, 0, false, GFP_KERNEL); 900 } 901 902 vif->sme_state = SME_DISCONNECTED; 903 904 /* 905 * Send a disconnect command to target when a disconnect event is 906 * received with reason code other than 3 (DISCONNECT_CMD - disconnect 907 * request from host) to make the firmware stop trying to connect even 908 * after giving disconnect event. There will be one more disconnect 909 * event for this disconnect command with reason code DISCONNECT_CMD 910 * which won't be notified to cfg80211. 911 */ 912 if (reason != DISCONNECT_CMD) 913 ath6kl_wmi_disconnect_cmd(ar->wmi, vif->fw_vif_idx); 914 } 915 916 static int ath6kl_set_probed_ssids(struct ath6kl *ar, 917 struct ath6kl_vif *vif, 918 struct cfg80211_ssid *ssids, int n_ssids, 919 struct cfg80211_match_set *match_set, 920 int n_match_ssid) 921 { 922 u8 i, j, index_to_add, ssid_found = false; 923 struct ath6kl_cfg80211_match_probe_ssid ssid_list[MAX_PROBED_SSIDS]; 924 925 memset(ssid_list, 0, sizeof(ssid_list)); 926 927 if (n_ssids > MAX_PROBED_SSIDS || 928 n_match_ssid > MAX_PROBED_SSIDS) 929 return -EINVAL; 930 931 for (i = 0; i < n_ssids; i++) { 932 memcpy(ssid_list[i].ssid.ssid, 933 ssids[i].ssid, 934 ssids[i].ssid_len); 935 ssid_list[i].ssid.ssid_len = ssids[i].ssid_len; 936 937 if (ssids[i].ssid_len) 938 ssid_list[i].flag = SPECIFIC_SSID_FLAG; 939 else 940 ssid_list[i].flag = ANY_SSID_FLAG; 941 942 if (ar->wiphy->max_match_sets != 0 && n_match_ssid == 0) 943 ssid_list[i].flag |= MATCH_SSID_FLAG; 944 } 945 946 index_to_add = i; 947 948 for (i = 0; i < n_match_ssid; i++) { 949 ssid_found = false; 950 951 for (j = 0; j < n_ssids; j++) { 952 if ((match_set[i].ssid.ssid_len == 953 ssid_list[j].ssid.ssid_len) && 954 (!memcmp(ssid_list[j].ssid.ssid, 955 match_set[i].ssid.ssid, 956 match_set[i].ssid.ssid_len))) { 957 ssid_list[j].flag |= MATCH_SSID_FLAG; 958 ssid_found = true; 959 break; 960 } 961 } 962 963 if (ssid_found) 964 continue; 965 966 if (index_to_add >= MAX_PROBED_SSIDS) 967 continue; 968 969 ssid_list[index_to_add].ssid.ssid_len = 970 match_set[i].ssid.ssid_len; 971 memcpy(ssid_list[index_to_add].ssid.ssid, 972 match_set[i].ssid.ssid, 973 match_set[i].ssid.ssid_len); 974 ssid_list[index_to_add].flag |= MATCH_SSID_FLAG; 975 index_to_add++; 976 } 977 978 for (i = 0; i < index_to_add; i++) { 979 ath6kl_wmi_probedssid_cmd(ar->wmi, vif->fw_vif_idx, i, 980 ssid_list[i].flag, 981 ssid_list[i].ssid.ssid_len, 982 ssid_list[i].ssid.ssid); 983 } 984 985 /* Make sure no old entries are left behind */ 986 for (i = index_to_add; i < MAX_PROBED_SSIDS; i++) { 987 ath6kl_wmi_probedssid_cmd(ar->wmi, vif->fw_vif_idx, i, 988 DISABLE_SSID_FLAG, 0, NULL); 989 } 990 991 return 0; 992 } 993 994 static int ath6kl_cfg80211_scan(struct wiphy *wiphy, 995 struct cfg80211_scan_request *request) 996 { 997 struct ath6kl_vif *vif = ath6kl_vif_from_wdev(request->wdev); 998 struct ath6kl *ar = ath6kl_priv(vif->ndev); 999 s8 n_channels = 0; 1000 u16 *channels = NULL; 1001 int ret = 0; 1002 u32 force_fg_scan = 0; 1003 1004 if (!ath6kl_cfg80211_ready(vif)) 1005 return -EIO; 1006 1007 ath6kl_cfg80211_sscan_disable(vif); 1008 1009 if (!ar->usr_bss_filter) { 1010 clear_bit(CLEAR_BSSFILTER_ON_BEACON, &vif->flags); 1011 ret = ath6kl_wmi_bssfilter_cmd(ar->wmi, vif->fw_vif_idx, 1012 ALL_BSS_FILTER, 0); 1013 if (ret) { 1014 ath6kl_err("couldn't set bss filtering\n"); 1015 return ret; 1016 } 1017 } 1018 1019 ret = ath6kl_set_probed_ssids(ar, vif, request->ssids, 1020 request->n_ssids, NULL, 0); 1021 if (ret < 0) 1022 return ret; 1023 1024 /* this also clears IE in fw if it's not set */ 1025 ret = ath6kl_wmi_set_appie_cmd(ar->wmi, vif->fw_vif_idx, 1026 WMI_FRAME_PROBE_REQ, 1027 request->ie, request->ie_len); 1028 if (ret) { 1029 ath6kl_err("failed to set Probe Request appie for scan\n"); 1030 return ret; 1031 } 1032 1033 /* 1034 * Scan only the requested channels if the request specifies a set of 1035 * channels. If the list is longer than the target supports, do not 1036 * configure the list and instead, scan all available channels. 1037 */ 1038 if (request->n_channels > 0 && 1039 request->n_channels <= WMI_MAX_CHANNELS) { 1040 u8 i; 1041 1042 n_channels = request->n_channels; 1043 1044 channels = kcalloc(n_channels, sizeof(u16), GFP_KERNEL); 1045 if (channels == NULL) { 1046 ath6kl_warn("failed to set scan channels, scan all channels"); 1047 n_channels = 0; 1048 } 1049 1050 for (i = 0; i < n_channels; i++) 1051 channels[i] = request->channels[i]->center_freq; 1052 } 1053 1054 if (test_bit(CONNECTED, &vif->flags)) 1055 force_fg_scan = 1; 1056 1057 vif->scan_req = request; 1058 1059 ret = ath6kl_wmi_beginscan_cmd(ar->wmi, vif->fw_vif_idx, 1060 WMI_LONG_SCAN, force_fg_scan, 1061 false, 0, 1062 ATH6KL_FG_SCAN_INTERVAL, 1063 n_channels, channels, 1064 request->no_cck, 1065 request->rates); 1066 if (ret) { 1067 ath6kl_err("failed to start scan: %d\n", ret); 1068 vif->scan_req = NULL; 1069 } 1070 1071 kfree(channels); 1072 1073 return ret; 1074 } 1075 1076 void ath6kl_cfg80211_scan_complete_event(struct ath6kl_vif *vif, bool aborted) 1077 { 1078 struct ath6kl *ar = vif->ar; 1079 struct cfg80211_scan_info info = { 1080 .aborted = aborted, 1081 }; 1082 int i; 1083 1084 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: status%s\n", __func__, 1085 aborted ? " aborted" : ""); 1086 1087 if (!vif->scan_req) 1088 return; 1089 1090 if (aborted) 1091 goto out; 1092 1093 if (vif->scan_req->n_ssids && vif->scan_req->ssids[0].ssid_len) { 1094 for (i = 0; i < vif->scan_req->n_ssids; i++) { 1095 ath6kl_wmi_probedssid_cmd(ar->wmi, vif->fw_vif_idx, 1096 i, DISABLE_SSID_FLAG, 1097 0, NULL); 1098 } 1099 } 1100 1101 out: 1102 cfg80211_scan_done(vif->scan_req, &info); 1103 vif->scan_req = NULL; 1104 } 1105 1106 void ath6kl_cfg80211_ch_switch_notify(struct ath6kl_vif *vif, int freq, 1107 enum wmi_phy_mode mode) 1108 { 1109 struct cfg80211_chan_def chandef; 1110 1111 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, 1112 "channel switch notify nw_type %d freq %d mode %d\n", 1113 vif->nw_type, freq, mode); 1114 1115 cfg80211_chandef_create(&chandef, 1116 ieee80211_get_channel(vif->ar->wiphy, freq), 1117 (mode == WMI_11G_HT20 && 1118 ath6kl_band_2ghz.ht_cap.ht_supported) ? 1119 NL80211_CHAN_HT20 : NL80211_CHAN_NO_HT); 1120 1121 wiphy_lock(vif->ar->wiphy); 1122 cfg80211_ch_switch_notify(vif->ndev, &chandef, 0); 1123 wiphy_unlock(vif->ar->wiphy); 1124 } 1125 1126 static int ath6kl_cfg80211_add_key(struct wiphy *wiphy, struct wireless_dev *wdev, 1127 int link_id, u8 key_index, bool pairwise, 1128 const u8 *mac_addr, 1129 struct key_params *params) 1130 { 1131 struct ath6kl *ar = ath6kl_priv(wdev->netdev); 1132 struct ath6kl_vif *vif = netdev_priv(wdev->netdev); 1133 struct ath6kl_key *key = NULL; 1134 int seq_len; 1135 u8 key_usage; 1136 u8 key_type; 1137 1138 if (!ath6kl_cfg80211_ready(vif)) 1139 return -EIO; 1140 1141 if (params->cipher == CCKM_KRK_CIPHER_SUITE) { 1142 if (params->key_len != WMI_KRK_LEN) 1143 return -EINVAL; 1144 return ath6kl_wmi_add_krk_cmd(ar->wmi, vif->fw_vif_idx, 1145 params->key); 1146 } 1147 1148 if (key_index > WMI_MAX_KEY_INDEX) { 1149 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, 1150 "%s: key index %d out of bounds\n", __func__, 1151 key_index); 1152 return -ENOENT; 1153 } 1154 1155 key = &vif->keys[key_index]; 1156 memset(key, 0, sizeof(struct ath6kl_key)); 1157 1158 if (pairwise) 1159 key_usage = PAIRWISE_USAGE; 1160 else 1161 key_usage = GROUP_USAGE; 1162 1163 seq_len = params->seq_len; 1164 if (params->cipher == WLAN_CIPHER_SUITE_SMS4 && 1165 seq_len > ATH6KL_KEY_SEQ_LEN) { 1166 /* Only first half of the WPI PN is configured */ 1167 seq_len = ATH6KL_KEY_SEQ_LEN; 1168 } 1169 if (params->key_len > WLAN_MAX_KEY_LEN || 1170 seq_len > sizeof(key->seq)) 1171 return -EINVAL; 1172 1173 key->key_len = params->key_len; 1174 memcpy(key->key, params->key, key->key_len); 1175 key->seq_len = seq_len; 1176 memcpy(key->seq, params->seq, key->seq_len); 1177 key->cipher = params->cipher; 1178 1179 switch (key->cipher) { 1180 case WLAN_CIPHER_SUITE_WEP40: 1181 case WLAN_CIPHER_SUITE_WEP104: 1182 key_type = WEP_CRYPT; 1183 break; 1184 1185 case WLAN_CIPHER_SUITE_TKIP: 1186 key_type = TKIP_CRYPT; 1187 break; 1188 1189 case WLAN_CIPHER_SUITE_CCMP: 1190 key_type = AES_CRYPT; 1191 break; 1192 case WLAN_CIPHER_SUITE_SMS4: 1193 key_type = WAPI_CRYPT; 1194 break; 1195 1196 default: 1197 return -ENOTSUPP; 1198 } 1199 1200 if (((vif->auth_mode == WPA_PSK_AUTH) || 1201 (vif->auth_mode == WPA2_PSK_AUTH)) && 1202 (key_usage & GROUP_USAGE)) 1203 timer_delete(&vif->disconnect_timer); 1204 1205 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, 1206 "%s: index %d, key_len %d, key_type 0x%x, key_usage 0x%x, seq_len %d\n", 1207 __func__, key_index, key->key_len, key_type, 1208 key_usage, key->seq_len); 1209 1210 if (vif->nw_type == AP_NETWORK && !pairwise && 1211 (key_type == TKIP_CRYPT || key_type == AES_CRYPT || 1212 key_type == WAPI_CRYPT)) { 1213 ar->ap_mode_bkey.valid = true; 1214 ar->ap_mode_bkey.key_index = key_index; 1215 ar->ap_mode_bkey.key_type = key_type; 1216 ar->ap_mode_bkey.key_len = key->key_len; 1217 memcpy(ar->ap_mode_bkey.key, key->key, key->key_len); 1218 if (!test_bit(CONNECTED, &vif->flags)) { 1219 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, 1220 "Delay initial group key configuration until AP mode has been started\n"); 1221 /* 1222 * The key will be set in ath6kl_connect_ap_mode() once 1223 * the connected event is received from the target. 1224 */ 1225 return 0; 1226 } 1227 } 1228 1229 if (vif->next_mode == AP_NETWORK && key_type == WEP_CRYPT && 1230 !test_bit(CONNECTED, &vif->flags)) { 1231 /* 1232 * Store the key locally so that it can be re-configured after 1233 * the AP mode has properly started 1234 * (ath6kl_install_statioc_wep_keys). 1235 */ 1236 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, 1237 "Delay WEP key configuration until AP mode has been started\n"); 1238 vif->wep_key_list[key_index].key_len = key->key_len; 1239 memcpy(vif->wep_key_list[key_index].key, key->key, 1240 key->key_len); 1241 return 0; 1242 } 1243 1244 return ath6kl_wmi_addkey_cmd(ar->wmi, vif->fw_vif_idx, key_index, 1245 key_type, key_usage, key->key_len, 1246 key->seq, key->seq_len, key->key, 1247 KEY_OP_INIT_VAL, 1248 (u8 *) mac_addr, SYNC_BOTH_WMIFLAG); 1249 } 1250 1251 static int ath6kl_cfg80211_del_key(struct wiphy *wiphy, struct wireless_dev *wdev, 1252 int link_id, u8 key_index, bool pairwise, 1253 const u8 *mac_addr) 1254 { 1255 struct ath6kl *ar = ath6kl_priv(wdev->netdev); 1256 struct ath6kl_vif *vif = netdev_priv(wdev->netdev); 1257 1258 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: index %d\n", __func__, key_index); 1259 1260 if (!ath6kl_cfg80211_ready(vif)) 1261 return -EIO; 1262 1263 if (key_index > WMI_MAX_KEY_INDEX) { 1264 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, 1265 "%s: key index %d out of bounds\n", __func__, 1266 key_index); 1267 return -ENOENT; 1268 } 1269 1270 if (!vif->keys[key_index].key_len) { 1271 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, 1272 "%s: index %d is empty\n", __func__, key_index); 1273 return 0; 1274 } 1275 1276 vif->keys[key_index].key_len = 0; 1277 1278 return ath6kl_wmi_deletekey_cmd(ar->wmi, vif->fw_vif_idx, key_index); 1279 } 1280 1281 static int ath6kl_cfg80211_get_key(struct wiphy *wiphy, struct wireless_dev *wdev, 1282 int link_id, u8 key_index, bool pairwise, 1283 const u8 *mac_addr, void *cookie, 1284 void (*callback) (void *cookie, 1285 struct key_params *)) 1286 { 1287 struct ath6kl_vif *vif = netdev_priv(wdev->netdev); 1288 struct ath6kl_key *key = NULL; 1289 struct key_params params; 1290 1291 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: index %d\n", __func__, key_index); 1292 1293 if (!ath6kl_cfg80211_ready(vif)) 1294 return -EIO; 1295 1296 if (key_index > WMI_MAX_KEY_INDEX) { 1297 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, 1298 "%s: key index %d out of bounds\n", __func__, 1299 key_index); 1300 return -ENOENT; 1301 } 1302 1303 key = &vif->keys[key_index]; 1304 memset(¶ms, 0, sizeof(params)); 1305 params.cipher = key->cipher; 1306 params.key_len = key->key_len; 1307 params.seq_len = key->seq_len; 1308 params.seq = key->seq; 1309 params.key = key->key; 1310 1311 callback(cookie, ¶ms); 1312 1313 return key->key_len ? 0 : -ENOENT; 1314 } 1315 1316 static int ath6kl_cfg80211_set_default_key(struct wiphy *wiphy, 1317 struct net_device *ndev, int link_id, 1318 u8 key_index, bool unicast, 1319 bool multicast) 1320 { 1321 struct ath6kl *ar = ath6kl_priv(ndev); 1322 struct ath6kl_vif *vif = netdev_priv(ndev); 1323 struct ath6kl_key *key = NULL; 1324 u8 key_usage; 1325 enum ath6kl_crypto_type key_type = NONE_CRYPT; 1326 1327 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: index %d\n", __func__, key_index); 1328 1329 if (!ath6kl_cfg80211_ready(vif)) 1330 return -EIO; 1331 1332 if (key_index > WMI_MAX_KEY_INDEX) { 1333 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, 1334 "%s: key index %d out of bounds\n", 1335 __func__, key_index); 1336 return -ENOENT; 1337 } 1338 1339 if (!vif->keys[key_index].key_len) { 1340 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: invalid key index %d\n", 1341 __func__, key_index); 1342 return -EINVAL; 1343 } 1344 1345 vif->def_txkey_index = key_index; 1346 key = &vif->keys[vif->def_txkey_index]; 1347 key_usage = GROUP_USAGE; 1348 if (vif->prwise_crypto == WEP_CRYPT) 1349 key_usage |= TX_USAGE; 1350 if (unicast) 1351 key_type = vif->prwise_crypto; 1352 if (multicast) 1353 key_type = vif->grp_crypto; 1354 1355 if (vif->next_mode == AP_NETWORK && !test_bit(CONNECTED, &vif->flags)) 1356 return 0; /* Delay until AP mode has been started */ 1357 1358 return ath6kl_wmi_addkey_cmd(ar->wmi, vif->fw_vif_idx, 1359 vif->def_txkey_index, 1360 key_type, key_usage, 1361 key->key_len, key->seq, key->seq_len, 1362 key->key, 1363 KEY_OP_INIT_VAL, NULL, 1364 SYNC_BOTH_WMIFLAG); 1365 } 1366 1367 void ath6kl_cfg80211_tkip_micerr_event(struct ath6kl_vif *vif, u8 keyid, 1368 bool ismcast) 1369 { 1370 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, 1371 "%s: keyid %d, ismcast %d\n", __func__, keyid, ismcast); 1372 1373 cfg80211_michael_mic_failure(vif->ndev, vif->bssid, 1374 (ismcast ? NL80211_KEYTYPE_GROUP : 1375 NL80211_KEYTYPE_PAIRWISE), keyid, NULL, 1376 GFP_KERNEL); 1377 } 1378 1379 static int ath6kl_cfg80211_set_wiphy_params(struct wiphy *wiphy, int radio_idx, 1380 u32 changed) 1381 { 1382 struct ath6kl *ar = (struct ath6kl *)wiphy_priv(wiphy); 1383 struct ath6kl_vif *vif; 1384 int ret; 1385 1386 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: changed 0x%x\n", __func__, 1387 changed); 1388 1389 vif = ath6kl_vif_first(ar); 1390 if (!vif) 1391 return -EIO; 1392 1393 if (!ath6kl_cfg80211_ready(vif)) 1394 return -EIO; 1395 1396 if (changed & WIPHY_PARAM_RTS_THRESHOLD) { 1397 ret = ath6kl_wmi_set_rts_cmd(ar->wmi, wiphy->rts_threshold); 1398 if (ret != 0) { 1399 ath6kl_err("ath6kl_wmi_set_rts_cmd failed\n"); 1400 return -EIO; 1401 } 1402 } 1403 1404 return 0; 1405 } 1406 1407 static int ath6kl_cfg80211_set_txpower(struct wiphy *wiphy, 1408 struct wireless_dev *wdev, 1409 int radio_idx, 1410 enum nl80211_tx_power_setting type, 1411 int mbm) 1412 { 1413 struct ath6kl *ar = (struct ath6kl *)wiphy_priv(wiphy); 1414 struct ath6kl_vif *vif; 1415 int dbm = MBM_TO_DBM(mbm); 1416 1417 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: type 0x%x, dbm %d\n", __func__, 1418 type, dbm); 1419 1420 vif = ath6kl_vif_first(ar); 1421 if (!vif) 1422 return -EIO; 1423 1424 if (!ath6kl_cfg80211_ready(vif)) 1425 return -EIO; 1426 1427 switch (type) { 1428 case NL80211_TX_POWER_AUTOMATIC: 1429 return 0; 1430 case NL80211_TX_POWER_LIMITED: 1431 ar->tx_pwr = dbm; 1432 break; 1433 default: 1434 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: type 0x%x not supported\n", 1435 __func__, type); 1436 return -EOPNOTSUPP; 1437 } 1438 1439 ath6kl_wmi_set_tx_pwr_cmd(ar->wmi, vif->fw_vif_idx, dbm); 1440 1441 return 0; 1442 } 1443 1444 static int ath6kl_cfg80211_get_txpower(struct wiphy *wiphy, 1445 struct wireless_dev *wdev, 1446 int radio_idx, 1447 unsigned int link_id, 1448 int *dbm) 1449 { 1450 struct ath6kl *ar = (struct ath6kl *)wiphy_priv(wiphy); 1451 struct ath6kl_vif *vif; 1452 1453 vif = ath6kl_vif_first(ar); 1454 if (!vif) 1455 return -EIO; 1456 1457 if (!ath6kl_cfg80211_ready(vif)) 1458 return -EIO; 1459 1460 if (test_bit(CONNECTED, &vif->flags)) { 1461 ar->tx_pwr = 255; 1462 1463 if (ath6kl_wmi_get_tx_pwr_cmd(ar->wmi, vif->fw_vif_idx) != 0) { 1464 ath6kl_err("ath6kl_wmi_get_tx_pwr_cmd failed\n"); 1465 return -EIO; 1466 } 1467 1468 wait_event_interruptible_timeout(ar->event_wq, ar->tx_pwr != 255, 1469 5 * HZ); 1470 1471 if (signal_pending(current)) { 1472 ath6kl_err("target did not respond\n"); 1473 return -EINTR; 1474 } 1475 } 1476 1477 *dbm = ar->tx_pwr; 1478 return 0; 1479 } 1480 1481 static int ath6kl_cfg80211_set_power_mgmt(struct wiphy *wiphy, 1482 struct net_device *dev, 1483 bool pmgmt, int timeout) 1484 { 1485 struct ath6kl *ar = ath6kl_priv(dev); 1486 struct wmi_power_mode_cmd mode; 1487 struct ath6kl_vif *vif = netdev_priv(dev); 1488 1489 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: pmgmt %d, timeout %d\n", 1490 __func__, pmgmt, timeout); 1491 1492 if (!ath6kl_cfg80211_ready(vif)) 1493 return -EIO; 1494 1495 if (pmgmt) { 1496 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: rec power\n", __func__); 1497 mode.pwr_mode = REC_POWER; 1498 } else { 1499 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: max perf\n", __func__); 1500 mode.pwr_mode = MAX_PERF_POWER; 1501 } 1502 1503 if (ath6kl_wmi_powermode_cmd(ar->wmi, vif->fw_vif_idx, 1504 mode.pwr_mode) != 0) { 1505 ath6kl_err("wmi_powermode_cmd failed\n"); 1506 return -EIO; 1507 } 1508 1509 return 0; 1510 } 1511 1512 static struct wireless_dev *ath6kl_cfg80211_add_iface(struct wiphy *wiphy, 1513 const char *name, 1514 unsigned char name_assign_type, 1515 enum nl80211_iftype type, 1516 struct vif_params *params) 1517 { 1518 struct ath6kl *ar = wiphy_priv(wiphy); 1519 struct wireless_dev *wdev; 1520 u8 if_idx, nw_type; 1521 1522 if (ar->num_vif == ar->vif_max) { 1523 ath6kl_err("Reached maximum number of supported vif\n"); 1524 return ERR_PTR(-EINVAL); 1525 } 1526 1527 if (!ath6kl_is_valid_iftype(ar, type, &if_idx, &nw_type)) { 1528 ath6kl_err("Not a supported interface type\n"); 1529 return ERR_PTR(-EINVAL); 1530 } 1531 1532 wdev = ath6kl_interface_add(ar, name, name_assign_type, type, if_idx, nw_type); 1533 if (!wdev) 1534 return ERR_PTR(-ENOMEM); 1535 1536 ar->num_vif++; 1537 1538 return wdev; 1539 } 1540 1541 static int ath6kl_cfg80211_del_iface(struct wiphy *wiphy, 1542 struct wireless_dev *wdev) 1543 { 1544 struct ath6kl *ar = wiphy_priv(wiphy); 1545 struct ath6kl_vif *vif = netdev_priv(wdev->netdev); 1546 1547 spin_lock_bh(&ar->list_lock); 1548 list_del(&vif->list); 1549 spin_unlock_bh(&ar->list_lock); 1550 1551 ath6kl_cfg80211_vif_stop(vif, test_bit(WMI_READY, &ar->flag)); 1552 1553 rtnl_lock(); 1554 ath6kl_cfg80211_vif_cleanup(vif); 1555 rtnl_unlock(); 1556 1557 return 0; 1558 } 1559 1560 static int ath6kl_cfg80211_change_iface(struct wiphy *wiphy, 1561 struct net_device *ndev, 1562 enum nl80211_iftype type, 1563 struct vif_params *params) 1564 { 1565 struct ath6kl_vif *vif = netdev_priv(ndev); 1566 int i; 1567 1568 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: type %u\n", __func__, type); 1569 1570 /* 1571 * Don't bring up p2p on an interface which is not initialized 1572 * for p2p operation where fw does not have capability to switch 1573 * dynamically between non-p2p and p2p type interface. 1574 */ 1575 if (!test_bit(ATH6KL_FW_CAPABILITY_STA_P2PDEV_DUPLEX, 1576 vif->ar->fw_capabilities) && 1577 (type == NL80211_IFTYPE_P2P_CLIENT || 1578 type == NL80211_IFTYPE_P2P_GO)) { 1579 if (vif->ar->vif_max == 1) { 1580 if (vif->fw_vif_idx != 0) 1581 return -EINVAL; 1582 else 1583 goto set_iface_type; 1584 } 1585 1586 for (i = vif->ar->max_norm_iface; i < vif->ar->vif_max; i++) { 1587 if (i == vif->fw_vif_idx) 1588 break; 1589 } 1590 1591 if (i == vif->ar->vif_max) { 1592 ath6kl_err("Invalid interface to bring up P2P\n"); 1593 return -EINVAL; 1594 } 1595 } 1596 1597 /* need to clean up enhanced bmiss detection fw state */ 1598 ath6kl_cfg80211_sta_bmiss_enhance(vif, false); 1599 1600 set_iface_type: 1601 switch (type) { 1602 case NL80211_IFTYPE_STATION: 1603 case NL80211_IFTYPE_P2P_CLIENT: 1604 vif->next_mode = INFRA_NETWORK; 1605 break; 1606 case NL80211_IFTYPE_ADHOC: 1607 vif->next_mode = ADHOC_NETWORK; 1608 break; 1609 case NL80211_IFTYPE_AP: 1610 case NL80211_IFTYPE_P2P_GO: 1611 vif->next_mode = AP_NETWORK; 1612 break; 1613 default: 1614 ath6kl_err("invalid interface type %u\n", type); 1615 return -EOPNOTSUPP; 1616 } 1617 1618 vif->wdev.iftype = type; 1619 1620 return 0; 1621 } 1622 1623 static int ath6kl_cfg80211_join_ibss(struct wiphy *wiphy, 1624 struct net_device *dev, 1625 struct cfg80211_ibss_params *ibss_param) 1626 { 1627 struct ath6kl *ar = ath6kl_priv(dev); 1628 struct ath6kl_vif *vif = netdev_priv(dev); 1629 int status; 1630 1631 if (!ath6kl_cfg80211_ready(vif)) 1632 return -EIO; 1633 1634 vif->ssid_len = ibss_param->ssid_len; 1635 memcpy(vif->ssid, ibss_param->ssid, vif->ssid_len); 1636 1637 if (ibss_param->chandef.chan) 1638 vif->ch_hint = ibss_param->chandef.chan->center_freq; 1639 1640 if (ibss_param->channel_fixed) { 1641 /* 1642 * TODO: channel_fixed: The channel should be fixed, do not 1643 * search for IBSSs to join on other channels. Target 1644 * firmware does not support this feature, needs to be 1645 * updated. 1646 */ 1647 return -EOPNOTSUPP; 1648 } 1649 1650 memset(vif->req_bssid, 0, sizeof(vif->req_bssid)); 1651 if (ibss_param->bssid && !is_broadcast_ether_addr(ibss_param->bssid)) 1652 memcpy(vif->req_bssid, ibss_param->bssid, 1653 sizeof(vif->req_bssid)); 1654 1655 ath6kl_set_wpa_version(vif, 0); 1656 1657 status = ath6kl_set_auth_type(vif, NL80211_AUTHTYPE_OPEN_SYSTEM); 1658 if (status) 1659 return status; 1660 1661 if (ibss_param->privacy) { 1662 ath6kl_set_cipher(vif, WLAN_CIPHER_SUITE_WEP40, true); 1663 ath6kl_set_cipher(vif, WLAN_CIPHER_SUITE_WEP40, false); 1664 } else { 1665 ath6kl_set_cipher(vif, 0, true); 1666 ath6kl_set_cipher(vif, 0, false); 1667 } 1668 1669 vif->nw_type = vif->next_mode; 1670 1671 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, 1672 "%s: connect called with authmode %d dot11 auth %d" 1673 " PW crypto %d PW crypto len %d GRP crypto %d" 1674 " GRP crypto len %d channel hint %u\n", 1675 __func__, 1676 vif->auth_mode, vif->dot11_auth_mode, vif->prwise_crypto, 1677 vif->prwise_crypto_len, vif->grp_crypto, 1678 vif->grp_crypto_len, vif->ch_hint); 1679 1680 status = ath6kl_wmi_connect_cmd(ar->wmi, vif->fw_vif_idx, vif->nw_type, 1681 vif->dot11_auth_mode, vif->auth_mode, 1682 vif->prwise_crypto, 1683 vif->prwise_crypto_len, 1684 vif->grp_crypto, vif->grp_crypto_len, 1685 vif->ssid_len, vif->ssid, 1686 vif->req_bssid, vif->ch_hint, 1687 ar->connect_ctrl_flags, SUBTYPE_NONE); 1688 set_bit(CONNECT_PEND, &vif->flags); 1689 1690 return 0; 1691 } 1692 1693 static int ath6kl_cfg80211_leave_ibss(struct wiphy *wiphy, 1694 struct net_device *dev) 1695 { 1696 struct ath6kl_vif *vif = netdev_priv(dev); 1697 1698 if (!ath6kl_cfg80211_ready(vif)) 1699 return -EIO; 1700 1701 ath6kl_disconnect(vif); 1702 memset(vif->ssid, 0, sizeof(vif->ssid)); 1703 vif->ssid_len = 0; 1704 1705 return 0; 1706 } 1707 1708 static const u32 cipher_suites[] = { 1709 WLAN_CIPHER_SUITE_WEP40, 1710 WLAN_CIPHER_SUITE_WEP104, 1711 WLAN_CIPHER_SUITE_TKIP, 1712 WLAN_CIPHER_SUITE_CCMP, 1713 CCKM_KRK_CIPHER_SUITE, 1714 WLAN_CIPHER_SUITE_SMS4, 1715 }; 1716 1717 static bool is_rate_legacy(s32 rate) 1718 { 1719 static const s32 legacy[] = { 1000, 2000, 5500, 11000, 1720 6000, 9000, 12000, 18000, 24000, 1721 36000, 48000, 54000 1722 }; 1723 u8 i; 1724 1725 for (i = 0; i < ARRAY_SIZE(legacy); i++) 1726 if (rate == legacy[i]) 1727 return true; 1728 1729 return false; 1730 } 1731 1732 static bool is_rate_ht20(s32 rate, u8 *mcs, bool *sgi) 1733 { 1734 static const s32 ht20[] = { 6500, 13000, 19500, 26000, 39000, 1735 52000, 58500, 65000, 72200 1736 }; 1737 u8 i; 1738 1739 for (i = 0; i < ARRAY_SIZE(ht20); i++) { 1740 if (rate == ht20[i]) { 1741 if (i == ARRAY_SIZE(ht20) - 1) 1742 /* last rate uses sgi */ 1743 *sgi = true; 1744 else 1745 *sgi = false; 1746 1747 *mcs = i; 1748 return true; 1749 } 1750 } 1751 return false; 1752 } 1753 1754 static bool is_rate_ht40(s32 rate, u8 *mcs, bool *sgi) 1755 { 1756 static const s32 ht40[] = { 13500, 27000, 40500, 54000, 1757 81000, 108000, 121500, 135000, 1758 150000 1759 }; 1760 u8 i; 1761 1762 for (i = 0; i < ARRAY_SIZE(ht40); i++) { 1763 if (rate == ht40[i]) { 1764 if (i == ARRAY_SIZE(ht40) - 1) 1765 /* last rate uses sgi */ 1766 *sgi = true; 1767 else 1768 *sgi = false; 1769 1770 *mcs = i; 1771 return true; 1772 } 1773 } 1774 1775 return false; 1776 } 1777 1778 static int ath6kl_get_station(struct wiphy *wiphy, struct wireless_dev *wdev, 1779 const u8 *mac, struct station_info *sinfo) 1780 { 1781 struct net_device *dev = wdev->netdev; 1782 struct ath6kl *ar = ath6kl_priv(dev); 1783 struct ath6kl_vif *vif = netdev_priv(dev); 1784 long left; 1785 bool sgi; 1786 s32 rate; 1787 int ret; 1788 u8 mcs; 1789 1790 if (memcmp(mac, vif->bssid, ETH_ALEN) != 0) 1791 return -ENOENT; 1792 1793 if (down_interruptible(&ar->sem)) 1794 return -EBUSY; 1795 1796 set_bit(STATS_UPDATE_PEND, &vif->flags); 1797 1798 ret = ath6kl_wmi_get_stats_cmd(ar->wmi, vif->fw_vif_idx); 1799 1800 if (ret != 0) { 1801 up(&ar->sem); 1802 return -EIO; 1803 } 1804 1805 left = wait_event_interruptible_timeout(ar->event_wq, 1806 !test_bit(STATS_UPDATE_PEND, 1807 &vif->flags), 1808 WMI_TIMEOUT); 1809 1810 up(&ar->sem); 1811 1812 if (left == 0) 1813 return -ETIMEDOUT; 1814 else if (left < 0) 1815 return left; 1816 1817 if (vif->target_stats.rx_byte) { 1818 sinfo->rx_bytes = vif->target_stats.rx_byte; 1819 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BYTES64); 1820 sinfo->rx_packets = vif->target_stats.rx_pkt; 1821 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_PACKETS); 1822 } 1823 1824 if (vif->target_stats.tx_byte) { 1825 sinfo->tx_bytes = vif->target_stats.tx_byte; 1826 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BYTES64); 1827 sinfo->tx_packets = vif->target_stats.tx_pkt; 1828 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_PACKETS); 1829 } 1830 1831 sinfo->signal = vif->target_stats.cs_rssi; 1832 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL); 1833 1834 rate = vif->target_stats.tx_ucast_rate; 1835 1836 if (is_rate_legacy(rate)) { 1837 sinfo->txrate.legacy = rate / 100; 1838 } else if (is_rate_ht20(rate, &mcs, &sgi)) { 1839 if (sgi) { 1840 sinfo->txrate.flags |= RATE_INFO_FLAGS_SHORT_GI; 1841 sinfo->txrate.mcs = mcs - 1; 1842 } else { 1843 sinfo->txrate.mcs = mcs; 1844 } 1845 1846 sinfo->txrate.flags |= RATE_INFO_FLAGS_MCS; 1847 sinfo->txrate.bw = RATE_INFO_BW_20; 1848 } else if (is_rate_ht40(rate, &mcs, &sgi)) { 1849 if (sgi) { 1850 sinfo->txrate.flags |= RATE_INFO_FLAGS_SHORT_GI; 1851 sinfo->txrate.mcs = mcs - 1; 1852 } else { 1853 sinfo->txrate.mcs = mcs; 1854 } 1855 1856 sinfo->txrate.bw = RATE_INFO_BW_40; 1857 sinfo->txrate.flags |= RATE_INFO_FLAGS_MCS; 1858 } else { 1859 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, 1860 "invalid rate from stats: %d\n", rate); 1861 ath6kl_debug_war(ar, ATH6KL_WAR_INVALID_RATE); 1862 return 0; 1863 } 1864 1865 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE); 1866 1867 if (test_bit(CONNECTED, &vif->flags) && 1868 test_bit(DTIM_PERIOD_AVAIL, &vif->flags) && 1869 vif->nw_type == INFRA_NETWORK) { 1870 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_BSS_PARAM); 1871 sinfo->bss_param.flags = 0; 1872 sinfo->bss_param.dtim_period = vif->assoc_bss_dtim_period; 1873 sinfo->bss_param.beacon_interval = vif->assoc_bss_beacon_int; 1874 } 1875 1876 return 0; 1877 } 1878 1879 static int ath6kl_set_pmksa(struct wiphy *wiphy, struct net_device *netdev, 1880 struct cfg80211_pmksa *pmksa) 1881 { 1882 struct ath6kl *ar = ath6kl_priv(netdev); 1883 struct ath6kl_vif *vif = netdev_priv(netdev); 1884 1885 return ath6kl_wmi_setpmkid_cmd(ar->wmi, vif->fw_vif_idx, pmksa->bssid, 1886 pmksa->pmkid, true); 1887 } 1888 1889 static int ath6kl_del_pmksa(struct wiphy *wiphy, struct net_device *netdev, 1890 struct cfg80211_pmksa *pmksa) 1891 { 1892 struct ath6kl *ar = ath6kl_priv(netdev); 1893 struct ath6kl_vif *vif = netdev_priv(netdev); 1894 1895 return ath6kl_wmi_setpmkid_cmd(ar->wmi, vif->fw_vif_idx, pmksa->bssid, 1896 pmksa->pmkid, false); 1897 } 1898 1899 static int ath6kl_flush_pmksa(struct wiphy *wiphy, struct net_device *netdev) 1900 { 1901 struct ath6kl *ar = ath6kl_priv(netdev); 1902 struct ath6kl_vif *vif = netdev_priv(netdev); 1903 1904 if (test_bit(CONNECTED, &vif->flags)) 1905 return ath6kl_wmi_setpmkid_cmd(ar->wmi, vif->fw_vif_idx, 1906 vif->bssid, NULL, false); 1907 return 0; 1908 } 1909 1910 static int ath6kl_wow_usr(struct ath6kl *ar, struct ath6kl_vif *vif, 1911 struct cfg80211_wowlan *wow, u32 *filter) 1912 { 1913 int ret, pos; 1914 u8 mask[WOW_PATTERN_SIZE]; 1915 u16 i; 1916 1917 /* Configure the patterns that we received from the user. */ 1918 for (i = 0; i < wow->n_patterns; i++) { 1919 /* 1920 * Convert given nl80211 specific mask value to equivalent 1921 * driver specific mask value and send it to the chip along 1922 * with patterns. For example, If the mask value defined in 1923 * struct cfg80211_wowlan is 0xA (equivalent binary is 1010), 1924 * then equivalent driver specific mask value is 1925 * "0xFF 0x00 0xFF 0x00". 1926 */ 1927 memset(&mask, 0, sizeof(mask)); 1928 for (pos = 0; pos < wow->patterns[i].pattern_len; pos++) { 1929 if (wow->patterns[i].mask[pos / 8] & (0x1 << (pos % 8))) 1930 mask[pos] = 0xFF; 1931 } 1932 /* 1933 * Note: Pattern's offset is not passed as part of wowlan 1934 * parameter from CFG layer. So it's always passed as ZERO 1935 * to the firmware. It means, given WOW patterns are always 1936 * matched from the first byte of received pkt in the firmware. 1937 */ 1938 ret = ath6kl_wmi_add_wow_pattern_cmd(ar->wmi, 1939 vif->fw_vif_idx, WOW_LIST_ID, 1940 wow->patterns[i].pattern_len, 1941 0 /* pattern offset */, 1942 wow->patterns[i].pattern, mask); 1943 if (ret) 1944 return ret; 1945 } 1946 1947 if (wow->disconnect) 1948 *filter |= WOW_FILTER_OPTION_NWK_DISASSOC; 1949 1950 if (wow->magic_pkt) 1951 *filter |= WOW_FILTER_OPTION_MAGIC_PACKET; 1952 1953 if (wow->gtk_rekey_failure) 1954 *filter |= WOW_FILTER_OPTION_GTK_ERROR; 1955 1956 if (wow->eap_identity_req) 1957 *filter |= WOW_FILTER_OPTION_EAP_REQ; 1958 1959 if (wow->four_way_handshake) 1960 *filter |= WOW_FILTER_OPTION_8021X_4WAYHS; 1961 1962 return 0; 1963 } 1964 1965 static int ath6kl_wow_ap(struct ath6kl *ar, struct ath6kl_vif *vif) 1966 { 1967 static const u8 unicst_pattern[] = { 0x00, 0x00, 0x00, 1968 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 1969 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 1970 0x00, 0x08 }; 1971 static const u8 unicst_mask[] = { 0x01, 0x00, 0x00, 1972 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 1973 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 1974 0x00, 0x7f }; 1975 u8 unicst_offset = 0; 1976 static const u8 arp_pattern[] = { 0x08, 0x06 }; 1977 static const u8 arp_mask[] = { 0xff, 0xff }; 1978 u8 arp_offset = 20; 1979 static const u8 discvr_pattern[] = { 0xe0, 0x00, 0x00, 0xf8 }; 1980 static const u8 discvr_mask[] = { 0xf0, 0x00, 0x00, 0xf8 }; 1981 u8 discvr_offset = 38; 1982 static const u8 dhcp_pattern[] = { 0xff, 0xff, 0xff, 0xff, 1983 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 1984 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 1985 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 1986 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 1987 0x00, 0x00, 0x00, 0x00, 0x00, 0x43 /* port 67 */ }; 1988 static const u8 dhcp_mask[] = { 0xff, 0xff, 0xff, 0xff, 1989 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 1990 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 1991 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 1992 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 1993 0x00, 0x00, 0x00, 0x00, 0xff, 0xff /* port 67 */ }; 1994 u8 dhcp_offset = 0; 1995 int ret; 1996 1997 /* Setup unicast IP, EAPOL-like and ARP pkt pattern */ 1998 ret = ath6kl_wmi_add_wow_pattern_cmd(ar->wmi, 1999 vif->fw_vif_idx, WOW_LIST_ID, 2000 sizeof(unicst_pattern), unicst_offset, 2001 unicst_pattern, unicst_mask); 2002 if (ret) { 2003 ath6kl_err("failed to add WOW unicast IP pattern\n"); 2004 return ret; 2005 } 2006 2007 /* Setup all ARP pkt pattern */ 2008 ret = ath6kl_wmi_add_wow_pattern_cmd(ar->wmi, 2009 vif->fw_vif_idx, WOW_LIST_ID, 2010 sizeof(arp_pattern), arp_offset, 2011 arp_pattern, arp_mask); 2012 if (ret) { 2013 ath6kl_err("failed to add WOW ARP pattern\n"); 2014 return ret; 2015 } 2016 2017 /* 2018 * Setup multicast pattern for mDNS 224.0.0.251, 2019 * SSDP 239.255.255.250 and LLMNR 224.0.0.252 2020 */ 2021 ret = ath6kl_wmi_add_wow_pattern_cmd(ar->wmi, 2022 vif->fw_vif_idx, WOW_LIST_ID, 2023 sizeof(discvr_pattern), discvr_offset, 2024 discvr_pattern, discvr_mask); 2025 if (ret) { 2026 ath6kl_err("failed to add WOW mDNS/SSDP/LLMNR pattern\n"); 2027 return ret; 2028 } 2029 2030 /* Setup all DHCP broadcast pkt pattern */ 2031 ret = ath6kl_wmi_add_wow_pattern_cmd(ar->wmi, 2032 vif->fw_vif_idx, WOW_LIST_ID, 2033 sizeof(dhcp_pattern), dhcp_offset, 2034 dhcp_pattern, dhcp_mask); 2035 if (ret) { 2036 ath6kl_err("failed to add WOW DHCP broadcast pattern\n"); 2037 return ret; 2038 } 2039 2040 return 0; 2041 } 2042 2043 static int ath6kl_wow_sta(struct ath6kl *ar, struct ath6kl_vif *vif) 2044 { 2045 struct net_device *ndev = vif->ndev; 2046 static const u8 discvr_pattern[] = { 0xe0, 0x00, 0x00, 0xf8 }; 2047 static const u8 discvr_mask[] = { 0xf0, 0x00, 0x00, 0xf8 }; 2048 u8 discvr_offset = 38; 2049 u8 mac_mask[ETH_ALEN]; 2050 int ret; 2051 2052 /* Setup unicast pkt pattern */ 2053 eth_broadcast_addr(mac_mask); 2054 ret = ath6kl_wmi_add_wow_pattern_cmd(ar->wmi, 2055 vif->fw_vif_idx, WOW_LIST_ID, 2056 ETH_ALEN, 0, ndev->dev_addr, 2057 mac_mask); 2058 if (ret) { 2059 ath6kl_err("failed to add WOW unicast pattern\n"); 2060 return ret; 2061 } 2062 2063 /* 2064 * Setup multicast pattern for mDNS 224.0.0.251, 2065 * SSDP 239.255.255.250 and LLMNR 224.0.0.252 2066 */ 2067 if ((ndev->flags & IFF_ALLMULTI) || 2068 (ndev->flags & IFF_MULTICAST && netdev_mc_count(ndev) > 0)) { 2069 ret = ath6kl_wmi_add_wow_pattern_cmd(ar->wmi, 2070 vif->fw_vif_idx, WOW_LIST_ID, 2071 sizeof(discvr_pattern), discvr_offset, 2072 discvr_pattern, discvr_mask); 2073 if (ret) { 2074 ath6kl_err("failed to add WOW mDNS/SSDP/LLMNR pattern\n"); 2075 return ret; 2076 } 2077 } 2078 2079 return 0; 2080 } 2081 2082 static int is_hsleep_mode_procsed(struct ath6kl_vif *vif) 2083 { 2084 return test_bit(HOST_SLEEP_MODE_CMD_PROCESSED, &vif->flags); 2085 } 2086 2087 static bool is_ctrl_ep_empty(struct ath6kl *ar) 2088 { 2089 return !ar->tx_pending[ar->ctrl_ep]; 2090 } 2091 2092 static int ath6kl_cfg80211_host_sleep(struct ath6kl *ar, struct ath6kl_vif *vif) 2093 { 2094 int ret, left; 2095 2096 clear_bit(HOST_SLEEP_MODE_CMD_PROCESSED, &vif->flags); 2097 2098 ret = ath6kl_wmi_set_host_sleep_mode_cmd(ar->wmi, vif->fw_vif_idx, 2099 ATH6KL_HOST_MODE_ASLEEP); 2100 if (ret) 2101 return ret; 2102 2103 left = wait_event_interruptible_timeout(ar->event_wq, 2104 is_hsleep_mode_procsed(vif), 2105 WMI_TIMEOUT); 2106 if (left == 0) { 2107 ath6kl_warn("timeout, didn't get host sleep cmd processed event\n"); 2108 ret = -ETIMEDOUT; 2109 } else if (left < 0) { 2110 ath6kl_warn("error while waiting for host sleep cmd processed event %d\n", 2111 left); 2112 ret = left; 2113 } 2114 2115 if (ar->tx_pending[ar->ctrl_ep]) { 2116 left = wait_event_interruptible_timeout(ar->event_wq, 2117 is_ctrl_ep_empty(ar), 2118 WMI_TIMEOUT); 2119 if (left == 0) { 2120 ath6kl_warn("clear wmi ctrl data timeout\n"); 2121 ret = -ETIMEDOUT; 2122 } else if (left < 0) { 2123 ath6kl_warn("clear wmi ctrl data failed: %d\n", left); 2124 ret = left; 2125 } 2126 } 2127 2128 return ret; 2129 } 2130 2131 static int ath6kl_wow_suspend_vif(struct ath6kl_vif *vif, 2132 struct cfg80211_wowlan *wow, u32 *filter) 2133 { 2134 struct ath6kl *ar = vif->ar; 2135 struct in_device *in_dev; 2136 struct in_ifaddr *ifa; 2137 int ret; 2138 u16 i, bmiss_time; 2139 __be32 ips[MAX_IP_ADDRS]; 2140 u8 index = 0; 2141 2142 if (!test_bit(NETDEV_MCAST_ALL_ON, &vif->flags) && 2143 test_bit(ATH6KL_FW_CAPABILITY_WOW_MULTICAST_FILTER, 2144 ar->fw_capabilities)) { 2145 ret = ath6kl_wmi_mcast_filter_cmd(vif->ar->wmi, 2146 vif->fw_vif_idx, false); 2147 if (ret) 2148 return ret; 2149 } 2150 2151 /* Clear existing WOW patterns */ 2152 for (i = 0; i < WOW_MAX_FILTERS_PER_LIST; i++) 2153 ath6kl_wmi_del_wow_pattern_cmd(ar->wmi, vif->fw_vif_idx, 2154 WOW_LIST_ID, i); 2155 2156 /* 2157 * Skip the default WOW pattern configuration 2158 * if the driver receives any WOW patterns from 2159 * the user. 2160 */ 2161 if (wow) 2162 ret = ath6kl_wow_usr(ar, vif, wow, filter); 2163 else if (vif->nw_type == AP_NETWORK) 2164 ret = ath6kl_wow_ap(ar, vif); 2165 else 2166 ret = ath6kl_wow_sta(ar, vif); 2167 2168 if (ret) 2169 return ret; 2170 2171 netif_stop_queue(vif->ndev); 2172 2173 if (vif->nw_type != AP_NETWORK) { 2174 ret = ath6kl_wmi_listeninterval_cmd(ar->wmi, vif->fw_vif_idx, 2175 ATH6KL_MAX_WOW_LISTEN_INTL, 2176 0); 2177 if (ret) 2178 return ret; 2179 2180 /* Set listen interval x 15 times as bmiss time */ 2181 bmiss_time = ATH6KL_MAX_WOW_LISTEN_INTL * 15; 2182 if (bmiss_time > ATH6KL_MAX_BMISS_TIME) 2183 bmiss_time = ATH6KL_MAX_BMISS_TIME; 2184 2185 ret = ath6kl_wmi_bmisstime_cmd(ar->wmi, vif->fw_vif_idx, 2186 bmiss_time, 0); 2187 if (ret) 2188 return ret; 2189 2190 ret = ath6kl_wmi_scanparams_cmd(ar->wmi, vif->fw_vif_idx, 2191 0xFFFF, 0, 0xFFFF, 0, 0, 0, 2192 0, 0, 0, 0); 2193 if (ret) 2194 return ret; 2195 } 2196 2197 /* Setup own IP addr for ARP agent. */ 2198 in_dev = __in_dev_get_rtnl(vif->ndev); 2199 if (!in_dev) 2200 return 0; 2201 2202 ifa = rtnl_dereference(in_dev->ifa_list); 2203 memset(&ips, 0, sizeof(ips)); 2204 2205 /* Configure IP addr only if IP address count < MAX_IP_ADDRS */ 2206 while (index < MAX_IP_ADDRS && ifa) { 2207 ips[index] = ifa->ifa_local; 2208 ifa = rtnl_dereference(ifa->ifa_next); 2209 index++; 2210 } 2211 2212 if (ifa) { 2213 ath6kl_err("total IP addr count is exceeding fw limit\n"); 2214 return -EINVAL; 2215 } 2216 2217 ret = ath6kl_wmi_set_ip_cmd(ar->wmi, vif->fw_vif_idx, ips[0], ips[1]); 2218 if (ret) { 2219 ath6kl_err("fail to setup ip for arp agent\n"); 2220 return ret; 2221 } 2222 2223 return ret; 2224 } 2225 2226 static int ath6kl_wow_suspend(struct ath6kl *ar, struct cfg80211_wowlan *wow) 2227 { 2228 struct ath6kl_vif *first_vif, *vif; 2229 int ret = 0; 2230 u32 filter = 0; 2231 bool connected = false; 2232 2233 /* enter / leave wow suspend on first vif always */ 2234 first_vif = ath6kl_vif_first(ar); 2235 if (WARN_ON(!first_vif) || 2236 !ath6kl_cfg80211_ready(first_vif)) 2237 return -EIO; 2238 2239 if (wow && (wow->n_patterns > WOW_MAX_FILTERS_PER_LIST)) 2240 return -EINVAL; 2241 2242 /* install filters for each connected vif */ 2243 spin_lock_bh(&ar->list_lock); 2244 list_for_each_entry(vif, &ar->vif_list, list) { 2245 if (!test_bit(CONNECTED, &vif->flags) || 2246 !ath6kl_cfg80211_ready(vif)) 2247 continue; 2248 connected = true; 2249 2250 ret = ath6kl_wow_suspend_vif(vif, wow, &filter); 2251 if (ret) 2252 break; 2253 } 2254 spin_unlock_bh(&ar->list_lock); 2255 2256 if (!connected) 2257 return -ENOTCONN; 2258 else if (ret) 2259 return ret; 2260 2261 ar->state = ATH6KL_STATE_SUSPENDING; 2262 2263 ret = ath6kl_wmi_set_wow_mode_cmd(ar->wmi, first_vif->fw_vif_idx, 2264 ATH6KL_WOW_MODE_ENABLE, 2265 filter, 2266 WOW_HOST_REQ_DELAY); 2267 if (ret) 2268 return ret; 2269 2270 return ath6kl_cfg80211_host_sleep(ar, first_vif); 2271 } 2272 2273 static int ath6kl_wow_resume_vif(struct ath6kl_vif *vif) 2274 { 2275 struct ath6kl *ar = vif->ar; 2276 int ret; 2277 2278 if (vif->nw_type != AP_NETWORK) { 2279 ret = ath6kl_wmi_scanparams_cmd(ar->wmi, vif->fw_vif_idx, 2280 0, 0, 0, 0, 0, 0, 3, 0, 0, 0); 2281 if (ret) 2282 return ret; 2283 2284 ret = ath6kl_wmi_listeninterval_cmd(ar->wmi, vif->fw_vif_idx, 2285 vif->listen_intvl_t, 0); 2286 if (ret) 2287 return ret; 2288 2289 ret = ath6kl_wmi_bmisstime_cmd(ar->wmi, vif->fw_vif_idx, 2290 vif->bmiss_time_t, 0); 2291 if (ret) 2292 return ret; 2293 } 2294 2295 if (!test_bit(NETDEV_MCAST_ALL_OFF, &vif->flags) && 2296 test_bit(ATH6KL_FW_CAPABILITY_WOW_MULTICAST_FILTER, 2297 ar->fw_capabilities)) { 2298 ret = ath6kl_wmi_mcast_filter_cmd(vif->ar->wmi, 2299 vif->fw_vif_idx, true); 2300 if (ret) 2301 return ret; 2302 } 2303 2304 netif_wake_queue(vif->ndev); 2305 2306 return 0; 2307 } 2308 2309 static int ath6kl_wow_resume(struct ath6kl *ar) 2310 { 2311 struct ath6kl_vif *vif; 2312 int ret; 2313 2314 vif = ath6kl_vif_first(ar); 2315 if (WARN_ON(!vif) || 2316 !ath6kl_cfg80211_ready(vif)) 2317 return -EIO; 2318 2319 ar->state = ATH6KL_STATE_RESUMING; 2320 2321 ret = ath6kl_wmi_set_host_sleep_mode_cmd(ar->wmi, vif->fw_vif_idx, 2322 ATH6KL_HOST_MODE_AWAKE); 2323 if (ret) { 2324 ath6kl_warn("Failed to configure host sleep mode for wow resume: %d\n", 2325 ret); 2326 goto cleanup; 2327 } 2328 2329 spin_lock_bh(&ar->list_lock); 2330 list_for_each_entry(vif, &ar->vif_list, list) { 2331 if (!test_bit(CONNECTED, &vif->flags) || 2332 !ath6kl_cfg80211_ready(vif)) 2333 continue; 2334 ret = ath6kl_wow_resume_vif(vif); 2335 if (ret) 2336 break; 2337 } 2338 spin_unlock_bh(&ar->list_lock); 2339 2340 if (ret) 2341 goto cleanup; 2342 2343 ar->state = ATH6KL_STATE_ON; 2344 return 0; 2345 2346 cleanup: 2347 ar->state = ATH6KL_STATE_WOW; 2348 return ret; 2349 } 2350 2351 static int ath6kl_cfg80211_deepsleep_suspend(struct ath6kl *ar) 2352 { 2353 struct ath6kl_vif *vif; 2354 int ret; 2355 2356 vif = ath6kl_vif_first(ar); 2357 if (!vif) 2358 return -EIO; 2359 2360 if (!test_bit(WMI_READY, &ar->flag)) { 2361 ath6kl_err("deepsleep failed as wmi is not ready\n"); 2362 return -EIO; 2363 } 2364 2365 ath6kl_cfg80211_stop_all(ar); 2366 2367 /* Save the current power mode before enabling power save */ 2368 ar->wmi->saved_pwr_mode = ar->wmi->pwr_mode; 2369 2370 ret = ath6kl_wmi_powermode_cmd(ar->wmi, 0, REC_POWER); 2371 if (ret) 2372 return ret; 2373 2374 /* Disable WOW mode */ 2375 ret = ath6kl_wmi_set_wow_mode_cmd(ar->wmi, vif->fw_vif_idx, 2376 ATH6KL_WOW_MODE_DISABLE, 2377 0, 0); 2378 if (ret) 2379 return ret; 2380 2381 /* Flush all non control pkts in TX path */ 2382 ath6kl_tx_data_cleanup(ar); 2383 2384 ret = ath6kl_cfg80211_host_sleep(ar, vif); 2385 if (ret) 2386 return ret; 2387 2388 return 0; 2389 } 2390 2391 static int ath6kl_cfg80211_deepsleep_resume(struct ath6kl *ar) 2392 { 2393 struct ath6kl_vif *vif; 2394 int ret; 2395 2396 vif = ath6kl_vif_first(ar); 2397 2398 if (!vif) 2399 return -EIO; 2400 2401 if (ar->wmi->pwr_mode != ar->wmi->saved_pwr_mode) { 2402 ret = ath6kl_wmi_powermode_cmd(ar->wmi, 0, 2403 ar->wmi->saved_pwr_mode); 2404 if (ret) 2405 return ret; 2406 } 2407 2408 ret = ath6kl_wmi_set_host_sleep_mode_cmd(ar->wmi, vif->fw_vif_idx, 2409 ATH6KL_HOST_MODE_AWAKE); 2410 if (ret) 2411 return ret; 2412 2413 ar->state = ATH6KL_STATE_ON; 2414 2415 /* Reset scan parameter to default values */ 2416 ret = ath6kl_wmi_scanparams_cmd(ar->wmi, vif->fw_vif_idx, 2417 0, 0, 0, 0, 0, 0, 3, 0, 0, 0); 2418 if (ret) 2419 return ret; 2420 2421 return 0; 2422 } 2423 2424 int ath6kl_cfg80211_suspend(struct ath6kl *ar, 2425 enum ath6kl_cfg_suspend_mode mode, 2426 struct cfg80211_wowlan *wow) 2427 { 2428 struct ath6kl_vif *vif; 2429 enum ath6kl_state prev_state; 2430 int ret; 2431 2432 switch (mode) { 2433 case ATH6KL_CFG_SUSPEND_WOW: 2434 2435 ath6kl_dbg(ATH6KL_DBG_SUSPEND, "wow mode suspend\n"); 2436 2437 /* Flush all non control pkts in TX path */ 2438 ath6kl_tx_data_cleanup(ar); 2439 2440 prev_state = ar->state; 2441 2442 ret = ath6kl_wow_suspend(ar, wow); 2443 if (ret) { 2444 ar->state = prev_state; 2445 return ret; 2446 } 2447 2448 ar->state = ATH6KL_STATE_WOW; 2449 break; 2450 2451 case ATH6KL_CFG_SUSPEND_DEEPSLEEP: 2452 2453 ath6kl_dbg(ATH6KL_DBG_SUSPEND, "deep sleep suspend\n"); 2454 2455 ret = ath6kl_cfg80211_deepsleep_suspend(ar); 2456 if (ret) { 2457 ath6kl_err("deepsleep suspend failed: %d\n", ret); 2458 return ret; 2459 } 2460 2461 ar->state = ATH6KL_STATE_DEEPSLEEP; 2462 2463 break; 2464 2465 case ATH6KL_CFG_SUSPEND_CUTPOWER: 2466 2467 ath6kl_cfg80211_stop_all(ar); 2468 2469 if (ar->state == ATH6KL_STATE_OFF) { 2470 ath6kl_dbg(ATH6KL_DBG_SUSPEND, 2471 "suspend hw off, no action for cutpower\n"); 2472 break; 2473 } 2474 2475 ath6kl_dbg(ATH6KL_DBG_SUSPEND, "suspend cutting power\n"); 2476 2477 ret = ath6kl_init_hw_stop(ar); 2478 if (ret) { 2479 ath6kl_warn("failed to stop hw during suspend: %d\n", 2480 ret); 2481 } 2482 2483 ar->state = ATH6KL_STATE_CUTPOWER; 2484 2485 break; 2486 2487 default: 2488 break; 2489 } 2490 2491 list_for_each_entry(vif, &ar->vif_list, list) 2492 ath6kl_cfg80211_scan_complete_event(vif, true); 2493 2494 return 0; 2495 } 2496 EXPORT_SYMBOL(ath6kl_cfg80211_suspend); 2497 2498 int ath6kl_cfg80211_resume(struct ath6kl *ar) 2499 { 2500 int ret; 2501 2502 switch (ar->state) { 2503 case ATH6KL_STATE_WOW: 2504 ath6kl_dbg(ATH6KL_DBG_SUSPEND, "wow mode resume\n"); 2505 2506 ret = ath6kl_wow_resume(ar); 2507 if (ret) { 2508 ath6kl_warn("wow mode resume failed: %d\n", ret); 2509 return ret; 2510 } 2511 2512 break; 2513 2514 case ATH6KL_STATE_DEEPSLEEP: 2515 ath6kl_dbg(ATH6KL_DBG_SUSPEND, "deep sleep resume\n"); 2516 2517 ret = ath6kl_cfg80211_deepsleep_resume(ar); 2518 if (ret) { 2519 ath6kl_warn("deep sleep resume failed: %d\n", ret); 2520 return ret; 2521 } 2522 break; 2523 2524 case ATH6KL_STATE_CUTPOWER: 2525 ath6kl_dbg(ATH6KL_DBG_SUSPEND, "resume restoring power\n"); 2526 2527 ret = ath6kl_init_hw_start(ar); 2528 if (ret) { 2529 ath6kl_warn("Failed to boot hw in resume: %d\n", ret); 2530 return ret; 2531 } 2532 break; 2533 2534 default: 2535 break; 2536 } 2537 2538 return 0; 2539 } 2540 EXPORT_SYMBOL(ath6kl_cfg80211_resume); 2541 2542 #ifdef CONFIG_PM 2543 2544 /* hif layer decides what suspend mode to use */ 2545 static int __ath6kl_cfg80211_suspend(struct wiphy *wiphy, 2546 struct cfg80211_wowlan *wow) 2547 { 2548 struct ath6kl *ar = wiphy_priv(wiphy); 2549 2550 ath6kl_recovery_suspend(ar); 2551 2552 return ath6kl_hif_suspend(ar, wow); 2553 } 2554 2555 static int __ath6kl_cfg80211_resume(struct wiphy *wiphy) 2556 { 2557 struct ath6kl *ar = wiphy_priv(wiphy); 2558 int err; 2559 2560 err = ath6kl_hif_resume(ar); 2561 if (err) 2562 return err; 2563 2564 ath6kl_recovery_resume(ar); 2565 2566 return 0; 2567 } 2568 2569 /* 2570 * FIXME: WOW suspend mode is selected if the host sdio controller supports 2571 * both sdio irq wake up and keep power. The target pulls sdio data line to 2572 * wake up the host when WOW pattern matches. This causes sdio irq handler 2573 * is being called in the host side which internally hits ath6kl's RX path. 2574 * 2575 * Since sdio interrupt is not disabled, RX path executes even before 2576 * the host executes the actual resume operation from PM module. 2577 * 2578 * In the current scenario, WOW resume should happen before start processing 2579 * any data from the target. So It's required to perform WOW resume in RX path. 2580 * Ideally we should perform WOW resume only in the actual platform 2581 * resume path. This area needs bit rework to avoid WOW resume in RX path. 2582 * 2583 * ath6kl_check_wow_status() is called from ath6kl_rx(). 2584 */ 2585 void ath6kl_check_wow_status(struct ath6kl *ar) 2586 { 2587 if (ar->state == ATH6KL_STATE_SUSPENDING) 2588 return; 2589 2590 if (ar->state == ATH6KL_STATE_WOW) 2591 ath6kl_cfg80211_resume(ar); 2592 } 2593 2594 #else 2595 2596 void ath6kl_check_wow_status(struct ath6kl *ar) 2597 { 2598 } 2599 #endif 2600 2601 static int ath6kl_set_htcap(struct ath6kl_vif *vif, enum nl80211_band band, 2602 bool ht_enable) 2603 { 2604 struct ath6kl_htcap *htcap = &vif->htcap[band]; 2605 2606 if (htcap->ht_enable == ht_enable) 2607 return 0; 2608 2609 if (ht_enable) { 2610 /* Set default ht capabilities */ 2611 htcap->ht_enable = true; 2612 htcap->cap_info = (band == NL80211_BAND_2GHZ) ? 2613 ath6kl_g_htcap : ath6kl_a_htcap; 2614 htcap->ampdu_factor = IEEE80211_HT_MAX_AMPDU_16K; 2615 } else /* Disable ht */ 2616 memset(htcap, 0, sizeof(*htcap)); 2617 2618 return ath6kl_wmi_set_htcap_cmd(vif->ar->wmi, vif->fw_vif_idx, 2619 band, htcap); 2620 } 2621 2622 static int ath6kl_restore_htcap(struct ath6kl_vif *vif) 2623 { 2624 struct wiphy *wiphy = vif->ar->wiphy; 2625 int band, ret = 0; 2626 2627 for (band = 0; band < NUM_NL80211_BANDS; band++) { 2628 if (!wiphy->bands[band]) 2629 continue; 2630 2631 ret = ath6kl_set_htcap(vif, band, 2632 wiphy->bands[band]->ht_cap.ht_supported); 2633 if (ret) 2634 return ret; 2635 } 2636 2637 return ret; 2638 } 2639 2640 static bool ath6kl_is_p2p_ie(const u8 *pos) 2641 { 2642 return pos[0] == WLAN_EID_VENDOR_SPECIFIC && pos[1] >= 4 && 2643 pos[2] == 0x50 && pos[3] == 0x6f && 2644 pos[4] == 0x9a && pos[5] == 0x09; 2645 } 2646 2647 static int ath6kl_set_ap_probe_resp_ies(struct ath6kl_vif *vif, 2648 const u8 *ies, size_t ies_len) 2649 { 2650 struct ath6kl *ar = vif->ar; 2651 const u8 *pos; 2652 u8 *buf = NULL; 2653 size_t len = 0; 2654 int ret; 2655 2656 /* 2657 * Filter out P2P IE(s) since they will be included depending on 2658 * the Probe Request frame in ath6kl_send_go_probe_resp(). 2659 */ 2660 2661 if (ies && ies_len) { 2662 buf = kmalloc(ies_len, GFP_KERNEL); 2663 if (buf == NULL) 2664 return -ENOMEM; 2665 pos = ies; 2666 while (pos + 1 < ies + ies_len) { 2667 if (pos + 2 + pos[1] > ies + ies_len) 2668 break; 2669 if (!ath6kl_is_p2p_ie(pos)) { 2670 memcpy(buf + len, pos, 2 + pos[1]); 2671 len += 2 + pos[1]; 2672 } 2673 pos += 2 + pos[1]; 2674 } 2675 } 2676 2677 ret = ath6kl_wmi_set_appie_cmd(ar->wmi, vif->fw_vif_idx, 2678 WMI_FRAME_PROBE_RESP, buf, len); 2679 kfree(buf); 2680 return ret; 2681 } 2682 2683 static int ath6kl_set_ies(struct ath6kl_vif *vif, 2684 struct cfg80211_beacon_data *info) 2685 { 2686 struct ath6kl *ar = vif->ar; 2687 int res; 2688 2689 /* this also clears IE in fw if it's not set */ 2690 res = ath6kl_wmi_set_appie_cmd(ar->wmi, vif->fw_vif_idx, 2691 WMI_FRAME_BEACON, 2692 info->beacon_ies, 2693 info->beacon_ies_len); 2694 if (res) 2695 return res; 2696 2697 /* this also clears IE in fw if it's not set */ 2698 res = ath6kl_set_ap_probe_resp_ies(vif, info->proberesp_ies, 2699 info->proberesp_ies_len); 2700 if (res) 2701 return res; 2702 2703 /* this also clears IE in fw if it's not set */ 2704 res = ath6kl_wmi_set_appie_cmd(ar->wmi, vif->fw_vif_idx, 2705 WMI_FRAME_ASSOC_RESP, 2706 info->assocresp_ies, 2707 info->assocresp_ies_len); 2708 if (res) 2709 return res; 2710 2711 return 0; 2712 } 2713 2714 static int ath6kl_get_rsn_capab(struct cfg80211_beacon_data *beacon, 2715 u8 *rsn_capab) 2716 { 2717 const u8 *rsn_ie; 2718 size_t rsn_ie_len; 2719 u16 cnt; 2720 2721 if (!beacon->tail) 2722 return -EINVAL; 2723 2724 rsn_ie = cfg80211_find_ie(WLAN_EID_RSN, beacon->tail, beacon->tail_len); 2725 if (!rsn_ie) 2726 return -EINVAL; 2727 2728 rsn_ie_len = *(rsn_ie + 1); 2729 /* skip element id and length */ 2730 rsn_ie += 2; 2731 2732 /* skip version */ 2733 if (rsn_ie_len < 2) 2734 return -EINVAL; 2735 rsn_ie += 2; 2736 rsn_ie_len -= 2; 2737 2738 /* skip group cipher suite */ 2739 if (rsn_ie_len < 4) 2740 return 0; 2741 rsn_ie += 4; 2742 rsn_ie_len -= 4; 2743 2744 /* skip pairwise cipher suite */ 2745 if (rsn_ie_len < 2) 2746 return 0; 2747 cnt = get_unaligned_le16(rsn_ie); 2748 rsn_ie += (2 + cnt * 4); 2749 rsn_ie_len -= (2 + cnt * 4); 2750 2751 /* skip akm suite */ 2752 if (rsn_ie_len < 2) 2753 return 0; 2754 cnt = get_unaligned_le16(rsn_ie); 2755 rsn_ie += (2 + cnt * 4); 2756 rsn_ie_len -= (2 + cnt * 4); 2757 2758 if (rsn_ie_len < 2) 2759 return 0; 2760 2761 memcpy(rsn_capab, rsn_ie, 2); 2762 2763 return 0; 2764 } 2765 2766 static int ath6kl_start_ap(struct wiphy *wiphy, struct net_device *dev, 2767 struct cfg80211_ap_settings *info) 2768 { 2769 struct ath6kl *ar = ath6kl_priv(dev); 2770 struct ath6kl_vif *vif = netdev_priv(dev); 2771 struct ieee80211_mgmt *mgmt; 2772 bool hidden = false; 2773 u8 *ies; 2774 struct wmi_connect_cmd p; 2775 int res; 2776 int i, ret; 2777 u16 rsn_capab = 0; 2778 int inactivity_timeout = 0; 2779 2780 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s:\n", __func__); 2781 2782 if (!ath6kl_cfg80211_ready(vif)) 2783 return -EIO; 2784 2785 if (vif->next_mode != AP_NETWORK) 2786 return -EOPNOTSUPP; 2787 2788 res = ath6kl_set_ies(vif, &info->beacon); 2789 2790 ar->ap_mode_bkey.valid = false; 2791 2792 ret = ath6kl_wmi_ap_set_beacon_intvl_cmd(ar->wmi, vif->fw_vif_idx, 2793 info->beacon_interval); 2794 2795 if (ret) 2796 ath6kl_warn("Failed to set beacon interval: %d\n", ret); 2797 2798 ret = ath6kl_wmi_ap_set_dtim_cmd(ar->wmi, vif->fw_vif_idx, 2799 info->dtim_period); 2800 2801 /* ignore error, just print a warning and continue normally */ 2802 if (ret) 2803 ath6kl_warn("Failed to set dtim_period in beacon: %d\n", ret); 2804 2805 if (info->beacon.head == NULL) 2806 return -EINVAL; 2807 mgmt = (struct ieee80211_mgmt *) info->beacon.head; 2808 ies = mgmt->u.beacon.variable; 2809 if (ies > info->beacon.head + info->beacon.head_len) 2810 return -EINVAL; 2811 2812 if (info->ssid == NULL) 2813 return -EINVAL; 2814 memcpy(vif->ssid, info->ssid, info->ssid_len); 2815 vif->ssid_len = info->ssid_len; 2816 if (info->hidden_ssid != NL80211_HIDDEN_SSID_NOT_IN_USE) 2817 hidden = true; 2818 2819 res = ath6kl_wmi_ap_hidden_ssid(ar->wmi, vif->fw_vif_idx, hidden); 2820 if (res) 2821 return res; 2822 2823 ret = ath6kl_set_auth_type(vif, info->auth_type); 2824 if (ret) 2825 return ret; 2826 2827 memset(&p, 0, sizeof(p)); 2828 2829 for (i = 0; i < info->crypto.n_akm_suites; i++) { 2830 switch (info->crypto.akm_suites[i]) { 2831 case WLAN_AKM_SUITE_8021X: 2832 if (info->crypto.wpa_versions & NL80211_WPA_VERSION_1) 2833 p.auth_mode |= WPA_AUTH; 2834 if (info->crypto.wpa_versions & NL80211_WPA_VERSION_2) 2835 p.auth_mode |= WPA2_AUTH; 2836 break; 2837 case WLAN_AKM_SUITE_PSK: 2838 if (info->crypto.wpa_versions & NL80211_WPA_VERSION_1) 2839 p.auth_mode |= WPA_PSK_AUTH; 2840 if (info->crypto.wpa_versions & NL80211_WPA_VERSION_2) 2841 p.auth_mode |= WPA2_PSK_AUTH; 2842 break; 2843 } 2844 } 2845 if (p.auth_mode == 0) 2846 p.auth_mode = NONE_AUTH; 2847 vif->auth_mode = p.auth_mode; 2848 2849 for (i = 0; i < info->crypto.n_ciphers_pairwise; i++) { 2850 switch (info->crypto.ciphers_pairwise[i]) { 2851 case WLAN_CIPHER_SUITE_WEP40: 2852 case WLAN_CIPHER_SUITE_WEP104: 2853 p.prwise_crypto_type |= WEP_CRYPT; 2854 break; 2855 case WLAN_CIPHER_SUITE_TKIP: 2856 p.prwise_crypto_type |= TKIP_CRYPT; 2857 break; 2858 case WLAN_CIPHER_SUITE_CCMP: 2859 p.prwise_crypto_type |= AES_CRYPT; 2860 break; 2861 case WLAN_CIPHER_SUITE_SMS4: 2862 p.prwise_crypto_type |= WAPI_CRYPT; 2863 break; 2864 } 2865 } 2866 if (p.prwise_crypto_type == 0) { 2867 p.prwise_crypto_type = NONE_CRYPT; 2868 ath6kl_set_cipher(vif, 0, true); 2869 } else if (info->crypto.n_ciphers_pairwise == 1) { 2870 ath6kl_set_cipher(vif, info->crypto.ciphers_pairwise[0], true); 2871 } 2872 2873 switch (info->crypto.cipher_group) { 2874 case WLAN_CIPHER_SUITE_WEP40: 2875 case WLAN_CIPHER_SUITE_WEP104: 2876 p.grp_crypto_type = WEP_CRYPT; 2877 break; 2878 case WLAN_CIPHER_SUITE_TKIP: 2879 p.grp_crypto_type = TKIP_CRYPT; 2880 break; 2881 case WLAN_CIPHER_SUITE_CCMP: 2882 p.grp_crypto_type = AES_CRYPT; 2883 break; 2884 case WLAN_CIPHER_SUITE_SMS4: 2885 p.grp_crypto_type = WAPI_CRYPT; 2886 break; 2887 default: 2888 p.grp_crypto_type = NONE_CRYPT; 2889 break; 2890 } 2891 ath6kl_set_cipher(vif, info->crypto.cipher_group, false); 2892 2893 p.nw_type = AP_NETWORK; 2894 vif->nw_type = vif->next_mode; 2895 2896 p.ssid_len = vif->ssid_len; 2897 memcpy(p.ssid, vif->ssid, vif->ssid_len); 2898 p.dot11_auth_mode = vif->dot11_auth_mode; 2899 p.ch = cpu_to_le16(info->chandef.chan->center_freq); 2900 2901 /* Enable uAPSD support by default */ 2902 res = ath6kl_wmi_ap_set_apsd(ar->wmi, vif->fw_vif_idx, true); 2903 if (res < 0) 2904 return res; 2905 2906 if (vif->wdev.iftype == NL80211_IFTYPE_P2P_GO) { 2907 p.nw_subtype = SUBTYPE_P2PGO; 2908 } else { 2909 /* 2910 * Due to firmware limitation, it is not possible to 2911 * do P2P mgmt operations in AP mode 2912 */ 2913 p.nw_subtype = SUBTYPE_NONE; 2914 } 2915 2916 if (info->inactivity_timeout) { 2917 inactivity_timeout = info->inactivity_timeout; 2918 2919 if (test_bit(ATH6KL_FW_CAPABILITY_AP_INACTIVITY_MINS, 2920 ar->fw_capabilities)) 2921 inactivity_timeout = DIV_ROUND_UP(inactivity_timeout, 2922 60); 2923 2924 res = ath6kl_wmi_set_inact_period(ar->wmi, vif->fw_vif_idx, 2925 inactivity_timeout); 2926 if (res < 0) 2927 return res; 2928 } 2929 2930 if (ath6kl_set_htcap(vif, info->chandef.chan->band, 2931 cfg80211_get_chandef_type(&info->chandef) 2932 != NL80211_CHAN_NO_HT)) 2933 return -EIO; 2934 2935 /* 2936 * Get the PTKSA replay counter in the RSN IE. Supplicant 2937 * will use the RSN IE in M3 message and firmware has to 2938 * advertise the same in beacon/probe response. Send 2939 * the complete RSN IE capability field to firmware 2940 */ 2941 if (!ath6kl_get_rsn_capab(&info->beacon, (u8 *) &rsn_capab) && 2942 test_bit(ATH6KL_FW_CAPABILITY_RSN_CAP_OVERRIDE, 2943 ar->fw_capabilities)) { 2944 res = ath6kl_wmi_set_ie_cmd(ar->wmi, vif->fw_vif_idx, 2945 WLAN_EID_RSN, WMI_RSN_IE_CAPB, 2946 (const u8 *) &rsn_capab, 2947 sizeof(rsn_capab)); 2948 vif->rsn_capab = rsn_capab; 2949 if (res < 0) 2950 return res; 2951 } 2952 2953 memcpy(&vif->profile, &p, sizeof(p)); 2954 res = ath6kl_wmi_ap_profile_commit(ar->wmi, vif->fw_vif_idx, &p); 2955 if (res < 0) 2956 return res; 2957 2958 return 0; 2959 } 2960 2961 static int ath6kl_change_beacon(struct wiphy *wiphy, struct net_device *dev, 2962 struct cfg80211_ap_update *params) 2963 { 2964 struct ath6kl_vif *vif = netdev_priv(dev); 2965 2966 if (!ath6kl_cfg80211_ready(vif)) 2967 return -EIO; 2968 2969 if (vif->next_mode != AP_NETWORK) 2970 return -EOPNOTSUPP; 2971 2972 return ath6kl_set_ies(vif, ¶ms->beacon); 2973 } 2974 2975 static int ath6kl_stop_ap(struct wiphy *wiphy, struct net_device *dev, 2976 unsigned int link_id) 2977 { 2978 struct ath6kl *ar = ath6kl_priv(dev); 2979 struct ath6kl_vif *vif = netdev_priv(dev); 2980 2981 if (vif->nw_type != AP_NETWORK) 2982 return -EOPNOTSUPP; 2983 if (!test_bit(CONNECTED, &vif->flags)) 2984 return -ENOTCONN; 2985 2986 ath6kl_wmi_disconnect_cmd(ar->wmi, vif->fw_vif_idx); 2987 clear_bit(CONNECTED, &vif->flags); 2988 netif_carrier_off(vif->ndev); 2989 2990 /* Restore ht setting in firmware */ 2991 return ath6kl_restore_htcap(vif); 2992 } 2993 2994 static const u8 bcast_addr[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; 2995 2996 static int ath6kl_del_station(struct wiphy *wiphy, struct wireless_dev *wdev, 2997 struct station_del_parameters *params) 2998 { 2999 struct net_device *dev = wdev->netdev; 3000 struct ath6kl *ar = ath6kl_priv(dev); 3001 struct ath6kl_vif *vif = netdev_priv(dev); 3002 const u8 *addr = params->mac ? params->mac : bcast_addr; 3003 3004 return ath6kl_wmi_ap_set_mlme(ar->wmi, vif->fw_vif_idx, WMI_AP_DEAUTH, 3005 addr, WLAN_REASON_PREV_AUTH_NOT_VALID); 3006 } 3007 3008 static int ath6kl_change_station(struct wiphy *wiphy, struct wireless_dev *wdev, 3009 const u8 *mac, 3010 struct station_parameters *params) 3011 { 3012 struct net_device *dev = wdev->netdev; 3013 struct ath6kl *ar = ath6kl_priv(dev); 3014 struct ath6kl_vif *vif = netdev_priv(dev); 3015 int err; 3016 3017 if (vif->nw_type != AP_NETWORK) 3018 return -EOPNOTSUPP; 3019 3020 err = cfg80211_check_station_change(wiphy, params, 3021 CFG80211_STA_AP_MLME_CLIENT); 3022 if (err) 3023 return err; 3024 3025 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED)) 3026 return ath6kl_wmi_ap_set_mlme(ar->wmi, vif->fw_vif_idx, 3027 WMI_AP_MLME_AUTHORIZE, mac, 0); 3028 return ath6kl_wmi_ap_set_mlme(ar->wmi, vif->fw_vif_idx, 3029 WMI_AP_MLME_UNAUTHORIZE, mac, 0); 3030 } 3031 3032 static int ath6kl_remain_on_channel(struct wiphy *wiphy, 3033 struct wireless_dev *wdev, 3034 struct ieee80211_channel *chan, 3035 unsigned int duration, 3036 u64 *cookie) 3037 { 3038 struct ath6kl_vif *vif = ath6kl_vif_from_wdev(wdev); 3039 struct ath6kl *ar = ath6kl_priv(vif->ndev); 3040 u32 id; 3041 3042 /* TODO: if already pending or ongoing remain-on-channel, 3043 * return -EBUSY */ 3044 id = ++vif->last_roc_id; 3045 if (id == 0) { 3046 /* Do not use 0 as the cookie value */ 3047 id = ++vif->last_roc_id; 3048 } 3049 *cookie = id; 3050 3051 return ath6kl_wmi_remain_on_chnl_cmd(ar->wmi, vif->fw_vif_idx, 3052 chan->center_freq, duration); 3053 } 3054 3055 static int ath6kl_cancel_remain_on_channel(struct wiphy *wiphy, 3056 struct wireless_dev *wdev, 3057 u64 cookie) 3058 { 3059 struct ath6kl_vif *vif = ath6kl_vif_from_wdev(wdev); 3060 struct ath6kl *ar = ath6kl_priv(vif->ndev); 3061 3062 if (cookie != vif->last_roc_id) 3063 return -ENOENT; 3064 vif->last_cancel_roc_id = cookie; 3065 3066 return ath6kl_wmi_cancel_remain_on_chnl_cmd(ar->wmi, vif->fw_vif_idx); 3067 } 3068 3069 static int ath6kl_send_go_probe_resp(struct ath6kl_vif *vif, 3070 const u8 *buf, size_t len, 3071 unsigned int freq) 3072 { 3073 struct ath6kl *ar = vif->ar; 3074 const u8 *pos; 3075 u8 *p2p; 3076 int p2p_len; 3077 int ret; 3078 const struct ieee80211_mgmt *mgmt; 3079 3080 mgmt = (const struct ieee80211_mgmt *) buf; 3081 3082 /* Include P2P IE(s) from the frame generated in user space. */ 3083 3084 p2p = kmalloc(len, GFP_KERNEL); 3085 if (p2p == NULL) 3086 return -ENOMEM; 3087 p2p_len = 0; 3088 3089 pos = mgmt->u.probe_resp.variable; 3090 while (pos + 1 < buf + len) { 3091 if (pos + 2 + pos[1] > buf + len) 3092 break; 3093 if (ath6kl_is_p2p_ie(pos)) { 3094 memcpy(p2p + p2p_len, pos, 2 + pos[1]); 3095 p2p_len += 2 + pos[1]; 3096 } 3097 pos += 2 + pos[1]; 3098 } 3099 3100 ret = ath6kl_wmi_send_probe_response_cmd(ar->wmi, vif->fw_vif_idx, freq, 3101 mgmt->da, p2p, p2p_len); 3102 kfree(p2p); 3103 return ret; 3104 } 3105 3106 static bool ath6kl_mgmt_powersave_ap(struct ath6kl_vif *vif, 3107 u32 id, 3108 u32 freq, 3109 u32 wait, 3110 const u8 *buf, 3111 size_t len, 3112 bool *more_data, 3113 bool no_cck) 3114 { 3115 struct ieee80211_mgmt *mgmt; 3116 struct ath6kl_sta *conn; 3117 bool is_psq_empty = false; 3118 struct ath6kl_mgmt_buff *mgmt_buf; 3119 size_t mgmt_buf_size; 3120 struct ath6kl *ar = vif->ar; 3121 3122 mgmt = (struct ieee80211_mgmt *) buf; 3123 if (is_multicast_ether_addr(mgmt->da)) 3124 return false; 3125 3126 conn = ath6kl_find_sta(vif, mgmt->da); 3127 if (!conn) 3128 return false; 3129 3130 if (conn->sta_flags & STA_PS_SLEEP) { 3131 if (!(conn->sta_flags & STA_PS_POLLED)) { 3132 /* Queue the frames if the STA is sleeping */ 3133 mgmt_buf_size = len + sizeof(struct ath6kl_mgmt_buff); 3134 mgmt_buf = kmalloc(mgmt_buf_size, GFP_KERNEL); 3135 if (!mgmt_buf) 3136 return false; 3137 3138 INIT_LIST_HEAD(&mgmt_buf->list); 3139 mgmt_buf->id = id; 3140 mgmt_buf->freq = freq; 3141 mgmt_buf->wait = wait; 3142 mgmt_buf->len = len; 3143 mgmt_buf->no_cck = no_cck; 3144 memcpy(mgmt_buf->buf, buf, len); 3145 spin_lock_bh(&conn->psq_lock); 3146 is_psq_empty = skb_queue_empty(&conn->psq) && 3147 (conn->mgmt_psq_len == 0); 3148 list_add_tail(&mgmt_buf->list, &conn->mgmt_psq); 3149 conn->mgmt_psq_len++; 3150 spin_unlock_bh(&conn->psq_lock); 3151 3152 /* 3153 * If this is the first pkt getting queued 3154 * for this STA, update the PVB for this 3155 * STA. 3156 */ 3157 if (is_psq_empty) 3158 ath6kl_wmi_set_pvb_cmd(ar->wmi, vif->fw_vif_idx, 3159 conn->aid, 1); 3160 return true; 3161 } 3162 3163 /* 3164 * This tx is because of a PsPoll. 3165 * Determine if MoreData bit has to be set. 3166 */ 3167 spin_lock_bh(&conn->psq_lock); 3168 if (!skb_queue_empty(&conn->psq) || (conn->mgmt_psq_len != 0)) 3169 *more_data = true; 3170 spin_unlock_bh(&conn->psq_lock); 3171 } 3172 3173 return false; 3174 } 3175 3176 /* Check if SSID length is greater than DIRECT- */ 3177 static bool ath6kl_is_p2p_go_ssid(const u8 *buf, size_t len) 3178 { 3179 const struct ieee80211_mgmt *mgmt; 3180 mgmt = (const struct ieee80211_mgmt *) buf; 3181 3182 /* variable[1] contains the SSID tag length */ 3183 if (buf + len >= &mgmt->u.probe_resp.variable[1] && 3184 (mgmt->u.probe_resp.variable[1] > P2P_WILDCARD_SSID_LEN)) { 3185 return true; 3186 } 3187 3188 return false; 3189 } 3190 3191 static int ath6kl_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev, 3192 struct cfg80211_mgmt_tx_params *params, u64 *cookie) 3193 { 3194 struct ath6kl_vif *vif = ath6kl_vif_from_wdev(wdev); 3195 struct ath6kl *ar = ath6kl_priv(vif->ndev); 3196 struct ieee80211_channel *chan = params->chan; 3197 const u8 *buf = params->buf; 3198 size_t len = params->len; 3199 unsigned int wait = params->wait; 3200 bool no_cck = params->no_cck; 3201 u32 id, freq; 3202 const struct ieee80211_mgmt *mgmt; 3203 bool more_data, queued; 3204 3205 /* default to the current channel, but use the one specified as argument 3206 * if any 3207 */ 3208 freq = vif->ch_hint; 3209 if (chan) 3210 freq = chan->center_freq; 3211 3212 /* never send freq zero to the firmware */ 3213 if (WARN_ON(freq == 0)) 3214 return -EINVAL; 3215 3216 mgmt = (const struct ieee80211_mgmt *) buf; 3217 if (vif->nw_type == AP_NETWORK && test_bit(CONNECTED, &vif->flags) && 3218 ieee80211_is_probe_resp(mgmt->frame_control) && 3219 ath6kl_is_p2p_go_ssid(buf, len)) { 3220 /* 3221 * Send Probe Response frame in GO mode using a separate WMI 3222 * command to allow the target to fill in the generic IEs. 3223 */ 3224 *cookie = 0; /* TX status not supported */ 3225 return ath6kl_send_go_probe_resp(vif, buf, len, freq); 3226 } 3227 3228 id = vif->send_action_id++; 3229 if (id == 0) { 3230 /* 3231 * 0 is a reserved value in the WMI command and shall not be 3232 * used for the command. 3233 */ 3234 id = vif->send_action_id++; 3235 } 3236 3237 *cookie = id; 3238 3239 /* AP mode Power saving processing */ 3240 if (vif->nw_type == AP_NETWORK) { 3241 queued = ath6kl_mgmt_powersave_ap(vif, id, freq, wait, buf, len, 3242 &more_data, no_cck); 3243 if (queued) 3244 return 0; 3245 } 3246 3247 return ath6kl_wmi_send_mgmt_cmd(ar->wmi, vif->fw_vif_idx, id, freq, 3248 wait, buf, len, no_cck); 3249 } 3250 3251 static int ath6kl_get_antenna(struct wiphy *wiphy, int radio_idx, 3252 u32 *tx_ant, u32 *rx_ant) 3253 { 3254 struct ath6kl *ar = wiphy_priv(wiphy); 3255 *tx_ant = ar->hw.tx_ant; 3256 *rx_ant = ar->hw.rx_ant; 3257 return 0; 3258 } 3259 3260 static void ath6kl_update_mgmt_frame_registrations(struct wiphy *wiphy, 3261 struct wireless_dev *wdev, 3262 struct mgmt_frame_regs *upd) 3263 { 3264 struct ath6kl_vif *vif = ath6kl_vif_from_wdev(wdev); 3265 3266 /* 3267 * FIXME: send WMI_PROBE_REQ_REPORT_CMD here instead of hardcoding 3268 * the reporting in the target all the time, this callback 3269 * *is* allowed to sleep after all. 3270 */ 3271 vif->probe_req_report = 3272 upd->interface_stypes & BIT(IEEE80211_STYPE_PROBE_REQ >> 4); 3273 } 3274 3275 static int ath6kl_cfg80211_sscan_start(struct wiphy *wiphy, 3276 struct net_device *dev, 3277 struct cfg80211_sched_scan_request *request) 3278 { 3279 struct ath6kl *ar = ath6kl_priv(dev); 3280 struct ath6kl_vif *vif = netdev_priv(dev); 3281 u16 interval; 3282 int ret, rssi_thold; 3283 int n_match_sets = request->n_match_sets; 3284 3285 /* 3286 * If there's a matchset w/o an SSID, then assume it's just for 3287 * the RSSI (nothing else is currently supported) and ignore it. 3288 * The device only supports a global RSSI filter that we set below. 3289 */ 3290 if (n_match_sets == 1 && !request->match_sets[0].ssid.ssid_len) 3291 n_match_sets = 0; 3292 3293 if (ar->state != ATH6KL_STATE_ON) 3294 return -EIO; 3295 3296 if (vif->sme_state != SME_DISCONNECTED) 3297 return -EBUSY; 3298 3299 ath6kl_cfg80211_scan_complete_event(vif, true); 3300 3301 ret = ath6kl_set_probed_ssids(ar, vif, request->ssids, 3302 request->n_ssids, 3303 request->match_sets, 3304 n_match_sets); 3305 if (ret < 0) 3306 return ret; 3307 3308 if (!n_match_sets) { 3309 ret = ath6kl_wmi_bssfilter_cmd(ar->wmi, vif->fw_vif_idx, 3310 ALL_BSS_FILTER, 0); 3311 if (ret < 0) 3312 return ret; 3313 } else { 3314 ret = ath6kl_wmi_bssfilter_cmd(ar->wmi, vif->fw_vif_idx, 3315 MATCHED_SSID_FILTER, 0); 3316 if (ret < 0) 3317 return ret; 3318 } 3319 3320 if (test_bit(ATH6KL_FW_CAPABILITY_RSSI_SCAN_THOLD, 3321 ar->fw_capabilities)) { 3322 if (request->min_rssi_thold <= NL80211_SCAN_RSSI_THOLD_OFF) 3323 rssi_thold = 0; 3324 else if (request->min_rssi_thold < -127) 3325 rssi_thold = -127; 3326 else 3327 rssi_thold = request->min_rssi_thold; 3328 3329 ret = ath6kl_wmi_set_rssi_filter_cmd(ar->wmi, vif->fw_vif_idx, 3330 rssi_thold); 3331 if (ret) { 3332 ath6kl_err("failed to set RSSI threshold for scan\n"); 3333 return ret; 3334 } 3335 } 3336 3337 /* fw uses seconds, also make sure that it's >0 */ 3338 interval = max_t(u16, 1, request->scan_plans[0].interval); 3339 3340 ath6kl_wmi_scanparams_cmd(ar->wmi, vif->fw_vif_idx, 3341 interval, interval, 3342 vif->bg_scan_period, 0, 0, 0, 3, 0, 0, 0); 3343 3344 /* this also clears IE in fw if it's not set */ 3345 ret = ath6kl_wmi_set_appie_cmd(ar->wmi, vif->fw_vif_idx, 3346 WMI_FRAME_PROBE_REQ, 3347 request->ie, request->ie_len); 3348 if (ret) { 3349 ath6kl_warn("Failed to set probe request IE for scheduled scan: %d\n", 3350 ret); 3351 return ret; 3352 } 3353 3354 ret = ath6kl_wmi_enable_sched_scan_cmd(ar->wmi, vif->fw_vif_idx, true); 3355 if (ret) 3356 return ret; 3357 3358 set_bit(SCHED_SCANNING, &vif->flags); 3359 3360 return 0; 3361 } 3362 3363 static int ath6kl_cfg80211_sscan_stop(struct wiphy *wiphy, 3364 struct net_device *dev, u64 reqid) 3365 { 3366 struct ath6kl_vif *vif = netdev_priv(dev); 3367 bool stopped; 3368 3369 stopped = __ath6kl_cfg80211_sscan_stop(vif); 3370 3371 if (!stopped) 3372 return -EIO; 3373 3374 return 0; 3375 } 3376 3377 static int ath6kl_cfg80211_set_bitrate(struct wiphy *wiphy, 3378 struct net_device *dev, 3379 unsigned int link_id, 3380 const u8 *addr, 3381 const struct cfg80211_bitrate_mask *mask) 3382 { 3383 struct ath6kl *ar = ath6kl_priv(dev); 3384 struct ath6kl_vif *vif = netdev_priv(dev); 3385 3386 return ath6kl_wmi_set_bitrate_mask(ar->wmi, vif->fw_vif_idx, 3387 mask); 3388 } 3389 3390 static int ath6kl_cfg80211_set_txe_config(struct wiphy *wiphy, 3391 struct net_device *dev, 3392 u32 rate, u32 pkts, u32 intvl) 3393 { 3394 struct ath6kl *ar = ath6kl_priv(dev); 3395 struct ath6kl_vif *vif = netdev_priv(dev); 3396 3397 if (vif->nw_type != INFRA_NETWORK || 3398 !test_bit(ATH6KL_FW_CAPABILITY_TX_ERR_NOTIFY, ar->fw_capabilities)) 3399 return -EOPNOTSUPP; 3400 3401 if (vif->sme_state != SME_CONNECTED) 3402 return -ENOTCONN; 3403 3404 /* save this since the firmware won't report the interval */ 3405 vif->txe_intvl = intvl; 3406 3407 return ath6kl_wmi_set_txe_notify(ar->wmi, vif->fw_vif_idx, 3408 rate, pkts, intvl); 3409 } 3410 3411 static const struct ieee80211_txrx_stypes 3412 ath6kl_mgmt_stypes[NUM_NL80211_IFTYPES] = { 3413 [NL80211_IFTYPE_STATION] = { 3414 .tx = BIT(IEEE80211_STYPE_ACTION >> 4) | 3415 BIT(IEEE80211_STYPE_PROBE_RESP >> 4), 3416 .rx = BIT(IEEE80211_STYPE_ACTION >> 4) | 3417 BIT(IEEE80211_STYPE_PROBE_REQ >> 4) 3418 }, 3419 [NL80211_IFTYPE_AP] = { 3420 .tx = BIT(IEEE80211_STYPE_ACTION >> 4) | 3421 BIT(IEEE80211_STYPE_PROBE_RESP >> 4), 3422 .rx = BIT(IEEE80211_STYPE_ACTION >> 4) | 3423 BIT(IEEE80211_STYPE_PROBE_REQ >> 4) 3424 }, 3425 [NL80211_IFTYPE_P2P_CLIENT] = { 3426 .tx = BIT(IEEE80211_STYPE_ACTION >> 4) | 3427 BIT(IEEE80211_STYPE_PROBE_RESP >> 4), 3428 .rx = BIT(IEEE80211_STYPE_ACTION >> 4) | 3429 BIT(IEEE80211_STYPE_PROBE_REQ >> 4) 3430 }, 3431 [NL80211_IFTYPE_P2P_GO] = { 3432 .tx = BIT(IEEE80211_STYPE_ACTION >> 4) | 3433 BIT(IEEE80211_STYPE_PROBE_RESP >> 4), 3434 .rx = BIT(IEEE80211_STYPE_ACTION >> 4) | 3435 BIT(IEEE80211_STYPE_PROBE_REQ >> 4) 3436 }, 3437 }; 3438 3439 static struct cfg80211_ops ath6kl_cfg80211_ops = { 3440 .add_virtual_intf = ath6kl_cfg80211_add_iface, 3441 .del_virtual_intf = ath6kl_cfg80211_del_iface, 3442 .change_virtual_intf = ath6kl_cfg80211_change_iface, 3443 .scan = ath6kl_cfg80211_scan, 3444 .connect = ath6kl_cfg80211_connect, 3445 .disconnect = ath6kl_cfg80211_disconnect, 3446 .add_key = ath6kl_cfg80211_add_key, 3447 .get_key = ath6kl_cfg80211_get_key, 3448 .del_key = ath6kl_cfg80211_del_key, 3449 .set_default_key = ath6kl_cfg80211_set_default_key, 3450 .set_wiphy_params = ath6kl_cfg80211_set_wiphy_params, 3451 .set_tx_power = ath6kl_cfg80211_set_txpower, 3452 .get_tx_power = ath6kl_cfg80211_get_txpower, 3453 .set_power_mgmt = ath6kl_cfg80211_set_power_mgmt, 3454 .join_ibss = ath6kl_cfg80211_join_ibss, 3455 .leave_ibss = ath6kl_cfg80211_leave_ibss, 3456 .get_station = ath6kl_get_station, 3457 .set_pmksa = ath6kl_set_pmksa, 3458 .del_pmksa = ath6kl_del_pmksa, 3459 .flush_pmksa = ath6kl_flush_pmksa, 3460 CFG80211_TESTMODE_CMD(ath6kl_tm_cmd) 3461 #ifdef CONFIG_PM 3462 .suspend = __ath6kl_cfg80211_suspend, 3463 .resume = __ath6kl_cfg80211_resume, 3464 #endif 3465 .start_ap = ath6kl_start_ap, 3466 .change_beacon = ath6kl_change_beacon, 3467 .stop_ap = ath6kl_stop_ap, 3468 .del_station = ath6kl_del_station, 3469 .change_station = ath6kl_change_station, 3470 .remain_on_channel = ath6kl_remain_on_channel, 3471 .cancel_remain_on_channel = ath6kl_cancel_remain_on_channel, 3472 .mgmt_tx = ath6kl_mgmt_tx, 3473 .update_mgmt_frame_registrations = 3474 ath6kl_update_mgmt_frame_registrations, 3475 .get_antenna = ath6kl_get_antenna, 3476 .sched_scan_start = ath6kl_cfg80211_sscan_start, 3477 .sched_scan_stop = ath6kl_cfg80211_sscan_stop, 3478 .set_bitrate_mask = ath6kl_cfg80211_set_bitrate, 3479 .set_cqm_txe_config = ath6kl_cfg80211_set_txe_config, 3480 }; 3481 3482 void ath6kl_cfg80211_stop(struct ath6kl_vif *vif) 3483 { 3484 ath6kl_cfg80211_sscan_disable(vif); 3485 3486 switch (vif->sme_state) { 3487 case SME_DISCONNECTED: 3488 break; 3489 case SME_CONNECTING: 3490 cfg80211_connect_result(vif->ndev, vif->bssid, NULL, 0, 3491 NULL, 0, 3492 WLAN_STATUS_UNSPECIFIED_FAILURE, 3493 GFP_KERNEL); 3494 break; 3495 case SME_CONNECTED: 3496 cfg80211_disconnected(vif->ndev, 0, NULL, 0, true, GFP_KERNEL); 3497 break; 3498 } 3499 3500 if (vif->ar->state != ATH6KL_STATE_RECOVERY && 3501 (test_bit(CONNECTED, &vif->flags) || 3502 test_bit(CONNECT_PEND, &vif->flags))) 3503 ath6kl_wmi_disconnect_cmd(vif->ar->wmi, vif->fw_vif_idx); 3504 3505 vif->sme_state = SME_DISCONNECTED; 3506 clear_bit(CONNECTED, &vif->flags); 3507 clear_bit(CONNECT_PEND, &vif->flags); 3508 3509 /* Stop netdev queues, needed during recovery */ 3510 netif_stop_queue(vif->ndev); 3511 netif_carrier_off(vif->ndev); 3512 3513 /* disable scanning */ 3514 if (vif->ar->state != ATH6KL_STATE_RECOVERY && 3515 ath6kl_wmi_scanparams_cmd(vif->ar->wmi, vif->fw_vif_idx, 0xFFFF, 3516 0, 0, 0, 0, 0, 0, 0, 0, 0) != 0) 3517 ath6kl_warn("failed to disable scan during stop\n"); 3518 3519 ath6kl_cfg80211_scan_complete_event(vif, true); 3520 } 3521 3522 void ath6kl_cfg80211_stop_all(struct ath6kl *ar) 3523 { 3524 struct ath6kl_vif *vif; 3525 3526 vif = ath6kl_vif_first(ar); 3527 if (!vif && ar->state != ATH6KL_STATE_RECOVERY) { 3528 /* save the current power mode before enabling power save */ 3529 ar->wmi->saved_pwr_mode = ar->wmi->pwr_mode; 3530 3531 if (ath6kl_wmi_powermode_cmd(ar->wmi, 0, REC_POWER) != 0) 3532 ath6kl_warn("ath6kl_deep_sleep_enable: wmi_powermode_cmd failed\n"); 3533 return; 3534 } 3535 3536 /* 3537 * FIXME: we should take ar->list_lock to protect changes in the 3538 * vif_list, but that's not trivial to do as ath6kl_cfg80211_stop() 3539 * sleeps. 3540 */ 3541 list_for_each_entry(vif, &ar->vif_list, list) 3542 ath6kl_cfg80211_stop(vif); 3543 } 3544 3545 static void ath6kl_cfg80211_reg_notify(struct wiphy *wiphy, 3546 struct regulatory_request *request) 3547 { 3548 struct ath6kl *ar = wiphy_priv(wiphy); 3549 u32 rates[NUM_NL80211_BANDS]; 3550 int ret, i; 3551 3552 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, 3553 "cfg reg_notify %c%c%s%s initiator %d hint_type %d\n", 3554 request->alpha2[0], request->alpha2[1], 3555 request->intersect ? " intersect" : "", 3556 request->processed ? " processed" : "", 3557 request->initiator, request->user_reg_hint_type); 3558 3559 if (request->user_reg_hint_type != NL80211_USER_REG_HINT_CELL_BASE) 3560 return; 3561 3562 ret = ath6kl_wmi_set_regdomain_cmd(ar->wmi, request->alpha2); 3563 if (ret) { 3564 ath6kl_err("failed to set regdomain: %d\n", ret); 3565 return; 3566 } 3567 3568 /* 3569 * Firmware will apply the regdomain change only after a scan is 3570 * issued and it will send a WMI_REGDOMAIN_EVENTID when it has been 3571 * changed. 3572 */ 3573 3574 for (i = 0; i < NUM_NL80211_BANDS; i++) 3575 if (wiphy->bands[i]) 3576 rates[i] = (1 << wiphy->bands[i]->n_bitrates) - 1; 3577 3578 3579 ret = ath6kl_wmi_beginscan_cmd(ar->wmi, 0, WMI_LONG_SCAN, false, 3580 false, 0, ATH6KL_FG_SCAN_INTERVAL, 3581 0, NULL, false, rates); 3582 if (ret) { 3583 ath6kl_err("failed to start scan for a regdomain change: %d\n", 3584 ret); 3585 return; 3586 } 3587 } 3588 3589 static int ath6kl_cfg80211_vif_init(struct ath6kl_vif *vif) 3590 { 3591 vif->aggr_cntxt = aggr_init(vif); 3592 if (!vif->aggr_cntxt) { 3593 ath6kl_err("failed to initialize aggr\n"); 3594 return -ENOMEM; 3595 } 3596 3597 timer_setup(&vif->disconnect_timer, disconnect_timer_handler, 0); 3598 timer_setup(&vif->sched_scan_timer, ath6kl_wmi_sscan_timer, 0); 3599 3600 set_bit(WMM_ENABLED, &vif->flags); 3601 spin_lock_init(&vif->if_lock); 3602 3603 INIT_LIST_HEAD(&vif->mc_filter); 3604 3605 return 0; 3606 } 3607 3608 void ath6kl_cfg80211_vif_stop(struct ath6kl_vif *vif, bool wmi_ready) 3609 { 3610 static u8 bcast_mac[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; 3611 bool discon_issued; 3612 3613 netif_stop_queue(vif->ndev); 3614 3615 clear_bit(WLAN_ENABLED, &vif->flags); 3616 3617 if (wmi_ready) { 3618 discon_issued = test_bit(CONNECTED, &vif->flags) || 3619 test_bit(CONNECT_PEND, &vif->flags); 3620 ath6kl_disconnect(vif); 3621 timer_delete(&vif->disconnect_timer); 3622 3623 if (discon_issued) 3624 ath6kl_disconnect_event(vif, DISCONNECT_CMD, 3625 (vif->nw_type & AP_NETWORK) ? 3626 bcast_mac : vif->bssid, 3627 0, NULL, 0); 3628 } 3629 3630 if (vif->scan_req) { 3631 struct cfg80211_scan_info info = { 3632 .aborted = true, 3633 }; 3634 3635 cfg80211_scan_done(vif->scan_req, &info); 3636 vif->scan_req = NULL; 3637 } 3638 3639 /* need to clean up enhanced bmiss detection fw state */ 3640 ath6kl_cfg80211_sta_bmiss_enhance(vif, false); 3641 } 3642 3643 void ath6kl_cfg80211_vif_cleanup(struct ath6kl_vif *vif) 3644 { 3645 struct ath6kl *ar = vif->ar; 3646 struct ath6kl_mc_filter *mc_filter, *tmp; 3647 3648 aggr_module_destroy(vif->aggr_cntxt); 3649 3650 ar->avail_idx_map |= BIT(vif->fw_vif_idx); 3651 3652 if (vif->nw_type == ADHOC_NETWORK) 3653 ar->ibss_if_active = false; 3654 3655 list_for_each_entry_safe(mc_filter, tmp, &vif->mc_filter, list) { 3656 list_del(&mc_filter->list); 3657 kfree(mc_filter); 3658 } 3659 3660 cfg80211_unregister_netdevice(vif->ndev); 3661 3662 ar->num_vif--; 3663 } 3664 3665 static const char ath6kl_gstrings_sta_stats[][ETH_GSTRING_LEN] = { 3666 /* Common stats names used by many drivers. */ 3667 "tx_pkts_nic", "tx_bytes_nic", "rx_pkts_nic", "rx_bytes_nic", 3668 3669 /* TX stats. */ 3670 "d_tx_ucast_pkts", "d_tx_bcast_pkts", 3671 "d_tx_ucast_bytes", "d_tx_bcast_bytes", 3672 "d_tx_rts_ok", "d_tx_error", "d_tx_fail", 3673 "d_tx_retry", "d_tx_multi_retry", "d_tx_rts_fail", 3674 "d_tx_tkip_counter_measures", 3675 3676 /* RX Stats. */ 3677 "d_rx_ucast_pkts", "d_rx_ucast_rate", "d_rx_bcast_pkts", 3678 "d_rx_ucast_bytes", "d_rx_bcast_bytes", "d_rx_frag_pkt", 3679 "d_rx_error", "d_rx_crc_err", "d_rx_keycache_miss", 3680 "d_rx_decrypt_crc_err", "d_rx_duplicate_frames", 3681 "d_rx_mic_err", "d_rx_tkip_format_err", "d_rx_ccmp_format_err", 3682 "d_rx_ccmp_replay_err", 3683 3684 /* Misc stats. */ 3685 "d_beacon_miss", "d_num_connects", "d_num_disconnects", 3686 "d_beacon_avg_rssi", "d_arp_received", "d_arp_matched", 3687 "d_arp_replied" 3688 }; 3689 3690 #define ATH6KL_STATS_LEN ARRAY_SIZE(ath6kl_gstrings_sta_stats) 3691 3692 static int ath6kl_get_sset_count(struct net_device *dev, int sset) 3693 { 3694 int rv = 0; 3695 3696 if (sset == ETH_SS_STATS) 3697 rv += ATH6KL_STATS_LEN; 3698 3699 if (rv == 0) 3700 return -EOPNOTSUPP; 3701 return rv; 3702 } 3703 3704 static void ath6kl_get_stats(struct net_device *dev, 3705 struct ethtool_stats *stats, 3706 u64 *data) 3707 { 3708 struct ath6kl_vif *vif = netdev_priv(dev); 3709 struct ath6kl *ar = vif->ar; 3710 int i = 0; 3711 struct target_stats *tgt_stats; 3712 3713 memset(data, 0, sizeof(u64) * ATH6KL_STATS_LEN); 3714 3715 ath6kl_read_tgt_stats(ar, vif); 3716 3717 tgt_stats = &vif->target_stats; 3718 3719 data[i++] = tgt_stats->tx_ucast_pkt + tgt_stats->tx_bcast_pkt; 3720 data[i++] = tgt_stats->tx_ucast_byte + tgt_stats->tx_bcast_byte; 3721 data[i++] = tgt_stats->rx_ucast_pkt + tgt_stats->rx_bcast_pkt; 3722 data[i++] = tgt_stats->rx_ucast_byte + tgt_stats->rx_bcast_byte; 3723 3724 data[i++] = tgt_stats->tx_ucast_pkt; 3725 data[i++] = tgt_stats->tx_bcast_pkt; 3726 data[i++] = tgt_stats->tx_ucast_byte; 3727 data[i++] = tgt_stats->tx_bcast_byte; 3728 data[i++] = tgt_stats->tx_rts_success_cnt; 3729 data[i++] = tgt_stats->tx_err; 3730 data[i++] = tgt_stats->tx_fail_cnt; 3731 data[i++] = tgt_stats->tx_retry_cnt; 3732 data[i++] = tgt_stats->tx_mult_retry_cnt; 3733 data[i++] = tgt_stats->tx_rts_fail_cnt; 3734 data[i++] = tgt_stats->tkip_cnter_measures_invoked; 3735 3736 data[i++] = tgt_stats->rx_ucast_pkt; 3737 data[i++] = tgt_stats->rx_ucast_rate; 3738 data[i++] = tgt_stats->rx_bcast_pkt; 3739 data[i++] = tgt_stats->rx_ucast_byte; 3740 data[i++] = tgt_stats->rx_bcast_byte; 3741 data[i++] = tgt_stats->rx_frgment_pkt; 3742 data[i++] = tgt_stats->rx_err; 3743 data[i++] = tgt_stats->rx_crc_err; 3744 data[i++] = tgt_stats->rx_key_cache_miss; 3745 data[i++] = tgt_stats->rx_decrypt_err; 3746 data[i++] = tgt_stats->rx_dupl_frame; 3747 data[i++] = tgt_stats->tkip_local_mic_fail; 3748 data[i++] = tgt_stats->tkip_fmt_err; 3749 data[i++] = tgt_stats->ccmp_fmt_err; 3750 data[i++] = tgt_stats->ccmp_replays; 3751 3752 data[i++] = tgt_stats->cs_bmiss_cnt; 3753 data[i++] = tgt_stats->cs_connect_cnt; 3754 data[i++] = tgt_stats->cs_discon_cnt; 3755 data[i++] = tgt_stats->cs_ave_beacon_rssi; 3756 data[i++] = tgt_stats->arp_received; 3757 data[i++] = tgt_stats->arp_matched; 3758 data[i++] = tgt_stats->arp_replied; 3759 3760 if (i != ATH6KL_STATS_LEN) { 3761 WARN_ON_ONCE(1); 3762 ath6kl_err("ethtool stats error, i: %d STATS_LEN: %d\n", 3763 i, (int)ATH6KL_STATS_LEN); 3764 } 3765 } 3766 3767 /* These stats are per NIC, not really per vdev, so we just ignore dev. */ 3768 static void ath6kl_get_strings(struct net_device *dev, u32 sset, u8 *data) 3769 { 3770 int sz_sta_stats = 0; 3771 3772 if (sset == ETH_SS_STATS) { 3773 sz_sta_stats = sizeof(ath6kl_gstrings_sta_stats); 3774 memcpy(data, ath6kl_gstrings_sta_stats, sz_sta_stats); 3775 } 3776 } 3777 3778 static const struct ethtool_ops ath6kl_ethtool_ops = { 3779 .get_drvinfo = cfg80211_get_drvinfo, 3780 .get_link = ethtool_op_get_link, 3781 .get_strings = ath6kl_get_strings, 3782 .get_ethtool_stats = ath6kl_get_stats, 3783 .get_sset_count = ath6kl_get_sset_count, 3784 }; 3785 3786 struct wireless_dev *ath6kl_interface_add(struct ath6kl *ar, const char *name, 3787 unsigned char name_assign_type, 3788 enum nl80211_iftype type, 3789 u8 fw_vif_idx, u8 nw_type) 3790 { 3791 struct net_device *ndev; 3792 struct ath6kl_vif *vif; 3793 u8 addr[ETH_ALEN]; 3794 3795 ndev = alloc_netdev(sizeof(*vif), name, name_assign_type, ether_setup); 3796 if (!ndev) 3797 return NULL; 3798 3799 vif = netdev_priv(ndev); 3800 ndev->ieee80211_ptr = &vif->wdev; 3801 vif->wdev.wiphy = ar->wiphy; 3802 vif->ar = ar; 3803 vif->ndev = ndev; 3804 SET_NETDEV_DEV(ndev, wiphy_dev(vif->wdev.wiphy)); 3805 vif->wdev.netdev = ndev; 3806 vif->wdev.iftype = type; 3807 vif->fw_vif_idx = fw_vif_idx; 3808 vif->nw_type = nw_type; 3809 vif->next_mode = nw_type; 3810 vif->listen_intvl_t = ATH6KL_DEFAULT_LISTEN_INTVAL; 3811 vif->bmiss_time_t = ATH6KL_DEFAULT_BMISS_TIME; 3812 vif->bg_scan_period = 0; 3813 vif->htcap[NL80211_BAND_2GHZ].ht_enable = true; 3814 vif->htcap[NL80211_BAND_5GHZ].ht_enable = true; 3815 3816 ether_addr_copy(addr, ar->mac_addr); 3817 if (fw_vif_idx != 0) { 3818 addr[0] = (addr[0] ^ (1 << fw_vif_idx)) | 0x2; 3819 if (test_bit(ATH6KL_FW_CAPABILITY_CUSTOM_MAC_ADDR, 3820 ar->fw_capabilities)) 3821 addr[4] ^= 0x80; 3822 } 3823 eth_hw_addr_set(ndev, addr); 3824 3825 init_netdev(ndev); 3826 3827 ath6kl_init_control_info(vif); 3828 3829 if (ath6kl_cfg80211_vif_init(vif)) 3830 goto err; 3831 3832 netdev_set_default_ethtool_ops(ndev, &ath6kl_ethtool_ops); 3833 3834 if (cfg80211_register_netdevice(ndev)) 3835 goto err; 3836 3837 ar->avail_idx_map &= ~BIT(fw_vif_idx); 3838 vif->sme_state = SME_DISCONNECTED; 3839 set_bit(WLAN_ENABLED, &vif->flags); 3840 ar->wlan_pwr_state = WLAN_POWER_STATE_ON; 3841 3842 if (type == NL80211_IFTYPE_ADHOC) 3843 ar->ibss_if_active = true; 3844 3845 spin_lock_bh(&ar->list_lock); 3846 list_add_tail(&vif->list, &ar->vif_list); 3847 spin_unlock_bh(&ar->list_lock); 3848 3849 return &vif->wdev; 3850 3851 err: 3852 aggr_module_destroy(vif->aggr_cntxt); 3853 free_netdev(ndev); 3854 return NULL; 3855 } 3856 3857 #ifdef CONFIG_PM 3858 static const struct wiphy_wowlan_support ath6kl_wowlan_support = { 3859 .flags = WIPHY_WOWLAN_MAGIC_PKT | 3860 WIPHY_WOWLAN_DISCONNECT | 3861 WIPHY_WOWLAN_GTK_REKEY_FAILURE | 3862 WIPHY_WOWLAN_SUPPORTS_GTK_REKEY | 3863 WIPHY_WOWLAN_EAP_IDENTITY_REQ | 3864 WIPHY_WOWLAN_4WAY_HANDSHAKE, 3865 .n_patterns = WOW_MAX_FILTERS_PER_LIST, 3866 .pattern_min_len = 1, 3867 .pattern_max_len = WOW_PATTERN_SIZE, 3868 }; 3869 #endif 3870 3871 int ath6kl_cfg80211_init(struct ath6kl *ar) 3872 { 3873 struct wiphy *wiphy = ar->wiphy; 3874 bool band_2gig = false, band_5gig = false, ht = false; 3875 int ret; 3876 3877 wiphy->mgmt_stypes = ath6kl_mgmt_stypes; 3878 3879 wiphy->max_remain_on_channel_duration = 5000; 3880 3881 /* set device pointer for wiphy */ 3882 set_wiphy_dev(wiphy, ar->dev); 3883 3884 wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | 3885 BIT(NL80211_IFTYPE_ADHOC) | 3886 BIT(NL80211_IFTYPE_AP); 3887 if (ar->p2p) { 3888 wiphy->interface_modes |= BIT(NL80211_IFTYPE_P2P_GO) | 3889 BIT(NL80211_IFTYPE_P2P_CLIENT); 3890 } 3891 3892 if (IS_ENABLED(CONFIG_ATH6KL_REGDOMAIN) && 3893 test_bit(ATH6KL_FW_CAPABILITY_REGDOMAIN, ar->fw_capabilities)) { 3894 wiphy->reg_notifier = ath6kl_cfg80211_reg_notify; 3895 ar->wiphy->features |= NL80211_FEATURE_CELL_BASE_REG_HINTS; 3896 } 3897 3898 /* max num of ssids that can be probed during scanning */ 3899 wiphy->max_scan_ssids = MAX_PROBED_SSIDS; 3900 3901 /* max num of ssids that can be matched after scan */ 3902 if (test_bit(ATH6KL_FW_CAPABILITY_SCHED_SCAN_MATCH_LIST, 3903 ar->fw_capabilities)) 3904 wiphy->max_match_sets = MAX_PROBED_SSIDS; 3905 3906 wiphy->max_scan_ie_len = 1000; /* FIX: what is correct limit? */ 3907 switch (ar->hw.cap) { 3908 case WMI_11AN_CAP: 3909 ht = true; 3910 fallthrough; 3911 case WMI_11A_CAP: 3912 band_5gig = true; 3913 break; 3914 case WMI_11GN_CAP: 3915 ht = true; 3916 fallthrough; 3917 case WMI_11G_CAP: 3918 band_2gig = true; 3919 break; 3920 case WMI_11AGN_CAP: 3921 ht = true; 3922 fallthrough; 3923 case WMI_11AG_CAP: 3924 band_2gig = true; 3925 band_5gig = true; 3926 break; 3927 default: 3928 ath6kl_err("invalid phy capability!\n"); 3929 return -EINVAL; 3930 } 3931 3932 /* 3933 * Even if the fw has HT support, advertise HT cap only when 3934 * the firmware has support to override RSN capability, otherwise 3935 * 4-way handshake would fail. 3936 */ 3937 if (!(ht && 3938 test_bit(ATH6KL_FW_CAPABILITY_RSN_CAP_OVERRIDE, 3939 ar->fw_capabilities))) { 3940 ath6kl_band_2ghz.ht_cap.cap = 0; 3941 ath6kl_band_2ghz.ht_cap.ht_supported = false; 3942 ath6kl_band_5ghz.ht_cap.cap = 0; 3943 ath6kl_band_5ghz.ht_cap.ht_supported = false; 3944 3945 if (ht) 3946 ath6kl_err("Firmware lacks RSN-CAP-OVERRIDE, so HT (802.11n) is disabled."); 3947 } 3948 3949 if (test_bit(ATH6KL_FW_CAPABILITY_64BIT_RATES, 3950 ar->fw_capabilities)) { 3951 ath6kl_band_2ghz.ht_cap.mcs.rx_mask[0] = 0xff; 3952 ath6kl_band_5ghz.ht_cap.mcs.rx_mask[0] = 0xff; 3953 ath6kl_band_2ghz.ht_cap.mcs.rx_mask[1] = 0xff; 3954 ath6kl_band_5ghz.ht_cap.mcs.rx_mask[1] = 0xff; 3955 ar->hw.tx_ant = 0x3; /* mask, 2 antenna */ 3956 ar->hw.rx_ant = 0x3; 3957 } else { 3958 ath6kl_band_2ghz.ht_cap.mcs.rx_mask[0] = 0xff; 3959 ath6kl_band_5ghz.ht_cap.mcs.rx_mask[0] = 0xff; 3960 ar->hw.tx_ant = 1; 3961 ar->hw.rx_ant = 1; 3962 } 3963 3964 wiphy->available_antennas_tx = ar->hw.tx_ant; 3965 wiphy->available_antennas_rx = ar->hw.rx_ant; 3966 3967 if (band_2gig) 3968 wiphy->bands[NL80211_BAND_2GHZ] = &ath6kl_band_2ghz; 3969 if (band_5gig) 3970 wiphy->bands[NL80211_BAND_5GHZ] = &ath6kl_band_5ghz; 3971 3972 wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM; 3973 3974 wiphy->cipher_suites = cipher_suites; 3975 wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites); 3976 3977 #ifdef CONFIG_PM 3978 wiphy->wowlan = &ath6kl_wowlan_support; 3979 #endif 3980 3981 wiphy->max_sched_scan_ssids = MAX_PROBED_SSIDS; 3982 3983 ar->wiphy->flags |= WIPHY_FLAG_SUPPORTS_FW_ROAM | 3984 WIPHY_FLAG_HAVE_AP_SME | 3985 WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL | 3986 WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD; 3987 3988 if (test_bit(ATH6KL_FW_CAPABILITY_SCHED_SCAN_V2, ar->fw_capabilities)) 3989 ar->wiphy->max_sched_scan_reqs = 1; 3990 3991 if (test_bit(ATH6KL_FW_CAPABILITY_INACTIVITY_TIMEOUT, 3992 ar->fw_capabilities)) 3993 ar->wiphy->features |= NL80211_FEATURE_INACTIVITY_TIMER; 3994 3995 ar->wiphy->probe_resp_offload = 3996 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS | 3997 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2 | 3998 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P; 3999 4000 ret = wiphy_register(wiphy); 4001 if (ret < 0) { 4002 ath6kl_err("couldn't register wiphy device\n"); 4003 return ret; 4004 } 4005 4006 ar->wiphy_registered = true; 4007 4008 return 0; 4009 } 4010 4011 void ath6kl_cfg80211_cleanup(struct ath6kl *ar) 4012 { 4013 wiphy_unregister(ar->wiphy); 4014 4015 ar->wiphy_registered = false; 4016 } 4017 4018 struct ath6kl *ath6kl_cfg80211_create(void) 4019 { 4020 struct ath6kl *ar; 4021 struct wiphy *wiphy; 4022 4023 /* create a new wiphy for use with cfg80211 */ 4024 wiphy = wiphy_new(&ath6kl_cfg80211_ops, sizeof(struct ath6kl)); 4025 4026 if (!wiphy) { 4027 ath6kl_err("couldn't allocate wiphy device\n"); 4028 return NULL; 4029 } 4030 4031 ar = wiphy_priv(wiphy); 4032 ar->wiphy = wiphy; 4033 4034 return ar; 4035 } 4036 4037 /* Note: ar variable must not be accessed after calling this! */ 4038 void ath6kl_cfg80211_destroy(struct ath6kl *ar) 4039 { 4040 int i; 4041 4042 for (i = 0; i < AP_MAX_NUM_STA; i++) 4043 kfree(ar->sta_list[i].aggr_conn); 4044 4045 wiphy_free(ar->wiphy); 4046 } 4047 4048