1 // SPDX-License-Identifier: BSD-3-Clause-Clear 2 /* 3 * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. 4 * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. 5 */ 6 7 #include <net/mac80211.h> 8 #include <linux/etherdevice.h> 9 #include <linux/bitfield.h> 10 #include <linux/inetdevice.h> 11 #include <net/if_inet6.h> 12 #include <net/ipv6.h> 13 14 #include "mac.h" 15 #include "core.h" 16 #include "debug.h" 17 #include "wmi.h" 18 #include "hw.h" 19 #include "dp_tx.h" 20 #include "dp_rx.h" 21 #include "testmode.h" 22 #include "peer.h" 23 #include "debugfs_sta.h" 24 #include "hif.h" 25 #include "wow.h" 26 27 #define CHAN2G(_channel, _freq, _flags) { \ 28 .band = NL80211_BAND_2GHZ, \ 29 .hw_value = (_channel), \ 30 .center_freq = (_freq), \ 31 .flags = (_flags), \ 32 .max_antenna_gain = 0, \ 33 .max_power = 30, \ 34 } 35 36 #define CHAN5G(_channel, _freq, _flags) { \ 37 .band = NL80211_BAND_5GHZ, \ 38 .hw_value = (_channel), \ 39 .center_freq = (_freq), \ 40 .flags = (_flags), \ 41 .max_antenna_gain = 0, \ 42 .max_power = 30, \ 43 } 44 45 #define CHAN6G(_channel, _freq, _flags) { \ 46 .band = NL80211_BAND_6GHZ, \ 47 .hw_value = (_channel), \ 48 .center_freq = (_freq), \ 49 .flags = (_flags), \ 50 .max_antenna_gain = 0, \ 51 .max_power = 30, \ 52 } 53 54 static const struct ieee80211_channel ath11k_2ghz_channels[] = { 55 CHAN2G(1, 2412, 0), 56 CHAN2G(2, 2417, 0), 57 CHAN2G(3, 2422, 0), 58 CHAN2G(4, 2427, 0), 59 CHAN2G(5, 2432, 0), 60 CHAN2G(6, 2437, 0), 61 CHAN2G(7, 2442, 0), 62 CHAN2G(8, 2447, 0), 63 CHAN2G(9, 2452, 0), 64 CHAN2G(10, 2457, 0), 65 CHAN2G(11, 2462, 0), 66 CHAN2G(12, 2467, 0), 67 CHAN2G(13, 2472, 0), 68 CHAN2G(14, 2484, 0), 69 }; 70 71 static const struct ieee80211_channel ath11k_5ghz_channels[] = { 72 CHAN5G(36, 5180, 0), 73 CHAN5G(40, 5200, 0), 74 CHAN5G(44, 5220, 0), 75 CHAN5G(48, 5240, 0), 76 CHAN5G(52, 5260, 0), 77 CHAN5G(56, 5280, 0), 78 CHAN5G(60, 5300, 0), 79 CHAN5G(64, 5320, 0), 80 CHAN5G(100, 5500, 0), 81 CHAN5G(104, 5520, 0), 82 CHAN5G(108, 5540, 0), 83 CHAN5G(112, 5560, 0), 84 CHAN5G(116, 5580, 0), 85 CHAN5G(120, 5600, 0), 86 CHAN5G(124, 5620, 0), 87 CHAN5G(128, 5640, 0), 88 CHAN5G(132, 5660, 0), 89 CHAN5G(136, 5680, 0), 90 CHAN5G(140, 5700, 0), 91 CHAN5G(144, 5720, 0), 92 CHAN5G(149, 5745, 0), 93 CHAN5G(153, 5765, 0), 94 CHAN5G(157, 5785, 0), 95 CHAN5G(161, 5805, 0), 96 CHAN5G(165, 5825, 0), 97 CHAN5G(169, 5845, 0), 98 CHAN5G(173, 5865, 0), 99 CHAN5G(177, 5885, 0), 100 }; 101 102 static const struct ieee80211_channel ath11k_6ghz_channels[] = { 103 CHAN6G(1, 5955, 0), 104 CHAN6G(5, 5975, 0), 105 CHAN6G(9, 5995, 0), 106 CHAN6G(13, 6015, 0), 107 CHAN6G(17, 6035, 0), 108 CHAN6G(21, 6055, 0), 109 CHAN6G(25, 6075, 0), 110 CHAN6G(29, 6095, 0), 111 CHAN6G(33, 6115, 0), 112 CHAN6G(37, 6135, 0), 113 CHAN6G(41, 6155, 0), 114 CHAN6G(45, 6175, 0), 115 CHAN6G(49, 6195, 0), 116 CHAN6G(53, 6215, 0), 117 CHAN6G(57, 6235, 0), 118 CHAN6G(61, 6255, 0), 119 CHAN6G(65, 6275, 0), 120 CHAN6G(69, 6295, 0), 121 CHAN6G(73, 6315, 0), 122 CHAN6G(77, 6335, 0), 123 CHAN6G(81, 6355, 0), 124 CHAN6G(85, 6375, 0), 125 CHAN6G(89, 6395, 0), 126 CHAN6G(93, 6415, 0), 127 CHAN6G(97, 6435, 0), 128 CHAN6G(101, 6455, 0), 129 CHAN6G(105, 6475, 0), 130 CHAN6G(109, 6495, 0), 131 CHAN6G(113, 6515, 0), 132 CHAN6G(117, 6535, 0), 133 CHAN6G(121, 6555, 0), 134 CHAN6G(125, 6575, 0), 135 CHAN6G(129, 6595, 0), 136 CHAN6G(133, 6615, 0), 137 CHAN6G(137, 6635, 0), 138 CHAN6G(141, 6655, 0), 139 CHAN6G(145, 6675, 0), 140 CHAN6G(149, 6695, 0), 141 CHAN6G(153, 6715, 0), 142 CHAN6G(157, 6735, 0), 143 CHAN6G(161, 6755, 0), 144 CHAN6G(165, 6775, 0), 145 CHAN6G(169, 6795, 0), 146 CHAN6G(173, 6815, 0), 147 CHAN6G(177, 6835, 0), 148 CHAN6G(181, 6855, 0), 149 CHAN6G(185, 6875, 0), 150 CHAN6G(189, 6895, 0), 151 CHAN6G(193, 6915, 0), 152 CHAN6G(197, 6935, 0), 153 CHAN6G(201, 6955, 0), 154 CHAN6G(205, 6975, 0), 155 CHAN6G(209, 6995, 0), 156 CHAN6G(213, 7015, 0), 157 CHAN6G(217, 7035, 0), 158 CHAN6G(221, 7055, 0), 159 CHAN6G(225, 7075, 0), 160 CHAN6G(229, 7095, 0), 161 CHAN6G(233, 7115, 0), 162 163 /* new addition in IEEE Std 802.11ax-2021 */ 164 CHAN6G(2, 5935, 0), 165 }; 166 167 static struct ieee80211_rate ath11k_legacy_rates[] = { 168 { .bitrate = 10, 169 .hw_value = ATH11K_HW_RATE_CCK_LP_1M }, 170 { .bitrate = 20, 171 .hw_value = ATH11K_HW_RATE_CCK_LP_2M, 172 .hw_value_short = ATH11K_HW_RATE_CCK_SP_2M, 173 .flags = IEEE80211_RATE_SHORT_PREAMBLE }, 174 { .bitrate = 55, 175 .hw_value = ATH11K_HW_RATE_CCK_LP_5_5M, 176 .hw_value_short = ATH11K_HW_RATE_CCK_SP_5_5M, 177 .flags = IEEE80211_RATE_SHORT_PREAMBLE }, 178 { .bitrate = 110, 179 .hw_value = ATH11K_HW_RATE_CCK_LP_11M, 180 .hw_value_short = ATH11K_HW_RATE_CCK_SP_11M, 181 .flags = IEEE80211_RATE_SHORT_PREAMBLE }, 182 183 { .bitrate = 60, .hw_value = ATH11K_HW_RATE_OFDM_6M }, 184 { .bitrate = 90, .hw_value = ATH11K_HW_RATE_OFDM_9M }, 185 { .bitrate = 120, .hw_value = ATH11K_HW_RATE_OFDM_12M }, 186 { .bitrate = 180, .hw_value = ATH11K_HW_RATE_OFDM_18M }, 187 { .bitrate = 240, .hw_value = ATH11K_HW_RATE_OFDM_24M }, 188 { .bitrate = 360, .hw_value = ATH11K_HW_RATE_OFDM_36M }, 189 { .bitrate = 480, .hw_value = ATH11K_HW_RATE_OFDM_48M }, 190 { .bitrate = 540, .hw_value = ATH11K_HW_RATE_OFDM_54M }, 191 }; 192 193 static const int 194 ath11k_phymodes[NUM_NL80211_BANDS][ATH11K_CHAN_WIDTH_NUM] = { 195 [NL80211_BAND_2GHZ] = { 196 [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN, 197 [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN, 198 [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11AX_HE20_2G, 199 [NL80211_CHAN_WIDTH_20] = MODE_11AX_HE20_2G, 200 [NL80211_CHAN_WIDTH_40] = MODE_11AX_HE40_2G, 201 [NL80211_CHAN_WIDTH_80] = MODE_11AX_HE80_2G, 202 [NL80211_CHAN_WIDTH_80P80] = MODE_UNKNOWN, 203 [NL80211_CHAN_WIDTH_160] = MODE_UNKNOWN, 204 }, 205 [NL80211_BAND_5GHZ] = { 206 [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN, 207 [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN, 208 [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11AX_HE20, 209 [NL80211_CHAN_WIDTH_20] = MODE_11AX_HE20, 210 [NL80211_CHAN_WIDTH_40] = MODE_11AX_HE40, 211 [NL80211_CHAN_WIDTH_80] = MODE_11AX_HE80, 212 [NL80211_CHAN_WIDTH_160] = MODE_11AX_HE160, 213 [NL80211_CHAN_WIDTH_80P80] = MODE_11AX_HE80_80, 214 }, 215 [NL80211_BAND_6GHZ] = { 216 [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN, 217 [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN, 218 [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11AX_HE20, 219 [NL80211_CHAN_WIDTH_20] = MODE_11AX_HE20, 220 [NL80211_CHAN_WIDTH_40] = MODE_11AX_HE40, 221 [NL80211_CHAN_WIDTH_80] = MODE_11AX_HE80, 222 [NL80211_CHAN_WIDTH_160] = MODE_11AX_HE160, 223 [NL80211_CHAN_WIDTH_80P80] = MODE_11AX_HE80_80, 224 }, 225 226 }; 227 228 const struct htt_rx_ring_tlv_filter ath11k_mac_mon_status_filter_default = { 229 .rx_filter = HTT_RX_FILTER_TLV_FLAGS_MPDU_START | 230 HTT_RX_FILTER_TLV_FLAGS_PPDU_END | 231 HTT_RX_FILTER_TLV_FLAGS_PPDU_END_STATUS_DONE, 232 .pkt_filter_flags0 = HTT_RX_FP_MGMT_FILTER_FLAGS0, 233 .pkt_filter_flags1 = HTT_RX_FP_MGMT_FILTER_FLAGS1, 234 .pkt_filter_flags2 = HTT_RX_FP_CTRL_FILTER_FLASG2, 235 .pkt_filter_flags3 = HTT_RX_FP_DATA_FILTER_FLASG3 | 236 HTT_RX_FP_CTRL_FILTER_FLASG3 237 }; 238 239 #define ATH11K_MAC_FIRST_OFDM_RATE_IDX 4 240 #define ath11k_g_rates ath11k_legacy_rates 241 #define ath11k_g_rates_size (ARRAY_SIZE(ath11k_legacy_rates)) 242 #define ath11k_a_rates (ath11k_legacy_rates + 4) 243 #define ath11k_a_rates_size (ARRAY_SIZE(ath11k_legacy_rates) - 4) 244 245 #define ATH11K_MAC_SCAN_CMD_EVT_OVERHEAD 200 /* in msecs */ 246 247 /* Overhead due to the processing of channel switch events from FW */ 248 #define ATH11K_SCAN_CHANNEL_SWITCH_WMI_EVT_OVERHEAD 10 /* in msecs */ 249 250 static const u32 ath11k_smps_map[] = { 251 [WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC, 252 [WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC, 253 [WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE, 254 [WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE, 255 }; 256 257 static int ath11k_start_vdev_delay(struct ieee80211_hw *hw, 258 struct ieee80211_vif *vif); 259 260 enum nl80211_he_ru_alloc ath11k_mac_phy_he_ru_to_nl80211_he_ru_alloc(u16 ru_phy) 261 { 262 enum nl80211_he_ru_alloc ret; 263 264 switch (ru_phy) { 265 case RU_26: 266 ret = NL80211_RATE_INFO_HE_RU_ALLOC_26; 267 break; 268 case RU_52: 269 ret = NL80211_RATE_INFO_HE_RU_ALLOC_52; 270 break; 271 case RU_106: 272 ret = NL80211_RATE_INFO_HE_RU_ALLOC_106; 273 break; 274 case RU_242: 275 ret = NL80211_RATE_INFO_HE_RU_ALLOC_242; 276 break; 277 case RU_484: 278 ret = NL80211_RATE_INFO_HE_RU_ALLOC_484; 279 break; 280 case RU_996: 281 ret = NL80211_RATE_INFO_HE_RU_ALLOC_996; 282 break; 283 default: 284 ret = NL80211_RATE_INFO_HE_RU_ALLOC_26; 285 break; 286 } 287 288 return ret; 289 } 290 291 enum nl80211_he_ru_alloc ath11k_mac_he_ru_tones_to_nl80211_he_ru_alloc(u16 ru_tones) 292 { 293 enum nl80211_he_ru_alloc ret; 294 295 switch (ru_tones) { 296 case 26: 297 ret = NL80211_RATE_INFO_HE_RU_ALLOC_26; 298 break; 299 case 52: 300 ret = NL80211_RATE_INFO_HE_RU_ALLOC_52; 301 break; 302 case 106: 303 ret = NL80211_RATE_INFO_HE_RU_ALLOC_106; 304 break; 305 case 242: 306 ret = NL80211_RATE_INFO_HE_RU_ALLOC_242; 307 break; 308 case 484: 309 ret = NL80211_RATE_INFO_HE_RU_ALLOC_484; 310 break; 311 case 996: 312 ret = NL80211_RATE_INFO_HE_RU_ALLOC_996; 313 break; 314 case (996 * 2): 315 ret = NL80211_RATE_INFO_HE_RU_ALLOC_2x996; 316 break; 317 default: 318 ret = NL80211_RATE_INFO_HE_RU_ALLOC_26; 319 break; 320 } 321 322 return ret; 323 } 324 325 enum nl80211_he_gi ath11k_mac_he_gi_to_nl80211_he_gi(u8 sgi) 326 { 327 enum nl80211_he_gi ret; 328 329 switch (sgi) { 330 case RX_MSDU_START_SGI_0_8_US: 331 ret = NL80211_RATE_INFO_HE_GI_0_8; 332 break; 333 case RX_MSDU_START_SGI_1_6_US: 334 ret = NL80211_RATE_INFO_HE_GI_1_6; 335 break; 336 case RX_MSDU_START_SGI_3_2_US: 337 ret = NL80211_RATE_INFO_HE_GI_3_2; 338 break; 339 default: 340 ret = NL80211_RATE_INFO_HE_GI_0_8; 341 break; 342 } 343 344 return ret; 345 } 346 347 u8 ath11k_mac_bw_to_mac80211_bw(u8 bw) 348 { 349 u8 ret = 0; 350 351 switch (bw) { 352 case ATH11K_BW_20: 353 ret = RATE_INFO_BW_20; 354 break; 355 case ATH11K_BW_40: 356 ret = RATE_INFO_BW_40; 357 break; 358 case ATH11K_BW_80: 359 ret = RATE_INFO_BW_80; 360 break; 361 case ATH11K_BW_160: 362 ret = RATE_INFO_BW_160; 363 break; 364 } 365 366 return ret; 367 } 368 369 enum ath11k_supported_bw ath11k_mac_mac80211_bw_to_ath11k_bw(enum rate_info_bw bw) 370 { 371 switch (bw) { 372 case RATE_INFO_BW_20: 373 return ATH11K_BW_20; 374 case RATE_INFO_BW_40: 375 return ATH11K_BW_40; 376 case RATE_INFO_BW_80: 377 return ATH11K_BW_80; 378 case RATE_INFO_BW_160: 379 return ATH11K_BW_160; 380 default: 381 return ATH11K_BW_20; 382 } 383 } 384 385 int ath11k_mac_hw_ratecode_to_legacy_rate(u8 hw_rc, u8 preamble, u8 *rateidx, 386 u16 *rate) 387 { 388 /* As default, it is OFDM rates */ 389 int i = ATH11K_MAC_FIRST_OFDM_RATE_IDX; 390 int max_rates_idx = ath11k_g_rates_size; 391 392 if (preamble == WMI_RATE_PREAMBLE_CCK) { 393 hw_rc &= ~ATH11k_HW_RATECODE_CCK_SHORT_PREAM_MASK; 394 i = 0; 395 max_rates_idx = ATH11K_MAC_FIRST_OFDM_RATE_IDX; 396 } 397 398 while (i < max_rates_idx) { 399 if (hw_rc == ath11k_legacy_rates[i].hw_value) { 400 *rateidx = i; 401 *rate = ath11k_legacy_rates[i].bitrate; 402 return 0; 403 } 404 i++; 405 } 406 407 return -EINVAL; 408 } 409 410 static int get_num_chains(u32 mask) 411 { 412 int num_chains = 0; 413 414 while (mask) { 415 if (mask & BIT(0)) 416 num_chains++; 417 mask >>= 1; 418 } 419 420 return num_chains; 421 } 422 423 u8 ath11k_mac_bitrate_to_idx(const struct ieee80211_supported_band *sband, 424 u32 bitrate) 425 { 426 int i; 427 428 for (i = 0; i < sband->n_bitrates; i++) 429 if (sband->bitrates[i].bitrate == bitrate) 430 return i; 431 432 return 0; 433 } 434 435 static u32 436 ath11k_mac_max_ht_nss(const u8 *ht_mcs_mask) 437 { 438 int nss; 439 440 for (nss = IEEE80211_HT_MCS_MASK_LEN - 1; nss >= 0; nss--) 441 if (ht_mcs_mask[nss]) 442 return nss + 1; 443 444 return 1; 445 } 446 447 static u32 448 ath11k_mac_max_vht_nss(const u16 *vht_mcs_mask) 449 { 450 int nss; 451 452 for (nss = NL80211_VHT_NSS_MAX - 1; nss >= 0; nss--) 453 if (vht_mcs_mask[nss]) 454 return nss + 1; 455 456 return 1; 457 } 458 459 static u32 460 ath11k_mac_max_he_nss(const u16 *he_mcs_mask) 461 { 462 int nss; 463 464 for (nss = NL80211_HE_NSS_MAX - 1; nss >= 0; nss--) 465 if (he_mcs_mask[nss]) 466 return nss + 1; 467 468 return 1; 469 } 470 471 static u8 ath11k_parse_mpdudensity(u8 mpdudensity) 472 { 473 /* 802.11n D2.0 defined values for "Minimum MPDU Start Spacing": 474 * 0 for no restriction 475 * 1 for 1/4 us 476 * 2 for 1/2 us 477 * 3 for 1 us 478 * 4 for 2 us 479 * 5 for 4 us 480 * 6 for 8 us 481 * 7 for 16 us 482 */ 483 switch (mpdudensity) { 484 case 0: 485 return 0; 486 case 1: 487 case 2: 488 case 3: 489 /* Our lower layer calculations limit our precision to 490 * 1 microsecond 491 */ 492 return 1; 493 case 4: 494 return 2; 495 case 5: 496 return 4; 497 case 6: 498 return 8; 499 case 7: 500 return 16; 501 default: 502 return 0; 503 } 504 } 505 506 static int ath11k_mac_vif_chan(struct ieee80211_vif *vif, 507 struct cfg80211_chan_def *def) 508 { 509 struct ieee80211_chanctx_conf *conf; 510 511 rcu_read_lock(); 512 conf = rcu_dereference(vif->bss_conf.chanctx_conf); 513 if (!conf) { 514 rcu_read_unlock(); 515 return -ENOENT; 516 } 517 518 *def = conf->def; 519 rcu_read_unlock(); 520 521 return 0; 522 } 523 524 static bool ath11k_mac_bitrate_is_cck(int bitrate) 525 { 526 switch (bitrate) { 527 case 10: 528 case 20: 529 case 55: 530 case 110: 531 return true; 532 } 533 534 return false; 535 } 536 537 u8 ath11k_mac_hw_rate_to_idx(const struct ieee80211_supported_band *sband, 538 u8 hw_rate, bool cck) 539 { 540 const struct ieee80211_rate *rate; 541 int i; 542 543 for (i = 0; i < sband->n_bitrates; i++) { 544 rate = &sband->bitrates[i]; 545 546 if (ath11k_mac_bitrate_is_cck(rate->bitrate) != cck) 547 continue; 548 549 if (rate->hw_value == hw_rate) 550 return i; 551 else if (rate->flags & IEEE80211_RATE_SHORT_PREAMBLE && 552 rate->hw_value_short == hw_rate) 553 return i; 554 } 555 556 return 0; 557 } 558 559 static u8 ath11k_mac_bitrate_to_rate(int bitrate) 560 { 561 return DIV_ROUND_UP(bitrate, 5) | 562 (ath11k_mac_bitrate_is_cck(bitrate) ? BIT(7) : 0); 563 } 564 565 static void ath11k_get_arvif_iter(void *data, u8 *mac, 566 struct ieee80211_vif *vif) 567 { 568 struct ath11k_vif_iter *arvif_iter = data; 569 struct ath11k_vif *arvif = (void *)vif->drv_priv; 570 571 if (arvif->vdev_id == arvif_iter->vdev_id) 572 arvif_iter->arvif = arvif; 573 } 574 575 struct ath11k_vif *ath11k_mac_get_arvif(struct ath11k *ar, u32 vdev_id) 576 { 577 struct ath11k_vif_iter arvif_iter; 578 u32 flags; 579 580 memset(&arvif_iter, 0, sizeof(struct ath11k_vif_iter)); 581 arvif_iter.vdev_id = vdev_id; 582 583 flags = IEEE80211_IFACE_ITER_RESUME_ALL; 584 ieee80211_iterate_active_interfaces_atomic(ar->hw, 585 flags, 586 ath11k_get_arvif_iter, 587 &arvif_iter); 588 if (!arvif_iter.arvif) { 589 ath11k_warn(ar->ab, "No VIF found for vdev %d\n", vdev_id); 590 return NULL; 591 } 592 593 return arvif_iter.arvif; 594 } 595 596 struct ath11k_vif *ath11k_mac_get_arvif_by_vdev_id(struct ath11k_base *ab, 597 u32 vdev_id) 598 { 599 int i; 600 struct ath11k_pdev *pdev; 601 struct ath11k_vif *arvif; 602 603 for (i = 0; i < ab->num_radios; i++) { 604 pdev = rcu_dereference(ab->pdevs_active[i]); 605 if (pdev && pdev->ar && 606 (pdev->ar->allocated_vdev_map & (1LL << vdev_id))) { 607 arvif = ath11k_mac_get_arvif(pdev->ar, vdev_id); 608 if (arvif) 609 return arvif; 610 } 611 } 612 613 return NULL; 614 } 615 616 struct ath11k *ath11k_mac_get_ar_by_vdev_id(struct ath11k_base *ab, u32 vdev_id) 617 { 618 int i; 619 struct ath11k_pdev *pdev; 620 621 for (i = 0; i < ab->num_radios; i++) { 622 pdev = rcu_dereference(ab->pdevs_active[i]); 623 if (pdev && pdev->ar) { 624 if (pdev->ar->allocated_vdev_map & (1LL << vdev_id)) 625 return pdev->ar; 626 } 627 } 628 629 return NULL; 630 } 631 632 struct ath11k *ath11k_mac_get_ar_by_pdev_id(struct ath11k_base *ab, u32 pdev_id) 633 { 634 int i; 635 struct ath11k_pdev *pdev; 636 637 if (ab->hw_params.single_pdev_only) { 638 pdev = rcu_dereference(ab->pdevs_active[0]); 639 return pdev ? pdev->ar : NULL; 640 } 641 642 if (WARN_ON(pdev_id > ab->num_radios)) 643 return NULL; 644 645 for (i = 0; i < ab->num_radios; i++) { 646 if (ab->fw_mode == ATH11K_FIRMWARE_MODE_FTM) 647 pdev = &ab->pdevs[i]; 648 else 649 pdev = rcu_dereference(ab->pdevs_active[i]); 650 651 if (pdev && pdev->pdev_id == pdev_id) 652 return (pdev->ar ? pdev->ar : NULL); 653 } 654 655 return NULL; 656 } 657 658 struct ath11k_vif *ath11k_mac_get_vif_up(struct ath11k_base *ab) 659 { 660 struct ath11k *ar; 661 struct ath11k_pdev *pdev; 662 struct ath11k_vif *arvif; 663 int i; 664 665 for (i = 0; i < ab->num_radios; i++) { 666 pdev = &ab->pdevs[i]; 667 ar = pdev->ar; 668 list_for_each_entry(arvif, &ar->arvifs, list) { 669 if (arvif->is_up) 670 return arvif; 671 } 672 } 673 674 return NULL; 675 } 676 677 static bool ath11k_mac_band_match(enum nl80211_band band1, enum WMI_HOST_WLAN_BAND band2) 678 { 679 return (((band1 == NL80211_BAND_2GHZ) && (band2 & WMI_HOST_WLAN_2G_CAP)) || 680 (((band1 == NL80211_BAND_5GHZ) || (band1 == NL80211_BAND_6GHZ)) && 681 (band2 & WMI_HOST_WLAN_5G_CAP))); 682 } 683 684 u8 ath11k_mac_get_target_pdev_id_from_vif(struct ath11k_vif *arvif) 685 { 686 struct ath11k *ar = arvif->ar; 687 struct ath11k_base *ab = ar->ab; 688 struct ieee80211_vif *vif = arvif->vif; 689 struct cfg80211_chan_def def; 690 enum nl80211_band band; 691 u8 pdev_id = ab->target_pdev_ids[0].pdev_id; 692 int i; 693 694 if (WARN_ON(ath11k_mac_vif_chan(vif, &def))) 695 return pdev_id; 696 697 band = def.chan->band; 698 699 for (i = 0; i < ab->target_pdev_count; i++) { 700 if (ath11k_mac_band_match(band, ab->target_pdev_ids[i].supported_bands)) 701 return ab->target_pdev_ids[i].pdev_id; 702 } 703 704 return pdev_id; 705 } 706 707 u8 ath11k_mac_get_target_pdev_id(struct ath11k *ar) 708 { 709 struct ath11k_vif *arvif; 710 711 arvif = ath11k_mac_get_vif_up(ar->ab); 712 713 if (arvif) 714 return ath11k_mac_get_target_pdev_id_from_vif(arvif); 715 else 716 return ar->ab->target_pdev_ids[0].pdev_id; 717 } 718 719 static void ath11k_pdev_caps_update(struct ath11k *ar) 720 { 721 struct ath11k_base *ab = ar->ab; 722 723 ar->max_tx_power = ab->target_caps.hw_max_tx_power; 724 725 /* FIXME Set min_tx_power to ab->target_caps.hw_min_tx_power. 726 * But since the received value in svcrdy is same as hw_max_tx_power, 727 * we can set ar->min_tx_power to 0 currently until 728 * this is fixed in firmware 729 */ 730 ar->min_tx_power = 0; 731 732 ar->txpower_limit_2g = ar->max_tx_power; 733 ar->txpower_limit_5g = ar->max_tx_power; 734 ar->txpower_scale = WMI_HOST_TP_SCALE_MAX; 735 } 736 737 static int ath11k_mac_txpower_recalc(struct ath11k *ar) 738 { 739 struct ath11k_pdev *pdev = ar->pdev; 740 struct ath11k_vif *arvif; 741 int ret, txpower = -1; 742 u32 param; 743 744 lockdep_assert_held(&ar->conf_mutex); 745 746 list_for_each_entry(arvif, &ar->arvifs, list) { 747 if (arvif->txpower <= 0) 748 continue; 749 750 if (txpower == -1) 751 txpower = arvif->txpower; 752 else 753 txpower = min(txpower, arvif->txpower); 754 } 755 756 if (txpower == -1) 757 return 0; 758 759 /* txpwr is set as 2 units per dBm in FW*/ 760 txpower = min_t(u32, max_t(u32, ar->min_tx_power, txpower), 761 ar->max_tx_power) * 2; 762 763 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "txpower to set in hw %d\n", 764 txpower / 2); 765 766 if ((pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) && 767 ar->txpower_limit_2g != txpower) { 768 param = WMI_PDEV_PARAM_TXPOWER_LIMIT2G; 769 ret = ath11k_wmi_pdev_set_param(ar, param, 770 txpower, ar->pdev->pdev_id); 771 if (ret) 772 goto fail; 773 ar->txpower_limit_2g = txpower; 774 } 775 776 if ((pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) && 777 ar->txpower_limit_5g != txpower) { 778 param = WMI_PDEV_PARAM_TXPOWER_LIMIT5G; 779 ret = ath11k_wmi_pdev_set_param(ar, param, 780 txpower, ar->pdev->pdev_id); 781 if (ret) 782 goto fail; 783 ar->txpower_limit_5g = txpower; 784 } 785 786 return 0; 787 788 fail: 789 ath11k_warn(ar->ab, "failed to recalc txpower limit %d using pdev param %d: %d\n", 790 txpower / 2, param, ret); 791 return ret; 792 } 793 794 static int ath11k_recalc_rtscts_prot(struct ath11k_vif *arvif) 795 { 796 struct ath11k *ar = arvif->ar; 797 u32 vdev_param, rts_cts = 0; 798 int ret; 799 800 lockdep_assert_held(&ar->conf_mutex); 801 802 vdev_param = WMI_VDEV_PARAM_ENABLE_RTSCTS; 803 804 /* Enable RTS/CTS protection for sw retries (when legacy stations 805 * are in BSS) or by default only for second rate series. 806 * TODO: Check if we need to enable CTS 2 Self in any case 807 */ 808 rts_cts = WMI_USE_RTS_CTS; 809 810 if (arvif->num_legacy_stations > 0) 811 rts_cts |= WMI_RTSCTS_ACROSS_SW_RETRIES << 4; 812 else 813 rts_cts |= WMI_RTSCTS_FOR_SECOND_RATESERIES << 4; 814 815 /* Need not send duplicate param value to firmware */ 816 if (arvif->rtscts_prot_mode == rts_cts) 817 return 0; 818 819 arvif->rtscts_prot_mode = rts_cts; 820 821 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %d recalc rts/cts prot %d\n", 822 arvif->vdev_id, rts_cts); 823 824 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 825 vdev_param, rts_cts); 826 if (ret) 827 ath11k_warn(ar->ab, "failed to recalculate rts/cts prot for vdev %d: %d\n", 828 arvif->vdev_id, ret); 829 830 return ret; 831 } 832 833 static int ath11k_mac_set_kickout(struct ath11k_vif *arvif) 834 { 835 struct ath11k *ar = arvif->ar; 836 u32 param; 837 int ret; 838 839 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_STA_KICKOUT_TH, 840 ATH11K_KICKOUT_THRESHOLD, 841 ar->pdev->pdev_id); 842 if (ret) { 843 ath11k_warn(ar->ab, "failed to set kickout threshold on vdev %i: %d\n", 844 arvif->vdev_id, ret); 845 return ret; 846 } 847 848 param = WMI_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS; 849 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, 850 ATH11K_KEEPALIVE_MIN_IDLE); 851 if (ret) { 852 ath11k_warn(ar->ab, "failed to set keepalive minimum idle time on vdev %i: %d\n", 853 arvif->vdev_id, ret); 854 return ret; 855 } 856 857 param = WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS; 858 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, 859 ATH11K_KEEPALIVE_MAX_IDLE); 860 if (ret) { 861 ath11k_warn(ar->ab, "failed to set keepalive maximum idle time on vdev %i: %d\n", 862 arvif->vdev_id, ret); 863 return ret; 864 } 865 866 param = WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS; 867 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, 868 ATH11K_KEEPALIVE_MAX_UNRESPONSIVE); 869 if (ret) { 870 ath11k_warn(ar->ab, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n", 871 arvif->vdev_id, ret); 872 return ret; 873 } 874 875 return 0; 876 } 877 878 void ath11k_mac_peer_cleanup_all(struct ath11k *ar) 879 { 880 struct ath11k_peer *peer, *tmp; 881 struct ath11k_base *ab = ar->ab; 882 883 lockdep_assert_held(&ar->conf_mutex); 884 885 mutex_lock(&ab->tbl_mtx_lock); 886 spin_lock_bh(&ab->base_lock); 887 list_for_each_entry_safe(peer, tmp, &ab->peers, list) { 888 ath11k_peer_rx_tid_cleanup(ar, peer); 889 ath11k_peer_rhash_delete(ab, peer); 890 list_del(&peer->list); 891 kfree(peer); 892 } 893 spin_unlock_bh(&ab->base_lock); 894 mutex_unlock(&ab->tbl_mtx_lock); 895 896 ar->num_peers = 0; 897 ar->num_stations = 0; 898 } 899 900 static inline int ath11k_mac_vdev_setup_sync(struct ath11k *ar) 901 { 902 lockdep_assert_held(&ar->conf_mutex); 903 904 if (test_bit(ATH11K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags)) 905 return -ESHUTDOWN; 906 907 if (!wait_for_completion_timeout(&ar->vdev_setup_done, 908 ATH11K_VDEV_SETUP_TIMEOUT_HZ)) 909 return -ETIMEDOUT; 910 911 return ar->last_wmi_vdev_start_status ? -EINVAL : 0; 912 } 913 914 static void 915 ath11k_mac_get_any_chandef_iter(struct ieee80211_hw *hw, 916 struct ieee80211_chanctx_conf *conf, 917 void *data) 918 { 919 struct cfg80211_chan_def **def = data; 920 921 *def = &conf->def; 922 } 923 924 static int ath11k_mac_monitor_vdev_start(struct ath11k *ar, int vdev_id, 925 struct cfg80211_chan_def *chandef) 926 { 927 struct ieee80211_channel *channel; 928 struct wmi_vdev_start_req_arg arg = {}; 929 int ret; 930 931 lockdep_assert_held(&ar->conf_mutex); 932 933 channel = chandef->chan; 934 935 arg.vdev_id = vdev_id; 936 arg.channel.freq = channel->center_freq; 937 arg.channel.band_center_freq1 = chandef->center_freq1; 938 arg.channel.band_center_freq2 = chandef->center_freq2; 939 940 arg.channel.mode = ath11k_phymodes[chandef->chan->band][chandef->width]; 941 arg.channel.chan_radar = !!(channel->flags & IEEE80211_CHAN_RADAR); 942 943 arg.channel.min_power = 0; 944 arg.channel.max_power = channel->max_power; 945 arg.channel.max_reg_power = channel->max_reg_power; 946 arg.channel.max_antenna_gain = channel->max_antenna_gain; 947 948 arg.pref_tx_streams = ar->num_tx_chains; 949 arg.pref_rx_streams = ar->num_rx_chains; 950 951 arg.channel.passive = !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR); 952 953 reinit_completion(&ar->vdev_setup_done); 954 reinit_completion(&ar->vdev_delete_done); 955 956 ret = ath11k_wmi_vdev_start(ar, &arg, false); 957 if (ret) { 958 ath11k_warn(ar->ab, "failed to request monitor vdev %i start: %d\n", 959 vdev_id, ret); 960 return ret; 961 } 962 963 ret = ath11k_mac_vdev_setup_sync(ar); 964 if (ret) { 965 ath11k_warn(ar->ab, "failed to synchronize setup for monitor vdev %i start: %d\n", 966 vdev_id, ret); 967 return ret; 968 } 969 970 ret = ath11k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr, NULL, 0, 0); 971 if (ret) { 972 ath11k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n", 973 vdev_id, ret); 974 goto vdev_stop; 975 } 976 977 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "monitor vdev %i started\n", 978 vdev_id); 979 980 return 0; 981 982 vdev_stop: 983 reinit_completion(&ar->vdev_setup_done); 984 985 ret = ath11k_wmi_vdev_stop(ar, vdev_id); 986 if (ret) { 987 ath11k_warn(ar->ab, "failed to stop monitor vdev %i after start failure: %d\n", 988 vdev_id, ret); 989 return ret; 990 } 991 992 ret = ath11k_mac_vdev_setup_sync(ar); 993 if (ret) { 994 ath11k_warn(ar->ab, "failed to synchronize setup for vdev %i stop: %d\n", 995 vdev_id, ret); 996 return ret; 997 } 998 999 return -EIO; 1000 } 1001 1002 static int ath11k_mac_monitor_vdev_stop(struct ath11k *ar) 1003 { 1004 int ret; 1005 1006 lockdep_assert_held(&ar->conf_mutex); 1007 1008 reinit_completion(&ar->vdev_setup_done); 1009 1010 ret = ath11k_wmi_vdev_stop(ar, ar->monitor_vdev_id); 1011 if (ret) { 1012 ath11k_warn(ar->ab, "failed to request monitor vdev %i stop: %d\n", 1013 ar->monitor_vdev_id, ret); 1014 return ret; 1015 } 1016 1017 ret = ath11k_mac_vdev_setup_sync(ar); 1018 if (ret) { 1019 ath11k_warn(ar->ab, "failed to synchronize monitor vdev %i stop: %d\n", 1020 ar->monitor_vdev_id, ret); 1021 return ret; 1022 } 1023 1024 ret = ath11k_wmi_vdev_down(ar, ar->monitor_vdev_id); 1025 if (ret) { 1026 ath11k_warn(ar->ab, "failed to put down monitor vdev %i: %d\n", 1027 ar->monitor_vdev_id, ret); 1028 return ret; 1029 } 1030 1031 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "monitor vdev %i stopped\n", 1032 ar->monitor_vdev_id); 1033 1034 return 0; 1035 } 1036 1037 static int ath11k_mac_monitor_vdev_create(struct ath11k *ar) 1038 { 1039 struct ath11k_pdev *pdev = ar->pdev; 1040 struct vdev_create_params param = {}; 1041 int bit, ret; 1042 u8 tmp_addr[6] = {0}; 1043 u16 nss; 1044 1045 lockdep_assert_held(&ar->conf_mutex); 1046 1047 if (test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags)) 1048 return 0; 1049 1050 if (ar->ab->free_vdev_map == 0) { 1051 ath11k_warn(ar->ab, "failed to find free vdev id for monitor vdev\n"); 1052 return -ENOMEM; 1053 } 1054 1055 bit = __ffs64(ar->ab->free_vdev_map); 1056 1057 ar->monitor_vdev_id = bit; 1058 1059 param.if_id = ar->monitor_vdev_id; 1060 param.type = WMI_VDEV_TYPE_MONITOR; 1061 param.subtype = WMI_VDEV_SUBTYPE_NONE; 1062 param.pdev_id = pdev->pdev_id; 1063 1064 if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) { 1065 param.chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains; 1066 param.chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains; 1067 } 1068 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) { 1069 param.chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains; 1070 param.chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains; 1071 } 1072 1073 ret = ath11k_wmi_vdev_create(ar, tmp_addr, ¶m); 1074 if (ret) { 1075 ath11k_warn(ar->ab, "failed to request monitor vdev %i creation: %d\n", 1076 ar->monitor_vdev_id, ret); 1077 ar->monitor_vdev_id = -1; 1078 return ret; 1079 } 1080 1081 nss = get_num_chains(ar->cfg_tx_chainmask) ? : 1; 1082 ret = ath11k_wmi_vdev_set_param_cmd(ar, ar->monitor_vdev_id, 1083 WMI_VDEV_PARAM_NSS, nss); 1084 if (ret) { 1085 ath11k_warn(ar->ab, "failed to set vdev %d chainmask 0x%x, nss %d :%d\n", 1086 ar->monitor_vdev_id, ar->cfg_tx_chainmask, nss, ret); 1087 goto err_vdev_del; 1088 } 1089 1090 ret = ath11k_mac_txpower_recalc(ar); 1091 if (ret) { 1092 ath11k_warn(ar->ab, "failed to recalc txpower for monitor vdev %d: %d\n", 1093 ar->monitor_vdev_id, ret); 1094 goto err_vdev_del; 1095 } 1096 1097 ar->allocated_vdev_map |= 1LL << ar->monitor_vdev_id; 1098 ar->ab->free_vdev_map &= ~(1LL << ar->monitor_vdev_id); 1099 ar->num_created_vdevs++; 1100 set_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags); 1101 1102 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "monitor vdev %d created\n", 1103 ar->monitor_vdev_id); 1104 1105 return 0; 1106 1107 err_vdev_del: 1108 ath11k_wmi_vdev_delete(ar, ar->monitor_vdev_id); 1109 ar->monitor_vdev_id = -1; 1110 return ret; 1111 } 1112 1113 static int ath11k_mac_monitor_vdev_delete(struct ath11k *ar) 1114 { 1115 int ret; 1116 unsigned long time_left; 1117 1118 lockdep_assert_held(&ar->conf_mutex); 1119 1120 if (!test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags)) 1121 return 0; 1122 1123 reinit_completion(&ar->vdev_delete_done); 1124 1125 ret = ath11k_wmi_vdev_delete(ar, ar->monitor_vdev_id); 1126 if (ret) { 1127 ath11k_warn(ar->ab, "failed to request wmi monitor vdev %i removal: %d\n", 1128 ar->monitor_vdev_id, ret); 1129 return ret; 1130 } 1131 1132 time_left = wait_for_completion_timeout(&ar->vdev_delete_done, 1133 ATH11K_VDEV_DELETE_TIMEOUT_HZ); 1134 if (time_left == 0) { 1135 ath11k_warn(ar->ab, "Timeout in receiving vdev delete response\n"); 1136 } else { 1137 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "monitor vdev %d deleted\n", 1138 ar->monitor_vdev_id); 1139 1140 ar->allocated_vdev_map &= ~(1LL << ar->monitor_vdev_id); 1141 ar->ab->free_vdev_map |= 1LL << (ar->monitor_vdev_id); 1142 ar->num_created_vdevs--; 1143 ar->monitor_vdev_id = -1; 1144 clear_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags); 1145 } 1146 1147 return ret; 1148 } 1149 1150 static int ath11k_mac_monitor_start(struct ath11k *ar) 1151 { 1152 struct cfg80211_chan_def *chandef = NULL; 1153 int ret; 1154 1155 lockdep_assert_held(&ar->conf_mutex); 1156 1157 if (test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags)) 1158 return 0; 1159 1160 ieee80211_iter_chan_contexts_atomic(ar->hw, 1161 ath11k_mac_get_any_chandef_iter, 1162 &chandef); 1163 if (!chandef) 1164 return 0; 1165 1166 ret = ath11k_mac_monitor_vdev_start(ar, ar->monitor_vdev_id, chandef); 1167 if (ret) { 1168 ath11k_warn(ar->ab, "failed to start monitor vdev: %d\n", ret); 1169 ath11k_mac_monitor_vdev_delete(ar); 1170 return ret; 1171 } 1172 1173 set_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags); 1174 1175 ar->num_started_vdevs++; 1176 ret = ath11k_dp_tx_htt_monitor_mode_ring_config(ar, false); 1177 if (ret) { 1178 ath11k_warn(ar->ab, "failed to configure htt monitor mode ring during start: %d", 1179 ret); 1180 return ret; 1181 } 1182 1183 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "monitor started\n"); 1184 1185 return 0; 1186 } 1187 1188 static int ath11k_mac_monitor_stop(struct ath11k *ar) 1189 { 1190 int ret; 1191 1192 lockdep_assert_held(&ar->conf_mutex); 1193 1194 if (!test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags)) 1195 return 0; 1196 1197 ret = ath11k_mac_monitor_vdev_stop(ar); 1198 if (ret) { 1199 ath11k_warn(ar->ab, "failed to stop monitor vdev: %d\n", ret); 1200 return ret; 1201 } 1202 1203 clear_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags); 1204 ar->num_started_vdevs--; 1205 1206 ret = ath11k_dp_tx_htt_monitor_mode_ring_config(ar, true); 1207 if (ret) { 1208 ath11k_warn(ar->ab, "failed to configure htt monitor mode ring during stop: %d", 1209 ret); 1210 return ret; 1211 } 1212 1213 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "monitor stopped ret %d\n", ret); 1214 1215 return 0; 1216 } 1217 1218 static int ath11k_mac_vif_setup_ps(struct ath11k_vif *arvif) 1219 { 1220 struct ath11k *ar = arvif->ar; 1221 struct ieee80211_vif *vif = arvif->vif; 1222 struct ieee80211_conf *conf = &ar->hw->conf; 1223 enum wmi_sta_powersave_param param; 1224 enum wmi_sta_ps_mode psmode; 1225 int ret; 1226 int timeout; 1227 bool enable_ps; 1228 1229 lockdep_assert_held(&arvif->ar->conf_mutex); 1230 1231 if (arvif->vif->type != NL80211_IFTYPE_STATION) 1232 return 0; 1233 1234 enable_ps = arvif->ps; 1235 1236 if (!arvif->is_started) { 1237 /* mac80211 can update vif powersave state while disconnected. 1238 * Firmware doesn't behave nicely and consumes more power than 1239 * necessary if PS is disabled on a non-started vdev. Hence 1240 * force-enable PS for non-running vdevs. 1241 */ 1242 psmode = WMI_STA_PS_MODE_ENABLED; 1243 } else if (enable_ps) { 1244 psmode = WMI_STA_PS_MODE_ENABLED; 1245 param = WMI_STA_PS_PARAM_INACTIVITY_TIME; 1246 1247 timeout = conf->dynamic_ps_timeout; 1248 if (timeout == 0) { 1249 /* firmware doesn't like 0 */ 1250 timeout = ieee80211_tu_to_usec(vif->bss_conf.beacon_int) / 1000; 1251 } 1252 1253 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param, 1254 timeout); 1255 if (ret) { 1256 ath11k_warn(ar->ab, "failed to set inactivity time for vdev %d: %i\n", 1257 arvif->vdev_id, ret); 1258 return ret; 1259 } 1260 } else { 1261 psmode = WMI_STA_PS_MODE_DISABLED; 1262 } 1263 1264 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %d psmode %s\n", 1265 arvif->vdev_id, psmode ? "enable" : "disable"); 1266 1267 ret = ath11k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, psmode); 1268 if (ret) { 1269 ath11k_warn(ar->ab, "failed to set sta power save mode %d for vdev %d: %d\n", 1270 psmode, arvif->vdev_id, ret); 1271 return ret; 1272 } 1273 1274 return 0; 1275 } 1276 1277 static int ath11k_mac_config_ps(struct ath11k *ar) 1278 { 1279 struct ath11k_vif *arvif; 1280 int ret = 0; 1281 1282 lockdep_assert_held(&ar->conf_mutex); 1283 1284 list_for_each_entry(arvif, &ar->arvifs, list) { 1285 ret = ath11k_mac_vif_setup_ps(arvif); 1286 if (ret) { 1287 ath11k_warn(ar->ab, "failed to setup powersave: %d\n", ret); 1288 break; 1289 } 1290 } 1291 1292 return ret; 1293 } 1294 1295 static int ath11k_mac_op_config(struct ieee80211_hw *hw, u32 changed) 1296 { 1297 struct ath11k *ar = hw->priv; 1298 struct ieee80211_conf *conf = &hw->conf; 1299 int ret = 0; 1300 1301 mutex_lock(&ar->conf_mutex); 1302 1303 if (changed & IEEE80211_CONF_CHANGE_MONITOR) { 1304 if (conf->flags & IEEE80211_CONF_MONITOR) { 1305 set_bit(ATH11K_FLAG_MONITOR_CONF_ENABLED, &ar->monitor_flags); 1306 1307 if (test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, 1308 &ar->monitor_flags)) 1309 goto out; 1310 1311 ret = ath11k_mac_monitor_vdev_create(ar); 1312 if (ret) { 1313 ath11k_warn(ar->ab, "failed to create monitor vdev: %d", 1314 ret); 1315 goto out; 1316 } 1317 1318 ret = ath11k_mac_monitor_start(ar); 1319 if (ret) { 1320 ath11k_warn(ar->ab, "failed to start monitor: %d", 1321 ret); 1322 goto err_mon_del; 1323 } 1324 } else { 1325 clear_bit(ATH11K_FLAG_MONITOR_CONF_ENABLED, &ar->monitor_flags); 1326 1327 if (!test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, 1328 &ar->monitor_flags)) 1329 goto out; 1330 1331 ret = ath11k_mac_monitor_stop(ar); 1332 if (ret) { 1333 ath11k_warn(ar->ab, "failed to stop monitor: %d", 1334 ret); 1335 goto out; 1336 } 1337 1338 ret = ath11k_mac_monitor_vdev_delete(ar); 1339 if (ret) { 1340 ath11k_warn(ar->ab, "failed to delete monitor vdev: %d", 1341 ret); 1342 goto out; 1343 } 1344 } 1345 } 1346 1347 out: 1348 mutex_unlock(&ar->conf_mutex); 1349 return ret; 1350 1351 err_mon_del: 1352 ath11k_mac_monitor_vdev_delete(ar); 1353 mutex_unlock(&ar->conf_mutex); 1354 return ret; 1355 } 1356 1357 static void ath11k_mac_setup_nontx_vif_rsnie(struct ath11k_vif *arvif, 1358 bool tx_arvif_rsnie_present, 1359 const u8 *profile, u8 profile_len) 1360 { 1361 if (cfg80211_find_ie(WLAN_EID_RSN, profile, profile_len)) { 1362 arvif->rsnie_present = true; 1363 } else if (tx_arvif_rsnie_present) { 1364 int i; 1365 u8 nie_len; 1366 const u8 *nie = cfg80211_find_ext_ie(WLAN_EID_EXT_NON_INHERITANCE, 1367 profile, profile_len); 1368 if (!nie) 1369 return; 1370 1371 nie_len = nie[1]; 1372 nie += 2; 1373 for (i = 0; i < nie_len; i++) { 1374 if (nie[i] == WLAN_EID_RSN) { 1375 arvif->rsnie_present = false; 1376 break; 1377 } 1378 } 1379 } 1380 } 1381 1382 static bool ath11k_mac_set_nontx_vif_params(struct ath11k_vif *tx_arvif, 1383 struct ath11k_vif *arvif, 1384 struct sk_buff *bcn) 1385 { 1386 struct ieee80211_mgmt *mgmt; 1387 const u8 *ies, *profile, *next_profile; 1388 int ies_len; 1389 1390 ies = bcn->data + ieee80211_get_hdrlen_from_skb(bcn); 1391 mgmt = (struct ieee80211_mgmt *)bcn->data; 1392 ies += sizeof(mgmt->u.beacon); 1393 ies_len = skb_tail_pointer(bcn) - ies; 1394 1395 ies = cfg80211_find_ie(WLAN_EID_MULTIPLE_BSSID, ies, ies_len); 1396 arvif->rsnie_present = tx_arvif->rsnie_present; 1397 1398 while (ies) { 1399 u8 mbssid_len; 1400 1401 ies_len -= (2 + ies[1]); 1402 mbssid_len = ies[1] - 1; 1403 profile = &ies[3]; 1404 1405 while (mbssid_len) { 1406 u8 profile_len; 1407 1408 profile_len = profile[1]; 1409 next_profile = profile + (2 + profile_len); 1410 mbssid_len -= (2 + profile_len); 1411 1412 profile += 2; 1413 profile_len -= (2 + profile[1]); 1414 profile += (2 + profile[1]); /* nontx capabilities */ 1415 profile_len -= (2 + profile[1]); 1416 profile += (2 + profile[1]); /* SSID */ 1417 if (profile[2] == arvif->vif->bss_conf.bssid_index) { 1418 profile_len -= 5; 1419 profile = profile + 5; 1420 ath11k_mac_setup_nontx_vif_rsnie(arvif, 1421 tx_arvif->rsnie_present, 1422 profile, 1423 profile_len); 1424 return true; 1425 } 1426 profile = next_profile; 1427 } 1428 ies = cfg80211_find_ie(WLAN_EID_MULTIPLE_BSSID, profile, 1429 ies_len); 1430 } 1431 1432 return false; 1433 } 1434 1435 static void ath11k_mac_set_vif_params(struct ath11k_vif *arvif, 1436 struct sk_buff *bcn) 1437 { 1438 struct ieee80211_mgmt *mgmt; 1439 u8 *ies; 1440 1441 ies = bcn->data + ieee80211_get_hdrlen_from_skb(bcn); 1442 mgmt = (struct ieee80211_mgmt *)bcn->data; 1443 ies += sizeof(mgmt->u.beacon); 1444 1445 if (cfg80211_find_ie(WLAN_EID_RSN, ies, (skb_tail_pointer(bcn) - ies))) 1446 arvif->rsnie_present = true; 1447 else 1448 arvif->rsnie_present = false; 1449 1450 if (cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT, 1451 WLAN_OUI_TYPE_MICROSOFT_WPA, 1452 ies, (skb_tail_pointer(bcn) - ies))) 1453 arvif->wpaie_present = true; 1454 else 1455 arvif->wpaie_present = false; 1456 } 1457 1458 static int ath11k_mac_setup_bcn_tmpl_ema(struct ath11k_vif *arvif) 1459 { 1460 struct ath11k_vif *tx_arvif; 1461 struct ieee80211_ema_beacons *beacons; 1462 int ret = 0; 1463 bool nontx_vif_params_set = false; 1464 u32 params = 0; 1465 u8 i = 0; 1466 1467 tx_arvif = (void *)arvif->vif->mbssid_tx_vif->drv_priv; 1468 1469 beacons = ieee80211_beacon_get_template_ema_list(tx_arvif->ar->hw, 1470 tx_arvif->vif, 0); 1471 if (!beacons || !beacons->cnt) { 1472 ath11k_warn(arvif->ar->ab, 1473 "failed to get ema beacon templates from mac80211\n"); 1474 return -EPERM; 1475 } 1476 1477 if (tx_arvif == arvif) 1478 ath11k_mac_set_vif_params(tx_arvif, beacons->bcn[0].skb); 1479 else 1480 arvif->wpaie_present = tx_arvif->wpaie_present; 1481 1482 for (i = 0; i < beacons->cnt; i++) { 1483 if (tx_arvif != arvif && !nontx_vif_params_set) 1484 nontx_vif_params_set = 1485 ath11k_mac_set_nontx_vif_params(tx_arvif, arvif, 1486 beacons->bcn[i].skb); 1487 1488 params = beacons->cnt; 1489 params |= (i << WMI_EMA_TMPL_IDX_SHIFT); 1490 params |= ((!i ? 1 : 0) << WMI_EMA_FIRST_TMPL_SHIFT); 1491 params |= ((i + 1 == beacons->cnt ? 1 : 0) << WMI_EMA_LAST_TMPL_SHIFT); 1492 1493 ret = ath11k_wmi_bcn_tmpl(tx_arvif->ar, tx_arvif->vdev_id, 1494 &beacons->bcn[i].offs, 1495 beacons->bcn[i].skb, params); 1496 if (ret) { 1497 ath11k_warn(tx_arvif->ar->ab, 1498 "failed to set ema beacon template id %i error %d\n", 1499 i, ret); 1500 break; 1501 } 1502 } 1503 1504 ieee80211_beacon_free_ema_list(beacons); 1505 1506 if (tx_arvif != arvif && !nontx_vif_params_set) 1507 return -EINVAL; /* Profile not found in the beacons */ 1508 1509 return ret; 1510 } 1511 1512 static int ath11k_mac_setup_bcn_tmpl_mbssid(struct ath11k_vif *arvif) 1513 { 1514 struct ath11k *ar = arvif->ar; 1515 struct ath11k_base *ab = ar->ab; 1516 struct ath11k_vif *tx_arvif = arvif; 1517 struct ieee80211_hw *hw = ar->hw; 1518 struct ieee80211_vif *vif = arvif->vif; 1519 struct ieee80211_mutable_offsets offs = {}; 1520 struct sk_buff *bcn; 1521 int ret; 1522 1523 if (arvif->vif->mbssid_tx_vif) { 1524 tx_arvif = (void *)arvif->vif->mbssid_tx_vif->drv_priv; 1525 if (tx_arvif != arvif) { 1526 ar = tx_arvif->ar; 1527 ab = ar->ab; 1528 hw = ar->hw; 1529 vif = tx_arvif->vif; 1530 } 1531 } 1532 1533 bcn = ieee80211_beacon_get_template(hw, vif, &offs, 0); 1534 if (!bcn) { 1535 ath11k_warn(ab, "failed to get beacon template from mac80211\n"); 1536 return -EPERM; 1537 } 1538 1539 if (tx_arvif == arvif) 1540 ath11k_mac_set_vif_params(tx_arvif, bcn); 1541 else if (!ath11k_mac_set_nontx_vif_params(tx_arvif, arvif, bcn)) 1542 return -EINVAL; 1543 1544 ret = ath11k_wmi_bcn_tmpl(ar, arvif->vdev_id, &offs, bcn, 0); 1545 kfree_skb(bcn); 1546 1547 if (ret) 1548 ath11k_warn(ab, "failed to submit beacon template command: %d\n", 1549 ret); 1550 1551 return ret; 1552 } 1553 1554 static int ath11k_mac_setup_bcn_tmpl(struct ath11k_vif *arvif) 1555 { 1556 struct ieee80211_vif *vif = arvif->vif; 1557 1558 if (arvif->vdev_type != WMI_VDEV_TYPE_AP) 1559 return 0; 1560 1561 /* Target does not expect beacon templates for the already up 1562 * non-transmitting interfaces, and results in a crash if sent. 1563 */ 1564 if (vif->mbssid_tx_vif && 1565 arvif != (void *)vif->mbssid_tx_vif->drv_priv && arvif->is_up) 1566 return 0; 1567 1568 if (vif->bss_conf.ema_ap && vif->mbssid_tx_vif) 1569 return ath11k_mac_setup_bcn_tmpl_ema(arvif); 1570 1571 return ath11k_mac_setup_bcn_tmpl_mbssid(arvif); 1572 } 1573 1574 void ath11k_mac_bcn_tx_event(struct ath11k_vif *arvif) 1575 { 1576 struct ieee80211_vif *vif = arvif->vif; 1577 1578 if (!vif->bss_conf.color_change_active && !arvif->bcca_zero_sent) 1579 return; 1580 1581 if (vif->bss_conf.color_change_active && 1582 ieee80211_beacon_cntdwn_is_complete(vif)) { 1583 arvif->bcca_zero_sent = true; 1584 ieee80211_color_change_finish(vif); 1585 return; 1586 } 1587 1588 arvif->bcca_zero_sent = false; 1589 1590 if (vif->bss_conf.color_change_active) 1591 ieee80211_beacon_update_cntdwn(vif); 1592 ath11k_mac_setup_bcn_tmpl(arvif); 1593 } 1594 1595 static void ath11k_control_beaconing(struct ath11k_vif *arvif, 1596 struct ieee80211_bss_conf *info) 1597 { 1598 struct ath11k *ar = arvif->ar; 1599 struct ath11k_vif *tx_arvif = NULL; 1600 int ret = 0; 1601 1602 lockdep_assert_held(&arvif->ar->conf_mutex); 1603 1604 if (!info->enable_beacon) { 1605 ret = ath11k_wmi_vdev_down(ar, arvif->vdev_id); 1606 if (ret) 1607 ath11k_warn(ar->ab, "failed to down vdev_id %i: %d\n", 1608 arvif->vdev_id, ret); 1609 1610 arvif->is_up = false; 1611 return; 1612 } 1613 1614 /* Install the beacon template to the FW */ 1615 ret = ath11k_mac_setup_bcn_tmpl(arvif); 1616 if (ret) { 1617 ath11k_warn(ar->ab, "failed to update bcn tmpl during vdev up: %d\n", 1618 ret); 1619 return; 1620 } 1621 1622 arvif->tx_seq_no = 0x1000; 1623 1624 arvif->aid = 0; 1625 1626 ether_addr_copy(arvif->bssid, info->bssid); 1627 1628 if (arvif->vif->mbssid_tx_vif) 1629 tx_arvif = (struct ath11k_vif *)arvif->vif->mbssid_tx_vif->drv_priv; 1630 1631 ret = ath11k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid, 1632 arvif->bssid, 1633 tx_arvif ? tx_arvif->bssid : NULL, 1634 info->bssid_index, 1635 1 << info->bssid_indicator); 1636 if (ret) { 1637 ath11k_warn(ar->ab, "failed to bring up vdev %d: %i\n", 1638 arvif->vdev_id, ret); 1639 return; 1640 } 1641 1642 arvif->is_up = true; 1643 1644 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %d up\n", arvif->vdev_id); 1645 } 1646 1647 static void ath11k_mac_handle_beacon_iter(void *data, u8 *mac, 1648 struct ieee80211_vif *vif) 1649 { 1650 struct sk_buff *skb = data; 1651 struct ieee80211_mgmt *mgmt = (void *)skb->data; 1652 struct ath11k_vif *arvif = (void *)vif->drv_priv; 1653 1654 if (vif->type != NL80211_IFTYPE_STATION) 1655 return; 1656 1657 if (!ether_addr_equal(mgmt->bssid, vif->bss_conf.bssid)) 1658 return; 1659 1660 cancel_delayed_work(&arvif->connection_loss_work); 1661 } 1662 1663 void ath11k_mac_handle_beacon(struct ath11k *ar, struct sk_buff *skb) 1664 { 1665 ieee80211_iterate_active_interfaces_atomic(ar->hw, 1666 IEEE80211_IFACE_ITER_NORMAL, 1667 ath11k_mac_handle_beacon_iter, 1668 skb); 1669 } 1670 1671 static void ath11k_mac_handle_beacon_miss_iter(void *data, u8 *mac, 1672 struct ieee80211_vif *vif) 1673 { 1674 u32 *vdev_id = data; 1675 struct ath11k_vif *arvif = (void *)vif->drv_priv; 1676 struct ath11k *ar = arvif->ar; 1677 struct ieee80211_hw *hw = ar->hw; 1678 1679 if (arvif->vdev_id != *vdev_id) 1680 return; 1681 1682 if (!arvif->is_up) 1683 return; 1684 1685 ieee80211_beacon_loss(vif); 1686 1687 /* Firmware doesn't report beacon loss events repeatedly. If AP probe 1688 * (done by mac80211) succeeds but beacons do not resume then it 1689 * doesn't make sense to continue operation. Queue connection loss work 1690 * which can be cancelled when beacon is received. 1691 */ 1692 ieee80211_queue_delayed_work(hw, &arvif->connection_loss_work, 1693 ATH11K_CONNECTION_LOSS_HZ); 1694 } 1695 1696 void ath11k_mac_handle_beacon_miss(struct ath11k *ar, u32 vdev_id) 1697 { 1698 ieee80211_iterate_active_interfaces_atomic(ar->hw, 1699 IEEE80211_IFACE_ITER_NORMAL, 1700 ath11k_mac_handle_beacon_miss_iter, 1701 &vdev_id); 1702 } 1703 1704 static void ath11k_mac_vif_sta_connection_loss_work(struct work_struct *work) 1705 { 1706 struct ath11k_vif *arvif = container_of(work, struct ath11k_vif, 1707 connection_loss_work.work); 1708 struct ieee80211_vif *vif = arvif->vif; 1709 1710 if (!arvif->is_up) 1711 return; 1712 1713 ieee80211_connection_loss(vif); 1714 } 1715 1716 static void ath11k_peer_assoc_h_basic(struct ath11k *ar, 1717 struct ieee80211_vif *vif, 1718 struct ieee80211_sta *sta, 1719 struct peer_assoc_params *arg) 1720 { 1721 struct ath11k_vif *arvif = (void *)vif->drv_priv; 1722 u32 aid; 1723 1724 lockdep_assert_held(&ar->conf_mutex); 1725 1726 if (vif->type == NL80211_IFTYPE_STATION) 1727 aid = vif->cfg.aid; 1728 else 1729 aid = sta->aid; 1730 1731 ether_addr_copy(arg->peer_mac, sta->addr); 1732 arg->vdev_id = arvif->vdev_id; 1733 arg->peer_associd = aid; 1734 arg->auth_flag = true; 1735 /* TODO: STA WAR in ath10k for listen interval required? */ 1736 arg->peer_listen_intval = ar->hw->conf.listen_interval; 1737 arg->peer_nss = 1; 1738 arg->peer_caps = vif->bss_conf.assoc_capability; 1739 } 1740 1741 static void ath11k_peer_assoc_h_crypto(struct ath11k *ar, 1742 struct ieee80211_vif *vif, 1743 struct ieee80211_sta *sta, 1744 struct peer_assoc_params *arg) 1745 { 1746 struct ieee80211_bss_conf *info = &vif->bss_conf; 1747 struct cfg80211_chan_def def; 1748 struct cfg80211_bss *bss; 1749 struct ath11k_vif *arvif = (struct ath11k_vif *)vif->drv_priv; 1750 const u8 *rsnie = NULL; 1751 const u8 *wpaie = NULL; 1752 1753 lockdep_assert_held(&ar->conf_mutex); 1754 1755 if (WARN_ON(ath11k_mac_vif_chan(vif, &def))) 1756 return; 1757 1758 bss = cfg80211_get_bss(ar->hw->wiphy, def.chan, info->bssid, NULL, 0, 1759 IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY); 1760 1761 if (arvif->rsnie_present || arvif->wpaie_present) { 1762 arg->need_ptk_4_way = true; 1763 if (arvif->wpaie_present) 1764 arg->need_gtk_2_way = true; 1765 } else if (bss) { 1766 const struct cfg80211_bss_ies *ies; 1767 1768 rcu_read_lock(); 1769 rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN); 1770 1771 ies = rcu_dereference(bss->ies); 1772 1773 wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT, 1774 WLAN_OUI_TYPE_MICROSOFT_WPA, 1775 ies->data, 1776 ies->len); 1777 rcu_read_unlock(); 1778 cfg80211_put_bss(ar->hw->wiphy, bss); 1779 } 1780 1781 /* FIXME: base on RSN IE/WPA IE is a correct idea? */ 1782 if (rsnie || wpaie) { 1783 ath11k_dbg(ar->ab, ATH11K_DBG_WMI, 1784 "%s: rsn ie found\n", __func__); 1785 arg->need_ptk_4_way = true; 1786 } 1787 1788 if (wpaie) { 1789 ath11k_dbg(ar->ab, ATH11K_DBG_WMI, 1790 "%s: wpa ie found\n", __func__); 1791 arg->need_gtk_2_way = true; 1792 } 1793 1794 if (sta->mfp) { 1795 /* TODO: Need to check if FW supports PMF? */ 1796 arg->is_pmf_enabled = true; 1797 } 1798 1799 /* TODO: safe_mode_enabled (bypass 4-way handshake) flag req? */ 1800 } 1801 1802 static void ath11k_peer_assoc_h_rates(struct ath11k *ar, 1803 struct ieee80211_vif *vif, 1804 struct ieee80211_sta *sta, 1805 struct peer_assoc_params *arg) 1806 { 1807 struct ath11k_vif *arvif = (void *)vif->drv_priv; 1808 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates; 1809 struct cfg80211_chan_def def; 1810 const struct ieee80211_supported_band *sband; 1811 const struct ieee80211_rate *rates; 1812 enum nl80211_band band; 1813 u32 ratemask; 1814 u8 rate; 1815 int i; 1816 1817 lockdep_assert_held(&ar->conf_mutex); 1818 1819 if (WARN_ON(ath11k_mac_vif_chan(vif, &def))) 1820 return; 1821 1822 band = def.chan->band; 1823 sband = ar->hw->wiphy->bands[band]; 1824 ratemask = sta->deflink.supp_rates[band]; 1825 ratemask &= arvif->bitrate_mask.control[band].legacy; 1826 rates = sband->bitrates; 1827 1828 rateset->num_rates = 0; 1829 1830 for (i = 0; i < 32; i++, ratemask >>= 1, rates++) { 1831 if (!(ratemask & 1)) 1832 continue; 1833 1834 rate = ath11k_mac_bitrate_to_rate(rates->bitrate); 1835 rateset->rates[rateset->num_rates] = rate; 1836 rateset->num_rates++; 1837 } 1838 } 1839 1840 static bool 1841 ath11k_peer_assoc_h_ht_masked(const u8 *ht_mcs_mask) 1842 { 1843 int nss; 1844 1845 for (nss = 0; nss < IEEE80211_HT_MCS_MASK_LEN; nss++) 1846 if (ht_mcs_mask[nss]) 1847 return false; 1848 1849 return true; 1850 } 1851 1852 static bool 1853 ath11k_peer_assoc_h_vht_masked(const u16 *vht_mcs_mask) 1854 { 1855 int nss; 1856 1857 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) 1858 if (vht_mcs_mask[nss]) 1859 return false; 1860 1861 return true; 1862 } 1863 1864 static void ath11k_peer_assoc_h_ht(struct ath11k *ar, 1865 struct ieee80211_vif *vif, 1866 struct ieee80211_sta *sta, 1867 struct peer_assoc_params *arg) 1868 { 1869 const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap; 1870 struct ath11k_vif *arvif = (void *)vif->drv_priv; 1871 struct cfg80211_chan_def def; 1872 enum nl80211_band band; 1873 const u8 *ht_mcs_mask; 1874 int i, n; 1875 u8 max_nss; 1876 u32 stbc; 1877 1878 lockdep_assert_held(&ar->conf_mutex); 1879 1880 if (WARN_ON(ath11k_mac_vif_chan(vif, &def))) 1881 return; 1882 1883 if (!ht_cap->ht_supported) 1884 return; 1885 1886 band = def.chan->band; 1887 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs; 1888 1889 if (ath11k_peer_assoc_h_ht_masked(ht_mcs_mask)) 1890 return; 1891 1892 arg->ht_flag = true; 1893 1894 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR + 1895 ht_cap->ampdu_factor)) - 1; 1896 1897 arg->peer_mpdu_density = 1898 ath11k_parse_mpdudensity(ht_cap->ampdu_density); 1899 1900 arg->peer_ht_caps = ht_cap->cap; 1901 arg->peer_rate_caps |= WMI_HOST_RC_HT_FLAG; 1902 1903 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING) 1904 arg->ldpc_flag = true; 1905 1906 if (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40) { 1907 arg->bw_40 = true; 1908 arg->peer_rate_caps |= WMI_HOST_RC_CW40_FLAG; 1909 } 1910 1911 /* As firmware handles this two flags (IEEE80211_HT_CAP_SGI_20 1912 * and IEEE80211_HT_CAP_SGI_40) for enabling SGI, we reset 1913 * both flags if guard interval is Default GI 1914 */ 1915 if (arvif->bitrate_mask.control[band].gi == NL80211_TXRATE_DEFAULT_GI) 1916 arg->peer_ht_caps &= ~(IEEE80211_HT_CAP_SGI_20 | 1917 IEEE80211_HT_CAP_SGI_40); 1918 1919 if (arvif->bitrate_mask.control[band].gi != NL80211_TXRATE_FORCE_LGI) { 1920 if (ht_cap->cap & (IEEE80211_HT_CAP_SGI_20 | 1921 IEEE80211_HT_CAP_SGI_40)) 1922 arg->peer_rate_caps |= WMI_HOST_RC_SGI_FLAG; 1923 } 1924 1925 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) { 1926 arg->peer_rate_caps |= WMI_HOST_RC_TX_STBC_FLAG; 1927 arg->stbc_flag = true; 1928 } 1929 1930 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) { 1931 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC; 1932 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT; 1933 stbc = stbc << WMI_HOST_RC_RX_STBC_FLAG_S; 1934 arg->peer_rate_caps |= stbc; 1935 arg->stbc_flag = true; 1936 } 1937 1938 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2]) 1939 arg->peer_rate_caps |= WMI_HOST_RC_TS_FLAG; 1940 else if (ht_cap->mcs.rx_mask[1]) 1941 arg->peer_rate_caps |= WMI_HOST_RC_DS_FLAG; 1942 1943 for (i = 0, n = 0, max_nss = 0; i < IEEE80211_HT_MCS_MASK_LEN * 8; i++) 1944 if ((ht_cap->mcs.rx_mask[i / 8] & BIT(i % 8)) && 1945 (ht_mcs_mask[i / 8] & BIT(i % 8))) { 1946 max_nss = (i / 8) + 1; 1947 arg->peer_ht_rates.rates[n++] = i; 1948 } 1949 1950 /* This is a workaround for HT-enabled STAs which break the spec 1951 * and have no HT capabilities RX mask (no HT RX MCS map). 1952 * 1953 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS), 1954 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs. 1955 * 1956 * Firmware asserts if such situation occurs. 1957 */ 1958 if (n == 0) { 1959 arg->peer_ht_rates.num_rates = 8; 1960 for (i = 0; i < arg->peer_ht_rates.num_rates; i++) 1961 arg->peer_ht_rates.rates[i] = i; 1962 } else { 1963 arg->peer_ht_rates.num_rates = n; 1964 arg->peer_nss = min(sta->deflink.rx_nss, max_nss); 1965 } 1966 1967 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "ht peer %pM mcs cnt %d nss %d\n", 1968 arg->peer_mac, 1969 arg->peer_ht_rates.num_rates, 1970 arg->peer_nss); 1971 } 1972 1973 static int ath11k_mac_get_max_vht_mcs_map(u16 mcs_map, int nss) 1974 { 1975 switch ((mcs_map >> (2 * nss)) & 0x3) { 1976 case IEEE80211_VHT_MCS_SUPPORT_0_7: return BIT(8) - 1; 1977 case IEEE80211_VHT_MCS_SUPPORT_0_8: return BIT(9) - 1; 1978 case IEEE80211_VHT_MCS_SUPPORT_0_9: return BIT(10) - 1; 1979 } 1980 return 0; 1981 } 1982 1983 static u16 1984 ath11k_peer_assoc_h_vht_limit(u16 tx_mcs_set, 1985 const u16 vht_mcs_limit[NL80211_VHT_NSS_MAX]) 1986 { 1987 int idx_limit; 1988 int nss; 1989 u16 mcs_map; 1990 u16 mcs; 1991 1992 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) { 1993 mcs_map = ath11k_mac_get_max_vht_mcs_map(tx_mcs_set, nss) & 1994 vht_mcs_limit[nss]; 1995 1996 if (mcs_map) 1997 idx_limit = fls(mcs_map) - 1; 1998 else 1999 idx_limit = -1; 2000 2001 switch (idx_limit) { 2002 case 0: 2003 case 1: 2004 case 2: 2005 case 3: 2006 case 4: 2007 case 5: 2008 case 6: 2009 case 7: 2010 mcs = IEEE80211_VHT_MCS_SUPPORT_0_7; 2011 break; 2012 case 8: 2013 mcs = IEEE80211_VHT_MCS_SUPPORT_0_8; 2014 break; 2015 case 9: 2016 mcs = IEEE80211_VHT_MCS_SUPPORT_0_9; 2017 break; 2018 default: 2019 WARN_ON(1); 2020 fallthrough; 2021 case -1: 2022 mcs = IEEE80211_VHT_MCS_NOT_SUPPORTED; 2023 break; 2024 } 2025 2026 tx_mcs_set &= ~(0x3 << (nss * 2)); 2027 tx_mcs_set |= mcs << (nss * 2); 2028 } 2029 2030 return tx_mcs_set; 2031 } 2032 2033 static u8 ath11k_get_nss_160mhz(struct ath11k *ar, 2034 u8 max_nss) 2035 { 2036 u8 nss_ratio_info = ar->pdev->cap.nss_ratio_info; 2037 u8 max_sup_nss = 0; 2038 2039 switch (nss_ratio_info) { 2040 case WMI_NSS_RATIO_1BY2_NSS: 2041 max_sup_nss = max_nss >> 1; 2042 break; 2043 case WMI_NSS_RATIO_3BY4_NSS: 2044 ath11k_warn(ar->ab, "WMI_NSS_RATIO_3BY4_NSS not supported\n"); 2045 break; 2046 case WMI_NSS_RATIO_1_NSS: 2047 max_sup_nss = max_nss; 2048 break; 2049 case WMI_NSS_RATIO_2_NSS: 2050 ath11k_warn(ar->ab, "WMI_NSS_RATIO_2_NSS not supported\n"); 2051 break; 2052 default: 2053 ath11k_warn(ar->ab, "invalid nss ratio received from firmware: %d\n", 2054 nss_ratio_info); 2055 break; 2056 } 2057 2058 return max_sup_nss; 2059 } 2060 2061 static void ath11k_peer_assoc_h_vht(struct ath11k *ar, 2062 struct ieee80211_vif *vif, 2063 struct ieee80211_sta *sta, 2064 struct peer_assoc_params *arg) 2065 { 2066 const struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap; 2067 struct ath11k_vif *arvif = (void *)vif->drv_priv; 2068 struct cfg80211_chan_def def; 2069 enum nl80211_band band; 2070 u16 *vht_mcs_mask; 2071 u8 ampdu_factor; 2072 u8 max_nss, vht_mcs; 2073 int i, vht_nss, nss_idx; 2074 bool user_rate_valid = true; 2075 u32 rx_nss, tx_nss, nss_160; 2076 2077 if (WARN_ON(ath11k_mac_vif_chan(vif, &def))) 2078 return; 2079 2080 if (!vht_cap->vht_supported) 2081 return; 2082 2083 band = def.chan->band; 2084 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs; 2085 2086 if (ath11k_peer_assoc_h_vht_masked(vht_mcs_mask)) 2087 return; 2088 2089 arg->vht_flag = true; 2090 2091 /* TODO: similar flags required? */ 2092 arg->vht_capable = true; 2093 2094 if (def.chan->band == NL80211_BAND_2GHZ) 2095 arg->vht_ng_flag = true; 2096 2097 arg->peer_vht_caps = vht_cap->cap; 2098 2099 ampdu_factor = (vht_cap->cap & 2100 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >> 2101 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT; 2102 2103 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to 2104 * zero in VHT IE. Using it would result in degraded throughput. 2105 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep 2106 * it if VHT max_mpdu is smaller. 2107 */ 2108 arg->peer_max_mpdu = max(arg->peer_max_mpdu, 2109 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR + 2110 ampdu_factor)) - 1); 2111 2112 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80) 2113 arg->bw_80 = true; 2114 2115 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) 2116 arg->bw_160 = true; 2117 2118 vht_nss = ath11k_mac_max_vht_nss(vht_mcs_mask); 2119 2120 if (vht_nss > sta->deflink.rx_nss) { 2121 user_rate_valid = false; 2122 for (nss_idx = sta->deflink.rx_nss - 1; nss_idx >= 0; nss_idx--) { 2123 if (vht_mcs_mask[nss_idx]) { 2124 user_rate_valid = true; 2125 break; 2126 } 2127 } 2128 } 2129 2130 if (!user_rate_valid) { 2131 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "setting vht range mcs value to peer supported nss %d for peer %pM\n", 2132 sta->deflink.rx_nss, sta->addr); 2133 vht_mcs_mask[sta->deflink.rx_nss - 1] = vht_mcs_mask[vht_nss - 1]; 2134 } 2135 2136 /* Calculate peer NSS capability from VHT capabilities if STA 2137 * supports VHT. 2138 */ 2139 for (i = 0, max_nss = 0; i < NL80211_VHT_NSS_MAX; i++) { 2140 vht_mcs = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map) >> 2141 (2 * i) & 3; 2142 2143 if (vht_mcs != IEEE80211_VHT_MCS_NOT_SUPPORTED && 2144 vht_mcs_mask[i]) 2145 max_nss = i + 1; 2146 } 2147 arg->peer_nss = min(sta->deflink.rx_nss, max_nss); 2148 arg->rx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.rx_highest); 2149 arg->rx_mcs_set = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map); 2150 arg->tx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.tx_highest); 2151 arg->tx_mcs_set = ath11k_peer_assoc_h_vht_limit( 2152 __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map), vht_mcs_mask); 2153 2154 /* In IPQ8074 platform, VHT mcs rate 10 and 11 is enabled by default. 2155 * VHT mcs rate 10 and 11 is not suppoerted in 11ac standard. 2156 * so explicitly disable the VHT MCS rate 10 and 11 in 11ac mode. 2157 */ 2158 arg->tx_mcs_set &= ~IEEE80211_VHT_MCS_SUPPORT_0_11_MASK; 2159 arg->tx_mcs_set |= IEEE80211_DISABLE_VHT_MCS_SUPPORT_0_11; 2160 2161 if ((arg->tx_mcs_set & IEEE80211_VHT_MCS_NOT_SUPPORTED) == 2162 IEEE80211_VHT_MCS_NOT_SUPPORTED) 2163 arg->peer_vht_caps &= ~IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE; 2164 2165 /* TODO: Check */ 2166 arg->tx_max_mcs_nss = 0xFF; 2167 2168 if (arg->peer_phymode == MODE_11AC_VHT160 || 2169 arg->peer_phymode == MODE_11AC_VHT80_80) { 2170 tx_nss = ath11k_get_nss_160mhz(ar, max_nss); 2171 rx_nss = min(arg->peer_nss, tx_nss); 2172 arg->peer_bw_rxnss_override = ATH11K_BW_NSS_MAP_ENABLE; 2173 2174 if (!rx_nss) { 2175 ath11k_warn(ar->ab, "invalid max_nss\n"); 2176 return; 2177 } 2178 2179 if (arg->peer_phymode == MODE_11AC_VHT160) 2180 nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_160MHZ, rx_nss - 1); 2181 else 2182 nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_80_80MHZ, rx_nss - 1); 2183 2184 arg->peer_bw_rxnss_override |= nss_160; 2185 } 2186 2187 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, 2188 "vht peer %pM max_mpdu %d flags 0x%x nss_override 0x%x\n", 2189 sta->addr, arg->peer_max_mpdu, arg->peer_flags, 2190 arg->peer_bw_rxnss_override); 2191 } 2192 2193 static int ath11k_mac_get_max_he_mcs_map(u16 mcs_map, int nss) 2194 { 2195 switch ((mcs_map >> (2 * nss)) & 0x3) { 2196 case IEEE80211_HE_MCS_SUPPORT_0_7: return BIT(8) - 1; 2197 case IEEE80211_HE_MCS_SUPPORT_0_9: return BIT(10) - 1; 2198 case IEEE80211_HE_MCS_SUPPORT_0_11: return BIT(12) - 1; 2199 } 2200 return 0; 2201 } 2202 2203 static u16 ath11k_peer_assoc_h_he_limit(u16 tx_mcs_set, 2204 const u16 he_mcs_limit[NL80211_HE_NSS_MAX]) 2205 { 2206 int idx_limit; 2207 int nss; 2208 u16 mcs_map; 2209 u16 mcs; 2210 2211 for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++) { 2212 mcs_map = ath11k_mac_get_max_he_mcs_map(tx_mcs_set, nss) & 2213 he_mcs_limit[nss]; 2214 2215 if (mcs_map) 2216 idx_limit = fls(mcs_map) - 1; 2217 else 2218 idx_limit = -1; 2219 2220 switch (idx_limit) { 2221 case 0 ... 7: 2222 mcs = IEEE80211_HE_MCS_SUPPORT_0_7; 2223 break; 2224 case 8: 2225 case 9: 2226 mcs = IEEE80211_HE_MCS_SUPPORT_0_9; 2227 break; 2228 case 10: 2229 case 11: 2230 mcs = IEEE80211_HE_MCS_SUPPORT_0_11; 2231 break; 2232 default: 2233 WARN_ON(1); 2234 fallthrough; 2235 case -1: 2236 mcs = IEEE80211_HE_MCS_NOT_SUPPORTED; 2237 break; 2238 } 2239 2240 tx_mcs_set &= ~(0x3 << (nss * 2)); 2241 tx_mcs_set |= mcs << (nss * 2); 2242 } 2243 2244 return tx_mcs_set; 2245 } 2246 2247 static bool 2248 ath11k_peer_assoc_h_he_masked(const u16 *he_mcs_mask) 2249 { 2250 int nss; 2251 2252 for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++) 2253 if (he_mcs_mask[nss]) 2254 return false; 2255 2256 return true; 2257 } 2258 2259 static void ath11k_peer_assoc_h_he(struct ath11k *ar, 2260 struct ieee80211_vif *vif, 2261 struct ieee80211_sta *sta, 2262 struct peer_assoc_params *arg) 2263 { 2264 struct ath11k_vif *arvif = (void *)vif->drv_priv; 2265 struct cfg80211_chan_def def; 2266 const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap; 2267 enum nl80211_band band; 2268 u16 he_mcs_mask[NL80211_HE_NSS_MAX]; 2269 u8 max_nss, he_mcs; 2270 u16 he_tx_mcs = 0, v = 0; 2271 int i, he_nss, nss_idx; 2272 bool user_rate_valid = true; 2273 u32 rx_nss, tx_nss, nss_160; 2274 u8 ampdu_factor, rx_mcs_80, rx_mcs_160; 2275 u16 mcs_160_map, mcs_80_map; 2276 bool support_160; 2277 2278 if (WARN_ON(ath11k_mac_vif_chan(vif, &def))) 2279 return; 2280 2281 if (!he_cap->has_he) 2282 return; 2283 2284 band = def.chan->band; 2285 memcpy(he_mcs_mask, arvif->bitrate_mask.control[band].he_mcs, 2286 sizeof(he_mcs_mask)); 2287 2288 if (ath11k_peer_assoc_h_he_masked(he_mcs_mask)) 2289 return; 2290 2291 arg->he_flag = true; 2292 support_160 = !!(he_cap->he_cap_elem.phy_cap_info[0] & 2293 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G); 2294 2295 /* Supported HE-MCS and NSS Set of peer he_cap is intersection with self he_cp */ 2296 mcs_160_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160); 2297 mcs_80_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80); 2298 2299 if (support_160) { 2300 for (i = 7; i >= 0; i--) { 2301 u8 mcs_160 = (mcs_160_map >> (2 * i)) & 3; 2302 2303 if (mcs_160 != IEEE80211_VHT_MCS_NOT_SUPPORTED) { 2304 rx_mcs_160 = i + 1; 2305 break; 2306 } 2307 } 2308 } 2309 2310 for (i = 7; i >= 0; i--) { 2311 u8 mcs_80 = (mcs_80_map >> (2 * i)) & 3; 2312 2313 if (mcs_80 != IEEE80211_VHT_MCS_NOT_SUPPORTED) { 2314 rx_mcs_80 = i + 1; 2315 break; 2316 } 2317 } 2318 2319 if (support_160) 2320 max_nss = min(rx_mcs_80, rx_mcs_160); 2321 else 2322 max_nss = rx_mcs_80; 2323 2324 arg->peer_nss = min(sta->deflink.rx_nss, max_nss); 2325 2326 memcpy_and_pad(&arg->peer_he_cap_macinfo, 2327 sizeof(arg->peer_he_cap_macinfo), 2328 he_cap->he_cap_elem.mac_cap_info, 2329 sizeof(he_cap->he_cap_elem.mac_cap_info), 2330 0); 2331 memcpy_and_pad(&arg->peer_he_cap_phyinfo, 2332 sizeof(arg->peer_he_cap_phyinfo), 2333 he_cap->he_cap_elem.phy_cap_info, 2334 sizeof(he_cap->he_cap_elem.phy_cap_info), 2335 0); 2336 arg->peer_he_ops = vif->bss_conf.he_oper.params; 2337 2338 /* the top most byte is used to indicate BSS color info */ 2339 arg->peer_he_ops &= 0xffffff; 2340 2341 /* As per section 26.6.1 11ax Draft5.0, if the Max AMPDU Exponent Extension 2342 * in HE cap is zero, use the arg->peer_max_mpdu as calculated while parsing 2343 * VHT caps(if VHT caps is present) or HT caps (if VHT caps is not present). 2344 * 2345 * For non-zero value of Max AMPDU Extponent Extension in HE MAC caps, 2346 * if a HE STA sends VHT cap and HE cap IE in assoc request then, use 2347 * MAX_AMPDU_LEN_FACTOR as 20 to calculate max_ampdu length. 2348 * If a HE STA that does not send VHT cap, but HE and HT cap in assoc 2349 * request, then use MAX_AMPDU_LEN_FACTOR as 16 to calculate max_ampdu 2350 * length. 2351 */ 2352 ampdu_factor = u8_get_bits(he_cap->he_cap_elem.mac_cap_info[3], 2353 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK); 2354 2355 if (ampdu_factor) { 2356 if (sta->deflink.vht_cap.vht_supported) 2357 arg->peer_max_mpdu = (1 << (IEEE80211_HE_VHT_MAX_AMPDU_FACTOR + 2358 ampdu_factor)) - 1; 2359 else if (sta->deflink.ht_cap.ht_supported) 2360 arg->peer_max_mpdu = (1 << (IEEE80211_HE_HT_MAX_AMPDU_FACTOR + 2361 ampdu_factor)) - 1; 2362 } 2363 2364 if (he_cap->he_cap_elem.phy_cap_info[6] & 2365 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) { 2366 int bit = 7; 2367 int nss, ru; 2368 2369 arg->peer_ppet.numss_m1 = he_cap->ppe_thres[0] & 2370 IEEE80211_PPE_THRES_NSS_MASK; 2371 arg->peer_ppet.ru_bit_mask = 2372 (he_cap->ppe_thres[0] & 2373 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK) >> 2374 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS; 2375 2376 for (nss = 0; nss <= arg->peer_ppet.numss_m1; nss++) { 2377 for (ru = 0; ru < 4; ru++) { 2378 u32 val = 0; 2379 int i; 2380 2381 if ((arg->peer_ppet.ru_bit_mask & BIT(ru)) == 0) 2382 continue; 2383 for (i = 0; i < 6; i++) { 2384 val >>= 1; 2385 val |= ((he_cap->ppe_thres[bit / 8] >> 2386 (bit % 8)) & 0x1) << 5; 2387 bit++; 2388 } 2389 arg->peer_ppet.ppet16_ppet8_ru3_ru0[nss] |= 2390 val << (ru * 6); 2391 } 2392 } 2393 } 2394 2395 if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_RES) 2396 arg->twt_responder = true; 2397 if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_REQ) 2398 arg->twt_requester = true; 2399 2400 he_nss = ath11k_mac_max_he_nss(he_mcs_mask); 2401 2402 if (he_nss > sta->deflink.rx_nss) { 2403 user_rate_valid = false; 2404 for (nss_idx = sta->deflink.rx_nss - 1; nss_idx >= 0; nss_idx--) { 2405 if (he_mcs_mask[nss_idx]) { 2406 user_rate_valid = true; 2407 break; 2408 } 2409 } 2410 } 2411 2412 if (!user_rate_valid) { 2413 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "setting he range mcs value to peer supported nss %d for peer %pM\n", 2414 sta->deflink.rx_nss, sta->addr); 2415 he_mcs_mask[sta->deflink.rx_nss - 1] = he_mcs_mask[he_nss - 1]; 2416 } 2417 2418 switch (sta->deflink.bandwidth) { 2419 case IEEE80211_STA_RX_BW_160: 2420 if (he_cap->he_cap_elem.phy_cap_info[0] & 2421 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G) { 2422 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80p80); 2423 v = ath11k_peer_assoc_h_he_limit(v, he_mcs_mask); 2424 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80_80] = v; 2425 2426 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80p80); 2427 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80_80] = v; 2428 2429 arg->peer_he_mcs_count++; 2430 he_tx_mcs = v; 2431 } 2432 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160); 2433 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v; 2434 2435 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_160); 2436 v = ath11k_peer_assoc_h_he_limit(v, he_mcs_mask); 2437 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v; 2438 2439 arg->peer_he_mcs_count++; 2440 if (!he_tx_mcs) 2441 he_tx_mcs = v; 2442 fallthrough; 2443 2444 default: 2445 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80); 2446 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v; 2447 2448 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80); 2449 v = ath11k_peer_assoc_h_he_limit(v, he_mcs_mask); 2450 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v; 2451 2452 arg->peer_he_mcs_count++; 2453 if (!he_tx_mcs) 2454 he_tx_mcs = v; 2455 break; 2456 } 2457 2458 /* Calculate peer NSS capability from HE capabilities if STA 2459 * supports HE. 2460 */ 2461 for (i = 0, max_nss = 0; i < NL80211_HE_NSS_MAX; i++) { 2462 he_mcs = he_tx_mcs >> (2 * i) & 3; 2463 2464 /* In case of fixed rates, MCS Range in he_tx_mcs might have 2465 * unsupported range, with he_mcs_mask set, so check either of them 2466 * to find nss. 2467 */ 2468 if (he_mcs != IEEE80211_HE_MCS_NOT_SUPPORTED || 2469 he_mcs_mask[i]) 2470 max_nss = i + 1; 2471 } 2472 arg->peer_nss = min(sta->deflink.rx_nss, max_nss); 2473 2474 if (arg->peer_phymode == MODE_11AX_HE160 || 2475 arg->peer_phymode == MODE_11AX_HE80_80) { 2476 tx_nss = ath11k_get_nss_160mhz(ar, max_nss); 2477 rx_nss = min(arg->peer_nss, tx_nss); 2478 arg->peer_bw_rxnss_override = ATH11K_BW_NSS_MAP_ENABLE; 2479 2480 if (!rx_nss) { 2481 ath11k_warn(ar->ab, "invalid max_nss\n"); 2482 return; 2483 } 2484 2485 if (arg->peer_phymode == MODE_11AX_HE160) 2486 nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_160MHZ, rx_nss - 1); 2487 else 2488 nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_80_80MHZ, rx_nss - 1); 2489 2490 arg->peer_bw_rxnss_override |= nss_160; 2491 } 2492 2493 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, 2494 "he peer %pM nss %d mcs cnt %d nss_override 0x%x\n", 2495 sta->addr, arg->peer_nss, 2496 arg->peer_he_mcs_count, 2497 arg->peer_bw_rxnss_override); 2498 } 2499 2500 static void ath11k_peer_assoc_h_he_6ghz(struct ath11k *ar, 2501 struct ieee80211_vif *vif, 2502 struct ieee80211_sta *sta, 2503 struct peer_assoc_params *arg) 2504 { 2505 const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap; 2506 struct cfg80211_chan_def def; 2507 enum nl80211_band band; 2508 u8 ampdu_factor; 2509 2510 if (WARN_ON(ath11k_mac_vif_chan(vif, &def))) 2511 return; 2512 2513 band = def.chan->band; 2514 2515 if (!arg->he_flag || band != NL80211_BAND_6GHZ || !sta->deflink.he_6ghz_capa.capa) 2516 return; 2517 2518 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40) 2519 arg->bw_40 = true; 2520 2521 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80) 2522 arg->bw_80 = true; 2523 2524 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) 2525 arg->bw_160 = true; 2526 2527 arg->peer_he_caps_6ghz = le16_to_cpu(sta->deflink.he_6ghz_capa.capa); 2528 arg->peer_mpdu_density = 2529 ath11k_parse_mpdudensity(FIELD_GET(IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START, 2530 arg->peer_he_caps_6ghz)); 2531 2532 /* From IEEE Std 802.11ax-2021 - Section 10.12.2: An HE STA shall be capable of 2533 * receiving A-MPDU where the A-MPDU pre-EOF padding length is up to the value 2534 * indicated by the Maximum A-MPDU Length Exponent Extension field in the HE 2535 * Capabilities element and the Maximum A-MPDU Length Exponent field in HE 6 GHz 2536 * Band Capabilities element in the 6 GHz band. 2537 * 2538 * Here, we are extracting the Max A-MPDU Exponent Extension from HE caps and 2539 * factor is the Maximum A-MPDU Length Exponent from HE 6 GHZ Band capability. 2540 */ 2541 ampdu_factor = FIELD_GET(IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK, 2542 he_cap->he_cap_elem.mac_cap_info[3]) + 2543 FIELD_GET(IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP, 2544 arg->peer_he_caps_6ghz); 2545 2546 arg->peer_max_mpdu = (1u << (IEEE80211_HE_6GHZ_MAX_AMPDU_FACTOR + 2547 ampdu_factor)) - 1; 2548 } 2549 2550 static void ath11k_peer_assoc_h_smps(struct ieee80211_sta *sta, 2551 struct peer_assoc_params *arg) 2552 { 2553 const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap; 2554 int smps; 2555 2556 if (!ht_cap->ht_supported && !sta->deflink.he_6ghz_capa.capa) 2557 return; 2558 2559 if (ht_cap->ht_supported) { 2560 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS; 2561 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT; 2562 } else { 2563 smps = le16_get_bits(sta->deflink.he_6ghz_capa.capa, 2564 IEEE80211_HE_6GHZ_CAP_SM_PS); 2565 } 2566 2567 switch (smps) { 2568 case WLAN_HT_CAP_SM_PS_STATIC: 2569 arg->static_mimops_flag = true; 2570 break; 2571 case WLAN_HT_CAP_SM_PS_DYNAMIC: 2572 arg->dynamic_mimops_flag = true; 2573 break; 2574 case WLAN_HT_CAP_SM_PS_DISABLED: 2575 arg->spatial_mux_flag = true; 2576 break; 2577 default: 2578 break; 2579 } 2580 } 2581 2582 static void ath11k_peer_assoc_h_qos(struct ath11k *ar, 2583 struct ieee80211_vif *vif, 2584 struct ieee80211_sta *sta, 2585 struct peer_assoc_params *arg) 2586 { 2587 struct ath11k_vif *arvif = (void *)vif->drv_priv; 2588 2589 switch (arvif->vdev_type) { 2590 case WMI_VDEV_TYPE_AP: 2591 if (sta->wme) { 2592 /* TODO: Check WME vs QoS */ 2593 arg->is_wme_set = true; 2594 arg->qos_flag = true; 2595 } 2596 2597 if (sta->wme && sta->uapsd_queues) { 2598 /* TODO: Check WME vs QoS */ 2599 arg->is_wme_set = true; 2600 arg->apsd_flag = true; 2601 arg->peer_rate_caps |= WMI_HOST_RC_UAPSD_FLAG; 2602 } 2603 break; 2604 case WMI_VDEV_TYPE_STA: 2605 if (sta->wme) { 2606 arg->is_wme_set = true; 2607 arg->qos_flag = true; 2608 } 2609 break; 2610 default: 2611 break; 2612 } 2613 2614 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "peer %pM qos %d\n", 2615 sta->addr, arg->qos_flag); 2616 } 2617 2618 static int ath11k_peer_assoc_qos_ap(struct ath11k *ar, 2619 struct ath11k_vif *arvif, 2620 struct ieee80211_sta *sta) 2621 { 2622 struct ap_ps_params params; 2623 u32 max_sp; 2624 u32 uapsd; 2625 int ret; 2626 2627 lockdep_assert_held(&ar->conf_mutex); 2628 2629 params.vdev_id = arvif->vdev_id; 2630 2631 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "uapsd_queues 0x%x max_sp %d\n", 2632 sta->uapsd_queues, sta->max_sp); 2633 2634 uapsd = 0; 2635 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO) 2636 uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN | 2637 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN; 2638 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI) 2639 uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN | 2640 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN; 2641 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK) 2642 uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN | 2643 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN; 2644 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE) 2645 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN | 2646 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN; 2647 2648 max_sp = 0; 2649 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP) 2650 max_sp = sta->max_sp; 2651 2652 params.param = WMI_AP_PS_PEER_PARAM_UAPSD; 2653 params.value = uapsd; 2654 ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, ¶ms); 2655 if (ret) 2656 goto err; 2657 2658 params.param = WMI_AP_PS_PEER_PARAM_MAX_SP; 2659 params.value = max_sp; 2660 ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, ¶ms); 2661 if (ret) 2662 goto err; 2663 2664 /* TODO revisit during testing */ 2665 params.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_FRMTYPE; 2666 params.value = DISABLE_SIFS_RESPONSE_TRIGGER; 2667 ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, ¶ms); 2668 if (ret) 2669 goto err; 2670 2671 params.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_UAPSD; 2672 params.value = DISABLE_SIFS_RESPONSE_TRIGGER; 2673 ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, ¶ms); 2674 if (ret) 2675 goto err; 2676 2677 return 0; 2678 2679 err: 2680 ath11k_warn(ar->ab, "failed to set ap ps peer param %d for vdev %i: %d\n", 2681 params.param, arvif->vdev_id, ret); 2682 return ret; 2683 } 2684 2685 static bool ath11k_mac_sta_has_ofdm_only(struct ieee80211_sta *sta) 2686 { 2687 return sta->deflink.supp_rates[NL80211_BAND_2GHZ] >> 2688 ATH11K_MAC_FIRST_OFDM_RATE_IDX; 2689 } 2690 2691 static enum wmi_phy_mode ath11k_mac_get_phymode_vht(struct ath11k *ar, 2692 struct ieee80211_sta *sta) 2693 { 2694 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) { 2695 switch (sta->deflink.vht_cap.cap & 2696 IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) { 2697 case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ: 2698 return MODE_11AC_VHT160; 2699 case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ: 2700 return MODE_11AC_VHT80_80; 2701 default: 2702 /* not sure if this is a valid case? */ 2703 return MODE_11AC_VHT160; 2704 } 2705 } 2706 2707 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80) 2708 return MODE_11AC_VHT80; 2709 2710 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40) 2711 return MODE_11AC_VHT40; 2712 2713 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20) 2714 return MODE_11AC_VHT20; 2715 2716 return MODE_UNKNOWN; 2717 } 2718 2719 static enum wmi_phy_mode ath11k_mac_get_phymode_he(struct ath11k *ar, 2720 struct ieee80211_sta *sta) 2721 { 2722 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) { 2723 if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] & 2724 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G) 2725 return MODE_11AX_HE160; 2726 else if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] & 2727 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G) 2728 return MODE_11AX_HE80_80; 2729 /* not sure if this is a valid case? */ 2730 return MODE_11AX_HE160; 2731 } 2732 2733 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80) 2734 return MODE_11AX_HE80; 2735 2736 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40) 2737 return MODE_11AX_HE40; 2738 2739 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20) 2740 return MODE_11AX_HE20; 2741 2742 return MODE_UNKNOWN; 2743 } 2744 2745 static void ath11k_peer_assoc_h_phymode(struct ath11k *ar, 2746 struct ieee80211_vif *vif, 2747 struct ieee80211_sta *sta, 2748 struct peer_assoc_params *arg) 2749 { 2750 struct ath11k_vif *arvif = (void *)vif->drv_priv; 2751 struct cfg80211_chan_def def; 2752 enum nl80211_band band; 2753 const u8 *ht_mcs_mask; 2754 const u16 *vht_mcs_mask; 2755 const u16 *he_mcs_mask; 2756 enum wmi_phy_mode phymode = MODE_UNKNOWN; 2757 2758 if (WARN_ON(ath11k_mac_vif_chan(vif, &def))) 2759 return; 2760 2761 band = def.chan->band; 2762 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs; 2763 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs; 2764 he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs; 2765 2766 switch (band) { 2767 case NL80211_BAND_2GHZ: 2768 if (sta->deflink.he_cap.has_he && 2769 !ath11k_peer_assoc_h_he_masked(he_mcs_mask)) { 2770 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80) 2771 phymode = MODE_11AX_HE80_2G; 2772 else if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40) 2773 phymode = MODE_11AX_HE40_2G; 2774 else 2775 phymode = MODE_11AX_HE20_2G; 2776 } else if (sta->deflink.vht_cap.vht_supported && 2777 !ath11k_peer_assoc_h_vht_masked(vht_mcs_mask)) { 2778 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40) 2779 phymode = MODE_11AC_VHT40; 2780 else 2781 phymode = MODE_11AC_VHT20; 2782 } else if (sta->deflink.ht_cap.ht_supported && 2783 !ath11k_peer_assoc_h_ht_masked(ht_mcs_mask)) { 2784 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40) 2785 phymode = MODE_11NG_HT40; 2786 else 2787 phymode = MODE_11NG_HT20; 2788 } else if (ath11k_mac_sta_has_ofdm_only(sta)) { 2789 phymode = MODE_11G; 2790 } else { 2791 phymode = MODE_11B; 2792 } 2793 break; 2794 case NL80211_BAND_5GHZ: 2795 case NL80211_BAND_6GHZ: 2796 /* Check HE first */ 2797 if (sta->deflink.he_cap.has_he && 2798 !ath11k_peer_assoc_h_he_masked(he_mcs_mask)) { 2799 phymode = ath11k_mac_get_phymode_he(ar, sta); 2800 } else if (sta->deflink.vht_cap.vht_supported && 2801 !ath11k_peer_assoc_h_vht_masked(vht_mcs_mask)) { 2802 phymode = ath11k_mac_get_phymode_vht(ar, sta); 2803 } else if (sta->deflink.ht_cap.ht_supported && 2804 !ath11k_peer_assoc_h_ht_masked(ht_mcs_mask)) { 2805 if (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40) 2806 phymode = MODE_11NA_HT40; 2807 else 2808 phymode = MODE_11NA_HT20; 2809 } else { 2810 phymode = MODE_11A; 2811 } 2812 break; 2813 default: 2814 break; 2815 } 2816 2817 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "peer %pM phymode %s\n", 2818 sta->addr, ath11k_wmi_phymode_str(phymode)); 2819 2820 arg->peer_phymode = phymode; 2821 WARN_ON(phymode == MODE_UNKNOWN); 2822 } 2823 2824 static void ath11k_peer_assoc_prepare(struct ath11k *ar, 2825 struct ieee80211_vif *vif, 2826 struct ieee80211_sta *sta, 2827 struct peer_assoc_params *arg, 2828 bool reassoc) 2829 { 2830 struct ath11k_sta *arsta; 2831 2832 lockdep_assert_held(&ar->conf_mutex); 2833 2834 arsta = (struct ath11k_sta *)sta->drv_priv; 2835 2836 memset(arg, 0, sizeof(*arg)); 2837 2838 reinit_completion(&ar->peer_assoc_done); 2839 2840 arg->peer_new_assoc = !reassoc; 2841 ath11k_peer_assoc_h_basic(ar, vif, sta, arg); 2842 ath11k_peer_assoc_h_crypto(ar, vif, sta, arg); 2843 ath11k_peer_assoc_h_rates(ar, vif, sta, arg); 2844 ath11k_peer_assoc_h_phymode(ar, vif, sta, arg); 2845 ath11k_peer_assoc_h_ht(ar, vif, sta, arg); 2846 ath11k_peer_assoc_h_vht(ar, vif, sta, arg); 2847 ath11k_peer_assoc_h_he(ar, vif, sta, arg); 2848 ath11k_peer_assoc_h_he_6ghz(ar, vif, sta, arg); 2849 ath11k_peer_assoc_h_qos(ar, vif, sta, arg); 2850 ath11k_peer_assoc_h_smps(sta, arg); 2851 2852 arsta->peer_nss = arg->peer_nss; 2853 2854 /* TODO: amsdu_disable req? */ 2855 } 2856 2857 static int ath11k_setup_peer_smps(struct ath11k *ar, struct ath11k_vif *arvif, 2858 const u8 *addr, 2859 const struct ieee80211_sta_ht_cap *ht_cap, 2860 u16 he_6ghz_capa) 2861 { 2862 int smps; 2863 2864 if (!ht_cap->ht_supported && !he_6ghz_capa) 2865 return 0; 2866 2867 if (ht_cap->ht_supported) { 2868 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS; 2869 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT; 2870 } else { 2871 smps = FIELD_GET(IEEE80211_HE_6GHZ_CAP_SM_PS, he_6ghz_capa); 2872 } 2873 2874 if (smps >= ARRAY_SIZE(ath11k_smps_map)) 2875 return -EINVAL; 2876 2877 return ath11k_wmi_set_peer_param(ar, addr, arvif->vdev_id, 2878 WMI_PEER_MIMO_PS_STATE, 2879 ath11k_smps_map[smps]); 2880 } 2881 2882 static bool ath11k_mac_set_he_txbf_conf(struct ath11k_vif *arvif) 2883 { 2884 struct ath11k *ar = arvif->ar; 2885 u32 param, value; 2886 int ret; 2887 2888 if (!arvif->vif->bss_conf.he_support) 2889 return true; 2890 2891 param = WMI_VDEV_PARAM_SET_HEMU_MODE; 2892 value = 0; 2893 if (arvif->vif->bss_conf.he_su_beamformer) { 2894 value |= FIELD_PREP(HE_MODE_SU_TX_BFER, HE_SU_BFER_ENABLE); 2895 if (arvif->vif->bss_conf.he_mu_beamformer && 2896 arvif->vdev_type == WMI_VDEV_TYPE_AP) 2897 value |= FIELD_PREP(HE_MODE_MU_TX_BFER, HE_MU_BFER_ENABLE); 2898 } 2899 2900 if (arvif->vif->type != NL80211_IFTYPE_MESH_POINT) { 2901 value |= FIELD_PREP(HE_MODE_DL_OFDMA, HE_DL_MUOFDMA_ENABLE) | 2902 FIELD_PREP(HE_MODE_UL_OFDMA, HE_UL_MUOFDMA_ENABLE); 2903 2904 if (arvif->vif->bss_conf.he_full_ul_mumimo) 2905 value |= FIELD_PREP(HE_MODE_UL_MUMIMO, HE_UL_MUMIMO_ENABLE); 2906 2907 if (arvif->vif->bss_conf.he_su_beamformee) 2908 value |= FIELD_PREP(HE_MODE_SU_TX_BFEE, HE_SU_BFEE_ENABLE); 2909 } 2910 2911 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, value); 2912 if (ret) { 2913 ath11k_warn(ar->ab, "failed to set vdev %d HE MU mode: %d\n", 2914 arvif->vdev_id, ret); 2915 return false; 2916 } 2917 2918 param = WMI_VDEV_PARAM_SET_HE_SOUNDING_MODE; 2919 value = FIELD_PREP(HE_VHT_SOUNDING_MODE, HE_VHT_SOUNDING_MODE_ENABLE) | 2920 FIELD_PREP(HE_TRIG_NONTRIG_SOUNDING_MODE, 2921 HE_TRIG_NONTRIG_SOUNDING_MODE_ENABLE); 2922 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 2923 param, value); 2924 if (ret) { 2925 ath11k_warn(ar->ab, "failed to set vdev %d sounding mode: %d\n", 2926 arvif->vdev_id, ret); 2927 return false; 2928 } 2929 return true; 2930 } 2931 2932 static bool ath11k_mac_vif_recalc_sta_he_txbf(struct ath11k *ar, 2933 struct ieee80211_vif *vif, 2934 struct ieee80211_sta_he_cap *he_cap) 2935 { 2936 struct ath11k_vif *arvif = (void *)vif->drv_priv; 2937 struct ieee80211_he_cap_elem he_cap_elem = {0}; 2938 struct ieee80211_sta_he_cap *cap_band = NULL; 2939 struct cfg80211_chan_def def; 2940 u32 param = WMI_VDEV_PARAM_SET_HEMU_MODE; 2941 u32 hemode = 0; 2942 int ret; 2943 2944 if (!vif->bss_conf.he_support) 2945 return true; 2946 2947 if (vif->type != NL80211_IFTYPE_STATION) 2948 return false; 2949 2950 if (WARN_ON(ath11k_mac_vif_chan(vif, &def))) 2951 return false; 2952 2953 if (def.chan->band == NL80211_BAND_2GHZ) 2954 cap_band = &ar->mac.iftype[NL80211_BAND_2GHZ][vif->type].he_cap; 2955 else 2956 cap_band = &ar->mac.iftype[NL80211_BAND_5GHZ][vif->type].he_cap; 2957 2958 memcpy(&he_cap_elem, &cap_band->he_cap_elem, sizeof(he_cap_elem)); 2959 2960 if (HECAP_PHY_SUBFME_GET(he_cap_elem.phy_cap_info)) { 2961 if (HECAP_PHY_SUBFMR_GET(he_cap->he_cap_elem.phy_cap_info)) 2962 hemode |= FIELD_PREP(HE_MODE_SU_TX_BFEE, HE_SU_BFEE_ENABLE); 2963 if (HECAP_PHY_MUBFMR_GET(he_cap->he_cap_elem.phy_cap_info)) 2964 hemode |= FIELD_PREP(HE_MODE_MU_TX_BFEE, HE_MU_BFEE_ENABLE); 2965 } 2966 2967 if (vif->type != NL80211_IFTYPE_MESH_POINT) { 2968 hemode |= FIELD_PREP(HE_MODE_DL_OFDMA, HE_DL_MUOFDMA_ENABLE) | 2969 FIELD_PREP(HE_MODE_UL_OFDMA, HE_UL_MUOFDMA_ENABLE); 2970 2971 if (HECAP_PHY_ULMUMIMO_GET(he_cap_elem.phy_cap_info)) 2972 if (HECAP_PHY_ULMUMIMO_GET(he_cap->he_cap_elem.phy_cap_info)) 2973 hemode |= FIELD_PREP(HE_MODE_UL_MUMIMO, 2974 HE_UL_MUMIMO_ENABLE); 2975 2976 if (FIELD_GET(HE_MODE_MU_TX_BFEE, hemode)) 2977 hemode |= FIELD_PREP(HE_MODE_SU_TX_BFEE, HE_SU_BFEE_ENABLE); 2978 2979 if (FIELD_GET(HE_MODE_MU_TX_BFER, hemode)) 2980 hemode |= FIELD_PREP(HE_MODE_SU_TX_BFER, HE_SU_BFER_ENABLE); 2981 } 2982 2983 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, hemode); 2984 if (ret) { 2985 ath11k_warn(ar->ab, "failed to submit vdev param txbf 0x%x: %d\n", 2986 hemode, ret); 2987 return false; 2988 } 2989 2990 return true; 2991 } 2992 2993 static void ath11k_bss_assoc(struct ieee80211_hw *hw, 2994 struct ieee80211_vif *vif, 2995 struct ieee80211_bss_conf *bss_conf) 2996 { 2997 struct ath11k *ar = hw->priv; 2998 struct ath11k_vif *arvif = (void *)vif->drv_priv; 2999 struct peer_assoc_params peer_arg; 3000 struct ieee80211_sta *ap_sta; 3001 struct ath11k_peer *peer; 3002 bool is_auth = false; 3003 struct ieee80211_sta_he_cap he_cap; 3004 int ret; 3005 3006 lockdep_assert_held(&ar->conf_mutex); 3007 3008 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %i assoc bssid %pM aid %d\n", 3009 arvif->vdev_id, arvif->bssid, arvif->aid); 3010 3011 rcu_read_lock(); 3012 3013 ap_sta = ieee80211_find_sta(vif, bss_conf->bssid); 3014 if (!ap_sta) { 3015 ath11k_warn(ar->ab, "failed to find station entry for bss %pM vdev %i\n", 3016 bss_conf->bssid, arvif->vdev_id); 3017 rcu_read_unlock(); 3018 return; 3019 } 3020 3021 /* he_cap here is updated at assoc success for sta mode only */ 3022 he_cap = ap_sta->deflink.he_cap; 3023 3024 ath11k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg, false); 3025 3026 rcu_read_unlock(); 3027 3028 peer_arg.is_assoc = true; 3029 ret = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg); 3030 if (ret) { 3031 ath11k_warn(ar->ab, "failed to run peer assoc for %pM vdev %i: %d\n", 3032 bss_conf->bssid, arvif->vdev_id, ret); 3033 return; 3034 } 3035 3036 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) { 3037 ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n", 3038 bss_conf->bssid, arvif->vdev_id); 3039 return; 3040 } 3041 3042 ret = ath11k_setup_peer_smps(ar, arvif, bss_conf->bssid, 3043 &ap_sta->deflink.ht_cap, 3044 le16_to_cpu(ap_sta->deflink.he_6ghz_capa.capa)); 3045 if (ret) { 3046 ath11k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n", 3047 arvif->vdev_id, ret); 3048 return; 3049 } 3050 3051 if (!ath11k_mac_vif_recalc_sta_he_txbf(ar, vif, &he_cap)) { 3052 ath11k_warn(ar->ab, "failed to recalc he txbf for vdev %i on bss %pM\n", 3053 arvif->vdev_id, bss_conf->bssid); 3054 return; 3055 } 3056 3057 WARN_ON(arvif->is_up); 3058 3059 arvif->aid = vif->cfg.aid; 3060 ether_addr_copy(arvif->bssid, bss_conf->bssid); 3061 3062 ret = ath11k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid, 3063 NULL, 0, 0); 3064 if (ret) { 3065 ath11k_warn(ar->ab, "failed to set vdev %d up: %d\n", 3066 arvif->vdev_id, ret); 3067 return; 3068 } 3069 3070 arvif->is_up = true; 3071 arvif->rekey_data.enable_offload = false; 3072 3073 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, 3074 "vdev %d up (associated) bssid %pM aid %d\n", 3075 arvif->vdev_id, bss_conf->bssid, vif->cfg.aid); 3076 3077 spin_lock_bh(&ar->ab->base_lock); 3078 3079 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, arvif->bssid); 3080 if (peer && peer->is_authorized) 3081 is_auth = true; 3082 3083 spin_unlock_bh(&ar->ab->base_lock); 3084 3085 if (is_auth) { 3086 ret = ath11k_wmi_set_peer_param(ar, arvif->bssid, 3087 arvif->vdev_id, 3088 WMI_PEER_AUTHORIZE, 3089 1); 3090 if (ret) 3091 ath11k_warn(ar->ab, "Unable to authorize BSS peer: %d\n", ret); 3092 } 3093 3094 ret = ath11k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id, 3095 &bss_conf->he_obss_pd); 3096 if (ret) 3097 ath11k_warn(ar->ab, "failed to set vdev %i OBSS PD parameters: %d\n", 3098 arvif->vdev_id, ret); 3099 3100 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 3101 WMI_VDEV_PARAM_DTIM_POLICY, 3102 WMI_DTIM_POLICY_STICK); 3103 if (ret) 3104 ath11k_warn(ar->ab, "failed to set vdev %d dtim policy: %d\n", 3105 arvif->vdev_id, ret); 3106 3107 ath11k_mac_11d_scan_stop_all(ar->ab); 3108 } 3109 3110 static void ath11k_bss_disassoc(struct ieee80211_hw *hw, 3111 struct ieee80211_vif *vif) 3112 { 3113 struct ath11k *ar = hw->priv; 3114 struct ath11k_vif *arvif = (void *)vif->drv_priv; 3115 int ret; 3116 3117 lockdep_assert_held(&ar->conf_mutex); 3118 3119 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %i disassoc bssid %pM\n", 3120 arvif->vdev_id, arvif->bssid); 3121 3122 ret = ath11k_wmi_vdev_down(ar, arvif->vdev_id); 3123 if (ret) 3124 ath11k_warn(ar->ab, "failed to down vdev %i: %d\n", 3125 arvif->vdev_id, ret); 3126 3127 arvif->is_up = false; 3128 3129 memset(&arvif->rekey_data, 0, sizeof(arvif->rekey_data)); 3130 3131 cancel_delayed_work_sync(&arvif->connection_loss_work); 3132 } 3133 3134 static u32 ath11k_mac_get_rate_hw_value(int bitrate) 3135 { 3136 u32 preamble; 3137 u16 hw_value; 3138 int rate; 3139 size_t i; 3140 3141 if (ath11k_mac_bitrate_is_cck(bitrate)) 3142 preamble = WMI_RATE_PREAMBLE_CCK; 3143 else 3144 preamble = WMI_RATE_PREAMBLE_OFDM; 3145 3146 for (i = 0; i < ARRAY_SIZE(ath11k_legacy_rates); i++) { 3147 if (ath11k_legacy_rates[i].bitrate != bitrate) 3148 continue; 3149 3150 hw_value = ath11k_legacy_rates[i].hw_value; 3151 rate = ATH11K_HW_RATE_CODE(hw_value, 0, preamble); 3152 3153 return rate; 3154 } 3155 3156 return -EINVAL; 3157 } 3158 3159 static void ath11k_recalculate_mgmt_rate(struct ath11k *ar, 3160 struct ieee80211_vif *vif, 3161 struct cfg80211_chan_def *def) 3162 { 3163 struct ath11k_vif *arvif = (void *)vif->drv_priv; 3164 const struct ieee80211_supported_band *sband; 3165 u8 basic_rate_idx; 3166 int hw_rate_code; 3167 u32 vdev_param; 3168 u16 bitrate; 3169 int ret; 3170 3171 lockdep_assert_held(&ar->conf_mutex); 3172 3173 sband = ar->hw->wiphy->bands[def->chan->band]; 3174 basic_rate_idx = ffs(vif->bss_conf.basic_rates) - 1; 3175 bitrate = sband->bitrates[basic_rate_idx].bitrate; 3176 3177 hw_rate_code = ath11k_mac_get_rate_hw_value(bitrate); 3178 if (hw_rate_code < 0) { 3179 ath11k_warn(ar->ab, "bitrate not supported %d\n", bitrate); 3180 return; 3181 } 3182 3183 vdev_param = WMI_VDEV_PARAM_MGMT_RATE; 3184 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param, 3185 hw_rate_code); 3186 if (ret) 3187 ath11k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret); 3188 3189 /* For WCN6855, firmware will clear this param when vdev starts, hence 3190 * cache it here so that we can reconfigure it once vdev starts. 3191 */ 3192 ar->hw_rate_code = hw_rate_code; 3193 3194 vdev_param = WMI_VDEV_PARAM_BEACON_RATE; 3195 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param, 3196 hw_rate_code); 3197 if (ret) 3198 ath11k_warn(ar->ab, "failed to set beacon tx rate %d\n", ret); 3199 } 3200 3201 static int ath11k_mac_fils_discovery(struct ath11k_vif *arvif, 3202 struct ieee80211_bss_conf *info) 3203 { 3204 struct ath11k *ar = arvif->ar; 3205 struct sk_buff *tmpl; 3206 int ret; 3207 u32 interval; 3208 bool unsol_bcast_probe_resp_enabled = false; 3209 3210 if (info->fils_discovery.max_interval) { 3211 interval = info->fils_discovery.max_interval; 3212 3213 tmpl = ieee80211_get_fils_discovery_tmpl(ar->hw, arvif->vif); 3214 if (tmpl) 3215 ret = ath11k_wmi_fils_discovery_tmpl(ar, arvif->vdev_id, 3216 tmpl); 3217 } else if (info->unsol_bcast_probe_resp_interval) { 3218 unsol_bcast_probe_resp_enabled = 1; 3219 interval = info->unsol_bcast_probe_resp_interval; 3220 3221 tmpl = ieee80211_get_unsol_bcast_probe_resp_tmpl(ar->hw, 3222 arvif->vif); 3223 if (tmpl) 3224 ret = ath11k_wmi_probe_resp_tmpl(ar, arvif->vdev_id, 3225 tmpl); 3226 } else { /* Disable */ 3227 return ath11k_wmi_fils_discovery(ar, arvif->vdev_id, 0, false); 3228 } 3229 3230 if (!tmpl) { 3231 ath11k_warn(ar->ab, 3232 "mac vdev %i failed to retrieve %s template\n", 3233 arvif->vdev_id, (unsol_bcast_probe_resp_enabled ? 3234 "unsolicited broadcast probe response" : 3235 "FILS discovery")); 3236 return -EPERM; 3237 } 3238 kfree_skb(tmpl); 3239 3240 if (!ret) 3241 ret = ath11k_wmi_fils_discovery(ar, arvif->vdev_id, interval, 3242 unsol_bcast_probe_resp_enabled); 3243 3244 return ret; 3245 } 3246 3247 static int ath11k_mac_config_obss_pd(struct ath11k *ar, 3248 struct ieee80211_he_obss_pd *he_obss_pd) 3249 { 3250 u32 bitmap[2], param_id, param_val, pdev_id; 3251 int ret; 3252 s8 non_srg_th = 0, srg_th = 0; 3253 3254 pdev_id = ar->pdev->pdev_id; 3255 3256 /* Set and enable SRG/non-SRG OBSS PD Threshold */ 3257 param_id = WMI_PDEV_PARAM_SET_CMD_OBSS_PD_THRESHOLD; 3258 if (test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags)) { 3259 ret = ath11k_wmi_pdev_set_param(ar, param_id, 0, pdev_id); 3260 if (ret) 3261 ath11k_warn(ar->ab, 3262 "failed to set obss_pd_threshold for pdev: %u\n", 3263 pdev_id); 3264 return ret; 3265 } 3266 3267 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, 3268 "obss pd sr_ctrl %x non_srg_thres %u srg_max %u\n", 3269 he_obss_pd->sr_ctrl, he_obss_pd->non_srg_max_offset, 3270 he_obss_pd->max_offset); 3271 3272 param_val = 0; 3273 3274 if (he_obss_pd->sr_ctrl & 3275 IEEE80211_HE_SPR_NON_SRG_OBSS_PD_SR_DISALLOWED) { 3276 non_srg_th = ATH11K_OBSS_PD_MAX_THRESHOLD; 3277 } else { 3278 if (he_obss_pd->sr_ctrl & IEEE80211_HE_SPR_NON_SRG_OFFSET_PRESENT) 3279 non_srg_th = (ATH11K_OBSS_PD_MAX_THRESHOLD + 3280 he_obss_pd->non_srg_max_offset); 3281 else 3282 non_srg_th = ATH11K_OBSS_PD_NON_SRG_MAX_THRESHOLD; 3283 3284 param_val |= ATH11K_OBSS_PD_NON_SRG_EN; 3285 } 3286 3287 if (he_obss_pd->sr_ctrl & IEEE80211_HE_SPR_SRG_INFORMATION_PRESENT) { 3288 srg_th = ATH11K_OBSS_PD_MAX_THRESHOLD + he_obss_pd->max_offset; 3289 param_val |= ATH11K_OBSS_PD_SRG_EN; 3290 } 3291 3292 if (test_bit(WMI_TLV_SERVICE_SRG_SRP_SPATIAL_REUSE_SUPPORT, 3293 ar->ab->wmi_ab.svc_map)) { 3294 param_val |= ATH11K_OBSS_PD_THRESHOLD_IN_DBM; 3295 param_val |= FIELD_PREP(GENMASK(15, 8), srg_th); 3296 } else { 3297 non_srg_th -= ATH11K_DEFAULT_NOISE_FLOOR; 3298 /* SRG not supported and threshold in dB */ 3299 param_val &= ~(ATH11K_OBSS_PD_SRG_EN | 3300 ATH11K_OBSS_PD_THRESHOLD_IN_DBM); 3301 } 3302 3303 param_val |= (non_srg_th & GENMASK(7, 0)); 3304 ret = ath11k_wmi_pdev_set_param(ar, param_id, param_val, pdev_id); 3305 if (ret) { 3306 ath11k_warn(ar->ab, 3307 "failed to set obss_pd_threshold for pdev: %u\n", 3308 pdev_id); 3309 return ret; 3310 } 3311 3312 /* Enable OBSS PD for all access category */ 3313 param_id = WMI_PDEV_PARAM_SET_CMD_OBSS_PD_PER_AC; 3314 param_val = 0xf; 3315 ret = ath11k_wmi_pdev_set_param(ar, param_id, param_val, pdev_id); 3316 if (ret) { 3317 ath11k_warn(ar->ab, 3318 "failed to set obss_pd_per_ac for pdev: %u\n", 3319 pdev_id); 3320 return ret; 3321 } 3322 3323 /* Set SR Prohibit */ 3324 param_id = WMI_PDEV_PARAM_ENABLE_SR_PROHIBIT; 3325 param_val = !!(he_obss_pd->sr_ctrl & 3326 IEEE80211_HE_SPR_HESIGA_SR_VAL15_ALLOWED); 3327 ret = ath11k_wmi_pdev_set_param(ar, param_id, param_val, pdev_id); 3328 if (ret) { 3329 ath11k_warn(ar->ab, "failed to set sr_prohibit for pdev: %u\n", 3330 pdev_id); 3331 return ret; 3332 } 3333 3334 if (!test_bit(WMI_TLV_SERVICE_SRG_SRP_SPATIAL_REUSE_SUPPORT, 3335 ar->ab->wmi_ab.svc_map)) 3336 return 0; 3337 3338 /* Set SRG BSS Color Bitmap */ 3339 memcpy(bitmap, he_obss_pd->bss_color_bitmap, sizeof(bitmap)); 3340 ret = ath11k_wmi_pdev_set_srg_bss_color_bitmap(ar, bitmap); 3341 if (ret) { 3342 ath11k_warn(ar->ab, 3343 "failed to set bss_color_bitmap for pdev: %u\n", 3344 pdev_id); 3345 return ret; 3346 } 3347 3348 /* Set SRG Partial BSSID Bitmap */ 3349 memcpy(bitmap, he_obss_pd->partial_bssid_bitmap, sizeof(bitmap)); 3350 ret = ath11k_wmi_pdev_set_srg_patial_bssid_bitmap(ar, bitmap); 3351 if (ret) { 3352 ath11k_warn(ar->ab, 3353 "failed to set partial_bssid_bitmap for pdev: %u\n", 3354 pdev_id); 3355 return ret; 3356 } 3357 3358 memset(bitmap, 0xff, sizeof(bitmap)); 3359 3360 /* Enable all BSS Colors for SRG */ 3361 ret = ath11k_wmi_pdev_srg_obss_color_enable_bitmap(ar, bitmap); 3362 if (ret) { 3363 ath11k_warn(ar->ab, 3364 "failed to set srg_color_en_bitmap pdev: %u\n", 3365 pdev_id); 3366 return ret; 3367 } 3368 3369 /* Enable all partial BSSID mask for SRG */ 3370 ret = ath11k_wmi_pdev_srg_obss_bssid_enable_bitmap(ar, bitmap); 3371 if (ret) { 3372 ath11k_warn(ar->ab, 3373 "failed to set srg_bssid_en_bitmap pdev: %u\n", 3374 pdev_id); 3375 return ret; 3376 } 3377 3378 /* Enable all BSS Colors for non-SRG */ 3379 ret = ath11k_wmi_pdev_non_srg_obss_color_enable_bitmap(ar, bitmap); 3380 if (ret) { 3381 ath11k_warn(ar->ab, 3382 "failed to set non_srg_color_en_bitmap pdev: %u\n", 3383 pdev_id); 3384 return ret; 3385 } 3386 3387 /* Enable all partial BSSID mask for non-SRG */ 3388 ret = ath11k_wmi_pdev_non_srg_obss_bssid_enable_bitmap(ar, bitmap); 3389 if (ret) { 3390 ath11k_warn(ar->ab, 3391 "failed to set non_srg_bssid_en_bitmap pdev: %u\n", 3392 pdev_id); 3393 return ret; 3394 } 3395 3396 return 0; 3397 } 3398 3399 static void ath11k_mac_op_bss_info_changed(struct ieee80211_hw *hw, 3400 struct ieee80211_vif *vif, 3401 struct ieee80211_bss_conf *info, 3402 u64 changed) 3403 { 3404 struct ath11k *ar = hw->priv; 3405 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); 3406 struct cfg80211_chan_def def; 3407 u32 param_id, param_value; 3408 enum nl80211_band band; 3409 u32 vdev_param; 3410 int mcast_rate; 3411 u32 preamble; 3412 u16 hw_value; 3413 u16 bitrate; 3414 int ret = 0; 3415 u8 rateidx; 3416 u32 rate, param; 3417 u32 ipv4_cnt; 3418 3419 mutex_lock(&ar->conf_mutex); 3420 3421 if (changed & BSS_CHANGED_BEACON_INT) { 3422 arvif->beacon_interval = info->beacon_int; 3423 3424 param_id = WMI_VDEV_PARAM_BEACON_INTERVAL; 3425 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 3426 param_id, 3427 arvif->beacon_interval); 3428 if (ret) 3429 ath11k_warn(ar->ab, "Failed to set beacon interval for VDEV: %d\n", 3430 arvif->vdev_id); 3431 else 3432 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, 3433 "Beacon interval: %d set for VDEV: %d\n", 3434 arvif->beacon_interval, arvif->vdev_id); 3435 } 3436 3437 if (changed & BSS_CHANGED_BEACON) { 3438 param_id = WMI_PDEV_PARAM_BEACON_TX_MODE; 3439 param_value = WMI_BEACON_STAGGERED_MODE; 3440 ret = ath11k_wmi_pdev_set_param(ar, param_id, 3441 param_value, ar->pdev->pdev_id); 3442 if (ret) 3443 ath11k_warn(ar->ab, "Failed to set beacon mode for VDEV: %d\n", 3444 arvif->vdev_id); 3445 else 3446 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, 3447 "Set staggered beacon mode for VDEV: %d\n", 3448 arvif->vdev_id); 3449 3450 if (!arvif->do_not_send_tmpl || !arvif->bcca_zero_sent) { 3451 ret = ath11k_mac_setup_bcn_tmpl(arvif); 3452 if (ret) 3453 ath11k_warn(ar->ab, "failed to update bcn template: %d\n", 3454 ret); 3455 } 3456 3457 if (arvif->bcca_zero_sent) 3458 arvif->do_not_send_tmpl = true; 3459 else 3460 arvif->do_not_send_tmpl = false; 3461 3462 if (vif->bss_conf.he_support) { 3463 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 3464 WMI_VDEV_PARAM_BA_MODE, 3465 WMI_BA_MODE_BUFFER_SIZE_256); 3466 if (ret) 3467 ath11k_warn(ar->ab, 3468 "failed to set BA BUFFER SIZE 256 for vdev: %d\n", 3469 arvif->vdev_id); 3470 else 3471 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, 3472 "Set BA BUFFER SIZE 256 for VDEV: %d\n", 3473 arvif->vdev_id); 3474 } 3475 } 3476 3477 if (changed & (BSS_CHANGED_BEACON_INFO | BSS_CHANGED_BEACON)) { 3478 arvif->dtim_period = info->dtim_period; 3479 3480 param_id = WMI_VDEV_PARAM_DTIM_PERIOD; 3481 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 3482 param_id, 3483 arvif->dtim_period); 3484 3485 if (ret) 3486 ath11k_warn(ar->ab, "Failed to set dtim period for VDEV %d: %i\n", 3487 arvif->vdev_id, ret); 3488 else 3489 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, 3490 "DTIM period: %d set for VDEV: %d\n", 3491 arvif->dtim_period, arvif->vdev_id); 3492 } 3493 3494 if (changed & BSS_CHANGED_SSID && 3495 vif->type == NL80211_IFTYPE_AP) { 3496 arvif->u.ap.ssid_len = vif->cfg.ssid_len; 3497 if (vif->cfg.ssid_len) 3498 memcpy(arvif->u.ap.ssid, vif->cfg.ssid, 3499 vif->cfg.ssid_len); 3500 arvif->u.ap.hidden_ssid = info->hidden_ssid; 3501 } 3502 3503 if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid)) 3504 ether_addr_copy(arvif->bssid, info->bssid); 3505 3506 if (changed & BSS_CHANGED_BEACON_ENABLED) { 3507 if (info->enable_beacon) 3508 ath11k_mac_set_he_txbf_conf(arvif); 3509 ath11k_control_beaconing(arvif, info); 3510 3511 if (arvif->is_up && vif->bss_conf.he_support && 3512 vif->bss_conf.he_oper.params) { 3513 param_id = WMI_VDEV_PARAM_HEOPS_0_31; 3514 param_value = vif->bss_conf.he_oper.params; 3515 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 3516 param_id, param_value); 3517 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, 3518 "he oper param: %x set for VDEV: %d\n", 3519 param_value, arvif->vdev_id); 3520 3521 if (ret) 3522 ath11k_warn(ar->ab, "Failed to set he oper params %x for VDEV %d: %i\n", 3523 param_value, arvif->vdev_id, ret); 3524 } 3525 } 3526 3527 if (changed & BSS_CHANGED_ERP_CTS_PROT) { 3528 u32 cts_prot; 3529 3530 cts_prot = !!(info->use_cts_prot); 3531 param_id = WMI_VDEV_PARAM_PROTECTION_MODE; 3532 3533 if (arvif->is_started) { 3534 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 3535 param_id, cts_prot); 3536 if (ret) 3537 ath11k_warn(ar->ab, "Failed to set CTS prot for VDEV: %d\n", 3538 arvif->vdev_id); 3539 else 3540 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "Set CTS prot: %d for VDEV: %d\n", 3541 cts_prot, arvif->vdev_id); 3542 } else { 3543 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "defer protection mode setup, vdev is not ready yet\n"); 3544 } 3545 } 3546 3547 if (changed & BSS_CHANGED_ERP_SLOT) { 3548 u32 slottime; 3549 3550 if (info->use_short_slot) 3551 slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */ 3552 3553 else 3554 slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */ 3555 3556 param_id = WMI_VDEV_PARAM_SLOT_TIME; 3557 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 3558 param_id, slottime); 3559 if (ret) 3560 ath11k_warn(ar->ab, "Failed to set erp slot for VDEV: %d\n", 3561 arvif->vdev_id); 3562 else 3563 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, 3564 "Set slottime: %d for VDEV: %d\n", 3565 slottime, arvif->vdev_id); 3566 } 3567 3568 if (changed & BSS_CHANGED_ERP_PREAMBLE) { 3569 u32 preamble; 3570 3571 if (info->use_short_preamble) 3572 preamble = WMI_VDEV_PREAMBLE_SHORT; 3573 else 3574 preamble = WMI_VDEV_PREAMBLE_LONG; 3575 3576 param_id = WMI_VDEV_PARAM_PREAMBLE; 3577 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 3578 param_id, preamble); 3579 if (ret) 3580 ath11k_warn(ar->ab, "Failed to set preamble for VDEV: %d\n", 3581 arvif->vdev_id); 3582 else 3583 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, 3584 "Set preamble: %d for VDEV: %d\n", 3585 preamble, arvif->vdev_id); 3586 } 3587 3588 if (changed & BSS_CHANGED_ASSOC) { 3589 if (vif->cfg.assoc) 3590 ath11k_bss_assoc(hw, vif, info); 3591 else 3592 ath11k_bss_disassoc(hw, vif); 3593 } 3594 3595 if (changed & BSS_CHANGED_TXPOWER) { 3596 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev_id %i txpower %d\n", 3597 arvif->vdev_id, info->txpower); 3598 3599 arvif->txpower = info->txpower; 3600 ath11k_mac_txpower_recalc(ar); 3601 } 3602 3603 if (changed & BSS_CHANGED_PS && 3604 ar->ab->hw_params.supports_sta_ps) { 3605 arvif->ps = vif->cfg.ps; 3606 3607 ret = ath11k_mac_config_ps(ar); 3608 if (ret) 3609 ath11k_warn(ar->ab, "failed to setup ps on vdev %i: %d\n", 3610 arvif->vdev_id, ret); 3611 } 3612 3613 if (changed & BSS_CHANGED_MCAST_RATE && 3614 !ath11k_mac_vif_chan(arvif->vif, &def)) { 3615 band = def.chan->band; 3616 mcast_rate = vif->bss_conf.mcast_rate[band]; 3617 3618 if (mcast_rate > 0) 3619 rateidx = mcast_rate - 1; 3620 else 3621 rateidx = ffs(vif->bss_conf.basic_rates) - 1; 3622 3623 if (ar->pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) 3624 rateidx += ATH11K_MAC_FIRST_OFDM_RATE_IDX; 3625 3626 bitrate = ath11k_legacy_rates[rateidx].bitrate; 3627 hw_value = ath11k_legacy_rates[rateidx].hw_value; 3628 3629 if (ath11k_mac_bitrate_is_cck(bitrate)) 3630 preamble = WMI_RATE_PREAMBLE_CCK; 3631 else 3632 preamble = WMI_RATE_PREAMBLE_OFDM; 3633 3634 rate = ATH11K_HW_RATE_CODE(hw_value, 0, preamble); 3635 3636 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, 3637 "vdev %d mcast_rate %x\n", 3638 arvif->vdev_id, rate); 3639 3640 vdev_param = WMI_VDEV_PARAM_MCAST_DATA_RATE; 3641 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 3642 vdev_param, rate); 3643 if (ret) 3644 ath11k_warn(ar->ab, 3645 "failed to set mcast rate on vdev %i: %d\n", 3646 arvif->vdev_id, ret); 3647 3648 vdev_param = WMI_VDEV_PARAM_BCAST_DATA_RATE; 3649 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 3650 vdev_param, rate); 3651 if (ret) 3652 ath11k_warn(ar->ab, 3653 "failed to set bcast rate on vdev %i: %d\n", 3654 arvif->vdev_id, ret); 3655 } 3656 3657 if (changed & BSS_CHANGED_BASIC_RATES && 3658 !ath11k_mac_vif_chan(arvif->vif, &def)) 3659 ath11k_recalculate_mgmt_rate(ar, vif, &def); 3660 3661 if (changed & BSS_CHANGED_TWT) { 3662 struct wmi_twt_enable_params twt_params = {0}; 3663 3664 if (info->twt_requester || info->twt_responder) { 3665 ath11k_wmi_fill_default_twt_params(&twt_params); 3666 ath11k_wmi_send_twt_enable_cmd(ar, ar->pdev->pdev_id, 3667 &twt_params); 3668 } else { 3669 ath11k_wmi_send_twt_disable_cmd(ar, ar->pdev->pdev_id); 3670 } 3671 } 3672 3673 if (changed & BSS_CHANGED_HE_OBSS_PD) 3674 ath11k_mac_config_obss_pd(ar, &info->he_obss_pd); 3675 3676 if (changed & BSS_CHANGED_HE_BSS_COLOR) { 3677 if (vif->type == NL80211_IFTYPE_AP) { 3678 ret = ath11k_wmi_send_obss_color_collision_cfg_cmd( 3679 ar, arvif->vdev_id, info->he_bss_color.color, 3680 ATH11K_BSS_COLOR_COLLISION_DETECTION_AP_PERIOD_MS, 3681 info->he_bss_color.enabled); 3682 if (ret) 3683 ath11k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n", 3684 arvif->vdev_id, ret); 3685 3686 param_id = WMI_VDEV_PARAM_BSS_COLOR; 3687 if (info->he_bss_color.enabled) 3688 param_value = info->he_bss_color.color << 3689 IEEE80211_HE_OPERATION_BSS_COLOR_OFFSET; 3690 else 3691 param_value = IEEE80211_HE_OPERATION_BSS_COLOR_DISABLED; 3692 3693 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 3694 param_id, 3695 param_value); 3696 if (ret) 3697 ath11k_warn(ar->ab, 3698 "failed to set bss color param on vdev %i: %d\n", 3699 arvif->vdev_id, ret); 3700 3701 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, 3702 "bss color param 0x%x set on vdev %i\n", 3703 param_value, arvif->vdev_id); 3704 } else if (vif->type == NL80211_IFTYPE_STATION) { 3705 ret = ath11k_wmi_send_bss_color_change_enable_cmd(ar, 3706 arvif->vdev_id, 3707 1); 3708 if (ret) 3709 ath11k_warn(ar->ab, "failed to enable bss color change on vdev %i: %d\n", 3710 arvif->vdev_id, ret); 3711 ret = ath11k_wmi_send_obss_color_collision_cfg_cmd( 3712 ar, arvif->vdev_id, 0, 3713 ATH11K_BSS_COLOR_COLLISION_DETECTION_STA_PERIOD_MS, 1); 3714 if (ret) 3715 ath11k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n", 3716 arvif->vdev_id, ret); 3717 } 3718 } 3719 3720 if (changed & BSS_CHANGED_FTM_RESPONDER && 3721 arvif->ftm_responder != info->ftm_responder && 3722 test_bit(WMI_TLV_SERVICE_RTT, ar->ab->wmi_ab.svc_map) && 3723 (vif->type == NL80211_IFTYPE_AP || 3724 vif->type == NL80211_IFTYPE_MESH_POINT)) { 3725 arvif->ftm_responder = info->ftm_responder; 3726 param = WMI_VDEV_PARAM_ENABLE_DISABLE_RTT_RESPONDER_ROLE; 3727 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, 3728 arvif->ftm_responder); 3729 if (ret) 3730 ath11k_warn(ar->ab, "Failed to set ftm responder %i: %d\n", 3731 arvif->vdev_id, ret); 3732 } 3733 3734 if (changed & BSS_CHANGED_FILS_DISCOVERY || 3735 changed & BSS_CHANGED_UNSOL_BCAST_PROBE_RESP) 3736 ath11k_mac_fils_discovery(arvif, info); 3737 3738 if (changed & BSS_CHANGED_ARP_FILTER) { 3739 ipv4_cnt = min(vif->cfg.arp_addr_cnt, ATH11K_IPV4_MAX_COUNT); 3740 memcpy(arvif->arp_ns_offload.ipv4_addr, 3741 vif->cfg.arp_addr_list, 3742 ipv4_cnt * sizeof(u32)); 3743 memcpy(arvif->arp_ns_offload.mac_addr, vif->addr, ETH_ALEN); 3744 arvif->arp_ns_offload.ipv4_count = ipv4_cnt; 3745 3746 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "arp_addr_cnt %d vif->addr %pM, offload_addr %pI4\n", 3747 vif->cfg.arp_addr_cnt, 3748 vif->addr, arvif->arp_ns_offload.ipv4_addr); 3749 } 3750 3751 mutex_unlock(&ar->conf_mutex); 3752 } 3753 3754 void __ath11k_mac_scan_finish(struct ath11k *ar) 3755 { 3756 lockdep_assert_held(&ar->data_lock); 3757 3758 switch (ar->scan.state) { 3759 case ATH11K_SCAN_IDLE: 3760 break; 3761 case ATH11K_SCAN_RUNNING: 3762 case ATH11K_SCAN_ABORTING: 3763 if (ar->scan.is_roc && ar->scan.roc_notify) 3764 ieee80211_remain_on_channel_expired(ar->hw); 3765 fallthrough; 3766 case ATH11K_SCAN_STARTING: 3767 if (!ar->scan.is_roc) { 3768 struct cfg80211_scan_info info = { 3769 .aborted = ((ar->scan.state == 3770 ATH11K_SCAN_ABORTING) || 3771 (ar->scan.state == 3772 ATH11K_SCAN_STARTING)), 3773 }; 3774 3775 ieee80211_scan_completed(ar->hw, &info); 3776 } 3777 3778 ar->scan.state = ATH11K_SCAN_IDLE; 3779 ar->scan_channel = NULL; 3780 ar->scan.roc_freq = 0; 3781 cancel_delayed_work(&ar->scan.timeout); 3782 complete_all(&ar->scan.completed); 3783 break; 3784 } 3785 } 3786 3787 void ath11k_mac_scan_finish(struct ath11k *ar) 3788 { 3789 spin_lock_bh(&ar->data_lock); 3790 __ath11k_mac_scan_finish(ar); 3791 spin_unlock_bh(&ar->data_lock); 3792 } 3793 3794 static int ath11k_scan_stop(struct ath11k *ar) 3795 { 3796 struct scan_cancel_param arg = { 3797 .req_type = WLAN_SCAN_CANCEL_SINGLE, 3798 .scan_id = ATH11K_SCAN_ID, 3799 }; 3800 int ret; 3801 3802 lockdep_assert_held(&ar->conf_mutex); 3803 3804 /* TODO: Fill other STOP Params */ 3805 arg.pdev_id = ar->pdev->pdev_id; 3806 3807 ret = ath11k_wmi_send_scan_stop_cmd(ar, &arg); 3808 if (ret) { 3809 ath11k_warn(ar->ab, "failed to stop wmi scan: %d\n", ret); 3810 goto out; 3811 } 3812 3813 ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ); 3814 if (ret == 0) { 3815 ath11k_warn(ar->ab, 3816 "failed to receive scan abort comple: timed out\n"); 3817 ret = -ETIMEDOUT; 3818 } else if (ret > 0) { 3819 ret = 0; 3820 } 3821 3822 out: 3823 /* Scan state should be updated upon scan completion but in case 3824 * firmware fails to deliver the event (for whatever reason) it is 3825 * desired to clean up scan state anyway. Firmware may have just 3826 * dropped the scan completion event delivery due to transport pipe 3827 * being overflown with data and/or it can recover on its own before 3828 * next scan request is submitted. 3829 */ 3830 spin_lock_bh(&ar->data_lock); 3831 if (ar->scan.state != ATH11K_SCAN_IDLE) 3832 __ath11k_mac_scan_finish(ar); 3833 spin_unlock_bh(&ar->data_lock); 3834 3835 return ret; 3836 } 3837 3838 static void ath11k_scan_abort(struct ath11k *ar) 3839 { 3840 int ret; 3841 3842 lockdep_assert_held(&ar->conf_mutex); 3843 3844 spin_lock_bh(&ar->data_lock); 3845 3846 switch (ar->scan.state) { 3847 case ATH11K_SCAN_IDLE: 3848 /* This can happen if timeout worker kicked in and called 3849 * abortion while scan completion was being processed. 3850 */ 3851 break; 3852 case ATH11K_SCAN_STARTING: 3853 case ATH11K_SCAN_ABORTING: 3854 ath11k_warn(ar->ab, "refusing scan abortion due to invalid scan state: %d\n", 3855 ar->scan.state); 3856 break; 3857 case ATH11K_SCAN_RUNNING: 3858 ar->scan.state = ATH11K_SCAN_ABORTING; 3859 spin_unlock_bh(&ar->data_lock); 3860 3861 ret = ath11k_scan_stop(ar); 3862 if (ret) 3863 ath11k_warn(ar->ab, "failed to abort scan: %d\n", ret); 3864 3865 spin_lock_bh(&ar->data_lock); 3866 break; 3867 } 3868 3869 spin_unlock_bh(&ar->data_lock); 3870 } 3871 3872 static void ath11k_scan_timeout_work(struct work_struct *work) 3873 { 3874 struct ath11k *ar = container_of(work, struct ath11k, 3875 scan.timeout.work); 3876 3877 mutex_lock(&ar->conf_mutex); 3878 ath11k_scan_abort(ar); 3879 mutex_unlock(&ar->conf_mutex); 3880 } 3881 3882 static int ath11k_start_scan(struct ath11k *ar, 3883 struct scan_req_params *arg) 3884 { 3885 int ret; 3886 unsigned long timeout = 1 * HZ; 3887 3888 lockdep_assert_held(&ar->conf_mutex); 3889 3890 if (ath11k_spectral_get_mode(ar) == ATH11K_SPECTRAL_BACKGROUND) 3891 ath11k_spectral_reset_buffer(ar); 3892 3893 ret = ath11k_wmi_send_scan_start_cmd(ar, arg); 3894 if (ret) 3895 return ret; 3896 3897 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map)) { 3898 timeout = 5 * HZ; 3899 3900 if (ar->supports_6ghz) 3901 timeout += 5 * HZ; 3902 } 3903 3904 ret = wait_for_completion_timeout(&ar->scan.started, timeout); 3905 if (ret == 0) { 3906 ret = ath11k_scan_stop(ar); 3907 if (ret) 3908 ath11k_warn(ar->ab, "failed to stop scan: %d\n", ret); 3909 3910 return -ETIMEDOUT; 3911 } 3912 3913 /* If we failed to start the scan, return error code at 3914 * this point. This is probably due to some issue in the 3915 * firmware, but no need to wedge the driver due to that... 3916 */ 3917 spin_lock_bh(&ar->data_lock); 3918 if (ar->scan.state == ATH11K_SCAN_IDLE) { 3919 spin_unlock_bh(&ar->data_lock); 3920 return -EINVAL; 3921 } 3922 spin_unlock_bh(&ar->data_lock); 3923 3924 return 0; 3925 } 3926 3927 static int ath11k_mac_op_hw_scan(struct ieee80211_hw *hw, 3928 struct ieee80211_vif *vif, 3929 struct ieee80211_scan_request *hw_req) 3930 { 3931 struct ath11k *ar = hw->priv; 3932 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); 3933 struct cfg80211_scan_request *req = &hw_req->req; 3934 struct scan_req_params *arg = NULL; 3935 int ret = 0; 3936 int i; 3937 u32 scan_timeout; 3938 3939 /* Firmwares advertising the support of triggering 11D algorithm 3940 * on the scan results of a regular scan expects driver to send 3941 * WMI_11D_SCAN_START_CMDID before sending WMI_START_SCAN_CMDID. 3942 * With this feature, separate 11D scan can be avoided since 3943 * regdomain can be determined with the scan results of the 3944 * regular scan. 3945 */ 3946 if (ar->state_11d == ATH11K_11D_PREPARING && 3947 test_bit(WMI_TLV_SERVICE_SUPPORT_11D_FOR_HOST_SCAN, 3948 ar->ab->wmi_ab.svc_map)) 3949 ath11k_mac_11d_scan_start(ar, arvif->vdev_id); 3950 3951 mutex_lock(&ar->conf_mutex); 3952 3953 spin_lock_bh(&ar->data_lock); 3954 switch (ar->scan.state) { 3955 case ATH11K_SCAN_IDLE: 3956 reinit_completion(&ar->scan.started); 3957 reinit_completion(&ar->scan.completed); 3958 ar->scan.state = ATH11K_SCAN_STARTING; 3959 ar->scan.is_roc = false; 3960 ar->scan.vdev_id = arvif->vdev_id; 3961 ret = 0; 3962 break; 3963 case ATH11K_SCAN_STARTING: 3964 case ATH11K_SCAN_RUNNING: 3965 case ATH11K_SCAN_ABORTING: 3966 ret = -EBUSY; 3967 break; 3968 } 3969 spin_unlock_bh(&ar->data_lock); 3970 3971 if (ret) 3972 goto exit; 3973 3974 arg = kzalloc(sizeof(*arg), GFP_KERNEL); 3975 3976 if (!arg) { 3977 ret = -ENOMEM; 3978 goto exit; 3979 } 3980 3981 ath11k_wmi_start_scan_init(ar, arg); 3982 arg->vdev_id = arvif->vdev_id; 3983 arg->scan_id = ATH11K_SCAN_ID; 3984 3985 if (req->ie_len) { 3986 arg->extraie.ptr = kmemdup(req->ie, req->ie_len, GFP_KERNEL); 3987 if (!arg->extraie.ptr) { 3988 ret = -ENOMEM; 3989 goto exit; 3990 } 3991 arg->extraie.len = req->ie_len; 3992 } 3993 3994 if (req->n_ssids) { 3995 arg->num_ssids = req->n_ssids; 3996 for (i = 0; i < arg->num_ssids; i++) { 3997 arg->ssid[i].length = req->ssids[i].ssid_len; 3998 memcpy(&arg->ssid[i].ssid, req->ssids[i].ssid, 3999 req->ssids[i].ssid_len); 4000 } 4001 } else { 4002 arg->scan_flags |= WMI_SCAN_FLAG_PASSIVE; 4003 } 4004 4005 if (req->n_channels) { 4006 arg->num_chan = req->n_channels; 4007 arg->chan_list = kcalloc(arg->num_chan, sizeof(*arg->chan_list), 4008 GFP_KERNEL); 4009 4010 if (!arg->chan_list) { 4011 ret = -ENOMEM; 4012 goto exit; 4013 } 4014 4015 for (i = 0; i < arg->num_chan; i++) { 4016 if (test_bit(WMI_TLV_SERVICE_SCAN_CONFIG_PER_CHANNEL, 4017 ar->ab->wmi_ab.svc_map)) { 4018 arg->chan_list[i] = 4019 u32_encode_bits(req->channels[i]->center_freq, 4020 WMI_SCAN_CONFIG_PER_CHANNEL_MASK); 4021 4022 /* If NL80211_SCAN_FLAG_COLOCATED_6GHZ is set in scan 4023 * flags, then scan all PSC channels in 6 GHz band and 4024 * those non-PSC channels where RNR IE is found during 4025 * the legacy 2.4/5 GHz scan. 4026 * If NL80211_SCAN_FLAG_COLOCATED_6GHZ is not set, 4027 * then all channels in 6 GHz will be scanned. 4028 */ 4029 if (req->channels[i]->band == NL80211_BAND_6GHZ && 4030 req->flags & NL80211_SCAN_FLAG_COLOCATED_6GHZ && 4031 !cfg80211_channel_is_psc(req->channels[i])) 4032 arg->chan_list[i] |= 4033 WMI_SCAN_CH_FLAG_SCAN_ONLY_IF_RNR_FOUND; 4034 } else { 4035 arg->chan_list[i] = req->channels[i]->center_freq; 4036 } 4037 } 4038 } 4039 4040 if (req->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) { 4041 arg->scan_f_add_spoofed_mac_in_probe = 1; 4042 ether_addr_copy(arg->mac_addr.addr, req->mac_addr); 4043 ether_addr_copy(arg->mac_mask.addr, req->mac_addr_mask); 4044 } 4045 4046 /* if duration is set, default dwell times will be overwritten */ 4047 if (req->duration) { 4048 arg->dwell_time_active = req->duration; 4049 arg->dwell_time_active_2g = req->duration; 4050 arg->dwell_time_active_6g = req->duration; 4051 arg->dwell_time_passive = req->duration; 4052 arg->dwell_time_passive_6g = req->duration; 4053 arg->burst_duration = req->duration; 4054 4055 scan_timeout = min_t(u32, arg->max_rest_time * 4056 (arg->num_chan - 1) + (req->duration + 4057 ATH11K_SCAN_CHANNEL_SWITCH_WMI_EVT_OVERHEAD) * 4058 arg->num_chan, arg->max_scan_time); 4059 } else { 4060 scan_timeout = arg->max_scan_time; 4061 } 4062 4063 /* Add a margin to account for event/command processing */ 4064 scan_timeout += ATH11K_MAC_SCAN_CMD_EVT_OVERHEAD; 4065 4066 ret = ath11k_start_scan(ar, arg); 4067 if (ret) { 4068 ath11k_warn(ar->ab, "failed to start hw scan: %d\n", ret); 4069 spin_lock_bh(&ar->data_lock); 4070 ar->scan.state = ATH11K_SCAN_IDLE; 4071 spin_unlock_bh(&ar->data_lock); 4072 } 4073 4074 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout, 4075 msecs_to_jiffies(scan_timeout)); 4076 4077 exit: 4078 if (arg) { 4079 kfree(arg->chan_list); 4080 kfree(arg->extraie.ptr); 4081 kfree(arg); 4082 } 4083 4084 mutex_unlock(&ar->conf_mutex); 4085 4086 if (ar->state_11d == ATH11K_11D_PREPARING) 4087 ath11k_mac_11d_scan_start(ar, arvif->vdev_id); 4088 4089 return ret; 4090 } 4091 4092 static void ath11k_mac_op_cancel_hw_scan(struct ieee80211_hw *hw, 4093 struct ieee80211_vif *vif) 4094 { 4095 struct ath11k *ar = hw->priv; 4096 4097 mutex_lock(&ar->conf_mutex); 4098 ath11k_scan_abort(ar); 4099 mutex_unlock(&ar->conf_mutex); 4100 4101 cancel_delayed_work_sync(&ar->scan.timeout); 4102 } 4103 4104 static int ath11k_install_key(struct ath11k_vif *arvif, 4105 struct ieee80211_key_conf *key, 4106 enum set_key_cmd cmd, 4107 const u8 *macaddr, u32 flags) 4108 { 4109 int ret; 4110 struct ath11k *ar = arvif->ar; 4111 struct wmi_vdev_install_key_arg arg = { 4112 .vdev_id = arvif->vdev_id, 4113 .key_idx = key->keyidx, 4114 .key_len = key->keylen, 4115 .key_data = key->key, 4116 .key_flags = flags, 4117 .macaddr = macaddr, 4118 }; 4119 4120 lockdep_assert_held(&arvif->ar->conf_mutex); 4121 4122 reinit_completion(&ar->install_key_done); 4123 4124 if (test_bit(ATH11K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags)) 4125 return 0; 4126 4127 if (cmd == DISABLE_KEY) { 4128 arg.key_cipher = WMI_CIPHER_NONE; 4129 arg.key_data = NULL; 4130 goto install; 4131 } 4132 4133 switch (key->cipher) { 4134 case WLAN_CIPHER_SUITE_CCMP: 4135 arg.key_cipher = WMI_CIPHER_AES_CCM; 4136 /* TODO: Re-check if flag is valid */ 4137 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT; 4138 break; 4139 case WLAN_CIPHER_SUITE_TKIP: 4140 arg.key_cipher = WMI_CIPHER_TKIP; 4141 arg.key_txmic_len = 8; 4142 arg.key_rxmic_len = 8; 4143 break; 4144 case WLAN_CIPHER_SUITE_CCMP_256: 4145 arg.key_cipher = WMI_CIPHER_AES_CCM; 4146 break; 4147 case WLAN_CIPHER_SUITE_GCMP: 4148 case WLAN_CIPHER_SUITE_GCMP_256: 4149 arg.key_cipher = WMI_CIPHER_AES_GCM; 4150 break; 4151 default: 4152 ath11k_warn(ar->ab, "cipher %d is not supported\n", key->cipher); 4153 return -EOPNOTSUPP; 4154 } 4155 4156 if (test_bit(ATH11K_FLAG_RAW_MODE, &ar->ab->dev_flags)) 4157 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV | 4158 IEEE80211_KEY_FLAG_RESERVE_TAILROOM; 4159 4160 install: 4161 ret = ath11k_wmi_vdev_install_key(arvif->ar, &arg); 4162 4163 if (ret) 4164 return ret; 4165 4166 if (!wait_for_completion_timeout(&ar->install_key_done, 1 * HZ)) 4167 return -ETIMEDOUT; 4168 4169 return ar->install_key_status ? -EINVAL : 0; 4170 } 4171 4172 static int ath11k_clear_peer_keys(struct ath11k_vif *arvif, 4173 const u8 *addr) 4174 { 4175 struct ath11k *ar = arvif->ar; 4176 struct ath11k_base *ab = ar->ab; 4177 struct ath11k_peer *peer; 4178 int first_errno = 0; 4179 int ret; 4180 int i; 4181 u32 flags = 0; 4182 4183 lockdep_assert_held(&ar->conf_mutex); 4184 4185 spin_lock_bh(&ab->base_lock); 4186 peer = ath11k_peer_find(ab, arvif->vdev_id, addr); 4187 spin_unlock_bh(&ab->base_lock); 4188 4189 if (!peer) 4190 return -ENOENT; 4191 4192 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) { 4193 if (!peer->keys[i]) 4194 continue; 4195 4196 /* key flags are not required to delete the key */ 4197 ret = ath11k_install_key(arvif, peer->keys[i], 4198 DISABLE_KEY, addr, flags); 4199 if (ret < 0 && first_errno == 0) 4200 first_errno = ret; 4201 4202 if (ret < 0) 4203 ath11k_warn(ab, "failed to remove peer key %d: %d\n", 4204 i, ret); 4205 4206 spin_lock_bh(&ab->base_lock); 4207 peer->keys[i] = NULL; 4208 spin_unlock_bh(&ab->base_lock); 4209 } 4210 4211 return first_errno; 4212 } 4213 4214 static int ath11k_mac_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd, 4215 struct ieee80211_vif *vif, struct ieee80211_sta *sta, 4216 struct ieee80211_key_conf *key) 4217 { 4218 struct ath11k *ar = hw->priv; 4219 struct ath11k_base *ab = ar->ab; 4220 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); 4221 struct ath11k_peer *peer; 4222 struct ath11k_sta *arsta; 4223 const u8 *peer_addr; 4224 int ret = 0; 4225 u32 flags = 0; 4226 4227 /* BIP needs to be done in software */ 4228 if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC || 4229 key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_128 || 4230 key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_256 || 4231 key->cipher == WLAN_CIPHER_SUITE_BIP_CMAC_256) 4232 return 1; 4233 4234 if (test_bit(ATH11K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags)) 4235 return 1; 4236 4237 if (key->keyidx > WMI_MAX_KEY_INDEX) 4238 return -ENOSPC; 4239 4240 mutex_lock(&ar->conf_mutex); 4241 4242 if (sta) 4243 peer_addr = sta->addr; 4244 else if (arvif->vdev_type == WMI_VDEV_TYPE_STA) 4245 peer_addr = vif->bss_conf.bssid; 4246 else 4247 peer_addr = vif->addr; 4248 4249 key->hw_key_idx = key->keyidx; 4250 4251 /* the peer should not disappear in mid-way (unless FW goes awry) since 4252 * we already hold conf_mutex. we just make sure its there now. 4253 */ 4254 spin_lock_bh(&ab->base_lock); 4255 peer = ath11k_peer_find(ab, arvif->vdev_id, peer_addr); 4256 4257 /* flush the fragments cache during key (re)install to 4258 * ensure all frags in the new frag list belong to the same key. 4259 */ 4260 if (peer && sta && cmd == SET_KEY) 4261 ath11k_peer_frags_flush(ar, peer); 4262 spin_unlock_bh(&ab->base_lock); 4263 4264 if (!peer) { 4265 if (cmd == SET_KEY) { 4266 ath11k_warn(ab, "cannot install key for non-existent peer %pM\n", 4267 peer_addr); 4268 ret = -EOPNOTSUPP; 4269 goto exit; 4270 } else { 4271 /* if the peer doesn't exist there is no key to disable 4272 * anymore 4273 */ 4274 goto exit; 4275 } 4276 } 4277 4278 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) 4279 flags |= WMI_KEY_PAIRWISE; 4280 else 4281 flags |= WMI_KEY_GROUP; 4282 4283 ret = ath11k_install_key(arvif, key, cmd, peer_addr, flags); 4284 if (ret) { 4285 ath11k_warn(ab, "ath11k_install_key failed (%d)\n", ret); 4286 goto exit; 4287 } 4288 4289 ret = ath11k_dp_peer_rx_pn_replay_config(arvif, peer_addr, cmd, key); 4290 if (ret) { 4291 ath11k_warn(ab, "failed to offload PN replay detection %d\n", ret); 4292 goto exit; 4293 } 4294 4295 spin_lock_bh(&ab->base_lock); 4296 peer = ath11k_peer_find(ab, arvif->vdev_id, peer_addr); 4297 if (peer && cmd == SET_KEY) { 4298 peer->keys[key->keyidx] = key; 4299 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) { 4300 peer->ucast_keyidx = key->keyidx; 4301 peer->sec_type = ath11k_dp_tx_get_encrypt_type(key->cipher); 4302 } else { 4303 peer->mcast_keyidx = key->keyidx; 4304 peer->sec_type_grp = ath11k_dp_tx_get_encrypt_type(key->cipher); 4305 } 4306 } else if (peer && cmd == DISABLE_KEY) { 4307 peer->keys[key->keyidx] = NULL; 4308 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) 4309 peer->ucast_keyidx = 0; 4310 else 4311 peer->mcast_keyidx = 0; 4312 } else if (!peer) 4313 /* impossible unless FW goes crazy */ 4314 ath11k_warn(ab, "peer %pM disappeared!\n", peer_addr); 4315 4316 if (sta) { 4317 arsta = (struct ath11k_sta *)sta->drv_priv; 4318 4319 switch (key->cipher) { 4320 case WLAN_CIPHER_SUITE_TKIP: 4321 case WLAN_CIPHER_SUITE_CCMP: 4322 case WLAN_CIPHER_SUITE_CCMP_256: 4323 case WLAN_CIPHER_SUITE_GCMP: 4324 case WLAN_CIPHER_SUITE_GCMP_256: 4325 if (cmd == SET_KEY) 4326 arsta->pn_type = HAL_PN_TYPE_WPA; 4327 else 4328 arsta->pn_type = HAL_PN_TYPE_NONE; 4329 break; 4330 default: 4331 arsta->pn_type = HAL_PN_TYPE_NONE; 4332 break; 4333 } 4334 } 4335 4336 spin_unlock_bh(&ab->base_lock); 4337 4338 exit: 4339 mutex_unlock(&ar->conf_mutex); 4340 return ret; 4341 } 4342 4343 static int 4344 ath11k_mac_bitrate_mask_num_ht_rates(struct ath11k *ar, 4345 enum nl80211_band band, 4346 const struct cfg80211_bitrate_mask *mask) 4347 { 4348 int num_rates = 0; 4349 int i; 4350 4351 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) 4352 num_rates += hweight8(mask->control[band].ht_mcs[i]); 4353 4354 return num_rates; 4355 } 4356 4357 static int 4358 ath11k_mac_bitrate_mask_num_vht_rates(struct ath11k *ar, 4359 enum nl80211_band band, 4360 const struct cfg80211_bitrate_mask *mask) 4361 { 4362 int num_rates = 0; 4363 int i; 4364 4365 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) 4366 num_rates += hweight16(mask->control[band].vht_mcs[i]); 4367 4368 return num_rates; 4369 } 4370 4371 static int 4372 ath11k_mac_bitrate_mask_num_he_rates(struct ath11k *ar, 4373 enum nl80211_band band, 4374 const struct cfg80211_bitrate_mask *mask) 4375 { 4376 int num_rates = 0; 4377 int i; 4378 4379 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) 4380 num_rates += hweight16(mask->control[band].he_mcs[i]); 4381 4382 return num_rates; 4383 } 4384 4385 static int 4386 ath11k_mac_set_peer_vht_fixed_rate(struct ath11k_vif *arvif, 4387 struct ieee80211_sta *sta, 4388 const struct cfg80211_bitrate_mask *mask, 4389 enum nl80211_band band) 4390 { 4391 struct ath11k *ar = arvif->ar; 4392 u8 vht_rate, nss; 4393 u32 rate_code; 4394 int ret, i; 4395 4396 lockdep_assert_held(&ar->conf_mutex); 4397 4398 nss = 0; 4399 4400 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) { 4401 if (hweight16(mask->control[band].vht_mcs[i]) == 1) { 4402 nss = i + 1; 4403 vht_rate = ffs(mask->control[band].vht_mcs[i]) - 1; 4404 } 4405 } 4406 4407 if (!nss) { 4408 ath11k_warn(ar->ab, "No single VHT Fixed rate found to set for %pM", 4409 sta->addr); 4410 return -EINVAL; 4411 } 4412 4413 /* Avoid updating invalid nss as fixed rate*/ 4414 if (nss > sta->deflink.rx_nss) 4415 return -EINVAL; 4416 4417 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, 4418 "Setting Fixed VHT Rate for peer %pM. Device will not switch to any other selected rates", 4419 sta->addr); 4420 4421 rate_code = ATH11K_HW_RATE_CODE(vht_rate, nss - 1, 4422 WMI_RATE_PREAMBLE_VHT); 4423 ret = ath11k_wmi_set_peer_param(ar, sta->addr, 4424 arvif->vdev_id, 4425 WMI_PEER_PARAM_FIXED_RATE, 4426 rate_code); 4427 if (ret) 4428 ath11k_warn(ar->ab, 4429 "failed to update STA %pM Fixed Rate %d: %d\n", 4430 sta->addr, rate_code, ret); 4431 4432 return ret; 4433 } 4434 4435 static int 4436 ath11k_mac_set_peer_he_fixed_rate(struct ath11k_vif *arvif, 4437 struct ieee80211_sta *sta, 4438 const struct cfg80211_bitrate_mask *mask, 4439 enum nl80211_band band) 4440 { 4441 struct ath11k *ar = arvif->ar; 4442 u8 he_rate, nss; 4443 u32 rate_code; 4444 int ret, i; 4445 4446 lockdep_assert_held(&ar->conf_mutex); 4447 4448 nss = 0; 4449 4450 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) { 4451 if (hweight16(mask->control[band].he_mcs[i]) == 1) { 4452 nss = i + 1; 4453 he_rate = ffs(mask->control[band].he_mcs[i]) - 1; 4454 } 4455 } 4456 4457 if (!nss) { 4458 ath11k_warn(ar->ab, "No single he fixed rate found to set for %pM", 4459 sta->addr); 4460 return -EINVAL; 4461 } 4462 4463 /* Avoid updating invalid nss as fixed rate */ 4464 if (nss > sta->deflink.rx_nss) 4465 return -EINVAL; 4466 4467 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, 4468 "setting fixed he rate for peer %pM, device will not switch to any other selected rates", 4469 sta->addr); 4470 4471 rate_code = ATH11K_HW_RATE_CODE(he_rate, nss - 1, 4472 WMI_RATE_PREAMBLE_HE); 4473 4474 ret = ath11k_wmi_set_peer_param(ar, sta->addr, 4475 arvif->vdev_id, 4476 WMI_PEER_PARAM_FIXED_RATE, 4477 rate_code); 4478 if (ret) 4479 ath11k_warn(ar->ab, 4480 "failed to update sta %pM fixed rate %d: %d\n", 4481 sta->addr, rate_code, ret); 4482 4483 return ret; 4484 } 4485 4486 static int 4487 ath11k_mac_set_peer_ht_fixed_rate(struct ath11k_vif *arvif, 4488 struct ieee80211_sta *sta, 4489 const struct cfg80211_bitrate_mask *mask, 4490 enum nl80211_band band) 4491 { 4492 struct ath11k *ar = arvif->ar; 4493 u8 ht_rate, nss = 0; 4494 u32 rate_code; 4495 int ret, i; 4496 4497 lockdep_assert_held(&ar->conf_mutex); 4498 4499 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) { 4500 if (hweight8(mask->control[band].ht_mcs[i]) == 1) { 4501 nss = i + 1; 4502 ht_rate = ffs(mask->control[band].ht_mcs[i]) - 1; 4503 } 4504 } 4505 4506 if (!nss) { 4507 ath11k_warn(ar->ab, "No single HT Fixed rate found to set for %pM", 4508 sta->addr); 4509 return -EINVAL; 4510 } 4511 4512 /* Avoid updating invalid nss as fixed rate*/ 4513 if (nss > sta->deflink.rx_nss) 4514 return -EINVAL; 4515 4516 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, 4517 "Setting Fixed HT Rate for peer %pM. Device will not switch to any other selected rates", 4518 sta->addr); 4519 4520 rate_code = ATH11K_HW_RATE_CODE(ht_rate, nss - 1, 4521 WMI_RATE_PREAMBLE_HT); 4522 ret = ath11k_wmi_set_peer_param(ar, sta->addr, 4523 arvif->vdev_id, 4524 WMI_PEER_PARAM_FIXED_RATE, 4525 rate_code); 4526 if (ret) 4527 ath11k_warn(ar->ab, 4528 "failed to update STA %pM HT Fixed Rate %d: %d\n", 4529 sta->addr, rate_code, ret); 4530 4531 return ret; 4532 } 4533 4534 static int ath11k_station_assoc(struct ath11k *ar, 4535 struct ieee80211_vif *vif, 4536 struct ieee80211_sta *sta, 4537 bool reassoc) 4538 { 4539 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); 4540 struct peer_assoc_params peer_arg; 4541 int ret = 0; 4542 struct cfg80211_chan_def def; 4543 enum nl80211_band band; 4544 struct cfg80211_bitrate_mask *mask; 4545 u8 num_ht_rates, num_vht_rates, num_he_rates; 4546 4547 lockdep_assert_held(&ar->conf_mutex); 4548 4549 if (WARN_ON(ath11k_mac_vif_chan(vif, &def))) 4550 return -EPERM; 4551 4552 band = def.chan->band; 4553 mask = &arvif->bitrate_mask; 4554 4555 ath11k_peer_assoc_prepare(ar, vif, sta, &peer_arg, reassoc); 4556 4557 peer_arg.is_assoc = true; 4558 ret = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg); 4559 if (ret) { 4560 ath11k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n", 4561 sta->addr, arvif->vdev_id, ret); 4562 return ret; 4563 } 4564 4565 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) { 4566 ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n", 4567 sta->addr, arvif->vdev_id); 4568 return -ETIMEDOUT; 4569 } 4570 4571 num_vht_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band, mask); 4572 num_he_rates = ath11k_mac_bitrate_mask_num_he_rates(ar, band, mask); 4573 num_ht_rates = ath11k_mac_bitrate_mask_num_ht_rates(ar, band, mask); 4574 4575 /* If single VHT/HE rate is configured (by set_bitrate_mask()), 4576 * peer_assoc will disable VHT/HE. This is now enabled by a peer specific 4577 * fixed param. 4578 * Note that all other rates and NSS will be disabled for this peer. 4579 */ 4580 if (sta->deflink.vht_cap.vht_supported && num_vht_rates == 1) { 4581 ret = ath11k_mac_set_peer_vht_fixed_rate(arvif, sta, mask, 4582 band); 4583 if (ret) 4584 return ret; 4585 } else if (sta->deflink.he_cap.has_he && num_he_rates == 1) { 4586 ret = ath11k_mac_set_peer_he_fixed_rate(arvif, sta, mask, 4587 band); 4588 if (ret) 4589 return ret; 4590 } else if (sta->deflink.ht_cap.ht_supported && num_ht_rates == 1) { 4591 ret = ath11k_mac_set_peer_ht_fixed_rate(arvif, sta, mask, 4592 band); 4593 if (ret) 4594 return ret; 4595 } 4596 4597 /* Re-assoc is run only to update supported rates for given station. It 4598 * doesn't make much sense to reconfigure the peer completely. 4599 */ 4600 if (reassoc) 4601 return 0; 4602 4603 ret = ath11k_setup_peer_smps(ar, arvif, sta->addr, 4604 &sta->deflink.ht_cap, 4605 le16_to_cpu(sta->deflink.he_6ghz_capa.capa)); 4606 if (ret) { 4607 ath11k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n", 4608 arvif->vdev_id, ret); 4609 return ret; 4610 } 4611 4612 if (!sta->wme) { 4613 arvif->num_legacy_stations++; 4614 ret = ath11k_recalc_rtscts_prot(arvif); 4615 if (ret) 4616 return ret; 4617 } 4618 4619 if (sta->wme && sta->uapsd_queues) { 4620 ret = ath11k_peer_assoc_qos_ap(ar, arvif, sta); 4621 if (ret) { 4622 ath11k_warn(ar->ab, "failed to set qos params for STA %pM for vdev %i: %d\n", 4623 sta->addr, arvif->vdev_id, ret); 4624 return ret; 4625 } 4626 } 4627 4628 return 0; 4629 } 4630 4631 static int ath11k_station_disassoc(struct ath11k *ar, 4632 struct ieee80211_vif *vif, 4633 struct ieee80211_sta *sta) 4634 { 4635 struct ath11k_vif *arvif = (void *)vif->drv_priv; 4636 int ret = 0; 4637 4638 lockdep_assert_held(&ar->conf_mutex); 4639 4640 if (!sta->wme) { 4641 arvif->num_legacy_stations--; 4642 ret = ath11k_recalc_rtscts_prot(arvif); 4643 if (ret) 4644 return ret; 4645 } 4646 4647 ret = ath11k_clear_peer_keys(arvif, sta->addr); 4648 if (ret) { 4649 ath11k_warn(ar->ab, "failed to clear all peer keys for vdev %i: %d\n", 4650 arvif->vdev_id, ret); 4651 return ret; 4652 } 4653 return 0; 4654 } 4655 4656 static void ath11k_sta_rc_update_wk(struct work_struct *wk) 4657 { 4658 struct ath11k *ar; 4659 struct ath11k_vif *arvif; 4660 struct ath11k_sta *arsta; 4661 struct ieee80211_sta *sta; 4662 struct cfg80211_chan_def def; 4663 enum nl80211_band band; 4664 const u8 *ht_mcs_mask; 4665 const u16 *vht_mcs_mask; 4666 const u16 *he_mcs_mask; 4667 u32 changed, bw, nss, smps, bw_prev; 4668 int err, num_ht_rates, num_vht_rates, num_he_rates; 4669 const struct cfg80211_bitrate_mask *mask; 4670 struct peer_assoc_params peer_arg; 4671 enum wmi_phy_mode peer_phymode; 4672 4673 arsta = container_of(wk, struct ath11k_sta, update_wk); 4674 sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv); 4675 arvif = arsta->arvif; 4676 ar = arvif->ar; 4677 4678 if (WARN_ON(ath11k_mac_vif_chan(arvif->vif, &def))) 4679 return; 4680 4681 band = def.chan->band; 4682 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs; 4683 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs; 4684 he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs; 4685 4686 spin_lock_bh(&ar->data_lock); 4687 4688 changed = arsta->changed; 4689 arsta->changed = 0; 4690 4691 bw = arsta->bw; 4692 bw_prev = arsta->bw_prev; 4693 nss = arsta->nss; 4694 smps = arsta->smps; 4695 4696 spin_unlock_bh(&ar->data_lock); 4697 4698 mutex_lock(&ar->conf_mutex); 4699 4700 nss = max_t(u32, 1, nss); 4701 nss = min(nss, max(max(ath11k_mac_max_ht_nss(ht_mcs_mask), 4702 ath11k_mac_max_vht_nss(vht_mcs_mask)), 4703 ath11k_mac_max_he_nss(he_mcs_mask))); 4704 4705 if (changed & IEEE80211_RC_BW_CHANGED) { 4706 /* Get the peer phymode */ 4707 ath11k_peer_assoc_h_phymode(ar, arvif->vif, sta, &peer_arg); 4708 peer_phymode = peer_arg.peer_phymode; 4709 4710 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "update sta %pM peer bw %d phymode %d\n", 4711 sta->addr, bw, peer_phymode); 4712 4713 if (bw > bw_prev) { 4714 /* BW is upgraded. In this case we send WMI_PEER_PHYMODE 4715 * followed by WMI_PEER_CHWIDTH 4716 */ 4717 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "BW upgrade for sta %pM new BW %d, old BW %d\n", 4718 sta->addr, bw, bw_prev); 4719 4720 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id, 4721 WMI_PEER_PHYMODE, peer_phymode); 4722 4723 if (err) { 4724 ath11k_warn(ar->ab, "failed to update STA %pM peer phymode %d: %d\n", 4725 sta->addr, peer_phymode, err); 4726 goto err_rc_bw_changed; 4727 } 4728 4729 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id, 4730 WMI_PEER_CHWIDTH, bw); 4731 4732 if (err) 4733 ath11k_warn(ar->ab, "failed to update STA %pM peer bw %d: %d\n", 4734 sta->addr, bw, err); 4735 } else { 4736 /* BW is downgraded. In this case we send WMI_PEER_CHWIDTH 4737 * followed by WMI_PEER_PHYMODE 4738 */ 4739 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "BW downgrade for sta %pM new BW %d,old BW %d\n", 4740 sta->addr, bw, bw_prev); 4741 4742 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id, 4743 WMI_PEER_CHWIDTH, bw); 4744 4745 if (err) { 4746 ath11k_warn(ar->ab, "failed to update STA %pM peer bw %d: %d\n", 4747 sta->addr, bw, err); 4748 goto err_rc_bw_changed; 4749 } 4750 4751 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id, 4752 WMI_PEER_PHYMODE, peer_phymode); 4753 4754 if (err) 4755 ath11k_warn(ar->ab, "failed to update STA %pM peer phymode %d: %d\n", 4756 sta->addr, peer_phymode, err); 4757 } 4758 } 4759 4760 if (changed & IEEE80211_RC_NSS_CHANGED) { 4761 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "update sta %pM nss %d\n", 4762 sta->addr, nss); 4763 4764 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id, 4765 WMI_PEER_NSS, nss); 4766 if (err) 4767 ath11k_warn(ar->ab, "failed to update STA %pM nss %d: %d\n", 4768 sta->addr, nss, err); 4769 } 4770 4771 if (changed & IEEE80211_RC_SMPS_CHANGED) { 4772 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "update sta %pM smps %d\n", 4773 sta->addr, smps); 4774 4775 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id, 4776 WMI_PEER_MIMO_PS_STATE, smps); 4777 if (err) 4778 ath11k_warn(ar->ab, "failed to update STA %pM smps %d: %d\n", 4779 sta->addr, smps, err); 4780 } 4781 4782 if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) { 4783 mask = &arvif->bitrate_mask; 4784 num_ht_rates = ath11k_mac_bitrate_mask_num_ht_rates(ar, band, 4785 mask); 4786 num_vht_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band, 4787 mask); 4788 num_he_rates = ath11k_mac_bitrate_mask_num_he_rates(ar, band, 4789 mask); 4790 4791 /* Peer_assoc_prepare will reject vht rates in 4792 * bitrate_mask if its not available in range format and 4793 * sets vht tx_rateset as unsupported. So multiple VHT MCS 4794 * setting(eg. MCS 4,5,6) per peer is not supported here. 4795 * But, Single rate in VHT mask can be set as per-peer 4796 * fixed rate. But even if any HT rates are configured in 4797 * the bitrate mask, device will not switch to those rates 4798 * when per-peer Fixed rate is set. 4799 * TODO: Check RATEMASK_CMDID to support auto rates selection 4800 * across HT/VHT and for multiple VHT MCS support. 4801 */ 4802 if (sta->deflink.vht_cap.vht_supported && num_vht_rates == 1) { 4803 ath11k_mac_set_peer_vht_fixed_rate(arvif, sta, mask, 4804 band); 4805 } else if (sta->deflink.he_cap.has_he && num_he_rates == 1) { 4806 ath11k_mac_set_peer_he_fixed_rate(arvif, sta, mask, 4807 band); 4808 } else if (sta->deflink.ht_cap.ht_supported && num_ht_rates == 1) { 4809 ath11k_mac_set_peer_ht_fixed_rate(arvif, sta, mask, 4810 band); 4811 } else { 4812 /* If the peer is non-VHT/HE or no fixed VHT/HE rate 4813 * is provided in the new bitrate mask we set the 4814 * other rates using peer_assoc command. Also clear 4815 * the peer fixed rate settings as it has higher proprity 4816 * than peer assoc 4817 */ 4818 err = ath11k_wmi_set_peer_param(ar, sta->addr, 4819 arvif->vdev_id, 4820 WMI_PEER_PARAM_FIXED_RATE, 4821 WMI_FIXED_RATE_NONE); 4822 if (err) 4823 ath11k_warn(ar->ab, 4824 "failed to disable peer fixed rate for sta %pM: %d\n", 4825 sta->addr, err); 4826 4827 ath11k_peer_assoc_prepare(ar, arvif->vif, sta, 4828 &peer_arg, true); 4829 4830 peer_arg.is_assoc = false; 4831 err = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg); 4832 if (err) 4833 ath11k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n", 4834 sta->addr, arvif->vdev_id, err); 4835 4836 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) 4837 ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n", 4838 sta->addr, arvif->vdev_id); 4839 } 4840 } 4841 4842 err_rc_bw_changed: 4843 mutex_unlock(&ar->conf_mutex); 4844 } 4845 4846 static void ath11k_sta_set_4addr_wk(struct work_struct *wk) 4847 { 4848 struct ath11k *ar; 4849 struct ath11k_vif *arvif; 4850 struct ath11k_sta *arsta; 4851 struct ieee80211_sta *sta; 4852 int ret = 0; 4853 4854 arsta = container_of(wk, struct ath11k_sta, set_4addr_wk); 4855 sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv); 4856 arvif = arsta->arvif; 4857 ar = arvif->ar; 4858 4859 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, 4860 "setting USE_4ADDR for peer %pM\n", sta->addr); 4861 4862 ret = ath11k_wmi_set_peer_param(ar, sta->addr, 4863 arvif->vdev_id, 4864 WMI_PEER_USE_4ADDR, 1); 4865 4866 if (ret) 4867 ath11k_warn(ar->ab, "failed to set peer %pM 4addr capability: %d\n", 4868 sta->addr, ret); 4869 } 4870 4871 static int ath11k_mac_inc_num_stations(struct ath11k_vif *arvif, 4872 struct ieee80211_sta *sta) 4873 { 4874 struct ath11k *ar = arvif->ar; 4875 4876 lockdep_assert_held(&ar->conf_mutex); 4877 4878 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls) 4879 return 0; 4880 4881 if (ar->num_stations >= ar->max_num_stations) 4882 return -ENOBUFS; 4883 4884 ar->num_stations++; 4885 4886 return 0; 4887 } 4888 4889 static void ath11k_mac_dec_num_stations(struct ath11k_vif *arvif, 4890 struct ieee80211_sta *sta) 4891 { 4892 struct ath11k *ar = arvif->ar; 4893 4894 lockdep_assert_held(&ar->conf_mutex); 4895 4896 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls) 4897 return; 4898 4899 ar->num_stations--; 4900 } 4901 4902 static int ath11k_mac_station_add(struct ath11k *ar, 4903 struct ieee80211_vif *vif, 4904 struct ieee80211_sta *sta) 4905 { 4906 struct ath11k_base *ab = ar->ab; 4907 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); 4908 struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv; 4909 struct peer_create_params peer_param; 4910 int ret; 4911 4912 lockdep_assert_held(&ar->conf_mutex); 4913 4914 ret = ath11k_mac_inc_num_stations(arvif, sta); 4915 if (ret) { 4916 ath11k_warn(ab, "refusing to associate station: too many connected already (%d)\n", 4917 ar->max_num_stations); 4918 goto exit; 4919 } 4920 4921 arsta->rx_stats = kzalloc(sizeof(*arsta->rx_stats), GFP_KERNEL); 4922 if (!arsta->rx_stats) { 4923 ret = -ENOMEM; 4924 goto dec_num_station; 4925 } 4926 4927 peer_param.vdev_id = arvif->vdev_id; 4928 peer_param.peer_addr = sta->addr; 4929 peer_param.peer_type = WMI_PEER_TYPE_DEFAULT; 4930 4931 ret = ath11k_peer_create(ar, arvif, sta, &peer_param); 4932 if (ret) { 4933 ath11k_warn(ab, "Failed to add peer: %pM for VDEV: %d\n", 4934 sta->addr, arvif->vdev_id); 4935 goto free_rx_stats; 4936 } 4937 4938 ath11k_dbg(ab, ATH11K_DBG_MAC, "Added peer: %pM for VDEV: %d\n", 4939 sta->addr, arvif->vdev_id); 4940 4941 if (ath11k_debugfs_is_extd_tx_stats_enabled(ar)) { 4942 arsta->tx_stats = kzalloc(sizeof(*arsta->tx_stats), GFP_KERNEL); 4943 if (!arsta->tx_stats) { 4944 ret = -ENOMEM; 4945 goto free_peer; 4946 } 4947 } 4948 4949 if (ieee80211_vif_is_mesh(vif)) { 4950 ath11k_dbg(ab, ATH11K_DBG_MAC, 4951 "setting USE_4ADDR for mesh STA %pM\n", sta->addr); 4952 ret = ath11k_wmi_set_peer_param(ar, sta->addr, 4953 arvif->vdev_id, 4954 WMI_PEER_USE_4ADDR, 1); 4955 if (ret) { 4956 ath11k_warn(ab, "failed to set mesh STA %pM 4addr capability: %d\n", 4957 sta->addr, ret); 4958 goto free_tx_stats; 4959 } 4960 } 4961 4962 ret = ath11k_dp_peer_setup(ar, arvif->vdev_id, sta->addr); 4963 if (ret) { 4964 ath11k_warn(ab, "failed to setup dp for peer %pM on vdev %i (%d)\n", 4965 sta->addr, arvif->vdev_id, ret); 4966 goto free_tx_stats; 4967 } 4968 4969 if (ab->hw_params.vdev_start_delay && 4970 !arvif->is_started && 4971 arvif->vdev_type != WMI_VDEV_TYPE_AP) { 4972 ret = ath11k_start_vdev_delay(ar->hw, vif); 4973 if (ret) { 4974 ath11k_warn(ab, "failed to delay vdev start: %d\n", ret); 4975 goto free_tx_stats; 4976 } 4977 } 4978 4979 ewma_avg_rssi_init(&arsta->avg_rssi); 4980 return 0; 4981 4982 free_tx_stats: 4983 kfree(arsta->tx_stats); 4984 arsta->tx_stats = NULL; 4985 free_peer: 4986 ath11k_peer_delete(ar, arvif->vdev_id, sta->addr); 4987 free_rx_stats: 4988 kfree(arsta->rx_stats); 4989 arsta->rx_stats = NULL; 4990 dec_num_station: 4991 ath11k_mac_dec_num_stations(arvif, sta); 4992 exit: 4993 return ret; 4994 } 4995 4996 static u32 ath11k_mac_ieee80211_sta_bw_to_wmi(struct ath11k *ar, 4997 struct ieee80211_sta *sta) 4998 { 4999 u32 bw = WMI_PEER_CHWIDTH_20MHZ; 5000 5001 switch (sta->deflink.bandwidth) { 5002 case IEEE80211_STA_RX_BW_20: 5003 bw = WMI_PEER_CHWIDTH_20MHZ; 5004 break; 5005 case IEEE80211_STA_RX_BW_40: 5006 bw = WMI_PEER_CHWIDTH_40MHZ; 5007 break; 5008 case IEEE80211_STA_RX_BW_80: 5009 bw = WMI_PEER_CHWIDTH_80MHZ; 5010 break; 5011 case IEEE80211_STA_RX_BW_160: 5012 bw = WMI_PEER_CHWIDTH_160MHZ; 5013 break; 5014 default: 5015 ath11k_warn(ar->ab, "Invalid bandwidth %d for %pM\n", 5016 sta->deflink.bandwidth, sta->addr); 5017 bw = WMI_PEER_CHWIDTH_20MHZ; 5018 break; 5019 } 5020 5021 return bw; 5022 } 5023 5024 static int ath11k_mac_op_sta_state(struct ieee80211_hw *hw, 5025 struct ieee80211_vif *vif, 5026 struct ieee80211_sta *sta, 5027 enum ieee80211_sta_state old_state, 5028 enum ieee80211_sta_state new_state) 5029 { 5030 struct ath11k *ar = hw->priv; 5031 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); 5032 struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv; 5033 struct ath11k_peer *peer; 5034 int ret = 0; 5035 5036 /* cancel must be done outside the mutex to avoid deadlock */ 5037 if ((old_state == IEEE80211_STA_NONE && 5038 new_state == IEEE80211_STA_NOTEXIST)) { 5039 cancel_work_sync(&arsta->update_wk); 5040 cancel_work_sync(&arsta->set_4addr_wk); 5041 } 5042 5043 mutex_lock(&ar->conf_mutex); 5044 5045 if (old_state == IEEE80211_STA_NOTEXIST && 5046 new_state == IEEE80211_STA_NONE) { 5047 memset(arsta, 0, sizeof(*arsta)); 5048 arsta->arvif = arvif; 5049 arsta->peer_ps_state = WMI_PEER_PS_STATE_DISABLED; 5050 INIT_WORK(&arsta->update_wk, ath11k_sta_rc_update_wk); 5051 INIT_WORK(&arsta->set_4addr_wk, ath11k_sta_set_4addr_wk); 5052 5053 ret = ath11k_mac_station_add(ar, vif, sta); 5054 if (ret) 5055 ath11k_warn(ar->ab, "Failed to add station: %pM for VDEV: %d\n", 5056 sta->addr, arvif->vdev_id); 5057 } else if ((old_state == IEEE80211_STA_NONE && 5058 new_state == IEEE80211_STA_NOTEXIST)) { 5059 bool skip_peer_delete = ar->ab->hw_params.vdev_start_delay && 5060 vif->type == NL80211_IFTYPE_STATION; 5061 5062 ath11k_dp_peer_cleanup(ar, arvif->vdev_id, sta->addr); 5063 5064 if (!skip_peer_delete) { 5065 ret = ath11k_peer_delete(ar, arvif->vdev_id, sta->addr); 5066 if (ret) 5067 ath11k_warn(ar->ab, 5068 "Failed to delete peer: %pM for VDEV: %d\n", 5069 sta->addr, arvif->vdev_id); 5070 else 5071 ath11k_dbg(ar->ab, 5072 ATH11K_DBG_MAC, 5073 "Removed peer: %pM for VDEV: %d\n", 5074 sta->addr, arvif->vdev_id); 5075 } 5076 5077 ath11k_mac_dec_num_stations(arvif, sta); 5078 mutex_lock(&ar->ab->tbl_mtx_lock); 5079 spin_lock_bh(&ar->ab->base_lock); 5080 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr); 5081 if (skip_peer_delete && peer) { 5082 peer->sta = NULL; 5083 } else if (peer && peer->sta == sta) { 5084 ath11k_warn(ar->ab, "Found peer entry %pM n vdev %i after it was supposedly removed\n", 5085 vif->addr, arvif->vdev_id); 5086 ath11k_peer_rhash_delete(ar->ab, peer); 5087 peer->sta = NULL; 5088 list_del(&peer->list); 5089 kfree(peer); 5090 ar->num_peers--; 5091 } 5092 spin_unlock_bh(&ar->ab->base_lock); 5093 mutex_unlock(&ar->ab->tbl_mtx_lock); 5094 5095 kfree(arsta->tx_stats); 5096 arsta->tx_stats = NULL; 5097 5098 kfree(arsta->rx_stats); 5099 arsta->rx_stats = NULL; 5100 } else if (old_state == IEEE80211_STA_AUTH && 5101 new_state == IEEE80211_STA_ASSOC && 5102 (vif->type == NL80211_IFTYPE_AP || 5103 vif->type == NL80211_IFTYPE_MESH_POINT || 5104 vif->type == NL80211_IFTYPE_ADHOC)) { 5105 ret = ath11k_station_assoc(ar, vif, sta, false); 5106 if (ret) 5107 ath11k_warn(ar->ab, "Failed to associate station: %pM\n", 5108 sta->addr); 5109 5110 spin_lock_bh(&ar->data_lock); 5111 /* Set arsta bw and prev bw */ 5112 arsta->bw = ath11k_mac_ieee80211_sta_bw_to_wmi(ar, sta); 5113 arsta->bw_prev = arsta->bw; 5114 spin_unlock_bh(&ar->data_lock); 5115 } else if (old_state == IEEE80211_STA_ASSOC && 5116 new_state == IEEE80211_STA_AUTHORIZED) { 5117 spin_lock_bh(&ar->ab->base_lock); 5118 5119 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr); 5120 if (peer) 5121 peer->is_authorized = true; 5122 5123 spin_unlock_bh(&ar->ab->base_lock); 5124 5125 if (vif->type == NL80211_IFTYPE_STATION && arvif->is_up) { 5126 ret = ath11k_wmi_set_peer_param(ar, sta->addr, 5127 arvif->vdev_id, 5128 WMI_PEER_AUTHORIZE, 5129 1); 5130 if (ret) 5131 ath11k_warn(ar->ab, "Unable to authorize peer %pM vdev %d: %d\n", 5132 sta->addr, arvif->vdev_id, ret); 5133 } 5134 } else if (old_state == IEEE80211_STA_AUTHORIZED && 5135 new_state == IEEE80211_STA_ASSOC) { 5136 spin_lock_bh(&ar->ab->base_lock); 5137 5138 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr); 5139 if (peer) 5140 peer->is_authorized = false; 5141 5142 spin_unlock_bh(&ar->ab->base_lock); 5143 } else if (old_state == IEEE80211_STA_ASSOC && 5144 new_state == IEEE80211_STA_AUTH && 5145 (vif->type == NL80211_IFTYPE_AP || 5146 vif->type == NL80211_IFTYPE_MESH_POINT || 5147 vif->type == NL80211_IFTYPE_ADHOC)) { 5148 ret = ath11k_station_disassoc(ar, vif, sta); 5149 if (ret) 5150 ath11k_warn(ar->ab, "Failed to disassociate station: %pM\n", 5151 sta->addr); 5152 } 5153 5154 mutex_unlock(&ar->conf_mutex); 5155 return ret; 5156 } 5157 5158 static int ath11k_mac_op_sta_set_txpwr(struct ieee80211_hw *hw, 5159 struct ieee80211_vif *vif, 5160 struct ieee80211_sta *sta) 5161 { 5162 struct ath11k *ar = hw->priv; 5163 struct ath11k_vif *arvif = (void *)vif->drv_priv; 5164 int ret = 0; 5165 s16 txpwr; 5166 5167 if (sta->deflink.txpwr.type == NL80211_TX_POWER_AUTOMATIC) { 5168 txpwr = 0; 5169 } else { 5170 txpwr = sta->deflink.txpwr.power; 5171 if (!txpwr) 5172 return -EINVAL; 5173 } 5174 5175 if (txpwr > ATH11K_TX_POWER_MAX_VAL || txpwr < ATH11K_TX_POWER_MIN_VAL) 5176 return -EINVAL; 5177 5178 mutex_lock(&ar->conf_mutex); 5179 5180 ret = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id, 5181 WMI_PEER_USE_FIXED_PWR, txpwr); 5182 if (ret) { 5183 ath11k_warn(ar->ab, "failed to set tx power for station ret: %d\n", 5184 ret); 5185 goto out; 5186 } 5187 5188 out: 5189 mutex_unlock(&ar->conf_mutex); 5190 return ret; 5191 } 5192 5193 static void ath11k_mac_op_sta_set_4addr(struct ieee80211_hw *hw, 5194 struct ieee80211_vif *vif, 5195 struct ieee80211_sta *sta, bool enabled) 5196 { 5197 struct ath11k *ar = hw->priv; 5198 struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv; 5199 5200 if (enabled && !arsta->use_4addr_set) { 5201 ieee80211_queue_work(ar->hw, &arsta->set_4addr_wk); 5202 arsta->use_4addr_set = true; 5203 } 5204 } 5205 5206 static void ath11k_mac_op_sta_rc_update(struct ieee80211_hw *hw, 5207 struct ieee80211_vif *vif, 5208 struct ieee80211_sta *sta, 5209 u32 changed) 5210 { 5211 struct ath11k *ar = hw->priv; 5212 struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv; 5213 struct ath11k_vif *arvif = (void *)vif->drv_priv; 5214 struct ath11k_peer *peer; 5215 u32 bw, smps; 5216 5217 spin_lock_bh(&ar->ab->base_lock); 5218 5219 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr); 5220 if (!peer) { 5221 spin_unlock_bh(&ar->ab->base_lock); 5222 ath11k_warn(ar->ab, "mac sta rc update failed to find peer %pM on vdev %i\n", 5223 sta->addr, arvif->vdev_id); 5224 return; 5225 } 5226 5227 spin_unlock_bh(&ar->ab->base_lock); 5228 5229 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, 5230 "sta rc update for %pM changed %08x bw %d nss %d smps %d\n", 5231 sta->addr, changed, sta->deflink.bandwidth, 5232 sta->deflink.rx_nss, 5233 sta->deflink.smps_mode); 5234 5235 spin_lock_bh(&ar->data_lock); 5236 5237 if (changed & IEEE80211_RC_BW_CHANGED) { 5238 bw = ath11k_mac_ieee80211_sta_bw_to_wmi(ar, sta); 5239 arsta->bw_prev = arsta->bw; 5240 arsta->bw = bw; 5241 } 5242 5243 if (changed & IEEE80211_RC_NSS_CHANGED) 5244 arsta->nss = sta->deflink.rx_nss; 5245 5246 if (changed & IEEE80211_RC_SMPS_CHANGED) { 5247 smps = WMI_PEER_SMPS_PS_NONE; 5248 5249 switch (sta->deflink.smps_mode) { 5250 case IEEE80211_SMPS_AUTOMATIC: 5251 case IEEE80211_SMPS_OFF: 5252 smps = WMI_PEER_SMPS_PS_NONE; 5253 break; 5254 case IEEE80211_SMPS_STATIC: 5255 smps = WMI_PEER_SMPS_STATIC; 5256 break; 5257 case IEEE80211_SMPS_DYNAMIC: 5258 smps = WMI_PEER_SMPS_DYNAMIC; 5259 break; 5260 default: 5261 ath11k_warn(ar->ab, "Invalid smps %d in sta rc update for %pM\n", 5262 sta->deflink.smps_mode, sta->addr); 5263 smps = WMI_PEER_SMPS_PS_NONE; 5264 break; 5265 } 5266 5267 arsta->smps = smps; 5268 } 5269 5270 arsta->changed |= changed; 5271 5272 spin_unlock_bh(&ar->data_lock); 5273 5274 ieee80211_queue_work(hw, &arsta->update_wk); 5275 } 5276 5277 static int ath11k_conf_tx_uapsd(struct ath11k *ar, struct ieee80211_vif *vif, 5278 u16 ac, bool enable) 5279 { 5280 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); 5281 u32 value = 0; 5282 int ret = 0; 5283 5284 if (arvif->vdev_type != WMI_VDEV_TYPE_STA) 5285 return 0; 5286 5287 switch (ac) { 5288 case IEEE80211_AC_VO: 5289 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN | 5290 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN; 5291 break; 5292 case IEEE80211_AC_VI: 5293 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN | 5294 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN; 5295 break; 5296 case IEEE80211_AC_BE: 5297 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN | 5298 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN; 5299 break; 5300 case IEEE80211_AC_BK: 5301 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN | 5302 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN; 5303 break; 5304 } 5305 5306 if (enable) 5307 arvif->u.sta.uapsd |= value; 5308 else 5309 arvif->u.sta.uapsd &= ~value; 5310 5311 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id, 5312 WMI_STA_PS_PARAM_UAPSD, 5313 arvif->u.sta.uapsd); 5314 if (ret) { 5315 ath11k_warn(ar->ab, "could not set uapsd params %d\n", ret); 5316 goto exit; 5317 } 5318 5319 if (arvif->u.sta.uapsd) 5320 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD; 5321 else 5322 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE; 5323 5324 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id, 5325 WMI_STA_PS_PARAM_RX_WAKE_POLICY, 5326 value); 5327 if (ret) 5328 ath11k_warn(ar->ab, "could not set rx wake param %d\n", ret); 5329 5330 exit: 5331 return ret; 5332 } 5333 5334 static int ath11k_mac_op_conf_tx(struct ieee80211_hw *hw, 5335 struct ieee80211_vif *vif, 5336 unsigned int link_id, u16 ac, 5337 const struct ieee80211_tx_queue_params *params) 5338 { 5339 struct ath11k *ar = hw->priv; 5340 struct ath11k_vif *arvif = (void *)vif->drv_priv; 5341 struct wmi_wmm_params_arg *p = NULL; 5342 int ret; 5343 5344 mutex_lock(&ar->conf_mutex); 5345 5346 switch (ac) { 5347 case IEEE80211_AC_VO: 5348 p = &arvif->wmm_params.ac_vo; 5349 break; 5350 case IEEE80211_AC_VI: 5351 p = &arvif->wmm_params.ac_vi; 5352 break; 5353 case IEEE80211_AC_BE: 5354 p = &arvif->wmm_params.ac_be; 5355 break; 5356 case IEEE80211_AC_BK: 5357 p = &arvif->wmm_params.ac_bk; 5358 break; 5359 } 5360 5361 if (WARN_ON(!p)) { 5362 ret = -EINVAL; 5363 goto exit; 5364 } 5365 5366 p->cwmin = params->cw_min; 5367 p->cwmax = params->cw_max; 5368 p->aifs = params->aifs; 5369 p->txop = params->txop; 5370 5371 ret = ath11k_wmi_send_wmm_update_cmd_tlv(ar, arvif->vdev_id, 5372 &arvif->wmm_params); 5373 if (ret) { 5374 ath11k_warn(ar->ab, "failed to set wmm params: %d\n", ret); 5375 goto exit; 5376 } 5377 5378 ret = ath11k_conf_tx_uapsd(ar, vif, ac, params->uapsd); 5379 5380 if (ret) 5381 ath11k_warn(ar->ab, "failed to set sta uapsd: %d\n", ret); 5382 5383 exit: 5384 mutex_unlock(&ar->conf_mutex); 5385 return ret; 5386 } 5387 5388 static struct ieee80211_sta_ht_cap 5389 ath11k_create_ht_cap(struct ath11k *ar, u32 ar_ht_cap, u32 rate_cap_rx_chainmask) 5390 { 5391 int i; 5392 struct ieee80211_sta_ht_cap ht_cap = {0}; 5393 u32 ar_vht_cap = ar->pdev->cap.vht_cap; 5394 5395 if (!(ar_ht_cap & WMI_HT_CAP_ENABLED)) 5396 return ht_cap; 5397 5398 ht_cap.ht_supported = 1; 5399 ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K; 5400 ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_NONE; 5401 ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40; 5402 ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40; 5403 ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT; 5404 5405 if (ar_ht_cap & WMI_HT_CAP_HT20_SGI) 5406 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20; 5407 5408 if (ar_ht_cap & WMI_HT_CAP_HT40_SGI) 5409 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40; 5410 5411 if (ar_ht_cap & WMI_HT_CAP_DYNAMIC_SMPS) { 5412 u32 smps; 5413 5414 smps = WLAN_HT_CAP_SM_PS_DYNAMIC; 5415 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT; 5416 5417 ht_cap.cap |= smps; 5418 } 5419 5420 if (ar_ht_cap & WMI_HT_CAP_TX_STBC) 5421 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC; 5422 5423 if (ar_ht_cap & WMI_HT_CAP_RX_STBC) { 5424 u32 stbc; 5425 5426 stbc = ar_ht_cap; 5427 stbc &= WMI_HT_CAP_RX_STBC; 5428 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT; 5429 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT; 5430 stbc &= IEEE80211_HT_CAP_RX_STBC; 5431 5432 ht_cap.cap |= stbc; 5433 } 5434 5435 if (ar_ht_cap & WMI_HT_CAP_RX_LDPC) 5436 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING; 5437 5438 if (ar_ht_cap & WMI_HT_CAP_L_SIG_TXOP_PROT) 5439 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT; 5440 5441 if (ar_vht_cap & WMI_VHT_CAP_MAX_MPDU_LEN_MASK) 5442 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU; 5443 5444 for (i = 0; i < ar->num_rx_chains; i++) { 5445 if (rate_cap_rx_chainmask & BIT(i)) 5446 ht_cap.mcs.rx_mask[i] = 0xFF; 5447 } 5448 5449 ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED; 5450 5451 return ht_cap; 5452 } 5453 5454 static int ath11k_mac_set_txbf_conf(struct ath11k_vif *arvif) 5455 { 5456 u32 value = 0; 5457 struct ath11k *ar = arvif->ar; 5458 int nsts; 5459 int sound_dim; 5460 u32 vht_cap = ar->pdev->cap.vht_cap; 5461 u32 vdev_param = WMI_VDEV_PARAM_TXBF; 5462 5463 if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)) { 5464 nsts = vht_cap & IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK; 5465 nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT; 5466 if (nsts > (ar->num_rx_chains - 1)) 5467 nsts = ar->num_rx_chains - 1; 5468 value |= SM(nsts, WMI_TXBF_STS_CAP_OFFSET); 5469 } 5470 5471 if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)) { 5472 sound_dim = vht_cap & 5473 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK; 5474 sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT; 5475 if (sound_dim > (ar->num_tx_chains - 1)) 5476 sound_dim = ar->num_tx_chains - 1; 5477 value |= SM(sound_dim, WMI_BF_SOUND_DIM_OFFSET); 5478 } 5479 5480 if (!value) 5481 return 0; 5482 5483 if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) { 5484 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER; 5485 5486 if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) && 5487 arvif->vdev_type == WMI_VDEV_TYPE_AP) 5488 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFER; 5489 } 5490 5491 /* TODO: SUBFEE not validated in HK, disable here until validated? */ 5492 5493 if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE) { 5494 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE; 5495 5496 if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE) && 5497 arvif->vdev_type == WMI_VDEV_TYPE_STA) 5498 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE; 5499 } 5500 5501 return ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 5502 vdev_param, value); 5503 } 5504 5505 static void ath11k_set_vht_txbf_cap(struct ath11k *ar, u32 *vht_cap) 5506 { 5507 bool subfer, subfee; 5508 int sound_dim = 0, nsts = 0; 5509 5510 subfer = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)); 5511 subfee = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)); 5512 5513 if (ar->num_tx_chains < 2) { 5514 *vht_cap &= ~(IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE); 5515 subfer = false; 5516 } 5517 5518 if (ar->num_rx_chains < 2) { 5519 *vht_cap &= ~(IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE); 5520 subfee = false; 5521 } 5522 5523 /* If SU Beaformer is not set, then disable MU Beamformer Capability */ 5524 if (!subfer) 5525 *vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE); 5526 5527 /* If SU Beaformee is not set, then disable MU Beamformee Capability */ 5528 if (!subfee) 5529 *vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE); 5530 5531 sound_dim = (*vht_cap & IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK); 5532 sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT; 5533 *vht_cap &= ~IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK; 5534 5535 nsts = (*vht_cap & IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK); 5536 nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT; 5537 *vht_cap &= ~IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK; 5538 5539 /* Enable Sounding Dimension Field only if SU BF is enabled */ 5540 if (subfer) { 5541 if (sound_dim > (ar->num_tx_chains - 1)) 5542 sound_dim = ar->num_tx_chains - 1; 5543 5544 sound_dim <<= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT; 5545 sound_dim &= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK; 5546 *vht_cap |= sound_dim; 5547 } 5548 5549 /* Enable Beamformee STS Field only if SU BF is enabled */ 5550 if (subfee) { 5551 if (nsts > (ar->num_rx_chains - 1)) 5552 nsts = ar->num_rx_chains - 1; 5553 5554 nsts <<= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT; 5555 nsts &= IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK; 5556 *vht_cap |= nsts; 5557 } 5558 } 5559 5560 static struct ieee80211_sta_vht_cap 5561 ath11k_create_vht_cap(struct ath11k *ar, u32 rate_cap_tx_chainmask, 5562 u32 rate_cap_rx_chainmask) 5563 { 5564 struct ieee80211_sta_vht_cap vht_cap = {0}; 5565 u16 txmcs_map, rxmcs_map; 5566 int i; 5567 5568 vht_cap.vht_supported = 1; 5569 vht_cap.cap = ar->pdev->cap.vht_cap; 5570 5571 if (ar->pdev->cap.nss_ratio_enabled) 5572 vht_cap.vht_mcs.tx_highest |= 5573 cpu_to_le16(IEEE80211_VHT_EXT_NSS_BW_CAPABLE); 5574 5575 ath11k_set_vht_txbf_cap(ar, &vht_cap.cap); 5576 5577 rxmcs_map = 0; 5578 txmcs_map = 0; 5579 for (i = 0; i < 8; i++) { 5580 if (i < ar->num_tx_chains && rate_cap_tx_chainmask & BIT(i)) 5581 txmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2); 5582 else 5583 txmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2); 5584 5585 if (i < ar->num_rx_chains && rate_cap_rx_chainmask & BIT(i)) 5586 rxmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2); 5587 else 5588 rxmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2); 5589 } 5590 5591 if (rate_cap_tx_chainmask <= 1) 5592 vht_cap.cap &= ~IEEE80211_VHT_CAP_TXSTBC; 5593 5594 vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(rxmcs_map); 5595 vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(txmcs_map); 5596 5597 return vht_cap; 5598 } 5599 5600 static void ath11k_mac_setup_ht_vht_cap(struct ath11k *ar, 5601 struct ath11k_pdev_cap *cap, 5602 u32 *ht_cap_info) 5603 { 5604 struct ieee80211_supported_band *band; 5605 u32 rate_cap_tx_chainmask; 5606 u32 rate_cap_rx_chainmask; 5607 u32 ht_cap; 5608 5609 rate_cap_tx_chainmask = ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift; 5610 rate_cap_rx_chainmask = ar->cfg_rx_chainmask >> cap->rx_chain_mask_shift; 5611 5612 if (cap->supported_bands & WMI_HOST_WLAN_2G_CAP) { 5613 band = &ar->mac.sbands[NL80211_BAND_2GHZ]; 5614 ht_cap = cap->band[NL80211_BAND_2GHZ].ht_cap_info; 5615 if (ht_cap_info) 5616 *ht_cap_info = ht_cap; 5617 band->ht_cap = ath11k_create_ht_cap(ar, ht_cap, 5618 rate_cap_rx_chainmask); 5619 } 5620 5621 if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP && 5622 (ar->ab->hw_params.single_pdev_only || 5623 !ar->supports_6ghz)) { 5624 band = &ar->mac.sbands[NL80211_BAND_5GHZ]; 5625 ht_cap = cap->band[NL80211_BAND_5GHZ].ht_cap_info; 5626 if (ht_cap_info) 5627 *ht_cap_info = ht_cap; 5628 band->ht_cap = ath11k_create_ht_cap(ar, ht_cap, 5629 rate_cap_rx_chainmask); 5630 band->vht_cap = ath11k_create_vht_cap(ar, rate_cap_tx_chainmask, 5631 rate_cap_rx_chainmask); 5632 } 5633 } 5634 5635 static int ath11k_check_chain_mask(struct ath11k *ar, u32 ant, bool is_tx_ant) 5636 { 5637 /* TODO: Check the request chainmask against the supported 5638 * chainmask table which is advertised in extented_service_ready event 5639 */ 5640 5641 return 0; 5642 } 5643 5644 static void ath11k_gen_ppe_thresh(struct ath11k_ppe_threshold *fw_ppet, 5645 u8 *he_ppet) 5646 { 5647 int nss, ru; 5648 u8 bit = 7; 5649 5650 he_ppet[0] = fw_ppet->numss_m1 & IEEE80211_PPE_THRES_NSS_MASK; 5651 he_ppet[0] |= (fw_ppet->ru_bit_mask << 5652 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS) & 5653 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK; 5654 for (nss = 0; nss <= fw_ppet->numss_m1; nss++) { 5655 for (ru = 0; ru < 4; ru++) { 5656 u8 val; 5657 int i; 5658 5659 if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0) 5660 continue; 5661 val = (fw_ppet->ppet16_ppet8_ru3_ru0[nss] >> (ru * 6)) & 5662 0x3f; 5663 val = ((val >> 3) & 0x7) | ((val & 0x7) << 3); 5664 for (i = 5; i >= 0; i--) { 5665 he_ppet[bit / 8] |= 5666 ((val >> i) & 0x1) << ((bit % 8)); 5667 bit++; 5668 } 5669 } 5670 } 5671 } 5672 5673 static void 5674 ath11k_mac_filter_he_cap_mesh(struct ieee80211_he_cap_elem *he_cap_elem) 5675 { 5676 u8 m; 5677 5678 m = IEEE80211_HE_MAC_CAP0_TWT_RES | 5679 IEEE80211_HE_MAC_CAP0_TWT_REQ; 5680 he_cap_elem->mac_cap_info[0] &= ~m; 5681 5682 m = IEEE80211_HE_MAC_CAP2_TRS | 5683 IEEE80211_HE_MAC_CAP2_BCAST_TWT | 5684 IEEE80211_HE_MAC_CAP2_MU_CASCADING; 5685 he_cap_elem->mac_cap_info[2] &= ~m; 5686 5687 m = IEEE80211_HE_MAC_CAP3_FLEX_TWT_SCHED | 5688 IEEE80211_HE_MAC_CAP2_BCAST_TWT | 5689 IEEE80211_HE_MAC_CAP2_MU_CASCADING; 5690 he_cap_elem->mac_cap_info[3] &= ~m; 5691 5692 m = IEEE80211_HE_MAC_CAP4_BSRP_BQRP_A_MPDU_AGG | 5693 IEEE80211_HE_MAC_CAP4_BQR; 5694 he_cap_elem->mac_cap_info[4] &= ~m; 5695 5696 m = IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECTIVE_TRANSMISSION | 5697 IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU | 5698 IEEE80211_HE_MAC_CAP5_PUNCTURED_SOUNDING | 5699 IEEE80211_HE_MAC_CAP5_HT_VHT_TRIG_FRAME_RX; 5700 he_cap_elem->mac_cap_info[5] &= ~m; 5701 5702 m = IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO | 5703 IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO; 5704 he_cap_elem->phy_cap_info[2] &= ~m; 5705 5706 m = IEEE80211_HE_PHY_CAP3_RX_PARTIAL_BW_SU_IN_20MHZ_MU | 5707 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK | 5708 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_MASK; 5709 he_cap_elem->phy_cap_info[3] &= ~m; 5710 5711 m = IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER; 5712 he_cap_elem->phy_cap_info[4] &= ~m; 5713 5714 m = IEEE80211_HE_PHY_CAP5_NG16_MU_FEEDBACK; 5715 he_cap_elem->phy_cap_info[5] &= ~m; 5716 5717 m = IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU | 5718 IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB | 5719 IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB | 5720 IEEE80211_HE_PHY_CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO; 5721 he_cap_elem->phy_cap_info[6] &= ~m; 5722 5723 m = IEEE80211_HE_PHY_CAP7_PSR_BASED_SR | 5724 IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP | 5725 IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ | 5726 IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ; 5727 he_cap_elem->phy_cap_info[7] &= ~m; 5728 5729 m = IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI | 5730 IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G | 5731 IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU | 5732 IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU; 5733 he_cap_elem->phy_cap_info[8] &= ~m; 5734 5735 m = IEEE80211_HE_PHY_CAP9_LONGER_THAN_16_SIGB_OFDM_SYM | 5736 IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK | 5737 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU | 5738 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU | 5739 IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_COMP_SIGB | 5740 IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_NON_COMP_SIGB; 5741 he_cap_elem->phy_cap_info[9] &= ~m; 5742 } 5743 5744 static __le16 ath11k_mac_setup_he_6ghz_cap(struct ath11k_pdev_cap *pcap, 5745 struct ath11k_band_cap *bcap) 5746 { 5747 u8 val; 5748 5749 bcap->he_6ghz_capa = IEEE80211_HT_MPDU_DENSITY_NONE; 5750 if (bcap->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) 5751 bcap->he_6ghz_capa |= 5752 FIELD_PREP(IEEE80211_HE_6GHZ_CAP_SM_PS, 5753 WLAN_HT_CAP_SM_PS_DYNAMIC); 5754 else 5755 bcap->he_6ghz_capa |= 5756 FIELD_PREP(IEEE80211_HE_6GHZ_CAP_SM_PS, 5757 WLAN_HT_CAP_SM_PS_DISABLED); 5758 val = FIELD_GET(IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK, 5759 pcap->vht_cap); 5760 bcap->he_6ghz_capa |= 5761 FIELD_PREP(IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP, val); 5762 val = FIELD_GET(IEEE80211_VHT_CAP_MAX_MPDU_MASK, pcap->vht_cap); 5763 bcap->he_6ghz_capa |= 5764 FIELD_PREP(IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN, val); 5765 if (pcap->vht_cap & IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN) 5766 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS; 5767 if (pcap->vht_cap & IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN) 5768 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS; 5769 5770 return cpu_to_le16(bcap->he_6ghz_capa); 5771 } 5772 5773 static void ath11k_mac_set_hemcsmap(struct ath11k *ar, 5774 struct ath11k_pdev_cap *cap, 5775 struct ieee80211_sta_he_cap *he_cap, 5776 int band) 5777 { 5778 u16 txmcs_map, rxmcs_map; 5779 u32 i; 5780 5781 rxmcs_map = 0; 5782 txmcs_map = 0; 5783 for (i = 0; i < 8; i++) { 5784 if (i < ar->num_tx_chains && 5785 (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i)) 5786 txmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2); 5787 else 5788 txmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2); 5789 5790 if (i < ar->num_rx_chains && 5791 (ar->cfg_rx_chainmask >> cap->tx_chain_mask_shift) & BIT(i)) 5792 rxmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2); 5793 else 5794 rxmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2); 5795 } 5796 he_cap->he_mcs_nss_supp.rx_mcs_80 = 5797 cpu_to_le16(rxmcs_map & 0xffff); 5798 he_cap->he_mcs_nss_supp.tx_mcs_80 = 5799 cpu_to_le16(txmcs_map & 0xffff); 5800 he_cap->he_mcs_nss_supp.rx_mcs_160 = 5801 cpu_to_le16(rxmcs_map & 0xffff); 5802 he_cap->he_mcs_nss_supp.tx_mcs_160 = 5803 cpu_to_le16(txmcs_map & 0xffff); 5804 he_cap->he_mcs_nss_supp.rx_mcs_80p80 = 5805 cpu_to_le16(rxmcs_map & 0xffff); 5806 he_cap->he_mcs_nss_supp.tx_mcs_80p80 = 5807 cpu_to_le16(txmcs_map & 0xffff); 5808 } 5809 5810 static int ath11k_mac_copy_he_cap(struct ath11k *ar, 5811 struct ath11k_pdev_cap *cap, 5812 struct ieee80211_sband_iftype_data *data, 5813 int band) 5814 { 5815 int i, idx = 0; 5816 5817 for (i = 0; i < NUM_NL80211_IFTYPES; i++) { 5818 struct ieee80211_sta_he_cap *he_cap = &data[idx].he_cap; 5819 struct ath11k_band_cap *band_cap = &cap->band[band]; 5820 struct ieee80211_he_cap_elem *he_cap_elem = 5821 &he_cap->he_cap_elem; 5822 5823 switch (i) { 5824 case NL80211_IFTYPE_STATION: 5825 case NL80211_IFTYPE_AP: 5826 case NL80211_IFTYPE_MESH_POINT: 5827 break; 5828 5829 default: 5830 continue; 5831 } 5832 5833 data[idx].types_mask = BIT(i); 5834 he_cap->has_he = true; 5835 memcpy(he_cap_elem->mac_cap_info, band_cap->he_cap_info, 5836 sizeof(he_cap_elem->mac_cap_info)); 5837 memcpy(he_cap_elem->phy_cap_info, band_cap->he_cap_phy_info, 5838 sizeof(he_cap_elem->phy_cap_info)); 5839 5840 he_cap_elem->mac_cap_info[1] &= 5841 IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_MASK; 5842 5843 he_cap_elem->phy_cap_info[5] &= 5844 ~IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK; 5845 he_cap_elem->phy_cap_info[5] |= ar->num_tx_chains - 1; 5846 5847 switch (i) { 5848 case NL80211_IFTYPE_AP: 5849 he_cap_elem->phy_cap_info[3] &= 5850 ~IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK; 5851 he_cap_elem->phy_cap_info[9] |= 5852 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU; 5853 break; 5854 case NL80211_IFTYPE_STATION: 5855 he_cap_elem->mac_cap_info[0] &= 5856 ~IEEE80211_HE_MAC_CAP0_TWT_RES; 5857 he_cap_elem->mac_cap_info[0] |= 5858 IEEE80211_HE_MAC_CAP0_TWT_REQ; 5859 he_cap_elem->phy_cap_info[9] |= 5860 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU; 5861 break; 5862 case NL80211_IFTYPE_MESH_POINT: 5863 ath11k_mac_filter_he_cap_mesh(he_cap_elem); 5864 break; 5865 } 5866 5867 ath11k_mac_set_hemcsmap(ar, cap, he_cap, band); 5868 5869 memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres)); 5870 if (he_cap_elem->phy_cap_info[6] & 5871 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) 5872 ath11k_gen_ppe_thresh(&band_cap->he_ppet, 5873 he_cap->ppe_thres); 5874 5875 if (band == NL80211_BAND_6GHZ) { 5876 data[idx].he_6ghz_capa.capa = 5877 ath11k_mac_setup_he_6ghz_cap(cap, band_cap); 5878 } 5879 idx++; 5880 } 5881 5882 return idx; 5883 } 5884 5885 static void ath11k_mac_setup_he_cap(struct ath11k *ar, 5886 struct ath11k_pdev_cap *cap) 5887 { 5888 struct ieee80211_supported_band *band; 5889 int count; 5890 5891 if (cap->supported_bands & WMI_HOST_WLAN_2G_CAP) { 5892 count = ath11k_mac_copy_he_cap(ar, cap, 5893 ar->mac.iftype[NL80211_BAND_2GHZ], 5894 NL80211_BAND_2GHZ); 5895 band = &ar->mac.sbands[NL80211_BAND_2GHZ]; 5896 band->iftype_data = ar->mac.iftype[NL80211_BAND_2GHZ]; 5897 band->n_iftype_data = count; 5898 } 5899 5900 if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP) { 5901 count = ath11k_mac_copy_he_cap(ar, cap, 5902 ar->mac.iftype[NL80211_BAND_5GHZ], 5903 NL80211_BAND_5GHZ); 5904 band = &ar->mac.sbands[NL80211_BAND_5GHZ]; 5905 band->iftype_data = ar->mac.iftype[NL80211_BAND_5GHZ]; 5906 band->n_iftype_data = count; 5907 } 5908 5909 if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP && 5910 ar->supports_6ghz) { 5911 count = ath11k_mac_copy_he_cap(ar, cap, 5912 ar->mac.iftype[NL80211_BAND_6GHZ], 5913 NL80211_BAND_6GHZ); 5914 band = &ar->mac.sbands[NL80211_BAND_6GHZ]; 5915 band->iftype_data = ar->mac.iftype[NL80211_BAND_6GHZ]; 5916 band->n_iftype_data = count; 5917 } 5918 } 5919 5920 static int __ath11k_set_antenna(struct ath11k *ar, u32 tx_ant, u32 rx_ant) 5921 { 5922 int ret; 5923 5924 lockdep_assert_held(&ar->conf_mutex); 5925 5926 if (ath11k_check_chain_mask(ar, tx_ant, true)) 5927 return -EINVAL; 5928 5929 if (ath11k_check_chain_mask(ar, rx_ant, false)) 5930 return -EINVAL; 5931 5932 ar->cfg_tx_chainmask = tx_ant; 5933 ar->cfg_rx_chainmask = rx_ant; 5934 5935 if (ar->state != ATH11K_STATE_ON && 5936 ar->state != ATH11K_STATE_RESTARTED) 5937 return 0; 5938 5939 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_TX_CHAIN_MASK, 5940 tx_ant, ar->pdev->pdev_id); 5941 if (ret) { 5942 ath11k_warn(ar->ab, "failed to set tx-chainmask: %d, req 0x%x\n", 5943 ret, tx_ant); 5944 return ret; 5945 } 5946 5947 ar->num_tx_chains = get_num_chains(tx_ant); 5948 5949 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RX_CHAIN_MASK, 5950 rx_ant, ar->pdev->pdev_id); 5951 if (ret) { 5952 ath11k_warn(ar->ab, "failed to set rx-chainmask: %d, req 0x%x\n", 5953 ret, rx_ant); 5954 return ret; 5955 } 5956 5957 ar->num_rx_chains = get_num_chains(rx_ant); 5958 5959 /* Reload HT/VHT/HE capability */ 5960 ath11k_mac_setup_ht_vht_cap(ar, &ar->pdev->cap, NULL); 5961 ath11k_mac_setup_he_cap(ar, &ar->pdev->cap); 5962 5963 return 0; 5964 } 5965 5966 static void ath11k_mgmt_over_wmi_tx_drop(struct ath11k *ar, struct sk_buff *skb) 5967 { 5968 int num_mgmt; 5969 5970 ieee80211_free_txskb(ar->hw, skb); 5971 5972 num_mgmt = atomic_dec_if_positive(&ar->num_pending_mgmt_tx); 5973 5974 if (num_mgmt < 0) 5975 WARN_ON_ONCE(1); 5976 5977 if (!num_mgmt) 5978 wake_up(&ar->txmgmt_empty_waitq); 5979 } 5980 5981 static void ath11k_mac_tx_mgmt_free(struct ath11k *ar, int buf_id) 5982 { 5983 struct sk_buff *msdu; 5984 struct ieee80211_tx_info *info; 5985 5986 spin_lock_bh(&ar->txmgmt_idr_lock); 5987 msdu = idr_remove(&ar->txmgmt_idr, buf_id); 5988 spin_unlock_bh(&ar->txmgmt_idr_lock); 5989 5990 if (!msdu) 5991 return; 5992 5993 dma_unmap_single(ar->ab->dev, ATH11K_SKB_CB(msdu)->paddr, msdu->len, 5994 DMA_TO_DEVICE); 5995 5996 info = IEEE80211_SKB_CB(msdu); 5997 memset(&info->status, 0, sizeof(info->status)); 5998 5999 ath11k_mgmt_over_wmi_tx_drop(ar, msdu); 6000 } 6001 6002 int ath11k_mac_tx_mgmt_pending_free(int buf_id, void *skb, void *ctx) 6003 { 6004 struct ath11k *ar = ctx; 6005 6006 ath11k_mac_tx_mgmt_free(ar, buf_id); 6007 6008 return 0; 6009 } 6010 6011 static int ath11k_mac_vif_txmgmt_idr_remove(int buf_id, void *skb, void *ctx) 6012 { 6013 struct ieee80211_vif *vif = ctx; 6014 struct ath11k_skb_cb *skb_cb = ATH11K_SKB_CB((struct sk_buff *)skb); 6015 struct ath11k *ar = skb_cb->ar; 6016 6017 if (skb_cb->vif == vif) 6018 ath11k_mac_tx_mgmt_free(ar, buf_id); 6019 6020 return 0; 6021 } 6022 6023 static int ath11k_mac_mgmt_tx_wmi(struct ath11k *ar, struct ath11k_vif *arvif, 6024 struct sk_buff *skb) 6025 { 6026 struct ath11k_base *ab = ar->ab; 6027 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 6028 struct ieee80211_tx_info *info; 6029 dma_addr_t paddr; 6030 int buf_id; 6031 int ret; 6032 6033 ATH11K_SKB_CB(skb)->ar = ar; 6034 6035 spin_lock_bh(&ar->txmgmt_idr_lock); 6036 buf_id = idr_alloc(&ar->txmgmt_idr, skb, 0, 6037 ATH11K_TX_MGMT_NUM_PENDING_MAX, GFP_ATOMIC); 6038 spin_unlock_bh(&ar->txmgmt_idr_lock); 6039 6040 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, 6041 "tx mgmt frame, buf id %d\n", buf_id); 6042 6043 if (buf_id < 0) 6044 return -ENOSPC; 6045 6046 info = IEEE80211_SKB_CB(skb); 6047 if (!(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) { 6048 if ((ieee80211_is_action(hdr->frame_control) || 6049 ieee80211_is_deauth(hdr->frame_control) || 6050 ieee80211_is_disassoc(hdr->frame_control)) && 6051 ieee80211_has_protected(hdr->frame_control)) { 6052 skb_put(skb, IEEE80211_CCMP_MIC_LEN); 6053 } 6054 } 6055 6056 paddr = dma_map_single(ab->dev, skb->data, skb->len, DMA_TO_DEVICE); 6057 if (dma_mapping_error(ab->dev, paddr)) { 6058 ath11k_warn(ab, "failed to DMA map mgmt Tx buffer\n"); 6059 ret = -EIO; 6060 goto err_free_idr; 6061 } 6062 6063 ATH11K_SKB_CB(skb)->paddr = paddr; 6064 6065 ret = ath11k_wmi_mgmt_send(ar, arvif->vdev_id, buf_id, skb); 6066 if (ret) { 6067 ath11k_warn(ar->ab, "failed to send mgmt frame: %d\n", ret); 6068 goto err_unmap_buf; 6069 } 6070 6071 return 0; 6072 6073 err_unmap_buf: 6074 dma_unmap_single(ab->dev, ATH11K_SKB_CB(skb)->paddr, 6075 skb->len, DMA_TO_DEVICE); 6076 err_free_idr: 6077 spin_lock_bh(&ar->txmgmt_idr_lock); 6078 idr_remove(&ar->txmgmt_idr, buf_id); 6079 spin_unlock_bh(&ar->txmgmt_idr_lock); 6080 6081 return ret; 6082 } 6083 6084 static void ath11k_mgmt_over_wmi_tx_purge(struct ath11k *ar) 6085 { 6086 struct sk_buff *skb; 6087 6088 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) 6089 ath11k_mgmt_over_wmi_tx_drop(ar, skb); 6090 } 6091 6092 static void ath11k_mgmt_over_wmi_tx_work(struct work_struct *work) 6093 { 6094 struct ath11k *ar = container_of(work, struct ath11k, wmi_mgmt_tx_work); 6095 struct ath11k_skb_cb *skb_cb; 6096 struct ath11k_vif *arvif; 6097 struct sk_buff *skb; 6098 int ret; 6099 6100 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) { 6101 skb_cb = ATH11K_SKB_CB(skb); 6102 if (!skb_cb->vif) { 6103 ath11k_warn(ar->ab, "no vif found for mgmt frame\n"); 6104 ath11k_mgmt_over_wmi_tx_drop(ar, skb); 6105 continue; 6106 } 6107 6108 arvif = ath11k_vif_to_arvif(skb_cb->vif); 6109 mutex_lock(&ar->conf_mutex); 6110 if (ar->allocated_vdev_map & (1LL << arvif->vdev_id)) { 6111 ret = ath11k_mac_mgmt_tx_wmi(ar, arvif, skb); 6112 if (ret) { 6113 ath11k_warn(ar->ab, "failed to tx mgmt frame, vdev_id %d :%d\n", 6114 arvif->vdev_id, ret); 6115 ath11k_mgmt_over_wmi_tx_drop(ar, skb); 6116 } else { 6117 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, 6118 "tx mgmt frame, vdev_id %d\n", 6119 arvif->vdev_id); 6120 } 6121 } else { 6122 ath11k_warn(ar->ab, 6123 "dropping mgmt frame for vdev %d, is_started %d\n", 6124 arvif->vdev_id, 6125 arvif->is_started); 6126 ath11k_mgmt_over_wmi_tx_drop(ar, skb); 6127 } 6128 mutex_unlock(&ar->conf_mutex); 6129 } 6130 } 6131 6132 static int ath11k_mac_mgmt_tx(struct ath11k *ar, struct sk_buff *skb, 6133 bool is_prb_rsp) 6134 { 6135 struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue; 6136 6137 if (test_bit(ATH11K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags)) 6138 return -ESHUTDOWN; 6139 6140 /* Drop probe response packets when the pending management tx 6141 * count has reached a certain threshold, so as to prioritize 6142 * other mgmt packets like auth and assoc to be sent on time 6143 * for establishing successful connections. 6144 */ 6145 if (is_prb_rsp && 6146 atomic_read(&ar->num_pending_mgmt_tx) > ATH11K_PRB_RSP_DROP_THRESHOLD) { 6147 ath11k_warn(ar->ab, 6148 "dropping probe response as pending queue is almost full\n"); 6149 return -ENOSPC; 6150 } 6151 6152 if (skb_queue_len_lockless(q) >= ATH11K_TX_MGMT_NUM_PENDING_MAX) { 6153 ath11k_warn(ar->ab, "mgmt tx queue is full\n"); 6154 return -ENOSPC; 6155 } 6156 6157 skb_queue_tail(q, skb); 6158 atomic_inc(&ar->num_pending_mgmt_tx); 6159 queue_work(ar->ab->workqueue_aux, &ar->wmi_mgmt_tx_work); 6160 6161 return 0; 6162 } 6163 6164 static void ath11k_mac_op_tx(struct ieee80211_hw *hw, 6165 struct ieee80211_tx_control *control, 6166 struct sk_buff *skb) 6167 { 6168 struct ath11k_skb_cb *skb_cb = ATH11K_SKB_CB(skb); 6169 struct ath11k *ar = hw->priv; 6170 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 6171 struct ieee80211_vif *vif = info->control.vif; 6172 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); 6173 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 6174 struct ieee80211_key_conf *key = info->control.hw_key; 6175 struct ath11k_sta *arsta = NULL; 6176 u32 info_flags = info->flags; 6177 bool is_prb_rsp; 6178 int ret; 6179 6180 memset(skb_cb, 0, sizeof(*skb_cb)); 6181 skb_cb->vif = vif; 6182 6183 if (key) { 6184 skb_cb->cipher = key->cipher; 6185 skb_cb->flags |= ATH11K_SKB_CIPHER_SET; 6186 } 6187 6188 if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP) { 6189 skb_cb->flags |= ATH11K_SKB_HW_80211_ENCAP; 6190 } else if (ieee80211_is_mgmt(hdr->frame_control)) { 6191 is_prb_rsp = ieee80211_is_probe_resp(hdr->frame_control); 6192 ret = ath11k_mac_mgmt_tx(ar, skb, is_prb_rsp); 6193 if (ret) { 6194 ath11k_warn(ar->ab, "failed to queue management frame %d\n", 6195 ret); 6196 ieee80211_free_txskb(ar->hw, skb); 6197 } 6198 return; 6199 } 6200 6201 if (control->sta) 6202 arsta = (struct ath11k_sta *)control->sta->drv_priv; 6203 6204 ret = ath11k_dp_tx(ar, arvif, arsta, skb); 6205 if (unlikely(ret)) { 6206 ath11k_warn(ar->ab, "failed to transmit frame %d\n", ret); 6207 ieee80211_free_txskb(ar->hw, skb); 6208 } 6209 } 6210 6211 void ath11k_mac_drain_tx(struct ath11k *ar) 6212 { 6213 /* make sure rcu-protected mac80211 tx path itself is drained */ 6214 synchronize_net(); 6215 6216 cancel_work_sync(&ar->wmi_mgmt_tx_work); 6217 ath11k_mgmt_over_wmi_tx_purge(ar); 6218 } 6219 6220 static int ath11k_mac_config_mon_status_default(struct ath11k *ar, bool enable) 6221 { 6222 struct htt_rx_ring_tlv_filter tlv_filter = {0}; 6223 struct ath11k_base *ab = ar->ab; 6224 int i, ret = 0; 6225 u32 ring_id; 6226 6227 if (enable) { 6228 tlv_filter = ath11k_mac_mon_status_filter_default; 6229 if (ath11k_debugfs_rx_filter(ar)) 6230 tlv_filter.rx_filter = ath11k_debugfs_rx_filter(ar); 6231 } 6232 6233 for (i = 0; i < ab->hw_params.num_rxmda_per_pdev; i++) { 6234 ring_id = ar->dp.rx_mon_status_refill_ring[i].refill_buf_ring.ring_id; 6235 ret = ath11k_dp_tx_htt_rx_filter_setup(ar->ab, ring_id, 6236 ar->dp.mac_id + i, 6237 HAL_RXDMA_MONITOR_STATUS, 6238 DP_RX_BUFFER_SIZE, 6239 &tlv_filter); 6240 } 6241 6242 if (enable && !ar->ab->hw_params.rxdma1_enable) 6243 mod_timer(&ar->ab->mon_reap_timer, jiffies + 6244 msecs_to_jiffies(ATH11K_MON_TIMER_INTERVAL)); 6245 6246 return ret; 6247 } 6248 6249 static void ath11k_mac_wait_reconfigure(struct ath11k_base *ab) 6250 { 6251 int recovery_start_count; 6252 6253 if (!ab->is_reset) 6254 return; 6255 6256 recovery_start_count = atomic_inc_return(&ab->recovery_start_count); 6257 ath11k_dbg(ab, ATH11K_DBG_MAC, "recovery start count %d\n", recovery_start_count); 6258 6259 if (recovery_start_count == ab->num_radios) { 6260 complete(&ab->recovery_start); 6261 ath11k_dbg(ab, ATH11K_DBG_MAC, "recovery started success\n"); 6262 } 6263 6264 ath11k_dbg(ab, ATH11K_DBG_MAC, "waiting reconfigure...\n"); 6265 6266 wait_for_completion_timeout(&ab->reconfigure_complete, 6267 ATH11K_RECONFIGURE_TIMEOUT_HZ); 6268 } 6269 6270 static int ath11k_mac_op_start(struct ieee80211_hw *hw) 6271 { 6272 struct ath11k *ar = hw->priv; 6273 struct ath11k_base *ab = ar->ab; 6274 struct ath11k_pdev *pdev = ar->pdev; 6275 int ret; 6276 6277 if (ath11k_ftm_mode) { 6278 ath11k_warn(ab, "mac operations not supported in factory test mode\n"); 6279 return -EOPNOTSUPP; 6280 } 6281 6282 ath11k_mac_drain_tx(ar); 6283 mutex_lock(&ar->conf_mutex); 6284 6285 switch (ar->state) { 6286 case ATH11K_STATE_OFF: 6287 ar->state = ATH11K_STATE_ON; 6288 break; 6289 case ATH11K_STATE_RESTARTING: 6290 ar->state = ATH11K_STATE_RESTARTED; 6291 ath11k_mac_wait_reconfigure(ab); 6292 break; 6293 case ATH11K_STATE_RESTARTED: 6294 case ATH11K_STATE_WEDGED: 6295 case ATH11K_STATE_ON: 6296 case ATH11K_STATE_FTM: 6297 WARN_ON(1); 6298 ret = -EINVAL; 6299 goto err; 6300 } 6301 6302 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_PMF_QOS, 6303 1, pdev->pdev_id); 6304 6305 if (ret) { 6306 ath11k_err(ar->ab, "failed to enable PMF QOS: (%d\n", ret); 6307 goto err; 6308 } 6309 6310 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_DYNAMIC_BW, 1, 6311 pdev->pdev_id); 6312 if (ret) { 6313 ath11k_err(ar->ab, "failed to enable dynamic bw: %d\n", ret); 6314 goto err; 6315 } 6316 6317 if (test_bit(WMI_TLV_SERVICE_SPOOF_MAC_SUPPORT, ar->wmi->wmi_ab->svc_map)) { 6318 ret = ath11k_wmi_scan_prob_req_oui(ar, ar->mac_addr); 6319 if (ret) { 6320 ath11k_err(ab, "failed to set prob req oui: %i\n", ret); 6321 goto err; 6322 } 6323 } 6324 6325 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_ARP_AC_OVERRIDE, 6326 0, pdev->pdev_id); 6327 if (ret) { 6328 ath11k_err(ab, "failed to set ac override for ARP: %d\n", 6329 ret); 6330 goto err; 6331 } 6332 6333 ret = ath11k_wmi_send_dfs_phyerr_offload_enable_cmd(ar, pdev->pdev_id); 6334 if (ret) { 6335 ath11k_err(ab, "failed to offload radar detection: %d\n", 6336 ret); 6337 goto err; 6338 } 6339 6340 ret = ath11k_dp_tx_htt_h2t_ppdu_stats_req(ar, 6341 HTT_PPDU_STATS_TAG_DEFAULT); 6342 if (ret) { 6343 ath11k_err(ab, "failed to req ppdu stats: %d\n", ret); 6344 goto err; 6345 } 6346 6347 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_MESH_MCAST_ENABLE, 6348 1, pdev->pdev_id); 6349 6350 if (ret) { 6351 ath11k_err(ar->ab, "failed to enable MESH MCAST ENABLE: (%d\n", ret); 6352 goto err; 6353 } 6354 6355 __ath11k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask); 6356 6357 /* TODO: Do we need to enable ANI? */ 6358 6359 ath11k_reg_update_chan_list(ar, false); 6360 6361 ar->num_started_vdevs = 0; 6362 ar->num_created_vdevs = 0; 6363 ar->num_peers = 0; 6364 ar->allocated_vdev_map = 0; 6365 6366 /* Configure monitor status ring with default rx_filter to get rx status 6367 * such as rssi, rx_duration. 6368 */ 6369 ret = ath11k_mac_config_mon_status_default(ar, true); 6370 if (ret) { 6371 ath11k_err(ab, "failed to configure monitor status ring with default rx_filter: (%d)\n", 6372 ret); 6373 goto err; 6374 } 6375 6376 /* Configure the hash seed for hash based reo dest ring selection */ 6377 ath11k_wmi_pdev_lro_cfg(ar, ar->pdev->pdev_id); 6378 6379 /* allow device to enter IMPS */ 6380 if (ab->hw_params.idle_ps) { 6381 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_IDLE_PS_CONFIG, 6382 1, pdev->pdev_id); 6383 if (ret) { 6384 ath11k_err(ab, "failed to enable idle ps: %d\n", ret); 6385 goto err; 6386 } 6387 } 6388 6389 mutex_unlock(&ar->conf_mutex); 6390 6391 rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx], 6392 &ab->pdevs[ar->pdev_idx]); 6393 6394 return 0; 6395 6396 err: 6397 ar->state = ATH11K_STATE_OFF; 6398 mutex_unlock(&ar->conf_mutex); 6399 6400 return ret; 6401 } 6402 6403 static void ath11k_mac_op_stop(struct ieee80211_hw *hw) 6404 { 6405 struct ath11k *ar = hw->priv; 6406 struct htt_ppdu_stats_info *ppdu_stats, *tmp; 6407 int ret; 6408 6409 ath11k_mac_drain_tx(ar); 6410 6411 mutex_lock(&ar->conf_mutex); 6412 ret = ath11k_mac_config_mon_status_default(ar, false); 6413 if (ret) 6414 ath11k_err(ar->ab, "failed to clear rx_filter for monitor status ring: (%d)\n", 6415 ret); 6416 6417 clear_bit(ATH11K_CAC_RUNNING, &ar->dev_flags); 6418 ar->state = ATH11K_STATE_OFF; 6419 mutex_unlock(&ar->conf_mutex); 6420 6421 cancel_delayed_work_sync(&ar->scan.timeout); 6422 cancel_work_sync(&ar->regd_update_work); 6423 cancel_work_sync(&ar->ab->update_11d_work); 6424 6425 if (ar->state_11d == ATH11K_11D_PREPARING) { 6426 ar->state_11d = ATH11K_11D_IDLE; 6427 complete(&ar->completed_11d_scan); 6428 } 6429 6430 spin_lock_bh(&ar->data_lock); 6431 list_for_each_entry_safe(ppdu_stats, tmp, &ar->ppdu_stats_info, list) { 6432 list_del(&ppdu_stats->list); 6433 kfree(ppdu_stats); 6434 } 6435 spin_unlock_bh(&ar->data_lock); 6436 6437 rcu_assign_pointer(ar->ab->pdevs_active[ar->pdev_idx], NULL); 6438 6439 synchronize_rcu(); 6440 6441 atomic_set(&ar->num_pending_mgmt_tx, 0); 6442 } 6443 6444 static int ath11k_mac_setup_vdev_params_mbssid(struct ath11k_vif *arvif, 6445 u32 *flags, u32 *tx_vdev_id) 6446 { 6447 struct ath11k *ar = arvif->ar; 6448 struct ath11k_vif *tx_arvif; 6449 struct ieee80211_vif *tx_vif; 6450 6451 *tx_vdev_id = 0; 6452 tx_vif = arvif->vif->mbssid_tx_vif; 6453 if (!tx_vif) { 6454 *flags = WMI_HOST_VDEV_FLAGS_NON_MBSSID_AP; 6455 return 0; 6456 } 6457 6458 tx_arvif = (void *)tx_vif->drv_priv; 6459 6460 if (arvif->vif->bss_conf.nontransmitted) { 6461 if (ar->hw->wiphy != ieee80211_vif_to_wdev(tx_vif)->wiphy) 6462 return -EINVAL; 6463 6464 *flags = WMI_HOST_VDEV_FLAGS_NON_TRANSMIT_AP; 6465 *tx_vdev_id = ath11k_vif_to_arvif(tx_vif)->vdev_id; 6466 } else if (tx_arvif == arvif) { 6467 *flags = WMI_HOST_VDEV_FLAGS_TRANSMIT_AP; 6468 } else { 6469 return -EINVAL; 6470 } 6471 6472 if (arvif->vif->bss_conf.ema_ap) 6473 *flags |= WMI_HOST_VDEV_FLAGS_EMA_MODE; 6474 6475 return 0; 6476 } 6477 6478 static int ath11k_mac_setup_vdev_create_params(struct ath11k_vif *arvif, 6479 struct vdev_create_params *params) 6480 { 6481 struct ath11k *ar = arvif->ar; 6482 struct ath11k_pdev *pdev = ar->pdev; 6483 int ret; 6484 6485 params->if_id = arvif->vdev_id; 6486 params->type = arvif->vdev_type; 6487 params->subtype = arvif->vdev_subtype; 6488 params->pdev_id = pdev->pdev_id; 6489 params->mbssid_flags = 0; 6490 params->mbssid_tx_vdev_id = 0; 6491 6492 if (!test_bit(WMI_TLV_SERVICE_MBSS_PARAM_IN_VDEV_START_SUPPORT, 6493 ar->ab->wmi_ab.svc_map)) { 6494 ret = ath11k_mac_setup_vdev_params_mbssid(arvif, 6495 ¶ms->mbssid_flags, 6496 ¶ms->mbssid_tx_vdev_id); 6497 if (ret) 6498 return ret; 6499 } 6500 6501 if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) { 6502 params->chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains; 6503 params->chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains; 6504 } 6505 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) { 6506 params->chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains; 6507 params->chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains; 6508 } 6509 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP && 6510 ar->supports_6ghz) { 6511 params->chains[NL80211_BAND_6GHZ].tx = ar->num_tx_chains; 6512 params->chains[NL80211_BAND_6GHZ].rx = ar->num_rx_chains; 6513 } 6514 return 0; 6515 } 6516 6517 static void ath11k_mac_op_update_vif_offload(struct ieee80211_hw *hw, 6518 struct ieee80211_vif *vif) 6519 { 6520 struct ath11k *ar = hw->priv; 6521 struct ath11k_base *ab = ar->ab; 6522 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); 6523 u32 param_id, param_value; 6524 int ret; 6525 6526 param_id = WMI_VDEV_PARAM_TX_ENCAP_TYPE; 6527 if (ath11k_frame_mode != ATH11K_HW_TXRX_ETHERNET || 6528 (vif->type != NL80211_IFTYPE_STATION && 6529 vif->type != NL80211_IFTYPE_AP)) 6530 vif->offload_flags &= ~(IEEE80211_OFFLOAD_ENCAP_ENABLED | 6531 IEEE80211_OFFLOAD_DECAP_ENABLED); 6532 6533 if (vif->offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED) 6534 param_value = ATH11K_HW_TXRX_ETHERNET; 6535 else if (test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags)) 6536 param_value = ATH11K_HW_TXRX_RAW; 6537 else 6538 param_value = ATH11K_HW_TXRX_NATIVE_WIFI; 6539 6540 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 6541 param_id, param_value); 6542 if (ret) { 6543 ath11k_warn(ab, "failed to set vdev %d tx encap mode: %d\n", 6544 arvif->vdev_id, ret); 6545 vif->offload_flags &= ~IEEE80211_OFFLOAD_ENCAP_ENABLED; 6546 } 6547 6548 param_id = WMI_VDEV_PARAM_RX_DECAP_TYPE; 6549 if (vif->offload_flags & IEEE80211_OFFLOAD_DECAP_ENABLED) 6550 param_value = ATH11K_HW_TXRX_ETHERNET; 6551 else if (test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags)) 6552 param_value = ATH11K_HW_TXRX_RAW; 6553 else 6554 param_value = ATH11K_HW_TXRX_NATIVE_WIFI; 6555 6556 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 6557 param_id, param_value); 6558 if (ret) { 6559 ath11k_warn(ab, "failed to set vdev %d rx decap mode: %d\n", 6560 arvif->vdev_id, ret); 6561 vif->offload_flags &= ~IEEE80211_OFFLOAD_DECAP_ENABLED; 6562 } 6563 } 6564 6565 static bool ath11k_mac_vif_ap_active_any(struct ath11k_base *ab) 6566 { 6567 struct ath11k *ar; 6568 struct ath11k_pdev *pdev; 6569 struct ath11k_vif *arvif; 6570 int i; 6571 6572 for (i = 0; i < ab->num_radios; i++) { 6573 pdev = &ab->pdevs[i]; 6574 ar = pdev->ar; 6575 list_for_each_entry(arvif, &ar->arvifs, list) { 6576 if (arvif->is_up && arvif->vdev_type == WMI_VDEV_TYPE_AP) 6577 return true; 6578 } 6579 } 6580 return false; 6581 } 6582 6583 void ath11k_mac_11d_scan_start(struct ath11k *ar, u32 vdev_id) 6584 { 6585 struct wmi_11d_scan_start_params param; 6586 int ret; 6587 6588 mutex_lock(&ar->ab->vdev_id_11d_lock); 6589 6590 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev id for 11d scan %d\n", 6591 ar->vdev_id_11d_scan); 6592 6593 if (ar->regdom_set_by_user) 6594 goto fin; 6595 6596 if (ar->vdev_id_11d_scan != ATH11K_11D_INVALID_VDEV_ID) 6597 goto fin; 6598 6599 if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map)) 6600 goto fin; 6601 6602 if (ath11k_mac_vif_ap_active_any(ar->ab)) 6603 goto fin; 6604 6605 param.vdev_id = vdev_id; 6606 param.start_interval_msec = 0; 6607 param.scan_period_msec = ATH11K_SCAN_11D_INTERVAL; 6608 6609 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "start 11d scan\n"); 6610 6611 ret = ath11k_wmi_send_11d_scan_start_cmd(ar, ¶m); 6612 if (ret) { 6613 ath11k_warn(ar->ab, "failed to start 11d scan vdev %d ret: %d\n", 6614 vdev_id, ret); 6615 } else { 6616 ar->vdev_id_11d_scan = vdev_id; 6617 if (ar->state_11d == ATH11K_11D_PREPARING) 6618 ar->state_11d = ATH11K_11D_RUNNING; 6619 } 6620 6621 fin: 6622 if (ar->state_11d == ATH11K_11D_PREPARING) { 6623 ar->state_11d = ATH11K_11D_IDLE; 6624 complete(&ar->completed_11d_scan); 6625 } 6626 6627 mutex_unlock(&ar->ab->vdev_id_11d_lock); 6628 } 6629 6630 void ath11k_mac_11d_scan_stop(struct ath11k *ar) 6631 { 6632 int ret; 6633 u32 vdev_id; 6634 6635 if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map)) 6636 return; 6637 6638 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "stop 11d scan\n"); 6639 6640 mutex_lock(&ar->ab->vdev_id_11d_lock); 6641 6642 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "stop 11d vdev id %d\n", 6643 ar->vdev_id_11d_scan); 6644 6645 if (ar->state_11d == ATH11K_11D_PREPARING) { 6646 ar->state_11d = ATH11K_11D_IDLE; 6647 complete(&ar->completed_11d_scan); 6648 } 6649 6650 if (ar->vdev_id_11d_scan != ATH11K_11D_INVALID_VDEV_ID) { 6651 vdev_id = ar->vdev_id_11d_scan; 6652 6653 ret = ath11k_wmi_send_11d_scan_stop_cmd(ar, vdev_id); 6654 if (ret) { 6655 ath11k_warn(ar->ab, 6656 "failed to stopt 11d scan vdev %d ret: %d\n", 6657 vdev_id, ret); 6658 } else { 6659 ar->vdev_id_11d_scan = ATH11K_11D_INVALID_VDEV_ID; 6660 ar->state_11d = ATH11K_11D_IDLE; 6661 complete(&ar->completed_11d_scan); 6662 } 6663 } 6664 mutex_unlock(&ar->ab->vdev_id_11d_lock); 6665 } 6666 6667 void ath11k_mac_11d_scan_stop_all(struct ath11k_base *ab) 6668 { 6669 struct ath11k *ar; 6670 struct ath11k_pdev *pdev; 6671 int i; 6672 6673 ath11k_dbg(ab, ATH11K_DBG_MAC, "stop soc 11d scan\n"); 6674 6675 for (i = 0; i < ab->num_radios; i++) { 6676 pdev = &ab->pdevs[i]; 6677 ar = pdev->ar; 6678 6679 ath11k_mac_11d_scan_stop(ar); 6680 } 6681 } 6682 6683 static int ath11k_mac_vdev_delete(struct ath11k *ar, struct ath11k_vif *arvif) 6684 { 6685 unsigned long time_left; 6686 struct ieee80211_vif *vif = arvif->vif; 6687 int ret = 0; 6688 6689 lockdep_assert_held(&ar->conf_mutex); 6690 6691 reinit_completion(&ar->vdev_delete_done); 6692 6693 ret = ath11k_wmi_vdev_delete(ar, arvif->vdev_id); 6694 if (ret) { 6695 ath11k_warn(ar->ab, "failed to delete WMI vdev %d: %d\n", 6696 arvif->vdev_id, ret); 6697 return ret; 6698 } 6699 6700 time_left = wait_for_completion_timeout(&ar->vdev_delete_done, 6701 ATH11K_VDEV_DELETE_TIMEOUT_HZ); 6702 if (time_left == 0) { 6703 ath11k_warn(ar->ab, "Timeout in receiving vdev delete response\n"); 6704 return -ETIMEDOUT; 6705 } 6706 6707 ar->ab->free_vdev_map |= 1LL << (arvif->vdev_id); 6708 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id); 6709 ar->num_created_vdevs--; 6710 6711 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %pM deleted, vdev_id %d\n", 6712 vif->addr, arvif->vdev_id); 6713 6714 return ret; 6715 } 6716 6717 static int ath11k_mac_op_add_interface(struct ieee80211_hw *hw, 6718 struct ieee80211_vif *vif) 6719 { 6720 struct ath11k *ar = hw->priv; 6721 struct ath11k_base *ab = ar->ab; 6722 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); 6723 struct vdev_create_params vdev_param = {0}; 6724 struct peer_create_params peer_param; 6725 u32 param_id, param_value; 6726 u16 nss; 6727 int i; 6728 int ret, fbret; 6729 int bit; 6730 6731 vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD; 6732 6733 mutex_lock(&ar->conf_mutex); 6734 6735 if (vif->type == NL80211_IFTYPE_AP && 6736 ar->num_peers > (ar->max_num_peers - 1)) { 6737 ath11k_warn(ab, "failed to create vdev due to insufficient peer entry resource in firmware\n"); 6738 ret = -ENOBUFS; 6739 goto err; 6740 } 6741 6742 if (ar->num_created_vdevs > (TARGET_NUM_VDEVS(ab) - 1)) { 6743 ath11k_warn(ab, "failed to create vdev %u, reached max vdev limit %d\n", 6744 ar->num_created_vdevs, TARGET_NUM_VDEVS(ab)); 6745 ret = -EBUSY; 6746 goto err; 6747 } 6748 6749 /* In the case of hardware recovery, debugfs files are 6750 * not deleted since ieee80211_ops.remove_interface() is 6751 * not invoked. In such cases, try to delete the files. 6752 * These will be re-created later. 6753 */ 6754 ath11k_debugfs_remove_interface(arvif); 6755 6756 memset(arvif, 0, sizeof(*arvif)); 6757 6758 arvif->ar = ar; 6759 arvif->vif = vif; 6760 6761 INIT_LIST_HEAD(&arvif->list); 6762 INIT_DELAYED_WORK(&arvif->connection_loss_work, 6763 ath11k_mac_vif_sta_connection_loss_work); 6764 6765 for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) { 6766 arvif->bitrate_mask.control[i].legacy = 0xffffffff; 6767 arvif->bitrate_mask.control[i].gi = NL80211_TXRATE_FORCE_SGI; 6768 memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff, 6769 sizeof(arvif->bitrate_mask.control[i].ht_mcs)); 6770 memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff, 6771 sizeof(arvif->bitrate_mask.control[i].vht_mcs)); 6772 memset(arvif->bitrate_mask.control[i].he_mcs, 0xff, 6773 sizeof(arvif->bitrate_mask.control[i].he_mcs)); 6774 } 6775 6776 bit = __ffs64(ab->free_vdev_map); 6777 6778 arvif->vdev_id = bit; 6779 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE; 6780 6781 switch (vif->type) { 6782 case NL80211_IFTYPE_UNSPECIFIED: 6783 case NL80211_IFTYPE_STATION: 6784 arvif->vdev_type = WMI_VDEV_TYPE_STA; 6785 break; 6786 case NL80211_IFTYPE_MESH_POINT: 6787 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_MESH_11S; 6788 fallthrough; 6789 case NL80211_IFTYPE_AP: 6790 arvif->vdev_type = WMI_VDEV_TYPE_AP; 6791 break; 6792 case NL80211_IFTYPE_MONITOR: 6793 arvif->vdev_type = WMI_VDEV_TYPE_MONITOR; 6794 ar->monitor_vdev_id = bit; 6795 break; 6796 default: 6797 WARN_ON(1); 6798 break; 6799 } 6800 6801 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "add interface id %d type %d subtype %d map %llx\n", 6802 arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype, 6803 ab->free_vdev_map); 6804 6805 vif->cab_queue = arvif->vdev_id % (ATH11K_HW_MAX_QUEUES - 1); 6806 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++) 6807 vif->hw_queue[i] = i % (ATH11K_HW_MAX_QUEUES - 1); 6808 6809 ret = ath11k_mac_setup_vdev_create_params(arvif, &vdev_param); 6810 if (ret) { 6811 ath11k_warn(ab, "failed to create vdev parameters %d: %d\n", 6812 arvif->vdev_id, ret); 6813 goto err; 6814 } 6815 6816 ret = ath11k_wmi_vdev_create(ar, vif->addr, &vdev_param); 6817 if (ret) { 6818 ath11k_warn(ab, "failed to create WMI vdev %d: %d\n", 6819 arvif->vdev_id, ret); 6820 goto err; 6821 } 6822 6823 ar->num_created_vdevs++; 6824 ath11k_dbg(ab, ATH11K_DBG_MAC, "vdev %pM created, vdev_id %d\n", 6825 vif->addr, arvif->vdev_id); 6826 ar->allocated_vdev_map |= 1LL << arvif->vdev_id; 6827 ab->free_vdev_map &= ~(1LL << arvif->vdev_id); 6828 6829 spin_lock_bh(&ar->data_lock); 6830 list_add(&arvif->list, &ar->arvifs); 6831 spin_unlock_bh(&ar->data_lock); 6832 6833 ath11k_mac_op_update_vif_offload(hw, vif); 6834 6835 nss = get_num_chains(ar->cfg_tx_chainmask) ? : 1; 6836 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 6837 WMI_VDEV_PARAM_NSS, nss); 6838 if (ret) { 6839 ath11k_warn(ab, "failed to set vdev %d chainmask 0x%x, nss %d :%d\n", 6840 arvif->vdev_id, ar->cfg_tx_chainmask, nss, ret); 6841 goto err_vdev_del; 6842 } 6843 6844 switch (arvif->vdev_type) { 6845 case WMI_VDEV_TYPE_AP: 6846 peer_param.vdev_id = arvif->vdev_id; 6847 peer_param.peer_addr = vif->addr; 6848 peer_param.peer_type = WMI_PEER_TYPE_DEFAULT; 6849 ret = ath11k_peer_create(ar, arvif, NULL, &peer_param); 6850 if (ret) { 6851 ath11k_warn(ab, "failed to vdev %d create peer for AP: %d\n", 6852 arvif->vdev_id, ret); 6853 goto err_vdev_del; 6854 } 6855 6856 ret = ath11k_mac_set_kickout(arvif); 6857 if (ret) { 6858 ath11k_warn(ar->ab, "failed to set vdev %i kickout parameters: %d\n", 6859 arvif->vdev_id, ret); 6860 goto err_peer_del; 6861 } 6862 6863 ath11k_mac_11d_scan_stop_all(ar->ab); 6864 break; 6865 case WMI_VDEV_TYPE_STA: 6866 param_id = WMI_STA_PS_PARAM_RX_WAKE_POLICY; 6867 param_value = WMI_STA_PS_RX_WAKE_POLICY_WAKE; 6868 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id, 6869 param_id, param_value); 6870 if (ret) { 6871 ath11k_warn(ar->ab, "failed to set vdev %d RX wake policy: %d\n", 6872 arvif->vdev_id, ret); 6873 goto err_peer_del; 6874 } 6875 6876 param_id = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD; 6877 param_value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS; 6878 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id, 6879 param_id, param_value); 6880 if (ret) { 6881 ath11k_warn(ar->ab, "failed to set vdev %d TX wake threshold: %d\n", 6882 arvif->vdev_id, ret); 6883 goto err_peer_del; 6884 } 6885 6886 param_id = WMI_STA_PS_PARAM_PSPOLL_COUNT; 6887 param_value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX; 6888 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id, 6889 param_id, param_value); 6890 if (ret) { 6891 ath11k_warn(ar->ab, "failed to set vdev %d pspoll count: %d\n", 6892 arvif->vdev_id, ret); 6893 goto err_peer_del; 6894 } 6895 6896 ret = ath11k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, 6897 WMI_STA_PS_MODE_DISABLED); 6898 if (ret) { 6899 ath11k_warn(ar->ab, "failed to disable vdev %d ps mode: %d\n", 6900 arvif->vdev_id, ret); 6901 goto err_peer_del; 6902 } 6903 6904 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ab->wmi_ab.svc_map)) { 6905 reinit_completion(&ar->completed_11d_scan); 6906 ar->state_11d = ATH11K_11D_PREPARING; 6907 } 6908 break; 6909 case WMI_VDEV_TYPE_MONITOR: 6910 set_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags); 6911 break; 6912 default: 6913 break; 6914 } 6915 6916 arvif->txpower = vif->bss_conf.txpower; 6917 ret = ath11k_mac_txpower_recalc(ar); 6918 if (ret) 6919 goto err_peer_del; 6920 6921 param_id = WMI_VDEV_PARAM_RTS_THRESHOLD; 6922 param_value = ar->hw->wiphy->rts_threshold; 6923 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 6924 param_id, param_value); 6925 if (ret) { 6926 ath11k_warn(ar->ab, "failed to set rts threshold for vdev %d: %d\n", 6927 arvif->vdev_id, ret); 6928 } 6929 6930 ath11k_dp_vdev_tx_attach(ar, arvif); 6931 6932 ath11k_debugfs_add_interface(arvif); 6933 6934 if (vif->type != NL80211_IFTYPE_MONITOR && 6935 test_bit(ATH11K_FLAG_MONITOR_CONF_ENABLED, &ar->monitor_flags)) { 6936 ret = ath11k_mac_monitor_vdev_create(ar); 6937 if (ret) 6938 ath11k_warn(ar->ab, "failed to create monitor vdev during add interface: %d", 6939 ret); 6940 } 6941 6942 mutex_unlock(&ar->conf_mutex); 6943 6944 return 0; 6945 6946 err_peer_del: 6947 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) { 6948 fbret = ath11k_peer_delete(ar, arvif->vdev_id, vif->addr); 6949 if (fbret) { 6950 ath11k_warn(ar->ab, "fallback fail to delete peer addr %pM vdev_id %d ret %d\n", 6951 vif->addr, arvif->vdev_id, fbret); 6952 goto err; 6953 } 6954 } 6955 6956 err_vdev_del: 6957 ath11k_mac_vdev_delete(ar, arvif); 6958 spin_lock_bh(&ar->data_lock); 6959 list_del(&arvif->list); 6960 spin_unlock_bh(&ar->data_lock); 6961 6962 err: 6963 mutex_unlock(&ar->conf_mutex); 6964 6965 return ret; 6966 } 6967 6968 static int ath11k_mac_vif_unref(int buf_id, void *skb, void *ctx) 6969 { 6970 struct ieee80211_vif *vif = (struct ieee80211_vif *)ctx; 6971 struct ath11k_skb_cb *skb_cb = ATH11K_SKB_CB((struct sk_buff *)skb); 6972 6973 if (skb_cb->vif == vif) 6974 skb_cb->vif = NULL; 6975 6976 return 0; 6977 } 6978 6979 static void ath11k_mac_op_remove_interface(struct ieee80211_hw *hw, 6980 struct ieee80211_vif *vif) 6981 { 6982 struct ath11k *ar = hw->priv; 6983 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); 6984 struct ath11k_base *ab = ar->ab; 6985 int ret; 6986 int i; 6987 6988 cancel_delayed_work_sync(&arvif->connection_loss_work); 6989 6990 mutex_lock(&ar->conf_mutex); 6991 6992 ath11k_dbg(ab, ATH11K_DBG_MAC, "remove interface (vdev %d)\n", 6993 arvif->vdev_id); 6994 6995 ret = ath11k_spectral_vif_stop(arvif); 6996 if (ret) 6997 ath11k_warn(ab, "failed to stop spectral for vdev %i: %d\n", 6998 arvif->vdev_id, ret); 6999 7000 if (arvif->vdev_type == WMI_VDEV_TYPE_STA) 7001 ath11k_mac_11d_scan_stop(ar); 7002 7003 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) { 7004 ret = ath11k_peer_delete(ar, arvif->vdev_id, vif->addr); 7005 if (ret) 7006 ath11k_warn(ab, "failed to submit AP self-peer removal on vdev %d: %d\n", 7007 arvif->vdev_id, ret); 7008 } 7009 7010 ret = ath11k_mac_vdev_delete(ar, arvif); 7011 if (ret) { 7012 ath11k_warn(ab, "failed to delete vdev %d: %d\n", 7013 arvif->vdev_id, ret); 7014 goto err_vdev_del; 7015 } 7016 7017 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { 7018 clear_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags); 7019 ar->monitor_vdev_id = -1; 7020 } else if (test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags) && 7021 !test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags)) { 7022 ret = ath11k_mac_monitor_vdev_delete(ar); 7023 if (ret) 7024 /* continue even if there's an error */ 7025 ath11k_warn(ar->ab, "failed to delete vdev monitor during remove interface: %d", 7026 ret); 7027 } 7028 7029 err_vdev_del: 7030 spin_lock_bh(&ar->data_lock); 7031 list_del(&arvif->list); 7032 spin_unlock_bh(&ar->data_lock); 7033 7034 ath11k_peer_cleanup(ar, arvif->vdev_id); 7035 7036 idr_for_each(&ar->txmgmt_idr, 7037 ath11k_mac_vif_txmgmt_idr_remove, vif); 7038 7039 for (i = 0; i < ab->hw_params.max_tx_ring; i++) { 7040 spin_lock_bh(&ab->dp.tx_ring[i].tx_idr_lock); 7041 idr_for_each(&ab->dp.tx_ring[i].txbuf_idr, 7042 ath11k_mac_vif_unref, vif); 7043 spin_unlock_bh(&ab->dp.tx_ring[i].tx_idr_lock); 7044 } 7045 7046 /* Recalc txpower for remaining vdev */ 7047 ath11k_mac_txpower_recalc(ar); 7048 7049 ath11k_debugfs_remove_interface(arvif); 7050 7051 /* TODO: recal traffic pause state based on the available vdevs */ 7052 7053 mutex_unlock(&ar->conf_mutex); 7054 } 7055 7056 /* FIXME: Has to be verified. */ 7057 #define SUPPORTED_FILTERS \ 7058 (FIF_ALLMULTI | \ 7059 FIF_CONTROL | \ 7060 FIF_PSPOLL | \ 7061 FIF_OTHER_BSS | \ 7062 FIF_BCN_PRBRESP_PROMISC | \ 7063 FIF_PROBE_REQ | \ 7064 FIF_FCSFAIL) 7065 7066 static void ath11k_mac_op_configure_filter(struct ieee80211_hw *hw, 7067 unsigned int changed_flags, 7068 unsigned int *total_flags, 7069 u64 multicast) 7070 { 7071 struct ath11k *ar = hw->priv; 7072 7073 mutex_lock(&ar->conf_mutex); 7074 7075 *total_flags &= SUPPORTED_FILTERS; 7076 ar->filter_flags = *total_flags; 7077 7078 mutex_unlock(&ar->conf_mutex); 7079 } 7080 7081 static int ath11k_mac_op_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant) 7082 { 7083 struct ath11k *ar = hw->priv; 7084 7085 mutex_lock(&ar->conf_mutex); 7086 7087 *tx_ant = ar->cfg_tx_chainmask; 7088 *rx_ant = ar->cfg_rx_chainmask; 7089 7090 mutex_unlock(&ar->conf_mutex); 7091 7092 return 0; 7093 } 7094 7095 static int ath11k_mac_op_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant) 7096 { 7097 struct ath11k *ar = hw->priv; 7098 int ret; 7099 7100 mutex_lock(&ar->conf_mutex); 7101 ret = __ath11k_set_antenna(ar, tx_ant, rx_ant); 7102 mutex_unlock(&ar->conf_mutex); 7103 7104 return ret; 7105 } 7106 7107 static int ath11k_mac_op_ampdu_action(struct ieee80211_hw *hw, 7108 struct ieee80211_vif *vif, 7109 struct ieee80211_ampdu_params *params) 7110 { 7111 struct ath11k *ar = hw->priv; 7112 int ret = -EINVAL; 7113 7114 mutex_lock(&ar->conf_mutex); 7115 7116 switch (params->action) { 7117 case IEEE80211_AMPDU_RX_START: 7118 ret = ath11k_dp_rx_ampdu_start(ar, params); 7119 break; 7120 case IEEE80211_AMPDU_RX_STOP: 7121 ret = ath11k_dp_rx_ampdu_stop(ar, params); 7122 break; 7123 case IEEE80211_AMPDU_TX_START: 7124 case IEEE80211_AMPDU_TX_STOP_CONT: 7125 case IEEE80211_AMPDU_TX_STOP_FLUSH: 7126 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT: 7127 case IEEE80211_AMPDU_TX_OPERATIONAL: 7128 /* Tx A-MPDU aggregation offloaded to hw/fw so deny mac80211 7129 * Tx aggregation requests. 7130 */ 7131 ret = -EOPNOTSUPP; 7132 break; 7133 } 7134 7135 mutex_unlock(&ar->conf_mutex); 7136 7137 return ret; 7138 } 7139 7140 static int ath11k_mac_op_add_chanctx(struct ieee80211_hw *hw, 7141 struct ieee80211_chanctx_conf *ctx) 7142 { 7143 struct ath11k *ar = hw->priv; 7144 struct ath11k_base *ab = ar->ab; 7145 7146 ath11k_dbg(ab, ATH11K_DBG_MAC, 7147 "chanctx add freq %u width %d ptr %p\n", 7148 ctx->def.chan->center_freq, ctx->def.width, ctx); 7149 7150 mutex_lock(&ar->conf_mutex); 7151 7152 spin_lock_bh(&ar->data_lock); 7153 /* TODO: In case of multiple channel context, populate rx_channel from 7154 * Rx PPDU desc information. 7155 */ 7156 ar->rx_channel = ctx->def.chan; 7157 spin_unlock_bh(&ar->data_lock); 7158 7159 mutex_unlock(&ar->conf_mutex); 7160 7161 return 0; 7162 } 7163 7164 static void ath11k_mac_op_remove_chanctx(struct ieee80211_hw *hw, 7165 struct ieee80211_chanctx_conf *ctx) 7166 { 7167 struct ath11k *ar = hw->priv; 7168 struct ath11k_base *ab = ar->ab; 7169 7170 ath11k_dbg(ab, ATH11K_DBG_MAC, 7171 "chanctx remove freq %u width %d ptr %p\n", 7172 ctx->def.chan->center_freq, ctx->def.width, ctx); 7173 7174 mutex_lock(&ar->conf_mutex); 7175 7176 spin_lock_bh(&ar->data_lock); 7177 /* TODO: In case of there is one more channel context left, populate 7178 * rx_channel with the channel of that remaining channel context. 7179 */ 7180 ar->rx_channel = NULL; 7181 spin_unlock_bh(&ar->data_lock); 7182 7183 mutex_unlock(&ar->conf_mutex); 7184 } 7185 7186 static int 7187 ath11k_mac_vdev_start_restart(struct ath11k_vif *arvif, 7188 struct ieee80211_chanctx_conf *ctx, 7189 bool restart) 7190 { 7191 struct ath11k *ar = arvif->ar; 7192 struct ath11k_base *ab = ar->ab; 7193 struct wmi_vdev_start_req_arg arg = {}; 7194 const struct cfg80211_chan_def *chandef = &ctx->def; 7195 int ret = 0; 7196 7197 lockdep_assert_held(&ar->conf_mutex); 7198 7199 reinit_completion(&ar->vdev_setup_done); 7200 7201 arg.vdev_id = arvif->vdev_id; 7202 arg.dtim_period = arvif->dtim_period; 7203 arg.bcn_intval = arvif->beacon_interval; 7204 7205 arg.channel.freq = chandef->chan->center_freq; 7206 arg.channel.band_center_freq1 = chandef->center_freq1; 7207 arg.channel.band_center_freq2 = chandef->center_freq2; 7208 arg.channel.mode = 7209 ath11k_phymodes[chandef->chan->band][chandef->width]; 7210 7211 arg.channel.min_power = 0; 7212 arg.channel.max_power = chandef->chan->max_power; 7213 arg.channel.max_reg_power = chandef->chan->max_reg_power; 7214 arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain; 7215 7216 arg.pref_tx_streams = ar->num_tx_chains; 7217 arg.pref_rx_streams = ar->num_rx_chains; 7218 7219 arg.mbssid_flags = 0; 7220 arg.mbssid_tx_vdev_id = 0; 7221 if (test_bit(WMI_TLV_SERVICE_MBSS_PARAM_IN_VDEV_START_SUPPORT, 7222 ar->ab->wmi_ab.svc_map)) { 7223 ret = ath11k_mac_setup_vdev_params_mbssid(arvif, 7224 &arg.mbssid_flags, 7225 &arg.mbssid_tx_vdev_id); 7226 if (ret) 7227 return ret; 7228 } 7229 7230 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) { 7231 arg.ssid = arvif->u.ap.ssid; 7232 arg.ssid_len = arvif->u.ap.ssid_len; 7233 arg.hidden_ssid = arvif->u.ap.hidden_ssid; 7234 7235 /* For now allow DFS for AP mode */ 7236 arg.channel.chan_radar = 7237 !!(chandef->chan->flags & IEEE80211_CHAN_RADAR); 7238 7239 arg.channel.freq2_radar = ctx->radar_enabled; 7240 7241 arg.channel.passive = arg.channel.chan_radar; 7242 7243 spin_lock_bh(&ab->base_lock); 7244 arg.regdomain = ar->ab->dfs_region; 7245 spin_unlock_bh(&ab->base_lock); 7246 } 7247 7248 arg.channel.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR); 7249 7250 ath11k_dbg(ab, ATH11K_DBG_MAC, 7251 "vdev %d start center_freq %d phymode %s\n", 7252 arg.vdev_id, arg.channel.freq, 7253 ath11k_wmi_phymode_str(arg.channel.mode)); 7254 7255 ret = ath11k_wmi_vdev_start(ar, &arg, restart); 7256 if (ret) { 7257 ath11k_warn(ar->ab, "failed to %s WMI vdev %i\n", 7258 restart ? "restart" : "start", arg.vdev_id); 7259 return ret; 7260 } 7261 7262 ret = ath11k_mac_vdev_setup_sync(ar); 7263 if (ret) { 7264 ath11k_warn(ab, "failed to synchronize setup for vdev %i %s: %d\n", 7265 arg.vdev_id, restart ? "restart" : "start", ret); 7266 return ret; 7267 } 7268 7269 if (!restart) 7270 ar->num_started_vdevs++; 7271 7272 ath11k_dbg(ab, ATH11K_DBG_MAC, "vdev %pM started, vdev_id %d\n", 7273 arvif->vif->addr, arvif->vdev_id); 7274 7275 /* Enable CAC Flag in the driver by checking the channel DFS cac time, 7276 * i.e dfs_cac_ms value which will be valid only for radar channels 7277 * and state as NL80211_DFS_USABLE which indicates CAC needs to be 7278 * done before channel usage. This flags is used to drop rx packets. 7279 * during CAC. 7280 */ 7281 /* TODO Set the flag for other interface types as required */ 7282 if (arvif->vdev_type == WMI_VDEV_TYPE_AP && 7283 chandef->chan->dfs_cac_ms && 7284 chandef->chan->dfs_state == NL80211_DFS_USABLE) { 7285 set_bit(ATH11K_CAC_RUNNING, &ar->dev_flags); 7286 ath11k_dbg(ab, ATH11K_DBG_MAC, 7287 "CAC Started in chan_freq %d for vdev %d\n", 7288 arg.channel.freq, arg.vdev_id); 7289 } 7290 7291 ret = ath11k_mac_set_txbf_conf(arvif); 7292 if (ret) 7293 ath11k_warn(ab, "failed to set txbf conf for vdev %d: %d\n", 7294 arvif->vdev_id, ret); 7295 7296 return 0; 7297 } 7298 7299 static int ath11k_mac_vdev_stop(struct ath11k_vif *arvif) 7300 { 7301 struct ath11k *ar = arvif->ar; 7302 int ret; 7303 7304 lockdep_assert_held(&ar->conf_mutex); 7305 7306 reinit_completion(&ar->vdev_setup_done); 7307 7308 ret = ath11k_wmi_vdev_stop(ar, arvif->vdev_id); 7309 if (ret) { 7310 ath11k_warn(ar->ab, "failed to stop WMI vdev %i: %d\n", 7311 arvif->vdev_id, ret); 7312 goto err; 7313 } 7314 7315 ret = ath11k_mac_vdev_setup_sync(ar); 7316 if (ret) { 7317 ath11k_warn(ar->ab, "failed to synchronize setup for vdev %i: %d\n", 7318 arvif->vdev_id, ret); 7319 goto err; 7320 } 7321 7322 WARN_ON(ar->num_started_vdevs == 0); 7323 7324 ar->num_started_vdevs--; 7325 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %pM stopped, vdev_id %d\n", 7326 arvif->vif->addr, arvif->vdev_id); 7327 7328 if (test_bit(ATH11K_CAC_RUNNING, &ar->dev_flags)) { 7329 clear_bit(ATH11K_CAC_RUNNING, &ar->dev_flags); 7330 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "CAC Stopped for vdev %d\n", 7331 arvif->vdev_id); 7332 } 7333 7334 return 0; 7335 err: 7336 return ret; 7337 } 7338 7339 static int ath11k_mac_vdev_start(struct ath11k_vif *arvif, 7340 struct ieee80211_chanctx_conf *ctx) 7341 { 7342 return ath11k_mac_vdev_start_restart(arvif, ctx, false); 7343 } 7344 7345 static int ath11k_mac_vdev_restart(struct ath11k_vif *arvif, 7346 struct ieee80211_chanctx_conf *ctx) 7347 { 7348 return ath11k_mac_vdev_start_restart(arvif, ctx, true); 7349 } 7350 7351 struct ath11k_mac_change_chanctx_arg { 7352 struct ieee80211_chanctx_conf *ctx; 7353 struct ieee80211_vif_chanctx_switch *vifs; 7354 int n_vifs; 7355 int next_vif; 7356 }; 7357 7358 static void 7359 ath11k_mac_change_chanctx_cnt_iter(void *data, u8 *mac, 7360 struct ieee80211_vif *vif) 7361 { 7362 struct ath11k_mac_change_chanctx_arg *arg = data; 7363 7364 if (rcu_access_pointer(vif->bss_conf.chanctx_conf) != arg->ctx) 7365 return; 7366 7367 arg->n_vifs++; 7368 } 7369 7370 static void 7371 ath11k_mac_change_chanctx_fill_iter(void *data, u8 *mac, 7372 struct ieee80211_vif *vif) 7373 { 7374 struct ath11k_mac_change_chanctx_arg *arg = data; 7375 struct ieee80211_chanctx_conf *ctx; 7376 7377 ctx = rcu_access_pointer(vif->bss_conf.chanctx_conf); 7378 if (ctx != arg->ctx) 7379 return; 7380 7381 if (WARN_ON(arg->next_vif == arg->n_vifs)) 7382 return; 7383 7384 arg->vifs[arg->next_vif].vif = vif; 7385 arg->vifs[arg->next_vif].old_ctx = ctx; 7386 arg->vifs[arg->next_vif].new_ctx = ctx; 7387 arg->next_vif++; 7388 } 7389 7390 static void 7391 ath11k_mac_update_vif_chan(struct ath11k *ar, 7392 struct ieee80211_vif_chanctx_switch *vifs, 7393 int n_vifs) 7394 { 7395 struct ath11k_base *ab = ar->ab; 7396 struct ath11k_vif *arvif, *tx_arvif = NULL; 7397 struct ieee80211_vif *mbssid_tx_vif; 7398 int ret; 7399 int i; 7400 bool monitor_vif = false; 7401 7402 lockdep_assert_held(&ar->conf_mutex); 7403 7404 /* Associated channel resources of all relevant vdevs 7405 * should be available for the channel switch now. 7406 */ 7407 7408 /* TODO: Update ar->rx_channel */ 7409 7410 for (i = 0; i < n_vifs; i++) { 7411 arvif = (void *)vifs[i].vif->drv_priv; 7412 7413 if (WARN_ON(!arvif->is_started)) 7414 continue; 7415 7416 /* change_chanctx can be called even before vdev_up from 7417 * ieee80211_start_ap->ieee80211_vif_use_channel-> 7418 * ieee80211_recalc_radar_chanctx. 7419 * 7420 * Firmware expect vdev_restart only if vdev is up. 7421 * If vdev is down then it expect vdev_stop->vdev_start. 7422 */ 7423 if (arvif->is_up) { 7424 ret = ath11k_mac_vdev_restart(arvif, vifs[i].new_ctx); 7425 if (ret) { 7426 ath11k_warn(ab, "failed to restart vdev %d: %d\n", 7427 arvif->vdev_id, ret); 7428 continue; 7429 } 7430 } else { 7431 ret = ath11k_mac_vdev_stop(arvif); 7432 if (ret) { 7433 ath11k_warn(ab, "failed to stop vdev %d: %d\n", 7434 arvif->vdev_id, ret); 7435 continue; 7436 } 7437 7438 ret = ath11k_mac_vdev_start(arvif, vifs[i].new_ctx); 7439 if (ret) 7440 ath11k_warn(ab, "failed to start vdev %d: %d\n", 7441 arvif->vdev_id, ret); 7442 7443 continue; 7444 } 7445 7446 ret = ath11k_mac_setup_bcn_tmpl(arvif); 7447 if (ret) 7448 ath11k_warn(ab, "failed to update bcn tmpl during csa: %d\n", 7449 ret); 7450 7451 mbssid_tx_vif = arvif->vif->mbssid_tx_vif; 7452 if (mbssid_tx_vif) 7453 tx_arvif = (struct ath11k_vif *)mbssid_tx_vif->drv_priv; 7454 7455 ret = ath11k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid, 7456 arvif->bssid, 7457 tx_arvif ? tx_arvif->bssid : NULL, 7458 arvif->vif->bss_conf.bssid_index, 7459 1 << arvif->vif->bss_conf.bssid_indicator); 7460 if (ret) { 7461 ath11k_warn(ab, "failed to bring vdev up %d: %d\n", 7462 arvif->vdev_id, ret); 7463 continue; 7464 } 7465 } 7466 7467 /* Restart the internal monitor vdev on new channel */ 7468 if (!monitor_vif && 7469 test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags)) { 7470 ret = ath11k_mac_monitor_stop(ar); 7471 if (ret) { 7472 ath11k_warn(ar->ab, "failed to stop monitor during vif channel update: %d", 7473 ret); 7474 return; 7475 } 7476 7477 ret = ath11k_mac_monitor_start(ar); 7478 if (ret) { 7479 ath11k_warn(ar->ab, "failed to start monitor during vif channel update: %d", 7480 ret); 7481 return; 7482 } 7483 } 7484 } 7485 7486 static void 7487 ath11k_mac_update_active_vif_chan(struct ath11k *ar, 7488 struct ieee80211_chanctx_conf *ctx) 7489 { 7490 struct ath11k_mac_change_chanctx_arg arg = { .ctx = ctx }; 7491 7492 lockdep_assert_held(&ar->conf_mutex); 7493 7494 ieee80211_iterate_active_interfaces_atomic(ar->hw, 7495 IEEE80211_IFACE_ITER_NORMAL, 7496 ath11k_mac_change_chanctx_cnt_iter, 7497 &arg); 7498 if (arg.n_vifs == 0) 7499 return; 7500 7501 arg.vifs = kcalloc(arg.n_vifs, sizeof(arg.vifs[0]), GFP_KERNEL); 7502 if (!arg.vifs) 7503 return; 7504 7505 ieee80211_iterate_active_interfaces_atomic(ar->hw, 7506 IEEE80211_IFACE_ITER_NORMAL, 7507 ath11k_mac_change_chanctx_fill_iter, 7508 &arg); 7509 7510 ath11k_mac_update_vif_chan(ar, arg.vifs, arg.n_vifs); 7511 7512 kfree(arg.vifs); 7513 } 7514 7515 static void ath11k_mac_op_change_chanctx(struct ieee80211_hw *hw, 7516 struct ieee80211_chanctx_conf *ctx, 7517 u32 changed) 7518 { 7519 struct ath11k *ar = hw->priv; 7520 struct ath11k_base *ab = ar->ab; 7521 7522 mutex_lock(&ar->conf_mutex); 7523 7524 ath11k_dbg(ab, ATH11K_DBG_MAC, 7525 "chanctx change freq %u width %d ptr %p changed %x\n", 7526 ctx->def.chan->center_freq, ctx->def.width, ctx, changed); 7527 7528 /* This shouldn't really happen because channel switching should use 7529 * switch_vif_chanctx(). 7530 */ 7531 if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL)) 7532 goto unlock; 7533 7534 if (changed & IEEE80211_CHANCTX_CHANGE_WIDTH || 7535 changed & IEEE80211_CHANCTX_CHANGE_RADAR) 7536 ath11k_mac_update_active_vif_chan(ar, ctx); 7537 7538 /* TODO: Recalc radar detection */ 7539 7540 unlock: 7541 mutex_unlock(&ar->conf_mutex); 7542 } 7543 7544 static int ath11k_start_vdev_delay(struct ieee80211_hw *hw, 7545 struct ieee80211_vif *vif) 7546 { 7547 struct ath11k *ar = hw->priv; 7548 struct ath11k_base *ab = ar->ab; 7549 struct ath11k_vif *arvif = (void *)vif->drv_priv; 7550 int ret; 7551 7552 if (WARN_ON(arvif->is_started)) 7553 return -EBUSY; 7554 7555 ret = ath11k_mac_vdev_start(arvif, &arvif->chanctx); 7556 if (ret) { 7557 ath11k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n", 7558 arvif->vdev_id, vif->addr, 7559 arvif->chanctx.def.chan->center_freq, ret); 7560 return ret; 7561 } 7562 7563 /* Reconfigure hardware rate code since it is cleared by firmware. 7564 */ 7565 if (ar->hw_rate_code > 0) { 7566 u32 vdev_param = WMI_VDEV_PARAM_MGMT_RATE; 7567 7568 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param, 7569 ar->hw_rate_code); 7570 if (ret) { 7571 ath11k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret); 7572 return ret; 7573 } 7574 } 7575 7576 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { 7577 ret = ath11k_wmi_vdev_up(ar, arvif->vdev_id, 0, ar->mac_addr, 7578 NULL, 0, 0); 7579 if (ret) { 7580 ath11k_warn(ab, "failed put monitor up: %d\n", ret); 7581 return ret; 7582 } 7583 } 7584 7585 arvif->is_started = true; 7586 7587 /* TODO: Setup ps and cts/rts protection */ 7588 return 0; 7589 } 7590 7591 static int 7592 ath11k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw, 7593 struct ieee80211_vif *vif, 7594 struct ieee80211_bss_conf *link_conf, 7595 struct ieee80211_chanctx_conf *ctx) 7596 { 7597 struct ath11k *ar = hw->priv; 7598 struct ath11k_base *ab = ar->ab; 7599 struct ath11k_vif *arvif = (void *)vif->drv_priv; 7600 int ret; 7601 struct peer_create_params param; 7602 7603 mutex_lock(&ar->conf_mutex); 7604 7605 ath11k_dbg(ab, ATH11K_DBG_MAC, 7606 "chanctx assign ptr %p vdev_id %i\n", 7607 ctx, arvif->vdev_id); 7608 7609 /* for QCA6390 bss peer must be created before vdev_start */ 7610 if (ab->hw_params.vdev_start_delay && 7611 arvif->vdev_type != WMI_VDEV_TYPE_AP && 7612 arvif->vdev_type != WMI_VDEV_TYPE_MONITOR && 7613 !ath11k_peer_find_by_vdev_id(ab, arvif->vdev_id)) { 7614 memcpy(&arvif->chanctx, ctx, sizeof(*ctx)); 7615 ret = 0; 7616 goto out; 7617 } 7618 7619 if (WARN_ON(arvif->is_started)) { 7620 ret = -EBUSY; 7621 goto out; 7622 } 7623 7624 if (ab->hw_params.vdev_start_delay && 7625 arvif->vdev_type != WMI_VDEV_TYPE_AP && 7626 arvif->vdev_type != WMI_VDEV_TYPE_MONITOR) { 7627 param.vdev_id = arvif->vdev_id; 7628 param.peer_type = WMI_PEER_TYPE_DEFAULT; 7629 param.peer_addr = ar->mac_addr; 7630 7631 ret = ath11k_peer_create(ar, arvif, NULL, ¶m); 7632 if (ret) { 7633 ath11k_warn(ab, "failed to create peer after vdev start delay: %d", 7634 ret); 7635 goto out; 7636 } 7637 } 7638 7639 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { 7640 ret = ath11k_mac_monitor_start(ar); 7641 if (ret) { 7642 ath11k_warn(ar->ab, "failed to start monitor during vif channel context assignment: %d", 7643 ret); 7644 goto out; 7645 } 7646 7647 arvif->is_started = true; 7648 goto out; 7649 } 7650 7651 ret = ath11k_mac_vdev_start(arvif, ctx); 7652 if (ret) { 7653 ath11k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n", 7654 arvif->vdev_id, vif->addr, 7655 ctx->def.chan->center_freq, ret); 7656 goto out; 7657 } 7658 7659 arvif->is_started = true; 7660 7661 if (arvif->vdev_type != WMI_VDEV_TYPE_MONITOR && 7662 test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags)) { 7663 ret = ath11k_mac_monitor_start(ar); 7664 if (ret) { 7665 ath11k_warn(ar->ab, "failed to start monitor during vif channel context assignment: %d", 7666 ret); 7667 goto out; 7668 } 7669 } 7670 7671 /* TODO: Setup ps and cts/rts protection */ 7672 7673 ret = 0; 7674 7675 out: 7676 mutex_unlock(&ar->conf_mutex); 7677 7678 return ret; 7679 } 7680 7681 static void 7682 ath11k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw, 7683 struct ieee80211_vif *vif, 7684 struct ieee80211_bss_conf *link_conf, 7685 struct ieee80211_chanctx_conf *ctx) 7686 { 7687 struct ath11k *ar = hw->priv; 7688 struct ath11k_base *ab = ar->ab; 7689 struct ath11k_vif *arvif = (void *)vif->drv_priv; 7690 struct ath11k_peer *peer; 7691 int ret; 7692 7693 mutex_lock(&ar->conf_mutex); 7694 7695 ath11k_dbg(ab, ATH11K_DBG_MAC, 7696 "chanctx unassign ptr %p vdev_id %i\n", 7697 ctx, arvif->vdev_id); 7698 7699 WARN_ON(!arvif->is_started); 7700 7701 if (ab->hw_params.vdev_start_delay && 7702 arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { 7703 spin_lock_bh(&ab->base_lock); 7704 peer = ath11k_peer_find_by_addr(ab, ar->mac_addr); 7705 spin_unlock_bh(&ab->base_lock); 7706 if (peer) 7707 ath11k_peer_delete(ar, arvif->vdev_id, ar->mac_addr); 7708 } 7709 7710 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { 7711 ret = ath11k_mac_monitor_stop(ar); 7712 if (ret) { 7713 ath11k_warn(ar->ab, "failed to stop monitor during vif channel context unassignment: %d", 7714 ret); 7715 mutex_unlock(&ar->conf_mutex); 7716 return; 7717 } 7718 7719 arvif->is_started = false; 7720 mutex_unlock(&ar->conf_mutex); 7721 return; 7722 } 7723 7724 ret = ath11k_mac_vdev_stop(arvif); 7725 if (ret) 7726 ath11k_warn(ab, "failed to stop vdev %i: %d\n", 7727 arvif->vdev_id, ret); 7728 7729 arvif->is_started = false; 7730 7731 if (ab->hw_params.vdev_start_delay && 7732 arvif->vdev_type == WMI_VDEV_TYPE_STA) { 7733 ret = ath11k_peer_delete(ar, arvif->vdev_id, arvif->bssid); 7734 if (ret) 7735 ath11k_warn(ar->ab, 7736 "failed to delete peer %pM for vdev %d: %d\n", 7737 arvif->bssid, arvif->vdev_id, ret); 7738 else 7739 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, 7740 "removed peer %pM vdev %d after vdev stop\n", 7741 arvif->bssid, arvif->vdev_id); 7742 } 7743 7744 if (ab->hw_params.vdev_start_delay && 7745 arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) 7746 ath11k_wmi_vdev_down(ar, arvif->vdev_id); 7747 7748 if (arvif->vdev_type != WMI_VDEV_TYPE_MONITOR && 7749 ar->num_started_vdevs == 1 && 7750 test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags)) { 7751 ret = ath11k_mac_monitor_stop(ar); 7752 if (ret) 7753 /* continue even if there's an error */ 7754 ath11k_warn(ar->ab, "failed to stop monitor during vif channel context unassignment: %d", 7755 ret); 7756 } 7757 7758 if (arvif->vdev_type == WMI_VDEV_TYPE_STA) 7759 ath11k_mac_11d_scan_start(ar, arvif->vdev_id); 7760 7761 mutex_unlock(&ar->conf_mutex); 7762 } 7763 7764 static int 7765 ath11k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw, 7766 struct ieee80211_vif_chanctx_switch *vifs, 7767 int n_vifs, 7768 enum ieee80211_chanctx_switch_mode mode) 7769 { 7770 struct ath11k *ar = hw->priv; 7771 7772 mutex_lock(&ar->conf_mutex); 7773 7774 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, 7775 "chanctx switch n_vifs %d mode %d\n", 7776 n_vifs, mode); 7777 ath11k_mac_update_vif_chan(ar, vifs, n_vifs); 7778 7779 mutex_unlock(&ar->conf_mutex); 7780 7781 return 0; 7782 } 7783 7784 static int 7785 ath11k_set_vdev_param_to_all_vifs(struct ath11k *ar, int param, u32 value) 7786 { 7787 struct ath11k_vif *arvif; 7788 int ret = 0; 7789 7790 mutex_lock(&ar->conf_mutex); 7791 list_for_each_entry(arvif, &ar->arvifs, list) { 7792 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "setting mac vdev %d param %d value %d\n", 7793 param, arvif->vdev_id, value); 7794 7795 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 7796 param, value); 7797 if (ret) { 7798 ath11k_warn(ar->ab, "failed to set param %d for vdev %d: %d\n", 7799 param, arvif->vdev_id, ret); 7800 break; 7801 } 7802 } 7803 mutex_unlock(&ar->conf_mutex); 7804 return ret; 7805 } 7806 7807 /* mac80211 stores device specific RTS/Fragmentation threshold value, 7808 * this is set interface specific to firmware from ath11k driver 7809 */ 7810 static int ath11k_mac_op_set_rts_threshold(struct ieee80211_hw *hw, u32 value) 7811 { 7812 struct ath11k *ar = hw->priv; 7813 int param_id = WMI_VDEV_PARAM_RTS_THRESHOLD; 7814 7815 return ath11k_set_vdev_param_to_all_vifs(ar, param_id, value); 7816 } 7817 7818 static int ath11k_mac_op_set_frag_threshold(struct ieee80211_hw *hw, u32 value) 7819 { 7820 /* Even though there's a WMI vdev param for fragmentation threshold no 7821 * known firmware actually implements it. Moreover it is not possible to 7822 * rely frame fragmentation to mac80211 because firmware clears the 7823 * "more fragments" bit in frame control making it impossible for remote 7824 * devices to reassemble frames. 7825 * 7826 * Hence implement a dummy callback just to say fragmentation isn't 7827 * supported. This effectively prevents mac80211 from doing frame 7828 * fragmentation in software. 7829 */ 7830 return -EOPNOTSUPP; 7831 } 7832 7833 static int ath11k_mac_flush_tx_complete(struct ath11k *ar) 7834 { 7835 long time_left; 7836 int ret = 0; 7837 7838 time_left = wait_event_timeout(ar->dp.tx_empty_waitq, 7839 (atomic_read(&ar->dp.num_tx_pending) == 0), 7840 ATH11K_FLUSH_TIMEOUT); 7841 if (time_left == 0) { 7842 ath11k_warn(ar->ab, "failed to flush transmit queue, data pkts pending %d\n", 7843 atomic_read(&ar->dp.num_tx_pending)); 7844 ret = -ETIMEDOUT; 7845 } 7846 7847 time_left = wait_event_timeout(ar->txmgmt_empty_waitq, 7848 (atomic_read(&ar->num_pending_mgmt_tx) == 0), 7849 ATH11K_FLUSH_TIMEOUT); 7850 if (time_left == 0) { 7851 ath11k_warn(ar->ab, "failed to flush mgmt transmit queue, mgmt pkts pending %d\n", 7852 atomic_read(&ar->num_pending_mgmt_tx)); 7853 ret = -ETIMEDOUT; 7854 } 7855 7856 return ret; 7857 } 7858 7859 int ath11k_mac_wait_tx_complete(struct ath11k *ar) 7860 { 7861 ath11k_mac_drain_tx(ar); 7862 return ath11k_mac_flush_tx_complete(ar); 7863 } 7864 7865 static void ath11k_mac_op_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 7866 u32 queues, bool drop) 7867 { 7868 struct ath11k *ar = hw->priv; 7869 7870 if (drop) 7871 return; 7872 7873 ath11k_mac_flush_tx_complete(ar); 7874 } 7875 7876 static bool 7877 ath11k_mac_has_single_legacy_rate(struct ath11k *ar, 7878 enum nl80211_band band, 7879 const struct cfg80211_bitrate_mask *mask) 7880 { 7881 int num_rates = 0; 7882 7883 num_rates = hweight32(mask->control[band].legacy); 7884 7885 if (ath11k_mac_bitrate_mask_num_ht_rates(ar, band, mask)) 7886 return false; 7887 7888 if (ath11k_mac_bitrate_mask_num_vht_rates(ar, band, mask)) 7889 return false; 7890 7891 if (ath11k_mac_bitrate_mask_num_he_rates(ar, band, mask)) 7892 return false; 7893 7894 return num_rates == 1; 7895 } 7896 7897 static __le16 7898 ath11k_mac_get_tx_mcs_map(const struct ieee80211_sta_he_cap *he_cap) 7899 { 7900 if (he_cap->he_cap_elem.phy_cap_info[0] & 7901 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G) 7902 return he_cap->he_mcs_nss_supp.tx_mcs_80p80; 7903 7904 if (he_cap->he_cap_elem.phy_cap_info[0] & 7905 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G) 7906 return he_cap->he_mcs_nss_supp.tx_mcs_160; 7907 7908 return he_cap->he_mcs_nss_supp.tx_mcs_80; 7909 } 7910 7911 static bool 7912 ath11k_mac_bitrate_mask_get_single_nss(struct ath11k *ar, 7913 enum nl80211_band band, 7914 const struct cfg80211_bitrate_mask *mask, 7915 int *nss) 7916 { 7917 struct ieee80211_supported_band *sband = &ar->mac.sbands[band]; 7918 u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); 7919 u16 he_mcs_map = 0; 7920 u8 ht_nss_mask = 0; 7921 u8 vht_nss_mask = 0; 7922 u8 he_nss_mask = 0; 7923 int i; 7924 7925 /* No need to consider legacy here. Basic rates are always present 7926 * in bitrate mask 7927 */ 7928 7929 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) { 7930 if (mask->control[band].ht_mcs[i] == 0) 7931 continue; 7932 else if (mask->control[band].ht_mcs[i] == 7933 sband->ht_cap.mcs.rx_mask[i]) 7934 ht_nss_mask |= BIT(i); 7935 else 7936 return false; 7937 } 7938 7939 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) { 7940 if (mask->control[band].vht_mcs[i] == 0) 7941 continue; 7942 else if (mask->control[band].vht_mcs[i] == 7943 ath11k_mac_get_max_vht_mcs_map(vht_mcs_map, i)) 7944 vht_nss_mask |= BIT(i); 7945 else 7946 return false; 7947 } 7948 7949 he_mcs_map = le16_to_cpu(ath11k_mac_get_tx_mcs_map(&sband->iftype_data->he_cap)); 7950 7951 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) { 7952 if (mask->control[band].he_mcs[i] == 0) 7953 continue; 7954 7955 if (mask->control[band].he_mcs[i] == 7956 ath11k_mac_get_max_he_mcs_map(he_mcs_map, i)) 7957 he_nss_mask |= BIT(i); 7958 else 7959 return false; 7960 } 7961 7962 if (ht_nss_mask != vht_nss_mask || ht_nss_mask != he_nss_mask) 7963 return false; 7964 7965 if (ht_nss_mask == 0) 7966 return false; 7967 7968 if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask) 7969 return false; 7970 7971 *nss = fls(ht_nss_mask); 7972 7973 return true; 7974 } 7975 7976 static int 7977 ath11k_mac_get_single_legacy_rate(struct ath11k *ar, 7978 enum nl80211_band band, 7979 const struct cfg80211_bitrate_mask *mask, 7980 u32 *rate, u8 *nss) 7981 { 7982 int rate_idx; 7983 u16 bitrate; 7984 u8 preamble; 7985 u8 hw_rate; 7986 7987 if (hweight32(mask->control[band].legacy) != 1) 7988 return -EINVAL; 7989 7990 rate_idx = ffs(mask->control[band].legacy) - 1; 7991 7992 if (band == NL80211_BAND_5GHZ || band == NL80211_BAND_6GHZ) 7993 rate_idx += ATH11K_MAC_FIRST_OFDM_RATE_IDX; 7994 7995 hw_rate = ath11k_legacy_rates[rate_idx].hw_value; 7996 bitrate = ath11k_legacy_rates[rate_idx].bitrate; 7997 7998 if (ath11k_mac_bitrate_is_cck(bitrate)) 7999 preamble = WMI_RATE_PREAMBLE_CCK; 8000 else 8001 preamble = WMI_RATE_PREAMBLE_OFDM; 8002 8003 *nss = 1; 8004 *rate = ATH11K_HW_RATE_CODE(hw_rate, 0, preamble); 8005 8006 return 0; 8007 } 8008 8009 static int 8010 ath11k_mac_set_fixed_rate_gi_ltf(struct ath11k_vif *arvif, u8 he_gi, u8 he_ltf) 8011 { 8012 struct ath11k *ar = arvif->ar; 8013 int ret; 8014 8015 /* 0.8 = 0, 1.6 = 2 and 3.2 = 3. */ 8016 if (he_gi && he_gi != 0xFF) 8017 he_gi += 1; 8018 8019 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 8020 WMI_VDEV_PARAM_SGI, he_gi); 8021 if (ret) { 8022 ath11k_warn(ar->ab, "failed to set he gi %d: %d\n", 8023 he_gi, ret); 8024 return ret; 8025 } 8026 /* start from 1 */ 8027 if (he_ltf != 0xFF) 8028 he_ltf += 1; 8029 8030 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 8031 WMI_VDEV_PARAM_HE_LTF, he_ltf); 8032 if (ret) { 8033 ath11k_warn(ar->ab, "failed to set he ltf %d: %d\n", 8034 he_ltf, ret); 8035 return ret; 8036 } 8037 8038 return 0; 8039 } 8040 8041 static int 8042 ath11k_mac_set_auto_rate_gi_ltf(struct ath11k_vif *arvif, u16 he_gi, u8 he_ltf) 8043 { 8044 struct ath11k *ar = arvif->ar; 8045 int ret; 8046 u32 he_ar_gi_ltf; 8047 8048 if (he_gi != 0xFF) { 8049 switch (he_gi) { 8050 case NL80211_RATE_INFO_HE_GI_0_8: 8051 he_gi = WMI_AUTORATE_800NS_GI; 8052 break; 8053 case NL80211_RATE_INFO_HE_GI_1_6: 8054 he_gi = WMI_AUTORATE_1600NS_GI; 8055 break; 8056 case NL80211_RATE_INFO_HE_GI_3_2: 8057 he_gi = WMI_AUTORATE_3200NS_GI; 8058 break; 8059 default: 8060 ath11k_warn(ar->ab, "invalid he gi: %d\n", he_gi); 8061 return -EINVAL; 8062 } 8063 } 8064 8065 if (he_ltf != 0xFF) { 8066 switch (he_ltf) { 8067 case NL80211_RATE_INFO_HE_1XLTF: 8068 he_ltf = WMI_HE_AUTORATE_LTF_1X; 8069 break; 8070 case NL80211_RATE_INFO_HE_2XLTF: 8071 he_ltf = WMI_HE_AUTORATE_LTF_2X; 8072 break; 8073 case NL80211_RATE_INFO_HE_4XLTF: 8074 he_ltf = WMI_HE_AUTORATE_LTF_4X; 8075 break; 8076 default: 8077 ath11k_warn(ar->ab, "invalid he ltf: %d\n", he_ltf); 8078 return -EINVAL; 8079 } 8080 } 8081 8082 he_ar_gi_ltf = he_gi | he_ltf; 8083 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 8084 WMI_VDEV_PARAM_AUTORATE_MISC_CFG, 8085 he_ar_gi_ltf); 8086 if (ret) { 8087 ath11k_warn(ar->ab, 8088 "failed to set he autorate gi %u ltf %u: %d\n", 8089 he_gi, he_ltf, ret); 8090 return ret; 8091 } 8092 8093 return 0; 8094 } 8095 8096 static int ath11k_mac_set_rate_params(struct ath11k_vif *arvif, 8097 u32 rate, u8 nss, u8 sgi, u8 ldpc, 8098 u8 he_gi, u8 he_ltf, bool he_fixed_rate) 8099 { 8100 struct ath11k *ar = arvif->ar; 8101 u32 vdev_param; 8102 int ret; 8103 8104 lockdep_assert_held(&ar->conf_mutex); 8105 8106 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, 8107 "set rate params vdev %i rate 0x%02x nss 0x%02x sgi 0x%02x ldpc 0x%02x he_gi 0x%02x he_ltf 0x%02x he_fixed_rate %d\n", 8108 arvif->vdev_id, rate, nss, sgi, ldpc, he_gi, 8109 he_ltf, he_fixed_rate); 8110 8111 if (!arvif->vif->bss_conf.he_support) { 8112 vdev_param = WMI_VDEV_PARAM_FIXED_RATE; 8113 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 8114 vdev_param, rate); 8115 if (ret) { 8116 ath11k_warn(ar->ab, "failed to set fixed rate param 0x%02x: %d\n", 8117 rate, ret); 8118 return ret; 8119 } 8120 } 8121 8122 vdev_param = WMI_VDEV_PARAM_NSS; 8123 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 8124 vdev_param, nss); 8125 if (ret) { 8126 ath11k_warn(ar->ab, "failed to set nss param %d: %d\n", 8127 nss, ret); 8128 return ret; 8129 } 8130 8131 vdev_param = WMI_VDEV_PARAM_LDPC; 8132 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 8133 vdev_param, ldpc); 8134 if (ret) { 8135 ath11k_warn(ar->ab, "failed to set ldpc param %d: %d\n", 8136 ldpc, ret); 8137 return ret; 8138 } 8139 8140 if (arvif->vif->bss_conf.he_support) { 8141 if (he_fixed_rate) { 8142 ret = ath11k_mac_set_fixed_rate_gi_ltf(arvif, he_gi, 8143 he_ltf); 8144 if (ret) { 8145 ath11k_warn(ar->ab, "failed to set fixed rate gi ltf: %d\n", 8146 ret); 8147 return ret; 8148 } 8149 } else { 8150 ret = ath11k_mac_set_auto_rate_gi_ltf(arvif, he_gi, 8151 he_ltf); 8152 if (ret) { 8153 ath11k_warn(ar->ab, "failed to set auto rate gi ltf: %d\n", 8154 ret); 8155 return ret; 8156 } 8157 } 8158 } else { 8159 vdev_param = WMI_VDEV_PARAM_SGI; 8160 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 8161 vdev_param, sgi); 8162 if (ret) { 8163 ath11k_warn(ar->ab, "failed to set sgi param %d: %d\n", 8164 sgi, ret); 8165 return ret; 8166 } 8167 } 8168 8169 return 0; 8170 } 8171 8172 static bool 8173 ath11k_mac_vht_mcs_range_present(struct ath11k *ar, 8174 enum nl80211_band band, 8175 const struct cfg80211_bitrate_mask *mask) 8176 { 8177 int i; 8178 u16 vht_mcs; 8179 8180 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) { 8181 vht_mcs = mask->control[band].vht_mcs[i]; 8182 8183 switch (vht_mcs) { 8184 case 0: 8185 case BIT(8) - 1: 8186 case BIT(9) - 1: 8187 case BIT(10) - 1: 8188 break; 8189 default: 8190 return false; 8191 } 8192 } 8193 8194 return true; 8195 } 8196 8197 static bool 8198 ath11k_mac_he_mcs_range_present(struct ath11k *ar, 8199 enum nl80211_band band, 8200 const struct cfg80211_bitrate_mask *mask) 8201 { 8202 int i; 8203 u16 he_mcs; 8204 8205 for (i = 0; i < NL80211_HE_NSS_MAX; i++) { 8206 he_mcs = mask->control[band].he_mcs[i]; 8207 8208 switch (he_mcs) { 8209 case 0: 8210 case BIT(8) - 1: 8211 case BIT(10) - 1: 8212 case BIT(12) - 1: 8213 break; 8214 default: 8215 return false; 8216 } 8217 } 8218 8219 return true; 8220 } 8221 8222 static void ath11k_mac_set_bitrate_mask_iter(void *data, 8223 struct ieee80211_sta *sta) 8224 { 8225 struct ath11k_vif *arvif = data; 8226 struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv; 8227 struct ath11k *ar = arvif->ar; 8228 8229 spin_lock_bh(&ar->data_lock); 8230 arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED; 8231 spin_unlock_bh(&ar->data_lock); 8232 8233 ieee80211_queue_work(ar->hw, &arsta->update_wk); 8234 } 8235 8236 static void ath11k_mac_disable_peer_fixed_rate(void *data, 8237 struct ieee80211_sta *sta) 8238 { 8239 struct ath11k_vif *arvif = data; 8240 struct ath11k *ar = arvif->ar; 8241 int ret; 8242 8243 ret = ath11k_wmi_set_peer_param(ar, sta->addr, 8244 arvif->vdev_id, 8245 WMI_PEER_PARAM_FIXED_RATE, 8246 WMI_FIXED_RATE_NONE); 8247 if (ret) 8248 ath11k_warn(ar->ab, 8249 "failed to disable peer fixed rate for STA %pM ret %d\n", 8250 sta->addr, ret); 8251 } 8252 8253 static bool 8254 ath11k_mac_validate_vht_he_fixed_rate_settings(struct ath11k *ar, enum nl80211_band band, 8255 const struct cfg80211_bitrate_mask *mask) 8256 { 8257 bool he_fixed_rate = false, vht_fixed_rate = false; 8258 struct ath11k_peer *peer; 8259 const u16 *vht_mcs_mask, *he_mcs_mask; 8260 struct ieee80211_link_sta *deflink; 8261 u8 vht_nss, he_nss; 8262 bool ret = true; 8263 8264 vht_mcs_mask = mask->control[band].vht_mcs; 8265 he_mcs_mask = mask->control[band].he_mcs; 8266 8267 if (ath11k_mac_bitrate_mask_num_vht_rates(ar, band, mask) == 1) 8268 vht_fixed_rate = true; 8269 8270 if (ath11k_mac_bitrate_mask_num_he_rates(ar, band, mask) == 1) 8271 he_fixed_rate = true; 8272 8273 if (!vht_fixed_rate && !he_fixed_rate) 8274 return true; 8275 8276 vht_nss = ath11k_mac_max_vht_nss(vht_mcs_mask); 8277 he_nss = ath11k_mac_max_he_nss(he_mcs_mask); 8278 8279 rcu_read_lock(); 8280 spin_lock_bh(&ar->ab->base_lock); 8281 list_for_each_entry(peer, &ar->ab->peers, list) { 8282 if (peer->sta) { 8283 deflink = &peer->sta->deflink; 8284 8285 if (vht_fixed_rate && (!deflink->vht_cap.vht_supported || 8286 deflink->rx_nss < vht_nss)) { 8287 ret = false; 8288 goto out; 8289 } 8290 8291 if (he_fixed_rate && (!deflink->he_cap.has_he || 8292 deflink->rx_nss < he_nss)) { 8293 ret = false; 8294 goto out; 8295 } 8296 } 8297 } 8298 8299 out: 8300 spin_unlock_bh(&ar->ab->base_lock); 8301 rcu_read_unlock(); 8302 return ret; 8303 } 8304 8305 static int 8306 ath11k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw, 8307 struct ieee80211_vif *vif, 8308 const struct cfg80211_bitrate_mask *mask) 8309 { 8310 struct ath11k_vif *arvif = (void *)vif->drv_priv; 8311 struct cfg80211_chan_def def; 8312 struct ath11k_pdev_cap *cap; 8313 struct ath11k *ar = arvif->ar; 8314 enum nl80211_band band; 8315 const u8 *ht_mcs_mask; 8316 const u16 *vht_mcs_mask; 8317 const u16 *he_mcs_mask; 8318 u8 he_ltf = 0; 8319 u8 he_gi = 0; 8320 u32 rate; 8321 u8 nss; 8322 u8 sgi; 8323 u8 ldpc; 8324 int single_nss; 8325 int ret; 8326 int num_rates; 8327 bool he_fixed_rate = false; 8328 8329 if (ath11k_mac_vif_chan(vif, &def)) 8330 return -EPERM; 8331 8332 band = def.chan->band; 8333 cap = &ar->pdev->cap; 8334 ht_mcs_mask = mask->control[band].ht_mcs; 8335 vht_mcs_mask = mask->control[band].vht_mcs; 8336 he_mcs_mask = mask->control[band].he_mcs; 8337 ldpc = !!(cap->band[band].ht_cap_info & WMI_HT_CAP_TX_LDPC); 8338 8339 sgi = mask->control[band].gi; 8340 if (sgi == NL80211_TXRATE_FORCE_LGI) 8341 return -EINVAL; 8342 8343 he_gi = mask->control[band].he_gi; 8344 he_ltf = mask->control[band].he_ltf; 8345 8346 /* mac80211 doesn't support sending a fixed HT/VHT MCS alone, rather it 8347 * requires passing at least one of used basic rates along with them. 8348 * Fixed rate setting across different preambles(legacy, HT, VHT) is 8349 * not supported by the FW. Hence use of FIXED_RATE vdev param is not 8350 * suitable for setting single HT/VHT rates. 8351 * But, there could be a single basic rate passed from userspace which 8352 * can be done through the FIXED_RATE param. 8353 */ 8354 if (ath11k_mac_has_single_legacy_rate(ar, band, mask)) { 8355 ret = ath11k_mac_get_single_legacy_rate(ar, band, mask, &rate, 8356 &nss); 8357 if (ret) { 8358 ath11k_warn(ar->ab, "failed to get single legacy rate for vdev %i: %d\n", 8359 arvif->vdev_id, ret); 8360 return ret; 8361 } 8362 ieee80211_iterate_stations_atomic(ar->hw, 8363 ath11k_mac_disable_peer_fixed_rate, 8364 arvif); 8365 } else if (ath11k_mac_bitrate_mask_get_single_nss(ar, band, mask, 8366 &single_nss)) { 8367 rate = WMI_FIXED_RATE_NONE; 8368 nss = single_nss; 8369 mutex_lock(&ar->conf_mutex); 8370 arvif->bitrate_mask = *mask; 8371 ieee80211_iterate_stations_atomic(ar->hw, 8372 ath11k_mac_set_bitrate_mask_iter, 8373 arvif); 8374 mutex_unlock(&ar->conf_mutex); 8375 } else { 8376 rate = WMI_FIXED_RATE_NONE; 8377 8378 if (!ath11k_mac_validate_vht_he_fixed_rate_settings(ar, band, mask)) 8379 ath11k_warn(ar->ab, 8380 "could not update fixed rate settings to all peers due to mcs/nss incompatibility\n"); 8381 nss = min_t(u32, ar->num_tx_chains, 8382 max(max(ath11k_mac_max_ht_nss(ht_mcs_mask), 8383 ath11k_mac_max_vht_nss(vht_mcs_mask)), 8384 ath11k_mac_max_he_nss(he_mcs_mask))); 8385 8386 /* If multiple rates across different preambles are given 8387 * we can reconfigure this info with all peers using PEER_ASSOC 8388 * command with the below exception cases. 8389 * - Single VHT Rate : peer_assoc command accommodates only MCS 8390 * range values i.e 0-7, 0-8, 0-9 for VHT. Though mac80211 8391 * mandates passing basic rates along with HT/VHT rates, FW 8392 * doesn't allow switching from VHT to Legacy. Hence instead of 8393 * setting legacy and VHT rates using RATEMASK_CMD vdev cmd, 8394 * we could set this VHT rate as peer fixed rate param, which 8395 * will override FIXED rate and FW rate control algorithm. 8396 * If single VHT rate is passed along with HT rates, we select 8397 * the VHT rate as fixed rate for vht peers. 8398 * - Multiple VHT Rates : When Multiple VHT rates are given,this 8399 * can be set using RATEMASK CMD which uses FW rate-ctl alg. 8400 * TODO: Setting multiple VHT MCS and replacing peer_assoc with 8401 * RATEMASK_CMDID can cover all use cases of setting rates 8402 * across multiple preambles and rates within same type. 8403 * But requires more validation of the command at this point. 8404 */ 8405 8406 num_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band, 8407 mask); 8408 8409 if (!ath11k_mac_vht_mcs_range_present(ar, band, mask) && 8410 num_rates > 1) { 8411 /* TODO: Handle multiple VHT MCS values setting using 8412 * RATEMASK CMD 8413 */ 8414 ath11k_warn(ar->ab, 8415 "setting %d mcs values in bitrate mask not supported\n", 8416 num_rates); 8417 return -EINVAL; 8418 } 8419 8420 num_rates = ath11k_mac_bitrate_mask_num_he_rates(ar, band, 8421 mask); 8422 if (num_rates == 1) 8423 he_fixed_rate = true; 8424 8425 if (!ath11k_mac_he_mcs_range_present(ar, band, mask) && 8426 num_rates > 1) { 8427 ath11k_warn(ar->ab, 8428 "Setting more than one HE MCS Value in bitrate mask not supported\n"); 8429 return -EINVAL; 8430 } 8431 8432 mutex_lock(&ar->conf_mutex); 8433 ieee80211_iterate_stations_atomic(ar->hw, 8434 ath11k_mac_disable_peer_fixed_rate, 8435 arvif); 8436 8437 arvif->bitrate_mask = *mask; 8438 ieee80211_iterate_stations_atomic(ar->hw, 8439 ath11k_mac_set_bitrate_mask_iter, 8440 arvif); 8441 8442 mutex_unlock(&ar->conf_mutex); 8443 } 8444 8445 mutex_lock(&ar->conf_mutex); 8446 8447 ret = ath11k_mac_set_rate_params(arvif, rate, nss, sgi, ldpc, he_gi, 8448 he_ltf, he_fixed_rate); 8449 if (ret) { 8450 ath11k_warn(ar->ab, "failed to set rate params on vdev %i: %d\n", 8451 arvif->vdev_id, ret); 8452 } 8453 8454 mutex_unlock(&ar->conf_mutex); 8455 8456 return ret; 8457 } 8458 8459 static void 8460 ath11k_mac_op_reconfig_complete(struct ieee80211_hw *hw, 8461 enum ieee80211_reconfig_type reconfig_type) 8462 { 8463 struct ath11k *ar = hw->priv; 8464 struct ath11k_base *ab = ar->ab; 8465 int recovery_count; 8466 struct ath11k_vif *arvif; 8467 8468 if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART) 8469 return; 8470 8471 mutex_lock(&ar->conf_mutex); 8472 8473 if (ar->state == ATH11K_STATE_RESTARTED) { 8474 ath11k_warn(ar->ab, "pdev %d successfully recovered\n", 8475 ar->pdev->pdev_id); 8476 ar->state = ATH11K_STATE_ON; 8477 ieee80211_wake_queues(ar->hw); 8478 8479 if (ar->ab->hw_params.current_cc_support && 8480 ar->alpha2[0] != 0 && ar->alpha2[1] != 0) { 8481 struct wmi_set_current_country_params set_current_param = {}; 8482 8483 memcpy(&set_current_param.alpha2, ar->alpha2, 2); 8484 ath11k_wmi_send_set_current_country_cmd(ar, &set_current_param); 8485 } 8486 8487 if (ab->is_reset) { 8488 recovery_count = atomic_inc_return(&ab->recovery_count); 8489 ath11k_dbg(ab, ATH11K_DBG_BOOT, 8490 "recovery count %d\n", recovery_count); 8491 /* When there are multiple radios in an SOC, 8492 * the recovery has to be done for each radio 8493 */ 8494 if (recovery_count == ab->num_radios) { 8495 atomic_dec(&ab->reset_count); 8496 complete(&ab->reset_complete); 8497 ab->is_reset = false; 8498 atomic_set(&ab->fail_cont_count, 0); 8499 ath11k_dbg(ab, ATH11K_DBG_BOOT, "reset success\n"); 8500 } 8501 } 8502 if (ar->ab->hw_params.support_fw_mac_sequence) { 8503 list_for_each_entry(arvif, &ar->arvifs, list) { 8504 if (arvif->is_up && arvif->vdev_type == WMI_VDEV_TYPE_STA) 8505 ieee80211_hw_restart_disconnect(arvif->vif); 8506 } 8507 } 8508 } 8509 8510 mutex_unlock(&ar->conf_mutex); 8511 } 8512 8513 static void 8514 ath11k_mac_update_bss_chan_survey(struct ath11k *ar, 8515 struct ieee80211_channel *channel) 8516 { 8517 int ret; 8518 enum wmi_bss_chan_info_req_type type = WMI_BSS_SURVEY_REQ_TYPE_READ; 8519 8520 lockdep_assert_held(&ar->conf_mutex); 8521 8522 if (!test_bit(WMI_TLV_SERVICE_BSS_CHANNEL_INFO_64, ar->ab->wmi_ab.svc_map) || 8523 ar->rx_channel != channel) 8524 return; 8525 8526 if (ar->scan.state != ATH11K_SCAN_IDLE) { 8527 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, 8528 "ignoring bss chan info req while scanning..\n"); 8529 return; 8530 } 8531 8532 reinit_completion(&ar->bss_survey_done); 8533 8534 ret = ath11k_wmi_pdev_bss_chan_info_request(ar, type); 8535 if (ret) { 8536 ath11k_warn(ar->ab, "failed to send pdev bss chan info request\n"); 8537 return; 8538 } 8539 8540 ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ); 8541 if (ret == 0) 8542 ath11k_warn(ar->ab, "bss channel survey timed out\n"); 8543 } 8544 8545 static int ath11k_mac_op_get_survey(struct ieee80211_hw *hw, int idx, 8546 struct survey_info *survey) 8547 { 8548 struct ath11k *ar = hw->priv; 8549 struct ieee80211_supported_band *sband; 8550 struct survey_info *ar_survey; 8551 int ret = 0; 8552 8553 if (idx >= ATH11K_NUM_CHANS) 8554 return -ENOENT; 8555 8556 ar_survey = &ar->survey[idx]; 8557 8558 mutex_lock(&ar->conf_mutex); 8559 8560 sband = hw->wiphy->bands[NL80211_BAND_2GHZ]; 8561 if (sband && idx >= sband->n_channels) { 8562 idx -= sband->n_channels; 8563 sband = NULL; 8564 } 8565 8566 if (!sband) 8567 sband = hw->wiphy->bands[NL80211_BAND_5GHZ]; 8568 if (sband && idx >= sband->n_channels) { 8569 idx -= sband->n_channels; 8570 sband = NULL; 8571 } 8572 8573 if (!sband) 8574 sband = hw->wiphy->bands[NL80211_BAND_6GHZ]; 8575 if (!sband || idx >= sband->n_channels) { 8576 ret = -ENOENT; 8577 goto exit; 8578 } 8579 8580 ath11k_mac_update_bss_chan_survey(ar, &sband->channels[idx]); 8581 8582 spin_lock_bh(&ar->data_lock); 8583 memcpy(survey, ar_survey, sizeof(*survey)); 8584 spin_unlock_bh(&ar->data_lock); 8585 8586 survey->channel = &sband->channels[idx]; 8587 8588 if (ar->rx_channel == survey->channel) 8589 survey->filled |= SURVEY_INFO_IN_USE; 8590 8591 exit: 8592 mutex_unlock(&ar->conf_mutex); 8593 return ret; 8594 } 8595 8596 static void ath11k_mac_put_chain_rssi(struct station_info *sinfo, 8597 struct ath11k_sta *arsta, 8598 char *pre, 8599 bool clear) 8600 { 8601 struct ath11k *ar = arsta->arvif->ar; 8602 int i; 8603 s8 rssi; 8604 8605 for (i = 0; i < ARRAY_SIZE(sinfo->chain_signal); i++) { 8606 sinfo->chains &= ~BIT(i); 8607 rssi = arsta->chain_signal[i]; 8608 if (clear) 8609 arsta->chain_signal[i] = ATH11K_INVALID_RSSI_FULL; 8610 8611 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, 8612 "sta statistics %s rssi[%d] %d\n", pre, i, rssi); 8613 8614 if (rssi != ATH11K_DEFAULT_NOISE_FLOOR && 8615 rssi != ATH11K_INVALID_RSSI_FULL && 8616 rssi != ATH11K_INVALID_RSSI_EMPTY && 8617 rssi != 0) { 8618 sinfo->chain_signal[i] = rssi; 8619 sinfo->chains |= BIT(i); 8620 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL); 8621 } 8622 } 8623 } 8624 8625 static void ath11k_mac_op_sta_statistics(struct ieee80211_hw *hw, 8626 struct ieee80211_vif *vif, 8627 struct ieee80211_sta *sta, 8628 struct station_info *sinfo) 8629 { 8630 struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv; 8631 struct ath11k *ar = arsta->arvif->ar; 8632 s8 signal; 8633 bool db2dbm = test_bit(WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT, 8634 ar->ab->wmi_ab.svc_map); 8635 8636 sinfo->rx_duration = arsta->rx_duration; 8637 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION); 8638 8639 sinfo->tx_duration = arsta->tx_duration; 8640 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION); 8641 8642 if (arsta->txrate.legacy || arsta->txrate.nss) { 8643 if (arsta->txrate.legacy) { 8644 sinfo->txrate.legacy = arsta->txrate.legacy; 8645 } else { 8646 sinfo->txrate.mcs = arsta->txrate.mcs; 8647 sinfo->txrate.nss = arsta->txrate.nss; 8648 sinfo->txrate.bw = arsta->txrate.bw; 8649 sinfo->txrate.he_gi = arsta->txrate.he_gi; 8650 sinfo->txrate.he_dcm = arsta->txrate.he_dcm; 8651 sinfo->txrate.he_ru_alloc = arsta->txrate.he_ru_alloc; 8652 } 8653 sinfo->txrate.flags = arsta->txrate.flags; 8654 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE); 8655 } 8656 8657 ath11k_mac_put_chain_rssi(sinfo, arsta, "ppdu", false); 8658 8659 if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) && 8660 arsta->arvif->vdev_type == WMI_VDEV_TYPE_STA && 8661 ar->ab->hw_params.supports_rssi_stats && 8662 !ath11k_debugfs_get_fw_stats(ar, ar->pdev->pdev_id, 0, 8663 WMI_REQUEST_RSSI_PER_CHAIN_STAT)) { 8664 ath11k_mac_put_chain_rssi(sinfo, arsta, "fw stats", true); 8665 } 8666 8667 signal = arsta->rssi_comb; 8668 if (!signal && 8669 arsta->arvif->vdev_type == WMI_VDEV_TYPE_STA && 8670 ar->ab->hw_params.supports_rssi_stats && 8671 !(ath11k_debugfs_get_fw_stats(ar, ar->pdev->pdev_id, 0, 8672 WMI_REQUEST_VDEV_STAT))) 8673 signal = arsta->rssi_beacon; 8674 8675 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, 8676 "sta statistics db2dbm %u rssi comb %d rssi beacon %d\n", 8677 db2dbm, arsta->rssi_comb, arsta->rssi_beacon); 8678 8679 if (signal) { 8680 sinfo->signal = db2dbm ? signal : signal + ATH11K_DEFAULT_NOISE_FLOOR; 8681 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL); 8682 } 8683 8684 sinfo->signal_avg = ewma_avg_rssi_read(&arsta->avg_rssi) + 8685 ATH11K_DEFAULT_NOISE_FLOOR; 8686 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG); 8687 } 8688 8689 #if IS_ENABLED(CONFIG_IPV6) 8690 static void ath11k_generate_ns_mc_addr(struct ath11k *ar, 8691 struct ath11k_arp_ns_offload *offload) 8692 { 8693 int i; 8694 8695 for (i = 0; i < offload->ipv6_count; i++) { 8696 offload->self_ipv6_addr[i][0] = 0xff; 8697 offload->self_ipv6_addr[i][1] = 0x02; 8698 offload->self_ipv6_addr[i][11] = 0x01; 8699 offload->self_ipv6_addr[i][12] = 0xff; 8700 offload->self_ipv6_addr[i][13] = 8701 offload->ipv6_addr[i][13]; 8702 offload->self_ipv6_addr[i][14] = 8703 offload->ipv6_addr[i][14]; 8704 offload->self_ipv6_addr[i][15] = 8705 offload->ipv6_addr[i][15]; 8706 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "NS solicited addr %pI6\n", 8707 offload->self_ipv6_addr[i]); 8708 } 8709 } 8710 8711 static void ath11k_mac_op_ipv6_changed(struct ieee80211_hw *hw, 8712 struct ieee80211_vif *vif, 8713 struct inet6_dev *idev) 8714 { 8715 struct ath11k *ar = hw->priv; 8716 struct ath11k_arp_ns_offload *offload; 8717 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); 8718 struct inet6_ifaddr *ifa6; 8719 struct ifacaddr6 *ifaca6; 8720 struct list_head *p; 8721 u32 count, scope; 8722 8723 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "op ipv6 changed\n"); 8724 8725 offload = &arvif->arp_ns_offload; 8726 count = 0; 8727 8728 read_lock_bh(&idev->lock); 8729 8730 memset(offload->ipv6_addr, 0, sizeof(offload->ipv6_addr)); 8731 memset(offload->self_ipv6_addr, 0, sizeof(offload->self_ipv6_addr)); 8732 memcpy(offload->mac_addr, vif->addr, ETH_ALEN); 8733 8734 /* get unicast address */ 8735 list_for_each(p, &idev->addr_list) { 8736 if (count >= ATH11K_IPV6_MAX_COUNT) 8737 goto generate; 8738 8739 ifa6 = list_entry(p, struct inet6_ifaddr, if_list); 8740 if (ifa6->flags & IFA_F_DADFAILED) 8741 continue; 8742 scope = ipv6_addr_src_scope(&ifa6->addr); 8743 if (scope == IPV6_ADDR_SCOPE_LINKLOCAL || 8744 scope == IPV6_ADDR_SCOPE_GLOBAL) { 8745 memcpy(offload->ipv6_addr[count], &ifa6->addr.s6_addr, 8746 sizeof(ifa6->addr.s6_addr)); 8747 offload->ipv6_type[count] = ATH11K_IPV6_UC_TYPE; 8748 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "count %d ipv6 uc %pI6 scope %d\n", 8749 count, offload->ipv6_addr[count], 8750 scope); 8751 count++; 8752 } else { 8753 ath11k_warn(ar->ab, "Unsupported ipv6 scope: %d\n", scope); 8754 } 8755 } 8756 8757 /* get anycast address */ 8758 for (ifaca6 = idev->ac_list; ifaca6; ifaca6 = ifaca6->aca_next) { 8759 if (count >= ATH11K_IPV6_MAX_COUNT) 8760 goto generate; 8761 8762 scope = ipv6_addr_src_scope(&ifaca6->aca_addr); 8763 if (scope == IPV6_ADDR_SCOPE_LINKLOCAL || 8764 scope == IPV6_ADDR_SCOPE_GLOBAL) { 8765 memcpy(offload->ipv6_addr[count], &ifaca6->aca_addr, 8766 sizeof(ifaca6->aca_addr)); 8767 offload->ipv6_type[count] = ATH11K_IPV6_AC_TYPE; 8768 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "count %d ipv6 ac %pI6 scope %d\n", 8769 count, offload->ipv6_addr[count], 8770 scope); 8771 count++; 8772 } else { 8773 ath11k_warn(ar->ab, "Unsupported ipv scope: %d\n", scope); 8774 } 8775 } 8776 8777 generate: 8778 offload->ipv6_count = count; 8779 read_unlock_bh(&idev->lock); 8780 8781 /* generate ns multicast address */ 8782 ath11k_generate_ns_mc_addr(ar, offload); 8783 } 8784 #endif 8785 8786 static void ath11k_mac_op_set_rekey_data(struct ieee80211_hw *hw, 8787 struct ieee80211_vif *vif, 8788 struct cfg80211_gtk_rekey_data *data) 8789 { 8790 struct ath11k *ar = hw->priv; 8791 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); 8792 struct ath11k_rekey_data *rekey_data = &arvif->rekey_data; 8793 8794 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "set rekey data vdev %d\n", 8795 arvif->vdev_id); 8796 8797 mutex_lock(&ar->conf_mutex); 8798 8799 memcpy(rekey_data->kck, data->kck, NL80211_KCK_LEN); 8800 memcpy(rekey_data->kek, data->kek, NL80211_KEK_LEN); 8801 8802 /* The supplicant works on big-endian, the firmware expects it on 8803 * little endian. 8804 */ 8805 rekey_data->replay_ctr = get_unaligned_be64(data->replay_ctr); 8806 8807 arvif->rekey_data.enable_offload = true; 8808 8809 ath11k_dbg_dump(ar->ab, ATH11K_DBG_MAC, "kck", NULL, 8810 rekey_data->kck, NL80211_KCK_LEN); 8811 ath11k_dbg_dump(ar->ab, ATH11K_DBG_MAC, "kek", NULL, 8812 rekey_data->kck, NL80211_KEK_LEN); 8813 ath11k_dbg_dump(ar->ab, ATH11K_DBG_MAC, "replay ctr", NULL, 8814 &rekey_data->replay_ctr, sizeof(rekey_data->replay_ctr)); 8815 8816 mutex_unlock(&ar->conf_mutex); 8817 } 8818 8819 static int ath11k_mac_op_set_bios_sar_specs(struct ieee80211_hw *hw, 8820 const struct cfg80211_sar_specs *sar) 8821 { 8822 struct ath11k *ar = hw->priv; 8823 const struct cfg80211_sar_sub_specs *sspec; 8824 int ret, index; 8825 u8 *sar_tbl; 8826 u32 i; 8827 8828 if (!sar || sar->type != NL80211_SAR_TYPE_POWER || 8829 sar->num_sub_specs == 0) 8830 return -EINVAL; 8831 8832 mutex_lock(&ar->conf_mutex); 8833 8834 if (!test_bit(WMI_TLV_SERVICE_BIOS_SAR_SUPPORT, ar->ab->wmi_ab.svc_map) || 8835 !ar->ab->hw_params.bios_sar_capa) { 8836 ret = -EOPNOTSUPP; 8837 goto exit; 8838 } 8839 8840 ret = ath11k_wmi_pdev_set_bios_geo_table_param(ar); 8841 if (ret) { 8842 ath11k_warn(ar->ab, "failed to set geo table: %d\n", ret); 8843 goto exit; 8844 } 8845 8846 sar_tbl = kzalloc(BIOS_SAR_TABLE_LEN, GFP_KERNEL); 8847 if (!sar_tbl) { 8848 ret = -ENOMEM; 8849 goto exit; 8850 } 8851 8852 sspec = sar->sub_specs; 8853 for (i = 0; i < sar->num_sub_specs; i++) { 8854 if (sspec->freq_range_index >= (BIOS_SAR_TABLE_LEN >> 1)) { 8855 ath11k_warn(ar->ab, "Ignore bad frequency index %u, max allowed %u\n", 8856 sspec->freq_range_index, BIOS_SAR_TABLE_LEN >> 1); 8857 continue; 8858 } 8859 8860 /* chain0 and chain1 share same power setting */ 8861 sar_tbl[sspec->freq_range_index] = sspec->power; 8862 index = sspec->freq_range_index + (BIOS_SAR_TABLE_LEN >> 1); 8863 sar_tbl[index] = sspec->power; 8864 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "sar tbl[%d] = %d\n", 8865 sspec->freq_range_index, sar_tbl[sspec->freq_range_index]); 8866 sspec++; 8867 } 8868 8869 ret = ath11k_wmi_pdev_set_bios_sar_table_param(ar, sar_tbl); 8870 if (ret) 8871 ath11k_warn(ar->ab, "failed to set sar power: %d", ret); 8872 8873 kfree(sar_tbl); 8874 exit: 8875 mutex_unlock(&ar->conf_mutex); 8876 8877 return ret; 8878 } 8879 8880 static int ath11k_mac_op_cancel_remain_on_channel(struct ieee80211_hw *hw, 8881 struct ieee80211_vif *vif) 8882 { 8883 struct ath11k *ar = hw->priv; 8884 8885 mutex_lock(&ar->conf_mutex); 8886 8887 spin_lock_bh(&ar->data_lock); 8888 ar->scan.roc_notify = false; 8889 spin_unlock_bh(&ar->data_lock); 8890 8891 ath11k_scan_abort(ar); 8892 8893 mutex_unlock(&ar->conf_mutex); 8894 8895 cancel_delayed_work_sync(&ar->scan.timeout); 8896 8897 return 0; 8898 } 8899 8900 static int ath11k_mac_op_remain_on_channel(struct ieee80211_hw *hw, 8901 struct ieee80211_vif *vif, 8902 struct ieee80211_channel *chan, 8903 int duration, 8904 enum ieee80211_roc_type type) 8905 { 8906 struct ath11k *ar = hw->priv; 8907 struct ath11k_vif *arvif = (void *)vif->drv_priv; 8908 struct scan_req_params arg; 8909 int ret; 8910 u32 scan_time_msec; 8911 8912 mutex_lock(&ar->conf_mutex); 8913 8914 spin_lock_bh(&ar->data_lock); 8915 switch (ar->scan.state) { 8916 case ATH11K_SCAN_IDLE: 8917 reinit_completion(&ar->scan.started); 8918 reinit_completion(&ar->scan.completed); 8919 reinit_completion(&ar->scan.on_channel); 8920 ar->scan.state = ATH11K_SCAN_STARTING; 8921 ar->scan.is_roc = true; 8922 ar->scan.vdev_id = arvif->vdev_id; 8923 ar->scan.roc_freq = chan->center_freq; 8924 ar->scan.roc_notify = true; 8925 ret = 0; 8926 break; 8927 case ATH11K_SCAN_STARTING: 8928 case ATH11K_SCAN_RUNNING: 8929 case ATH11K_SCAN_ABORTING: 8930 ret = -EBUSY; 8931 break; 8932 } 8933 spin_unlock_bh(&ar->data_lock); 8934 8935 if (ret) 8936 goto exit; 8937 8938 scan_time_msec = ar->hw->wiphy->max_remain_on_channel_duration * 2; 8939 8940 memset(&arg, 0, sizeof(arg)); 8941 ath11k_wmi_start_scan_init(ar, &arg); 8942 arg.num_chan = 1; 8943 arg.chan_list = kcalloc(arg.num_chan, sizeof(*arg.chan_list), 8944 GFP_KERNEL); 8945 if (!arg.chan_list) { 8946 ret = -ENOMEM; 8947 goto exit; 8948 } 8949 8950 arg.vdev_id = arvif->vdev_id; 8951 arg.scan_id = ATH11K_SCAN_ID; 8952 arg.chan_list[0] = chan->center_freq; 8953 arg.dwell_time_active = scan_time_msec; 8954 arg.dwell_time_passive = scan_time_msec; 8955 arg.max_scan_time = scan_time_msec; 8956 arg.scan_flags |= WMI_SCAN_FLAG_PASSIVE; 8957 arg.scan_flags |= WMI_SCAN_FILTER_PROBE_REQ; 8958 arg.burst_duration = duration; 8959 8960 ret = ath11k_start_scan(ar, &arg); 8961 if (ret) { 8962 ath11k_warn(ar->ab, "failed to start roc scan: %d\n", ret); 8963 8964 spin_lock_bh(&ar->data_lock); 8965 ar->scan.state = ATH11K_SCAN_IDLE; 8966 spin_unlock_bh(&ar->data_lock); 8967 goto free_chan_list; 8968 } 8969 8970 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3 * HZ); 8971 if (ret == 0) { 8972 ath11k_warn(ar->ab, "failed to switch to channel for roc scan\n"); 8973 ret = ath11k_scan_stop(ar); 8974 if (ret) 8975 ath11k_warn(ar->ab, "failed to stop scan: %d\n", ret); 8976 ret = -ETIMEDOUT; 8977 goto free_chan_list; 8978 } 8979 8980 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout, 8981 msecs_to_jiffies(duration)); 8982 8983 ret = 0; 8984 8985 free_chan_list: 8986 kfree(arg.chan_list); 8987 exit: 8988 mutex_unlock(&ar->conf_mutex); 8989 return ret; 8990 } 8991 8992 static int ath11k_fw_stats_request(struct ath11k *ar, 8993 struct stats_request_params *req_param) 8994 { 8995 struct ath11k_base *ab = ar->ab; 8996 unsigned long time_left; 8997 int ret; 8998 8999 lockdep_assert_held(&ar->conf_mutex); 9000 9001 spin_lock_bh(&ar->data_lock); 9002 ar->fw_stats_done = false; 9003 ath11k_fw_stats_pdevs_free(&ar->fw_stats.pdevs); 9004 spin_unlock_bh(&ar->data_lock); 9005 9006 reinit_completion(&ar->fw_stats_complete); 9007 9008 ret = ath11k_wmi_send_stats_request_cmd(ar, req_param); 9009 if (ret) { 9010 ath11k_warn(ab, "could not request fw stats (%d)\n", 9011 ret); 9012 return ret; 9013 } 9014 9015 time_left = wait_for_completion_timeout(&ar->fw_stats_complete, 9016 1 * HZ); 9017 9018 if (!time_left) 9019 return -ETIMEDOUT; 9020 9021 return 0; 9022 } 9023 9024 static int ath11k_mac_op_get_txpower(struct ieee80211_hw *hw, 9025 struct ieee80211_vif *vif, 9026 int *dbm) 9027 { 9028 struct ath11k *ar = hw->priv; 9029 struct ath11k_base *ab = ar->ab; 9030 struct stats_request_params req_param = {0}; 9031 struct ath11k_fw_stats_pdev *pdev; 9032 int ret; 9033 9034 /* Final Tx power is minimum of Target Power, CTL power, Regulatory 9035 * Power, PSD EIRP Power. We just know the Regulatory power from the 9036 * regulatory rules obtained. FW knows all these power and sets the min 9037 * of these. Hence, we request the FW pdev stats in which FW reports 9038 * the minimum of all vdev's channel Tx power. 9039 */ 9040 mutex_lock(&ar->conf_mutex); 9041 9042 if (ar->state != ATH11K_STATE_ON) 9043 goto err_fallback; 9044 9045 req_param.pdev_id = ar->pdev->pdev_id; 9046 req_param.stats_id = WMI_REQUEST_PDEV_STAT; 9047 9048 ret = ath11k_fw_stats_request(ar, &req_param); 9049 if (ret) { 9050 ath11k_warn(ab, "failed to request fw pdev stats: %d\n", ret); 9051 goto err_fallback; 9052 } 9053 9054 spin_lock_bh(&ar->data_lock); 9055 pdev = list_first_entry_or_null(&ar->fw_stats.pdevs, 9056 struct ath11k_fw_stats_pdev, list); 9057 if (!pdev) { 9058 spin_unlock_bh(&ar->data_lock); 9059 goto err_fallback; 9060 } 9061 9062 /* tx power is set as 2 units per dBm in FW. */ 9063 *dbm = pdev->chan_tx_power / 2; 9064 9065 spin_unlock_bh(&ar->data_lock); 9066 mutex_unlock(&ar->conf_mutex); 9067 9068 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "txpower from firmware %d, reported %d dBm\n", 9069 pdev->chan_tx_power, *dbm); 9070 return 0; 9071 9072 err_fallback: 9073 mutex_unlock(&ar->conf_mutex); 9074 /* We didn't get txpower from FW. Hence, relying on vif->bss_conf.txpower */ 9075 *dbm = vif->bss_conf.txpower; 9076 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "txpower from firmware NaN, reported %d dBm\n", 9077 *dbm); 9078 return 0; 9079 } 9080 9081 static const struct ieee80211_ops ath11k_ops = { 9082 .tx = ath11k_mac_op_tx, 9083 .wake_tx_queue = ieee80211_handle_wake_tx_queue, 9084 .start = ath11k_mac_op_start, 9085 .stop = ath11k_mac_op_stop, 9086 .reconfig_complete = ath11k_mac_op_reconfig_complete, 9087 .add_interface = ath11k_mac_op_add_interface, 9088 .remove_interface = ath11k_mac_op_remove_interface, 9089 .update_vif_offload = ath11k_mac_op_update_vif_offload, 9090 .config = ath11k_mac_op_config, 9091 .bss_info_changed = ath11k_mac_op_bss_info_changed, 9092 .configure_filter = ath11k_mac_op_configure_filter, 9093 .hw_scan = ath11k_mac_op_hw_scan, 9094 .cancel_hw_scan = ath11k_mac_op_cancel_hw_scan, 9095 .set_key = ath11k_mac_op_set_key, 9096 .set_rekey_data = ath11k_mac_op_set_rekey_data, 9097 .sta_state = ath11k_mac_op_sta_state, 9098 .sta_set_4addr = ath11k_mac_op_sta_set_4addr, 9099 .sta_set_txpwr = ath11k_mac_op_sta_set_txpwr, 9100 .sta_rc_update = ath11k_mac_op_sta_rc_update, 9101 .conf_tx = ath11k_mac_op_conf_tx, 9102 .set_antenna = ath11k_mac_op_set_antenna, 9103 .get_antenna = ath11k_mac_op_get_antenna, 9104 .ampdu_action = ath11k_mac_op_ampdu_action, 9105 .add_chanctx = ath11k_mac_op_add_chanctx, 9106 .remove_chanctx = ath11k_mac_op_remove_chanctx, 9107 .change_chanctx = ath11k_mac_op_change_chanctx, 9108 .assign_vif_chanctx = ath11k_mac_op_assign_vif_chanctx, 9109 .unassign_vif_chanctx = ath11k_mac_op_unassign_vif_chanctx, 9110 .switch_vif_chanctx = ath11k_mac_op_switch_vif_chanctx, 9111 .set_rts_threshold = ath11k_mac_op_set_rts_threshold, 9112 .set_frag_threshold = ath11k_mac_op_set_frag_threshold, 9113 .set_bitrate_mask = ath11k_mac_op_set_bitrate_mask, 9114 .get_survey = ath11k_mac_op_get_survey, 9115 .flush = ath11k_mac_op_flush, 9116 .sta_statistics = ath11k_mac_op_sta_statistics, 9117 CFG80211_TESTMODE_CMD(ath11k_tm_cmd) 9118 9119 #ifdef CONFIG_PM 9120 .suspend = ath11k_wow_op_suspend, 9121 .resume = ath11k_wow_op_resume, 9122 .set_wakeup = ath11k_wow_op_set_wakeup, 9123 #endif 9124 9125 #ifdef CONFIG_ATH11K_DEBUGFS 9126 .sta_add_debugfs = ath11k_debugfs_sta_op_add, 9127 #endif 9128 9129 #if IS_ENABLED(CONFIG_IPV6) 9130 .ipv6_addr_change = ath11k_mac_op_ipv6_changed, 9131 #endif 9132 .get_txpower = ath11k_mac_op_get_txpower, 9133 9134 .set_sar_specs = ath11k_mac_op_set_bios_sar_specs, 9135 .remain_on_channel = ath11k_mac_op_remain_on_channel, 9136 .cancel_remain_on_channel = ath11k_mac_op_cancel_remain_on_channel, 9137 }; 9138 9139 static void ath11k_mac_update_ch_list(struct ath11k *ar, 9140 struct ieee80211_supported_band *band, 9141 u32 freq_low, u32 freq_high) 9142 { 9143 int i; 9144 9145 if (!(freq_low && freq_high)) 9146 return; 9147 9148 for (i = 0; i < band->n_channels; i++) { 9149 if (band->channels[i].center_freq < freq_low || 9150 band->channels[i].center_freq > freq_high) 9151 band->channels[i].flags |= IEEE80211_CHAN_DISABLED; 9152 } 9153 } 9154 9155 static u32 ath11k_get_phy_id(struct ath11k *ar, u32 band) 9156 { 9157 struct ath11k_pdev *pdev = ar->pdev; 9158 struct ath11k_pdev_cap *pdev_cap = &pdev->cap; 9159 9160 if (band == WMI_HOST_WLAN_2G_CAP) 9161 return pdev_cap->band[NL80211_BAND_2GHZ].phy_id; 9162 9163 if (band == WMI_HOST_WLAN_5G_CAP) 9164 return pdev_cap->band[NL80211_BAND_5GHZ].phy_id; 9165 9166 ath11k_warn(ar->ab, "unsupported phy cap:%d\n", band); 9167 9168 return 0; 9169 } 9170 9171 static int ath11k_mac_setup_channels_rates(struct ath11k *ar, 9172 u32 supported_bands) 9173 { 9174 struct ieee80211_supported_band *band; 9175 struct ath11k_hal_reg_capabilities_ext *reg_cap, *temp_reg_cap; 9176 void *channels; 9177 u32 phy_id; 9178 9179 BUILD_BUG_ON((ARRAY_SIZE(ath11k_2ghz_channels) + 9180 ARRAY_SIZE(ath11k_5ghz_channels) + 9181 ARRAY_SIZE(ath11k_6ghz_channels)) != 9182 ATH11K_NUM_CHANS); 9183 9184 reg_cap = &ar->ab->hal_reg_cap[ar->pdev_idx]; 9185 temp_reg_cap = reg_cap; 9186 9187 if (supported_bands & WMI_HOST_WLAN_2G_CAP) { 9188 channels = kmemdup(ath11k_2ghz_channels, 9189 sizeof(ath11k_2ghz_channels), 9190 GFP_KERNEL); 9191 if (!channels) 9192 return -ENOMEM; 9193 9194 band = &ar->mac.sbands[NL80211_BAND_2GHZ]; 9195 band->band = NL80211_BAND_2GHZ; 9196 band->n_channels = ARRAY_SIZE(ath11k_2ghz_channels); 9197 band->channels = channels; 9198 band->n_bitrates = ath11k_g_rates_size; 9199 band->bitrates = ath11k_g_rates; 9200 ar->hw->wiphy->bands[NL80211_BAND_2GHZ] = band; 9201 9202 if (ar->ab->hw_params.single_pdev_only) { 9203 phy_id = ath11k_get_phy_id(ar, WMI_HOST_WLAN_2G_CAP); 9204 temp_reg_cap = &ar->ab->hal_reg_cap[phy_id]; 9205 } 9206 ath11k_mac_update_ch_list(ar, band, 9207 temp_reg_cap->low_2ghz_chan, 9208 temp_reg_cap->high_2ghz_chan); 9209 } 9210 9211 if (supported_bands & WMI_HOST_WLAN_5G_CAP) { 9212 if (reg_cap->high_5ghz_chan >= ATH11K_MIN_6G_FREQ) { 9213 channels = kmemdup(ath11k_6ghz_channels, 9214 sizeof(ath11k_6ghz_channels), GFP_KERNEL); 9215 if (!channels) { 9216 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); 9217 return -ENOMEM; 9218 } 9219 9220 ar->supports_6ghz = true; 9221 band = &ar->mac.sbands[NL80211_BAND_6GHZ]; 9222 band->band = NL80211_BAND_6GHZ; 9223 band->n_channels = ARRAY_SIZE(ath11k_6ghz_channels); 9224 band->channels = channels; 9225 band->n_bitrates = ath11k_a_rates_size; 9226 band->bitrates = ath11k_a_rates; 9227 ar->hw->wiphy->bands[NL80211_BAND_6GHZ] = band; 9228 9229 if (ar->ab->hw_params.single_pdev_only) { 9230 phy_id = ath11k_get_phy_id(ar, WMI_HOST_WLAN_5G_CAP); 9231 temp_reg_cap = &ar->ab->hal_reg_cap[phy_id]; 9232 } 9233 9234 ath11k_mac_update_ch_list(ar, band, 9235 temp_reg_cap->low_5ghz_chan, 9236 temp_reg_cap->high_5ghz_chan); 9237 } 9238 9239 if (reg_cap->low_5ghz_chan < ATH11K_MIN_6G_FREQ) { 9240 channels = kmemdup(ath11k_5ghz_channels, 9241 sizeof(ath11k_5ghz_channels), 9242 GFP_KERNEL); 9243 if (!channels) { 9244 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); 9245 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels); 9246 return -ENOMEM; 9247 } 9248 9249 band = &ar->mac.sbands[NL80211_BAND_5GHZ]; 9250 band->band = NL80211_BAND_5GHZ; 9251 band->n_channels = ARRAY_SIZE(ath11k_5ghz_channels); 9252 band->channels = channels; 9253 band->n_bitrates = ath11k_a_rates_size; 9254 band->bitrates = ath11k_a_rates; 9255 ar->hw->wiphy->bands[NL80211_BAND_5GHZ] = band; 9256 9257 if (ar->ab->hw_params.single_pdev_only) { 9258 phy_id = ath11k_get_phy_id(ar, WMI_HOST_WLAN_5G_CAP); 9259 temp_reg_cap = &ar->ab->hal_reg_cap[phy_id]; 9260 } 9261 9262 ath11k_mac_update_ch_list(ar, band, 9263 temp_reg_cap->low_5ghz_chan, 9264 temp_reg_cap->high_5ghz_chan); 9265 } 9266 } 9267 9268 return 0; 9269 } 9270 9271 static int ath11k_mac_setup_iface_combinations(struct ath11k *ar) 9272 { 9273 struct ath11k_base *ab = ar->ab; 9274 struct ieee80211_iface_combination *combinations; 9275 struct ieee80211_iface_limit *limits; 9276 int n_limits; 9277 9278 combinations = kzalloc(sizeof(*combinations), GFP_KERNEL); 9279 if (!combinations) 9280 return -ENOMEM; 9281 9282 n_limits = 2; 9283 9284 limits = kcalloc(n_limits, sizeof(*limits), GFP_KERNEL); 9285 if (!limits) { 9286 kfree(combinations); 9287 return -ENOMEM; 9288 } 9289 9290 limits[0].max = 1; 9291 limits[0].types |= BIT(NL80211_IFTYPE_STATION); 9292 9293 limits[1].max = 16; 9294 limits[1].types |= BIT(NL80211_IFTYPE_AP); 9295 9296 if (IS_ENABLED(CONFIG_MAC80211_MESH) && 9297 ab->hw_params.interface_modes & BIT(NL80211_IFTYPE_MESH_POINT)) 9298 limits[1].types |= BIT(NL80211_IFTYPE_MESH_POINT); 9299 9300 combinations[0].limits = limits; 9301 combinations[0].n_limits = n_limits; 9302 combinations[0].max_interfaces = 16; 9303 combinations[0].num_different_channels = 1; 9304 combinations[0].beacon_int_infra_match = true; 9305 combinations[0].beacon_int_min_gcd = 100; 9306 combinations[0].radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) | 9307 BIT(NL80211_CHAN_WIDTH_20) | 9308 BIT(NL80211_CHAN_WIDTH_40) | 9309 BIT(NL80211_CHAN_WIDTH_80) | 9310 BIT(NL80211_CHAN_WIDTH_80P80) | 9311 BIT(NL80211_CHAN_WIDTH_160); 9312 9313 ar->hw->wiphy->iface_combinations = combinations; 9314 ar->hw->wiphy->n_iface_combinations = 1; 9315 9316 return 0; 9317 } 9318 9319 static const u8 ath11k_if_types_ext_capa[] = { 9320 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING, 9321 [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT, 9322 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF, 9323 }; 9324 9325 static const u8 ath11k_if_types_ext_capa_sta[] = { 9326 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING, 9327 [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT, 9328 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF, 9329 [9] = WLAN_EXT_CAPA10_TWT_REQUESTER_SUPPORT, 9330 }; 9331 9332 static const u8 ath11k_if_types_ext_capa_ap[] = { 9333 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING, 9334 [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT, 9335 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF, 9336 [9] = WLAN_EXT_CAPA10_TWT_RESPONDER_SUPPORT, 9337 [10] = WLAN_EXT_CAPA11_EMA_SUPPORT, 9338 }; 9339 9340 static const struct wiphy_iftype_ext_capab ath11k_iftypes_ext_capa[] = { 9341 { 9342 .extended_capabilities = ath11k_if_types_ext_capa, 9343 .extended_capabilities_mask = ath11k_if_types_ext_capa, 9344 .extended_capabilities_len = sizeof(ath11k_if_types_ext_capa), 9345 }, { 9346 .iftype = NL80211_IFTYPE_STATION, 9347 .extended_capabilities = ath11k_if_types_ext_capa_sta, 9348 .extended_capabilities_mask = ath11k_if_types_ext_capa_sta, 9349 .extended_capabilities_len = 9350 sizeof(ath11k_if_types_ext_capa_sta), 9351 }, { 9352 .iftype = NL80211_IFTYPE_AP, 9353 .extended_capabilities = ath11k_if_types_ext_capa_ap, 9354 .extended_capabilities_mask = ath11k_if_types_ext_capa_ap, 9355 .extended_capabilities_len = 9356 sizeof(ath11k_if_types_ext_capa_ap), 9357 }, 9358 }; 9359 9360 static void __ath11k_mac_unregister(struct ath11k *ar) 9361 { 9362 cancel_work_sync(&ar->regd_update_work); 9363 9364 ieee80211_unregister_hw(ar->hw); 9365 9366 idr_for_each(&ar->txmgmt_idr, ath11k_mac_tx_mgmt_pending_free, ar); 9367 idr_destroy(&ar->txmgmt_idr); 9368 9369 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); 9370 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels); 9371 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels); 9372 9373 kfree(ar->hw->wiphy->iface_combinations[0].limits); 9374 kfree(ar->hw->wiphy->iface_combinations); 9375 9376 SET_IEEE80211_DEV(ar->hw, NULL); 9377 } 9378 9379 void ath11k_mac_unregister(struct ath11k_base *ab) 9380 { 9381 struct ath11k *ar; 9382 struct ath11k_pdev *pdev; 9383 int i; 9384 9385 for (i = 0; i < ab->num_radios; i++) { 9386 pdev = &ab->pdevs[i]; 9387 ar = pdev->ar; 9388 if (!ar) 9389 continue; 9390 9391 __ath11k_mac_unregister(ar); 9392 } 9393 9394 ath11k_peer_rhash_tbl_destroy(ab); 9395 } 9396 9397 static int __ath11k_mac_register(struct ath11k *ar) 9398 { 9399 struct ath11k_base *ab = ar->ab; 9400 struct ath11k_pdev_cap *cap = &ar->pdev->cap; 9401 static const u32 cipher_suites[] = { 9402 WLAN_CIPHER_SUITE_TKIP, 9403 WLAN_CIPHER_SUITE_CCMP, 9404 WLAN_CIPHER_SUITE_AES_CMAC, 9405 WLAN_CIPHER_SUITE_BIP_CMAC_256, 9406 WLAN_CIPHER_SUITE_BIP_GMAC_128, 9407 WLAN_CIPHER_SUITE_BIP_GMAC_256, 9408 WLAN_CIPHER_SUITE_GCMP, 9409 WLAN_CIPHER_SUITE_GCMP_256, 9410 WLAN_CIPHER_SUITE_CCMP_256, 9411 }; 9412 int ret; 9413 u32 ht_cap = 0; 9414 9415 ath11k_pdev_caps_update(ar); 9416 9417 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr); 9418 9419 SET_IEEE80211_DEV(ar->hw, ab->dev); 9420 9421 ret = ath11k_mac_setup_channels_rates(ar, 9422 cap->supported_bands); 9423 if (ret) 9424 goto err; 9425 9426 ath11k_mac_setup_ht_vht_cap(ar, cap, &ht_cap); 9427 ath11k_mac_setup_he_cap(ar, cap); 9428 9429 ret = ath11k_mac_setup_iface_combinations(ar); 9430 if (ret) { 9431 ath11k_err(ar->ab, "failed to setup interface combinations: %d\n", ret); 9432 goto err_free_channels; 9433 } 9434 9435 ar->hw->wiphy->available_antennas_rx = cap->rx_chain_mask; 9436 ar->hw->wiphy->available_antennas_tx = cap->tx_chain_mask; 9437 9438 ar->hw->wiphy->interface_modes = ab->hw_params.interface_modes; 9439 9440 if (ab->hw_params.single_pdev_only && ar->supports_6ghz) 9441 ieee80211_hw_set(ar->hw, SINGLE_SCAN_ON_ALL_BANDS); 9442 9443 if (ab->hw_params.supports_multi_bssid) { 9444 ieee80211_hw_set(ar->hw, SUPPORTS_MULTI_BSSID); 9445 ieee80211_hw_set(ar->hw, SUPPORTS_ONLY_HE_MULTI_BSSID); 9446 } 9447 9448 ieee80211_hw_set(ar->hw, SIGNAL_DBM); 9449 ieee80211_hw_set(ar->hw, SUPPORTS_PS); 9450 ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS); 9451 ieee80211_hw_set(ar->hw, MFP_CAPABLE); 9452 ieee80211_hw_set(ar->hw, REPORTS_TX_ACK_STATUS); 9453 ieee80211_hw_set(ar->hw, HAS_RATE_CONTROL); 9454 ieee80211_hw_set(ar->hw, AP_LINK_PS); 9455 ieee80211_hw_set(ar->hw, SPECTRUM_MGMT); 9456 ieee80211_hw_set(ar->hw, CONNECTION_MONITOR); 9457 ieee80211_hw_set(ar->hw, SUPPORTS_PER_STA_GTK); 9458 ieee80211_hw_set(ar->hw, WANT_MONITOR_VIF); 9459 ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA); 9460 ieee80211_hw_set(ar->hw, QUEUE_CONTROL); 9461 ieee80211_hw_set(ar->hw, SUPPORTS_TX_FRAG); 9462 ieee80211_hw_set(ar->hw, REPORTS_LOW_ACK); 9463 9464 if (ath11k_frame_mode == ATH11K_HW_TXRX_ETHERNET) { 9465 ieee80211_hw_set(ar->hw, SUPPORTS_TX_ENCAP_OFFLOAD); 9466 ieee80211_hw_set(ar->hw, SUPPORTS_RX_DECAP_OFFLOAD); 9467 } 9468 9469 if (cap->nss_ratio_enabled) 9470 ieee80211_hw_set(ar->hw, SUPPORTS_VHT_EXT_NSS_BW); 9471 9472 if ((ht_cap & WMI_HT_CAP_ENABLED) || ar->supports_6ghz) { 9473 ieee80211_hw_set(ar->hw, AMPDU_AGGREGATION); 9474 ieee80211_hw_set(ar->hw, TX_AMPDU_SETUP_IN_HW); 9475 ieee80211_hw_set(ar->hw, SUPPORTS_REORDERING_BUFFER); 9476 ieee80211_hw_set(ar->hw, SUPPORTS_AMSDU_IN_AMPDU); 9477 ieee80211_hw_set(ar->hw, USES_RSS); 9478 } 9479 9480 ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS; 9481 ar->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; 9482 9483 /* TODO: Check if HT capability advertised from firmware is different 9484 * for each band for a dual band capable radio. It will be tricky to 9485 * handle it when the ht capability different for each band. 9486 */ 9487 if (ht_cap & WMI_HT_CAP_DYNAMIC_SMPS || 9488 (ar->supports_6ghz && ab->hw_params.supports_dynamic_smps_6ghz)) 9489 ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS; 9490 9491 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID; 9492 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN; 9493 9494 ar->hw->max_listen_interval = ATH11K_MAX_HW_LISTEN_INTERVAL; 9495 9496 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL; 9497 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH; 9498 ar->hw->wiphy->max_remain_on_channel_duration = 5000; 9499 9500 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD; 9501 ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE | 9502 NL80211_FEATURE_AP_SCAN; 9503 9504 ar->max_num_stations = TARGET_NUM_STATIONS(ab); 9505 ar->max_num_peers = TARGET_NUM_PEERS_PDEV(ab); 9506 9507 ar->hw->wiphy->max_ap_assoc_sta = ar->max_num_stations; 9508 9509 if (test_bit(WMI_TLV_SERVICE_SPOOF_MAC_SUPPORT, ar->wmi->wmi_ab->svc_map)) { 9510 ar->hw->wiphy->features |= 9511 NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR; 9512 } 9513 9514 if (test_bit(WMI_TLV_SERVICE_NLO, ar->wmi->wmi_ab->svc_map)) { 9515 ar->hw->wiphy->max_sched_scan_ssids = WMI_PNO_MAX_SUPP_NETWORKS; 9516 ar->hw->wiphy->max_match_sets = WMI_PNO_MAX_SUPP_NETWORKS; 9517 ar->hw->wiphy->max_sched_scan_ie_len = WMI_PNO_MAX_IE_LENGTH; 9518 ar->hw->wiphy->max_sched_scan_plans = WMI_PNO_MAX_SCHED_SCAN_PLANS; 9519 ar->hw->wiphy->max_sched_scan_plan_interval = 9520 WMI_PNO_MAX_SCHED_SCAN_PLAN_INT; 9521 ar->hw->wiphy->max_sched_scan_plan_iterations = 9522 WMI_PNO_MAX_SCHED_SCAN_PLAN_ITRNS; 9523 ar->hw->wiphy->features |= NL80211_FEATURE_ND_RANDOM_MAC_ADDR; 9524 } 9525 9526 ret = ath11k_wow_init(ar); 9527 if (ret) { 9528 ath11k_warn(ar->ab, "failed to init wow: %d\n", ret); 9529 goto err_free_if_combs; 9530 } 9531 9532 if (test_bit(WMI_TLV_SERVICE_TX_DATA_MGMT_ACK_RSSI, 9533 ar->ab->wmi_ab.svc_map)) 9534 wiphy_ext_feature_set(ar->hw->wiphy, 9535 NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT); 9536 9537 ar->hw->queues = ATH11K_HW_MAX_QUEUES; 9538 ar->hw->wiphy->tx_queue_len = ATH11K_QUEUE_LEN; 9539 ar->hw->offchannel_tx_hw_queue = ATH11K_HW_MAX_QUEUES - 1; 9540 ar->hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF_HE; 9541 9542 ar->hw->vif_data_size = sizeof(struct ath11k_vif); 9543 ar->hw->sta_data_size = sizeof(struct ath11k_sta); 9544 9545 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST); 9546 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_STA_TX_PWR); 9547 if (test_bit(WMI_TLV_SERVICE_BSS_COLOR_OFFLOAD, 9548 ar->ab->wmi_ab.svc_map)) { 9549 wiphy_ext_feature_set(ar->hw->wiphy, 9550 NL80211_EXT_FEATURE_BSS_COLOR); 9551 ieee80211_hw_set(ar->hw, DETECTS_COLOR_COLLISION); 9552 } 9553 9554 ar->hw->wiphy->cipher_suites = cipher_suites; 9555 ar->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites); 9556 9557 ar->hw->wiphy->iftype_ext_capab = ath11k_iftypes_ext_capa; 9558 ar->hw->wiphy->num_iftype_ext_capab = 9559 ARRAY_SIZE(ath11k_iftypes_ext_capa); 9560 9561 if (ar->supports_6ghz) { 9562 wiphy_ext_feature_set(ar->hw->wiphy, 9563 NL80211_EXT_FEATURE_FILS_DISCOVERY); 9564 wiphy_ext_feature_set(ar->hw->wiphy, 9565 NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP); 9566 } 9567 9568 wiphy_ext_feature_set(ar->hw->wiphy, 9569 NL80211_EXT_FEATURE_SET_SCAN_DWELL); 9570 9571 if (test_bit(WMI_TLV_SERVICE_RTT, ar->ab->wmi_ab.svc_map)) 9572 wiphy_ext_feature_set(ar->hw->wiphy, 9573 NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER); 9574 9575 ar->hw->wiphy->mbssid_max_interfaces = TARGET_NUM_VDEVS(ab); 9576 ar->hw->wiphy->ema_max_profile_periodicity = TARGET_EMA_MAX_PROFILE_PERIOD; 9577 9578 ath11k_reg_init(ar); 9579 9580 if (!test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags)) { 9581 ar->hw->netdev_features = NETIF_F_HW_CSUM; 9582 ieee80211_hw_set(ar->hw, SW_CRYPTO_CONTROL); 9583 ieee80211_hw_set(ar->hw, SUPPORT_FAST_XMIT); 9584 } 9585 9586 if (test_bit(WMI_TLV_SERVICE_BIOS_SAR_SUPPORT, ar->ab->wmi_ab.svc_map) && 9587 ab->hw_params.bios_sar_capa) 9588 ar->hw->wiphy->sar_capa = ab->hw_params.bios_sar_capa; 9589 9590 ret = ieee80211_register_hw(ar->hw); 9591 if (ret) { 9592 ath11k_err(ar->ab, "ieee80211 registration failed: %d\n", ret); 9593 goto err_free_if_combs; 9594 } 9595 9596 if (!ab->hw_params.supports_monitor) 9597 /* There's a race between calling ieee80211_register_hw() 9598 * and here where the monitor mode is enabled for a little 9599 * while. But that time is so short and in practise it make 9600 * a difference in real life. 9601 */ 9602 ar->hw->wiphy->interface_modes &= ~BIT(NL80211_IFTYPE_MONITOR); 9603 9604 /* Apply the regd received during initialization */ 9605 ret = ath11k_regd_update(ar); 9606 if (ret) { 9607 ath11k_err(ar->ab, "ath11k regd update failed: %d\n", ret); 9608 goto err_unregister_hw; 9609 } 9610 9611 if (ab->hw_params.current_cc_support && ab->new_alpha2[0]) { 9612 struct wmi_set_current_country_params set_current_param = {}; 9613 9614 memcpy(&set_current_param.alpha2, ab->new_alpha2, 2); 9615 memcpy(&ar->alpha2, ab->new_alpha2, 2); 9616 ret = ath11k_wmi_send_set_current_country_cmd(ar, &set_current_param); 9617 if (ret) 9618 ath11k_warn(ar->ab, 9619 "failed set cc code for mac register: %d\n", ret); 9620 } 9621 9622 ret = ath11k_debugfs_register(ar); 9623 if (ret) { 9624 ath11k_err(ar->ab, "debugfs registration failed: %d\n", ret); 9625 goto err_unregister_hw; 9626 } 9627 9628 return 0; 9629 9630 err_unregister_hw: 9631 ieee80211_unregister_hw(ar->hw); 9632 9633 err_free_if_combs: 9634 kfree(ar->hw->wiphy->iface_combinations[0].limits); 9635 kfree(ar->hw->wiphy->iface_combinations); 9636 9637 err_free_channels: 9638 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); 9639 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels); 9640 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels); 9641 9642 err: 9643 SET_IEEE80211_DEV(ar->hw, NULL); 9644 return ret; 9645 } 9646 9647 int ath11k_mac_register(struct ath11k_base *ab) 9648 { 9649 struct ath11k *ar; 9650 struct ath11k_pdev *pdev; 9651 int i; 9652 int ret; 9653 u8 mac_addr[ETH_ALEN] = {0}; 9654 9655 if (test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags)) 9656 return 0; 9657 9658 /* Initialize channel counters frequency value in hertz */ 9659 ab->cc_freq_hz = IPQ8074_CC_FREQ_HERTZ; 9660 ab->free_vdev_map = (1LL << (ab->num_radios * TARGET_NUM_VDEVS(ab))) - 1; 9661 9662 ret = ath11k_peer_rhash_tbl_init(ab); 9663 if (ret) 9664 return ret; 9665 9666 device_get_mac_address(ab->dev, mac_addr); 9667 9668 for (i = 0; i < ab->num_radios; i++) { 9669 pdev = &ab->pdevs[i]; 9670 ar = pdev->ar; 9671 if (ab->pdevs_macaddr_valid) { 9672 ether_addr_copy(ar->mac_addr, pdev->mac_addr); 9673 } else { 9674 if (is_zero_ether_addr(mac_addr)) 9675 ether_addr_copy(ar->mac_addr, ab->mac_addr); 9676 else 9677 ether_addr_copy(ar->mac_addr, mac_addr); 9678 ar->mac_addr[4] += i; 9679 } 9680 9681 idr_init(&ar->txmgmt_idr); 9682 spin_lock_init(&ar->txmgmt_idr_lock); 9683 9684 ret = __ath11k_mac_register(ar); 9685 if (ret) 9686 goto err_cleanup; 9687 9688 init_waitqueue_head(&ar->txmgmt_empty_waitq); 9689 } 9690 9691 return 0; 9692 9693 err_cleanup: 9694 for (i = i - 1; i >= 0; i--) { 9695 pdev = &ab->pdevs[i]; 9696 ar = pdev->ar; 9697 __ath11k_mac_unregister(ar); 9698 } 9699 9700 ath11k_peer_rhash_tbl_destroy(ab); 9701 9702 return ret; 9703 } 9704 9705 int ath11k_mac_allocate(struct ath11k_base *ab) 9706 { 9707 struct ieee80211_hw *hw; 9708 struct ath11k *ar; 9709 struct ath11k_pdev *pdev; 9710 int ret; 9711 int i; 9712 9713 if (test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags)) 9714 return 0; 9715 9716 for (i = 0; i < ab->num_radios; i++) { 9717 pdev = &ab->pdevs[i]; 9718 hw = ieee80211_alloc_hw(sizeof(struct ath11k), &ath11k_ops); 9719 if (!hw) { 9720 ath11k_warn(ab, "failed to allocate mac80211 hw device\n"); 9721 ret = -ENOMEM; 9722 goto err_free_mac; 9723 } 9724 9725 ar = hw->priv; 9726 ar->hw = hw; 9727 ar->ab = ab; 9728 ar->pdev = pdev; 9729 ar->pdev_idx = i; 9730 ar->lmac_id = ath11k_hw_get_mac_from_pdev_id(&ab->hw_params, i); 9731 9732 ar->wmi = &ab->wmi_ab.wmi[i]; 9733 /* FIXME wmi[0] is already initialized during attach, 9734 * Should we do this again? 9735 */ 9736 ath11k_wmi_pdev_attach(ab, i); 9737 9738 ar->cfg_tx_chainmask = pdev->cap.tx_chain_mask; 9739 ar->cfg_rx_chainmask = pdev->cap.rx_chain_mask; 9740 ar->num_tx_chains = get_num_chains(pdev->cap.tx_chain_mask); 9741 ar->num_rx_chains = get_num_chains(pdev->cap.rx_chain_mask); 9742 9743 pdev->ar = ar; 9744 spin_lock_init(&ar->data_lock); 9745 INIT_LIST_HEAD(&ar->arvifs); 9746 INIT_LIST_HEAD(&ar->ppdu_stats_info); 9747 mutex_init(&ar->conf_mutex); 9748 init_completion(&ar->vdev_setup_done); 9749 init_completion(&ar->vdev_delete_done); 9750 init_completion(&ar->peer_assoc_done); 9751 init_completion(&ar->peer_delete_done); 9752 init_completion(&ar->install_key_done); 9753 init_completion(&ar->bss_survey_done); 9754 init_completion(&ar->scan.started); 9755 init_completion(&ar->scan.completed); 9756 init_completion(&ar->scan.on_channel); 9757 init_completion(&ar->thermal.wmi_sync); 9758 9759 INIT_DELAYED_WORK(&ar->scan.timeout, ath11k_scan_timeout_work); 9760 INIT_WORK(&ar->regd_update_work, ath11k_regd_update_work); 9761 9762 INIT_WORK(&ar->wmi_mgmt_tx_work, ath11k_mgmt_over_wmi_tx_work); 9763 skb_queue_head_init(&ar->wmi_mgmt_tx_queue); 9764 9765 clear_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags); 9766 9767 ar->monitor_vdev_id = -1; 9768 clear_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags); 9769 ar->vdev_id_11d_scan = ATH11K_11D_INVALID_VDEV_ID; 9770 init_completion(&ar->completed_11d_scan); 9771 9772 ath11k_fw_stats_init(ar); 9773 } 9774 9775 return 0; 9776 9777 err_free_mac: 9778 ath11k_mac_destroy(ab); 9779 9780 return ret; 9781 } 9782 9783 void ath11k_mac_destroy(struct ath11k_base *ab) 9784 { 9785 struct ath11k *ar; 9786 struct ath11k_pdev *pdev; 9787 int i; 9788 9789 for (i = 0; i < ab->num_radios; i++) { 9790 pdev = &ab->pdevs[i]; 9791 ar = pdev->ar; 9792 if (!ar) 9793 continue; 9794 9795 ath11k_fw_stats_free(&ar->fw_stats); 9796 ieee80211_free_hw(ar->hw); 9797 pdev->ar = NULL; 9798 } 9799 } 9800 9801 int ath11k_mac_vif_set_keepalive(struct ath11k_vif *arvif, 9802 enum wmi_sta_keepalive_method method, 9803 u32 interval) 9804 { 9805 struct ath11k *ar = arvif->ar; 9806 struct wmi_sta_keepalive_arg arg = {}; 9807 int ret; 9808 9809 lockdep_assert_held(&ar->conf_mutex); 9810 9811 if (arvif->vdev_type != WMI_VDEV_TYPE_STA) 9812 return 0; 9813 9814 if (!test_bit(WMI_TLV_SERVICE_STA_KEEP_ALIVE, ar->ab->wmi_ab.svc_map)) 9815 return 0; 9816 9817 arg.vdev_id = arvif->vdev_id; 9818 arg.enabled = 1; 9819 arg.method = method; 9820 arg.interval = interval; 9821 9822 ret = ath11k_wmi_sta_keepalive(ar, &arg); 9823 if (ret) { 9824 ath11k_warn(ar->ab, "failed to set keepalive on vdev %i: %d\n", 9825 arvif->vdev_id, ret); 9826 return ret; 9827 } 9828 9829 return 0; 9830 } 9831