1 // SPDX-License-Identifier: BSD-3-Clause-Clear 2 /* 3 * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved. 4 * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. 5 */ 6 7 #include <net/mac80211.h> 8 #include <net/cfg80211.h> 9 #include <linux/etherdevice.h> 10 11 #include "mac.h" 12 #include "core.h" 13 #include "debug.h" 14 #include "wmi.h" 15 #include "hw.h" 16 #include "dp_tx.h" 17 #include "dp_rx.h" 18 #include "testmode.h" 19 #include "peer.h" 20 #include "debugfs.h" 21 #include "hif.h" 22 #include "wow.h" 23 #include "debugfs_sta.h" 24 25 #define CHAN2G(_channel, _freq, _flags) { \ 26 .band = NL80211_BAND_2GHZ, \ 27 .hw_value = (_channel), \ 28 .center_freq = (_freq), \ 29 .flags = (_flags), \ 30 .max_antenna_gain = 0, \ 31 .max_power = 30, \ 32 } 33 34 #define CHAN5G(_channel, _freq, _flags) { \ 35 .band = NL80211_BAND_5GHZ, \ 36 .hw_value = (_channel), \ 37 .center_freq = (_freq), \ 38 .flags = (_flags), \ 39 .max_antenna_gain = 0, \ 40 .max_power = 30, \ 41 } 42 43 #define CHAN6G(_channel, _freq, _flags) { \ 44 .band = NL80211_BAND_6GHZ, \ 45 .hw_value = (_channel), \ 46 .center_freq = (_freq), \ 47 .flags = (_flags), \ 48 .max_antenna_gain = 0, \ 49 .max_power = 30, \ 50 } 51 52 static const struct ieee80211_channel ath12k_2ghz_channels[] = { 53 CHAN2G(1, 2412, 0), 54 CHAN2G(2, 2417, 0), 55 CHAN2G(3, 2422, 0), 56 CHAN2G(4, 2427, 0), 57 CHAN2G(5, 2432, 0), 58 CHAN2G(6, 2437, 0), 59 CHAN2G(7, 2442, 0), 60 CHAN2G(8, 2447, 0), 61 CHAN2G(9, 2452, 0), 62 CHAN2G(10, 2457, 0), 63 CHAN2G(11, 2462, 0), 64 CHAN2G(12, 2467, 0), 65 CHAN2G(13, 2472, 0), 66 CHAN2G(14, 2484, 0), 67 }; 68 69 static const struct ieee80211_channel ath12k_5ghz_channels[] = { 70 CHAN5G(36, 5180, 0), 71 CHAN5G(40, 5200, 0), 72 CHAN5G(44, 5220, 0), 73 CHAN5G(48, 5240, 0), 74 CHAN5G(52, 5260, 0), 75 CHAN5G(56, 5280, 0), 76 CHAN5G(60, 5300, 0), 77 CHAN5G(64, 5320, 0), 78 CHAN5G(100, 5500, 0), 79 CHAN5G(104, 5520, 0), 80 CHAN5G(108, 5540, 0), 81 CHAN5G(112, 5560, 0), 82 CHAN5G(116, 5580, 0), 83 CHAN5G(120, 5600, 0), 84 CHAN5G(124, 5620, 0), 85 CHAN5G(128, 5640, 0), 86 CHAN5G(132, 5660, 0), 87 CHAN5G(136, 5680, 0), 88 CHAN5G(140, 5700, 0), 89 CHAN5G(144, 5720, 0), 90 CHAN5G(149, 5745, 0), 91 CHAN5G(153, 5765, 0), 92 CHAN5G(157, 5785, 0), 93 CHAN5G(161, 5805, 0), 94 CHAN5G(165, 5825, 0), 95 CHAN5G(169, 5845, 0), 96 CHAN5G(173, 5865, 0), 97 }; 98 99 static const struct ieee80211_channel ath12k_6ghz_channels[] = { 100 /* Operating Class 136 */ 101 CHAN6G(2, 5935, 0), 102 103 /* Operating Classes 131-135 */ 104 CHAN6G(1, 5955, 0), 105 CHAN6G(5, 5975, 0), 106 CHAN6G(9, 5995, 0), 107 CHAN6G(13, 6015, 0), 108 CHAN6G(17, 6035, 0), 109 CHAN6G(21, 6055, 0), 110 CHAN6G(25, 6075, 0), 111 CHAN6G(29, 6095, 0), 112 CHAN6G(33, 6115, 0), 113 CHAN6G(37, 6135, 0), 114 CHAN6G(41, 6155, 0), 115 CHAN6G(45, 6175, 0), 116 CHAN6G(49, 6195, 0), 117 CHAN6G(53, 6215, 0), 118 CHAN6G(57, 6235, 0), 119 CHAN6G(61, 6255, 0), 120 CHAN6G(65, 6275, 0), 121 CHAN6G(69, 6295, 0), 122 CHAN6G(73, 6315, 0), 123 CHAN6G(77, 6335, 0), 124 CHAN6G(81, 6355, 0), 125 CHAN6G(85, 6375, 0), 126 CHAN6G(89, 6395, 0), 127 CHAN6G(93, 6415, 0), 128 CHAN6G(97, 6435, 0), 129 CHAN6G(101, 6455, 0), 130 CHAN6G(105, 6475, 0), 131 CHAN6G(109, 6495, 0), 132 CHAN6G(113, 6515, 0), 133 CHAN6G(117, 6535, 0), 134 CHAN6G(121, 6555, 0), 135 CHAN6G(125, 6575, 0), 136 CHAN6G(129, 6595, 0), 137 CHAN6G(133, 6615, 0), 138 CHAN6G(137, 6635, 0), 139 CHAN6G(141, 6655, 0), 140 CHAN6G(145, 6675, 0), 141 CHAN6G(149, 6695, 0), 142 CHAN6G(153, 6715, 0), 143 CHAN6G(157, 6735, 0), 144 CHAN6G(161, 6755, 0), 145 CHAN6G(165, 6775, 0), 146 CHAN6G(169, 6795, 0), 147 CHAN6G(173, 6815, 0), 148 CHAN6G(177, 6835, 0), 149 CHAN6G(181, 6855, 0), 150 CHAN6G(185, 6875, 0), 151 CHAN6G(189, 6895, 0), 152 CHAN6G(193, 6915, 0), 153 CHAN6G(197, 6935, 0), 154 CHAN6G(201, 6955, 0), 155 CHAN6G(205, 6975, 0), 156 CHAN6G(209, 6995, 0), 157 CHAN6G(213, 7015, 0), 158 CHAN6G(217, 7035, 0), 159 CHAN6G(221, 7055, 0), 160 CHAN6G(225, 7075, 0), 161 CHAN6G(229, 7095, 0), 162 CHAN6G(233, 7115, 0), 163 }; 164 165 static struct ieee80211_rate ath12k_legacy_rates[] = { 166 { .bitrate = 10, 167 .hw_value = ATH12K_HW_RATE_CCK_LP_1M }, 168 { .bitrate = 20, 169 .hw_value = ATH12K_HW_RATE_CCK_LP_2M, 170 .hw_value_short = ATH12K_HW_RATE_CCK_SP_2M, 171 .flags = IEEE80211_RATE_SHORT_PREAMBLE }, 172 { .bitrate = 55, 173 .hw_value = ATH12K_HW_RATE_CCK_LP_5_5M, 174 .hw_value_short = ATH12K_HW_RATE_CCK_SP_5_5M, 175 .flags = IEEE80211_RATE_SHORT_PREAMBLE }, 176 { .bitrate = 110, 177 .hw_value = ATH12K_HW_RATE_CCK_LP_11M, 178 .hw_value_short = ATH12K_HW_RATE_CCK_SP_11M, 179 .flags = IEEE80211_RATE_SHORT_PREAMBLE }, 180 181 { .bitrate = 60, .hw_value = ATH12K_HW_RATE_OFDM_6M }, 182 { .bitrate = 90, .hw_value = ATH12K_HW_RATE_OFDM_9M }, 183 { .bitrate = 120, .hw_value = ATH12K_HW_RATE_OFDM_12M }, 184 { .bitrate = 180, .hw_value = ATH12K_HW_RATE_OFDM_18M }, 185 { .bitrate = 240, .hw_value = ATH12K_HW_RATE_OFDM_24M }, 186 { .bitrate = 360, .hw_value = ATH12K_HW_RATE_OFDM_36M }, 187 { .bitrate = 480, .hw_value = ATH12K_HW_RATE_OFDM_48M }, 188 { .bitrate = 540, .hw_value = ATH12K_HW_RATE_OFDM_54M }, 189 }; 190 191 static const int 192 ath12k_phymodes[NUM_NL80211_BANDS][ATH12K_CHAN_WIDTH_NUM] = { 193 [NL80211_BAND_2GHZ] = { 194 [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN, 195 [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN, 196 [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11BE_EHT20_2G, 197 [NL80211_CHAN_WIDTH_20] = MODE_11BE_EHT20_2G, 198 [NL80211_CHAN_WIDTH_40] = MODE_11BE_EHT40_2G, 199 [NL80211_CHAN_WIDTH_80] = MODE_UNKNOWN, 200 [NL80211_CHAN_WIDTH_80P80] = MODE_UNKNOWN, 201 [NL80211_CHAN_WIDTH_160] = MODE_UNKNOWN, 202 [NL80211_CHAN_WIDTH_320] = MODE_UNKNOWN, 203 }, 204 [NL80211_BAND_5GHZ] = { 205 [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN, 206 [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN, 207 [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11BE_EHT20, 208 [NL80211_CHAN_WIDTH_20] = MODE_11BE_EHT20, 209 [NL80211_CHAN_WIDTH_40] = MODE_11BE_EHT40, 210 [NL80211_CHAN_WIDTH_80] = MODE_11BE_EHT80, 211 [NL80211_CHAN_WIDTH_160] = MODE_11BE_EHT160, 212 [NL80211_CHAN_WIDTH_80P80] = MODE_UNKNOWN, 213 [NL80211_CHAN_WIDTH_320] = MODE_11BE_EHT320, 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_11BE_EHT20, 219 [NL80211_CHAN_WIDTH_20] = MODE_11BE_EHT20, 220 [NL80211_CHAN_WIDTH_40] = MODE_11BE_EHT40, 221 [NL80211_CHAN_WIDTH_80] = MODE_11BE_EHT80, 222 [NL80211_CHAN_WIDTH_160] = MODE_11BE_EHT160, 223 [NL80211_CHAN_WIDTH_80P80] = MODE_UNKNOWN, 224 [NL80211_CHAN_WIDTH_320] = MODE_11BE_EHT320, 225 }, 226 227 }; 228 229 const struct htt_rx_ring_tlv_filter ath12k_mac_mon_status_filter_default = { 230 .rx_filter = HTT_RX_FILTER_TLV_FLAGS_MPDU_START | 231 HTT_RX_FILTER_TLV_FLAGS_PPDU_END | 232 HTT_RX_FILTER_TLV_FLAGS_PPDU_END_STATUS_DONE | 233 HTT_RX_FILTER_TLV_FLAGS_PPDU_START_USER_INFO, 234 .pkt_filter_flags0 = HTT_RX_FP_MGMT_FILTER_FLAGS0, 235 .pkt_filter_flags1 = HTT_RX_FP_MGMT_FILTER_FLAGS1, 236 .pkt_filter_flags2 = HTT_RX_FP_CTRL_FILTER_FLASG2, 237 .pkt_filter_flags3 = HTT_RX_FP_DATA_FILTER_FLASG3 | 238 HTT_RX_FP_CTRL_FILTER_FLASG3 239 }; 240 241 #define ATH12K_MAC_FIRST_OFDM_RATE_IDX 4 242 #define ath12k_g_rates ath12k_legacy_rates 243 #define ath12k_g_rates_size (ARRAY_SIZE(ath12k_legacy_rates)) 244 #define ath12k_a_rates (ath12k_legacy_rates + 4) 245 #define ath12k_a_rates_size (ARRAY_SIZE(ath12k_legacy_rates) - 4) 246 247 #define ATH12K_MAC_SCAN_TIMEOUT_MSECS 200 /* in msecs */ 248 249 static const u32 ath12k_smps_map[] = { 250 [WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC, 251 [WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC, 252 [WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE, 253 [WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE, 254 }; 255 256 static int ath12k_start_vdev_delay(struct ath12k *ar, 257 struct ath12k_link_vif *arvif); 258 static void ath12k_mac_stop(struct ath12k *ar); 259 static int ath12k_mac_vdev_create(struct ath12k *ar, struct ath12k_link_vif *arvif); 260 static int ath12k_mac_vdev_delete(struct ath12k *ar, struct ath12k_link_vif *arvif); 261 262 static const char *ath12k_mac_phymode_str(enum wmi_phy_mode mode) 263 { 264 switch (mode) { 265 case MODE_11A: 266 return "11a"; 267 case MODE_11G: 268 return "11g"; 269 case MODE_11B: 270 return "11b"; 271 case MODE_11GONLY: 272 return "11gonly"; 273 case MODE_11NA_HT20: 274 return "11na-ht20"; 275 case MODE_11NG_HT20: 276 return "11ng-ht20"; 277 case MODE_11NA_HT40: 278 return "11na-ht40"; 279 case MODE_11NG_HT40: 280 return "11ng-ht40"; 281 case MODE_11AC_VHT20: 282 return "11ac-vht20"; 283 case MODE_11AC_VHT40: 284 return "11ac-vht40"; 285 case MODE_11AC_VHT80: 286 return "11ac-vht80"; 287 case MODE_11AC_VHT160: 288 return "11ac-vht160"; 289 case MODE_11AC_VHT80_80: 290 return "11ac-vht80+80"; 291 case MODE_11AC_VHT20_2G: 292 return "11ac-vht20-2g"; 293 case MODE_11AC_VHT40_2G: 294 return "11ac-vht40-2g"; 295 case MODE_11AC_VHT80_2G: 296 return "11ac-vht80-2g"; 297 case MODE_11AX_HE20: 298 return "11ax-he20"; 299 case MODE_11AX_HE40: 300 return "11ax-he40"; 301 case MODE_11AX_HE80: 302 return "11ax-he80"; 303 case MODE_11AX_HE80_80: 304 return "11ax-he80+80"; 305 case MODE_11AX_HE160: 306 return "11ax-he160"; 307 case MODE_11AX_HE20_2G: 308 return "11ax-he20-2g"; 309 case MODE_11AX_HE40_2G: 310 return "11ax-he40-2g"; 311 case MODE_11AX_HE80_2G: 312 return "11ax-he80-2g"; 313 case MODE_11BE_EHT20: 314 return "11be-eht20"; 315 case MODE_11BE_EHT40: 316 return "11be-eht40"; 317 case MODE_11BE_EHT80: 318 return "11be-eht80"; 319 case MODE_11BE_EHT80_80: 320 return "11be-eht80+80"; 321 case MODE_11BE_EHT160: 322 return "11be-eht160"; 323 case MODE_11BE_EHT160_160: 324 return "11be-eht160+160"; 325 case MODE_11BE_EHT320: 326 return "11be-eht320"; 327 case MODE_11BE_EHT20_2G: 328 return "11be-eht20-2g"; 329 case MODE_11BE_EHT40_2G: 330 return "11be-eht40-2g"; 331 case MODE_UNKNOWN: 332 /* skip */ 333 break; 334 335 /* no default handler to allow compiler to check that the 336 * enum is fully handled 337 */ 338 } 339 340 return "<unknown>"; 341 } 342 343 u16 ath12k_mac_he_convert_tones_to_ru_tones(u16 tones) 344 { 345 switch (tones) { 346 case 26: 347 return RU_26; 348 case 52: 349 return RU_52; 350 case 106: 351 return RU_106; 352 case 242: 353 return RU_242; 354 case 484: 355 return RU_484; 356 case 996: 357 return RU_996; 358 case (996 * 2): 359 return RU_2X996; 360 default: 361 return RU_26; 362 } 363 } 364 365 enum nl80211_eht_gi ath12k_mac_eht_gi_to_nl80211_eht_gi(u8 sgi) 366 { 367 switch (sgi) { 368 case RX_MSDU_START_SGI_0_8_US: 369 return NL80211_RATE_INFO_EHT_GI_0_8; 370 case RX_MSDU_START_SGI_1_6_US: 371 return NL80211_RATE_INFO_EHT_GI_1_6; 372 case RX_MSDU_START_SGI_3_2_US: 373 return NL80211_RATE_INFO_EHT_GI_3_2; 374 default: 375 return NL80211_RATE_INFO_EHT_GI_0_8; 376 } 377 } 378 379 enum nl80211_eht_ru_alloc ath12k_mac_eht_ru_tones_to_nl80211_eht_ru_alloc(u16 ru_tones) 380 { 381 switch (ru_tones) { 382 case 26: 383 return NL80211_RATE_INFO_EHT_RU_ALLOC_26; 384 case 52: 385 return NL80211_RATE_INFO_EHT_RU_ALLOC_52; 386 case (52 + 26): 387 return NL80211_RATE_INFO_EHT_RU_ALLOC_52P26; 388 case 106: 389 return NL80211_RATE_INFO_EHT_RU_ALLOC_106; 390 case (106 + 26): 391 return NL80211_RATE_INFO_EHT_RU_ALLOC_106P26; 392 case 242: 393 return NL80211_RATE_INFO_EHT_RU_ALLOC_242; 394 case 484: 395 return NL80211_RATE_INFO_EHT_RU_ALLOC_484; 396 case (484 + 242): 397 return NL80211_RATE_INFO_EHT_RU_ALLOC_484P242; 398 case 996: 399 return NL80211_RATE_INFO_EHT_RU_ALLOC_996; 400 case (996 + 484): 401 return NL80211_RATE_INFO_EHT_RU_ALLOC_996P484; 402 case (996 + 484 + 242): 403 return NL80211_RATE_INFO_EHT_RU_ALLOC_996P484P242; 404 case (2 * 996): 405 return NL80211_RATE_INFO_EHT_RU_ALLOC_2x996; 406 case (2 * 996 + 484): 407 return NL80211_RATE_INFO_EHT_RU_ALLOC_2x996P484; 408 case (3 * 996): 409 return NL80211_RATE_INFO_EHT_RU_ALLOC_3x996; 410 case (3 * 996 + 484): 411 return NL80211_RATE_INFO_EHT_RU_ALLOC_3x996P484; 412 case (4 * 996): 413 return NL80211_RATE_INFO_EHT_RU_ALLOC_4x996; 414 default: 415 return NL80211_RATE_INFO_EHT_RU_ALLOC_26; 416 } 417 } 418 419 enum rate_info_bw 420 ath12k_mac_bw_to_mac80211_bw(enum ath12k_supported_bw bw) 421 { 422 u8 ret = RATE_INFO_BW_20; 423 424 switch (bw) { 425 case ATH12K_BW_20: 426 ret = RATE_INFO_BW_20; 427 break; 428 case ATH12K_BW_40: 429 ret = RATE_INFO_BW_40; 430 break; 431 case ATH12K_BW_80: 432 ret = RATE_INFO_BW_80; 433 break; 434 case ATH12K_BW_160: 435 ret = RATE_INFO_BW_160; 436 break; 437 case ATH12K_BW_320: 438 ret = RATE_INFO_BW_320; 439 break; 440 } 441 442 return ret; 443 } 444 445 enum ath12k_supported_bw ath12k_mac_mac80211_bw_to_ath12k_bw(enum rate_info_bw bw) 446 { 447 switch (bw) { 448 case RATE_INFO_BW_20: 449 return ATH12K_BW_20; 450 case RATE_INFO_BW_40: 451 return ATH12K_BW_40; 452 case RATE_INFO_BW_80: 453 return ATH12K_BW_80; 454 case RATE_INFO_BW_160: 455 return ATH12K_BW_160; 456 case RATE_INFO_BW_320: 457 return ATH12K_BW_320; 458 default: 459 return ATH12K_BW_20; 460 } 461 } 462 463 int ath12k_mac_hw_ratecode_to_legacy_rate(u8 hw_rc, u8 preamble, u8 *rateidx, 464 u16 *rate) 465 { 466 /* As default, it is OFDM rates */ 467 int i = ATH12K_MAC_FIRST_OFDM_RATE_IDX; 468 int max_rates_idx = ath12k_g_rates_size; 469 470 if (preamble == WMI_RATE_PREAMBLE_CCK) { 471 hw_rc &= ~ATH12K_HW_RATECODE_CCK_SHORT_PREAM_MASK; 472 i = 0; 473 max_rates_idx = ATH12K_MAC_FIRST_OFDM_RATE_IDX; 474 } 475 476 while (i < max_rates_idx) { 477 if (hw_rc == ath12k_legacy_rates[i].hw_value) { 478 *rateidx = i; 479 *rate = ath12k_legacy_rates[i].bitrate; 480 return 0; 481 } 482 i++; 483 } 484 485 return -EINVAL; 486 } 487 488 u8 ath12k_mac_bitrate_to_idx(const struct ieee80211_supported_band *sband, 489 u32 bitrate) 490 { 491 int i; 492 493 for (i = 0; i < sband->n_bitrates; i++) 494 if (sband->bitrates[i].bitrate == bitrate) 495 return i; 496 497 return 0; 498 } 499 500 static u32 501 ath12k_mac_max_ht_nss(const u8 *ht_mcs_mask) 502 { 503 int nss; 504 505 for (nss = IEEE80211_HT_MCS_MASK_LEN - 1; nss >= 0; nss--) 506 if (ht_mcs_mask[nss]) 507 return nss + 1; 508 509 return 1; 510 } 511 512 static u32 513 ath12k_mac_max_vht_nss(const u16 *vht_mcs_mask) 514 { 515 int nss; 516 517 for (nss = NL80211_VHT_NSS_MAX - 1; nss >= 0; nss--) 518 if (vht_mcs_mask[nss]) 519 return nss + 1; 520 521 return 1; 522 } 523 524 static u32 525 ath12k_mac_max_he_nss(const u16 he_mcs_mask[NL80211_HE_NSS_MAX]) 526 { 527 int nss; 528 529 for (nss = NL80211_HE_NSS_MAX - 1; nss >= 0; nss--) 530 if (he_mcs_mask[nss]) 531 return nss + 1; 532 533 return 1; 534 } 535 536 static u8 ath12k_parse_mpdudensity(u8 mpdudensity) 537 { 538 /* From IEEE Std 802.11-2020 defined values for "Minimum MPDU Start Spacing": 539 * 0 for no restriction 540 * 1 for 1/4 us 541 * 2 for 1/2 us 542 * 3 for 1 us 543 * 4 for 2 us 544 * 5 for 4 us 545 * 6 for 8 us 546 * 7 for 16 us 547 */ 548 switch (mpdudensity) { 549 case 0: 550 return 0; 551 case 1: 552 case 2: 553 case 3: 554 /* Our lower layer calculations limit our precision to 555 * 1 microsecond 556 */ 557 return 1; 558 case 4: 559 return 2; 560 case 5: 561 return 4; 562 case 6: 563 return 8; 564 case 7: 565 return 16; 566 default: 567 return 0; 568 } 569 } 570 571 static int ath12k_mac_vif_link_chan(struct ieee80211_vif *vif, u8 link_id, 572 struct cfg80211_chan_def *def) 573 { 574 struct ieee80211_bss_conf *link_conf; 575 struct ieee80211_chanctx_conf *conf; 576 577 rcu_read_lock(); 578 link_conf = rcu_dereference(vif->link_conf[link_id]); 579 580 if (!link_conf) { 581 rcu_read_unlock(); 582 return -ENOLINK; 583 } 584 585 conf = rcu_dereference(link_conf->chanctx_conf); 586 if (!conf) { 587 rcu_read_unlock(); 588 return -ENOENT; 589 } 590 *def = conf->def; 591 rcu_read_unlock(); 592 593 return 0; 594 } 595 596 static struct ath12k_link_vif * 597 ath12k_mac_get_tx_arvif(struct ath12k_link_vif *arvif, 598 struct ieee80211_bss_conf *link_conf) 599 { 600 struct ieee80211_bss_conf *tx_bss_conf; 601 struct ath12k *ar = arvif->ar; 602 struct ath12k_vif *tx_ahvif; 603 604 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 605 606 tx_bss_conf = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy, 607 link_conf->tx_bss_conf); 608 if (tx_bss_conf) { 609 tx_ahvif = ath12k_vif_to_ahvif(tx_bss_conf->vif); 610 return wiphy_dereference(tx_ahvif->ah->hw->wiphy, 611 tx_ahvif->link[tx_bss_conf->link_id]); 612 } 613 614 return NULL; 615 } 616 617 static const u8 *ath12k_mac_get_tx_bssid(struct ath12k_link_vif *arvif) 618 { 619 struct ieee80211_bss_conf *link_conf; 620 struct ath12k_link_vif *tx_arvif; 621 struct ath12k *ar = arvif->ar; 622 623 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 624 625 link_conf = ath12k_mac_get_link_bss_conf(arvif); 626 if (!link_conf) { 627 ath12k_warn(ar->ab, 628 "unable to access bss link conf for link %u required to retrieve transmitting link conf\n", 629 arvif->link_id); 630 return NULL; 631 } 632 if (link_conf->vif->type == NL80211_IFTYPE_STATION) { 633 if (link_conf->nontransmitted) 634 return link_conf->transmitter_bssid; 635 } else { 636 tx_arvif = ath12k_mac_get_tx_arvif(arvif, link_conf); 637 if (tx_arvif) 638 return tx_arvif->bssid; 639 } 640 641 return NULL; 642 } 643 644 struct ieee80211_bss_conf * 645 ath12k_mac_get_link_bss_conf(struct ath12k_link_vif *arvif) 646 { 647 struct ieee80211_vif *vif = arvif->ahvif->vif; 648 struct ieee80211_bss_conf *link_conf; 649 struct ath12k *ar = arvif->ar; 650 651 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 652 653 if (arvif->link_id >= IEEE80211_MLD_MAX_NUM_LINKS) 654 return NULL; 655 656 link_conf = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy, 657 vif->link_conf[arvif->link_id]); 658 659 return link_conf; 660 } 661 662 static struct ieee80211_link_sta *ath12k_mac_get_link_sta(struct ath12k_link_sta *arsta) 663 { 664 struct ath12k_sta *ahsta = arsta->ahsta; 665 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(ahsta); 666 struct ieee80211_link_sta *link_sta; 667 668 lockdep_assert_wiphy(ahsta->ahvif->ah->hw->wiphy); 669 670 if (arsta->link_id >= IEEE80211_MLD_MAX_NUM_LINKS) 671 return NULL; 672 673 link_sta = wiphy_dereference(ahsta->ahvif->ah->hw->wiphy, 674 sta->link[arsta->link_id]); 675 676 return link_sta; 677 } 678 679 static bool ath12k_mac_bitrate_is_cck(int bitrate) 680 { 681 switch (bitrate) { 682 case 10: 683 case 20: 684 case 55: 685 case 110: 686 return true; 687 } 688 689 return false; 690 } 691 692 u8 ath12k_mac_hw_rate_to_idx(const struct ieee80211_supported_band *sband, 693 u8 hw_rate, bool cck) 694 { 695 const struct ieee80211_rate *rate; 696 int i; 697 698 for (i = 0; i < sband->n_bitrates; i++) { 699 rate = &sband->bitrates[i]; 700 701 if (ath12k_mac_bitrate_is_cck(rate->bitrate) != cck) 702 continue; 703 704 if (rate->hw_value == hw_rate) 705 return i; 706 else if (rate->flags & IEEE80211_RATE_SHORT_PREAMBLE && 707 rate->hw_value_short == hw_rate) 708 return i; 709 } 710 711 return 0; 712 } 713 714 static u8 ath12k_mac_bitrate_to_rate(int bitrate) 715 { 716 return DIV_ROUND_UP(bitrate, 5) | 717 (ath12k_mac_bitrate_is_cck(bitrate) ? BIT(7) : 0); 718 } 719 720 static void ath12k_get_arvif_iter(void *data, u8 *mac, 721 struct ieee80211_vif *vif) 722 { 723 struct ath12k_vif_iter *arvif_iter = data; 724 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 725 unsigned long links_map = ahvif->links_map; 726 struct ath12k_link_vif *arvif; 727 u8 link_id; 728 729 for_each_set_bit(link_id, &links_map, IEEE80211_MLD_MAX_NUM_LINKS) { 730 arvif = rcu_dereference(ahvif->link[link_id]); 731 732 if (WARN_ON(!arvif)) 733 continue; 734 735 if (!arvif->is_created) 736 continue; 737 738 if (arvif->vdev_id == arvif_iter->vdev_id && 739 arvif->ar == arvif_iter->ar) { 740 arvif_iter->arvif = arvif; 741 break; 742 } 743 } 744 } 745 746 struct ath12k_link_vif *ath12k_mac_get_arvif(struct ath12k *ar, u32 vdev_id) 747 { 748 struct ath12k_vif_iter arvif_iter = {}; 749 u32 flags; 750 751 /* To use the arvif returned, caller must have held rcu read lock. 752 */ 753 WARN_ON(!rcu_read_lock_any_held()); 754 arvif_iter.vdev_id = vdev_id; 755 arvif_iter.ar = ar; 756 757 flags = IEEE80211_IFACE_ITER_RESUME_ALL; 758 ieee80211_iterate_active_interfaces_atomic(ath12k_ar_to_hw(ar), 759 flags, 760 ath12k_get_arvif_iter, 761 &arvif_iter); 762 if (!arvif_iter.arvif) { 763 ath12k_warn(ar->ab, "No VIF found for vdev %d\n", vdev_id); 764 return NULL; 765 } 766 767 return arvif_iter.arvif; 768 } 769 770 struct ath12k_link_vif *ath12k_mac_get_arvif_by_vdev_id(struct ath12k_base *ab, 771 u32 vdev_id) 772 { 773 int i; 774 struct ath12k_pdev *pdev; 775 struct ath12k_link_vif *arvif; 776 777 for (i = 0; i < ab->num_radios; i++) { 778 pdev = rcu_dereference(ab->pdevs_active[i]); 779 if (pdev && pdev->ar && 780 (pdev->ar->allocated_vdev_map & (1LL << vdev_id))) { 781 arvif = ath12k_mac_get_arvif(pdev->ar, vdev_id); 782 if (arvif) 783 return arvif; 784 } 785 } 786 787 return NULL; 788 } 789 790 struct ath12k *ath12k_mac_get_ar_by_vdev_id(struct ath12k_base *ab, u32 vdev_id) 791 { 792 int i; 793 struct ath12k_pdev *pdev; 794 795 for (i = 0; i < ab->num_radios; i++) { 796 pdev = rcu_dereference(ab->pdevs_active[i]); 797 if (pdev && pdev->ar) { 798 if (pdev->ar->allocated_vdev_map & (1LL << vdev_id)) 799 return pdev->ar; 800 } 801 } 802 803 return NULL; 804 } 805 806 struct ath12k *ath12k_mac_get_ar_by_pdev_id(struct ath12k_base *ab, u32 pdev_id) 807 { 808 int i; 809 struct ath12k_pdev *pdev; 810 811 if (ab->hw_params->single_pdev_only) { 812 pdev = rcu_dereference(ab->pdevs_active[0]); 813 return pdev ? pdev->ar : NULL; 814 } 815 816 if (WARN_ON(pdev_id > ab->num_radios)) 817 return NULL; 818 819 for (i = 0; i < ab->num_radios; i++) { 820 if (ab->fw_mode == ATH12K_FIRMWARE_MODE_FTM) 821 pdev = &ab->pdevs[i]; 822 else 823 pdev = rcu_dereference(ab->pdevs_active[i]); 824 825 if (pdev && pdev->pdev_id == pdev_id) 826 return (pdev->ar ? pdev->ar : NULL); 827 } 828 829 return NULL; 830 } 831 832 static bool ath12k_mac_is_ml_arvif(struct ath12k_link_vif *arvif) 833 { 834 struct ath12k_vif *ahvif = arvif->ahvif; 835 836 lockdep_assert_wiphy(ahvif->ah->hw->wiphy); 837 838 if (ahvif->vif->valid_links & BIT(arvif->link_id)) 839 return true; 840 841 return false; 842 } 843 844 static struct ath12k *ath12k_mac_get_ar_by_chan(struct ieee80211_hw *hw, 845 struct ieee80211_channel *channel) 846 { 847 struct ath12k_hw *ah = hw->priv; 848 struct ath12k *ar; 849 int i; 850 851 ar = ah->radio; 852 853 if (ah->num_radio == 1) 854 return ar; 855 856 for_each_ar(ah, ar, i) { 857 if (channel->center_freq >= KHZ_TO_MHZ(ar->freq_range.start_freq) && 858 channel->center_freq <= KHZ_TO_MHZ(ar->freq_range.end_freq)) 859 return ar; 860 } 861 return NULL; 862 } 863 864 static struct ath12k *ath12k_get_ar_by_ctx(struct ieee80211_hw *hw, 865 struct ieee80211_chanctx_conf *ctx) 866 { 867 if (!ctx) 868 return NULL; 869 870 return ath12k_mac_get_ar_by_chan(hw, ctx->def.chan); 871 } 872 873 struct ath12k *ath12k_get_ar_by_vif(struct ieee80211_hw *hw, 874 struct ieee80211_vif *vif, 875 u8 link_id) 876 { 877 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 878 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 879 struct ath12k_link_vif *arvif; 880 881 lockdep_assert_wiphy(hw->wiphy); 882 883 /* If there is one pdev within ah, then we return 884 * ar directly. 885 */ 886 if (ah->num_radio == 1) 887 return ah->radio; 888 889 if (!(ahvif->links_map & BIT(link_id))) 890 return NULL; 891 892 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 893 if (arvif && arvif->is_created) 894 return arvif->ar; 895 896 return NULL; 897 } 898 899 void ath12k_mac_get_any_chanctx_conf_iter(struct ieee80211_hw *hw, 900 struct ieee80211_chanctx_conf *conf, 901 void *data) 902 { 903 struct ath12k_mac_get_any_chanctx_conf_arg *arg = data; 904 struct ath12k *ctx_ar = ath12k_get_ar_by_ctx(hw, conf); 905 906 if (ctx_ar == arg->ar) 907 arg->chanctx_conf = conf; 908 } 909 910 static struct ath12k_link_vif *ath12k_mac_get_vif_up(struct ath12k *ar) 911 { 912 struct ath12k_link_vif *arvif; 913 914 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 915 916 list_for_each_entry(arvif, &ar->arvifs, list) { 917 if (arvif->is_up) 918 return arvif; 919 } 920 921 return NULL; 922 } 923 924 static bool ath12k_mac_band_match(enum nl80211_band band1, enum WMI_HOST_WLAN_BAND band2) 925 { 926 switch (band1) { 927 case NL80211_BAND_2GHZ: 928 if (band2 & WMI_HOST_WLAN_2GHZ_CAP) 929 return true; 930 break; 931 case NL80211_BAND_5GHZ: 932 case NL80211_BAND_6GHZ: 933 if (band2 & WMI_HOST_WLAN_5GHZ_CAP) 934 return true; 935 break; 936 default: 937 return false; 938 } 939 940 return false; 941 } 942 943 static u8 ath12k_mac_get_target_pdev_id_from_vif(struct ath12k_link_vif *arvif) 944 { 945 struct ath12k *ar = arvif->ar; 946 struct ath12k_base *ab = ar->ab; 947 struct ieee80211_vif *vif = arvif->ahvif->vif; 948 struct cfg80211_chan_def def; 949 enum nl80211_band band; 950 u8 pdev_id = ab->fw_pdev[0].pdev_id; 951 int i; 952 953 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) 954 return pdev_id; 955 956 band = def.chan->band; 957 958 for (i = 0; i < ab->fw_pdev_count; i++) { 959 if (ath12k_mac_band_match(band, ab->fw_pdev[i].supported_bands)) 960 return ab->fw_pdev[i].pdev_id; 961 } 962 963 return pdev_id; 964 } 965 966 u8 ath12k_mac_get_target_pdev_id(struct ath12k *ar) 967 { 968 struct ath12k_link_vif *arvif; 969 struct ath12k_base *ab = ar->ab; 970 971 if (!ab->hw_params->single_pdev_only) 972 return ar->pdev->pdev_id; 973 974 arvif = ath12k_mac_get_vif_up(ar); 975 976 /* fw_pdev array has pdev ids derived from phy capability 977 * service ready event (pdev_and_hw_link_ids). 978 * If no vif is active, return default first index. 979 */ 980 if (!arvif) 981 return ar->ab->fw_pdev[0].pdev_id; 982 983 /* If active vif is found, return the pdev id matching chandef band */ 984 return ath12k_mac_get_target_pdev_id_from_vif(arvif); 985 } 986 987 static void ath12k_pdev_caps_update(struct ath12k *ar) 988 { 989 struct ath12k_base *ab = ar->ab; 990 991 ar->max_tx_power = ab->target_caps.hw_max_tx_power; 992 993 /* FIXME: Set min_tx_power to ab->target_caps.hw_min_tx_power. 994 * But since the received value in svcrdy is same as hw_max_tx_power, 995 * we can set ar->min_tx_power to 0 currently until 996 * this is fixed in firmware 997 */ 998 ar->min_tx_power = 0; 999 1000 ar->txpower_limit_2g = ar->max_tx_power; 1001 ar->txpower_limit_5g = ar->max_tx_power; 1002 ar->txpower_scale = WMI_HOST_TP_SCALE_MAX; 1003 } 1004 1005 static int ath12k_mac_txpower_recalc(struct ath12k *ar) 1006 { 1007 struct ath12k_pdev *pdev = ar->pdev; 1008 struct ath12k_link_vif *arvif; 1009 int ret, txpower = -1; 1010 u32 param; 1011 1012 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 1013 1014 list_for_each_entry(arvif, &ar->arvifs, list) { 1015 if (arvif->txpower <= 0) 1016 continue; 1017 1018 if (txpower == -1) 1019 txpower = arvif->txpower; 1020 else 1021 txpower = min(txpower, arvif->txpower); 1022 } 1023 1024 if (txpower == -1) 1025 return 0; 1026 1027 /* txpwr is set as 2 units per dBm in FW*/ 1028 txpower = min_t(u32, max_t(u32, ar->min_tx_power, txpower), 1029 ar->max_tx_power) * 2; 1030 1031 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "txpower to set in hw %d\n", 1032 txpower / 2); 1033 1034 if ((pdev->cap.supported_bands & WMI_HOST_WLAN_2GHZ_CAP) && 1035 ar->txpower_limit_2g != txpower) { 1036 param = WMI_PDEV_PARAM_TXPOWER_LIMIT2G; 1037 ret = ath12k_wmi_pdev_set_param(ar, param, 1038 txpower, ar->pdev->pdev_id); 1039 if (ret) 1040 goto fail; 1041 ar->txpower_limit_2g = txpower; 1042 } 1043 1044 if ((pdev->cap.supported_bands & WMI_HOST_WLAN_5GHZ_CAP) && 1045 ar->txpower_limit_5g != txpower) { 1046 param = WMI_PDEV_PARAM_TXPOWER_LIMIT5G; 1047 ret = ath12k_wmi_pdev_set_param(ar, param, 1048 txpower, ar->pdev->pdev_id); 1049 if (ret) 1050 goto fail; 1051 ar->txpower_limit_5g = txpower; 1052 } 1053 1054 return 0; 1055 1056 fail: 1057 ath12k_warn(ar->ab, "failed to recalc txpower limit %d using pdev param %d: %d\n", 1058 txpower / 2, param, ret); 1059 return ret; 1060 } 1061 1062 static int ath12k_recalc_rtscts_prot(struct ath12k_link_vif *arvif) 1063 { 1064 struct ath12k *ar = arvif->ar; 1065 u32 vdev_param, rts_cts; 1066 int ret; 1067 1068 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 1069 1070 vdev_param = WMI_VDEV_PARAM_ENABLE_RTSCTS; 1071 1072 /* Enable RTS/CTS protection for sw retries (when legacy stations 1073 * are in BSS) or by default only for second rate series. 1074 * TODO: Check if we need to enable CTS 2 Self in any case 1075 */ 1076 rts_cts = WMI_USE_RTS_CTS; 1077 1078 if (arvif->num_legacy_stations > 0) 1079 rts_cts |= WMI_RTSCTS_ACROSS_SW_RETRIES << 4; 1080 else 1081 rts_cts |= WMI_RTSCTS_FOR_SECOND_RATESERIES << 4; 1082 1083 /* Need not send duplicate param value to firmware */ 1084 if (arvif->rtscts_prot_mode == rts_cts) 1085 return 0; 1086 1087 arvif->rtscts_prot_mode = rts_cts; 1088 1089 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d recalc rts/cts prot %d\n", 1090 arvif->vdev_id, rts_cts); 1091 1092 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 1093 vdev_param, rts_cts); 1094 if (ret) 1095 ath12k_warn(ar->ab, "failed to recalculate rts/cts prot for vdev %d: %d\n", 1096 arvif->vdev_id, ret); 1097 1098 return ret; 1099 } 1100 1101 static int ath12k_mac_set_kickout(struct ath12k_link_vif *arvif) 1102 { 1103 struct ath12k *ar = arvif->ar; 1104 u32 param; 1105 int ret; 1106 1107 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_STA_KICKOUT_TH, 1108 ATH12K_KICKOUT_THRESHOLD, 1109 ar->pdev->pdev_id); 1110 if (ret) { 1111 ath12k_warn(ar->ab, "failed to set kickout threshold on vdev %i: %d\n", 1112 arvif->vdev_id, ret); 1113 return ret; 1114 } 1115 1116 param = WMI_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS; 1117 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, 1118 ATH12K_KEEPALIVE_MIN_IDLE); 1119 if (ret) { 1120 ath12k_warn(ar->ab, "failed to set keepalive minimum idle time on vdev %i: %d\n", 1121 arvif->vdev_id, ret); 1122 return ret; 1123 } 1124 1125 param = WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS; 1126 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, 1127 ATH12K_KEEPALIVE_MAX_IDLE); 1128 if (ret) { 1129 ath12k_warn(ar->ab, "failed to set keepalive maximum idle time on vdev %i: %d\n", 1130 arvif->vdev_id, ret); 1131 return ret; 1132 } 1133 1134 param = WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS; 1135 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, 1136 ATH12K_KEEPALIVE_MAX_UNRESPONSIVE); 1137 if (ret) { 1138 ath12k_warn(ar->ab, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n", 1139 arvif->vdev_id, ret); 1140 return ret; 1141 } 1142 1143 return 0; 1144 } 1145 1146 void ath12k_mac_peer_cleanup_all(struct ath12k *ar) 1147 { 1148 struct ath12k_peer *peer, *tmp; 1149 struct ath12k_base *ab = ar->ab; 1150 1151 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 1152 1153 spin_lock_bh(&ab->base_lock); 1154 list_for_each_entry_safe(peer, tmp, &ab->peers, list) { 1155 /* Skip Rx TID cleanup for self peer */ 1156 if (peer->sta) 1157 ath12k_dp_rx_peer_tid_cleanup(ar, peer); 1158 1159 list_del(&peer->list); 1160 kfree(peer); 1161 } 1162 spin_unlock_bh(&ab->base_lock); 1163 1164 ar->num_peers = 0; 1165 ar->num_stations = 0; 1166 } 1167 1168 static int ath12k_mac_vdev_setup_sync(struct ath12k *ar) 1169 { 1170 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 1171 1172 if (test_bit(ATH12K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags)) 1173 return -ESHUTDOWN; 1174 1175 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "vdev setup timeout %d\n", 1176 ATH12K_VDEV_SETUP_TIMEOUT_HZ); 1177 1178 if (!wait_for_completion_timeout(&ar->vdev_setup_done, 1179 ATH12K_VDEV_SETUP_TIMEOUT_HZ)) 1180 return -ETIMEDOUT; 1181 1182 return ar->last_wmi_vdev_start_status ? -EINVAL : 0; 1183 } 1184 1185 static int ath12k_monitor_vdev_up(struct ath12k *ar, int vdev_id) 1186 { 1187 struct ath12k_wmi_vdev_up_params params = {}; 1188 int ret; 1189 1190 params.vdev_id = vdev_id; 1191 params.bssid = ar->mac_addr; 1192 ret = ath12k_wmi_vdev_up(ar, ¶ms); 1193 if (ret) { 1194 ath12k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n", 1195 vdev_id, ret); 1196 return ret; 1197 } 1198 1199 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %i started\n", 1200 vdev_id); 1201 return 0; 1202 } 1203 1204 static int ath12k_mac_monitor_vdev_start(struct ath12k *ar, int vdev_id, 1205 struct cfg80211_chan_def *chandef) 1206 { 1207 struct ieee80211_channel *channel; 1208 struct wmi_vdev_start_req_arg arg = {}; 1209 struct ath12k_wmi_vdev_up_params params = {}; 1210 int ret; 1211 1212 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 1213 1214 channel = chandef->chan; 1215 arg.vdev_id = vdev_id; 1216 arg.freq = channel->center_freq; 1217 arg.band_center_freq1 = chandef->center_freq1; 1218 arg.band_center_freq2 = chandef->center_freq2; 1219 arg.mode = ath12k_phymodes[chandef->chan->band][chandef->width]; 1220 arg.chan_radar = !!(channel->flags & IEEE80211_CHAN_RADAR); 1221 1222 arg.min_power = 0; 1223 arg.max_power = channel->max_power; 1224 arg.max_reg_power = channel->max_reg_power; 1225 arg.max_antenna_gain = channel->max_antenna_gain; 1226 1227 arg.pref_tx_streams = ar->num_tx_chains; 1228 arg.pref_rx_streams = ar->num_rx_chains; 1229 arg.punct_bitmap = 0xFFFFFFFF; 1230 1231 arg.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR); 1232 1233 reinit_completion(&ar->vdev_setup_done); 1234 reinit_completion(&ar->vdev_delete_done); 1235 1236 ret = ath12k_wmi_vdev_start(ar, &arg, false); 1237 if (ret) { 1238 ath12k_warn(ar->ab, "failed to request monitor vdev %i start: %d\n", 1239 vdev_id, ret); 1240 return ret; 1241 } 1242 1243 ret = ath12k_mac_vdev_setup_sync(ar); 1244 if (ret) { 1245 ath12k_warn(ar->ab, "failed to synchronize setup for monitor vdev %i start: %d\n", 1246 vdev_id, ret); 1247 return ret; 1248 } 1249 1250 params.vdev_id = vdev_id; 1251 params.bssid = ar->mac_addr; 1252 ret = ath12k_wmi_vdev_up(ar, ¶ms); 1253 if (ret) { 1254 ath12k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n", 1255 vdev_id, ret); 1256 goto vdev_stop; 1257 } 1258 1259 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %i started\n", 1260 vdev_id); 1261 return 0; 1262 1263 vdev_stop: 1264 ret = ath12k_wmi_vdev_stop(ar, vdev_id); 1265 if (ret) 1266 ath12k_warn(ar->ab, "failed to stop monitor vdev %i after start failure: %d\n", 1267 vdev_id, ret); 1268 return ret; 1269 } 1270 1271 static int ath12k_mac_monitor_vdev_stop(struct ath12k *ar) 1272 { 1273 int ret; 1274 1275 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 1276 1277 reinit_completion(&ar->vdev_setup_done); 1278 1279 ret = ath12k_wmi_vdev_stop(ar, ar->monitor_vdev_id); 1280 if (ret) 1281 ath12k_warn(ar->ab, "failed to request monitor vdev %i stop: %d\n", 1282 ar->monitor_vdev_id, ret); 1283 1284 ret = ath12k_mac_vdev_setup_sync(ar); 1285 if (ret) 1286 ath12k_warn(ar->ab, "failed to synchronize monitor vdev %i stop: %d\n", 1287 ar->monitor_vdev_id, ret); 1288 1289 ret = ath12k_wmi_vdev_down(ar, ar->monitor_vdev_id); 1290 if (ret) 1291 ath12k_warn(ar->ab, "failed to put down monitor vdev %i: %d\n", 1292 ar->monitor_vdev_id, ret); 1293 1294 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %i stopped\n", 1295 ar->monitor_vdev_id); 1296 return ret; 1297 } 1298 1299 static int ath12k_mac_monitor_vdev_delete(struct ath12k *ar) 1300 { 1301 int ret; 1302 unsigned long time_left; 1303 1304 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 1305 1306 if (!ar->monitor_vdev_created) 1307 return 0; 1308 1309 reinit_completion(&ar->vdev_delete_done); 1310 1311 ret = ath12k_wmi_vdev_delete(ar, ar->monitor_vdev_id); 1312 if (ret) { 1313 ath12k_warn(ar->ab, "failed to request wmi monitor vdev %i removal: %d\n", 1314 ar->monitor_vdev_id, ret); 1315 return ret; 1316 } 1317 1318 time_left = wait_for_completion_timeout(&ar->vdev_delete_done, 1319 ATH12K_VDEV_DELETE_TIMEOUT_HZ); 1320 if (time_left == 0) { 1321 ath12k_warn(ar->ab, "Timeout in receiving vdev delete response\n"); 1322 } else { 1323 ar->allocated_vdev_map &= ~(1LL << ar->monitor_vdev_id); 1324 ar->ab->free_vdev_map |= 1LL << (ar->monitor_vdev_id); 1325 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %d deleted\n", 1326 ar->monitor_vdev_id); 1327 ar->num_created_vdevs--; 1328 ar->monitor_vdev_id = -1; 1329 ar->monitor_vdev_created = false; 1330 } 1331 1332 return ret; 1333 } 1334 1335 static int ath12k_mac_monitor_start(struct ath12k *ar) 1336 { 1337 struct ath12k_mac_get_any_chanctx_conf_arg arg; 1338 int ret; 1339 1340 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 1341 1342 if (ar->monitor_started) 1343 return 0; 1344 1345 arg.ar = ar; 1346 arg.chanctx_conf = NULL; 1347 ieee80211_iter_chan_contexts_atomic(ath12k_ar_to_hw(ar), 1348 ath12k_mac_get_any_chanctx_conf_iter, 1349 &arg); 1350 if (!arg.chanctx_conf) 1351 return 0; 1352 1353 ret = ath12k_mac_monitor_vdev_start(ar, ar->monitor_vdev_id, 1354 &arg.chanctx_conf->def); 1355 if (ret) { 1356 ath12k_warn(ar->ab, "failed to start monitor vdev: %d\n", ret); 1357 return ret; 1358 } 1359 1360 ret = ath12k_dp_tx_htt_monitor_mode_ring_config(ar, false); 1361 if (ret) { 1362 ath12k_warn(ar->ab, "fail to set monitor filter: %d\n", ret); 1363 return ret; 1364 } 1365 1366 ar->monitor_started = true; 1367 ar->num_started_vdevs++; 1368 1369 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor started\n"); 1370 1371 return 0; 1372 } 1373 1374 static int ath12k_mac_monitor_stop(struct ath12k *ar) 1375 { 1376 int ret; 1377 1378 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 1379 1380 if (!ar->monitor_started) 1381 return 0; 1382 1383 ret = ath12k_mac_monitor_vdev_stop(ar); 1384 if (ret) { 1385 ath12k_warn(ar->ab, "failed to stop monitor vdev: %d\n", ret); 1386 return ret; 1387 } 1388 1389 ar->monitor_started = false; 1390 ar->num_started_vdevs--; 1391 ret = ath12k_dp_tx_htt_monitor_mode_ring_config(ar, true); 1392 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor stopped ret %d\n", ret); 1393 return ret; 1394 } 1395 1396 int ath12k_mac_vdev_stop(struct ath12k_link_vif *arvif) 1397 { 1398 struct ath12k_vif *ahvif = arvif->ahvif; 1399 struct ath12k *ar = arvif->ar; 1400 int ret; 1401 1402 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 1403 1404 reinit_completion(&ar->vdev_setup_done); 1405 1406 ret = ath12k_wmi_vdev_stop(ar, arvif->vdev_id); 1407 if (ret) { 1408 ath12k_warn(ar->ab, "failed to stop WMI vdev %i: %d\n", 1409 arvif->vdev_id, ret); 1410 goto err; 1411 } 1412 1413 ret = ath12k_mac_vdev_setup_sync(ar); 1414 if (ret) { 1415 ath12k_warn(ar->ab, "failed to synchronize setup for vdev %i: %d\n", 1416 arvif->vdev_id, ret); 1417 goto err; 1418 } 1419 1420 WARN_ON(ar->num_started_vdevs == 0); 1421 1422 ar->num_started_vdevs--; 1423 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "vdev %pM stopped, vdev_id %d\n", 1424 ahvif->vif->addr, arvif->vdev_id); 1425 1426 if (test_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags)) { 1427 clear_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags); 1428 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "CAC Stopped for vdev %d\n", 1429 arvif->vdev_id); 1430 } 1431 1432 return 0; 1433 err: 1434 return ret; 1435 } 1436 1437 static int ath12k_mac_op_config(struct ieee80211_hw *hw, int radio_idx, u32 changed) 1438 { 1439 return 0; 1440 } 1441 1442 static int ath12k_mac_setup_bcn_p2p_ie(struct ath12k_link_vif *arvif, 1443 struct sk_buff *bcn) 1444 { 1445 struct ath12k *ar = arvif->ar; 1446 struct ieee80211_mgmt *mgmt; 1447 const u8 *p2p_ie; 1448 int ret; 1449 1450 mgmt = (void *)bcn->data; 1451 p2p_ie = cfg80211_find_vendor_ie(WLAN_OUI_WFA, WLAN_OUI_TYPE_WFA_P2P, 1452 mgmt->u.beacon.variable, 1453 bcn->len - (mgmt->u.beacon.variable - 1454 bcn->data)); 1455 if (!p2p_ie) { 1456 ath12k_warn(ar->ab, "no P2P ie found in beacon\n"); 1457 return -ENOENT; 1458 } 1459 1460 ret = ath12k_wmi_p2p_go_bcn_ie(ar, arvif->vdev_id, p2p_ie); 1461 if (ret) { 1462 ath12k_warn(ar->ab, "failed to submit P2P GO bcn ie for vdev %i: %d\n", 1463 arvif->vdev_id, ret); 1464 return ret; 1465 } 1466 1467 return 0; 1468 } 1469 1470 static int ath12k_mac_remove_vendor_ie(struct sk_buff *skb, unsigned int oui, 1471 u8 oui_type, size_t ie_offset) 1472 { 1473 const u8 *next, *end; 1474 size_t len; 1475 u8 *ie; 1476 1477 if (WARN_ON(skb->len < ie_offset)) 1478 return -EINVAL; 1479 1480 ie = (u8 *)cfg80211_find_vendor_ie(oui, oui_type, 1481 skb->data + ie_offset, 1482 skb->len - ie_offset); 1483 if (!ie) 1484 return -ENOENT; 1485 1486 len = ie[1] + 2; 1487 end = skb->data + skb->len; 1488 next = ie + len; 1489 1490 if (WARN_ON(next > end)) 1491 return -EINVAL; 1492 1493 memmove(ie, next, end - next); 1494 skb_trim(skb, skb->len - len); 1495 1496 return 0; 1497 } 1498 1499 static void ath12k_mac_set_arvif_ies(struct ath12k_link_vif *arvif, 1500 struct ath12k_link_vif *tx_arvif, 1501 struct sk_buff *bcn, 1502 u8 bssid_index, bool *nontx_profile_found) 1503 { 1504 struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)bcn->data; 1505 const struct element *elem, *nontx, *index, *nie, *ext_cap_ie; 1506 const u8 *start, *tail; 1507 u16 rem_len; 1508 u8 i; 1509 1510 start = bcn->data + ieee80211_get_hdrlen_from_skb(bcn) + sizeof(mgmt->u.beacon); 1511 tail = skb_tail_pointer(bcn); 1512 rem_len = tail - start; 1513 1514 arvif->rsnie_present = false; 1515 arvif->wpaie_present = false; 1516 1517 if (cfg80211_find_ie(WLAN_EID_RSN, start, rem_len)) 1518 arvif->rsnie_present = true; 1519 if (cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT, WLAN_OUI_TYPE_MICROSOFT_WPA, 1520 start, rem_len)) 1521 arvif->wpaie_present = true; 1522 1523 ext_cap_ie = cfg80211_find_elem(WLAN_EID_EXT_CAPABILITY, start, rem_len); 1524 if (ext_cap_ie && ext_cap_ie->datalen >= 11 && 1525 (ext_cap_ie->data[10] & WLAN_EXT_CAPA11_BCN_PROTECT)) 1526 tx_arvif->beacon_prot = true; 1527 1528 /* Return from here for the transmitted profile */ 1529 if (!bssid_index) 1530 return; 1531 1532 /* Initial rsnie_present for the nontransmitted profile is set to be same as that 1533 * of the transmitted profile. It will be changed if security configurations are 1534 * different. 1535 */ 1536 *nontx_profile_found = false; 1537 for_each_element_id(elem, WLAN_EID_MULTIPLE_BSSID, start, rem_len) { 1538 /* Fixed minimum MBSSID element length with at least one 1539 * nontransmitted BSSID profile is 12 bytes as given below; 1540 * 1 (max BSSID indicator) + 1541 * 2 (Nontransmitted BSSID profile: Subelement ID + length) + 1542 * 4 (Nontransmitted BSSID Capabilities: tag + length + info) 1543 * 2 (Nontransmitted BSSID SSID: tag + length) 1544 * 3 (Nontransmitted BSSID Index: tag + length + BSSID index 1545 */ 1546 if (elem->datalen < 12 || elem->data[0] < 1) 1547 continue; /* Max BSSID indicator must be >=1 */ 1548 1549 for_each_element(nontx, elem->data + 1, elem->datalen - 1) { 1550 start = nontx->data; 1551 1552 if (nontx->id != 0 || nontx->datalen < 4) 1553 continue; /* Invalid nontransmitted profile */ 1554 1555 if (nontx->data[0] != WLAN_EID_NON_TX_BSSID_CAP || 1556 nontx->data[1] != 2) { 1557 continue; /* Missing nontransmitted BSS capabilities */ 1558 } 1559 1560 if (nontx->data[4] != WLAN_EID_SSID) 1561 continue; /* Missing SSID for nontransmitted BSS */ 1562 1563 index = cfg80211_find_elem(WLAN_EID_MULTI_BSSID_IDX, 1564 start, nontx->datalen); 1565 if (!index || index->datalen < 1 || index->data[0] == 0) 1566 continue; /* Invalid MBSSID Index element */ 1567 1568 if (index->data[0] == bssid_index) { 1569 *nontx_profile_found = true; 1570 1571 /* Check if nontx BSS has beacon protection enabled */ 1572 if (!tx_arvif->beacon_prot) { 1573 ext_cap_ie = 1574 cfg80211_find_elem(WLAN_EID_EXT_CAPABILITY, 1575 nontx->data, 1576 nontx->datalen); 1577 if (ext_cap_ie && ext_cap_ie->datalen >= 11 && 1578 (ext_cap_ie->data[10] & 1579 WLAN_EXT_CAPA11_BCN_PROTECT)) 1580 tx_arvif->beacon_prot = true; 1581 } 1582 1583 if (cfg80211_find_ie(WLAN_EID_RSN, 1584 nontx->data, 1585 nontx->datalen)) { 1586 arvif->rsnie_present = true; 1587 return; 1588 } else if (!arvif->rsnie_present) { 1589 return; /* Both tx and nontx BSS are open */ 1590 } 1591 1592 nie = cfg80211_find_ext_elem(WLAN_EID_EXT_NON_INHERITANCE, 1593 nontx->data, 1594 nontx->datalen); 1595 if (!nie || nie->datalen < 2) 1596 return; /* Invalid non-inheritance element */ 1597 1598 for (i = 1; i < nie->datalen - 1; i++) { 1599 if (nie->data[i] == WLAN_EID_RSN) { 1600 arvif->rsnie_present = false; 1601 break; 1602 } 1603 } 1604 1605 return; 1606 } 1607 } 1608 } 1609 } 1610 1611 static int ath12k_mac_setup_bcn_tmpl_ema(struct ath12k_link_vif *arvif, 1612 struct ath12k_link_vif *tx_arvif, 1613 u8 bssid_index) 1614 { 1615 struct ath12k_wmi_bcn_tmpl_ema_arg ema_args; 1616 struct ieee80211_ema_beacons *beacons; 1617 bool nontx_profile_found = false; 1618 int ret = 0; 1619 u8 i; 1620 1621 beacons = ieee80211_beacon_get_template_ema_list(ath12k_ar_to_hw(tx_arvif->ar), 1622 tx_arvif->ahvif->vif, 1623 tx_arvif->link_id); 1624 if (!beacons || !beacons->cnt) { 1625 ath12k_warn(arvif->ar->ab, 1626 "failed to get ema beacon templates from mac80211\n"); 1627 return -EPERM; 1628 } 1629 1630 if (tx_arvif == arvif) 1631 ath12k_mac_set_arvif_ies(arvif, tx_arvif, beacons->bcn[0].skb, 0, NULL); 1632 1633 for (i = 0; i < beacons->cnt; i++) { 1634 if (tx_arvif != arvif && !nontx_profile_found) 1635 ath12k_mac_set_arvif_ies(arvif, tx_arvif, beacons->bcn[i].skb, 1636 bssid_index, 1637 &nontx_profile_found); 1638 1639 ema_args.bcn_cnt = beacons->cnt; 1640 ema_args.bcn_index = i; 1641 ret = ath12k_wmi_bcn_tmpl(tx_arvif, &beacons->bcn[i].offs, 1642 beacons->bcn[i].skb, &ema_args); 1643 if (ret) { 1644 ath12k_warn(tx_arvif->ar->ab, 1645 "failed to set ema beacon template id %i error %d\n", 1646 i, ret); 1647 break; 1648 } 1649 } 1650 1651 if (tx_arvif != arvif && !nontx_profile_found) 1652 ath12k_warn(arvif->ar->ab, 1653 "nontransmitted bssid index %u not found in beacon template\n", 1654 bssid_index); 1655 1656 ieee80211_beacon_free_ema_list(beacons); 1657 return ret; 1658 } 1659 1660 static int ath12k_mac_setup_bcn_tmpl(struct ath12k_link_vif *arvif) 1661 { 1662 struct ath12k_vif *ahvif = arvif->ahvif; 1663 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif); 1664 struct ieee80211_bss_conf *link_conf; 1665 struct ath12k_link_vif *tx_arvif; 1666 struct ath12k *ar = arvif->ar; 1667 struct ath12k_base *ab = ar->ab; 1668 struct ieee80211_mutable_offsets offs = {}; 1669 bool nontx_profile_found = false; 1670 struct sk_buff *bcn; 1671 int ret; 1672 1673 if (ahvif->vdev_type != WMI_VDEV_TYPE_AP) 1674 return 0; 1675 1676 link_conf = ath12k_mac_get_link_bss_conf(arvif); 1677 if (!link_conf) { 1678 ath12k_warn(ar->ab, "unable to access bss link conf to set bcn tmpl for vif %pM link %u\n", 1679 vif->addr, arvif->link_id); 1680 return -ENOLINK; 1681 } 1682 1683 tx_arvif = ath12k_mac_get_tx_arvif(arvif, link_conf); 1684 if (tx_arvif) { 1685 if (tx_arvif != arvif && arvif->is_up) 1686 return 0; 1687 1688 if (link_conf->ema_ap) 1689 return ath12k_mac_setup_bcn_tmpl_ema(arvif, tx_arvif, 1690 link_conf->bssid_index); 1691 } else { 1692 tx_arvif = arvif; 1693 } 1694 1695 bcn = ieee80211_beacon_get_template(ath12k_ar_to_hw(tx_arvif->ar), 1696 tx_arvif->ahvif->vif, 1697 &offs, tx_arvif->link_id); 1698 if (!bcn) { 1699 ath12k_warn(ab, "failed to get beacon template from mac80211\n"); 1700 return -EPERM; 1701 } 1702 1703 if (tx_arvif == arvif) { 1704 ath12k_mac_set_arvif_ies(arvif, tx_arvif, bcn, 0, NULL); 1705 } else { 1706 ath12k_mac_set_arvif_ies(arvif, tx_arvif, bcn, 1707 link_conf->bssid_index, 1708 &nontx_profile_found); 1709 if (!nontx_profile_found) 1710 ath12k_warn(ab, 1711 "nontransmitted profile not found in beacon template\n"); 1712 } 1713 1714 if (ahvif->vif->type == NL80211_IFTYPE_AP && ahvif->vif->p2p) { 1715 ret = ath12k_mac_setup_bcn_p2p_ie(arvif, bcn); 1716 if (ret) { 1717 ath12k_warn(ab, "failed to setup P2P GO bcn ie: %d\n", 1718 ret); 1719 goto free_bcn_skb; 1720 } 1721 1722 /* P2P IE is inserted by firmware automatically (as 1723 * configured above) so remove it from the base beacon 1724 * template to avoid duplicate P2P IEs in beacon frames. 1725 */ 1726 ret = ath12k_mac_remove_vendor_ie(bcn, WLAN_OUI_WFA, 1727 WLAN_OUI_TYPE_WFA_P2P, 1728 offsetof(struct ieee80211_mgmt, 1729 u.beacon.variable)); 1730 if (ret) { 1731 ath12k_warn(ab, "failed to remove P2P vendor ie: %d\n", 1732 ret); 1733 goto free_bcn_skb; 1734 } 1735 } 1736 1737 ret = ath12k_wmi_bcn_tmpl(arvif, &offs, bcn, NULL); 1738 1739 if (ret) 1740 ath12k_warn(ab, "failed to submit beacon template command: %d\n", 1741 ret); 1742 1743 free_bcn_skb: 1744 kfree_skb(bcn); 1745 return ret; 1746 } 1747 1748 static void ath12k_control_beaconing(struct ath12k_link_vif *arvif, 1749 struct ieee80211_bss_conf *info) 1750 { 1751 struct ath12k_wmi_vdev_up_params params = {}; 1752 struct ath12k_vif *ahvif = arvif->ahvif; 1753 struct ath12k *ar = arvif->ar; 1754 int ret; 1755 1756 lockdep_assert_wiphy(ath12k_ar_to_hw(arvif->ar)->wiphy); 1757 1758 if (!info->enable_beacon) { 1759 ret = ath12k_wmi_vdev_down(ar, arvif->vdev_id); 1760 if (ret) 1761 ath12k_warn(ar->ab, "failed to down vdev_id %i: %d\n", 1762 arvif->vdev_id, ret); 1763 1764 arvif->is_up = false; 1765 return; 1766 } 1767 1768 /* Install the beacon template to the FW */ 1769 ret = ath12k_mac_setup_bcn_tmpl(arvif); 1770 if (ret) { 1771 ath12k_warn(ar->ab, "failed to update bcn tmpl during vdev up: %d\n", 1772 ret); 1773 return; 1774 } 1775 1776 ahvif->aid = 0; 1777 1778 ether_addr_copy(arvif->bssid, info->addr); 1779 1780 params.vdev_id = arvif->vdev_id; 1781 params.aid = ahvif->aid; 1782 params.bssid = arvif->bssid; 1783 params.tx_bssid = ath12k_mac_get_tx_bssid(arvif); 1784 if (params.tx_bssid) { 1785 params.nontx_profile_idx = info->bssid_index; 1786 params.nontx_profile_cnt = 1 << info->bssid_indicator; 1787 } 1788 ret = ath12k_wmi_vdev_up(arvif->ar, ¶ms); 1789 if (ret) { 1790 ath12k_warn(ar->ab, "failed to bring up vdev %d: %i\n", 1791 arvif->vdev_id, ret); 1792 return; 1793 } 1794 1795 arvif->is_up = true; 1796 1797 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id); 1798 } 1799 1800 static void ath12k_mac_handle_beacon_iter(void *data, u8 *mac, 1801 struct ieee80211_vif *vif) 1802 { 1803 struct sk_buff *skb = data; 1804 struct ieee80211_mgmt *mgmt = (void *)skb->data; 1805 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 1806 struct ath12k_link_vif *arvif = &ahvif->deflink; 1807 1808 if (vif->type != NL80211_IFTYPE_STATION || !arvif->is_created) 1809 return; 1810 1811 if (!ether_addr_equal(mgmt->bssid, vif->bss_conf.bssid)) 1812 return; 1813 1814 cancel_delayed_work(&arvif->connection_loss_work); 1815 } 1816 1817 void ath12k_mac_handle_beacon(struct ath12k *ar, struct sk_buff *skb) 1818 { 1819 ieee80211_iterate_active_interfaces_atomic(ath12k_ar_to_hw(ar), 1820 IEEE80211_IFACE_ITER_NORMAL, 1821 ath12k_mac_handle_beacon_iter, 1822 skb); 1823 } 1824 1825 void ath12k_mac_handle_beacon_miss(struct ath12k *ar, 1826 struct ath12k_link_vif *arvif) 1827 { 1828 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar); 1829 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 1830 1831 if (!(arvif->is_created && arvif->is_up)) 1832 return; 1833 1834 ieee80211_beacon_loss(vif); 1835 1836 /* Firmware doesn't report beacon loss events repeatedly. If AP probe 1837 * (done by mac80211) succeeds but beacons do not resume then it 1838 * doesn't make sense to continue operation. Queue connection loss work 1839 * which can be cancelled when beacon is received. 1840 */ 1841 ieee80211_queue_delayed_work(hw, &arvif->connection_loss_work, 1842 ATH12K_CONNECTION_LOSS_HZ); 1843 } 1844 1845 static void ath12k_mac_vif_sta_connection_loss_work(struct work_struct *work) 1846 { 1847 struct ath12k_link_vif *arvif = container_of(work, struct ath12k_link_vif, 1848 connection_loss_work.work); 1849 struct ieee80211_vif *vif = arvif->ahvif->vif; 1850 1851 if (!arvif->is_up) 1852 return; 1853 1854 ieee80211_connection_loss(vif); 1855 } 1856 1857 static void ath12k_peer_assoc_h_basic(struct ath12k *ar, 1858 struct ath12k_link_vif *arvif, 1859 struct ath12k_link_sta *arsta, 1860 struct ath12k_wmi_peer_assoc_arg *arg) 1861 { 1862 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 1863 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 1864 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar); 1865 struct ieee80211_bss_conf *bss_conf; 1866 u32 aid; 1867 1868 lockdep_assert_wiphy(hw->wiphy); 1869 1870 if (vif->type == NL80211_IFTYPE_STATION) 1871 aid = vif->cfg.aid; 1872 else 1873 aid = sta->aid; 1874 1875 ether_addr_copy(arg->peer_mac, arsta->addr); 1876 arg->vdev_id = arvif->vdev_id; 1877 arg->peer_associd = aid; 1878 arg->auth_flag = true; 1879 /* TODO: STA WAR in ath10k for listen interval required? */ 1880 arg->peer_listen_intval = hw->conf.listen_interval; 1881 arg->peer_nss = 1; 1882 1883 bss_conf = ath12k_mac_get_link_bss_conf(arvif); 1884 if (!bss_conf) { 1885 ath12k_warn(ar->ab, "unable to access bss link conf in peer assoc for vif %pM link %u\n", 1886 vif->addr, arvif->link_id); 1887 return; 1888 } 1889 1890 arg->peer_caps = bss_conf->assoc_capability; 1891 } 1892 1893 static void ath12k_peer_assoc_h_crypto(struct ath12k *ar, 1894 struct ath12k_link_vif *arvif, 1895 struct ath12k_link_sta *arsta, 1896 struct ath12k_wmi_peer_assoc_arg *arg) 1897 { 1898 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 1899 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 1900 struct ieee80211_bss_conf *info; 1901 struct cfg80211_chan_def def; 1902 struct cfg80211_bss *bss; 1903 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar); 1904 const u8 *rsnie = NULL; 1905 const u8 *wpaie = NULL; 1906 1907 lockdep_assert_wiphy(hw->wiphy); 1908 1909 info = ath12k_mac_get_link_bss_conf(arvif); 1910 if (!info) { 1911 ath12k_warn(ar->ab, "unable to access bss link conf for peer assoc crypto for vif %pM link %u\n", 1912 vif->addr, arvif->link_id); 1913 return; 1914 } 1915 1916 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) 1917 return; 1918 1919 bss = cfg80211_get_bss(hw->wiphy, def.chan, info->bssid, NULL, 0, 1920 IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY); 1921 1922 if (arvif->rsnie_present || arvif->wpaie_present) { 1923 arg->need_ptk_4_way = true; 1924 if (arvif->wpaie_present) 1925 arg->need_gtk_2_way = true; 1926 } else if (bss) { 1927 const struct cfg80211_bss_ies *ies; 1928 1929 rcu_read_lock(); 1930 rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN); 1931 1932 ies = rcu_dereference(bss->ies); 1933 1934 wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT, 1935 WLAN_OUI_TYPE_MICROSOFT_WPA, 1936 ies->data, 1937 ies->len); 1938 rcu_read_unlock(); 1939 cfg80211_put_bss(hw->wiphy, bss); 1940 } 1941 1942 /* FIXME: base on RSN IE/WPA IE is a correct idea? */ 1943 if (rsnie || wpaie) { 1944 ath12k_dbg(ar->ab, ATH12K_DBG_WMI, 1945 "%s: rsn ie found\n", __func__); 1946 arg->need_ptk_4_way = true; 1947 } 1948 1949 if (wpaie) { 1950 ath12k_dbg(ar->ab, ATH12K_DBG_WMI, 1951 "%s: wpa ie found\n", __func__); 1952 arg->need_gtk_2_way = true; 1953 } 1954 1955 if (sta->mfp) { 1956 /* TODO: Need to check if FW supports PMF? */ 1957 arg->is_pmf_enabled = true; 1958 } 1959 1960 /* TODO: safe_mode_enabled (bypass 4-way handshake) flag req? */ 1961 } 1962 1963 static void ath12k_peer_assoc_h_rates(struct ath12k *ar, 1964 struct ath12k_link_vif *arvif, 1965 struct ath12k_link_sta *arsta, 1966 struct ath12k_wmi_peer_assoc_arg *arg) 1967 { 1968 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 1969 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 1970 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates; 1971 struct ieee80211_link_sta *link_sta; 1972 struct cfg80211_chan_def def; 1973 const struct ieee80211_supported_band *sband; 1974 const struct ieee80211_rate *rates; 1975 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar); 1976 enum nl80211_band band; 1977 u32 ratemask; 1978 u8 rate; 1979 int i; 1980 1981 lockdep_assert_wiphy(hw->wiphy); 1982 1983 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) 1984 return; 1985 1986 link_sta = ath12k_mac_get_link_sta(arsta); 1987 if (!link_sta) { 1988 ath12k_warn(ar->ab, "unable to access link sta in peer assoc rates for sta %pM link %u\n", 1989 sta->addr, arsta->link_id); 1990 return; 1991 } 1992 1993 band = def.chan->band; 1994 sband = hw->wiphy->bands[band]; 1995 ratemask = link_sta->supp_rates[band]; 1996 ratemask &= arvif->bitrate_mask.control[band].legacy; 1997 rates = sband->bitrates; 1998 1999 rateset->num_rates = 0; 2000 2001 for (i = 0; i < 32; i++, ratemask >>= 1, rates++) { 2002 if (!(ratemask & 1)) 2003 continue; 2004 2005 rate = ath12k_mac_bitrate_to_rate(rates->bitrate); 2006 rateset->rates[rateset->num_rates] = rate; 2007 rateset->num_rates++; 2008 } 2009 } 2010 2011 static bool 2012 ath12k_peer_assoc_h_ht_masked(const u8 *ht_mcs_mask) 2013 { 2014 int nss; 2015 2016 for (nss = 0; nss < IEEE80211_HT_MCS_MASK_LEN; nss++) 2017 if (ht_mcs_mask[nss]) 2018 return false; 2019 2020 return true; 2021 } 2022 2023 static bool 2024 ath12k_peer_assoc_h_vht_masked(const u16 *vht_mcs_mask) 2025 { 2026 int nss; 2027 2028 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) 2029 if (vht_mcs_mask[nss]) 2030 return false; 2031 2032 return true; 2033 } 2034 2035 static void ath12k_peer_assoc_h_ht(struct ath12k *ar, 2036 struct ath12k_link_vif *arvif, 2037 struct ath12k_link_sta *arsta, 2038 struct ath12k_wmi_peer_assoc_arg *arg) 2039 { 2040 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 2041 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 2042 const struct ieee80211_sta_ht_cap *ht_cap; 2043 struct ieee80211_link_sta *link_sta; 2044 struct cfg80211_chan_def def; 2045 enum nl80211_band band; 2046 const u8 *ht_mcs_mask; 2047 int i, n; 2048 u8 max_nss; 2049 u32 stbc; 2050 2051 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 2052 2053 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) 2054 return; 2055 2056 link_sta = ath12k_mac_get_link_sta(arsta); 2057 if (!link_sta) { 2058 ath12k_warn(ar->ab, "unable to access link sta in peer assoc ht for sta %pM link %u\n", 2059 sta->addr, arsta->link_id); 2060 return; 2061 } 2062 2063 ht_cap = &link_sta->ht_cap; 2064 if (!ht_cap->ht_supported) 2065 return; 2066 2067 band = def.chan->band; 2068 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs; 2069 2070 if (ath12k_peer_assoc_h_ht_masked(ht_mcs_mask)) 2071 return; 2072 2073 arg->ht_flag = true; 2074 2075 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR + 2076 ht_cap->ampdu_factor)) - 1; 2077 2078 arg->peer_mpdu_density = 2079 ath12k_parse_mpdudensity(ht_cap->ampdu_density); 2080 2081 arg->peer_ht_caps = ht_cap->cap; 2082 arg->peer_rate_caps |= WMI_HOST_RC_HT_FLAG; 2083 2084 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING) 2085 arg->ldpc_flag = true; 2086 2087 if (link_sta->bandwidth >= IEEE80211_STA_RX_BW_40) { 2088 arg->bw_40 = true; 2089 arg->peer_rate_caps |= WMI_HOST_RC_CW40_FLAG; 2090 } 2091 2092 /* As firmware handles these two flags (IEEE80211_HT_CAP_SGI_20 2093 * and IEEE80211_HT_CAP_SGI_40) for enabling SGI, reset both 2094 * flags if guard interval is to force Long GI 2095 */ 2096 if (arvif->bitrate_mask.control[band].gi == NL80211_TXRATE_FORCE_LGI) { 2097 arg->peer_ht_caps &= ~(IEEE80211_HT_CAP_SGI_20 | IEEE80211_HT_CAP_SGI_40); 2098 } else { 2099 /* Enable SGI flag if either SGI_20 or SGI_40 is supported */ 2100 if (ht_cap->cap & (IEEE80211_HT_CAP_SGI_20 | IEEE80211_HT_CAP_SGI_40)) 2101 arg->peer_rate_caps |= WMI_HOST_RC_SGI_FLAG; 2102 } 2103 2104 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) { 2105 arg->peer_rate_caps |= WMI_HOST_RC_TX_STBC_FLAG; 2106 arg->stbc_flag = true; 2107 } 2108 2109 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) { 2110 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC; 2111 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT; 2112 stbc = stbc << WMI_HOST_RC_RX_STBC_FLAG_S; 2113 arg->peer_rate_caps |= stbc; 2114 arg->stbc_flag = true; 2115 } 2116 2117 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2]) 2118 arg->peer_rate_caps |= WMI_HOST_RC_TS_FLAG; 2119 else if (ht_cap->mcs.rx_mask[1]) 2120 arg->peer_rate_caps |= WMI_HOST_RC_DS_FLAG; 2121 2122 for (i = 0, n = 0, max_nss = 0; i < IEEE80211_HT_MCS_MASK_LEN * 8; i++) 2123 if ((ht_cap->mcs.rx_mask[i / 8] & BIT(i % 8)) && 2124 (ht_mcs_mask[i / 8] & BIT(i % 8))) { 2125 max_nss = (i / 8) + 1; 2126 arg->peer_ht_rates.rates[n++] = i; 2127 } 2128 2129 /* This is a workaround for HT-enabled STAs which break the spec 2130 * and have no HT capabilities RX mask (no HT RX MCS map). 2131 * 2132 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS), 2133 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs. 2134 * 2135 * Firmware asserts if such situation occurs. 2136 */ 2137 if (n == 0) { 2138 arg->peer_ht_rates.num_rates = 8; 2139 for (i = 0; i < arg->peer_ht_rates.num_rates; i++) 2140 arg->peer_ht_rates.rates[i] = i; 2141 } else { 2142 arg->peer_ht_rates.num_rates = n; 2143 arg->peer_nss = min(link_sta->rx_nss, max_nss); 2144 } 2145 2146 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n", 2147 arg->peer_mac, 2148 arg->peer_ht_rates.num_rates, 2149 arg->peer_nss); 2150 } 2151 2152 static int ath12k_mac_get_max_vht_mcs_map(u16 mcs_map, int nss) 2153 { 2154 switch ((mcs_map >> (2 * nss)) & 0x3) { 2155 case IEEE80211_VHT_MCS_SUPPORT_0_7: return BIT(8) - 1; 2156 case IEEE80211_VHT_MCS_SUPPORT_0_8: return BIT(9) - 1; 2157 case IEEE80211_VHT_MCS_SUPPORT_0_9: return BIT(10) - 1; 2158 } 2159 return 0; 2160 } 2161 2162 static u16 2163 ath12k_peer_assoc_h_vht_limit(u16 tx_mcs_set, 2164 const u16 vht_mcs_limit[NL80211_VHT_NSS_MAX]) 2165 { 2166 int idx_limit; 2167 int nss; 2168 u16 mcs_map; 2169 u16 mcs; 2170 2171 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) { 2172 mcs_map = ath12k_mac_get_max_vht_mcs_map(tx_mcs_set, nss) & 2173 vht_mcs_limit[nss]; 2174 2175 if (mcs_map) 2176 idx_limit = fls(mcs_map) - 1; 2177 else 2178 idx_limit = -1; 2179 2180 switch (idx_limit) { 2181 case 0: 2182 case 1: 2183 case 2: 2184 case 3: 2185 case 4: 2186 case 5: 2187 case 6: 2188 case 7: 2189 mcs = IEEE80211_VHT_MCS_SUPPORT_0_7; 2190 break; 2191 case 8: 2192 mcs = IEEE80211_VHT_MCS_SUPPORT_0_8; 2193 break; 2194 case 9: 2195 mcs = IEEE80211_VHT_MCS_SUPPORT_0_9; 2196 break; 2197 default: 2198 WARN_ON(1); 2199 fallthrough; 2200 case -1: 2201 mcs = IEEE80211_VHT_MCS_NOT_SUPPORTED; 2202 break; 2203 } 2204 2205 tx_mcs_set &= ~(0x3 << (nss * 2)); 2206 tx_mcs_set |= mcs << (nss * 2); 2207 } 2208 2209 return tx_mcs_set; 2210 } 2211 2212 static u8 ath12k_get_nss_160mhz(struct ath12k *ar, 2213 u8 max_nss) 2214 { 2215 u8 nss_ratio_info = ar->pdev->cap.nss_ratio_info; 2216 u8 max_sup_nss = 0; 2217 2218 switch (nss_ratio_info) { 2219 case WMI_NSS_RATIO_1BY2_NSS: 2220 max_sup_nss = max_nss >> 1; 2221 break; 2222 case WMI_NSS_RATIO_3BY4_NSS: 2223 ath12k_warn(ar->ab, "WMI_NSS_RATIO_3BY4_NSS not supported\n"); 2224 break; 2225 case WMI_NSS_RATIO_1_NSS: 2226 max_sup_nss = max_nss; 2227 break; 2228 case WMI_NSS_RATIO_2_NSS: 2229 ath12k_warn(ar->ab, "WMI_NSS_RATIO_2_NSS not supported\n"); 2230 break; 2231 default: 2232 ath12k_warn(ar->ab, "invalid nss ratio received from fw: %d\n", 2233 nss_ratio_info); 2234 break; 2235 } 2236 2237 return max_sup_nss; 2238 } 2239 2240 static void ath12k_peer_assoc_h_vht(struct ath12k *ar, 2241 struct ath12k_link_vif *arvif, 2242 struct ath12k_link_sta *arsta, 2243 struct ath12k_wmi_peer_assoc_arg *arg) 2244 { 2245 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 2246 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 2247 const struct ieee80211_sta_vht_cap *vht_cap; 2248 struct ieee80211_link_sta *link_sta; 2249 struct cfg80211_chan_def def; 2250 enum nl80211_band band; 2251 u16 *vht_mcs_mask; 2252 u16 tx_mcs_map; 2253 u8 ampdu_factor; 2254 u8 max_nss, vht_mcs; 2255 int i, vht_nss, nss_idx; 2256 bool user_rate_valid = true; 2257 u32 rx_nss, tx_nss, nss_160; 2258 2259 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 2260 2261 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) 2262 return; 2263 2264 link_sta = ath12k_mac_get_link_sta(arsta); 2265 if (!link_sta) { 2266 ath12k_warn(ar->ab, "unable to access link sta in peer assoc vht for sta %pM link %u\n", 2267 sta->addr, arsta->link_id); 2268 return; 2269 } 2270 2271 vht_cap = &link_sta->vht_cap; 2272 if (!vht_cap->vht_supported) 2273 return; 2274 2275 band = def.chan->band; 2276 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs; 2277 2278 if (ath12k_peer_assoc_h_vht_masked(vht_mcs_mask)) 2279 return; 2280 2281 arg->vht_flag = true; 2282 2283 /* TODO: similar flags required? */ 2284 arg->vht_capable = true; 2285 2286 if (def.chan->band == NL80211_BAND_2GHZ) 2287 arg->vht_ng_flag = true; 2288 2289 arg->peer_vht_caps = vht_cap->cap; 2290 2291 ampdu_factor = (vht_cap->cap & 2292 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >> 2293 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT; 2294 2295 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to 2296 * zero in VHT IE. Using it would result in degraded throughput. 2297 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep 2298 * it if VHT max_mpdu is smaller. 2299 */ 2300 arg->peer_max_mpdu = max(arg->peer_max_mpdu, 2301 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR + 2302 ampdu_factor)) - 1); 2303 2304 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80) 2305 arg->bw_80 = true; 2306 2307 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) 2308 arg->bw_160 = true; 2309 2310 vht_nss = ath12k_mac_max_vht_nss(vht_mcs_mask); 2311 2312 if (vht_nss > link_sta->rx_nss) { 2313 user_rate_valid = false; 2314 for (nss_idx = link_sta->rx_nss - 1; nss_idx >= 0; nss_idx--) { 2315 if (vht_mcs_mask[nss_idx]) { 2316 user_rate_valid = true; 2317 break; 2318 } 2319 } 2320 } 2321 2322 if (!user_rate_valid) { 2323 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 2324 "Setting vht range MCS value to peer supported nss:%d for peer %pM\n", 2325 link_sta->rx_nss, arsta->addr); 2326 vht_mcs_mask[link_sta->rx_nss - 1] = vht_mcs_mask[vht_nss - 1]; 2327 } 2328 2329 /* Calculate peer NSS capability from VHT capabilities if STA 2330 * supports VHT. 2331 */ 2332 for (i = 0, max_nss = 0, vht_mcs = 0; i < NL80211_VHT_NSS_MAX; i++) { 2333 vht_mcs = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map) >> 2334 (2 * i) & 3; 2335 2336 if (vht_mcs != IEEE80211_VHT_MCS_NOT_SUPPORTED && 2337 vht_mcs_mask[i]) 2338 max_nss = i + 1; 2339 } 2340 arg->peer_nss = min(link_sta->rx_nss, max_nss); 2341 arg->rx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.rx_highest); 2342 arg->rx_mcs_set = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map); 2343 arg->tx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.tx_highest); 2344 2345 tx_mcs_map = __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map); 2346 arg->tx_mcs_set = ath12k_peer_assoc_h_vht_limit(tx_mcs_map, vht_mcs_mask); 2347 2348 /* In QCN9274 platform, VHT MCS rate 10 and 11 is enabled by default. 2349 * VHT MCS rate 10 and 11 is not supported in 11ac standard. 2350 * so explicitly disable the VHT MCS rate 10 and 11 in 11ac mode. 2351 */ 2352 arg->tx_mcs_set &= ~IEEE80211_VHT_MCS_SUPPORT_0_11_MASK; 2353 arg->tx_mcs_set |= IEEE80211_DISABLE_VHT_MCS_SUPPORT_0_11; 2354 2355 if ((arg->tx_mcs_set & IEEE80211_VHT_MCS_NOT_SUPPORTED) == 2356 IEEE80211_VHT_MCS_NOT_SUPPORTED) 2357 arg->peer_vht_caps &= ~IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE; 2358 2359 /* TODO: Check */ 2360 arg->tx_max_mcs_nss = 0xFF; 2361 2362 if (arg->peer_phymode == MODE_11AC_VHT160) { 2363 tx_nss = ath12k_get_nss_160mhz(ar, max_nss); 2364 rx_nss = min(arg->peer_nss, tx_nss); 2365 arg->peer_bw_rxnss_override = ATH12K_BW_NSS_MAP_ENABLE; 2366 2367 if (!rx_nss) { 2368 ath12k_warn(ar->ab, "invalid max_nss\n"); 2369 return; 2370 } 2371 2372 nss_160 = u32_encode_bits(rx_nss - 1, ATH12K_PEER_RX_NSS_160MHZ); 2373 arg->peer_bw_rxnss_override |= nss_160; 2374 } 2375 2376 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 2377 "mac vht peer %pM max_mpdu %d flags 0x%x nss_override 0x%x\n", 2378 arsta->addr, arg->peer_max_mpdu, arg->peer_flags, 2379 arg->peer_bw_rxnss_override); 2380 } 2381 2382 static int ath12k_mac_get_max_he_mcs_map(u16 mcs_map, int nss) 2383 { 2384 switch ((mcs_map >> (2 * nss)) & 0x3) { 2385 case IEEE80211_HE_MCS_SUPPORT_0_7: return BIT(8) - 1; 2386 case IEEE80211_HE_MCS_SUPPORT_0_9: return BIT(10) - 1; 2387 case IEEE80211_HE_MCS_SUPPORT_0_11: return BIT(12) - 1; 2388 } 2389 return 0; 2390 } 2391 2392 static u16 ath12k_peer_assoc_h_he_limit(u16 tx_mcs_set, 2393 const u16 *he_mcs_limit) 2394 { 2395 int idx_limit; 2396 int nss; 2397 u16 mcs_map; 2398 u16 mcs; 2399 2400 for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++) { 2401 mcs_map = ath12k_mac_get_max_he_mcs_map(tx_mcs_set, nss) & 2402 he_mcs_limit[nss]; 2403 2404 if (mcs_map) 2405 idx_limit = fls(mcs_map) - 1; 2406 else 2407 idx_limit = -1; 2408 2409 switch (idx_limit) { 2410 case 0 ... 7: 2411 mcs = IEEE80211_HE_MCS_SUPPORT_0_7; 2412 break; 2413 case 8: 2414 case 9: 2415 mcs = IEEE80211_HE_MCS_SUPPORT_0_9; 2416 break; 2417 case 10: 2418 case 11: 2419 mcs = IEEE80211_HE_MCS_SUPPORT_0_11; 2420 break; 2421 default: 2422 WARN_ON(1); 2423 fallthrough; 2424 case -1: 2425 mcs = IEEE80211_HE_MCS_NOT_SUPPORTED; 2426 break; 2427 } 2428 2429 tx_mcs_set &= ~(0x3 << (nss * 2)); 2430 tx_mcs_set |= mcs << (nss * 2); 2431 } 2432 2433 return tx_mcs_set; 2434 } 2435 2436 static bool 2437 ath12k_peer_assoc_h_he_masked(const u16 he_mcs_mask[NL80211_HE_NSS_MAX]) 2438 { 2439 int nss; 2440 2441 for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++) 2442 if (he_mcs_mask[nss]) 2443 return false; 2444 2445 return true; 2446 } 2447 2448 static void ath12k_peer_assoc_h_he(struct ath12k *ar, 2449 struct ath12k_link_vif *arvif, 2450 struct ath12k_link_sta *arsta, 2451 struct ath12k_wmi_peer_assoc_arg *arg) 2452 { 2453 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 2454 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 2455 const struct ieee80211_sta_he_cap *he_cap; 2456 struct ieee80211_bss_conf *link_conf; 2457 struct ieee80211_link_sta *link_sta; 2458 struct cfg80211_chan_def def; 2459 int i; 2460 u8 ampdu_factor, max_nss; 2461 u8 rx_mcs_80 = IEEE80211_HE_MCS_NOT_SUPPORTED; 2462 u8 rx_mcs_160 = IEEE80211_HE_MCS_NOT_SUPPORTED; 2463 u16 mcs_160_map, mcs_80_map; 2464 u8 link_id = arvif->link_id; 2465 bool support_160; 2466 enum nl80211_band band; 2467 u16 *he_mcs_mask; 2468 u8 he_mcs; 2469 u16 he_tx_mcs = 0, v = 0; 2470 int he_nss, nss_idx; 2471 bool user_rate_valid = true; 2472 u32 rx_nss, tx_nss, nss_160; 2473 2474 if (WARN_ON(ath12k_mac_vif_link_chan(vif, link_id, &def))) 2475 return; 2476 2477 link_conf = ath12k_mac_get_link_bss_conf(arvif); 2478 if (!link_conf) { 2479 ath12k_warn(ar->ab, "unable to access bss link conf in peer assoc he for vif %pM link %u", 2480 vif->addr, link_id); 2481 return; 2482 } 2483 2484 link_sta = ath12k_mac_get_link_sta(arsta); 2485 if (!link_sta) { 2486 ath12k_warn(ar->ab, "unable to access link sta in peer assoc he for sta %pM link %u\n", 2487 sta->addr, arsta->link_id); 2488 return; 2489 } 2490 2491 he_cap = &link_sta->he_cap; 2492 if (!he_cap->has_he) 2493 return; 2494 2495 band = def.chan->band; 2496 he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs; 2497 2498 if (ath12k_peer_assoc_h_he_masked(he_mcs_mask)) 2499 return; 2500 2501 arg->he_flag = true; 2502 2503 support_160 = !!(he_cap->he_cap_elem.phy_cap_info[0] & 2504 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G); 2505 2506 /* Supported HE-MCS and NSS Set of peer he_cap is intersection with self he_cp */ 2507 mcs_160_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160); 2508 mcs_80_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80); 2509 2510 if (support_160) { 2511 for (i = 7; i >= 0; i--) { 2512 u8 mcs_160 = (mcs_160_map >> (2 * i)) & 3; 2513 2514 if (mcs_160 != IEEE80211_HE_MCS_NOT_SUPPORTED) { 2515 rx_mcs_160 = i + 1; 2516 break; 2517 } 2518 } 2519 } 2520 2521 for (i = 7; i >= 0; i--) { 2522 u8 mcs_80 = (mcs_80_map >> (2 * i)) & 3; 2523 2524 if (mcs_80 != IEEE80211_HE_MCS_NOT_SUPPORTED) { 2525 rx_mcs_80 = i + 1; 2526 break; 2527 } 2528 } 2529 2530 if (support_160) 2531 max_nss = min(rx_mcs_80, rx_mcs_160); 2532 else 2533 max_nss = rx_mcs_80; 2534 2535 arg->peer_nss = min(link_sta->rx_nss, max_nss); 2536 2537 memcpy(&arg->peer_he_cap_macinfo, he_cap->he_cap_elem.mac_cap_info, 2538 sizeof(he_cap->he_cap_elem.mac_cap_info)); 2539 memcpy(&arg->peer_he_cap_phyinfo, he_cap->he_cap_elem.phy_cap_info, 2540 sizeof(he_cap->he_cap_elem.phy_cap_info)); 2541 arg->peer_he_ops = link_conf->he_oper.params; 2542 2543 /* the top most byte is used to indicate BSS color info */ 2544 arg->peer_he_ops &= 0xffffff; 2545 2546 /* As per section 26.6.1 IEEE Std 802.11ax‐2022, if the Max AMPDU 2547 * Exponent Extension in HE cap is zero, use the arg->peer_max_mpdu 2548 * as calculated while parsing VHT caps(if VHT caps is present) 2549 * or HT caps (if VHT caps is not present). 2550 * 2551 * For non-zero value of Max AMPDU Exponent Extension in HE MAC caps, 2552 * if a HE STA sends VHT cap and HE cap IE in assoc request then, use 2553 * MAX_AMPDU_LEN_FACTOR as 20 to calculate max_ampdu length. 2554 * If a HE STA that does not send VHT cap, but HE and HT cap in assoc 2555 * request, then use MAX_AMPDU_LEN_FACTOR as 16 to calculate max_ampdu 2556 * length. 2557 */ 2558 ampdu_factor = u8_get_bits(he_cap->he_cap_elem.mac_cap_info[3], 2559 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK); 2560 2561 if (ampdu_factor) { 2562 if (link_sta->vht_cap.vht_supported) 2563 arg->peer_max_mpdu = (1 << (IEEE80211_HE_VHT_MAX_AMPDU_FACTOR + 2564 ampdu_factor)) - 1; 2565 else if (link_sta->ht_cap.ht_supported) 2566 arg->peer_max_mpdu = (1 << (IEEE80211_HE_HT_MAX_AMPDU_FACTOR + 2567 ampdu_factor)) - 1; 2568 } 2569 2570 if (he_cap->he_cap_elem.phy_cap_info[6] & 2571 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) { 2572 int bit = 7; 2573 int nss, ru; 2574 2575 arg->peer_ppet.numss_m1 = he_cap->ppe_thres[0] & 2576 IEEE80211_PPE_THRES_NSS_MASK; 2577 arg->peer_ppet.ru_bit_mask = 2578 (he_cap->ppe_thres[0] & 2579 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK) >> 2580 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS; 2581 2582 for (nss = 0; nss <= arg->peer_ppet.numss_m1; nss++) { 2583 for (ru = 0; ru < 4; ru++) { 2584 u32 val = 0; 2585 int i; 2586 2587 if ((arg->peer_ppet.ru_bit_mask & BIT(ru)) == 0) 2588 continue; 2589 for (i = 0; i < 6; i++) { 2590 val >>= 1; 2591 val |= ((he_cap->ppe_thres[bit / 8] >> 2592 (bit % 8)) & 0x1) << 5; 2593 bit++; 2594 } 2595 arg->peer_ppet.ppet16_ppet8_ru3_ru0[nss] |= 2596 val << (ru * 6); 2597 } 2598 } 2599 } 2600 2601 if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_RES) 2602 arg->twt_responder = true; 2603 if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_REQ) 2604 arg->twt_requester = true; 2605 2606 he_nss = ath12k_mac_max_he_nss(he_mcs_mask); 2607 2608 if (he_nss > link_sta->rx_nss) { 2609 user_rate_valid = false; 2610 for (nss_idx = link_sta->rx_nss - 1; nss_idx >= 0; nss_idx--) { 2611 if (he_mcs_mask[nss_idx]) { 2612 user_rate_valid = true; 2613 break; 2614 } 2615 } 2616 } 2617 2618 if (!user_rate_valid) { 2619 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 2620 "Setting he range MCS value to peer supported nss:%d for peer %pM\n", 2621 link_sta->rx_nss, arsta->addr); 2622 he_mcs_mask[link_sta->rx_nss - 1] = he_mcs_mask[he_nss - 1]; 2623 } 2624 2625 switch (link_sta->bandwidth) { 2626 case IEEE80211_STA_RX_BW_160: 2627 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160); 2628 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v; 2629 2630 v = ath12k_peer_assoc_h_he_limit(v, he_mcs_mask); 2631 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v; 2632 2633 arg->peer_he_mcs_count++; 2634 if (!he_tx_mcs) 2635 he_tx_mcs = v; 2636 fallthrough; 2637 2638 default: 2639 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80); 2640 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v; 2641 2642 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80); 2643 v = ath12k_peer_assoc_h_he_limit(v, he_mcs_mask); 2644 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v; 2645 2646 arg->peer_he_mcs_count++; 2647 if (!he_tx_mcs) 2648 he_tx_mcs = v; 2649 break; 2650 } 2651 2652 /* Calculate peer NSS capability from HE capabilities if STA 2653 * supports HE. 2654 */ 2655 for (i = 0, max_nss = 0, he_mcs = 0; i < NL80211_HE_NSS_MAX; i++) { 2656 he_mcs = he_tx_mcs >> (2 * i) & 3; 2657 2658 /* In case of fixed rates, MCS Range in he_tx_mcs might have 2659 * unsupported range, with he_mcs_mask set, so check either of them 2660 * to find nss. 2661 */ 2662 if (he_mcs != IEEE80211_HE_MCS_NOT_SUPPORTED || 2663 he_mcs_mask[i]) 2664 max_nss = i + 1; 2665 } 2666 2667 max_nss = min(max_nss, ar->num_tx_chains); 2668 arg->peer_nss = min(link_sta->rx_nss, max_nss); 2669 2670 if (arg->peer_phymode == MODE_11AX_HE160) { 2671 tx_nss = ath12k_get_nss_160mhz(ar, ar->num_tx_chains); 2672 rx_nss = min(arg->peer_nss, tx_nss); 2673 2674 arg->peer_nss = min(link_sta->rx_nss, ar->num_rx_chains); 2675 arg->peer_bw_rxnss_override = ATH12K_BW_NSS_MAP_ENABLE; 2676 2677 if (!rx_nss) { 2678 ath12k_warn(ar->ab, "invalid max_nss\n"); 2679 return; 2680 } 2681 2682 nss_160 = u32_encode_bits(rx_nss - 1, ATH12K_PEER_RX_NSS_160MHZ); 2683 arg->peer_bw_rxnss_override |= nss_160; 2684 } 2685 2686 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 2687 "mac he peer %pM nss %d mcs cnt %d nss_override 0x%x\n", 2688 arsta->addr, arg->peer_nss, 2689 arg->peer_he_mcs_count, 2690 arg->peer_bw_rxnss_override); 2691 } 2692 2693 static void ath12k_peer_assoc_h_he_6ghz(struct ath12k *ar, 2694 struct ath12k_link_vif *arvif, 2695 struct ath12k_link_sta *arsta, 2696 struct ath12k_wmi_peer_assoc_arg *arg) 2697 { 2698 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 2699 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 2700 const struct ieee80211_sta_he_cap *he_cap; 2701 struct ieee80211_link_sta *link_sta; 2702 struct cfg80211_chan_def def; 2703 enum nl80211_band band; 2704 u8 ampdu_factor, mpdu_density; 2705 2706 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) 2707 return; 2708 2709 band = def.chan->band; 2710 2711 link_sta = ath12k_mac_get_link_sta(arsta); 2712 if (!link_sta) { 2713 ath12k_warn(ar->ab, "unable to access link sta in peer assoc he 6ghz for sta %pM link %u\n", 2714 sta->addr, arsta->link_id); 2715 return; 2716 } 2717 2718 he_cap = &link_sta->he_cap; 2719 2720 if (!arg->he_flag || band != NL80211_BAND_6GHZ || !link_sta->he_6ghz_capa.capa) 2721 return; 2722 2723 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) 2724 arg->bw_40 = true; 2725 2726 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80) 2727 arg->bw_80 = true; 2728 2729 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) 2730 arg->bw_160 = true; 2731 2732 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_320) 2733 arg->bw_320 = true; 2734 2735 arg->peer_he_caps_6ghz = le16_to_cpu(link_sta->he_6ghz_capa.capa); 2736 2737 mpdu_density = u32_get_bits(arg->peer_he_caps_6ghz, 2738 IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START); 2739 arg->peer_mpdu_density = ath12k_parse_mpdudensity(mpdu_density); 2740 2741 /* From IEEE Std 802.11ax-2021 - Section 10.12.2: An HE STA shall be capable of 2742 * receiving A-MPDU where the A-MPDU pre-EOF padding length is up to the value 2743 * indicated by the Maximum A-MPDU Length Exponent Extension field in the HE 2744 * Capabilities element and the Maximum A-MPDU Length Exponent field in HE 6 GHz 2745 * Band Capabilities element in the 6 GHz band. 2746 * 2747 * Here, we are extracting the Max A-MPDU Exponent Extension from HE caps and 2748 * factor is the Maximum A-MPDU Length Exponent from HE 6 GHZ Band capability. 2749 */ 2750 ampdu_factor = u8_get_bits(he_cap->he_cap_elem.mac_cap_info[3], 2751 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK) + 2752 u32_get_bits(arg->peer_he_caps_6ghz, 2753 IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP); 2754 2755 arg->peer_max_mpdu = (1u << (IEEE80211_HE_6GHZ_MAX_AMPDU_FACTOR + 2756 ampdu_factor)) - 1; 2757 } 2758 2759 static int ath12k_get_smps_from_capa(const struct ieee80211_sta_ht_cap *ht_cap, 2760 const struct ieee80211_he_6ghz_capa *he_6ghz_capa, 2761 int *smps) 2762 { 2763 if (ht_cap->ht_supported) 2764 *smps = u16_get_bits(ht_cap->cap, IEEE80211_HT_CAP_SM_PS); 2765 else 2766 *smps = le16_get_bits(he_6ghz_capa->capa, 2767 IEEE80211_HE_6GHZ_CAP_SM_PS); 2768 2769 if (*smps >= ARRAY_SIZE(ath12k_smps_map)) 2770 return -EINVAL; 2771 2772 return 0; 2773 } 2774 2775 static void ath12k_peer_assoc_h_smps(struct ath12k_link_sta *arsta, 2776 struct ath12k_wmi_peer_assoc_arg *arg) 2777 { 2778 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 2779 const struct ieee80211_he_6ghz_capa *he_6ghz_capa; 2780 struct ath12k_link_vif *arvif = arsta->arvif; 2781 const struct ieee80211_sta_ht_cap *ht_cap; 2782 struct ieee80211_link_sta *link_sta; 2783 struct ath12k *ar = arvif->ar; 2784 int smps; 2785 2786 link_sta = ath12k_mac_get_link_sta(arsta); 2787 if (!link_sta) { 2788 ath12k_warn(ar->ab, "unable to access link sta in peer assoc he for sta %pM link %u\n", 2789 sta->addr, arsta->link_id); 2790 return; 2791 } 2792 2793 he_6ghz_capa = &link_sta->he_6ghz_capa; 2794 ht_cap = &link_sta->ht_cap; 2795 2796 if (!ht_cap->ht_supported && !he_6ghz_capa->capa) 2797 return; 2798 2799 if (ath12k_get_smps_from_capa(ht_cap, he_6ghz_capa, &smps)) 2800 return; 2801 2802 switch (smps) { 2803 case WLAN_HT_CAP_SM_PS_STATIC: 2804 arg->static_mimops_flag = true; 2805 break; 2806 case WLAN_HT_CAP_SM_PS_DYNAMIC: 2807 arg->dynamic_mimops_flag = true; 2808 break; 2809 case WLAN_HT_CAP_SM_PS_DISABLED: 2810 arg->spatial_mux_flag = true; 2811 break; 2812 default: 2813 break; 2814 } 2815 } 2816 2817 static void ath12k_peer_assoc_h_qos(struct ath12k *ar, 2818 struct ath12k_link_vif *arvif, 2819 struct ath12k_link_sta *arsta, 2820 struct ath12k_wmi_peer_assoc_arg *arg) 2821 { 2822 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 2823 2824 switch (arvif->ahvif->vdev_type) { 2825 case WMI_VDEV_TYPE_AP: 2826 if (sta->wme) { 2827 /* TODO: Check WME vs QoS */ 2828 arg->is_wme_set = true; 2829 arg->qos_flag = true; 2830 } 2831 2832 if (sta->wme && sta->uapsd_queues) { 2833 /* TODO: Check WME vs QoS */ 2834 arg->is_wme_set = true; 2835 arg->apsd_flag = true; 2836 arg->peer_rate_caps |= WMI_HOST_RC_UAPSD_FLAG; 2837 } 2838 break; 2839 case WMI_VDEV_TYPE_STA: 2840 if (sta->wme) { 2841 arg->is_wme_set = true; 2842 arg->qos_flag = true; 2843 } 2844 break; 2845 default: 2846 break; 2847 } 2848 2849 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac peer %pM qos %d\n", 2850 arsta->addr, arg->qos_flag); 2851 } 2852 2853 static int ath12k_peer_assoc_qos_ap(struct ath12k *ar, 2854 struct ath12k_link_vif *arvif, 2855 struct ath12k_link_sta *arsta) 2856 { 2857 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 2858 struct ath12k_wmi_ap_ps_arg arg; 2859 u32 max_sp; 2860 u32 uapsd; 2861 int ret; 2862 2863 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 2864 2865 arg.vdev_id = arvif->vdev_id; 2866 2867 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n", 2868 sta->uapsd_queues, sta->max_sp); 2869 2870 uapsd = 0; 2871 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO) 2872 uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN | 2873 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN; 2874 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI) 2875 uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN | 2876 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN; 2877 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK) 2878 uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN | 2879 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN; 2880 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE) 2881 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN | 2882 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN; 2883 2884 max_sp = 0; 2885 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP) 2886 max_sp = sta->max_sp; 2887 2888 arg.param = WMI_AP_PS_PEER_PARAM_UAPSD; 2889 arg.value = uapsd; 2890 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg); 2891 if (ret) 2892 goto err; 2893 2894 arg.param = WMI_AP_PS_PEER_PARAM_MAX_SP; 2895 arg.value = max_sp; 2896 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg); 2897 if (ret) 2898 goto err; 2899 2900 /* TODO: revisit during testing */ 2901 arg.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_FRMTYPE; 2902 arg.value = DISABLE_SIFS_RESPONSE_TRIGGER; 2903 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg); 2904 if (ret) 2905 goto err; 2906 2907 arg.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_UAPSD; 2908 arg.value = DISABLE_SIFS_RESPONSE_TRIGGER; 2909 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg); 2910 if (ret) 2911 goto err; 2912 2913 return 0; 2914 2915 err: 2916 ath12k_warn(ar->ab, "failed to set ap ps peer param %d for vdev %i: %d\n", 2917 arg.param, arvif->vdev_id, ret); 2918 return ret; 2919 } 2920 2921 static bool ath12k_mac_sta_has_ofdm_only(struct ieee80211_link_sta *sta) 2922 { 2923 return sta->supp_rates[NL80211_BAND_2GHZ] >> 2924 ATH12K_MAC_FIRST_OFDM_RATE_IDX; 2925 } 2926 2927 static enum wmi_phy_mode ath12k_mac_get_phymode_vht(struct ath12k *ar, 2928 struct ieee80211_link_sta *link_sta) 2929 { 2930 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) { 2931 if (link_sta->vht_cap.cap & (IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ | 2932 IEEE80211_VHT_CAP_EXT_NSS_BW_MASK)) 2933 return MODE_11AC_VHT160; 2934 2935 /* Allow STA to connect even if it does not explicitly advertise 160 MHz 2936 * support 2937 */ 2938 return MODE_11AC_VHT160; 2939 } 2940 2941 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80) 2942 return MODE_11AC_VHT80; 2943 2944 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) 2945 return MODE_11AC_VHT40; 2946 2947 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_20) 2948 return MODE_11AC_VHT20; 2949 2950 return MODE_UNKNOWN; 2951 } 2952 2953 static enum wmi_phy_mode ath12k_mac_get_phymode_he(struct ath12k *ar, 2954 struct ieee80211_link_sta *link_sta) 2955 { 2956 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) { 2957 if (link_sta->he_cap.he_cap_elem.phy_cap_info[0] & 2958 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G) 2959 return MODE_11AX_HE160; 2960 2961 return MODE_UNKNOWN; 2962 } 2963 2964 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80) 2965 return MODE_11AX_HE80; 2966 2967 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) 2968 return MODE_11AX_HE40; 2969 2970 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_20) 2971 return MODE_11AX_HE20; 2972 2973 return MODE_UNKNOWN; 2974 } 2975 2976 static enum wmi_phy_mode ath12k_mac_get_phymode_eht(struct ath12k *ar, 2977 struct ieee80211_link_sta *link_sta) 2978 { 2979 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_320) 2980 if (link_sta->eht_cap.eht_cap_elem.phy_cap_info[0] & 2981 IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ) 2982 return MODE_11BE_EHT320; 2983 2984 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) { 2985 if (link_sta->he_cap.he_cap_elem.phy_cap_info[0] & 2986 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G) 2987 return MODE_11BE_EHT160; 2988 2989 ath12k_warn(ar->ab, "invalid EHT PHY capability info for 160 Mhz: %d\n", 2990 link_sta->he_cap.he_cap_elem.phy_cap_info[0]); 2991 2992 return MODE_UNKNOWN; 2993 } 2994 2995 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80) 2996 return MODE_11BE_EHT80; 2997 2998 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) 2999 return MODE_11BE_EHT40; 3000 3001 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_20) 3002 return MODE_11BE_EHT20; 3003 3004 return MODE_UNKNOWN; 3005 } 3006 3007 static void ath12k_peer_assoc_h_phymode(struct ath12k *ar, 3008 struct ath12k_link_vif *arvif, 3009 struct ath12k_link_sta *arsta, 3010 struct ath12k_wmi_peer_assoc_arg *arg) 3011 { 3012 struct ieee80211_link_sta *link_sta; 3013 struct cfg80211_chan_def def; 3014 enum nl80211_band band; 3015 const u8 *ht_mcs_mask; 3016 const u16 *vht_mcs_mask; 3017 const u16 *he_mcs_mask; 3018 enum wmi_phy_mode phymode = MODE_UNKNOWN; 3019 3020 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 3021 3022 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 3023 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 3024 3025 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) 3026 return; 3027 3028 band = def.chan->band; 3029 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs; 3030 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs; 3031 he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs; 3032 3033 link_sta = ath12k_mac_get_link_sta(arsta); 3034 if (!link_sta) { 3035 ath12k_warn(ar->ab, "unable to access link sta in peer assoc he for sta %pM link %u\n", 3036 sta->addr, arsta->link_id); 3037 return; 3038 } 3039 3040 switch (band) { 3041 case NL80211_BAND_2GHZ: 3042 if (link_sta->eht_cap.has_eht) { 3043 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) 3044 phymode = MODE_11BE_EHT40_2G; 3045 else 3046 phymode = MODE_11BE_EHT20_2G; 3047 } else if (link_sta->he_cap.has_he && 3048 !ath12k_peer_assoc_h_he_masked(he_mcs_mask)) { 3049 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80) 3050 phymode = MODE_11AX_HE80_2G; 3051 else if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) 3052 phymode = MODE_11AX_HE40_2G; 3053 else 3054 phymode = MODE_11AX_HE20_2G; 3055 } else if (link_sta->vht_cap.vht_supported && 3056 !ath12k_peer_assoc_h_vht_masked(vht_mcs_mask)) { 3057 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) 3058 phymode = MODE_11AC_VHT40; 3059 else 3060 phymode = MODE_11AC_VHT20; 3061 } else if (link_sta->ht_cap.ht_supported && 3062 !ath12k_peer_assoc_h_ht_masked(ht_mcs_mask)) { 3063 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) 3064 phymode = MODE_11NG_HT40; 3065 else 3066 phymode = MODE_11NG_HT20; 3067 } else if (ath12k_mac_sta_has_ofdm_only(link_sta)) { 3068 phymode = MODE_11G; 3069 } else { 3070 phymode = MODE_11B; 3071 } 3072 break; 3073 case NL80211_BAND_5GHZ: 3074 case NL80211_BAND_6GHZ: 3075 /* Check EHT first */ 3076 if (link_sta->eht_cap.has_eht) { 3077 phymode = ath12k_mac_get_phymode_eht(ar, link_sta); 3078 } else if (link_sta->he_cap.has_he && 3079 !ath12k_peer_assoc_h_he_masked(he_mcs_mask)) { 3080 phymode = ath12k_mac_get_phymode_he(ar, link_sta); 3081 } else if (link_sta->vht_cap.vht_supported && 3082 !ath12k_peer_assoc_h_vht_masked(vht_mcs_mask)) { 3083 phymode = ath12k_mac_get_phymode_vht(ar, link_sta); 3084 } else if (link_sta->ht_cap.ht_supported && 3085 !ath12k_peer_assoc_h_ht_masked(ht_mcs_mask)) { 3086 if (link_sta->bandwidth >= IEEE80211_STA_RX_BW_40) 3087 phymode = MODE_11NA_HT40; 3088 else 3089 phymode = MODE_11NA_HT20; 3090 } else { 3091 phymode = MODE_11A; 3092 } 3093 break; 3094 default: 3095 break; 3096 } 3097 3098 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac peer %pM phymode %s\n", 3099 arsta->addr, ath12k_mac_phymode_str(phymode)); 3100 3101 arg->peer_phymode = phymode; 3102 WARN_ON(phymode == MODE_UNKNOWN); 3103 } 3104 3105 static void ath12k_mac_set_eht_mcs(u8 rx_tx_mcs7, u8 rx_tx_mcs9, 3106 u8 rx_tx_mcs11, u8 rx_tx_mcs13, 3107 u32 *rx_mcs, u32 *tx_mcs) 3108 { 3109 *rx_mcs = 0; 3110 u32p_replace_bits(rx_mcs, 3111 u8_get_bits(rx_tx_mcs7, IEEE80211_EHT_MCS_NSS_RX), 3112 WMI_EHT_MCS_NSS_0_7); 3113 u32p_replace_bits(rx_mcs, 3114 u8_get_bits(rx_tx_mcs9, IEEE80211_EHT_MCS_NSS_RX), 3115 WMI_EHT_MCS_NSS_8_9); 3116 u32p_replace_bits(rx_mcs, 3117 u8_get_bits(rx_tx_mcs11, IEEE80211_EHT_MCS_NSS_RX), 3118 WMI_EHT_MCS_NSS_10_11); 3119 u32p_replace_bits(rx_mcs, 3120 u8_get_bits(rx_tx_mcs13, IEEE80211_EHT_MCS_NSS_RX), 3121 WMI_EHT_MCS_NSS_12_13); 3122 3123 *tx_mcs = 0; 3124 u32p_replace_bits(tx_mcs, 3125 u8_get_bits(rx_tx_mcs7, IEEE80211_EHT_MCS_NSS_TX), 3126 WMI_EHT_MCS_NSS_0_7); 3127 u32p_replace_bits(tx_mcs, 3128 u8_get_bits(rx_tx_mcs9, IEEE80211_EHT_MCS_NSS_TX), 3129 WMI_EHT_MCS_NSS_8_9); 3130 u32p_replace_bits(tx_mcs, 3131 u8_get_bits(rx_tx_mcs11, IEEE80211_EHT_MCS_NSS_TX), 3132 WMI_EHT_MCS_NSS_10_11); 3133 u32p_replace_bits(tx_mcs, 3134 u8_get_bits(rx_tx_mcs13, IEEE80211_EHT_MCS_NSS_TX), 3135 WMI_EHT_MCS_NSS_12_13); 3136 } 3137 3138 static void ath12k_mac_set_eht_ppe_threshold(const u8 *ppe_thres, 3139 struct ath12k_wmi_ppe_threshold_arg *ppet) 3140 { 3141 u32 bit_pos = IEEE80211_EHT_PPE_THRES_INFO_HEADER_SIZE, val; 3142 u8 nss, ru, i; 3143 u8 ppet_bit_len_per_ru = IEEE80211_EHT_PPE_THRES_INFO_PPET_SIZE * 2; 3144 3145 ppet->numss_m1 = u8_get_bits(ppe_thres[0], IEEE80211_EHT_PPE_THRES_NSS_MASK); 3146 ppet->ru_bit_mask = u16_get_bits(get_unaligned_le16(ppe_thres), 3147 IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK); 3148 3149 for (nss = 0; nss <= ppet->numss_m1; nss++) { 3150 for (ru = 0; 3151 ru < hweight16(IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK); 3152 ru++) { 3153 if ((ppet->ru_bit_mask & BIT(ru)) == 0) 3154 continue; 3155 3156 val = 0; 3157 for (i = 0; i < ppet_bit_len_per_ru; i++) { 3158 val |= (((ppe_thres[bit_pos / 8] >> 3159 (bit_pos % 8)) & 0x1) << i); 3160 bit_pos++; 3161 } 3162 ppet->ppet16_ppet8_ru3_ru0[nss] |= 3163 (val << (ru * ppet_bit_len_per_ru)); 3164 } 3165 } 3166 } 3167 3168 static void ath12k_peer_assoc_h_eht(struct ath12k *ar, 3169 struct ath12k_link_vif *arvif, 3170 struct ath12k_link_sta *arsta, 3171 struct ath12k_wmi_peer_assoc_arg *arg) 3172 { 3173 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 3174 const struct ieee80211_eht_mcs_nss_supp_20mhz_only *bw_20; 3175 const struct ieee80211_eht_mcs_nss_supp_bw *bw; 3176 const struct ieee80211_sta_eht_cap *eht_cap; 3177 const struct ieee80211_sta_he_cap *he_cap; 3178 struct ieee80211_link_sta *link_sta; 3179 struct ieee80211_bss_conf *link_conf; 3180 u32 *rx_mcs, *tx_mcs; 3181 3182 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 3183 3184 link_sta = ath12k_mac_get_link_sta(arsta); 3185 if (!link_sta) { 3186 ath12k_warn(ar->ab, "unable to access link sta in peer assoc eht for sta %pM link %u\n", 3187 sta->addr, arsta->link_id); 3188 return; 3189 } 3190 3191 link_conf = ath12k_mac_get_link_bss_conf(arvif); 3192 if (!link_conf) { 3193 ath12k_warn(ar->ab, "unable to access link_conf in peer assoc eht set\n"); 3194 return; 3195 } 3196 3197 eht_cap = &link_sta->eht_cap; 3198 he_cap = &link_sta->he_cap; 3199 if (!he_cap->has_he || !eht_cap->has_eht) 3200 return; 3201 3202 arg->eht_flag = true; 3203 3204 if ((eht_cap->eht_cap_elem.phy_cap_info[5] & 3205 IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT) && 3206 eht_cap->eht_ppe_thres[0] != 0) 3207 ath12k_mac_set_eht_ppe_threshold(eht_cap->eht_ppe_thres, 3208 &arg->peer_eht_ppet); 3209 3210 memcpy(arg->peer_eht_cap_mac, eht_cap->eht_cap_elem.mac_cap_info, 3211 sizeof(eht_cap->eht_cap_elem.mac_cap_info)); 3212 memcpy(arg->peer_eht_cap_phy, eht_cap->eht_cap_elem.phy_cap_info, 3213 sizeof(eht_cap->eht_cap_elem.phy_cap_info)); 3214 3215 rx_mcs = arg->peer_eht_rx_mcs_set; 3216 tx_mcs = arg->peer_eht_tx_mcs_set; 3217 3218 switch (link_sta->bandwidth) { 3219 case IEEE80211_STA_RX_BW_320: 3220 bw = &eht_cap->eht_mcs_nss_supp.bw._320; 3221 ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss, 3222 bw->rx_tx_mcs9_max_nss, 3223 bw->rx_tx_mcs11_max_nss, 3224 bw->rx_tx_mcs13_max_nss, 3225 &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_320], 3226 &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_320]); 3227 arg->peer_eht_mcs_count++; 3228 fallthrough; 3229 case IEEE80211_STA_RX_BW_160: 3230 bw = &eht_cap->eht_mcs_nss_supp.bw._160; 3231 ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss, 3232 bw->rx_tx_mcs9_max_nss, 3233 bw->rx_tx_mcs11_max_nss, 3234 bw->rx_tx_mcs13_max_nss, 3235 &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_160], 3236 &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_160]); 3237 arg->peer_eht_mcs_count++; 3238 fallthrough; 3239 default: 3240 if ((he_cap->he_cap_elem.phy_cap_info[0] & 3241 (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G | 3242 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G | 3243 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G | 3244 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)) == 0) { 3245 bw_20 = &eht_cap->eht_mcs_nss_supp.only_20mhz; 3246 3247 ath12k_mac_set_eht_mcs(bw_20->rx_tx_mcs7_max_nss, 3248 bw_20->rx_tx_mcs9_max_nss, 3249 bw_20->rx_tx_mcs11_max_nss, 3250 bw_20->rx_tx_mcs13_max_nss, 3251 &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80], 3252 &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80]); 3253 } else { 3254 bw = &eht_cap->eht_mcs_nss_supp.bw._80; 3255 ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss, 3256 bw->rx_tx_mcs9_max_nss, 3257 bw->rx_tx_mcs11_max_nss, 3258 bw->rx_tx_mcs13_max_nss, 3259 &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80], 3260 &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80]); 3261 } 3262 3263 arg->peer_eht_mcs_count++; 3264 break; 3265 } 3266 3267 arg->punct_bitmap = ~arvif->punct_bitmap; 3268 arg->eht_disable_mcs15 = link_conf->eht_disable_mcs15; 3269 } 3270 3271 static void ath12k_peer_assoc_h_mlo(struct ath12k_link_sta *arsta, 3272 struct ath12k_wmi_peer_assoc_arg *arg) 3273 { 3274 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 3275 struct peer_assoc_mlo_params *ml = &arg->ml; 3276 struct ath12k_sta *ahsta = arsta->ahsta; 3277 struct ath12k_link_sta *arsta_p; 3278 struct ath12k_link_vif *arvif; 3279 unsigned long links; 3280 u8 link_id; 3281 int i; 3282 3283 if (!sta->mlo || ahsta->ml_peer_id == ATH12K_MLO_PEER_ID_INVALID) 3284 return; 3285 3286 ml->enabled = true; 3287 ml->assoc_link = arsta->is_assoc_link; 3288 3289 /* For now considering the primary umac based on assoc link */ 3290 ml->primary_umac = arsta->is_assoc_link; 3291 ml->peer_id_valid = true; 3292 ml->logical_link_idx_valid = true; 3293 3294 ether_addr_copy(ml->mld_addr, sta->addr); 3295 ml->logical_link_idx = arsta->link_idx; 3296 ml->ml_peer_id = ahsta->ml_peer_id; 3297 ml->ieee_link_id = arsta->link_id; 3298 ml->num_partner_links = 0; 3299 ml->eml_cap = sta->eml_cap; 3300 links = ahsta->links_map; 3301 3302 rcu_read_lock(); 3303 3304 i = 0; 3305 3306 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) { 3307 if (i >= ATH12K_WMI_MLO_MAX_LINKS) 3308 break; 3309 3310 arsta_p = rcu_dereference(ahsta->link[link_id]); 3311 arvif = rcu_dereference(ahsta->ahvif->link[link_id]); 3312 3313 if (arsta_p == arsta) 3314 continue; 3315 3316 if (!arvif->is_started) 3317 continue; 3318 3319 ml->partner_info[i].vdev_id = arvif->vdev_id; 3320 ml->partner_info[i].hw_link_id = arvif->ar->pdev->hw_link_id; 3321 ml->partner_info[i].assoc_link = arsta_p->is_assoc_link; 3322 ml->partner_info[i].primary_umac = arsta_p->is_assoc_link; 3323 ml->partner_info[i].logical_link_idx_valid = true; 3324 ml->partner_info[i].logical_link_idx = arsta_p->link_idx; 3325 ml->num_partner_links++; 3326 3327 i++; 3328 } 3329 3330 rcu_read_unlock(); 3331 } 3332 3333 static void ath12k_peer_assoc_prepare(struct ath12k *ar, 3334 struct ath12k_link_vif *arvif, 3335 struct ath12k_link_sta *arsta, 3336 struct ath12k_wmi_peer_assoc_arg *arg, 3337 bool reassoc) 3338 { 3339 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 3340 3341 memset(arg, 0, sizeof(*arg)); 3342 3343 reinit_completion(&ar->peer_assoc_done); 3344 3345 arg->peer_new_assoc = !reassoc; 3346 ath12k_peer_assoc_h_basic(ar, arvif, arsta, arg); 3347 ath12k_peer_assoc_h_crypto(ar, arvif, arsta, arg); 3348 ath12k_peer_assoc_h_rates(ar, arvif, arsta, arg); 3349 ath12k_peer_assoc_h_ht(ar, arvif, arsta, arg); 3350 ath12k_peer_assoc_h_vht(ar, arvif, arsta, arg); 3351 ath12k_peer_assoc_h_he(ar, arvif, arsta, arg); 3352 ath12k_peer_assoc_h_he_6ghz(ar, arvif, arsta, arg); 3353 ath12k_peer_assoc_h_eht(ar, arvif, arsta, arg); 3354 ath12k_peer_assoc_h_qos(ar, arvif, arsta, arg); 3355 ath12k_peer_assoc_h_phymode(ar, arvif, arsta, arg); 3356 ath12k_peer_assoc_h_smps(arsta, arg); 3357 ath12k_peer_assoc_h_mlo(arsta, arg); 3358 3359 arsta->peer_nss = arg->peer_nss; 3360 /* TODO: amsdu_disable req? */ 3361 } 3362 3363 static int ath12k_setup_peer_smps(struct ath12k *ar, struct ath12k_link_vif *arvif, 3364 const u8 *addr, 3365 const struct ieee80211_sta_ht_cap *ht_cap, 3366 const struct ieee80211_he_6ghz_capa *he_6ghz_capa) 3367 { 3368 int smps, ret = 0; 3369 3370 if (!ht_cap->ht_supported && !he_6ghz_capa) 3371 return 0; 3372 3373 ret = ath12k_get_smps_from_capa(ht_cap, he_6ghz_capa, &smps); 3374 if (ret < 0) 3375 return ret; 3376 3377 return ath12k_wmi_set_peer_param(ar, addr, arvif->vdev_id, 3378 WMI_PEER_MIMO_PS_STATE, 3379 ath12k_smps_map[smps]); 3380 } 3381 3382 static int ath12k_mac_set_he_txbf_conf(struct ath12k_link_vif *arvif) 3383 { 3384 struct ath12k_vif *ahvif = arvif->ahvif; 3385 struct ath12k *ar = arvif->ar; 3386 u32 param = WMI_VDEV_PARAM_SET_HEMU_MODE; 3387 u32 value = 0; 3388 int ret; 3389 struct ieee80211_bss_conf *link_conf; 3390 3391 link_conf = ath12k_mac_get_link_bss_conf(arvif); 3392 if (!link_conf) { 3393 ath12k_warn(ar->ab, "unable to access bss link conf in txbf conf\n"); 3394 return -EINVAL; 3395 } 3396 3397 if (!link_conf->he_support) 3398 return 0; 3399 3400 if (link_conf->he_su_beamformer) { 3401 value |= u32_encode_bits(HE_SU_BFER_ENABLE, HE_MODE_SU_TX_BFER); 3402 if (link_conf->he_mu_beamformer && 3403 ahvif->vdev_type == WMI_VDEV_TYPE_AP) 3404 value |= u32_encode_bits(HE_MU_BFER_ENABLE, HE_MODE_MU_TX_BFER); 3405 } 3406 3407 if (ahvif->vif->type != NL80211_IFTYPE_MESH_POINT) { 3408 value |= u32_encode_bits(HE_DL_MUOFDMA_ENABLE, HE_MODE_DL_OFDMA) | 3409 u32_encode_bits(HE_UL_MUOFDMA_ENABLE, HE_MODE_UL_OFDMA); 3410 3411 if (link_conf->he_full_ul_mumimo) 3412 value |= u32_encode_bits(HE_UL_MUMIMO_ENABLE, HE_MODE_UL_MUMIMO); 3413 3414 if (link_conf->he_su_beamformee) 3415 value |= u32_encode_bits(HE_SU_BFEE_ENABLE, HE_MODE_SU_TX_BFEE); 3416 } 3417 3418 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, value); 3419 if (ret) { 3420 ath12k_warn(ar->ab, "failed to set vdev %d HE MU mode: %d\n", 3421 arvif->vdev_id, ret); 3422 return ret; 3423 } 3424 3425 param = WMI_VDEV_PARAM_SET_HE_SOUNDING_MODE; 3426 value = u32_encode_bits(HE_VHT_SOUNDING_MODE_ENABLE, HE_VHT_SOUNDING_MODE) | 3427 u32_encode_bits(HE_TRIG_NONTRIG_SOUNDING_MODE_ENABLE, 3428 HE_TRIG_NONTRIG_SOUNDING_MODE); 3429 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 3430 param, value); 3431 if (ret) { 3432 ath12k_warn(ar->ab, "failed to set vdev %d sounding mode: %d\n", 3433 arvif->vdev_id, ret); 3434 return ret; 3435 } 3436 3437 return 0; 3438 } 3439 3440 static int ath12k_mac_vif_recalc_sta_he_txbf(struct ath12k *ar, 3441 struct ath12k_link_vif *arvif, 3442 struct ieee80211_sta_he_cap *he_cap, 3443 int *hemode) 3444 { 3445 struct ieee80211_vif *vif = arvif->ahvif->vif; 3446 struct ieee80211_he_cap_elem he_cap_elem = {}; 3447 struct ieee80211_sta_he_cap *cap_band; 3448 struct cfg80211_chan_def def; 3449 u8 link_id = arvif->link_id; 3450 struct ieee80211_bss_conf *link_conf; 3451 3452 link_conf = ath12k_mac_get_link_bss_conf(arvif); 3453 if (!link_conf) { 3454 ath12k_warn(ar->ab, "unable to access bss link conf in recalc txbf conf\n"); 3455 return -EINVAL; 3456 } 3457 3458 if (!link_conf->he_support) 3459 return 0; 3460 3461 if (vif->type != NL80211_IFTYPE_STATION) 3462 return -EINVAL; 3463 3464 if (WARN_ON(ath12k_mac_vif_link_chan(vif, link_id, &def))) 3465 return -EINVAL; 3466 3467 if (def.chan->band == NL80211_BAND_2GHZ) 3468 cap_band = &ar->mac.iftype[NL80211_BAND_2GHZ][vif->type].he_cap; 3469 else 3470 cap_band = &ar->mac.iftype[NL80211_BAND_5GHZ][vif->type].he_cap; 3471 3472 memcpy(&he_cap_elem, &cap_band->he_cap_elem, sizeof(he_cap_elem)); 3473 3474 *hemode = 0; 3475 if (HECAP_PHY_SUBFME_GET(he_cap_elem.phy_cap_info)) { 3476 if (HECAP_PHY_SUBFMR_GET(he_cap->he_cap_elem.phy_cap_info)) 3477 *hemode |= u32_encode_bits(HE_SU_BFEE_ENABLE, HE_MODE_SU_TX_BFEE); 3478 if (HECAP_PHY_MUBFMR_GET(he_cap->he_cap_elem.phy_cap_info)) 3479 *hemode |= u32_encode_bits(HE_MU_BFEE_ENABLE, HE_MODE_MU_TX_BFEE); 3480 } 3481 3482 if (vif->type != NL80211_IFTYPE_MESH_POINT) { 3483 *hemode |= u32_encode_bits(HE_DL_MUOFDMA_ENABLE, HE_MODE_DL_OFDMA) | 3484 u32_encode_bits(HE_UL_MUOFDMA_ENABLE, HE_MODE_UL_OFDMA); 3485 3486 if (HECAP_PHY_ULMUMIMO_GET(he_cap_elem.phy_cap_info)) 3487 if (HECAP_PHY_ULMUMIMO_GET(he_cap->he_cap_elem.phy_cap_info)) 3488 *hemode |= u32_encode_bits(HE_UL_MUMIMO_ENABLE, 3489 HE_MODE_UL_MUMIMO); 3490 3491 if (u32_get_bits(*hemode, HE_MODE_MU_TX_BFEE)) 3492 *hemode |= u32_encode_bits(HE_SU_BFEE_ENABLE, HE_MODE_SU_TX_BFEE); 3493 3494 if (u32_get_bits(*hemode, HE_MODE_MU_TX_BFER)) 3495 *hemode |= u32_encode_bits(HE_SU_BFER_ENABLE, HE_MODE_SU_TX_BFER); 3496 } 3497 3498 return 0; 3499 } 3500 3501 static int ath12k_mac_set_eht_txbf_conf(struct ath12k_link_vif *arvif) 3502 { 3503 struct ath12k_vif *ahvif = arvif->ahvif; 3504 struct ath12k *ar = arvif->ar; 3505 u32 param = WMI_VDEV_PARAM_SET_EHT_MU_MODE; 3506 u32 value = 0; 3507 int ret; 3508 struct ieee80211_bss_conf *link_conf; 3509 3510 link_conf = ath12k_mac_get_link_bss_conf(arvif); 3511 if (!link_conf) { 3512 ath12k_warn(ar->ab, "unable to access bss link conf in eht txbf conf\n"); 3513 return -ENOENT; 3514 } 3515 3516 if (!link_conf->eht_support) 3517 return 0; 3518 3519 if (link_conf->eht_su_beamformer) { 3520 value |= u32_encode_bits(EHT_SU_BFER_ENABLE, EHT_MODE_SU_TX_BFER); 3521 if (link_conf->eht_mu_beamformer && 3522 ahvif->vdev_type == WMI_VDEV_TYPE_AP) 3523 value |= u32_encode_bits(EHT_MU_BFER_ENABLE, 3524 EHT_MODE_MU_TX_BFER) | 3525 u32_encode_bits(EHT_DL_MUOFDMA_ENABLE, 3526 EHT_MODE_DL_OFDMA_MUMIMO) | 3527 u32_encode_bits(EHT_UL_MUOFDMA_ENABLE, 3528 EHT_MODE_UL_OFDMA_MUMIMO); 3529 } 3530 3531 if (ahvif->vif->type != NL80211_IFTYPE_MESH_POINT) { 3532 value |= u32_encode_bits(EHT_DL_MUOFDMA_ENABLE, EHT_MODE_DL_OFDMA) | 3533 u32_encode_bits(EHT_UL_MUOFDMA_ENABLE, EHT_MODE_UL_OFDMA); 3534 3535 if (link_conf->eht_80mhz_full_bw_ul_mumimo) 3536 value |= u32_encode_bits(EHT_UL_MUMIMO_ENABLE, EHT_MODE_MUMIMO); 3537 3538 if (link_conf->eht_su_beamformee) 3539 value |= u32_encode_bits(EHT_SU_BFEE_ENABLE, 3540 EHT_MODE_SU_TX_BFEE); 3541 } 3542 3543 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, value); 3544 if (ret) { 3545 ath12k_warn(ar->ab, "failed to set vdev %d EHT MU mode: %d\n", 3546 arvif->vdev_id, ret); 3547 return ret; 3548 } 3549 3550 return 0; 3551 } 3552 3553 static u32 ath12k_mac_ieee80211_sta_bw_to_wmi(struct ath12k *ar, 3554 struct ieee80211_link_sta *link_sta) 3555 { 3556 u32 bw; 3557 3558 switch (link_sta->bandwidth) { 3559 case IEEE80211_STA_RX_BW_20: 3560 bw = WMI_PEER_CHWIDTH_20MHZ; 3561 break; 3562 case IEEE80211_STA_RX_BW_40: 3563 bw = WMI_PEER_CHWIDTH_40MHZ; 3564 break; 3565 case IEEE80211_STA_RX_BW_80: 3566 bw = WMI_PEER_CHWIDTH_80MHZ; 3567 break; 3568 case IEEE80211_STA_RX_BW_160: 3569 bw = WMI_PEER_CHWIDTH_160MHZ; 3570 break; 3571 case IEEE80211_STA_RX_BW_320: 3572 bw = WMI_PEER_CHWIDTH_320MHZ; 3573 break; 3574 default: 3575 ath12k_warn(ar->ab, "Invalid bandwidth %d for link station %pM\n", 3576 link_sta->bandwidth, link_sta->addr); 3577 bw = WMI_PEER_CHWIDTH_20MHZ; 3578 break; 3579 } 3580 3581 return bw; 3582 } 3583 3584 static void ath12k_bss_assoc(struct ath12k *ar, 3585 struct ath12k_link_vif *arvif, 3586 struct ieee80211_bss_conf *bss_conf) 3587 { 3588 struct ath12k_vif *ahvif = arvif->ahvif; 3589 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif); 3590 struct ath12k_wmi_vdev_up_params params = {}; 3591 struct ieee80211_link_sta *link_sta; 3592 u8 link_id = bss_conf->link_id; 3593 struct ath12k_link_sta *arsta; 3594 struct ieee80211_sta *ap_sta; 3595 struct ath12k_sta *ahsta; 3596 struct ath12k_peer *peer; 3597 bool is_auth = false; 3598 u32 hemode = 0; 3599 int ret; 3600 3601 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 3602 3603 struct ath12k_wmi_peer_assoc_arg *peer_arg __free(kfree) = 3604 kzalloc(sizeof(*peer_arg), GFP_KERNEL); 3605 if (!peer_arg) 3606 return; 3607 3608 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 3609 "mac vdev %i link id %u assoc bssid %pM aid %d\n", 3610 arvif->vdev_id, link_id, arvif->bssid, ahvif->aid); 3611 3612 rcu_read_lock(); 3613 3614 /* During ML connection, cfg.ap_addr has the MLD address. For 3615 * non-ML connection, it has the BSSID. 3616 */ 3617 ap_sta = ieee80211_find_sta(vif, vif->cfg.ap_addr); 3618 if (!ap_sta) { 3619 ath12k_warn(ar->ab, "failed to find station entry for bss %pM vdev %i\n", 3620 vif->cfg.ap_addr, arvif->vdev_id); 3621 rcu_read_unlock(); 3622 return; 3623 } 3624 3625 ahsta = ath12k_sta_to_ahsta(ap_sta); 3626 3627 arsta = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy, 3628 ahsta->link[link_id]); 3629 if (WARN_ON(!arsta)) { 3630 rcu_read_unlock(); 3631 return; 3632 } 3633 3634 link_sta = ath12k_mac_get_link_sta(arsta); 3635 if (WARN_ON(!link_sta)) { 3636 rcu_read_unlock(); 3637 return; 3638 } 3639 3640 ath12k_peer_assoc_prepare(ar, arvif, arsta, peer_arg, false); 3641 3642 /* link_sta->he_cap must be protected by rcu_read_lock */ 3643 ret = ath12k_mac_vif_recalc_sta_he_txbf(ar, arvif, &link_sta->he_cap, &hemode); 3644 if (ret) { 3645 ath12k_warn(ar->ab, "failed to recalc he txbf for vdev %i on bss %pM: %d\n", 3646 arvif->vdev_id, bss_conf->bssid, ret); 3647 rcu_read_unlock(); 3648 return; 3649 } 3650 3651 rcu_read_unlock(); 3652 3653 /* keep this before ath12k_wmi_send_peer_assoc_cmd() */ 3654 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 3655 WMI_VDEV_PARAM_SET_HEMU_MODE, hemode); 3656 if (ret) { 3657 ath12k_warn(ar->ab, "failed to submit vdev param txbf 0x%x: %d\n", 3658 hemode, ret); 3659 return; 3660 } 3661 3662 peer_arg->is_assoc = true; 3663 ret = ath12k_wmi_send_peer_assoc_cmd(ar, peer_arg); 3664 if (ret) { 3665 ath12k_warn(ar->ab, "failed to run peer assoc for %pM vdev %i: %d\n", 3666 bss_conf->bssid, arvif->vdev_id, ret); 3667 return; 3668 } 3669 3670 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) { 3671 ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n", 3672 bss_conf->bssid, arvif->vdev_id); 3673 return; 3674 } 3675 3676 ret = ath12k_setup_peer_smps(ar, arvif, bss_conf->bssid, 3677 &link_sta->ht_cap, &link_sta->he_6ghz_capa); 3678 if (ret) { 3679 ath12k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n", 3680 arvif->vdev_id, ret); 3681 return; 3682 } 3683 3684 WARN_ON(arvif->is_up); 3685 3686 ahvif->aid = vif->cfg.aid; 3687 ether_addr_copy(arvif->bssid, bss_conf->bssid); 3688 3689 params.vdev_id = arvif->vdev_id; 3690 params.aid = ahvif->aid; 3691 params.bssid = arvif->bssid; 3692 params.tx_bssid = ath12k_mac_get_tx_bssid(arvif); 3693 if (params.tx_bssid) { 3694 params.nontx_profile_idx = bss_conf->bssid_index; 3695 params.nontx_profile_cnt = 1 << bss_conf->bssid_indicator; 3696 } 3697 ret = ath12k_wmi_vdev_up(ar, ¶ms); 3698 if (ret) { 3699 ath12k_warn(ar->ab, "failed to set vdev %d up: %d\n", 3700 arvif->vdev_id, ret); 3701 return; 3702 } 3703 3704 arvif->is_up = true; 3705 arvif->rekey_data.enable_offload = false; 3706 3707 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 3708 "mac vdev %d up (associated) bssid %pM aid %d\n", 3709 arvif->vdev_id, bss_conf->bssid, vif->cfg.aid); 3710 3711 spin_lock_bh(&ar->ab->base_lock); 3712 3713 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arvif->bssid); 3714 if (peer && peer->is_authorized) 3715 is_auth = true; 3716 3717 spin_unlock_bh(&ar->ab->base_lock); 3718 3719 /* Authorize BSS Peer */ 3720 if (is_auth) { 3721 ret = ath12k_wmi_set_peer_param(ar, arvif->bssid, 3722 arvif->vdev_id, 3723 WMI_PEER_AUTHORIZE, 3724 1); 3725 if (ret) 3726 ath12k_warn(ar->ab, "Unable to authorize BSS peer: %d\n", ret); 3727 } 3728 3729 ret = ath12k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id, 3730 &bss_conf->he_obss_pd); 3731 if (ret) 3732 ath12k_warn(ar->ab, "failed to set vdev %i OBSS PD parameters: %d\n", 3733 arvif->vdev_id, ret); 3734 3735 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map) && 3736 ahvif->vdev_type == WMI_VDEV_TYPE_STA && 3737 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) 3738 ath12k_mac_11d_scan_stop_all(ar->ab); 3739 } 3740 3741 static void ath12k_bss_disassoc(struct ath12k *ar, 3742 struct ath12k_link_vif *arvif) 3743 { 3744 int ret; 3745 3746 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 3747 3748 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n", 3749 arvif->vdev_id, arvif->bssid); 3750 3751 ret = ath12k_wmi_vdev_down(ar, arvif->vdev_id); 3752 if (ret) 3753 ath12k_warn(ar->ab, "failed to down vdev %i: %d\n", 3754 arvif->vdev_id, ret); 3755 3756 arvif->is_up = false; 3757 3758 memset(&arvif->rekey_data, 0, sizeof(arvif->rekey_data)); 3759 3760 cancel_delayed_work(&arvif->connection_loss_work); 3761 } 3762 3763 static u32 ath12k_mac_get_rate_hw_value(int bitrate) 3764 { 3765 u32 preamble; 3766 u16 hw_value; 3767 int rate; 3768 size_t i; 3769 3770 if (ath12k_mac_bitrate_is_cck(bitrate)) 3771 preamble = WMI_RATE_PREAMBLE_CCK; 3772 else 3773 preamble = WMI_RATE_PREAMBLE_OFDM; 3774 3775 for (i = 0; i < ARRAY_SIZE(ath12k_legacy_rates); i++) { 3776 if (ath12k_legacy_rates[i].bitrate != bitrate) 3777 continue; 3778 3779 hw_value = ath12k_legacy_rates[i].hw_value; 3780 rate = ATH12K_HW_RATE_CODE(hw_value, 0, preamble); 3781 3782 return rate; 3783 } 3784 3785 return -EINVAL; 3786 } 3787 3788 static void ath12k_recalculate_mgmt_rate(struct ath12k *ar, 3789 struct ath12k_link_vif *arvif, 3790 struct cfg80211_chan_def *def) 3791 { 3792 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 3793 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar); 3794 const struct ieee80211_supported_band *sband; 3795 struct ieee80211_bss_conf *bss_conf; 3796 u8 basic_rate_idx; 3797 int hw_rate_code; 3798 u32 vdev_param; 3799 u16 bitrate; 3800 int ret; 3801 3802 lockdep_assert_wiphy(hw->wiphy); 3803 3804 bss_conf = ath12k_mac_get_link_bss_conf(arvif); 3805 if (!bss_conf) { 3806 ath12k_warn(ar->ab, "unable to access bss link conf in mgmt rate calc for vif %pM link %u\n", 3807 vif->addr, arvif->link_id); 3808 return; 3809 } 3810 3811 sband = hw->wiphy->bands[def->chan->band]; 3812 if (bss_conf->basic_rates) 3813 basic_rate_idx = __ffs(bss_conf->basic_rates); 3814 else 3815 basic_rate_idx = 0; 3816 bitrate = sband->bitrates[basic_rate_idx].bitrate; 3817 3818 hw_rate_code = ath12k_mac_get_rate_hw_value(bitrate); 3819 if (hw_rate_code < 0) { 3820 ath12k_warn(ar->ab, "bitrate not supported %d\n", bitrate); 3821 return; 3822 } 3823 3824 vdev_param = WMI_VDEV_PARAM_MGMT_RATE; 3825 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param, 3826 hw_rate_code); 3827 if (ret) 3828 ath12k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret); 3829 3830 vdev_param = WMI_VDEV_PARAM_BEACON_RATE; 3831 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param, 3832 hw_rate_code); 3833 if (ret) 3834 ath12k_warn(ar->ab, "failed to set beacon tx rate %d\n", ret); 3835 } 3836 3837 static void ath12k_mac_init_arvif(struct ath12k_vif *ahvif, 3838 struct ath12k_link_vif *arvif, int link_id) 3839 { 3840 struct ath12k_hw *ah = ahvif->ah; 3841 u8 _link_id; 3842 int i; 3843 3844 lockdep_assert_wiphy(ah->hw->wiphy); 3845 3846 if (WARN_ON(!arvif)) 3847 return; 3848 3849 if (WARN_ON(link_id >= ATH12K_NUM_MAX_LINKS)) 3850 return; 3851 3852 if (link_id < 0) 3853 _link_id = 0; 3854 else 3855 _link_id = link_id; 3856 3857 arvif->ahvif = ahvif; 3858 arvif->link_id = _link_id; 3859 3860 /* Protects the datapath stats update on a per link basis */ 3861 spin_lock_init(&arvif->link_stats_lock); 3862 3863 INIT_LIST_HEAD(&arvif->list); 3864 INIT_DELAYED_WORK(&arvif->connection_loss_work, 3865 ath12k_mac_vif_sta_connection_loss_work); 3866 3867 arvif->num_stations = 0; 3868 3869 for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) { 3870 arvif->bitrate_mask.control[i].legacy = 0xffffffff; 3871 arvif->bitrate_mask.control[i].gi = NL80211_TXRATE_DEFAULT_GI; 3872 memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff, 3873 sizeof(arvif->bitrate_mask.control[i].ht_mcs)); 3874 memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff, 3875 sizeof(arvif->bitrate_mask.control[i].vht_mcs)); 3876 memset(arvif->bitrate_mask.control[i].he_mcs, 0xff, 3877 sizeof(arvif->bitrate_mask.control[i].he_mcs)); 3878 } 3879 3880 /* Handle MLO related assignments */ 3881 if (link_id >= 0) { 3882 rcu_assign_pointer(ahvif->link[arvif->link_id], arvif); 3883 ahvif->links_map |= BIT(_link_id); 3884 } 3885 3886 ath12k_generic_dbg(ATH12K_DBG_MAC, 3887 "mac init link arvif (link_id %d%s) for vif %pM. links_map 0x%x", 3888 _link_id, (link_id < 0) ? " deflink" : "", ahvif->vif->addr, 3889 ahvif->links_map); 3890 } 3891 3892 static void ath12k_mac_remove_link_interface(struct ieee80211_hw *hw, 3893 struct ath12k_link_vif *arvif) 3894 { 3895 struct ath12k_vif *ahvif = arvif->ahvif; 3896 struct ath12k_hw *ah = hw->priv; 3897 struct ath12k *ar = arvif->ar; 3898 int ret; 3899 3900 lockdep_assert_wiphy(ah->hw->wiphy); 3901 3902 cancel_delayed_work_sync(&arvif->connection_loss_work); 3903 3904 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac remove link interface (vdev %d link id %d)", 3905 arvif->vdev_id, arvif->link_id); 3906 3907 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map) && 3908 ahvif->vdev_type == WMI_VDEV_TYPE_STA && 3909 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) 3910 ath12k_mac_11d_scan_stop(ar); 3911 3912 if (ahvif->vdev_type == WMI_VDEV_TYPE_AP) { 3913 ret = ath12k_peer_delete(ar, arvif->vdev_id, arvif->bssid); 3914 if (ret) 3915 ath12k_warn(ar->ab, "failed to submit AP self-peer removal on vdev %d link id %d: %d", 3916 arvif->vdev_id, arvif->link_id, ret); 3917 } 3918 ath12k_mac_vdev_delete(ar, arvif); 3919 } 3920 3921 static struct ath12k_link_vif *ath12k_mac_assign_link_vif(struct ath12k_hw *ah, 3922 struct ieee80211_vif *vif, 3923 u8 link_id) 3924 { 3925 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 3926 struct ath12k_link_vif *arvif; 3927 3928 lockdep_assert_wiphy(ah->hw->wiphy); 3929 3930 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]); 3931 if (arvif) 3932 return arvif; 3933 3934 /* If this is the first link arvif being created for an ML VIF 3935 * use the preallocated deflink memory except for scan arvifs 3936 */ 3937 if (!ahvif->links_map && link_id < ATH12K_FIRST_SCAN_LINK) { 3938 arvif = &ahvif->deflink; 3939 3940 if (vif->type == NL80211_IFTYPE_STATION) 3941 arvif->is_sta_assoc_link = true; 3942 } else { 3943 arvif = kzalloc(sizeof(*arvif), GFP_KERNEL); 3944 if (!arvif) 3945 return NULL; 3946 } 3947 3948 ath12k_mac_init_arvif(ahvif, arvif, link_id); 3949 3950 return arvif; 3951 } 3952 3953 static void ath12k_mac_unassign_link_vif(struct ath12k_link_vif *arvif) 3954 { 3955 struct ath12k_vif *ahvif = arvif->ahvif; 3956 struct ath12k_hw *ah = ahvif->ah; 3957 3958 lockdep_assert_wiphy(ah->hw->wiphy); 3959 3960 rcu_assign_pointer(ahvif->link[arvif->link_id], NULL); 3961 synchronize_rcu(); 3962 ahvif->links_map &= ~BIT(arvif->link_id); 3963 3964 if (arvif != &ahvif->deflink) 3965 kfree(arvif); 3966 else 3967 memset(arvif, 0, sizeof(*arvif)); 3968 } 3969 3970 static int 3971 ath12k_mac_op_change_vif_links(struct ieee80211_hw *hw, 3972 struct ieee80211_vif *vif, 3973 u16 old_links, u16 new_links, 3974 struct ieee80211_bss_conf *ol[IEEE80211_MLD_MAX_NUM_LINKS]) 3975 { 3976 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 3977 unsigned long to_remove = old_links & ~new_links; 3978 unsigned long to_add = ~old_links & new_links; 3979 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 3980 struct ath12k_link_vif *arvif; 3981 u8 link_id; 3982 3983 lockdep_assert_wiphy(hw->wiphy); 3984 3985 ath12k_generic_dbg(ATH12K_DBG_MAC, 3986 "mac vif link changed for MLD %pM old_links 0x%x new_links 0x%x\n", 3987 vif->addr, old_links, new_links); 3988 3989 for_each_set_bit(link_id, &to_add, IEEE80211_MLD_MAX_NUM_LINKS) { 3990 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 3991 /* mac80211 wants to add link but driver already has the 3992 * link. This should not happen ideally. 3993 */ 3994 if (WARN_ON(arvif)) 3995 return -EINVAL; 3996 3997 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id); 3998 if (WARN_ON(!arvif)) 3999 return -EINVAL; 4000 } 4001 4002 for_each_set_bit(link_id, &to_remove, IEEE80211_MLD_MAX_NUM_LINKS) { 4003 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 4004 if (WARN_ON(!arvif)) 4005 return -EINVAL; 4006 4007 if (!arvif->is_created) 4008 continue; 4009 4010 if (WARN_ON(!arvif->ar)) 4011 return -EINVAL; 4012 4013 ath12k_mac_remove_link_interface(hw, arvif); 4014 ath12k_mac_unassign_link_vif(arvif); 4015 } 4016 4017 return 0; 4018 } 4019 4020 static int ath12k_mac_fils_discovery(struct ath12k_link_vif *arvif, 4021 struct ieee80211_bss_conf *info) 4022 { 4023 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 4024 struct ath12k *ar = arvif->ar; 4025 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar); 4026 struct sk_buff *tmpl; 4027 int ret; 4028 u32 interval; 4029 bool unsol_bcast_probe_resp_enabled = false; 4030 4031 if (info->fils_discovery.max_interval) { 4032 interval = info->fils_discovery.max_interval; 4033 4034 tmpl = ieee80211_get_fils_discovery_tmpl(hw, vif); 4035 if (tmpl) 4036 ret = ath12k_wmi_fils_discovery_tmpl(ar, arvif->vdev_id, 4037 tmpl); 4038 } else if (info->unsol_bcast_probe_resp_interval) { 4039 unsol_bcast_probe_resp_enabled = 1; 4040 interval = info->unsol_bcast_probe_resp_interval; 4041 4042 tmpl = ieee80211_get_unsol_bcast_probe_resp_tmpl(hw, vif); 4043 if (tmpl) 4044 ret = ath12k_wmi_probe_resp_tmpl(ar, arvif->vdev_id, 4045 tmpl); 4046 } else { /* Disable */ 4047 return ath12k_wmi_fils_discovery(ar, arvif->vdev_id, 0, false); 4048 } 4049 4050 if (!tmpl) { 4051 ath12k_warn(ar->ab, 4052 "mac vdev %i failed to retrieve %s template\n", 4053 arvif->vdev_id, (unsol_bcast_probe_resp_enabled ? 4054 "unsolicited broadcast probe response" : 4055 "FILS discovery")); 4056 return -EPERM; 4057 } 4058 kfree_skb(tmpl); 4059 4060 if (!ret) 4061 ret = ath12k_wmi_fils_discovery(ar, arvif->vdev_id, interval, 4062 unsol_bcast_probe_resp_enabled); 4063 4064 return ret; 4065 } 4066 4067 static void ath12k_mac_vif_setup_ps(struct ath12k_link_vif *arvif) 4068 { 4069 struct ath12k *ar = arvif->ar; 4070 struct ieee80211_vif *vif = arvif->ahvif->vif; 4071 struct ieee80211_conf *conf = &ath12k_ar_to_hw(ar)->conf; 4072 enum wmi_sta_powersave_param param; 4073 struct ieee80211_bss_conf *info; 4074 enum wmi_sta_ps_mode psmode; 4075 int ret; 4076 int timeout; 4077 bool enable_ps; 4078 4079 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 4080 4081 if (vif->type != NL80211_IFTYPE_STATION) 4082 return; 4083 4084 enable_ps = arvif->ahvif->ps; 4085 if (enable_ps) { 4086 psmode = WMI_STA_PS_MODE_ENABLED; 4087 param = WMI_STA_PS_PARAM_INACTIVITY_TIME; 4088 4089 timeout = conf->dynamic_ps_timeout; 4090 if (timeout == 0) { 4091 info = ath12k_mac_get_link_bss_conf(arvif); 4092 if (!info) { 4093 ath12k_warn(ar->ab, "unable to access bss link conf in setup ps for vif %pM link %u\n", 4094 vif->addr, arvif->link_id); 4095 return; 4096 } 4097 4098 /* firmware doesn't like 0 */ 4099 timeout = ieee80211_tu_to_usec(info->beacon_int) / 1000; 4100 } 4101 4102 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param, 4103 timeout); 4104 if (ret) { 4105 ath12k_warn(ar->ab, "failed to set inactivity time for vdev %d: %i\n", 4106 arvif->vdev_id, ret); 4107 return; 4108 } 4109 } else { 4110 psmode = WMI_STA_PS_MODE_DISABLED; 4111 } 4112 4113 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d psmode %s\n", 4114 arvif->vdev_id, psmode ? "enable" : "disable"); 4115 4116 ret = ath12k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, psmode); 4117 if (ret) 4118 ath12k_warn(ar->ab, "failed to set sta power save mode %d for vdev %d: %d\n", 4119 psmode, arvif->vdev_id, ret); 4120 } 4121 4122 static void ath12k_mac_op_vif_cfg_changed(struct ieee80211_hw *hw, 4123 struct ieee80211_vif *vif, 4124 u64 changed) 4125 { 4126 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 4127 unsigned long links = ahvif->links_map; 4128 struct ieee80211_vif_cfg *vif_cfg; 4129 struct ieee80211_bss_conf *info; 4130 struct ath12k_link_vif *arvif; 4131 struct ieee80211_sta *sta; 4132 struct ath12k_sta *ahsta; 4133 struct ath12k *ar; 4134 u8 link_id; 4135 4136 lockdep_assert_wiphy(hw->wiphy); 4137 4138 if (changed & BSS_CHANGED_SSID && vif->type == NL80211_IFTYPE_AP) { 4139 ahvif->u.ap.ssid_len = vif->cfg.ssid_len; 4140 if (vif->cfg.ssid_len) 4141 memcpy(ahvif->u.ap.ssid, vif->cfg.ssid, vif->cfg.ssid_len); 4142 } 4143 4144 if (changed & BSS_CHANGED_ASSOC) { 4145 if (vif->cfg.assoc) { 4146 /* only in station mode we can get here, so it's safe 4147 * to use ap_addr 4148 */ 4149 rcu_read_lock(); 4150 sta = ieee80211_find_sta(vif, vif->cfg.ap_addr); 4151 if (!sta) { 4152 rcu_read_unlock(); 4153 WARN_ONCE(1, "failed to find sta with addr %pM\n", 4154 vif->cfg.ap_addr); 4155 return; 4156 } 4157 4158 ahsta = ath12k_sta_to_ahsta(sta); 4159 arvif = wiphy_dereference(hw->wiphy, 4160 ahvif->link[ahsta->assoc_link_id]); 4161 rcu_read_unlock(); 4162 4163 ar = arvif->ar; 4164 /* there is no reason for which an assoc link's 4165 * bss info does not exist 4166 */ 4167 info = ath12k_mac_get_link_bss_conf(arvif); 4168 ath12k_bss_assoc(ar, arvif, info); 4169 4170 /* exclude assoc link as it is done above */ 4171 links &= ~BIT(ahsta->assoc_link_id); 4172 } 4173 4174 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) { 4175 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 4176 if (!arvif || !arvif->ar) 4177 continue; 4178 4179 ar = arvif->ar; 4180 4181 if (vif->cfg.assoc) { 4182 info = ath12k_mac_get_link_bss_conf(arvif); 4183 if (!info) 4184 continue; 4185 4186 ath12k_bss_assoc(ar, arvif, info); 4187 } else { 4188 ath12k_bss_disassoc(ar, arvif); 4189 } 4190 } 4191 } 4192 4193 if (changed & BSS_CHANGED_PS) { 4194 links = ahvif->links_map; 4195 vif_cfg = &vif->cfg; 4196 4197 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) { 4198 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 4199 if (!arvif || !arvif->ar) 4200 continue; 4201 4202 ar = arvif->ar; 4203 4204 if (ar->ab->hw_params->supports_sta_ps) { 4205 ahvif->ps = vif_cfg->ps; 4206 ath12k_mac_vif_setup_ps(arvif); 4207 } 4208 } 4209 } 4210 } 4211 4212 static bool ath12k_mac_supports_tpc(struct ath12k *ar, struct ath12k_vif *ahvif, 4213 const struct cfg80211_chan_def *chandef) 4214 { 4215 return ath12k_wmi_supports_6ghz_cc_ext(ar) && 4216 test_bit(WMI_TLV_SERVICE_EXT_TPC_REG_SUPPORT, ar->ab->wmi_ab.svc_map) && 4217 (ahvif->vdev_type == WMI_VDEV_TYPE_STA || 4218 ahvif->vdev_type == WMI_VDEV_TYPE_AP) && 4219 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE && 4220 chandef->chan && 4221 chandef->chan->band == NL80211_BAND_6GHZ; 4222 } 4223 4224 static void ath12k_mac_bss_info_changed(struct ath12k *ar, 4225 struct ath12k_link_vif *arvif, 4226 struct ieee80211_bss_conf *info, 4227 u64 changed) 4228 { 4229 struct ath12k_vif *ahvif = arvif->ahvif; 4230 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif); 4231 struct cfg80211_chan_def def; 4232 u32 param_id, param_value; 4233 enum nl80211_band band; 4234 u32 vdev_param; 4235 int mcast_rate; 4236 u32 preamble; 4237 u16 hw_value; 4238 u16 bitrate; 4239 int ret; 4240 u8 rateidx; 4241 u32 rate; 4242 4243 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 4244 4245 if (changed & BSS_CHANGED_BEACON_INT) { 4246 arvif->beacon_interval = info->beacon_int; 4247 4248 param_id = WMI_VDEV_PARAM_BEACON_INTERVAL; 4249 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 4250 param_id, 4251 arvif->beacon_interval); 4252 if (ret) 4253 ath12k_warn(ar->ab, "Failed to set beacon interval for VDEV: %d\n", 4254 arvif->vdev_id); 4255 else 4256 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 4257 "Beacon interval: %d set for VDEV: %d\n", 4258 arvif->beacon_interval, arvif->vdev_id); 4259 } 4260 4261 if (changed & BSS_CHANGED_BEACON) { 4262 param_id = WMI_PDEV_PARAM_BEACON_TX_MODE; 4263 param_value = WMI_BEACON_BURST_MODE; 4264 ret = ath12k_wmi_pdev_set_param(ar, param_id, 4265 param_value, ar->pdev->pdev_id); 4266 if (ret) 4267 ath12k_warn(ar->ab, "Failed to set beacon mode for VDEV: %d\n", 4268 arvif->vdev_id); 4269 else 4270 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 4271 "Set burst beacon mode for VDEV: %d\n", 4272 arvif->vdev_id); 4273 4274 ret = ath12k_mac_setup_bcn_tmpl(arvif); 4275 if (ret) 4276 ath12k_warn(ar->ab, "failed to update bcn template: %d\n", 4277 ret); 4278 } 4279 4280 if (changed & (BSS_CHANGED_BEACON_INFO | BSS_CHANGED_BEACON)) { 4281 arvif->dtim_period = info->dtim_period; 4282 4283 param_id = WMI_VDEV_PARAM_DTIM_PERIOD; 4284 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 4285 param_id, 4286 arvif->dtim_period); 4287 4288 if (ret) 4289 ath12k_warn(ar->ab, "Failed to set dtim period for VDEV %d: %i\n", 4290 arvif->vdev_id, ret); 4291 else 4292 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 4293 "DTIM period: %d set for VDEV: %d\n", 4294 arvif->dtim_period, arvif->vdev_id); 4295 } 4296 4297 if (changed & BSS_CHANGED_SSID && 4298 vif->type == NL80211_IFTYPE_AP) { 4299 ahvif->u.ap.ssid_len = vif->cfg.ssid_len; 4300 if (vif->cfg.ssid_len) 4301 memcpy(ahvif->u.ap.ssid, vif->cfg.ssid, vif->cfg.ssid_len); 4302 ahvif->u.ap.hidden_ssid = info->hidden_ssid; 4303 } 4304 4305 if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid)) 4306 ether_addr_copy(arvif->bssid, info->bssid); 4307 4308 if (changed & BSS_CHANGED_BEACON_ENABLED) { 4309 if (info->enable_beacon) { 4310 ret = ath12k_mac_set_he_txbf_conf(arvif); 4311 if (ret) 4312 ath12k_warn(ar->ab, 4313 "failed to set HE TXBF config for vdev: %d\n", 4314 arvif->vdev_id); 4315 4316 ret = ath12k_mac_set_eht_txbf_conf(arvif); 4317 if (ret) 4318 ath12k_warn(ar->ab, 4319 "failed to set EHT TXBF config for vdev: %d\n", 4320 arvif->vdev_id); 4321 } 4322 ath12k_control_beaconing(arvif, info); 4323 4324 if (arvif->is_up && info->he_support && 4325 info->he_oper.params) { 4326 /* TODO: Extend to support 1024 BA Bitmap size */ 4327 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 4328 WMI_VDEV_PARAM_BA_MODE, 4329 WMI_BA_MODE_BUFFER_SIZE_256); 4330 if (ret) 4331 ath12k_warn(ar->ab, 4332 "failed to set BA BUFFER SIZE 256 for vdev: %d\n", 4333 arvif->vdev_id); 4334 4335 param_id = WMI_VDEV_PARAM_HEOPS_0_31; 4336 param_value = info->he_oper.params; 4337 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 4338 param_id, param_value); 4339 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 4340 "he oper param: %x set for VDEV: %d\n", 4341 param_value, arvif->vdev_id); 4342 4343 if (ret) 4344 ath12k_warn(ar->ab, "Failed to set he oper params %x for VDEV %d: %i\n", 4345 param_value, arvif->vdev_id, ret); 4346 } 4347 } 4348 4349 if (changed & BSS_CHANGED_ERP_CTS_PROT) { 4350 u32 cts_prot; 4351 4352 cts_prot = !!(info->use_cts_prot); 4353 param_id = WMI_VDEV_PARAM_PROTECTION_MODE; 4354 4355 if (arvif->is_started) { 4356 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 4357 param_id, cts_prot); 4358 if (ret) 4359 ath12k_warn(ar->ab, "Failed to set CTS prot for VDEV: %d\n", 4360 arvif->vdev_id); 4361 else 4362 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "Set CTS prot: %d for VDEV: %d\n", 4363 cts_prot, arvif->vdev_id); 4364 } else { 4365 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "defer protection mode setup, vdev is not ready yet\n"); 4366 } 4367 } 4368 4369 if (changed & BSS_CHANGED_ERP_SLOT) { 4370 u32 slottime; 4371 4372 if (info->use_short_slot) 4373 slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */ 4374 4375 else 4376 slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */ 4377 4378 param_id = WMI_VDEV_PARAM_SLOT_TIME; 4379 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 4380 param_id, slottime); 4381 if (ret) 4382 ath12k_warn(ar->ab, "Failed to set erp slot for VDEV: %d\n", 4383 arvif->vdev_id); 4384 else 4385 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 4386 "Set slottime: %d for VDEV: %d\n", 4387 slottime, arvif->vdev_id); 4388 } 4389 4390 if (changed & BSS_CHANGED_ERP_PREAMBLE) { 4391 u32 preamble; 4392 4393 if (info->use_short_preamble) 4394 preamble = WMI_VDEV_PREAMBLE_SHORT; 4395 else 4396 preamble = WMI_VDEV_PREAMBLE_LONG; 4397 4398 param_id = WMI_VDEV_PARAM_PREAMBLE; 4399 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 4400 param_id, preamble); 4401 if (ret) 4402 ath12k_warn(ar->ab, "Failed to set preamble for VDEV: %d\n", 4403 arvif->vdev_id); 4404 else 4405 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 4406 "Set preamble: %d for VDEV: %d\n", 4407 preamble, arvif->vdev_id); 4408 } 4409 4410 if (changed & BSS_CHANGED_ASSOC) { 4411 if (vif->cfg.assoc) 4412 ath12k_bss_assoc(ar, arvif, info); 4413 else 4414 ath12k_bss_disassoc(ar, arvif); 4415 } 4416 4417 if (changed & BSS_CHANGED_TXPOWER) { 4418 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev_id %i txpower %d\n", 4419 arvif->vdev_id, info->txpower); 4420 4421 arvif->txpower = info->txpower; 4422 ath12k_mac_txpower_recalc(ar); 4423 } 4424 4425 if (changed & BSS_CHANGED_MCAST_RATE && 4426 !ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)) { 4427 band = def.chan->band; 4428 mcast_rate = info->mcast_rate[band]; 4429 4430 if (mcast_rate > 0) { 4431 rateidx = mcast_rate - 1; 4432 } else { 4433 if (info->basic_rates) 4434 rateidx = __ffs(info->basic_rates); 4435 else 4436 rateidx = 0; 4437 } 4438 4439 if (ar->pdev->cap.supported_bands & WMI_HOST_WLAN_5GHZ_CAP) 4440 rateidx += ATH12K_MAC_FIRST_OFDM_RATE_IDX; 4441 4442 bitrate = ath12k_legacy_rates[rateidx].bitrate; 4443 hw_value = ath12k_legacy_rates[rateidx].hw_value; 4444 4445 if (ath12k_mac_bitrate_is_cck(bitrate)) 4446 preamble = WMI_RATE_PREAMBLE_CCK; 4447 else 4448 preamble = WMI_RATE_PREAMBLE_OFDM; 4449 4450 rate = ATH12K_HW_RATE_CODE(hw_value, 0, preamble); 4451 4452 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 4453 "mac vdev %d mcast_rate %x\n", 4454 arvif->vdev_id, rate); 4455 4456 vdev_param = WMI_VDEV_PARAM_MCAST_DATA_RATE; 4457 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 4458 vdev_param, rate); 4459 if (ret) 4460 ath12k_warn(ar->ab, 4461 "failed to set mcast rate on vdev %i: %d\n", 4462 arvif->vdev_id, ret); 4463 4464 vdev_param = WMI_VDEV_PARAM_BCAST_DATA_RATE; 4465 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 4466 vdev_param, rate); 4467 if (ret) 4468 ath12k_warn(ar->ab, 4469 "failed to set bcast rate on vdev %i: %d\n", 4470 arvif->vdev_id, ret); 4471 } 4472 4473 if (changed & BSS_CHANGED_BASIC_RATES && 4474 !ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)) 4475 ath12k_recalculate_mgmt_rate(ar, arvif, &def); 4476 4477 if (changed & BSS_CHANGED_TWT) { 4478 if (info->twt_requester || info->twt_responder) 4479 ath12k_wmi_send_twt_enable_cmd(ar, ar->pdev->pdev_id); 4480 else 4481 ath12k_wmi_send_twt_disable_cmd(ar, ar->pdev->pdev_id); 4482 } 4483 4484 if (changed & BSS_CHANGED_HE_OBSS_PD) 4485 ath12k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id, 4486 &info->he_obss_pd); 4487 4488 if (changed & BSS_CHANGED_HE_BSS_COLOR) { 4489 if (vif->type == NL80211_IFTYPE_AP) { 4490 ret = ath12k_wmi_obss_color_cfg_cmd(ar, 4491 arvif->vdev_id, 4492 info->he_bss_color.color, 4493 ATH12K_BSS_COLOR_AP_PERIODS, 4494 info->he_bss_color.enabled); 4495 if (ret) 4496 ath12k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n", 4497 arvif->vdev_id, ret); 4498 } else if (vif->type == NL80211_IFTYPE_STATION) { 4499 ret = ath12k_wmi_send_bss_color_change_enable_cmd(ar, 4500 arvif->vdev_id, 4501 1); 4502 if (ret) 4503 ath12k_warn(ar->ab, "failed to enable bss color change on vdev %i: %d\n", 4504 arvif->vdev_id, ret); 4505 ret = ath12k_wmi_obss_color_cfg_cmd(ar, 4506 arvif->vdev_id, 4507 0, 4508 ATH12K_BSS_COLOR_STA_PERIODS, 4509 1); 4510 if (ret) 4511 ath12k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n", 4512 arvif->vdev_id, ret); 4513 } 4514 } 4515 4516 ath12k_mac_fils_discovery(arvif, info); 4517 } 4518 4519 static struct ath12k_vif_cache *ath12k_ahvif_get_link_cache(struct ath12k_vif *ahvif, 4520 u8 link_id) 4521 { 4522 if (!ahvif->cache[link_id]) { 4523 ahvif->cache[link_id] = kzalloc(sizeof(*ahvif->cache[0]), GFP_KERNEL); 4524 if (ahvif->cache[link_id]) 4525 INIT_LIST_HEAD(&ahvif->cache[link_id]->key_conf.list); 4526 } 4527 4528 return ahvif->cache[link_id]; 4529 } 4530 4531 static void ath12k_ahvif_put_link_key_cache(struct ath12k_vif_cache *cache) 4532 { 4533 struct ath12k_key_conf *key_conf, *tmp; 4534 4535 if (!cache || list_empty(&cache->key_conf.list)) 4536 return; 4537 list_for_each_entry_safe(key_conf, tmp, &cache->key_conf.list, list) { 4538 list_del(&key_conf->list); 4539 kfree(key_conf); 4540 } 4541 } 4542 4543 static void ath12k_ahvif_put_link_cache(struct ath12k_vif *ahvif, u8 link_id) 4544 { 4545 if (link_id >= IEEE80211_MLD_MAX_NUM_LINKS) 4546 return; 4547 4548 ath12k_ahvif_put_link_key_cache(ahvif->cache[link_id]); 4549 kfree(ahvif->cache[link_id]); 4550 ahvif->cache[link_id] = NULL; 4551 } 4552 4553 static void ath12k_mac_op_link_info_changed(struct ieee80211_hw *hw, 4554 struct ieee80211_vif *vif, 4555 struct ieee80211_bss_conf *info, 4556 u64 changed) 4557 { 4558 struct ath12k *ar; 4559 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 4560 struct ath12k_vif_cache *cache; 4561 struct ath12k_link_vif *arvif; 4562 u8 link_id = info->link_id; 4563 4564 lockdep_assert_wiphy(hw->wiphy); 4565 4566 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 4567 4568 /* if the vdev is not created on a certain radio, 4569 * cache the info to be updated later on vdev creation 4570 */ 4571 4572 if (!arvif || !arvif->is_created) { 4573 cache = ath12k_ahvif_get_link_cache(ahvif, link_id); 4574 if (!cache) 4575 return; 4576 4577 cache->bss_conf_changed |= changed; 4578 4579 return; 4580 } 4581 4582 ar = arvif->ar; 4583 4584 ath12k_mac_bss_info_changed(ar, arvif, info, changed); 4585 } 4586 4587 static struct ath12k* 4588 ath12k_mac_select_scan_device(struct ieee80211_hw *hw, 4589 struct ieee80211_vif *vif, 4590 u32 center_freq) 4591 { 4592 struct ath12k_hw *ah = hw->priv; 4593 enum nl80211_band band; 4594 struct ath12k *ar; 4595 int i; 4596 4597 if (ah->num_radio == 1) 4598 return ah->radio; 4599 4600 /* Currently mac80211 supports splitting scan requests into 4601 * multiple scan requests per band. 4602 * Loop through first channel and determine the scan radio 4603 * TODO: There could be 5 GHz low/high channels in that case 4604 * split the hw request and perform multiple scans 4605 */ 4606 4607 if (center_freq < ATH12K_MIN_5GHZ_FREQ) 4608 band = NL80211_BAND_2GHZ; 4609 else if (center_freq < ATH12K_MIN_6GHZ_FREQ) 4610 band = NL80211_BAND_5GHZ; 4611 else 4612 band = NL80211_BAND_6GHZ; 4613 4614 for_each_ar(ah, ar, i) { 4615 if (ar->mac.sbands[band].channels && 4616 center_freq >= KHZ_TO_MHZ(ar->freq_range.start_freq) && 4617 center_freq <= KHZ_TO_MHZ(ar->freq_range.end_freq)) 4618 return ar; 4619 } 4620 4621 return NULL; 4622 } 4623 4624 void __ath12k_mac_scan_finish(struct ath12k *ar) 4625 { 4626 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar); 4627 4628 lockdep_assert_held(&ar->data_lock); 4629 4630 switch (ar->scan.state) { 4631 case ATH12K_SCAN_IDLE: 4632 break; 4633 case ATH12K_SCAN_RUNNING: 4634 case ATH12K_SCAN_ABORTING: 4635 if (ar->scan.is_roc && ar->scan.roc_notify) 4636 ieee80211_remain_on_channel_expired(hw); 4637 fallthrough; 4638 case ATH12K_SCAN_STARTING: 4639 cancel_delayed_work(&ar->scan.timeout); 4640 complete_all(&ar->scan.completed); 4641 wiphy_work_queue(ar->ah->hw->wiphy, &ar->scan.vdev_clean_wk); 4642 break; 4643 } 4644 } 4645 4646 void ath12k_mac_scan_finish(struct ath12k *ar) 4647 { 4648 spin_lock_bh(&ar->data_lock); 4649 __ath12k_mac_scan_finish(ar); 4650 spin_unlock_bh(&ar->data_lock); 4651 } 4652 4653 static int ath12k_scan_stop(struct ath12k *ar) 4654 { 4655 struct ath12k_wmi_scan_cancel_arg arg = { 4656 .req_type = WLAN_SCAN_CANCEL_SINGLE, 4657 .scan_id = ATH12K_SCAN_ID, 4658 }; 4659 int ret; 4660 4661 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 4662 4663 /* TODO: Fill other STOP Params */ 4664 arg.pdev_id = ar->pdev->pdev_id; 4665 4666 ret = ath12k_wmi_send_scan_stop_cmd(ar, &arg); 4667 if (ret) { 4668 ath12k_warn(ar->ab, "failed to stop wmi scan: %d\n", ret); 4669 goto out; 4670 } 4671 4672 ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ); 4673 if (ret == 0) { 4674 ath12k_warn(ar->ab, 4675 "failed to receive scan abort comple: timed out\n"); 4676 ret = -ETIMEDOUT; 4677 } else if (ret > 0) { 4678 ret = 0; 4679 } 4680 4681 out: 4682 /* Scan state should be updated in scan completion worker but in 4683 * case firmware fails to deliver the event (for whatever reason) 4684 * it is desired to clean up scan state anyway. Firmware may have 4685 * just dropped the scan completion event delivery due to transport 4686 * pipe being overflown with data and/or it can recover on its own 4687 * before next scan request is submitted. 4688 */ 4689 spin_lock_bh(&ar->data_lock); 4690 if (ret) 4691 __ath12k_mac_scan_finish(ar); 4692 spin_unlock_bh(&ar->data_lock); 4693 4694 return ret; 4695 } 4696 4697 static void ath12k_scan_abort(struct ath12k *ar) 4698 { 4699 int ret; 4700 4701 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 4702 4703 spin_lock_bh(&ar->data_lock); 4704 4705 switch (ar->scan.state) { 4706 case ATH12K_SCAN_IDLE: 4707 /* This can happen if timeout worker kicked in and called 4708 * abortion while scan completion was being processed. 4709 */ 4710 break; 4711 case ATH12K_SCAN_STARTING: 4712 case ATH12K_SCAN_ABORTING: 4713 ath12k_warn(ar->ab, "refusing scan abortion due to invalid scan state: %d\n", 4714 ar->scan.state); 4715 break; 4716 case ATH12K_SCAN_RUNNING: 4717 ar->scan.state = ATH12K_SCAN_ABORTING; 4718 spin_unlock_bh(&ar->data_lock); 4719 4720 ret = ath12k_scan_stop(ar); 4721 if (ret) 4722 ath12k_warn(ar->ab, "failed to abort scan: %d\n", ret); 4723 4724 spin_lock_bh(&ar->data_lock); 4725 break; 4726 } 4727 4728 spin_unlock_bh(&ar->data_lock); 4729 } 4730 4731 static void ath12k_scan_timeout_work(struct work_struct *work) 4732 { 4733 struct ath12k *ar = container_of(work, struct ath12k, 4734 scan.timeout.work); 4735 4736 wiphy_lock(ath12k_ar_to_hw(ar)->wiphy); 4737 ath12k_scan_abort(ar); 4738 wiphy_unlock(ath12k_ar_to_hw(ar)->wiphy); 4739 } 4740 4741 static void ath12k_mac_scan_send_complete(struct ath12k *ar, 4742 struct cfg80211_scan_info *info) 4743 { 4744 struct ath12k_hw *ah = ar->ah; 4745 struct ath12k *partner_ar; 4746 int i; 4747 4748 lockdep_assert_wiphy(ah->hw->wiphy); 4749 4750 for_each_ar(ah, partner_ar, i) 4751 if (partner_ar != ar && 4752 partner_ar->scan.state == ATH12K_SCAN_RUNNING) 4753 return; 4754 4755 ieee80211_scan_completed(ah->hw, info); 4756 } 4757 4758 static void ath12k_scan_vdev_clean_work(struct wiphy *wiphy, struct wiphy_work *work) 4759 { 4760 struct ath12k *ar = container_of(work, struct ath12k, 4761 scan.vdev_clean_wk); 4762 struct ath12k_hw *ah = ar->ah; 4763 struct ath12k_link_vif *arvif; 4764 4765 lockdep_assert_wiphy(wiphy); 4766 4767 arvif = ar->scan.arvif; 4768 4769 /* The scan vdev has already been deleted. This can occur when a 4770 * new scan request is made on the same vif with a different 4771 * frequency, causing the scan arvif to move from one radio to 4772 * another. Or, scan was abrupted and via remove interface, the 4773 * arvif is already deleted. Alternatively, if the scan vdev is not 4774 * being used as an actual vdev, then do not delete it. 4775 */ 4776 if (!arvif || arvif->is_started) 4777 goto work_complete; 4778 4779 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac clean scan vdev (link id %u)", 4780 arvif->link_id); 4781 4782 ath12k_mac_remove_link_interface(ah->hw, arvif); 4783 ath12k_mac_unassign_link_vif(arvif); 4784 4785 work_complete: 4786 spin_lock_bh(&ar->data_lock); 4787 ar->scan.arvif = NULL; 4788 if (!ar->scan.is_roc) { 4789 struct cfg80211_scan_info info = { 4790 .aborted = ((ar->scan.state == 4791 ATH12K_SCAN_ABORTING) || 4792 (ar->scan.state == 4793 ATH12K_SCAN_STARTING)), 4794 }; 4795 4796 ath12k_mac_scan_send_complete(ar, &info); 4797 } 4798 4799 ar->scan.state = ATH12K_SCAN_IDLE; 4800 ar->scan_channel = NULL; 4801 ar->scan.roc_freq = 0; 4802 spin_unlock_bh(&ar->data_lock); 4803 } 4804 4805 static int ath12k_start_scan(struct ath12k *ar, 4806 struct ath12k_wmi_scan_req_arg *arg) 4807 { 4808 int ret; 4809 4810 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 4811 4812 ret = ath12k_wmi_send_scan_start_cmd(ar, arg); 4813 if (ret) 4814 return ret; 4815 4816 ret = wait_for_completion_timeout(&ar->scan.started, 1 * HZ); 4817 if (ret == 0) { 4818 ret = ath12k_scan_stop(ar); 4819 if (ret) 4820 ath12k_warn(ar->ab, "failed to stop scan: %d\n", ret); 4821 4822 return -ETIMEDOUT; 4823 } 4824 4825 /* If we failed to start the scan, return error code at 4826 * this point. This is probably due to some issue in the 4827 * firmware, but no need to wedge the driver due to that... 4828 */ 4829 spin_lock_bh(&ar->data_lock); 4830 if (ar->scan.state == ATH12K_SCAN_IDLE) { 4831 spin_unlock_bh(&ar->data_lock); 4832 return -EINVAL; 4833 } 4834 spin_unlock_bh(&ar->data_lock); 4835 4836 return 0; 4837 } 4838 4839 int ath12k_mac_get_fw_stats(struct ath12k *ar, 4840 struct ath12k_fw_stats_req_params *param) 4841 { 4842 struct ath12k_base *ab = ar->ab; 4843 struct ath12k_hw *ah = ath12k_ar_to_ah(ar); 4844 unsigned long time_left; 4845 int ret; 4846 4847 guard(mutex)(&ah->hw_mutex); 4848 4849 if (ah->state != ATH12K_HW_STATE_ON) 4850 return -ENETDOWN; 4851 4852 ath12k_fw_stats_reset(ar); 4853 4854 reinit_completion(&ar->fw_stats_complete); 4855 reinit_completion(&ar->fw_stats_done); 4856 4857 ret = ath12k_wmi_send_stats_request_cmd(ar, param->stats_id, 4858 param->vdev_id, param->pdev_id); 4859 if (ret) { 4860 ath12k_warn(ab, "failed to request fw stats: %d\n", ret); 4861 return ret; 4862 } 4863 4864 ath12k_dbg(ab, ATH12K_DBG_WMI, 4865 "get fw stat pdev id %d vdev id %d stats id 0x%x\n", 4866 param->pdev_id, param->vdev_id, param->stats_id); 4867 4868 time_left = wait_for_completion_timeout(&ar->fw_stats_complete, 1 * HZ); 4869 if (!time_left) { 4870 ath12k_warn(ab, "time out while waiting for get fw stats\n"); 4871 return -ETIMEDOUT; 4872 } 4873 4874 /* Firmware sends WMI_UPDATE_STATS_EVENTID back-to-back 4875 * when stats data buffer limit is reached. fw_stats_complete 4876 * is completed once host receives first event from firmware, but 4877 * still there could be more events following. Below is to wait 4878 * until firmware completes sending all the events. 4879 */ 4880 time_left = wait_for_completion_timeout(&ar->fw_stats_done, 3 * HZ); 4881 if (!time_left) { 4882 ath12k_warn(ab, "time out while waiting for fw stats done\n"); 4883 return -ETIMEDOUT; 4884 } 4885 4886 return 0; 4887 } 4888 4889 static int ath12k_mac_op_get_txpower(struct ieee80211_hw *hw, 4890 struct ieee80211_vif *vif, 4891 unsigned int link_id, 4892 int *dbm) 4893 { 4894 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 4895 struct ath12k_fw_stats_req_params params = {}; 4896 struct ath12k_fw_stats_pdev *pdev; 4897 struct ath12k_hw *ah = hw->priv; 4898 struct ath12k_link_vif *arvif; 4899 struct ath12k_base *ab; 4900 struct ath12k *ar; 4901 int ret; 4902 4903 /* Final Tx power is minimum of Target Power, CTL power, Regulatory 4904 * Power, PSD EIRP Power. We just know the Regulatory power from the 4905 * regulatory rules obtained. FW knows all these power and sets the min 4906 * of these. Hence, we request the FW pdev stats in which FW reports 4907 * the minimum of all vdev's channel Tx power. 4908 */ 4909 lockdep_assert_wiphy(hw->wiphy); 4910 4911 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]); 4912 if (!arvif || !arvif->ar) 4913 return -EINVAL; 4914 4915 ar = arvif->ar; 4916 ab = ar->ab; 4917 if (ah->state != ATH12K_HW_STATE_ON) 4918 goto err_fallback; 4919 4920 if (test_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags)) 4921 return -EAGAIN; 4922 4923 /* Limit the requests to Firmware for fetching the tx power */ 4924 if (ar->chan_tx_pwr != ATH12K_PDEV_TX_POWER_INVALID && 4925 time_before(jiffies, 4926 msecs_to_jiffies(ATH12K_PDEV_TX_POWER_REFRESH_TIME_MSECS) + 4927 ar->last_tx_power_update)) 4928 goto send_tx_power; 4929 4930 params.pdev_id = ar->pdev->pdev_id; 4931 params.vdev_id = arvif->vdev_id; 4932 params.stats_id = WMI_REQUEST_PDEV_STAT; 4933 ret = ath12k_mac_get_fw_stats(ar, ¶ms); 4934 if (ret) { 4935 ath12k_warn(ab, "failed to request fw pdev stats: %d\n", ret); 4936 goto err_fallback; 4937 } 4938 4939 spin_lock_bh(&ar->data_lock); 4940 pdev = list_first_entry_or_null(&ar->fw_stats.pdevs, 4941 struct ath12k_fw_stats_pdev, list); 4942 if (!pdev) { 4943 spin_unlock_bh(&ar->data_lock); 4944 goto err_fallback; 4945 } 4946 4947 /* tx power reported by firmware is in units of 0.5 dBm */ 4948 ar->chan_tx_pwr = pdev->chan_tx_power / 2; 4949 spin_unlock_bh(&ar->data_lock); 4950 ar->last_tx_power_update = jiffies; 4951 4952 send_tx_power: 4953 *dbm = ar->chan_tx_pwr; 4954 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "txpower fetched from firmware %d dBm\n", 4955 *dbm); 4956 return 0; 4957 4958 err_fallback: 4959 /* We didn't get txpower from FW. Hence, relying on vif->bss_conf.txpower */ 4960 *dbm = vif->bss_conf.txpower; 4961 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "txpower from firmware NaN, reported %d dBm\n", 4962 *dbm); 4963 return 0; 4964 } 4965 4966 static u8 4967 ath12k_mac_find_link_id_by_ar(struct ath12k_vif *ahvif, struct ath12k *ar) 4968 { 4969 struct ath12k_link_vif *arvif; 4970 struct ath12k_hw *ah = ahvif->ah; 4971 unsigned long links = ahvif->links_map; 4972 unsigned long scan_links_map; 4973 u8 link_id; 4974 4975 lockdep_assert_wiphy(ah->hw->wiphy); 4976 4977 for_each_set_bit(link_id, &links, ATH12K_NUM_MAX_LINKS) { 4978 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]); 4979 4980 if (!arvif || !arvif->is_created) 4981 continue; 4982 4983 if (ar == arvif->ar) 4984 return link_id; 4985 } 4986 4987 /* input ar is not assigned to any of the links of ML VIF, use next 4988 * available scan link for scan vdev creation. There are cases where 4989 * single scan req needs to be split in driver and initiate separate 4990 * scan requests to firmware based on device. 4991 */ 4992 4993 /* Unset all non-scan links (0-14) of scan_links_map so that ffs() will 4994 * choose an available link among scan links (i.e link id >= 15) 4995 */ 4996 scan_links_map = ~ahvif->links_map & ATH12K_SCAN_LINKS_MASK; 4997 if (scan_links_map) 4998 return __ffs(scan_links_map); 4999 5000 return ATH12K_FIRST_SCAN_LINK; 5001 } 5002 5003 static int ath12k_mac_initiate_hw_scan(struct ieee80211_hw *hw, 5004 struct ieee80211_vif *vif, 5005 struct ieee80211_scan_request *hw_req, 5006 int n_channels, 5007 struct ieee80211_channel **chan_list, 5008 struct ath12k *ar) 5009 { 5010 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 5011 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 5012 struct ath12k_link_vif *arvif; 5013 struct cfg80211_scan_request *req = &hw_req->req; 5014 struct ath12k_wmi_scan_req_arg *arg = NULL; 5015 u8 link_id; 5016 int ret; 5017 int i; 5018 bool create = true; 5019 5020 lockdep_assert_wiphy(hw->wiphy); 5021 5022 arvif = &ahvif->deflink; 5023 5024 /* check if any of the links of ML VIF is already started on 5025 * radio(ar) corresponding to given scan frequency and use it, 5026 * if not use scan link (link id >= 15) for scan purpose. 5027 */ 5028 link_id = ath12k_mac_find_link_id_by_ar(ahvif, ar); 5029 /* All scan links are occupied. ideally this shouldn't happen as 5030 * mac80211 won't schedule scan for same band until ongoing scan is 5031 * completed, don't try to exceed max links just in case if it happens. 5032 */ 5033 if (link_id >= ATH12K_NUM_MAX_LINKS) 5034 return -EBUSY; 5035 5036 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id); 5037 5038 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac link ID %d selected for scan", 5039 arvif->link_id); 5040 5041 /* If the vif is already assigned to a specific vdev of an ar, 5042 * check whether its already started, vdev which is started 5043 * are not allowed to switch to a new radio. 5044 * If the vdev is not started, but was earlier created on a 5045 * different ar, delete that vdev and create a new one. We don't 5046 * delete at the scan stop as an optimization to avoid redundant 5047 * delete-create vdev's for the same ar, in case the request is 5048 * always on the same band for the vif 5049 */ 5050 if (arvif->is_created) { 5051 if (WARN_ON(!arvif->ar)) 5052 return -EINVAL; 5053 5054 if (ar != arvif->ar && arvif->is_started) 5055 return -EINVAL; 5056 5057 if (ar != arvif->ar) { 5058 ath12k_mac_remove_link_interface(hw, arvif); 5059 ath12k_mac_unassign_link_vif(arvif); 5060 } else { 5061 create = false; 5062 } 5063 } 5064 5065 if (create) { 5066 /* Previous arvif would've been cleared in radio switch block 5067 * above, assign arvif again for create. 5068 */ 5069 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id); 5070 5071 ret = ath12k_mac_vdev_create(ar, arvif); 5072 if (ret) { 5073 ath12k_warn(ar->ab, "unable to create scan vdev %d\n", ret); 5074 return -EINVAL; 5075 } 5076 } 5077 5078 spin_lock_bh(&ar->data_lock); 5079 switch (ar->scan.state) { 5080 case ATH12K_SCAN_IDLE: 5081 reinit_completion(&ar->scan.started); 5082 reinit_completion(&ar->scan.completed); 5083 ar->scan.state = ATH12K_SCAN_STARTING; 5084 ar->scan.is_roc = false; 5085 ar->scan.arvif = arvif; 5086 ret = 0; 5087 break; 5088 case ATH12K_SCAN_STARTING: 5089 case ATH12K_SCAN_RUNNING: 5090 case ATH12K_SCAN_ABORTING: 5091 ret = -EBUSY; 5092 break; 5093 } 5094 spin_unlock_bh(&ar->data_lock); 5095 5096 if (ret) 5097 goto exit; 5098 5099 arg = kzalloc(sizeof(*arg), GFP_KERNEL); 5100 if (!arg) { 5101 ret = -ENOMEM; 5102 goto exit; 5103 } 5104 5105 ath12k_wmi_start_scan_init(ar, arg); 5106 arg->vdev_id = arvif->vdev_id; 5107 arg->scan_id = ATH12K_SCAN_ID; 5108 5109 if (req->ie_len) { 5110 arg->extraie.ptr = kmemdup(req->ie, req->ie_len, GFP_KERNEL); 5111 if (!arg->extraie.ptr) { 5112 ret = -ENOMEM; 5113 goto exit; 5114 } 5115 arg->extraie.len = req->ie_len; 5116 } 5117 5118 if (req->n_ssids) { 5119 arg->num_ssids = req->n_ssids; 5120 for (i = 0; i < arg->num_ssids; i++) 5121 arg->ssid[i] = req->ssids[i]; 5122 } else { 5123 arg->scan_f_passive = 1; 5124 } 5125 5126 if (n_channels) { 5127 arg->num_chan = n_channels; 5128 arg->chan_list = kcalloc(arg->num_chan, sizeof(*arg->chan_list), 5129 GFP_KERNEL); 5130 if (!arg->chan_list) { 5131 ret = -ENOMEM; 5132 goto exit; 5133 } 5134 5135 for (i = 0; i < arg->num_chan; i++) 5136 arg->chan_list[i] = chan_list[i]->center_freq; 5137 } 5138 5139 ret = ath12k_start_scan(ar, arg); 5140 if (ret) { 5141 if (ret == -EBUSY) 5142 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 5143 "scan engine is busy 11d state %d\n", ar->state_11d); 5144 else 5145 ath12k_warn(ar->ab, "failed to start hw scan: %d\n", ret); 5146 5147 spin_lock_bh(&ar->data_lock); 5148 ar->scan.state = ATH12K_SCAN_IDLE; 5149 spin_unlock_bh(&ar->data_lock); 5150 goto exit; 5151 } 5152 5153 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac scan started"); 5154 5155 /* Add a margin to account for event/command processing */ 5156 ieee80211_queue_delayed_work(ath12k_ar_to_hw(ar), &ar->scan.timeout, 5157 msecs_to_jiffies(arg->max_scan_time + 5158 ATH12K_MAC_SCAN_TIMEOUT_MSECS)); 5159 5160 exit: 5161 if (arg) { 5162 kfree(arg->chan_list); 5163 kfree(arg->extraie.ptr); 5164 kfree(arg); 5165 } 5166 5167 if (ar->state_11d == ATH12K_11D_PREPARING && 5168 ahvif->vdev_type == WMI_VDEV_TYPE_STA && 5169 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) 5170 ath12k_mac_11d_scan_start(ar, arvif->vdev_id); 5171 5172 return ret; 5173 } 5174 5175 static int ath12k_mac_op_hw_scan(struct ieee80211_hw *hw, 5176 struct ieee80211_vif *vif, 5177 struct ieee80211_scan_request *hw_req) 5178 { 5179 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 5180 struct ieee80211_channel **chan_list, *chan; 5181 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 5182 unsigned long links_map, link_id; 5183 struct ath12k_link_vif *arvif; 5184 struct ath12k *ar, *scan_ar; 5185 int i, j, ret = 0; 5186 5187 lockdep_assert_wiphy(hw->wiphy); 5188 5189 chan_list = kcalloc(hw_req->req.n_channels, sizeof(*chan_list), GFP_KERNEL); 5190 if (!chan_list) 5191 return -ENOMEM; 5192 5193 /* There could be channels that belong to multiple underlying radio 5194 * in same scan request as mac80211 sees it as single band. In that 5195 * case split the hw_req based on frequency range and schedule scans to 5196 * corresponding radio. 5197 */ 5198 for_each_ar(ah, ar, i) { 5199 int n_chans = 0; 5200 5201 for (j = 0; j < hw_req->req.n_channels; j++) { 5202 chan = hw_req->req.channels[j]; 5203 scan_ar = ath12k_mac_select_scan_device(hw, vif, 5204 chan->center_freq); 5205 if (!scan_ar) { 5206 ath12k_hw_warn(ah, "unable to select scan device for freq %d\n", 5207 chan->center_freq); 5208 ret = -EINVAL; 5209 goto abort; 5210 } 5211 if (ar != scan_ar) 5212 continue; 5213 5214 chan_list[n_chans++] = chan; 5215 } 5216 if (n_chans) { 5217 ret = ath12k_mac_initiate_hw_scan(hw, vif, hw_req, n_chans, 5218 chan_list, ar); 5219 if (ret) 5220 goto abort; 5221 } 5222 } 5223 abort: 5224 /* If any of the parallel scans initiated fails, abort all and 5225 * remove the scan interfaces created. Return complete scan 5226 * failure as mac80211 assumes this as single scan request. 5227 */ 5228 if (ret) { 5229 ath12k_hw_warn(ah, "Scan failed %d , cleanup all scan vdevs\n", ret); 5230 links_map = ahvif->links_map; 5231 for_each_set_bit(link_id, &links_map, ATH12K_NUM_MAX_LINKS) { 5232 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 5233 if (!arvif) 5234 continue; 5235 5236 ar = arvif->ar; 5237 if (ar->scan.arvif == arvif) { 5238 wiphy_work_cancel(hw->wiphy, &ar->scan.vdev_clean_wk); 5239 spin_lock_bh(&ar->data_lock); 5240 ar->scan.arvif = NULL; 5241 ar->scan.state = ATH12K_SCAN_IDLE; 5242 ar->scan_channel = NULL; 5243 ar->scan.roc_freq = 0; 5244 spin_unlock_bh(&ar->data_lock); 5245 } 5246 if (link_id >= ATH12K_FIRST_SCAN_LINK) { 5247 ath12k_mac_remove_link_interface(hw, arvif); 5248 ath12k_mac_unassign_link_vif(arvif); 5249 } 5250 } 5251 } 5252 kfree(chan_list); 5253 return ret; 5254 } 5255 5256 static void ath12k_mac_op_cancel_hw_scan(struct ieee80211_hw *hw, 5257 struct ieee80211_vif *vif) 5258 { 5259 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 5260 unsigned long link_id, links_map = ahvif->links_map; 5261 struct ath12k_link_vif *arvif; 5262 struct ath12k *ar; 5263 5264 lockdep_assert_wiphy(hw->wiphy); 5265 5266 for_each_set_bit(link_id, &links_map, ATH12K_NUM_MAX_LINKS) { 5267 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 5268 if (!arvif || arvif->is_started) 5269 continue; 5270 5271 ar = arvif->ar; 5272 5273 ath12k_scan_abort(ar); 5274 5275 cancel_delayed_work_sync(&ar->scan.timeout); 5276 } 5277 } 5278 5279 static int ath12k_install_key(struct ath12k_link_vif *arvif, 5280 struct ieee80211_key_conf *key, 5281 enum set_key_cmd cmd, 5282 const u8 *macaddr, u32 flags) 5283 { 5284 int ret; 5285 struct ath12k *ar = arvif->ar; 5286 struct wmi_vdev_install_key_arg arg = { 5287 .vdev_id = arvif->vdev_id, 5288 .key_idx = key->keyidx, 5289 .key_len = key->keylen, 5290 .key_data = key->key, 5291 .key_flags = flags, 5292 .ieee80211_key_cipher = key->cipher, 5293 .macaddr = macaddr, 5294 }; 5295 struct ath12k_vif *ahvif = arvif->ahvif; 5296 5297 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 5298 5299 if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags)) 5300 return 0; 5301 5302 if (cmd == DISABLE_KEY) { 5303 /* TODO: Check if FW expects value other than NONE for del */ 5304 /* arg.key_cipher = WMI_CIPHER_NONE; */ 5305 arg.key_len = 0; 5306 arg.key_data = NULL; 5307 goto check_order; 5308 } 5309 5310 switch (key->cipher) { 5311 case WLAN_CIPHER_SUITE_CCMP: 5312 case WLAN_CIPHER_SUITE_CCMP_256: 5313 arg.key_cipher = WMI_CIPHER_AES_CCM; 5314 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT; 5315 break; 5316 case WLAN_CIPHER_SUITE_TKIP: 5317 arg.key_cipher = WMI_CIPHER_TKIP; 5318 arg.key_txmic_len = 8; 5319 arg.key_rxmic_len = 8; 5320 break; 5321 case WLAN_CIPHER_SUITE_GCMP: 5322 case WLAN_CIPHER_SUITE_GCMP_256: 5323 arg.key_cipher = WMI_CIPHER_AES_GCM; 5324 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT; 5325 break; 5326 case WLAN_CIPHER_SUITE_AES_CMAC: 5327 arg.key_cipher = WMI_CIPHER_AES_CMAC; 5328 break; 5329 case WLAN_CIPHER_SUITE_BIP_GMAC_128: 5330 case WLAN_CIPHER_SUITE_BIP_GMAC_256: 5331 arg.key_cipher = WMI_CIPHER_AES_GMAC; 5332 break; 5333 case WLAN_CIPHER_SUITE_BIP_CMAC_256: 5334 arg.key_cipher = WMI_CIPHER_AES_CMAC; 5335 break; 5336 default: 5337 ath12k_warn(ar->ab, "cipher %d is not supported\n", key->cipher); 5338 return -EOPNOTSUPP; 5339 } 5340 5341 if (test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags)) 5342 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV | 5343 IEEE80211_KEY_FLAG_RESERVE_TAILROOM; 5344 5345 check_order: 5346 if (ahvif->vdev_type == WMI_VDEV_TYPE_STA && 5347 arg.key_flags == WMI_KEY_GROUP) { 5348 if (cmd == SET_KEY) { 5349 if (arvif->pairwise_key_done) { 5350 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 5351 "vdev %u pairwise key done, go install group key\n", 5352 arg.vdev_id); 5353 goto install; 5354 } else { 5355 /* WCN7850 firmware requires pairwise key to be installed 5356 * before group key. In case group key comes first, cache 5357 * it and return. Will revisit it once pairwise key gets 5358 * installed. 5359 */ 5360 arvif->group_key = arg; 5361 arvif->group_key_valid = true; 5362 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 5363 "vdev %u group key before pairwise key, cache and skip\n", 5364 arg.vdev_id); 5365 5366 ret = 0; 5367 goto out; 5368 } 5369 } else { 5370 arvif->group_key_valid = false; 5371 } 5372 } 5373 5374 install: 5375 reinit_completion(&ar->install_key_done); 5376 5377 ret = ath12k_wmi_vdev_install_key(arvif->ar, &arg); 5378 if (ret) 5379 return ret; 5380 5381 if (!wait_for_completion_timeout(&ar->install_key_done, 1 * HZ)) 5382 return -ETIMEDOUT; 5383 5384 if (ether_addr_equal(arg.macaddr, arvif->bssid)) 5385 ahvif->key_cipher = arg.ieee80211_key_cipher; 5386 5387 if (ar->install_key_status) { 5388 ret = -EINVAL; 5389 goto out; 5390 } 5391 5392 if (ahvif->vdev_type == WMI_VDEV_TYPE_STA && 5393 arg.key_flags == WMI_KEY_PAIRWISE) { 5394 if (cmd == SET_KEY) { 5395 arvif->pairwise_key_done = true; 5396 if (arvif->group_key_valid) { 5397 /* Install cached GTK */ 5398 arvif->group_key_valid = false; 5399 arg = arvif->group_key; 5400 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 5401 "vdev %u pairwise key done, group key ready, go install\n", 5402 arg.vdev_id); 5403 goto install; 5404 } 5405 } else { 5406 arvif->pairwise_key_done = false; 5407 } 5408 } 5409 5410 out: 5411 if (ret) { 5412 /* In case of failure userspace may not do DISABLE_KEY 5413 * but triggers re-connection directly, so manually reset 5414 * status here. 5415 */ 5416 arvif->group_key_valid = false; 5417 arvif->pairwise_key_done = false; 5418 } 5419 5420 return ret; 5421 } 5422 5423 static int ath12k_clear_peer_keys(struct ath12k_link_vif *arvif, 5424 const u8 *addr) 5425 { 5426 struct ath12k *ar = arvif->ar; 5427 struct ath12k_base *ab = ar->ab; 5428 struct ath12k_peer *peer; 5429 int first_errno = 0; 5430 int ret; 5431 int i; 5432 u32 flags = 0; 5433 5434 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 5435 5436 spin_lock_bh(&ab->base_lock); 5437 peer = ath12k_peer_find(ab, arvif->vdev_id, addr); 5438 spin_unlock_bh(&ab->base_lock); 5439 5440 if (!peer) 5441 return -ENOENT; 5442 5443 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) { 5444 if (!peer->keys[i]) 5445 continue; 5446 5447 /* key flags are not required to delete the key */ 5448 ret = ath12k_install_key(arvif, peer->keys[i], 5449 DISABLE_KEY, addr, flags); 5450 if (ret < 0 && first_errno == 0) 5451 first_errno = ret; 5452 5453 if (ret < 0) 5454 ath12k_warn(ab, "failed to remove peer key %d: %d\n", 5455 i, ret); 5456 5457 spin_lock_bh(&ab->base_lock); 5458 peer->keys[i] = NULL; 5459 spin_unlock_bh(&ab->base_lock); 5460 } 5461 5462 return first_errno; 5463 } 5464 5465 static int ath12k_mac_set_key(struct ath12k *ar, enum set_key_cmd cmd, 5466 struct ath12k_link_vif *arvif, 5467 struct ath12k_link_sta *arsta, 5468 struct ieee80211_key_conf *key) 5469 { 5470 struct ieee80211_sta *sta = NULL; 5471 struct ath12k_base *ab = ar->ab; 5472 struct ath12k_peer *peer; 5473 struct ath12k_sta *ahsta; 5474 const u8 *peer_addr; 5475 int ret; 5476 u32 flags = 0; 5477 5478 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 5479 5480 if (arsta) 5481 sta = ath12k_ahsta_to_sta(arsta->ahsta); 5482 5483 if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ab->dev_flags)) 5484 return 1; 5485 5486 if (sta) 5487 peer_addr = arsta->addr; 5488 else 5489 peer_addr = arvif->bssid; 5490 5491 key->hw_key_idx = key->keyidx; 5492 5493 /* the peer should not disappear in mid-way (unless FW goes awry) since 5494 * we already hold wiphy lock. we just make sure its there now. 5495 */ 5496 spin_lock_bh(&ab->base_lock); 5497 peer = ath12k_peer_find(ab, arvif->vdev_id, peer_addr); 5498 spin_unlock_bh(&ab->base_lock); 5499 5500 if (!peer) { 5501 if (cmd == SET_KEY) { 5502 ath12k_warn(ab, "cannot install key for non-existent peer %pM\n", 5503 peer_addr); 5504 return -EOPNOTSUPP; 5505 } 5506 5507 /* if the peer doesn't exist there is no key to disable 5508 * anymore 5509 */ 5510 return 0; 5511 } 5512 5513 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) 5514 flags = WMI_KEY_PAIRWISE; 5515 else 5516 flags = WMI_KEY_GROUP; 5517 5518 ret = ath12k_install_key(arvif, key, cmd, peer_addr, flags); 5519 if (ret) { 5520 ath12k_warn(ab, "ath12k_install_key failed (%d)\n", ret); 5521 return ret; 5522 } 5523 5524 ret = ath12k_dp_rx_peer_pn_replay_config(arvif, peer_addr, cmd, key); 5525 if (ret) { 5526 ath12k_warn(ab, "failed to offload PN replay detection %d\n", ret); 5527 return ret; 5528 } 5529 5530 spin_lock_bh(&ab->base_lock); 5531 peer = ath12k_peer_find(ab, arvif->vdev_id, peer_addr); 5532 if (peer && cmd == SET_KEY) { 5533 peer->keys[key->keyidx] = key; 5534 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) { 5535 peer->ucast_keyidx = key->keyidx; 5536 peer->sec_type = ath12k_dp_tx_get_encrypt_type(key->cipher); 5537 } else { 5538 peer->mcast_keyidx = key->keyidx; 5539 peer->sec_type_grp = ath12k_dp_tx_get_encrypt_type(key->cipher); 5540 } 5541 } else if (peer && cmd == DISABLE_KEY) { 5542 peer->keys[key->keyidx] = NULL; 5543 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) 5544 peer->ucast_keyidx = 0; 5545 else 5546 peer->mcast_keyidx = 0; 5547 } else if (!peer) 5548 /* impossible unless FW goes crazy */ 5549 ath12k_warn(ab, "peer %pM disappeared!\n", peer_addr); 5550 5551 if (sta) { 5552 ahsta = ath12k_sta_to_ahsta(sta); 5553 5554 switch (key->cipher) { 5555 case WLAN_CIPHER_SUITE_TKIP: 5556 case WLAN_CIPHER_SUITE_CCMP: 5557 case WLAN_CIPHER_SUITE_CCMP_256: 5558 case WLAN_CIPHER_SUITE_GCMP: 5559 case WLAN_CIPHER_SUITE_GCMP_256: 5560 if (cmd == SET_KEY) 5561 ahsta->pn_type = HAL_PN_TYPE_WPA; 5562 else 5563 ahsta->pn_type = HAL_PN_TYPE_NONE; 5564 break; 5565 default: 5566 ahsta->pn_type = HAL_PN_TYPE_NONE; 5567 break; 5568 } 5569 } 5570 5571 spin_unlock_bh(&ab->base_lock); 5572 5573 return 0; 5574 } 5575 5576 static int ath12k_mac_update_key_cache(struct ath12k_vif_cache *cache, 5577 enum set_key_cmd cmd, 5578 struct ieee80211_sta *sta, 5579 struct ieee80211_key_conf *key) 5580 { 5581 struct ath12k_key_conf *key_conf, *tmp; 5582 5583 list_for_each_entry_safe(key_conf, tmp, &cache->key_conf.list, list) { 5584 if (key_conf->key != key) 5585 continue; 5586 5587 /* If SET key entry is already present in cache, nothing to do, 5588 * just return 5589 */ 5590 if (cmd == SET_KEY) 5591 return 0; 5592 5593 /* DEL key for an old SET key which driver hasn't flushed yet. 5594 */ 5595 list_del(&key_conf->list); 5596 kfree(key_conf); 5597 } 5598 5599 if (cmd == SET_KEY) { 5600 key_conf = kzalloc(sizeof(*key_conf), GFP_KERNEL); 5601 5602 if (!key_conf) 5603 return -ENOMEM; 5604 5605 key_conf->cmd = cmd; 5606 key_conf->sta = sta; 5607 key_conf->key = key; 5608 list_add_tail(&key_conf->list, 5609 &cache->key_conf.list); 5610 } 5611 5612 return 0; 5613 } 5614 5615 static int ath12k_mac_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd, 5616 struct ieee80211_vif *vif, struct ieee80211_sta *sta, 5617 struct ieee80211_key_conf *key) 5618 { 5619 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 5620 struct ath12k_link_vif *arvif; 5621 struct ath12k_link_sta *arsta = NULL; 5622 struct ath12k_vif_cache *cache; 5623 struct ath12k_sta *ahsta; 5624 unsigned long links; 5625 u8 link_id; 5626 int ret; 5627 5628 lockdep_assert_wiphy(hw->wiphy); 5629 5630 /* IGTK needs to be done in host software */ 5631 if (key->keyidx == 4 || key->keyidx == 5) 5632 return 1; 5633 5634 if (key->keyidx > WMI_MAX_KEY_INDEX) 5635 return -ENOSPC; 5636 5637 if (sta) { 5638 ahsta = ath12k_sta_to_ahsta(sta); 5639 5640 /* For an ML STA Pairwise key is same for all associated link Stations, 5641 * hence do set key for all link STAs which are active. 5642 */ 5643 if (sta->mlo) { 5644 links = ahsta->links_map; 5645 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) { 5646 arvif = wiphy_dereference(hw->wiphy, 5647 ahvif->link[link_id]); 5648 arsta = wiphy_dereference(hw->wiphy, 5649 ahsta->link[link_id]); 5650 5651 if (WARN_ON(!arvif || !arsta)) 5652 /* arvif and arsta are expected to be valid when 5653 * STA is present. 5654 */ 5655 continue; 5656 5657 ret = ath12k_mac_set_key(arvif->ar, cmd, arvif, 5658 arsta, key); 5659 if (ret) 5660 break; 5661 } 5662 5663 return 0; 5664 } 5665 5666 arsta = &ahsta->deflink; 5667 arvif = arsta->arvif; 5668 if (WARN_ON(!arvif)) 5669 return -EINVAL; 5670 5671 ret = ath12k_mac_set_key(arvif->ar, cmd, arvif, arsta, key); 5672 if (ret) 5673 return ret; 5674 5675 return 0; 5676 } 5677 5678 if (key->link_id >= 0 && key->link_id < IEEE80211_MLD_MAX_NUM_LINKS) { 5679 link_id = key->link_id; 5680 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 5681 } else { 5682 link_id = 0; 5683 arvif = &ahvif->deflink; 5684 } 5685 5686 if (!arvif || !arvif->is_created) { 5687 cache = ath12k_ahvif_get_link_cache(ahvif, link_id); 5688 if (!cache) 5689 return -ENOSPC; 5690 5691 ret = ath12k_mac_update_key_cache(cache, cmd, sta, key); 5692 if (ret) 5693 return ret; 5694 5695 return 0; 5696 } 5697 5698 ret = ath12k_mac_set_key(arvif->ar, cmd, arvif, NULL, key); 5699 if (ret) 5700 return ret; 5701 5702 return 0; 5703 } 5704 5705 static int 5706 ath12k_mac_bitrate_mask_num_vht_rates(struct ath12k *ar, 5707 enum nl80211_band band, 5708 const struct cfg80211_bitrate_mask *mask) 5709 { 5710 int num_rates = 0; 5711 int i; 5712 5713 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) 5714 num_rates += hweight16(mask->control[band].vht_mcs[i]); 5715 5716 return num_rates; 5717 } 5718 5719 static int 5720 ath12k_mac_bitrate_mask_num_he_rates(struct ath12k *ar, 5721 enum nl80211_band band, 5722 const struct cfg80211_bitrate_mask *mask) 5723 { 5724 int num_rates = 0; 5725 int i; 5726 5727 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) 5728 num_rates += hweight16(mask->control[band].he_mcs[i]); 5729 5730 return num_rates; 5731 } 5732 5733 static int 5734 ath12k_mac_set_peer_vht_fixed_rate(struct ath12k_link_vif *arvif, 5735 struct ath12k_link_sta *arsta, 5736 const struct cfg80211_bitrate_mask *mask, 5737 enum nl80211_band band) 5738 { 5739 struct ath12k *ar = arvif->ar; 5740 u8 vht_rate, nss; 5741 u32 rate_code; 5742 int ret, i; 5743 5744 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 5745 5746 nss = 0; 5747 5748 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) { 5749 if (hweight16(mask->control[band].vht_mcs[i]) == 1) { 5750 nss = i + 1; 5751 vht_rate = ffs(mask->control[band].vht_mcs[i]) - 1; 5752 } 5753 } 5754 5755 if (!nss) { 5756 ath12k_warn(ar->ab, "No single VHT Fixed rate found to set for %pM", 5757 arsta->addr); 5758 return -EINVAL; 5759 } 5760 5761 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 5762 "Setting Fixed VHT Rate for peer %pM. Device will not switch to any other selected rates", 5763 arsta->addr); 5764 5765 rate_code = ATH12K_HW_RATE_CODE(vht_rate, nss - 1, 5766 WMI_RATE_PREAMBLE_VHT); 5767 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, 5768 arvif->vdev_id, 5769 WMI_PEER_PARAM_FIXED_RATE, 5770 rate_code); 5771 if (ret) 5772 ath12k_warn(ar->ab, 5773 "failed to update STA %pM Fixed Rate %d: %d\n", 5774 arsta->addr, rate_code, ret); 5775 5776 return ret; 5777 } 5778 5779 static int 5780 ath12k_mac_set_peer_he_fixed_rate(struct ath12k_link_vif *arvif, 5781 struct ath12k_link_sta *arsta, 5782 const struct cfg80211_bitrate_mask *mask, 5783 enum nl80211_band band) 5784 { 5785 struct ath12k *ar = arvif->ar; 5786 u8 he_rate, nss; 5787 u32 rate_code; 5788 int ret, i; 5789 struct ath12k_sta *ahsta = arsta->ahsta; 5790 struct ieee80211_sta *sta; 5791 5792 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 5793 5794 sta = ath12k_ahsta_to_sta(ahsta); 5795 nss = 0; 5796 5797 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) { 5798 if (hweight16(mask->control[band].he_mcs[i]) == 1) { 5799 nss = i + 1; 5800 he_rate = ffs(mask->control[band].he_mcs[i]) - 1; 5801 } 5802 } 5803 5804 if (!nss) { 5805 ath12k_warn(ar->ab, "No single HE Fixed rate found to set for %pM", 5806 arsta->addr); 5807 return -EINVAL; 5808 } 5809 5810 /* Avoid updating invalid nss as fixed rate*/ 5811 if (nss > sta->deflink.rx_nss) 5812 return -EINVAL; 5813 5814 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 5815 "Setting Fixed HE Rate for peer %pM. Device will not switch to any other selected rates", 5816 arsta->addr); 5817 5818 rate_code = ATH12K_HW_RATE_CODE(he_rate, nss - 1, 5819 WMI_RATE_PREAMBLE_HE); 5820 5821 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, 5822 arvif->vdev_id, 5823 WMI_PEER_PARAM_FIXED_RATE, 5824 rate_code); 5825 if (ret) 5826 ath12k_warn(ar->ab, 5827 "failed to update STA %pM Fixed Rate %d: %d\n", 5828 arsta->addr, rate_code, ret); 5829 5830 return ret; 5831 } 5832 5833 static int ath12k_mac_station_assoc(struct ath12k *ar, 5834 struct ath12k_link_vif *arvif, 5835 struct ath12k_link_sta *arsta, 5836 bool reassoc) 5837 { 5838 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 5839 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 5840 struct ieee80211_link_sta *link_sta; 5841 int ret; 5842 struct cfg80211_chan_def def; 5843 enum nl80211_band band; 5844 struct cfg80211_bitrate_mask *mask; 5845 u8 num_vht_rates, num_he_rates; 5846 u8 link_id = arvif->link_id; 5847 5848 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 5849 5850 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) 5851 return -EPERM; 5852 5853 if (WARN_ON(!rcu_access_pointer(sta->link[link_id]))) 5854 return -EINVAL; 5855 5856 band = def.chan->band; 5857 mask = &arvif->bitrate_mask; 5858 5859 struct ath12k_wmi_peer_assoc_arg *peer_arg __free(kfree) = 5860 kzalloc(sizeof(*peer_arg), GFP_KERNEL); 5861 if (!peer_arg) 5862 return -ENOMEM; 5863 5864 ath12k_peer_assoc_prepare(ar, arvif, arsta, peer_arg, reassoc); 5865 5866 if (peer_arg->peer_nss < 1) { 5867 ath12k_warn(ar->ab, 5868 "invalid peer NSS %d\n", peer_arg->peer_nss); 5869 return -EINVAL; 5870 } 5871 5872 peer_arg->is_assoc = true; 5873 ret = ath12k_wmi_send_peer_assoc_cmd(ar, peer_arg); 5874 if (ret) { 5875 ath12k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n", 5876 arsta->addr, arvif->vdev_id, ret); 5877 return ret; 5878 } 5879 5880 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) { 5881 ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n", 5882 arsta->addr, arvif->vdev_id); 5883 return -ETIMEDOUT; 5884 } 5885 5886 num_vht_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band, mask); 5887 num_he_rates = ath12k_mac_bitrate_mask_num_he_rates(ar, band, mask); 5888 5889 /* If single VHT/HE rate is configured (by set_bitrate_mask()), 5890 * peer_assoc will disable VHT/HE. This is now enabled by a peer specific 5891 * fixed param. 5892 * Note that all other rates and NSS will be disabled for this peer. 5893 */ 5894 link_sta = ath12k_mac_get_link_sta(arsta); 5895 if (!link_sta) { 5896 ath12k_warn(ar->ab, "unable to access link sta in station assoc\n"); 5897 return -EINVAL; 5898 } 5899 5900 spin_lock_bh(&ar->data_lock); 5901 arsta->bw = ath12k_mac_ieee80211_sta_bw_to_wmi(ar, link_sta); 5902 arsta->bw_prev = link_sta->bandwidth; 5903 spin_unlock_bh(&ar->data_lock); 5904 5905 if (link_sta->vht_cap.vht_supported && num_vht_rates == 1) { 5906 ret = ath12k_mac_set_peer_vht_fixed_rate(arvif, arsta, mask, band); 5907 } else if (link_sta->he_cap.has_he && num_he_rates == 1) { 5908 ret = ath12k_mac_set_peer_he_fixed_rate(arvif, arsta, mask, band); 5909 if (ret) 5910 return ret; 5911 } 5912 5913 /* Re-assoc is run only to update supported rates for given station. It 5914 * doesn't make much sense to reconfigure the peer completely. 5915 */ 5916 if (reassoc) 5917 return 0; 5918 5919 ret = ath12k_setup_peer_smps(ar, arvif, arsta->addr, 5920 &link_sta->ht_cap, &link_sta->he_6ghz_capa); 5921 if (ret) { 5922 ath12k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n", 5923 arvif->vdev_id, ret); 5924 return ret; 5925 } 5926 5927 if (!sta->wme) { 5928 arvif->num_legacy_stations++; 5929 ret = ath12k_recalc_rtscts_prot(arvif); 5930 if (ret) 5931 return ret; 5932 } 5933 5934 if (sta->wme && sta->uapsd_queues) { 5935 ret = ath12k_peer_assoc_qos_ap(ar, arvif, arsta); 5936 if (ret) { 5937 ath12k_warn(ar->ab, "failed to set qos params for STA %pM for vdev %i: %d\n", 5938 arsta->addr, arvif->vdev_id, ret); 5939 return ret; 5940 } 5941 } 5942 5943 return 0; 5944 } 5945 5946 static int ath12k_mac_station_disassoc(struct ath12k *ar, 5947 struct ath12k_link_vif *arvif, 5948 struct ath12k_link_sta *arsta) 5949 { 5950 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 5951 5952 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 5953 5954 if (!sta->wme) { 5955 arvif->num_legacy_stations--; 5956 return ath12k_recalc_rtscts_prot(arvif); 5957 } 5958 5959 return 0; 5960 } 5961 5962 static void ath12k_sta_rc_update_wk(struct wiphy *wiphy, struct wiphy_work *wk) 5963 { 5964 struct ieee80211_link_sta *link_sta; 5965 struct ath12k *ar; 5966 struct ath12k_link_vif *arvif; 5967 struct ieee80211_sta *sta; 5968 struct cfg80211_chan_def def; 5969 enum nl80211_band band; 5970 const u8 *ht_mcs_mask; 5971 const u16 *vht_mcs_mask; 5972 const u16 *he_mcs_mask; 5973 u32 changed, bw, nss, mac_nss, smps, bw_prev; 5974 int err, num_vht_rates, num_he_rates; 5975 const struct cfg80211_bitrate_mask *mask; 5976 enum wmi_phy_mode peer_phymode; 5977 struct ath12k_link_sta *arsta; 5978 struct ieee80211_vif *vif; 5979 5980 lockdep_assert_wiphy(wiphy); 5981 5982 arsta = container_of(wk, struct ath12k_link_sta, update_wk); 5983 sta = ath12k_ahsta_to_sta(arsta->ahsta); 5984 arvif = arsta->arvif; 5985 vif = ath12k_ahvif_to_vif(arvif->ahvif); 5986 ar = arvif->ar; 5987 5988 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) 5989 return; 5990 5991 band = def.chan->band; 5992 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs; 5993 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs; 5994 he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs; 5995 5996 spin_lock_bh(&ar->data_lock); 5997 5998 changed = arsta->changed; 5999 arsta->changed = 0; 6000 6001 bw = arsta->bw; 6002 bw_prev = arsta->bw_prev; 6003 nss = arsta->nss; 6004 smps = arsta->smps; 6005 6006 spin_unlock_bh(&ar->data_lock); 6007 6008 nss = max_t(u32, 1, nss); 6009 mac_nss = max3(ath12k_mac_max_ht_nss(ht_mcs_mask), 6010 ath12k_mac_max_vht_nss(vht_mcs_mask), 6011 ath12k_mac_max_he_nss(he_mcs_mask)); 6012 nss = min(nss, mac_nss); 6013 6014 struct ath12k_wmi_peer_assoc_arg *peer_arg __free(kfree) = 6015 kzalloc(sizeof(*peer_arg), GFP_KERNEL); 6016 if (!peer_arg) 6017 return; 6018 6019 if (changed & IEEE80211_RC_BW_CHANGED) { 6020 ath12k_peer_assoc_h_phymode(ar, arvif, arsta, peer_arg); 6021 peer_phymode = peer_arg->peer_phymode; 6022 6023 if (bw > bw_prev) { 6024 /* Phymode shows maximum supported channel width, if we 6025 * upgrade bandwidth then due to sanity check of firmware, 6026 * we have to send WMI_PEER_PHYMODE followed by 6027 * WMI_PEER_CHWIDTH 6028 */ 6029 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac bandwidth upgrade for sta %pM new %d old %d\n", 6030 arsta->addr, bw, bw_prev); 6031 err = ath12k_wmi_set_peer_param(ar, arsta->addr, 6032 arvif->vdev_id, WMI_PEER_PHYMODE, 6033 peer_phymode); 6034 if (err) { 6035 ath12k_warn(ar->ab, "failed to update STA %pM to peer phymode %d: %d\n", 6036 arsta->addr, peer_phymode, err); 6037 return; 6038 } 6039 err = ath12k_wmi_set_peer_param(ar, arsta->addr, 6040 arvif->vdev_id, WMI_PEER_CHWIDTH, 6041 bw); 6042 if (err) 6043 ath12k_warn(ar->ab, "failed to update STA %pM to peer bandwidth %d: %d\n", 6044 arsta->addr, bw, err); 6045 } else { 6046 /* When we downgrade bandwidth this will conflict with phymode 6047 * and cause to trigger firmware crash. In this case we send 6048 * WMI_PEER_CHWIDTH followed by WMI_PEER_PHYMODE 6049 */ 6050 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac bandwidth downgrade for sta %pM new %d old %d\n", 6051 arsta->addr, bw, bw_prev); 6052 err = ath12k_wmi_set_peer_param(ar, arsta->addr, 6053 arvif->vdev_id, WMI_PEER_CHWIDTH, 6054 bw); 6055 if (err) { 6056 ath12k_warn(ar->ab, "failed to update STA %pM peer to bandwidth %d: %d\n", 6057 arsta->addr, bw, err); 6058 return; 6059 } 6060 err = ath12k_wmi_set_peer_param(ar, arsta->addr, 6061 arvif->vdev_id, WMI_PEER_PHYMODE, 6062 peer_phymode); 6063 if (err) 6064 ath12k_warn(ar->ab, "failed to update STA %pM to peer phymode %d: %d\n", 6065 arsta->addr, peer_phymode, err); 6066 } 6067 } 6068 6069 if (changed & IEEE80211_RC_NSS_CHANGED) { 6070 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac update sta %pM nss %d\n", 6071 arsta->addr, nss); 6072 6073 err = ath12k_wmi_set_peer_param(ar, arsta->addr, arvif->vdev_id, 6074 WMI_PEER_NSS, nss); 6075 if (err) 6076 ath12k_warn(ar->ab, "failed to update STA %pM nss %d: %d\n", 6077 arsta->addr, nss, err); 6078 } 6079 6080 if (changed & IEEE80211_RC_SMPS_CHANGED) { 6081 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac update sta %pM smps %d\n", 6082 arsta->addr, smps); 6083 6084 err = ath12k_wmi_set_peer_param(ar, arsta->addr, arvif->vdev_id, 6085 WMI_PEER_MIMO_PS_STATE, smps); 6086 if (err) 6087 ath12k_warn(ar->ab, "failed to update STA %pM smps %d: %d\n", 6088 arsta->addr, smps, err); 6089 } 6090 6091 if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) { 6092 mask = &arvif->bitrate_mask; 6093 num_vht_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band, 6094 mask); 6095 num_he_rates = ath12k_mac_bitrate_mask_num_he_rates(ar, band, 6096 mask); 6097 6098 /* Peer_assoc_prepare will reject vht rates in 6099 * bitrate_mask if its not available in range format and 6100 * sets vht tx_rateset as unsupported. So multiple VHT MCS 6101 * setting(eg. MCS 4,5,6) per peer is not supported here. 6102 * But, Single rate in VHT mask can be set as per-peer 6103 * fixed rate. But even if any HT rates are configured in 6104 * the bitrate mask, device will not switch to those rates 6105 * when per-peer Fixed rate is set. 6106 * TODO: Check RATEMASK_CMDID to support auto rates selection 6107 * across HT/VHT and for multiple VHT MCS support. 6108 */ 6109 link_sta = ath12k_mac_get_link_sta(arsta); 6110 if (!link_sta) { 6111 ath12k_warn(ar->ab, "unable to access link sta in peer assoc he for sta %pM link %u\n", 6112 sta->addr, arsta->link_id); 6113 return; 6114 } 6115 6116 if (link_sta->vht_cap.vht_supported && num_vht_rates == 1) { 6117 ath12k_mac_set_peer_vht_fixed_rate(arvif, arsta, mask, 6118 band); 6119 } else if (link_sta->he_cap.has_he && num_he_rates == 1) { 6120 ath12k_mac_set_peer_he_fixed_rate(arvif, arsta, mask, band); 6121 } else { 6122 /* If the peer is non-VHT/HE or no fixed VHT/HE rate 6123 * is provided in the new bitrate mask we set the 6124 * other rates using peer_assoc command. Also clear 6125 * the peer fixed rate settings as it has higher proprity 6126 * than peer assoc 6127 */ 6128 err = ath12k_wmi_set_peer_param(ar, arsta->addr, 6129 arvif->vdev_id, 6130 WMI_PEER_PARAM_FIXED_RATE, 6131 WMI_FIXED_RATE_NONE); 6132 if (err) 6133 ath12k_warn(ar->ab, 6134 "failed to disable peer fixed rate for STA %pM ret %d\n", 6135 arsta->addr, err); 6136 6137 ath12k_peer_assoc_prepare(ar, arvif, arsta, 6138 peer_arg, true); 6139 6140 peer_arg->is_assoc = false; 6141 err = ath12k_wmi_send_peer_assoc_cmd(ar, peer_arg); 6142 if (err) 6143 ath12k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n", 6144 arsta->addr, arvif->vdev_id, err); 6145 6146 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) 6147 ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n", 6148 arsta->addr, arvif->vdev_id); 6149 } 6150 } 6151 } 6152 6153 static void ath12k_mac_free_unassign_link_sta(struct ath12k_hw *ah, 6154 struct ath12k_sta *ahsta, 6155 u8 link_id) 6156 { 6157 struct ath12k_link_sta *arsta; 6158 6159 lockdep_assert_wiphy(ah->hw->wiphy); 6160 6161 if (WARN_ON(link_id >= IEEE80211_MLD_MAX_NUM_LINKS)) 6162 return; 6163 6164 arsta = wiphy_dereference(ah->hw->wiphy, ahsta->link[link_id]); 6165 if (WARN_ON(!arsta)) 6166 return; 6167 6168 ahsta->links_map &= ~BIT(link_id); 6169 rcu_assign_pointer(ahsta->link[link_id], NULL); 6170 synchronize_rcu(); 6171 6172 if (arsta == &ahsta->deflink) { 6173 arsta->link_id = ATH12K_INVALID_LINK_ID; 6174 arsta->ahsta = NULL; 6175 arsta->arvif = NULL; 6176 return; 6177 } 6178 6179 kfree(arsta); 6180 } 6181 6182 static int ath12k_mac_inc_num_stations(struct ath12k_link_vif *arvif, 6183 struct ath12k_link_sta *arsta) 6184 { 6185 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 6186 struct ath12k *ar = arvif->ar; 6187 6188 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 6189 6190 if (arvif->ahvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls) 6191 return 0; 6192 6193 if (ar->num_stations >= ar->max_num_stations) 6194 return -ENOBUFS; 6195 6196 ar->num_stations++; 6197 arvif->num_stations++; 6198 6199 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 6200 "mac station %pM connected to vdev %u num_stations %u\n", 6201 arsta->addr, arvif->vdev_id, arvif->num_stations); 6202 6203 return 0; 6204 } 6205 6206 static void ath12k_mac_dec_num_stations(struct ath12k_link_vif *arvif, 6207 struct ath12k_link_sta *arsta) 6208 { 6209 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 6210 struct ath12k *ar = arvif->ar; 6211 6212 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 6213 6214 if (arvif->ahvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls) 6215 return; 6216 6217 ar->num_stations--; 6218 6219 if (arvif->num_stations) { 6220 arvif->num_stations--; 6221 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 6222 "mac station %pM disconnected from vdev %u num_stations %u\n", 6223 arsta->addr, arvif->vdev_id, arvif->num_stations); 6224 } else { 6225 ath12k_warn(ar->ab, 6226 "mac station %pM disconnect for vdev %u without any connected station\n", 6227 arsta->addr, arvif->vdev_id); 6228 } 6229 } 6230 6231 static void ath12k_mac_station_post_remove(struct ath12k *ar, 6232 struct ath12k_link_vif *arvif, 6233 struct ath12k_link_sta *arsta) 6234 { 6235 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 6236 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 6237 struct ath12k_peer *peer; 6238 6239 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 6240 6241 ath12k_mac_dec_num_stations(arvif, arsta); 6242 6243 spin_lock_bh(&ar->ab->base_lock); 6244 6245 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr); 6246 if (peer && peer->sta == sta) { 6247 ath12k_warn(ar->ab, "Found peer entry %pM n vdev %i after it was supposedly removed\n", 6248 vif->addr, arvif->vdev_id); 6249 peer->sta = NULL; 6250 list_del(&peer->list); 6251 kfree(peer); 6252 ar->num_peers--; 6253 } 6254 6255 spin_unlock_bh(&ar->ab->base_lock); 6256 6257 kfree(arsta->rx_stats); 6258 arsta->rx_stats = NULL; 6259 } 6260 6261 static int ath12k_mac_station_unauthorize(struct ath12k *ar, 6262 struct ath12k_link_vif *arvif, 6263 struct ath12k_link_sta *arsta) 6264 { 6265 struct ath12k_peer *peer; 6266 int ret; 6267 6268 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 6269 6270 spin_lock_bh(&ar->ab->base_lock); 6271 6272 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr); 6273 if (peer) 6274 peer->is_authorized = false; 6275 6276 spin_unlock_bh(&ar->ab->base_lock); 6277 6278 /* Driver must clear the keys during the state change from 6279 * IEEE80211_STA_AUTHORIZED to IEEE80211_STA_ASSOC, since after 6280 * returning from here, mac80211 is going to delete the keys 6281 * in __sta_info_destroy_part2(). This will ensure that the driver does 6282 * not retain stale key references after mac80211 deletes the keys. 6283 */ 6284 ret = ath12k_clear_peer_keys(arvif, arsta->addr); 6285 if (ret) { 6286 ath12k_warn(ar->ab, "failed to clear all peer keys for vdev %i: %d\n", 6287 arvif->vdev_id, ret); 6288 return ret; 6289 } 6290 6291 return 0; 6292 } 6293 6294 static int ath12k_mac_station_authorize(struct ath12k *ar, 6295 struct ath12k_link_vif *arvif, 6296 struct ath12k_link_sta *arsta) 6297 { 6298 struct ath12k_peer *peer; 6299 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 6300 int ret; 6301 6302 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 6303 6304 spin_lock_bh(&ar->ab->base_lock); 6305 6306 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr); 6307 if (peer) 6308 peer->is_authorized = true; 6309 6310 spin_unlock_bh(&ar->ab->base_lock); 6311 6312 if (vif->type == NL80211_IFTYPE_STATION && arvif->is_up) { 6313 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, 6314 arvif->vdev_id, 6315 WMI_PEER_AUTHORIZE, 6316 1); 6317 if (ret) { 6318 ath12k_warn(ar->ab, "Unable to authorize peer %pM vdev %d: %d\n", 6319 arsta->addr, arvif->vdev_id, ret); 6320 return ret; 6321 } 6322 } 6323 6324 return 0; 6325 } 6326 6327 static int ath12k_mac_station_remove(struct ath12k *ar, 6328 struct ath12k_link_vif *arvif, 6329 struct ath12k_link_sta *arsta) 6330 { 6331 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 6332 struct ath12k_vif *ahvif = arvif->ahvif; 6333 int ret = 0; 6334 6335 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 6336 6337 wiphy_work_cancel(ar->ah->hw->wiphy, &arsta->update_wk); 6338 6339 if (ahvif->vdev_type == WMI_VDEV_TYPE_STA) { 6340 ath12k_bss_disassoc(ar, arvif); 6341 ret = ath12k_mac_vdev_stop(arvif); 6342 if (ret) 6343 ath12k_warn(ar->ab, "failed to stop vdev %i: %d\n", 6344 arvif->vdev_id, ret); 6345 } 6346 6347 if (sta->mlo) 6348 return ret; 6349 6350 ath12k_dp_peer_cleanup(ar, arvif->vdev_id, arsta->addr); 6351 6352 ret = ath12k_peer_delete(ar, arvif->vdev_id, arsta->addr); 6353 if (ret) 6354 ath12k_warn(ar->ab, "Failed to delete peer: %pM for VDEV: %d\n", 6355 arsta->addr, arvif->vdev_id); 6356 else 6357 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "Removed peer: %pM for VDEV: %d\n", 6358 arsta->addr, arvif->vdev_id); 6359 6360 ath12k_mac_station_post_remove(ar, arvif, arsta); 6361 6362 if (sta->valid_links) 6363 ath12k_mac_free_unassign_link_sta(ahvif->ah, 6364 arsta->ahsta, arsta->link_id); 6365 6366 return ret; 6367 } 6368 6369 static int ath12k_mac_station_add(struct ath12k *ar, 6370 struct ath12k_link_vif *arvif, 6371 struct ath12k_link_sta *arsta) 6372 { 6373 struct ath12k_base *ab = ar->ab; 6374 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 6375 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 6376 struct ath12k_wmi_peer_create_arg peer_param = {}; 6377 int ret; 6378 6379 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 6380 6381 ret = ath12k_mac_inc_num_stations(arvif, arsta); 6382 if (ret) { 6383 ath12k_warn(ab, "refusing to associate station: too many connected already (%d)\n", 6384 ar->max_num_stations); 6385 goto exit; 6386 } 6387 6388 if (ath12k_debugfs_is_extd_rx_stats_enabled(ar) && !arsta->rx_stats) { 6389 arsta->rx_stats = kzalloc(sizeof(*arsta->rx_stats), GFP_KERNEL); 6390 if (!arsta->rx_stats) { 6391 ret = -ENOMEM; 6392 goto dec_num_station; 6393 } 6394 } 6395 6396 peer_param.vdev_id = arvif->vdev_id; 6397 peer_param.peer_addr = arsta->addr; 6398 peer_param.peer_type = WMI_PEER_TYPE_DEFAULT; 6399 peer_param.ml_enabled = sta->mlo; 6400 6401 ret = ath12k_peer_create(ar, arvif, sta, &peer_param); 6402 if (ret) { 6403 ath12k_warn(ab, "Failed to add peer: %pM for VDEV: %d\n", 6404 arsta->addr, arvif->vdev_id); 6405 goto free_peer; 6406 } 6407 6408 ath12k_dbg(ab, ATH12K_DBG_MAC, "Added peer: %pM for VDEV: %d\n", 6409 arsta->addr, arvif->vdev_id); 6410 6411 if (ieee80211_vif_is_mesh(vif)) { 6412 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, 6413 arvif->vdev_id, 6414 WMI_PEER_USE_4ADDR, 1); 6415 if (ret) { 6416 ath12k_warn(ab, "failed to STA %pM 4addr capability: %d\n", 6417 arsta->addr, ret); 6418 goto free_peer; 6419 } 6420 } 6421 6422 ret = ath12k_dp_peer_setup(ar, arvif->vdev_id, arsta->addr); 6423 if (ret) { 6424 ath12k_warn(ab, "failed to setup dp for peer %pM on vdev %i (%d)\n", 6425 arsta->addr, arvif->vdev_id, ret); 6426 goto free_peer; 6427 } 6428 6429 if (ab->hw_params->vdev_start_delay && 6430 !arvif->is_started && 6431 arvif->ahvif->vdev_type != WMI_VDEV_TYPE_AP) { 6432 ret = ath12k_start_vdev_delay(ar, arvif); 6433 if (ret) { 6434 ath12k_warn(ab, "failed to delay vdev start: %d\n", ret); 6435 goto free_peer; 6436 } 6437 } 6438 6439 ewma_avg_rssi_init(&arsta->avg_rssi); 6440 return 0; 6441 6442 free_peer: 6443 ath12k_peer_delete(ar, arvif->vdev_id, arsta->addr); 6444 kfree(arsta->rx_stats); 6445 arsta->rx_stats = NULL; 6446 dec_num_station: 6447 ath12k_mac_dec_num_stations(arvif, arsta); 6448 exit: 6449 return ret; 6450 } 6451 6452 static int ath12k_mac_assign_link_sta(struct ath12k_hw *ah, 6453 struct ath12k_sta *ahsta, 6454 struct ath12k_link_sta *arsta, 6455 struct ath12k_vif *ahvif, 6456 u8 link_id) 6457 { 6458 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(ahsta); 6459 struct ieee80211_link_sta *link_sta; 6460 struct ath12k_link_vif *arvif; 6461 6462 lockdep_assert_wiphy(ah->hw->wiphy); 6463 6464 if (!arsta || link_id >= IEEE80211_MLD_MAX_NUM_LINKS) 6465 return -EINVAL; 6466 6467 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]); 6468 if (!arvif) 6469 return -EINVAL; 6470 6471 memset(arsta, 0, sizeof(*arsta)); 6472 6473 link_sta = wiphy_dereference(ah->hw->wiphy, sta->link[link_id]); 6474 if (!link_sta) 6475 return -EINVAL; 6476 6477 ether_addr_copy(arsta->addr, link_sta->addr); 6478 6479 /* logical index of the link sta in order of creation */ 6480 arsta->link_idx = ahsta->num_peer++; 6481 6482 arsta->link_id = link_id; 6483 ahsta->links_map |= BIT(arsta->link_id); 6484 arsta->arvif = arvif; 6485 arsta->ahsta = ahsta; 6486 ahsta->ahvif = ahvif; 6487 6488 wiphy_work_init(&arsta->update_wk, ath12k_sta_rc_update_wk); 6489 6490 rcu_assign_pointer(ahsta->link[link_id], arsta); 6491 6492 return 0; 6493 } 6494 6495 static void ath12k_mac_ml_station_remove(struct ath12k_vif *ahvif, 6496 struct ath12k_sta *ahsta) 6497 { 6498 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(ahsta); 6499 struct ath12k_hw *ah = ahvif->ah; 6500 struct ath12k_link_vif *arvif; 6501 struct ath12k_link_sta *arsta; 6502 unsigned long links; 6503 struct ath12k *ar; 6504 u8 link_id; 6505 6506 lockdep_assert_wiphy(ah->hw->wiphy); 6507 6508 ath12k_peer_mlo_link_peers_delete(ahvif, ahsta); 6509 6510 /* validate link station removal and clear arsta links */ 6511 links = ahsta->links_map; 6512 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) { 6513 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]); 6514 arsta = wiphy_dereference(ah->hw->wiphy, ahsta->link[link_id]); 6515 if (!arvif || !arsta) 6516 continue; 6517 6518 ar = arvif->ar; 6519 6520 ath12k_mac_station_post_remove(ar, arvif, arsta); 6521 6522 ath12k_mac_free_unassign_link_sta(ah, ahsta, link_id); 6523 } 6524 6525 ath12k_peer_ml_delete(ah, sta); 6526 } 6527 6528 static int ath12k_mac_handle_link_sta_state(struct ieee80211_hw *hw, 6529 struct ath12k_link_vif *arvif, 6530 struct ath12k_link_sta *arsta, 6531 enum ieee80211_sta_state old_state, 6532 enum ieee80211_sta_state new_state) 6533 { 6534 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 6535 struct ieee80211_bss_conf *link_conf; 6536 struct ath12k *ar = arvif->ar; 6537 struct ath12k_reg_info *reg_info; 6538 struct ath12k_base *ab = ar->ab; 6539 int ret = 0; 6540 6541 lockdep_assert_wiphy(hw->wiphy); 6542 6543 ath12k_dbg(ab, ATH12K_DBG_MAC, "mac handle link %u sta %pM state %d -> %d\n", 6544 arsta->link_id, arsta->addr, old_state, new_state); 6545 6546 /* IEEE80211_STA_NONE -> IEEE80211_STA_NOTEXIST: Remove the station 6547 * from driver 6548 */ 6549 if ((old_state == IEEE80211_STA_NONE && 6550 new_state == IEEE80211_STA_NOTEXIST)) { 6551 ret = ath12k_mac_station_remove(ar, arvif, arsta); 6552 if (ret) { 6553 ath12k_warn(ab, "Failed to remove station: %pM for VDEV: %d\n", 6554 arsta->addr, arvif->vdev_id); 6555 goto exit; 6556 } 6557 } 6558 6559 /* IEEE80211_STA_NOTEXIST -> IEEE80211_STA_NONE: Add new station to driver */ 6560 if (old_state == IEEE80211_STA_NOTEXIST && 6561 new_state == IEEE80211_STA_NONE) { 6562 ret = ath12k_mac_station_add(ar, arvif, arsta); 6563 if (ret) 6564 ath12k_warn(ab, "Failed to add station: %pM for VDEV: %d\n", 6565 arsta->addr, arvif->vdev_id); 6566 6567 /* IEEE80211_STA_AUTH -> IEEE80211_STA_ASSOC: Send station assoc command for 6568 * peer associated to AP/Mesh/ADHOC vif type. 6569 */ 6570 } else if (old_state == IEEE80211_STA_AUTH && 6571 new_state == IEEE80211_STA_ASSOC && 6572 (vif->type == NL80211_IFTYPE_AP || 6573 vif->type == NL80211_IFTYPE_MESH_POINT || 6574 vif->type == NL80211_IFTYPE_ADHOC)) { 6575 ret = ath12k_mac_station_assoc(ar, arvif, arsta, false); 6576 if (ret) 6577 ath12k_warn(ab, "Failed to associate station: %pM\n", 6578 arsta->addr); 6579 6580 /* IEEE80211_STA_ASSOC -> IEEE80211_STA_AUTHORIZED: set peer status as 6581 * authorized 6582 */ 6583 } else if (old_state == IEEE80211_STA_ASSOC && 6584 new_state == IEEE80211_STA_AUTHORIZED) { 6585 ret = ath12k_mac_station_authorize(ar, arvif, arsta); 6586 if (ret) { 6587 ath12k_warn(ab, "Failed to authorize station: %pM\n", 6588 arsta->addr); 6589 goto exit; 6590 } 6591 6592 if (ath12k_wmi_supports_6ghz_cc_ext(ar) && 6593 arvif->ahvif->vdev_type == WMI_VDEV_TYPE_STA) { 6594 link_conf = ath12k_mac_get_link_bss_conf(arvif); 6595 reg_info = ab->reg_info[ar->pdev_idx]; 6596 ath12k_dbg(ab, ATH12K_DBG_MAC, "connection done, update reg rules\n"); 6597 ath12k_hw_to_ah(hw)->regd_updated = false; 6598 ath12k_reg_handle_chan_list(ab, reg_info, arvif->ahvif->vdev_type, 6599 link_conf->power_type); 6600 } 6601 6602 /* IEEE80211_STA_AUTHORIZED -> IEEE80211_STA_ASSOC: station may be in removal, 6603 * deauthorize it. 6604 */ 6605 } else if (old_state == IEEE80211_STA_AUTHORIZED && 6606 new_state == IEEE80211_STA_ASSOC) { 6607 ath12k_mac_station_unauthorize(ar, arvif, arsta); 6608 6609 /* IEEE80211_STA_ASSOC -> IEEE80211_STA_AUTH: disassoc peer connected to 6610 * AP/mesh/ADHOC vif type. 6611 */ 6612 } else if (old_state == IEEE80211_STA_ASSOC && 6613 new_state == IEEE80211_STA_AUTH && 6614 (vif->type == NL80211_IFTYPE_AP || 6615 vif->type == NL80211_IFTYPE_MESH_POINT || 6616 vif->type == NL80211_IFTYPE_ADHOC)) { 6617 ret = ath12k_mac_station_disassoc(ar, arvif, arsta); 6618 if (ret) 6619 ath12k_warn(ab, "Failed to disassociate station: %pM\n", 6620 arsta->addr); 6621 } 6622 6623 exit: 6624 return ret; 6625 } 6626 6627 static bool ath12k_mac_is_freq_on_mac(struct ath12k_hw_mode_freq_range_arg *freq_range, 6628 u32 freq, u8 mac_id) 6629 { 6630 return (freq >= freq_range[mac_id].low_2ghz_freq && 6631 freq <= freq_range[mac_id].high_2ghz_freq) || 6632 (freq >= freq_range[mac_id].low_5ghz_freq && 6633 freq <= freq_range[mac_id].high_5ghz_freq); 6634 } 6635 6636 static bool 6637 ath12k_mac_2_freq_same_mac_in_freq_range(struct ath12k_base *ab, 6638 struct ath12k_hw_mode_freq_range_arg *freq_range, 6639 u32 freq_link1, u32 freq_link2) 6640 { 6641 u8 i; 6642 6643 for (i = 0; i < MAX_RADIOS; i++) { 6644 if (ath12k_mac_is_freq_on_mac(freq_range, freq_link1, i) && 6645 ath12k_mac_is_freq_on_mac(freq_range, freq_link2, i)) 6646 return true; 6647 } 6648 6649 return false; 6650 } 6651 6652 static bool ath12k_mac_is_hw_dbs_capable(struct ath12k_base *ab) 6653 { 6654 return test_bit(WMI_TLV_SERVICE_DUAL_BAND_SIMULTANEOUS_SUPPORT, 6655 ab->wmi_ab.svc_map) && 6656 ab->wmi_ab.hw_mode_info.support_dbs; 6657 } 6658 6659 static bool ath12k_mac_2_freq_same_mac_in_dbs(struct ath12k_base *ab, 6660 u32 freq_link1, u32 freq_link2) 6661 { 6662 struct ath12k_hw_mode_freq_range_arg *freq_range; 6663 6664 if (!ath12k_mac_is_hw_dbs_capable(ab)) 6665 return true; 6666 6667 freq_range = ab->wmi_ab.hw_mode_info.freq_range_caps[ATH12K_HW_MODE_DBS]; 6668 return ath12k_mac_2_freq_same_mac_in_freq_range(ab, freq_range, 6669 freq_link1, freq_link2); 6670 } 6671 6672 static bool ath12k_mac_is_hw_sbs_capable(struct ath12k_base *ab) 6673 { 6674 return test_bit(WMI_TLV_SERVICE_DUAL_BAND_SIMULTANEOUS_SUPPORT, 6675 ab->wmi_ab.svc_map) && 6676 ab->wmi_ab.hw_mode_info.support_sbs; 6677 } 6678 6679 static bool ath12k_mac_2_freq_same_mac_in_sbs(struct ath12k_base *ab, 6680 u32 freq_link1, u32 freq_link2) 6681 { 6682 struct ath12k_hw_mode_info *info = &ab->wmi_ab.hw_mode_info; 6683 struct ath12k_hw_mode_freq_range_arg *sbs_uppr_share; 6684 struct ath12k_hw_mode_freq_range_arg *sbs_low_share; 6685 struct ath12k_hw_mode_freq_range_arg *sbs_range; 6686 6687 if (!ath12k_mac_is_hw_sbs_capable(ab)) 6688 return true; 6689 6690 if (ab->wmi_ab.sbs_lower_band_end_freq) { 6691 sbs_uppr_share = info->freq_range_caps[ATH12K_HW_MODE_SBS_UPPER_SHARE]; 6692 sbs_low_share = info->freq_range_caps[ATH12K_HW_MODE_SBS_LOWER_SHARE]; 6693 6694 return ath12k_mac_2_freq_same_mac_in_freq_range(ab, sbs_low_share, 6695 freq_link1, freq_link2) || 6696 ath12k_mac_2_freq_same_mac_in_freq_range(ab, sbs_uppr_share, 6697 freq_link1, freq_link2); 6698 } 6699 6700 sbs_range = info->freq_range_caps[ATH12K_HW_MODE_SBS]; 6701 return ath12k_mac_2_freq_same_mac_in_freq_range(ab, sbs_range, 6702 freq_link1, freq_link2); 6703 } 6704 6705 static bool ath12k_mac_freqs_on_same_mac(struct ath12k_base *ab, 6706 u32 freq_link1, u32 freq_link2) 6707 { 6708 return ath12k_mac_2_freq_same_mac_in_dbs(ab, freq_link1, freq_link2) && 6709 ath12k_mac_2_freq_same_mac_in_sbs(ab, freq_link1, freq_link2); 6710 } 6711 6712 static int ath12k_mac_mlo_sta_set_link_active(struct ath12k_base *ab, 6713 enum wmi_mlo_link_force_reason reason, 6714 enum wmi_mlo_link_force_mode mode, 6715 u8 *mlo_vdev_id_lst, 6716 u8 num_mlo_vdev, 6717 u8 *mlo_inactive_vdev_lst, 6718 u8 num_mlo_inactive_vdev) 6719 { 6720 struct wmi_mlo_link_set_active_arg param = {}; 6721 u32 entry_idx, entry_offset, vdev_idx; 6722 u8 vdev_id; 6723 6724 param.reason = reason; 6725 param.force_mode = mode; 6726 6727 for (vdev_idx = 0; vdev_idx < num_mlo_vdev; vdev_idx++) { 6728 vdev_id = mlo_vdev_id_lst[vdev_idx]; 6729 entry_idx = vdev_id / 32; 6730 entry_offset = vdev_id % 32; 6731 if (entry_idx >= WMI_MLO_LINK_NUM_SZ) { 6732 ath12k_warn(ab, "Invalid entry_idx %d num_mlo_vdev %d vdev %d", 6733 entry_idx, num_mlo_vdev, vdev_id); 6734 return -EINVAL; 6735 } 6736 param.vdev_bitmap[entry_idx] |= 1 << entry_offset; 6737 /* update entry number if entry index changed */ 6738 if (param.num_vdev_bitmap < entry_idx + 1) 6739 param.num_vdev_bitmap = entry_idx + 1; 6740 } 6741 6742 ath12k_dbg(ab, ATH12K_DBG_MAC, 6743 "num_vdev_bitmap %d vdev_bitmap[0] = 0x%x, vdev_bitmap[1] = 0x%x", 6744 param.num_vdev_bitmap, param.vdev_bitmap[0], param.vdev_bitmap[1]); 6745 6746 if (mode == WMI_MLO_LINK_FORCE_MODE_ACTIVE_INACTIVE) { 6747 for (vdev_idx = 0; vdev_idx < num_mlo_inactive_vdev; vdev_idx++) { 6748 vdev_id = mlo_inactive_vdev_lst[vdev_idx]; 6749 entry_idx = vdev_id / 32; 6750 entry_offset = vdev_id % 32; 6751 if (entry_idx >= WMI_MLO_LINK_NUM_SZ) { 6752 ath12k_warn(ab, "Invalid entry_idx %d num_mlo_vdev %d vdev %d", 6753 entry_idx, num_mlo_inactive_vdev, vdev_id); 6754 return -EINVAL; 6755 } 6756 param.inactive_vdev_bitmap[entry_idx] |= 1 << entry_offset; 6757 /* update entry number if entry index changed */ 6758 if (param.num_inactive_vdev_bitmap < entry_idx + 1) 6759 param.num_inactive_vdev_bitmap = entry_idx + 1; 6760 } 6761 6762 ath12k_dbg(ab, ATH12K_DBG_MAC, 6763 "num_vdev_bitmap %d inactive_vdev_bitmap[0] = 0x%x, inactive_vdev_bitmap[1] = 0x%x", 6764 param.num_inactive_vdev_bitmap, 6765 param.inactive_vdev_bitmap[0], 6766 param.inactive_vdev_bitmap[1]); 6767 } 6768 6769 if (mode == WMI_MLO_LINK_FORCE_MODE_ACTIVE_LINK_NUM || 6770 mode == WMI_MLO_LINK_FORCE_MODE_INACTIVE_LINK_NUM) { 6771 param.num_link_entry = 1; 6772 param.link_num[0].num_of_link = num_mlo_vdev - 1; 6773 } 6774 6775 return ath12k_wmi_send_mlo_link_set_active_cmd(ab, ¶m); 6776 } 6777 6778 static int ath12k_mac_mlo_sta_update_link_active(struct ath12k_base *ab, 6779 struct ieee80211_hw *hw, 6780 struct ath12k_vif *ahvif) 6781 { 6782 u8 mlo_vdev_id_lst[IEEE80211_MLD_MAX_NUM_LINKS] = {}; 6783 u32 mlo_freq_list[IEEE80211_MLD_MAX_NUM_LINKS] = {}; 6784 unsigned long links = ahvif->links_map; 6785 enum wmi_mlo_link_force_reason reason; 6786 struct ieee80211_chanctx_conf *conf; 6787 enum wmi_mlo_link_force_mode mode; 6788 struct ieee80211_bss_conf *info; 6789 struct ath12k_link_vif *arvif; 6790 u8 num_mlo_vdev = 0; 6791 u8 link_id; 6792 6793 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) { 6794 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 6795 /* make sure vdev is created on this device */ 6796 if (!arvif || !arvif->is_created || arvif->ar->ab != ab) 6797 continue; 6798 6799 info = ath12k_mac_get_link_bss_conf(arvif); 6800 conf = wiphy_dereference(hw->wiphy, info->chanctx_conf); 6801 mlo_freq_list[num_mlo_vdev] = conf->def.chan->center_freq; 6802 6803 mlo_vdev_id_lst[num_mlo_vdev] = arvif->vdev_id; 6804 num_mlo_vdev++; 6805 } 6806 6807 /* It is not allowed to activate more links than a single device 6808 * supported. Something goes wrong if we reach here. 6809 */ 6810 if (num_mlo_vdev > ATH12K_NUM_MAX_ACTIVE_LINKS_PER_DEVICE) { 6811 WARN_ON_ONCE(1); 6812 return -EINVAL; 6813 } 6814 6815 /* if 2 links are established and both link channels fall on the 6816 * same hardware MAC, send command to firmware to deactivate one 6817 * of them. 6818 */ 6819 if (num_mlo_vdev == 2 && 6820 ath12k_mac_freqs_on_same_mac(ab, mlo_freq_list[0], 6821 mlo_freq_list[1])) { 6822 mode = WMI_MLO_LINK_FORCE_MODE_INACTIVE_LINK_NUM; 6823 reason = WMI_MLO_LINK_FORCE_REASON_NEW_CONNECT; 6824 return ath12k_mac_mlo_sta_set_link_active(ab, reason, mode, 6825 mlo_vdev_id_lst, num_mlo_vdev, 6826 NULL, 0); 6827 } 6828 6829 return 0; 6830 } 6831 6832 static bool ath12k_mac_are_sbs_chan(struct ath12k_base *ab, u32 freq_1, u32 freq_2) 6833 { 6834 if (!ath12k_mac_is_hw_sbs_capable(ab)) 6835 return false; 6836 6837 if (ath12k_is_2ghz_channel_freq(freq_1) || 6838 ath12k_is_2ghz_channel_freq(freq_2)) 6839 return false; 6840 6841 return !ath12k_mac_2_freq_same_mac_in_sbs(ab, freq_1, freq_2); 6842 } 6843 6844 static bool ath12k_mac_are_dbs_chan(struct ath12k_base *ab, u32 freq_1, u32 freq_2) 6845 { 6846 if (!ath12k_mac_is_hw_dbs_capable(ab)) 6847 return false; 6848 6849 return !ath12k_mac_2_freq_same_mac_in_dbs(ab, freq_1, freq_2); 6850 } 6851 6852 static int ath12k_mac_select_links(struct ath12k_base *ab, 6853 struct ieee80211_vif *vif, 6854 struct ieee80211_hw *hw, 6855 u16 *selected_links) 6856 { 6857 unsigned long useful_links = ieee80211_vif_usable_links(vif); 6858 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 6859 u8 num_useful_links = hweight_long(useful_links); 6860 struct ieee80211_chanctx_conf *chanctx; 6861 struct ath12k_link_vif *assoc_arvif; 6862 u32 assoc_link_freq, partner_freq; 6863 u16 sbs_links = 0, dbs_links = 0; 6864 struct ieee80211_bss_conf *info; 6865 struct ieee80211_channel *chan; 6866 struct ieee80211_sta *sta; 6867 struct ath12k_sta *ahsta; 6868 u8 link_id; 6869 6870 /* activate all useful links if less than max supported */ 6871 if (num_useful_links <= ATH12K_NUM_MAX_ACTIVE_LINKS_PER_DEVICE) { 6872 *selected_links = useful_links; 6873 return 0; 6874 } 6875 6876 /* only in station mode we can get here, so it's safe 6877 * to use ap_addr 6878 */ 6879 rcu_read_lock(); 6880 sta = ieee80211_find_sta(vif, vif->cfg.ap_addr); 6881 if (!sta) { 6882 rcu_read_unlock(); 6883 ath12k_warn(ab, "failed to find sta with addr %pM\n", vif->cfg.ap_addr); 6884 return -EINVAL; 6885 } 6886 6887 ahsta = ath12k_sta_to_ahsta(sta); 6888 assoc_arvif = wiphy_dereference(hw->wiphy, ahvif->link[ahsta->assoc_link_id]); 6889 info = ath12k_mac_get_link_bss_conf(assoc_arvif); 6890 chanctx = rcu_dereference(info->chanctx_conf); 6891 assoc_link_freq = chanctx->def.chan->center_freq; 6892 rcu_read_unlock(); 6893 ath12k_dbg(ab, ATH12K_DBG_MAC, "assoc link %u freq %u\n", 6894 assoc_arvif->link_id, assoc_link_freq); 6895 6896 /* assoc link is already activated and has to be kept active, 6897 * only need to select a partner link from others. 6898 */ 6899 useful_links &= ~BIT(assoc_arvif->link_id); 6900 for_each_set_bit(link_id, &useful_links, IEEE80211_MLD_MAX_NUM_LINKS) { 6901 info = wiphy_dereference(hw->wiphy, vif->link_conf[link_id]); 6902 if (!info) { 6903 ath12k_warn(ab, "failed to get link info for link: %u\n", 6904 link_id); 6905 return -ENOLINK; 6906 } 6907 6908 chan = info->chanreq.oper.chan; 6909 if (!chan) { 6910 ath12k_warn(ab, "failed to get chan for link: %u\n", link_id); 6911 return -EINVAL; 6912 } 6913 6914 partner_freq = chan->center_freq; 6915 if (ath12k_mac_are_sbs_chan(ab, assoc_link_freq, partner_freq)) { 6916 sbs_links |= BIT(link_id); 6917 ath12k_dbg(ab, ATH12K_DBG_MAC, "new SBS link %u freq %u\n", 6918 link_id, partner_freq); 6919 continue; 6920 } 6921 6922 if (ath12k_mac_are_dbs_chan(ab, assoc_link_freq, partner_freq)) { 6923 dbs_links |= BIT(link_id); 6924 ath12k_dbg(ab, ATH12K_DBG_MAC, "new DBS link %u freq %u\n", 6925 link_id, partner_freq); 6926 continue; 6927 } 6928 6929 ath12k_dbg(ab, ATH12K_DBG_MAC, "non DBS/SBS link %u freq %u\n", 6930 link_id, partner_freq); 6931 } 6932 6933 /* choose the first candidate no matter how many is in the list */ 6934 if (sbs_links) 6935 link_id = __ffs(sbs_links); 6936 else if (dbs_links) 6937 link_id = __ffs(dbs_links); 6938 else 6939 link_id = ffs(useful_links) - 1; 6940 6941 ath12k_dbg(ab, ATH12K_DBG_MAC, "select partner link %u\n", link_id); 6942 6943 *selected_links = BIT(assoc_arvif->link_id) | BIT(link_id); 6944 6945 return 0; 6946 } 6947 6948 static int ath12k_mac_op_sta_state(struct ieee80211_hw *hw, 6949 struct ieee80211_vif *vif, 6950 struct ieee80211_sta *sta, 6951 enum ieee80211_sta_state old_state, 6952 enum ieee80211_sta_state new_state) 6953 { 6954 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 6955 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta); 6956 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 6957 struct ath12k_base *prev_ab = NULL, *ab; 6958 struct ath12k_link_vif *arvif; 6959 struct ath12k_link_sta *arsta; 6960 unsigned long valid_links; 6961 u16 selected_links = 0; 6962 u8 link_id = 0, i; 6963 struct ath12k *ar; 6964 int ret; 6965 6966 lockdep_assert_wiphy(hw->wiphy); 6967 6968 if (ieee80211_vif_is_mld(vif) && sta->valid_links) { 6969 WARN_ON(!sta->mlo && hweight16(sta->valid_links) != 1); 6970 link_id = ffs(sta->valid_links) - 1; 6971 } 6972 6973 /* IEEE80211_STA_NOTEXIST -> IEEE80211_STA_NONE: 6974 * New station add received. If this is a ML station then 6975 * ahsta->links_map will be zero and sta->valid_links will be 1. 6976 * Assign default link to the first link sta. 6977 */ 6978 if (old_state == IEEE80211_STA_NOTEXIST && 6979 new_state == IEEE80211_STA_NONE) { 6980 memset(ahsta, 0, sizeof(*ahsta)); 6981 6982 arsta = &ahsta->deflink; 6983 6984 /* ML sta */ 6985 if (sta->mlo && !ahsta->links_map && 6986 (hweight16(sta->valid_links) == 1)) { 6987 ret = ath12k_peer_ml_create(ah, sta); 6988 if (ret) { 6989 ath12k_hw_warn(ah, "unable to create ML peer for sta %pM", 6990 sta->addr); 6991 goto exit; 6992 } 6993 } 6994 6995 ret = ath12k_mac_assign_link_sta(ah, ahsta, arsta, ahvif, 6996 link_id); 6997 if (ret) { 6998 ath12k_hw_warn(ah, "unable assign link %d for sta %pM", 6999 link_id, sta->addr); 7000 goto exit; 7001 } 7002 7003 /* above arsta will get memset, hence do this after assign 7004 * link sta 7005 */ 7006 if (sta->mlo) { 7007 /* For station mode, arvif->is_sta_assoc_link has been set when 7008 * vdev starts. Make sure the arvif/arsta pair have same setting 7009 */ 7010 if (vif->type == NL80211_IFTYPE_STATION && 7011 !arsta->arvif->is_sta_assoc_link) { 7012 ath12k_hw_warn(ah, "failed to verify assoc link setting with link id %u\n", 7013 link_id); 7014 ret = -EINVAL; 7015 goto exit; 7016 } 7017 7018 arsta->is_assoc_link = true; 7019 ahsta->assoc_link_id = link_id; 7020 } 7021 } 7022 7023 /* In the ML station scenario, activate all partner links once the 7024 * client is transitioning to the associated state. 7025 * 7026 * FIXME: Ideally, this activation should occur when the client 7027 * transitions to the authorized state. However, there are some 7028 * issues with handling this in the firmware. Until the firmware 7029 * can manage it properly, activate the links when the client is 7030 * about to move to the associated state. 7031 */ 7032 if (ieee80211_vif_is_mld(vif) && vif->type == NL80211_IFTYPE_STATION && 7033 old_state == IEEE80211_STA_AUTH && new_state == IEEE80211_STA_ASSOC) { 7034 /* TODO: for now only do link selection for single device 7035 * MLO case. Other cases would be handled in the future. 7036 */ 7037 ab = ah->radio[0].ab; 7038 if (ab->ag->num_devices == 1) { 7039 ret = ath12k_mac_select_links(ab, vif, hw, &selected_links); 7040 if (ret) { 7041 ath12k_warn(ab, 7042 "failed to get selected links: %d\n", ret); 7043 goto exit; 7044 } 7045 } else { 7046 selected_links = ieee80211_vif_usable_links(vif); 7047 } 7048 7049 ieee80211_set_active_links(vif, selected_links); 7050 } 7051 7052 /* Handle all the other state transitions in generic way */ 7053 valid_links = ahsta->links_map; 7054 for_each_set_bit(link_id, &valid_links, IEEE80211_MLD_MAX_NUM_LINKS) { 7055 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 7056 arsta = wiphy_dereference(hw->wiphy, ahsta->link[link_id]); 7057 /* some assumptions went wrong! */ 7058 if (WARN_ON(!arvif || !arsta)) 7059 continue; 7060 7061 /* vdev might be in deleted */ 7062 if (WARN_ON(!arvif->ar)) 7063 continue; 7064 7065 ret = ath12k_mac_handle_link_sta_state(hw, arvif, arsta, 7066 old_state, new_state); 7067 if (ret) { 7068 ath12k_hw_warn(ah, "unable to move link sta %d of sta %pM from state %d to %d", 7069 link_id, arsta->addr, old_state, new_state); 7070 goto exit; 7071 } 7072 } 7073 7074 if (ieee80211_vif_is_mld(vif) && vif->type == NL80211_IFTYPE_STATION && 7075 old_state == IEEE80211_STA_ASSOC && new_state == IEEE80211_STA_AUTHORIZED) { 7076 for_each_ar(ah, ar, i) { 7077 ab = ar->ab; 7078 if (prev_ab == ab) 7079 continue; 7080 7081 ret = ath12k_mac_mlo_sta_update_link_active(ab, hw, ahvif); 7082 if (ret) { 7083 ath12k_warn(ab, 7084 "failed to update link active state on connect %d\n", 7085 ret); 7086 goto exit; 7087 } 7088 7089 prev_ab = ab; 7090 } 7091 } 7092 /* IEEE80211_STA_NONE -> IEEE80211_STA_NOTEXIST: 7093 * Remove the station from driver (handle ML sta here since that 7094 * needs special handling. Normal sta will be handled in generic 7095 * handler below 7096 */ 7097 if (old_state == IEEE80211_STA_NONE && 7098 new_state == IEEE80211_STA_NOTEXIST && sta->mlo) 7099 ath12k_mac_ml_station_remove(ahvif, ahsta); 7100 7101 ret = 0; 7102 7103 exit: 7104 /* update the state if everything went well */ 7105 if (!ret) 7106 ahsta->state = new_state; 7107 7108 return ret; 7109 } 7110 7111 static int ath12k_mac_op_sta_set_txpwr(struct ieee80211_hw *hw, 7112 struct ieee80211_vif *vif, 7113 struct ieee80211_sta *sta) 7114 { 7115 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta); 7116 struct ath12k *ar; 7117 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 7118 struct ath12k_link_vif *arvif; 7119 struct ath12k_link_sta *arsta; 7120 u8 link_id; 7121 int ret; 7122 s16 txpwr; 7123 7124 lockdep_assert_wiphy(hw->wiphy); 7125 7126 /* TODO: use link id from mac80211 once that's implemented */ 7127 link_id = 0; 7128 7129 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 7130 arsta = wiphy_dereference(hw->wiphy, ahsta->link[link_id]); 7131 7132 if (sta->deflink.txpwr.type == NL80211_TX_POWER_AUTOMATIC) { 7133 txpwr = 0; 7134 } else { 7135 txpwr = sta->deflink.txpwr.power; 7136 if (!txpwr) { 7137 ret = -EINVAL; 7138 goto out; 7139 } 7140 } 7141 7142 if (txpwr > ATH12K_TX_POWER_MAX_VAL || txpwr < ATH12K_TX_POWER_MIN_VAL) { 7143 ret = -EINVAL; 7144 goto out; 7145 } 7146 7147 ar = arvif->ar; 7148 7149 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, arvif->vdev_id, 7150 WMI_PEER_USE_FIXED_PWR, txpwr); 7151 if (ret) { 7152 ath12k_warn(ar->ab, "failed to set tx power for station ret: %d\n", 7153 ret); 7154 goto out; 7155 } 7156 7157 out: 7158 return ret; 7159 } 7160 7161 static void ath12k_mac_op_link_sta_rc_update(struct ieee80211_hw *hw, 7162 struct ieee80211_vif *vif, 7163 struct ieee80211_link_sta *link_sta, 7164 u32 changed) 7165 { 7166 struct ieee80211_sta *sta = link_sta->sta; 7167 struct ath12k *ar; 7168 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta); 7169 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 7170 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 7171 struct ath12k_link_sta *arsta; 7172 struct ath12k_link_vif *arvif; 7173 struct ath12k_peer *peer; 7174 u32 bw, smps; 7175 7176 rcu_read_lock(); 7177 arvif = rcu_dereference(ahvif->link[link_sta->link_id]); 7178 if (!arvif) { 7179 ath12k_hw_warn(ah, "mac sta rc update failed to fetch link vif on link id %u for peer %pM\n", 7180 link_sta->link_id, sta->addr); 7181 rcu_read_unlock(); 7182 return; 7183 } 7184 7185 ar = arvif->ar; 7186 7187 arsta = rcu_dereference(ahsta->link[link_sta->link_id]); 7188 if (!arsta) { 7189 rcu_read_unlock(); 7190 ath12k_warn(ar->ab, "mac sta rc update failed to fetch link sta on link id %u for peer %pM\n", 7191 link_sta->link_id, sta->addr); 7192 return; 7193 } 7194 spin_lock_bh(&ar->ab->base_lock); 7195 7196 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr); 7197 if (!peer) { 7198 spin_unlock_bh(&ar->ab->base_lock); 7199 rcu_read_unlock(); 7200 ath12k_warn(ar->ab, "mac sta rc update failed to find peer %pM on vdev %i\n", 7201 arsta->addr, arvif->vdev_id); 7202 return; 7203 } 7204 7205 spin_unlock_bh(&ar->ab->base_lock); 7206 7207 if (arsta->link_id >= IEEE80211_MLD_MAX_NUM_LINKS) { 7208 rcu_read_unlock(); 7209 return; 7210 } 7211 7212 link_sta = rcu_dereference(sta->link[arsta->link_id]); 7213 if (!link_sta) { 7214 rcu_read_unlock(); 7215 ath12k_warn(ar->ab, "unable to access link sta in rc update for sta %pM link %u\n", 7216 sta->addr, arsta->link_id); 7217 return; 7218 } 7219 7220 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 7221 "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n", 7222 arsta->addr, changed, link_sta->bandwidth, link_sta->rx_nss, 7223 link_sta->smps_mode); 7224 7225 spin_lock_bh(&ar->data_lock); 7226 7227 if (changed & IEEE80211_RC_BW_CHANGED) { 7228 bw = ath12k_mac_ieee80211_sta_bw_to_wmi(ar, link_sta); 7229 arsta->bw_prev = arsta->bw; 7230 arsta->bw = bw; 7231 } 7232 7233 if (changed & IEEE80211_RC_NSS_CHANGED) 7234 arsta->nss = link_sta->rx_nss; 7235 7236 if (changed & IEEE80211_RC_SMPS_CHANGED) { 7237 smps = WMI_PEER_SMPS_PS_NONE; 7238 7239 switch (link_sta->smps_mode) { 7240 case IEEE80211_SMPS_AUTOMATIC: 7241 case IEEE80211_SMPS_OFF: 7242 smps = WMI_PEER_SMPS_PS_NONE; 7243 break; 7244 case IEEE80211_SMPS_STATIC: 7245 smps = WMI_PEER_SMPS_STATIC; 7246 break; 7247 case IEEE80211_SMPS_DYNAMIC: 7248 smps = WMI_PEER_SMPS_DYNAMIC; 7249 break; 7250 default: 7251 ath12k_warn(ar->ab, "Invalid smps %d in sta rc update for %pM link %u\n", 7252 link_sta->smps_mode, arsta->addr, link_sta->link_id); 7253 smps = WMI_PEER_SMPS_PS_NONE; 7254 break; 7255 } 7256 7257 arsta->smps = smps; 7258 } 7259 7260 arsta->changed |= changed; 7261 7262 spin_unlock_bh(&ar->data_lock); 7263 7264 wiphy_work_queue(hw->wiphy, &arsta->update_wk); 7265 7266 rcu_read_unlock(); 7267 } 7268 7269 static struct ath12k_link_sta *ath12k_mac_alloc_assign_link_sta(struct ath12k_hw *ah, 7270 struct ath12k_sta *ahsta, 7271 struct ath12k_vif *ahvif, 7272 u8 link_id) 7273 { 7274 struct ath12k_link_sta *arsta; 7275 int ret; 7276 7277 lockdep_assert_wiphy(ah->hw->wiphy); 7278 7279 if (link_id >= IEEE80211_MLD_MAX_NUM_LINKS) 7280 return NULL; 7281 7282 arsta = wiphy_dereference(ah->hw->wiphy, ahsta->link[link_id]); 7283 if (arsta) 7284 return NULL; 7285 7286 arsta = kmalloc(sizeof(*arsta), GFP_KERNEL); 7287 if (!arsta) 7288 return NULL; 7289 7290 ret = ath12k_mac_assign_link_sta(ah, ahsta, arsta, ahvif, link_id); 7291 if (ret) { 7292 kfree(arsta); 7293 return NULL; 7294 } 7295 7296 return arsta; 7297 } 7298 7299 static int ath12k_mac_op_change_sta_links(struct ieee80211_hw *hw, 7300 struct ieee80211_vif *vif, 7301 struct ieee80211_sta *sta, 7302 u16 old_links, u16 new_links) 7303 { 7304 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 7305 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta); 7306 struct ath12k_hw *ah = hw->priv; 7307 struct ath12k_link_vif *arvif; 7308 struct ath12k_link_sta *arsta; 7309 unsigned long valid_links; 7310 struct ath12k *ar; 7311 u8 link_id; 7312 int ret; 7313 7314 lockdep_assert_wiphy(hw->wiphy); 7315 7316 if (!sta->valid_links) 7317 return -EINVAL; 7318 7319 /* Firmware does not support removal of one of link stas. All sta 7320 * would be removed during ML STA delete in sta_state(), hence link 7321 * sta removal is not handled here. 7322 */ 7323 if (new_links < old_links) 7324 return 0; 7325 7326 if (ahsta->ml_peer_id == ATH12K_MLO_PEER_ID_INVALID) { 7327 ath12k_hw_warn(ah, "unable to add link for ml sta %pM", sta->addr); 7328 return -EINVAL; 7329 } 7330 7331 /* this op is expected only after initial sta insertion with default link */ 7332 if (WARN_ON(ahsta->links_map == 0)) 7333 return -EINVAL; 7334 7335 valid_links = new_links; 7336 for_each_set_bit(link_id, &valid_links, IEEE80211_MLD_MAX_NUM_LINKS) { 7337 if (ahsta->links_map & BIT(link_id)) 7338 continue; 7339 7340 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 7341 arsta = ath12k_mac_alloc_assign_link_sta(ah, ahsta, ahvif, link_id); 7342 7343 if (!arvif || !arsta) { 7344 ath12k_hw_warn(ah, "Failed to alloc/assign link sta"); 7345 continue; 7346 } 7347 7348 ar = arvif->ar; 7349 if (!ar) 7350 continue; 7351 7352 ret = ath12k_mac_station_add(ar, arvif, arsta); 7353 if (ret) { 7354 ath12k_warn(ar->ab, "Failed to add station: %pM for VDEV: %d\n", 7355 arsta->addr, arvif->vdev_id); 7356 ath12k_mac_free_unassign_link_sta(ah, ahsta, link_id); 7357 return ret; 7358 } 7359 } 7360 7361 return 0; 7362 } 7363 7364 static bool ath12k_mac_op_can_activate_links(struct ieee80211_hw *hw, 7365 struct ieee80211_vif *vif, 7366 u16 active_links) 7367 { 7368 /* TODO: Handle recovery case */ 7369 7370 return true; 7371 } 7372 7373 static int ath12k_conf_tx_uapsd(struct ath12k_link_vif *arvif, 7374 u16 ac, bool enable) 7375 { 7376 struct ath12k *ar = arvif->ar; 7377 struct ath12k_vif *ahvif = arvif->ahvif; 7378 u32 value; 7379 int ret; 7380 7381 if (ahvif->vdev_type != WMI_VDEV_TYPE_STA) 7382 return 0; 7383 7384 switch (ac) { 7385 case IEEE80211_AC_VO: 7386 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN | 7387 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN; 7388 break; 7389 case IEEE80211_AC_VI: 7390 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN | 7391 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN; 7392 break; 7393 case IEEE80211_AC_BE: 7394 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN | 7395 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN; 7396 break; 7397 case IEEE80211_AC_BK: 7398 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN | 7399 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN; 7400 break; 7401 } 7402 7403 if (enable) 7404 ahvif->u.sta.uapsd |= value; 7405 else 7406 ahvif->u.sta.uapsd &= ~value; 7407 7408 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, 7409 WMI_STA_PS_PARAM_UAPSD, 7410 ahvif->u.sta.uapsd); 7411 if (ret) { 7412 ath12k_warn(ar->ab, "could not set uapsd params %d\n", ret); 7413 goto exit; 7414 } 7415 7416 if (ahvif->u.sta.uapsd) 7417 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD; 7418 else 7419 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE; 7420 7421 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, 7422 WMI_STA_PS_PARAM_RX_WAKE_POLICY, 7423 value); 7424 if (ret) 7425 ath12k_warn(ar->ab, "could not set rx wake param %d\n", ret); 7426 7427 exit: 7428 return ret; 7429 } 7430 7431 static int ath12k_mac_conf_tx(struct ath12k_link_vif *arvif, u16 ac, 7432 const struct ieee80211_tx_queue_params *params) 7433 { 7434 struct wmi_wmm_params_arg *p = NULL; 7435 struct ath12k *ar = arvif->ar; 7436 struct ath12k_base *ab = ar->ab; 7437 int ret; 7438 7439 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 7440 7441 switch (ac) { 7442 case IEEE80211_AC_VO: 7443 p = &arvif->wmm_params.ac_vo; 7444 break; 7445 case IEEE80211_AC_VI: 7446 p = &arvif->wmm_params.ac_vi; 7447 break; 7448 case IEEE80211_AC_BE: 7449 p = &arvif->wmm_params.ac_be; 7450 break; 7451 case IEEE80211_AC_BK: 7452 p = &arvif->wmm_params.ac_bk; 7453 break; 7454 } 7455 7456 if (WARN_ON(!p)) { 7457 ret = -EINVAL; 7458 goto exit; 7459 } 7460 7461 p->cwmin = params->cw_min; 7462 p->cwmax = params->cw_max; 7463 p->aifs = params->aifs; 7464 p->txop = params->txop; 7465 7466 ret = ath12k_wmi_send_wmm_update_cmd(ar, arvif->vdev_id, 7467 &arvif->wmm_params); 7468 if (ret) { 7469 ath12k_warn(ab, "pdev idx %d failed to set wmm params: %d\n", 7470 ar->pdev_idx, ret); 7471 goto exit; 7472 } 7473 7474 ret = ath12k_conf_tx_uapsd(arvif, ac, params->uapsd); 7475 if (ret) 7476 ath12k_warn(ab, "pdev idx %d failed to set sta uapsd: %d\n", 7477 ar->pdev_idx, ret); 7478 7479 exit: 7480 return ret; 7481 } 7482 7483 static int ath12k_mac_op_conf_tx(struct ieee80211_hw *hw, 7484 struct ieee80211_vif *vif, 7485 unsigned int link_id, u16 ac, 7486 const struct ieee80211_tx_queue_params *params) 7487 { 7488 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 7489 struct ath12k_link_vif *arvif; 7490 struct ath12k_vif_cache *cache; 7491 int ret; 7492 7493 lockdep_assert_wiphy(hw->wiphy); 7494 7495 if (link_id >= IEEE80211_MLD_MAX_NUM_LINKS) 7496 return -EINVAL; 7497 7498 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 7499 if (!arvif || !arvif->is_created) { 7500 cache = ath12k_ahvif_get_link_cache(ahvif, link_id); 7501 if (!cache) 7502 return -ENOSPC; 7503 7504 cache->tx_conf.changed = true; 7505 cache->tx_conf.ac = ac; 7506 cache->tx_conf.tx_queue_params = *params; 7507 7508 return 0; 7509 } 7510 7511 ret = ath12k_mac_conf_tx(arvif, ac, params); 7512 7513 return ret; 7514 } 7515 7516 static struct ieee80211_sta_ht_cap 7517 ath12k_create_ht_cap(struct ath12k *ar, u32 ar_ht_cap, u32 rate_cap_rx_chainmask) 7518 { 7519 int i; 7520 struct ieee80211_sta_ht_cap ht_cap = {}; 7521 u32 ar_vht_cap = ar->pdev->cap.vht_cap; 7522 7523 if (!(ar_ht_cap & WMI_HT_CAP_ENABLED)) 7524 return ht_cap; 7525 7526 ht_cap.ht_supported = 1; 7527 ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K; 7528 ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_NONE; 7529 ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40; 7530 ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40; 7531 ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT; 7532 7533 if (ar_ht_cap & WMI_HT_CAP_HT20_SGI) 7534 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20; 7535 7536 if (ar_ht_cap & WMI_HT_CAP_HT40_SGI) 7537 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40; 7538 7539 if (ar_ht_cap & WMI_HT_CAP_DYNAMIC_SMPS) { 7540 u32 smps; 7541 7542 smps = WLAN_HT_CAP_SM_PS_DYNAMIC; 7543 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT; 7544 7545 ht_cap.cap |= smps; 7546 } 7547 7548 if (ar_ht_cap & WMI_HT_CAP_TX_STBC) 7549 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC; 7550 7551 if (ar_ht_cap & WMI_HT_CAP_RX_STBC) { 7552 u32 stbc; 7553 7554 stbc = ar_ht_cap; 7555 stbc &= WMI_HT_CAP_RX_STBC; 7556 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT; 7557 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT; 7558 stbc &= IEEE80211_HT_CAP_RX_STBC; 7559 7560 ht_cap.cap |= stbc; 7561 } 7562 7563 if (ar_ht_cap & WMI_HT_CAP_RX_LDPC) 7564 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING; 7565 7566 if (ar_ht_cap & WMI_HT_CAP_L_SIG_TXOP_PROT) 7567 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT; 7568 7569 if (ar_vht_cap & WMI_VHT_CAP_MAX_MPDU_LEN_MASK) 7570 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU; 7571 7572 for (i = 0; i < ar->num_rx_chains; i++) { 7573 if (rate_cap_rx_chainmask & BIT(i)) 7574 ht_cap.mcs.rx_mask[i] = 0xFF; 7575 } 7576 7577 ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED; 7578 7579 return ht_cap; 7580 } 7581 7582 static int ath12k_mac_set_txbf_conf(struct ath12k_link_vif *arvif) 7583 { 7584 u32 value = 0; 7585 struct ath12k *ar = arvif->ar; 7586 struct ath12k_vif *ahvif = arvif->ahvif; 7587 int nsts; 7588 int sound_dim; 7589 u32 vht_cap = ar->pdev->cap.vht_cap; 7590 u32 vdev_param = WMI_VDEV_PARAM_TXBF; 7591 7592 if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)) { 7593 nsts = vht_cap & IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK; 7594 nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT; 7595 value |= SM(nsts, WMI_TXBF_STS_CAP_OFFSET); 7596 } 7597 7598 if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)) { 7599 sound_dim = vht_cap & 7600 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK; 7601 sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT; 7602 if (sound_dim > (ar->num_tx_chains - 1)) 7603 sound_dim = ar->num_tx_chains - 1; 7604 value |= SM(sound_dim, WMI_BF_SOUND_DIM_OFFSET); 7605 } 7606 7607 if (!value) 7608 return 0; 7609 7610 if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) { 7611 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER; 7612 7613 if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) && 7614 ahvif->vdev_type == WMI_VDEV_TYPE_AP) 7615 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFER; 7616 } 7617 7618 if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE) { 7619 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE; 7620 7621 if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE) && 7622 ahvif->vdev_type == WMI_VDEV_TYPE_STA) 7623 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE; 7624 } 7625 7626 return ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 7627 vdev_param, value); 7628 } 7629 7630 static void ath12k_set_vht_txbf_cap(struct ath12k *ar, u32 *vht_cap) 7631 { 7632 bool subfer, subfee; 7633 int sound_dim = 0; 7634 7635 subfer = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)); 7636 subfee = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)); 7637 7638 if (ar->num_tx_chains < 2) { 7639 *vht_cap &= ~(IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE); 7640 subfer = false; 7641 } 7642 7643 /* If SU Beaformer is not set, then disable MU Beamformer Capability */ 7644 if (!subfer) 7645 *vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE); 7646 7647 /* If SU Beaformee is not set, then disable MU Beamformee Capability */ 7648 if (!subfee) 7649 *vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE); 7650 7651 sound_dim = u32_get_bits(*vht_cap, 7652 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK); 7653 *vht_cap = u32_replace_bits(*vht_cap, 0, 7654 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK); 7655 7656 /* TODO: Need to check invalid STS and Sound_dim values set by FW? */ 7657 7658 /* Enable Sounding Dimension Field only if SU BF is enabled */ 7659 if (subfer) { 7660 if (sound_dim > (ar->num_tx_chains - 1)) 7661 sound_dim = ar->num_tx_chains - 1; 7662 7663 *vht_cap = u32_replace_bits(*vht_cap, sound_dim, 7664 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK); 7665 } 7666 7667 /* Use the STS advertised by FW unless SU Beamformee is not supported*/ 7668 if (!subfee) 7669 *vht_cap &= ~(IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK); 7670 } 7671 7672 static struct ieee80211_sta_vht_cap 7673 ath12k_create_vht_cap(struct ath12k *ar, u32 rate_cap_tx_chainmask, 7674 u32 rate_cap_rx_chainmask) 7675 { 7676 struct ieee80211_sta_vht_cap vht_cap = {}; 7677 u16 txmcs_map, rxmcs_map; 7678 int i; 7679 7680 vht_cap.vht_supported = 1; 7681 vht_cap.cap = ar->pdev->cap.vht_cap; 7682 7683 ath12k_set_vht_txbf_cap(ar, &vht_cap.cap); 7684 7685 /* 80P80 is not supported */ 7686 vht_cap.cap &= ~IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ; 7687 7688 rxmcs_map = 0; 7689 txmcs_map = 0; 7690 for (i = 0; i < 8; i++) { 7691 if (i < ar->num_tx_chains && rate_cap_tx_chainmask & BIT(i)) 7692 txmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2); 7693 else 7694 txmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2); 7695 7696 if (i < ar->num_rx_chains && rate_cap_rx_chainmask & BIT(i)) 7697 rxmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2); 7698 else 7699 rxmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2); 7700 } 7701 7702 if (rate_cap_tx_chainmask <= 1) 7703 vht_cap.cap &= ~IEEE80211_VHT_CAP_TXSTBC; 7704 7705 vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(rxmcs_map); 7706 vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(txmcs_map); 7707 7708 /* Check if the HW supports 1:1 NSS ratio and reset 7709 * EXT NSS BW Support field to 0 to indicate 1:1 ratio 7710 */ 7711 if (ar->pdev->cap.nss_ratio_info == WMI_NSS_RATIO_1_NSS) 7712 vht_cap.cap &= ~IEEE80211_VHT_CAP_EXT_NSS_BW_MASK; 7713 7714 return vht_cap; 7715 } 7716 7717 static void ath12k_mac_setup_ht_vht_cap(struct ath12k *ar, 7718 struct ath12k_pdev_cap *cap, 7719 u32 *ht_cap_info) 7720 { 7721 struct ieee80211_supported_band *band; 7722 u32 rate_cap_tx_chainmask; 7723 u32 rate_cap_rx_chainmask; 7724 u32 ht_cap; 7725 7726 rate_cap_tx_chainmask = ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift; 7727 rate_cap_rx_chainmask = ar->cfg_rx_chainmask >> cap->rx_chain_mask_shift; 7728 7729 if (cap->supported_bands & WMI_HOST_WLAN_2GHZ_CAP) { 7730 band = &ar->mac.sbands[NL80211_BAND_2GHZ]; 7731 ht_cap = cap->band[NL80211_BAND_2GHZ].ht_cap_info; 7732 if (ht_cap_info) 7733 *ht_cap_info = ht_cap; 7734 band->ht_cap = ath12k_create_ht_cap(ar, ht_cap, 7735 rate_cap_rx_chainmask); 7736 } 7737 7738 if (cap->supported_bands & WMI_HOST_WLAN_5GHZ_CAP && 7739 (ar->ab->hw_params->single_pdev_only || 7740 !ar->supports_6ghz)) { 7741 band = &ar->mac.sbands[NL80211_BAND_5GHZ]; 7742 ht_cap = cap->band[NL80211_BAND_5GHZ].ht_cap_info; 7743 if (ht_cap_info) 7744 *ht_cap_info = ht_cap; 7745 band->ht_cap = ath12k_create_ht_cap(ar, ht_cap, 7746 rate_cap_rx_chainmask); 7747 band->vht_cap = ath12k_create_vht_cap(ar, rate_cap_tx_chainmask, 7748 rate_cap_rx_chainmask); 7749 } 7750 } 7751 7752 static int ath12k_check_chain_mask(struct ath12k *ar, u32 ant, bool is_tx_ant) 7753 { 7754 /* TODO: Check the request chainmask against the supported 7755 * chainmask table which is advertised in extented_service_ready event 7756 */ 7757 7758 return 0; 7759 } 7760 7761 static void ath12k_gen_ppe_thresh(struct ath12k_wmi_ppe_threshold_arg *fw_ppet, 7762 u8 *he_ppet) 7763 { 7764 int nss, ru; 7765 u8 bit = 7; 7766 7767 he_ppet[0] = fw_ppet->numss_m1 & IEEE80211_PPE_THRES_NSS_MASK; 7768 he_ppet[0] |= (fw_ppet->ru_bit_mask << 7769 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS) & 7770 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK; 7771 for (nss = 0; nss <= fw_ppet->numss_m1; nss++) { 7772 for (ru = 0; ru < 4; ru++) { 7773 u8 val; 7774 int i; 7775 7776 if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0) 7777 continue; 7778 val = (fw_ppet->ppet16_ppet8_ru3_ru0[nss] >> (ru * 6)) & 7779 0x3f; 7780 val = ((val >> 3) & 0x7) | ((val & 0x7) << 3); 7781 for (i = 5; i >= 0; i--) { 7782 he_ppet[bit / 8] |= 7783 ((val >> i) & 0x1) << ((bit % 8)); 7784 bit++; 7785 } 7786 } 7787 } 7788 } 7789 7790 static void 7791 ath12k_mac_filter_he_cap_mesh(struct ieee80211_he_cap_elem *he_cap_elem) 7792 { 7793 u8 m; 7794 7795 m = IEEE80211_HE_MAC_CAP0_TWT_RES | 7796 IEEE80211_HE_MAC_CAP0_TWT_REQ; 7797 he_cap_elem->mac_cap_info[0] &= ~m; 7798 7799 m = IEEE80211_HE_MAC_CAP2_TRS | 7800 IEEE80211_HE_MAC_CAP2_BCAST_TWT | 7801 IEEE80211_HE_MAC_CAP2_MU_CASCADING; 7802 he_cap_elem->mac_cap_info[2] &= ~m; 7803 7804 m = IEEE80211_HE_MAC_CAP3_FLEX_TWT_SCHED | 7805 IEEE80211_HE_MAC_CAP2_BCAST_TWT | 7806 IEEE80211_HE_MAC_CAP2_MU_CASCADING; 7807 he_cap_elem->mac_cap_info[3] &= ~m; 7808 7809 m = IEEE80211_HE_MAC_CAP4_BSRP_BQRP_A_MPDU_AGG | 7810 IEEE80211_HE_MAC_CAP4_BQR; 7811 he_cap_elem->mac_cap_info[4] &= ~m; 7812 7813 m = IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECTIVE_TRANSMISSION | 7814 IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU | 7815 IEEE80211_HE_MAC_CAP5_PUNCTURED_SOUNDING | 7816 IEEE80211_HE_MAC_CAP5_HT_VHT_TRIG_FRAME_RX; 7817 he_cap_elem->mac_cap_info[5] &= ~m; 7818 7819 m = IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO | 7820 IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO; 7821 he_cap_elem->phy_cap_info[2] &= ~m; 7822 7823 m = IEEE80211_HE_PHY_CAP3_RX_PARTIAL_BW_SU_IN_20MHZ_MU | 7824 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK | 7825 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_MASK; 7826 he_cap_elem->phy_cap_info[3] &= ~m; 7827 7828 m = IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER; 7829 he_cap_elem->phy_cap_info[4] &= ~m; 7830 7831 m = IEEE80211_HE_PHY_CAP5_NG16_MU_FEEDBACK; 7832 he_cap_elem->phy_cap_info[5] &= ~m; 7833 7834 m = IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU | 7835 IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB | 7836 IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB | 7837 IEEE80211_HE_PHY_CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO; 7838 he_cap_elem->phy_cap_info[6] &= ~m; 7839 7840 m = IEEE80211_HE_PHY_CAP7_PSR_BASED_SR | 7841 IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP | 7842 IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ | 7843 IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ; 7844 he_cap_elem->phy_cap_info[7] &= ~m; 7845 7846 m = IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI | 7847 IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G | 7848 IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU | 7849 IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU; 7850 he_cap_elem->phy_cap_info[8] &= ~m; 7851 7852 m = IEEE80211_HE_PHY_CAP9_LONGER_THAN_16_SIGB_OFDM_SYM | 7853 IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK | 7854 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU | 7855 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU | 7856 IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_COMP_SIGB | 7857 IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_NON_COMP_SIGB; 7858 he_cap_elem->phy_cap_info[9] &= ~m; 7859 } 7860 7861 static __le16 ath12k_mac_setup_he_6ghz_cap(struct ath12k_pdev_cap *pcap, 7862 struct ath12k_band_cap *bcap) 7863 { 7864 u8 val; 7865 7866 bcap->he_6ghz_capa = IEEE80211_HT_MPDU_DENSITY_NONE; 7867 if (bcap->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) 7868 bcap->he_6ghz_capa |= 7869 u32_encode_bits(WLAN_HT_CAP_SM_PS_DYNAMIC, 7870 IEEE80211_HE_6GHZ_CAP_SM_PS); 7871 else 7872 bcap->he_6ghz_capa |= 7873 u32_encode_bits(WLAN_HT_CAP_SM_PS_DISABLED, 7874 IEEE80211_HE_6GHZ_CAP_SM_PS); 7875 val = u32_get_bits(pcap->vht_cap, 7876 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK); 7877 bcap->he_6ghz_capa |= 7878 u32_encode_bits(val, IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP); 7879 val = u32_get_bits(pcap->vht_cap, 7880 IEEE80211_VHT_CAP_MAX_MPDU_MASK); 7881 bcap->he_6ghz_capa |= 7882 u32_encode_bits(val, IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN); 7883 if (pcap->vht_cap & IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN) 7884 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS; 7885 if (pcap->vht_cap & IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN) 7886 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS; 7887 7888 return cpu_to_le16(bcap->he_6ghz_capa); 7889 } 7890 7891 static void ath12k_mac_set_hemcsmap(struct ath12k *ar, 7892 struct ath12k_pdev_cap *cap, 7893 struct ieee80211_sta_he_cap *he_cap) 7894 { 7895 struct ieee80211_he_mcs_nss_supp *mcs_nss = &he_cap->he_mcs_nss_supp; 7896 u8 maxtxnss_160 = ath12k_get_nss_160mhz(ar, ar->num_tx_chains); 7897 u8 maxrxnss_160 = ath12k_get_nss_160mhz(ar, ar->num_rx_chains); 7898 u16 txmcs_map_160 = 0, rxmcs_map_160 = 0; 7899 u16 txmcs_map = 0, rxmcs_map = 0; 7900 u32 i; 7901 7902 for (i = 0; i < 8; i++) { 7903 if (i < ar->num_tx_chains && 7904 (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i)) 7905 txmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2); 7906 else 7907 txmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2); 7908 7909 if (i < ar->num_rx_chains && 7910 (ar->cfg_rx_chainmask >> cap->tx_chain_mask_shift) & BIT(i)) 7911 rxmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2); 7912 else 7913 rxmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2); 7914 7915 if (i < maxtxnss_160 && 7916 (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i)) 7917 txmcs_map_160 |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2); 7918 else 7919 txmcs_map_160 |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2); 7920 7921 if (i < maxrxnss_160 && 7922 (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i)) 7923 rxmcs_map_160 |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2); 7924 else 7925 rxmcs_map_160 |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2); 7926 } 7927 7928 mcs_nss->rx_mcs_80 = cpu_to_le16(rxmcs_map & 0xffff); 7929 mcs_nss->tx_mcs_80 = cpu_to_le16(txmcs_map & 0xffff); 7930 mcs_nss->rx_mcs_160 = cpu_to_le16(rxmcs_map_160 & 0xffff); 7931 mcs_nss->tx_mcs_160 = cpu_to_le16(txmcs_map_160 & 0xffff); 7932 } 7933 7934 static void ath12k_mac_copy_he_cap(struct ath12k *ar, 7935 struct ath12k_band_cap *band_cap, 7936 int iftype, u8 num_tx_chains, 7937 struct ieee80211_sta_he_cap *he_cap) 7938 { 7939 struct ieee80211_he_cap_elem *he_cap_elem = &he_cap->he_cap_elem; 7940 7941 he_cap->has_he = true; 7942 memcpy(he_cap_elem->mac_cap_info, band_cap->he_cap_info, 7943 sizeof(he_cap_elem->mac_cap_info)); 7944 memcpy(he_cap_elem->phy_cap_info, band_cap->he_cap_phy_info, 7945 sizeof(he_cap_elem->phy_cap_info)); 7946 7947 he_cap_elem->mac_cap_info[1] &= 7948 IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_MASK; 7949 he_cap_elem->phy_cap_info[0] &= 7950 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G | 7951 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G | 7952 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G; 7953 /* 80PLUS80 is not supported */ 7954 he_cap_elem->phy_cap_info[0] &= 7955 ~IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G; 7956 he_cap_elem->phy_cap_info[5] &= 7957 ~IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK; 7958 he_cap_elem->phy_cap_info[5] |= num_tx_chains - 1; 7959 7960 switch (iftype) { 7961 case NL80211_IFTYPE_AP: 7962 he_cap_elem->mac_cap_info[2] &= 7963 ~IEEE80211_HE_MAC_CAP2_BCAST_TWT; 7964 he_cap_elem->phy_cap_info[3] &= 7965 ~IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK; 7966 he_cap_elem->phy_cap_info[9] |= 7967 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU; 7968 break; 7969 case NL80211_IFTYPE_STATION: 7970 he_cap_elem->mac_cap_info[0] &= ~IEEE80211_HE_MAC_CAP0_TWT_RES; 7971 he_cap_elem->mac_cap_info[0] |= IEEE80211_HE_MAC_CAP0_TWT_REQ; 7972 he_cap_elem->phy_cap_info[9] |= 7973 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU; 7974 break; 7975 case NL80211_IFTYPE_MESH_POINT: 7976 ath12k_mac_filter_he_cap_mesh(he_cap_elem); 7977 break; 7978 } 7979 7980 ath12k_mac_set_hemcsmap(ar, &ar->pdev->cap, he_cap); 7981 memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres)); 7982 if (he_cap_elem->phy_cap_info[6] & 7983 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) 7984 ath12k_gen_ppe_thresh(&band_cap->he_ppet, he_cap->ppe_thres); 7985 } 7986 7987 static void 7988 ath12k_mac_copy_eht_mcs_nss(struct ath12k_band_cap *band_cap, 7989 struct ieee80211_eht_mcs_nss_supp *mcs_nss, 7990 const struct ieee80211_he_cap_elem *he_cap, 7991 const struct ieee80211_eht_cap_elem_fixed *eht_cap) 7992 { 7993 if ((he_cap->phy_cap_info[0] & 7994 (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G | 7995 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G | 7996 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G | 7997 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)) == 0) 7998 memcpy(&mcs_nss->only_20mhz, &band_cap->eht_mcs_20_only, 7999 sizeof(struct ieee80211_eht_mcs_nss_supp_20mhz_only)); 8000 8001 if (he_cap->phy_cap_info[0] & 8002 (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G | 8003 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G)) 8004 memcpy(&mcs_nss->bw._80, &band_cap->eht_mcs_80, 8005 sizeof(struct ieee80211_eht_mcs_nss_supp_bw)); 8006 8007 if (he_cap->phy_cap_info[0] & 8008 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G) 8009 memcpy(&mcs_nss->bw._160, &band_cap->eht_mcs_160, 8010 sizeof(struct ieee80211_eht_mcs_nss_supp_bw)); 8011 8012 if (eht_cap->phy_cap_info[0] & IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ) 8013 memcpy(&mcs_nss->bw._320, &band_cap->eht_mcs_320, 8014 sizeof(struct ieee80211_eht_mcs_nss_supp_bw)); 8015 } 8016 8017 static void ath12k_mac_copy_eht_ppe_thresh(struct ath12k_wmi_ppe_threshold_arg *fw_ppet, 8018 struct ieee80211_sta_eht_cap *cap) 8019 { 8020 u16 bit = IEEE80211_EHT_PPE_THRES_INFO_HEADER_SIZE; 8021 u8 i, nss, ru, ppet_bit_len_per_ru = IEEE80211_EHT_PPE_THRES_INFO_PPET_SIZE * 2; 8022 8023 u8p_replace_bits(&cap->eht_ppe_thres[0], fw_ppet->numss_m1, 8024 IEEE80211_EHT_PPE_THRES_NSS_MASK); 8025 8026 u16p_replace_bits((u16 *)&cap->eht_ppe_thres[0], fw_ppet->ru_bit_mask, 8027 IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK); 8028 8029 for (nss = 0; nss <= fw_ppet->numss_m1; nss++) { 8030 for (ru = 0; 8031 ru < hweight16(IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK); 8032 ru++) { 8033 u32 val = 0; 8034 8035 if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0) 8036 continue; 8037 8038 u32p_replace_bits(&val, fw_ppet->ppet16_ppet8_ru3_ru0[nss] >> 8039 (ru * ppet_bit_len_per_ru), 8040 GENMASK(ppet_bit_len_per_ru - 1, 0)); 8041 8042 for (i = 0; i < ppet_bit_len_per_ru; i++) { 8043 cap->eht_ppe_thres[bit / 8] |= 8044 (((val >> i) & 0x1) << ((bit % 8))); 8045 bit++; 8046 } 8047 } 8048 } 8049 } 8050 8051 static void 8052 ath12k_mac_filter_eht_cap_mesh(struct ieee80211_eht_cap_elem_fixed 8053 *eht_cap_elem) 8054 { 8055 u8 m; 8056 8057 m = IEEE80211_EHT_MAC_CAP0_EPCS_PRIO_ACCESS; 8058 eht_cap_elem->mac_cap_info[0] &= ~m; 8059 8060 m = IEEE80211_EHT_PHY_CAP0_PARTIAL_BW_UL_MU_MIMO; 8061 eht_cap_elem->phy_cap_info[0] &= ~m; 8062 8063 m = IEEE80211_EHT_PHY_CAP3_NG_16_MU_FEEDBACK | 8064 IEEE80211_EHT_PHY_CAP3_CODEBOOK_7_5_MU_FDBK | 8065 IEEE80211_EHT_PHY_CAP3_TRIG_MU_BF_PART_BW_FDBK | 8066 IEEE80211_EHT_PHY_CAP3_TRIG_CQI_FDBK; 8067 eht_cap_elem->phy_cap_info[3] &= ~m; 8068 8069 m = IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO | 8070 IEEE80211_EHT_PHY_CAP4_PSR_SR_SUPP | 8071 IEEE80211_EHT_PHY_CAP4_POWER_BOOST_FACT_SUPP | 8072 IEEE80211_EHT_PHY_CAP4_EHT_MU_PPDU_4_EHT_LTF_08_GI; 8073 eht_cap_elem->phy_cap_info[4] &= ~m; 8074 8075 m = IEEE80211_EHT_PHY_CAP5_NON_TRIG_CQI_FEEDBACK | 8076 IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP | 8077 IEEE80211_EHT_PHY_CAP5_RX_LESS_242_TONE_RU_SUPP | 8078 IEEE80211_EHT_PHY_CAP5_MAX_NUM_SUPP_EHT_LTF_MASK; 8079 eht_cap_elem->phy_cap_info[5] &= ~m; 8080 8081 m = IEEE80211_EHT_PHY_CAP6_MAX_NUM_SUPP_EHT_LTF_MASK; 8082 eht_cap_elem->phy_cap_info[6] &= ~m; 8083 8084 m = IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ | 8085 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ | 8086 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ | 8087 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ | 8088 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ | 8089 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ; 8090 eht_cap_elem->phy_cap_info[7] &= ~m; 8091 } 8092 8093 static void ath12k_mac_copy_eht_cap(struct ath12k *ar, 8094 struct ath12k_band_cap *band_cap, 8095 struct ieee80211_he_cap_elem *he_cap_elem, 8096 int iftype, 8097 struct ieee80211_sta_eht_cap *eht_cap) 8098 { 8099 struct ieee80211_eht_cap_elem_fixed *eht_cap_elem = &eht_cap->eht_cap_elem; 8100 8101 memset(eht_cap, 0, sizeof(struct ieee80211_sta_eht_cap)); 8102 8103 if (!(test_bit(WMI_TLV_SERVICE_11BE, ar->ab->wmi_ab.svc_map)) || 8104 ath12k_acpi_get_disable_11be(ar->ab)) 8105 return; 8106 8107 eht_cap->has_eht = true; 8108 memcpy(eht_cap_elem->mac_cap_info, band_cap->eht_cap_mac_info, 8109 sizeof(eht_cap_elem->mac_cap_info)); 8110 memcpy(eht_cap_elem->phy_cap_info, band_cap->eht_cap_phy_info, 8111 sizeof(eht_cap_elem->phy_cap_info)); 8112 8113 switch (iftype) { 8114 case NL80211_IFTYPE_AP: 8115 eht_cap_elem->phy_cap_info[0] &= 8116 ~IEEE80211_EHT_PHY_CAP0_242_TONE_RU_GT20MHZ; 8117 eht_cap_elem->phy_cap_info[4] &= 8118 ~IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO; 8119 eht_cap_elem->phy_cap_info[5] &= 8120 ~IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP; 8121 break; 8122 case NL80211_IFTYPE_STATION: 8123 eht_cap_elem->phy_cap_info[7] &= 8124 ~(IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ | 8125 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ | 8126 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ); 8127 eht_cap_elem->phy_cap_info[7] &= 8128 ~(IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ | 8129 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ | 8130 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ); 8131 break; 8132 case NL80211_IFTYPE_MESH_POINT: 8133 ath12k_mac_filter_eht_cap_mesh(eht_cap_elem); 8134 break; 8135 default: 8136 break; 8137 } 8138 8139 ath12k_mac_copy_eht_mcs_nss(band_cap, &eht_cap->eht_mcs_nss_supp, 8140 he_cap_elem, eht_cap_elem); 8141 8142 if (eht_cap_elem->phy_cap_info[5] & 8143 IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT) 8144 ath12k_mac_copy_eht_ppe_thresh(&band_cap->eht_ppet, eht_cap); 8145 } 8146 8147 static int ath12k_mac_copy_sband_iftype_data(struct ath12k *ar, 8148 struct ath12k_pdev_cap *cap, 8149 struct ieee80211_sband_iftype_data *data, 8150 int band) 8151 { 8152 struct ath12k_band_cap *band_cap = &cap->band[band]; 8153 int i, idx = 0; 8154 8155 for (i = 0; i < NUM_NL80211_IFTYPES; i++) { 8156 struct ieee80211_sta_he_cap *he_cap = &data[idx].he_cap; 8157 8158 switch (i) { 8159 case NL80211_IFTYPE_STATION: 8160 case NL80211_IFTYPE_AP: 8161 case NL80211_IFTYPE_MESH_POINT: 8162 break; 8163 8164 default: 8165 continue; 8166 } 8167 8168 data[idx].types_mask = BIT(i); 8169 8170 ath12k_mac_copy_he_cap(ar, band_cap, i, ar->num_tx_chains, he_cap); 8171 if (band == NL80211_BAND_6GHZ) { 8172 data[idx].he_6ghz_capa.capa = 8173 ath12k_mac_setup_he_6ghz_cap(cap, band_cap); 8174 } 8175 ath12k_mac_copy_eht_cap(ar, band_cap, &he_cap->he_cap_elem, i, 8176 &data[idx].eht_cap); 8177 idx++; 8178 } 8179 8180 return idx; 8181 } 8182 8183 static void ath12k_mac_setup_sband_iftype_data(struct ath12k *ar, 8184 struct ath12k_pdev_cap *cap) 8185 { 8186 struct ieee80211_supported_band *sband; 8187 enum nl80211_band band; 8188 int count; 8189 8190 if (cap->supported_bands & WMI_HOST_WLAN_2GHZ_CAP) { 8191 band = NL80211_BAND_2GHZ; 8192 count = ath12k_mac_copy_sband_iftype_data(ar, cap, 8193 ar->mac.iftype[band], 8194 band); 8195 sband = &ar->mac.sbands[band]; 8196 _ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band], 8197 count); 8198 } 8199 8200 if (cap->supported_bands & WMI_HOST_WLAN_5GHZ_CAP) { 8201 band = NL80211_BAND_5GHZ; 8202 count = ath12k_mac_copy_sband_iftype_data(ar, cap, 8203 ar->mac.iftype[band], 8204 band); 8205 sband = &ar->mac.sbands[band]; 8206 _ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band], 8207 count); 8208 } 8209 8210 if (cap->supported_bands & WMI_HOST_WLAN_5GHZ_CAP && 8211 ar->supports_6ghz) { 8212 band = NL80211_BAND_6GHZ; 8213 count = ath12k_mac_copy_sband_iftype_data(ar, cap, 8214 ar->mac.iftype[band], 8215 band); 8216 sband = &ar->mac.sbands[band]; 8217 _ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band], 8218 count); 8219 } 8220 } 8221 8222 static int __ath12k_set_antenna(struct ath12k *ar, u32 tx_ant, u32 rx_ant) 8223 { 8224 struct ath12k_hw *ah = ath12k_ar_to_ah(ar); 8225 int ret; 8226 8227 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 8228 8229 if (ath12k_check_chain_mask(ar, tx_ant, true)) 8230 return -EINVAL; 8231 8232 if (ath12k_check_chain_mask(ar, rx_ant, false)) 8233 return -EINVAL; 8234 8235 /* Since we advertised the max cap of all radios combined during wiphy 8236 * registration, ensure we don't set the antenna config higher than the 8237 * limits 8238 */ 8239 tx_ant = min_t(u32, tx_ant, ar->pdev->cap.tx_chain_mask); 8240 rx_ant = min_t(u32, rx_ant, ar->pdev->cap.rx_chain_mask); 8241 8242 ar->cfg_tx_chainmask = tx_ant; 8243 ar->cfg_rx_chainmask = rx_ant; 8244 8245 if (ah->state != ATH12K_HW_STATE_ON && 8246 ah->state != ATH12K_HW_STATE_RESTARTED) 8247 return 0; 8248 8249 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_TX_CHAIN_MASK, 8250 tx_ant, ar->pdev->pdev_id); 8251 if (ret) { 8252 ath12k_warn(ar->ab, "failed to set tx-chainmask: %d, req 0x%x\n", 8253 ret, tx_ant); 8254 return ret; 8255 } 8256 8257 ar->num_tx_chains = hweight32(tx_ant); 8258 8259 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RX_CHAIN_MASK, 8260 rx_ant, ar->pdev->pdev_id); 8261 if (ret) { 8262 ath12k_warn(ar->ab, "failed to set rx-chainmask: %d, req 0x%x\n", 8263 ret, rx_ant); 8264 return ret; 8265 } 8266 8267 ar->num_rx_chains = hweight32(rx_ant); 8268 8269 /* Reload HT/VHT/HE capability */ 8270 ath12k_mac_setup_ht_vht_cap(ar, &ar->pdev->cap, NULL); 8271 ath12k_mac_setup_sband_iftype_data(ar, &ar->pdev->cap); 8272 8273 return 0; 8274 } 8275 8276 static void ath12k_mgmt_over_wmi_tx_drop(struct ath12k *ar, struct sk_buff *skb) 8277 { 8278 int num_mgmt; 8279 8280 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 8281 8282 ieee80211_free_txskb(ath12k_ar_to_hw(ar), skb); 8283 8284 num_mgmt = atomic_dec_if_positive(&ar->num_pending_mgmt_tx); 8285 8286 if (num_mgmt < 0) 8287 WARN_ON_ONCE(1); 8288 8289 if (!num_mgmt) 8290 wake_up(&ar->txmgmt_empty_waitq); 8291 } 8292 8293 int ath12k_mac_tx_mgmt_pending_free(int buf_id, void *skb, void *ctx) 8294 { 8295 struct sk_buff *msdu = skb; 8296 struct ieee80211_tx_info *info; 8297 struct ath12k *ar = ctx; 8298 struct ath12k_base *ab = ar->ab; 8299 8300 spin_lock_bh(&ar->txmgmt_idr_lock); 8301 idr_remove(&ar->txmgmt_idr, buf_id); 8302 spin_unlock_bh(&ar->txmgmt_idr_lock); 8303 dma_unmap_single(ab->dev, ATH12K_SKB_CB(msdu)->paddr, msdu->len, 8304 DMA_TO_DEVICE); 8305 8306 info = IEEE80211_SKB_CB(msdu); 8307 memset(&info->status, 0, sizeof(info->status)); 8308 8309 ath12k_mgmt_over_wmi_tx_drop(ar, skb); 8310 8311 return 0; 8312 } 8313 8314 static int ath12k_mac_vif_txmgmt_idr_remove(int buf_id, void *skb, void *ctx) 8315 { 8316 struct ieee80211_vif *vif = ctx; 8317 struct ath12k_skb_cb *skb_cb = ATH12K_SKB_CB(skb); 8318 struct sk_buff *msdu = skb; 8319 struct ath12k *ar = skb_cb->ar; 8320 struct ath12k_base *ab = ar->ab; 8321 8322 if (skb_cb->vif == vif) { 8323 spin_lock_bh(&ar->txmgmt_idr_lock); 8324 idr_remove(&ar->txmgmt_idr, buf_id); 8325 spin_unlock_bh(&ar->txmgmt_idr_lock); 8326 dma_unmap_single(ab->dev, skb_cb->paddr, msdu->len, 8327 DMA_TO_DEVICE); 8328 } 8329 8330 return 0; 8331 } 8332 8333 static int ath12k_mac_mgmt_tx_wmi(struct ath12k *ar, struct ath12k_link_vif *arvif, 8334 struct sk_buff *skb) 8335 { 8336 struct ath12k_base *ab = ar->ab; 8337 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 8338 struct ath12k_skb_cb *skb_cb = ATH12K_SKB_CB(skb); 8339 struct ieee80211_tx_info *info; 8340 enum hal_encrypt_type enctype; 8341 unsigned int mic_len; 8342 dma_addr_t paddr; 8343 int buf_id; 8344 int ret; 8345 8346 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 8347 8348 skb_cb->ar = ar; 8349 spin_lock_bh(&ar->txmgmt_idr_lock); 8350 buf_id = idr_alloc(&ar->txmgmt_idr, skb, 0, 8351 ATH12K_TX_MGMT_NUM_PENDING_MAX, GFP_ATOMIC); 8352 spin_unlock_bh(&ar->txmgmt_idr_lock); 8353 if (buf_id < 0) 8354 return -ENOSPC; 8355 8356 info = IEEE80211_SKB_CB(skb); 8357 if ((skb_cb->flags & ATH12K_SKB_CIPHER_SET) && 8358 !(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) { 8359 if ((ieee80211_is_action(hdr->frame_control) || 8360 ieee80211_is_deauth(hdr->frame_control) || 8361 ieee80211_is_disassoc(hdr->frame_control)) && 8362 ieee80211_has_protected(hdr->frame_control)) { 8363 enctype = ath12k_dp_tx_get_encrypt_type(skb_cb->cipher); 8364 mic_len = ath12k_dp_rx_crypto_mic_len(ar, enctype); 8365 skb_put(skb, mic_len); 8366 } 8367 } 8368 8369 paddr = dma_map_single(ab->dev, skb->data, skb->len, DMA_TO_DEVICE); 8370 if (dma_mapping_error(ab->dev, paddr)) { 8371 ath12k_warn(ab, "failed to DMA map mgmt Tx buffer\n"); 8372 ret = -EIO; 8373 goto err_free_idr; 8374 } 8375 8376 skb_cb->paddr = paddr; 8377 8378 ret = ath12k_wmi_mgmt_send(arvif, buf_id, skb); 8379 if (ret) { 8380 ath12k_warn(ar->ab, "failed to send mgmt frame: %d\n", ret); 8381 goto err_unmap_buf; 8382 } 8383 8384 return 0; 8385 8386 err_unmap_buf: 8387 dma_unmap_single(ab->dev, skb_cb->paddr, 8388 skb->len, DMA_TO_DEVICE); 8389 err_free_idr: 8390 spin_lock_bh(&ar->txmgmt_idr_lock); 8391 idr_remove(&ar->txmgmt_idr, buf_id); 8392 spin_unlock_bh(&ar->txmgmt_idr_lock); 8393 8394 return ret; 8395 } 8396 8397 static void ath12k_mgmt_over_wmi_tx_purge(struct ath12k *ar) 8398 { 8399 struct sk_buff *skb; 8400 8401 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) 8402 ath12k_mgmt_over_wmi_tx_drop(ar, skb); 8403 } 8404 8405 static int ath12k_mac_mgmt_action_frame_fill_elem_data(struct ath12k_link_vif *arvif, 8406 struct sk_buff *skb) 8407 { 8408 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 8409 u8 category, *buf, iv_len, action_code, dialog_token; 8410 struct ieee80211_bss_conf *link_conf; 8411 struct ieee80211_chanctx_conf *conf; 8412 int cur_tx_power, max_tx_power; 8413 struct ath12k *ar = arvif->ar; 8414 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar); 8415 struct wiphy *wiphy = hw->wiphy; 8416 struct ath12k_skb_cb *skb_cb; 8417 struct ieee80211_mgmt *mgmt; 8418 unsigned int remaining_len; 8419 bool has_protected; 8420 8421 lockdep_assert_wiphy(wiphy); 8422 8423 /* make sure category field is present */ 8424 if (skb->len < IEEE80211_MIN_ACTION_SIZE) 8425 return -EINVAL; 8426 8427 remaining_len = skb->len - IEEE80211_MIN_ACTION_SIZE; 8428 has_protected = ieee80211_has_protected(hdr->frame_control); 8429 8430 /* In case of SW crypto and hdr protected (PMF), packet will already be encrypted, 8431 * we can't put in data in this case 8432 */ 8433 if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags) && 8434 has_protected) 8435 return 0; 8436 8437 mgmt = (struct ieee80211_mgmt *)hdr; 8438 buf = (u8 *)&mgmt->u.action; 8439 8440 /* FCTL_PROTECTED frame might have extra space added for HDR_LEN. Offset that 8441 * many bytes if it is there 8442 */ 8443 if (has_protected) { 8444 skb_cb = ATH12K_SKB_CB(skb); 8445 8446 switch (skb_cb->cipher) { 8447 /* Cipher suite having flag %IEEE80211_KEY_FLAG_GENERATE_IV_MGMT set in 8448 * key needs to be processed. See ath12k_install_key() 8449 */ 8450 case WLAN_CIPHER_SUITE_CCMP: 8451 case WLAN_CIPHER_SUITE_CCMP_256: 8452 case WLAN_CIPHER_SUITE_GCMP: 8453 case WLAN_CIPHER_SUITE_GCMP_256: 8454 iv_len = IEEE80211_CCMP_HDR_LEN; 8455 break; 8456 case WLAN_CIPHER_SUITE_TKIP: 8457 iv_len = 0; 8458 break; 8459 default: 8460 return -EINVAL; 8461 } 8462 8463 if (remaining_len < iv_len) 8464 return -EINVAL; 8465 8466 buf += iv_len; 8467 remaining_len -= iv_len; 8468 } 8469 8470 category = *buf++; 8471 /* category code is already taken care in %IEEE80211_MIN_ACTION_SIZE hence 8472 * no need to adjust remaining_len 8473 */ 8474 8475 switch (category) { 8476 case WLAN_CATEGORY_RADIO_MEASUREMENT: 8477 /* need action code and dialog token */ 8478 if (remaining_len < 2) 8479 return -EINVAL; 8480 8481 /* Packet Format: 8482 * Action Code | Dialog Token | Variable Len (based on Action Code) 8483 */ 8484 action_code = *buf++; 8485 dialog_token = *buf++; 8486 remaining_len -= 2; 8487 8488 link_conf = ath12k_mac_get_link_bss_conf(arvif); 8489 if (!link_conf) { 8490 ath12k_warn(ar->ab, 8491 "failed to get bss link conf for vdev %d in RM handling\n", 8492 arvif->vdev_id); 8493 return -EINVAL; 8494 } 8495 8496 conf = wiphy_dereference(wiphy, link_conf->chanctx_conf); 8497 if (!conf) 8498 return -ENOENT; 8499 8500 cur_tx_power = link_conf->txpower; 8501 max_tx_power = min(conf->def.chan->max_reg_power, 8502 (int)ar->max_tx_power / 2); 8503 8504 ath12k_mac_op_get_txpower(hw, arvif->ahvif->vif, arvif->link_id, 8505 &cur_tx_power); 8506 8507 switch (action_code) { 8508 case WLAN_RM_ACTION_LINK_MEASUREMENT_REQUEST: 8509 /* need variable fields to be present in len */ 8510 if (remaining_len < 2) 8511 return -EINVAL; 8512 8513 /* Variable length format as defined in IEEE 802.11-2024, 8514 * Figure 9-1187-Link Measurement Request frame Action field 8515 * format. 8516 * Transmit Power | Max Tx Power 8517 * We fill both of these. 8518 */ 8519 *buf++ = cur_tx_power; 8520 *buf = max_tx_power; 8521 8522 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 8523 "RRM: Link Measurement Req dialog_token %u cur_tx_power %d max_tx_power %d\n", 8524 dialog_token, cur_tx_power, max_tx_power); 8525 break; 8526 case WLAN_RM_ACTION_LINK_MEASUREMENT_REPORT: 8527 /* need variable fields to be present in len */ 8528 if (remaining_len < 3) 8529 return -EINVAL; 8530 8531 /* Variable length format as defined in IEEE 802.11-2024, 8532 * Figure 9-1188-Link Measurement Report frame Action field format 8533 * TPC Report | Variable Fields 8534 * 8535 * TPC Report Format: 8536 * Element ID | Len | Tx Power | Link Margin 8537 * 8538 * We fill Tx power in the TPC Report (2nd index) 8539 */ 8540 buf[2] = cur_tx_power; 8541 8542 /* TODO: At present, Link margin data is not present so can't 8543 * really fill it now. Once it is available, it can be added 8544 * here 8545 */ 8546 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 8547 "RRM: Link Measurement Report dialog_token %u cur_tx_power %d\n", 8548 dialog_token, cur_tx_power); 8549 break; 8550 default: 8551 return -EINVAL; 8552 } 8553 break; 8554 default: 8555 /* nothing to fill */ 8556 return 0; 8557 } 8558 8559 return 0; 8560 } 8561 8562 static int ath12k_mac_mgmt_frame_fill_elem_data(struct ath12k_link_vif *arvif, 8563 struct sk_buff *skb) 8564 { 8565 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 8566 8567 if (!ieee80211_is_action(hdr->frame_control)) 8568 return 0; 8569 8570 return ath12k_mac_mgmt_action_frame_fill_elem_data(arvif, skb); 8571 } 8572 8573 static void ath12k_mgmt_over_wmi_tx_work(struct wiphy *wiphy, struct wiphy_work *work) 8574 { 8575 struct ath12k *ar = container_of(work, struct ath12k, wmi_mgmt_tx_work); 8576 struct ath12k_hw *ah = ar->ah; 8577 struct ath12k_skb_cb *skb_cb; 8578 struct ath12k_vif *ahvif; 8579 struct ath12k_link_vif *arvif; 8580 struct sk_buff *skb; 8581 int ret; 8582 8583 lockdep_assert_wiphy(wiphy); 8584 8585 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) { 8586 skb_cb = ATH12K_SKB_CB(skb); 8587 if (!skb_cb->vif) { 8588 ath12k_warn(ar->ab, "no vif found for mgmt frame\n"); 8589 ath12k_mgmt_over_wmi_tx_drop(ar, skb); 8590 continue; 8591 } 8592 8593 ahvif = ath12k_vif_to_ahvif(skb_cb->vif); 8594 if (!(ahvif->links_map & BIT(skb_cb->link_id))) { 8595 ath12k_warn(ar->ab, 8596 "invalid linkid %u in mgmt over wmi tx with linkmap 0x%x\n", 8597 skb_cb->link_id, ahvif->links_map); 8598 ath12k_mgmt_over_wmi_tx_drop(ar, skb); 8599 continue; 8600 } 8601 8602 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[skb_cb->link_id]); 8603 if (ar->allocated_vdev_map & (1LL << arvif->vdev_id)) { 8604 /* Fill in the data which is required to be filled by the driver 8605 * For example: Max Tx power in Link Measurement Request/Report 8606 */ 8607 ret = ath12k_mac_mgmt_frame_fill_elem_data(arvif, skb); 8608 if (ret) { 8609 /* If we couldn't fill the data due to any reason, 8610 * let's not discard transmitting the packet. 8611 * For example: Software crypto and PMF case 8612 */ 8613 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 8614 "Failed to fill the required data for the mgmt packet err %d\n", 8615 ret); 8616 } 8617 8618 ret = ath12k_mac_mgmt_tx_wmi(ar, arvif, skb); 8619 if (ret) { 8620 ath12k_warn(ar->ab, "failed to tx mgmt frame, vdev_id %d :%d\n", 8621 arvif->vdev_id, ret); 8622 ath12k_mgmt_over_wmi_tx_drop(ar, skb); 8623 } 8624 } else { 8625 ath12k_warn(ar->ab, 8626 "dropping mgmt frame for vdev %d link %u is_started %d\n", 8627 arvif->vdev_id, 8628 skb_cb->link_id, 8629 arvif->is_started); 8630 ath12k_mgmt_over_wmi_tx_drop(ar, skb); 8631 } 8632 } 8633 } 8634 8635 static int ath12k_mac_mgmt_tx(struct ath12k *ar, struct sk_buff *skb, 8636 bool is_prb_rsp) 8637 { 8638 struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue; 8639 8640 if (test_bit(ATH12K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags)) 8641 return -ESHUTDOWN; 8642 8643 /* Drop probe response packets when the pending management tx 8644 * count has reached a certain threshold, so as to prioritize 8645 * other mgmt packets like auth and assoc to be sent on time 8646 * for establishing successful connections. 8647 */ 8648 if (is_prb_rsp && 8649 atomic_read(&ar->num_pending_mgmt_tx) > ATH12K_PRB_RSP_DROP_THRESHOLD) { 8650 ath12k_warn(ar->ab, 8651 "dropping probe response as pending queue is almost full\n"); 8652 return -ENOSPC; 8653 } 8654 8655 if (skb_queue_len_lockless(q) >= ATH12K_TX_MGMT_NUM_PENDING_MAX) { 8656 ath12k_warn(ar->ab, "mgmt tx queue is full\n"); 8657 return -ENOSPC; 8658 } 8659 8660 skb_queue_tail(q, skb); 8661 atomic_inc(&ar->num_pending_mgmt_tx); 8662 wiphy_work_queue(ath12k_ar_to_hw(ar)->wiphy, &ar->wmi_mgmt_tx_work); 8663 8664 return 0; 8665 } 8666 8667 static void ath12k_mac_add_p2p_noa_ie(struct ath12k *ar, 8668 struct ieee80211_vif *vif, 8669 struct sk_buff *skb, 8670 bool is_prb_rsp) 8671 { 8672 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 8673 8674 if (likely(!is_prb_rsp)) 8675 return; 8676 8677 spin_lock_bh(&ar->data_lock); 8678 8679 if (ahvif->u.ap.noa_data && 8680 !pskb_expand_head(skb, 0, ahvif->u.ap.noa_len, 8681 GFP_ATOMIC)) 8682 skb_put_data(skb, ahvif->u.ap.noa_data, 8683 ahvif->u.ap.noa_len); 8684 8685 spin_unlock_bh(&ar->data_lock); 8686 } 8687 8688 /* Note: called under rcu_read_lock() */ 8689 static void ath12k_mlo_mcast_update_tx_link_address(struct ieee80211_vif *vif, 8690 u8 link_id, struct sk_buff *skb, 8691 u32 info_flags) 8692 { 8693 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 8694 struct ieee80211_bss_conf *bss_conf; 8695 8696 if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP) 8697 return; 8698 8699 bss_conf = rcu_dereference(vif->link_conf[link_id]); 8700 if (bss_conf) 8701 ether_addr_copy(hdr->addr2, bss_conf->addr); 8702 } 8703 8704 /* Note: called under rcu_read_lock() */ 8705 static u8 ath12k_mac_get_tx_link(struct ieee80211_sta *sta, struct ieee80211_vif *vif, 8706 u8 link, struct sk_buff *skb, u32 info_flags) 8707 { 8708 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 8709 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 8710 struct ieee80211_link_sta *link_sta; 8711 struct ieee80211_bss_conf *bss_conf; 8712 struct ath12k_sta *ahsta; 8713 8714 /* Use the link id passed or the default vif link */ 8715 if (!sta) { 8716 if (link != IEEE80211_LINK_UNSPECIFIED) 8717 return link; 8718 8719 return ahvif->deflink.link_id; 8720 } 8721 8722 ahsta = ath12k_sta_to_ahsta(sta); 8723 8724 /* Below translation ensures we pass proper A2 & A3 for non ML clients. 8725 * Also it assumes for now support only for MLO AP in this path 8726 */ 8727 if (!sta->mlo) { 8728 link = ahsta->deflink.link_id; 8729 8730 if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP) 8731 return link; 8732 8733 bss_conf = rcu_dereference(vif->link_conf[link]); 8734 if (bss_conf) { 8735 ether_addr_copy(hdr->addr2, bss_conf->addr); 8736 if (!ieee80211_has_tods(hdr->frame_control) && 8737 !ieee80211_has_fromds(hdr->frame_control)) 8738 ether_addr_copy(hdr->addr3, bss_conf->addr); 8739 } 8740 8741 return link; 8742 } 8743 8744 /* enqueue eth enacap & data frames on primary link, FW does link 8745 * selection and address translation. 8746 */ 8747 if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP || 8748 ieee80211_is_data(hdr->frame_control)) 8749 return ahsta->assoc_link_id; 8750 8751 /* 802.11 frame cases */ 8752 if (link == IEEE80211_LINK_UNSPECIFIED) 8753 link = ahsta->deflink.link_id; 8754 8755 if (!ieee80211_is_mgmt(hdr->frame_control)) 8756 return link; 8757 8758 /* Perform address conversion for ML STA Tx */ 8759 bss_conf = rcu_dereference(vif->link_conf[link]); 8760 link_sta = rcu_dereference(sta->link[link]); 8761 8762 if (bss_conf && link_sta) { 8763 ether_addr_copy(hdr->addr1, link_sta->addr); 8764 ether_addr_copy(hdr->addr2, bss_conf->addr); 8765 8766 if (vif->type == NL80211_IFTYPE_STATION && bss_conf->bssid) 8767 ether_addr_copy(hdr->addr3, bss_conf->bssid); 8768 else if (vif->type == NL80211_IFTYPE_AP) 8769 ether_addr_copy(hdr->addr3, bss_conf->addr); 8770 8771 return link; 8772 } 8773 8774 if (bss_conf) { 8775 /* In certain cases where a ML sta associated and added subset of 8776 * links on which the ML AP is active, but now sends some frame 8777 * (ex. Probe request) on a different link which is active in our 8778 * MLD but was not added during previous association, we can 8779 * still honor the Tx to that ML STA via the requested link. 8780 * The control would reach here in such case only when that link 8781 * address is same as the MLD address or in worst case clients 8782 * used MLD address at TA wrongly which would have helped 8783 * identify the ML sta object and pass it here. 8784 * If the link address of that STA is different from MLD address, 8785 * then the sta object would be NULL and control won't reach 8786 * here but return at the start of the function itself with !sta 8787 * check. Also this would not need any translation at hdr->addr1 8788 * from MLD to link address since the RA is the MLD address 8789 * (same as that link address ideally) already. 8790 */ 8791 ether_addr_copy(hdr->addr2, bss_conf->addr); 8792 8793 if (vif->type == NL80211_IFTYPE_STATION && bss_conf->bssid) 8794 ether_addr_copy(hdr->addr3, bss_conf->bssid); 8795 else if (vif->type == NL80211_IFTYPE_AP) 8796 ether_addr_copy(hdr->addr3, bss_conf->addr); 8797 } 8798 8799 return link; 8800 } 8801 8802 /* Note: called under rcu_read_lock() */ 8803 static void ath12k_mac_op_tx(struct ieee80211_hw *hw, 8804 struct ieee80211_tx_control *control, 8805 struct sk_buff *skb) 8806 { 8807 struct ath12k_skb_cb *skb_cb = ATH12K_SKB_CB(skb); 8808 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 8809 struct ieee80211_vif *vif = info->control.vif; 8810 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 8811 struct ath12k_link_vif *arvif = &ahvif->deflink; 8812 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 8813 struct ieee80211_key_conf *key = info->control.hw_key; 8814 struct ieee80211_sta *sta = control->sta; 8815 struct ath12k_link_vif *tmp_arvif; 8816 u32 info_flags = info->flags; 8817 struct sk_buff *msdu_copied; 8818 struct ath12k *ar, *tmp_ar; 8819 struct ath12k_peer *peer; 8820 unsigned long links_map; 8821 bool is_mcast = false; 8822 bool is_dvlan = false; 8823 struct ethhdr *eth; 8824 bool is_prb_rsp; 8825 u16 mcbc_gsn; 8826 u8 link_id; 8827 int ret; 8828 8829 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { 8830 ieee80211_free_txskb(hw, skb); 8831 return; 8832 } 8833 8834 link_id = u32_get_bits(info->control.flags, IEEE80211_TX_CTRL_MLO_LINK); 8835 memset(skb_cb, 0, sizeof(*skb_cb)); 8836 skb_cb->vif = vif; 8837 8838 if (key) { 8839 skb_cb->cipher = key->cipher; 8840 skb_cb->flags |= ATH12K_SKB_CIPHER_SET; 8841 } 8842 8843 /* handle only for MLO case, use deflink for non MLO case */ 8844 if (ieee80211_vif_is_mld(vif)) { 8845 link_id = ath12k_mac_get_tx_link(sta, vif, link_id, skb, info_flags); 8846 if (link_id >= IEEE80211_MLD_MAX_NUM_LINKS) { 8847 ieee80211_free_txskb(hw, skb); 8848 return; 8849 } 8850 } else { 8851 link_id = 0; 8852 } 8853 8854 arvif = rcu_dereference(ahvif->link[link_id]); 8855 if (!arvif || !arvif->ar) { 8856 ath12k_warn(ahvif->ah, "failed to find arvif link id %u for frame transmission", 8857 link_id); 8858 ieee80211_free_txskb(hw, skb); 8859 return; 8860 } 8861 8862 ar = arvif->ar; 8863 skb_cb->link_id = link_id; 8864 is_prb_rsp = ieee80211_is_probe_resp(hdr->frame_control); 8865 8866 if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP) { 8867 eth = (struct ethhdr *)skb->data; 8868 is_mcast = is_multicast_ether_addr(eth->h_dest); 8869 8870 skb_cb->flags |= ATH12K_SKB_HW_80211_ENCAP; 8871 } else if (ieee80211_is_mgmt(hdr->frame_control)) { 8872 if (sta && sta->mlo) 8873 skb_cb->flags |= ATH12K_SKB_MLO_STA; 8874 8875 ret = ath12k_mac_mgmt_tx(ar, skb, is_prb_rsp); 8876 if (ret) { 8877 ath12k_warn(ar->ab, "failed to queue management frame %d\n", 8878 ret); 8879 ieee80211_free_txskb(hw, skb); 8880 } 8881 return; 8882 } 8883 8884 if (!(info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) 8885 is_mcast = is_multicast_ether_addr(hdr->addr1); 8886 8887 /* This is case only for P2P_GO */ 8888 if (vif->type == NL80211_IFTYPE_AP && vif->p2p) 8889 ath12k_mac_add_p2p_noa_ie(ar, vif, skb, is_prb_rsp); 8890 8891 /* Checking if it is a DVLAN frame */ 8892 if (!test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags) && 8893 !(skb_cb->flags & ATH12K_SKB_HW_80211_ENCAP) && 8894 !(skb_cb->flags & ATH12K_SKB_CIPHER_SET) && 8895 ieee80211_has_protected(hdr->frame_control)) 8896 is_dvlan = true; 8897 8898 if (!vif->valid_links || !is_mcast || is_dvlan || 8899 (skb_cb->flags & ATH12K_SKB_HW_80211_ENCAP) || 8900 test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags)) { 8901 ret = ath12k_dp_tx(ar, arvif, skb, false, 0, is_mcast); 8902 if (unlikely(ret)) { 8903 ath12k_warn(ar->ab, "failed to transmit frame %d\n", ret); 8904 ieee80211_free_txskb(ar->ah->hw, skb); 8905 return; 8906 } 8907 } else { 8908 mcbc_gsn = atomic_inc_return(&ahvif->mcbc_gsn) & 0xfff; 8909 8910 links_map = ahvif->links_map; 8911 for_each_set_bit(link_id, &links_map, 8912 IEEE80211_MLD_MAX_NUM_LINKS) { 8913 tmp_arvif = rcu_dereference(ahvif->link[link_id]); 8914 if (!tmp_arvif || !tmp_arvif->is_up) 8915 continue; 8916 8917 tmp_ar = tmp_arvif->ar; 8918 msdu_copied = skb_copy(skb, GFP_ATOMIC); 8919 if (!msdu_copied) { 8920 ath12k_err(ar->ab, 8921 "skb copy failure link_id 0x%X vdevid 0x%X\n", 8922 link_id, tmp_arvif->vdev_id); 8923 continue; 8924 } 8925 8926 ath12k_mlo_mcast_update_tx_link_address(vif, link_id, 8927 msdu_copied, 8928 info_flags); 8929 8930 skb_cb = ATH12K_SKB_CB(msdu_copied); 8931 skb_cb->link_id = link_id; 8932 8933 /* For open mode, skip peer find logic */ 8934 if (unlikely(!ahvif->key_cipher)) 8935 goto skip_peer_find; 8936 8937 spin_lock_bh(&tmp_ar->ab->base_lock); 8938 peer = ath12k_peer_find_by_addr(tmp_ar->ab, tmp_arvif->bssid); 8939 if (!peer) { 8940 spin_unlock_bh(&tmp_ar->ab->base_lock); 8941 ath12k_warn(tmp_ar->ab, 8942 "failed to find peer for vdev_id 0x%X addr %pM link_map 0x%X\n", 8943 tmp_arvif->vdev_id, tmp_arvif->bssid, 8944 ahvif->links_map); 8945 dev_kfree_skb_any(msdu_copied); 8946 continue; 8947 } 8948 8949 key = peer->keys[peer->mcast_keyidx]; 8950 if (key) { 8951 skb_cb->cipher = key->cipher; 8952 skb_cb->flags |= ATH12K_SKB_CIPHER_SET; 8953 8954 hdr = (struct ieee80211_hdr *)msdu_copied->data; 8955 if (!ieee80211_has_protected(hdr->frame_control)) 8956 hdr->frame_control |= 8957 cpu_to_le16(IEEE80211_FCTL_PROTECTED); 8958 } 8959 spin_unlock_bh(&tmp_ar->ab->base_lock); 8960 8961 skip_peer_find: 8962 ret = ath12k_dp_tx(tmp_ar, tmp_arvif, 8963 msdu_copied, true, mcbc_gsn, is_mcast); 8964 if (unlikely(ret)) { 8965 if (ret == -ENOMEM) { 8966 /* Drops are expected during heavy multicast 8967 * frame flood. Print with debug log 8968 * level to avoid lot of console prints 8969 */ 8970 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 8971 "failed to transmit frame %d\n", 8972 ret); 8973 } else { 8974 ath12k_warn(ar->ab, 8975 "failed to transmit frame %d\n", 8976 ret); 8977 } 8978 8979 dev_kfree_skb_any(msdu_copied); 8980 } 8981 } 8982 ieee80211_free_txskb(ar->ah->hw, skb); 8983 } 8984 } 8985 8986 void ath12k_mac_drain_tx(struct ath12k *ar) 8987 { 8988 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 8989 8990 /* make sure rcu-protected mac80211 tx path itself is drained */ 8991 synchronize_net(); 8992 8993 wiphy_work_cancel(ath12k_ar_to_hw(ar)->wiphy, &ar->wmi_mgmt_tx_work); 8994 ath12k_mgmt_over_wmi_tx_purge(ar); 8995 } 8996 8997 static int ath12k_mac_config_mon_status_default(struct ath12k *ar, bool enable) 8998 { 8999 struct htt_rx_ring_tlv_filter tlv_filter = {}; 9000 struct ath12k_base *ab = ar->ab; 9001 u32 ring_id, i; 9002 int ret = 0; 9003 9004 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 9005 9006 if (!ab->hw_params->rxdma1_enable) 9007 return ret; 9008 9009 if (enable) { 9010 tlv_filter = ath12k_mac_mon_status_filter_default; 9011 9012 if (ath12k_debugfs_rx_filter(ar)) 9013 tlv_filter.rx_filter = ath12k_debugfs_rx_filter(ar); 9014 } else { 9015 tlv_filter.rxmon_disable = true; 9016 } 9017 9018 for (i = 0; i < ab->hw_params->num_rxdma_per_pdev; i++) { 9019 ring_id = ar->dp.rxdma_mon_dst_ring[i].ring_id; 9020 ret = ath12k_dp_tx_htt_rx_filter_setup(ab, ring_id, 9021 ar->dp.mac_id + i, 9022 HAL_RXDMA_MONITOR_DST, 9023 DP_RXDMA_REFILL_RING_SIZE, 9024 &tlv_filter); 9025 if (ret) { 9026 ath12k_err(ab, 9027 "failed to setup filter for monitor buf %d\n", 9028 ret); 9029 } 9030 } 9031 9032 return ret; 9033 } 9034 9035 static int ath12k_mac_start(struct ath12k *ar) 9036 { 9037 struct ath12k_hw *ah = ar->ah; 9038 struct ath12k_base *ab = ar->ab; 9039 struct ath12k_pdev *pdev = ar->pdev; 9040 int ret; 9041 9042 lockdep_assert_held(&ah->hw_mutex); 9043 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 9044 9045 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_PMF_QOS, 9046 1, pdev->pdev_id); 9047 9048 if (ret) { 9049 ath12k_err(ab, "failed to enable PMF QOS: %d\n", ret); 9050 goto err; 9051 } 9052 9053 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_DYNAMIC_BW, 1, 9054 pdev->pdev_id); 9055 if (ret) { 9056 ath12k_err(ab, "failed to enable dynamic bw: %d\n", ret); 9057 goto err; 9058 } 9059 9060 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_ARP_AC_OVERRIDE, 9061 0, pdev->pdev_id); 9062 if (ret) { 9063 ath12k_err(ab, "failed to set ac override for ARP: %d\n", 9064 ret); 9065 goto err; 9066 } 9067 9068 ret = ath12k_wmi_send_dfs_phyerr_offload_enable_cmd(ar, pdev->pdev_id); 9069 if (ret) { 9070 ath12k_err(ab, "failed to offload radar detection: %d\n", 9071 ret); 9072 goto err; 9073 } 9074 9075 ret = ath12k_dp_tx_htt_h2t_ppdu_stats_req(ar, 9076 HTT_PPDU_STATS_TAG_DEFAULT); 9077 if (ret) { 9078 ath12k_err(ab, "failed to req ppdu stats: %d\n", ret); 9079 goto err; 9080 } 9081 9082 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_MESH_MCAST_ENABLE, 9083 1, pdev->pdev_id); 9084 9085 if (ret) { 9086 ath12k_err(ab, "failed to enable MESH MCAST ENABLE: (%d\n", ret); 9087 goto err; 9088 } 9089 9090 __ath12k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask); 9091 9092 /* TODO: Do we need to enable ANI? */ 9093 9094 ret = ath12k_reg_update_chan_list(ar, false); 9095 9096 /* The ar state alone can be turned off for non supported country 9097 * without returning the error value. As we need to update the channel 9098 * for the next ar. 9099 */ 9100 if (ret) { 9101 if (ret == -EINVAL) 9102 ret = 0; 9103 goto err; 9104 } 9105 9106 ar->num_started_vdevs = 0; 9107 ar->num_created_vdevs = 0; 9108 ar->num_peers = 0; 9109 ar->allocated_vdev_map = 0; 9110 ar->chan_tx_pwr = ATH12K_PDEV_TX_POWER_INVALID; 9111 9112 /* Configure monitor status ring with default rx_filter to get rx status 9113 * such as rssi, rx_duration. 9114 */ 9115 ret = ath12k_mac_config_mon_status_default(ar, true); 9116 if (ret && (ret != -EOPNOTSUPP)) { 9117 ath12k_err(ab, "failed to configure monitor status ring with default rx_filter: (%d)\n", 9118 ret); 9119 goto err; 9120 } 9121 9122 if (ret == -EOPNOTSUPP) 9123 ath12k_dbg(ab, ATH12K_DBG_MAC, 9124 "monitor status config is not yet supported"); 9125 9126 /* Configure the hash seed for hash based reo dest ring selection */ 9127 ath12k_wmi_pdev_lro_cfg(ar, ar->pdev->pdev_id); 9128 9129 /* allow device to enter IMPS */ 9130 if (ab->hw_params->idle_ps) { 9131 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_IDLE_PS_CONFIG, 9132 1, pdev->pdev_id); 9133 if (ret) { 9134 ath12k_err(ab, "failed to enable idle ps: %d\n", ret); 9135 goto err; 9136 } 9137 } 9138 9139 rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx], 9140 &ab->pdevs[ar->pdev_idx]); 9141 9142 return 0; 9143 err: 9144 9145 return ret; 9146 } 9147 9148 static void ath12k_drain_tx(struct ath12k_hw *ah) 9149 { 9150 struct ath12k *ar; 9151 int i; 9152 9153 lockdep_assert_wiphy(ah->hw->wiphy); 9154 9155 for_each_ar(ah, ar, i) 9156 ath12k_mac_drain_tx(ar); 9157 } 9158 9159 static int ath12k_mac_op_start(struct ieee80211_hw *hw) 9160 { 9161 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 9162 struct ath12k *ar; 9163 int ret, i; 9164 9165 if (ath12k_ftm_mode) 9166 return -EPERM; 9167 9168 lockdep_assert_wiphy(hw->wiphy); 9169 9170 ath12k_drain_tx(ah); 9171 9172 guard(mutex)(&ah->hw_mutex); 9173 9174 switch (ah->state) { 9175 case ATH12K_HW_STATE_OFF: 9176 ah->state = ATH12K_HW_STATE_ON; 9177 break; 9178 case ATH12K_HW_STATE_RESTARTING: 9179 ah->state = ATH12K_HW_STATE_RESTARTED; 9180 break; 9181 case ATH12K_HW_STATE_RESTARTED: 9182 case ATH12K_HW_STATE_WEDGED: 9183 case ATH12K_HW_STATE_ON: 9184 case ATH12K_HW_STATE_TM: 9185 ah->state = ATH12K_HW_STATE_OFF; 9186 9187 WARN_ON(1); 9188 return -EINVAL; 9189 } 9190 9191 for_each_ar(ah, ar, i) { 9192 ret = ath12k_mac_start(ar); 9193 if (ret) { 9194 ah->state = ATH12K_HW_STATE_OFF; 9195 9196 ath12k_err(ar->ab, "fail to start mac operations in pdev idx %d ret %d\n", 9197 ar->pdev_idx, ret); 9198 goto fail_start; 9199 } 9200 } 9201 9202 return 0; 9203 9204 fail_start: 9205 for (; i > 0; i--) { 9206 ar = ath12k_ah_to_ar(ah, i - 1); 9207 ath12k_mac_stop(ar); 9208 } 9209 9210 return ret; 9211 } 9212 9213 int ath12k_mac_rfkill_config(struct ath12k *ar) 9214 { 9215 struct ath12k_base *ab = ar->ab; 9216 u32 param; 9217 int ret; 9218 9219 if (ab->hw_params->rfkill_pin == 0) 9220 return -EOPNOTSUPP; 9221 9222 ath12k_dbg(ab, ATH12K_DBG_MAC, 9223 "mac rfkill_pin %d rfkill_cfg %d rfkill_on_level %d", 9224 ab->hw_params->rfkill_pin, ab->hw_params->rfkill_cfg, 9225 ab->hw_params->rfkill_on_level); 9226 9227 param = u32_encode_bits(ab->hw_params->rfkill_on_level, 9228 WMI_RFKILL_CFG_RADIO_LEVEL) | 9229 u32_encode_bits(ab->hw_params->rfkill_pin, 9230 WMI_RFKILL_CFG_GPIO_PIN_NUM) | 9231 u32_encode_bits(ab->hw_params->rfkill_cfg, 9232 WMI_RFKILL_CFG_PIN_AS_GPIO); 9233 9234 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_HW_RFKILL_CONFIG, 9235 param, ar->pdev->pdev_id); 9236 if (ret) { 9237 ath12k_warn(ab, 9238 "failed to set rfkill config 0x%x: %d\n", 9239 param, ret); 9240 return ret; 9241 } 9242 9243 return 0; 9244 } 9245 9246 int ath12k_mac_rfkill_enable_radio(struct ath12k *ar, bool enable) 9247 { 9248 enum wmi_rfkill_enable_radio param; 9249 int ret; 9250 9251 if (enable) 9252 param = WMI_RFKILL_ENABLE_RADIO_ON; 9253 else 9254 param = WMI_RFKILL_ENABLE_RADIO_OFF; 9255 9256 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac %d rfkill enable %d", 9257 ar->pdev_idx, param); 9258 9259 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RFKILL_ENABLE, 9260 param, ar->pdev->pdev_id); 9261 if (ret) { 9262 ath12k_warn(ar->ab, "failed to set rfkill enable param %d: %d\n", 9263 param, ret); 9264 return ret; 9265 } 9266 9267 return 0; 9268 } 9269 9270 static void ath12k_mac_stop(struct ath12k *ar) 9271 { 9272 struct ath12k_hw *ah = ar->ah; 9273 struct htt_ppdu_stats_info *ppdu_stats, *tmp; 9274 struct ath12k_wmi_scan_chan_list_arg *arg; 9275 int ret; 9276 9277 lockdep_assert_held(&ah->hw_mutex); 9278 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 9279 9280 ret = ath12k_mac_config_mon_status_default(ar, false); 9281 if (ret && (ret != -EOPNOTSUPP)) 9282 ath12k_err(ar->ab, "failed to clear rx_filter for monitor status ring: (%d)\n", 9283 ret); 9284 9285 clear_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags); 9286 9287 cancel_delayed_work_sync(&ar->scan.timeout); 9288 wiphy_work_cancel(ath12k_ar_to_hw(ar)->wiphy, &ar->scan.vdev_clean_wk); 9289 cancel_work_sync(&ar->regd_channel_update_work); 9290 cancel_work_sync(&ar->regd_update_work); 9291 cancel_work_sync(&ar->ab->rfkill_work); 9292 cancel_work_sync(&ar->ab->update_11d_work); 9293 ar->state_11d = ATH12K_11D_IDLE; 9294 complete(&ar->completed_11d_scan); 9295 9296 spin_lock_bh(&ar->data_lock); 9297 9298 list_for_each_entry_safe(ppdu_stats, tmp, &ar->ppdu_stats_info, list) { 9299 list_del(&ppdu_stats->list); 9300 kfree(ppdu_stats); 9301 } 9302 9303 while ((arg = list_first_entry_or_null(&ar->regd_channel_update_queue, 9304 struct ath12k_wmi_scan_chan_list_arg, 9305 list))) { 9306 list_del(&arg->list); 9307 kfree(arg); 9308 } 9309 spin_unlock_bh(&ar->data_lock); 9310 9311 rcu_assign_pointer(ar->ab->pdevs_active[ar->pdev_idx], NULL); 9312 9313 synchronize_rcu(); 9314 9315 atomic_set(&ar->num_pending_mgmt_tx, 0); 9316 } 9317 9318 static void ath12k_mac_op_stop(struct ieee80211_hw *hw, bool suspend) 9319 { 9320 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 9321 struct ath12k *ar; 9322 int i; 9323 9324 lockdep_assert_wiphy(hw->wiphy); 9325 9326 ath12k_drain_tx(ah); 9327 9328 mutex_lock(&ah->hw_mutex); 9329 9330 ah->state = ATH12K_HW_STATE_OFF; 9331 9332 for_each_ar(ah, ar, i) 9333 ath12k_mac_stop(ar); 9334 9335 mutex_unlock(&ah->hw_mutex); 9336 } 9337 9338 static u8 9339 ath12k_mac_get_vdev_stats_id(struct ath12k_link_vif *arvif) 9340 { 9341 struct ath12k_base *ab = arvif->ar->ab; 9342 u8 vdev_stats_id = 0; 9343 9344 do { 9345 if (ab->free_vdev_stats_id_map & (1LL << vdev_stats_id)) { 9346 vdev_stats_id++; 9347 if (vdev_stats_id >= ATH12K_MAX_VDEV_STATS_ID) { 9348 vdev_stats_id = ATH12K_INVAL_VDEV_STATS_ID; 9349 break; 9350 } 9351 } else { 9352 ab->free_vdev_stats_id_map |= (1LL << vdev_stats_id); 9353 break; 9354 } 9355 } while (vdev_stats_id); 9356 9357 arvif->vdev_stats_id = vdev_stats_id; 9358 return vdev_stats_id; 9359 } 9360 9361 static int ath12k_mac_setup_vdev_params_mbssid(struct ath12k_link_vif *arvif, 9362 u32 *flags, u32 *tx_vdev_id) 9363 { 9364 struct ath12k_vif *ahvif = arvif->ahvif; 9365 struct ieee80211_bss_conf *link_conf; 9366 struct ath12k *ar = arvif->ar; 9367 struct ath12k_link_vif *tx_arvif; 9368 9369 link_conf = ath12k_mac_get_link_bss_conf(arvif); 9370 if (!link_conf) { 9371 ath12k_warn(ar->ab, "unable to access bss link conf in set mbssid params for vif %pM link %u\n", 9372 ahvif->vif->addr, arvif->link_id); 9373 return -ENOLINK; 9374 } 9375 9376 tx_arvif = ath12k_mac_get_tx_arvif(arvif, link_conf); 9377 if (!tx_arvif) 9378 return 0; 9379 9380 if (link_conf->nontransmitted) { 9381 if (ath12k_ar_to_hw(ar)->wiphy != 9382 ath12k_ar_to_hw(tx_arvif->ar)->wiphy) 9383 return -EINVAL; 9384 9385 *flags = WMI_VDEV_MBSSID_FLAGS_NON_TRANSMIT_AP; 9386 *tx_vdev_id = tx_arvif->vdev_id; 9387 } else if (tx_arvif == arvif) { 9388 *flags = WMI_VDEV_MBSSID_FLAGS_TRANSMIT_AP; 9389 } else { 9390 return -EINVAL; 9391 } 9392 9393 if (link_conf->ema_ap) 9394 *flags |= WMI_VDEV_MBSSID_FLAGS_EMA_MODE; 9395 9396 return 0; 9397 } 9398 9399 static int ath12k_mac_setup_vdev_create_arg(struct ath12k_link_vif *arvif, 9400 struct ath12k_wmi_vdev_create_arg *arg) 9401 { 9402 struct ath12k *ar = arvif->ar; 9403 struct ath12k_pdev *pdev = ar->pdev; 9404 struct ath12k_vif *ahvif = arvif->ahvif; 9405 int ret; 9406 9407 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 9408 9409 arg->if_id = arvif->vdev_id; 9410 arg->type = ahvif->vdev_type; 9411 arg->subtype = ahvif->vdev_subtype; 9412 arg->pdev_id = pdev->pdev_id; 9413 9414 arg->mbssid_flags = WMI_VDEV_MBSSID_FLAGS_NON_MBSSID_AP; 9415 arg->mbssid_tx_vdev_id = 0; 9416 if (!test_bit(WMI_TLV_SERVICE_MBSS_PARAM_IN_VDEV_START_SUPPORT, 9417 ar->ab->wmi_ab.svc_map)) { 9418 ret = ath12k_mac_setup_vdev_params_mbssid(arvif, 9419 &arg->mbssid_flags, 9420 &arg->mbssid_tx_vdev_id); 9421 if (ret) 9422 return ret; 9423 } 9424 9425 if (pdev->cap.supported_bands & WMI_HOST_WLAN_2GHZ_CAP) { 9426 arg->chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains; 9427 arg->chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains; 9428 } 9429 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5GHZ_CAP) { 9430 arg->chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains; 9431 arg->chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains; 9432 } 9433 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5GHZ_CAP && 9434 ar->supports_6ghz) { 9435 arg->chains[NL80211_BAND_6GHZ].tx = ar->num_tx_chains; 9436 arg->chains[NL80211_BAND_6GHZ].rx = ar->num_rx_chains; 9437 } 9438 9439 arg->if_stats_id = ath12k_mac_get_vdev_stats_id(arvif); 9440 9441 if (ath12k_mac_is_ml_arvif(arvif)) { 9442 if (hweight16(ahvif->vif->valid_links) > ATH12K_WMI_MLO_MAX_LINKS) { 9443 ath12k_warn(ar->ab, "too many MLO links during setting up vdev: %d", 9444 ahvif->vif->valid_links); 9445 return -EINVAL; 9446 } 9447 9448 ether_addr_copy(arg->mld_addr, ahvif->vif->addr); 9449 } 9450 9451 return 0; 9452 } 9453 9454 static void ath12k_mac_update_vif_offload(struct ath12k_link_vif *arvif) 9455 { 9456 struct ath12k_vif *ahvif = arvif->ahvif; 9457 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif); 9458 struct ath12k *ar = arvif->ar; 9459 struct ath12k_base *ab = ar->ab; 9460 u32 param_id, param_value; 9461 int ret; 9462 9463 param_id = WMI_VDEV_PARAM_TX_ENCAP_TYPE; 9464 if (vif->type != NL80211_IFTYPE_STATION && 9465 vif->type != NL80211_IFTYPE_AP) 9466 vif->offload_flags &= ~(IEEE80211_OFFLOAD_ENCAP_ENABLED | 9467 IEEE80211_OFFLOAD_DECAP_ENABLED); 9468 9469 if (vif->offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED) 9470 ahvif->tx_encap_type = ATH12K_HW_TXRX_ETHERNET; 9471 else if (test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags)) 9472 ahvif->tx_encap_type = ATH12K_HW_TXRX_RAW; 9473 else 9474 ahvif->tx_encap_type = ATH12K_HW_TXRX_NATIVE_WIFI; 9475 9476 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 9477 param_id, ahvif->tx_encap_type); 9478 if (ret) { 9479 ath12k_warn(ab, "failed to set vdev %d tx encap mode: %d\n", 9480 arvif->vdev_id, ret); 9481 vif->offload_flags &= ~IEEE80211_OFFLOAD_ENCAP_ENABLED; 9482 } 9483 9484 param_id = WMI_VDEV_PARAM_RX_DECAP_TYPE; 9485 if (vif->offload_flags & IEEE80211_OFFLOAD_DECAP_ENABLED) 9486 param_value = ATH12K_HW_TXRX_ETHERNET; 9487 else if (test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags)) 9488 param_value = ATH12K_HW_TXRX_RAW; 9489 else 9490 param_value = ATH12K_HW_TXRX_NATIVE_WIFI; 9491 9492 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 9493 param_id, param_value); 9494 if (ret) { 9495 ath12k_warn(ab, "failed to set vdev %d rx decap mode: %d\n", 9496 arvif->vdev_id, ret); 9497 vif->offload_flags &= ~IEEE80211_OFFLOAD_DECAP_ENABLED; 9498 } 9499 } 9500 9501 static void ath12k_mac_op_update_vif_offload(struct ieee80211_hw *hw, 9502 struct ieee80211_vif *vif) 9503 { 9504 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 9505 struct ath12k_link_vif *arvif; 9506 unsigned long links; 9507 int link_id; 9508 9509 lockdep_assert_wiphy(hw->wiphy); 9510 9511 if (vif->valid_links) { 9512 links = vif->valid_links; 9513 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) { 9514 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 9515 if (!(arvif && arvif->ar)) 9516 continue; 9517 9518 ath12k_mac_update_vif_offload(arvif); 9519 } 9520 9521 return; 9522 } 9523 9524 ath12k_mac_update_vif_offload(&ahvif->deflink); 9525 } 9526 9527 static bool ath12k_mac_vif_ap_active_any(struct ath12k_base *ab) 9528 { 9529 struct ath12k *ar; 9530 struct ath12k_pdev *pdev; 9531 struct ath12k_link_vif *arvif; 9532 int i; 9533 9534 for (i = 0; i < ab->num_radios; i++) { 9535 pdev = &ab->pdevs[i]; 9536 ar = pdev->ar; 9537 list_for_each_entry(arvif, &ar->arvifs, list) { 9538 if (arvif->is_up && 9539 arvif->ahvif->vdev_type == WMI_VDEV_TYPE_AP) 9540 return true; 9541 } 9542 } 9543 return false; 9544 } 9545 9546 void ath12k_mac_11d_scan_start(struct ath12k *ar, u32 vdev_id) 9547 { 9548 struct wmi_11d_scan_start_arg arg; 9549 int ret; 9550 9551 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 9552 9553 if (ar->regdom_set_by_user) 9554 goto fin; 9555 9556 if (ar->vdev_id_11d_scan != ATH12K_11D_INVALID_VDEV_ID) 9557 goto fin; 9558 9559 if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map)) 9560 goto fin; 9561 9562 if (ath12k_mac_vif_ap_active_any(ar->ab)) 9563 goto fin; 9564 9565 arg.vdev_id = vdev_id; 9566 arg.start_interval_msec = 0; 9567 arg.scan_period_msec = ATH12K_SCAN_11D_INTERVAL; 9568 9569 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 9570 "mac start 11d scan for vdev %d\n", vdev_id); 9571 9572 ret = ath12k_wmi_send_11d_scan_start_cmd(ar, &arg); 9573 if (ret) { 9574 ath12k_warn(ar->ab, "failed to start 11d scan vdev %d ret: %d\n", 9575 vdev_id, ret); 9576 } else { 9577 ar->vdev_id_11d_scan = vdev_id; 9578 if (ar->state_11d == ATH12K_11D_PREPARING) 9579 ar->state_11d = ATH12K_11D_RUNNING; 9580 } 9581 9582 fin: 9583 if (ar->state_11d == ATH12K_11D_PREPARING) { 9584 ar->state_11d = ATH12K_11D_IDLE; 9585 complete(&ar->completed_11d_scan); 9586 } 9587 } 9588 9589 void ath12k_mac_11d_scan_stop(struct ath12k *ar) 9590 { 9591 int ret; 9592 u32 vdev_id; 9593 9594 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 9595 9596 if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map)) 9597 return; 9598 9599 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac stop 11d for vdev %d\n", 9600 ar->vdev_id_11d_scan); 9601 9602 if (ar->state_11d == ATH12K_11D_PREPARING) { 9603 ar->state_11d = ATH12K_11D_IDLE; 9604 complete(&ar->completed_11d_scan); 9605 } 9606 9607 if (ar->vdev_id_11d_scan != ATH12K_11D_INVALID_VDEV_ID) { 9608 vdev_id = ar->vdev_id_11d_scan; 9609 9610 ret = ath12k_wmi_send_11d_scan_stop_cmd(ar, vdev_id); 9611 if (ret) { 9612 ath12k_warn(ar->ab, 9613 "failed to stopt 11d scan vdev %d ret: %d\n", 9614 vdev_id, ret); 9615 } else { 9616 ar->vdev_id_11d_scan = ATH12K_11D_INVALID_VDEV_ID; 9617 ar->state_11d = ATH12K_11D_IDLE; 9618 complete(&ar->completed_11d_scan); 9619 } 9620 } 9621 } 9622 9623 void ath12k_mac_11d_scan_stop_all(struct ath12k_base *ab) 9624 { 9625 struct ath12k *ar; 9626 struct ath12k_pdev *pdev; 9627 int i; 9628 9629 ath12k_dbg(ab, ATH12K_DBG_MAC, "mac stop soc 11d scan\n"); 9630 9631 for (i = 0; i < ab->num_radios; i++) { 9632 pdev = &ab->pdevs[i]; 9633 ar = pdev->ar; 9634 9635 ath12k_mac_11d_scan_stop(ar); 9636 } 9637 } 9638 9639 static void ath12k_mac_determine_vdev_type(struct ieee80211_vif *vif, 9640 struct ath12k_vif *ahvif) 9641 { 9642 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE; 9643 9644 switch (vif->type) { 9645 case NL80211_IFTYPE_UNSPECIFIED: 9646 case NL80211_IFTYPE_STATION: 9647 ahvif->vdev_type = WMI_VDEV_TYPE_STA; 9648 9649 if (vif->p2p) 9650 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_CLIENT; 9651 9652 break; 9653 case NL80211_IFTYPE_MESH_POINT: 9654 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_MESH_11S; 9655 fallthrough; 9656 case NL80211_IFTYPE_AP: 9657 ahvif->vdev_type = WMI_VDEV_TYPE_AP; 9658 9659 if (vif->p2p) 9660 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO; 9661 9662 break; 9663 case NL80211_IFTYPE_MONITOR: 9664 ahvif->vdev_type = WMI_VDEV_TYPE_MONITOR; 9665 break; 9666 case NL80211_IFTYPE_P2P_DEVICE: 9667 ahvif->vdev_type = WMI_VDEV_TYPE_STA; 9668 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE; 9669 break; 9670 default: 9671 WARN_ON(1); 9672 break; 9673 } 9674 } 9675 9676 int ath12k_mac_vdev_create(struct ath12k *ar, struct ath12k_link_vif *arvif) 9677 { 9678 struct ath12k_hw *ah = ar->ah; 9679 struct ath12k_base *ab = ar->ab; 9680 struct ieee80211_hw *hw = ah->hw; 9681 struct ath12k_vif *ahvif = arvif->ahvif; 9682 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif); 9683 struct ath12k_wmi_vdev_create_arg vdev_arg = {}; 9684 struct ath12k_wmi_peer_create_arg peer_param = {}; 9685 struct ieee80211_bss_conf *link_conf = NULL; 9686 u32 param_id, param_value; 9687 u16 nss; 9688 int i; 9689 int ret, vdev_id; 9690 u8 link_id; 9691 9692 lockdep_assert_wiphy(hw->wiphy); 9693 9694 /* In NO_VIRTUAL_MONITOR, its necessary to restrict only one monitor 9695 * interface in each radio 9696 */ 9697 if (vif->type == NL80211_IFTYPE_MONITOR && ar->monitor_vdev_created) 9698 return -EINVAL; 9699 9700 link_id = arvif->link_id; 9701 9702 if (link_id < IEEE80211_MLD_MAX_NUM_LINKS) { 9703 link_conf = wiphy_dereference(hw->wiphy, vif->link_conf[link_id]); 9704 if (!link_conf) { 9705 ath12k_warn(ar->ab, "unable to access bss link conf in vdev create for vif %pM link %u\n", 9706 vif->addr, arvif->link_id); 9707 return -ENOLINK; 9708 } 9709 } 9710 9711 if (link_conf) 9712 memcpy(arvif->bssid, link_conf->addr, ETH_ALEN); 9713 else 9714 memcpy(arvif->bssid, vif->addr, ETH_ALEN); 9715 9716 arvif->ar = ar; 9717 vdev_id = __ffs64(ab->free_vdev_map); 9718 arvif->vdev_id = vdev_id; 9719 if (vif->type == NL80211_IFTYPE_MONITOR) 9720 ar->monitor_vdev_id = vdev_id; 9721 9722 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev create id %d type %d subtype %d map %llx\n", 9723 arvif->vdev_id, ahvif->vdev_type, ahvif->vdev_subtype, 9724 ab->free_vdev_map); 9725 9726 vif->cab_queue = arvif->vdev_id % (ATH12K_HW_MAX_QUEUES - 1); 9727 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++) 9728 vif->hw_queue[i] = i % (ATH12K_HW_MAX_QUEUES - 1); 9729 9730 ret = ath12k_mac_setup_vdev_create_arg(arvif, &vdev_arg); 9731 if (ret) { 9732 ath12k_warn(ab, "failed to create vdev parameters %d: %d\n", 9733 arvif->vdev_id, ret); 9734 goto err; 9735 } 9736 9737 ret = ath12k_wmi_vdev_create(ar, arvif->bssid, &vdev_arg); 9738 if (ret) { 9739 ath12k_warn(ab, "failed to create WMI vdev %d: %d\n", 9740 arvif->vdev_id, ret); 9741 return ret; 9742 } 9743 9744 ar->num_created_vdevs++; 9745 arvif->is_created = true; 9746 ath12k_dbg(ab, ATH12K_DBG_MAC, "vdev %pM created, vdev_id %d\n", 9747 vif->addr, arvif->vdev_id); 9748 ar->allocated_vdev_map |= 1LL << arvif->vdev_id; 9749 ab->free_vdev_map &= ~(1LL << arvif->vdev_id); 9750 9751 spin_lock_bh(&ar->data_lock); 9752 list_add(&arvif->list, &ar->arvifs); 9753 spin_unlock_bh(&ar->data_lock); 9754 9755 ath12k_mac_update_vif_offload(arvif); 9756 9757 nss = hweight32(ar->cfg_tx_chainmask) ? : 1; 9758 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 9759 WMI_VDEV_PARAM_NSS, nss); 9760 if (ret) { 9761 ath12k_warn(ab, "failed to set vdev %d chainmask 0x%x, nss %d :%d\n", 9762 arvif->vdev_id, ar->cfg_tx_chainmask, nss, ret); 9763 goto err_vdev_del; 9764 } 9765 9766 switch (ahvif->vdev_type) { 9767 case WMI_VDEV_TYPE_AP: 9768 peer_param.vdev_id = arvif->vdev_id; 9769 peer_param.peer_addr = arvif->bssid; 9770 peer_param.peer_type = WMI_PEER_TYPE_DEFAULT; 9771 ret = ath12k_peer_create(ar, arvif, NULL, &peer_param); 9772 if (ret) { 9773 ath12k_warn(ab, "failed to vdev %d create peer for AP: %d\n", 9774 arvif->vdev_id, ret); 9775 goto err_vdev_del; 9776 } 9777 9778 ret = ath12k_mac_set_kickout(arvif); 9779 if (ret) { 9780 ath12k_warn(ar->ab, "failed to set vdev %i kickout parameters: %d\n", 9781 arvif->vdev_id, ret); 9782 goto err_peer_del; 9783 } 9784 ath12k_mac_11d_scan_stop_all(ar->ab); 9785 break; 9786 case WMI_VDEV_TYPE_STA: 9787 param_id = WMI_STA_PS_PARAM_RX_WAKE_POLICY; 9788 param_value = WMI_STA_PS_RX_WAKE_POLICY_WAKE; 9789 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, 9790 param_id, param_value); 9791 if (ret) { 9792 ath12k_warn(ar->ab, "failed to set vdev %d RX wake policy: %d\n", 9793 arvif->vdev_id, ret); 9794 goto err_peer_del; 9795 } 9796 9797 param_id = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD; 9798 param_value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS; 9799 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, 9800 param_id, param_value); 9801 if (ret) { 9802 ath12k_warn(ar->ab, "failed to set vdev %d TX wake threshold: %d\n", 9803 arvif->vdev_id, ret); 9804 goto err_peer_del; 9805 } 9806 9807 param_id = WMI_STA_PS_PARAM_PSPOLL_COUNT; 9808 param_value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX; 9809 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, 9810 param_id, param_value); 9811 if (ret) { 9812 ath12k_warn(ar->ab, "failed to set vdev %d pspoll count: %d\n", 9813 arvif->vdev_id, ret); 9814 goto err_peer_del; 9815 } 9816 9817 ret = ath12k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, false); 9818 if (ret) { 9819 ath12k_warn(ar->ab, "failed to disable vdev %d ps mode: %d\n", 9820 arvif->vdev_id, ret); 9821 goto err_peer_del; 9822 } 9823 9824 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ab->wmi_ab.svc_map) && 9825 ahvif->vdev_type == WMI_VDEV_TYPE_STA && 9826 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) { 9827 reinit_completion(&ar->completed_11d_scan); 9828 ar->state_11d = ATH12K_11D_PREPARING; 9829 } 9830 break; 9831 case WMI_VDEV_TYPE_MONITOR: 9832 ar->monitor_vdev_created = true; 9833 break; 9834 default: 9835 break; 9836 } 9837 9838 if (link_conf) 9839 arvif->txpower = link_conf->txpower; 9840 else 9841 arvif->txpower = NL80211_TX_POWER_AUTOMATIC; 9842 9843 ret = ath12k_mac_txpower_recalc(ar); 9844 if (ret) 9845 goto err_peer_del; 9846 9847 param_id = WMI_VDEV_PARAM_RTS_THRESHOLD; 9848 param_value = hw->wiphy->rts_threshold; 9849 ar->rts_threshold = param_value; 9850 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 9851 param_id, param_value); 9852 if (ret) { 9853 ath12k_warn(ar->ab, "failed to set rts threshold for vdev %d: %d\n", 9854 arvif->vdev_id, ret); 9855 } 9856 9857 ath12k_dp_vdev_tx_attach(ar, arvif); 9858 9859 return ret; 9860 9861 err_peer_del: 9862 if (ahvif->vdev_type == WMI_VDEV_TYPE_AP) { 9863 reinit_completion(&ar->peer_delete_done); 9864 9865 ret = ath12k_wmi_send_peer_delete_cmd(ar, arvif->bssid, 9866 arvif->vdev_id); 9867 if (ret) { 9868 ath12k_warn(ar->ab, "failed to delete peer vdev_id %d addr %pM\n", 9869 arvif->vdev_id, arvif->bssid); 9870 goto err; 9871 } 9872 9873 ret = ath12k_wait_for_peer_delete_done(ar, arvif->vdev_id, 9874 arvif->bssid); 9875 if (ret) 9876 goto err_vdev_del; 9877 9878 ar->num_peers--; 9879 } 9880 9881 err_vdev_del: 9882 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { 9883 ar->monitor_vdev_id = -1; 9884 ar->monitor_vdev_created = false; 9885 } 9886 9887 ath12k_wmi_vdev_delete(ar, arvif->vdev_id); 9888 ar->num_created_vdevs--; 9889 arvif->is_created = false; 9890 arvif->ar = NULL; 9891 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id); 9892 ab->free_vdev_map |= 1LL << arvif->vdev_id; 9893 ab->free_vdev_stats_id_map &= ~(1LL << arvif->vdev_stats_id); 9894 spin_lock_bh(&ar->data_lock); 9895 list_del(&arvif->list); 9896 spin_unlock_bh(&ar->data_lock); 9897 9898 err: 9899 arvif->ar = NULL; 9900 return ret; 9901 } 9902 9903 static void ath12k_mac_vif_flush_key_cache(struct ath12k_link_vif *arvif) 9904 { 9905 struct ath12k_key_conf *key_conf, *tmp; 9906 struct ath12k_vif *ahvif = arvif->ahvif; 9907 struct ath12k_hw *ah = ahvif->ah; 9908 struct ath12k_sta *ahsta; 9909 struct ath12k_link_sta *arsta; 9910 struct ath12k_vif_cache *cache = ahvif->cache[arvif->link_id]; 9911 int ret; 9912 9913 lockdep_assert_wiphy(ah->hw->wiphy); 9914 9915 list_for_each_entry_safe(key_conf, tmp, &cache->key_conf.list, list) { 9916 arsta = NULL; 9917 if (key_conf->sta) { 9918 ahsta = ath12k_sta_to_ahsta(key_conf->sta); 9919 arsta = wiphy_dereference(ah->hw->wiphy, 9920 ahsta->link[arvif->link_id]); 9921 if (!arsta) 9922 goto free_cache; 9923 } 9924 9925 ret = ath12k_mac_set_key(arvif->ar, key_conf->cmd, 9926 arvif, arsta, 9927 key_conf->key); 9928 if (ret) 9929 ath12k_warn(arvif->ar->ab, "unable to apply set key param to vdev %d ret %d\n", 9930 arvif->vdev_id, ret); 9931 free_cache: 9932 list_del(&key_conf->list); 9933 kfree(key_conf); 9934 } 9935 } 9936 9937 static void ath12k_mac_vif_cache_flush(struct ath12k *ar, struct ath12k_link_vif *arvif) 9938 { 9939 struct ath12k_vif *ahvif = arvif->ahvif; 9940 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif); 9941 struct ath12k_vif_cache *cache = ahvif->cache[arvif->link_id]; 9942 struct ath12k_base *ab = ar->ab; 9943 struct ieee80211_bss_conf *link_conf; 9944 9945 int ret; 9946 9947 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 9948 9949 if (!cache) 9950 return; 9951 9952 if (cache->tx_conf.changed) { 9953 ret = ath12k_mac_conf_tx(arvif, cache->tx_conf.ac, 9954 &cache->tx_conf.tx_queue_params); 9955 if (ret) 9956 ath12k_warn(ab, 9957 "unable to apply tx config parameters to vdev %d\n", 9958 ret); 9959 } 9960 9961 if (cache->bss_conf_changed) { 9962 link_conf = ath12k_mac_get_link_bss_conf(arvif); 9963 if (!link_conf) { 9964 ath12k_warn(ar->ab, "unable to access bss link conf in cache flush for vif %pM link %u\n", 9965 vif->addr, arvif->link_id); 9966 return; 9967 } 9968 ath12k_mac_bss_info_changed(ar, arvif, link_conf, 9969 cache->bss_conf_changed); 9970 } 9971 9972 if (!list_empty(&cache->key_conf.list)) 9973 ath12k_mac_vif_flush_key_cache(arvif); 9974 9975 ath12k_ahvif_put_link_cache(ahvif, arvif->link_id); 9976 } 9977 9978 static struct ath12k *ath12k_mac_assign_vif_to_vdev(struct ieee80211_hw *hw, 9979 struct ath12k_link_vif *arvif, 9980 struct ieee80211_chanctx_conf *ctx) 9981 { 9982 struct ath12k_vif *ahvif = arvif->ahvif; 9983 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif); 9984 struct ath12k_link_vif *scan_arvif; 9985 struct ath12k_hw *ah = hw->priv; 9986 struct ath12k *ar; 9987 struct ath12k_base *ab; 9988 u8 link_id = arvif->link_id, scan_link_id; 9989 unsigned long scan_link_map; 9990 int ret; 9991 9992 lockdep_assert_wiphy(hw->wiphy); 9993 9994 if (ah->num_radio == 1) 9995 ar = ah->radio; 9996 else if (ctx) 9997 ar = ath12k_get_ar_by_ctx(hw, ctx); 9998 else 9999 return NULL; 10000 10001 if (!ar) 10002 return NULL; 10003 10004 /* cleanup the scan vdev if we are done scan on that ar 10005 * and now we want to create for actual usage. 10006 */ 10007 if (ieee80211_vif_is_mld(vif)) { 10008 scan_link_map = ahvif->links_map & ATH12K_SCAN_LINKS_MASK; 10009 for_each_set_bit(scan_link_id, &scan_link_map, ATH12K_NUM_MAX_LINKS) { 10010 scan_arvif = wiphy_dereference(hw->wiphy, 10011 ahvif->link[scan_link_id]); 10012 if (scan_arvif && scan_arvif->ar == ar) { 10013 ar->scan.arvif = NULL; 10014 ath12k_mac_remove_link_interface(hw, scan_arvif); 10015 ath12k_mac_unassign_link_vif(scan_arvif); 10016 break; 10017 } 10018 } 10019 } 10020 10021 if (arvif->ar) { 10022 /* This is not expected really */ 10023 if (WARN_ON(!arvif->is_created)) { 10024 arvif->ar = NULL; 10025 return NULL; 10026 } 10027 10028 if (ah->num_radio == 1) 10029 return arvif->ar; 10030 10031 /* This can happen as scan vdev gets created during multiple scans 10032 * across different radios before a vdev is brought up in 10033 * a certain radio. 10034 */ 10035 if (ar != arvif->ar) { 10036 if (WARN_ON(arvif->is_started)) 10037 return NULL; 10038 10039 ath12k_mac_remove_link_interface(hw, arvif); 10040 ath12k_mac_unassign_link_vif(arvif); 10041 } 10042 } 10043 10044 ab = ar->ab; 10045 10046 /* Assign arvif again here since previous radio switch block 10047 * would've unassigned and cleared it. 10048 */ 10049 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id); 10050 if (vif->type == NL80211_IFTYPE_AP && 10051 ar->num_peers > (ar->max_num_peers - 1)) { 10052 ath12k_warn(ab, "failed to create vdev due to insufficient peer entry resource in firmware\n"); 10053 goto unlock; 10054 } 10055 10056 if (arvif->is_created) 10057 goto flush; 10058 10059 if (ar->num_created_vdevs > (TARGET_NUM_VDEVS(ab) - 1)) { 10060 ath12k_warn(ab, "failed to create vdev, reached max vdev limit %d\n", 10061 TARGET_NUM_VDEVS(ab)); 10062 goto unlock; 10063 } 10064 10065 ret = ath12k_mac_vdev_create(ar, arvif); 10066 if (ret) { 10067 ath12k_warn(ab, "failed to create vdev %pM ret %d", vif->addr, ret); 10068 goto unlock; 10069 } 10070 10071 flush: 10072 /* If the vdev is created during channel assign and not during 10073 * add_interface(), Apply any parameters for the vdev which were received 10074 * after add_interface, corresponding to this vif. 10075 */ 10076 ath12k_mac_vif_cache_flush(ar, arvif); 10077 unlock: 10078 return arvif->ar; 10079 } 10080 10081 static int ath12k_mac_op_add_interface(struct ieee80211_hw *hw, 10082 struct ieee80211_vif *vif) 10083 { 10084 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 10085 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 10086 struct ath12k_reg_info *reg_info; 10087 struct ath12k_link_vif *arvif; 10088 struct ath12k_base *ab; 10089 struct ath12k *ar; 10090 int i; 10091 10092 lockdep_assert_wiphy(hw->wiphy); 10093 10094 memset(ahvif, 0, sizeof(*ahvif)); 10095 10096 ahvif->ah = ah; 10097 ahvif->vif = vif; 10098 arvif = &ahvif->deflink; 10099 10100 ath12k_mac_init_arvif(ahvif, arvif, -1); 10101 10102 /* Allocate Default Queue now and reassign during actual vdev create */ 10103 vif->cab_queue = ATH12K_HW_DEFAULT_QUEUE; 10104 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++) 10105 vif->hw_queue[i] = ATH12K_HW_DEFAULT_QUEUE; 10106 10107 vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD; 10108 10109 ath12k_mac_determine_vdev_type(vif, ahvif); 10110 10111 for_each_ar(ah, ar, i) { 10112 if (!ath12k_wmi_supports_6ghz_cc_ext(ar)) 10113 continue; 10114 10115 ab = ar->ab; 10116 reg_info = ab->reg_info[ar->pdev_idx]; 10117 ath12k_dbg(ab, ATH12K_DBG_MAC, "interface added to change reg rules\n"); 10118 ah->regd_updated = false; 10119 ath12k_reg_handle_chan_list(ab, reg_info, ahvif->vdev_type, 10120 IEEE80211_REG_UNSET_AP); 10121 break; 10122 } 10123 10124 /* Defer vdev creation until assign_chanctx or hw_scan is initiated as driver 10125 * will not know if this interface is an ML vif at this point. 10126 */ 10127 return 0; 10128 } 10129 10130 static void ath12k_mac_vif_unref(struct ath12k_dp *dp, struct ieee80211_vif *vif) 10131 { 10132 struct ath12k_tx_desc_info *tx_desc_info; 10133 struct ath12k_skb_cb *skb_cb; 10134 struct sk_buff *skb; 10135 int i; 10136 10137 for (i = 0; i < ATH12K_HW_MAX_QUEUES; i++) { 10138 spin_lock_bh(&dp->tx_desc_lock[i]); 10139 10140 list_for_each_entry(tx_desc_info, &dp->tx_desc_used_list[i], 10141 list) { 10142 skb = tx_desc_info->skb; 10143 if (!skb) 10144 continue; 10145 10146 skb_cb = ATH12K_SKB_CB(skb); 10147 if (skb_cb->vif == vif) 10148 skb_cb->vif = NULL; 10149 } 10150 10151 spin_unlock_bh(&dp->tx_desc_lock[i]); 10152 } 10153 } 10154 10155 static int ath12k_mac_vdev_delete(struct ath12k *ar, struct ath12k_link_vif *arvif) 10156 { 10157 struct ath12k_vif *ahvif = arvif->ahvif; 10158 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif); 10159 struct ath12k_base *ab = ar->ab; 10160 unsigned long time_left; 10161 int ret; 10162 10163 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 10164 10165 reinit_completion(&ar->vdev_delete_done); 10166 10167 ret = ath12k_wmi_vdev_delete(ar, arvif->vdev_id); 10168 if (ret) { 10169 ath12k_warn(ab, "failed to delete WMI vdev %d: %d\n", 10170 arvif->vdev_id, ret); 10171 goto err_vdev_del; 10172 } 10173 10174 time_left = wait_for_completion_timeout(&ar->vdev_delete_done, 10175 ATH12K_VDEV_DELETE_TIMEOUT_HZ); 10176 if (time_left == 0) { 10177 ath12k_warn(ab, "Timeout in receiving vdev delete response\n"); 10178 goto err_vdev_del; 10179 } 10180 10181 ab->free_vdev_map |= 1LL << arvif->vdev_id; 10182 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id); 10183 ar->num_created_vdevs--; 10184 10185 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { 10186 ar->monitor_vdev_id = -1; 10187 ar->monitor_vdev_created = false; 10188 } 10189 10190 ath12k_dbg(ab, ATH12K_DBG_MAC, "vdev %pM deleted, vdev_id %d\n", 10191 vif->addr, arvif->vdev_id); 10192 10193 err_vdev_del: 10194 spin_lock_bh(&ar->data_lock); 10195 list_del(&arvif->list); 10196 spin_unlock_bh(&ar->data_lock); 10197 10198 ath12k_peer_cleanup(ar, arvif->vdev_id); 10199 ath12k_ahvif_put_link_cache(ahvif, arvif->link_id); 10200 10201 idr_for_each(&ar->txmgmt_idr, 10202 ath12k_mac_vif_txmgmt_idr_remove, vif); 10203 10204 ath12k_mac_vif_unref(&ab->dp, vif); 10205 ath12k_dp_tx_put_bank_profile(&ab->dp, arvif->bank_id); 10206 10207 /* Recalc txpower for remaining vdev */ 10208 ath12k_mac_txpower_recalc(ar); 10209 10210 /* TODO: recal traffic pause state based on the available vdevs */ 10211 arvif->is_created = false; 10212 arvif->ar = NULL; 10213 10214 return ret; 10215 } 10216 10217 static void ath12k_mac_op_remove_interface(struct ieee80211_hw *hw, 10218 struct ieee80211_vif *vif) 10219 { 10220 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 10221 struct ath12k_link_vif *arvif; 10222 struct ath12k *ar; 10223 u8 link_id; 10224 10225 lockdep_assert_wiphy(hw->wiphy); 10226 10227 for (link_id = 0; link_id < ATH12K_NUM_MAX_LINKS; link_id++) { 10228 /* if we cached some config but never received assign chanctx, 10229 * free the allocated cache. 10230 */ 10231 ath12k_ahvif_put_link_cache(ahvif, link_id); 10232 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 10233 if (!arvif || !arvif->is_created) 10234 continue; 10235 10236 ar = arvif->ar; 10237 10238 /* Scan abortion is in progress since before this, cancel_hw_scan() 10239 * is expected to be executed. Since link is anyways going to be removed 10240 * now, just cancel the worker and send the scan aborted to user space 10241 */ 10242 if (ar->scan.arvif == arvif) { 10243 wiphy_work_cancel(hw->wiphy, &ar->scan.vdev_clean_wk); 10244 10245 spin_lock_bh(&ar->data_lock); 10246 ar->scan.arvif = NULL; 10247 if (!ar->scan.is_roc) { 10248 struct cfg80211_scan_info info = { 10249 .aborted = true, 10250 }; 10251 10252 ath12k_mac_scan_send_complete(ar, &info); 10253 } 10254 10255 ar->scan.state = ATH12K_SCAN_IDLE; 10256 ar->scan_channel = NULL; 10257 ar->scan.roc_freq = 0; 10258 spin_unlock_bh(&ar->data_lock); 10259 } 10260 10261 ath12k_mac_remove_link_interface(hw, arvif); 10262 ath12k_mac_unassign_link_vif(arvif); 10263 } 10264 } 10265 10266 /* FIXME: Has to be verified. */ 10267 #define SUPPORTED_FILTERS \ 10268 (FIF_ALLMULTI | \ 10269 FIF_CONTROL | \ 10270 FIF_PSPOLL | \ 10271 FIF_OTHER_BSS | \ 10272 FIF_BCN_PRBRESP_PROMISC | \ 10273 FIF_PROBE_REQ | \ 10274 FIF_FCSFAIL) 10275 10276 static void ath12k_mac_op_configure_filter(struct ieee80211_hw *hw, 10277 unsigned int changed_flags, 10278 unsigned int *total_flags, 10279 u64 multicast) 10280 { 10281 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 10282 struct ath12k *ar; 10283 10284 lockdep_assert_wiphy(hw->wiphy); 10285 10286 ar = ath12k_ah_to_ar(ah, 0); 10287 10288 *total_flags &= SUPPORTED_FILTERS; 10289 ar->filter_flags = *total_flags; 10290 } 10291 10292 static int ath12k_mac_op_get_antenna(struct ieee80211_hw *hw, int radio_idx, 10293 u32 *tx_ant, u32 *rx_ant) 10294 { 10295 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 10296 int antennas_rx = 0, antennas_tx = 0; 10297 struct ath12k *ar; 10298 int i; 10299 10300 lockdep_assert_wiphy(hw->wiphy); 10301 10302 for_each_ar(ah, ar, i) { 10303 antennas_rx = max_t(u32, antennas_rx, ar->cfg_rx_chainmask); 10304 antennas_tx = max_t(u32, antennas_tx, ar->cfg_tx_chainmask); 10305 } 10306 10307 *tx_ant = antennas_tx; 10308 *rx_ant = antennas_rx; 10309 10310 return 0; 10311 } 10312 10313 static int ath12k_mac_op_set_antenna(struct ieee80211_hw *hw, int radio_idx, 10314 u32 tx_ant, u32 rx_ant) 10315 { 10316 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 10317 struct ath12k *ar; 10318 int ret = 0; 10319 int i; 10320 10321 lockdep_assert_wiphy(hw->wiphy); 10322 10323 for_each_ar(ah, ar, i) { 10324 ret = __ath12k_set_antenna(ar, tx_ant, rx_ant); 10325 if (ret) 10326 break; 10327 } 10328 10329 return ret; 10330 } 10331 10332 static int ath12k_mac_ampdu_action(struct ieee80211_hw *hw, 10333 struct ieee80211_vif *vif, 10334 struct ieee80211_ampdu_params *params, 10335 u8 link_id) 10336 { 10337 struct ath12k *ar; 10338 int ret = -EINVAL; 10339 10340 lockdep_assert_wiphy(hw->wiphy); 10341 10342 ar = ath12k_get_ar_by_vif(hw, vif, link_id); 10343 if (!ar) 10344 return -EINVAL; 10345 10346 switch (params->action) { 10347 case IEEE80211_AMPDU_RX_START: 10348 ret = ath12k_dp_rx_ampdu_start(ar, params, link_id); 10349 break; 10350 case IEEE80211_AMPDU_RX_STOP: 10351 ret = ath12k_dp_rx_ampdu_stop(ar, params, link_id); 10352 break; 10353 case IEEE80211_AMPDU_TX_START: 10354 case IEEE80211_AMPDU_TX_STOP_CONT: 10355 case IEEE80211_AMPDU_TX_STOP_FLUSH: 10356 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT: 10357 case IEEE80211_AMPDU_TX_OPERATIONAL: 10358 /* Tx A-MPDU aggregation offloaded to hw/fw so deny mac80211 10359 * Tx aggregation requests. 10360 */ 10361 ret = -EOPNOTSUPP; 10362 break; 10363 } 10364 10365 if (ret) 10366 ath12k_warn(ar->ab, "unable to perform ampdu action %d for vif %pM link %u ret %d\n", 10367 params->action, vif->addr, link_id, ret); 10368 10369 return ret; 10370 } 10371 10372 static int ath12k_mac_op_ampdu_action(struct ieee80211_hw *hw, 10373 struct ieee80211_vif *vif, 10374 struct ieee80211_ampdu_params *params) 10375 { 10376 struct ieee80211_sta *sta = params->sta; 10377 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta); 10378 unsigned long links_map = ahsta->links_map; 10379 int ret = -EINVAL; 10380 u8 link_id; 10381 10382 lockdep_assert_wiphy(hw->wiphy); 10383 10384 if (WARN_ON(!links_map)) 10385 return ret; 10386 10387 for_each_set_bit(link_id, &links_map, IEEE80211_MLD_MAX_NUM_LINKS) { 10388 ret = ath12k_mac_ampdu_action(hw, vif, params, link_id); 10389 if (ret) 10390 return ret; 10391 } 10392 10393 return 0; 10394 } 10395 10396 static int ath12k_mac_op_add_chanctx(struct ieee80211_hw *hw, 10397 struct ieee80211_chanctx_conf *ctx) 10398 { 10399 struct ath12k *ar; 10400 struct ath12k_base *ab; 10401 10402 lockdep_assert_wiphy(hw->wiphy); 10403 10404 ar = ath12k_get_ar_by_ctx(hw, ctx); 10405 if (!ar) 10406 return -EINVAL; 10407 10408 ab = ar->ab; 10409 10410 ath12k_dbg(ab, ATH12K_DBG_MAC, 10411 "mac chanctx add freq %u width %d ptr %p\n", 10412 ctx->def.chan->center_freq, ctx->def.width, ctx); 10413 10414 spin_lock_bh(&ar->data_lock); 10415 /* TODO: In case of multiple channel context, populate rx_channel from 10416 * Rx PPDU desc information. 10417 */ 10418 ar->rx_channel = ctx->def.chan; 10419 spin_unlock_bh(&ar->data_lock); 10420 ar->chan_tx_pwr = ATH12K_PDEV_TX_POWER_INVALID; 10421 10422 return 0; 10423 } 10424 10425 static void ath12k_mac_op_remove_chanctx(struct ieee80211_hw *hw, 10426 struct ieee80211_chanctx_conf *ctx) 10427 { 10428 struct ath12k *ar; 10429 struct ath12k_base *ab; 10430 10431 lockdep_assert_wiphy(hw->wiphy); 10432 10433 ar = ath12k_get_ar_by_ctx(hw, ctx); 10434 if (!ar) 10435 return; 10436 10437 ab = ar->ab; 10438 10439 ath12k_dbg(ab, ATH12K_DBG_MAC, 10440 "mac chanctx remove freq %u width %d ptr %p\n", 10441 ctx->def.chan->center_freq, ctx->def.width, ctx); 10442 10443 spin_lock_bh(&ar->data_lock); 10444 /* TODO: In case of there is one more channel context left, populate 10445 * rx_channel with the channel of that remaining channel context. 10446 */ 10447 ar->rx_channel = NULL; 10448 spin_unlock_bh(&ar->data_lock); 10449 ar->chan_tx_pwr = ATH12K_PDEV_TX_POWER_INVALID; 10450 } 10451 10452 static enum wmi_phy_mode 10453 ath12k_mac_check_down_grade_phy_mode(struct ath12k *ar, 10454 enum wmi_phy_mode mode, 10455 enum nl80211_band band, 10456 enum nl80211_iftype type) 10457 { 10458 struct ieee80211_sta_eht_cap *eht_cap = NULL; 10459 enum wmi_phy_mode down_mode; 10460 int n = ar->mac.sbands[band].n_iftype_data; 10461 int i; 10462 struct ieee80211_sband_iftype_data *data; 10463 10464 if (mode < MODE_11BE_EHT20) 10465 return mode; 10466 10467 data = ar->mac.iftype[band]; 10468 for (i = 0; i < n; i++) { 10469 if (data[i].types_mask & BIT(type)) { 10470 eht_cap = &data[i].eht_cap; 10471 break; 10472 } 10473 } 10474 10475 if (eht_cap && eht_cap->has_eht) 10476 return mode; 10477 10478 switch (mode) { 10479 case MODE_11BE_EHT20: 10480 down_mode = MODE_11AX_HE20; 10481 break; 10482 case MODE_11BE_EHT40: 10483 down_mode = MODE_11AX_HE40; 10484 break; 10485 case MODE_11BE_EHT80: 10486 down_mode = MODE_11AX_HE80; 10487 break; 10488 case MODE_11BE_EHT80_80: 10489 down_mode = MODE_11AX_HE80_80; 10490 break; 10491 case MODE_11BE_EHT160: 10492 case MODE_11BE_EHT160_160: 10493 case MODE_11BE_EHT320: 10494 down_mode = MODE_11AX_HE160; 10495 break; 10496 case MODE_11BE_EHT20_2G: 10497 down_mode = MODE_11AX_HE20_2G; 10498 break; 10499 case MODE_11BE_EHT40_2G: 10500 down_mode = MODE_11AX_HE40_2G; 10501 break; 10502 default: 10503 down_mode = mode; 10504 break; 10505 } 10506 10507 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 10508 "mac vdev start phymode %s downgrade to %s\n", 10509 ath12k_mac_phymode_str(mode), 10510 ath12k_mac_phymode_str(down_mode)); 10511 10512 return down_mode; 10513 } 10514 10515 static void 10516 ath12k_mac_mlo_get_vdev_args(struct ath12k_link_vif *arvif, 10517 struct wmi_ml_arg *ml_arg) 10518 { 10519 struct ath12k_vif *ahvif = arvif->ahvif; 10520 struct wmi_ml_partner_info *partner_info; 10521 struct ieee80211_bss_conf *link_conf; 10522 struct ath12k_link_vif *arvif_p; 10523 unsigned long links; 10524 u8 link_id; 10525 10526 lockdep_assert_wiphy(ahvif->ah->hw->wiphy); 10527 10528 if (!ath12k_mac_is_ml_arvif(arvif)) 10529 return; 10530 10531 if (hweight16(ahvif->vif->valid_links) > ATH12K_WMI_MLO_MAX_LINKS) 10532 return; 10533 10534 ml_arg->enabled = true; 10535 10536 /* Driver always add a new link via VDEV START, FW takes 10537 * care of internally adding this link to existing 10538 * link vdevs which are advertised as partners below 10539 */ 10540 ml_arg->link_add = true; 10541 10542 ml_arg->assoc_link = arvif->is_sta_assoc_link; 10543 10544 partner_info = ml_arg->partner_info; 10545 10546 links = ahvif->links_map; 10547 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) { 10548 arvif_p = wiphy_dereference(ahvif->ah->hw->wiphy, ahvif->link[link_id]); 10549 10550 if (WARN_ON(!arvif_p)) 10551 continue; 10552 10553 if (arvif == arvif_p) 10554 continue; 10555 10556 if (!arvif_p->is_created) 10557 continue; 10558 10559 link_conf = wiphy_dereference(ahvif->ah->hw->wiphy, 10560 ahvif->vif->link_conf[arvif_p->link_id]); 10561 10562 if (!link_conf) 10563 continue; 10564 10565 partner_info->vdev_id = arvif_p->vdev_id; 10566 partner_info->hw_link_id = arvif_p->ar->pdev->hw_link_id; 10567 ether_addr_copy(partner_info->addr, link_conf->addr); 10568 ml_arg->num_partner_links++; 10569 partner_info++; 10570 } 10571 } 10572 10573 static int 10574 ath12k_mac_vdev_start_restart(struct ath12k_link_vif *arvif, 10575 struct ieee80211_chanctx_conf *ctx, 10576 bool restart) 10577 { 10578 struct ath12k *ar = arvif->ar; 10579 struct ath12k_base *ab = ar->ab; 10580 struct wmi_vdev_start_req_arg arg = {}; 10581 const struct cfg80211_chan_def *chandef = &ctx->def; 10582 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar); 10583 struct ath12k_vif *ahvif = arvif->ahvif; 10584 struct ieee80211_bss_conf *link_conf; 10585 unsigned int dfs_cac_time; 10586 int ret; 10587 10588 lockdep_assert_wiphy(hw->wiphy); 10589 10590 link_conf = ath12k_mac_get_link_bss_conf(arvif); 10591 if (!link_conf) { 10592 ath12k_warn(ar->ab, "unable to access bss link conf in vdev start for vif %pM link %u\n", 10593 ahvif->vif->addr, arvif->link_id); 10594 return -ENOLINK; 10595 } 10596 10597 reinit_completion(&ar->vdev_setup_done); 10598 10599 arg.vdev_id = arvif->vdev_id; 10600 arg.dtim_period = arvif->dtim_period; 10601 arg.bcn_intval = arvif->beacon_interval; 10602 arg.punct_bitmap = ~arvif->punct_bitmap; 10603 10604 arg.freq = chandef->chan->center_freq; 10605 arg.band_center_freq1 = chandef->center_freq1; 10606 arg.band_center_freq2 = chandef->center_freq2; 10607 arg.mode = ath12k_phymodes[chandef->chan->band][chandef->width]; 10608 10609 arg.mode = ath12k_mac_check_down_grade_phy_mode(ar, arg.mode, 10610 chandef->chan->band, 10611 ahvif->vif->type); 10612 arg.min_power = 0; 10613 arg.max_power = chandef->chan->max_power; 10614 arg.max_reg_power = chandef->chan->max_reg_power; 10615 arg.max_antenna_gain = chandef->chan->max_antenna_gain; 10616 10617 arg.pref_tx_streams = ar->num_tx_chains; 10618 arg.pref_rx_streams = ar->num_rx_chains; 10619 10620 arg.mbssid_flags = WMI_VDEV_MBSSID_FLAGS_NON_MBSSID_AP; 10621 arg.mbssid_tx_vdev_id = 0; 10622 if (test_bit(WMI_TLV_SERVICE_MBSS_PARAM_IN_VDEV_START_SUPPORT, 10623 ar->ab->wmi_ab.svc_map)) { 10624 ret = ath12k_mac_setup_vdev_params_mbssid(arvif, 10625 &arg.mbssid_flags, 10626 &arg.mbssid_tx_vdev_id); 10627 if (ret) 10628 return ret; 10629 } 10630 10631 if (ahvif->vdev_type == WMI_VDEV_TYPE_AP) { 10632 arg.ssid = ahvif->u.ap.ssid; 10633 arg.ssid_len = ahvif->u.ap.ssid_len; 10634 arg.hidden_ssid = ahvif->u.ap.hidden_ssid; 10635 10636 /* For now allow DFS for AP mode */ 10637 arg.chan_radar = !!(chandef->chan->flags & IEEE80211_CHAN_RADAR); 10638 10639 arg.freq2_radar = ctx->radar_enabled; 10640 10641 arg.passive = arg.chan_radar; 10642 10643 spin_lock_bh(&ab->base_lock); 10644 arg.regdomain = ar->ab->dfs_region; 10645 spin_unlock_bh(&ab->base_lock); 10646 10647 /* TODO: Notify if secondary 80Mhz also needs radar detection */ 10648 } 10649 10650 arg.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR); 10651 10652 if (!restart) 10653 ath12k_mac_mlo_get_vdev_args(arvif, &arg.ml); 10654 10655 ath12k_dbg(ab, ATH12K_DBG_MAC, 10656 "mac vdev %d start center_freq %d phymode %s punct_bitmap 0x%x\n", 10657 arg.vdev_id, arg.freq, 10658 ath12k_mac_phymode_str(arg.mode), arg.punct_bitmap); 10659 10660 ret = ath12k_wmi_vdev_start(ar, &arg, restart); 10661 if (ret) { 10662 ath12k_warn(ar->ab, "failed to %s WMI vdev %i\n", 10663 restart ? "restart" : "start", arg.vdev_id); 10664 return ret; 10665 } 10666 10667 ret = ath12k_mac_vdev_setup_sync(ar); 10668 if (ret) { 10669 ath12k_warn(ab, "failed to synchronize setup for vdev %i %s: %d\n", 10670 arg.vdev_id, restart ? "restart" : "start", ret); 10671 return ret; 10672 } 10673 10674 /* TODO: For now we only set TPC power here. However when 10675 * channel changes, say CSA, it should be updated again. 10676 */ 10677 if (ath12k_mac_supports_tpc(ar, ahvif, chandef)) { 10678 ath12k_mac_fill_reg_tpc_info(ar, arvif, ctx); 10679 ath12k_wmi_send_vdev_set_tpc_power(ar, arvif->vdev_id, 10680 &arvif->reg_tpc_info); 10681 } 10682 10683 ar->num_started_vdevs++; 10684 ath12k_dbg(ab, ATH12K_DBG_MAC, "vdev %pM started, vdev_id %d\n", 10685 ahvif->vif->addr, arvif->vdev_id); 10686 10687 /* Enable CAC Running Flag in the driver by checking all sub-channel's DFS 10688 * state as NL80211_DFS_USABLE which indicates CAC needs to be 10689 * done before channel usage. This flag is used to drop rx packets. 10690 * during CAC. 10691 */ 10692 /* TODO: Set the flag for other interface types as required */ 10693 if (arvif->ahvif->vdev_type == WMI_VDEV_TYPE_AP && ctx->radar_enabled && 10694 cfg80211_chandef_dfs_usable(hw->wiphy, chandef)) { 10695 set_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags); 10696 dfs_cac_time = cfg80211_chandef_dfs_cac_time(hw->wiphy, chandef); 10697 10698 ath12k_dbg(ab, ATH12K_DBG_MAC, 10699 "CAC started dfs_cac_time %u center_freq %d center_freq1 %d for vdev %d\n", 10700 dfs_cac_time, arg.freq, arg.band_center_freq1, arg.vdev_id); 10701 } 10702 10703 ret = ath12k_mac_set_txbf_conf(arvif); 10704 if (ret) 10705 ath12k_warn(ab, "failed to set txbf conf for vdev %d: %d\n", 10706 arvif->vdev_id, ret); 10707 10708 return 0; 10709 } 10710 10711 static int ath12k_mac_vdev_start(struct ath12k_link_vif *arvif, 10712 struct ieee80211_chanctx_conf *ctx) 10713 { 10714 return ath12k_mac_vdev_start_restart(arvif, ctx, false); 10715 } 10716 10717 static int ath12k_mac_vdev_restart(struct ath12k_link_vif *arvif, 10718 struct ieee80211_chanctx_conf *ctx) 10719 { 10720 return ath12k_mac_vdev_start_restart(arvif, ctx, true); 10721 } 10722 10723 struct ath12k_mac_change_chanctx_arg { 10724 struct ieee80211_chanctx_conf *ctx; 10725 struct ieee80211_vif_chanctx_switch *vifs; 10726 int n_vifs; 10727 int next_vif; 10728 struct ath12k *ar; 10729 }; 10730 10731 static void 10732 ath12k_mac_change_chanctx_cnt_iter(void *data, u8 *mac, 10733 struct ieee80211_vif *vif) 10734 { 10735 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 10736 struct ath12k_mac_change_chanctx_arg *arg = data; 10737 struct ieee80211_bss_conf *link_conf; 10738 struct ath12k_link_vif *arvif; 10739 unsigned long links_map; 10740 u8 link_id; 10741 10742 lockdep_assert_wiphy(ahvif->ah->hw->wiphy); 10743 10744 links_map = ahvif->links_map; 10745 for_each_set_bit(link_id, &links_map, IEEE80211_MLD_MAX_NUM_LINKS) { 10746 arvif = wiphy_dereference(ahvif->ah->hw->wiphy, ahvif->link[link_id]); 10747 if (WARN_ON(!arvif)) 10748 continue; 10749 10750 if (!arvif->is_created || arvif->ar != arg->ar) 10751 continue; 10752 10753 link_conf = wiphy_dereference(ahvif->ah->hw->wiphy, 10754 vif->link_conf[link_id]); 10755 if (WARN_ON(!link_conf)) 10756 continue; 10757 10758 if (rcu_access_pointer(link_conf->chanctx_conf) != arg->ctx) 10759 continue; 10760 10761 arg->n_vifs++; 10762 } 10763 } 10764 10765 static void 10766 ath12k_mac_change_chanctx_fill_iter(void *data, u8 *mac, 10767 struct ieee80211_vif *vif) 10768 { 10769 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 10770 struct ath12k_mac_change_chanctx_arg *arg = data; 10771 struct ieee80211_bss_conf *link_conf; 10772 struct ieee80211_chanctx_conf *ctx; 10773 struct ath12k_link_vif *arvif; 10774 unsigned long links_map; 10775 u8 link_id; 10776 10777 lockdep_assert_wiphy(ahvif->ah->hw->wiphy); 10778 10779 links_map = ahvif->links_map; 10780 for_each_set_bit(link_id, &links_map, IEEE80211_MLD_MAX_NUM_LINKS) { 10781 arvif = wiphy_dereference(ahvif->ah->hw->wiphy, ahvif->link[link_id]); 10782 if (WARN_ON(!arvif)) 10783 continue; 10784 10785 if (!arvif->is_created || arvif->ar != arg->ar) 10786 continue; 10787 10788 link_conf = wiphy_dereference(ahvif->ah->hw->wiphy, 10789 vif->link_conf[arvif->link_id]); 10790 if (WARN_ON(!link_conf)) 10791 continue; 10792 10793 ctx = rcu_access_pointer(link_conf->chanctx_conf); 10794 if (ctx != arg->ctx) 10795 continue; 10796 10797 if (WARN_ON(arg->next_vif == arg->n_vifs)) 10798 return; 10799 10800 arg->vifs[arg->next_vif].vif = vif; 10801 arg->vifs[arg->next_vif].old_ctx = ctx; 10802 arg->vifs[arg->next_vif].new_ctx = ctx; 10803 arg->vifs[arg->next_vif].link_conf = link_conf; 10804 arg->next_vif++; 10805 } 10806 } 10807 10808 static u32 ath12k_mac_nlwidth_to_wmiwidth(enum nl80211_chan_width width) 10809 { 10810 switch (width) { 10811 case NL80211_CHAN_WIDTH_20: 10812 return WMI_CHAN_WIDTH_20; 10813 case NL80211_CHAN_WIDTH_40: 10814 return WMI_CHAN_WIDTH_40; 10815 case NL80211_CHAN_WIDTH_80: 10816 return WMI_CHAN_WIDTH_80; 10817 case NL80211_CHAN_WIDTH_160: 10818 return WMI_CHAN_WIDTH_160; 10819 case NL80211_CHAN_WIDTH_80P80: 10820 return WMI_CHAN_WIDTH_80P80; 10821 case NL80211_CHAN_WIDTH_5: 10822 return WMI_CHAN_WIDTH_5; 10823 case NL80211_CHAN_WIDTH_10: 10824 return WMI_CHAN_WIDTH_10; 10825 case NL80211_CHAN_WIDTH_320: 10826 return WMI_CHAN_WIDTH_320; 10827 default: 10828 WARN_ON(1); 10829 return WMI_CHAN_WIDTH_20; 10830 } 10831 } 10832 10833 static int ath12k_mac_update_peer_puncturing_width(struct ath12k *ar, 10834 struct ath12k_link_vif *arvif, 10835 struct cfg80211_chan_def def) 10836 { 10837 u32 param_id, param_value; 10838 int ret; 10839 10840 if (arvif->ahvif->vdev_type != WMI_VDEV_TYPE_STA) 10841 return 0; 10842 10843 param_id = WMI_PEER_CHWIDTH_PUNCTURE_20MHZ_BITMAP; 10844 param_value = ath12k_mac_nlwidth_to_wmiwidth(def.width) | 10845 u32_encode_bits((~def.punctured), 10846 WMI_PEER_PUNCTURE_BITMAP); 10847 10848 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 10849 "punctured bitmap %02x width %d vdev %d\n", 10850 def.punctured, def.width, arvif->vdev_id); 10851 10852 ret = ath12k_wmi_set_peer_param(ar, arvif->bssid, 10853 arvif->vdev_id, param_id, 10854 param_value); 10855 10856 return ret; 10857 } 10858 10859 static void 10860 ath12k_mac_update_vif_chan(struct ath12k *ar, 10861 struct ieee80211_vif_chanctx_switch *vifs, 10862 int n_vifs) 10863 { 10864 struct ath12k_wmi_vdev_up_params params = {}; 10865 struct ath12k_link_vif *arvif; 10866 struct ieee80211_bss_conf *link_conf; 10867 struct ath12k_base *ab = ar->ab; 10868 struct ieee80211_vif *vif; 10869 struct ath12k_vif *ahvif; 10870 u8 link_id; 10871 int ret; 10872 int i; 10873 bool monitor_vif = false; 10874 10875 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 10876 10877 for (i = 0; i < n_vifs; i++) { 10878 vif = vifs[i].vif; 10879 ahvif = ath12k_vif_to_ahvif(vif); 10880 link_conf = vifs[i].link_conf; 10881 link_id = link_conf->link_id; 10882 arvif = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy, 10883 ahvif->link[link_id]); 10884 10885 if (vif->type == NL80211_IFTYPE_MONITOR) { 10886 monitor_vif = true; 10887 continue; 10888 } 10889 10890 ath12k_dbg(ab, ATH12K_DBG_MAC, 10891 "mac chanctx switch vdev_id %i freq %u->%u width %d->%d\n", 10892 arvif->vdev_id, 10893 vifs[i].old_ctx->def.chan->center_freq, 10894 vifs[i].new_ctx->def.chan->center_freq, 10895 vifs[i].old_ctx->def.width, 10896 vifs[i].new_ctx->def.width); 10897 10898 if (WARN_ON(!arvif->is_started)) 10899 continue; 10900 10901 arvif->punct_bitmap = vifs[i].new_ctx->def.punctured; 10902 10903 /* Firmware expect vdev_restart only if vdev is up. 10904 * If vdev is down then it expect vdev_stop->vdev_start. 10905 */ 10906 if (arvif->is_up) { 10907 ret = ath12k_mac_vdev_restart(arvif, vifs[i].new_ctx); 10908 if (ret) { 10909 ath12k_warn(ab, "failed to restart vdev %d: %d\n", 10910 arvif->vdev_id, ret); 10911 continue; 10912 } 10913 } else { 10914 ret = ath12k_mac_vdev_stop(arvif); 10915 if (ret) { 10916 ath12k_warn(ab, "failed to stop vdev %d: %d\n", 10917 arvif->vdev_id, ret); 10918 continue; 10919 } 10920 10921 ret = ath12k_mac_vdev_start(arvif, vifs[i].new_ctx); 10922 if (ret) 10923 ath12k_warn(ab, "failed to start vdev %d: %d\n", 10924 arvif->vdev_id, ret); 10925 continue; 10926 } 10927 10928 ret = ath12k_mac_setup_bcn_tmpl(arvif); 10929 if (ret) 10930 ath12k_warn(ab, "failed to update bcn tmpl during csa: %d\n", 10931 ret); 10932 10933 memset(¶ms, 0, sizeof(params)); 10934 params.vdev_id = arvif->vdev_id; 10935 params.aid = ahvif->aid; 10936 params.bssid = arvif->bssid; 10937 params.tx_bssid = ath12k_mac_get_tx_bssid(arvif); 10938 if (params.tx_bssid) { 10939 params.nontx_profile_idx = link_conf->bssid_index; 10940 params.nontx_profile_cnt = 1 << link_conf->bssid_indicator; 10941 } 10942 ret = ath12k_wmi_vdev_up(arvif->ar, ¶ms); 10943 if (ret) { 10944 ath12k_warn(ab, "failed to bring vdev up %d: %d\n", 10945 arvif->vdev_id, ret); 10946 continue; 10947 } 10948 10949 ret = ath12k_mac_update_peer_puncturing_width(arvif->ar, arvif, 10950 vifs[i].new_ctx->def); 10951 if (ret) { 10952 ath12k_warn(ar->ab, 10953 "failed to update puncturing bitmap %02x and width %d: %d\n", 10954 vifs[i].new_ctx->def.punctured, 10955 vifs[i].new_ctx->def.width, ret); 10956 continue; 10957 } 10958 } 10959 10960 /* Restart the internal monitor vdev on new channel */ 10961 if (!monitor_vif && ar->monitor_vdev_created) { 10962 if (!ath12k_mac_monitor_stop(ar)) 10963 ath12k_mac_monitor_start(ar); 10964 } 10965 } 10966 10967 static void 10968 ath12k_mac_update_active_vif_chan(struct ath12k *ar, 10969 struct ieee80211_chanctx_conf *ctx) 10970 { 10971 struct ath12k_mac_change_chanctx_arg arg = { .ctx = ctx, .ar = ar }; 10972 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar); 10973 10974 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 10975 10976 ieee80211_iterate_active_interfaces_atomic(hw, 10977 IEEE80211_IFACE_ITER_NORMAL, 10978 ath12k_mac_change_chanctx_cnt_iter, 10979 &arg); 10980 if (arg.n_vifs == 0) 10981 return; 10982 10983 arg.vifs = kcalloc(arg.n_vifs, sizeof(arg.vifs[0]), GFP_KERNEL); 10984 if (!arg.vifs) 10985 return; 10986 10987 ieee80211_iterate_active_interfaces_atomic(hw, 10988 IEEE80211_IFACE_ITER_NORMAL, 10989 ath12k_mac_change_chanctx_fill_iter, 10990 &arg); 10991 10992 ath12k_mac_update_vif_chan(ar, arg.vifs, arg.n_vifs); 10993 10994 kfree(arg.vifs); 10995 } 10996 10997 static void ath12k_mac_op_change_chanctx(struct ieee80211_hw *hw, 10998 struct ieee80211_chanctx_conf *ctx, 10999 u32 changed) 11000 { 11001 struct ath12k *ar; 11002 struct ath12k_base *ab; 11003 11004 lockdep_assert_wiphy(hw->wiphy); 11005 11006 ar = ath12k_get_ar_by_ctx(hw, ctx); 11007 if (!ar) 11008 return; 11009 11010 ab = ar->ab; 11011 11012 ath12k_dbg(ab, ATH12K_DBG_MAC, 11013 "mac chanctx change freq %u width %d ptr %p changed %x\n", 11014 ctx->def.chan->center_freq, ctx->def.width, ctx, changed); 11015 11016 /* This shouldn't really happen because channel switching should use 11017 * switch_vif_chanctx(). 11018 */ 11019 if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL)) 11020 return; 11021 11022 if (changed & IEEE80211_CHANCTX_CHANGE_WIDTH || 11023 changed & IEEE80211_CHANCTX_CHANGE_RADAR || 11024 changed & IEEE80211_CHANCTX_CHANGE_PUNCTURING) 11025 ath12k_mac_update_active_vif_chan(ar, ctx); 11026 11027 /* TODO: Recalc radar detection */ 11028 } 11029 11030 static int ath12k_start_vdev_delay(struct ath12k *ar, 11031 struct ath12k_link_vif *arvif) 11032 { 11033 struct ath12k_base *ab = ar->ab; 11034 struct ath12k_vif *ahvif = arvif->ahvif; 11035 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 11036 struct ieee80211_chanctx_conf *chanctx; 11037 struct ieee80211_bss_conf *link_conf; 11038 int ret; 11039 11040 if (WARN_ON(arvif->is_started)) 11041 return -EBUSY; 11042 11043 link_conf = ath12k_mac_get_link_bss_conf(arvif); 11044 if (!link_conf) { 11045 ath12k_warn(ab, "failed to get link conf for vdev %u\n", arvif->vdev_id); 11046 return -EINVAL; 11047 } 11048 11049 chanctx = wiphy_dereference(ath12k_ar_to_hw(arvif->ar)->wiphy, 11050 link_conf->chanctx_conf); 11051 ret = ath12k_mac_vdev_start(arvif, chanctx); 11052 if (ret) { 11053 ath12k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n", 11054 arvif->vdev_id, vif->addr, 11055 chanctx->def.chan->center_freq, ret); 11056 return ret; 11057 } 11058 11059 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { 11060 ret = ath12k_monitor_vdev_up(ar, arvif->vdev_id); 11061 if (ret) { 11062 ath12k_warn(ab, "failed put monitor up: %d\n", ret); 11063 return ret; 11064 } 11065 } 11066 11067 arvif->is_started = true; 11068 11069 /* TODO: Setup ps and cts/rts protection */ 11070 return 0; 11071 } 11072 11073 static u8 ath12k_mac_get_num_pwr_levels(struct cfg80211_chan_def *chan_def) 11074 { 11075 if (chan_def->chan->flags & IEEE80211_CHAN_PSD) { 11076 switch (chan_def->width) { 11077 case NL80211_CHAN_WIDTH_20: 11078 return 1; 11079 case NL80211_CHAN_WIDTH_40: 11080 return 2; 11081 case NL80211_CHAN_WIDTH_80: 11082 return 4; 11083 case NL80211_CHAN_WIDTH_160: 11084 return 8; 11085 case NL80211_CHAN_WIDTH_320: 11086 return 16; 11087 default: 11088 return 1; 11089 } 11090 } else { 11091 switch (chan_def->width) { 11092 case NL80211_CHAN_WIDTH_20: 11093 return 1; 11094 case NL80211_CHAN_WIDTH_40: 11095 return 2; 11096 case NL80211_CHAN_WIDTH_80: 11097 return 3; 11098 case NL80211_CHAN_WIDTH_160: 11099 return 4; 11100 case NL80211_CHAN_WIDTH_320: 11101 return 5; 11102 default: 11103 return 1; 11104 } 11105 } 11106 } 11107 11108 static u16 ath12k_mac_get_6ghz_start_frequency(struct cfg80211_chan_def *chan_def) 11109 { 11110 u16 diff_seq; 11111 11112 /* It is to get the lowest channel number's center frequency of the chan. 11113 * For example, 11114 * bandwidth=40 MHz, center frequency is 5965, lowest channel is 1 11115 * with center frequency 5955, its diff is 5965 - 5955 = 10. 11116 * bandwidth=80 MHz, center frequency is 5985, lowest channel is 1 11117 * with center frequency 5955, its diff is 5985 - 5955 = 30. 11118 * bandwidth=160 MHz, center frequency is 6025, lowest channel is 1 11119 * with center frequency 5955, its diff is 6025 - 5955 = 70. 11120 * bandwidth=320 MHz, center frequency is 6105, lowest channel is 1 11121 * with center frequency 5955, its diff is 6105 - 5955 = 70. 11122 */ 11123 switch (chan_def->width) { 11124 case NL80211_CHAN_WIDTH_320: 11125 diff_seq = 150; 11126 break; 11127 case NL80211_CHAN_WIDTH_160: 11128 diff_seq = 70; 11129 break; 11130 case NL80211_CHAN_WIDTH_80: 11131 diff_seq = 30; 11132 break; 11133 case NL80211_CHAN_WIDTH_40: 11134 diff_seq = 10; 11135 break; 11136 default: 11137 diff_seq = 0; 11138 } 11139 11140 return chan_def->center_freq1 - diff_seq; 11141 } 11142 11143 static u16 ath12k_mac_get_seg_freq(struct cfg80211_chan_def *chan_def, 11144 u16 start_seq, u8 seq) 11145 { 11146 u16 seg_seq; 11147 11148 /* It is to get the center frequency of the specific bandwidth. 11149 * start_seq means the lowest channel number's center frequency. 11150 * seq 0/1/2/3 means 20 MHz/40 MHz/80 MHz/160 MHz. 11151 * For example, 11152 * lowest channel is 1, its center frequency 5955, 11153 * center frequency is 5955 when bandwidth=20 MHz, its diff is 5955 - 5955 = 0. 11154 * lowest channel is 1, its center frequency 5955, 11155 * center frequency is 5965 when bandwidth=40 MHz, its diff is 5965 - 5955 = 10. 11156 * lowest channel is 1, its center frequency 5955, 11157 * center frequency is 5985 when bandwidth=80 MHz, its diff is 5985 - 5955 = 30. 11158 * lowest channel is 1, its center frequency 5955, 11159 * center frequency is 6025 when bandwidth=160 MHz, its diff is 6025 - 5955 = 70. 11160 */ 11161 seg_seq = 10 * (BIT(seq) - 1); 11162 return seg_seq + start_seq; 11163 } 11164 11165 static void ath12k_mac_get_psd_channel(struct ath12k *ar, 11166 u16 step_freq, 11167 u16 *start_freq, 11168 u16 *center_freq, 11169 u8 i, 11170 struct ieee80211_channel **temp_chan, 11171 s8 *tx_power) 11172 { 11173 /* It is to get the center frequency for each 20 MHz. 11174 * For example, if the chan is 160 MHz and center frequency is 6025, 11175 * then it include 8 channels, they are 1/5/9/13/17/21/25/29, 11176 * channel number 1's center frequency is 5955, it is parameter start_freq. 11177 * parameter i is the step of the 8 channels. i is 0~7 for the 8 channels. 11178 * the channel 1/5/9/13/17/21/25/29 maps i=0/1/2/3/4/5/6/7, 11179 * and maps its center frequency is 5955/5975/5995/6015/6035/6055/6075/6095, 11180 * the gap is 20 for each channel, parameter step_freq means the gap. 11181 * after get the center frequency of each channel, it is easy to find the 11182 * struct ieee80211_channel of it and get the max_reg_power. 11183 */ 11184 *center_freq = *start_freq + i * step_freq; 11185 *temp_chan = ieee80211_get_channel(ar->ah->hw->wiphy, *center_freq); 11186 *tx_power = (*temp_chan)->max_reg_power; 11187 } 11188 11189 static void ath12k_mac_get_eirp_power(struct ath12k *ar, 11190 u16 *start_freq, 11191 u16 *center_freq, 11192 u8 i, 11193 struct ieee80211_channel **temp_chan, 11194 struct cfg80211_chan_def *def, 11195 s8 *tx_power) 11196 { 11197 /* It is to get the center frequency for 20 MHz/40 MHz/80 MHz/ 11198 * 160 MHz bandwidth, and then plus 10 to the center frequency, 11199 * it is the center frequency of a channel number. 11200 * For example, when configured channel number is 1. 11201 * center frequency is 5965 when bandwidth=40 MHz, after plus 10, it is 5975, 11202 * then it is channel number 5. 11203 * center frequency is 5985 when bandwidth=80 MHz, after plus 10, it is 5995, 11204 * then it is channel number 9. 11205 * center frequency is 6025 when bandwidth=160 MHz, after plus 10, it is 6035, 11206 * then it is channel number 17. 11207 * after get the center frequency of each channel, it is easy to find the 11208 * struct ieee80211_channel of it and get the max_reg_power. 11209 */ 11210 *center_freq = ath12k_mac_get_seg_freq(def, *start_freq, i); 11211 11212 /* For the 20 MHz, its center frequency is same with same channel */ 11213 if (i != 0) 11214 *center_freq += 10; 11215 11216 *temp_chan = ieee80211_get_channel(ar->ah->hw->wiphy, *center_freq); 11217 *tx_power = (*temp_chan)->max_reg_power; 11218 } 11219 11220 void ath12k_mac_fill_reg_tpc_info(struct ath12k *ar, 11221 struct ath12k_link_vif *arvif, 11222 struct ieee80211_chanctx_conf *ctx) 11223 { 11224 struct ath12k_base *ab = ar->ab; 11225 struct ath12k_reg_tpc_power_info *reg_tpc_info = &arvif->reg_tpc_info; 11226 struct ieee80211_bss_conf *bss_conf = ath12k_mac_get_link_bss_conf(arvif); 11227 struct ieee80211_channel *chan, *temp_chan; 11228 u8 pwr_lvl_idx, num_pwr_levels, pwr_reduction; 11229 bool is_psd_power = false, is_tpe_present = false; 11230 s8 max_tx_power[ATH12K_NUM_PWR_LEVELS], psd_power, tx_power; 11231 s8 eirp_power = 0; 11232 struct ath12k_vif *ahvif = arvif->ahvif; 11233 u16 start_freq, center_freq; 11234 u8 reg_6ghz_power_mode; 11235 11236 chan = ctx->def.chan; 11237 start_freq = ath12k_mac_get_6ghz_start_frequency(&ctx->def); 11238 pwr_reduction = bss_conf->pwr_reduction; 11239 11240 if (arvif->reg_tpc_info.num_pwr_levels) { 11241 is_tpe_present = true; 11242 num_pwr_levels = arvif->reg_tpc_info.num_pwr_levels; 11243 } else { 11244 num_pwr_levels = ath12k_mac_get_num_pwr_levels(&ctx->def); 11245 } 11246 11247 for (pwr_lvl_idx = 0; pwr_lvl_idx < num_pwr_levels; pwr_lvl_idx++) { 11248 /* STA received TPE IE*/ 11249 if (is_tpe_present) { 11250 /* local power is PSD power*/ 11251 if (chan->flags & IEEE80211_CHAN_PSD) { 11252 /* Connecting AP is psd power */ 11253 if (reg_tpc_info->is_psd_power) { 11254 is_psd_power = true; 11255 ath12k_mac_get_psd_channel(ar, 20, 11256 &start_freq, 11257 ¢er_freq, 11258 pwr_lvl_idx, 11259 &temp_chan, 11260 &tx_power); 11261 psd_power = temp_chan->psd; 11262 eirp_power = tx_power; 11263 max_tx_power[pwr_lvl_idx] = 11264 min_t(s8, 11265 psd_power, 11266 reg_tpc_info->tpe[pwr_lvl_idx]); 11267 /* Connecting AP is not psd power */ 11268 } else { 11269 ath12k_mac_get_eirp_power(ar, 11270 &start_freq, 11271 ¢er_freq, 11272 pwr_lvl_idx, 11273 &temp_chan, 11274 &ctx->def, 11275 &tx_power); 11276 psd_power = temp_chan->psd; 11277 /* convert psd power to EIRP power based 11278 * on channel width 11279 */ 11280 tx_power = 11281 min_t(s8, tx_power, 11282 psd_power + 13 + pwr_lvl_idx * 3); 11283 max_tx_power[pwr_lvl_idx] = 11284 min_t(s8, 11285 tx_power, 11286 reg_tpc_info->tpe[pwr_lvl_idx]); 11287 } 11288 /* local power is not PSD power */ 11289 } else { 11290 /* Connecting AP is psd power */ 11291 if (reg_tpc_info->is_psd_power) { 11292 is_psd_power = true; 11293 ath12k_mac_get_psd_channel(ar, 20, 11294 &start_freq, 11295 ¢er_freq, 11296 pwr_lvl_idx, 11297 &temp_chan, 11298 &tx_power); 11299 eirp_power = tx_power; 11300 max_tx_power[pwr_lvl_idx] = 11301 reg_tpc_info->tpe[pwr_lvl_idx]; 11302 /* Connecting AP is not psd power */ 11303 } else { 11304 ath12k_mac_get_eirp_power(ar, 11305 &start_freq, 11306 ¢er_freq, 11307 pwr_lvl_idx, 11308 &temp_chan, 11309 &ctx->def, 11310 &tx_power); 11311 max_tx_power[pwr_lvl_idx] = 11312 min_t(s8, 11313 tx_power, 11314 reg_tpc_info->tpe[pwr_lvl_idx]); 11315 } 11316 } 11317 /* STA not received TPE IE */ 11318 } else { 11319 /* local power is PSD power*/ 11320 if (chan->flags & IEEE80211_CHAN_PSD) { 11321 is_psd_power = true; 11322 ath12k_mac_get_psd_channel(ar, 20, 11323 &start_freq, 11324 ¢er_freq, 11325 pwr_lvl_idx, 11326 &temp_chan, 11327 &tx_power); 11328 psd_power = temp_chan->psd; 11329 eirp_power = tx_power; 11330 max_tx_power[pwr_lvl_idx] = psd_power; 11331 } else { 11332 ath12k_mac_get_eirp_power(ar, 11333 &start_freq, 11334 ¢er_freq, 11335 pwr_lvl_idx, 11336 &temp_chan, 11337 &ctx->def, 11338 &tx_power); 11339 max_tx_power[pwr_lvl_idx] = tx_power; 11340 } 11341 } 11342 11343 if (is_psd_power) { 11344 /* If AP local power constraint is present */ 11345 if (pwr_reduction) 11346 eirp_power = eirp_power - pwr_reduction; 11347 11348 /* If firmware updated max tx power is non zero, then take 11349 * the min of firmware updated ap tx power 11350 * and max power derived from above mentioned parameters. 11351 */ 11352 ath12k_dbg(ab, ATH12K_DBG_MAC, 11353 "eirp power : %d firmware report power : %d\n", 11354 eirp_power, ar->max_allowed_tx_power); 11355 /* Firmware reports lower max_allowed_tx_power during vdev 11356 * start response. In case of 6 GHz, firmware is not aware 11357 * of EIRP power unless driver sets EIRP power through WMI 11358 * TPC command. So radio which does not support idle power 11359 * save can set maximum calculated EIRP power directly to 11360 * firmware through TPC command without min comparison with 11361 * vdev start response's max_allowed_tx_power. 11362 */ 11363 if (ar->max_allowed_tx_power && ab->hw_params->idle_ps) 11364 eirp_power = min_t(s8, 11365 eirp_power, 11366 ar->max_allowed_tx_power); 11367 } else { 11368 /* If AP local power constraint is present */ 11369 if (pwr_reduction) 11370 max_tx_power[pwr_lvl_idx] = 11371 max_tx_power[pwr_lvl_idx] - pwr_reduction; 11372 /* If firmware updated max tx power is non zero, then take 11373 * the min of firmware updated ap tx power 11374 * and max power derived from above mentioned parameters. 11375 */ 11376 if (ar->max_allowed_tx_power && ab->hw_params->idle_ps) 11377 max_tx_power[pwr_lvl_idx] = 11378 min_t(s8, 11379 max_tx_power[pwr_lvl_idx], 11380 ar->max_allowed_tx_power); 11381 } 11382 reg_tpc_info->chan_power_info[pwr_lvl_idx].chan_cfreq = center_freq; 11383 reg_tpc_info->chan_power_info[pwr_lvl_idx].tx_power = 11384 max_tx_power[pwr_lvl_idx]; 11385 } 11386 11387 reg_tpc_info->num_pwr_levels = num_pwr_levels; 11388 reg_tpc_info->is_psd_power = is_psd_power; 11389 reg_tpc_info->eirp_power = eirp_power; 11390 if (ahvif->vdev_type == WMI_VDEV_TYPE_STA) 11391 reg_6ghz_power_mode = bss_conf->power_type; 11392 else 11393 /* For now, LPI is the only supported AP power mode */ 11394 reg_6ghz_power_mode = IEEE80211_REG_LPI_AP; 11395 11396 reg_tpc_info->ap_power_type = 11397 ath12k_reg_ap_pwr_convert(reg_6ghz_power_mode); 11398 } 11399 11400 static void ath12k_mac_parse_tx_pwr_env(struct ath12k *ar, 11401 struct ath12k_link_vif *arvif) 11402 { 11403 struct ieee80211_bss_conf *bss_conf = ath12k_mac_get_link_bss_conf(arvif); 11404 struct ath12k_reg_tpc_power_info *tpc_info = &arvif->reg_tpc_info; 11405 struct ieee80211_parsed_tpe_eirp *local_non_psd, *reg_non_psd; 11406 struct ieee80211_parsed_tpe_psd *local_psd, *reg_psd; 11407 struct ieee80211_parsed_tpe *tpe = &bss_conf->tpe; 11408 enum wmi_reg_6g_client_type client_type; 11409 struct ath12k_reg_info *reg_info; 11410 struct ath12k_base *ab = ar->ab; 11411 bool psd_valid, non_psd_valid; 11412 int i; 11413 11414 reg_info = ab->reg_info[ar->pdev_idx]; 11415 client_type = reg_info->client_type; 11416 11417 local_psd = &tpe->psd_local[client_type]; 11418 reg_psd = &tpe->psd_reg_client[client_type]; 11419 local_non_psd = &tpe->max_local[client_type]; 11420 reg_non_psd = &tpe->max_reg_client[client_type]; 11421 11422 psd_valid = local_psd->valid | reg_psd->valid; 11423 non_psd_valid = local_non_psd->valid | reg_non_psd->valid; 11424 11425 if (!psd_valid && !non_psd_valid) { 11426 ath12k_warn(ab, 11427 "no transmit power envelope match client power type %d\n", 11428 client_type); 11429 return; 11430 } 11431 11432 if (psd_valid) { 11433 tpc_info->is_psd_power = true; 11434 11435 tpc_info->num_pwr_levels = max(local_psd->count, 11436 reg_psd->count); 11437 tpc_info->num_pwr_levels = 11438 min3(tpc_info->num_pwr_levels, 11439 IEEE80211_TPE_PSD_ENTRIES_320MHZ, 11440 ATH12K_NUM_PWR_LEVELS); 11441 11442 for (i = 0; i < tpc_info->num_pwr_levels; i++) { 11443 tpc_info->tpe[i] = min(local_psd->power[i], 11444 reg_psd->power[i]) / 2; 11445 ath12k_dbg(ab, ATH12K_DBG_MAC, 11446 "TPE PSD power[%d] : %d\n", 11447 i, tpc_info->tpe[i]); 11448 } 11449 } else { 11450 tpc_info->is_psd_power = false; 11451 tpc_info->eirp_power = 0; 11452 11453 tpc_info->num_pwr_levels = max(local_non_psd->count, 11454 reg_non_psd->count); 11455 tpc_info->num_pwr_levels = 11456 min3(tpc_info->num_pwr_levels, 11457 IEEE80211_TPE_EIRP_ENTRIES_320MHZ, 11458 ATH12K_NUM_PWR_LEVELS); 11459 11460 for (i = 0; i < tpc_info->num_pwr_levels; i++) { 11461 tpc_info->tpe[i] = min(local_non_psd->power[i], 11462 reg_non_psd->power[i]) / 2; 11463 ath12k_dbg(ab, ATH12K_DBG_MAC, 11464 "non PSD power[%d] : %d\n", 11465 i, tpc_info->tpe[i]); 11466 } 11467 } 11468 } 11469 11470 static int 11471 ath12k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw, 11472 struct ieee80211_vif *vif, 11473 struct ieee80211_bss_conf *link_conf, 11474 struct ieee80211_chanctx_conf *ctx) 11475 { 11476 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 11477 struct ath12k *ar; 11478 struct ath12k_base *ab; 11479 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 11480 u8 link_id = link_conf->link_id; 11481 struct ath12k_link_vif *arvif; 11482 int ret; 11483 11484 lockdep_assert_wiphy(hw->wiphy); 11485 11486 /* For multi radio wiphy, the vdev was not created during add_interface 11487 * create now since we have a channel ctx now to assign to a specific ar/fw 11488 */ 11489 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id); 11490 if (!arvif) { 11491 WARN_ON(1); 11492 return -ENOMEM; 11493 } 11494 11495 ar = ath12k_mac_assign_vif_to_vdev(hw, arvif, ctx); 11496 if (!ar) { 11497 ath12k_hw_warn(ah, "failed to assign chanctx for vif %pM link id %u link vif is already started", 11498 vif->addr, link_id); 11499 return -EINVAL; 11500 } 11501 11502 ab = ar->ab; 11503 11504 ath12k_dbg(ab, ATH12K_DBG_MAC, 11505 "mac chanctx assign ptr %p vdev_id %i\n", 11506 ctx, arvif->vdev_id); 11507 11508 if (ath12k_wmi_supports_6ghz_cc_ext(ar) && 11509 ctx->def.chan->band == NL80211_BAND_6GHZ && 11510 ahvif->vdev_type == WMI_VDEV_TYPE_STA) 11511 ath12k_mac_parse_tx_pwr_env(ar, arvif); 11512 11513 arvif->punct_bitmap = ctx->def.punctured; 11514 11515 /* for some targets bss peer must be created before vdev_start */ 11516 if (ab->hw_params->vdev_start_delay && 11517 ahvif->vdev_type != WMI_VDEV_TYPE_AP && 11518 ahvif->vdev_type != WMI_VDEV_TYPE_MONITOR && 11519 !ath12k_peer_exist_by_vdev_id(ab, arvif->vdev_id)) { 11520 ret = 0; 11521 goto out; 11522 } 11523 11524 if (WARN_ON(arvif->is_started)) { 11525 ret = -EBUSY; 11526 goto out; 11527 } 11528 11529 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { 11530 ret = ath12k_mac_monitor_start(ar); 11531 if (ret) { 11532 ath12k_mac_monitor_vdev_delete(ar); 11533 goto out; 11534 } 11535 11536 arvif->is_started = true; 11537 goto out; 11538 } 11539 11540 ret = ath12k_mac_vdev_start(arvif, ctx); 11541 if (ret) { 11542 ath12k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n", 11543 arvif->vdev_id, vif->addr, 11544 ctx->def.chan->center_freq, ret); 11545 goto out; 11546 } 11547 11548 arvif->is_started = true; 11549 11550 /* TODO: Setup ps and cts/rts protection */ 11551 11552 out: 11553 return ret; 11554 } 11555 11556 static void 11557 ath12k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw, 11558 struct ieee80211_vif *vif, 11559 struct ieee80211_bss_conf *link_conf, 11560 struct ieee80211_chanctx_conf *ctx) 11561 { 11562 struct ath12k *ar; 11563 struct ath12k_base *ab; 11564 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 11565 struct ath12k_link_vif *arvif; 11566 u8 link_id = link_conf->link_id; 11567 int ret; 11568 11569 lockdep_assert_wiphy(hw->wiphy); 11570 11571 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 11572 11573 /* The vif is expected to be attached to an ar's VDEV. 11574 * We leave the vif/vdev in this function as is 11575 * and not delete the vdev symmetric to assign_vif_chanctx() 11576 * the VDEV will be deleted and unassigned either during 11577 * remove_interface() or when there is a change in channel 11578 * that moves the vif to a new ar 11579 */ 11580 if (!arvif || !arvif->is_created) 11581 return; 11582 11583 ar = arvif->ar; 11584 ab = ar->ab; 11585 11586 ath12k_dbg(ab, ATH12K_DBG_MAC, 11587 "mac chanctx unassign ptr %p vdev_id %i\n", 11588 ctx, arvif->vdev_id); 11589 11590 WARN_ON(!arvif->is_started); 11591 11592 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { 11593 ret = ath12k_mac_monitor_stop(ar); 11594 if (ret) 11595 return; 11596 11597 arvif->is_started = false; 11598 } 11599 11600 if (ahvif->vdev_type != WMI_VDEV_TYPE_STA && 11601 ahvif->vdev_type != WMI_VDEV_TYPE_MONITOR) { 11602 ath12k_bss_disassoc(ar, arvif); 11603 ret = ath12k_mac_vdev_stop(arvif); 11604 if (ret) 11605 ath12k_warn(ab, "failed to stop vdev %i: %d\n", 11606 arvif->vdev_id, ret); 11607 } 11608 arvif->is_started = false; 11609 11610 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ab->wmi_ab.svc_map) && 11611 ahvif->vdev_type == WMI_VDEV_TYPE_STA && 11612 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE && 11613 ar->state_11d != ATH12K_11D_PREPARING) { 11614 reinit_completion(&ar->completed_11d_scan); 11615 ar->state_11d = ATH12K_11D_PREPARING; 11616 } 11617 11618 if (ar->scan.arvif == arvif && ar->scan.state == ATH12K_SCAN_RUNNING) { 11619 ath12k_scan_abort(ar); 11620 ar->scan.arvif = NULL; 11621 } 11622 } 11623 11624 static int 11625 ath12k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw, 11626 struct ieee80211_vif_chanctx_switch *vifs, 11627 int n_vifs, 11628 enum ieee80211_chanctx_switch_mode mode) 11629 { 11630 struct ath12k *ar; 11631 11632 lockdep_assert_wiphy(hw->wiphy); 11633 11634 ar = ath12k_get_ar_by_ctx(hw, vifs->old_ctx); 11635 if (!ar) 11636 return -EINVAL; 11637 11638 /* Switching channels across radio is not allowed */ 11639 if (ar != ath12k_get_ar_by_ctx(hw, vifs->new_ctx)) 11640 return -EINVAL; 11641 11642 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 11643 "mac chanctx switch n_vifs %d mode %d\n", 11644 n_vifs, mode); 11645 ath12k_mac_update_vif_chan(ar, vifs, n_vifs); 11646 11647 return 0; 11648 } 11649 11650 static int 11651 ath12k_set_vdev_param_to_all_vifs(struct ath12k *ar, int param, u32 value) 11652 { 11653 struct ath12k_link_vif *arvif; 11654 int ret = 0; 11655 11656 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 11657 11658 list_for_each_entry(arvif, &ar->arvifs, list) { 11659 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "setting mac vdev %d param %d value %d\n", 11660 param, arvif->vdev_id, value); 11661 11662 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 11663 param, value); 11664 if (ret) { 11665 ath12k_warn(ar->ab, "failed to set param %d for vdev %d: %d\n", 11666 param, arvif->vdev_id, ret); 11667 break; 11668 } 11669 } 11670 11671 return ret; 11672 } 11673 11674 /* mac80211 stores device specific RTS/Fragmentation threshold value, 11675 * this is set interface specific to firmware from ath12k driver 11676 */ 11677 static int ath12k_mac_op_set_rts_threshold(struct ieee80211_hw *hw, 11678 int radio_idx, u32 value) 11679 { 11680 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 11681 struct wiphy *wiphy = hw->wiphy; 11682 struct ath12k *ar; 11683 int param_id = WMI_VDEV_PARAM_RTS_THRESHOLD; 11684 int ret = 0, ret_err, i; 11685 11686 lockdep_assert_wiphy(hw->wiphy); 11687 11688 if (radio_idx >= wiphy->n_radio || radio_idx < -1) 11689 return -EINVAL; 11690 11691 if (radio_idx != -1) { 11692 /* Update RTS threshold in specified radio */ 11693 ar = ath12k_ah_to_ar(ah, radio_idx); 11694 ret = ath12k_set_vdev_param_to_all_vifs(ar, param_id, value); 11695 if (ret) { 11696 ath12k_warn(ar->ab, 11697 "failed to set RTS config for all vdevs of pdev %d", 11698 ar->pdev->pdev_id); 11699 return ret; 11700 } 11701 11702 ar->rts_threshold = value; 11703 return 0; 11704 } 11705 11706 /* Radio_index passed is -1, so set RTS threshold for all radios. */ 11707 for_each_ar(ah, ar, i) { 11708 ret = ath12k_set_vdev_param_to_all_vifs(ar, param_id, value); 11709 if (ret) { 11710 ath12k_warn(ar->ab, "failed to set RTS config for all vdevs of pdev %d", 11711 ar->pdev->pdev_id); 11712 break; 11713 } 11714 } 11715 if (!ret) { 11716 /* Setting new RTS threshold for vdevs of all radios passed, so update 11717 * the RTS threshold value for all radios 11718 */ 11719 for_each_ar(ah, ar, i) 11720 ar->rts_threshold = value; 11721 return 0; 11722 } 11723 11724 /* RTS threshold config failed, revert to the previous RTS threshold */ 11725 for (i = i - 1; i >= 0; i--) { 11726 ar = ath12k_ah_to_ar(ah, i); 11727 ret_err = ath12k_set_vdev_param_to_all_vifs(ar, param_id, 11728 ar->rts_threshold); 11729 if (ret_err) 11730 ath12k_warn(ar->ab, 11731 "failed to restore RTS threshold for all vdevs of pdev %d", 11732 ar->pdev->pdev_id); 11733 } 11734 11735 return ret; 11736 } 11737 11738 static int ath12k_mac_op_set_frag_threshold(struct ieee80211_hw *hw, 11739 int radio_idx, u32 value) 11740 { 11741 /* Even though there's a WMI vdev param for fragmentation threshold no 11742 * known firmware actually implements it. Moreover it is not possible to 11743 * rely frame fragmentation to mac80211 because firmware clears the 11744 * "more fragments" bit in frame control making it impossible for remote 11745 * devices to reassemble frames. 11746 * 11747 * Hence implement a dummy callback just to say fragmentation isn't 11748 * supported. This effectively prevents mac80211 from doing frame 11749 * fragmentation in software. 11750 */ 11751 11752 lockdep_assert_wiphy(hw->wiphy); 11753 11754 return -EOPNOTSUPP; 11755 } 11756 11757 static int ath12k_mac_flush(struct ath12k *ar) 11758 { 11759 long time_left; 11760 int ret = 0; 11761 11762 time_left = wait_event_timeout(ar->dp.tx_empty_waitq, 11763 (atomic_read(&ar->dp.num_tx_pending) == 0), 11764 ATH12K_FLUSH_TIMEOUT); 11765 if (time_left == 0) { 11766 ath12k_warn(ar->ab, 11767 "failed to flush transmit queue, data pkts pending %d\n", 11768 atomic_read(&ar->dp.num_tx_pending)); 11769 ret = -ETIMEDOUT; 11770 } 11771 11772 time_left = wait_event_timeout(ar->txmgmt_empty_waitq, 11773 (atomic_read(&ar->num_pending_mgmt_tx) == 0), 11774 ATH12K_FLUSH_TIMEOUT); 11775 if (time_left == 0) { 11776 ath12k_warn(ar->ab, 11777 "failed to flush mgmt transmit queue, mgmt pkts pending %d\n", 11778 atomic_read(&ar->num_pending_mgmt_tx)); 11779 ret = -ETIMEDOUT; 11780 } 11781 11782 return ret; 11783 } 11784 11785 int ath12k_mac_wait_tx_complete(struct ath12k *ar) 11786 { 11787 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 11788 11789 ath12k_mac_drain_tx(ar); 11790 return ath12k_mac_flush(ar); 11791 } 11792 11793 static void ath12k_mac_op_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 11794 u32 queues, bool drop) 11795 { 11796 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 11797 struct ath12k_link_vif *arvif; 11798 struct ath12k_vif *ahvif; 11799 unsigned long links; 11800 struct ath12k *ar; 11801 u8 link_id; 11802 int i; 11803 11804 lockdep_assert_wiphy(hw->wiphy); 11805 11806 if (drop) 11807 return; 11808 11809 /* vif can be NULL when flush() is considered for hw */ 11810 if (!vif) { 11811 for_each_ar(ah, ar, i) 11812 ath12k_mac_flush(ar); 11813 return; 11814 } 11815 11816 for_each_ar(ah, ar, i) 11817 wiphy_work_flush(hw->wiphy, &ar->wmi_mgmt_tx_work); 11818 11819 ahvif = ath12k_vif_to_ahvif(vif); 11820 links = ahvif->links_map; 11821 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) { 11822 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 11823 if (!(arvif && arvif->ar)) 11824 continue; 11825 11826 ath12k_mac_flush(arvif->ar); 11827 } 11828 } 11829 11830 static int 11831 ath12k_mac_bitrate_mask_num_ht_rates(struct ath12k *ar, 11832 enum nl80211_band band, 11833 const struct cfg80211_bitrate_mask *mask) 11834 { 11835 int num_rates = 0; 11836 int i; 11837 11838 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) 11839 num_rates += hweight16(mask->control[band].ht_mcs[i]); 11840 11841 return num_rates; 11842 } 11843 11844 static bool 11845 ath12k_mac_has_single_legacy_rate(struct ath12k *ar, 11846 enum nl80211_band band, 11847 const struct cfg80211_bitrate_mask *mask) 11848 { 11849 int num_rates = 0; 11850 11851 num_rates = hweight32(mask->control[band].legacy); 11852 11853 if (ath12k_mac_bitrate_mask_num_ht_rates(ar, band, mask)) 11854 return false; 11855 11856 if (ath12k_mac_bitrate_mask_num_vht_rates(ar, band, mask)) 11857 return false; 11858 11859 if (ath12k_mac_bitrate_mask_num_he_rates(ar, band, mask)) 11860 return false; 11861 11862 return num_rates == 1; 11863 } 11864 11865 static __le16 11866 ath12k_mac_get_tx_mcs_map(const struct ieee80211_sta_he_cap *he_cap) 11867 { 11868 if (he_cap->he_cap_elem.phy_cap_info[0] & 11869 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G) 11870 return he_cap->he_mcs_nss_supp.tx_mcs_160; 11871 11872 return he_cap->he_mcs_nss_supp.tx_mcs_80; 11873 } 11874 11875 static bool 11876 ath12k_mac_bitrate_mask_get_single_nss(struct ath12k *ar, 11877 struct ieee80211_vif *vif, 11878 enum nl80211_band band, 11879 const struct cfg80211_bitrate_mask *mask, 11880 int *nss) 11881 { 11882 struct ieee80211_supported_band *sband = &ar->mac.sbands[band]; 11883 u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); 11884 const struct ieee80211_sta_he_cap *he_cap; 11885 u16 he_mcs_map = 0; 11886 u8 ht_nss_mask = 0; 11887 u8 vht_nss_mask = 0; 11888 u8 he_nss_mask = 0; 11889 int i; 11890 11891 /* No need to consider legacy here. Basic rates are always present 11892 * in bitrate mask 11893 */ 11894 11895 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) { 11896 if (mask->control[band].ht_mcs[i] == 0) 11897 continue; 11898 else if (mask->control[band].ht_mcs[i] == 11899 sband->ht_cap.mcs.rx_mask[i]) 11900 ht_nss_mask |= BIT(i); 11901 else 11902 return false; 11903 } 11904 11905 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) { 11906 if (mask->control[band].vht_mcs[i] == 0) 11907 continue; 11908 else if (mask->control[band].vht_mcs[i] == 11909 ath12k_mac_get_max_vht_mcs_map(vht_mcs_map, i)) 11910 vht_nss_mask |= BIT(i); 11911 else 11912 return false; 11913 } 11914 11915 he_cap = ieee80211_get_he_iftype_cap_vif(sband, vif); 11916 if (!he_cap) 11917 return false; 11918 11919 he_mcs_map = le16_to_cpu(ath12k_mac_get_tx_mcs_map(he_cap)); 11920 11921 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) { 11922 if (mask->control[band].he_mcs[i] == 0) 11923 continue; 11924 11925 if (mask->control[band].he_mcs[i] == 11926 ath12k_mac_get_max_he_mcs_map(he_mcs_map, i)) 11927 he_nss_mask |= BIT(i); 11928 else 11929 return false; 11930 } 11931 11932 if (ht_nss_mask != vht_nss_mask || ht_nss_mask != he_nss_mask) 11933 return false; 11934 11935 if (ht_nss_mask == 0) 11936 return false; 11937 11938 if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask) 11939 return false; 11940 11941 *nss = fls(ht_nss_mask); 11942 11943 return true; 11944 } 11945 11946 static int 11947 ath12k_mac_get_single_legacy_rate(struct ath12k *ar, 11948 enum nl80211_band band, 11949 const struct cfg80211_bitrate_mask *mask, 11950 u32 *rate, u8 *nss) 11951 { 11952 int rate_idx; 11953 u16 bitrate; 11954 u8 preamble; 11955 u8 hw_rate; 11956 11957 if (hweight32(mask->control[band].legacy) != 1) 11958 return -EINVAL; 11959 11960 rate_idx = ffs(mask->control[band].legacy) - 1; 11961 11962 if (band == NL80211_BAND_5GHZ || band == NL80211_BAND_6GHZ) 11963 rate_idx += ATH12K_MAC_FIRST_OFDM_RATE_IDX; 11964 11965 hw_rate = ath12k_legacy_rates[rate_idx].hw_value; 11966 bitrate = ath12k_legacy_rates[rate_idx].bitrate; 11967 11968 if (ath12k_mac_bitrate_is_cck(bitrate)) 11969 preamble = WMI_RATE_PREAMBLE_CCK; 11970 else 11971 preamble = WMI_RATE_PREAMBLE_OFDM; 11972 11973 *nss = 1; 11974 *rate = ATH12K_HW_RATE_CODE(hw_rate, 0, preamble); 11975 11976 return 0; 11977 } 11978 11979 static int 11980 ath12k_mac_set_fixed_rate_gi_ltf(struct ath12k_link_vif *arvif, u8 he_gi, u8 he_ltf) 11981 { 11982 struct ath12k *ar = arvif->ar; 11983 int ret; 11984 11985 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 11986 11987 /* 0.8 = 0, 1.6 = 2 and 3.2 = 3. */ 11988 if (he_gi && he_gi != 0xFF) 11989 he_gi += 1; 11990 11991 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 11992 WMI_VDEV_PARAM_SGI, he_gi); 11993 if (ret) { 11994 ath12k_warn(ar->ab, "failed to set HE GI:%d, error:%d\n", 11995 he_gi, ret); 11996 return ret; 11997 } 11998 /* start from 1 */ 11999 if (he_ltf != 0xFF) 12000 he_ltf += 1; 12001 12002 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 12003 WMI_VDEV_PARAM_HE_LTF, he_ltf); 12004 if (ret) { 12005 ath12k_warn(ar->ab, "failed to set HE LTF:%d, error:%d\n", 12006 he_ltf, ret); 12007 return ret; 12008 } 12009 return 0; 12010 } 12011 12012 static int 12013 ath12k_mac_set_auto_rate_gi_ltf(struct ath12k_link_vif *arvif, u16 he_gi, u8 he_ltf) 12014 { 12015 struct ath12k *ar = arvif->ar; 12016 int ret; 12017 u32 he_ar_gi_ltf; 12018 12019 if (he_gi != 0xFF) { 12020 switch (he_gi) { 12021 case NL80211_RATE_INFO_HE_GI_0_8: 12022 he_gi = WMI_AUTORATE_800NS_GI; 12023 break; 12024 case NL80211_RATE_INFO_HE_GI_1_6: 12025 he_gi = WMI_AUTORATE_1600NS_GI; 12026 break; 12027 case NL80211_RATE_INFO_HE_GI_3_2: 12028 he_gi = WMI_AUTORATE_3200NS_GI; 12029 break; 12030 default: 12031 ath12k_warn(ar->ab, "Invalid GI\n"); 12032 return -EINVAL; 12033 } 12034 } 12035 12036 if (he_ltf != 0xFF) { 12037 switch (he_ltf) { 12038 case NL80211_RATE_INFO_HE_1XLTF: 12039 he_ltf = WMI_HE_AUTORATE_LTF_1X; 12040 break; 12041 case NL80211_RATE_INFO_HE_2XLTF: 12042 he_ltf = WMI_HE_AUTORATE_LTF_2X; 12043 break; 12044 case NL80211_RATE_INFO_HE_4XLTF: 12045 he_ltf = WMI_HE_AUTORATE_LTF_4X; 12046 break; 12047 default: 12048 ath12k_warn(ar->ab, "Invalid LTF\n"); 12049 return -EINVAL; 12050 } 12051 } 12052 12053 he_ar_gi_ltf = he_gi | he_ltf; 12054 12055 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 12056 WMI_VDEV_PARAM_AUTORATE_MISC_CFG, 12057 he_ar_gi_ltf); 12058 if (ret) { 12059 ath12k_warn(ar->ab, 12060 "failed to set HE autorate GI:%u, LTF:%u params, error:%d\n", 12061 he_gi, he_ltf, ret); 12062 return ret; 12063 } 12064 12065 return 0; 12066 } 12067 12068 static u32 ath12k_mac_nlgi_to_wmigi(enum nl80211_txrate_gi gi) 12069 { 12070 switch (gi) { 12071 case NL80211_TXRATE_DEFAULT_GI: 12072 return WMI_GI_400_NS; 12073 case NL80211_TXRATE_FORCE_LGI: 12074 return WMI_GI_800_NS; 12075 default: 12076 return WMI_GI_400_NS; 12077 } 12078 } 12079 12080 static int ath12k_mac_set_rate_params(struct ath12k_link_vif *arvif, 12081 u32 rate, u8 nss, u8 sgi, u8 ldpc, 12082 u8 he_gi, u8 he_ltf, bool he_fixed_rate) 12083 { 12084 struct ieee80211_bss_conf *link_conf; 12085 struct ath12k *ar = arvif->ar; 12086 u32 vdev_param; 12087 u32 param_value; 12088 int ret; 12089 bool he_support; 12090 12091 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 12092 12093 link_conf = ath12k_mac_get_link_bss_conf(arvif); 12094 if (!link_conf) 12095 return -EINVAL; 12096 12097 he_support = link_conf->he_support; 12098 12099 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 12100 "mac set rate params vdev %i rate 0x%02x nss 0x%02x sgi 0x%02x ldpc 0x%02x\n", 12101 arvif->vdev_id, rate, nss, sgi, ldpc); 12102 12103 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 12104 "he_gi 0x%02x he_ltf 0x%02x he_fixed_rate %d\n", he_gi, 12105 he_ltf, he_fixed_rate); 12106 12107 if (!he_support) { 12108 vdev_param = WMI_VDEV_PARAM_FIXED_RATE; 12109 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 12110 vdev_param, rate); 12111 if (ret) { 12112 ath12k_warn(ar->ab, "failed to set fixed rate param 0x%02x: %d\n", 12113 rate, ret); 12114 return ret; 12115 } 12116 } 12117 12118 vdev_param = WMI_VDEV_PARAM_NSS; 12119 12120 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 12121 vdev_param, nss); 12122 if (ret) { 12123 ath12k_warn(ar->ab, "failed to set nss param %d: %d\n", 12124 nss, ret); 12125 return ret; 12126 } 12127 12128 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 12129 WMI_VDEV_PARAM_LDPC, ldpc); 12130 if (ret) { 12131 ath12k_warn(ar->ab, "failed to set ldpc param %d: %d\n", 12132 ldpc, ret); 12133 return ret; 12134 } 12135 12136 if (he_support) { 12137 if (he_fixed_rate) 12138 ret = ath12k_mac_set_fixed_rate_gi_ltf(arvif, he_gi, he_ltf); 12139 else 12140 ret = ath12k_mac_set_auto_rate_gi_ltf(arvif, he_gi, he_ltf); 12141 if (ret) 12142 return ret; 12143 } else { 12144 vdev_param = WMI_VDEV_PARAM_SGI; 12145 param_value = ath12k_mac_nlgi_to_wmigi(sgi); 12146 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 12147 vdev_param, param_value); 12148 if (ret) { 12149 ath12k_warn(ar->ab, "failed to set sgi param %d: %d\n", 12150 sgi, ret); 12151 return ret; 12152 } 12153 } 12154 12155 return 0; 12156 } 12157 12158 static bool 12159 ath12k_mac_vht_mcs_range_present(struct ath12k *ar, 12160 enum nl80211_band band, 12161 const struct cfg80211_bitrate_mask *mask) 12162 { 12163 int i; 12164 u16 vht_mcs; 12165 12166 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) { 12167 vht_mcs = mask->control[band].vht_mcs[i]; 12168 12169 switch (vht_mcs) { 12170 case 0: 12171 case BIT(8) - 1: 12172 case BIT(9) - 1: 12173 case BIT(10) - 1: 12174 break; 12175 default: 12176 return false; 12177 } 12178 } 12179 12180 return true; 12181 } 12182 12183 static bool 12184 ath12k_mac_he_mcs_range_present(struct ath12k *ar, 12185 enum nl80211_band band, 12186 const struct cfg80211_bitrate_mask *mask) 12187 { 12188 int i; 12189 u16 he_mcs; 12190 12191 for (i = 0; i < NL80211_HE_NSS_MAX; i++) { 12192 he_mcs = mask->control[band].he_mcs[i]; 12193 12194 switch (he_mcs) { 12195 case 0: 12196 case BIT(8) - 1: 12197 case BIT(10) - 1: 12198 case BIT(12) - 1: 12199 break; 12200 default: 12201 return false; 12202 } 12203 } 12204 12205 return true; 12206 } 12207 12208 static void ath12k_mac_set_bitrate_mask_iter(void *data, 12209 struct ieee80211_sta *sta) 12210 { 12211 struct ath12k_link_vif *arvif = data; 12212 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta); 12213 struct ath12k_link_sta *arsta; 12214 struct ath12k *ar = arvif->ar; 12215 12216 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 12217 12218 arsta = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy, 12219 ahsta->link[arvif->link_id]); 12220 if (!arsta || arsta->arvif != arvif) 12221 return; 12222 12223 spin_lock_bh(&ar->data_lock); 12224 arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED; 12225 spin_unlock_bh(&ar->data_lock); 12226 12227 wiphy_work_queue(ath12k_ar_to_hw(ar)->wiphy, &arsta->update_wk); 12228 } 12229 12230 static void ath12k_mac_disable_peer_fixed_rate(void *data, 12231 struct ieee80211_sta *sta) 12232 { 12233 struct ath12k_link_vif *arvif = data; 12234 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta); 12235 struct ath12k_link_sta *arsta; 12236 struct ath12k *ar = arvif->ar; 12237 int ret; 12238 12239 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 12240 12241 arsta = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy, 12242 ahsta->link[arvif->link_id]); 12243 12244 if (!arsta || arsta->arvif != arvif) 12245 return; 12246 12247 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, 12248 arvif->vdev_id, 12249 WMI_PEER_PARAM_FIXED_RATE, 12250 WMI_FIXED_RATE_NONE); 12251 if (ret) 12252 ath12k_warn(ar->ab, 12253 "failed to disable peer fixed rate for STA %pM ret %d\n", 12254 arsta->addr, ret); 12255 } 12256 12257 static bool 12258 ath12k_mac_validate_fixed_rate_settings(struct ath12k *ar, enum nl80211_band band, 12259 const struct cfg80211_bitrate_mask *mask, 12260 unsigned int link_id) 12261 { 12262 bool he_fixed_rate = false, vht_fixed_rate = false; 12263 const u16 *vht_mcs_mask, *he_mcs_mask; 12264 struct ieee80211_link_sta *link_sta; 12265 struct ath12k_peer *peer, *tmp; 12266 u8 vht_nss, he_nss; 12267 int ret = true; 12268 12269 vht_mcs_mask = mask->control[band].vht_mcs; 12270 he_mcs_mask = mask->control[band].he_mcs; 12271 12272 if (ath12k_mac_bitrate_mask_num_vht_rates(ar, band, mask) == 1) 12273 vht_fixed_rate = true; 12274 12275 if (ath12k_mac_bitrate_mask_num_he_rates(ar, band, mask) == 1) 12276 he_fixed_rate = true; 12277 12278 if (!vht_fixed_rate && !he_fixed_rate) 12279 return true; 12280 12281 vht_nss = ath12k_mac_max_vht_nss(vht_mcs_mask); 12282 he_nss = ath12k_mac_max_he_nss(he_mcs_mask); 12283 12284 rcu_read_lock(); 12285 spin_lock_bh(&ar->ab->base_lock); 12286 list_for_each_entry_safe(peer, tmp, &ar->ab->peers, list) { 12287 if (peer->sta) { 12288 link_sta = rcu_dereference(peer->sta->link[link_id]); 12289 if (!link_sta) { 12290 ret = false; 12291 goto exit; 12292 } 12293 12294 if (vht_fixed_rate && (!link_sta->vht_cap.vht_supported || 12295 link_sta->rx_nss < vht_nss)) { 12296 ret = false; 12297 goto exit; 12298 } 12299 if (he_fixed_rate && (!link_sta->he_cap.has_he || 12300 link_sta->rx_nss < he_nss)) { 12301 ret = false; 12302 goto exit; 12303 } 12304 } 12305 } 12306 exit: 12307 spin_unlock_bh(&ar->ab->base_lock); 12308 rcu_read_unlock(); 12309 return ret; 12310 } 12311 12312 static int 12313 ath12k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw, 12314 struct ieee80211_vif *vif, 12315 const struct cfg80211_bitrate_mask *mask) 12316 { 12317 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 12318 struct ath12k_link_vif *arvif; 12319 struct cfg80211_chan_def def; 12320 struct ath12k *ar; 12321 enum nl80211_band band; 12322 const u8 *ht_mcs_mask; 12323 const u16 *vht_mcs_mask; 12324 const u16 *he_mcs_mask; 12325 u8 he_ltf = 0; 12326 u8 he_gi = 0; 12327 u32 rate; 12328 u8 nss, mac_nss; 12329 u8 sgi; 12330 u8 ldpc; 12331 int single_nss; 12332 int ret; 12333 int num_rates; 12334 bool he_fixed_rate = false; 12335 12336 lockdep_assert_wiphy(hw->wiphy); 12337 12338 arvif = &ahvif->deflink; 12339 12340 ar = arvif->ar; 12341 if (ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)) { 12342 ret = -EPERM; 12343 goto out; 12344 } 12345 12346 band = def.chan->band; 12347 ht_mcs_mask = mask->control[band].ht_mcs; 12348 vht_mcs_mask = mask->control[band].vht_mcs; 12349 he_mcs_mask = mask->control[band].he_mcs; 12350 ldpc = !!(ar->ht_cap_info & WMI_HT_CAP_LDPC); 12351 12352 sgi = mask->control[band].gi; 12353 if (sgi == NL80211_TXRATE_FORCE_SGI) { 12354 ret = -EINVAL; 12355 goto out; 12356 } 12357 12358 he_gi = mask->control[band].he_gi; 12359 he_ltf = mask->control[band].he_ltf; 12360 12361 /* mac80211 doesn't support sending a fixed HT/VHT MCS alone, rather it 12362 * requires passing at least one of used basic rates along with them. 12363 * Fixed rate setting across different preambles(legacy, HT, VHT) is 12364 * not supported by the FW. Hence use of FIXED_RATE vdev param is not 12365 * suitable for setting single HT/VHT rates. 12366 * But, there could be a single basic rate passed from userspace which 12367 * can be done through the FIXED_RATE param. 12368 */ 12369 if (ath12k_mac_has_single_legacy_rate(ar, band, mask)) { 12370 ret = ath12k_mac_get_single_legacy_rate(ar, band, mask, &rate, 12371 &nss); 12372 if (ret) { 12373 ath12k_warn(ar->ab, "failed to get single legacy rate for vdev %i: %d\n", 12374 arvif->vdev_id, ret); 12375 goto out; 12376 } 12377 12378 ieee80211_iterate_stations_mtx(hw, 12379 ath12k_mac_disable_peer_fixed_rate, 12380 arvif); 12381 } else if (ath12k_mac_bitrate_mask_get_single_nss(ar, vif, band, mask, 12382 &single_nss)) { 12383 rate = WMI_FIXED_RATE_NONE; 12384 nss = single_nss; 12385 arvif->bitrate_mask = *mask; 12386 12387 ieee80211_iterate_stations_atomic(hw, 12388 ath12k_mac_set_bitrate_mask_iter, 12389 arvif); 12390 } else { 12391 rate = WMI_FIXED_RATE_NONE; 12392 12393 if (!ath12k_mac_validate_fixed_rate_settings(ar, band, 12394 mask, arvif->link_id)) 12395 ath12k_warn(ar->ab, 12396 "failed to update fixed rate settings due to mcs/nss incompatibility\n"); 12397 12398 mac_nss = max3(ath12k_mac_max_ht_nss(ht_mcs_mask), 12399 ath12k_mac_max_vht_nss(vht_mcs_mask), 12400 ath12k_mac_max_he_nss(he_mcs_mask)); 12401 nss = min_t(u32, ar->num_tx_chains, mac_nss); 12402 12403 /* If multiple rates across different preambles are given 12404 * we can reconfigure this info with all peers using PEER_ASSOC 12405 * command with the below exception cases. 12406 * - Single VHT Rate : peer_assoc command accommodates only MCS 12407 * range values i.e 0-7, 0-8, 0-9 for VHT. Though mac80211 12408 * mandates passing basic rates along with HT/VHT rates, FW 12409 * doesn't allow switching from VHT to Legacy. Hence instead of 12410 * setting legacy and VHT rates using RATEMASK_CMD vdev cmd, 12411 * we could set this VHT rate as peer fixed rate param, which 12412 * will override FIXED rate and FW rate control algorithm. 12413 * If single VHT rate is passed along with HT rates, we select 12414 * the VHT rate as fixed rate for vht peers. 12415 * - Multiple VHT Rates : When Multiple VHT rates are given,this 12416 * can be set using RATEMASK CMD which uses FW rate-ctl alg. 12417 * TODO: Setting multiple VHT MCS and replacing peer_assoc with 12418 * RATEMASK_CMDID can cover all use cases of setting rates 12419 * across multiple preambles and rates within same type. 12420 * But requires more validation of the command at this point. 12421 */ 12422 12423 num_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band, 12424 mask); 12425 12426 if (!ath12k_mac_vht_mcs_range_present(ar, band, mask) && 12427 num_rates > 1) { 12428 /* TODO: Handle multiple VHT MCS values setting using 12429 * RATEMASK CMD 12430 */ 12431 ath12k_warn(ar->ab, 12432 "Setting more than one MCS Value in bitrate mask not supported\n"); 12433 ret = -EINVAL; 12434 goto out; 12435 } 12436 12437 num_rates = ath12k_mac_bitrate_mask_num_he_rates(ar, band, mask); 12438 if (num_rates == 1) 12439 he_fixed_rate = true; 12440 12441 if (!ath12k_mac_he_mcs_range_present(ar, band, mask) && 12442 num_rates > 1) { 12443 ath12k_warn(ar->ab, 12444 "Setting more than one HE MCS Value in bitrate mask not supported\n"); 12445 ret = -EINVAL; 12446 goto out; 12447 } 12448 ieee80211_iterate_stations_mtx(hw, 12449 ath12k_mac_disable_peer_fixed_rate, 12450 arvif); 12451 12452 arvif->bitrate_mask = *mask; 12453 ieee80211_iterate_stations_mtx(hw, 12454 ath12k_mac_set_bitrate_mask_iter, 12455 arvif); 12456 } 12457 12458 ret = ath12k_mac_set_rate_params(arvif, rate, nss, sgi, ldpc, he_gi, 12459 he_ltf, he_fixed_rate); 12460 if (ret) { 12461 ath12k_warn(ar->ab, "failed to set rate params on vdev %i: %d\n", 12462 arvif->vdev_id, ret); 12463 } 12464 12465 out: 12466 return ret; 12467 } 12468 12469 static void 12470 ath12k_mac_op_reconfig_complete(struct ieee80211_hw *hw, 12471 enum ieee80211_reconfig_type reconfig_type) 12472 { 12473 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 12474 struct ath12k *ar; 12475 struct ath12k_base *ab; 12476 struct ath12k_vif *ahvif; 12477 struct ath12k_link_vif *arvif; 12478 int recovery_count, i; 12479 12480 lockdep_assert_wiphy(hw->wiphy); 12481 12482 if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART) 12483 return; 12484 12485 guard(mutex)(&ah->hw_mutex); 12486 12487 if (ah->state != ATH12K_HW_STATE_RESTARTED) 12488 return; 12489 12490 ah->state = ATH12K_HW_STATE_ON; 12491 ieee80211_wake_queues(hw); 12492 12493 for_each_ar(ah, ar, i) { 12494 ab = ar->ab; 12495 12496 ath12k_warn(ar->ab, "pdev %d successfully recovered\n", 12497 ar->pdev->pdev_id); 12498 12499 if (ar->ab->hw_params->current_cc_support && 12500 ar->alpha2[0] != 0 && ar->alpha2[1] != 0) { 12501 struct wmi_set_current_country_arg arg = {}; 12502 12503 memcpy(&arg.alpha2, ar->alpha2, 2); 12504 reinit_completion(&ar->regd_update_completed); 12505 ath12k_wmi_send_set_current_country_cmd(ar, &arg); 12506 } 12507 12508 if (ab->is_reset) { 12509 recovery_count = atomic_inc_return(&ab->recovery_count); 12510 12511 ath12k_dbg(ab, ATH12K_DBG_BOOT, "recovery count %d\n", 12512 recovery_count); 12513 12514 /* When there are multiple radios in an SOC, 12515 * the recovery has to be done for each radio 12516 */ 12517 if (recovery_count == ab->num_radios) { 12518 atomic_dec(&ab->reset_count); 12519 complete(&ab->reset_complete); 12520 ab->is_reset = false; 12521 atomic_set(&ab->fail_cont_count, 0); 12522 ath12k_dbg(ab, ATH12K_DBG_BOOT, "reset success\n"); 12523 } 12524 } 12525 12526 list_for_each_entry(arvif, &ar->arvifs, list) { 12527 ahvif = arvif->ahvif; 12528 ath12k_dbg(ab, ATH12K_DBG_BOOT, 12529 "reconfig cipher %d up %d vdev type %d\n", 12530 ahvif->key_cipher, 12531 arvif->is_up, 12532 ahvif->vdev_type); 12533 12534 /* After trigger disconnect, then upper layer will 12535 * trigger connect again, then the PN number of 12536 * upper layer will be reset to keep up with AP 12537 * side, hence PN number mismatch will not happen. 12538 */ 12539 if (arvif->is_up && 12540 ahvif->vdev_type == WMI_VDEV_TYPE_STA && 12541 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) { 12542 ieee80211_hw_restart_disconnect(ahvif->vif); 12543 12544 ath12k_dbg(ab, ATH12K_DBG_BOOT, 12545 "restart disconnect\n"); 12546 } 12547 } 12548 } 12549 } 12550 12551 static void 12552 ath12k_mac_update_bss_chan_survey(struct ath12k *ar, 12553 struct ieee80211_channel *channel) 12554 { 12555 int ret; 12556 enum wmi_bss_chan_info_req_type type = WMI_BSS_SURVEY_REQ_TYPE_READ; 12557 12558 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 12559 12560 if (!test_bit(WMI_TLV_SERVICE_BSS_CHANNEL_INFO_64, ar->ab->wmi_ab.svc_map) || 12561 ar->rx_channel != channel) 12562 return; 12563 12564 if (ar->scan.state != ATH12K_SCAN_IDLE) { 12565 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 12566 "ignoring bss chan info req while scanning..\n"); 12567 return; 12568 } 12569 12570 reinit_completion(&ar->bss_survey_done); 12571 12572 ret = ath12k_wmi_pdev_bss_chan_info_request(ar, type); 12573 if (ret) { 12574 ath12k_warn(ar->ab, "failed to send pdev bss chan info request\n"); 12575 return; 12576 } 12577 12578 ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ); 12579 if (ret == 0) 12580 ath12k_warn(ar->ab, "bss channel survey timed out\n"); 12581 } 12582 12583 static int ath12k_mac_op_get_survey(struct ieee80211_hw *hw, int idx, 12584 struct survey_info *survey) 12585 { 12586 struct ath12k *ar; 12587 struct ieee80211_supported_band *sband; 12588 struct survey_info *ar_survey; 12589 12590 lockdep_assert_wiphy(hw->wiphy); 12591 12592 if (idx >= ATH12K_NUM_CHANS) 12593 return -ENOENT; 12594 12595 sband = hw->wiphy->bands[NL80211_BAND_2GHZ]; 12596 if (sband && idx >= sband->n_channels) { 12597 idx -= sband->n_channels; 12598 sband = NULL; 12599 } 12600 12601 if (!sband) 12602 sband = hw->wiphy->bands[NL80211_BAND_5GHZ]; 12603 if (sband && idx >= sband->n_channels) { 12604 idx -= sband->n_channels; 12605 sband = NULL; 12606 } 12607 12608 if (!sband) 12609 sband = hw->wiphy->bands[NL80211_BAND_6GHZ]; 12610 12611 if (!sband || idx >= sband->n_channels) 12612 return -ENOENT; 12613 12614 ar = ath12k_mac_get_ar_by_chan(hw, &sband->channels[idx]); 12615 if (!ar) { 12616 if (sband->channels[idx].flags & IEEE80211_CHAN_DISABLED) { 12617 memset(survey, 0, sizeof(*survey)); 12618 return 0; 12619 } 12620 return -ENOENT; 12621 } 12622 12623 ar_survey = &ar->survey[idx]; 12624 12625 ath12k_mac_update_bss_chan_survey(ar, &sband->channels[idx]); 12626 12627 spin_lock_bh(&ar->data_lock); 12628 memcpy(survey, ar_survey, sizeof(*survey)); 12629 spin_unlock_bh(&ar->data_lock); 12630 12631 survey->channel = &sband->channels[idx]; 12632 12633 if (ar->rx_channel == survey->channel) 12634 survey->filled |= SURVEY_INFO_IN_USE; 12635 12636 return 0; 12637 } 12638 12639 static void ath12k_mac_put_chain_rssi(struct station_info *sinfo, 12640 struct ath12k_link_sta *arsta) 12641 { 12642 s8 rssi; 12643 int i; 12644 12645 for (i = 0; i < ARRAY_SIZE(sinfo->chain_signal); i++) { 12646 sinfo->chains &= ~BIT(i); 12647 rssi = arsta->chain_signal[i]; 12648 12649 if (rssi != ATH12K_DEFAULT_NOISE_FLOOR && 12650 rssi != ATH12K_INVALID_RSSI_FULL && 12651 rssi != ATH12K_INVALID_RSSI_EMPTY && 12652 rssi != 0) { 12653 sinfo->chain_signal[i] = rssi; 12654 sinfo->chains |= BIT(i); 12655 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL); 12656 } 12657 } 12658 } 12659 12660 static void ath12k_mac_op_sta_statistics(struct ieee80211_hw *hw, 12661 struct ieee80211_vif *vif, 12662 struct ieee80211_sta *sta, 12663 struct station_info *sinfo) 12664 { 12665 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta); 12666 struct ath12k_fw_stats_req_params params = {}; 12667 struct ath12k_link_sta *arsta; 12668 s8 signal, noise_floor; 12669 struct ath12k *ar; 12670 bool db2dbm; 12671 12672 lockdep_assert_wiphy(hw->wiphy); 12673 12674 arsta = &ahsta->deflink; 12675 ar = ath12k_get_ar_by_vif(hw, vif, arsta->link_id); 12676 if (!ar) 12677 return; 12678 12679 db2dbm = test_bit(WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT, 12680 ar->ab->wmi_ab.svc_map); 12681 12682 sinfo->rx_duration = arsta->rx_duration; 12683 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION); 12684 12685 sinfo->tx_duration = arsta->tx_duration; 12686 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION); 12687 12688 if (arsta->txrate.legacy || arsta->txrate.nss) { 12689 if (arsta->txrate.legacy) { 12690 sinfo->txrate.legacy = arsta->txrate.legacy; 12691 } else { 12692 sinfo->txrate.mcs = arsta->txrate.mcs; 12693 sinfo->txrate.nss = arsta->txrate.nss; 12694 sinfo->txrate.bw = arsta->txrate.bw; 12695 sinfo->txrate.he_gi = arsta->txrate.he_gi; 12696 sinfo->txrate.he_dcm = arsta->txrate.he_dcm; 12697 sinfo->txrate.he_ru_alloc = arsta->txrate.he_ru_alloc; 12698 sinfo->txrate.eht_gi = arsta->txrate.eht_gi; 12699 sinfo->txrate.eht_ru_alloc = arsta->txrate.eht_ru_alloc; 12700 } 12701 sinfo->txrate.flags = arsta->txrate.flags; 12702 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE); 12703 } 12704 12705 /* TODO: Use real NF instead of default one. */ 12706 signal = arsta->rssi_comb; 12707 12708 params.pdev_id = ar->pdev->pdev_id; 12709 params.vdev_id = 0; 12710 params.stats_id = WMI_REQUEST_VDEV_STAT; 12711 12712 if (!signal && 12713 ahsta->ahvif->vdev_type == WMI_VDEV_TYPE_STA && 12714 !(ath12k_mac_get_fw_stats(ar, ¶ms))) 12715 signal = arsta->rssi_beacon; 12716 12717 params.stats_id = WMI_REQUEST_RSSI_PER_CHAIN_STAT; 12718 if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) && 12719 ahsta->ahvif->vdev_type == WMI_VDEV_TYPE_STA && 12720 !(ath12k_mac_get_fw_stats(ar, ¶ms))) 12721 ath12k_mac_put_chain_rssi(sinfo, arsta); 12722 12723 spin_lock_bh(&ar->data_lock); 12724 noise_floor = ath12k_pdev_get_noise_floor(ar); 12725 spin_unlock_bh(&ar->data_lock); 12726 12727 if (signal) { 12728 sinfo->signal = db2dbm ? signal : signal + noise_floor; 12729 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL); 12730 } 12731 12732 sinfo->signal_avg = ewma_avg_rssi_read(&arsta->avg_rssi); 12733 12734 if (!db2dbm) 12735 sinfo->signal_avg += noise_floor; 12736 12737 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG); 12738 12739 sinfo->tx_retries = arsta->tx_retry_count; 12740 sinfo->tx_failed = arsta->tx_retry_failed; 12741 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES); 12742 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED); 12743 } 12744 12745 static void ath12k_mac_op_link_sta_statistics(struct ieee80211_hw *hw, 12746 struct ieee80211_vif *vif, 12747 struct ieee80211_link_sta *link_sta, 12748 struct link_station_info *link_sinfo) 12749 { 12750 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(link_sta->sta); 12751 struct ath12k_fw_stats_req_params params = {}; 12752 struct ath12k_link_sta *arsta; 12753 struct ath12k *ar; 12754 s8 signal; 12755 bool db2dbm; 12756 12757 lockdep_assert_wiphy(hw->wiphy); 12758 12759 arsta = wiphy_dereference(hw->wiphy, ahsta->link[link_sta->link_id]); 12760 12761 if (!arsta) 12762 return; 12763 12764 ar = ath12k_get_ar_by_vif(hw, vif, arsta->link_id); 12765 if (!ar) 12766 return; 12767 12768 db2dbm = test_bit(WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT, 12769 ar->ab->wmi_ab.svc_map); 12770 12771 link_sinfo->rx_duration = arsta->rx_duration; 12772 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION); 12773 12774 link_sinfo->tx_duration = arsta->tx_duration; 12775 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION); 12776 12777 if (arsta->txrate.legacy || arsta->txrate.nss) { 12778 if (arsta->txrate.legacy) { 12779 link_sinfo->txrate.legacy = arsta->txrate.legacy; 12780 } else { 12781 link_sinfo->txrate.mcs = arsta->txrate.mcs; 12782 link_sinfo->txrate.nss = arsta->txrate.nss; 12783 link_sinfo->txrate.bw = arsta->txrate.bw; 12784 link_sinfo->txrate.he_gi = arsta->txrate.he_gi; 12785 link_sinfo->txrate.he_dcm = arsta->txrate.he_dcm; 12786 link_sinfo->txrate.he_ru_alloc = 12787 arsta->txrate.he_ru_alloc; 12788 link_sinfo->txrate.eht_gi = arsta->txrate.eht_gi; 12789 link_sinfo->txrate.eht_ru_alloc = 12790 arsta->txrate.eht_ru_alloc; 12791 } 12792 link_sinfo->txrate.flags = arsta->txrate.flags; 12793 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE); 12794 } 12795 12796 /* TODO: Use real NF instead of default one. */ 12797 signal = arsta->rssi_comb; 12798 12799 params.pdev_id = ar->pdev->pdev_id; 12800 params.vdev_id = 0; 12801 params.stats_id = WMI_REQUEST_VDEV_STAT; 12802 12803 if (!signal && 12804 ahsta->ahvif->vdev_type == WMI_VDEV_TYPE_STA && 12805 !(ath12k_mac_get_fw_stats(ar, ¶ms))) 12806 signal = arsta->rssi_beacon; 12807 12808 if (signal) { 12809 link_sinfo->signal = 12810 db2dbm ? signal : signal + ATH12K_DEFAULT_NOISE_FLOOR; 12811 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL); 12812 } 12813 12814 link_sinfo->signal_avg = ewma_avg_rssi_read(&arsta->avg_rssi); 12815 12816 if (!db2dbm) 12817 link_sinfo->signal_avg += ATH12K_DEFAULT_NOISE_FLOOR; 12818 12819 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG); 12820 12821 link_sinfo->tx_retries = arsta->tx_retry_count; 12822 link_sinfo->tx_failed = arsta->tx_retry_failed; 12823 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES); 12824 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED); 12825 } 12826 12827 static int ath12k_mac_op_cancel_remain_on_channel(struct ieee80211_hw *hw, 12828 struct ieee80211_vif *vif) 12829 { 12830 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 12831 struct ath12k *ar; 12832 12833 ar = ath12k_ah_to_ar(ah, 0); 12834 12835 lockdep_assert_wiphy(hw->wiphy); 12836 12837 spin_lock_bh(&ar->data_lock); 12838 ar->scan.roc_notify = false; 12839 spin_unlock_bh(&ar->data_lock); 12840 12841 ath12k_scan_abort(ar); 12842 12843 cancel_delayed_work_sync(&ar->scan.timeout); 12844 wiphy_work_cancel(hw->wiphy, &ar->scan.vdev_clean_wk); 12845 12846 return 0; 12847 } 12848 12849 static int ath12k_mac_op_remain_on_channel(struct ieee80211_hw *hw, 12850 struct ieee80211_vif *vif, 12851 struct ieee80211_channel *chan, 12852 int duration, 12853 enum ieee80211_roc_type type) 12854 { 12855 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 12856 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 12857 struct ath12k_link_vif *arvif; 12858 struct ath12k *ar; 12859 u32 scan_time_msec; 12860 bool create = true; 12861 u8 link_id; 12862 int ret; 12863 12864 lockdep_assert_wiphy(hw->wiphy); 12865 12866 ar = ath12k_mac_select_scan_device(hw, vif, chan->center_freq); 12867 if (!ar) 12868 return -EINVAL; 12869 12870 /* check if any of the links of ML VIF is already started on 12871 * radio(ar) corresponding to given scan frequency and use it, 12872 * if not use deflink(link 0) for scan purpose. 12873 */ 12874 12875 link_id = ath12k_mac_find_link_id_by_ar(ahvif, ar); 12876 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id); 12877 /* If the vif is already assigned to a specific vdev of an ar, 12878 * check whether its already started, vdev which is started 12879 * are not allowed to switch to a new radio. 12880 * If the vdev is not started, but was earlier created on a 12881 * different ar, delete that vdev and create a new one. We don't 12882 * delete at the scan stop as an optimization to avoid redundant 12883 * delete-create vdev's for the same ar, in case the request is 12884 * always on the same band for the vif 12885 */ 12886 if (arvif->is_created) { 12887 if (WARN_ON(!arvif->ar)) 12888 return -EINVAL; 12889 12890 if (ar != arvif->ar && arvif->is_started) 12891 return -EBUSY; 12892 12893 if (ar != arvif->ar) { 12894 ath12k_mac_remove_link_interface(hw, arvif); 12895 ath12k_mac_unassign_link_vif(arvif); 12896 } else { 12897 create = false; 12898 } 12899 } 12900 12901 if (create) { 12902 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id); 12903 12904 ret = ath12k_mac_vdev_create(ar, arvif); 12905 if (ret) { 12906 ath12k_warn(ar->ab, "unable to create scan vdev for roc: %d\n", 12907 ret); 12908 return ret; 12909 } 12910 } 12911 12912 spin_lock_bh(&ar->data_lock); 12913 12914 switch (ar->scan.state) { 12915 case ATH12K_SCAN_IDLE: 12916 reinit_completion(&ar->scan.started); 12917 reinit_completion(&ar->scan.completed); 12918 reinit_completion(&ar->scan.on_channel); 12919 ar->scan.state = ATH12K_SCAN_STARTING; 12920 ar->scan.is_roc = true; 12921 ar->scan.arvif = arvif; 12922 ar->scan.roc_freq = chan->center_freq; 12923 ar->scan.roc_notify = true; 12924 ret = 0; 12925 break; 12926 case ATH12K_SCAN_STARTING: 12927 case ATH12K_SCAN_RUNNING: 12928 case ATH12K_SCAN_ABORTING: 12929 ret = -EBUSY; 12930 break; 12931 } 12932 12933 spin_unlock_bh(&ar->data_lock); 12934 12935 if (ret) 12936 return ret; 12937 12938 scan_time_msec = hw->wiphy->max_remain_on_channel_duration * 2; 12939 12940 struct ath12k_wmi_scan_req_arg *arg __free(kfree) = 12941 kzalloc(sizeof(*arg), GFP_KERNEL); 12942 if (!arg) 12943 return -ENOMEM; 12944 12945 ath12k_wmi_start_scan_init(ar, arg); 12946 arg->num_chan = 1; 12947 12948 u32 *chan_list __free(kfree) = kcalloc(arg->num_chan, sizeof(*chan_list), 12949 GFP_KERNEL); 12950 if (!chan_list) 12951 return -ENOMEM; 12952 12953 arg->chan_list = chan_list; 12954 arg->vdev_id = arvif->vdev_id; 12955 arg->scan_id = ATH12K_SCAN_ID; 12956 arg->chan_list[0] = chan->center_freq; 12957 arg->dwell_time_active = scan_time_msec; 12958 arg->dwell_time_passive = scan_time_msec; 12959 arg->max_scan_time = scan_time_msec; 12960 arg->scan_f_passive = 1; 12961 arg->burst_duration = duration; 12962 12963 ret = ath12k_start_scan(ar, arg); 12964 if (ret) { 12965 ath12k_warn(ar->ab, "failed to start roc scan: %d\n", ret); 12966 12967 spin_lock_bh(&ar->data_lock); 12968 ar->scan.state = ATH12K_SCAN_IDLE; 12969 spin_unlock_bh(&ar->data_lock); 12970 return ret; 12971 } 12972 12973 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3 * HZ); 12974 if (ret == 0) { 12975 ath12k_warn(ar->ab, "failed to switch to channel for roc scan\n"); 12976 ret = ath12k_scan_stop(ar); 12977 if (ret) 12978 ath12k_warn(ar->ab, "failed to stop scan: %d\n", ret); 12979 return -ETIMEDOUT; 12980 } 12981 12982 ieee80211_queue_delayed_work(hw, &ar->scan.timeout, 12983 msecs_to_jiffies(duration)); 12984 12985 return 0; 12986 } 12987 12988 static void ath12k_mac_op_set_rekey_data(struct ieee80211_hw *hw, 12989 struct ieee80211_vif *vif, 12990 struct cfg80211_gtk_rekey_data *data) 12991 { 12992 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 12993 struct ath12k_rekey_data *rekey_data; 12994 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 12995 struct ath12k *ar = ath12k_ah_to_ar(ah, 0); 12996 struct ath12k_link_vif *arvif; 12997 12998 lockdep_assert_wiphy(hw->wiphy); 12999 13000 arvif = &ahvif->deflink; 13001 rekey_data = &arvif->rekey_data; 13002 13003 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac set rekey data vdev %d\n", 13004 arvif->vdev_id); 13005 13006 memcpy(rekey_data->kck, data->kck, NL80211_KCK_LEN); 13007 memcpy(rekey_data->kek, data->kek, NL80211_KEK_LEN); 13008 13009 /* The supplicant works on big-endian, the firmware expects it on 13010 * little endian. 13011 */ 13012 rekey_data->replay_ctr = get_unaligned_be64(data->replay_ctr); 13013 13014 arvif->rekey_data.enable_offload = true; 13015 13016 ath12k_dbg_dump(ar->ab, ATH12K_DBG_MAC, "kck", NULL, 13017 rekey_data->kck, NL80211_KCK_LEN); 13018 ath12k_dbg_dump(ar->ab, ATH12K_DBG_MAC, "kek", NULL, 13019 rekey_data->kck, NL80211_KEK_LEN); 13020 ath12k_dbg_dump(ar->ab, ATH12K_DBG_MAC, "replay ctr", NULL, 13021 &rekey_data->replay_ctr, sizeof(rekey_data->replay_ctr)); 13022 } 13023 13024 static const struct ieee80211_ops ath12k_ops = { 13025 .tx = ath12k_mac_op_tx, 13026 .wake_tx_queue = ieee80211_handle_wake_tx_queue, 13027 .start = ath12k_mac_op_start, 13028 .stop = ath12k_mac_op_stop, 13029 .reconfig_complete = ath12k_mac_op_reconfig_complete, 13030 .add_interface = ath12k_mac_op_add_interface, 13031 .remove_interface = ath12k_mac_op_remove_interface, 13032 .update_vif_offload = ath12k_mac_op_update_vif_offload, 13033 .config = ath12k_mac_op_config, 13034 .link_info_changed = ath12k_mac_op_link_info_changed, 13035 .vif_cfg_changed = ath12k_mac_op_vif_cfg_changed, 13036 .change_vif_links = ath12k_mac_op_change_vif_links, 13037 .configure_filter = ath12k_mac_op_configure_filter, 13038 .hw_scan = ath12k_mac_op_hw_scan, 13039 .cancel_hw_scan = ath12k_mac_op_cancel_hw_scan, 13040 .set_key = ath12k_mac_op_set_key, 13041 .set_rekey_data = ath12k_mac_op_set_rekey_data, 13042 .sta_state = ath12k_mac_op_sta_state, 13043 .sta_set_txpwr = ath12k_mac_op_sta_set_txpwr, 13044 .link_sta_rc_update = ath12k_mac_op_link_sta_rc_update, 13045 .conf_tx = ath12k_mac_op_conf_tx, 13046 .set_antenna = ath12k_mac_op_set_antenna, 13047 .get_antenna = ath12k_mac_op_get_antenna, 13048 .ampdu_action = ath12k_mac_op_ampdu_action, 13049 .add_chanctx = ath12k_mac_op_add_chanctx, 13050 .remove_chanctx = ath12k_mac_op_remove_chanctx, 13051 .change_chanctx = ath12k_mac_op_change_chanctx, 13052 .assign_vif_chanctx = ath12k_mac_op_assign_vif_chanctx, 13053 .unassign_vif_chanctx = ath12k_mac_op_unassign_vif_chanctx, 13054 .switch_vif_chanctx = ath12k_mac_op_switch_vif_chanctx, 13055 .get_txpower = ath12k_mac_op_get_txpower, 13056 .set_rts_threshold = ath12k_mac_op_set_rts_threshold, 13057 .set_frag_threshold = ath12k_mac_op_set_frag_threshold, 13058 .set_bitrate_mask = ath12k_mac_op_set_bitrate_mask, 13059 .get_survey = ath12k_mac_op_get_survey, 13060 .flush = ath12k_mac_op_flush, 13061 .sta_statistics = ath12k_mac_op_sta_statistics, 13062 .link_sta_statistics = ath12k_mac_op_link_sta_statistics, 13063 .remain_on_channel = ath12k_mac_op_remain_on_channel, 13064 .cancel_remain_on_channel = ath12k_mac_op_cancel_remain_on_channel, 13065 .change_sta_links = ath12k_mac_op_change_sta_links, 13066 .can_activate_links = ath12k_mac_op_can_activate_links, 13067 #ifdef CONFIG_PM 13068 .suspend = ath12k_wow_op_suspend, 13069 .resume = ath12k_wow_op_resume, 13070 .set_wakeup = ath12k_wow_op_set_wakeup, 13071 #endif 13072 #ifdef CONFIG_ATH12K_DEBUGFS 13073 .vif_add_debugfs = ath12k_debugfs_op_vif_add, 13074 #endif 13075 CFG80211_TESTMODE_CMD(ath12k_tm_cmd) 13076 #ifdef CONFIG_ATH12K_DEBUGFS 13077 .link_sta_add_debugfs = ath12k_debugfs_link_sta_op_add, 13078 #endif 13079 }; 13080 13081 void ath12k_mac_update_freq_range(struct ath12k *ar, 13082 u32 freq_low, u32 freq_high) 13083 { 13084 if (!(freq_low && freq_high)) 13085 return; 13086 13087 if (ar->freq_range.start_freq || ar->freq_range.end_freq) { 13088 ar->freq_range.start_freq = min(ar->freq_range.start_freq, 13089 MHZ_TO_KHZ(freq_low)); 13090 ar->freq_range.end_freq = max(ar->freq_range.end_freq, 13091 MHZ_TO_KHZ(freq_high)); 13092 } else { 13093 ar->freq_range.start_freq = MHZ_TO_KHZ(freq_low); 13094 ar->freq_range.end_freq = MHZ_TO_KHZ(freq_high); 13095 } 13096 13097 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 13098 "mac pdev %u freq limit updated. New range %u->%u MHz\n", 13099 ar->pdev->pdev_id, KHZ_TO_MHZ(ar->freq_range.start_freq), 13100 KHZ_TO_MHZ(ar->freq_range.end_freq)); 13101 } 13102 13103 static void ath12k_mac_update_ch_list(struct ath12k *ar, 13104 struct ieee80211_supported_band *band, 13105 u32 freq_low, u32 freq_high) 13106 { 13107 int i; 13108 13109 if (!(freq_low && freq_high)) 13110 return; 13111 13112 for (i = 0; i < band->n_channels; i++) { 13113 if (band->channels[i].center_freq < freq_low || 13114 band->channels[i].center_freq > freq_high) 13115 band->channels[i].flags |= IEEE80211_CHAN_DISABLED; 13116 } 13117 } 13118 13119 static u32 ath12k_get_phy_id(struct ath12k *ar, u32 band) 13120 { 13121 struct ath12k_pdev *pdev = ar->pdev; 13122 struct ath12k_pdev_cap *pdev_cap = &pdev->cap; 13123 13124 if (band == WMI_HOST_WLAN_2GHZ_CAP) 13125 return pdev_cap->band[NL80211_BAND_2GHZ].phy_id; 13126 13127 if (band == WMI_HOST_WLAN_5GHZ_CAP) 13128 return pdev_cap->band[NL80211_BAND_5GHZ].phy_id; 13129 13130 ath12k_warn(ar->ab, "unsupported phy cap:%d\n", band); 13131 13132 return 0; 13133 } 13134 13135 static int ath12k_mac_update_band(struct ath12k *ar, 13136 struct ieee80211_supported_band *orig_band, 13137 struct ieee80211_supported_band *new_band) 13138 { 13139 int i; 13140 13141 if (!orig_band || !new_band) 13142 return -EINVAL; 13143 13144 if (orig_band->band != new_band->band) 13145 return -EINVAL; 13146 13147 for (i = 0; i < new_band->n_channels; i++) { 13148 if (new_band->channels[i].flags & IEEE80211_CHAN_DISABLED) 13149 continue; 13150 /* An enabled channel in new_band should not be already enabled 13151 * in the orig_band 13152 */ 13153 if (WARN_ON(!(orig_band->channels[i].flags & 13154 IEEE80211_CHAN_DISABLED))) 13155 return -EINVAL; 13156 orig_band->channels[i].flags &= ~IEEE80211_CHAN_DISABLED; 13157 } 13158 return 0; 13159 } 13160 13161 static int ath12k_mac_setup_channels_rates(struct ath12k *ar, 13162 u32 supported_bands, 13163 struct ieee80211_supported_band *bands[]) 13164 { 13165 struct ieee80211_supported_band *band; 13166 struct ath12k_wmi_hal_reg_capabilities_ext_arg *reg_cap; 13167 struct ath12k_base *ab = ar->ab; 13168 u32 phy_id, freq_low, freq_high; 13169 struct ath12k_hw *ah = ar->ah; 13170 void *channels; 13171 int ret; 13172 13173 BUILD_BUG_ON((ARRAY_SIZE(ath12k_2ghz_channels) + 13174 ARRAY_SIZE(ath12k_5ghz_channels) + 13175 ARRAY_SIZE(ath12k_6ghz_channels)) != 13176 ATH12K_NUM_CHANS); 13177 13178 reg_cap = &ab->hal_reg_cap[ar->pdev_idx]; 13179 13180 if (supported_bands & WMI_HOST_WLAN_2GHZ_CAP) { 13181 channels = kmemdup(ath12k_2ghz_channels, 13182 sizeof(ath12k_2ghz_channels), 13183 GFP_KERNEL); 13184 if (!channels) 13185 return -ENOMEM; 13186 13187 band = &ar->mac.sbands[NL80211_BAND_2GHZ]; 13188 band->band = NL80211_BAND_2GHZ; 13189 band->n_channels = ARRAY_SIZE(ath12k_2ghz_channels); 13190 band->channels = channels; 13191 band->n_bitrates = ath12k_g_rates_size; 13192 band->bitrates = ath12k_g_rates; 13193 13194 if (ab->hw_params->single_pdev_only) { 13195 phy_id = ath12k_get_phy_id(ar, WMI_HOST_WLAN_2GHZ_CAP); 13196 reg_cap = &ab->hal_reg_cap[phy_id]; 13197 } 13198 13199 freq_low = max(reg_cap->low_2ghz_chan, 13200 ab->reg_freq_2ghz.start_freq); 13201 freq_high = min(reg_cap->high_2ghz_chan, 13202 ab->reg_freq_2ghz.end_freq); 13203 13204 ath12k_mac_update_ch_list(ar, band, 13205 reg_cap->low_2ghz_chan, 13206 reg_cap->high_2ghz_chan); 13207 13208 ath12k_mac_update_freq_range(ar, freq_low, freq_high); 13209 13210 if (!bands[NL80211_BAND_2GHZ]) { 13211 bands[NL80211_BAND_2GHZ] = band; 13212 } else { 13213 /* Split mac in same band under same wiphy */ 13214 ret = ath12k_mac_update_band(ar, bands[NL80211_BAND_2GHZ], band); 13215 if (ret) { 13216 kfree(channels); 13217 band->channels = NULL; 13218 return ret; 13219 } 13220 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac pdev %u identified as 2 GHz split mac with start freq %d end freq %d", 13221 ar->pdev->pdev_id, 13222 KHZ_TO_MHZ(ar->freq_range.start_freq), 13223 KHZ_TO_MHZ(ar->freq_range.end_freq)); 13224 } 13225 } 13226 13227 if (supported_bands & WMI_HOST_WLAN_5GHZ_CAP) { 13228 if (reg_cap->high_5ghz_chan >= ATH12K_MIN_6GHZ_FREQ) { 13229 channels = kmemdup(ath12k_6ghz_channels, 13230 sizeof(ath12k_6ghz_channels), GFP_KERNEL); 13231 if (!channels) { 13232 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); 13233 return -ENOMEM; 13234 } 13235 13236 ar->supports_6ghz = true; 13237 band = &ar->mac.sbands[NL80211_BAND_6GHZ]; 13238 band->band = NL80211_BAND_6GHZ; 13239 band->n_channels = ARRAY_SIZE(ath12k_6ghz_channels); 13240 band->channels = channels; 13241 band->n_bitrates = ath12k_a_rates_size; 13242 band->bitrates = ath12k_a_rates; 13243 13244 freq_low = max(reg_cap->low_5ghz_chan, 13245 ab->reg_freq_6ghz.start_freq); 13246 freq_high = min(reg_cap->high_5ghz_chan, 13247 ab->reg_freq_6ghz.end_freq); 13248 13249 ath12k_mac_update_ch_list(ar, band, 13250 reg_cap->low_5ghz_chan, 13251 reg_cap->high_5ghz_chan); 13252 13253 ath12k_mac_update_freq_range(ar, freq_low, freq_high); 13254 ah->use_6ghz_regd = true; 13255 13256 if (!bands[NL80211_BAND_6GHZ]) { 13257 bands[NL80211_BAND_6GHZ] = band; 13258 } else { 13259 /* Split mac in same band under same wiphy */ 13260 ret = ath12k_mac_update_band(ar, 13261 bands[NL80211_BAND_6GHZ], 13262 band); 13263 if (ret) { 13264 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); 13265 ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL; 13266 kfree(channels); 13267 band->channels = NULL; 13268 return ret; 13269 } 13270 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac pdev %u identified as 6 GHz split mac with start freq %d end freq %d", 13271 ar->pdev->pdev_id, 13272 KHZ_TO_MHZ(ar->freq_range.start_freq), 13273 KHZ_TO_MHZ(ar->freq_range.end_freq)); 13274 } 13275 } 13276 13277 if (reg_cap->low_5ghz_chan < ATH12K_MIN_6GHZ_FREQ) { 13278 channels = kmemdup(ath12k_5ghz_channels, 13279 sizeof(ath12k_5ghz_channels), 13280 GFP_KERNEL); 13281 if (!channels) { 13282 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); 13283 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels); 13284 return -ENOMEM; 13285 } 13286 13287 band = &ar->mac.sbands[NL80211_BAND_5GHZ]; 13288 band->band = NL80211_BAND_5GHZ; 13289 band->n_channels = ARRAY_SIZE(ath12k_5ghz_channels); 13290 band->channels = channels; 13291 band->n_bitrates = ath12k_a_rates_size; 13292 band->bitrates = ath12k_a_rates; 13293 13294 if (ab->hw_params->single_pdev_only) { 13295 phy_id = ath12k_get_phy_id(ar, WMI_HOST_WLAN_5GHZ_CAP); 13296 reg_cap = &ab->hal_reg_cap[phy_id]; 13297 } 13298 13299 freq_low = max(reg_cap->low_5ghz_chan, 13300 ab->reg_freq_5ghz.start_freq); 13301 freq_high = min(reg_cap->high_5ghz_chan, 13302 ab->reg_freq_5ghz.end_freq); 13303 13304 ath12k_mac_update_ch_list(ar, band, 13305 reg_cap->low_5ghz_chan, 13306 reg_cap->high_5ghz_chan); 13307 13308 ath12k_mac_update_freq_range(ar, freq_low, freq_high); 13309 13310 if (!bands[NL80211_BAND_5GHZ]) { 13311 bands[NL80211_BAND_5GHZ] = band; 13312 } else { 13313 /* Split mac in same band under same wiphy */ 13314 ret = ath12k_mac_update_band(ar, 13315 bands[NL80211_BAND_5GHZ], 13316 band); 13317 if (ret) { 13318 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); 13319 ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL; 13320 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels); 13321 ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL; 13322 kfree(channels); 13323 band->channels = NULL; 13324 return ret; 13325 } 13326 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac pdev %u identified as 5 GHz split mac with start freq %d end freq %d", 13327 ar->pdev->pdev_id, 13328 KHZ_TO_MHZ(ar->freq_range.start_freq), 13329 KHZ_TO_MHZ(ar->freq_range.end_freq)); 13330 } 13331 } 13332 } 13333 13334 return 0; 13335 } 13336 13337 static u16 ath12k_mac_get_ifmodes(struct ath12k_hw *ah) 13338 { 13339 struct ath12k *ar; 13340 int i; 13341 u16 interface_modes = U16_MAX; 13342 13343 for_each_ar(ah, ar, i) 13344 interface_modes &= ar->ab->hw_params->interface_modes; 13345 13346 return interface_modes == U16_MAX ? 0 : interface_modes; 13347 } 13348 13349 static bool ath12k_mac_is_iface_mode_enable(struct ath12k_hw *ah, 13350 enum nl80211_iftype type) 13351 { 13352 struct ath12k *ar; 13353 int i; 13354 u16 interface_modes, mode = 0; 13355 bool is_enable = false; 13356 13357 if (type == NL80211_IFTYPE_MESH_POINT) { 13358 if (IS_ENABLED(CONFIG_MAC80211_MESH)) 13359 mode = BIT(type); 13360 } else { 13361 mode = BIT(type); 13362 } 13363 13364 for_each_ar(ah, ar, i) { 13365 interface_modes = ar->ab->hw_params->interface_modes; 13366 if (interface_modes & mode) { 13367 is_enable = true; 13368 break; 13369 } 13370 } 13371 13372 return is_enable; 13373 } 13374 13375 static int 13376 ath12k_mac_setup_radio_iface_comb(struct ath12k *ar, 13377 struct ieee80211_iface_combination *comb) 13378 { 13379 u16 interface_modes = ar->ab->hw_params->interface_modes; 13380 struct ieee80211_iface_limit *limits; 13381 int n_limits, max_interfaces; 13382 bool ap, mesh, p2p; 13383 13384 ap = interface_modes & BIT(NL80211_IFTYPE_AP); 13385 p2p = interface_modes & BIT(NL80211_IFTYPE_P2P_DEVICE); 13386 13387 mesh = IS_ENABLED(CONFIG_MAC80211_MESH) && 13388 (interface_modes & BIT(NL80211_IFTYPE_MESH_POINT)); 13389 13390 if ((ap || mesh) && !p2p) { 13391 n_limits = 2; 13392 max_interfaces = 16; 13393 } else if (p2p) { 13394 n_limits = 3; 13395 if (ap || mesh) 13396 max_interfaces = 16; 13397 else 13398 max_interfaces = 3; 13399 } else { 13400 n_limits = 1; 13401 max_interfaces = 1; 13402 } 13403 13404 limits = kcalloc(n_limits, sizeof(*limits), GFP_KERNEL); 13405 if (!limits) 13406 return -ENOMEM; 13407 13408 limits[0].max = 1; 13409 limits[0].types |= BIT(NL80211_IFTYPE_STATION); 13410 13411 if (ap || mesh || p2p) 13412 limits[1].max = max_interfaces; 13413 13414 if (ap) 13415 limits[1].types |= BIT(NL80211_IFTYPE_AP); 13416 13417 if (mesh) 13418 limits[1].types |= BIT(NL80211_IFTYPE_MESH_POINT); 13419 13420 if (p2p) { 13421 limits[1].types |= BIT(NL80211_IFTYPE_P2P_CLIENT) | 13422 BIT(NL80211_IFTYPE_P2P_GO); 13423 limits[2].max = 1; 13424 limits[2].types |= BIT(NL80211_IFTYPE_P2P_DEVICE); 13425 } 13426 13427 comb[0].limits = limits; 13428 comb[0].n_limits = n_limits; 13429 comb[0].max_interfaces = max_interfaces; 13430 comb[0].beacon_int_infra_match = true; 13431 comb[0].beacon_int_min_gcd = 100; 13432 13433 comb[0].num_different_channels = 1; 13434 comb[0].radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) | 13435 BIT(NL80211_CHAN_WIDTH_20) | 13436 BIT(NL80211_CHAN_WIDTH_40) | 13437 BIT(NL80211_CHAN_WIDTH_80) | 13438 BIT(NL80211_CHAN_WIDTH_160); 13439 13440 return 0; 13441 } 13442 13443 static int 13444 ath12k_mac_setup_global_iface_comb(struct ath12k_hw *ah, 13445 struct wiphy_radio *radio, 13446 u8 n_radio, 13447 struct ieee80211_iface_combination *comb) 13448 { 13449 const struct ieee80211_iface_combination *iter_comb; 13450 struct ieee80211_iface_limit *limits; 13451 int i, j, n_limits; 13452 bool ap, mesh, p2p; 13453 13454 if (!n_radio) 13455 return 0; 13456 13457 ap = ath12k_mac_is_iface_mode_enable(ah, NL80211_IFTYPE_AP); 13458 p2p = ath12k_mac_is_iface_mode_enable(ah, NL80211_IFTYPE_P2P_DEVICE); 13459 mesh = ath12k_mac_is_iface_mode_enable(ah, NL80211_IFTYPE_MESH_POINT); 13460 13461 if ((ap || mesh) && !p2p) 13462 n_limits = 2; 13463 else if (p2p) 13464 n_limits = 3; 13465 else 13466 n_limits = 1; 13467 13468 limits = kcalloc(n_limits, sizeof(*limits), GFP_KERNEL); 13469 if (!limits) 13470 return -ENOMEM; 13471 13472 for (i = 0; i < n_radio; i++) { 13473 iter_comb = radio[i].iface_combinations; 13474 for (j = 0; j < iter_comb->n_limits && j < n_limits; j++) { 13475 limits[j].types |= iter_comb->limits[j].types; 13476 limits[j].max += iter_comb->limits[j].max; 13477 } 13478 13479 comb->max_interfaces += iter_comb->max_interfaces; 13480 comb->num_different_channels += iter_comb->num_different_channels; 13481 comb->radar_detect_widths |= iter_comb->radar_detect_widths; 13482 } 13483 13484 comb->limits = limits; 13485 comb->n_limits = n_limits; 13486 comb->beacon_int_infra_match = true; 13487 comb->beacon_int_min_gcd = 100; 13488 13489 return 0; 13490 } 13491 13492 static 13493 void ath12k_mac_cleanup_iface_comb(const struct ieee80211_iface_combination *iface_comb) 13494 { 13495 kfree(iface_comb[0].limits); 13496 kfree(iface_comb); 13497 } 13498 13499 static void ath12k_mac_cleanup_iface_combinations(struct ath12k_hw *ah) 13500 { 13501 struct wiphy *wiphy = ah->hw->wiphy; 13502 const struct wiphy_radio *radio; 13503 int i; 13504 13505 if (wiphy->n_radio > 0) { 13506 radio = wiphy->radio; 13507 for (i = 0; i < wiphy->n_radio; i++) 13508 ath12k_mac_cleanup_iface_comb(radio[i].iface_combinations); 13509 13510 kfree(wiphy->radio); 13511 } 13512 13513 ath12k_mac_cleanup_iface_comb(wiphy->iface_combinations); 13514 } 13515 13516 static int ath12k_mac_setup_iface_combinations(struct ath12k_hw *ah) 13517 { 13518 struct ieee80211_iface_combination *combinations, *comb; 13519 struct wiphy *wiphy = ah->hw->wiphy; 13520 struct wiphy_radio *radio; 13521 int n_combinations = 1; 13522 struct ath12k *ar; 13523 int i, ret; 13524 13525 if (ah->num_radio == 1) { 13526 ar = &ah->radio[0]; 13527 13528 if (ar->ab->hw_params->single_pdev_only) 13529 n_combinations = 2; 13530 13531 combinations = kcalloc(n_combinations, sizeof(*combinations), 13532 GFP_KERNEL); 13533 if (!combinations) 13534 return -ENOMEM; 13535 13536 ret = ath12k_mac_setup_radio_iface_comb(ar, combinations); 13537 if (ret) { 13538 ath12k_hw_warn(ah, "failed to setup radio interface combinations for one radio: %d", 13539 ret); 13540 goto err_free_combinations; 13541 } 13542 13543 if (ar->ab->hw_params->single_pdev_only) { 13544 comb = combinations + 1; 13545 memcpy(comb, combinations, sizeof(*comb)); 13546 comb->num_different_channels = 2; 13547 comb->radar_detect_widths = 0; 13548 } 13549 13550 goto out; 13551 } 13552 13553 combinations = kcalloc(n_combinations, sizeof(*combinations), GFP_KERNEL); 13554 if (!combinations) 13555 return -ENOMEM; 13556 13557 /* there are multiple radios */ 13558 13559 radio = kcalloc(ah->num_radio, sizeof(*radio), GFP_KERNEL); 13560 if (!radio) { 13561 ret = -ENOMEM; 13562 goto err_free_combinations; 13563 } 13564 13565 for_each_ar(ah, ar, i) { 13566 comb = kzalloc(sizeof(*comb), GFP_KERNEL); 13567 if (!comb) { 13568 ret = -ENOMEM; 13569 goto err_free_radios; 13570 } 13571 13572 ret = ath12k_mac_setup_radio_iface_comb(ar, comb); 13573 if (ret) { 13574 ath12k_hw_warn(ah, "failed to setup radio interface combinations for radio %d: %d", 13575 i, ret); 13576 kfree(comb); 13577 goto err_free_radios; 13578 } 13579 13580 radio[i].freq_range = &ar->freq_range; 13581 radio[i].n_freq_range = 1; 13582 13583 radio[i].iface_combinations = comb; 13584 radio[i].n_iface_combinations = 1; 13585 } 13586 13587 ret = ath12k_mac_setup_global_iface_comb(ah, radio, ah->num_radio, combinations); 13588 if (ret) { 13589 ath12k_hw_warn(ah, "failed to setup global interface combinations: %d", 13590 ret); 13591 goto err_free_all_radios; 13592 } 13593 13594 wiphy->radio = radio; 13595 wiphy->n_radio = ah->num_radio; 13596 13597 out: 13598 wiphy->iface_combinations = combinations; 13599 wiphy->n_iface_combinations = n_combinations; 13600 13601 return 0; 13602 13603 err_free_all_radios: 13604 i = ah->num_radio; 13605 13606 err_free_radios: 13607 while (i--) 13608 ath12k_mac_cleanup_iface_comb(radio[i].iface_combinations); 13609 13610 kfree(radio); 13611 13612 err_free_combinations: 13613 kfree(combinations); 13614 13615 return ret; 13616 } 13617 13618 static const u8 ath12k_if_types_ext_capa[] = { 13619 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING, 13620 [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT, 13621 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF, 13622 }; 13623 13624 static const u8 ath12k_if_types_ext_capa_sta[] = { 13625 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING, 13626 [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT, 13627 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF, 13628 [9] = WLAN_EXT_CAPA10_TWT_REQUESTER_SUPPORT, 13629 }; 13630 13631 static const u8 ath12k_if_types_ext_capa_ap[] = { 13632 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING, 13633 [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT, 13634 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF, 13635 [9] = WLAN_EXT_CAPA10_TWT_RESPONDER_SUPPORT, 13636 [10] = WLAN_EXT_CAPA11_EMA_SUPPORT, 13637 }; 13638 13639 static struct wiphy_iftype_ext_capab ath12k_iftypes_ext_capa[] = { 13640 { 13641 .extended_capabilities = ath12k_if_types_ext_capa, 13642 .extended_capabilities_mask = ath12k_if_types_ext_capa, 13643 .extended_capabilities_len = sizeof(ath12k_if_types_ext_capa), 13644 }, { 13645 .iftype = NL80211_IFTYPE_STATION, 13646 .extended_capabilities = ath12k_if_types_ext_capa_sta, 13647 .extended_capabilities_mask = ath12k_if_types_ext_capa_sta, 13648 .extended_capabilities_len = 13649 sizeof(ath12k_if_types_ext_capa_sta), 13650 }, { 13651 .iftype = NL80211_IFTYPE_AP, 13652 .extended_capabilities = ath12k_if_types_ext_capa_ap, 13653 .extended_capabilities_mask = ath12k_if_types_ext_capa_ap, 13654 .extended_capabilities_len = 13655 sizeof(ath12k_if_types_ext_capa_ap), 13656 .eml_capabilities = 0, 13657 .mld_capa_and_ops = 0, 13658 }, 13659 }; 13660 13661 static void ath12k_mac_cleanup_unregister(struct ath12k *ar) 13662 { 13663 idr_for_each(&ar->txmgmt_idr, ath12k_mac_tx_mgmt_pending_free, ar); 13664 idr_destroy(&ar->txmgmt_idr); 13665 13666 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); 13667 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels); 13668 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels); 13669 } 13670 13671 static void ath12k_mac_hw_unregister(struct ath12k_hw *ah) 13672 { 13673 struct ieee80211_hw *hw = ah->hw; 13674 struct ath12k *ar; 13675 int i; 13676 13677 for_each_ar(ah, ar, i) { 13678 cancel_work_sync(&ar->regd_channel_update_work); 13679 cancel_work_sync(&ar->regd_update_work); 13680 ath12k_debugfs_unregister(ar); 13681 ath12k_fw_stats_reset(ar); 13682 } 13683 13684 ieee80211_unregister_hw(hw); 13685 13686 for_each_ar(ah, ar, i) 13687 ath12k_mac_cleanup_unregister(ar); 13688 13689 ath12k_mac_cleanup_iface_combinations(ah); 13690 13691 SET_IEEE80211_DEV(hw, NULL); 13692 } 13693 13694 static int ath12k_mac_setup_register(struct ath12k *ar, 13695 u32 *ht_cap, 13696 struct ieee80211_supported_band *bands[]) 13697 { 13698 struct ath12k_pdev_cap *cap = &ar->pdev->cap; 13699 int ret; 13700 13701 init_waitqueue_head(&ar->txmgmt_empty_waitq); 13702 idr_init(&ar->txmgmt_idr); 13703 spin_lock_init(&ar->txmgmt_idr_lock); 13704 13705 ath12k_pdev_caps_update(ar); 13706 13707 ret = ath12k_mac_setup_channels_rates(ar, 13708 cap->supported_bands, 13709 bands); 13710 if (ret) 13711 return ret; 13712 13713 ath12k_mac_setup_ht_vht_cap(ar, cap, ht_cap); 13714 ath12k_mac_setup_sband_iftype_data(ar, cap); 13715 13716 ar->max_num_stations = ath12k_core_get_max_station_per_radio(ar->ab); 13717 ar->max_num_peers = ath12k_core_get_max_peers_per_radio(ar->ab); 13718 13719 ar->rssi_info.min_nf_dbm = ATH12K_DEFAULT_NOISE_FLOOR; 13720 ar->rssi_info.temp_offset = 0; 13721 ar->rssi_info.noise_floor = ar->rssi_info.min_nf_dbm + ar->rssi_info.temp_offset; 13722 13723 return 0; 13724 } 13725 13726 static int ath12k_mac_hw_register(struct ath12k_hw *ah) 13727 { 13728 struct ieee80211_hw *hw = ah->hw; 13729 struct wiphy *wiphy = hw->wiphy; 13730 struct ath12k *ar = ath12k_ah_to_ar(ah, 0); 13731 struct ath12k_base *ab = ar->ab; 13732 struct ath12k_pdev *pdev; 13733 struct ath12k_pdev_cap *cap; 13734 static const u32 cipher_suites[] = { 13735 WLAN_CIPHER_SUITE_TKIP, 13736 WLAN_CIPHER_SUITE_CCMP, 13737 WLAN_CIPHER_SUITE_AES_CMAC, 13738 WLAN_CIPHER_SUITE_BIP_CMAC_256, 13739 WLAN_CIPHER_SUITE_BIP_GMAC_128, 13740 WLAN_CIPHER_SUITE_BIP_GMAC_256, 13741 WLAN_CIPHER_SUITE_GCMP, 13742 WLAN_CIPHER_SUITE_GCMP_256, 13743 WLAN_CIPHER_SUITE_CCMP_256, 13744 }; 13745 int ret, i, j; 13746 u32 ht_cap = U32_MAX, antennas_rx = 0, antennas_tx = 0; 13747 bool is_6ghz = false, is_raw_mode = false, is_monitor_disable = false; 13748 u8 *mac_addr = NULL; 13749 u8 mbssid_max_interfaces = 0; 13750 13751 wiphy->max_ap_assoc_sta = 0; 13752 13753 for_each_ar(ah, ar, i) { 13754 u32 ht_cap_info = 0; 13755 13756 pdev = ar->pdev; 13757 if (ar->ab->pdevs_macaddr_valid) { 13758 ether_addr_copy(ar->mac_addr, pdev->mac_addr); 13759 } else { 13760 ether_addr_copy(ar->mac_addr, ar->ab->mac_addr); 13761 ar->mac_addr[4] += ar->pdev_idx; 13762 } 13763 13764 ret = ath12k_mac_setup_register(ar, &ht_cap_info, hw->wiphy->bands); 13765 if (ret) 13766 goto err_cleanup_unregister; 13767 13768 /* 6 GHz does not support HT Cap, hence do not consider it */ 13769 if (!ar->supports_6ghz) 13770 ht_cap &= ht_cap_info; 13771 13772 wiphy->max_ap_assoc_sta += ar->max_num_stations; 13773 13774 /* Advertise the max antenna support of all radios, driver can handle 13775 * per pdev specific antenna setting based on pdev cap when antenna 13776 * changes are made 13777 */ 13778 cap = &pdev->cap; 13779 13780 antennas_rx = max_t(u32, antennas_rx, cap->rx_chain_mask); 13781 antennas_tx = max_t(u32, antennas_tx, cap->tx_chain_mask); 13782 13783 if (ar->supports_6ghz) 13784 is_6ghz = true; 13785 13786 if (test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags)) 13787 is_raw_mode = true; 13788 13789 if (!ar->ab->hw_params->supports_monitor) 13790 is_monitor_disable = true; 13791 13792 if (i == 0) 13793 mac_addr = ar->mac_addr; 13794 else 13795 mac_addr = ab->mac_addr; 13796 13797 mbssid_max_interfaces += TARGET_NUM_VDEVS(ar->ab); 13798 } 13799 13800 wiphy->available_antennas_rx = antennas_rx; 13801 wiphy->available_antennas_tx = antennas_tx; 13802 13803 SET_IEEE80211_PERM_ADDR(hw, mac_addr); 13804 SET_IEEE80211_DEV(hw, ab->dev); 13805 13806 ret = ath12k_mac_setup_iface_combinations(ah); 13807 if (ret) { 13808 ath12k_err(ab, "failed to setup interface combinations: %d\n", ret); 13809 goto err_complete_cleanup_unregister; 13810 } 13811 13812 wiphy->interface_modes = ath12k_mac_get_ifmodes(ah); 13813 13814 if (ah->num_radio == 1 && 13815 wiphy->bands[NL80211_BAND_2GHZ] && 13816 wiphy->bands[NL80211_BAND_5GHZ] && 13817 wiphy->bands[NL80211_BAND_6GHZ]) 13818 ieee80211_hw_set(hw, SINGLE_SCAN_ON_ALL_BANDS); 13819 13820 ieee80211_hw_set(hw, SIGNAL_DBM); 13821 ieee80211_hw_set(hw, SUPPORTS_PS); 13822 ieee80211_hw_set(hw, SUPPORTS_DYNAMIC_PS); 13823 ieee80211_hw_set(hw, MFP_CAPABLE); 13824 ieee80211_hw_set(hw, REPORTS_TX_ACK_STATUS); 13825 ieee80211_hw_set(hw, HAS_RATE_CONTROL); 13826 ieee80211_hw_set(hw, AP_LINK_PS); 13827 ieee80211_hw_set(hw, SPECTRUM_MGMT); 13828 ieee80211_hw_set(hw, CONNECTION_MONITOR); 13829 ieee80211_hw_set(hw, SUPPORTS_PER_STA_GTK); 13830 ieee80211_hw_set(hw, CHANCTX_STA_CSA); 13831 ieee80211_hw_set(hw, QUEUE_CONTROL); 13832 ieee80211_hw_set(hw, SUPPORTS_TX_FRAG); 13833 ieee80211_hw_set(hw, REPORTS_LOW_ACK); 13834 ieee80211_hw_set(hw, NO_VIRTUAL_MONITOR); 13835 13836 if (test_bit(WMI_TLV_SERVICE_ETH_OFFLOAD, ar->wmi->wmi_ab->svc_map)) { 13837 ieee80211_hw_set(hw, SUPPORTS_TX_ENCAP_OFFLOAD); 13838 ieee80211_hw_set(hw, SUPPORTS_RX_DECAP_OFFLOAD); 13839 } 13840 13841 if (cap->nss_ratio_enabled) 13842 ieee80211_hw_set(hw, SUPPORTS_VHT_EXT_NSS_BW); 13843 13844 if ((ht_cap & WMI_HT_CAP_ENABLED) || is_6ghz) { 13845 ieee80211_hw_set(hw, AMPDU_AGGREGATION); 13846 ieee80211_hw_set(hw, TX_AMPDU_SETUP_IN_HW); 13847 ieee80211_hw_set(hw, SUPPORTS_REORDERING_BUFFER); 13848 ieee80211_hw_set(hw, SUPPORTS_AMSDU_IN_AMPDU); 13849 ieee80211_hw_set(hw, USES_RSS); 13850 } 13851 13852 wiphy->features |= NL80211_FEATURE_STATIC_SMPS; 13853 wiphy->flags |= WIPHY_FLAG_IBSS_RSN; 13854 13855 /* TODO: Check if HT capability advertised from firmware is different 13856 * for each band for a dual band capable radio. It will be tricky to 13857 * handle it when the ht capability different for each band. 13858 */ 13859 if (ht_cap & WMI_HT_CAP_DYNAMIC_SMPS || 13860 (is_6ghz && ab->hw_params->supports_dynamic_smps_6ghz)) 13861 wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS; 13862 13863 wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID; 13864 wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN; 13865 13866 hw->max_listen_interval = ATH12K_MAX_HW_LISTEN_INTERVAL; 13867 13868 wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL; 13869 wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH; 13870 wiphy->max_remain_on_channel_duration = 5000; 13871 13872 wiphy->flags |= WIPHY_FLAG_AP_UAPSD; 13873 wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE | 13874 NL80211_FEATURE_AP_SCAN; 13875 13876 wiphy->features |= NL80211_FEATURE_TX_POWER_INSERTION; 13877 13878 /* MLO is not yet supported so disable Wireless Extensions for now 13879 * to make sure ath12k users don't use it. This flag can be removed 13880 * once WIPHY_FLAG_SUPPORTS_MLO is enabled. 13881 */ 13882 wiphy->flags |= WIPHY_FLAG_DISABLE_WEXT; 13883 13884 /* Copy over MLO related capabilities received from 13885 * WMI_SERVICE_READY_EXT2_EVENT if single_chip_mlo_supp is set. 13886 */ 13887 if (ab->ag->mlo_capable) { 13888 ath12k_iftypes_ext_capa[2].eml_capabilities = cap->eml_cap; 13889 ath12k_iftypes_ext_capa[2].mld_capa_and_ops = cap->mld_cap; 13890 wiphy->flags |= WIPHY_FLAG_SUPPORTS_MLO; 13891 13892 ieee80211_hw_set(hw, MLO_MCAST_MULTI_LINK_TX); 13893 } 13894 13895 hw->queues = ATH12K_HW_MAX_QUEUES; 13896 wiphy->tx_queue_len = ATH12K_QUEUE_LEN; 13897 hw->offchannel_tx_hw_queue = ATH12K_HW_MAX_QUEUES - 1; 13898 hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF_EHT; 13899 13900 hw->vif_data_size = sizeof(struct ath12k_vif); 13901 hw->sta_data_size = sizeof(struct ath12k_sta); 13902 hw->extra_tx_headroom = ab->hw_params->iova_mask; 13903 13904 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST); 13905 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_STA_TX_PWR); 13906 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT); 13907 13908 wiphy->cipher_suites = cipher_suites; 13909 wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites); 13910 13911 wiphy->iftype_ext_capab = ath12k_iftypes_ext_capa; 13912 wiphy->num_iftype_ext_capab = ARRAY_SIZE(ath12k_iftypes_ext_capa); 13913 13914 wiphy->mbssid_max_interfaces = mbssid_max_interfaces; 13915 wiphy->ema_max_profile_periodicity = TARGET_EMA_MAX_PROFILE_PERIOD; 13916 ieee80211_hw_set(hw, SUPPORTS_MULTI_BSSID); 13917 13918 if (is_6ghz) { 13919 wiphy_ext_feature_set(wiphy, 13920 NL80211_EXT_FEATURE_FILS_DISCOVERY); 13921 wiphy_ext_feature_set(wiphy, 13922 NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP); 13923 } 13924 13925 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_PUNCT); 13926 if (test_bit(WMI_TLV_SERVICE_BEACON_PROTECTION_SUPPORT, ab->wmi_ab.svc_map)) 13927 wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_BEACON_PROTECTION); 13928 13929 ath12k_reg_init(hw); 13930 13931 if (!is_raw_mode) { 13932 hw->netdev_features = NETIF_F_HW_CSUM; 13933 ieee80211_hw_set(hw, SW_CRYPTO_CONTROL); 13934 ieee80211_hw_set(hw, SUPPORT_FAST_XMIT); 13935 } 13936 13937 if (test_bit(WMI_TLV_SERVICE_NLO, ar->wmi->wmi_ab->svc_map)) { 13938 wiphy->max_sched_scan_ssids = WMI_PNO_MAX_SUPP_NETWORKS; 13939 wiphy->max_match_sets = WMI_PNO_MAX_SUPP_NETWORKS; 13940 wiphy->max_sched_scan_ie_len = WMI_PNO_MAX_IE_LENGTH; 13941 wiphy->max_sched_scan_plans = WMI_PNO_MAX_SCHED_SCAN_PLANS; 13942 wiphy->max_sched_scan_plan_interval = 13943 WMI_PNO_MAX_SCHED_SCAN_PLAN_INT; 13944 wiphy->max_sched_scan_plan_iterations = 13945 WMI_PNO_MAX_SCHED_SCAN_PLAN_ITRNS; 13946 wiphy->features |= NL80211_FEATURE_ND_RANDOM_MAC_ADDR; 13947 } 13948 13949 ret = ath12k_wow_init(ar); 13950 if (ret) { 13951 ath12k_warn(ar->ab, "failed to init wow: %d\n", ret); 13952 goto err_cleanup_if_combs; 13953 } 13954 13955 /* Boot-time regulatory updates have already been processed. 13956 * Mark them as complete now, because after registration, 13957 * cfg80211 will notify us again if there are any pending hints. 13958 * We need to wait for those hints to be processed, so it's 13959 * important to mark the boot-time updates as complete before 13960 * proceeding with registration. 13961 */ 13962 for_each_ar(ah, ar, i) 13963 complete_all(&ar->regd_update_completed); 13964 13965 ret = ieee80211_register_hw(hw); 13966 if (ret) { 13967 ath12k_err(ab, "ieee80211 registration failed: %d\n", ret); 13968 goto err_cleanup_if_combs; 13969 } 13970 13971 if (is_monitor_disable) 13972 /* There's a race between calling ieee80211_register_hw() 13973 * and here where the monitor mode is enabled for a little 13974 * while. But that time is so short and in practise it make 13975 * a difference in real life. 13976 */ 13977 wiphy->interface_modes &= ~BIT(NL80211_IFTYPE_MONITOR); 13978 13979 for_each_ar(ah, ar, i) { 13980 /* Apply the regd received during initialization */ 13981 ret = ath12k_regd_update(ar, true); 13982 if (ret) { 13983 ath12k_err(ar->ab, "ath12k regd update failed: %d\n", ret); 13984 goto err_unregister_hw; 13985 } 13986 13987 if (ar->ab->hw_params->current_cc_support && ab->new_alpha2[0]) { 13988 struct wmi_set_current_country_arg current_cc = {}; 13989 13990 memcpy(¤t_cc.alpha2, ab->new_alpha2, 2); 13991 memcpy(&ar->alpha2, ab->new_alpha2, 2); 13992 13993 reinit_completion(&ar->regd_update_completed); 13994 13995 ret = ath12k_wmi_send_set_current_country_cmd(ar, ¤t_cc); 13996 if (ret) 13997 ath12k_warn(ar->ab, 13998 "failed set cc code for mac register: %d\n", 13999 ret); 14000 } 14001 14002 ath12k_fw_stats_init(ar); 14003 ath12k_debugfs_register(ar); 14004 } 14005 14006 return 0; 14007 14008 err_unregister_hw: 14009 for_each_ar(ah, ar, i) 14010 ath12k_debugfs_unregister(ar); 14011 14012 ieee80211_unregister_hw(hw); 14013 14014 err_cleanup_if_combs: 14015 ath12k_mac_cleanup_iface_combinations(ah); 14016 14017 err_complete_cleanup_unregister: 14018 i = ah->num_radio; 14019 14020 err_cleanup_unregister: 14021 for (j = 0; j < i; j++) { 14022 ar = ath12k_ah_to_ar(ah, j); 14023 ath12k_mac_cleanup_unregister(ar); 14024 } 14025 14026 SET_IEEE80211_DEV(hw, NULL); 14027 14028 return ret; 14029 } 14030 14031 static void ath12k_mac_setup(struct ath12k *ar) 14032 { 14033 struct ath12k_base *ab = ar->ab; 14034 struct ath12k_pdev *pdev = ar->pdev; 14035 u8 pdev_idx = ar->pdev_idx; 14036 14037 ar->lmac_id = ath12k_hw_get_mac_from_pdev_id(ab->hw_params, pdev_idx); 14038 14039 ar->wmi = &ab->wmi_ab.wmi[pdev_idx]; 14040 /* FIXME: wmi[0] is already initialized during attach, 14041 * Should we do this again? 14042 */ 14043 ath12k_wmi_pdev_attach(ab, pdev_idx); 14044 14045 ar->cfg_tx_chainmask = pdev->cap.tx_chain_mask; 14046 ar->cfg_rx_chainmask = pdev->cap.rx_chain_mask; 14047 ar->num_tx_chains = hweight32(pdev->cap.tx_chain_mask); 14048 ar->num_rx_chains = hweight32(pdev->cap.rx_chain_mask); 14049 ar->scan.arvif = NULL; 14050 ar->vdev_id_11d_scan = ATH12K_11D_INVALID_VDEV_ID; 14051 14052 spin_lock_init(&ar->data_lock); 14053 INIT_LIST_HEAD(&ar->arvifs); 14054 INIT_LIST_HEAD(&ar->ppdu_stats_info); 14055 14056 init_completion(&ar->vdev_setup_done); 14057 init_completion(&ar->vdev_delete_done); 14058 init_completion(&ar->peer_assoc_done); 14059 init_completion(&ar->peer_delete_done); 14060 init_completion(&ar->install_key_done); 14061 init_completion(&ar->bss_survey_done); 14062 init_completion(&ar->scan.started); 14063 init_completion(&ar->scan.completed); 14064 init_completion(&ar->scan.on_channel); 14065 init_completion(&ar->mlo_setup_done); 14066 init_completion(&ar->completed_11d_scan); 14067 init_completion(&ar->regd_update_completed); 14068 14069 INIT_DELAYED_WORK(&ar->scan.timeout, ath12k_scan_timeout_work); 14070 wiphy_work_init(&ar->scan.vdev_clean_wk, ath12k_scan_vdev_clean_work); 14071 INIT_WORK(&ar->regd_channel_update_work, ath12k_regd_update_chan_list_work); 14072 INIT_LIST_HEAD(&ar->regd_channel_update_queue); 14073 INIT_WORK(&ar->regd_update_work, ath12k_regd_update_work); 14074 14075 wiphy_work_init(&ar->wmi_mgmt_tx_work, ath12k_mgmt_over_wmi_tx_work); 14076 skb_queue_head_init(&ar->wmi_mgmt_tx_queue); 14077 14078 ar->monitor_vdev_id = -1; 14079 ar->monitor_vdev_created = false; 14080 ar->monitor_started = false; 14081 } 14082 14083 static int __ath12k_mac_mlo_setup(struct ath12k *ar) 14084 { 14085 u8 num_link = 0, partner_link_id[ATH12K_GROUP_MAX_RADIO] = {}; 14086 struct ath12k_base *partner_ab, *ab = ar->ab; 14087 struct ath12k_hw_group *ag = ab->ag; 14088 struct wmi_mlo_setup_arg mlo = {}; 14089 struct ath12k_pdev *pdev; 14090 unsigned long time_left; 14091 int i, j, ret; 14092 14093 lockdep_assert_held(&ag->mutex); 14094 14095 reinit_completion(&ar->mlo_setup_done); 14096 14097 for (i = 0; i < ag->num_devices; i++) { 14098 partner_ab = ag->ab[i]; 14099 14100 for (j = 0; j < partner_ab->num_radios; j++) { 14101 pdev = &partner_ab->pdevs[j]; 14102 14103 /* Avoid the self link */ 14104 if (ar == pdev->ar) 14105 continue; 14106 14107 partner_link_id[num_link] = pdev->hw_link_id; 14108 num_link++; 14109 14110 ath12k_dbg(ab, ATH12K_DBG_MAC, "device %d pdev %d hw_link_id %d num_link %d\n", 14111 i, j, pdev->hw_link_id, num_link); 14112 } 14113 } 14114 14115 if (num_link == 0) 14116 return 0; 14117 14118 mlo.group_id = cpu_to_le32(ag->id); 14119 mlo.partner_link_id = partner_link_id; 14120 mlo.num_partner_links = num_link; 14121 ar->mlo_setup_status = 0; 14122 14123 ath12k_dbg(ab, ATH12K_DBG_MAC, "group id %d num_link %d\n", ag->id, num_link); 14124 14125 ret = ath12k_wmi_mlo_setup(ar, &mlo); 14126 if (ret) { 14127 ath12k_err(ab, "failed to send setup MLO WMI command for pdev %d: %d\n", 14128 ar->pdev_idx, ret); 14129 return ret; 14130 } 14131 14132 time_left = wait_for_completion_timeout(&ar->mlo_setup_done, 14133 WMI_MLO_CMD_TIMEOUT_HZ); 14134 14135 if (!time_left || ar->mlo_setup_status) 14136 return ar->mlo_setup_status ? : -ETIMEDOUT; 14137 14138 ath12k_dbg(ab, ATH12K_DBG_MAC, "mlo setup done for pdev %d\n", ar->pdev_idx); 14139 14140 return 0; 14141 } 14142 14143 static int __ath12k_mac_mlo_teardown(struct ath12k *ar) 14144 { 14145 struct ath12k_base *ab = ar->ab; 14146 int ret; 14147 u8 num_link; 14148 14149 if (test_bit(ATH12K_FLAG_RECOVERY, &ab->dev_flags)) 14150 return 0; 14151 14152 num_link = ath12k_get_num_partner_link(ar); 14153 14154 if (num_link == 0) 14155 return 0; 14156 14157 ret = ath12k_wmi_mlo_teardown(ar); 14158 if (ret) { 14159 ath12k_warn(ab, "failed to send MLO teardown WMI command for pdev %d: %d\n", 14160 ar->pdev_idx, ret); 14161 return ret; 14162 } 14163 14164 ath12k_dbg(ab, ATH12K_DBG_MAC, "mlo teardown for pdev %d\n", ar->pdev_idx); 14165 14166 return 0; 14167 } 14168 14169 int ath12k_mac_mlo_setup(struct ath12k_hw_group *ag) 14170 { 14171 struct ath12k_hw *ah; 14172 struct ath12k *ar; 14173 int ret; 14174 int i, j; 14175 14176 for (i = 0; i < ag->num_hw; i++) { 14177 ah = ag->ah[i]; 14178 if (!ah) 14179 continue; 14180 14181 for_each_ar(ah, ar, j) { 14182 ar = &ah->radio[j]; 14183 ret = __ath12k_mac_mlo_setup(ar); 14184 if (ret) { 14185 ath12k_err(ar->ab, "failed to setup MLO: %d\n", ret); 14186 goto err_setup; 14187 } 14188 } 14189 } 14190 14191 return 0; 14192 14193 err_setup: 14194 for (i = i - 1; i >= 0; i--) { 14195 ah = ag->ah[i]; 14196 if (!ah) 14197 continue; 14198 14199 for (j = j - 1; j >= 0; j--) { 14200 ar = &ah->radio[j]; 14201 if (!ar) 14202 continue; 14203 14204 __ath12k_mac_mlo_teardown(ar); 14205 } 14206 } 14207 14208 return ret; 14209 } 14210 14211 void ath12k_mac_mlo_teardown(struct ath12k_hw_group *ag) 14212 { 14213 struct ath12k_hw *ah; 14214 struct ath12k *ar; 14215 int ret, i, j; 14216 14217 for (i = 0; i < ag->num_hw; i++) { 14218 ah = ag->ah[i]; 14219 if (!ah) 14220 continue; 14221 14222 for_each_ar(ah, ar, j) { 14223 ar = &ah->radio[j]; 14224 ret = __ath12k_mac_mlo_teardown(ar); 14225 if (ret) { 14226 ath12k_err(ar->ab, "failed to teardown MLO: %d\n", ret); 14227 break; 14228 } 14229 } 14230 } 14231 } 14232 14233 int ath12k_mac_register(struct ath12k_hw_group *ag) 14234 { 14235 struct ath12k_hw *ah; 14236 int i; 14237 int ret; 14238 14239 for (i = 0; i < ag->num_hw; i++) { 14240 ah = ath12k_ag_to_ah(ag, i); 14241 14242 ret = ath12k_mac_hw_register(ah); 14243 if (ret) 14244 goto err; 14245 } 14246 14247 return 0; 14248 14249 err: 14250 for (i = i - 1; i >= 0; i--) { 14251 ah = ath12k_ag_to_ah(ag, i); 14252 if (!ah) 14253 continue; 14254 14255 ath12k_mac_hw_unregister(ah); 14256 } 14257 14258 return ret; 14259 } 14260 14261 void ath12k_mac_unregister(struct ath12k_hw_group *ag) 14262 { 14263 struct ath12k_hw *ah; 14264 int i; 14265 14266 for (i = ag->num_hw - 1; i >= 0; i--) { 14267 ah = ath12k_ag_to_ah(ag, i); 14268 if (!ah) 14269 continue; 14270 14271 ath12k_mac_hw_unregister(ah); 14272 } 14273 } 14274 14275 static void ath12k_mac_hw_destroy(struct ath12k_hw *ah) 14276 { 14277 ieee80211_free_hw(ah->hw); 14278 } 14279 14280 static struct ath12k_hw *ath12k_mac_hw_allocate(struct ath12k_hw_group *ag, 14281 struct ath12k_pdev_map *pdev_map, 14282 u8 num_pdev_map) 14283 { 14284 struct ieee80211_hw *hw; 14285 struct ath12k *ar; 14286 struct ath12k_base *ab; 14287 struct ath12k_pdev *pdev; 14288 struct ath12k_hw *ah; 14289 int i; 14290 u8 pdev_idx; 14291 14292 hw = ieee80211_alloc_hw(struct_size(ah, radio, num_pdev_map), 14293 &ath12k_ops); 14294 if (!hw) 14295 return NULL; 14296 14297 ah = ath12k_hw_to_ah(hw); 14298 ah->hw = hw; 14299 ah->num_radio = num_pdev_map; 14300 14301 mutex_init(&ah->hw_mutex); 14302 INIT_LIST_HEAD(&ah->ml_peers); 14303 14304 for (i = 0; i < num_pdev_map; i++) { 14305 ab = pdev_map[i].ab; 14306 pdev_idx = pdev_map[i].pdev_idx; 14307 pdev = &ab->pdevs[pdev_idx]; 14308 14309 ar = ath12k_ah_to_ar(ah, i); 14310 ar->ah = ah; 14311 ar->ab = ab; 14312 ar->hw_link_id = pdev->hw_link_id; 14313 ar->pdev = pdev; 14314 ar->pdev_idx = pdev_idx; 14315 pdev->ar = ar; 14316 14317 ag->hw_links[ar->hw_link_id].device_id = ab->device_id; 14318 ag->hw_links[ar->hw_link_id].pdev_idx = pdev_idx; 14319 14320 ath12k_mac_setup(ar); 14321 ath12k_dp_pdev_pre_alloc(ar); 14322 } 14323 14324 return ah; 14325 } 14326 14327 void ath12k_mac_destroy(struct ath12k_hw_group *ag) 14328 { 14329 struct ath12k_pdev *pdev; 14330 struct ath12k_base *ab = ag->ab[0]; 14331 int i, j; 14332 struct ath12k_hw *ah; 14333 14334 for (i = 0; i < ag->num_devices; i++) { 14335 ab = ag->ab[i]; 14336 if (!ab) 14337 continue; 14338 14339 for (j = 0; j < ab->num_radios; j++) { 14340 pdev = &ab->pdevs[j]; 14341 if (!pdev->ar) 14342 continue; 14343 pdev->ar = NULL; 14344 } 14345 } 14346 14347 for (i = 0; i < ag->num_hw; i++) { 14348 ah = ath12k_ag_to_ah(ag, i); 14349 if (!ah) 14350 continue; 14351 14352 ath12k_mac_hw_destroy(ah); 14353 ath12k_ag_set_ah(ag, i, NULL); 14354 } 14355 } 14356 14357 static void ath12k_mac_set_device_defaults(struct ath12k_base *ab) 14358 { 14359 int total_vdev; 14360 14361 /* Initialize channel counters frequency value in hertz */ 14362 ab->cc_freq_hz = 320000; 14363 total_vdev = ab->num_radios * TARGET_NUM_VDEVS(ab); 14364 ab->free_vdev_map = (1LL << total_vdev) - 1; 14365 } 14366 14367 int ath12k_mac_allocate(struct ath12k_hw_group *ag) 14368 { 14369 struct ath12k_pdev_map pdev_map[ATH12K_GROUP_MAX_RADIO]; 14370 int mac_id, device_id, total_radio, num_hw; 14371 struct ath12k_base *ab; 14372 struct ath12k_hw *ah; 14373 int ret, i, j; 14374 u8 radio_per_hw; 14375 14376 total_radio = 0; 14377 for (i = 0; i < ag->num_devices; i++) { 14378 ab = ag->ab[i]; 14379 if (!ab) 14380 continue; 14381 14382 ath12k_debugfs_pdev_create(ab); 14383 ath12k_mac_set_device_defaults(ab); 14384 total_radio += ab->num_radios; 14385 } 14386 14387 if (!total_radio) 14388 return -EINVAL; 14389 14390 if (WARN_ON(total_radio > ATH12K_GROUP_MAX_RADIO)) 14391 return -ENOSPC; 14392 14393 /* All pdev get combined and register as single wiphy based on 14394 * hardware group which participate in multi-link operation else 14395 * each pdev get register separately. 14396 */ 14397 if (ag->mlo_capable) 14398 radio_per_hw = total_radio; 14399 else 14400 radio_per_hw = 1; 14401 14402 num_hw = total_radio / radio_per_hw; 14403 14404 ag->num_hw = 0; 14405 device_id = 0; 14406 mac_id = 0; 14407 for (i = 0; i < num_hw; i++) { 14408 for (j = 0; j < radio_per_hw; j++) { 14409 if (device_id >= ag->num_devices || !ag->ab[device_id]) { 14410 ret = -ENOSPC; 14411 goto err; 14412 } 14413 14414 ab = ag->ab[device_id]; 14415 pdev_map[j].ab = ab; 14416 pdev_map[j].pdev_idx = mac_id; 14417 mac_id++; 14418 14419 /* If mac_id falls beyond the current device MACs then 14420 * move to next device 14421 */ 14422 if (mac_id >= ab->num_radios) { 14423 mac_id = 0; 14424 device_id++; 14425 } 14426 } 14427 14428 ab = pdev_map->ab; 14429 14430 ah = ath12k_mac_hw_allocate(ag, pdev_map, radio_per_hw); 14431 if (!ah) { 14432 ath12k_warn(ab, "failed to allocate mac80211 hw device for hw_idx %d\n", 14433 i); 14434 ret = -ENOMEM; 14435 goto err; 14436 } 14437 14438 ah->dev = ab->dev; 14439 14440 ag->ah[i] = ah; 14441 ag->num_hw++; 14442 } 14443 14444 return 0; 14445 14446 err: 14447 for (i = i - 1; i >= 0; i--) { 14448 ah = ath12k_ag_to_ah(ag, i); 14449 if (!ah) 14450 continue; 14451 14452 ath12k_mac_hw_destroy(ah); 14453 ath12k_ag_set_ah(ag, i, NULL); 14454 } 14455 14456 return ret; 14457 } 14458 14459 int ath12k_mac_vif_set_keepalive(struct ath12k_link_vif *arvif, 14460 enum wmi_sta_keepalive_method method, 14461 u32 interval) 14462 { 14463 struct wmi_sta_keepalive_arg arg = {}; 14464 struct ath12k *ar = arvif->ar; 14465 int ret; 14466 14467 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 14468 14469 if (arvif->ahvif->vdev_type != WMI_VDEV_TYPE_STA) 14470 return 0; 14471 14472 if (!test_bit(WMI_TLV_SERVICE_STA_KEEP_ALIVE, ar->ab->wmi_ab.svc_map)) 14473 return 0; 14474 14475 arg.vdev_id = arvif->vdev_id; 14476 arg.enabled = 1; 14477 arg.method = method; 14478 arg.interval = interval; 14479 14480 ret = ath12k_wmi_sta_keepalive(ar, &arg); 14481 if (ret) { 14482 ath12k_warn(ar->ab, "failed to set keepalive on vdev %i: %d\n", 14483 arvif->vdev_id, ret); 14484 return ret; 14485 } 14486 14487 return 0; 14488 } 14489