1 // SPDX-License-Identifier: BSD-3-Clause-Clear 2 /* 3 * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved. 4 * Copyright (c) 2021-2025 Qualcomm Innovation Center, Inc. All rights reserved. 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 static void ath12k_mac_handle_beacon_miss_iter(void *data, u8 *mac, 1826 struct ieee80211_vif *vif) 1827 { 1828 u32 *vdev_id = data; 1829 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 1830 struct ath12k_link_vif *arvif = &ahvif->deflink; 1831 struct ieee80211_hw *hw; 1832 1833 if (!arvif->is_created || arvif->vdev_id != *vdev_id) 1834 return; 1835 1836 if (!arvif->is_up) 1837 return; 1838 1839 ieee80211_beacon_loss(vif); 1840 hw = ath12k_ar_to_hw(arvif->ar); 1841 1842 /* Firmware doesn't report beacon loss events repeatedly. If AP probe 1843 * (done by mac80211) succeeds but beacons do not resume then it 1844 * doesn't make sense to continue operation. Queue connection loss work 1845 * which can be cancelled when beacon is received. 1846 */ 1847 ieee80211_queue_delayed_work(hw, &arvif->connection_loss_work, 1848 ATH12K_CONNECTION_LOSS_HZ); 1849 } 1850 1851 void ath12k_mac_handle_beacon_miss(struct ath12k *ar, u32 vdev_id) 1852 { 1853 ieee80211_iterate_active_interfaces_atomic(ath12k_ar_to_hw(ar), 1854 IEEE80211_IFACE_ITER_NORMAL, 1855 ath12k_mac_handle_beacon_miss_iter, 1856 &vdev_id); 1857 } 1858 1859 static void ath12k_mac_vif_sta_connection_loss_work(struct work_struct *work) 1860 { 1861 struct ath12k_link_vif *arvif = container_of(work, struct ath12k_link_vif, 1862 connection_loss_work.work); 1863 struct ieee80211_vif *vif = arvif->ahvif->vif; 1864 1865 if (!arvif->is_up) 1866 return; 1867 1868 ieee80211_connection_loss(vif); 1869 } 1870 1871 static void ath12k_peer_assoc_h_basic(struct ath12k *ar, 1872 struct ath12k_link_vif *arvif, 1873 struct ath12k_link_sta *arsta, 1874 struct ath12k_wmi_peer_assoc_arg *arg) 1875 { 1876 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 1877 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 1878 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar); 1879 struct ieee80211_bss_conf *bss_conf; 1880 u32 aid; 1881 1882 lockdep_assert_wiphy(hw->wiphy); 1883 1884 if (vif->type == NL80211_IFTYPE_STATION) 1885 aid = vif->cfg.aid; 1886 else 1887 aid = sta->aid; 1888 1889 ether_addr_copy(arg->peer_mac, arsta->addr); 1890 arg->vdev_id = arvif->vdev_id; 1891 arg->peer_associd = aid; 1892 arg->auth_flag = true; 1893 /* TODO: STA WAR in ath10k for listen interval required? */ 1894 arg->peer_listen_intval = hw->conf.listen_interval; 1895 arg->peer_nss = 1; 1896 1897 bss_conf = ath12k_mac_get_link_bss_conf(arvif); 1898 if (!bss_conf) { 1899 ath12k_warn(ar->ab, "unable to access bss link conf in peer assoc for vif %pM link %u\n", 1900 vif->addr, arvif->link_id); 1901 return; 1902 } 1903 1904 arg->peer_caps = bss_conf->assoc_capability; 1905 } 1906 1907 static void ath12k_peer_assoc_h_crypto(struct ath12k *ar, 1908 struct ath12k_link_vif *arvif, 1909 struct ath12k_link_sta *arsta, 1910 struct ath12k_wmi_peer_assoc_arg *arg) 1911 { 1912 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 1913 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 1914 struct ieee80211_bss_conf *info; 1915 struct cfg80211_chan_def def; 1916 struct cfg80211_bss *bss; 1917 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar); 1918 const u8 *rsnie = NULL; 1919 const u8 *wpaie = NULL; 1920 1921 lockdep_assert_wiphy(hw->wiphy); 1922 1923 info = ath12k_mac_get_link_bss_conf(arvif); 1924 if (!info) { 1925 ath12k_warn(ar->ab, "unable to access bss link conf for peer assoc crypto for vif %pM link %u\n", 1926 vif->addr, arvif->link_id); 1927 return; 1928 } 1929 1930 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) 1931 return; 1932 1933 bss = cfg80211_get_bss(hw->wiphy, def.chan, info->bssid, NULL, 0, 1934 IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY); 1935 1936 if (arvif->rsnie_present || arvif->wpaie_present) { 1937 arg->need_ptk_4_way = true; 1938 if (arvif->wpaie_present) 1939 arg->need_gtk_2_way = true; 1940 } else if (bss) { 1941 const struct cfg80211_bss_ies *ies; 1942 1943 rcu_read_lock(); 1944 rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN); 1945 1946 ies = rcu_dereference(bss->ies); 1947 1948 wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT, 1949 WLAN_OUI_TYPE_MICROSOFT_WPA, 1950 ies->data, 1951 ies->len); 1952 rcu_read_unlock(); 1953 cfg80211_put_bss(hw->wiphy, bss); 1954 } 1955 1956 /* FIXME: base on RSN IE/WPA IE is a correct idea? */ 1957 if (rsnie || wpaie) { 1958 ath12k_dbg(ar->ab, ATH12K_DBG_WMI, 1959 "%s: rsn ie found\n", __func__); 1960 arg->need_ptk_4_way = true; 1961 } 1962 1963 if (wpaie) { 1964 ath12k_dbg(ar->ab, ATH12K_DBG_WMI, 1965 "%s: wpa ie found\n", __func__); 1966 arg->need_gtk_2_way = true; 1967 } 1968 1969 if (sta->mfp) { 1970 /* TODO: Need to check if FW supports PMF? */ 1971 arg->is_pmf_enabled = true; 1972 } 1973 1974 /* TODO: safe_mode_enabled (bypass 4-way handshake) flag req? */ 1975 } 1976 1977 static void ath12k_peer_assoc_h_rates(struct ath12k *ar, 1978 struct ath12k_link_vif *arvif, 1979 struct ath12k_link_sta *arsta, 1980 struct ath12k_wmi_peer_assoc_arg *arg) 1981 { 1982 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 1983 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 1984 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates; 1985 struct ieee80211_link_sta *link_sta; 1986 struct cfg80211_chan_def def; 1987 const struct ieee80211_supported_band *sband; 1988 const struct ieee80211_rate *rates; 1989 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar); 1990 enum nl80211_band band; 1991 u32 ratemask; 1992 u8 rate; 1993 int i; 1994 1995 lockdep_assert_wiphy(hw->wiphy); 1996 1997 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) 1998 return; 1999 2000 link_sta = ath12k_mac_get_link_sta(arsta); 2001 if (!link_sta) { 2002 ath12k_warn(ar->ab, "unable to access link sta in peer assoc rates for sta %pM link %u\n", 2003 sta->addr, arsta->link_id); 2004 return; 2005 } 2006 2007 band = def.chan->band; 2008 sband = hw->wiphy->bands[band]; 2009 ratemask = link_sta->supp_rates[band]; 2010 ratemask &= arvif->bitrate_mask.control[band].legacy; 2011 rates = sband->bitrates; 2012 2013 rateset->num_rates = 0; 2014 2015 for (i = 0; i < 32; i++, ratemask >>= 1, rates++) { 2016 if (!(ratemask & 1)) 2017 continue; 2018 2019 rate = ath12k_mac_bitrate_to_rate(rates->bitrate); 2020 rateset->rates[rateset->num_rates] = rate; 2021 rateset->num_rates++; 2022 } 2023 } 2024 2025 static bool 2026 ath12k_peer_assoc_h_ht_masked(const u8 *ht_mcs_mask) 2027 { 2028 int nss; 2029 2030 for (nss = 0; nss < IEEE80211_HT_MCS_MASK_LEN; nss++) 2031 if (ht_mcs_mask[nss]) 2032 return false; 2033 2034 return true; 2035 } 2036 2037 static bool 2038 ath12k_peer_assoc_h_vht_masked(const u16 *vht_mcs_mask) 2039 { 2040 int nss; 2041 2042 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) 2043 if (vht_mcs_mask[nss]) 2044 return false; 2045 2046 return true; 2047 } 2048 2049 static void ath12k_peer_assoc_h_ht(struct ath12k *ar, 2050 struct ath12k_link_vif *arvif, 2051 struct ath12k_link_sta *arsta, 2052 struct ath12k_wmi_peer_assoc_arg *arg) 2053 { 2054 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 2055 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 2056 const struct ieee80211_sta_ht_cap *ht_cap; 2057 struct ieee80211_link_sta *link_sta; 2058 struct cfg80211_chan_def def; 2059 enum nl80211_band band; 2060 const u8 *ht_mcs_mask; 2061 int i, n; 2062 u8 max_nss; 2063 u32 stbc; 2064 2065 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 2066 2067 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) 2068 return; 2069 2070 link_sta = ath12k_mac_get_link_sta(arsta); 2071 if (!link_sta) { 2072 ath12k_warn(ar->ab, "unable to access link sta in peer assoc ht for sta %pM link %u\n", 2073 sta->addr, arsta->link_id); 2074 return; 2075 } 2076 2077 ht_cap = &link_sta->ht_cap; 2078 if (!ht_cap->ht_supported) 2079 return; 2080 2081 band = def.chan->band; 2082 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs; 2083 2084 if (ath12k_peer_assoc_h_ht_masked(ht_mcs_mask)) 2085 return; 2086 2087 arg->ht_flag = true; 2088 2089 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR + 2090 ht_cap->ampdu_factor)) - 1; 2091 2092 arg->peer_mpdu_density = 2093 ath12k_parse_mpdudensity(ht_cap->ampdu_density); 2094 2095 arg->peer_ht_caps = ht_cap->cap; 2096 arg->peer_rate_caps |= WMI_HOST_RC_HT_FLAG; 2097 2098 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING) 2099 arg->ldpc_flag = true; 2100 2101 if (link_sta->bandwidth >= IEEE80211_STA_RX_BW_40) { 2102 arg->bw_40 = true; 2103 arg->peer_rate_caps |= WMI_HOST_RC_CW40_FLAG; 2104 } 2105 2106 /* As firmware handles these two flags (IEEE80211_HT_CAP_SGI_20 2107 * and IEEE80211_HT_CAP_SGI_40) for enabling SGI, reset both 2108 * flags if guard interval is to force Long GI 2109 */ 2110 if (arvif->bitrate_mask.control[band].gi == NL80211_TXRATE_FORCE_LGI) { 2111 arg->peer_ht_caps &= ~(IEEE80211_HT_CAP_SGI_20 | IEEE80211_HT_CAP_SGI_40); 2112 } else { 2113 /* Enable SGI flag if either SGI_20 or SGI_40 is supported */ 2114 if (ht_cap->cap & (IEEE80211_HT_CAP_SGI_20 | IEEE80211_HT_CAP_SGI_40)) 2115 arg->peer_rate_caps |= WMI_HOST_RC_SGI_FLAG; 2116 } 2117 2118 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) { 2119 arg->peer_rate_caps |= WMI_HOST_RC_TX_STBC_FLAG; 2120 arg->stbc_flag = true; 2121 } 2122 2123 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) { 2124 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC; 2125 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT; 2126 stbc = stbc << WMI_HOST_RC_RX_STBC_FLAG_S; 2127 arg->peer_rate_caps |= stbc; 2128 arg->stbc_flag = true; 2129 } 2130 2131 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2]) 2132 arg->peer_rate_caps |= WMI_HOST_RC_TS_FLAG; 2133 else if (ht_cap->mcs.rx_mask[1]) 2134 arg->peer_rate_caps |= WMI_HOST_RC_DS_FLAG; 2135 2136 for (i = 0, n = 0, max_nss = 0; i < IEEE80211_HT_MCS_MASK_LEN * 8; i++) 2137 if ((ht_cap->mcs.rx_mask[i / 8] & BIT(i % 8)) && 2138 (ht_mcs_mask[i / 8] & BIT(i % 8))) { 2139 max_nss = (i / 8) + 1; 2140 arg->peer_ht_rates.rates[n++] = i; 2141 } 2142 2143 /* This is a workaround for HT-enabled STAs which break the spec 2144 * and have no HT capabilities RX mask (no HT RX MCS map). 2145 * 2146 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS), 2147 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs. 2148 * 2149 * Firmware asserts if such situation occurs. 2150 */ 2151 if (n == 0) { 2152 arg->peer_ht_rates.num_rates = 8; 2153 for (i = 0; i < arg->peer_ht_rates.num_rates; i++) 2154 arg->peer_ht_rates.rates[i] = i; 2155 } else { 2156 arg->peer_ht_rates.num_rates = n; 2157 arg->peer_nss = min(link_sta->rx_nss, max_nss); 2158 } 2159 2160 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n", 2161 arg->peer_mac, 2162 arg->peer_ht_rates.num_rates, 2163 arg->peer_nss); 2164 } 2165 2166 static int ath12k_mac_get_max_vht_mcs_map(u16 mcs_map, int nss) 2167 { 2168 switch ((mcs_map >> (2 * nss)) & 0x3) { 2169 case IEEE80211_VHT_MCS_SUPPORT_0_7: return BIT(8) - 1; 2170 case IEEE80211_VHT_MCS_SUPPORT_0_8: return BIT(9) - 1; 2171 case IEEE80211_VHT_MCS_SUPPORT_0_9: return BIT(10) - 1; 2172 } 2173 return 0; 2174 } 2175 2176 static u16 2177 ath12k_peer_assoc_h_vht_limit(u16 tx_mcs_set, 2178 const u16 vht_mcs_limit[NL80211_VHT_NSS_MAX]) 2179 { 2180 int idx_limit; 2181 int nss; 2182 u16 mcs_map; 2183 u16 mcs; 2184 2185 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) { 2186 mcs_map = ath12k_mac_get_max_vht_mcs_map(tx_mcs_set, nss) & 2187 vht_mcs_limit[nss]; 2188 2189 if (mcs_map) 2190 idx_limit = fls(mcs_map) - 1; 2191 else 2192 idx_limit = -1; 2193 2194 switch (idx_limit) { 2195 case 0: 2196 case 1: 2197 case 2: 2198 case 3: 2199 case 4: 2200 case 5: 2201 case 6: 2202 case 7: 2203 mcs = IEEE80211_VHT_MCS_SUPPORT_0_7; 2204 break; 2205 case 8: 2206 mcs = IEEE80211_VHT_MCS_SUPPORT_0_8; 2207 break; 2208 case 9: 2209 mcs = IEEE80211_VHT_MCS_SUPPORT_0_9; 2210 break; 2211 default: 2212 WARN_ON(1); 2213 fallthrough; 2214 case -1: 2215 mcs = IEEE80211_VHT_MCS_NOT_SUPPORTED; 2216 break; 2217 } 2218 2219 tx_mcs_set &= ~(0x3 << (nss * 2)); 2220 tx_mcs_set |= mcs << (nss * 2); 2221 } 2222 2223 return tx_mcs_set; 2224 } 2225 2226 static u8 ath12k_get_nss_160mhz(struct ath12k *ar, 2227 u8 max_nss) 2228 { 2229 u8 nss_ratio_info = ar->pdev->cap.nss_ratio_info; 2230 u8 max_sup_nss = 0; 2231 2232 switch (nss_ratio_info) { 2233 case WMI_NSS_RATIO_1BY2_NSS: 2234 max_sup_nss = max_nss >> 1; 2235 break; 2236 case WMI_NSS_RATIO_3BY4_NSS: 2237 ath12k_warn(ar->ab, "WMI_NSS_RATIO_3BY4_NSS not supported\n"); 2238 break; 2239 case WMI_NSS_RATIO_1_NSS: 2240 max_sup_nss = max_nss; 2241 break; 2242 case WMI_NSS_RATIO_2_NSS: 2243 ath12k_warn(ar->ab, "WMI_NSS_RATIO_2_NSS not supported\n"); 2244 break; 2245 default: 2246 ath12k_warn(ar->ab, "invalid nss ratio received from fw: %d\n", 2247 nss_ratio_info); 2248 break; 2249 } 2250 2251 return max_sup_nss; 2252 } 2253 2254 static void ath12k_peer_assoc_h_vht(struct ath12k *ar, 2255 struct ath12k_link_vif *arvif, 2256 struct ath12k_link_sta *arsta, 2257 struct ath12k_wmi_peer_assoc_arg *arg) 2258 { 2259 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 2260 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 2261 const struct ieee80211_sta_vht_cap *vht_cap; 2262 struct ieee80211_link_sta *link_sta; 2263 struct cfg80211_chan_def def; 2264 enum nl80211_band band; 2265 u16 *vht_mcs_mask; 2266 u16 tx_mcs_map; 2267 u8 ampdu_factor; 2268 u8 max_nss, vht_mcs; 2269 int i, vht_nss, nss_idx; 2270 bool user_rate_valid = true; 2271 u32 rx_nss, tx_nss, nss_160; 2272 2273 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 2274 2275 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) 2276 return; 2277 2278 link_sta = ath12k_mac_get_link_sta(arsta); 2279 if (!link_sta) { 2280 ath12k_warn(ar->ab, "unable to access link sta in peer assoc vht for sta %pM link %u\n", 2281 sta->addr, arsta->link_id); 2282 return; 2283 } 2284 2285 vht_cap = &link_sta->vht_cap; 2286 if (!vht_cap->vht_supported) 2287 return; 2288 2289 band = def.chan->band; 2290 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs; 2291 2292 if (ath12k_peer_assoc_h_vht_masked(vht_mcs_mask)) 2293 return; 2294 2295 arg->vht_flag = true; 2296 2297 /* TODO: similar flags required? */ 2298 arg->vht_capable = true; 2299 2300 if (def.chan->band == NL80211_BAND_2GHZ) 2301 arg->vht_ng_flag = true; 2302 2303 arg->peer_vht_caps = vht_cap->cap; 2304 2305 ampdu_factor = (vht_cap->cap & 2306 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >> 2307 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT; 2308 2309 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to 2310 * zero in VHT IE. Using it would result in degraded throughput. 2311 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep 2312 * it if VHT max_mpdu is smaller. 2313 */ 2314 arg->peer_max_mpdu = max(arg->peer_max_mpdu, 2315 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR + 2316 ampdu_factor)) - 1); 2317 2318 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80) 2319 arg->bw_80 = true; 2320 2321 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) 2322 arg->bw_160 = true; 2323 2324 vht_nss = ath12k_mac_max_vht_nss(vht_mcs_mask); 2325 2326 if (vht_nss > link_sta->rx_nss) { 2327 user_rate_valid = false; 2328 for (nss_idx = link_sta->rx_nss - 1; nss_idx >= 0; nss_idx--) { 2329 if (vht_mcs_mask[nss_idx]) { 2330 user_rate_valid = true; 2331 break; 2332 } 2333 } 2334 } 2335 2336 if (!user_rate_valid) { 2337 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 2338 "Setting vht range MCS value to peer supported nss:%d for peer %pM\n", 2339 link_sta->rx_nss, arsta->addr); 2340 vht_mcs_mask[link_sta->rx_nss - 1] = vht_mcs_mask[vht_nss - 1]; 2341 } 2342 2343 /* Calculate peer NSS capability from VHT capabilities if STA 2344 * supports VHT. 2345 */ 2346 for (i = 0, max_nss = 0, vht_mcs = 0; i < NL80211_VHT_NSS_MAX; i++) { 2347 vht_mcs = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map) >> 2348 (2 * i) & 3; 2349 2350 if (vht_mcs != IEEE80211_VHT_MCS_NOT_SUPPORTED && 2351 vht_mcs_mask[i]) 2352 max_nss = i + 1; 2353 } 2354 arg->peer_nss = min(link_sta->rx_nss, max_nss); 2355 arg->rx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.rx_highest); 2356 arg->rx_mcs_set = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map); 2357 arg->tx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.tx_highest); 2358 2359 tx_mcs_map = __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map); 2360 arg->tx_mcs_set = ath12k_peer_assoc_h_vht_limit(tx_mcs_map, vht_mcs_mask); 2361 2362 /* In QCN9274 platform, VHT MCS rate 10 and 11 is enabled by default. 2363 * VHT MCS rate 10 and 11 is not supported in 11ac standard. 2364 * so explicitly disable the VHT MCS rate 10 and 11 in 11ac mode. 2365 */ 2366 arg->tx_mcs_set &= ~IEEE80211_VHT_MCS_SUPPORT_0_11_MASK; 2367 arg->tx_mcs_set |= IEEE80211_DISABLE_VHT_MCS_SUPPORT_0_11; 2368 2369 if ((arg->tx_mcs_set & IEEE80211_VHT_MCS_NOT_SUPPORTED) == 2370 IEEE80211_VHT_MCS_NOT_SUPPORTED) 2371 arg->peer_vht_caps &= ~IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE; 2372 2373 /* TODO: Check */ 2374 arg->tx_max_mcs_nss = 0xFF; 2375 2376 if (arg->peer_phymode == MODE_11AC_VHT160) { 2377 tx_nss = ath12k_get_nss_160mhz(ar, max_nss); 2378 rx_nss = min(arg->peer_nss, tx_nss); 2379 arg->peer_bw_rxnss_override = ATH12K_BW_NSS_MAP_ENABLE; 2380 2381 if (!rx_nss) { 2382 ath12k_warn(ar->ab, "invalid max_nss\n"); 2383 return; 2384 } 2385 2386 nss_160 = u32_encode_bits(rx_nss - 1, ATH12K_PEER_RX_NSS_160MHZ); 2387 arg->peer_bw_rxnss_override |= nss_160; 2388 } 2389 2390 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 2391 "mac vht peer %pM max_mpdu %d flags 0x%x nss_override 0x%x\n", 2392 arsta->addr, arg->peer_max_mpdu, arg->peer_flags, 2393 arg->peer_bw_rxnss_override); 2394 } 2395 2396 static int ath12k_mac_get_max_he_mcs_map(u16 mcs_map, int nss) 2397 { 2398 switch ((mcs_map >> (2 * nss)) & 0x3) { 2399 case IEEE80211_HE_MCS_SUPPORT_0_7: return BIT(8) - 1; 2400 case IEEE80211_HE_MCS_SUPPORT_0_9: return BIT(10) - 1; 2401 case IEEE80211_HE_MCS_SUPPORT_0_11: return BIT(12) - 1; 2402 } 2403 return 0; 2404 } 2405 2406 static u16 ath12k_peer_assoc_h_he_limit(u16 tx_mcs_set, 2407 const u16 *he_mcs_limit) 2408 { 2409 int idx_limit; 2410 int nss; 2411 u16 mcs_map; 2412 u16 mcs; 2413 2414 for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++) { 2415 mcs_map = ath12k_mac_get_max_he_mcs_map(tx_mcs_set, nss) & 2416 he_mcs_limit[nss]; 2417 2418 if (mcs_map) 2419 idx_limit = fls(mcs_map) - 1; 2420 else 2421 idx_limit = -1; 2422 2423 switch (idx_limit) { 2424 case 0 ... 7: 2425 mcs = IEEE80211_HE_MCS_SUPPORT_0_7; 2426 break; 2427 case 8: 2428 case 9: 2429 mcs = IEEE80211_HE_MCS_SUPPORT_0_9; 2430 break; 2431 case 10: 2432 case 11: 2433 mcs = IEEE80211_HE_MCS_SUPPORT_0_11; 2434 break; 2435 default: 2436 WARN_ON(1); 2437 fallthrough; 2438 case -1: 2439 mcs = IEEE80211_HE_MCS_NOT_SUPPORTED; 2440 break; 2441 } 2442 2443 tx_mcs_set &= ~(0x3 << (nss * 2)); 2444 tx_mcs_set |= mcs << (nss * 2); 2445 } 2446 2447 return tx_mcs_set; 2448 } 2449 2450 static bool 2451 ath12k_peer_assoc_h_he_masked(const u16 he_mcs_mask[NL80211_HE_NSS_MAX]) 2452 { 2453 int nss; 2454 2455 for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++) 2456 if (he_mcs_mask[nss]) 2457 return false; 2458 2459 return true; 2460 } 2461 2462 static void ath12k_peer_assoc_h_he(struct ath12k *ar, 2463 struct ath12k_link_vif *arvif, 2464 struct ath12k_link_sta *arsta, 2465 struct ath12k_wmi_peer_assoc_arg *arg) 2466 { 2467 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 2468 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 2469 const struct ieee80211_sta_he_cap *he_cap; 2470 struct ieee80211_bss_conf *link_conf; 2471 struct ieee80211_link_sta *link_sta; 2472 struct cfg80211_chan_def def; 2473 int i; 2474 u8 ampdu_factor, max_nss; 2475 u8 rx_mcs_80 = IEEE80211_HE_MCS_NOT_SUPPORTED; 2476 u8 rx_mcs_160 = IEEE80211_HE_MCS_NOT_SUPPORTED; 2477 u16 mcs_160_map, mcs_80_map; 2478 u8 link_id = arvif->link_id; 2479 bool support_160; 2480 enum nl80211_band band; 2481 u16 *he_mcs_mask; 2482 u8 he_mcs; 2483 u16 he_tx_mcs = 0, v = 0; 2484 int he_nss, nss_idx; 2485 bool user_rate_valid = true; 2486 u32 rx_nss, tx_nss, nss_160; 2487 2488 if (WARN_ON(ath12k_mac_vif_link_chan(vif, link_id, &def))) 2489 return; 2490 2491 link_conf = ath12k_mac_get_link_bss_conf(arvif); 2492 if (!link_conf) { 2493 ath12k_warn(ar->ab, "unable to access bss link conf in peer assoc he for vif %pM link %u", 2494 vif->addr, link_id); 2495 return; 2496 } 2497 2498 link_sta = ath12k_mac_get_link_sta(arsta); 2499 if (!link_sta) { 2500 ath12k_warn(ar->ab, "unable to access link sta in peer assoc he for sta %pM link %u\n", 2501 sta->addr, arsta->link_id); 2502 return; 2503 } 2504 2505 he_cap = &link_sta->he_cap; 2506 if (!he_cap->has_he) 2507 return; 2508 2509 band = def.chan->band; 2510 he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs; 2511 2512 if (ath12k_peer_assoc_h_he_masked(he_mcs_mask)) 2513 return; 2514 2515 arg->he_flag = true; 2516 2517 support_160 = !!(he_cap->he_cap_elem.phy_cap_info[0] & 2518 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G); 2519 2520 /* Supported HE-MCS and NSS Set of peer he_cap is intersection with self he_cp */ 2521 mcs_160_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160); 2522 mcs_80_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80); 2523 2524 if (support_160) { 2525 for (i = 7; i >= 0; i--) { 2526 u8 mcs_160 = (mcs_160_map >> (2 * i)) & 3; 2527 2528 if (mcs_160 != IEEE80211_HE_MCS_NOT_SUPPORTED) { 2529 rx_mcs_160 = i + 1; 2530 break; 2531 } 2532 } 2533 } 2534 2535 for (i = 7; i >= 0; i--) { 2536 u8 mcs_80 = (mcs_80_map >> (2 * i)) & 3; 2537 2538 if (mcs_80 != IEEE80211_HE_MCS_NOT_SUPPORTED) { 2539 rx_mcs_80 = i + 1; 2540 break; 2541 } 2542 } 2543 2544 if (support_160) 2545 max_nss = min(rx_mcs_80, rx_mcs_160); 2546 else 2547 max_nss = rx_mcs_80; 2548 2549 arg->peer_nss = min(link_sta->rx_nss, max_nss); 2550 2551 memcpy(&arg->peer_he_cap_macinfo, he_cap->he_cap_elem.mac_cap_info, 2552 sizeof(he_cap->he_cap_elem.mac_cap_info)); 2553 memcpy(&arg->peer_he_cap_phyinfo, he_cap->he_cap_elem.phy_cap_info, 2554 sizeof(he_cap->he_cap_elem.phy_cap_info)); 2555 arg->peer_he_ops = link_conf->he_oper.params; 2556 2557 /* the top most byte is used to indicate BSS color info */ 2558 arg->peer_he_ops &= 0xffffff; 2559 2560 /* As per section 26.6.1 IEEE Std 802.11ax‐2022, if the Max AMPDU 2561 * Exponent Extension in HE cap is zero, use the arg->peer_max_mpdu 2562 * as calculated while parsing VHT caps(if VHT caps is present) 2563 * or HT caps (if VHT caps is not present). 2564 * 2565 * For non-zero value of Max AMPDU Exponent Extension in HE MAC caps, 2566 * if a HE STA sends VHT cap and HE cap IE in assoc request then, use 2567 * MAX_AMPDU_LEN_FACTOR as 20 to calculate max_ampdu length. 2568 * If a HE STA that does not send VHT cap, but HE and HT cap in assoc 2569 * request, then use MAX_AMPDU_LEN_FACTOR as 16 to calculate max_ampdu 2570 * length. 2571 */ 2572 ampdu_factor = u8_get_bits(he_cap->he_cap_elem.mac_cap_info[3], 2573 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK); 2574 2575 if (ampdu_factor) { 2576 if (link_sta->vht_cap.vht_supported) 2577 arg->peer_max_mpdu = (1 << (IEEE80211_HE_VHT_MAX_AMPDU_FACTOR + 2578 ampdu_factor)) - 1; 2579 else if (link_sta->ht_cap.ht_supported) 2580 arg->peer_max_mpdu = (1 << (IEEE80211_HE_HT_MAX_AMPDU_FACTOR + 2581 ampdu_factor)) - 1; 2582 } 2583 2584 if (he_cap->he_cap_elem.phy_cap_info[6] & 2585 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) { 2586 int bit = 7; 2587 int nss, ru; 2588 2589 arg->peer_ppet.numss_m1 = he_cap->ppe_thres[0] & 2590 IEEE80211_PPE_THRES_NSS_MASK; 2591 arg->peer_ppet.ru_bit_mask = 2592 (he_cap->ppe_thres[0] & 2593 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK) >> 2594 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS; 2595 2596 for (nss = 0; nss <= arg->peer_ppet.numss_m1; nss++) { 2597 for (ru = 0; ru < 4; ru++) { 2598 u32 val = 0; 2599 int i; 2600 2601 if ((arg->peer_ppet.ru_bit_mask & BIT(ru)) == 0) 2602 continue; 2603 for (i = 0; i < 6; i++) { 2604 val >>= 1; 2605 val |= ((he_cap->ppe_thres[bit / 8] >> 2606 (bit % 8)) & 0x1) << 5; 2607 bit++; 2608 } 2609 arg->peer_ppet.ppet16_ppet8_ru3_ru0[nss] |= 2610 val << (ru * 6); 2611 } 2612 } 2613 } 2614 2615 if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_RES) 2616 arg->twt_responder = true; 2617 if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_REQ) 2618 arg->twt_requester = true; 2619 2620 he_nss = ath12k_mac_max_he_nss(he_mcs_mask); 2621 2622 if (he_nss > link_sta->rx_nss) { 2623 user_rate_valid = false; 2624 for (nss_idx = link_sta->rx_nss - 1; nss_idx >= 0; nss_idx--) { 2625 if (he_mcs_mask[nss_idx]) { 2626 user_rate_valid = true; 2627 break; 2628 } 2629 } 2630 } 2631 2632 if (!user_rate_valid) { 2633 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 2634 "Setting he range MCS value to peer supported nss:%d for peer %pM\n", 2635 link_sta->rx_nss, arsta->addr); 2636 he_mcs_mask[link_sta->rx_nss - 1] = he_mcs_mask[he_nss - 1]; 2637 } 2638 2639 switch (link_sta->bandwidth) { 2640 case IEEE80211_STA_RX_BW_160: 2641 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160); 2642 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v; 2643 2644 v = ath12k_peer_assoc_h_he_limit(v, he_mcs_mask); 2645 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v; 2646 2647 arg->peer_he_mcs_count++; 2648 if (!he_tx_mcs) 2649 he_tx_mcs = v; 2650 fallthrough; 2651 2652 default: 2653 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80); 2654 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v; 2655 2656 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80); 2657 v = ath12k_peer_assoc_h_he_limit(v, he_mcs_mask); 2658 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v; 2659 2660 arg->peer_he_mcs_count++; 2661 if (!he_tx_mcs) 2662 he_tx_mcs = v; 2663 break; 2664 } 2665 2666 /* Calculate peer NSS capability from HE capabilities if STA 2667 * supports HE. 2668 */ 2669 for (i = 0, max_nss = 0, he_mcs = 0; i < NL80211_HE_NSS_MAX; i++) { 2670 he_mcs = he_tx_mcs >> (2 * i) & 3; 2671 2672 /* In case of fixed rates, MCS Range in he_tx_mcs might have 2673 * unsupported range, with he_mcs_mask set, so check either of them 2674 * to find nss. 2675 */ 2676 if (he_mcs != IEEE80211_HE_MCS_NOT_SUPPORTED || 2677 he_mcs_mask[i]) 2678 max_nss = i + 1; 2679 } 2680 2681 max_nss = min(max_nss, ar->num_tx_chains); 2682 arg->peer_nss = min(link_sta->rx_nss, max_nss); 2683 2684 if (arg->peer_phymode == MODE_11AX_HE160) { 2685 tx_nss = ath12k_get_nss_160mhz(ar, ar->num_tx_chains); 2686 rx_nss = min(arg->peer_nss, tx_nss); 2687 2688 arg->peer_nss = min(link_sta->rx_nss, ar->num_rx_chains); 2689 arg->peer_bw_rxnss_override = ATH12K_BW_NSS_MAP_ENABLE; 2690 2691 if (!rx_nss) { 2692 ath12k_warn(ar->ab, "invalid max_nss\n"); 2693 return; 2694 } 2695 2696 nss_160 = u32_encode_bits(rx_nss - 1, ATH12K_PEER_RX_NSS_160MHZ); 2697 arg->peer_bw_rxnss_override |= nss_160; 2698 } 2699 2700 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 2701 "mac he peer %pM nss %d mcs cnt %d nss_override 0x%x\n", 2702 arsta->addr, arg->peer_nss, 2703 arg->peer_he_mcs_count, 2704 arg->peer_bw_rxnss_override); 2705 } 2706 2707 static void ath12k_peer_assoc_h_he_6ghz(struct ath12k *ar, 2708 struct ath12k_link_vif *arvif, 2709 struct ath12k_link_sta *arsta, 2710 struct ath12k_wmi_peer_assoc_arg *arg) 2711 { 2712 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 2713 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 2714 const struct ieee80211_sta_he_cap *he_cap; 2715 struct ieee80211_link_sta *link_sta; 2716 struct cfg80211_chan_def def; 2717 enum nl80211_band band; 2718 u8 ampdu_factor, mpdu_density; 2719 2720 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) 2721 return; 2722 2723 band = def.chan->band; 2724 2725 link_sta = ath12k_mac_get_link_sta(arsta); 2726 if (!link_sta) { 2727 ath12k_warn(ar->ab, "unable to access link sta in peer assoc he 6ghz for sta %pM link %u\n", 2728 sta->addr, arsta->link_id); 2729 return; 2730 } 2731 2732 he_cap = &link_sta->he_cap; 2733 2734 if (!arg->he_flag || band != NL80211_BAND_6GHZ || !link_sta->he_6ghz_capa.capa) 2735 return; 2736 2737 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) 2738 arg->bw_40 = true; 2739 2740 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80) 2741 arg->bw_80 = true; 2742 2743 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) 2744 arg->bw_160 = true; 2745 2746 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_320) 2747 arg->bw_320 = true; 2748 2749 arg->peer_he_caps_6ghz = le16_to_cpu(link_sta->he_6ghz_capa.capa); 2750 2751 mpdu_density = u32_get_bits(arg->peer_he_caps_6ghz, 2752 IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START); 2753 arg->peer_mpdu_density = ath12k_parse_mpdudensity(mpdu_density); 2754 2755 /* From IEEE Std 802.11ax-2021 - Section 10.12.2: An HE STA shall be capable of 2756 * receiving A-MPDU where the A-MPDU pre-EOF padding length is up to the value 2757 * indicated by the Maximum A-MPDU Length Exponent Extension field in the HE 2758 * Capabilities element and the Maximum A-MPDU Length Exponent field in HE 6 GHz 2759 * Band Capabilities element in the 6 GHz band. 2760 * 2761 * Here, we are extracting the Max A-MPDU Exponent Extension from HE caps and 2762 * factor is the Maximum A-MPDU Length Exponent from HE 6 GHZ Band capability. 2763 */ 2764 ampdu_factor = u8_get_bits(he_cap->he_cap_elem.mac_cap_info[3], 2765 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK) + 2766 u32_get_bits(arg->peer_he_caps_6ghz, 2767 IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP); 2768 2769 arg->peer_max_mpdu = (1u << (IEEE80211_HE_6GHZ_MAX_AMPDU_FACTOR + 2770 ampdu_factor)) - 1; 2771 } 2772 2773 static int ath12k_get_smps_from_capa(const struct ieee80211_sta_ht_cap *ht_cap, 2774 const struct ieee80211_he_6ghz_capa *he_6ghz_capa, 2775 int *smps) 2776 { 2777 if (ht_cap->ht_supported) 2778 *smps = u16_get_bits(ht_cap->cap, IEEE80211_HT_CAP_SM_PS); 2779 else 2780 *smps = le16_get_bits(he_6ghz_capa->capa, 2781 IEEE80211_HE_6GHZ_CAP_SM_PS); 2782 2783 if (*smps >= ARRAY_SIZE(ath12k_smps_map)) 2784 return -EINVAL; 2785 2786 return 0; 2787 } 2788 2789 static void ath12k_peer_assoc_h_smps(struct ath12k_link_sta *arsta, 2790 struct ath12k_wmi_peer_assoc_arg *arg) 2791 { 2792 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 2793 const struct ieee80211_he_6ghz_capa *he_6ghz_capa; 2794 struct ath12k_link_vif *arvif = arsta->arvif; 2795 const struct ieee80211_sta_ht_cap *ht_cap; 2796 struct ieee80211_link_sta *link_sta; 2797 struct ath12k *ar = arvif->ar; 2798 int smps; 2799 2800 link_sta = ath12k_mac_get_link_sta(arsta); 2801 if (!link_sta) { 2802 ath12k_warn(ar->ab, "unable to access link sta in peer assoc he for sta %pM link %u\n", 2803 sta->addr, arsta->link_id); 2804 return; 2805 } 2806 2807 he_6ghz_capa = &link_sta->he_6ghz_capa; 2808 ht_cap = &link_sta->ht_cap; 2809 2810 if (!ht_cap->ht_supported && !he_6ghz_capa->capa) 2811 return; 2812 2813 if (ath12k_get_smps_from_capa(ht_cap, he_6ghz_capa, &smps)) 2814 return; 2815 2816 switch (smps) { 2817 case WLAN_HT_CAP_SM_PS_STATIC: 2818 arg->static_mimops_flag = true; 2819 break; 2820 case WLAN_HT_CAP_SM_PS_DYNAMIC: 2821 arg->dynamic_mimops_flag = true; 2822 break; 2823 case WLAN_HT_CAP_SM_PS_DISABLED: 2824 arg->spatial_mux_flag = true; 2825 break; 2826 default: 2827 break; 2828 } 2829 } 2830 2831 static void ath12k_peer_assoc_h_qos(struct ath12k *ar, 2832 struct ath12k_link_vif *arvif, 2833 struct ath12k_link_sta *arsta, 2834 struct ath12k_wmi_peer_assoc_arg *arg) 2835 { 2836 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 2837 2838 switch (arvif->ahvif->vdev_type) { 2839 case WMI_VDEV_TYPE_AP: 2840 if (sta->wme) { 2841 /* TODO: Check WME vs QoS */ 2842 arg->is_wme_set = true; 2843 arg->qos_flag = true; 2844 } 2845 2846 if (sta->wme && sta->uapsd_queues) { 2847 /* TODO: Check WME vs QoS */ 2848 arg->is_wme_set = true; 2849 arg->apsd_flag = true; 2850 arg->peer_rate_caps |= WMI_HOST_RC_UAPSD_FLAG; 2851 } 2852 break; 2853 case WMI_VDEV_TYPE_STA: 2854 if (sta->wme) { 2855 arg->is_wme_set = true; 2856 arg->qos_flag = true; 2857 } 2858 break; 2859 default: 2860 break; 2861 } 2862 2863 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac peer %pM qos %d\n", 2864 arsta->addr, arg->qos_flag); 2865 } 2866 2867 static int ath12k_peer_assoc_qos_ap(struct ath12k *ar, 2868 struct ath12k_link_vif *arvif, 2869 struct ath12k_link_sta *arsta) 2870 { 2871 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 2872 struct ath12k_wmi_ap_ps_arg arg; 2873 u32 max_sp; 2874 u32 uapsd; 2875 int ret; 2876 2877 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 2878 2879 arg.vdev_id = arvif->vdev_id; 2880 2881 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n", 2882 sta->uapsd_queues, sta->max_sp); 2883 2884 uapsd = 0; 2885 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO) 2886 uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN | 2887 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN; 2888 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI) 2889 uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN | 2890 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN; 2891 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK) 2892 uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN | 2893 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN; 2894 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE) 2895 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN | 2896 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN; 2897 2898 max_sp = 0; 2899 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP) 2900 max_sp = sta->max_sp; 2901 2902 arg.param = WMI_AP_PS_PEER_PARAM_UAPSD; 2903 arg.value = uapsd; 2904 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg); 2905 if (ret) 2906 goto err; 2907 2908 arg.param = WMI_AP_PS_PEER_PARAM_MAX_SP; 2909 arg.value = max_sp; 2910 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg); 2911 if (ret) 2912 goto err; 2913 2914 /* TODO: revisit during testing */ 2915 arg.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_FRMTYPE; 2916 arg.value = DISABLE_SIFS_RESPONSE_TRIGGER; 2917 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg); 2918 if (ret) 2919 goto err; 2920 2921 arg.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_UAPSD; 2922 arg.value = DISABLE_SIFS_RESPONSE_TRIGGER; 2923 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg); 2924 if (ret) 2925 goto err; 2926 2927 return 0; 2928 2929 err: 2930 ath12k_warn(ar->ab, "failed to set ap ps peer param %d for vdev %i: %d\n", 2931 arg.param, arvif->vdev_id, ret); 2932 return ret; 2933 } 2934 2935 static bool ath12k_mac_sta_has_ofdm_only(struct ieee80211_link_sta *sta) 2936 { 2937 return sta->supp_rates[NL80211_BAND_2GHZ] >> 2938 ATH12K_MAC_FIRST_OFDM_RATE_IDX; 2939 } 2940 2941 static enum wmi_phy_mode ath12k_mac_get_phymode_vht(struct ath12k *ar, 2942 struct ieee80211_link_sta *link_sta) 2943 { 2944 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) { 2945 if (link_sta->vht_cap.cap & (IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ | 2946 IEEE80211_VHT_CAP_EXT_NSS_BW_MASK)) 2947 return MODE_11AC_VHT160; 2948 2949 /* Allow STA to connect even if it does not explicitly advertise 160 MHz 2950 * support 2951 */ 2952 return MODE_11AC_VHT160; 2953 } 2954 2955 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80) 2956 return MODE_11AC_VHT80; 2957 2958 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) 2959 return MODE_11AC_VHT40; 2960 2961 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_20) 2962 return MODE_11AC_VHT20; 2963 2964 return MODE_UNKNOWN; 2965 } 2966 2967 static enum wmi_phy_mode ath12k_mac_get_phymode_he(struct ath12k *ar, 2968 struct ieee80211_link_sta *link_sta) 2969 { 2970 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) { 2971 if (link_sta->he_cap.he_cap_elem.phy_cap_info[0] & 2972 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G) 2973 return MODE_11AX_HE160; 2974 2975 return MODE_UNKNOWN; 2976 } 2977 2978 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80) 2979 return MODE_11AX_HE80; 2980 2981 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) 2982 return MODE_11AX_HE40; 2983 2984 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_20) 2985 return MODE_11AX_HE20; 2986 2987 return MODE_UNKNOWN; 2988 } 2989 2990 static enum wmi_phy_mode ath12k_mac_get_phymode_eht(struct ath12k *ar, 2991 struct ieee80211_link_sta *link_sta) 2992 { 2993 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_320) 2994 if (link_sta->eht_cap.eht_cap_elem.phy_cap_info[0] & 2995 IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ) 2996 return MODE_11BE_EHT320; 2997 2998 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) { 2999 if (link_sta->he_cap.he_cap_elem.phy_cap_info[0] & 3000 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G) 3001 return MODE_11BE_EHT160; 3002 3003 ath12k_warn(ar->ab, "invalid EHT PHY capability info for 160 Mhz: %d\n", 3004 link_sta->he_cap.he_cap_elem.phy_cap_info[0]); 3005 3006 return MODE_UNKNOWN; 3007 } 3008 3009 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80) 3010 return MODE_11BE_EHT80; 3011 3012 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) 3013 return MODE_11BE_EHT40; 3014 3015 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_20) 3016 return MODE_11BE_EHT20; 3017 3018 return MODE_UNKNOWN; 3019 } 3020 3021 static void ath12k_peer_assoc_h_phymode(struct ath12k *ar, 3022 struct ath12k_link_vif *arvif, 3023 struct ath12k_link_sta *arsta, 3024 struct ath12k_wmi_peer_assoc_arg *arg) 3025 { 3026 struct ieee80211_link_sta *link_sta; 3027 struct cfg80211_chan_def def; 3028 enum nl80211_band band; 3029 const u8 *ht_mcs_mask; 3030 const u16 *vht_mcs_mask; 3031 const u16 *he_mcs_mask; 3032 enum wmi_phy_mode phymode = MODE_UNKNOWN; 3033 3034 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 3035 3036 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 3037 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 3038 3039 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) 3040 return; 3041 3042 band = def.chan->band; 3043 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs; 3044 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs; 3045 he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs; 3046 3047 link_sta = ath12k_mac_get_link_sta(arsta); 3048 if (!link_sta) { 3049 ath12k_warn(ar->ab, "unable to access link sta in peer assoc he for sta %pM link %u\n", 3050 sta->addr, arsta->link_id); 3051 return; 3052 } 3053 3054 switch (band) { 3055 case NL80211_BAND_2GHZ: 3056 if (link_sta->eht_cap.has_eht) { 3057 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) 3058 phymode = MODE_11BE_EHT40_2G; 3059 else 3060 phymode = MODE_11BE_EHT20_2G; 3061 } else if (link_sta->he_cap.has_he && 3062 !ath12k_peer_assoc_h_he_masked(he_mcs_mask)) { 3063 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80) 3064 phymode = MODE_11AX_HE80_2G; 3065 else if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) 3066 phymode = MODE_11AX_HE40_2G; 3067 else 3068 phymode = MODE_11AX_HE20_2G; 3069 } else if (link_sta->vht_cap.vht_supported && 3070 !ath12k_peer_assoc_h_vht_masked(vht_mcs_mask)) { 3071 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) 3072 phymode = MODE_11AC_VHT40; 3073 else 3074 phymode = MODE_11AC_VHT20; 3075 } else if (link_sta->ht_cap.ht_supported && 3076 !ath12k_peer_assoc_h_ht_masked(ht_mcs_mask)) { 3077 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) 3078 phymode = MODE_11NG_HT40; 3079 else 3080 phymode = MODE_11NG_HT20; 3081 } else if (ath12k_mac_sta_has_ofdm_only(link_sta)) { 3082 phymode = MODE_11G; 3083 } else { 3084 phymode = MODE_11B; 3085 } 3086 break; 3087 case NL80211_BAND_5GHZ: 3088 case NL80211_BAND_6GHZ: 3089 /* Check EHT first */ 3090 if (link_sta->eht_cap.has_eht) { 3091 phymode = ath12k_mac_get_phymode_eht(ar, link_sta); 3092 } else if (link_sta->he_cap.has_he && 3093 !ath12k_peer_assoc_h_he_masked(he_mcs_mask)) { 3094 phymode = ath12k_mac_get_phymode_he(ar, link_sta); 3095 } else if (link_sta->vht_cap.vht_supported && 3096 !ath12k_peer_assoc_h_vht_masked(vht_mcs_mask)) { 3097 phymode = ath12k_mac_get_phymode_vht(ar, link_sta); 3098 } else if (link_sta->ht_cap.ht_supported && 3099 !ath12k_peer_assoc_h_ht_masked(ht_mcs_mask)) { 3100 if (link_sta->bandwidth >= IEEE80211_STA_RX_BW_40) 3101 phymode = MODE_11NA_HT40; 3102 else 3103 phymode = MODE_11NA_HT20; 3104 } else { 3105 phymode = MODE_11A; 3106 } 3107 break; 3108 default: 3109 break; 3110 } 3111 3112 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac peer %pM phymode %s\n", 3113 arsta->addr, ath12k_mac_phymode_str(phymode)); 3114 3115 arg->peer_phymode = phymode; 3116 WARN_ON(phymode == MODE_UNKNOWN); 3117 } 3118 3119 static void ath12k_mac_set_eht_mcs(u8 rx_tx_mcs7, u8 rx_tx_mcs9, 3120 u8 rx_tx_mcs11, u8 rx_tx_mcs13, 3121 u32 *rx_mcs, u32 *tx_mcs) 3122 { 3123 *rx_mcs = 0; 3124 u32p_replace_bits(rx_mcs, 3125 u8_get_bits(rx_tx_mcs7, IEEE80211_EHT_MCS_NSS_RX), 3126 WMI_EHT_MCS_NSS_0_7); 3127 u32p_replace_bits(rx_mcs, 3128 u8_get_bits(rx_tx_mcs9, IEEE80211_EHT_MCS_NSS_RX), 3129 WMI_EHT_MCS_NSS_8_9); 3130 u32p_replace_bits(rx_mcs, 3131 u8_get_bits(rx_tx_mcs11, IEEE80211_EHT_MCS_NSS_RX), 3132 WMI_EHT_MCS_NSS_10_11); 3133 u32p_replace_bits(rx_mcs, 3134 u8_get_bits(rx_tx_mcs13, IEEE80211_EHT_MCS_NSS_RX), 3135 WMI_EHT_MCS_NSS_12_13); 3136 3137 *tx_mcs = 0; 3138 u32p_replace_bits(tx_mcs, 3139 u8_get_bits(rx_tx_mcs7, IEEE80211_EHT_MCS_NSS_TX), 3140 WMI_EHT_MCS_NSS_0_7); 3141 u32p_replace_bits(tx_mcs, 3142 u8_get_bits(rx_tx_mcs9, IEEE80211_EHT_MCS_NSS_TX), 3143 WMI_EHT_MCS_NSS_8_9); 3144 u32p_replace_bits(tx_mcs, 3145 u8_get_bits(rx_tx_mcs11, IEEE80211_EHT_MCS_NSS_TX), 3146 WMI_EHT_MCS_NSS_10_11); 3147 u32p_replace_bits(tx_mcs, 3148 u8_get_bits(rx_tx_mcs13, IEEE80211_EHT_MCS_NSS_TX), 3149 WMI_EHT_MCS_NSS_12_13); 3150 } 3151 3152 static void ath12k_mac_set_eht_ppe_threshold(const u8 *ppe_thres, 3153 struct ath12k_wmi_ppe_threshold_arg *ppet) 3154 { 3155 u32 bit_pos = IEEE80211_EHT_PPE_THRES_INFO_HEADER_SIZE, val; 3156 u8 nss, ru, i; 3157 u8 ppet_bit_len_per_ru = IEEE80211_EHT_PPE_THRES_INFO_PPET_SIZE * 2; 3158 3159 ppet->numss_m1 = u8_get_bits(ppe_thres[0], IEEE80211_EHT_PPE_THRES_NSS_MASK); 3160 ppet->ru_bit_mask = u16_get_bits(get_unaligned_le16(ppe_thres), 3161 IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK); 3162 3163 for (nss = 0; nss <= ppet->numss_m1; nss++) { 3164 for (ru = 0; 3165 ru < hweight16(IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK); 3166 ru++) { 3167 if ((ppet->ru_bit_mask & BIT(ru)) == 0) 3168 continue; 3169 3170 val = 0; 3171 for (i = 0; i < ppet_bit_len_per_ru; i++) { 3172 val |= (((ppe_thres[bit_pos / 8] >> 3173 (bit_pos % 8)) & 0x1) << i); 3174 bit_pos++; 3175 } 3176 ppet->ppet16_ppet8_ru3_ru0[nss] |= 3177 (val << (ru * ppet_bit_len_per_ru)); 3178 } 3179 } 3180 } 3181 3182 static void ath12k_peer_assoc_h_eht(struct ath12k *ar, 3183 struct ath12k_link_vif *arvif, 3184 struct ath12k_link_sta *arsta, 3185 struct ath12k_wmi_peer_assoc_arg *arg) 3186 { 3187 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 3188 const struct ieee80211_eht_mcs_nss_supp_20mhz_only *bw_20; 3189 const struct ieee80211_eht_mcs_nss_supp_bw *bw; 3190 const struct ieee80211_sta_eht_cap *eht_cap; 3191 const struct ieee80211_sta_he_cap *he_cap; 3192 struct ieee80211_link_sta *link_sta; 3193 struct ieee80211_bss_conf *link_conf; 3194 u32 *rx_mcs, *tx_mcs; 3195 3196 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 3197 3198 link_sta = ath12k_mac_get_link_sta(arsta); 3199 if (!link_sta) { 3200 ath12k_warn(ar->ab, "unable to access link sta in peer assoc eht for sta %pM link %u\n", 3201 sta->addr, arsta->link_id); 3202 return; 3203 } 3204 3205 link_conf = ath12k_mac_get_link_bss_conf(arvif); 3206 if (!link_conf) { 3207 ath12k_warn(ar->ab, "unable to access link_conf in peer assoc eht set\n"); 3208 return; 3209 } 3210 3211 eht_cap = &link_sta->eht_cap; 3212 he_cap = &link_sta->he_cap; 3213 if (!he_cap->has_he || !eht_cap->has_eht) 3214 return; 3215 3216 arg->eht_flag = true; 3217 3218 if ((eht_cap->eht_cap_elem.phy_cap_info[5] & 3219 IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT) && 3220 eht_cap->eht_ppe_thres[0] != 0) 3221 ath12k_mac_set_eht_ppe_threshold(eht_cap->eht_ppe_thres, 3222 &arg->peer_eht_ppet); 3223 3224 memcpy(arg->peer_eht_cap_mac, eht_cap->eht_cap_elem.mac_cap_info, 3225 sizeof(eht_cap->eht_cap_elem.mac_cap_info)); 3226 memcpy(arg->peer_eht_cap_phy, eht_cap->eht_cap_elem.phy_cap_info, 3227 sizeof(eht_cap->eht_cap_elem.phy_cap_info)); 3228 3229 rx_mcs = arg->peer_eht_rx_mcs_set; 3230 tx_mcs = arg->peer_eht_tx_mcs_set; 3231 3232 switch (link_sta->bandwidth) { 3233 case IEEE80211_STA_RX_BW_320: 3234 bw = &eht_cap->eht_mcs_nss_supp.bw._320; 3235 ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss, 3236 bw->rx_tx_mcs9_max_nss, 3237 bw->rx_tx_mcs11_max_nss, 3238 bw->rx_tx_mcs13_max_nss, 3239 &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_320], 3240 &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_320]); 3241 arg->peer_eht_mcs_count++; 3242 fallthrough; 3243 case IEEE80211_STA_RX_BW_160: 3244 bw = &eht_cap->eht_mcs_nss_supp.bw._160; 3245 ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss, 3246 bw->rx_tx_mcs9_max_nss, 3247 bw->rx_tx_mcs11_max_nss, 3248 bw->rx_tx_mcs13_max_nss, 3249 &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_160], 3250 &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_160]); 3251 arg->peer_eht_mcs_count++; 3252 fallthrough; 3253 default: 3254 if ((he_cap->he_cap_elem.phy_cap_info[0] & 3255 (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G | 3256 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G | 3257 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G | 3258 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)) == 0) { 3259 bw_20 = &eht_cap->eht_mcs_nss_supp.only_20mhz; 3260 3261 ath12k_mac_set_eht_mcs(bw_20->rx_tx_mcs7_max_nss, 3262 bw_20->rx_tx_mcs9_max_nss, 3263 bw_20->rx_tx_mcs11_max_nss, 3264 bw_20->rx_tx_mcs13_max_nss, 3265 &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80], 3266 &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80]); 3267 } else { 3268 bw = &eht_cap->eht_mcs_nss_supp.bw._80; 3269 ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss, 3270 bw->rx_tx_mcs9_max_nss, 3271 bw->rx_tx_mcs11_max_nss, 3272 bw->rx_tx_mcs13_max_nss, 3273 &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80], 3274 &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80]); 3275 } 3276 3277 arg->peer_eht_mcs_count++; 3278 break; 3279 } 3280 3281 arg->punct_bitmap = ~arvif->punct_bitmap; 3282 arg->eht_disable_mcs15 = link_conf->eht_disable_mcs15; 3283 } 3284 3285 static void ath12k_peer_assoc_h_mlo(struct ath12k_link_sta *arsta, 3286 struct ath12k_wmi_peer_assoc_arg *arg) 3287 { 3288 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 3289 struct peer_assoc_mlo_params *ml = &arg->ml; 3290 struct ath12k_sta *ahsta = arsta->ahsta; 3291 struct ath12k_link_sta *arsta_p; 3292 struct ath12k_link_vif *arvif; 3293 unsigned long links; 3294 u8 link_id; 3295 int i; 3296 3297 if (!sta->mlo || ahsta->ml_peer_id == ATH12K_MLO_PEER_ID_INVALID) 3298 return; 3299 3300 ml->enabled = true; 3301 ml->assoc_link = arsta->is_assoc_link; 3302 3303 /* For now considering the primary umac based on assoc link */ 3304 ml->primary_umac = arsta->is_assoc_link; 3305 ml->peer_id_valid = true; 3306 ml->logical_link_idx_valid = true; 3307 3308 ether_addr_copy(ml->mld_addr, sta->addr); 3309 ml->logical_link_idx = arsta->link_idx; 3310 ml->ml_peer_id = ahsta->ml_peer_id; 3311 ml->ieee_link_id = arsta->link_id; 3312 ml->num_partner_links = 0; 3313 ml->eml_cap = sta->eml_cap; 3314 links = ahsta->links_map; 3315 3316 rcu_read_lock(); 3317 3318 i = 0; 3319 3320 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) { 3321 if (i >= ATH12K_WMI_MLO_MAX_LINKS) 3322 break; 3323 3324 arsta_p = rcu_dereference(ahsta->link[link_id]); 3325 arvif = rcu_dereference(ahsta->ahvif->link[link_id]); 3326 3327 if (arsta_p == arsta) 3328 continue; 3329 3330 if (!arvif->is_started) 3331 continue; 3332 3333 ml->partner_info[i].vdev_id = arvif->vdev_id; 3334 ml->partner_info[i].hw_link_id = arvif->ar->pdev->hw_link_id; 3335 ml->partner_info[i].assoc_link = arsta_p->is_assoc_link; 3336 ml->partner_info[i].primary_umac = arsta_p->is_assoc_link; 3337 ml->partner_info[i].logical_link_idx_valid = true; 3338 ml->partner_info[i].logical_link_idx = arsta_p->link_idx; 3339 ml->num_partner_links++; 3340 3341 i++; 3342 } 3343 3344 rcu_read_unlock(); 3345 } 3346 3347 static void ath12k_peer_assoc_prepare(struct ath12k *ar, 3348 struct ath12k_link_vif *arvif, 3349 struct ath12k_link_sta *arsta, 3350 struct ath12k_wmi_peer_assoc_arg *arg, 3351 bool reassoc) 3352 { 3353 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 3354 3355 memset(arg, 0, sizeof(*arg)); 3356 3357 reinit_completion(&ar->peer_assoc_done); 3358 3359 arg->peer_new_assoc = !reassoc; 3360 ath12k_peer_assoc_h_basic(ar, arvif, arsta, arg); 3361 ath12k_peer_assoc_h_crypto(ar, arvif, arsta, arg); 3362 ath12k_peer_assoc_h_rates(ar, arvif, arsta, arg); 3363 ath12k_peer_assoc_h_ht(ar, arvif, arsta, arg); 3364 ath12k_peer_assoc_h_vht(ar, arvif, arsta, arg); 3365 ath12k_peer_assoc_h_he(ar, arvif, arsta, arg); 3366 ath12k_peer_assoc_h_he_6ghz(ar, arvif, arsta, arg); 3367 ath12k_peer_assoc_h_eht(ar, arvif, arsta, arg); 3368 ath12k_peer_assoc_h_qos(ar, arvif, arsta, arg); 3369 ath12k_peer_assoc_h_phymode(ar, arvif, arsta, arg); 3370 ath12k_peer_assoc_h_smps(arsta, arg); 3371 ath12k_peer_assoc_h_mlo(arsta, arg); 3372 3373 arsta->peer_nss = arg->peer_nss; 3374 /* TODO: amsdu_disable req? */ 3375 } 3376 3377 static int ath12k_setup_peer_smps(struct ath12k *ar, struct ath12k_link_vif *arvif, 3378 const u8 *addr, 3379 const struct ieee80211_sta_ht_cap *ht_cap, 3380 const struct ieee80211_he_6ghz_capa *he_6ghz_capa) 3381 { 3382 int smps, ret = 0; 3383 3384 if (!ht_cap->ht_supported && !he_6ghz_capa) 3385 return 0; 3386 3387 ret = ath12k_get_smps_from_capa(ht_cap, he_6ghz_capa, &smps); 3388 if (ret < 0) 3389 return ret; 3390 3391 return ath12k_wmi_set_peer_param(ar, addr, arvif->vdev_id, 3392 WMI_PEER_MIMO_PS_STATE, 3393 ath12k_smps_map[smps]); 3394 } 3395 3396 static int ath12k_mac_set_he_txbf_conf(struct ath12k_link_vif *arvif) 3397 { 3398 struct ath12k_vif *ahvif = arvif->ahvif; 3399 struct ath12k *ar = arvif->ar; 3400 u32 param = WMI_VDEV_PARAM_SET_HEMU_MODE; 3401 u32 value = 0; 3402 int ret; 3403 struct ieee80211_bss_conf *link_conf; 3404 3405 link_conf = ath12k_mac_get_link_bss_conf(arvif); 3406 if (!link_conf) { 3407 ath12k_warn(ar->ab, "unable to access bss link conf in txbf conf\n"); 3408 return -EINVAL; 3409 } 3410 3411 if (!link_conf->he_support) 3412 return 0; 3413 3414 if (link_conf->he_su_beamformer) { 3415 value |= u32_encode_bits(HE_SU_BFER_ENABLE, HE_MODE_SU_TX_BFER); 3416 if (link_conf->he_mu_beamformer && 3417 ahvif->vdev_type == WMI_VDEV_TYPE_AP) 3418 value |= u32_encode_bits(HE_MU_BFER_ENABLE, HE_MODE_MU_TX_BFER); 3419 } 3420 3421 if (ahvif->vif->type != NL80211_IFTYPE_MESH_POINT) { 3422 value |= u32_encode_bits(HE_DL_MUOFDMA_ENABLE, HE_MODE_DL_OFDMA) | 3423 u32_encode_bits(HE_UL_MUOFDMA_ENABLE, HE_MODE_UL_OFDMA); 3424 3425 if (link_conf->he_full_ul_mumimo) 3426 value |= u32_encode_bits(HE_UL_MUMIMO_ENABLE, HE_MODE_UL_MUMIMO); 3427 3428 if (link_conf->he_su_beamformee) 3429 value |= u32_encode_bits(HE_SU_BFEE_ENABLE, HE_MODE_SU_TX_BFEE); 3430 } 3431 3432 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, value); 3433 if (ret) { 3434 ath12k_warn(ar->ab, "failed to set vdev %d HE MU mode: %d\n", 3435 arvif->vdev_id, ret); 3436 return ret; 3437 } 3438 3439 param = WMI_VDEV_PARAM_SET_HE_SOUNDING_MODE; 3440 value = u32_encode_bits(HE_VHT_SOUNDING_MODE_ENABLE, HE_VHT_SOUNDING_MODE) | 3441 u32_encode_bits(HE_TRIG_NONTRIG_SOUNDING_MODE_ENABLE, 3442 HE_TRIG_NONTRIG_SOUNDING_MODE); 3443 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 3444 param, value); 3445 if (ret) { 3446 ath12k_warn(ar->ab, "failed to set vdev %d sounding mode: %d\n", 3447 arvif->vdev_id, ret); 3448 return ret; 3449 } 3450 3451 return 0; 3452 } 3453 3454 static int ath12k_mac_vif_recalc_sta_he_txbf(struct ath12k *ar, 3455 struct ath12k_link_vif *arvif, 3456 struct ieee80211_sta_he_cap *he_cap, 3457 int *hemode) 3458 { 3459 struct ieee80211_vif *vif = arvif->ahvif->vif; 3460 struct ieee80211_he_cap_elem he_cap_elem = {}; 3461 struct ieee80211_sta_he_cap *cap_band; 3462 struct cfg80211_chan_def def; 3463 u8 link_id = arvif->link_id; 3464 struct ieee80211_bss_conf *link_conf; 3465 3466 link_conf = ath12k_mac_get_link_bss_conf(arvif); 3467 if (!link_conf) { 3468 ath12k_warn(ar->ab, "unable to access bss link conf in recalc txbf conf\n"); 3469 return -EINVAL; 3470 } 3471 3472 if (!link_conf->he_support) 3473 return 0; 3474 3475 if (vif->type != NL80211_IFTYPE_STATION) 3476 return -EINVAL; 3477 3478 if (WARN_ON(ath12k_mac_vif_link_chan(vif, link_id, &def))) 3479 return -EINVAL; 3480 3481 if (def.chan->band == NL80211_BAND_2GHZ) 3482 cap_band = &ar->mac.iftype[NL80211_BAND_2GHZ][vif->type].he_cap; 3483 else 3484 cap_band = &ar->mac.iftype[NL80211_BAND_5GHZ][vif->type].he_cap; 3485 3486 memcpy(&he_cap_elem, &cap_band->he_cap_elem, sizeof(he_cap_elem)); 3487 3488 *hemode = 0; 3489 if (HECAP_PHY_SUBFME_GET(he_cap_elem.phy_cap_info)) { 3490 if (HECAP_PHY_SUBFMR_GET(he_cap->he_cap_elem.phy_cap_info)) 3491 *hemode |= u32_encode_bits(HE_SU_BFEE_ENABLE, HE_MODE_SU_TX_BFEE); 3492 if (HECAP_PHY_MUBFMR_GET(he_cap->he_cap_elem.phy_cap_info)) 3493 *hemode |= u32_encode_bits(HE_MU_BFEE_ENABLE, HE_MODE_MU_TX_BFEE); 3494 } 3495 3496 if (vif->type != NL80211_IFTYPE_MESH_POINT) { 3497 *hemode |= u32_encode_bits(HE_DL_MUOFDMA_ENABLE, HE_MODE_DL_OFDMA) | 3498 u32_encode_bits(HE_UL_MUOFDMA_ENABLE, HE_MODE_UL_OFDMA); 3499 3500 if (HECAP_PHY_ULMUMIMO_GET(he_cap_elem.phy_cap_info)) 3501 if (HECAP_PHY_ULMUMIMO_GET(he_cap->he_cap_elem.phy_cap_info)) 3502 *hemode |= u32_encode_bits(HE_UL_MUMIMO_ENABLE, 3503 HE_MODE_UL_MUMIMO); 3504 3505 if (u32_get_bits(*hemode, HE_MODE_MU_TX_BFEE)) 3506 *hemode |= u32_encode_bits(HE_SU_BFEE_ENABLE, HE_MODE_SU_TX_BFEE); 3507 3508 if (u32_get_bits(*hemode, HE_MODE_MU_TX_BFER)) 3509 *hemode |= u32_encode_bits(HE_SU_BFER_ENABLE, HE_MODE_SU_TX_BFER); 3510 } 3511 3512 return 0; 3513 } 3514 3515 static int ath12k_mac_set_eht_txbf_conf(struct ath12k_link_vif *arvif) 3516 { 3517 struct ath12k_vif *ahvif = arvif->ahvif; 3518 struct ath12k *ar = arvif->ar; 3519 u32 param = WMI_VDEV_PARAM_SET_EHT_MU_MODE; 3520 u32 value = 0; 3521 int ret; 3522 struct ieee80211_bss_conf *link_conf; 3523 3524 link_conf = ath12k_mac_get_link_bss_conf(arvif); 3525 if (!link_conf) { 3526 ath12k_warn(ar->ab, "unable to access bss link conf in eht txbf conf\n"); 3527 return -ENOENT; 3528 } 3529 3530 if (!link_conf->eht_support) 3531 return 0; 3532 3533 if (link_conf->eht_su_beamformer) { 3534 value |= u32_encode_bits(EHT_SU_BFER_ENABLE, EHT_MODE_SU_TX_BFER); 3535 if (link_conf->eht_mu_beamformer && 3536 ahvif->vdev_type == WMI_VDEV_TYPE_AP) 3537 value |= u32_encode_bits(EHT_MU_BFER_ENABLE, 3538 EHT_MODE_MU_TX_BFER) | 3539 u32_encode_bits(EHT_DL_MUOFDMA_ENABLE, 3540 EHT_MODE_DL_OFDMA_MUMIMO) | 3541 u32_encode_bits(EHT_UL_MUOFDMA_ENABLE, 3542 EHT_MODE_UL_OFDMA_MUMIMO); 3543 } 3544 3545 if (ahvif->vif->type != NL80211_IFTYPE_MESH_POINT) { 3546 value |= u32_encode_bits(EHT_DL_MUOFDMA_ENABLE, EHT_MODE_DL_OFDMA) | 3547 u32_encode_bits(EHT_UL_MUOFDMA_ENABLE, EHT_MODE_UL_OFDMA); 3548 3549 if (link_conf->eht_80mhz_full_bw_ul_mumimo) 3550 value |= u32_encode_bits(EHT_UL_MUMIMO_ENABLE, EHT_MODE_MUMIMO); 3551 3552 if (link_conf->eht_su_beamformee) 3553 value |= u32_encode_bits(EHT_SU_BFEE_ENABLE, 3554 EHT_MODE_SU_TX_BFEE); 3555 } 3556 3557 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, value); 3558 if (ret) { 3559 ath12k_warn(ar->ab, "failed to set vdev %d EHT MU mode: %d\n", 3560 arvif->vdev_id, ret); 3561 return ret; 3562 } 3563 3564 return 0; 3565 } 3566 3567 static u32 ath12k_mac_ieee80211_sta_bw_to_wmi(struct ath12k *ar, 3568 struct ieee80211_link_sta *link_sta) 3569 { 3570 u32 bw; 3571 3572 switch (link_sta->bandwidth) { 3573 case IEEE80211_STA_RX_BW_20: 3574 bw = WMI_PEER_CHWIDTH_20MHZ; 3575 break; 3576 case IEEE80211_STA_RX_BW_40: 3577 bw = WMI_PEER_CHWIDTH_40MHZ; 3578 break; 3579 case IEEE80211_STA_RX_BW_80: 3580 bw = WMI_PEER_CHWIDTH_80MHZ; 3581 break; 3582 case IEEE80211_STA_RX_BW_160: 3583 bw = WMI_PEER_CHWIDTH_160MHZ; 3584 break; 3585 case IEEE80211_STA_RX_BW_320: 3586 bw = WMI_PEER_CHWIDTH_320MHZ; 3587 break; 3588 default: 3589 ath12k_warn(ar->ab, "Invalid bandwidth %d for link station %pM\n", 3590 link_sta->bandwidth, link_sta->addr); 3591 bw = WMI_PEER_CHWIDTH_20MHZ; 3592 break; 3593 } 3594 3595 return bw; 3596 } 3597 3598 static void ath12k_bss_assoc(struct ath12k *ar, 3599 struct ath12k_link_vif *arvif, 3600 struct ieee80211_bss_conf *bss_conf) 3601 { 3602 struct ath12k_vif *ahvif = arvif->ahvif; 3603 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif); 3604 struct ath12k_wmi_vdev_up_params params = {}; 3605 struct ieee80211_link_sta *link_sta; 3606 u8 link_id = bss_conf->link_id; 3607 struct ath12k_link_sta *arsta; 3608 struct ieee80211_sta *ap_sta; 3609 struct ath12k_sta *ahsta; 3610 struct ath12k_peer *peer; 3611 bool is_auth = false; 3612 u32 hemode = 0; 3613 int ret; 3614 3615 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 3616 3617 struct ath12k_wmi_peer_assoc_arg *peer_arg __free(kfree) = 3618 kzalloc(sizeof(*peer_arg), GFP_KERNEL); 3619 if (!peer_arg) 3620 return; 3621 3622 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 3623 "mac vdev %i link id %u assoc bssid %pM aid %d\n", 3624 arvif->vdev_id, link_id, arvif->bssid, ahvif->aid); 3625 3626 rcu_read_lock(); 3627 3628 /* During ML connection, cfg.ap_addr has the MLD address. For 3629 * non-ML connection, it has the BSSID. 3630 */ 3631 ap_sta = ieee80211_find_sta(vif, vif->cfg.ap_addr); 3632 if (!ap_sta) { 3633 ath12k_warn(ar->ab, "failed to find station entry for bss %pM vdev %i\n", 3634 vif->cfg.ap_addr, arvif->vdev_id); 3635 rcu_read_unlock(); 3636 return; 3637 } 3638 3639 ahsta = ath12k_sta_to_ahsta(ap_sta); 3640 3641 arsta = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy, 3642 ahsta->link[link_id]); 3643 if (WARN_ON(!arsta)) { 3644 rcu_read_unlock(); 3645 return; 3646 } 3647 3648 link_sta = ath12k_mac_get_link_sta(arsta); 3649 if (WARN_ON(!link_sta)) { 3650 rcu_read_unlock(); 3651 return; 3652 } 3653 3654 ath12k_peer_assoc_prepare(ar, arvif, arsta, peer_arg, false); 3655 3656 /* link_sta->he_cap must be protected by rcu_read_lock */ 3657 ret = ath12k_mac_vif_recalc_sta_he_txbf(ar, arvif, &link_sta->he_cap, &hemode); 3658 if (ret) { 3659 ath12k_warn(ar->ab, "failed to recalc he txbf for vdev %i on bss %pM: %d\n", 3660 arvif->vdev_id, bss_conf->bssid, ret); 3661 rcu_read_unlock(); 3662 return; 3663 } 3664 3665 rcu_read_unlock(); 3666 3667 /* keep this before ath12k_wmi_send_peer_assoc_cmd() */ 3668 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 3669 WMI_VDEV_PARAM_SET_HEMU_MODE, hemode); 3670 if (ret) { 3671 ath12k_warn(ar->ab, "failed to submit vdev param txbf 0x%x: %d\n", 3672 hemode, ret); 3673 return; 3674 } 3675 3676 peer_arg->is_assoc = true; 3677 ret = ath12k_wmi_send_peer_assoc_cmd(ar, peer_arg); 3678 if (ret) { 3679 ath12k_warn(ar->ab, "failed to run peer assoc for %pM vdev %i: %d\n", 3680 bss_conf->bssid, arvif->vdev_id, ret); 3681 return; 3682 } 3683 3684 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) { 3685 ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n", 3686 bss_conf->bssid, arvif->vdev_id); 3687 return; 3688 } 3689 3690 ret = ath12k_setup_peer_smps(ar, arvif, bss_conf->bssid, 3691 &link_sta->ht_cap, &link_sta->he_6ghz_capa); 3692 if (ret) { 3693 ath12k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n", 3694 arvif->vdev_id, ret); 3695 return; 3696 } 3697 3698 WARN_ON(arvif->is_up); 3699 3700 ahvif->aid = vif->cfg.aid; 3701 ether_addr_copy(arvif->bssid, bss_conf->bssid); 3702 3703 params.vdev_id = arvif->vdev_id; 3704 params.aid = ahvif->aid; 3705 params.bssid = arvif->bssid; 3706 params.tx_bssid = ath12k_mac_get_tx_bssid(arvif); 3707 if (params.tx_bssid) { 3708 params.nontx_profile_idx = bss_conf->bssid_index; 3709 params.nontx_profile_cnt = 1 << bss_conf->bssid_indicator; 3710 } 3711 ret = ath12k_wmi_vdev_up(ar, ¶ms); 3712 if (ret) { 3713 ath12k_warn(ar->ab, "failed to set vdev %d up: %d\n", 3714 arvif->vdev_id, ret); 3715 return; 3716 } 3717 3718 arvif->is_up = true; 3719 arvif->rekey_data.enable_offload = false; 3720 3721 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 3722 "mac vdev %d up (associated) bssid %pM aid %d\n", 3723 arvif->vdev_id, bss_conf->bssid, vif->cfg.aid); 3724 3725 spin_lock_bh(&ar->ab->base_lock); 3726 3727 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arvif->bssid); 3728 if (peer && peer->is_authorized) 3729 is_auth = true; 3730 3731 spin_unlock_bh(&ar->ab->base_lock); 3732 3733 /* Authorize BSS Peer */ 3734 if (is_auth) { 3735 ret = ath12k_wmi_set_peer_param(ar, arvif->bssid, 3736 arvif->vdev_id, 3737 WMI_PEER_AUTHORIZE, 3738 1); 3739 if (ret) 3740 ath12k_warn(ar->ab, "Unable to authorize BSS peer: %d\n", ret); 3741 } 3742 3743 ret = ath12k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id, 3744 &bss_conf->he_obss_pd); 3745 if (ret) 3746 ath12k_warn(ar->ab, "failed to set vdev %i OBSS PD parameters: %d\n", 3747 arvif->vdev_id, ret); 3748 3749 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map) && 3750 ahvif->vdev_type == WMI_VDEV_TYPE_STA && 3751 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) 3752 ath12k_mac_11d_scan_stop_all(ar->ab); 3753 } 3754 3755 static void ath12k_bss_disassoc(struct ath12k *ar, 3756 struct ath12k_link_vif *arvif) 3757 { 3758 int ret; 3759 3760 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 3761 3762 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n", 3763 arvif->vdev_id, arvif->bssid); 3764 3765 ret = ath12k_wmi_vdev_down(ar, arvif->vdev_id); 3766 if (ret) 3767 ath12k_warn(ar->ab, "failed to down vdev %i: %d\n", 3768 arvif->vdev_id, ret); 3769 3770 arvif->is_up = false; 3771 3772 memset(&arvif->rekey_data, 0, sizeof(arvif->rekey_data)); 3773 3774 cancel_delayed_work(&arvif->connection_loss_work); 3775 } 3776 3777 static u32 ath12k_mac_get_rate_hw_value(int bitrate) 3778 { 3779 u32 preamble; 3780 u16 hw_value; 3781 int rate; 3782 size_t i; 3783 3784 if (ath12k_mac_bitrate_is_cck(bitrate)) 3785 preamble = WMI_RATE_PREAMBLE_CCK; 3786 else 3787 preamble = WMI_RATE_PREAMBLE_OFDM; 3788 3789 for (i = 0; i < ARRAY_SIZE(ath12k_legacy_rates); i++) { 3790 if (ath12k_legacy_rates[i].bitrate != bitrate) 3791 continue; 3792 3793 hw_value = ath12k_legacy_rates[i].hw_value; 3794 rate = ATH12K_HW_RATE_CODE(hw_value, 0, preamble); 3795 3796 return rate; 3797 } 3798 3799 return -EINVAL; 3800 } 3801 3802 static void ath12k_recalculate_mgmt_rate(struct ath12k *ar, 3803 struct ath12k_link_vif *arvif, 3804 struct cfg80211_chan_def *def) 3805 { 3806 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 3807 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar); 3808 const struct ieee80211_supported_band *sband; 3809 struct ieee80211_bss_conf *bss_conf; 3810 u8 basic_rate_idx; 3811 int hw_rate_code; 3812 u32 vdev_param; 3813 u16 bitrate; 3814 int ret; 3815 3816 lockdep_assert_wiphy(hw->wiphy); 3817 3818 bss_conf = ath12k_mac_get_link_bss_conf(arvif); 3819 if (!bss_conf) { 3820 ath12k_warn(ar->ab, "unable to access bss link conf in mgmt rate calc for vif %pM link %u\n", 3821 vif->addr, arvif->link_id); 3822 return; 3823 } 3824 3825 sband = hw->wiphy->bands[def->chan->band]; 3826 if (bss_conf->basic_rates) 3827 basic_rate_idx = __ffs(bss_conf->basic_rates); 3828 else 3829 basic_rate_idx = 0; 3830 bitrate = sband->bitrates[basic_rate_idx].bitrate; 3831 3832 hw_rate_code = ath12k_mac_get_rate_hw_value(bitrate); 3833 if (hw_rate_code < 0) { 3834 ath12k_warn(ar->ab, "bitrate not supported %d\n", bitrate); 3835 return; 3836 } 3837 3838 vdev_param = WMI_VDEV_PARAM_MGMT_RATE; 3839 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param, 3840 hw_rate_code); 3841 if (ret) 3842 ath12k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret); 3843 3844 vdev_param = WMI_VDEV_PARAM_BEACON_RATE; 3845 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param, 3846 hw_rate_code); 3847 if (ret) 3848 ath12k_warn(ar->ab, "failed to set beacon tx rate %d\n", ret); 3849 } 3850 3851 static void ath12k_mac_init_arvif(struct ath12k_vif *ahvif, 3852 struct ath12k_link_vif *arvif, int link_id) 3853 { 3854 struct ath12k_hw *ah = ahvif->ah; 3855 u8 _link_id; 3856 int i; 3857 3858 lockdep_assert_wiphy(ah->hw->wiphy); 3859 3860 if (WARN_ON(!arvif)) 3861 return; 3862 3863 if (WARN_ON(link_id >= ATH12K_NUM_MAX_LINKS)) 3864 return; 3865 3866 if (link_id < 0) 3867 _link_id = 0; 3868 else 3869 _link_id = link_id; 3870 3871 arvif->ahvif = ahvif; 3872 arvif->link_id = _link_id; 3873 3874 /* Protects the datapath stats update on a per link basis */ 3875 spin_lock_init(&arvif->link_stats_lock); 3876 3877 INIT_LIST_HEAD(&arvif->list); 3878 INIT_DELAYED_WORK(&arvif->connection_loss_work, 3879 ath12k_mac_vif_sta_connection_loss_work); 3880 3881 arvif->num_stations = 0; 3882 3883 for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) { 3884 arvif->bitrate_mask.control[i].legacy = 0xffffffff; 3885 arvif->bitrate_mask.control[i].gi = NL80211_TXRATE_DEFAULT_GI; 3886 memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff, 3887 sizeof(arvif->bitrate_mask.control[i].ht_mcs)); 3888 memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff, 3889 sizeof(arvif->bitrate_mask.control[i].vht_mcs)); 3890 memset(arvif->bitrate_mask.control[i].he_mcs, 0xff, 3891 sizeof(arvif->bitrate_mask.control[i].he_mcs)); 3892 } 3893 3894 /* Handle MLO related assignments */ 3895 if (link_id >= 0) { 3896 rcu_assign_pointer(ahvif->link[arvif->link_id], arvif); 3897 ahvif->links_map |= BIT(_link_id); 3898 } 3899 3900 ath12k_generic_dbg(ATH12K_DBG_MAC, 3901 "mac init link arvif (link_id %d%s) for vif %pM. links_map 0x%x", 3902 _link_id, (link_id < 0) ? " deflink" : "", ahvif->vif->addr, 3903 ahvif->links_map); 3904 } 3905 3906 static void ath12k_mac_remove_link_interface(struct ieee80211_hw *hw, 3907 struct ath12k_link_vif *arvif) 3908 { 3909 struct ath12k_vif *ahvif = arvif->ahvif; 3910 struct ath12k_hw *ah = hw->priv; 3911 struct ath12k *ar = arvif->ar; 3912 int ret; 3913 3914 lockdep_assert_wiphy(ah->hw->wiphy); 3915 3916 cancel_delayed_work_sync(&arvif->connection_loss_work); 3917 3918 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac remove link interface (vdev %d link id %d)", 3919 arvif->vdev_id, arvif->link_id); 3920 3921 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map) && 3922 ahvif->vdev_type == WMI_VDEV_TYPE_STA && 3923 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) 3924 ath12k_mac_11d_scan_stop(ar); 3925 3926 if (ahvif->vdev_type == WMI_VDEV_TYPE_AP) { 3927 ret = ath12k_peer_delete(ar, arvif->vdev_id, arvif->bssid); 3928 if (ret) 3929 ath12k_warn(ar->ab, "failed to submit AP self-peer removal on vdev %d link id %d: %d", 3930 arvif->vdev_id, arvif->link_id, ret); 3931 } 3932 ath12k_mac_vdev_delete(ar, arvif); 3933 } 3934 3935 static struct ath12k_link_vif *ath12k_mac_assign_link_vif(struct ath12k_hw *ah, 3936 struct ieee80211_vif *vif, 3937 u8 link_id) 3938 { 3939 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 3940 struct ath12k_link_vif *arvif; 3941 3942 lockdep_assert_wiphy(ah->hw->wiphy); 3943 3944 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]); 3945 if (arvif) 3946 return arvif; 3947 3948 /* If this is the first link arvif being created for an ML VIF 3949 * use the preallocated deflink memory except for scan arvifs 3950 */ 3951 if (!ahvif->links_map && link_id < ATH12K_FIRST_SCAN_LINK) { 3952 arvif = &ahvif->deflink; 3953 3954 if (vif->type == NL80211_IFTYPE_STATION) 3955 arvif->is_sta_assoc_link = true; 3956 } else { 3957 arvif = kzalloc(sizeof(*arvif), GFP_KERNEL); 3958 if (!arvif) 3959 return NULL; 3960 } 3961 3962 ath12k_mac_init_arvif(ahvif, arvif, link_id); 3963 3964 return arvif; 3965 } 3966 3967 static void ath12k_mac_unassign_link_vif(struct ath12k_link_vif *arvif) 3968 { 3969 struct ath12k_vif *ahvif = arvif->ahvif; 3970 struct ath12k_hw *ah = ahvif->ah; 3971 3972 lockdep_assert_wiphy(ah->hw->wiphy); 3973 3974 rcu_assign_pointer(ahvif->link[arvif->link_id], NULL); 3975 synchronize_rcu(); 3976 ahvif->links_map &= ~BIT(arvif->link_id); 3977 3978 if (arvif != &ahvif->deflink) 3979 kfree(arvif); 3980 else 3981 memset(arvif, 0, sizeof(*arvif)); 3982 } 3983 3984 static int 3985 ath12k_mac_op_change_vif_links(struct ieee80211_hw *hw, 3986 struct ieee80211_vif *vif, 3987 u16 old_links, u16 new_links, 3988 struct ieee80211_bss_conf *ol[IEEE80211_MLD_MAX_NUM_LINKS]) 3989 { 3990 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 3991 unsigned long to_remove = old_links & ~new_links; 3992 unsigned long to_add = ~old_links & new_links; 3993 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 3994 struct ath12k_link_vif *arvif; 3995 u8 link_id; 3996 3997 lockdep_assert_wiphy(hw->wiphy); 3998 3999 ath12k_generic_dbg(ATH12K_DBG_MAC, 4000 "mac vif link changed for MLD %pM old_links 0x%x new_links 0x%x\n", 4001 vif->addr, old_links, new_links); 4002 4003 for_each_set_bit(link_id, &to_add, IEEE80211_MLD_MAX_NUM_LINKS) { 4004 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 4005 /* mac80211 wants to add link but driver already has the 4006 * link. This should not happen ideally. 4007 */ 4008 if (WARN_ON(arvif)) 4009 return -EINVAL; 4010 4011 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id); 4012 if (WARN_ON(!arvif)) 4013 return -EINVAL; 4014 } 4015 4016 for_each_set_bit(link_id, &to_remove, IEEE80211_MLD_MAX_NUM_LINKS) { 4017 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 4018 if (WARN_ON(!arvif)) 4019 return -EINVAL; 4020 4021 if (!arvif->is_created) 4022 continue; 4023 4024 if (WARN_ON(!arvif->ar)) 4025 return -EINVAL; 4026 4027 ath12k_mac_remove_link_interface(hw, arvif); 4028 ath12k_mac_unassign_link_vif(arvif); 4029 } 4030 4031 return 0; 4032 } 4033 4034 static int ath12k_mac_fils_discovery(struct ath12k_link_vif *arvif, 4035 struct ieee80211_bss_conf *info) 4036 { 4037 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 4038 struct ath12k *ar = arvif->ar; 4039 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar); 4040 struct sk_buff *tmpl; 4041 int ret; 4042 u32 interval; 4043 bool unsol_bcast_probe_resp_enabled = false; 4044 4045 if (info->fils_discovery.max_interval) { 4046 interval = info->fils_discovery.max_interval; 4047 4048 tmpl = ieee80211_get_fils_discovery_tmpl(hw, vif); 4049 if (tmpl) 4050 ret = ath12k_wmi_fils_discovery_tmpl(ar, arvif->vdev_id, 4051 tmpl); 4052 } else if (info->unsol_bcast_probe_resp_interval) { 4053 unsol_bcast_probe_resp_enabled = 1; 4054 interval = info->unsol_bcast_probe_resp_interval; 4055 4056 tmpl = ieee80211_get_unsol_bcast_probe_resp_tmpl(hw, vif); 4057 if (tmpl) 4058 ret = ath12k_wmi_probe_resp_tmpl(ar, arvif->vdev_id, 4059 tmpl); 4060 } else { /* Disable */ 4061 return ath12k_wmi_fils_discovery(ar, arvif->vdev_id, 0, false); 4062 } 4063 4064 if (!tmpl) { 4065 ath12k_warn(ar->ab, 4066 "mac vdev %i failed to retrieve %s template\n", 4067 arvif->vdev_id, (unsol_bcast_probe_resp_enabled ? 4068 "unsolicited broadcast probe response" : 4069 "FILS discovery")); 4070 return -EPERM; 4071 } 4072 kfree_skb(tmpl); 4073 4074 if (!ret) 4075 ret = ath12k_wmi_fils_discovery(ar, arvif->vdev_id, interval, 4076 unsol_bcast_probe_resp_enabled); 4077 4078 return ret; 4079 } 4080 4081 static void ath12k_mac_op_vif_cfg_changed(struct ieee80211_hw *hw, 4082 struct ieee80211_vif *vif, 4083 u64 changed) 4084 { 4085 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 4086 unsigned long links = ahvif->links_map; 4087 struct ieee80211_bss_conf *info; 4088 struct ath12k_link_vif *arvif; 4089 struct ieee80211_sta *sta; 4090 struct ath12k_sta *ahsta; 4091 struct ath12k *ar; 4092 u8 link_id; 4093 4094 lockdep_assert_wiphy(hw->wiphy); 4095 4096 if (changed & BSS_CHANGED_SSID && vif->type == NL80211_IFTYPE_AP) { 4097 ahvif->u.ap.ssid_len = vif->cfg.ssid_len; 4098 if (vif->cfg.ssid_len) 4099 memcpy(ahvif->u.ap.ssid, vif->cfg.ssid, vif->cfg.ssid_len); 4100 } 4101 4102 if (changed & BSS_CHANGED_ASSOC) { 4103 if (vif->cfg.assoc) { 4104 /* only in station mode we can get here, so it's safe 4105 * to use ap_addr 4106 */ 4107 rcu_read_lock(); 4108 sta = ieee80211_find_sta(vif, vif->cfg.ap_addr); 4109 if (!sta) { 4110 rcu_read_unlock(); 4111 WARN_ONCE(1, "failed to find sta with addr %pM\n", 4112 vif->cfg.ap_addr); 4113 return; 4114 } 4115 4116 ahsta = ath12k_sta_to_ahsta(sta); 4117 arvif = wiphy_dereference(hw->wiphy, 4118 ahvif->link[ahsta->assoc_link_id]); 4119 rcu_read_unlock(); 4120 4121 ar = arvif->ar; 4122 /* there is no reason for which an assoc link's 4123 * bss info does not exist 4124 */ 4125 info = ath12k_mac_get_link_bss_conf(arvif); 4126 ath12k_bss_assoc(ar, arvif, info); 4127 4128 /* exclude assoc link as it is done above */ 4129 links &= ~BIT(ahsta->assoc_link_id); 4130 } 4131 4132 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) { 4133 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 4134 if (!arvif || !arvif->ar) 4135 continue; 4136 4137 ar = arvif->ar; 4138 4139 if (vif->cfg.assoc) { 4140 info = ath12k_mac_get_link_bss_conf(arvif); 4141 if (!info) 4142 continue; 4143 4144 ath12k_bss_assoc(ar, arvif, info); 4145 } else { 4146 ath12k_bss_disassoc(ar, arvif); 4147 } 4148 } 4149 } 4150 } 4151 4152 static void ath12k_mac_vif_setup_ps(struct ath12k_link_vif *arvif) 4153 { 4154 struct ath12k *ar = arvif->ar; 4155 struct ieee80211_vif *vif = arvif->ahvif->vif; 4156 struct ieee80211_conf *conf = &ath12k_ar_to_hw(ar)->conf; 4157 enum wmi_sta_powersave_param param; 4158 struct ieee80211_bss_conf *info; 4159 enum wmi_sta_ps_mode psmode; 4160 int ret; 4161 int timeout; 4162 bool enable_ps; 4163 4164 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 4165 4166 if (vif->type != NL80211_IFTYPE_STATION) 4167 return; 4168 4169 enable_ps = arvif->ahvif->ps; 4170 if (enable_ps) { 4171 psmode = WMI_STA_PS_MODE_ENABLED; 4172 param = WMI_STA_PS_PARAM_INACTIVITY_TIME; 4173 4174 timeout = conf->dynamic_ps_timeout; 4175 if (timeout == 0) { 4176 info = ath12k_mac_get_link_bss_conf(arvif); 4177 if (!info) { 4178 ath12k_warn(ar->ab, "unable to access bss link conf in setup ps for vif %pM link %u\n", 4179 vif->addr, arvif->link_id); 4180 return; 4181 } 4182 4183 /* firmware doesn't like 0 */ 4184 timeout = ieee80211_tu_to_usec(info->beacon_int) / 1000; 4185 } 4186 4187 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param, 4188 timeout); 4189 if (ret) { 4190 ath12k_warn(ar->ab, "failed to set inactivity time for vdev %d: %i\n", 4191 arvif->vdev_id, ret); 4192 return; 4193 } 4194 } else { 4195 psmode = WMI_STA_PS_MODE_DISABLED; 4196 } 4197 4198 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d psmode %s\n", 4199 arvif->vdev_id, psmode ? "enable" : "disable"); 4200 4201 ret = ath12k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, psmode); 4202 if (ret) 4203 ath12k_warn(ar->ab, "failed to set sta power save mode %d for vdev %d: %d\n", 4204 psmode, arvif->vdev_id, ret); 4205 } 4206 4207 static bool ath12k_mac_supports_tpc(struct ath12k *ar, struct ath12k_vif *ahvif, 4208 const struct cfg80211_chan_def *chandef) 4209 { 4210 return ath12k_wmi_supports_6ghz_cc_ext(ar) && 4211 test_bit(WMI_TLV_SERVICE_EXT_TPC_REG_SUPPORT, ar->ab->wmi_ab.svc_map) && 4212 (ahvif->vdev_type == WMI_VDEV_TYPE_STA || 4213 ahvif->vdev_type == WMI_VDEV_TYPE_AP) && 4214 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE && 4215 chandef->chan && 4216 chandef->chan->band == NL80211_BAND_6GHZ; 4217 } 4218 4219 static void ath12k_mac_bss_info_changed(struct ath12k *ar, 4220 struct ath12k_link_vif *arvif, 4221 struct ieee80211_bss_conf *info, 4222 u64 changed) 4223 { 4224 struct ath12k_vif *ahvif = arvif->ahvif; 4225 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif); 4226 struct ieee80211_vif_cfg *vif_cfg = &vif->cfg; 4227 struct cfg80211_chan_def def; 4228 u32 param_id, param_value; 4229 enum nl80211_band band; 4230 u32 vdev_param; 4231 int mcast_rate; 4232 u32 preamble; 4233 u16 hw_value; 4234 u16 bitrate; 4235 int ret; 4236 u8 rateidx; 4237 u32 rate; 4238 4239 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 4240 4241 if (changed & BSS_CHANGED_BEACON_INT) { 4242 arvif->beacon_interval = info->beacon_int; 4243 4244 param_id = WMI_VDEV_PARAM_BEACON_INTERVAL; 4245 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 4246 param_id, 4247 arvif->beacon_interval); 4248 if (ret) 4249 ath12k_warn(ar->ab, "Failed to set beacon interval for VDEV: %d\n", 4250 arvif->vdev_id); 4251 else 4252 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 4253 "Beacon interval: %d set for VDEV: %d\n", 4254 arvif->beacon_interval, arvif->vdev_id); 4255 } 4256 4257 if (changed & BSS_CHANGED_BEACON) { 4258 param_id = WMI_PDEV_PARAM_BEACON_TX_MODE; 4259 param_value = WMI_BEACON_BURST_MODE; 4260 ret = ath12k_wmi_pdev_set_param(ar, param_id, 4261 param_value, ar->pdev->pdev_id); 4262 if (ret) 4263 ath12k_warn(ar->ab, "Failed to set beacon mode for VDEV: %d\n", 4264 arvif->vdev_id); 4265 else 4266 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 4267 "Set burst beacon mode for VDEV: %d\n", 4268 arvif->vdev_id); 4269 4270 ret = ath12k_mac_setup_bcn_tmpl(arvif); 4271 if (ret) 4272 ath12k_warn(ar->ab, "failed to update bcn template: %d\n", 4273 ret); 4274 } 4275 4276 if (changed & (BSS_CHANGED_BEACON_INFO | BSS_CHANGED_BEACON)) { 4277 arvif->dtim_period = info->dtim_period; 4278 4279 param_id = WMI_VDEV_PARAM_DTIM_PERIOD; 4280 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 4281 param_id, 4282 arvif->dtim_period); 4283 4284 if (ret) 4285 ath12k_warn(ar->ab, "Failed to set dtim period for VDEV %d: %i\n", 4286 arvif->vdev_id, ret); 4287 else 4288 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 4289 "DTIM period: %d set for VDEV: %d\n", 4290 arvif->dtim_period, arvif->vdev_id); 4291 } 4292 4293 if (changed & BSS_CHANGED_SSID && 4294 vif->type == NL80211_IFTYPE_AP) { 4295 ahvif->u.ap.ssid_len = vif->cfg.ssid_len; 4296 if (vif->cfg.ssid_len) 4297 memcpy(ahvif->u.ap.ssid, vif->cfg.ssid, vif->cfg.ssid_len); 4298 ahvif->u.ap.hidden_ssid = info->hidden_ssid; 4299 } 4300 4301 if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid)) 4302 ether_addr_copy(arvif->bssid, info->bssid); 4303 4304 if (changed & BSS_CHANGED_BEACON_ENABLED) { 4305 if (info->enable_beacon) { 4306 ret = ath12k_mac_set_he_txbf_conf(arvif); 4307 if (ret) 4308 ath12k_warn(ar->ab, 4309 "failed to set HE TXBF config for vdev: %d\n", 4310 arvif->vdev_id); 4311 4312 ret = ath12k_mac_set_eht_txbf_conf(arvif); 4313 if (ret) 4314 ath12k_warn(ar->ab, 4315 "failed to set EHT TXBF config for vdev: %d\n", 4316 arvif->vdev_id); 4317 } 4318 ath12k_control_beaconing(arvif, info); 4319 4320 if (arvif->is_up && info->he_support && 4321 info->he_oper.params) { 4322 /* TODO: Extend to support 1024 BA Bitmap size */ 4323 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 4324 WMI_VDEV_PARAM_BA_MODE, 4325 WMI_BA_MODE_BUFFER_SIZE_256); 4326 if (ret) 4327 ath12k_warn(ar->ab, 4328 "failed to set BA BUFFER SIZE 256 for vdev: %d\n", 4329 arvif->vdev_id); 4330 4331 param_id = WMI_VDEV_PARAM_HEOPS_0_31; 4332 param_value = info->he_oper.params; 4333 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 4334 param_id, param_value); 4335 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 4336 "he oper param: %x set for VDEV: %d\n", 4337 param_value, arvif->vdev_id); 4338 4339 if (ret) 4340 ath12k_warn(ar->ab, "Failed to set he oper params %x for VDEV %d: %i\n", 4341 param_value, arvif->vdev_id, ret); 4342 } 4343 } 4344 4345 if (changed & BSS_CHANGED_ERP_CTS_PROT) { 4346 u32 cts_prot; 4347 4348 cts_prot = !!(info->use_cts_prot); 4349 param_id = WMI_VDEV_PARAM_PROTECTION_MODE; 4350 4351 if (arvif->is_started) { 4352 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 4353 param_id, cts_prot); 4354 if (ret) 4355 ath12k_warn(ar->ab, "Failed to set CTS prot for VDEV: %d\n", 4356 arvif->vdev_id); 4357 else 4358 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "Set CTS prot: %d for VDEV: %d\n", 4359 cts_prot, arvif->vdev_id); 4360 } else { 4361 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "defer protection mode setup, vdev is not ready yet\n"); 4362 } 4363 } 4364 4365 if (changed & BSS_CHANGED_ERP_SLOT) { 4366 u32 slottime; 4367 4368 if (info->use_short_slot) 4369 slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */ 4370 4371 else 4372 slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */ 4373 4374 param_id = WMI_VDEV_PARAM_SLOT_TIME; 4375 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 4376 param_id, slottime); 4377 if (ret) 4378 ath12k_warn(ar->ab, "Failed to set erp slot for VDEV: %d\n", 4379 arvif->vdev_id); 4380 else 4381 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 4382 "Set slottime: %d for VDEV: %d\n", 4383 slottime, arvif->vdev_id); 4384 } 4385 4386 if (changed & BSS_CHANGED_ERP_PREAMBLE) { 4387 u32 preamble; 4388 4389 if (info->use_short_preamble) 4390 preamble = WMI_VDEV_PREAMBLE_SHORT; 4391 else 4392 preamble = WMI_VDEV_PREAMBLE_LONG; 4393 4394 param_id = WMI_VDEV_PARAM_PREAMBLE; 4395 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 4396 param_id, preamble); 4397 if (ret) 4398 ath12k_warn(ar->ab, "Failed to set preamble for VDEV: %d\n", 4399 arvif->vdev_id); 4400 else 4401 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 4402 "Set preamble: %d for VDEV: %d\n", 4403 preamble, arvif->vdev_id); 4404 } 4405 4406 if (changed & BSS_CHANGED_ASSOC) { 4407 if (vif->cfg.assoc) 4408 ath12k_bss_assoc(ar, arvif, info); 4409 else 4410 ath12k_bss_disassoc(ar, arvif); 4411 } 4412 4413 if (changed & BSS_CHANGED_TXPOWER) { 4414 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev_id %i txpower %d\n", 4415 arvif->vdev_id, info->txpower); 4416 4417 arvif->txpower = info->txpower; 4418 ath12k_mac_txpower_recalc(ar); 4419 } 4420 4421 if (changed & BSS_CHANGED_MCAST_RATE && 4422 !ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)) { 4423 band = def.chan->band; 4424 mcast_rate = info->mcast_rate[band]; 4425 4426 if (mcast_rate > 0) { 4427 rateidx = mcast_rate - 1; 4428 } else { 4429 if (info->basic_rates) 4430 rateidx = __ffs(info->basic_rates); 4431 else 4432 rateidx = 0; 4433 } 4434 4435 if (ar->pdev->cap.supported_bands & WMI_HOST_WLAN_5GHZ_CAP) 4436 rateidx += ATH12K_MAC_FIRST_OFDM_RATE_IDX; 4437 4438 bitrate = ath12k_legacy_rates[rateidx].bitrate; 4439 hw_value = ath12k_legacy_rates[rateidx].hw_value; 4440 4441 if (ath12k_mac_bitrate_is_cck(bitrate)) 4442 preamble = WMI_RATE_PREAMBLE_CCK; 4443 else 4444 preamble = WMI_RATE_PREAMBLE_OFDM; 4445 4446 rate = ATH12K_HW_RATE_CODE(hw_value, 0, preamble); 4447 4448 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 4449 "mac vdev %d mcast_rate %x\n", 4450 arvif->vdev_id, rate); 4451 4452 vdev_param = WMI_VDEV_PARAM_MCAST_DATA_RATE; 4453 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 4454 vdev_param, rate); 4455 if (ret) 4456 ath12k_warn(ar->ab, 4457 "failed to set mcast rate on vdev %i: %d\n", 4458 arvif->vdev_id, ret); 4459 4460 vdev_param = WMI_VDEV_PARAM_BCAST_DATA_RATE; 4461 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 4462 vdev_param, rate); 4463 if (ret) 4464 ath12k_warn(ar->ab, 4465 "failed to set bcast rate on vdev %i: %d\n", 4466 arvif->vdev_id, ret); 4467 } 4468 4469 if (changed & BSS_CHANGED_BASIC_RATES && 4470 !ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)) 4471 ath12k_recalculate_mgmt_rate(ar, arvif, &def); 4472 4473 if (changed & BSS_CHANGED_TWT) { 4474 if (info->twt_requester || info->twt_responder) 4475 ath12k_wmi_send_twt_enable_cmd(ar, ar->pdev->pdev_id); 4476 else 4477 ath12k_wmi_send_twt_disable_cmd(ar, ar->pdev->pdev_id); 4478 } 4479 4480 if (changed & BSS_CHANGED_HE_OBSS_PD) 4481 ath12k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id, 4482 &info->he_obss_pd); 4483 4484 if (changed & BSS_CHANGED_HE_BSS_COLOR) { 4485 if (vif->type == NL80211_IFTYPE_AP) { 4486 ret = ath12k_wmi_obss_color_cfg_cmd(ar, 4487 arvif->vdev_id, 4488 info->he_bss_color.color, 4489 ATH12K_BSS_COLOR_AP_PERIODS, 4490 info->he_bss_color.enabled); 4491 if (ret) 4492 ath12k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n", 4493 arvif->vdev_id, ret); 4494 } else if (vif->type == NL80211_IFTYPE_STATION) { 4495 ret = ath12k_wmi_send_bss_color_change_enable_cmd(ar, 4496 arvif->vdev_id, 4497 1); 4498 if (ret) 4499 ath12k_warn(ar->ab, "failed to enable bss color change on vdev %i: %d\n", 4500 arvif->vdev_id, ret); 4501 ret = ath12k_wmi_obss_color_cfg_cmd(ar, 4502 arvif->vdev_id, 4503 0, 4504 ATH12K_BSS_COLOR_STA_PERIODS, 4505 1); 4506 if (ret) 4507 ath12k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n", 4508 arvif->vdev_id, ret); 4509 } 4510 } 4511 4512 ath12k_mac_fils_discovery(arvif, info); 4513 4514 if (changed & BSS_CHANGED_PS && 4515 ar->ab->hw_params->supports_sta_ps) { 4516 ahvif->ps = vif_cfg->ps; 4517 ath12k_mac_vif_setup_ps(arvif); 4518 } 4519 } 4520 4521 static struct ath12k_vif_cache *ath12k_ahvif_get_link_cache(struct ath12k_vif *ahvif, 4522 u8 link_id) 4523 { 4524 if (!ahvif->cache[link_id]) { 4525 ahvif->cache[link_id] = kzalloc(sizeof(*ahvif->cache[0]), GFP_KERNEL); 4526 if (ahvif->cache[link_id]) 4527 INIT_LIST_HEAD(&ahvif->cache[link_id]->key_conf.list); 4528 } 4529 4530 return ahvif->cache[link_id]; 4531 } 4532 4533 static void ath12k_ahvif_put_link_key_cache(struct ath12k_vif_cache *cache) 4534 { 4535 struct ath12k_key_conf *key_conf, *tmp; 4536 4537 if (!cache || list_empty(&cache->key_conf.list)) 4538 return; 4539 list_for_each_entry_safe(key_conf, tmp, &cache->key_conf.list, list) { 4540 list_del(&key_conf->list); 4541 kfree(key_conf); 4542 } 4543 } 4544 4545 static void ath12k_ahvif_put_link_cache(struct ath12k_vif *ahvif, u8 link_id) 4546 { 4547 if (link_id >= IEEE80211_MLD_MAX_NUM_LINKS) 4548 return; 4549 4550 ath12k_ahvif_put_link_key_cache(ahvif->cache[link_id]); 4551 kfree(ahvif->cache[link_id]); 4552 ahvif->cache[link_id] = NULL; 4553 } 4554 4555 static void ath12k_mac_op_link_info_changed(struct ieee80211_hw *hw, 4556 struct ieee80211_vif *vif, 4557 struct ieee80211_bss_conf *info, 4558 u64 changed) 4559 { 4560 struct ath12k *ar; 4561 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 4562 struct ath12k_vif_cache *cache; 4563 struct ath12k_link_vif *arvif; 4564 u8 link_id = info->link_id; 4565 4566 lockdep_assert_wiphy(hw->wiphy); 4567 4568 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 4569 4570 /* if the vdev is not created on a certain radio, 4571 * cache the info to be updated later on vdev creation 4572 */ 4573 4574 if (!arvif || !arvif->is_created) { 4575 cache = ath12k_ahvif_get_link_cache(ahvif, link_id); 4576 if (!cache) 4577 return; 4578 4579 cache->bss_conf_changed |= changed; 4580 4581 return; 4582 } 4583 4584 ar = arvif->ar; 4585 4586 ath12k_mac_bss_info_changed(ar, arvif, info, changed); 4587 } 4588 4589 static struct ath12k* 4590 ath12k_mac_select_scan_device(struct ieee80211_hw *hw, 4591 struct ieee80211_vif *vif, 4592 u32 center_freq) 4593 { 4594 struct ath12k_hw *ah = hw->priv; 4595 enum nl80211_band band; 4596 struct ath12k *ar; 4597 int i; 4598 4599 if (ah->num_radio == 1) 4600 return ah->radio; 4601 4602 /* Currently mac80211 supports splitting scan requests into 4603 * multiple scan requests per band. 4604 * Loop through first channel and determine the scan radio 4605 * TODO: There could be 5 GHz low/high channels in that case 4606 * split the hw request and perform multiple scans 4607 */ 4608 4609 if (center_freq < ATH12K_MIN_5GHZ_FREQ) 4610 band = NL80211_BAND_2GHZ; 4611 else if (center_freq < ATH12K_MIN_6GHZ_FREQ) 4612 band = NL80211_BAND_5GHZ; 4613 else 4614 band = NL80211_BAND_6GHZ; 4615 4616 for_each_ar(ah, ar, i) { 4617 if (ar->mac.sbands[band].channels && 4618 center_freq >= KHZ_TO_MHZ(ar->freq_range.start_freq) && 4619 center_freq <= KHZ_TO_MHZ(ar->freq_range.end_freq)) 4620 return ar; 4621 } 4622 4623 return NULL; 4624 } 4625 4626 void __ath12k_mac_scan_finish(struct ath12k *ar) 4627 { 4628 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar); 4629 4630 lockdep_assert_held(&ar->data_lock); 4631 4632 switch (ar->scan.state) { 4633 case ATH12K_SCAN_IDLE: 4634 break; 4635 case ATH12K_SCAN_RUNNING: 4636 case ATH12K_SCAN_ABORTING: 4637 if (ar->scan.is_roc && ar->scan.roc_notify) 4638 ieee80211_remain_on_channel_expired(hw); 4639 fallthrough; 4640 case ATH12K_SCAN_STARTING: 4641 cancel_delayed_work(&ar->scan.timeout); 4642 complete_all(&ar->scan.completed); 4643 wiphy_work_queue(ar->ah->hw->wiphy, &ar->scan.vdev_clean_wk); 4644 break; 4645 } 4646 } 4647 4648 void ath12k_mac_scan_finish(struct ath12k *ar) 4649 { 4650 spin_lock_bh(&ar->data_lock); 4651 __ath12k_mac_scan_finish(ar); 4652 spin_unlock_bh(&ar->data_lock); 4653 } 4654 4655 static int ath12k_scan_stop(struct ath12k *ar) 4656 { 4657 struct ath12k_wmi_scan_cancel_arg arg = { 4658 .req_type = WLAN_SCAN_CANCEL_SINGLE, 4659 .scan_id = ATH12K_SCAN_ID, 4660 }; 4661 int ret; 4662 4663 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 4664 4665 /* TODO: Fill other STOP Params */ 4666 arg.pdev_id = ar->pdev->pdev_id; 4667 4668 ret = ath12k_wmi_send_scan_stop_cmd(ar, &arg); 4669 if (ret) { 4670 ath12k_warn(ar->ab, "failed to stop wmi scan: %d\n", ret); 4671 goto out; 4672 } 4673 4674 ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ); 4675 if (ret == 0) { 4676 ath12k_warn(ar->ab, 4677 "failed to receive scan abort comple: timed out\n"); 4678 ret = -ETIMEDOUT; 4679 } else if (ret > 0) { 4680 ret = 0; 4681 } 4682 4683 out: 4684 /* Scan state should be updated in scan completion worker but in 4685 * case firmware fails to deliver the event (for whatever reason) 4686 * it is desired to clean up scan state anyway. Firmware may have 4687 * just dropped the scan completion event delivery due to transport 4688 * pipe being overflown with data and/or it can recover on its own 4689 * before next scan request is submitted. 4690 */ 4691 spin_lock_bh(&ar->data_lock); 4692 if (ret) 4693 __ath12k_mac_scan_finish(ar); 4694 spin_unlock_bh(&ar->data_lock); 4695 4696 return ret; 4697 } 4698 4699 static void ath12k_scan_abort(struct ath12k *ar) 4700 { 4701 int ret; 4702 4703 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 4704 4705 spin_lock_bh(&ar->data_lock); 4706 4707 switch (ar->scan.state) { 4708 case ATH12K_SCAN_IDLE: 4709 /* This can happen if timeout worker kicked in and called 4710 * abortion while scan completion was being processed. 4711 */ 4712 break; 4713 case ATH12K_SCAN_STARTING: 4714 case ATH12K_SCAN_ABORTING: 4715 ath12k_warn(ar->ab, "refusing scan abortion due to invalid scan state: %d\n", 4716 ar->scan.state); 4717 break; 4718 case ATH12K_SCAN_RUNNING: 4719 ar->scan.state = ATH12K_SCAN_ABORTING; 4720 spin_unlock_bh(&ar->data_lock); 4721 4722 ret = ath12k_scan_stop(ar); 4723 if (ret) 4724 ath12k_warn(ar->ab, "failed to abort scan: %d\n", ret); 4725 4726 spin_lock_bh(&ar->data_lock); 4727 break; 4728 } 4729 4730 spin_unlock_bh(&ar->data_lock); 4731 } 4732 4733 static void ath12k_scan_timeout_work(struct work_struct *work) 4734 { 4735 struct ath12k *ar = container_of(work, struct ath12k, 4736 scan.timeout.work); 4737 4738 wiphy_lock(ath12k_ar_to_hw(ar)->wiphy); 4739 ath12k_scan_abort(ar); 4740 wiphy_unlock(ath12k_ar_to_hw(ar)->wiphy); 4741 } 4742 4743 static void ath12k_mac_scan_send_complete(struct ath12k *ar, 4744 struct cfg80211_scan_info *info) 4745 { 4746 struct ath12k_hw *ah = ar->ah; 4747 struct ath12k *partner_ar; 4748 int i; 4749 4750 lockdep_assert_wiphy(ah->hw->wiphy); 4751 4752 for_each_ar(ah, partner_ar, i) 4753 if (partner_ar != ar && 4754 partner_ar->scan.state == ATH12K_SCAN_RUNNING) 4755 return; 4756 4757 ieee80211_scan_completed(ah->hw, info); 4758 } 4759 4760 static void ath12k_scan_vdev_clean_work(struct wiphy *wiphy, struct wiphy_work *work) 4761 { 4762 struct ath12k *ar = container_of(work, struct ath12k, 4763 scan.vdev_clean_wk); 4764 struct ath12k_hw *ah = ar->ah; 4765 struct ath12k_link_vif *arvif; 4766 4767 lockdep_assert_wiphy(wiphy); 4768 4769 arvif = ar->scan.arvif; 4770 4771 /* The scan vdev has already been deleted. This can occur when a 4772 * new scan request is made on the same vif with a different 4773 * frequency, causing the scan arvif to move from one radio to 4774 * another. Or, scan was abrupted and via remove interface, the 4775 * arvif is already deleted. Alternatively, if the scan vdev is not 4776 * being used as an actual vdev, then do not delete it. 4777 */ 4778 if (!arvif || arvif->is_started) 4779 goto work_complete; 4780 4781 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac clean scan vdev (link id %u)", 4782 arvif->link_id); 4783 4784 ath12k_mac_remove_link_interface(ah->hw, arvif); 4785 ath12k_mac_unassign_link_vif(arvif); 4786 4787 work_complete: 4788 spin_lock_bh(&ar->data_lock); 4789 ar->scan.arvif = NULL; 4790 if (!ar->scan.is_roc) { 4791 struct cfg80211_scan_info info = { 4792 .aborted = ((ar->scan.state == 4793 ATH12K_SCAN_ABORTING) || 4794 (ar->scan.state == 4795 ATH12K_SCAN_STARTING)), 4796 }; 4797 4798 ath12k_mac_scan_send_complete(ar, &info); 4799 } 4800 4801 ar->scan.state = ATH12K_SCAN_IDLE; 4802 ar->scan_channel = NULL; 4803 ar->scan.roc_freq = 0; 4804 spin_unlock_bh(&ar->data_lock); 4805 } 4806 4807 static int ath12k_start_scan(struct ath12k *ar, 4808 struct ath12k_wmi_scan_req_arg *arg) 4809 { 4810 int ret; 4811 4812 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 4813 4814 ret = ath12k_wmi_send_scan_start_cmd(ar, arg); 4815 if (ret) 4816 return ret; 4817 4818 ret = wait_for_completion_timeout(&ar->scan.started, 1 * HZ); 4819 if (ret == 0) { 4820 ret = ath12k_scan_stop(ar); 4821 if (ret) 4822 ath12k_warn(ar->ab, "failed to stop scan: %d\n", ret); 4823 4824 return -ETIMEDOUT; 4825 } 4826 4827 /* If we failed to start the scan, return error code at 4828 * this point. This is probably due to some issue in the 4829 * firmware, but no need to wedge the driver due to that... 4830 */ 4831 spin_lock_bh(&ar->data_lock); 4832 if (ar->scan.state == ATH12K_SCAN_IDLE) { 4833 spin_unlock_bh(&ar->data_lock); 4834 return -EINVAL; 4835 } 4836 spin_unlock_bh(&ar->data_lock); 4837 4838 return 0; 4839 } 4840 4841 int ath12k_mac_get_fw_stats(struct ath12k *ar, 4842 struct ath12k_fw_stats_req_params *param) 4843 { 4844 struct ath12k_base *ab = ar->ab; 4845 struct ath12k_hw *ah = ath12k_ar_to_ah(ar); 4846 unsigned long time_left; 4847 int ret; 4848 4849 guard(mutex)(&ah->hw_mutex); 4850 4851 if (ah->state != ATH12K_HW_STATE_ON) 4852 return -ENETDOWN; 4853 4854 ath12k_fw_stats_reset(ar); 4855 4856 reinit_completion(&ar->fw_stats_complete); 4857 reinit_completion(&ar->fw_stats_done); 4858 4859 ret = ath12k_wmi_send_stats_request_cmd(ar, param->stats_id, 4860 param->vdev_id, param->pdev_id); 4861 if (ret) { 4862 ath12k_warn(ab, "failed to request fw stats: %d\n", ret); 4863 return ret; 4864 } 4865 4866 ath12k_dbg(ab, ATH12K_DBG_WMI, 4867 "get fw stat pdev id %d vdev id %d stats id 0x%x\n", 4868 param->pdev_id, param->vdev_id, param->stats_id); 4869 4870 time_left = wait_for_completion_timeout(&ar->fw_stats_complete, 1 * HZ); 4871 if (!time_left) { 4872 ath12k_warn(ab, "time out while waiting for get fw stats\n"); 4873 return -ETIMEDOUT; 4874 } 4875 4876 /* Firmware sends WMI_UPDATE_STATS_EVENTID back-to-back 4877 * when stats data buffer limit is reached. fw_stats_complete 4878 * is completed once host receives first event from firmware, but 4879 * still there could be more events following. Below is to wait 4880 * until firmware completes sending all the events. 4881 */ 4882 time_left = wait_for_completion_timeout(&ar->fw_stats_done, 3 * HZ); 4883 if (!time_left) { 4884 ath12k_warn(ab, "time out while waiting for fw stats done\n"); 4885 return -ETIMEDOUT; 4886 } 4887 4888 return 0; 4889 } 4890 4891 static int ath12k_mac_op_get_txpower(struct ieee80211_hw *hw, 4892 struct ieee80211_vif *vif, 4893 unsigned int link_id, 4894 int *dbm) 4895 { 4896 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 4897 struct ath12k_fw_stats_req_params params = {}; 4898 struct ath12k_fw_stats_pdev *pdev; 4899 struct ath12k_hw *ah = hw->priv; 4900 struct ath12k_link_vif *arvif; 4901 struct ath12k_base *ab; 4902 struct ath12k *ar; 4903 int ret; 4904 4905 /* Final Tx power is minimum of Target Power, CTL power, Regulatory 4906 * Power, PSD EIRP Power. We just know the Regulatory power from the 4907 * regulatory rules obtained. FW knows all these power and sets the min 4908 * of these. Hence, we request the FW pdev stats in which FW reports 4909 * the minimum of all vdev's channel Tx power. 4910 */ 4911 lockdep_assert_wiphy(hw->wiphy); 4912 4913 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]); 4914 if (!arvif || !arvif->ar) 4915 return -EINVAL; 4916 4917 ar = arvif->ar; 4918 ab = ar->ab; 4919 if (ah->state != ATH12K_HW_STATE_ON) 4920 goto err_fallback; 4921 4922 if (test_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags)) 4923 return -EAGAIN; 4924 4925 /* Limit the requests to Firmware for fetching the tx power */ 4926 if (ar->chan_tx_pwr != ATH12K_PDEV_TX_POWER_INVALID && 4927 time_before(jiffies, 4928 msecs_to_jiffies(ATH12K_PDEV_TX_POWER_REFRESH_TIME_MSECS) + 4929 ar->last_tx_power_update)) 4930 goto send_tx_power; 4931 4932 params.pdev_id = ar->pdev->pdev_id; 4933 params.vdev_id = arvif->vdev_id; 4934 params.stats_id = WMI_REQUEST_PDEV_STAT; 4935 ret = ath12k_mac_get_fw_stats(ar, ¶ms); 4936 if (ret) { 4937 ath12k_warn(ab, "failed to request fw pdev stats: %d\n", ret); 4938 goto err_fallback; 4939 } 4940 4941 spin_lock_bh(&ar->data_lock); 4942 pdev = list_first_entry_or_null(&ar->fw_stats.pdevs, 4943 struct ath12k_fw_stats_pdev, list); 4944 if (!pdev) { 4945 spin_unlock_bh(&ar->data_lock); 4946 goto err_fallback; 4947 } 4948 4949 /* tx power reported by firmware is in units of 0.5 dBm */ 4950 ar->chan_tx_pwr = pdev->chan_tx_power / 2; 4951 spin_unlock_bh(&ar->data_lock); 4952 ar->last_tx_power_update = jiffies; 4953 4954 send_tx_power: 4955 *dbm = ar->chan_tx_pwr; 4956 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "txpower fetched from firmware %d dBm\n", 4957 *dbm); 4958 return 0; 4959 4960 err_fallback: 4961 /* We didn't get txpower from FW. Hence, relying on vif->bss_conf.txpower */ 4962 *dbm = vif->bss_conf.txpower; 4963 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "txpower from firmware NaN, reported %d dBm\n", 4964 *dbm); 4965 return 0; 4966 } 4967 4968 static u8 4969 ath12k_mac_find_link_id_by_ar(struct ath12k_vif *ahvif, struct ath12k *ar) 4970 { 4971 struct ath12k_link_vif *arvif; 4972 struct ath12k_hw *ah = ahvif->ah; 4973 unsigned long links = ahvif->links_map; 4974 unsigned long scan_links_map; 4975 u8 link_id; 4976 4977 lockdep_assert_wiphy(ah->hw->wiphy); 4978 4979 for_each_set_bit(link_id, &links, ATH12K_NUM_MAX_LINKS) { 4980 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]); 4981 4982 if (!arvif || !arvif->is_created) 4983 continue; 4984 4985 if (ar == arvif->ar) 4986 return link_id; 4987 } 4988 4989 /* input ar is not assigned to any of the links of ML VIF, use next 4990 * available scan link for scan vdev creation. There are cases where 4991 * single scan req needs to be split in driver and initiate separate 4992 * scan requests to firmware based on device. 4993 */ 4994 4995 /* Unset all non-scan links (0-14) of scan_links_map so that ffs() will 4996 * choose an available link among scan links (i.e link id >= 15) 4997 */ 4998 scan_links_map = ~ahvif->links_map & ATH12K_SCAN_LINKS_MASK; 4999 if (scan_links_map) 5000 return __ffs(scan_links_map); 5001 5002 return ATH12K_FIRST_SCAN_LINK; 5003 } 5004 5005 static int ath12k_mac_initiate_hw_scan(struct ieee80211_hw *hw, 5006 struct ieee80211_vif *vif, 5007 struct ieee80211_scan_request *hw_req, 5008 int n_channels, 5009 struct ieee80211_channel **chan_list, 5010 struct ath12k *ar) 5011 { 5012 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 5013 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 5014 struct ath12k_link_vif *arvif; 5015 struct cfg80211_scan_request *req = &hw_req->req; 5016 struct ath12k_wmi_scan_req_arg *arg = NULL; 5017 u8 link_id; 5018 int ret; 5019 int i; 5020 bool create = true; 5021 5022 lockdep_assert_wiphy(hw->wiphy); 5023 5024 arvif = &ahvif->deflink; 5025 5026 /* check if any of the links of ML VIF is already started on 5027 * radio(ar) corresponding to given scan frequency and use it, 5028 * if not use scan link (link id >= 15) for scan purpose. 5029 */ 5030 link_id = ath12k_mac_find_link_id_by_ar(ahvif, ar); 5031 /* All scan links are occupied. ideally this shouldn't happen as 5032 * mac80211 won't schedule scan for same band until ongoing scan is 5033 * completed, don't try to exceed max links just in case if it happens. 5034 */ 5035 if (link_id >= ATH12K_NUM_MAX_LINKS) 5036 return -EBUSY; 5037 5038 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id); 5039 5040 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac link ID %d selected for scan", 5041 arvif->link_id); 5042 5043 /* If the vif is already assigned to a specific vdev of an ar, 5044 * check whether its already started, vdev which is started 5045 * are not allowed to switch to a new radio. 5046 * If the vdev is not started, but was earlier created on a 5047 * different ar, delete that vdev and create a new one. We don't 5048 * delete at the scan stop as an optimization to avoid redundant 5049 * delete-create vdev's for the same ar, in case the request is 5050 * always on the same band for the vif 5051 */ 5052 if (arvif->is_created) { 5053 if (WARN_ON(!arvif->ar)) 5054 return -EINVAL; 5055 5056 if (ar != arvif->ar && arvif->is_started) 5057 return -EINVAL; 5058 5059 if (ar != arvif->ar) { 5060 ath12k_mac_remove_link_interface(hw, arvif); 5061 ath12k_mac_unassign_link_vif(arvif); 5062 } else { 5063 create = false; 5064 } 5065 } 5066 5067 if (create) { 5068 /* Previous arvif would've been cleared in radio switch block 5069 * above, assign arvif again for create. 5070 */ 5071 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id); 5072 5073 ret = ath12k_mac_vdev_create(ar, arvif); 5074 if (ret) { 5075 ath12k_warn(ar->ab, "unable to create scan vdev %d\n", ret); 5076 return -EINVAL; 5077 } 5078 } 5079 5080 spin_lock_bh(&ar->data_lock); 5081 switch (ar->scan.state) { 5082 case ATH12K_SCAN_IDLE: 5083 reinit_completion(&ar->scan.started); 5084 reinit_completion(&ar->scan.completed); 5085 ar->scan.state = ATH12K_SCAN_STARTING; 5086 ar->scan.is_roc = false; 5087 ar->scan.arvif = arvif; 5088 ret = 0; 5089 break; 5090 case ATH12K_SCAN_STARTING: 5091 case ATH12K_SCAN_RUNNING: 5092 case ATH12K_SCAN_ABORTING: 5093 ret = -EBUSY; 5094 break; 5095 } 5096 spin_unlock_bh(&ar->data_lock); 5097 5098 if (ret) 5099 goto exit; 5100 5101 arg = kzalloc(sizeof(*arg), GFP_KERNEL); 5102 if (!arg) { 5103 ret = -ENOMEM; 5104 goto exit; 5105 } 5106 5107 ath12k_wmi_start_scan_init(ar, arg); 5108 arg->vdev_id = arvif->vdev_id; 5109 arg->scan_id = ATH12K_SCAN_ID; 5110 5111 if (req->ie_len) { 5112 arg->extraie.ptr = kmemdup(req->ie, req->ie_len, GFP_KERNEL); 5113 if (!arg->extraie.ptr) { 5114 ret = -ENOMEM; 5115 goto exit; 5116 } 5117 arg->extraie.len = req->ie_len; 5118 } 5119 5120 if (req->n_ssids) { 5121 arg->num_ssids = req->n_ssids; 5122 for (i = 0; i < arg->num_ssids; i++) 5123 arg->ssid[i] = req->ssids[i]; 5124 } else { 5125 arg->scan_f_passive = 1; 5126 } 5127 5128 if (n_channels) { 5129 arg->num_chan = n_channels; 5130 arg->chan_list = kcalloc(arg->num_chan, sizeof(*arg->chan_list), 5131 GFP_KERNEL); 5132 if (!arg->chan_list) { 5133 ret = -ENOMEM; 5134 goto exit; 5135 } 5136 5137 for (i = 0; i < arg->num_chan; i++) 5138 arg->chan_list[i] = chan_list[i]->center_freq; 5139 } 5140 5141 ret = ath12k_start_scan(ar, arg); 5142 if (ret) { 5143 if (ret == -EBUSY) 5144 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 5145 "scan engine is busy 11d state %d\n", ar->state_11d); 5146 else 5147 ath12k_warn(ar->ab, "failed to start hw scan: %d\n", ret); 5148 5149 spin_lock_bh(&ar->data_lock); 5150 ar->scan.state = ATH12K_SCAN_IDLE; 5151 spin_unlock_bh(&ar->data_lock); 5152 goto exit; 5153 } 5154 5155 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac scan started"); 5156 5157 /* Add a margin to account for event/command processing */ 5158 ieee80211_queue_delayed_work(ath12k_ar_to_hw(ar), &ar->scan.timeout, 5159 msecs_to_jiffies(arg->max_scan_time + 5160 ATH12K_MAC_SCAN_TIMEOUT_MSECS)); 5161 5162 exit: 5163 if (arg) { 5164 kfree(arg->chan_list); 5165 kfree(arg->extraie.ptr); 5166 kfree(arg); 5167 } 5168 5169 if (ar->state_11d == ATH12K_11D_PREPARING && 5170 ahvif->vdev_type == WMI_VDEV_TYPE_STA && 5171 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) 5172 ath12k_mac_11d_scan_start(ar, arvif->vdev_id); 5173 5174 return ret; 5175 } 5176 5177 static int ath12k_mac_op_hw_scan(struct ieee80211_hw *hw, 5178 struct ieee80211_vif *vif, 5179 struct ieee80211_scan_request *hw_req) 5180 { 5181 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 5182 struct ieee80211_channel **chan_list, *chan; 5183 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 5184 unsigned long links_map, link_id; 5185 struct ath12k_link_vif *arvif; 5186 struct ath12k *ar, *scan_ar; 5187 int i, j, ret = 0; 5188 5189 lockdep_assert_wiphy(hw->wiphy); 5190 5191 chan_list = kcalloc(hw_req->req.n_channels, sizeof(*chan_list), GFP_KERNEL); 5192 if (!chan_list) 5193 return -ENOMEM; 5194 5195 /* There could be channels that belong to multiple underlying radio 5196 * in same scan request as mac80211 sees it as single band. In that 5197 * case split the hw_req based on frequency range and schedule scans to 5198 * corresponding radio. 5199 */ 5200 for_each_ar(ah, ar, i) { 5201 int n_chans = 0; 5202 5203 for (j = 0; j < hw_req->req.n_channels; j++) { 5204 chan = hw_req->req.channels[j]; 5205 scan_ar = ath12k_mac_select_scan_device(hw, vif, 5206 chan->center_freq); 5207 if (!scan_ar) { 5208 ath12k_hw_warn(ah, "unable to select scan device for freq %d\n", 5209 chan->center_freq); 5210 ret = -EINVAL; 5211 goto abort; 5212 } 5213 if (ar != scan_ar) 5214 continue; 5215 5216 chan_list[n_chans++] = chan; 5217 } 5218 if (n_chans) { 5219 ret = ath12k_mac_initiate_hw_scan(hw, vif, hw_req, n_chans, 5220 chan_list, ar); 5221 if (ret) 5222 goto abort; 5223 } 5224 } 5225 abort: 5226 /* If any of the parallel scans initiated fails, abort all and 5227 * remove the scan interfaces created. Return complete scan 5228 * failure as mac80211 assumes this as single scan request. 5229 */ 5230 if (ret) { 5231 ath12k_hw_warn(ah, "Scan failed %d , cleanup all scan vdevs\n", ret); 5232 links_map = ahvif->links_map; 5233 for_each_set_bit(link_id, &links_map, ATH12K_NUM_MAX_LINKS) { 5234 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 5235 if (!arvif) 5236 continue; 5237 5238 ar = arvif->ar; 5239 if (ar->scan.arvif == arvif) { 5240 wiphy_work_cancel(hw->wiphy, &ar->scan.vdev_clean_wk); 5241 spin_lock_bh(&ar->data_lock); 5242 ar->scan.arvif = NULL; 5243 ar->scan.state = ATH12K_SCAN_IDLE; 5244 ar->scan_channel = NULL; 5245 ar->scan.roc_freq = 0; 5246 spin_unlock_bh(&ar->data_lock); 5247 } 5248 if (link_id >= ATH12K_FIRST_SCAN_LINK) { 5249 ath12k_mac_remove_link_interface(hw, arvif); 5250 ath12k_mac_unassign_link_vif(arvif); 5251 } 5252 } 5253 } 5254 kfree(chan_list); 5255 return ret; 5256 } 5257 5258 static void ath12k_mac_op_cancel_hw_scan(struct ieee80211_hw *hw, 5259 struct ieee80211_vif *vif) 5260 { 5261 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 5262 unsigned long link_id, links_map = ahvif->links_map; 5263 struct ath12k_link_vif *arvif; 5264 struct ath12k *ar; 5265 5266 lockdep_assert_wiphy(hw->wiphy); 5267 5268 for_each_set_bit(link_id, &links_map, ATH12K_NUM_MAX_LINKS) { 5269 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 5270 if (!arvif || arvif->is_started) 5271 continue; 5272 5273 ar = arvif->ar; 5274 5275 ath12k_scan_abort(ar); 5276 5277 cancel_delayed_work_sync(&ar->scan.timeout); 5278 } 5279 } 5280 5281 static int ath12k_install_key(struct ath12k_link_vif *arvif, 5282 struct ieee80211_key_conf *key, 5283 enum set_key_cmd cmd, 5284 const u8 *macaddr, u32 flags) 5285 { 5286 int ret; 5287 struct ath12k *ar = arvif->ar; 5288 struct wmi_vdev_install_key_arg arg = { 5289 .vdev_id = arvif->vdev_id, 5290 .key_idx = key->keyidx, 5291 .key_len = key->keylen, 5292 .key_data = key->key, 5293 .key_flags = flags, 5294 .ieee80211_key_cipher = key->cipher, 5295 .macaddr = macaddr, 5296 }; 5297 struct ath12k_vif *ahvif = arvif->ahvif; 5298 5299 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 5300 5301 if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags)) 5302 return 0; 5303 5304 if (cmd == DISABLE_KEY) { 5305 /* TODO: Check if FW expects value other than NONE for del */ 5306 /* arg.key_cipher = WMI_CIPHER_NONE; */ 5307 arg.key_len = 0; 5308 arg.key_data = NULL; 5309 goto check_order; 5310 } 5311 5312 switch (key->cipher) { 5313 case WLAN_CIPHER_SUITE_CCMP: 5314 case WLAN_CIPHER_SUITE_CCMP_256: 5315 arg.key_cipher = WMI_CIPHER_AES_CCM; 5316 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT; 5317 break; 5318 case WLAN_CIPHER_SUITE_TKIP: 5319 arg.key_cipher = WMI_CIPHER_TKIP; 5320 arg.key_txmic_len = 8; 5321 arg.key_rxmic_len = 8; 5322 break; 5323 case WLAN_CIPHER_SUITE_GCMP: 5324 case WLAN_CIPHER_SUITE_GCMP_256: 5325 arg.key_cipher = WMI_CIPHER_AES_GCM; 5326 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT; 5327 break; 5328 case WLAN_CIPHER_SUITE_AES_CMAC: 5329 arg.key_cipher = WMI_CIPHER_AES_CMAC; 5330 break; 5331 case WLAN_CIPHER_SUITE_BIP_GMAC_128: 5332 case WLAN_CIPHER_SUITE_BIP_GMAC_256: 5333 arg.key_cipher = WMI_CIPHER_AES_GMAC; 5334 break; 5335 case WLAN_CIPHER_SUITE_BIP_CMAC_256: 5336 arg.key_cipher = WMI_CIPHER_AES_CMAC; 5337 break; 5338 default: 5339 ath12k_warn(ar->ab, "cipher %d is not supported\n", key->cipher); 5340 return -EOPNOTSUPP; 5341 } 5342 5343 if (test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags)) 5344 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV | 5345 IEEE80211_KEY_FLAG_RESERVE_TAILROOM; 5346 5347 check_order: 5348 if (ahvif->vdev_type == WMI_VDEV_TYPE_STA && 5349 arg.key_flags == WMI_KEY_GROUP) { 5350 if (cmd == SET_KEY) { 5351 if (arvif->pairwise_key_done) { 5352 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 5353 "vdev %u pairwise key done, go install group key\n", 5354 arg.vdev_id); 5355 goto install; 5356 } else { 5357 /* WCN7850 firmware requires pairwise key to be installed 5358 * before group key. In case group key comes first, cache 5359 * it and return. Will revisit it once pairwise key gets 5360 * installed. 5361 */ 5362 arvif->group_key = arg; 5363 arvif->group_key_valid = true; 5364 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 5365 "vdev %u group key before pairwise key, cache and skip\n", 5366 arg.vdev_id); 5367 5368 ret = 0; 5369 goto out; 5370 } 5371 } else { 5372 arvif->group_key_valid = false; 5373 } 5374 } 5375 5376 install: 5377 reinit_completion(&ar->install_key_done); 5378 5379 ret = ath12k_wmi_vdev_install_key(arvif->ar, &arg); 5380 if (ret) 5381 return ret; 5382 5383 if (!wait_for_completion_timeout(&ar->install_key_done, 1 * HZ)) 5384 return -ETIMEDOUT; 5385 5386 if (ether_addr_equal(arg.macaddr, arvif->bssid)) 5387 ahvif->key_cipher = arg.ieee80211_key_cipher; 5388 5389 if (ar->install_key_status) { 5390 ret = -EINVAL; 5391 goto out; 5392 } 5393 5394 if (ahvif->vdev_type == WMI_VDEV_TYPE_STA && 5395 arg.key_flags == WMI_KEY_PAIRWISE) { 5396 if (cmd == SET_KEY) { 5397 arvif->pairwise_key_done = true; 5398 if (arvif->group_key_valid) { 5399 /* Install cached GTK */ 5400 arvif->group_key_valid = false; 5401 arg = arvif->group_key; 5402 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 5403 "vdev %u pairwise key done, group key ready, go install\n", 5404 arg.vdev_id); 5405 goto install; 5406 } 5407 } else { 5408 arvif->pairwise_key_done = false; 5409 } 5410 } 5411 5412 out: 5413 if (ret) { 5414 /* In case of failure userspace may not do DISABLE_KEY 5415 * but triggers re-connection directly, so manually reset 5416 * status here. 5417 */ 5418 arvif->group_key_valid = false; 5419 arvif->pairwise_key_done = false; 5420 } 5421 5422 return ret; 5423 } 5424 5425 static int ath12k_clear_peer_keys(struct ath12k_link_vif *arvif, 5426 const u8 *addr) 5427 { 5428 struct ath12k *ar = arvif->ar; 5429 struct ath12k_base *ab = ar->ab; 5430 struct ath12k_peer *peer; 5431 int first_errno = 0; 5432 int ret; 5433 int i; 5434 u32 flags = 0; 5435 5436 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 5437 5438 spin_lock_bh(&ab->base_lock); 5439 peer = ath12k_peer_find(ab, arvif->vdev_id, addr); 5440 spin_unlock_bh(&ab->base_lock); 5441 5442 if (!peer) 5443 return -ENOENT; 5444 5445 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) { 5446 if (!peer->keys[i]) 5447 continue; 5448 5449 /* key flags are not required to delete the key */ 5450 ret = ath12k_install_key(arvif, peer->keys[i], 5451 DISABLE_KEY, addr, flags); 5452 if (ret < 0 && first_errno == 0) 5453 first_errno = ret; 5454 5455 if (ret < 0) 5456 ath12k_warn(ab, "failed to remove peer key %d: %d\n", 5457 i, ret); 5458 5459 spin_lock_bh(&ab->base_lock); 5460 peer->keys[i] = NULL; 5461 spin_unlock_bh(&ab->base_lock); 5462 } 5463 5464 return first_errno; 5465 } 5466 5467 static int ath12k_mac_set_key(struct ath12k *ar, enum set_key_cmd cmd, 5468 struct ath12k_link_vif *arvif, 5469 struct ath12k_link_sta *arsta, 5470 struct ieee80211_key_conf *key) 5471 { 5472 struct ieee80211_sta *sta = NULL; 5473 struct ath12k_base *ab = ar->ab; 5474 struct ath12k_peer *peer; 5475 struct ath12k_sta *ahsta; 5476 const u8 *peer_addr; 5477 int ret; 5478 u32 flags = 0; 5479 5480 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 5481 5482 if (arsta) 5483 sta = ath12k_ahsta_to_sta(arsta->ahsta); 5484 5485 if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ab->dev_flags)) 5486 return 1; 5487 5488 if (sta) 5489 peer_addr = arsta->addr; 5490 else 5491 peer_addr = arvif->bssid; 5492 5493 key->hw_key_idx = key->keyidx; 5494 5495 /* the peer should not disappear in mid-way (unless FW goes awry) since 5496 * we already hold wiphy lock. we just make sure its there now. 5497 */ 5498 spin_lock_bh(&ab->base_lock); 5499 peer = ath12k_peer_find(ab, arvif->vdev_id, peer_addr); 5500 spin_unlock_bh(&ab->base_lock); 5501 5502 if (!peer) { 5503 if (cmd == SET_KEY) { 5504 ath12k_warn(ab, "cannot install key for non-existent peer %pM\n", 5505 peer_addr); 5506 return -EOPNOTSUPP; 5507 } 5508 5509 /* if the peer doesn't exist there is no key to disable 5510 * anymore 5511 */ 5512 return 0; 5513 } 5514 5515 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) 5516 flags = WMI_KEY_PAIRWISE; 5517 else 5518 flags = WMI_KEY_GROUP; 5519 5520 ret = ath12k_install_key(arvif, key, cmd, peer_addr, flags); 5521 if (ret) { 5522 ath12k_warn(ab, "ath12k_install_key failed (%d)\n", ret); 5523 return ret; 5524 } 5525 5526 ret = ath12k_dp_rx_peer_pn_replay_config(arvif, peer_addr, cmd, key); 5527 if (ret) { 5528 ath12k_warn(ab, "failed to offload PN replay detection %d\n", ret); 5529 return ret; 5530 } 5531 5532 spin_lock_bh(&ab->base_lock); 5533 peer = ath12k_peer_find(ab, arvif->vdev_id, peer_addr); 5534 if (peer && cmd == SET_KEY) { 5535 peer->keys[key->keyidx] = key; 5536 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) { 5537 peer->ucast_keyidx = key->keyidx; 5538 peer->sec_type = ath12k_dp_tx_get_encrypt_type(key->cipher); 5539 } else { 5540 peer->mcast_keyidx = key->keyidx; 5541 peer->sec_type_grp = ath12k_dp_tx_get_encrypt_type(key->cipher); 5542 } 5543 } else if (peer && cmd == DISABLE_KEY) { 5544 peer->keys[key->keyidx] = NULL; 5545 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) 5546 peer->ucast_keyidx = 0; 5547 else 5548 peer->mcast_keyidx = 0; 5549 } else if (!peer) 5550 /* impossible unless FW goes crazy */ 5551 ath12k_warn(ab, "peer %pM disappeared!\n", peer_addr); 5552 5553 if (sta) { 5554 ahsta = ath12k_sta_to_ahsta(sta); 5555 5556 switch (key->cipher) { 5557 case WLAN_CIPHER_SUITE_TKIP: 5558 case WLAN_CIPHER_SUITE_CCMP: 5559 case WLAN_CIPHER_SUITE_CCMP_256: 5560 case WLAN_CIPHER_SUITE_GCMP: 5561 case WLAN_CIPHER_SUITE_GCMP_256: 5562 if (cmd == SET_KEY) 5563 ahsta->pn_type = HAL_PN_TYPE_WPA; 5564 else 5565 ahsta->pn_type = HAL_PN_TYPE_NONE; 5566 break; 5567 default: 5568 ahsta->pn_type = HAL_PN_TYPE_NONE; 5569 break; 5570 } 5571 } 5572 5573 spin_unlock_bh(&ab->base_lock); 5574 5575 return 0; 5576 } 5577 5578 static int ath12k_mac_update_key_cache(struct ath12k_vif_cache *cache, 5579 enum set_key_cmd cmd, 5580 struct ieee80211_sta *sta, 5581 struct ieee80211_key_conf *key) 5582 { 5583 struct ath12k_key_conf *key_conf, *tmp; 5584 5585 list_for_each_entry_safe(key_conf, tmp, &cache->key_conf.list, list) { 5586 if (key_conf->key != key) 5587 continue; 5588 5589 /* If SET key entry is already present in cache, nothing to do, 5590 * just return 5591 */ 5592 if (cmd == SET_KEY) 5593 return 0; 5594 5595 /* DEL key for an old SET key which driver hasn't flushed yet. 5596 */ 5597 list_del(&key_conf->list); 5598 kfree(key_conf); 5599 } 5600 5601 if (cmd == SET_KEY) { 5602 key_conf = kzalloc(sizeof(*key_conf), GFP_KERNEL); 5603 5604 if (!key_conf) 5605 return -ENOMEM; 5606 5607 key_conf->cmd = cmd; 5608 key_conf->sta = sta; 5609 key_conf->key = key; 5610 list_add_tail(&key_conf->list, 5611 &cache->key_conf.list); 5612 } 5613 5614 return 0; 5615 } 5616 5617 static int ath12k_mac_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd, 5618 struct ieee80211_vif *vif, struct ieee80211_sta *sta, 5619 struct ieee80211_key_conf *key) 5620 { 5621 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 5622 struct ath12k_link_vif *arvif; 5623 struct ath12k_link_sta *arsta = NULL; 5624 struct ath12k_vif_cache *cache; 5625 struct ath12k_sta *ahsta; 5626 unsigned long links; 5627 u8 link_id; 5628 int ret; 5629 5630 lockdep_assert_wiphy(hw->wiphy); 5631 5632 /* IGTK needs to be done in host software */ 5633 if (key->keyidx == 4 || key->keyidx == 5) 5634 return 1; 5635 5636 if (key->keyidx > WMI_MAX_KEY_INDEX) 5637 return -ENOSPC; 5638 5639 if (sta) { 5640 ahsta = ath12k_sta_to_ahsta(sta); 5641 5642 /* For an ML STA Pairwise key is same for all associated link Stations, 5643 * hence do set key for all link STAs which are active. 5644 */ 5645 if (sta->mlo) { 5646 links = ahsta->links_map; 5647 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) { 5648 arvif = wiphy_dereference(hw->wiphy, 5649 ahvif->link[link_id]); 5650 arsta = wiphy_dereference(hw->wiphy, 5651 ahsta->link[link_id]); 5652 5653 if (WARN_ON(!arvif || !arsta)) 5654 /* arvif and arsta are expected to be valid when 5655 * STA is present. 5656 */ 5657 continue; 5658 5659 ret = ath12k_mac_set_key(arvif->ar, cmd, arvif, 5660 arsta, key); 5661 if (ret) 5662 break; 5663 } 5664 5665 return 0; 5666 } 5667 5668 arsta = &ahsta->deflink; 5669 arvif = arsta->arvif; 5670 if (WARN_ON(!arvif)) 5671 return -EINVAL; 5672 5673 ret = ath12k_mac_set_key(arvif->ar, cmd, arvif, arsta, key); 5674 if (ret) 5675 return ret; 5676 5677 return 0; 5678 } 5679 5680 if (key->link_id >= 0 && key->link_id < IEEE80211_MLD_MAX_NUM_LINKS) { 5681 link_id = key->link_id; 5682 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 5683 } else { 5684 link_id = 0; 5685 arvif = &ahvif->deflink; 5686 } 5687 5688 if (!arvif || !arvif->is_created) { 5689 cache = ath12k_ahvif_get_link_cache(ahvif, link_id); 5690 if (!cache) 5691 return -ENOSPC; 5692 5693 ret = ath12k_mac_update_key_cache(cache, cmd, sta, key); 5694 if (ret) 5695 return ret; 5696 5697 return 0; 5698 } 5699 5700 ret = ath12k_mac_set_key(arvif->ar, cmd, arvif, NULL, key); 5701 if (ret) 5702 return ret; 5703 5704 return 0; 5705 } 5706 5707 static int 5708 ath12k_mac_bitrate_mask_num_vht_rates(struct ath12k *ar, 5709 enum nl80211_band band, 5710 const struct cfg80211_bitrate_mask *mask) 5711 { 5712 int num_rates = 0; 5713 int i; 5714 5715 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) 5716 num_rates += hweight16(mask->control[band].vht_mcs[i]); 5717 5718 return num_rates; 5719 } 5720 5721 static int 5722 ath12k_mac_bitrate_mask_num_he_rates(struct ath12k *ar, 5723 enum nl80211_band band, 5724 const struct cfg80211_bitrate_mask *mask) 5725 { 5726 int num_rates = 0; 5727 int i; 5728 5729 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) 5730 num_rates += hweight16(mask->control[band].he_mcs[i]); 5731 5732 return num_rates; 5733 } 5734 5735 static int 5736 ath12k_mac_set_peer_vht_fixed_rate(struct ath12k_link_vif *arvif, 5737 struct ath12k_link_sta *arsta, 5738 const struct cfg80211_bitrate_mask *mask, 5739 enum nl80211_band band) 5740 { 5741 struct ath12k *ar = arvif->ar; 5742 u8 vht_rate, nss; 5743 u32 rate_code; 5744 int ret, i; 5745 5746 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 5747 5748 nss = 0; 5749 5750 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) { 5751 if (hweight16(mask->control[band].vht_mcs[i]) == 1) { 5752 nss = i + 1; 5753 vht_rate = ffs(mask->control[band].vht_mcs[i]) - 1; 5754 } 5755 } 5756 5757 if (!nss) { 5758 ath12k_warn(ar->ab, "No single VHT Fixed rate found to set for %pM", 5759 arsta->addr); 5760 return -EINVAL; 5761 } 5762 5763 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 5764 "Setting Fixed VHT Rate for peer %pM. Device will not switch to any other selected rates", 5765 arsta->addr); 5766 5767 rate_code = ATH12K_HW_RATE_CODE(vht_rate, nss - 1, 5768 WMI_RATE_PREAMBLE_VHT); 5769 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, 5770 arvif->vdev_id, 5771 WMI_PEER_PARAM_FIXED_RATE, 5772 rate_code); 5773 if (ret) 5774 ath12k_warn(ar->ab, 5775 "failed to update STA %pM Fixed Rate %d: %d\n", 5776 arsta->addr, rate_code, ret); 5777 5778 return ret; 5779 } 5780 5781 static int 5782 ath12k_mac_set_peer_he_fixed_rate(struct ath12k_link_vif *arvif, 5783 struct ath12k_link_sta *arsta, 5784 const struct cfg80211_bitrate_mask *mask, 5785 enum nl80211_band band) 5786 { 5787 struct ath12k *ar = arvif->ar; 5788 u8 he_rate, nss; 5789 u32 rate_code; 5790 int ret, i; 5791 struct ath12k_sta *ahsta = arsta->ahsta; 5792 struct ieee80211_sta *sta; 5793 5794 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 5795 5796 sta = ath12k_ahsta_to_sta(ahsta); 5797 nss = 0; 5798 5799 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) { 5800 if (hweight16(mask->control[band].he_mcs[i]) == 1) { 5801 nss = i + 1; 5802 he_rate = ffs(mask->control[band].he_mcs[i]) - 1; 5803 } 5804 } 5805 5806 if (!nss) { 5807 ath12k_warn(ar->ab, "No single HE Fixed rate found to set for %pM", 5808 arsta->addr); 5809 return -EINVAL; 5810 } 5811 5812 /* Avoid updating invalid nss as fixed rate*/ 5813 if (nss > sta->deflink.rx_nss) 5814 return -EINVAL; 5815 5816 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 5817 "Setting Fixed HE Rate for peer %pM. Device will not switch to any other selected rates", 5818 arsta->addr); 5819 5820 rate_code = ATH12K_HW_RATE_CODE(he_rate, nss - 1, 5821 WMI_RATE_PREAMBLE_HE); 5822 5823 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, 5824 arvif->vdev_id, 5825 WMI_PEER_PARAM_FIXED_RATE, 5826 rate_code); 5827 if (ret) 5828 ath12k_warn(ar->ab, 5829 "failed to update STA %pM Fixed Rate %d: %d\n", 5830 arsta->addr, rate_code, ret); 5831 5832 return ret; 5833 } 5834 5835 static int ath12k_mac_station_assoc(struct ath12k *ar, 5836 struct ath12k_link_vif *arvif, 5837 struct ath12k_link_sta *arsta, 5838 bool reassoc) 5839 { 5840 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 5841 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 5842 struct ieee80211_link_sta *link_sta; 5843 int ret; 5844 struct cfg80211_chan_def def; 5845 enum nl80211_band band; 5846 struct cfg80211_bitrate_mask *mask; 5847 u8 num_vht_rates, num_he_rates; 5848 u8 link_id = arvif->link_id; 5849 5850 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 5851 5852 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) 5853 return -EPERM; 5854 5855 if (WARN_ON(!rcu_access_pointer(sta->link[link_id]))) 5856 return -EINVAL; 5857 5858 band = def.chan->band; 5859 mask = &arvif->bitrate_mask; 5860 5861 struct ath12k_wmi_peer_assoc_arg *peer_arg __free(kfree) = 5862 kzalloc(sizeof(*peer_arg), GFP_KERNEL); 5863 if (!peer_arg) 5864 return -ENOMEM; 5865 5866 ath12k_peer_assoc_prepare(ar, arvif, arsta, peer_arg, reassoc); 5867 5868 if (peer_arg->peer_nss < 1) { 5869 ath12k_warn(ar->ab, 5870 "invalid peer NSS %d\n", peer_arg->peer_nss); 5871 return -EINVAL; 5872 } 5873 5874 peer_arg->is_assoc = true; 5875 ret = ath12k_wmi_send_peer_assoc_cmd(ar, peer_arg); 5876 if (ret) { 5877 ath12k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n", 5878 arsta->addr, arvif->vdev_id, ret); 5879 return ret; 5880 } 5881 5882 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) { 5883 ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n", 5884 arsta->addr, arvif->vdev_id); 5885 return -ETIMEDOUT; 5886 } 5887 5888 num_vht_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band, mask); 5889 num_he_rates = ath12k_mac_bitrate_mask_num_he_rates(ar, band, mask); 5890 5891 /* If single VHT/HE rate is configured (by set_bitrate_mask()), 5892 * peer_assoc will disable VHT/HE. This is now enabled by a peer specific 5893 * fixed param. 5894 * Note that all other rates and NSS will be disabled for this peer. 5895 */ 5896 link_sta = ath12k_mac_get_link_sta(arsta); 5897 if (!link_sta) { 5898 ath12k_warn(ar->ab, "unable to access link sta in station assoc\n"); 5899 return -EINVAL; 5900 } 5901 5902 spin_lock_bh(&ar->data_lock); 5903 arsta->bw = ath12k_mac_ieee80211_sta_bw_to_wmi(ar, link_sta); 5904 arsta->bw_prev = link_sta->bandwidth; 5905 spin_unlock_bh(&ar->data_lock); 5906 5907 if (link_sta->vht_cap.vht_supported && num_vht_rates == 1) { 5908 ret = ath12k_mac_set_peer_vht_fixed_rate(arvif, arsta, mask, band); 5909 } else if (link_sta->he_cap.has_he && num_he_rates == 1) { 5910 ret = ath12k_mac_set_peer_he_fixed_rate(arvif, arsta, mask, band); 5911 if (ret) 5912 return ret; 5913 } 5914 5915 /* Re-assoc is run only to update supported rates for given station. It 5916 * doesn't make much sense to reconfigure the peer completely. 5917 */ 5918 if (reassoc) 5919 return 0; 5920 5921 ret = ath12k_setup_peer_smps(ar, arvif, arsta->addr, 5922 &link_sta->ht_cap, &link_sta->he_6ghz_capa); 5923 if (ret) { 5924 ath12k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n", 5925 arvif->vdev_id, ret); 5926 return ret; 5927 } 5928 5929 if (!sta->wme) { 5930 arvif->num_legacy_stations++; 5931 ret = ath12k_recalc_rtscts_prot(arvif); 5932 if (ret) 5933 return ret; 5934 } 5935 5936 if (sta->wme && sta->uapsd_queues) { 5937 ret = ath12k_peer_assoc_qos_ap(ar, arvif, arsta); 5938 if (ret) { 5939 ath12k_warn(ar->ab, "failed to set qos params for STA %pM for vdev %i: %d\n", 5940 arsta->addr, arvif->vdev_id, ret); 5941 return ret; 5942 } 5943 } 5944 5945 return 0; 5946 } 5947 5948 static int ath12k_mac_station_disassoc(struct ath12k *ar, 5949 struct ath12k_link_vif *arvif, 5950 struct ath12k_link_sta *arsta) 5951 { 5952 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 5953 5954 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 5955 5956 if (!sta->wme) { 5957 arvif->num_legacy_stations--; 5958 return ath12k_recalc_rtscts_prot(arvif); 5959 } 5960 5961 return 0; 5962 } 5963 5964 static void ath12k_sta_rc_update_wk(struct wiphy *wiphy, struct wiphy_work *wk) 5965 { 5966 struct ieee80211_link_sta *link_sta; 5967 struct ath12k *ar; 5968 struct ath12k_link_vif *arvif; 5969 struct ieee80211_sta *sta; 5970 struct cfg80211_chan_def def; 5971 enum nl80211_band band; 5972 const u8 *ht_mcs_mask; 5973 const u16 *vht_mcs_mask; 5974 const u16 *he_mcs_mask; 5975 u32 changed, bw, nss, mac_nss, smps, bw_prev; 5976 int err, num_vht_rates, num_he_rates; 5977 const struct cfg80211_bitrate_mask *mask; 5978 enum wmi_phy_mode peer_phymode; 5979 struct ath12k_link_sta *arsta; 5980 struct ieee80211_vif *vif; 5981 5982 lockdep_assert_wiphy(wiphy); 5983 5984 arsta = container_of(wk, struct ath12k_link_sta, update_wk); 5985 sta = ath12k_ahsta_to_sta(arsta->ahsta); 5986 arvif = arsta->arvif; 5987 vif = ath12k_ahvif_to_vif(arvif->ahvif); 5988 ar = arvif->ar; 5989 5990 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) 5991 return; 5992 5993 band = def.chan->band; 5994 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs; 5995 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs; 5996 he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs; 5997 5998 spin_lock_bh(&ar->data_lock); 5999 6000 changed = arsta->changed; 6001 arsta->changed = 0; 6002 6003 bw = arsta->bw; 6004 bw_prev = arsta->bw_prev; 6005 nss = arsta->nss; 6006 smps = arsta->smps; 6007 6008 spin_unlock_bh(&ar->data_lock); 6009 6010 nss = max_t(u32, 1, nss); 6011 mac_nss = max3(ath12k_mac_max_ht_nss(ht_mcs_mask), 6012 ath12k_mac_max_vht_nss(vht_mcs_mask), 6013 ath12k_mac_max_he_nss(he_mcs_mask)); 6014 nss = min(nss, mac_nss); 6015 6016 struct ath12k_wmi_peer_assoc_arg *peer_arg __free(kfree) = 6017 kzalloc(sizeof(*peer_arg), GFP_KERNEL); 6018 if (!peer_arg) 6019 return; 6020 6021 if (changed & IEEE80211_RC_BW_CHANGED) { 6022 ath12k_peer_assoc_h_phymode(ar, arvif, arsta, peer_arg); 6023 peer_phymode = peer_arg->peer_phymode; 6024 6025 if (bw > bw_prev) { 6026 /* Phymode shows maximum supported channel width, if we 6027 * upgrade bandwidth then due to sanity check of firmware, 6028 * we have to send WMI_PEER_PHYMODE followed by 6029 * WMI_PEER_CHWIDTH 6030 */ 6031 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac bandwidth upgrade for sta %pM new %d old %d\n", 6032 arsta->addr, bw, bw_prev); 6033 err = ath12k_wmi_set_peer_param(ar, arsta->addr, 6034 arvif->vdev_id, WMI_PEER_PHYMODE, 6035 peer_phymode); 6036 if (err) { 6037 ath12k_warn(ar->ab, "failed to update STA %pM to peer phymode %d: %d\n", 6038 arsta->addr, peer_phymode, err); 6039 return; 6040 } 6041 err = ath12k_wmi_set_peer_param(ar, arsta->addr, 6042 arvif->vdev_id, WMI_PEER_CHWIDTH, 6043 bw); 6044 if (err) 6045 ath12k_warn(ar->ab, "failed to update STA %pM to peer bandwidth %d: %d\n", 6046 arsta->addr, bw, err); 6047 } else { 6048 /* When we downgrade bandwidth this will conflict with phymode 6049 * and cause to trigger firmware crash. In this case we send 6050 * WMI_PEER_CHWIDTH followed by WMI_PEER_PHYMODE 6051 */ 6052 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac bandwidth downgrade for sta %pM new %d old %d\n", 6053 arsta->addr, bw, bw_prev); 6054 err = ath12k_wmi_set_peer_param(ar, arsta->addr, 6055 arvif->vdev_id, WMI_PEER_CHWIDTH, 6056 bw); 6057 if (err) { 6058 ath12k_warn(ar->ab, "failed to update STA %pM peer to bandwidth %d: %d\n", 6059 arsta->addr, bw, err); 6060 return; 6061 } 6062 err = ath12k_wmi_set_peer_param(ar, arsta->addr, 6063 arvif->vdev_id, WMI_PEER_PHYMODE, 6064 peer_phymode); 6065 if (err) 6066 ath12k_warn(ar->ab, "failed to update STA %pM to peer phymode %d: %d\n", 6067 arsta->addr, peer_phymode, err); 6068 } 6069 } 6070 6071 if (changed & IEEE80211_RC_NSS_CHANGED) { 6072 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac update sta %pM nss %d\n", 6073 arsta->addr, nss); 6074 6075 err = ath12k_wmi_set_peer_param(ar, arsta->addr, arvif->vdev_id, 6076 WMI_PEER_NSS, nss); 6077 if (err) 6078 ath12k_warn(ar->ab, "failed to update STA %pM nss %d: %d\n", 6079 arsta->addr, nss, err); 6080 } 6081 6082 if (changed & IEEE80211_RC_SMPS_CHANGED) { 6083 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac update sta %pM smps %d\n", 6084 arsta->addr, smps); 6085 6086 err = ath12k_wmi_set_peer_param(ar, arsta->addr, arvif->vdev_id, 6087 WMI_PEER_MIMO_PS_STATE, smps); 6088 if (err) 6089 ath12k_warn(ar->ab, "failed to update STA %pM smps %d: %d\n", 6090 arsta->addr, smps, err); 6091 } 6092 6093 if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) { 6094 mask = &arvif->bitrate_mask; 6095 num_vht_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band, 6096 mask); 6097 num_he_rates = ath12k_mac_bitrate_mask_num_he_rates(ar, band, 6098 mask); 6099 6100 /* Peer_assoc_prepare will reject vht rates in 6101 * bitrate_mask if its not available in range format and 6102 * sets vht tx_rateset as unsupported. So multiple VHT MCS 6103 * setting(eg. MCS 4,5,6) per peer is not supported here. 6104 * But, Single rate in VHT mask can be set as per-peer 6105 * fixed rate. But even if any HT rates are configured in 6106 * the bitrate mask, device will not switch to those rates 6107 * when per-peer Fixed rate is set. 6108 * TODO: Check RATEMASK_CMDID to support auto rates selection 6109 * across HT/VHT and for multiple VHT MCS support. 6110 */ 6111 link_sta = ath12k_mac_get_link_sta(arsta); 6112 if (!link_sta) { 6113 ath12k_warn(ar->ab, "unable to access link sta in peer assoc he for sta %pM link %u\n", 6114 sta->addr, arsta->link_id); 6115 return; 6116 } 6117 6118 if (link_sta->vht_cap.vht_supported && num_vht_rates == 1) { 6119 ath12k_mac_set_peer_vht_fixed_rate(arvif, arsta, mask, 6120 band); 6121 } else if (link_sta->he_cap.has_he && num_he_rates == 1) { 6122 ath12k_mac_set_peer_he_fixed_rate(arvif, arsta, mask, band); 6123 } else { 6124 /* If the peer is non-VHT/HE or no fixed VHT/HE rate 6125 * is provided in the new bitrate mask we set the 6126 * other rates using peer_assoc command. Also clear 6127 * the peer fixed rate settings as it has higher proprity 6128 * than peer assoc 6129 */ 6130 err = ath12k_wmi_set_peer_param(ar, arsta->addr, 6131 arvif->vdev_id, 6132 WMI_PEER_PARAM_FIXED_RATE, 6133 WMI_FIXED_RATE_NONE); 6134 if (err) 6135 ath12k_warn(ar->ab, 6136 "failed to disable peer fixed rate for STA %pM ret %d\n", 6137 arsta->addr, err); 6138 6139 ath12k_peer_assoc_prepare(ar, arvif, arsta, 6140 peer_arg, true); 6141 6142 peer_arg->is_assoc = false; 6143 err = ath12k_wmi_send_peer_assoc_cmd(ar, peer_arg); 6144 if (err) 6145 ath12k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n", 6146 arsta->addr, arvif->vdev_id, err); 6147 6148 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) 6149 ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n", 6150 arsta->addr, arvif->vdev_id); 6151 } 6152 } 6153 } 6154 6155 static void ath12k_mac_free_unassign_link_sta(struct ath12k_hw *ah, 6156 struct ath12k_sta *ahsta, 6157 u8 link_id) 6158 { 6159 struct ath12k_link_sta *arsta; 6160 6161 lockdep_assert_wiphy(ah->hw->wiphy); 6162 6163 if (WARN_ON(link_id >= IEEE80211_MLD_MAX_NUM_LINKS)) 6164 return; 6165 6166 arsta = wiphy_dereference(ah->hw->wiphy, ahsta->link[link_id]); 6167 if (WARN_ON(!arsta)) 6168 return; 6169 6170 ahsta->links_map &= ~BIT(link_id); 6171 rcu_assign_pointer(ahsta->link[link_id], NULL); 6172 synchronize_rcu(); 6173 6174 if (arsta == &ahsta->deflink) { 6175 arsta->link_id = ATH12K_INVALID_LINK_ID; 6176 arsta->ahsta = NULL; 6177 arsta->arvif = NULL; 6178 return; 6179 } 6180 6181 kfree(arsta); 6182 } 6183 6184 static int ath12k_mac_inc_num_stations(struct ath12k_link_vif *arvif, 6185 struct ath12k_link_sta *arsta) 6186 { 6187 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 6188 struct ath12k *ar = arvif->ar; 6189 6190 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 6191 6192 if (arvif->ahvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls) 6193 return 0; 6194 6195 if (ar->num_stations >= ar->max_num_stations) 6196 return -ENOBUFS; 6197 6198 ar->num_stations++; 6199 arvif->num_stations++; 6200 6201 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 6202 "mac station %pM connected to vdev %u num_stations %u\n", 6203 arsta->addr, arvif->vdev_id, arvif->num_stations); 6204 6205 return 0; 6206 } 6207 6208 static void ath12k_mac_dec_num_stations(struct ath12k_link_vif *arvif, 6209 struct ath12k_link_sta *arsta) 6210 { 6211 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 6212 struct ath12k *ar = arvif->ar; 6213 6214 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 6215 6216 if (arvif->ahvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls) 6217 return; 6218 6219 ar->num_stations--; 6220 6221 if (arvif->num_stations) { 6222 arvif->num_stations--; 6223 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 6224 "mac station %pM disconnected from vdev %u num_stations %u\n", 6225 arsta->addr, arvif->vdev_id, arvif->num_stations); 6226 } else { 6227 ath12k_warn(ar->ab, 6228 "mac station %pM disconnect for vdev %u without any connected station\n", 6229 arsta->addr, arvif->vdev_id); 6230 } 6231 } 6232 6233 static void ath12k_mac_station_post_remove(struct ath12k *ar, 6234 struct ath12k_link_vif *arvif, 6235 struct ath12k_link_sta *arsta) 6236 { 6237 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 6238 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 6239 struct ath12k_peer *peer; 6240 6241 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 6242 6243 ath12k_mac_dec_num_stations(arvif, arsta); 6244 6245 spin_lock_bh(&ar->ab->base_lock); 6246 6247 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr); 6248 if (peer && peer->sta == sta) { 6249 ath12k_warn(ar->ab, "Found peer entry %pM n vdev %i after it was supposedly removed\n", 6250 vif->addr, arvif->vdev_id); 6251 peer->sta = NULL; 6252 list_del(&peer->list); 6253 kfree(peer); 6254 ar->num_peers--; 6255 } 6256 6257 spin_unlock_bh(&ar->ab->base_lock); 6258 6259 kfree(arsta->rx_stats); 6260 arsta->rx_stats = NULL; 6261 } 6262 6263 static int ath12k_mac_station_unauthorize(struct ath12k *ar, 6264 struct ath12k_link_vif *arvif, 6265 struct ath12k_link_sta *arsta) 6266 { 6267 struct ath12k_peer *peer; 6268 int ret; 6269 6270 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 6271 6272 spin_lock_bh(&ar->ab->base_lock); 6273 6274 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr); 6275 if (peer) 6276 peer->is_authorized = false; 6277 6278 spin_unlock_bh(&ar->ab->base_lock); 6279 6280 /* Driver must clear the keys during the state change from 6281 * IEEE80211_STA_AUTHORIZED to IEEE80211_STA_ASSOC, since after 6282 * returning from here, mac80211 is going to delete the keys 6283 * in __sta_info_destroy_part2(). This will ensure that the driver does 6284 * not retain stale key references after mac80211 deletes the keys. 6285 */ 6286 ret = ath12k_clear_peer_keys(arvif, arsta->addr); 6287 if (ret) { 6288 ath12k_warn(ar->ab, "failed to clear all peer keys for vdev %i: %d\n", 6289 arvif->vdev_id, ret); 6290 return ret; 6291 } 6292 6293 return 0; 6294 } 6295 6296 static int ath12k_mac_station_authorize(struct ath12k *ar, 6297 struct ath12k_link_vif *arvif, 6298 struct ath12k_link_sta *arsta) 6299 { 6300 struct ath12k_peer *peer; 6301 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 6302 int ret; 6303 6304 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 6305 6306 spin_lock_bh(&ar->ab->base_lock); 6307 6308 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr); 6309 if (peer) 6310 peer->is_authorized = true; 6311 6312 spin_unlock_bh(&ar->ab->base_lock); 6313 6314 if (vif->type == NL80211_IFTYPE_STATION && arvif->is_up) { 6315 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, 6316 arvif->vdev_id, 6317 WMI_PEER_AUTHORIZE, 6318 1); 6319 if (ret) { 6320 ath12k_warn(ar->ab, "Unable to authorize peer %pM vdev %d: %d\n", 6321 arsta->addr, arvif->vdev_id, ret); 6322 return ret; 6323 } 6324 } 6325 6326 return 0; 6327 } 6328 6329 static int ath12k_mac_station_remove(struct ath12k *ar, 6330 struct ath12k_link_vif *arvif, 6331 struct ath12k_link_sta *arsta) 6332 { 6333 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 6334 struct ath12k_vif *ahvif = arvif->ahvif; 6335 int ret = 0; 6336 6337 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 6338 6339 wiphy_work_cancel(ar->ah->hw->wiphy, &arsta->update_wk); 6340 6341 if (ahvif->vdev_type == WMI_VDEV_TYPE_STA) { 6342 ath12k_bss_disassoc(ar, arvif); 6343 ret = ath12k_mac_vdev_stop(arvif); 6344 if (ret) 6345 ath12k_warn(ar->ab, "failed to stop vdev %i: %d\n", 6346 arvif->vdev_id, ret); 6347 } 6348 6349 if (sta->mlo) 6350 return ret; 6351 6352 ath12k_dp_peer_cleanup(ar, arvif->vdev_id, arsta->addr); 6353 6354 ret = ath12k_peer_delete(ar, arvif->vdev_id, arsta->addr); 6355 if (ret) 6356 ath12k_warn(ar->ab, "Failed to delete peer: %pM for VDEV: %d\n", 6357 arsta->addr, arvif->vdev_id); 6358 else 6359 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "Removed peer: %pM for VDEV: %d\n", 6360 arsta->addr, arvif->vdev_id); 6361 6362 ath12k_mac_station_post_remove(ar, arvif, arsta); 6363 6364 if (sta->valid_links) 6365 ath12k_mac_free_unassign_link_sta(ahvif->ah, 6366 arsta->ahsta, arsta->link_id); 6367 6368 return ret; 6369 } 6370 6371 static int ath12k_mac_station_add(struct ath12k *ar, 6372 struct ath12k_link_vif *arvif, 6373 struct ath12k_link_sta *arsta) 6374 { 6375 struct ath12k_base *ab = ar->ab; 6376 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 6377 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 6378 struct ath12k_wmi_peer_create_arg peer_param = {0}; 6379 int ret; 6380 6381 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 6382 6383 ret = ath12k_mac_inc_num_stations(arvif, arsta); 6384 if (ret) { 6385 ath12k_warn(ab, "refusing to associate station: too many connected already (%d)\n", 6386 ar->max_num_stations); 6387 goto exit; 6388 } 6389 6390 if (ath12k_debugfs_is_extd_rx_stats_enabled(ar) && !arsta->rx_stats) { 6391 arsta->rx_stats = kzalloc(sizeof(*arsta->rx_stats), GFP_KERNEL); 6392 if (!arsta->rx_stats) { 6393 ret = -ENOMEM; 6394 goto dec_num_station; 6395 } 6396 } 6397 6398 peer_param.vdev_id = arvif->vdev_id; 6399 peer_param.peer_addr = arsta->addr; 6400 peer_param.peer_type = WMI_PEER_TYPE_DEFAULT; 6401 peer_param.ml_enabled = sta->mlo; 6402 6403 ret = ath12k_peer_create(ar, arvif, sta, &peer_param); 6404 if (ret) { 6405 ath12k_warn(ab, "Failed to add peer: %pM for VDEV: %d\n", 6406 arsta->addr, arvif->vdev_id); 6407 goto free_peer; 6408 } 6409 6410 ath12k_dbg(ab, ATH12K_DBG_MAC, "Added peer: %pM for VDEV: %d\n", 6411 arsta->addr, arvif->vdev_id); 6412 6413 if (ieee80211_vif_is_mesh(vif)) { 6414 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, 6415 arvif->vdev_id, 6416 WMI_PEER_USE_4ADDR, 1); 6417 if (ret) { 6418 ath12k_warn(ab, "failed to STA %pM 4addr capability: %d\n", 6419 arsta->addr, ret); 6420 goto free_peer; 6421 } 6422 } 6423 6424 ret = ath12k_dp_peer_setup(ar, arvif->vdev_id, arsta->addr); 6425 if (ret) { 6426 ath12k_warn(ab, "failed to setup dp for peer %pM on vdev %i (%d)\n", 6427 arsta->addr, arvif->vdev_id, ret); 6428 goto free_peer; 6429 } 6430 6431 if (ab->hw_params->vdev_start_delay && 6432 !arvif->is_started && 6433 arvif->ahvif->vdev_type != WMI_VDEV_TYPE_AP) { 6434 ret = ath12k_start_vdev_delay(ar, arvif); 6435 if (ret) { 6436 ath12k_warn(ab, "failed to delay vdev start: %d\n", ret); 6437 goto free_peer; 6438 } 6439 } 6440 6441 ewma_avg_rssi_init(&arsta->avg_rssi); 6442 return 0; 6443 6444 free_peer: 6445 ath12k_peer_delete(ar, arvif->vdev_id, arsta->addr); 6446 kfree(arsta->rx_stats); 6447 arsta->rx_stats = NULL; 6448 dec_num_station: 6449 ath12k_mac_dec_num_stations(arvif, arsta); 6450 exit: 6451 return ret; 6452 } 6453 6454 static int ath12k_mac_assign_link_sta(struct ath12k_hw *ah, 6455 struct ath12k_sta *ahsta, 6456 struct ath12k_link_sta *arsta, 6457 struct ath12k_vif *ahvif, 6458 u8 link_id) 6459 { 6460 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(ahsta); 6461 struct ieee80211_link_sta *link_sta; 6462 struct ath12k_link_vif *arvif; 6463 6464 lockdep_assert_wiphy(ah->hw->wiphy); 6465 6466 if (!arsta || link_id >= IEEE80211_MLD_MAX_NUM_LINKS) 6467 return -EINVAL; 6468 6469 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]); 6470 if (!arvif) 6471 return -EINVAL; 6472 6473 memset(arsta, 0, sizeof(*arsta)); 6474 6475 link_sta = wiphy_dereference(ah->hw->wiphy, sta->link[link_id]); 6476 if (!link_sta) 6477 return -EINVAL; 6478 6479 ether_addr_copy(arsta->addr, link_sta->addr); 6480 6481 /* logical index of the link sta in order of creation */ 6482 arsta->link_idx = ahsta->num_peer++; 6483 6484 arsta->link_id = link_id; 6485 ahsta->links_map |= BIT(arsta->link_id); 6486 arsta->arvif = arvif; 6487 arsta->ahsta = ahsta; 6488 ahsta->ahvif = ahvif; 6489 6490 wiphy_work_init(&arsta->update_wk, ath12k_sta_rc_update_wk); 6491 6492 rcu_assign_pointer(ahsta->link[link_id], arsta); 6493 6494 return 0; 6495 } 6496 6497 static void ath12k_mac_ml_station_remove(struct ath12k_vif *ahvif, 6498 struct ath12k_sta *ahsta) 6499 { 6500 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(ahsta); 6501 struct ath12k_hw *ah = ahvif->ah; 6502 struct ath12k_link_vif *arvif; 6503 struct ath12k_link_sta *arsta; 6504 unsigned long links; 6505 struct ath12k *ar; 6506 u8 link_id; 6507 6508 lockdep_assert_wiphy(ah->hw->wiphy); 6509 6510 ath12k_peer_mlo_link_peers_delete(ahvif, ahsta); 6511 6512 /* validate link station removal and clear arsta links */ 6513 links = ahsta->links_map; 6514 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) { 6515 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]); 6516 arsta = wiphy_dereference(ah->hw->wiphy, ahsta->link[link_id]); 6517 if (!arvif || !arsta) 6518 continue; 6519 6520 ar = arvif->ar; 6521 6522 ath12k_mac_station_post_remove(ar, arvif, arsta); 6523 6524 ath12k_mac_free_unassign_link_sta(ah, ahsta, link_id); 6525 } 6526 6527 ath12k_peer_ml_delete(ah, sta); 6528 } 6529 6530 static int ath12k_mac_handle_link_sta_state(struct ieee80211_hw *hw, 6531 struct ath12k_link_vif *arvif, 6532 struct ath12k_link_sta *arsta, 6533 enum ieee80211_sta_state old_state, 6534 enum ieee80211_sta_state new_state) 6535 { 6536 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 6537 struct ieee80211_bss_conf *link_conf; 6538 struct ath12k *ar = arvif->ar; 6539 struct ath12k_reg_info *reg_info; 6540 struct ath12k_base *ab = ar->ab; 6541 int ret = 0; 6542 6543 lockdep_assert_wiphy(hw->wiphy); 6544 6545 ath12k_dbg(ab, ATH12K_DBG_MAC, "mac handle link %u sta %pM state %d -> %d\n", 6546 arsta->link_id, arsta->addr, old_state, new_state); 6547 6548 /* IEEE80211_STA_NONE -> IEEE80211_STA_NOTEXIST: Remove the station 6549 * from driver 6550 */ 6551 if ((old_state == IEEE80211_STA_NONE && 6552 new_state == IEEE80211_STA_NOTEXIST)) { 6553 ret = ath12k_mac_station_remove(ar, arvif, arsta); 6554 if (ret) { 6555 ath12k_warn(ab, "Failed to remove station: %pM for VDEV: %d\n", 6556 arsta->addr, arvif->vdev_id); 6557 goto exit; 6558 } 6559 } 6560 6561 /* IEEE80211_STA_NOTEXIST -> IEEE80211_STA_NONE: Add new station to driver */ 6562 if (old_state == IEEE80211_STA_NOTEXIST && 6563 new_state == IEEE80211_STA_NONE) { 6564 ret = ath12k_mac_station_add(ar, arvif, arsta); 6565 if (ret) 6566 ath12k_warn(ab, "Failed to add station: %pM for VDEV: %d\n", 6567 arsta->addr, arvif->vdev_id); 6568 6569 /* IEEE80211_STA_AUTH -> IEEE80211_STA_ASSOC: Send station assoc command for 6570 * peer associated to AP/Mesh/ADHOC vif type. 6571 */ 6572 } else if (old_state == IEEE80211_STA_AUTH && 6573 new_state == IEEE80211_STA_ASSOC && 6574 (vif->type == NL80211_IFTYPE_AP || 6575 vif->type == NL80211_IFTYPE_MESH_POINT || 6576 vif->type == NL80211_IFTYPE_ADHOC)) { 6577 ret = ath12k_mac_station_assoc(ar, arvif, arsta, false); 6578 if (ret) 6579 ath12k_warn(ab, "Failed to associate station: %pM\n", 6580 arsta->addr); 6581 6582 /* IEEE80211_STA_ASSOC -> IEEE80211_STA_AUTHORIZED: set peer status as 6583 * authorized 6584 */ 6585 } else if (old_state == IEEE80211_STA_ASSOC && 6586 new_state == IEEE80211_STA_AUTHORIZED) { 6587 ret = ath12k_mac_station_authorize(ar, arvif, arsta); 6588 if (ret) { 6589 ath12k_warn(ab, "Failed to authorize station: %pM\n", 6590 arsta->addr); 6591 goto exit; 6592 } 6593 6594 if (ath12k_wmi_supports_6ghz_cc_ext(ar) && 6595 arvif->ahvif->vdev_type == WMI_VDEV_TYPE_STA) { 6596 link_conf = ath12k_mac_get_link_bss_conf(arvif); 6597 reg_info = ab->reg_info[ar->pdev_idx]; 6598 ath12k_dbg(ab, ATH12K_DBG_MAC, "connection done, update reg rules\n"); 6599 ath12k_hw_to_ah(hw)->regd_updated = false; 6600 ath12k_reg_handle_chan_list(ab, reg_info, arvif->ahvif->vdev_type, 6601 link_conf->power_type); 6602 } 6603 6604 /* IEEE80211_STA_AUTHORIZED -> IEEE80211_STA_ASSOC: station may be in removal, 6605 * deauthorize it. 6606 */ 6607 } else if (old_state == IEEE80211_STA_AUTHORIZED && 6608 new_state == IEEE80211_STA_ASSOC) { 6609 ath12k_mac_station_unauthorize(ar, arvif, arsta); 6610 6611 /* IEEE80211_STA_ASSOC -> IEEE80211_STA_AUTH: disassoc peer connected to 6612 * AP/mesh/ADHOC vif type. 6613 */ 6614 } else if (old_state == IEEE80211_STA_ASSOC && 6615 new_state == IEEE80211_STA_AUTH && 6616 (vif->type == NL80211_IFTYPE_AP || 6617 vif->type == NL80211_IFTYPE_MESH_POINT || 6618 vif->type == NL80211_IFTYPE_ADHOC)) { 6619 ret = ath12k_mac_station_disassoc(ar, arvif, arsta); 6620 if (ret) 6621 ath12k_warn(ab, "Failed to disassociate station: %pM\n", 6622 arsta->addr); 6623 } 6624 6625 exit: 6626 return ret; 6627 } 6628 6629 static bool ath12k_mac_is_freq_on_mac(struct ath12k_hw_mode_freq_range_arg *freq_range, 6630 u32 freq, u8 mac_id) 6631 { 6632 return (freq >= freq_range[mac_id].low_2ghz_freq && 6633 freq <= freq_range[mac_id].high_2ghz_freq) || 6634 (freq >= freq_range[mac_id].low_5ghz_freq && 6635 freq <= freq_range[mac_id].high_5ghz_freq); 6636 } 6637 6638 static bool 6639 ath12k_mac_2_freq_same_mac_in_freq_range(struct ath12k_base *ab, 6640 struct ath12k_hw_mode_freq_range_arg *freq_range, 6641 u32 freq_link1, u32 freq_link2) 6642 { 6643 u8 i; 6644 6645 for (i = 0; i < MAX_RADIOS; i++) { 6646 if (ath12k_mac_is_freq_on_mac(freq_range, freq_link1, i) && 6647 ath12k_mac_is_freq_on_mac(freq_range, freq_link2, i)) 6648 return true; 6649 } 6650 6651 return false; 6652 } 6653 6654 static bool ath12k_mac_is_hw_dbs_capable(struct ath12k_base *ab) 6655 { 6656 return test_bit(WMI_TLV_SERVICE_DUAL_BAND_SIMULTANEOUS_SUPPORT, 6657 ab->wmi_ab.svc_map) && 6658 ab->wmi_ab.hw_mode_info.support_dbs; 6659 } 6660 6661 static bool ath12k_mac_2_freq_same_mac_in_dbs(struct ath12k_base *ab, 6662 u32 freq_link1, u32 freq_link2) 6663 { 6664 struct ath12k_hw_mode_freq_range_arg *freq_range; 6665 6666 if (!ath12k_mac_is_hw_dbs_capable(ab)) 6667 return true; 6668 6669 freq_range = ab->wmi_ab.hw_mode_info.freq_range_caps[ATH12K_HW_MODE_DBS]; 6670 return ath12k_mac_2_freq_same_mac_in_freq_range(ab, freq_range, 6671 freq_link1, freq_link2); 6672 } 6673 6674 static bool ath12k_mac_is_hw_sbs_capable(struct ath12k_base *ab) 6675 { 6676 return test_bit(WMI_TLV_SERVICE_DUAL_BAND_SIMULTANEOUS_SUPPORT, 6677 ab->wmi_ab.svc_map) && 6678 ab->wmi_ab.hw_mode_info.support_sbs; 6679 } 6680 6681 static bool ath12k_mac_2_freq_same_mac_in_sbs(struct ath12k_base *ab, 6682 u32 freq_link1, u32 freq_link2) 6683 { 6684 struct ath12k_hw_mode_info *info = &ab->wmi_ab.hw_mode_info; 6685 struct ath12k_hw_mode_freq_range_arg *sbs_uppr_share; 6686 struct ath12k_hw_mode_freq_range_arg *sbs_low_share; 6687 struct ath12k_hw_mode_freq_range_arg *sbs_range; 6688 6689 if (!ath12k_mac_is_hw_sbs_capable(ab)) 6690 return true; 6691 6692 if (ab->wmi_ab.sbs_lower_band_end_freq) { 6693 sbs_uppr_share = info->freq_range_caps[ATH12K_HW_MODE_SBS_UPPER_SHARE]; 6694 sbs_low_share = info->freq_range_caps[ATH12K_HW_MODE_SBS_LOWER_SHARE]; 6695 6696 return ath12k_mac_2_freq_same_mac_in_freq_range(ab, sbs_low_share, 6697 freq_link1, freq_link2) || 6698 ath12k_mac_2_freq_same_mac_in_freq_range(ab, sbs_uppr_share, 6699 freq_link1, freq_link2); 6700 } 6701 6702 sbs_range = info->freq_range_caps[ATH12K_HW_MODE_SBS]; 6703 return ath12k_mac_2_freq_same_mac_in_freq_range(ab, sbs_range, 6704 freq_link1, freq_link2); 6705 } 6706 6707 static bool ath12k_mac_freqs_on_same_mac(struct ath12k_base *ab, 6708 u32 freq_link1, u32 freq_link2) 6709 { 6710 return ath12k_mac_2_freq_same_mac_in_dbs(ab, freq_link1, freq_link2) && 6711 ath12k_mac_2_freq_same_mac_in_sbs(ab, freq_link1, freq_link2); 6712 } 6713 6714 static int ath12k_mac_mlo_sta_set_link_active(struct ath12k_base *ab, 6715 enum wmi_mlo_link_force_reason reason, 6716 enum wmi_mlo_link_force_mode mode, 6717 u8 *mlo_vdev_id_lst, 6718 u8 num_mlo_vdev, 6719 u8 *mlo_inactive_vdev_lst, 6720 u8 num_mlo_inactive_vdev) 6721 { 6722 struct wmi_mlo_link_set_active_arg param = {0}; 6723 u32 entry_idx, entry_offset, vdev_idx; 6724 u8 vdev_id; 6725 6726 param.reason = reason; 6727 param.force_mode = mode; 6728 6729 for (vdev_idx = 0; vdev_idx < num_mlo_vdev; vdev_idx++) { 6730 vdev_id = mlo_vdev_id_lst[vdev_idx]; 6731 entry_idx = vdev_id / 32; 6732 entry_offset = vdev_id % 32; 6733 if (entry_idx >= WMI_MLO_LINK_NUM_SZ) { 6734 ath12k_warn(ab, "Invalid entry_idx %d num_mlo_vdev %d vdev %d", 6735 entry_idx, num_mlo_vdev, vdev_id); 6736 return -EINVAL; 6737 } 6738 param.vdev_bitmap[entry_idx] |= 1 << entry_offset; 6739 /* update entry number if entry index changed */ 6740 if (param.num_vdev_bitmap < entry_idx + 1) 6741 param.num_vdev_bitmap = entry_idx + 1; 6742 } 6743 6744 ath12k_dbg(ab, ATH12K_DBG_MAC, 6745 "num_vdev_bitmap %d vdev_bitmap[0] = 0x%x, vdev_bitmap[1] = 0x%x", 6746 param.num_vdev_bitmap, param.vdev_bitmap[0], param.vdev_bitmap[1]); 6747 6748 if (mode == WMI_MLO_LINK_FORCE_MODE_ACTIVE_INACTIVE) { 6749 for (vdev_idx = 0; vdev_idx < num_mlo_inactive_vdev; vdev_idx++) { 6750 vdev_id = mlo_inactive_vdev_lst[vdev_idx]; 6751 entry_idx = vdev_id / 32; 6752 entry_offset = vdev_id % 32; 6753 if (entry_idx >= WMI_MLO_LINK_NUM_SZ) { 6754 ath12k_warn(ab, "Invalid entry_idx %d num_mlo_vdev %d vdev %d", 6755 entry_idx, num_mlo_inactive_vdev, vdev_id); 6756 return -EINVAL; 6757 } 6758 param.inactive_vdev_bitmap[entry_idx] |= 1 << entry_offset; 6759 /* update entry number if entry index changed */ 6760 if (param.num_inactive_vdev_bitmap < entry_idx + 1) 6761 param.num_inactive_vdev_bitmap = entry_idx + 1; 6762 } 6763 6764 ath12k_dbg(ab, ATH12K_DBG_MAC, 6765 "num_vdev_bitmap %d inactive_vdev_bitmap[0] = 0x%x, inactive_vdev_bitmap[1] = 0x%x", 6766 param.num_inactive_vdev_bitmap, 6767 param.inactive_vdev_bitmap[0], 6768 param.inactive_vdev_bitmap[1]); 6769 } 6770 6771 if (mode == WMI_MLO_LINK_FORCE_MODE_ACTIVE_LINK_NUM || 6772 mode == WMI_MLO_LINK_FORCE_MODE_INACTIVE_LINK_NUM) { 6773 param.num_link_entry = 1; 6774 param.link_num[0].num_of_link = num_mlo_vdev - 1; 6775 } 6776 6777 return ath12k_wmi_send_mlo_link_set_active_cmd(ab, ¶m); 6778 } 6779 6780 static int ath12k_mac_mlo_sta_update_link_active(struct ath12k_base *ab, 6781 struct ieee80211_hw *hw, 6782 struct ath12k_vif *ahvif) 6783 { 6784 u8 mlo_vdev_id_lst[IEEE80211_MLD_MAX_NUM_LINKS] = {0}; 6785 u32 mlo_freq_list[IEEE80211_MLD_MAX_NUM_LINKS] = {0}; 6786 unsigned long links = ahvif->links_map; 6787 enum wmi_mlo_link_force_reason reason; 6788 struct ieee80211_chanctx_conf *conf; 6789 enum wmi_mlo_link_force_mode mode; 6790 struct ieee80211_bss_conf *info; 6791 struct ath12k_link_vif *arvif; 6792 u8 num_mlo_vdev = 0; 6793 u8 link_id; 6794 6795 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) { 6796 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 6797 /* make sure vdev is created on this device */ 6798 if (!arvif || !arvif->is_created || arvif->ar->ab != ab) 6799 continue; 6800 6801 info = ath12k_mac_get_link_bss_conf(arvif); 6802 conf = wiphy_dereference(hw->wiphy, info->chanctx_conf); 6803 mlo_freq_list[num_mlo_vdev] = conf->def.chan->center_freq; 6804 6805 mlo_vdev_id_lst[num_mlo_vdev] = arvif->vdev_id; 6806 num_mlo_vdev++; 6807 } 6808 6809 /* It is not allowed to activate more links than a single device 6810 * supported. Something goes wrong if we reach here. 6811 */ 6812 if (num_mlo_vdev > ATH12K_NUM_MAX_ACTIVE_LINKS_PER_DEVICE) { 6813 WARN_ON_ONCE(1); 6814 return -EINVAL; 6815 } 6816 6817 /* if 2 links are established and both link channels fall on the 6818 * same hardware MAC, send command to firmware to deactivate one 6819 * of them. 6820 */ 6821 if (num_mlo_vdev == 2 && 6822 ath12k_mac_freqs_on_same_mac(ab, mlo_freq_list[0], 6823 mlo_freq_list[1])) { 6824 mode = WMI_MLO_LINK_FORCE_MODE_INACTIVE_LINK_NUM; 6825 reason = WMI_MLO_LINK_FORCE_REASON_NEW_CONNECT; 6826 return ath12k_mac_mlo_sta_set_link_active(ab, reason, mode, 6827 mlo_vdev_id_lst, num_mlo_vdev, 6828 NULL, 0); 6829 } 6830 6831 return 0; 6832 } 6833 6834 static bool ath12k_mac_are_sbs_chan(struct ath12k_base *ab, u32 freq_1, u32 freq_2) 6835 { 6836 if (!ath12k_mac_is_hw_sbs_capable(ab)) 6837 return false; 6838 6839 if (ath12k_is_2ghz_channel_freq(freq_1) || 6840 ath12k_is_2ghz_channel_freq(freq_2)) 6841 return false; 6842 6843 return !ath12k_mac_2_freq_same_mac_in_sbs(ab, freq_1, freq_2); 6844 } 6845 6846 static bool ath12k_mac_are_dbs_chan(struct ath12k_base *ab, u32 freq_1, u32 freq_2) 6847 { 6848 if (!ath12k_mac_is_hw_dbs_capable(ab)) 6849 return false; 6850 6851 return !ath12k_mac_2_freq_same_mac_in_dbs(ab, freq_1, freq_2); 6852 } 6853 6854 static int ath12k_mac_select_links(struct ath12k_base *ab, 6855 struct ieee80211_vif *vif, 6856 struct ieee80211_hw *hw, 6857 u16 *selected_links) 6858 { 6859 unsigned long useful_links = ieee80211_vif_usable_links(vif); 6860 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 6861 u8 num_useful_links = hweight_long(useful_links); 6862 struct ieee80211_chanctx_conf *chanctx; 6863 struct ath12k_link_vif *assoc_arvif; 6864 u32 assoc_link_freq, partner_freq; 6865 u16 sbs_links = 0, dbs_links = 0; 6866 struct ieee80211_bss_conf *info; 6867 struct ieee80211_channel *chan; 6868 struct ieee80211_sta *sta; 6869 struct ath12k_sta *ahsta; 6870 u8 link_id; 6871 6872 /* activate all useful links if less than max supported */ 6873 if (num_useful_links <= ATH12K_NUM_MAX_ACTIVE_LINKS_PER_DEVICE) { 6874 *selected_links = useful_links; 6875 return 0; 6876 } 6877 6878 /* only in station mode we can get here, so it's safe 6879 * to use ap_addr 6880 */ 6881 rcu_read_lock(); 6882 sta = ieee80211_find_sta(vif, vif->cfg.ap_addr); 6883 if (!sta) { 6884 rcu_read_unlock(); 6885 ath12k_warn(ab, "failed to find sta with addr %pM\n", vif->cfg.ap_addr); 6886 return -EINVAL; 6887 } 6888 6889 ahsta = ath12k_sta_to_ahsta(sta); 6890 assoc_arvif = wiphy_dereference(hw->wiphy, ahvif->link[ahsta->assoc_link_id]); 6891 info = ath12k_mac_get_link_bss_conf(assoc_arvif); 6892 chanctx = rcu_dereference(info->chanctx_conf); 6893 assoc_link_freq = chanctx->def.chan->center_freq; 6894 rcu_read_unlock(); 6895 ath12k_dbg(ab, ATH12K_DBG_MAC, "assoc link %u freq %u\n", 6896 assoc_arvif->link_id, assoc_link_freq); 6897 6898 /* assoc link is already activated and has to be kept active, 6899 * only need to select a partner link from others. 6900 */ 6901 useful_links &= ~BIT(assoc_arvif->link_id); 6902 for_each_set_bit(link_id, &useful_links, IEEE80211_MLD_MAX_NUM_LINKS) { 6903 info = wiphy_dereference(hw->wiphy, vif->link_conf[link_id]); 6904 if (!info) { 6905 ath12k_warn(ab, "failed to get link info for link: %u\n", 6906 link_id); 6907 return -ENOLINK; 6908 } 6909 6910 chan = info->chanreq.oper.chan; 6911 if (!chan) { 6912 ath12k_warn(ab, "failed to get chan for link: %u\n", link_id); 6913 return -EINVAL; 6914 } 6915 6916 partner_freq = chan->center_freq; 6917 if (ath12k_mac_are_sbs_chan(ab, assoc_link_freq, partner_freq)) { 6918 sbs_links |= BIT(link_id); 6919 ath12k_dbg(ab, ATH12K_DBG_MAC, "new SBS link %u freq %u\n", 6920 link_id, partner_freq); 6921 continue; 6922 } 6923 6924 if (ath12k_mac_are_dbs_chan(ab, assoc_link_freq, partner_freq)) { 6925 dbs_links |= BIT(link_id); 6926 ath12k_dbg(ab, ATH12K_DBG_MAC, "new DBS link %u freq %u\n", 6927 link_id, partner_freq); 6928 continue; 6929 } 6930 6931 ath12k_dbg(ab, ATH12K_DBG_MAC, "non DBS/SBS link %u freq %u\n", 6932 link_id, partner_freq); 6933 } 6934 6935 /* choose the first candidate no matter how many is in the list */ 6936 if (sbs_links) 6937 link_id = __ffs(sbs_links); 6938 else if (dbs_links) 6939 link_id = __ffs(dbs_links); 6940 else 6941 link_id = ffs(useful_links) - 1; 6942 6943 ath12k_dbg(ab, ATH12K_DBG_MAC, "select partner link %u\n", link_id); 6944 6945 *selected_links = BIT(assoc_arvif->link_id) | BIT(link_id); 6946 6947 return 0; 6948 } 6949 6950 static int ath12k_mac_op_sta_state(struct ieee80211_hw *hw, 6951 struct ieee80211_vif *vif, 6952 struct ieee80211_sta *sta, 6953 enum ieee80211_sta_state old_state, 6954 enum ieee80211_sta_state new_state) 6955 { 6956 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 6957 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta); 6958 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 6959 struct ath12k_base *prev_ab = NULL, *ab; 6960 struct ath12k_link_vif *arvif; 6961 struct ath12k_link_sta *arsta; 6962 unsigned long valid_links; 6963 u16 selected_links = 0; 6964 u8 link_id = 0, i; 6965 struct ath12k *ar; 6966 int ret; 6967 6968 lockdep_assert_wiphy(hw->wiphy); 6969 6970 if (ieee80211_vif_is_mld(vif) && sta->valid_links) { 6971 WARN_ON(!sta->mlo && hweight16(sta->valid_links) != 1); 6972 link_id = ffs(sta->valid_links) - 1; 6973 } 6974 6975 /* IEEE80211_STA_NOTEXIST -> IEEE80211_STA_NONE: 6976 * New station add received. If this is a ML station then 6977 * ahsta->links_map will be zero and sta->valid_links will be 1. 6978 * Assign default link to the first link sta. 6979 */ 6980 if (old_state == IEEE80211_STA_NOTEXIST && 6981 new_state == IEEE80211_STA_NONE) { 6982 memset(ahsta, 0, sizeof(*ahsta)); 6983 6984 arsta = &ahsta->deflink; 6985 6986 /* ML sta */ 6987 if (sta->mlo && !ahsta->links_map && 6988 (hweight16(sta->valid_links) == 1)) { 6989 ret = ath12k_peer_ml_create(ah, sta); 6990 if (ret) { 6991 ath12k_hw_warn(ah, "unable to create ML peer for sta %pM", 6992 sta->addr); 6993 goto exit; 6994 } 6995 } 6996 6997 ret = ath12k_mac_assign_link_sta(ah, ahsta, arsta, ahvif, 6998 link_id); 6999 if (ret) { 7000 ath12k_hw_warn(ah, "unable assign link %d for sta %pM", 7001 link_id, sta->addr); 7002 goto exit; 7003 } 7004 7005 /* above arsta will get memset, hence do this after assign 7006 * link sta 7007 */ 7008 if (sta->mlo) { 7009 /* For station mode, arvif->is_sta_assoc_link has been set when 7010 * vdev starts. Make sure the arvif/arsta pair have same setting 7011 */ 7012 if (vif->type == NL80211_IFTYPE_STATION && 7013 !arsta->arvif->is_sta_assoc_link) { 7014 ath12k_hw_warn(ah, "failed to verify assoc link setting with link id %u\n", 7015 link_id); 7016 ret = -EINVAL; 7017 goto exit; 7018 } 7019 7020 arsta->is_assoc_link = true; 7021 ahsta->assoc_link_id = link_id; 7022 } 7023 } 7024 7025 /* In the ML station scenario, activate all partner links once the 7026 * client is transitioning to the associated state. 7027 * 7028 * FIXME: Ideally, this activation should occur when the client 7029 * transitions to the authorized state. However, there are some 7030 * issues with handling this in the firmware. Until the firmware 7031 * can manage it properly, activate the links when the client is 7032 * about to move to the associated state. 7033 */ 7034 if (ieee80211_vif_is_mld(vif) && vif->type == NL80211_IFTYPE_STATION && 7035 old_state == IEEE80211_STA_AUTH && new_state == IEEE80211_STA_ASSOC) { 7036 /* TODO: for now only do link selection for single device 7037 * MLO case. Other cases would be handled in the future. 7038 */ 7039 ab = ah->radio[0].ab; 7040 if (ab->ag->num_devices == 1) { 7041 ret = ath12k_mac_select_links(ab, vif, hw, &selected_links); 7042 if (ret) { 7043 ath12k_warn(ab, 7044 "failed to get selected links: %d\n", ret); 7045 goto exit; 7046 } 7047 } else { 7048 selected_links = ieee80211_vif_usable_links(vif); 7049 } 7050 7051 ieee80211_set_active_links(vif, selected_links); 7052 } 7053 7054 /* Handle all the other state transitions in generic way */ 7055 valid_links = ahsta->links_map; 7056 for_each_set_bit(link_id, &valid_links, IEEE80211_MLD_MAX_NUM_LINKS) { 7057 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 7058 arsta = wiphy_dereference(hw->wiphy, ahsta->link[link_id]); 7059 /* some assumptions went wrong! */ 7060 if (WARN_ON(!arvif || !arsta)) 7061 continue; 7062 7063 /* vdev might be in deleted */ 7064 if (WARN_ON(!arvif->ar)) 7065 continue; 7066 7067 ret = ath12k_mac_handle_link_sta_state(hw, arvif, arsta, 7068 old_state, new_state); 7069 if (ret) { 7070 ath12k_hw_warn(ah, "unable to move link sta %d of sta %pM from state %d to %d", 7071 link_id, arsta->addr, old_state, new_state); 7072 goto exit; 7073 } 7074 } 7075 7076 if (ieee80211_vif_is_mld(vif) && vif->type == NL80211_IFTYPE_STATION && 7077 old_state == IEEE80211_STA_ASSOC && new_state == IEEE80211_STA_AUTHORIZED) { 7078 for_each_ar(ah, ar, i) { 7079 ab = ar->ab; 7080 if (prev_ab == ab) 7081 continue; 7082 7083 ret = ath12k_mac_mlo_sta_update_link_active(ab, hw, ahvif); 7084 if (ret) { 7085 ath12k_warn(ab, 7086 "failed to update link active state on connect %d\n", 7087 ret); 7088 goto exit; 7089 } 7090 7091 prev_ab = ab; 7092 } 7093 } 7094 /* IEEE80211_STA_NONE -> IEEE80211_STA_NOTEXIST: 7095 * Remove the station from driver (handle ML sta here since that 7096 * needs special handling. Normal sta will be handled in generic 7097 * handler below 7098 */ 7099 if (old_state == IEEE80211_STA_NONE && 7100 new_state == IEEE80211_STA_NOTEXIST && sta->mlo) 7101 ath12k_mac_ml_station_remove(ahvif, ahsta); 7102 7103 ret = 0; 7104 7105 exit: 7106 /* update the state if everything went well */ 7107 if (!ret) 7108 ahsta->state = new_state; 7109 7110 return ret; 7111 } 7112 7113 static int ath12k_mac_op_sta_set_txpwr(struct ieee80211_hw *hw, 7114 struct ieee80211_vif *vif, 7115 struct ieee80211_sta *sta) 7116 { 7117 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta); 7118 struct ath12k *ar; 7119 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 7120 struct ath12k_link_vif *arvif; 7121 struct ath12k_link_sta *arsta; 7122 u8 link_id; 7123 int ret; 7124 s16 txpwr; 7125 7126 lockdep_assert_wiphy(hw->wiphy); 7127 7128 /* TODO: use link id from mac80211 once that's implemented */ 7129 link_id = 0; 7130 7131 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 7132 arsta = wiphy_dereference(hw->wiphy, ahsta->link[link_id]); 7133 7134 if (sta->deflink.txpwr.type == NL80211_TX_POWER_AUTOMATIC) { 7135 txpwr = 0; 7136 } else { 7137 txpwr = sta->deflink.txpwr.power; 7138 if (!txpwr) { 7139 ret = -EINVAL; 7140 goto out; 7141 } 7142 } 7143 7144 if (txpwr > ATH12K_TX_POWER_MAX_VAL || txpwr < ATH12K_TX_POWER_MIN_VAL) { 7145 ret = -EINVAL; 7146 goto out; 7147 } 7148 7149 ar = arvif->ar; 7150 7151 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, arvif->vdev_id, 7152 WMI_PEER_USE_FIXED_PWR, txpwr); 7153 if (ret) { 7154 ath12k_warn(ar->ab, "failed to set tx power for station ret: %d\n", 7155 ret); 7156 goto out; 7157 } 7158 7159 out: 7160 return ret; 7161 } 7162 7163 static void ath12k_mac_op_link_sta_rc_update(struct ieee80211_hw *hw, 7164 struct ieee80211_vif *vif, 7165 struct ieee80211_link_sta *link_sta, 7166 u32 changed) 7167 { 7168 struct ieee80211_sta *sta = link_sta->sta; 7169 struct ath12k *ar; 7170 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta); 7171 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 7172 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 7173 struct ath12k_link_sta *arsta; 7174 struct ath12k_link_vif *arvif; 7175 struct ath12k_peer *peer; 7176 u32 bw, smps; 7177 7178 rcu_read_lock(); 7179 arvif = rcu_dereference(ahvif->link[link_sta->link_id]); 7180 if (!arvif) { 7181 ath12k_hw_warn(ah, "mac sta rc update failed to fetch link vif on link id %u for peer %pM\n", 7182 link_sta->link_id, sta->addr); 7183 rcu_read_unlock(); 7184 return; 7185 } 7186 7187 ar = arvif->ar; 7188 7189 arsta = rcu_dereference(ahsta->link[link_sta->link_id]); 7190 if (!arsta) { 7191 rcu_read_unlock(); 7192 ath12k_warn(ar->ab, "mac sta rc update failed to fetch link sta on link id %u for peer %pM\n", 7193 link_sta->link_id, sta->addr); 7194 return; 7195 } 7196 spin_lock_bh(&ar->ab->base_lock); 7197 7198 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr); 7199 if (!peer) { 7200 spin_unlock_bh(&ar->ab->base_lock); 7201 rcu_read_unlock(); 7202 ath12k_warn(ar->ab, "mac sta rc update failed to find peer %pM on vdev %i\n", 7203 arsta->addr, arvif->vdev_id); 7204 return; 7205 } 7206 7207 spin_unlock_bh(&ar->ab->base_lock); 7208 7209 if (arsta->link_id >= IEEE80211_MLD_MAX_NUM_LINKS) { 7210 rcu_read_unlock(); 7211 return; 7212 } 7213 7214 link_sta = rcu_dereference(sta->link[arsta->link_id]); 7215 if (!link_sta) { 7216 rcu_read_unlock(); 7217 ath12k_warn(ar->ab, "unable to access link sta in rc update for sta %pM link %u\n", 7218 sta->addr, arsta->link_id); 7219 return; 7220 } 7221 7222 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 7223 "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n", 7224 arsta->addr, changed, link_sta->bandwidth, link_sta->rx_nss, 7225 link_sta->smps_mode); 7226 7227 spin_lock_bh(&ar->data_lock); 7228 7229 if (changed & IEEE80211_RC_BW_CHANGED) { 7230 bw = ath12k_mac_ieee80211_sta_bw_to_wmi(ar, link_sta); 7231 arsta->bw_prev = arsta->bw; 7232 arsta->bw = bw; 7233 } 7234 7235 if (changed & IEEE80211_RC_NSS_CHANGED) 7236 arsta->nss = link_sta->rx_nss; 7237 7238 if (changed & IEEE80211_RC_SMPS_CHANGED) { 7239 smps = WMI_PEER_SMPS_PS_NONE; 7240 7241 switch (link_sta->smps_mode) { 7242 case IEEE80211_SMPS_AUTOMATIC: 7243 case IEEE80211_SMPS_OFF: 7244 smps = WMI_PEER_SMPS_PS_NONE; 7245 break; 7246 case IEEE80211_SMPS_STATIC: 7247 smps = WMI_PEER_SMPS_STATIC; 7248 break; 7249 case IEEE80211_SMPS_DYNAMIC: 7250 smps = WMI_PEER_SMPS_DYNAMIC; 7251 break; 7252 default: 7253 ath12k_warn(ar->ab, "Invalid smps %d in sta rc update for %pM link %u\n", 7254 link_sta->smps_mode, arsta->addr, link_sta->link_id); 7255 smps = WMI_PEER_SMPS_PS_NONE; 7256 break; 7257 } 7258 7259 arsta->smps = smps; 7260 } 7261 7262 arsta->changed |= changed; 7263 7264 spin_unlock_bh(&ar->data_lock); 7265 7266 wiphy_work_queue(hw->wiphy, &arsta->update_wk); 7267 7268 rcu_read_unlock(); 7269 } 7270 7271 static struct ath12k_link_sta *ath12k_mac_alloc_assign_link_sta(struct ath12k_hw *ah, 7272 struct ath12k_sta *ahsta, 7273 struct ath12k_vif *ahvif, 7274 u8 link_id) 7275 { 7276 struct ath12k_link_sta *arsta; 7277 int ret; 7278 7279 lockdep_assert_wiphy(ah->hw->wiphy); 7280 7281 if (link_id >= IEEE80211_MLD_MAX_NUM_LINKS) 7282 return NULL; 7283 7284 arsta = wiphy_dereference(ah->hw->wiphy, ahsta->link[link_id]); 7285 if (arsta) 7286 return NULL; 7287 7288 arsta = kmalloc(sizeof(*arsta), GFP_KERNEL); 7289 if (!arsta) 7290 return NULL; 7291 7292 ret = ath12k_mac_assign_link_sta(ah, ahsta, arsta, ahvif, link_id); 7293 if (ret) { 7294 kfree(arsta); 7295 return NULL; 7296 } 7297 7298 return arsta; 7299 } 7300 7301 static int ath12k_mac_op_change_sta_links(struct ieee80211_hw *hw, 7302 struct ieee80211_vif *vif, 7303 struct ieee80211_sta *sta, 7304 u16 old_links, u16 new_links) 7305 { 7306 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 7307 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta); 7308 struct ath12k_hw *ah = hw->priv; 7309 struct ath12k_link_vif *arvif; 7310 struct ath12k_link_sta *arsta; 7311 unsigned long valid_links; 7312 struct ath12k *ar; 7313 u8 link_id; 7314 int ret; 7315 7316 lockdep_assert_wiphy(hw->wiphy); 7317 7318 if (!sta->valid_links) 7319 return -EINVAL; 7320 7321 /* Firmware does not support removal of one of link stas. All sta 7322 * would be removed during ML STA delete in sta_state(), hence link 7323 * sta removal is not handled here. 7324 */ 7325 if (new_links < old_links) 7326 return 0; 7327 7328 if (ahsta->ml_peer_id == ATH12K_MLO_PEER_ID_INVALID) { 7329 ath12k_hw_warn(ah, "unable to add link for ml sta %pM", sta->addr); 7330 return -EINVAL; 7331 } 7332 7333 /* this op is expected only after initial sta insertion with default link */ 7334 if (WARN_ON(ahsta->links_map == 0)) 7335 return -EINVAL; 7336 7337 valid_links = new_links; 7338 for_each_set_bit(link_id, &valid_links, IEEE80211_MLD_MAX_NUM_LINKS) { 7339 if (ahsta->links_map & BIT(link_id)) 7340 continue; 7341 7342 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 7343 arsta = ath12k_mac_alloc_assign_link_sta(ah, ahsta, ahvif, link_id); 7344 7345 if (!arvif || !arsta) { 7346 ath12k_hw_warn(ah, "Failed to alloc/assign link sta"); 7347 continue; 7348 } 7349 7350 ar = arvif->ar; 7351 if (!ar) 7352 continue; 7353 7354 ret = ath12k_mac_station_add(ar, arvif, arsta); 7355 if (ret) { 7356 ath12k_warn(ar->ab, "Failed to add station: %pM for VDEV: %d\n", 7357 arsta->addr, arvif->vdev_id); 7358 ath12k_mac_free_unassign_link_sta(ah, ahsta, link_id); 7359 return ret; 7360 } 7361 } 7362 7363 return 0; 7364 } 7365 7366 static bool ath12k_mac_op_can_activate_links(struct ieee80211_hw *hw, 7367 struct ieee80211_vif *vif, 7368 u16 active_links) 7369 { 7370 /* TODO: Handle recovery case */ 7371 7372 return true; 7373 } 7374 7375 static int ath12k_conf_tx_uapsd(struct ath12k_link_vif *arvif, 7376 u16 ac, bool enable) 7377 { 7378 struct ath12k *ar = arvif->ar; 7379 struct ath12k_vif *ahvif = arvif->ahvif; 7380 u32 value; 7381 int ret; 7382 7383 if (ahvif->vdev_type != WMI_VDEV_TYPE_STA) 7384 return 0; 7385 7386 switch (ac) { 7387 case IEEE80211_AC_VO: 7388 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN | 7389 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN; 7390 break; 7391 case IEEE80211_AC_VI: 7392 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN | 7393 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN; 7394 break; 7395 case IEEE80211_AC_BE: 7396 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN | 7397 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN; 7398 break; 7399 case IEEE80211_AC_BK: 7400 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN | 7401 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN; 7402 break; 7403 } 7404 7405 if (enable) 7406 ahvif->u.sta.uapsd |= value; 7407 else 7408 ahvif->u.sta.uapsd &= ~value; 7409 7410 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, 7411 WMI_STA_PS_PARAM_UAPSD, 7412 ahvif->u.sta.uapsd); 7413 if (ret) { 7414 ath12k_warn(ar->ab, "could not set uapsd params %d\n", ret); 7415 goto exit; 7416 } 7417 7418 if (ahvif->u.sta.uapsd) 7419 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD; 7420 else 7421 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE; 7422 7423 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, 7424 WMI_STA_PS_PARAM_RX_WAKE_POLICY, 7425 value); 7426 if (ret) 7427 ath12k_warn(ar->ab, "could not set rx wake param %d\n", ret); 7428 7429 exit: 7430 return ret; 7431 } 7432 7433 static int ath12k_mac_conf_tx(struct ath12k_link_vif *arvif, u16 ac, 7434 const struct ieee80211_tx_queue_params *params) 7435 { 7436 struct wmi_wmm_params_arg *p = NULL; 7437 struct ath12k *ar = arvif->ar; 7438 struct ath12k_base *ab = ar->ab; 7439 int ret; 7440 7441 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 7442 7443 switch (ac) { 7444 case IEEE80211_AC_VO: 7445 p = &arvif->wmm_params.ac_vo; 7446 break; 7447 case IEEE80211_AC_VI: 7448 p = &arvif->wmm_params.ac_vi; 7449 break; 7450 case IEEE80211_AC_BE: 7451 p = &arvif->wmm_params.ac_be; 7452 break; 7453 case IEEE80211_AC_BK: 7454 p = &arvif->wmm_params.ac_bk; 7455 break; 7456 } 7457 7458 if (WARN_ON(!p)) { 7459 ret = -EINVAL; 7460 goto exit; 7461 } 7462 7463 p->cwmin = params->cw_min; 7464 p->cwmax = params->cw_max; 7465 p->aifs = params->aifs; 7466 p->txop = params->txop; 7467 7468 ret = ath12k_wmi_send_wmm_update_cmd(ar, arvif->vdev_id, 7469 &arvif->wmm_params); 7470 if (ret) { 7471 ath12k_warn(ab, "pdev idx %d failed to set wmm params: %d\n", 7472 ar->pdev_idx, ret); 7473 goto exit; 7474 } 7475 7476 ret = ath12k_conf_tx_uapsd(arvif, ac, params->uapsd); 7477 if (ret) 7478 ath12k_warn(ab, "pdev idx %d failed to set sta uapsd: %d\n", 7479 ar->pdev_idx, ret); 7480 7481 exit: 7482 return ret; 7483 } 7484 7485 static int ath12k_mac_op_conf_tx(struct ieee80211_hw *hw, 7486 struct ieee80211_vif *vif, 7487 unsigned int link_id, u16 ac, 7488 const struct ieee80211_tx_queue_params *params) 7489 { 7490 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 7491 struct ath12k_link_vif *arvif; 7492 struct ath12k_vif_cache *cache; 7493 int ret; 7494 7495 lockdep_assert_wiphy(hw->wiphy); 7496 7497 if (link_id >= IEEE80211_MLD_MAX_NUM_LINKS) 7498 return -EINVAL; 7499 7500 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 7501 if (!arvif || !arvif->is_created) { 7502 cache = ath12k_ahvif_get_link_cache(ahvif, link_id); 7503 if (!cache) 7504 return -ENOSPC; 7505 7506 cache->tx_conf.changed = true; 7507 cache->tx_conf.ac = ac; 7508 cache->tx_conf.tx_queue_params = *params; 7509 7510 return 0; 7511 } 7512 7513 ret = ath12k_mac_conf_tx(arvif, ac, params); 7514 7515 return ret; 7516 } 7517 7518 static struct ieee80211_sta_ht_cap 7519 ath12k_create_ht_cap(struct ath12k *ar, u32 ar_ht_cap, u32 rate_cap_rx_chainmask) 7520 { 7521 int i; 7522 struct ieee80211_sta_ht_cap ht_cap = {0}; 7523 u32 ar_vht_cap = ar->pdev->cap.vht_cap; 7524 7525 if (!(ar_ht_cap & WMI_HT_CAP_ENABLED)) 7526 return ht_cap; 7527 7528 ht_cap.ht_supported = 1; 7529 ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K; 7530 ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_NONE; 7531 ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40; 7532 ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40; 7533 ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT; 7534 7535 if (ar_ht_cap & WMI_HT_CAP_HT20_SGI) 7536 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20; 7537 7538 if (ar_ht_cap & WMI_HT_CAP_HT40_SGI) 7539 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40; 7540 7541 if (ar_ht_cap & WMI_HT_CAP_DYNAMIC_SMPS) { 7542 u32 smps; 7543 7544 smps = WLAN_HT_CAP_SM_PS_DYNAMIC; 7545 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT; 7546 7547 ht_cap.cap |= smps; 7548 } 7549 7550 if (ar_ht_cap & WMI_HT_CAP_TX_STBC) 7551 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC; 7552 7553 if (ar_ht_cap & WMI_HT_CAP_RX_STBC) { 7554 u32 stbc; 7555 7556 stbc = ar_ht_cap; 7557 stbc &= WMI_HT_CAP_RX_STBC; 7558 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT; 7559 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT; 7560 stbc &= IEEE80211_HT_CAP_RX_STBC; 7561 7562 ht_cap.cap |= stbc; 7563 } 7564 7565 if (ar_ht_cap & WMI_HT_CAP_RX_LDPC) 7566 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING; 7567 7568 if (ar_ht_cap & WMI_HT_CAP_L_SIG_TXOP_PROT) 7569 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT; 7570 7571 if (ar_vht_cap & WMI_VHT_CAP_MAX_MPDU_LEN_MASK) 7572 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU; 7573 7574 for (i = 0; i < ar->num_rx_chains; i++) { 7575 if (rate_cap_rx_chainmask & BIT(i)) 7576 ht_cap.mcs.rx_mask[i] = 0xFF; 7577 } 7578 7579 ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED; 7580 7581 return ht_cap; 7582 } 7583 7584 static int ath12k_mac_set_txbf_conf(struct ath12k_link_vif *arvif) 7585 { 7586 u32 value = 0; 7587 struct ath12k *ar = arvif->ar; 7588 struct ath12k_vif *ahvif = arvif->ahvif; 7589 int nsts; 7590 int sound_dim; 7591 u32 vht_cap = ar->pdev->cap.vht_cap; 7592 u32 vdev_param = WMI_VDEV_PARAM_TXBF; 7593 7594 if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)) { 7595 nsts = vht_cap & IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK; 7596 nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT; 7597 value |= SM(nsts, WMI_TXBF_STS_CAP_OFFSET); 7598 } 7599 7600 if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)) { 7601 sound_dim = vht_cap & 7602 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK; 7603 sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT; 7604 if (sound_dim > (ar->num_tx_chains - 1)) 7605 sound_dim = ar->num_tx_chains - 1; 7606 value |= SM(sound_dim, WMI_BF_SOUND_DIM_OFFSET); 7607 } 7608 7609 if (!value) 7610 return 0; 7611 7612 if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) { 7613 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER; 7614 7615 if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) && 7616 ahvif->vdev_type == WMI_VDEV_TYPE_AP) 7617 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFER; 7618 } 7619 7620 if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE) { 7621 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE; 7622 7623 if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE) && 7624 ahvif->vdev_type == WMI_VDEV_TYPE_STA) 7625 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE; 7626 } 7627 7628 return ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 7629 vdev_param, value); 7630 } 7631 7632 static void ath12k_set_vht_txbf_cap(struct ath12k *ar, u32 *vht_cap) 7633 { 7634 bool subfer, subfee; 7635 int sound_dim = 0; 7636 7637 subfer = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)); 7638 subfee = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)); 7639 7640 if (ar->num_tx_chains < 2) { 7641 *vht_cap &= ~(IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE); 7642 subfer = false; 7643 } 7644 7645 /* If SU Beaformer is not set, then disable MU Beamformer Capability */ 7646 if (!subfer) 7647 *vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE); 7648 7649 /* If SU Beaformee is not set, then disable MU Beamformee Capability */ 7650 if (!subfee) 7651 *vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE); 7652 7653 sound_dim = u32_get_bits(*vht_cap, 7654 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK); 7655 *vht_cap = u32_replace_bits(*vht_cap, 0, 7656 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK); 7657 7658 /* TODO: Need to check invalid STS and Sound_dim values set by FW? */ 7659 7660 /* Enable Sounding Dimension Field only if SU BF is enabled */ 7661 if (subfer) { 7662 if (sound_dim > (ar->num_tx_chains - 1)) 7663 sound_dim = ar->num_tx_chains - 1; 7664 7665 *vht_cap = u32_replace_bits(*vht_cap, sound_dim, 7666 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK); 7667 } 7668 7669 /* Use the STS advertised by FW unless SU Beamformee is not supported*/ 7670 if (!subfee) 7671 *vht_cap &= ~(IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK); 7672 } 7673 7674 static struct ieee80211_sta_vht_cap 7675 ath12k_create_vht_cap(struct ath12k *ar, u32 rate_cap_tx_chainmask, 7676 u32 rate_cap_rx_chainmask) 7677 { 7678 struct ieee80211_sta_vht_cap vht_cap = {0}; 7679 u16 txmcs_map, rxmcs_map; 7680 int i; 7681 7682 vht_cap.vht_supported = 1; 7683 vht_cap.cap = ar->pdev->cap.vht_cap; 7684 7685 ath12k_set_vht_txbf_cap(ar, &vht_cap.cap); 7686 7687 /* 80P80 is not supported */ 7688 vht_cap.cap &= ~IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ; 7689 7690 rxmcs_map = 0; 7691 txmcs_map = 0; 7692 for (i = 0; i < 8; i++) { 7693 if (i < ar->num_tx_chains && rate_cap_tx_chainmask & BIT(i)) 7694 txmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2); 7695 else 7696 txmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2); 7697 7698 if (i < ar->num_rx_chains && rate_cap_rx_chainmask & BIT(i)) 7699 rxmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2); 7700 else 7701 rxmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2); 7702 } 7703 7704 if (rate_cap_tx_chainmask <= 1) 7705 vht_cap.cap &= ~IEEE80211_VHT_CAP_TXSTBC; 7706 7707 vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(rxmcs_map); 7708 vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(txmcs_map); 7709 7710 /* Check if the HW supports 1:1 NSS ratio and reset 7711 * EXT NSS BW Support field to 0 to indicate 1:1 ratio 7712 */ 7713 if (ar->pdev->cap.nss_ratio_info == WMI_NSS_RATIO_1_NSS) 7714 vht_cap.cap &= ~IEEE80211_VHT_CAP_EXT_NSS_BW_MASK; 7715 7716 return vht_cap; 7717 } 7718 7719 static void ath12k_mac_setup_ht_vht_cap(struct ath12k *ar, 7720 struct ath12k_pdev_cap *cap, 7721 u32 *ht_cap_info) 7722 { 7723 struct ieee80211_supported_band *band; 7724 u32 rate_cap_tx_chainmask; 7725 u32 rate_cap_rx_chainmask; 7726 u32 ht_cap; 7727 7728 rate_cap_tx_chainmask = ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift; 7729 rate_cap_rx_chainmask = ar->cfg_rx_chainmask >> cap->rx_chain_mask_shift; 7730 7731 if (cap->supported_bands & WMI_HOST_WLAN_2GHZ_CAP) { 7732 band = &ar->mac.sbands[NL80211_BAND_2GHZ]; 7733 ht_cap = cap->band[NL80211_BAND_2GHZ].ht_cap_info; 7734 if (ht_cap_info) 7735 *ht_cap_info = ht_cap; 7736 band->ht_cap = ath12k_create_ht_cap(ar, ht_cap, 7737 rate_cap_rx_chainmask); 7738 } 7739 7740 if (cap->supported_bands & WMI_HOST_WLAN_5GHZ_CAP && 7741 (ar->ab->hw_params->single_pdev_only || 7742 !ar->supports_6ghz)) { 7743 band = &ar->mac.sbands[NL80211_BAND_5GHZ]; 7744 ht_cap = cap->band[NL80211_BAND_5GHZ].ht_cap_info; 7745 if (ht_cap_info) 7746 *ht_cap_info = ht_cap; 7747 band->ht_cap = ath12k_create_ht_cap(ar, ht_cap, 7748 rate_cap_rx_chainmask); 7749 band->vht_cap = ath12k_create_vht_cap(ar, rate_cap_tx_chainmask, 7750 rate_cap_rx_chainmask); 7751 } 7752 } 7753 7754 static int ath12k_check_chain_mask(struct ath12k *ar, u32 ant, bool is_tx_ant) 7755 { 7756 /* TODO: Check the request chainmask against the supported 7757 * chainmask table which is advertised in extented_service_ready event 7758 */ 7759 7760 return 0; 7761 } 7762 7763 static void ath12k_gen_ppe_thresh(struct ath12k_wmi_ppe_threshold_arg *fw_ppet, 7764 u8 *he_ppet) 7765 { 7766 int nss, ru; 7767 u8 bit = 7; 7768 7769 he_ppet[0] = fw_ppet->numss_m1 & IEEE80211_PPE_THRES_NSS_MASK; 7770 he_ppet[0] |= (fw_ppet->ru_bit_mask << 7771 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS) & 7772 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK; 7773 for (nss = 0; nss <= fw_ppet->numss_m1; nss++) { 7774 for (ru = 0; ru < 4; ru++) { 7775 u8 val; 7776 int i; 7777 7778 if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0) 7779 continue; 7780 val = (fw_ppet->ppet16_ppet8_ru3_ru0[nss] >> (ru * 6)) & 7781 0x3f; 7782 val = ((val >> 3) & 0x7) | ((val & 0x7) << 3); 7783 for (i = 5; i >= 0; i--) { 7784 he_ppet[bit / 8] |= 7785 ((val >> i) & 0x1) << ((bit % 8)); 7786 bit++; 7787 } 7788 } 7789 } 7790 } 7791 7792 static void 7793 ath12k_mac_filter_he_cap_mesh(struct ieee80211_he_cap_elem *he_cap_elem) 7794 { 7795 u8 m; 7796 7797 m = IEEE80211_HE_MAC_CAP0_TWT_RES | 7798 IEEE80211_HE_MAC_CAP0_TWT_REQ; 7799 he_cap_elem->mac_cap_info[0] &= ~m; 7800 7801 m = IEEE80211_HE_MAC_CAP2_TRS | 7802 IEEE80211_HE_MAC_CAP2_BCAST_TWT | 7803 IEEE80211_HE_MAC_CAP2_MU_CASCADING; 7804 he_cap_elem->mac_cap_info[2] &= ~m; 7805 7806 m = IEEE80211_HE_MAC_CAP3_FLEX_TWT_SCHED | 7807 IEEE80211_HE_MAC_CAP2_BCAST_TWT | 7808 IEEE80211_HE_MAC_CAP2_MU_CASCADING; 7809 he_cap_elem->mac_cap_info[3] &= ~m; 7810 7811 m = IEEE80211_HE_MAC_CAP4_BSRP_BQRP_A_MPDU_AGG | 7812 IEEE80211_HE_MAC_CAP4_BQR; 7813 he_cap_elem->mac_cap_info[4] &= ~m; 7814 7815 m = IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECTIVE_TRANSMISSION | 7816 IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU | 7817 IEEE80211_HE_MAC_CAP5_PUNCTURED_SOUNDING | 7818 IEEE80211_HE_MAC_CAP5_HT_VHT_TRIG_FRAME_RX; 7819 he_cap_elem->mac_cap_info[5] &= ~m; 7820 7821 m = IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO | 7822 IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO; 7823 he_cap_elem->phy_cap_info[2] &= ~m; 7824 7825 m = IEEE80211_HE_PHY_CAP3_RX_PARTIAL_BW_SU_IN_20MHZ_MU | 7826 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK | 7827 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_MASK; 7828 he_cap_elem->phy_cap_info[3] &= ~m; 7829 7830 m = IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER; 7831 he_cap_elem->phy_cap_info[4] &= ~m; 7832 7833 m = IEEE80211_HE_PHY_CAP5_NG16_MU_FEEDBACK; 7834 he_cap_elem->phy_cap_info[5] &= ~m; 7835 7836 m = IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU | 7837 IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB | 7838 IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB | 7839 IEEE80211_HE_PHY_CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO; 7840 he_cap_elem->phy_cap_info[6] &= ~m; 7841 7842 m = IEEE80211_HE_PHY_CAP7_PSR_BASED_SR | 7843 IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP | 7844 IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ | 7845 IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ; 7846 he_cap_elem->phy_cap_info[7] &= ~m; 7847 7848 m = IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI | 7849 IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G | 7850 IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU | 7851 IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU; 7852 he_cap_elem->phy_cap_info[8] &= ~m; 7853 7854 m = IEEE80211_HE_PHY_CAP9_LONGER_THAN_16_SIGB_OFDM_SYM | 7855 IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK | 7856 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU | 7857 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU | 7858 IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_COMP_SIGB | 7859 IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_NON_COMP_SIGB; 7860 he_cap_elem->phy_cap_info[9] &= ~m; 7861 } 7862 7863 static __le16 ath12k_mac_setup_he_6ghz_cap(struct ath12k_pdev_cap *pcap, 7864 struct ath12k_band_cap *bcap) 7865 { 7866 u8 val; 7867 7868 bcap->he_6ghz_capa = IEEE80211_HT_MPDU_DENSITY_NONE; 7869 if (bcap->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) 7870 bcap->he_6ghz_capa |= 7871 u32_encode_bits(WLAN_HT_CAP_SM_PS_DYNAMIC, 7872 IEEE80211_HE_6GHZ_CAP_SM_PS); 7873 else 7874 bcap->he_6ghz_capa |= 7875 u32_encode_bits(WLAN_HT_CAP_SM_PS_DISABLED, 7876 IEEE80211_HE_6GHZ_CAP_SM_PS); 7877 val = u32_get_bits(pcap->vht_cap, 7878 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK); 7879 bcap->he_6ghz_capa |= 7880 u32_encode_bits(val, IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP); 7881 val = u32_get_bits(pcap->vht_cap, 7882 IEEE80211_VHT_CAP_MAX_MPDU_MASK); 7883 bcap->he_6ghz_capa |= 7884 u32_encode_bits(val, IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN); 7885 if (pcap->vht_cap & IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN) 7886 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS; 7887 if (pcap->vht_cap & IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN) 7888 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS; 7889 7890 return cpu_to_le16(bcap->he_6ghz_capa); 7891 } 7892 7893 static void ath12k_mac_set_hemcsmap(struct ath12k *ar, 7894 struct ath12k_pdev_cap *cap, 7895 struct ieee80211_sta_he_cap *he_cap) 7896 { 7897 struct ieee80211_he_mcs_nss_supp *mcs_nss = &he_cap->he_mcs_nss_supp; 7898 u8 maxtxnss_160 = ath12k_get_nss_160mhz(ar, ar->num_tx_chains); 7899 u8 maxrxnss_160 = ath12k_get_nss_160mhz(ar, ar->num_rx_chains); 7900 u16 txmcs_map_160 = 0, rxmcs_map_160 = 0; 7901 u16 txmcs_map = 0, rxmcs_map = 0; 7902 u32 i; 7903 7904 for (i = 0; i < 8; i++) { 7905 if (i < ar->num_tx_chains && 7906 (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i)) 7907 txmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2); 7908 else 7909 txmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2); 7910 7911 if (i < ar->num_rx_chains && 7912 (ar->cfg_rx_chainmask >> cap->tx_chain_mask_shift) & BIT(i)) 7913 rxmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2); 7914 else 7915 rxmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2); 7916 7917 if (i < maxtxnss_160 && 7918 (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i)) 7919 txmcs_map_160 |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2); 7920 else 7921 txmcs_map_160 |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2); 7922 7923 if (i < maxrxnss_160 && 7924 (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i)) 7925 rxmcs_map_160 |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2); 7926 else 7927 rxmcs_map_160 |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2); 7928 } 7929 7930 mcs_nss->rx_mcs_80 = cpu_to_le16(rxmcs_map & 0xffff); 7931 mcs_nss->tx_mcs_80 = cpu_to_le16(txmcs_map & 0xffff); 7932 mcs_nss->rx_mcs_160 = cpu_to_le16(rxmcs_map_160 & 0xffff); 7933 mcs_nss->tx_mcs_160 = cpu_to_le16(txmcs_map_160 & 0xffff); 7934 } 7935 7936 static void ath12k_mac_copy_he_cap(struct ath12k *ar, 7937 struct ath12k_band_cap *band_cap, 7938 int iftype, u8 num_tx_chains, 7939 struct ieee80211_sta_he_cap *he_cap) 7940 { 7941 struct ieee80211_he_cap_elem *he_cap_elem = &he_cap->he_cap_elem; 7942 7943 he_cap->has_he = true; 7944 memcpy(he_cap_elem->mac_cap_info, band_cap->he_cap_info, 7945 sizeof(he_cap_elem->mac_cap_info)); 7946 memcpy(he_cap_elem->phy_cap_info, band_cap->he_cap_phy_info, 7947 sizeof(he_cap_elem->phy_cap_info)); 7948 7949 he_cap_elem->mac_cap_info[1] &= 7950 IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_MASK; 7951 he_cap_elem->phy_cap_info[0] &= 7952 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G | 7953 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G | 7954 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G; 7955 /* 80PLUS80 is not supported */ 7956 he_cap_elem->phy_cap_info[0] &= 7957 ~IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G; 7958 he_cap_elem->phy_cap_info[5] &= 7959 ~IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK; 7960 he_cap_elem->phy_cap_info[5] |= num_tx_chains - 1; 7961 7962 switch (iftype) { 7963 case NL80211_IFTYPE_AP: 7964 he_cap_elem->mac_cap_info[2] &= 7965 ~IEEE80211_HE_MAC_CAP2_BCAST_TWT; 7966 he_cap_elem->phy_cap_info[3] &= 7967 ~IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK; 7968 he_cap_elem->phy_cap_info[9] |= 7969 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU; 7970 break; 7971 case NL80211_IFTYPE_STATION: 7972 he_cap_elem->mac_cap_info[0] &= ~IEEE80211_HE_MAC_CAP0_TWT_RES; 7973 he_cap_elem->mac_cap_info[0] |= IEEE80211_HE_MAC_CAP0_TWT_REQ; 7974 he_cap_elem->phy_cap_info[9] |= 7975 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU; 7976 break; 7977 case NL80211_IFTYPE_MESH_POINT: 7978 ath12k_mac_filter_he_cap_mesh(he_cap_elem); 7979 break; 7980 } 7981 7982 ath12k_mac_set_hemcsmap(ar, &ar->pdev->cap, he_cap); 7983 memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres)); 7984 if (he_cap_elem->phy_cap_info[6] & 7985 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) 7986 ath12k_gen_ppe_thresh(&band_cap->he_ppet, he_cap->ppe_thres); 7987 } 7988 7989 static void 7990 ath12k_mac_copy_eht_mcs_nss(struct ath12k_band_cap *band_cap, 7991 struct ieee80211_eht_mcs_nss_supp *mcs_nss, 7992 const struct ieee80211_he_cap_elem *he_cap, 7993 const struct ieee80211_eht_cap_elem_fixed *eht_cap) 7994 { 7995 if ((he_cap->phy_cap_info[0] & 7996 (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G | 7997 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G | 7998 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G | 7999 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)) == 0) 8000 memcpy(&mcs_nss->only_20mhz, &band_cap->eht_mcs_20_only, 8001 sizeof(struct ieee80211_eht_mcs_nss_supp_20mhz_only)); 8002 8003 if (he_cap->phy_cap_info[0] & 8004 (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G | 8005 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G)) 8006 memcpy(&mcs_nss->bw._80, &band_cap->eht_mcs_80, 8007 sizeof(struct ieee80211_eht_mcs_nss_supp_bw)); 8008 8009 if (he_cap->phy_cap_info[0] & 8010 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G) 8011 memcpy(&mcs_nss->bw._160, &band_cap->eht_mcs_160, 8012 sizeof(struct ieee80211_eht_mcs_nss_supp_bw)); 8013 8014 if (eht_cap->phy_cap_info[0] & IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ) 8015 memcpy(&mcs_nss->bw._320, &band_cap->eht_mcs_320, 8016 sizeof(struct ieee80211_eht_mcs_nss_supp_bw)); 8017 } 8018 8019 static void ath12k_mac_copy_eht_ppe_thresh(struct ath12k_wmi_ppe_threshold_arg *fw_ppet, 8020 struct ieee80211_sta_eht_cap *cap) 8021 { 8022 u16 bit = IEEE80211_EHT_PPE_THRES_INFO_HEADER_SIZE; 8023 u8 i, nss, ru, ppet_bit_len_per_ru = IEEE80211_EHT_PPE_THRES_INFO_PPET_SIZE * 2; 8024 8025 u8p_replace_bits(&cap->eht_ppe_thres[0], fw_ppet->numss_m1, 8026 IEEE80211_EHT_PPE_THRES_NSS_MASK); 8027 8028 u16p_replace_bits((u16 *)&cap->eht_ppe_thres[0], fw_ppet->ru_bit_mask, 8029 IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK); 8030 8031 for (nss = 0; nss <= fw_ppet->numss_m1; nss++) { 8032 for (ru = 0; 8033 ru < hweight16(IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK); 8034 ru++) { 8035 u32 val = 0; 8036 8037 if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0) 8038 continue; 8039 8040 u32p_replace_bits(&val, fw_ppet->ppet16_ppet8_ru3_ru0[nss] >> 8041 (ru * ppet_bit_len_per_ru), 8042 GENMASK(ppet_bit_len_per_ru - 1, 0)); 8043 8044 for (i = 0; i < ppet_bit_len_per_ru; i++) { 8045 cap->eht_ppe_thres[bit / 8] |= 8046 (((val >> i) & 0x1) << ((bit % 8))); 8047 bit++; 8048 } 8049 } 8050 } 8051 } 8052 8053 static void 8054 ath12k_mac_filter_eht_cap_mesh(struct ieee80211_eht_cap_elem_fixed 8055 *eht_cap_elem) 8056 { 8057 u8 m; 8058 8059 m = IEEE80211_EHT_MAC_CAP0_EPCS_PRIO_ACCESS; 8060 eht_cap_elem->mac_cap_info[0] &= ~m; 8061 8062 m = IEEE80211_EHT_PHY_CAP0_PARTIAL_BW_UL_MU_MIMO; 8063 eht_cap_elem->phy_cap_info[0] &= ~m; 8064 8065 m = IEEE80211_EHT_PHY_CAP3_NG_16_MU_FEEDBACK | 8066 IEEE80211_EHT_PHY_CAP3_CODEBOOK_7_5_MU_FDBK | 8067 IEEE80211_EHT_PHY_CAP3_TRIG_MU_BF_PART_BW_FDBK | 8068 IEEE80211_EHT_PHY_CAP3_TRIG_CQI_FDBK; 8069 eht_cap_elem->phy_cap_info[3] &= ~m; 8070 8071 m = IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO | 8072 IEEE80211_EHT_PHY_CAP4_PSR_SR_SUPP | 8073 IEEE80211_EHT_PHY_CAP4_POWER_BOOST_FACT_SUPP | 8074 IEEE80211_EHT_PHY_CAP4_EHT_MU_PPDU_4_EHT_LTF_08_GI; 8075 eht_cap_elem->phy_cap_info[4] &= ~m; 8076 8077 m = IEEE80211_EHT_PHY_CAP5_NON_TRIG_CQI_FEEDBACK | 8078 IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP | 8079 IEEE80211_EHT_PHY_CAP5_RX_LESS_242_TONE_RU_SUPP | 8080 IEEE80211_EHT_PHY_CAP5_MAX_NUM_SUPP_EHT_LTF_MASK; 8081 eht_cap_elem->phy_cap_info[5] &= ~m; 8082 8083 m = IEEE80211_EHT_PHY_CAP6_MAX_NUM_SUPP_EHT_LTF_MASK; 8084 eht_cap_elem->phy_cap_info[6] &= ~m; 8085 8086 m = IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ | 8087 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ | 8088 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ | 8089 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ | 8090 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ | 8091 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ; 8092 eht_cap_elem->phy_cap_info[7] &= ~m; 8093 } 8094 8095 static void ath12k_mac_copy_eht_cap(struct ath12k *ar, 8096 struct ath12k_band_cap *band_cap, 8097 struct ieee80211_he_cap_elem *he_cap_elem, 8098 int iftype, 8099 struct ieee80211_sta_eht_cap *eht_cap) 8100 { 8101 struct ieee80211_eht_cap_elem_fixed *eht_cap_elem = &eht_cap->eht_cap_elem; 8102 8103 memset(eht_cap, 0, sizeof(struct ieee80211_sta_eht_cap)); 8104 8105 if (!(test_bit(WMI_TLV_SERVICE_11BE, ar->ab->wmi_ab.svc_map)) || 8106 ath12k_acpi_get_disable_11be(ar->ab)) 8107 return; 8108 8109 eht_cap->has_eht = true; 8110 memcpy(eht_cap_elem->mac_cap_info, band_cap->eht_cap_mac_info, 8111 sizeof(eht_cap_elem->mac_cap_info)); 8112 memcpy(eht_cap_elem->phy_cap_info, band_cap->eht_cap_phy_info, 8113 sizeof(eht_cap_elem->phy_cap_info)); 8114 8115 switch (iftype) { 8116 case NL80211_IFTYPE_AP: 8117 eht_cap_elem->phy_cap_info[0] &= 8118 ~IEEE80211_EHT_PHY_CAP0_242_TONE_RU_GT20MHZ; 8119 eht_cap_elem->phy_cap_info[4] &= 8120 ~IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO; 8121 eht_cap_elem->phy_cap_info[5] &= 8122 ~IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP; 8123 break; 8124 case NL80211_IFTYPE_STATION: 8125 eht_cap_elem->phy_cap_info[7] &= 8126 ~(IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ | 8127 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ | 8128 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ); 8129 eht_cap_elem->phy_cap_info[7] &= 8130 ~(IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ | 8131 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ | 8132 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ); 8133 break; 8134 case NL80211_IFTYPE_MESH_POINT: 8135 ath12k_mac_filter_eht_cap_mesh(eht_cap_elem); 8136 break; 8137 default: 8138 break; 8139 } 8140 8141 ath12k_mac_copy_eht_mcs_nss(band_cap, &eht_cap->eht_mcs_nss_supp, 8142 he_cap_elem, eht_cap_elem); 8143 8144 if (eht_cap_elem->phy_cap_info[5] & 8145 IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT) 8146 ath12k_mac_copy_eht_ppe_thresh(&band_cap->eht_ppet, eht_cap); 8147 } 8148 8149 static int ath12k_mac_copy_sband_iftype_data(struct ath12k *ar, 8150 struct ath12k_pdev_cap *cap, 8151 struct ieee80211_sband_iftype_data *data, 8152 int band) 8153 { 8154 struct ath12k_band_cap *band_cap = &cap->band[band]; 8155 int i, idx = 0; 8156 8157 for (i = 0; i < NUM_NL80211_IFTYPES; i++) { 8158 struct ieee80211_sta_he_cap *he_cap = &data[idx].he_cap; 8159 8160 switch (i) { 8161 case NL80211_IFTYPE_STATION: 8162 case NL80211_IFTYPE_AP: 8163 case NL80211_IFTYPE_MESH_POINT: 8164 break; 8165 8166 default: 8167 continue; 8168 } 8169 8170 data[idx].types_mask = BIT(i); 8171 8172 ath12k_mac_copy_he_cap(ar, band_cap, i, ar->num_tx_chains, he_cap); 8173 if (band == NL80211_BAND_6GHZ) { 8174 data[idx].he_6ghz_capa.capa = 8175 ath12k_mac_setup_he_6ghz_cap(cap, band_cap); 8176 } 8177 ath12k_mac_copy_eht_cap(ar, band_cap, &he_cap->he_cap_elem, i, 8178 &data[idx].eht_cap); 8179 idx++; 8180 } 8181 8182 return idx; 8183 } 8184 8185 static void ath12k_mac_setup_sband_iftype_data(struct ath12k *ar, 8186 struct ath12k_pdev_cap *cap) 8187 { 8188 struct ieee80211_supported_band *sband; 8189 enum nl80211_band band; 8190 int count; 8191 8192 if (cap->supported_bands & WMI_HOST_WLAN_2GHZ_CAP) { 8193 band = NL80211_BAND_2GHZ; 8194 count = ath12k_mac_copy_sband_iftype_data(ar, cap, 8195 ar->mac.iftype[band], 8196 band); 8197 sband = &ar->mac.sbands[band]; 8198 _ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band], 8199 count); 8200 } 8201 8202 if (cap->supported_bands & WMI_HOST_WLAN_5GHZ_CAP) { 8203 band = NL80211_BAND_5GHZ; 8204 count = ath12k_mac_copy_sband_iftype_data(ar, cap, 8205 ar->mac.iftype[band], 8206 band); 8207 sband = &ar->mac.sbands[band]; 8208 _ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band], 8209 count); 8210 } 8211 8212 if (cap->supported_bands & WMI_HOST_WLAN_5GHZ_CAP && 8213 ar->supports_6ghz) { 8214 band = NL80211_BAND_6GHZ; 8215 count = ath12k_mac_copy_sband_iftype_data(ar, cap, 8216 ar->mac.iftype[band], 8217 band); 8218 sband = &ar->mac.sbands[band]; 8219 _ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band], 8220 count); 8221 } 8222 } 8223 8224 static int __ath12k_set_antenna(struct ath12k *ar, u32 tx_ant, u32 rx_ant) 8225 { 8226 struct ath12k_hw *ah = ath12k_ar_to_ah(ar); 8227 int ret; 8228 8229 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 8230 8231 if (ath12k_check_chain_mask(ar, tx_ant, true)) 8232 return -EINVAL; 8233 8234 if (ath12k_check_chain_mask(ar, rx_ant, false)) 8235 return -EINVAL; 8236 8237 /* Since we advertised the max cap of all radios combined during wiphy 8238 * registration, ensure we don't set the antenna config higher than the 8239 * limits 8240 */ 8241 tx_ant = min_t(u32, tx_ant, ar->pdev->cap.tx_chain_mask); 8242 rx_ant = min_t(u32, rx_ant, ar->pdev->cap.rx_chain_mask); 8243 8244 ar->cfg_tx_chainmask = tx_ant; 8245 ar->cfg_rx_chainmask = rx_ant; 8246 8247 if (ah->state != ATH12K_HW_STATE_ON && 8248 ah->state != ATH12K_HW_STATE_RESTARTED) 8249 return 0; 8250 8251 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_TX_CHAIN_MASK, 8252 tx_ant, ar->pdev->pdev_id); 8253 if (ret) { 8254 ath12k_warn(ar->ab, "failed to set tx-chainmask: %d, req 0x%x\n", 8255 ret, tx_ant); 8256 return ret; 8257 } 8258 8259 ar->num_tx_chains = hweight32(tx_ant); 8260 8261 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RX_CHAIN_MASK, 8262 rx_ant, ar->pdev->pdev_id); 8263 if (ret) { 8264 ath12k_warn(ar->ab, "failed to set rx-chainmask: %d, req 0x%x\n", 8265 ret, rx_ant); 8266 return ret; 8267 } 8268 8269 ar->num_rx_chains = hweight32(rx_ant); 8270 8271 /* Reload HT/VHT/HE capability */ 8272 ath12k_mac_setup_ht_vht_cap(ar, &ar->pdev->cap, NULL); 8273 ath12k_mac_setup_sband_iftype_data(ar, &ar->pdev->cap); 8274 8275 return 0; 8276 } 8277 8278 static void ath12k_mgmt_over_wmi_tx_drop(struct ath12k *ar, struct sk_buff *skb) 8279 { 8280 int num_mgmt; 8281 8282 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 8283 8284 ieee80211_free_txskb(ath12k_ar_to_hw(ar), skb); 8285 8286 num_mgmt = atomic_dec_if_positive(&ar->num_pending_mgmt_tx); 8287 8288 if (num_mgmt < 0) 8289 WARN_ON_ONCE(1); 8290 8291 if (!num_mgmt) 8292 wake_up(&ar->txmgmt_empty_waitq); 8293 } 8294 8295 int ath12k_mac_tx_mgmt_pending_free(int buf_id, void *skb, void *ctx) 8296 { 8297 struct sk_buff *msdu = skb; 8298 struct ieee80211_tx_info *info; 8299 struct ath12k *ar = ctx; 8300 struct ath12k_base *ab = ar->ab; 8301 8302 spin_lock_bh(&ar->txmgmt_idr_lock); 8303 idr_remove(&ar->txmgmt_idr, buf_id); 8304 spin_unlock_bh(&ar->txmgmt_idr_lock); 8305 dma_unmap_single(ab->dev, ATH12K_SKB_CB(msdu)->paddr, msdu->len, 8306 DMA_TO_DEVICE); 8307 8308 info = IEEE80211_SKB_CB(msdu); 8309 memset(&info->status, 0, sizeof(info->status)); 8310 8311 ath12k_mgmt_over_wmi_tx_drop(ar, skb); 8312 8313 return 0; 8314 } 8315 8316 static int ath12k_mac_vif_txmgmt_idr_remove(int buf_id, void *skb, void *ctx) 8317 { 8318 struct ieee80211_vif *vif = ctx; 8319 struct ath12k_skb_cb *skb_cb = ATH12K_SKB_CB(skb); 8320 struct sk_buff *msdu = skb; 8321 struct ath12k *ar = skb_cb->ar; 8322 struct ath12k_base *ab = ar->ab; 8323 8324 if (skb_cb->vif == vif) { 8325 spin_lock_bh(&ar->txmgmt_idr_lock); 8326 idr_remove(&ar->txmgmt_idr, buf_id); 8327 spin_unlock_bh(&ar->txmgmt_idr_lock); 8328 dma_unmap_single(ab->dev, skb_cb->paddr, msdu->len, 8329 DMA_TO_DEVICE); 8330 } 8331 8332 return 0; 8333 } 8334 8335 static int ath12k_mac_mgmt_tx_wmi(struct ath12k *ar, struct ath12k_link_vif *arvif, 8336 struct sk_buff *skb) 8337 { 8338 struct ath12k_base *ab = ar->ab; 8339 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 8340 struct ath12k_skb_cb *skb_cb = ATH12K_SKB_CB(skb); 8341 struct ieee80211_tx_info *info; 8342 enum hal_encrypt_type enctype; 8343 unsigned int mic_len; 8344 dma_addr_t paddr; 8345 int buf_id; 8346 int ret; 8347 8348 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 8349 8350 skb_cb->ar = ar; 8351 spin_lock_bh(&ar->txmgmt_idr_lock); 8352 buf_id = idr_alloc(&ar->txmgmt_idr, skb, 0, 8353 ATH12K_TX_MGMT_NUM_PENDING_MAX, GFP_ATOMIC); 8354 spin_unlock_bh(&ar->txmgmt_idr_lock); 8355 if (buf_id < 0) 8356 return -ENOSPC; 8357 8358 info = IEEE80211_SKB_CB(skb); 8359 if ((skb_cb->flags & ATH12K_SKB_CIPHER_SET) && 8360 !(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) { 8361 if ((ieee80211_is_action(hdr->frame_control) || 8362 ieee80211_is_deauth(hdr->frame_control) || 8363 ieee80211_is_disassoc(hdr->frame_control)) && 8364 ieee80211_has_protected(hdr->frame_control)) { 8365 enctype = ath12k_dp_tx_get_encrypt_type(skb_cb->cipher); 8366 mic_len = ath12k_dp_rx_crypto_mic_len(ar, enctype); 8367 skb_put(skb, mic_len); 8368 } 8369 } 8370 8371 paddr = dma_map_single(ab->dev, skb->data, skb->len, DMA_TO_DEVICE); 8372 if (dma_mapping_error(ab->dev, paddr)) { 8373 ath12k_warn(ab, "failed to DMA map mgmt Tx buffer\n"); 8374 ret = -EIO; 8375 goto err_free_idr; 8376 } 8377 8378 skb_cb->paddr = paddr; 8379 8380 ret = ath12k_wmi_mgmt_send(ar, arvif->vdev_id, buf_id, skb); 8381 if (ret) { 8382 ath12k_warn(ar->ab, "failed to send mgmt frame: %d\n", ret); 8383 goto err_unmap_buf; 8384 } 8385 8386 return 0; 8387 8388 err_unmap_buf: 8389 dma_unmap_single(ab->dev, skb_cb->paddr, 8390 skb->len, DMA_TO_DEVICE); 8391 err_free_idr: 8392 spin_lock_bh(&ar->txmgmt_idr_lock); 8393 idr_remove(&ar->txmgmt_idr, buf_id); 8394 spin_unlock_bh(&ar->txmgmt_idr_lock); 8395 8396 return ret; 8397 } 8398 8399 static void ath12k_mgmt_over_wmi_tx_purge(struct ath12k *ar) 8400 { 8401 struct sk_buff *skb; 8402 8403 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) 8404 ath12k_mgmt_over_wmi_tx_drop(ar, skb); 8405 } 8406 8407 static int ath12k_mac_mgmt_action_frame_fill_elem_data(struct ath12k_link_vif *arvif, 8408 struct sk_buff *skb) 8409 { 8410 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 8411 u8 category, *buf, iv_len, action_code, dialog_token; 8412 struct ieee80211_bss_conf *link_conf; 8413 struct ieee80211_chanctx_conf *conf; 8414 int cur_tx_power, max_tx_power; 8415 struct ath12k *ar = arvif->ar; 8416 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar); 8417 struct wiphy *wiphy = hw->wiphy; 8418 struct ath12k_skb_cb *skb_cb; 8419 struct ieee80211_mgmt *mgmt; 8420 unsigned int remaining_len; 8421 bool has_protected; 8422 8423 lockdep_assert_wiphy(wiphy); 8424 8425 /* make sure category field is present */ 8426 if (skb->len < IEEE80211_MIN_ACTION_SIZE) 8427 return -EINVAL; 8428 8429 remaining_len = skb->len - IEEE80211_MIN_ACTION_SIZE; 8430 has_protected = ieee80211_has_protected(hdr->frame_control); 8431 8432 /* In case of SW crypto and hdr protected (PMF), packet will already be encrypted, 8433 * we can't put in data in this case 8434 */ 8435 if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags) && 8436 has_protected) 8437 return 0; 8438 8439 mgmt = (struct ieee80211_mgmt *)hdr; 8440 buf = (u8 *)&mgmt->u.action; 8441 8442 /* FCTL_PROTECTED frame might have extra space added for HDR_LEN. Offset that 8443 * many bytes if it is there 8444 */ 8445 if (has_protected) { 8446 skb_cb = ATH12K_SKB_CB(skb); 8447 8448 switch (skb_cb->cipher) { 8449 /* Cipher suite having flag %IEEE80211_KEY_FLAG_GENERATE_IV_MGMT set in 8450 * key needs to be processed. See ath12k_install_key() 8451 */ 8452 case WLAN_CIPHER_SUITE_CCMP: 8453 case WLAN_CIPHER_SUITE_CCMP_256: 8454 case WLAN_CIPHER_SUITE_GCMP: 8455 case WLAN_CIPHER_SUITE_GCMP_256: 8456 iv_len = IEEE80211_CCMP_HDR_LEN; 8457 break; 8458 case WLAN_CIPHER_SUITE_TKIP: 8459 iv_len = 0; 8460 break; 8461 default: 8462 return -EINVAL; 8463 } 8464 8465 if (remaining_len < iv_len) 8466 return -EINVAL; 8467 8468 buf += iv_len; 8469 remaining_len -= iv_len; 8470 } 8471 8472 category = *buf++; 8473 /* category code is already taken care in %IEEE80211_MIN_ACTION_SIZE hence 8474 * no need to adjust remaining_len 8475 */ 8476 8477 switch (category) { 8478 case WLAN_CATEGORY_RADIO_MEASUREMENT: 8479 /* need action code and dialog token */ 8480 if (remaining_len < 2) 8481 return -EINVAL; 8482 8483 /* Packet Format: 8484 * Action Code | Dialog Token | Variable Len (based on Action Code) 8485 */ 8486 action_code = *buf++; 8487 dialog_token = *buf++; 8488 remaining_len -= 2; 8489 8490 link_conf = ath12k_mac_get_link_bss_conf(arvif); 8491 if (!link_conf) { 8492 ath12k_warn(ar->ab, 8493 "failed to get bss link conf for vdev %d in RM handling\n", 8494 arvif->vdev_id); 8495 return -EINVAL; 8496 } 8497 8498 conf = wiphy_dereference(wiphy, link_conf->chanctx_conf); 8499 if (!conf) 8500 return -ENOENT; 8501 8502 cur_tx_power = link_conf->txpower; 8503 max_tx_power = min(conf->def.chan->max_reg_power, 8504 (int)ar->max_tx_power / 2); 8505 8506 ath12k_mac_op_get_txpower(hw, arvif->ahvif->vif, arvif->link_id, 8507 &cur_tx_power); 8508 8509 switch (action_code) { 8510 case WLAN_RM_ACTION_LINK_MEASUREMENT_REQUEST: 8511 /* need variable fields to be present in len */ 8512 if (remaining_len < 2) 8513 return -EINVAL; 8514 8515 /* Variable length format as defined in IEEE 802.11-2024, 8516 * Figure 9-1187-Link Measurement Request frame Action field 8517 * format. 8518 * Transmit Power | Max Tx Power 8519 * We fill both of these. 8520 */ 8521 *buf++ = cur_tx_power; 8522 *buf = max_tx_power; 8523 8524 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 8525 "RRM: Link Measurement Req dialog_token %u cur_tx_power %d max_tx_power %d\n", 8526 dialog_token, cur_tx_power, max_tx_power); 8527 break; 8528 case WLAN_RM_ACTION_LINK_MEASUREMENT_REPORT: 8529 /* need variable fields to be present in len */ 8530 if (remaining_len < 3) 8531 return -EINVAL; 8532 8533 /* Variable length format as defined in IEEE 802.11-2024, 8534 * Figure 9-1188-Link Measurement Report frame Action field format 8535 * TPC Report | Variable Fields 8536 * 8537 * TPC Report Format: 8538 * Element ID | Len | Tx Power | Link Margin 8539 * 8540 * We fill Tx power in the TPC Report (2nd index) 8541 */ 8542 buf[2] = cur_tx_power; 8543 8544 /* TODO: At present, Link margin data is not present so can't 8545 * really fill it now. Once it is available, it can be added 8546 * here 8547 */ 8548 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 8549 "RRM: Link Measurement Report dialog_token %u cur_tx_power %d\n", 8550 dialog_token, cur_tx_power); 8551 break; 8552 default: 8553 return -EINVAL; 8554 } 8555 break; 8556 default: 8557 /* nothing to fill */ 8558 return 0; 8559 } 8560 8561 return 0; 8562 } 8563 8564 static int ath12k_mac_mgmt_frame_fill_elem_data(struct ath12k_link_vif *arvif, 8565 struct sk_buff *skb) 8566 { 8567 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 8568 8569 if (!ieee80211_is_action(hdr->frame_control)) 8570 return 0; 8571 8572 return ath12k_mac_mgmt_action_frame_fill_elem_data(arvif, skb); 8573 } 8574 8575 static void ath12k_mgmt_over_wmi_tx_work(struct wiphy *wiphy, struct wiphy_work *work) 8576 { 8577 struct ath12k *ar = container_of(work, struct ath12k, wmi_mgmt_tx_work); 8578 struct ath12k_hw *ah = ar->ah; 8579 struct ath12k_skb_cb *skb_cb; 8580 struct ath12k_vif *ahvif; 8581 struct ath12k_link_vif *arvif; 8582 struct sk_buff *skb; 8583 int ret; 8584 8585 lockdep_assert_wiphy(wiphy); 8586 8587 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) { 8588 skb_cb = ATH12K_SKB_CB(skb); 8589 if (!skb_cb->vif) { 8590 ath12k_warn(ar->ab, "no vif found for mgmt frame\n"); 8591 ath12k_mgmt_over_wmi_tx_drop(ar, skb); 8592 continue; 8593 } 8594 8595 ahvif = ath12k_vif_to_ahvif(skb_cb->vif); 8596 if (!(ahvif->links_map & BIT(skb_cb->link_id))) { 8597 ath12k_warn(ar->ab, 8598 "invalid linkid %u in mgmt over wmi tx with linkmap 0x%x\n", 8599 skb_cb->link_id, ahvif->links_map); 8600 ath12k_mgmt_over_wmi_tx_drop(ar, skb); 8601 continue; 8602 } 8603 8604 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[skb_cb->link_id]); 8605 if (ar->allocated_vdev_map & (1LL << arvif->vdev_id)) { 8606 /* Fill in the data which is required to be filled by the driver 8607 * For example: Max Tx power in Link Measurement Request/Report 8608 */ 8609 ret = ath12k_mac_mgmt_frame_fill_elem_data(arvif, skb); 8610 if (ret) { 8611 /* If we couldn't fill the data due to any reason, 8612 * let's not discard transmitting the packet. 8613 * For example: Software crypto and PMF case 8614 */ 8615 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 8616 "Failed to fill the required data for the mgmt packet err %d\n", 8617 ret); 8618 } 8619 8620 ret = ath12k_mac_mgmt_tx_wmi(ar, arvif, skb); 8621 if (ret) { 8622 ath12k_warn(ar->ab, "failed to tx mgmt frame, vdev_id %d :%d\n", 8623 arvif->vdev_id, ret); 8624 ath12k_mgmt_over_wmi_tx_drop(ar, skb); 8625 } 8626 } else { 8627 ath12k_warn(ar->ab, 8628 "dropping mgmt frame for vdev %d link %u is_started %d\n", 8629 arvif->vdev_id, 8630 skb_cb->link_id, 8631 arvif->is_started); 8632 ath12k_mgmt_over_wmi_tx_drop(ar, skb); 8633 } 8634 } 8635 } 8636 8637 static int ath12k_mac_mgmt_tx(struct ath12k *ar, struct sk_buff *skb, 8638 bool is_prb_rsp) 8639 { 8640 struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue; 8641 8642 if (test_bit(ATH12K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags)) 8643 return -ESHUTDOWN; 8644 8645 /* Drop probe response packets when the pending management tx 8646 * count has reached a certain threshold, so as to prioritize 8647 * other mgmt packets like auth and assoc to be sent on time 8648 * for establishing successful connections. 8649 */ 8650 if (is_prb_rsp && 8651 atomic_read(&ar->num_pending_mgmt_tx) > ATH12K_PRB_RSP_DROP_THRESHOLD) { 8652 ath12k_warn(ar->ab, 8653 "dropping probe response as pending queue is almost full\n"); 8654 return -ENOSPC; 8655 } 8656 8657 if (skb_queue_len_lockless(q) >= ATH12K_TX_MGMT_NUM_PENDING_MAX) { 8658 ath12k_warn(ar->ab, "mgmt tx queue is full\n"); 8659 return -ENOSPC; 8660 } 8661 8662 skb_queue_tail(q, skb); 8663 atomic_inc(&ar->num_pending_mgmt_tx); 8664 wiphy_work_queue(ath12k_ar_to_hw(ar)->wiphy, &ar->wmi_mgmt_tx_work); 8665 8666 return 0; 8667 } 8668 8669 static void ath12k_mac_add_p2p_noa_ie(struct ath12k *ar, 8670 struct ieee80211_vif *vif, 8671 struct sk_buff *skb, 8672 bool is_prb_rsp) 8673 { 8674 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 8675 8676 if (likely(!is_prb_rsp)) 8677 return; 8678 8679 spin_lock_bh(&ar->data_lock); 8680 8681 if (ahvif->u.ap.noa_data && 8682 !pskb_expand_head(skb, 0, ahvif->u.ap.noa_len, 8683 GFP_ATOMIC)) 8684 skb_put_data(skb, ahvif->u.ap.noa_data, 8685 ahvif->u.ap.noa_len); 8686 8687 spin_unlock_bh(&ar->data_lock); 8688 } 8689 8690 /* Note: called under rcu_read_lock() */ 8691 static void ath12k_mlo_mcast_update_tx_link_address(struct ieee80211_vif *vif, 8692 u8 link_id, struct sk_buff *skb, 8693 u32 info_flags) 8694 { 8695 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 8696 struct ieee80211_bss_conf *bss_conf; 8697 8698 if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP) 8699 return; 8700 8701 bss_conf = rcu_dereference(vif->link_conf[link_id]); 8702 if (bss_conf) 8703 ether_addr_copy(hdr->addr2, bss_conf->addr); 8704 } 8705 8706 /* Note: called under rcu_read_lock() */ 8707 static u8 ath12k_mac_get_tx_link(struct ieee80211_sta *sta, struct ieee80211_vif *vif, 8708 u8 link, struct sk_buff *skb, u32 info_flags) 8709 { 8710 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 8711 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 8712 struct ieee80211_link_sta *link_sta; 8713 struct ieee80211_bss_conf *bss_conf; 8714 struct ath12k_sta *ahsta; 8715 8716 /* Use the link id passed or the default vif link */ 8717 if (!sta) { 8718 if (link != IEEE80211_LINK_UNSPECIFIED) 8719 return link; 8720 8721 return ahvif->deflink.link_id; 8722 } 8723 8724 ahsta = ath12k_sta_to_ahsta(sta); 8725 8726 /* Below translation ensures we pass proper A2 & A3 for non ML clients. 8727 * Also it assumes for now support only for MLO AP in this path 8728 */ 8729 if (!sta->mlo) { 8730 link = ahsta->deflink.link_id; 8731 8732 if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP) 8733 return link; 8734 8735 bss_conf = rcu_dereference(vif->link_conf[link]); 8736 if (bss_conf) { 8737 ether_addr_copy(hdr->addr2, bss_conf->addr); 8738 if (!ieee80211_has_tods(hdr->frame_control) && 8739 !ieee80211_has_fromds(hdr->frame_control)) 8740 ether_addr_copy(hdr->addr3, bss_conf->addr); 8741 } 8742 8743 return link; 8744 } 8745 8746 /* enqueue eth enacap & data frames on primary link, FW does link 8747 * selection and address translation. 8748 */ 8749 if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP || 8750 ieee80211_is_data(hdr->frame_control)) 8751 return ahsta->assoc_link_id; 8752 8753 /* 802.11 frame cases */ 8754 if (link == IEEE80211_LINK_UNSPECIFIED) 8755 link = ahsta->deflink.link_id; 8756 8757 if (!ieee80211_is_mgmt(hdr->frame_control)) 8758 return link; 8759 8760 /* Perform address conversion for ML STA Tx */ 8761 bss_conf = rcu_dereference(vif->link_conf[link]); 8762 link_sta = rcu_dereference(sta->link[link]); 8763 8764 if (bss_conf && link_sta) { 8765 ether_addr_copy(hdr->addr1, link_sta->addr); 8766 ether_addr_copy(hdr->addr2, bss_conf->addr); 8767 8768 if (vif->type == NL80211_IFTYPE_STATION && bss_conf->bssid) 8769 ether_addr_copy(hdr->addr3, bss_conf->bssid); 8770 else if (vif->type == NL80211_IFTYPE_AP) 8771 ether_addr_copy(hdr->addr3, bss_conf->addr); 8772 8773 return link; 8774 } 8775 8776 if (bss_conf) { 8777 /* In certain cases where a ML sta associated and added subset of 8778 * links on which the ML AP is active, but now sends some frame 8779 * (ex. Probe request) on a different link which is active in our 8780 * MLD but was not added during previous association, we can 8781 * still honor the Tx to that ML STA via the requested link. 8782 * The control would reach here in such case only when that link 8783 * address is same as the MLD address or in worst case clients 8784 * used MLD address at TA wrongly which would have helped 8785 * identify the ML sta object and pass it here. 8786 * If the link address of that STA is different from MLD address, 8787 * then the sta object would be NULL and control won't reach 8788 * here but return at the start of the function itself with !sta 8789 * check. Also this would not need any translation at hdr->addr1 8790 * from MLD to link address since the RA is the MLD address 8791 * (same as that link address ideally) already. 8792 */ 8793 ether_addr_copy(hdr->addr2, bss_conf->addr); 8794 8795 if (vif->type == NL80211_IFTYPE_STATION && bss_conf->bssid) 8796 ether_addr_copy(hdr->addr3, bss_conf->bssid); 8797 else if (vif->type == NL80211_IFTYPE_AP) 8798 ether_addr_copy(hdr->addr3, bss_conf->addr); 8799 } 8800 8801 return link; 8802 } 8803 8804 /* Note: called under rcu_read_lock() */ 8805 static void ath12k_mac_op_tx(struct ieee80211_hw *hw, 8806 struct ieee80211_tx_control *control, 8807 struct sk_buff *skb) 8808 { 8809 struct ath12k_skb_cb *skb_cb = ATH12K_SKB_CB(skb); 8810 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 8811 struct ieee80211_vif *vif = info->control.vif; 8812 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 8813 struct ath12k_link_vif *arvif = &ahvif->deflink; 8814 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 8815 struct ieee80211_key_conf *key = info->control.hw_key; 8816 struct ieee80211_sta *sta = control->sta; 8817 struct ath12k_link_vif *tmp_arvif; 8818 u32 info_flags = info->flags; 8819 struct sk_buff *msdu_copied; 8820 struct ath12k *ar, *tmp_ar; 8821 struct ath12k_peer *peer; 8822 unsigned long links_map; 8823 bool is_mcast = false; 8824 bool is_dvlan = false; 8825 struct ethhdr *eth; 8826 bool is_prb_rsp; 8827 u16 mcbc_gsn; 8828 u8 link_id; 8829 int ret; 8830 8831 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { 8832 ieee80211_free_txskb(hw, skb); 8833 return; 8834 } 8835 8836 link_id = u32_get_bits(info->control.flags, IEEE80211_TX_CTRL_MLO_LINK); 8837 memset(skb_cb, 0, sizeof(*skb_cb)); 8838 skb_cb->vif = vif; 8839 8840 if (key) { 8841 skb_cb->cipher = key->cipher; 8842 skb_cb->flags |= ATH12K_SKB_CIPHER_SET; 8843 } 8844 8845 /* handle only for MLO case, use deflink for non MLO case */ 8846 if (ieee80211_vif_is_mld(vif)) { 8847 link_id = ath12k_mac_get_tx_link(sta, vif, link_id, skb, info_flags); 8848 if (link_id >= IEEE80211_MLD_MAX_NUM_LINKS) { 8849 ieee80211_free_txskb(hw, skb); 8850 return; 8851 } 8852 } else { 8853 link_id = 0; 8854 } 8855 8856 arvif = rcu_dereference(ahvif->link[link_id]); 8857 if (!arvif || !arvif->ar) { 8858 ath12k_warn(ahvif->ah, "failed to find arvif link id %u for frame transmission", 8859 link_id); 8860 ieee80211_free_txskb(hw, skb); 8861 return; 8862 } 8863 8864 ar = arvif->ar; 8865 skb_cb->link_id = link_id; 8866 is_prb_rsp = ieee80211_is_probe_resp(hdr->frame_control); 8867 8868 if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP) { 8869 eth = (struct ethhdr *)skb->data; 8870 is_mcast = is_multicast_ether_addr(eth->h_dest); 8871 8872 skb_cb->flags |= ATH12K_SKB_HW_80211_ENCAP; 8873 } else if (ieee80211_is_mgmt(hdr->frame_control)) { 8874 ret = ath12k_mac_mgmt_tx(ar, skb, is_prb_rsp); 8875 if (ret) { 8876 ath12k_warn(ar->ab, "failed to queue management frame %d\n", 8877 ret); 8878 ieee80211_free_txskb(hw, skb); 8879 } 8880 return; 8881 } 8882 8883 if (!(info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) 8884 is_mcast = is_multicast_ether_addr(hdr->addr1); 8885 8886 /* This is case only for P2P_GO */ 8887 if (vif->type == NL80211_IFTYPE_AP && vif->p2p) 8888 ath12k_mac_add_p2p_noa_ie(ar, vif, skb, is_prb_rsp); 8889 8890 /* Checking if it is a DVLAN frame */ 8891 if (!test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags) && 8892 !(skb_cb->flags & ATH12K_SKB_HW_80211_ENCAP) && 8893 !(skb_cb->flags & ATH12K_SKB_CIPHER_SET) && 8894 ieee80211_has_protected(hdr->frame_control)) 8895 is_dvlan = true; 8896 8897 if (!vif->valid_links || !is_mcast || is_dvlan || 8898 test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags)) { 8899 ret = ath12k_dp_tx(ar, arvif, skb, false, 0, is_mcast); 8900 if (unlikely(ret)) { 8901 ath12k_warn(ar->ab, "failed to transmit frame %d\n", ret); 8902 ieee80211_free_txskb(ar->ah->hw, skb); 8903 return; 8904 } 8905 } else { 8906 mcbc_gsn = atomic_inc_return(&ahvif->mcbc_gsn) & 0xfff; 8907 8908 links_map = ahvif->links_map; 8909 for_each_set_bit(link_id, &links_map, 8910 IEEE80211_MLD_MAX_NUM_LINKS) { 8911 tmp_arvif = rcu_dereference(ahvif->link[link_id]); 8912 if (!tmp_arvif || !tmp_arvif->is_up) 8913 continue; 8914 8915 tmp_ar = tmp_arvif->ar; 8916 msdu_copied = skb_copy(skb, GFP_ATOMIC); 8917 if (!msdu_copied) { 8918 ath12k_err(ar->ab, 8919 "skb copy failure link_id 0x%X vdevid 0x%X\n", 8920 link_id, tmp_arvif->vdev_id); 8921 continue; 8922 } 8923 8924 ath12k_mlo_mcast_update_tx_link_address(vif, link_id, 8925 msdu_copied, 8926 info_flags); 8927 8928 skb_cb = ATH12K_SKB_CB(msdu_copied); 8929 skb_cb->link_id = link_id; 8930 8931 /* For open mode, skip peer find logic */ 8932 if (unlikely(!ahvif->key_cipher)) 8933 goto skip_peer_find; 8934 8935 spin_lock_bh(&tmp_ar->ab->base_lock); 8936 peer = ath12k_peer_find_by_addr(tmp_ar->ab, tmp_arvif->bssid); 8937 if (!peer) { 8938 spin_unlock_bh(&tmp_ar->ab->base_lock); 8939 ath12k_warn(tmp_ar->ab, 8940 "failed to find peer for vdev_id 0x%X addr %pM link_map 0x%X\n", 8941 tmp_arvif->vdev_id, tmp_arvif->bssid, 8942 ahvif->links_map); 8943 dev_kfree_skb_any(msdu_copied); 8944 continue; 8945 } 8946 8947 key = peer->keys[peer->mcast_keyidx]; 8948 if (key) { 8949 skb_cb->cipher = key->cipher; 8950 skb_cb->flags |= ATH12K_SKB_CIPHER_SET; 8951 8952 hdr = (struct ieee80211_hdr *)msdu_copied->data; 8953 if (!ieee80211_has_protected(hdr->frame_control)) 8954 hdr->frame_control |= 8955 cpu_to_le16(IEEE80211_FCTL_PROTECTED); 8956 } 8957 spin_unlock_bh(&tmp_ar->ab->base_lock); 8958 8959 skip_peer_find: 8960 ret = ath12k_dp_tx(tmp_ar, tmp_arvif, 8961 msdu_copied, true, mcbc_gsn, is_mcast); 8962 if (unlikely(ret)) { 8963 if (ret == -ENOMEM) { 8964 /* Drops are expected during heavy multicast 8965 * frame flood. Print with debug log 8966 * level to avoid lot of console prints 8967 */ 8968 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 8969 "failed to transmit frame %d\n", 8970 ret); 8971 } else { 8972 ath12k_warn(ar->ab, 8973 "failed to transmit frame %d\n", 8974 ret); 8975 } 8976 8977 dev_kfree_skb_any(msdu_copied); 8978 } 8979 } 8980 ieee80211_free_txskb(ar->ah->hw, skb); 8981 } 8982 } 8983 8984 void ath12k_mac_drain_tx(struct ath12k *ar) 8985 { 8986 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 8987 8988 /* make sure rcu-protected mac80211 tx path itself is drained */ 8989 synchronize_net(); 8990 8991 wiphy_work_cancel(ath12k_ar_to_hw(ar)->wiphy, &ar->wmi_mgmt_tx_work); 8992 ath12k_mgmt_over_wmi_tx_purge(ar); 8993 } 8994 8995 static int ath12k_mac_config_mon_status_default(struct ath12k *ar, bool enable) 8996 { 8997 struct htt_rx_ring_tlv_filter tlv_filter = {}; 8998 struct ath12k_base *ab = ar->ab; 8999 u32 ring_id, i; 9000 int ret = 0; 9001 9002 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 9003 9004 if (!ab->hw_params->rxdma1_enable) 9005 return ret; 9006 9007 if (enable) { 9008 tlv_filter = ath12k_mac_mon_status_filter_default; 9009 9010 if (ath12k_debugfs_rx_filter(ar)) 9011 tlv_filter.rx_filter = ath12k_debugfs_rx_filter(ar); 9012 } else { 9013 tlv_filter.rxmon_disable = true; 9014 } 9015 9016 for (i = 0; i < ab->hw_params->num_rxdma_per_pdev; i++) { 9017 ring_id = ar->dp.rxdma_mon_dst_ring[i].ring_id; 9018 ret = ath12k_dp_tx_htt_rx_filter_setup(ab, ring_id, 9019 ar->dp.mac_id + i, 9020 HAL_RXDMA_MONITOR_DST, 9021 DP_RXDMA_REFILL_RING_SIZE, 9022 &tlv_filter); 9023 if (ret) { 9024 ath12k_err(ab, 9025 "failed to setup filter for monitor buf %d\n", 9026 ret); 9027 } 9028 } 9029 9030 return ret; 9031 } 9032 9033 static int ath12k_mac_start(struct ath12k *ar) 9034 { 9035 struct ath12k_hw *ah = ar->ah; 9036 struct ath12k_base *ab = ar->ab; 9037 struct ath12k_pdev *pdev = ar->pdev; 9038 int ret; 9039 9040 lockdep_assert_held(&ah->hw_mutex); 9041 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 9042 9043 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_PMF_QOS, 9044 1, pdev->pdev_id); 9045 9046 if (ret) { 9047 ath12k_err(ab, "failed to enable PMF QOS: %d\n", ret); 9048 goto err; 9049 } 9050 9051 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_DYNAMIC_BW, 1, 9052 pdev->pdev_id); 9053 if (ret) { 9054 ath12k_err(ab, "failed to enable dynamic bw: %d\n", ret); 9055 goto err; 9056 } 9057 9058 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_ARP_AC_OVERRIDE, 9059 0, pdev->pdev_id); 9060 if (ret) { 9061 ath12k_err(ab, "failed to set ac override for ARP: %d\n", 9062 ret); 9063 goto err; 9064 } 9065 9066 ret = ath12k_wmi_send_dfs_phyerr_offload_enable_cmd(ar, pdev->pdev_id); 9067 if (ret) { 9068 ath12k_err(ab, "failed to offload radar detection: %d\n", 9069 ret); 9070 goto err; 9071 } 9072 9073 ret = ath12k_dp_tx_htt_h2t_ppdu_stats_req(ar, 9074 HTT_PPDU_STATS_TAG_DEFAULT); 9075 if (ret) { 9076 ath12k_err(ab, "failed to req ppdu stats: %d\n", ret); 9077 goto err; 9078 } 9079 9080 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_MESH_MCAST_ENABLE, 9081 1, pdev->pdev_id); 9082 9083 if (ret) { 9084 ath12k_err(ab, "failed to enable MESH MCAST ENABLE: (%d\n", ret); 9085 goto err; 9086 } 9087 9088 __ath12k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask); 9089 9090 /* TODO: Do we need to enable ANI? */ 9091 9092 ret = ath12k_reg_update_chan_list(ar, false); 9093 9094 /* The ar state alone can be turned off for non supported country 9095 * without returning the error value. As we need to update the channel 9096 * for the next ar. 9097 */ 9098 if (ret) { 9099 if (ret == -EINVAL) 9100 ret = 0; 9101 goto err; 9102 } 9103 9104 ar->num_started_vdevs = 0; 9105 ar->num_created_vdevs = 0; 9106 ar->num_peers = 0; 9107 ar->allocated_vdev_map = 0; 9108 ar->chan_tx_pwr = ATH12K_PDEV_TX_POWER_INVALID; 9109 9110 /* Configure monitor status ring with default rx_filter to get rx status 9111 * such as rssi, rx_duration. 9112 */ 9113 ret = ath12k_mac_config_mon_status_default(ar, true); 9114 if (ret && (ret != -EOPNOTSUPP)) { 9115 ath12k_err(ab, "failed to configure monitor status ring with default rx_filter: (%d)\n", 9116 ret); 9117 goto err; 9118 } 9119 9120 if (ret == -EOPNOTSUPP) 9121 ath12k_dbg(ab, ATH12K_DBG_MAC, 9122 "monitor status config is not yet supported"); 9123 9124 /* Configure the hash seed for hash based reo dest ring selection */ 9125 ath12k_wmi_pdev_lro_cfg(ar, ar->pdev->pdev_id); 9126 9127 /* allow device to enter IMPS */ 9128 if (ab->hw_params->idle_ps) { 9129 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_IDLE_PS_CONFIG, 9130 1, pdev->pdev_id); 9131 if (ret) { 9132 ath12k_err(ab, "failed to enable idle ps: %d\n", ret); 9133 goto err; 9134 } 9135 } 9136 9137 rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx], 9138 &ab->pdevs[ar->pdev_idx]); 9139 9140 return 0; 9141 err: 9142 9143 return ret; 9144 } 9145 9146 static void ath12k_drain_tx(struct ath12k_hw *ah) 9147 { 9148 struct ath12k *ar; 9149 int i; 9150 9151 lockdep_assert_wiphy(ah->hw->wiphy); 9152 9153 for_each_ar(ah, ar, i) 9154 ath12k_mac_drain_tx(ar); 9155 } 9156 9157 static int ath12k_mac_op_start(struct ieee80211_hw *hw) 9158 { 9159 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 9160 struct ath12k *ar; 9161 int ret, i; 9162 9163 if (ath12k_ftm_mode) 9164 return -EPERM; 9165 9166 lockdep_assert_wiphy(hw->wiphy); 9167 9168 ath12k_drain_tx(ah); 9169 9170 guard(mutex)(&ah->hw_mutex); 9171 9172 switch (ah->state) { 9173 case ATH12K_HW_STATE_OFF: 9174 ah->state = ATH12K_HW_STATE_ON; 9175 break; 9176 case ATH12K_HW_STATE_RESTARTING: 9177 ah->state = ATH12K_HW_STATE_RESTARTED; 9178 break; 9179 case ATH12K_HW_STATE_RESTARTED: 9180 case ATH12K_HW_STATE_WEDGED: 9181 case ATH12K_HW_STATE_ON: 9182 case ATH12K_HW_STATE_TM: 9183 ah->state = ATH12K_HW_STATE_OFF; 9184 9185 WARN_ON(1); 9186 return -EINVAL; 9187 } 9188 9189 for_each_ar(ah, ar, i) { 9190 ret = ath12k_mac_start(ar); 9191 if (ret) { 9192 ah->state = ATH12K_HW_STATE_OFF; 9193 9194 ath12k_err(ar->ab, "fail to start mac operations in pdev idx %d ret %d\n", 9195 ar->pdev_idx, ret); 9196 goto fail_start; 9197 } 9198 } 9199 9200 return 0; 9201 9202 fail_start: 9203 for (; i > 0; i--) { 9204 ar = ath12k_ah_to_ar(ah, i - 1); 9205 ath12k_mac_stop(ar); 9206 } 9207 9208 return ret; 9209 } 9210 9211 int ath12k_mac_rfkill_config(struct ath12k *ar) 9212 { 9213 struct ath12k_base *ab = ar->ab; 9214 u32 param; 9215 int ret; 9216 9217 if (ab->hw_params->rfkill_pin == 0) 9218 return -EOPNOTSUPP; 9219 9220 ath12k_dbg(ab, ATH12K_DBG_MAC, 9221 "mac rfkill_pin %d rfkill_cfg %d rfkill_on_level %d", 9222 ab->hw_params->rfkill_pin, ab->hw_params->rfkill_cfg, 9223 ab->hw_params->rfkill_on_level); 9224 9225 param = u32_encode_bits(ab->hw_params->rfkill_on_level, 9226 WMI_RFKILL_CFG_RADIO_LEVEL) | 9227 u32_encode_bits(ab->hw_params->rfkill_pin, 9228 WMI_RFKILL_CFG_GPIO_PIN_NUM) | 9229 u32_encode_bits(ab->hw_params->rfkill_cfg, 9230 WMI_RFKILL_CFG_PIN_AS_GPIO); 9231 9232 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_HW_RFKILL_CONFIG, 9233 param, ar->pdev->pdev_id); 9234 if (ret) { 9235 ath12k_warn(ab, 9236 "failed to set rfkill config 0x%x: %d\n", 9237 param, ret); 9238 return ret; 9239 } 9240 9241 return 0; 9242 } 9243 9244 int ath12k_mac_rfkill_enable_radio(struct ath12k *ar, bool enable) 9245 { 9246 enum wmi_rfkill_enable_radio param; 9247 int ret; 9248 9249 if (enable) 9250 param = WMI_RFKILL_ENABLE_RADIO_ON; 9251 else 9252 param = WMI_RFKILL_ENABLE_RADIO_OFF; 9253 9254 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac %d rfkill enable %d", 9255 ar->pdev_idx, param); 9256 9257 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RFKILL_ENABLE, 9258 param, ar->pdev->pdev_id); 9259 if (ret) { 9260 ath12k_warn(ar->ab, "failed to set rfkill enable param %d: %d\n", 9261 param, ret); 9262 return ret; 9263 } 9264 9265 return 0; 9266 } 9267 9268 static void ath12k_mac_stop(struct ath12k *ar) 9269 { 9270 struct ath12k_hw *ah = ar->ah; 9271 struct htt_ppdu_stats_info *ppdu_stats, *tmp; 9272 struct ath12k_wmi_scan_chan_list_arg *arg; 9273 int ret; 9274 9275 lockdep_assert_held(&ah->hw_mutex); 9276 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 9277 9278 ret = ath12k_mac_config_mon_status_default(ar, false); 9279 if (ret && (ret != -EOPNOTSUPP)) 9280 ath12k_err(ar->ab, "failed to clear rx_filter for monitor status ring: (%d)\n", 9281 ret); 9282 9283 clear_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags); 9284 9285 cancel_delayed_work_sync(&ar->scan.timeout); 9286 wiphy_work_cancel(ath12k_ar_to_hw(ar)->wiphy, &ar->scan.vdev_clean_wk); 9287 cancel_work_sync(&ar->regd_channel_update_work); 9288 cancel_work_sync(&ar->regd_update_work); 9289 cancel_work_sync(&ar->ab->rfkill_work); 9290 cancel_work_sync(&ar->ab->update_11d_work); 9291 ar->state_11d = ATH12K_11D_IDLE; 9292 complete(&ar->completed_11d_scan); 9293 9294 spin_lock_bh(&ar->data_lock); 9295 9296 list_for_each_entry_safe(ppdu_stats, tmp, &ar->ppdu_stats_info, list) { 9297 list_del(&ppdu_stats->list); 9298 kfree(ppdu_stats); 9299 } 9300 9301 while ((arg = list_first_entry_or_null(&ar->regd_channel_update_queue, 9302 struct ath12k_wmi_scan_chan_list_arg, 9303 list))) { 9304 list_del(&arg->list); 9305 kfree(arg); 9306 } 9307 spin_unlock_bh(&ar->data_lock); 9308 9309 rcu_assign_pointer(ar->ab->pdevs_active[ar->pdev_idx], NULL); 9310 9311 synchronize_rcu(); 9312 9313 atomic_set(&ar->num_pending_mgmt_tx, 0); 9314 } 9315 9316 static void ath12k_mac_op_stop(struct ieee80211_hw *hw, bool suspend) 9317 { 9318 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 9319 struct ath12k *ar; 9320 int i; 9321 9322 lockdep_assert_wiphy(hw->wiphy); 9323 9324 ath12k_drain_tx(ah); 9325 9326 mutex_lock(&ah->hw_mutex); 9327 9328 ah->state = ATH12K_HW_STATE_OFF; 9329 9330 for_each_ar(ah, ar, i) 9331 ath12k_mac_stop(ar); 9332 9333 mutex_unlock(&ah->hw_mutex); 9334 } 9335 9336 static u8 9337 ath12k_mac_get_vdev_stats_id(struct ath12k_link_vif *arvif) 9338 { 9339 struct ath12k_base *ab = arvif->ar->ab; 9340 u8 vdev_stats_id = 0; 9341 9342 do { 9343 if (ab->free_vdev_stats_id_map & (1LL << vdev_stats_id)) { 9344 vdev_stats_id++; 9345 if (vdev_stats_id >= ATH12K_MAX_VDEV_STATS_ID) { 9346 vdev_stats_id = ATH12K_INVAL_VDEV_STATS_ID; 9347 break; 9348 } 9349 } else { 9350 ab->free_vdev_stats_id_map |= (1LL << vdev_stats_id); 9351 break; 9352 } 9353 } while (vdev_stats_id); 9354 9355 arvif->vdev_stats_id = vdev_stats_id; 9356 return vdev_stats_id; 9357 } 9358 9359 static int ath12k_mac_setup_vdev_params_mbssid(struct ath12k_link_vif *arvif, 9360 u32 *flags, u32 *tx_vdev_id) 9361 { 9362 struct ath12k_vif *ahvif = arvif->ahvif; 9363 struct ieee80211_bss_conf *link_conf; 9364 struct ath12k *ar = arvif->ar; 9365 struct ath12k_link_vif *tx_arvif; 9366 9367 link_conf = ath12k_mac_get_link_bss_conf(arvif); 9368 if (!link_conf) { 9369 ath12k_warn(ar->ab, "unable to access bss link conf in set mbssid params for vif %pM link %u\n", 9370 ahvif->vif->addr, arvif->link_id); 9371 return -ENOLINK; 9372 } 9373 9374 tx_arvif = ath12k_mac_get_tx_arvif(arvif, link_conf); 9375 if (!tx_arvif) 9376 return 0; 9377 9378 if (link_conf->nontransmitted) { 9379 if (ath12k_ar_to_hw(ar)->wiphy != 9380 ath12k_ar_to_hw(tx_arvif->ar)->wiphy) 9381 return -EINVAL; 9382 9383 *flags = WMI_VDEV_MBSSID_FLAGS_NON_TRANSMIT_AP; 9384 *tx_vdev_id = tx_arvif->vdev_id; 9385 } else if (tx_arvif == arvif) { 9386 *flags = WMI_VDEV_MBSSID_FLAGS_TRANSMIT_AP; 9387 } else { 9388 return -EINVAL; 9389 } 9390 9391 if (link_conf->ema_ap) 9392 *flags |= WMI_VDEV_MBSSID_FLAGS_EMA_MODE; 9393 9394 return 0; 9395 } 9396 9397 static int ath12k_mac_setup_vdev_create_arg(struct ath12k_link_vif *arvif, 9398 struct ath12k_wmi_vdev_create_arg *arg) 9399 { 9400 struct ath12k *ar = arvif->ar; 9401 struct ath12k_pdev *pdev = ar->pdev; 9402 struct ath12k_vif *ahvif = arvif->ahvif; 9403 int ret; 9404 9405 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 9406 9407 arg->if_id = arvif->vdev_id; 9408 arg->type = ahvif->vdev_type; 9409 arg->subtype = ahvif->vdev_subtype; 9410 arg->pdev_id = pdev->pdev_id; 9411 9412 arg->mbssid_flags = WMI_VDEV_MBSSID_FLAGS_NON_MBSSID_AP; 9413 arg->mbssid_tx_vdev_id = 0; 9414 if (!test_bit(WMI_TLV_SERVICE_MBSS_PARAM_IN_VDEV_START_SUPPORT, 9415 ar->ab->wmi_ab.svc_map)) { 9416 ret = ath12k_mac_setup_vdev_params_mbssid(arvif, 9417 &arg->mbssid_flags, 9418 &arg->mbssid_tx_vdev_id); 9419 if (ret) 9420 return ret; 9421 } 9422 9423 if (pdev->cap.supported_bands & WMI_HOST_WLAN_2GHZ_CAP) { 9424 arg->chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains; 9425 arg->chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains; 9426 } 9427 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5GHZ_CAP) { 9428 arg->chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains; 9429 arg->chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains; 9430 } 9431 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5GHZ_CAP && 9432 ar->supports_6ghz) { 9433 arg->chains[NL80211_BAND_6GHZ].tx = ar->num_tx_chains; 9434 arg->chains[NL80211_BAND_6GHZ].rx = ar->num_rx_chains; 9435 } 9436 9437 arg->if_stats_id = ath12k_mac_get_vdev_stats_id(arvif); 9438 9439 if (ath12k_mac_is_ml_arvif(arvif)) { 9440 if (hweight16(ahvif->vif->valid_links) > ATH12K_WMI_MLO_MAX_LINKS) { 9441 ath12k_warn(ar->ab, "too many MLO links during setting up vdev: %d", 9442 ahvif->vif->valid_links); 9443 return -EINVAL; 9444 } 9445 9446 ether_addr_copy(arg->mld_addr, ahvif->vif->addr); 9447 } 9448 9449 return 0; 9450 } 9451 9452 static void ath12k_mac_update_vif_offload(struct ath12k_link_vif *arvif) 9453 { 9454 struct ath12k_vif *ahvif = arvif->ahvif; 9455 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif); 9456 struct ath12k *ar = arvif->ar; 9457 struct ath12k_base *ab = ar->ab; 9458 u32 param_id, param_value; 9459 int ret; 9460 9461 param_id = WMI_VDEV_PARAM_TX_ENCAP_TYPE; 9462 if (vif->type != NL80211_IFTYPE_STATION && 9463 vif->type != NL80211_IFTYPE_AP) 9464 vif->offload_flags &= ~(IEEE80211_OFFLOAD_ENCAP_ENABLED | 9465 IEEE80211_OFFLOAD_DECAP_ENABLED); 9466 9467 if (vif->offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED) 9468 ahvif->tx_encap_type = ATH12K_HW_TXRX_ETHERNET; 9469 else if (test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags)) 9470 ahvif->tx_encap_type = ATH12K_HW_TXRX_RAW; 9471 else 9472 ahvif->tx_encap_type = ATH12K_HW_TXRX_NATIVE_WIFI; 9473 9474 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 9475 param_id, ahvif->tx_encap_type); 9476 if (ret) { 9477 ath12k_warn(ab, "failed to set vdev %d tx encap mode: %d\n", 9478 arvif->vdev_id, ret); 9479 vif->offload_flags &= ~IEEE80211_OFFLOAD_ENCAP_ENABLED; 9480 } 9481 9482 param_id = WMI_VDEV_PARAM_RX_DECAP_TYPE; 9483 if (vif->offload_flags & IEEE80211_OFFLOAD_DECAP_ENABLED) 9484 param_value = ATH12K_HW_TXRX_ETHERNET; 9485 else if (test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags)) 9486 param_value = ATH12K_HW_TXRX_RAW; 9487 else 9488 param_value = ATH12K_HW_TXRX_NATIVE_WIFI; 9489 9490 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 9491 param_id, param_value); 9492 if (ret) { 9493 ath12k_warn(ab, "failed to set vdev %d rx decap mode: %d\n", 9494 arvif->vdev_id, ret); 9495 vif->offload_flags &= ~IEEE80211_OFFLOAD_DECAP_ENABLED; 9496 } 9497 } 9498 9499 static void ath12k_mac_op_update_vif_offload(struct ieee80211_hw *hw, 9500 struct ieee80211_vif *vif) 9501 { 9502 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 9503 struct ath12k_link_vif *arvif; 9504 unsigned long links; 9505 int link_id; 9506 9507 lockdep_assert_wiphy(hw->wiphy); 9508 9509 if (vif->valid_links) { 9510 links = vif->valid_links; 9511 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) { 9512 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 9513 if (!(arvif && arvif->ar)) 9514 continue; 9515 9516 ath12k_mac_update_vif_offload(arvif); 9517 } 9518 9519 return; 9520 } 9521 9522 ath12k_mac_update_vif_offload(&ahvif->deflink); 9523 } 9524 9525 static bool ath12k_mac_vif_ap_active_any(struct ath12k_base *ab) 9526 { 9527 struct ath12k *ar; 9528 struct ath12k_pdev *pdev; 9529 struct ath12k_link_vif *arvif; 9530 int i; 9531 9532 for (i = 0; i < ab->num_radios; i++) { 9533 pdev = &ab->pdevs[i]; 9534 ar = pdev->ar; 9535 list_for_each_entry(arvif, &ar->arvifs, list) { 9536 if (arvif->is_up && 9537 arvif->ahvif->vdev_type == WMI_VDEV_TYPE_AP) 9538 return true; 9539 } 9540 } 9541 return false; 9542 } 9543 9544 void ath12k_mac_11d_scan_start(struct ath12k *ar, u32 vdev_id) 9545 { 9546 struct wmi_11d_scan_start_arg arg; 9547 int ret; 9548 9549 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 9550 9551 if (ar->regdom_set_by_user) 9552 goto fin; 9553 9554 if (ar->vdev_id_11d_scan != ATH12K_11D_INVALID_VDEV_ID) 9555 goto fin; 9556 9557 if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map)) 9558 goto fin; 9559 9560 if (ath12k_mac_vif_ap_active_any(ar->ab)) 9561 goto fin; 9562 9563 arg.vdev_id = vdev_id; 9564 arg.start_interval_msec = 0; 9565 arg.scan_period_msec = ATH12K_SCAN_11D_INTERVAL; 9566 9567 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 9568 "mac start 11d scan for vdev %d\n", vdev_id); 9569 9570 ret = ath12k_wmi_send_11d_scan_start_cmd(ar, &arg); 9571 if (ret) { 9572 ath12k_warn(ar->ab, "failed to start 11d scan vdev %d ret: %d\n", 9573 vdev_id, ret); 9574 } else { 9575 ar->vdev_id_11d_scan = vdev_id; 9576 if (ar->state_11d == ATH12K_11D_PREPARING) 9577 ar->state_11d = ATH12K_11D_RUNNING; 9578 } 9579 9580 fin: 9581 if (ar->state_11d == ATH12K_11D_PREPARING) { 9582 ar->state_11d = ATH12K_11D_IDLE; 9583 complete(&ar->completed_11d_scan); 9584 } 9585 } 9586 9587 void ath12k_mac_11d_scan_stop(struct ath12k *ar) 9588 { 9589 int ret; 9590 u32 vdev_id; 9591 9592 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 9593 9594 if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map)) 9595 return; 9596 9597 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac stop 11d for vdev %d\n", 9598 ar->vdev_id_11d_scan); 9599 9600 if (ar->state_11d == ATH12K_11D_PREPARING) { 9601 ar->state_11d = ATH12K_11D_IDLE; 9602 complete(&ar->completed_11d_scan); 9603 } 9604 9605 if (ar->vdev_id_11d_scan != ATH12K_11D_INVALID_VDEV_ID) { 9606 vdev_id = ar->vdev_id_11d_scan; 9607 9608 ret = ath12k_wmi_send_11d_scan_stop_cmd(ar, vdev_id); 9609 if (ret) { 9610 ath12k_warn(ar->ab, 9611 "failed to stopt 11d scan vdev %d ret: %d\n", 9612 vdev_id, ret); 9613 } else { 9614 ar->vdev_id_11d_scan = ATH12K_11D_INVALID_VDEV_ID; 9615 ar->state_11d = ATH12K_11D_IDLE; 9616 complete(&ar->completed_11d_scan); 9617 } 9618 } 9619 } 9620 9621 void ath12k_mac_11d_scan_stop_all(struct ath12k_base *ab) 9622 { 9623 struct ath12k *ar; 9624 struct ath12k_pdev *pdev; 9625 int i; 9626 9627 ath12k_dbg(ab, ATH12K_DBG_MAC, "mac stop soc 11d scan\n"); 9628 9629 for (i = 0; i < ab->num_radios; i++) { 9630 pdev = &ab->pdevs[i]; 9631 ar = pdev->ar; 9632 9633 ath12k_mac_11d_scan_stop(ar); 9634 } 9635 } 9636 9637 static void ath12k_mac_determine_vdev_type(struct ieee80211_vif *vif, 9638 struct ath12k_vif *ahvif) 9639 { 9640 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE; 9641 9642 switch (vif->type) { 9643 case NL80211_IFTYPE_UNSPECIFIED: 9644 case NL80211_IFTYPE_STATION: 9645 ahvif->vdev_type = WMI_VDEV_TYPE_STA; 9646 9647 if (vif->p2p) 9648 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_CLIENT; 9649 9650 break; 9651 case NL80211_IFTYPE_MESH_POINT: 9652 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_MESH_11S; 9653 fallthrough; 9654 case NL80211_IFTYPE_AP: 9655 ahvif->vdev_type = WMI_VDEV_TYPE_AP; 9656 9657 if (vif->p2p) 9658 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO; 9659 9660 break; 9661 case NL80211_IFTYPE_MONITOR: 9662 ahvif->vdev_type = WMI_VDEV_TYPE_MONITOR; 9663 break; 9664 case NL80211_IFTYPE_P2P_DEVICE: 9665 ahvif->vdev_type = WMI_VDEV_TYPE_STA; 9666 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE; 9667 break; 9668 default: 9669 WARN_ON(1); 9670 break; 9671 } 9672 } 9673 9674 int ath12k_mac_vdev_create(struct ath12k *ar, struct ath12k_link_vif *arvif) 9675 { 9676 struct ath12k_hw *ah = ar->ah; 9677 struct ath12k_base *ab = ar->ab; 9678 struct ieee80211_hw *hw = ah->hw; 9679 struct ath12k_vif *ahvif = arvif->ahvif; 9680 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif); 9681 struct ath12k_wmi_vdev_create_arg vdev_arg = {0}; 9682 struct ath12k_wmi_peer_create_arg peer_param = {0}; 9683 struct ieee80211_bss_conf *link_conf = NULL; 9684 u32 param_id, param_value; 9685 u16 nss; 9686 int i; 9687 int ret, vdev_id; 9688 u8 link_id; 9689 9690 lockdep_assert_wiphy(hw->wiphy); 9691 9692 /* In NO_VIRTUAL_MONITOR, its necessary to restrict only one monitor 9693 * interface in each radio 9694 */ 9695 if (vif->type == NL80211_IFTYPE_MONITOR && ar->monitor_vdev_created) 9696 return -EINVAL; 9697 9698 link_id = arvif->link_id; 9699 9700 if (link_id < IEEE80211_MLD_MAX_NUM_LINKS) { 9701 link_conf = wiphy_dereference(hw->wiphy, vif->link_conf[link_id]); 9702 if (!link_conf) { 9703 ath12k_warn(ar->ab, "unable to access bss link conf in vdev create for vif %pM link %u\n", 9704 vif->addr, arvif->link_id); 9705 return -ENOLINK; 9706 } 9707 } 9708 9709 if (link_conf) 9710 memcpy(arvif->bssid, link_conf->addr, ETH_ALEN); 9711 else 9712 memcpy(arvif->bssid, vif->addr, ETH_ALEN); 9713 9714 arvif->ar = ar; 9715 vdev_id = __ffs64(ab->free_vdev_map); 9716 arvif->vdev_id = vdev_id; 9717 if (vif->type == NL80211_IFTYPE_MONITOR) 9718 ar->monitor_vdev_id = vdev_id; 9719 9720 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev create id %d type %d subtype %d map %llx\n", 9721 arvif->vdev_id, ahvif->vdev_type, ahvif->vdev_subtype, 9722 ab->free_vdev_map); 9723 9724 vif->cab_queue = arvif->vdev_id % (ATH12K_HW_MAX_QUEUES - 1); 9725 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++) 9726 vif->hw_queue[i] = i % (ATH12K_HW_MAX_QUEUES - 1); 9727 9728 ret = ath12k_mac_setup_vdev_create_arg(arvif, &vdev_arg); 9729 if (ret) { 9730 ath12k_warn(ab, "failed to create vdev parameters %d: %d\n", 9731 arvif->vdev_id, ret); 9732 goto err; 9733 } 9734 9735 ret = ath12k_wmi_vdev_create(ar, arvif->bssid, &vdev_arg); 9736 if (ret) { 9737 ath12k_warn(ab, "failed to create WMI vdev %d: %d\n", 9738 arvif->vdev_id, ret); 9739 return ret; 9740 } 9741 9742 ar->num_created_vdevs++; 9743 arvif->is_created = true; 9744 ath12k_dbg(ab, ATH12K_DBG_MAC, "vdev %pM created, vdev_id %d\n", 9745 vif->addr, arvif->vdev_id); 9746 ar->allocated_vdev_map |= 1LL << arvif->vdev_id; 9747 ab->free_vdev_map &= ~(1LL << arvif->vdev_id); 9748 9749 spin_lock_bh(&ar->data_lock); 9750 list_add(&arvif->list, &ar->arvifs); 9751 spin_unlock_bh(&ar->data_lock); 9752 9753 ath12k_mac_update_vif_offload(arvif); 9754 9755 nss = hweight32(ar->cfg_tx_chainmask) ? : 1; 9756 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 9757 WMI_VDEV_PARAM_NSS, nss); 9758 if (ret) { 9759 ath12k_warn(ab, "failed to set vdev %d chainmask 0x%x, nss %d :%d\n", 9760 arvif->vdev_id, ar->cfg_tx_chainmask, nss, ret); 9761 goto err_vdev_del; 9762 } 9763 9764 switch (ahvif->vdev_type) { 9765 case WMI_VDEV_TYPE_AP: 9766 peer_param.vdev_id = arvif->vdev_id; 9767 peer_param.peer_addr = arvif->bssid; 9768 peer_param.peer_type = WMI_PEER_TYPE_DEFAULT; 9769 ret = ath12k_peer_create(ar, arvif, NULL, &peer_param); 9770 if (ret) { 9771 ath12k_warn(ab, "failed to vdev %d create peer for AP: %d\n", 9772 arvif->vdev_id, ret); 9773 goto err_vdev_del; 9774 } 9775 9776 ret = ath12k_mac_set_kickout(arvif); 9777 if (ret) { 9778 ath12k_warn(ar->ab, "failed to set vdev %i kickout parameters: %d\n", 9779 arvif->vdev_id, ret); 9780 goto err_peer_del; 9781 } 9782 ath12k_mac_11d_scan_stop_all(ar->ab); 9783 break; 9784 case WMI_VDEV_TYPE_STA: 9785 param_id = WMI_STA_PS_PARAM_RX_WAKE_POLICY; 9786 param_value = WMI_STA_PS_RX_WAKE_POLICY_WAKE; 9787 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, 9788 param_id, param_value); 9789 if (ret) { 9790 ath12k_warn(ar->ab, "failed to set vdev %d RX wake policy: %d\n", 9791 arvif->vdev_id, ret); 9792 goto err_peer_del; 9793 } 9794 9795 param_id = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD; 9796 param_value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS; 9797 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, 9798 param_id, param_value); 9799 if (ret) { 9800 ath12k_warn(ar->ab, "failed to set vdev %d TX wake threshold: %d\n", 9801 arvif->vdev_id, ret); 9802 goto err_peer_del; 9803 } 9804 9805 param_id = WMI_STA_PS_PARAM_PSPOLL_COUNT; 9806 param_value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX; 9807 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, 9808 param_id, param_value); 9809 if (ret) { 9810 ath12k_warn(ar->ab, "failed to set vdev %d pspoll count: %d\n", 9811 arvif->vdev_id, ret); 9812 goto err_peer_del; 9813 } 9814 9815 ret = ath12k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, false); 9816 if (ret) { 9817 ath12k_warn(ar->ab, "failed to disable vdev %d ps mode: %d\n", 9818 arvif->vdev_id, ret); 9819 goto err_peer_del; 9820 } 9821 9822 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ab->wmi_ab.svc_map) && 9823 ahvif->vdev_type == WMI_VDEV_TYPE_STA && 9824 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) { 9825 reinit_completion(&ar->completed_11d_scan); 9826 ar->state_11d = ATH12K_11D_PREPARING; 9827 } 9828 break; 9829 case WMI_VDEV_TYPE_MONITOR: 9830 ar->monitor_vdev_created = true; 9831 break; 9832 default: 9833 break; 9834 } 9835 9836 if (link_conf) 9837 arvif->txpower = link_conf->txpower; 9838 else 9839 arvif->txpower = NL80211_TX_POWER_AUTOMATIC; 9840 9841 ret = ath12k_mac_txpower_recalc(ar); 9842 if (ret) 9843 goto err_peer_del; 9844 9845 param_id = WMI_VDEV_PARAM_RTS_THRESHOLD; 9846 param_value = hw->wiphy->rts_threshold; 9847 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 9848 param_id, param_value); 9849 if (ret) { 9850 ath12k_warn(ar->ab, "failed to set rts threshold for vdev %d: %d\n", 9851 arvif->vdev_id, ret); 9852 } 9853 9854 ath12k_dp_vdev_tx_attach(ar, arvif); 9855 9856 return ret; 9857 9858 err_peer_del: 9859 if (ahvif->vdev_type == WMI_VDEV_TYPE_AP) { 9860 reinit_completion(&ar->peer_delete_done); 9861 9862 ret = ath12k_wmi_send_peer_delete_cmd(ar, arvif->bssid, 9863 arvif->vdev_id); 9864 if (ret) { 9865 ath12k_warn(ar->ab, "failed to delete peer vdev_id %d addr %pM\n", 9866 arvif->vdev_id, arvif->bssid); 9867 goto err; 9868 } 9869 9870 ret = ath12k_wait_for_peer_delete_done(ar, arvif->vdev_id, 9871 arvif->bssid); 9872 if (ret) 9873 goto err_vdev_del; 9874 9875 ar->num_peers--; 9876 } 9877 9878 err_vdev_del: 9879 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { 9880 ar->monitor_vdev_id = -1; 9881 ar->monitor_vdev_created = false; 9882 } 9883 9884 ath12k_wmi_vdev_delete(ar, arvif->vdev_id); 9885 ar->num_created_vdevs--; 9886 arvif->is_created = false; 9887 arvif->ar = NULL; 9888 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id); 9889 ab->free_vdev_map |= 1LL << arvif->vdev_id; 9890 ab->free_vdev_stats_id_map &= ~(1LL << arvif->vdev_stats_id); 9891 spin_lock_bh(&ar->data_lock); 9892 list_del(&arvif->list); 9893 spin_unlock_bh(&ar->data_lock); 9894 9895 err: 9896 arvif->ar = NULL; 9897 return ret; 9898 } 9899 9900 static void ath12k_mac_vif_flush_key_cache(struct ath12k_link_vif *arvif) 9901 { 9902 struct ath12k_key_conf *key_conf, *tmp; 9903 struct ath12k_vif *ahvif = arvif->ahvif; 9904 struct ath12k_hw *ah = ahvif->ah; 9905 struct ath12k_sta *ahsta; 9906 struct ath12k_link_sta *arsta; 9907 struct ath12k_vif_cache *cache = ahvif->cache[arvif->link_id]; 9908 int ret; 9909 9910 lockdep_assert_wiphy(ah->hw->wiphy); 9911 9912 list_for_each_entry_safe(key_conf, tmp, &cache->key_conf.list, list) { 9913 arsta = NULL; 9914 if (key_conf->sta) { 9915 ahsta = ath12k_sta_to_ahsta(key_conf->sta); 9916 arsta = wiphy_dereference(ah->hw->wiphy, 9917 ahsta->link[arvif->link_id]); 9918 if (!arsta) 9919 goto free_cache; 9920 } 9921 9922 ret = ath12k_mac_set_key(arvif->ar, key_conf->cmd, 9923 arvif, arsta, 9924 key_conf->key); 9925 if (ret) 9926 ath12k_warn(arvif->ar->ab, "unable to apply set key param to vdev %d ret %d\n", 9927 arvif->vdev_id, ret); 9928 free_cache: 9929 list_del(&key_conf->list); 9930 kfree(key_conf); 9931 } 9932 } 9933 9934 static void ath12k_mac_vif_cache_flush(struct ath12k *ar, struct ath12k_link_vif *arvif) 9935 { 9936 struct ath12k_vif *ahvif = arvif->ahvif; 9937 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif); 9938 struct ath12k_vif_cache *cache = ahvif->cache[arvif->link_id]; 9939 struct ath12k_base *ab = ar->ab; 9940 struct ieee80211_bss_conf *link_conf; 9941 9942 int ret; 9943 9944 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 9945 9946 if (!cache) 9947 return; 9948 9949 if (cache->tx_conf.changed) { 9950 ret = ath12k_mac_conf_tx(arvif, cache->tx_conf.ac, 9951 &cache->tx_conf.tx_queue_params); 9952 if (ret) 9953 ath12k_warn(ab, 9954 "unable to apply tx config parameters to vdev %d\n", 9955 ret); 9956 } 9957 9958 if (cache->bss_conf_changed) { 9959 link_conf = ath12k_mac_get_link_bss_conf(arvif); 9960 if (!link_conf) { 9961 ath12k_warn(ar->ab, "unable to access bss link conf in cache flush for vif %pM link %u\n", 9962 vif->addr, arvif->link_id); 9963 return; 9964 } 9965 ath12k_mac_bss_info_changed(ar, arvif, link_conf, 9966 cache->bss_conf_changed); 9967 } 9968 9969 if (!list_empty(&cache->key_conf.list)) 9970 ath12k_mac_vif_flush_key_cache(arvif); 9971 9972 ath12k_ahvif_put_link_cache(ahvif, arvif->link_id); 9973 } 9974 9975 static struct ath12k *ath12k_mac_assign_vif_to_vdev(struct ieee80211_hw *hw, 9976 struct ath12k_link_vif *arvif, 9977 struct ieee80211_chanctx_conf *ctx) 9978 { 9979 struct ath12k_vif *ahvif = arvif->ahvif; 9980 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif); 9981 struct ath12k_link_vif *scan_arvif; 9982 struct ath12k_hw *ah = hw->priv; 9983 struct ath12k *ar; 9984 struct ath12k_base *ab; 9985 u8 link_id = arvif->link_id, scan_link_id; 9986 unsigned long scan_link_map; 9987 int ret; 9988 9989 lockdep_assert_wiphy(hw->wiphy); 9990 9991 if (ah->num_radio == 1) 9992 ar = ah->radio; 9993 else if (ctx) 9994 ar = ath12k_get_ar_by_ctx(hw, ctx); 9995 else 9996 return NULL; 9997 9998 if (!ar) 9999 return NULL; 10000 10001 /* cleanup the scan vdev if we are done scan on that ar 10002 * and now we want to create for actual usage. 10003 */ 10004 if (ieee80211_vif_is_mld(vif)) { 10005 scan_link_map = ahvif->links_map & ATH12K_SCAN_LINKS_MASK; 10006 for_each_set_bit(scan_link_id, &scan_link_map, ATH12K_NUM_MAX_LINKS) { 10007 scan_arvif = wiphy_dereference(hw->wiphy, 10008 ahvif->link[scan_link_id]); 10009 if (scan_arvif && scan_arvif->ar == ar) { 10010 ar->scan.arvif = NULL; 10011 ath12k_mac_remove_link_interface(hw, scan_arvif); 10012 ath12k_mac_unassign_link_vif(scan_arvif); 10013 break; 10014 } 10015 } 10016 } 10017 10018 if (arvif->ar) { 10019 /* This is not expected really */ 10020 if (WARN_ON(!arvif->is_created)) { 10021 arvif->ar = NULL; 10022 return NULL; 10023 } 10024 10025 if (ah->num_radio == 1) 10026 return arvif->ar; 10027 10028 /* This can happen as scan vdev gets created during multiple scans 10029 * across different radios before a vdev is brought up in 10030 * a certain radio. 10031 */ 10032 if (ar != arvif->ar) { 10033 if (WARN_ON(arvif->is_started)) 10034 return NULL; 10035 10036 ath12k_mac_remove_link_interface(hw, arvif); 10037 ath12k_mac_unassign_link_vif(arvif); 10038 } 10039 } 10040 10041 ab = ar->ab; 10042 10043 /* Assign arvif again here since previous radio switch block 10044 * would've unassigned and cleared it. 10045 */ 10046 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id); 10047 if (vif->type == NL80211_IFTYPE_AP && 10048 ar->num_peers > (ar->max_num_peers - 1)) { 10049 ath12k_warn(ab, "failed to create vdev due to insufficient peer entry resource in firmware\n"); 10050 goto unlock; 10051 } 10052 10053 if (arvif->is_created) 10054 goto flush; 10055 10056 if (ar->num_created_vdevs > (TARGET_NUM_VDEVS - 1)) { 10057 ath12k_warn(ab, "failed to create vdev, reached max vdev limit %d\n", 10058 TARGET_NUM_VDEVS); 10059 goto unlock; 10060 } 10061 10062 ret = ath12k_mac_vdev_create(ar, arvif); 10063 if (ret) { 10064 ath12k_warn(ab, "failed to create vdev %pM ret %d", vif->addr, ret); 10065 goto unlock; 10066 } 10067 10068 flush: 10069 /* If the vdev is created during channel assign and not during 10070 * add_interface(), Apply any parameters for the vdev which were received 10071 * after add_interface, corresponding to this vif. 10072 */ 10073 ath12k_mac_vif_cache_flush(ar, arvif); 10074 unlock: 10075 return arvif->ar; 10076 } 10077 10078 static int ath12k_mac_op_add_interface(struct ieee80211_hw *hw, 10079 struct ieee80211_vif *vif) 10080 { 10081 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 10082 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 10083 struct ath12k_reg_info *reg_info; 10084 struct ath12k_link_vif *arvif; 10085 struct ath12k_base *ab; 10086 struct ath12k *ar; 10087 int i; 10088 10089 lockdep_assert_wiphy(hw->wiphy); 10090 10091 memset(ahvif, 0, sizeof(*ahvif)); 10092 10093 ahvif->ah = ah; 10094 ahvif->vif = vif; 10095 arvif = &ahvif->deflink; 10096 10097 ath12k_mac_init_arvif(ahvif, arvif, -1); 10098 10099 /* Allocate Default Queue now and reassign during actual vdev create */ 10100 vif->cab_queue = ATH12K_HW_DEFAULT_QUEUE; 10101 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++) 10102 vif->hw_queue[i] = ATH12K_HW_DEFAULT_QUEUE; 10103 10104 vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD; 10105 10106 ath12k_mac_determine_vdev_type(vif, ahvif); 10107 10108 for_each_ar(ah, ar, i) { 10109 if (!ath12k_wmi_supports_6ghz_cc_ext(ar)) 10110 continue; 10111 10112 ab = ar->ab; 10113 reg_info = ab->reg_info[ar->pdev_idx]; 10114 ath12k_dbg(ab, ATH12K_DBG_MAC, "interface added to change reg rules\n"); 10115 ah->regd_updated = false; 10116 ath12k_reg_handle_chan_list(ab, reg_info, ahvif->vdev_type, 10117 IEEE80211_REG_UNSET_AP); 10118 break; 10119 } 10120 10121 /* Defer vdev creation until assign_chanctx or hw_scan is initiated as driver 10122 * will not know if this interface is an ML vif at this point. 10123 */ 10124 return 0; 10125 } 10126 10127 static void ath12k_mac_vif_unref(struct ath12k_dp *dp, struct ieee80211_vif *vif) 10128 { 10129 struct ath12k_tx_desc_info *tx_desc_info; 10130 struct ath12k_skb_cb *skb_cb; 10131 struct sk_buff *skb; 10132 int i; 10133 10134 for (i = 0; i < ATH12K_HW_MAX_QUEUES; i++) { 10135 spin_lock_bh(&dp->tx_desc_lock[i]); 10136 10137 list_for_each_entry(tx_desc_info, &dp->tx_desc_used_list[i], 10138 list) { 10139 skb = tx_desc_info->skb; 10140 if (!skb) 10141 continue; 10142 10143 skb_cb = ATH12K_SKB_CB(skb); 10144 if (skb_cb->vif == vif) 10145 skb_cb->vif = NULL; 10146 } 10147 10148 spin_unlock_bh(&dp->tx_desc_lock[i]); 10149 } 10150 } 10151 10152 static int ath12k_mac_vdev_delete(struct ath12k *ar, struct ath12k_link_vif *arvif) 10153 { 10154 struct ath12k_vif *ahvif = arvif->ahvif; 10155 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif); 10156 struct ath12k_base *ab = ar->ab; 10157 unsigned long time_left; 10158 int ret; 10159 10160 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 10161 10162 reinit_completion(&ar->vdev_delete_done); 10163 10164 ret = ath12k_wmi_vdev_delete(ar, arvif->vdev_id); 10165 if (ret) { 10166 ath12k_warn(ab, "failed to delete WMI vdev %d: %d\n", 10167 arvif->vdev_id, ret); 10168 goto err_vdev_del; 10169 } 10170 10171 time_left = wait_for_completion_timeout(&ar->vdev_delete_done, 10172 ATH12K_VDEV_DELETE_TIMEOUT_HZ); 10173 if (time_left == 0) { 10174 ath12k_warn(ab, "Timeout in receiving vdev delete response\n"); 10175 goto err_vdev_del; 10176 } 10177 10178 ab->free_vdev_map |= 1LL << arvif->vdev_id; 10179 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id); 10180 ar->num_created_vdevs--; 10181 10182 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { 10183 ar->monitor_vdev_id = -1; 10184 ar->monitor_vdev_created = false; 10185 } 10186 10187 ath12k_dbg(ab, ATH12K_DBG_MAC, "vdev %pM deleted, vdev_id %d\n", 10188 vif->addr, arvif->vdev_id); 10189 10190 err_vdev_del: 10191 spin_lock_bh(&ar->data_lock); 10192 list_del(&arvif->list); 10193 spin_unlock_bh(&ar->data_lock); 10194 10195 ath12k_peer_cleanup(ar, arvif->vdev_id); 10196 ath12k_ahvif_put_link_cache(ahvif, arvif->link_id); 10197 10198 idr_for_each(&ar->txmgmt_idr, 10199 ath12k_mac_vif_txmgmt_idr_remove, vif); 10200 10201 ath12k_mac_vif_unref(&ab->dp, vif); 10202 ath12k_dp_tx_put_bank_profile(&ab->dp, arvif->bank_id); 10203 10204 /* Recalc txpower for remaining vdev */ 10205 ath12k_mac_txpower_recalc(ar); 10206 10207 /* TODO: recal traffic pause state based on the available vdevs */ 10208 arvif->is_created = false; 10209 arvif->ar = NULL; 10210 10211 return ret; 10212 } 10213 10214 static void ath12k_mac_op_remove_interface(struct ieee80211_hw *hw, 10215 struct ieee80211_vif *vif) 10216 { 10217 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 10218 struct ath12k_link_vif *arvif; 10219 struct ath12k *ar; 10220 u8 link_id; 10221 10222 lockdep_assert_wiphy(hw->wiphy); 10223 10224 for (link_id = 0; link_id < ATH12K_NUM_MAX_LINKS; link_id++) { 10225 /* if we cached some config but never received assign chanctx, 10226 * free the allocated cache. 10227 */ 10228 ath12k_ahvif_put_link_cache(ahvif, link_id); 10229 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 10230 if (!arvif || !arvif->is_created) 10231 continue; 10232 10233 ar = arvif->ar; 10234 10235 /* Scan abortion is in progress since before this, cancel_hw_scan() 10236 * is expected to be executed. Since link is anyways going to be removed 10237 * now, just cancel the worker and send the scan aborted to user space 10238 */ 10239 if (ar->scan.arvif == arvif) { 10240 wiphy_work_cancel(hw->wiphy, &ar->scan.vdev_clean_wk); 10241 10242 spin_lock_bh(&ar->data_lock); 10243 ar->scan.arvif = NULL; 10244 if (!ar->scan.is_roc) { 10245 struct cfg80211_scan_info info = { 10246 .aborted = true, 10247 }; 10248 10249 ath12k_mac_scan_send_complete(ar, &info); 10250 } 10251 10252 ar->scan.state = ATH12K_SCAN_IDLE; 10253 ar->scan_channel = NULL; 10254 ar->scan.roc_freq = 0; 10255 spin_unlock_bh(&ar->data_lock); 10256 } 10257 10258 ath12k_mac_remove_link_interface(hw, arvif); 10259 ath12k_mac_unassign_link_vif(arvif); 10260 } 10261 } 10262 10263 /* FIXME: Has to be verified. */ 10264 #define SUPPORTED_FILTERS \ 10265 (FIF_ALLMULTI | \ 10266 FIF_CONTROL | \ 10267 FIF_PSPOLL | \ 10268 FIF_OTHER_BSS | \ 10269 FIF_BCN_PRBRESP_PROMISC | \ 10270 FIF_PROBE_REQ | \ 10271 FIF_FCSFAIL) 10272 10273 static void ath12k_mac_op_configure_filter(struct ieee80211_hw *hw, 10274 unsigned int changed_flags, 10275 unsigned int *total_flags, 10276 u64 multicast) 10277 { 10278 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 10279 struct ath12k *ar; 10280 10281 lockdep_assert_wiphy(hw->wiphy); 10282 10283 ar = ath12k_ah_to_ar(ah, 0); 10284 10285 *total_flags &= SUPPORTED_FILTERS; 10286 ar->filter_flags = *total_flags; 10287 } 10288 10289 static int ath12k_mac_op_get_antenna(struct ieee80211_hw *hw, int radio_idx, 10290 u32 *tx_ant, u32 *rx_ant) 10291 { 10292 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 10293 int antennas_rx = 0, antennas_tx = 0; 10294 struct ath12k *ar; 10295 int i; 10296 10297 lockdep_assert_wiphy(hw->wiphy); 10298 10299 for_each_ar(ah, ar, i) { 10300 antennas_rx = max_t(u32, antennas_rx, ar->cfg_rx_chainmask); 10301 antennas_tx = max_t(u32, antennas_tx, ar->cfg_tx_chainmask); 10302 } 10303 10304 *tx_ant = antennas_tx; 10305 *rx_ant = antennas_rx; 10306 10307 return 0; 10308 } 10309 10310 static int ath12k_mac_op_set_antenna(struct ieee80211_hw *hw, int radio_idx, 10311 u32 tx_ant, u32 rx_ant) 10312 { 10313 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 10314 struct ath12k *ar; 10315 int ret = 0; 10316 int i; 10317 10318 lockdep_assert_wiphy(hw->wiphy); 10319 10320 for_each_ar(ah, ar, i) { 10321 ret = __ath12k_set_antenna(ar, tx_ant, rx_ant); 10322 if (ret) 10323 break; 10324 } 10325 10326 return ret; 10327 } 10328 10329 static int ath12k_mac_ampdu_action(struct ieee80211_hw *hw, 10330 struct ieee80211_vif *vif, 10331 struct ieee80211_ampdu_params *params, 10332 u8 link_id) 10333 { 10334 struct ath12k *ar; 10335 int ret = -EINVAL; 10336 10337 lockdep_assert_wiphy(hw->wiphy); 10338 10339 ar = ath12k_get_ar_by_vif(hw, vif, link_id); 10340 if (!ar) 10341 return -EINVAL; 10342 10343 switch (params->action) { 10344 case IEEE80211_AMPDU_RX_START: 10345 ret = ath12k_dp_rx_ampdu_start(ar, params, link_id); 10346 break; 10347 case IEEE80211_AMPDU_RX_STOP: 10348 ret = ath12k_dp_rx_ampdu_stop(ar, params, link_id); 10349 break; 10350 case IEEE80211_AMPDU_TX_START: 10351 case IEEE80211_AMPDU_TX_STOP_CONT: 10352 case IEEE80211_AMPDU_TX_STOP_FLUSH: 10353 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT: 10354 case IEEE80211_AMPDU_TX_OPERATIONAL: 10355 /* Tx A-MPDU aggregation offloaded to hw/fw so deny mac80211 10356 * Tx aggregation requests. 10357 */ 10358 ret = -EOPNOTSUPP; 10359 break; 10360 } 10361 10362 if (ret) 10363 ath12k_warn(ar->ab, "unable to perform ampdu action %d for vif %pM link %u ret %d\n", 10364 params->action, vif->addr, link_id, ret); 10365 10366 return ret; 10367 } 10368 10369 static int ath12k_mac_op_ampdu_action(struct ieee80211_hw *hw, 10370 struct ieee80211_vif *vif, 10371 struct ieee80211_ampdu_params *params) 10372 { 10373 struct ieee80211_sta *sta = params->sta; 10374 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta); 10375 unsigned long links_map = ahsta->links_map; 10376 int ret = -EINVAL; 10377 u8 link_id; 10378 10379 lockdep_assert_wiphy(hw->wiphy); 10380 10381 if (WARN_ON(!links_map)) 10382 return ret; 10383 10384 for_each_set_bit(link_id, &links_map, IEEE80211_MLD_MAX_NUM_LINKS) { 10385 ret = ath12k_mac_ampdu_action(hw, vif, params, link_id); 10386 if (ret) 10387 return ret; 10388 } 10389 10390 return 0; 10391 } 10392 10393 static int ath12k_mac_op_add_chanctx(struct ieee80211_hw *hw, 10394 struct ieee80211_chanctx_conf *ctx) 10395 { 10396 struct ath12k *ar; 10397 struct ath12k_base *ab; 10398 10399 lockdep_assert_wiphy(hw->wiphy); 10400 10401 ar = ath12k_get_ar_by_ctx(hw, ctx); 10402 if (!ar) 10403 return -EINVAL; 10404 10405 ab = ar->ab; 10406 10407 ath12k_dbg(ab, ATH12K_DBG_MAC, 10408 "mac chanctx add freq %u width %d ptr %p\n", 10409 ctx->def.chan->center_freq, ctx->def.width, ctx); 10410 10411 spin_lock_bh(&ar->data_lock); 10412 /* TODO: In case of multiple channel context, populate rx_channel from 10413 * Rx PPDU desc information. 10414 */ 10415 ar->rx_channel = ctx->def.chan; 10416 spin_unlock_bh(&ar->data_lock); 10417 ar->chan_tx_pwr = ATH12K_PDEV_TX_POWER_INVALID; 10418 10419 return 0; 10420 } 10421 10422 static void ath12k_mac_op_remove_chanctx(struct ieee80211_hw *hw, 10423 struct ieee80211_chanctx_conf *ctx) 10424 { 10425 struct ath12k *ar; 10426 struct ath12k_base *ab; 10427 10428 lockdep_assert_wiphy(hw->wiphy); 10429 10430 ar = ath12k_get_ar_by_ctx(hw, ctx); 10431 if (!ar) 10432 return; 10433 10434 ab = ar->ab; 10435 10436 ath12k_dbg(ab, ATH12K_DBG_MAC, 10437 "mac chanctx remove freq %u width %d ptr %p\n", 10438 ctx->def.chan->center_freq, ctx->def.width, ctx); 10439 10440 spin_lock_bh(&ar->data_lock); 10441 /* TODO: In case of there is one more channel context left, populate 10442 * rx_channel with the channel of that remaining channel context. 10443 */ 10444 ar->rx_channel = NULL; 10445 spin_unlock_bh(&ar->data_lock); 10446 ar->chan_tx_pwr = ATH12K_PDEV_TX_POWER_INVALID; 10447 } 10448 10449 static enum wmi_phy_mode 10450 ath12k_mac_check_down_grade_phy_mode(struct ath12k *ar, 10451 enum wmi_phy_mode mode, 10452 enum nl80211_band band, 10453 enum nl80211_iftype type) 10454 { 10455 struct ieee80211_sta_eht_cap *eht_cap = NULL; 10456 enum wmi_phy_mode down_mode; 10457 int n = ar->mac.sbands[band].n_iftype_data; 10458 int i; 10459 struct ieee80211_sband_iftype_data *data; 10460 10461 if (mode < MODE_11BE_EHT20) 10462 return mode; 10463 10464 data = ar->mac.iftype[band]; 10465 for (i = 0; i < n; i++) { 10466 if (data[i].types_mask & BIT(type)) { 10467 eht_cap = &data[i].eht_cap; 10468 break; 10469 } 10470 } 10471 10472 if (eht_cap && eht_cap->has_eht) 10473 return mode; 10474 10475 switch (mode) { 10476 case MODE_11BE_EHT20: 10477 down_mode = MODE_11AX_HE20; 10478 break; 10479 case MODE_11BE_EHT40: 10480 down_mode = MODE_11AX_HE40; 10481 break; 10482 case MODE_11BE_EHT80: 10483 down_mode = MODE_11AX_HE80; 10484 break; 10485 case MODE_11BE_EHT80_80: 10486 down_mode = MODE_11AX_HE80_80; 10487 break; 10488 case MODE_11BE_EHT160: 10489 case MODE_11BE_EHT160_160: 10490 case MODE_11BE_EHT320: 10491 down_mode = MODE_11AX_HE160; 10492 break; 10493 case MODE_11BE_EHT20_2G: 10494 down_mode = MODE_11AX_HE20_2G; 10495 break; 10496 case MODE_11BE_EHT40_2G: 10497 down_mode = MODE_11AX_HE40_2G; 10498 break; 10499 default: 10500 down_mode = mode; 10501 break; 10502 } 10503 10504 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 10505 "mac vdev start phymode %s downgrade to %s\n", 10506 ath12k_mac_phymode_str(mode), 10507 ath12k_mac_phymode_str(down_mode)); 10508 10509 return down_mode; 10510 } 10511 10512 static void 10513 ath12k_mac_mlo_get_vdev_args(struct ath12k_link_vif *arvif, 10514 struct wmi_ml_arg *ml_arg) 10515 { 10516 struct ath12k_vif *ahvif = arvif->ahvif; 10517 struct wmi_ml_partner_info *partner_info; 10518 struct ieee80211_bss_conf *link_conf; 10519 struct ath12k_link_vif *arvif_p; 10520 unsigned long links; 10521 u8 link_id; 10522 10523 lockdep_assert_wiphy(ahvif->ah->hw->wiphy); 10524 10525 if (!ath12k_mac_is_ml_arvif(arvif)) 10526 return; 10527 10528 if (hweight16(ahvif->vif->valid_links) > ATH12K_WMI_MLO_MAX_LINKS) 10529 return; 10530 10531 ml_arg->enabled = true; 10532 10533 /* Driver always add a new link via VDEV START, FW takes 10534 * care of internally adding this link to existing 10535 * link vdevs which are advertised as partners below 10536 */ 10537 ml_arg->link_add = true; 10538 10539 ml_arg->assoc_link = arvif->is_sta_assoc_link; 10540 10541 partner_info = ml_arg->partner_info; 10542 10543 links = ahvif->links_map; 10544 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) { 10545 arvif_p = wiphy_dereference(ahvif->ah->hw->wiphy, ahvif->link[link_id]); 10546 10547 if (WARN_ON(!arvif_p)) 10548 continue; 10549 10550 if (arvif == arvif_p) 10551 continue; 10552 10553 if (!arvif_p->is_created) 10554 continue; 10555 10556 link_conf = wiphy_dereference(ahvif->ah->hw->wiphy, 10557 ahvif->vif->link_conf[arvif_p->link_id]); 10558 10559 if (!link_conf) 10560 continue; 10561 10562 partner_info->vdev_id = arvif_p->vdev_id; 10563 partner_info->hw_link_id = arvif_p->ar->pdev->hw_link_id; 10564 ether_addr_copy(partner_info->addr, link_conf->addr); 10565 ml_arg->num_partner_links++; 10566 partner_info++; 10567 } 10568 } 10569 10570 static int 10571 ath12k_mac_vdev_start_restart(struct ath12k_link_vif *arvif, 10572 struct ieee80211_chanctx_conf *ctx, 10573 bool restart) 10574 { 10575 struct ath12k *ar = arvif->ar; 10576 struct ath12k_base *ab = ar->ab; 10577 struct wmi_vdev_start_req_arg arg = {}; 10578 const struct cfg80211_chan_def *chandef = &ctx->def; 10579 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar); 10580 struct ath12k_vif *ahvif = arvif->ahvif; 10581 struct ieee80211_bss_conf *link_conf; 10582 unsigned int dfs_cac_time; 10583 int ret; 10584 10585 lockdep_assert_wiphy(hw->wiphy); 10586 10587 link_conf = ath12k_mac_get_link_bss_conf(arvif); 10588 if (!link_conf) { 10589 ath12k_warn(ar->ab, "unable to access bss link conf in vdev start for vif %pM link %u\n", 10590 ahvif->vif->addr, arvif->link_id); 10591 return -ENOLINK; 10592 } 10593 10594 reinit_completion(&ar->vdev_setup_done); 10595 10596 arg.vdev_id = arvif->vdev_id; 10597 arg.dtim_period = arvif->dtim_period; 10598 arg.bcn_intval = arvif->beacon_interval; 10599 arg.punct_bitmap = ~arvif->punct_bitmap; 10600 10601 arg.freq = chandef->chan->center_freq; 10602 arg.band_center_freq1 = chandef->center_freq1; 10603 arg.band_center_freq2 = chandef->center_freq2; 10604 arg.mode = ath12k_phymodes[chandef->chan->band][chandef->width]; 10605 10606 arg.mode = ath12k_mac_check_down_grade_phy_mode(ar, arg.mode, 10607 chandef->chan->band, 10608 ahvif->vif->type); 10609 arg.min_power = 0; 10610 arg.max_power = chandef->chan->max_power; 10611 arg.max_reg_power = chandef->chan->max_reg_power; 10612 arg.max_antenna_gain = chandef->chan->max_antenna_gain; 10613 10614 arg.pref_tx_streams = ar->num_tx_chains; 10615 arg.pref_rx_streams = ar->num_rx_chains; 10616 10617 arg.mbssid_flags = WMI_VDEV_MBSSID_FLAGS_NON_MBSSID_AP; 10618 arg.mbssid_tx_vdev_id = 0; 10619 if (test_bit(WMI_TLV_SERVICE_MBSS_PARAM_IN_VDEV_START_SUPPORT, 10620 ar->ab->wmi_ab.svc_map)) { 10621 ret = ath12k_mac_setup_vdev_params_mbssid(arvif, 10622 &arg.mbssid_flags, 10623 &arg.mbssid_tx_vdev_id); 10624 if (ret) 10625 return ret; 10626 } 10627 10628 if (ahvif->vdev_type == WMI_VDEV_TYPE_AP) { 10629 arg.ssid = ahvif->u.ap.ssid; 10630 arg.ssid_len = ahvif->u.ap.ssid_len; 10631 arg.hidden_ssid = ahvif->u.ap.hidden_ssid; 10632 10633 /* For now allow DFS for AP mode */ 10634 arg.chan_radar = !!(chandef->chan->flags & IEEE80211_CHAN_RADAR); 10635 10636 arg.freq2_radar = ctx->radar_enabled; 10637 10638 arg.passive = arg.chan_radar; 10639 10640 spin_lock_bh(&ab->base_lock); 10641 arg.regdomain = ar->ab->dfs_region; 10642 spin_unlock_bh(&ab->base_lock); 10643 10644 /* TODO: Notify if secondary 80Mhz also needs radar detection */ 10645 } 10646 10647 arg.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR); 10648 10649 if (!restart) 10650 ath12k_mac_mlo_get_vdev_args(arvif, &arg.ml); 10651 10652 ath12k_dbg(ab, ATH12K_DBG_MAC, 10653 "mac vdev %d start center_freq %d phymode %s punct_bitmap 0x%x\n", 10654 arg.vdev_id, arg.freq, 10655 ath12k_mac_phymode_str(arg.mode), arg.punct_bitmap); 10656 10657 ret = ath12k_wmi_vdev_start(ar, &arg, restart); 10658 if (ret) { 10659 ath12k_warn(ar->ab, "failed to %s WMI vdev %i\n", 10660 restart ? "restart" : "start", arg.vdev_id); 10661 return ret; 10662 } 10663 10664 ret = ath12k_mac_vdev_setup_sync(ar); 10665 if (ret) { 10666 ath12k_warn(ab, "failed to synchronize setup for vdev %i %s: %d\n", 10667 arg.vdev_id, restart ? "restart" : "start", ret); 10668 return ret; 10669 } 10670 10671 /* TODO: For now we only set TPC power here. However when 10672 * channel changes, say CSA, it should be updated again. 10673 */ 10674 if (ath12k_mac_supports_tpc(ar, ahvif, chandef)) { 10675 ath12k_mac_fill_reg_tpc_info(ar, arvif, ctx); 10676 ath12k_wmi_send_vdev_set_tpc_power(ar, arvif->vdev_id, 10677 &arvif->reg_tpc_info); 10678 } 10679 10680 ar->num_started_vdevs++; 10681 ath12k_dbg(ab, ATH12K_DBG_MAC, "vdev %pM started, vdev_id %d\n", 10682 ahvif->vif->addr, arvif->vdev_id); 10683 10684 /* Enable CAC Running Flag in the driver by checking all sub-channel's DFS 10685 * state as NL80211_DFS_USABLE which indicates CAC needs to be 10686 * done before channel usage. This flag is used to drop rx packets. 10687 * during CAC. 10688 */ 10689 /* TODO: Set the flag for other interface types as required */ 10690 if (arvif->ahvif->vdev_type == WMI_VDEV_TYPE_AP && ctx->radar_enabled && 10691 cfg80211_chandef_dfs_usable(hw->wiphy, chandef)) { 10692 set_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags); 10693 dfs_cac_time = cfg80211_chandef_dfs_cac_time(hw->wiphy, chandef); 10694 10695 ath12k_dbg(ab, ATH12K_DBG_MAC, 10696 "CAC started dfs_cac_time %u center_freq %d center_freq1 %d for vdev %d\n", 10697 dfs_cac_time, arg.freq, arg.band_center_freq1, arg.vdev_id); 10698 } 10699 10700 ret = ath12k_mac_set_txbf_conf(arvif); 10701 if (ret) 10702 ath12k_warn(ab, "failed to set txbf conf for vdev %d: %d\n", 10703 arvif->vdev_id, ret); 10704 10705 return 0; 10706 } 10707 10708 static int ath12k_mac_vdev_start(struct ath12k_link_vif *arvif, 10709 struct ieee80211_chanctx_conf *ctx) 10710 { 10711 return ath12k_mac_vdev_start_restart(arvif, ctx, false); 10712 } 10713 10714 static int ath12k_mac_vdev_restart(struct ath12k_link_vif *arvif, 10715 struct ieee80211_chanctx_conf *ctx) 10716 { 10717 return ath12k_mac_vdev_start_restart(arvif, ctx, true); 10718 } 10719 10720 struct ath12k_mac_change_chanctx_arg { 10721 struct ieee80211_chanctx_conf *ctx; 10722 struct ieee80211_vif_chanctx_switch *vifs; 10723 int n_vifs; 10724 int next_vif; 10725 struct ath12k *ar; 10726 }; 10727 10728 static void 10729 ath12k_mac_change_chanctx_cnt_iter(void *data, u8 *mac, 10730 struct ieee80211_vif *vif) 10731 { 10732 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 10733 struct ath12k_mac_change_chanctx_arg *arg = data; 10734 struct ieee80211_bss_conf *link_conf; 10735 struct ath12k_link_vif *arvif; 10736 unsigned long links_map; 10737 u8 link_id; 10738 10739 lockdep_assert_wiphy(ahvif->ah->hw->wiphy); 10740 10741 links_map = ahvif->links_map; 10742 for_each_set_bit(link_id, &links_map, IEEE80211_MLD_MAX_NUM_LINKS) { 10743 arvif = wiphy_dereference(ahvif->ah->hw->wiphy, ahvif->link[link_id]); 10744 if (WARN_ON(!arvif)) 10745 continue; 10746 10747 if (!arvif->is_created || arvif->ar != arg->ar) 10748 continue; 10749 10750 link_conf = wiphy_dereference(ahvif->ah->hw->wiphy, 10751 vif->link_conf[link_id]); 10752 if (WARN_ON(!link_conf)) 10753 continue; 10754 10755 if (rcu_access_pointer(link_conf->chanctx_conf) != arg->ctx) 10756 continue; 10757 10758 arg->n_vifs++; 10759 } 10760 } 10761 10762 static void 10763 ath12k_mac_change_chanctx_fill_iter(void *data, u8 *mac, 10764 struct ieee80211_vif *vif) 10765 { 10766 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 10767 struct ath12k_mac_change_chanctx_arg *arg = data; 10768 struct ieee80211_bss_conf *link_conf; 10769 struct ieee80211_chanctx_conf *ctx; 10770 struct ath12k_link_vif *arvif; 10771 unsigned long links_map; 10772 u8 link_id; 10773 10774 lockdep_assert_wiphy(ahvif->ah->hw->wiphy); 10775 10776 links_map = ahvif->links_map; 10777 for_each_set_bit(link_id, &links_map, IEEE80211_MLD_MAX_NUM_LINKS) { 10778 arvif = wiphy_dereference(ahvif->ah->hw->wiphy, ahvif->link[link_id]); 10779 if (WARN_ON(!arvif)) 10780 continue; 10781 10782 if (!arvif->is_created || arvif->ar != arg->ar) 10783 continue; 10784 10785 link_conf = wiphy_dereference(ahvif->ah->hw->wiphy, 10786 vif->link_conf[arvif->link_id]); 10787 if (WARN_ON(!link_conf)) 10788 continue; 10789 10790 ctx = rcu_access_pointer(link_conf->chanctx_conf); 10791 if (ctx != arg->ctx) 10792 continue; 10793 10794 if (WARN_ON(arg->next_vif == arg->n_vifs)) 10795 return; 10796 10797 arg->vifs[arg->next_vif].vif = vif; 10798 arg->vifs[arg->next_vif].old_ctx = ctx; 10799 arg->vifs[arg->next_vif].new_ctx = ctx; 10800 arg->vifs[arg->next_vif].link_conf = link_conf; 10801 arg->next_vif++; 10802 } 10803 } 10804 10805 static u32 ath12k_mac_nlwidth_to_wmiwidth(enum nl80211_chan_width width) 10806 { 10807 switch (width) { 10808 case NL80211_CHAN_WIDTH_20: 10809 return WMI_CHAN_WIDTH_20; 10810 case NL80211_CHAN_WIDTH_40: 10811 return WMI_CHAN_WIDTH_40; 10812 case NL80211_CHAN_WIDTH_80: 10813 return WMI_CHAN_WIDTH_80; 10814 case NL80211_CHAN_WIDTH_160: 10815 return WMI_CHAN_WIDTH_160; 10816 case NL80211_CHAN_WIDTH_80P80: 10817 return WMI_CHAN_WIDTH_80P80; 10818 case NL80211_CHAN_WIDTH_5: 10819 return WMI_CHAN_WIDTH_5; 10820 case NL80211_CHAN_WIDTH_10: 10821 return WMI_CHAN_WIDTH_10; 10822 case NL80211_CHAN_WIDTH_320: 10823 return WMI_CHAN_WIDTH_320; 10824 default: 10825 WARN_ON(1); 10826 return WMI_CHAN_WIDTH_20; 10827 } 10828 } 10829 10830 static int ath12k_mac_update_peer_puncturing_width(struct ath12k *ar, 10831 struct ath12k_link_vif *arvif, 10832 struct cfg80211_chan_def def) 10833 { 10834 u32 param_id, param_value; 10835 int ret; 10836 10837 if (arvif->ahvif->vdev_type != WMI_VDEV_TYPE_STA) 10838 return 0; 10839 10840 param_id = WMI_PEER_CHWIDTH_PUNCTURE_20MHZ_BITMAP; 10841 param_value = ath12k_mac_nlwidth_to_wmiwidth(def.width) | 10842 u32_encode_bits((~def.punctured), 10843 WMI_PEER_PUNCTURE_BITMAP); 10844 10845 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 10846 "punctured bitmap %02x width %d vdev %d\n", 10847 def.punctured, def.width, arvif->vdev_id); 10848 10849 ret = ath12k_wmi_set_peer_param(ar, arvif->bssid, 10850 arvif->vdev_id, param_id, 10851 param_value); 10852 10853 return ret; 10854 } 10855 10856 static void 10857 ath12k_mac_update_vif_chan(struct ath12k *ar, 10858 struct ieee80211_vif_chanctx_switch *vifs, 10859 int n_vifs) 10860 { 10861 struct ath12k_wmi_vdev_up_params params = {}; 10862 struct ath12k_link_vif *arvif; 10863 struct ieee80211_bss_conf *link_conf; 10864 struct ath12k_base *ab = ar->ab; 10865 struct ieee80211_vif *vif; 10866 struct ath12k_vif *ahvif; 10867 u8 link_id; 10868 int ret; 10869 int i; 10870 bool monitor_vif = false; 10871 10872 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 10873 10874 for (i = 0; i < n_vifs; i++) { 10875 vif = vifs[i].vif; 10876 ahvif = ath12k_vif_to_ahvif(vif); 10877 link_conf = vifs[i].link_conf; 10878 link_id = link_conf->link_id; 10879 arvif = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy, 10880 ahvif->link[link_id]); 10881 10882 if (vif->type == NL80211_IFTYPE_MONITOR) { 10883 monitor_vif = true; 10884 continue; 10885 } 10886 10887 ath12k_dbg(ab, ATH12K_DBG_MAC, 10888 "mac chanctx switch vdev_id %i freq %u->%u width %d->%d\n", 10889 arvif->vdev_id, 10890 vifs[i].old_ctx->def.chan->center_freq, 10891 vifs[i].new_ctx->def.chan->center_freq, 10892 vifs[i].old_ctx->def.width, 10893 vifs[i].new_ctx->def.width); 10894 10895 if (WARN_ON(!arvif->is_started)) 10896 continue; 10897 10898 arvif->punct_bitmap = vifs[i].new_ctx->def.punctured; 10899 10900 /* Firmware expect vdev_restart only if vdev is up. 10901 * If vdev is down then it expect vdev_stop->vdev_start. 10902 */ 10903 if (arvif->is_up) { 10904 ret = ath12k_mac_vdev_restart(arvif, vifs[i].new_ctx); 10905 if (ret) { 10906 ath12k_warn(ab, "failed to restart vdev %d: %d\n", 10907 arvif->vdev_id, ret); 10908 continue; 10909 } 10910 } else { 10911 ret = ath12k_mac_vdev_stop(arvif); 10912 if (ret) { 10913 ath12k_warn(ab, "failed to stop vdev %d: %d\n", 10914 arvif->vdev_id, ret); 10915 continue; 10916 } 10917 10918 ret = ath12k_mac_vdev_start(arvif, vifs[i].new_ctx); 10919 if (ret) 10920 ath12k_warn(ab, "failed to start vdev %d: %d\n", 10921 arvif->vdev_id, ret); 10922 continue; 10923 } 10924 10925 ret = ath12k_mac_setup_bcn_tmpl(arvif); 10926 if (ret) 10927 ath12k_warn(ab, "failed to update bcn tmpl during csa: %d\n", 10928 ret); 10929 10930 memset(¶ms, 0, sizeof(params)); 10931 params.vdev_id = arvif->vdev_id; 10932 params.aid = ahvif->aid; 10933 params.bssid = arvif->bssid; 10934 params.tx_bssid = ath12k_mac_get_tx_bssid(arvif); 10935 if (params.tx_bssid) { 10936 params.nontx_profile_idx = link_conf->bssid_index; 10937 params.nontx_profile_cnt = 1 << link_conf->bssid_indicator; 10938 } 10939 ret = ath12k_wmi_vdev_up(arvif->ar, ¶ms); 10940 if (ret) { 10941 ath12k_warn(ab, "failed to bring vdev up %d: %d\n", 10942 arvif->vdev_id, ret); 10943 continue; 10944 } 10945 10946 ret = ath12k_mac_update_peer_puncturing_width(arvif->ar, arvif, 10947 vifs[i].new_ctx->def); 10948 if (ret) { 10949 ath12k_warn(ar->ab, 10950 "failed to update puncturing bitmap %02x and width %d: %d\n", 10951 vifs[i].new_ctx->def.punctured, 10952 vifs[i].new_ctx->def.width, ret); 10953 continue; 10954 } 10955 } 10956 10957 /* Restart the internal monitor vdev on new channel */ 10958 if (!monitor_vif && ar->monitor_vdev_created) { 10959 if (!ath12k_mac_monitor_stop(ar)) 10960 ath12k_mac_monitor_start(ar); 10961 } 10962 } 10963 10964 static void 10965 ath12k_mac_update_active_vif_chan(struct ath12k *ar, 10966 struct ieee80211_chanctx_conf *ctx) 10967 { 10968 struct ath12k_mac_change_chanctx_arg arg = { .ctx = ctx, .ar = ar }; 10969 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar); 10970 10971 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 10972 10973 ieee80211_iterate_active_interfaces_atomic(hw, 10974 IEEE80211_IFACE_ITER_NORMAL, 10975 ath12k_mac_change_chanctx_cnt_iter, 10976 &arg); 10977 if (arg.n_vifs == 0) 10978 return; 10979 10980 arg.vifs = kcalloc(arg.n_vifs, sizeof(arg.vifs[0]), GFP_KERNEL); 10981 if (!arg.vifs) 10982 return; 10983 10984 ieee80211_iterate_active_interfaces_atomic(hw, 10985 IEEE80211_IFACE_ITER_NORMAL, 10986 ath12k_mac_change_chanctx_fill_iter, 10987 &arg); 10988 10989 ath12k_mac_update_vif_chan(ar, arg.vifs, arg.n_vifs); 10990 10991 kfree(arg.vifs); 10992 } 10993 10994 static void ath12k_mac_op_change_chanctx(struct ieee80211_hw *hw, 10995 struct ieee80211_chanctx_conf *ctx, 10996 u32 changed) 10997 { 10998 struct ath12k *ar; 10999 struct ath12k_base *ab; 11000 11001 lockdep_assert_wiphy(hw->wiphy); 11002 11003 ar = ath12k_get_ar_by_ctx(hw, ctx); 11004 if (!ar) 11005 return; 11006 11007 ab = ar->ab; 11008 11009 ath12k_dbg(ab, ATH12K_DBG_MAC, 11010 "mac chanctx change freq %u width %d ptr %p changed %x\n", 11011 ctx->def.chan->center_freq, ctx->def.width, ctx, changed); 11012 11013 /* This shouldn't really happen because channel switching should use 11014 * switch_vif_chanctx(). 11015 */ 11016 if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL)) 11017 return; 11018 11019 if (changed & IEEE80211_CHANCTX_CHANGE_WIDTH || 11020 changed & IEEE80211_CHANCTX_CHANGE_RADAR || 11021 changed & IEEE80211_CHANCTX_CHANGE_PUNCTURING) 11022 ath12k_mac_update_active_vif_chan(ar, ctx); 11023 11024 /* TODO: Recalc radar detection */ 11025 } 11026 11027 static int ath12k_start_vdev_delay(struct ath12k *ar, 11028 struct ath12k_link_vif *arvif) 11029 { 11030 struct ath12k_base *ab = ar->ab; 11031 struct ath12k_vif *ahvif = arvif->ahvif; 11032 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 11033 struct ieee80211_chanctx_conf *chanctx; 11034 struct ieee80211_bss_conf *link_conf; 11035 int ret; 11036 11037 if (WARN_ON(arvif->is_started)) 11038 return -EBUSY; 11039 11040 link_conf = ath12k_mac_get_link_bss_conf(arvif); 11041 if (!link_conf) { 11042 ath12k_warn(ab, "failed to get link conf for vdev %u\n", arvif->vdev_id); 11043 return -EINVAL; 11044 } 11045 11046 chanctx = wiphy_dereference(ath12k_ar_to_hw(arvif->ar)->wiphy, 11047 link_conf->chanctx_conf); 11048 ret = ath12k_mac_vdev_start(arvif, chanctx); 11049 if (ret) { 11050 ath12k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n", 11051 arvif->vdev_id, vif->addr, 11052 chanctx->def.chan->center_freq, ret); 11053 return ret; 11054 } 11055 11056 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { 11057 ret = ath12k_monitor_vdev_up(ar, arvif->vdev_id); 11058 if (ret) { 11059 ath12k_warn(ab, "failed put monitor up: %d\n", ret); 11060 return ret; 11061 } 11062 } 11063 11064 arvif->is_started = true; 11065 11066 /* TODO: Setup ps and cts/rts protection */ 11067 return 0; 11068 } 11069 11070 static u8 ath12k_mac_get_num_pwr_levels(struct cfg80211_chan_def *chan_def) 11071 { 11072 if (chan_def->chan->flags & IEEE80211_CHAN_PSD) { 11073 switch (chan_def->width) { 11074 case NL80211_CHAN_WIDTH_20: 11075 return 1; 11076 case NL80211_CHAN_WIDTH_40: 11077 return 2; 11078 case NL80211_CHAN_WIDTH_80: 11079 return 4; 11080 case NL80211_CHAN_WIDTH_160: 11081 return 8; 11082 case NL80211_CHAN_WIDTH_320: 11083 return 16; 11084 default: 11085 return 1; 11086 } 11087 } else { 11088 switch (chan_def->width) { 11089 case NL80211_CHAN_WIDTH_20: 11090 return 1; 11091 case NL80211_CHAN_WIDTH_40: 11092 return 2; 11093 case NL80211_CHAN_WIDTH_80: 11094 return 3; 11095 case NL80211_CHAN_WIDTH_160: 11096 return 4; 11097 case NL80211_CHAN_WIDTH_320: 11098 return 5; 11099 default: 11100 return 1; 11101 } 11102 } 11103 } 11104 11105 static u16 ath12k_mac_get_6ghz_start_frequency(struct cfg80211_chan_def *chan_def) 11106 { 11107 u16 diff_seq; 11108 11109 /* It is to get the lowest channel number's center frequency of the chan. 11110 * For example, 11111 * bandwidth=40 MHz, center frequency is 5965, lowest channel is 1 11112 * with center frequency 5955, its diff is 5965 - 5955 = 10. 11113 * bandwidth=80 MHz, center frequency is 5985, lowest channel is 1 11114 * with center frequency 5955, its diff is 5985 - 5955 = 30. 11115 * bandwidth=160 MHz, center frequency is 6025, lowest channel is 1 11116 * with center frequency 5955, its diff is 6025 - 5955 = 70. 11117 * bandwidth=320 MHz, center frequency is 6105, lowest channel is 1 11118 * with center frequency 5955, its diff is 6105 - 5955 = 70. 11119 */ 11120 switch (chan_def->width) { 11121 case NL80211_CHAN_WIDTH_320: 11122 diff_seq = 150; 11123 break; 11124 case NL80211_CHAN_WIDTH_160: 11125 diff_seq = 70; 11126 break; 11127 case NL80211_CHAN_WIDTH_80: 11128 diff_seq = 30; 11129 break; 11130 case NL80211_CHAN_WIDTH_40: 11131 diff_seq = 10; 11132 break; 11133 default: 11134 diff_seq = 0; 11135 } 11136 11137 return chan_def->center_freq1 - diff_seq; 11138 } 11139 11140 static u16 ath12k_mac_get_seg_freq(struct cfg80211_chan_def *chan_def, 11141 u16 start_seq, u8 seq) 11142 { 11143 u16 seg_seq; 11144 11145 /* It is to get the center frequency of the specific bandwidth. 11146 * start_seq means the lowest channel number's center frequency. 11147 * seq 0/1/2/3 means 20 MHz/40 MHz/80 MHz/160 MHz. 11148 * For example, 11149 * lowest channel is 1, its center frequency 5955, 11150 * center frequency is 5955 when bandwidth=20 MHz, its diff is 5955 - 5955 = 0. 11151 * lowest channel is 1, its center frequency 5955, 11152 * center frequency is 5965 when bandwidth=40 MHz, its diff is 5965 - 5955 = 10. 11153 * lowest channel is 1, its center frequency 5955, 11154 * center frequency is 5985 when bandwidth=80 MHz, its diff is 5985 - 5955 = 30. 11155 * lowest channel is 1, its center frequency 5955, 11156 * center frequency is 6025 when bandwidth=160 MHz, its diff is 6025 - 5955 = 70. 11157 */ 11158 seg_seq = 10 * (BIT(seq) - 1); 11159 return seg_seq + start_seq; 11160 } 11161 11162 static void ath12k_mac_get_psd_channel(struct ath12k *ar, 11163 u16 step_freq, 11164 u16 *start_freq, 11165 u16 *center_freq, 11166 u8 i, 11167 struct ieee80211_channel **temp_chan, 11168 s8 *tx_power) 11169 { 11170 /* It is to get the center frequency for each 20 MHz. 11171 * For example, if the chan is 160 MHz and center frequency is 6025, 11172 * then it include 8 channels, they are 1/5/9/13/17/21/25/29, 11173 * channel number 1's center frequency is 5955, it is parameter start_freq. 11174 * parameter i is the step of the 8 channels. i is 0~7 for the 8 channels. 11175 * the channel 1/5/9/13/17/21/25/29 maps i=0/1/2/3/4/5/6/7, 11176 * and maps its center frequency is 5955/5975/5995/6015/6035/6055/6075/6095, 11177 * the gap is 20 for each channel, parameter step_freq means the gap. 11178 * after get the center frequency of each channel, it is easy to find the 11179 * struct ieee80211_channel of it and get the max_reg_power. 11180 */ 11181 *center_freq = *start_freq + i * step_freq; 11182 *temp_chan = ieee80211_get_channel(ar->ah->hw->wiphy, *center_freq); 11183 *tx_power = (*temp_chan)->max_reg_power; 11184 } 11185 11186 static void ath12k_mac_get_eirp_power(struct ath12k *ar, 11187 u16 *start_freq, 11188 u16 *center_freq, 11189 u8 i, 11190 struct ieee80211_channel **temp_chan, 11191 struct cfg80211_chan_def *def, 11192 s8 *tx_power) 11193 { 11194 /* It is to get the center frequency for 20 MHz/40 MHz/80 MHz/ 11195 * 160 MHz bandwidth, and then plus 10 to the center frequency, 11196 * it is the center frequency of a channel number. 11197 * For example, when configured channel number is 1. 11198 * center frequency is 5965 when bandwidth=40 MHz, after plus 10, it is 5975, 11199 * then it is channel number 5. 11200 * center frequency is 5985 when bandwidth=80 MHz, after plus 10, it is 5995, 11201 * then it is channel number 9. 11202 * center frequency is 6025 when bandwidth=160 MHz, after plus 10, it is 6035, 11203 * then it is channel number 17. 11204 * after get the center frequency of each channel, it is easy to find the 11205 * struct ieee80211_channel of it and get the max_reg_power. 11206 */ 11207 *center_freq = ath12k_mac_get_seg_freq(def, *start_freq, i); 11208 11209 /* For the 20 MHz, its center frequency is same with same channel */ 11210 if (i != 0) 11211 *center_freq += 10; 11212 11213 *temp_chan = ieee80211_get_channel(ar->ah->hw->wiphy, *center_freq); 11214 *tx_power = (*temp_chan)->max_reg_power; 11215 } 11216 11217 void ath12k_mac_fill_reg_tpc_info(struct ath12k *ar, 11218 struct ath12k_link_vif *arvif, 11219 struct ieee80211_chanctx_conf *ctx) 11220 { 11221 struct ath12k_base *ab = ar->ab; 11222 struct ath12k_reg_tpc_power_info *reg_tpc_info = &arvif->reg_tpc_info; 11223 struct ieee80211_bss_conf *bss_conf = ath12k_mac_get_link_bss_conf(arvif); 11224 struct ieee80211_channel *chan, *temp_chan; 11225 u8 pwr_lvl_idx, num_pwr_levels, pwr_reduction; 11226 bool is_psd_power = false, is_tpe_present = false; 11227 s8 max_tx_power[ATH12K_NUM_PWR_LEVELS], 11228 psd_power, tx_power, eirp_power; 11229 struct ath12k_vif *ahvif = arvif->ahvif; 11230 u16 start_freq, center_freq; 11231 u8 reg_6ghz_power_mode; 11232 11233 chan = ctx->def.chan; 11234 start_freq = ath12k_mac_get_6ghz_start_frequency(&ctx->def); 11235 pwr_reduction = bss_conf->pwr_reduction; 11236 11237 if (arvif->reg_tpc_info.num_pwr_levels) { 11238 is_tpe_present = true; 11239 num_pwr_levels = arvif->reg_tpc_info.num_pwr_levels; 11240 } else { 11241 num_pwr_levels = ath12k_mac_get_num_pwr_levels(&ctx->def); 11242 } 11243 11244 for (pwr_lvl_idx = 0; pwr_lvl_idx < num_pwr_levels; pwr_lvl_idx++) { 11245 /* STA received TPE IE*/ 11246 if (is_tpe_present) { 11247 /* local power is PSD power*/ 11248 if (chan->flags & IEEE80211_CHAN_PSD) { 11249 /* Connecting AP is psd power */ 11250 if (reg_tpc_info->is_psd_power) { 11251 is_psd_power = true; 11252 ath12k_mac_get_psd_channel(ar, 20, 11253 &start_freq, 11254 ¢er_freq, 11255 pwr_lvl_idx, 11256 &temp_chan, 11257 &tx_power); 11258 psd_power = temp_chan->psd; 11259 eirp_power = tx_power; 11260 max_tx_power[pwr_lvl_idx] = 11261 min_t(s8, 11262 psd_power, 11263 reg_tpc_info->tpe[pwr_lvl_idx]); 11264 /* Connecting AP is not psd power */ 11265 } else { 11266 ath12k_mac_get_eirp_power(ar, 11267 &start_freq, 11268 ¢er_freq, 11269 pwr_lvl_idx, 11270 &temp_chan, 11271 &ctx->def, 11272 &tx_power); 11273 psd_power = temp_chan->psd; 11274 /* convert psd power to EIRP power based 11275 * on channel width 11276 */ 11277 tx_power = 11278 min_t(s8, tx_power, 11279 psd_power + 13 + pwr_lvl_idx * 3); 11280 max_tx_power[pwr_lvl_idx] = 11281 min_t(s8, 11282 tx_power, 11283 reg_tpc_info->tpe[pwr_lvl_idx]); 11284 } 11285 /* local power is not PSD power */ 11286 } else { 11287 /* Connecting AP is psd power */ 11288 if (reg_tpc_info->is_psd_power) { 11289 is_psd_power = true; 11290 ath12k_mac_get_psd_channel(ar, 20, 11291 &start_freq, 11292 ¢er_freq, 11293 pwr_lvl_idx, 11294 &temp_chan, 11295 &tx_power); 11296 eirp_power = tx_power; 11297 max_tx_power[pwr_lvl_idx] = 11298 reg_tpc_info->tpe[pwr_lvl_idx]; 11299 /* Connecting AP is not psd power */ 11300 } else { 11301 ath12k_mac_get_eirp_power(ar, 11302 &start_freq, 11303 ¢er_freq, 11304 pwr_lvl_idx, 11305 &temp_chan, 11306 &ctx->def, 11307 &tx_power); 11308 max_tx_power[pwr_lvl_idx] = 11309 min_t(s8, 11310 tx_power, 11311 reg_tpc_info->tpe[pwr_lvl_idx]); 11312 } 11313 } 11314 /* STA not received TPE IE */ 11315 } else { 11316 /* local power is PSD power*/ 11317 if (chan->flags & IEEE80211_CHAN_PSD) { 11318 is_psd_power = true; 11319 ath12k_mac_get_psd_channel(ar, 20, 11320 &start_freq, 11321 ¢er_freq, 11322 pwr_lvl_idx, 11323 &temp_chan, 11324 &tx_power); 11325 psd_power = temp_chan->psd; 11326 eirp_power = tx_power; 11327 max_tx_power[pwr_lvl_idx] = psd_power; 11328 } else { 11329 ath12k_mac_get_eirp_power(ar, 11330 &start_freq, 11331 ¢er_freq, 11332 pwr_lvl_idx, 11333 &temp_chan, 11334 &ctx->def, 11335 &tx_power); 11336 max_tx_power[pwr_lvl_idx] = tx_power; 11337 } 11338 } 11339 11340 if (is_psd_power) { 11341 /* If AP local power constraint is present */ 11342 if (pwr_reduction) 11343 eirp_power = eirp_power - pwr_reduction; 11344 11345 /* If firmware updated max tx power is non zero, then take 11346 * the min of firmware updated ap tx power 11347 * and max power derived from above mentioned parameters. 11348 */ 11349 ath12k_dbg(ab, ATH12K_DBG_MAC, 11350 "eirp power : %d firmware report power : %d\n", 11351 eirp_power, ar->max_allowed_tx_power); 11352 /* Firmware reports lower max_allowed_tx_power during vdev 11353 * start response. In case of 6 GHz, firmware is not aware 11354 * of EIRP power unless driver sets EIRP power through WMI 11355 * TPC command. So radio which does not support idle power 11356 * save can set maximum calculated EIRP power directly to 11357 * firmware through TPC command without min comparison with 11358 * vdev start response's max_allowed_tx_power. 11359 */ 11360 if (ar->max_allowed_tx_power && ab->hw_params->idle_ps) 11361 eirp_power = min_t(s8, 11362 eirp_power, 11363 ar->max_allowed_tx_power); 11364 } else { 11365 /* If AP local power constraint is present */ 11366 if (pwr_reduction) 11367 max_tx_power[pwr_lvl_idx] = 11368 max_tx_power[pwr_lvl_idx] - pwr_reduction; 11369 /* If firmware updated max tx power is non zero, then take 11370 * the min of firmware updated ap tx power 11371 * and max power derived from above mentioned parameters. 11372 */ 11373 if (ar->max_allowed_tx_power && ab->hw_params->idle_ps) 11374 max_tx_power[pwr_lvl_idx] = 11375 min_t(s8, 11376 max_tx_power[pwr_lvl_idx], 11377 ar->max_allowed_tx_power); 11378 } 11379 reg_tpc_info->chan_power_info[pwr_lvl_idx].chan_cfreq = center_freq; 11380 reg_tpc_info->chan_power_info[pwr_lvl_idx].tx_power = 11381 max_tx_power[pwr_lvl_idx]; 11382 } 11383 11384 reg_tpc_info->num_pwr_levels = num_pwr_levels; 11385 reg_tpc_info->is_psd_power = is_psd_power; 11386 reg_tpc_info->eirp_power = eirp_power; 11387 if (ahvif->vdev_type == WMI_VDEV_TYPE_STA) 11388 reg_6ghz_power_mode = bss_conf->power_type; 11389 else 11390 /* For now, LPI is the only supported AP power mode */ 11391 reg_6ghz_power_mode = IEEE80211_REG_LPI_AP; 11392 11393 reg_tpc_info->ap_power_type = 11394 ath12k_reg_ap_pwr_convert(reg_6ghz_power_mode); 11395 } 11396 11397 static void ath12k_mac_parse_tx_pwr_env(struct ath12k *ar, 11398 struct ath12k_link_vif *arvif) 11399 { 11400 struct ieee80211_bss_conf *bss_conf = ath12k_mac_get_link_bss_conf(arvif); 11401 struct ath12k_reg_tpc_power_info *tpc_info = &arvif->reg_tpc_info; 11402 struct ieee80211_parsed_tpe_eirp *local_non_psd, *reg_non_psd; 11403 struct ieee80211_parsed_tpe_psd *local_psd, *reg_psd; 11404 struct ieee80211_parsed_tpe *tpe = &bss_conf->tpe; 11405 enum wmi_reg_6g_client_type client_type; 11406 struct ath12k_reg_info *reg_info; 11407 struct ath12k_base *ab = ar->ab; 11408 bool psd_valid, non_psd_valid; 11409 int i; 11410 11411 reg_info = ab->reg_info[ar->pdev_idx]; 11412 client_type = reg_info->client_type; 11413 11414 local_psd = &tpe->psd_local[client_type]; 11415 reg_psd = &tpe->psd_reg_client[client_type]; 11416 local_non_psd = &tpe->max_local[client_type]; 11417 reg_non_psd = &tpe->max_reg_client[client_type]; 11418 11419 psd_valid = local_psd->valid | reg_psd->valid; 11420 non_psd_valid = local_non_psd->valid | reg_non_psd->valid; 11421 11422 if (!psd_valid && !non_psd_valid) { 11423 ath12k_warn(ab, 11424 "no transmit power envelope match client power type %d\n", 11425 client_type); 11426 return; 11427 }; 11428 11429 if (psd_valid) { 11430 tpc_info->is_psd_power = true; 11431 11432 tpc_info->num_pwr_levels = max(local_psd->count, 11433 reg_psd->count); 11434 if (tpc_info->num_pwr_levels > ATH12K_NUM_PWR_LEVELS) 11435 tpc_info->num_pwr_levels = ATH12K_NUM_PWR_LEVELS; 11436 11437 for (i = 0; i < tpc_info->num_pwr_levels; i++) { 11438 tpc_info->tpe[i] = min(local_psd->power[i], 11439 reg_psd->power[i]) / 2; 11440 ath12k_dbg(ab, ATH12K_DBG_MAC, 11441 "TPE PSD power[%d] : %d\n", 11442 i, tpc_info->tpe[i]); 11443 } 11444 } else { 11445 tpc_info->is_psd_power = false; 11446 tpc_info->eirp_power = 0; 11447 11448 tpc_info->num_pwr_levels = max(local_non_psd->count, 11449 reg_non_psd->count); 11450 if (tpc_info->num_pwr_levels > ATH12K_NUM_PWR_LEVELS) 11451 tpc_info->num_pwr_levels = ATH12K_NUM_PWR_LEVELS; 11452 11453 for (i = 0; i < tpc_info->num_pwr_levels; i++) { 11454 tpc_info->tpe[i] = min(local_non_psd->power[i], 11455 reg_non_psd->power[i]) / 2; 11456 ath12k_dbg(ab, ATH12K_DBG_MAC, 11457 "non PSD power[%d] : %d\n", 11458 i, tpc_info->tpe[i]); 11459 } 11460 } 11461 } 11462 11463 static int 11464 ath12k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw, 11465 struct ieee80211_vif *vif, 11466 struct ieee80211_bss_conf *link_conf, 11467 struct ieee80211_chanctx_conf *ctx) 11468 { 11469 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 11470 struct ath12k *ar; 11471 struct ath12k_base *ab; 11472 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 11473 u8 link_id = link_conf->link_id; 11474 struct ath12k_link_vif *arvif; 11475 int ret; 11476 11477 lockdep_assert_wiphy(hw->wiphy); 11478 11479 /* For multi radio wiphy, the vdev was not created during add_interface 11480 * create now since we have a channel ctx now to assign to a specific ar/fw 11481 */ 11482 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id); 11483 if (!arvif) { 11484 WARN_ON(1); 11485 return -ENOMEM; 11486 } 11487 11488 ar = ath12k_mac_assign_vif_to_vdev(hw, arvif, ctx); 11489 if (!ar) { 11490 ath12k_hw_warn(ah, "failed to assign chanctx for vif %pM link id %u link vif is already started", 11491 vif->addr, link_id); 11492 return -EINVAL; 11493 } 11494 11495 ab = ar->ab; 11496 11497 ath12k_dbg(ab, ATH12K_DBG_MAC, 11498 "mac chanctx assign ptr %p vdev_id %i\n", 11499 ctx, arvif->vdev_id); 11500 11501 if (ath12k_wmi_supports_6ghz_cc_ext(ar) && 11502 ctx->def.chan->band == NL80211_BAND_6GHZ && 11503 ahvif->vdev_type == WMI_VDEV_TYPE_STA) 11504 ath12k_mac_parse_tx_pwr_env(ar, arvif); 11505 11506 arvif->punct_bitmap = ctx->def.punctured; 11507 11508 /* for some targets bss peer must be created before vdev_start */ 11509 if (ab->hw_params->vdev_start_delay && 11510 ahvif->vdev_type != WMI_VDEV_TYPE_AP && 11511 ahvif->vdev_type != WMI_VDEV_TYPE_MONITOR && 11512 !ath12k_peer_exist_by_vdev_id(ab, arvif->vdev_id)) { 11513 ret = 0; 11514 goto out; 11515 } 11516 11517 if (WARN_ON(arvif->is_started)) { 11518 ret = -EBUSY; 11519 goto out; 11520 } 11521 11522 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { 11523 ret = ath12k_mac_monitor_start(ar); 11524 if (ret) { 11525 ath12k_mac_monitor_vdev_delete(ar); 11526 goto out; 11527 } 11528 11529 arvif->is_started = true; 11530 goto out; 11531 } 11532 11533 ret = ath12k_mac_vdev_start(arvif, ctx); 11534 if (ret) { 11535 ath12k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n", 11536 arvif->vdev_id, vif->addr, 11537 ctx->def.chan->center_freq, ret); 11538 goto out; 11539 } 11540 11541 arvif->is_started = true; 11542 11543 /* TODO: Setup ps and cts/rts protection */ 11544 11545 out: 11546 return ret; 11547 } 11548 11549 static void 11550 ath12k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw, 11551 struct ieee80211_vif *vif, 11552 struct ieee80211_bss_conf *link_conf, 11553 struct ieee80211_chanctx_conf *ctx) 11554 { 11555 struct ath12k *ar; 11556 struct ath12k_base *ab; 11557 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 11558 struct ath12k_link_vif *arvif; 11559 u8 link_id = link_conf->link_id; 11560 int ret; 11561 11562 lockdep_assert_wiphy(hw->wiphy); 11563 11564 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 11565 11566 /* The vif is expected to be attached to an ar's VDEV. 11567 * We leave the vif/vdev in this function as is 11568 * and not delete the vdev symmetric to assign_vif_chanctx() 11569 * the VDEV will be deleted and unassigned either during 11570 * remove_interface() or when there is a change in channel 11571 * that moves the vif to a new ar 11572 */ 11573 if (!arvif || !arvif->is_created) 11574 return; 11575 11576 ar = arvif->ar; 11577 ab = ar->ab; 11578 11579 ath12k_dbg(ab, ATH12K_DBG_MAC, 11580 "mac chanctx unassign ptr %p vdev_id %i\n", 11581 ctx, arvif->vdev_id); 11582 11583 WARN_ON(!arvif->is_started); 11584 11585 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { 11586 ret = ath12k_mac_monitor_stop(ar); 11587 if (ret) 11588 return; 11589 11590 arvif->is_started = false; 11591 } 11592 11593 if (ahvif->vdev_type != WMI_VDEV_TYPE_STA && 11594 ahvif->vdev_type != WMI_VDEV_TYPE_MONITOR) { 11595 ath12k_bss_disassoc(ar, arvif); 11596 ret = ath12k_mac_vdev_stop(arvif); 11597 if (ret) 11598 ath12k_warn(ab, "failed to stop vdev %i: %d\n", 11599 arvif->vdev_id, ret); 11600 } 11601 arvif->is_started = false; 11602 11603 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ab->wmi_ab.svc_map) && 11604 ahvif->vdev_type == WMI_VDEV_TYPE_STA && 11605 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE && 11606 ar->state_11d != ATH12K_11D_PREPARING) { 11607 reinit_completion(&ar->completed_11d_scan); 11608 ar->state_11d = ATH12K_11D_PREPARING; 11609 } 11610 11611 if (ar->scan.arvif == arvif && ar->scan.state == ATH12K_SCAN_RUNNING) { 11612 ath12k_scan_abort(ar); 11613 ar->scan.arvif = NULL; 11614 } 11615 } 11616 11617 static int 11618 ath12k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw, 11619 struct ieee80211_vif_chanctx_switch *vifs, 11620 int n_vifs, 11621 enum ieee80211_chanctx_switch_mode mode) 11622 { 11623 struct ath12k *ar; 11624 11625 lockdep_assert_wiphy(hw->wiphy); 11626 11627 ar = ath12k_get_ar_by_ctx(hw, vifs->old_ctx); 11628 if (!ar) 11629 return -EINVAL; 11630 11631 /* Switching channels across radio is not allowed */ 11632 if (ar != ath12k_get_ar_by_ctx(hw, vifs->new_ctx)) 11633 return -EINVAL; 11634 11635 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 11636 "mac chanctx switch n_vifs %d mode %d\n", 11637 n_vifs, mode); 11638 ath12k_mac_update_vif_chan(ar, vifs, n_vifs); 11639 11640 return 0; 11641 } 11642 11643 static int 11644 ath12k_set_vdev_param_to_all_vifs(struct ath12k *ar, int param, u32 value) 11645 { 11646 struct ath12k_link_vif *arvif; 11647 int ret = 0; 11648 11649 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 11650 11651 list_for_each_entry(arvif, &ar->arvifs, list) { 11652 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "setting mac vdev %d param %d value %d\n", 11653 param, arvif->vdev_id, value); 11654 11655 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 11656 param, value); 11657 if (ret) { 11658 ath12k_warn(ar->ab, "failed to set param %d for vdev %d: %d\n", 11659 param, arvif->vdev_id, ret); 11660 break; 11661 } 11662 } 11663 11664 return ret; 11665 } 11666 11667 /* mac80211 stores device specific RTS/Fragmentation threshold value, 11668 * this is set interface specific to firmware from ath12k driver 11669 */ 11670 static int ath12k_mac_op_set_rts_threshold(struct ieee80211_hw *hw, 11671 int radio_idx, u32 value) 11672 { 11673 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 11674 struct ath12k *ar; 11675 int param_id = WMI_VDEV_PARAM_RTS_THRESHOLD, ret = 0, i; 11676 11677 lockdep_assert_wiphy(hw->wiphy); 11678 11679 /* Currently we set the rts threshold value to all the vifs across 11680 * all radios of the single wiphy. 11681 * TODO Once support for vif specific RTS threshold in mac80211 is 11682 * available, ath12k can make use of it. 11683 */ 11684 for_each_ar(ah, ar, i) { 11685 ret = ath12k_set_vdev_param_to_all_vifs(ar, param_id, value); 11686 if (ret) { 11687 ath12k_warn(ar->ab, "failed to set RTS config for all vdevs of pdev %d", 11688 ar->pdev->pdev_id); 11689 break; 11690 } 11691 } 11692 11693 return ret; 11694 } 11695 11696 static int ath12k_mac_op_set_frag_threshold(struct ieee80211_hw *hw, 11697 int radio_idx, u32 value) 11698 { 11699 /* Even though there's a WMI vdev param for fragmentation threshold no 11700 * known firmware actually implements it. Moreover it is not possible to 11701 * rely frame fragmentation to mac80211 because firmware clears the 11702 * "more fragments" bit in frame control making it impossible for remote 11703 * devices to reassemble frames. 11704 * 11705 * Hence implement a dummy callback just to say fragmentation isn't 11706 * supported. This effectively prevents mac80211 from doing frame 11707 * fragmentation in software. 11708 */ 11709 11710 lockdep_assert_wiphy(hw->wiphy); 11711 11712 return -EOPNOTSUPP; 11713 } 11714 11715 static int ath12k_mac_flush(struct ath12k *ar) 11716 { 11717 long time_left; 11718 int ret = 0; 11719 11720 time_left = wait_event_timeout(ar->dp.tx_empty_waitq, 11721 (atomic_read(&ar->dp.num_tx_pending) == 0), 11722 ATH12K_FLUSH_TIMEOUT); 11723 if (time_left == 0) { 11724 ath12k_warn(ar->ab, 11725 "failed to flush transmit queue, data pkts pending %d\n", 11726 atomic_read(&ar->dp.num_tx_pending)); 11727 ret = -ETIMEDOUT; 11728 } 11729 11730 time_left = wait_event_timeout(ar->txmgmt_empty_waitq, 11731 (atomic_read(&ar->num_pending_mgmt_tx) == 0), 11732 ATH12K_FLUSH_TIMEOUT); 11733 if (time_left == 0) { 11734 ath12k_warn(ar->ab, 11735 "failed to flush mgmt transmit queue, mgmt pkts pending %d\n", 11736 atomic_read(&ar->num_pending_mgmt_tx)); 11737 ret = -ETIMEDOUT; 11738 } 11739 11740 return ret; 11741 } 11742 11743 int ath12k_mac_wait_tx_complete(struct ath12k *ar) 11744 { 11745 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 11746 11747 ath12k_mac_drain_tx(ar); 11748 return ath12k_mac_flush(ar); 11749 } 11750 11751 static void ath12k_mac_op_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 11752 u32 queues, bool drop) 11753 { 11754 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 11755 struct ath12k_link_vif *arvif; 11756 struct ath12k_vif *ahvif; 11757 unsigned long links; 11758 struct ath12k *ar; 11759 u8 link_id; 11760 int i; 11761 11762 lockdep_assert_wiphy(hw->wiphy); 11763 11764 if (drop) 11765 return; 11766 11767 /* vif can be NULL when flush() is considered for hw */ 11768 if (!vif) { 11769 for_each_ar(ah, ar, i) 11770 ath12k_mac_flush(ar); 11771 return; 11772 } 11773 11774 for_each_ar(ah, ar, i) 11775 wiphy_work_flush(hw->wiphy, &ar->wmi_mgmt_tx_work); 11776 11777 ahvif = ath12k_vif_to_ahvif(vif); 11778 links = ahvif->links_map; 11779 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) { 11780 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 11781 if (!(arvif && arvif->ar)) 11782 continue; 11783 11784 ath12k_mac_flush(arvif->ar); 11785 } 11786 } 11787 11788 static int 11789 ath12k_mac_bitrate_mask_num_ht_rates(struct ath12k *ar, 11790 enum nl80211_band band, 11791 const struct cfg80211_bitrate_mask *mask) 11792 { 11793 int num_rates = 0; 11794 int i; 11795 11796 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) 11797 num_rates += hweight16(mask->control[band].ht_mcs[i]); 11798 11799 return num_rates; 11800 } 11801 11802 static bool 11803 ath12k_mac_has_single_legacy_rate(struct ath12k *ar, 11804 enum nl80211_band band, 11805 const struct cfg80211_bitrate_mask *mask) 11806 { 11807 int num_rates = 0; 11808 11809 num_rates = hweight32(mask->control[band].legacy); 11810 11811 if (ath12k_mac_bitrate_mask_num_ht_rates(ar, band, mask)) 11812 return false; 11813 11814 if (ath12k_mac_bitrate_mask_num_vht_rates(ar, band, mask)) 11815 return false; 11816 11817 if (ath12k_mac_bitrate_mask_num_he_rates(ar, band, mask)) 11818 return false; 11819 11820 return num_rates == 1; 11821 } 11822 11823 static __le16 11824 ath12k_mac_get_tx_mcs_map(const struct ieee80211_sta_he_cap *he_cap) 11825 { 11826 if (he_cap->he_cap_elem.phy_cap_info[0] & 11827 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G) 11828 return he_cap->he_mcs_nss_supp.tx_mcs_160; 11829 11830 return he_cap->he_mcs_nss_supp.tx_mcs_80; 11831 } 11832 11833 static bool 11834 ath12k_mac_bitrate_mask_get_single_nss(struct ath12k *ar, 11835 struct ieee80211_vif *vif, 11836 enum nl80211_band band, 11837 const struct cfg80211_bitrate_mask *mask, 11838 int *nss) 11839 { 11840 struct ieee80211_supported_band *sband = &ar->mac.sbands[band]; 11841 u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); 11842 const struct ieee80211_sta_he_cap *he_cap; 11843 u16 he_mcs_map = 0; 11844 u8 ht_nss_mask = 0; 11845 u8 vht_nss_mask = 0; 11846 u8 he_nss_mask = 0; 11847 int i; 11848 11849 /* No need to consider legacy here. Basic rates are always present 11850 * in bitrate mask 11851 */ 11852 11853 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) { 11854 if (mask->control[band].ht_mcs[i] == 0) 11855 continue; 11856 else if (mask->control[band].ht_mcs[i] == 11857 sband->ht_cap.mcs.rx_mask[i]) 11858 ht_nss_mask |= BIT(i); 11859 else 11860 return false; 11861 } 11862 11863 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) { 11864 if (mask->control[band].vht_mcs[i] == 0) 11865 continue; 11866 else if (mask->control[band].vht_mcs[i] == 11867 ath12k_mac_get_max_vht_mcs_map(vht_mcs_map, i)) 11868 vht_nss_mask |= BIT(i); 11869 else 11870 return false; 11871 } 11872 11873 he_cap = ieee80211_get_he_iftype_cap_vif(sband, vif); 11874 if (!he_cap) 11875 return false; 11876 11877 he_mcs_map = le16_to_cpu(ath12k_mac_get_tx_mcs_map(he_cap)); 11878 11879 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) { 11880 if (mask->control[band].he_mcs[i] == 0) 11881 continue; 11882 11883 if (mask->control[band].he_mcs[i] == 11884 ath12k_mac_get_max_he_mcs_map(he_mcs_map, i)) 11885 he_nss_mask |= BIT(i); 11886 else 11887 return false; 11888 } 11889 11890 if (ht_nss_mask != vht_nss_mask || ht_nss_mask != he_nss_mask) 11891 return false; 11892 11893 if (ht_nss_mask == 0) 11894 return false; 11895 11896 if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask) 11897 return false; 11898 11899 *nss = fls(ht_nss_mask); 11900 11901 return true; 11902 } 11903 11904 static int 11905 ath12k_mac_get_single_legacy_rate(struct ath12k *ar, 11906 enum nl80211_band band, 11907 const struct cfg80211_bitrate_mask *mask, 11908 u32 *rate, u8 *nss) 11909 { 11910 int rate_idx; 11911 u16 bitrate; 11912 u8 preamble; 11913 u8 hw_rate; 11914 11915 if (hweight32(mask->control[band].legacy) != 1) 11916 return -EINVAL; 11917 11918 rate_idx = ffs(mask->control[band].legacy) - 1; 11919 11920 if (band == NL80211_BAND_5GHZ || band == NL80211_BAND_6GHZ) 11921 rate_idx += ATH12K_MAC_FIRST_OFDM_RATE_IDX; 11922 11923 hw_rate = ath12k_legacy_rates[rate_idx].hw_value; 11924 bitrate = ath12k_legacy_rates[rate_idx].bitrate; 11925 11926 if (ath12k_mac_bitrate_is_cck(bitrate)) 11927 preamble = WMI_RATE_PREAMBLE_CCK; 11928 else 11929 preamble = WMI_RATE_PREAMBLE_OFDM; 11930 11931 *nss = 1; 11932 *rate = ATH12K_HW_RATE_CODE(hw_rate, 0, preamble); 11933 11934 return 0; 11935 } 11936 11937 static int 11938 ath12k_mac_set_fixed_rate_gi_ltf(struct ath12k_link_vif *arvif, u8 he_gi, u8 he_ltf) 11939 { 11940 struct ath12k *ar = arvif->ar; 11941 int ret; 11942 11943 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 11944 11945 /* 0.8 = 0, 1.6 = 2 and 3.2 = 3. */ 11946 if (he_gi && he_gi != 0xFF) 11947 he_gi += 1; 11948 11949 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 11950 WMI_VDEV_PARAM_SGI, he_gi); 11951 if (ret) { 11952 ath12k_warn(ar->ab, "failed to set HE GI:%d, error:%d\n", 11953 he_gi, ret); 11954 return ret; 11955 } 11956 /* start from 1 */ 11957 if (he_ltf != 0xFF) 11958 he_ltf += 1; 11959 11960 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 11961 WMI_VDEV_PARAM_HE_LTF, he_ltf); 11962 if (ret) { 11963 ath12k_warn(ar->ab, "failed to set HE LTF:%d, error:%d\n", 11964 he_ltf, ret); 11965 return ret; 11966 } 11967 return 0; 11968 } 11969 11970 static int 11971 ath12k_mac_set_auto_rate_gi_ltf(struct ath12k_link_vif *arvif, u16 he_gi, u8 he_ltf) 11972 { 11973 struct ath12k *ar = arvif->ar; 11974 int ret; 11975 u32 he_ar_gi_ltf; 11976 11977 if (he_gi != 0xFF) { 11978 switch (he_gi) { 11979 case NL80211_RATE_INFO_HE_GI_0_8: 11980 he_gi = WMI_AUTORATE_800NS_GI; 11981 break; 11982 case NL80211_RATE_INFO_HE_GI_1_6: 11983 he_gi = WMI_AUTORATE_1600NS_GI; 11984 break; 11985 case NL80211_RATE_INFO_HE_GI_3_2: 11986 he_gi = WMI_AUTORATE_3200NS_GI; 11987 break; 11988 default: 11989 ath12k_warn(ar->ab, "Invalid GI\n"); 11990 return -EINVAL; 11991 } 11992 } 11993 11994 if (he_ltf != 0xFF) { 11995 switch (he_ltf) { 11996 case NL80211_RATE_INFO_HE_1XLTF: 11997 he_ltf = WMI_HE_AUTORATE_LTF_1X; 11998 break; 11999 case NL80211_RATE_INFO_HE_2XLTF: 12000 he_ltf = WMI_HE_AUTORATE_LTF_2X; 12001 break; 12002 case NL80211_RATE_INFO_HE_4XLTF: 12003 he_ltf = WMI_HE_AUTORATE_LTF_4X; 12004 break; 12005 default: 12006 ath12k_warn(ar->ab, "Invalid LTF\n"); 12007 return -EINVAL; 12008 } 12009 } 12010 12011 he_ar_gi_ltf = he_gi | he_ltf; 12012 12013 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 12014 WMI_VDEV_PARAM_AUTORATE_MISC_CFG, 12015 he_ar_gi_ltf); 12016 if (ret) { 12017 ath12k_warn(ar->ab, 12018 "failed to set HE autorate GI:%u, LTF:%u params, error:%d\n", 12019 he_gi, he_ltf, ret); 12020 return ret; 12021 } 12022 12023 return 0; 12024 } 12025 12026 static u32 ath12k_mac_nlgi_to_wmigi(enum nl80211_txrate_gi gi) 12027 { 12028 switch (gi) { 12029 case NL80211_TXRATE_DEFAULT_GI: 12030 return WMI_GI_400_NS; 12031 case NL80211_TXRATE_FORCE_LGI: 12032 return WMI_GI_800_NS; 12033 default: 12034 return WMI_GI_400_NS; 12035 } 12036 } 12037 12038 static int ath12k_mac_set_rate_params(struct ath12k_link_vif *arvif, 12039 u32 rate, u8 nss, u8 sgi, u8 ldpc, 12040 u8 he_gi, u8 he_ltf, bool he_fixed_rate) 12041 { 12042 struct ieee80211_bss_conf *link_conf; 12043 struct ath12k *ar = arvif->ar; 12044 u32 vdev_param; 12045 u32 param_value; 12046 int ret; 12047 bool he_support; 12048 12049 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 12050 12051 link_conf = ath12k_mac_get_link_bss_conf(arvif); 12052 if (!link_conf) 12053 return -EINVAL; 12054 12055 he_support = link_conf->he_support; 12056 12057 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 12058 "mac set rate params vdev %i rate 0x%02x nss 0x%02x sgi 0x%02x ldpc 0x%02x\n", 12059 arvif->vdev_id, rate, nss, sgi, ldpc); 12060 12061 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 12062 "he_gi 0x%02x he_ltf 0x%02x he_fixed_rate %d\n", he_gi, 12063 he_ltf, he_fixed_rate); 12064 12065 if (!he_support) { 12066 vdev_param = WMI_VDEV_PARAM_FIXED_RATE; 12067 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 12068 vdev_param, rate); 12069 if (ret) { 12070 ath12k_warn(ar->ab, "failed to set fixed rate param 0x%02x: %d\n", 12071 rate, ret); 12072 return ret; 12073 } 12074 } 12075 12076 vdev_param = WMI_VDEV_PARAM_NSS; 12077 12078 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 12079 vdev_param, nss); 12080 if (ret) { 12081 ath12k_warn(ar->ab, "failed to set nss param %d: %d\n", 12082 nss, ret); 12083 return ret; 12084 } 12085 12086 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 12087 WMI_VDEV_PARAM_LDPC, ldpc); 12088 if (ret) { 12089 ath12k_warn(ar->ab, "failed to set ldpc param %d: %d\n", 12090 ldpc, ret); 12091 return ret; 12092 } 12093 12094 if (he_support) { 12095 if (he_fixed_rate) 12096 ret = ath12k_mac_set_fixed_rate_gi_ltf(arvif, he_gi, he_ltf); 12097 else 12098 ret = ath12k_mac_set_auto_rate_gi_ltf(arvif, he_gi, he_ltf); 12099 if (ret) 12100 return ret; 12101 } else { 12102 vdev_param = WMI_VDEV_PARAM_SGI; 12103 param_value = ath12k_mac_nlgi_to_wmigi(sgi); 12104 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 12105 vdev_param, param_value); 12106 if (ret) { 12107 ath12k_warn(ar->ab, "failed to set sgi param %d: %d\n", 12108 sgi, ret); 12109 return ret; 12110 } 12111 } 12112 12113 return 0; 12114 } 12115 12116 static bool 12117 ath12k_mac_vht_mcs_range_present(struct ath12k *ar, 12118 enum nl80211_band band, 12119 const struct cfg80211_bitrate_mask *mask) 12120 { 12121 int i; 12122 u16 vht_mcs; 12123 12124 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) { 12125 vht_mcs = mask->control[band].vht_mcs[i]; 12126 12127 switch (vht_mcs) { 12128 case 0: 12129 case BIT(8) - 1: 12130 case BIT(9) - 1: 12131 case BIT(10) - 1: 12132 break; 12133 default: 12134 return false; 12135 } 12136 } 12137 12138 return true; 12139 } 12140 12141 static bool 12142 ath12k_mac_he_mcs_range_present(struct ath12k *ar, 12143 enum nl80211_band band, 12144 const struct cfg80211_bitrate_mask *mask) 12145 { 12146 int i; 12147 u16 he_mcs; 12148 12149 for (i = 0; i < NL80211_HE_NSS_MAX; i++) { 12150 he_mcs = mask->control[band].he_mcs[i]; 12151 12152 switch (he_mcs) { 12153 case 0: 12154 case BIT(8) - 1: 12155 case BIT(10) - 1: 12156 case BIT(12) - 1: 12157 break; 12158 default: 12159 return false; 12160 } 12161 } 12162 12163 return true; 12164 } 12165 12166 static void ath12k_mac_set_bitrate_mask_iter(void *data, 12167 struct ieee80211_sta *sta) 12168 { 12169 struct ath12k_link_vif *arvif = data; 12170 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta); 12171 struct ath12k_link_sta *arsta; 12172 struct ath12k *ar = arvif->ar; 12173 12174 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 12175 12176 arsta = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy, 12177 ahsta->link[arvif->link_id]); 12178 if (!arsta || arsta->arvif != arvif) 12179 return; 12180 12181 spin_lock_bh(&ar->data_lock); 12182 arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED; 12183 spin_unlock_bh(&ar->data_lock); 12184 12185 wiphy_work_queue(ath12k_ar_to_hw(ar)->wiphy, &arsta->update_wk); 12186 } 12187 12188 static void ath12k_mac_disable_peer_fixed_rate(void *data, 12189 struct ieee80211_sta *sta) 12190 { 12191 struct ath12k_link_vif *arvif = data; 12192 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta); 12193 struct ath12k_link_sta *arsta; 12194 struct ath12k *ar = arvif->ar; 12195 int ret; 12196 12197 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 12198 12199 arsta = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy, 12200 ahsta->link[arvif->link_id]); 12201 12202 if (!arsta || arsta->arvif != arvif) 12203 return; 12204 12205 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, 12206 arvif->vdev_id, 12207 WMI_PEER_PARAM_FIXED_RATE, 12208 WMI_FIXED_RATE_NONE); 12209 if (ret) 12210 ath12k_warn(ar->ab, 12211 "failed to disable peer fixed rate for STA %pM ret %d\n", 12212 arsta->addr, ret); 12213 } 12214 12215 static bool 12216 ath12k_mac_validate_fixed_rate_settings(struct ath12k *ar, enum nl80211_band band, 12217 const struct cfg80211_bitrate_mask *mask, 12218 unsigned int link_id) 12219 { 12220 bool he_fixed_rate = false, vht_fixed_rate = false; 12221 const u16 *vht_mcs_mask, *he_mcs_mask; 12222 struct ieee80211_link_sta *link_sta; 12223 struct ath12k_peer *peer, *tmp; 12224 u8 vht_nss, he_nss; 12225 int ret = true; 12226 12227 vht_mcs_mask = mask->control[band].vht_mcs; 12228 he_mcs_mask = mask->control[band].he_mcs; 12229 12230 if (ath12k_mac_bitrate_mask_num_vht_rates(ar, band, mask) == 1) 12231 vht_fixed_rate = true; 12232 12233 if (ath12k_mac_bitrate_mask_num_he_rates(ar, band, mask) == 1) 12234 he_fixed_rate = true; 12235 12236 if (!vht_fixed_rate && !he_fixed_rate) 12237 return true; 12238 12239 vht_nss = ath12k_mac_max_vht_nss(vht_mcs_mask); 12240 he_nss = ath12k_mac_max_he_nss(he_mcs_mask); 12241 12242 rcu_read_lock(); 12243 spin_lock_bh(&ar->ab->base_lock); 12244 list_for_each_entry_safe(peer, tmp, &ar->ab->peers, list) { 12245 if (peer->sta) { 12246 link_sta = rcu_dereference(peer->sta->link[link_id]); 12247 if (!link_sta) { 12248 ret = false; 12249 goto exit; 12250 } 12251 12252 if (vht_fixed_rate && (!link_sta->vht_cap.vht_supported || 12253 link_sta->rx_nss < vht_nss)) { 12254 ret = false; 12255 goto exit; 12256 } 12257 if (he_fixed_rate && (!link_sta->he_cap.has_he || 12258 link_sta->rx_nss < he_nss)) { 12259 ret = false; 12260 goto exit; 12261 } 12262 } 12263 } 12264 exit: 12265 spin_unlock_bh(&ar->ab->base_lock); 12266 rcu_read_unlock(); 12267 return ret; 12268 } 12269 12270 static int 12271 ath12k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw, 12272 struct ieee80211_vif *vif, 12273 const struct cfg80211_bitrate_mask *mask) 12274 { 12275 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 12276 struct ath12k_link_vif *arvif; 12277 struct cfg80211_chan_def def; 12278 struct ath12k *ar; 12279 enum nl80211_band band; 12280 const u8 *ht_mcs_mask; 12281 const u16 *vht_mcs_mask; 12282 const u16 *he_mcs_mask; 12283 u8 he_ltf = 0; 12284 u8 he_gi = 0; 12285 u32 rate; 12286 u8 nss, mac_nss; 12287 u8 sgi; 12288 u8 ldpc; 12289 int single_nss; 12290 int ret; 12291 int num_rates; 12292 bool he_fixed_rate = false; 12293 12294 lockdep_assert_wiphy(hw->wiphy); 12295 12296 arvif = &ahvif->deflink; 12297 12298 ar = arvif->ar; 12299 if (ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)) { 12300 ret = -EPERM; 12301 goto out; 12302 } 12303 12304 band = def.chan->band; 12305 ht_mcs_mask = mask->control[band].ht_mcs; 12306 vht_mcs_mask = mask->control[band].vht_mcs; 12307 he_mcs_mask = mask->control[band].he_mcs; 12308 ldpc = !!(ar->ht_cap_info & WMI_HT_CAP_LDPC); 12309 12310 sgi = mask->control[band].gi; 12311 if (sgi == NL80211_TXRATE_FORCE_SGI) { 12312 ret = -EINVAL; 12313 goto out; 12314 } 12315 12316 he_gi = mask->control[band].he_gi; 12317 he_ltf = mask->control[band].he_ltf; 12318 12319 /* mac80211 doesn't support sending a fixed HT/VHT MCS alone, rather it 12320 * requires passing at least one of used basic rates along with them. 12321 * Fixed rate setting across different preambles(legacy, HT, VHT) is 12322 * not supported by the FW. Hence use of FIXED_RATE vdev param is not 12323 * suitable for setting single HT/VHT rates. 12324 * But, there could be a single basic rate passed from userspace which 12325 * can be done through the FIXED_RATE param. 12326 */ 12327 if (ath12k_mac_has_single_legacy_rate(ar, band, mask)) { 12328 ret = ath12k_mac_get_single_legacy_rate(ar, band, mask, &rate, 12329 &nss); 12330 if (ret) { 12331 ath12k_warn(ar->ab, "failed to get single legacy rate for vdev %i: %d\n", 12332 arvif->vdev_id, ret); 12333 goto out; 12334 } 12335 12336 ieee80211_iterate_stations_mtx(hw, 12337 ath12k_mac_disable_peer_fixed_rate, 12338 arvif); 12339 } else if (ath12k_mac_bitrate_mask_get_single_nss(ar, vif, band, mask, 12340 &single_nss)) { 12341 rate = WMI_FIXED_RATE_NONE; 12342 nss = single_nss; 12343 arvif->bitrate_mask = *mask; 12344 12345 ieee80211_iterate_stations_atomic(hw, 12346 ath12k_mac_set_bitrate_mask_iter, 12347 arvif); 12348 } else { 12349 rate = WMI_FIXED_RATE_NONE; 12350 12351 if (!ath12k_mac_validate_fixed_rate_settings(ar, band, 12352 mask, arvif->link_id)) 12353 ath12k_warn(ar->ab, 12354 "failed to update fixed rate settings due to mcs/nss incompatibility\n"); 12355 12356 mac_nss = max3(ath12k_mac_max_ht_nss(ht_mcs_mask), 12357 ath12k_mac_max_vht_nss(vht_mcs_mask), 12358 ath12k_mac_max_he_nss(he_mcs_mask)); 12359 nss = min_t(u32, ar->num_tx_chains, mac_nss); 12360 12361 /* If multiple rates across different preambles are given 12362 * we can reconfigure this info with all peers using PEER_ASSOC 12363 * command with the below exception cases. 12364 * - Single VHT Rate : peer_assoc command accommodates only MCS 12365 * range values i.e 0-7, 0-8, 0-9 for VHT. Though mac80211 12366 * mandates passing basic rates along with HT/VHT rates, FW 12367 * doesn't allow switching from VHT to Legacy. Hence instead of 12368 * setting legacy and VHT rates using RATEMASK_CMD vdev cmd, 12369 * we could set this VHT rate as peer fixed rate param, which 12370 * will override FIXED rate and FW rate control algorithm. 12371 * If single VHT rate is passed along with HT rates, we select 12372 * the VHT rate as fixed rate for vht peers. 12373 * - Multiple VHT Rates : When Multiple VHT rates are given,this 12374 * can be set using RATEMASK CMD which uses FW rate-ctl alg. 12375 * TODO: Setting multiple VHT MCS and replacing peer_assoc with 12376 * RATEMASK_CMDID can cover all use cases of setting rates 12377 * across multiple preambles and rates within same type. 12378 * But requires more validation of the command at this point. 12379 */ 12380 12381 num_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band, 12382 mask); 12383 12384 if (!ath12k_mac_vht_mcs_range_present(ar, band, mask) && 12385 num_rates > 1) { 12386 /* TODO: Handle multiple VHT MCS values setting using 12387 * RATEMASK CMD 12388 */ 12389 ath12k_warn(ar->ab, 12390 "Setting more than one MCS Value in bitrate mask not supported\n"); 12391 ret = -EINVAL; 12392 goto out; 12393 } 12394 12395 num_rates = ath12k_mac_bitrate_mask_num_he_rates(ar, band, mask); 12396 if (num_rates == 1) 12397 he_fixed_rate = true; 12398 12399 if (!ath12k_mac_he_mcs_range_present(ar, band, mask) && 12400 num_rates > 1) { 12401 ath12k_warn(ar->ab, 12402 "Setting more than one HE MCS Value in bitrate mask not supported\n"); 12403 ret = -EINVAL; 12404 goto out; 12405 } 12406 ieee80211_iterate_stations_mtx(hw, 12407 ath12k_mac_disable_peer_fixed_rate, 12408 arvif); 12409 12410 arvif->bitrate_mask = *mask; 12411 ieee80211_iterate_stations_mtx(hw, 12412 ath12k_mac_set_bitrate_mask_iter, 12413 arvif); 12414 } 12415 12416 ret = ath12k_mac_set_rate_params(arvif, rate, nss, sgi, ldpc, he_gi, 12417 he_ltf, he_fixed_rate); 12418 if (ret) { 12419 ath12k_warn(ar->ab, "failed to set rate params on vdev %i: %d\n", 12420 arvif->vdev_id, ret); 12421 } 12422 12423 out: 12424 return ret; 12425 } 12426 12427 static void 12428 ath12k_mac_op_reconfig_complete(struct ieee80211_hw *hw, 12429 enum ieee80211_reconfig_type reconfig_type) 12430 { 12431 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 12432 struct ath12k *ar; 12433 struct ath12k_base *ab; 12434 struct ath12k_vif *ahvif; 12435 struct ath12k_link_vif *arvif; 12436 int recovery_count, i; 12437 12438 lockdep_assert_wiphy(hw->wiphy); 12439 12440 if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART) 12441 return; 12442 12443 guard(mutex)(&ah->hw_mutex); 12444 12445 if (ah->state != ATH12K_HW_STATE_RESTARTED) 12446 return; 12447 12448 ah->state = ATH12K_HW_STATE_ON; 12449 ieee80211_wake_queues(hw); 12450 12451 for_each_ar(ah, ar, i) { 12452 ab = ar->ab; 12453 12454 ath12k_warn(ar->ab, "pdev %d successfully recovered\n", 12455 ar->pdev->pdev_id); 12456 12457 if (ar->ab->hw_params->current_cc_support && 12458 ar->alpha2[0] != 0 && ar->alpha2[1] != 0) { 12459 struct wmi_set_current_country_arg arg = {}; 12460 12461 memcpy(&arg.alpha2, ar->alpha2, 2); 12462 reinit_completion(&ar->regd_update_completed); 12463 ath12k_wmi_send_set_current_country_cmd(ar, &arg); 12464 } 12465 12466 if (ab->is_reset) { 12467 recovery_count = atomic_inc_return(&ab->recovery_count); 12468 12469 ath12k_dbg(ab, ATH12K_DBG_BOOT, "recovery count %d\n", 12470 recovery_count); 12471 12472 /* When there are multiple radios in an SOC, 12473 * the recovery has to be done for each radio 12474 */ 12475 if (recovery_count == ab->num_radios) { 12476 atomic_dec(&ab->reset_count); 12477 complete(&ab->reset_complete); 12478 ab->is_reset = false; 12479 atomic_set(&ab->fail_cont_count, 0); 12480 ath12k_dbg(ab, ATH12K_DBG_BOOT, "reset success\n"); 12481 } 12482 } 12483 12484 list_for_each_entry(arvif, &ar->arvifs, list) { 12485 ahvif = arvif->ahvif; 12486 ath12k_dbg(ab, ATH12K_DBG_BOOT, 12487 "reconfig cipher %d up %d vdev type %d\n", 12488 ahvif->key_cipher, 12489 arvif->is_up, 12490 ahvif->vdev_type); 12491 12492 /* After trigger disconnect, then upper layer will 12493 * trigger connect again, then the PN number of 12494 * upper layer will be reset to keep up with AP 12495 * side, hence PN number mismatch will not happen. 12496 */ 12497 if (arvif->is_up && 12498 ahvif->vdev_type == WMI_VDEV_TYPE_STA && 12499 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) { 12500 ieee80211_hw_restart_disconnect(ahvif->vif); 12501 12502 ath12k_dbg(ab, ATH12K_DBG_BOOT, 12503 "restart disconnect\n"); 12504 } 12505 } 12506 } 12507 } 12508 12509 static void 12510 ath12k_mac_update_bss_chan_survey(struct ath12k *ar, 12511 struct ieee80211_channel *channel) 12512 { 12513 int ret; 12514 enum wmi_bss_chan_info_req_type type = WMI_BSS_SURVEY_REQ_TYPE_READ; 12515 12516 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 12517 12518 if (!test_bit(WMI_TLV_SERVICE_BSS_CHANNEL_INFO_64, ar->ab->wmi_ab.svc_map) || 12519 ar->rx_channel != channel) 12520 return; 12521 12522 if (ar->scan.state != ATH12K_SCAN_IDLE) { 12523 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 12524 "ignoring bss chan info req while scanning..\n"); 12525 return; 12526 } 12527 12528 reinit_completion(&ar->bss_survey_done); 12529 12530 ret = ath12k_wmi_pdev_bss_chan_info_request(ar, type); 12531 if (ret) { 12532 ath12k_warn(ar->ab, "failed to send pdev bss chan info request\n"); 12533 return; 12534 } 12535 12536 ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ); 12537 if (ret == 0) 12538 ath12k_warn(ar->ab, "bss channel survey timed out\n"); 12539 } 12540 12541 static int ath12k_mac_op_get_survey(struct ieee80211_hw *hw, int idx, 12542 struct survey_info *survey) 12543 { 12544 struct ath12k *ar; 12545 struct ieee80211_supported_band *sband; 12546 struct survey_info *ar_survey; 12547 12548 lockdep_assert_wiphy(hw->wiphy); 12549 12550 if (idx >= ATH12K_NUM_CHANS) 12551 return -ENOENT; 12552 12553 sband = hw->wiphy->bands[NL80211_BAND_2GHZ]; 12554 if (sband && idx >= sband->n_channels) { 12555 idx -= sband->n_channels; 12556 sband = NULL; 12557 } 12558 12559 if (!sband) 12560 sband = hw->wiphy->bands[NL80211_BAND_5GHZ]; 12561 if (sband && idx >= sband->n_channels) { 12562 idx -= sband->n_channels; 12563 sband = NULL; 12564 } 12565 12566 if (!sband) 12567 sband = hw->wiphy->bands[NL80211_BAND_6GHZ]; 12568 12569 if (!sband || idx >= sband->n_channels) 12570 return -ENOENT; 12571 12572 ar = ath12k_mac_get_ar_by_chan(hw, &sband->channels[idx]); 12573 if (!ar) { 12574 if (sband->channels[idx].flags & IEEE80211_CHAN_DISABLED) { 12575 memset(survey, 0, sizeof(*survey)); 12576 return 0; 12577 } 12578 return -ENOENT; 12579 } 12580 12581 ar_survey = &ar->survey[idx]; 12582 12583 ath12k_mac_update_bss_chan_survey(ar, &sband->channels[idx]); 12584 12585 spin_lock_bh(&ar->data_lock); 12586 memcpy(survey, ar_survey, sizeof(*survey)); 12587 spin_unlock_bh(&ar->data_lock); 12588 12589 survey->channel = &sband->channels[idx]; 12590 12591 if (ar->rx_channel == survey->channel) 12592 survey->filled |= SURVEY_INFO_IN_USE; 12593 12594 return 0; 12595 } 12596 12597 static void ath12k_mac_op_sta_statistics(struct ieee80211_hw *hw, 12598 struct ieee80211_vif *vif, 12599 struct ieee80211_sta *sta, 12600 struct station_info *sinfo) 12601 { 12602 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta); 12603 struct ath12k_fw_stats_req_params params = {}; 12604 struct ath12k_link_sta *arsta; 12605 s8 signal, noise_floor; 12606 struct ath12k *ar; 12607 bool db2dbm; 12608 12609 lockdep_assert_wiphy(hw->wiphy); 12610 12611 arsta = &ahsta->deflink; 12612 ar = ath12k_get_ar_by_vif(hw, vif, arsta->link_id); 12613 if (!ar) 12614 return; 12615 12616 db2dbm = test_bit(WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT, 12617 ar->ab->wmi_ab.svc_map); 12618 12619 sinfo->rx_duration = arsta->rx_duration; 12620 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION); 12621 12622 sinfo->tx_duration = arsta->tx_duration; 12623 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION); 12624 12625 if (arsta->txrate.legacy || arsta->txrate.nss) { 12626 if (arsta->txrate.legacy) { 12627 sinfo->txrate.legacy = arsta->txrate.legacy; 12628 } else { 12629 sinfo->txrate.mcs = arsta->txrate.mcs; 12630 sinfo->txrate.nss = arsta->txrate.nss; 12631 sinfo->txrate.bw = arsta->txrate.bw; 12632 sinfo->txrate.he_gi = arsta->txrate.he_gi; 12633 sinfo->txrate.he_dcm = arsta->txrate.he_dcm; 12634 sinfo->txrate.he_ru_alloc = arsta->txrate.he_ru_alloc; 12635 sinfo->txrate.eht_gi = arsta->txrate.eht_gi; 12636 sinfo->txrate.eht_ru_alloc = arsta->txrate.eht_ru_alloc; 12637 } 12638 sinfo->txrate.flags = arsta->txrate.flags; 12639 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE); 12640 } 12641 12642 /* TODO: Use real NF instead of default one. */ 12643 signal = arsta->rssi_comb; 12644 12645 params.pdev_id = ar->pdev->pdev_id; 12646 params.vdev_id = 0; 12647 params.stats_id = WMI_REQUEST_VDEV_STAT; 12648 12649 if (!signal && 12650 ahsta->ahvif->vdev_type == WMI_VDEV_TYPE_STA && 12651 !(ath12k_mac_get_fw_stats(ar, ¶ms))) 12652 signal = arsta->rssi_beacon; 12653 12654 spin_lock_bh(&ar->data_lock); 12655 noise_floor = ath12k_pdev_get_noise_floor(ar); 12656 spin_unlock_bh(&ar->data_lock); 12657 12658 if (signal) { 12659 sinfo->signal = db2dbm ? signal : signal + noise_floor; 12660 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL); 12661 } 12662 12663 sinfo->signal_avg = ewma_avg_rssi_read(&arsta->avg_rssi); 12664 12665 if (!db2dbm) 12666 sinfo->signal_avg += noise_floor; 12667 12668 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG); 12669 12670 sinfo->tx_retries = arsta->tx_retry_count; 12671 sinfo->tx_failed = arsta->tx_retry_failed; 12672 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES); 12673 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED); 12674 } 12675 12676 static void ath12k_mac_op_link_sta_statistics(struct ieee80211_hw *hw, 12677 struct ieee80211_vif *vif, 12678 struct ieee80211_link_sta *link_sta, 12679 struct link_station_info *link_sinfo) 12680 { 12681 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(link_sta->sta); 12682 struct ath12k_fw_stats_req_params params = {}; 12683 struct ath12k_link_sta *arsta; 12684 struct ath12k *ar; 12685 s8 signal; 12686 bool db2dbm; 12687 12688 lockdep_assert_wiphy(hw->wiphy); 12689 12690 arsta = wiphy_dereference(hw->wiphy, ahsta->link[link_sta->link_id]); 12691 12692 if (!arsta) 12693 return; 12694 12695 ar = ath12k_get_ar_by_vif(hw, vif, arsta->link_id); 12696 if (!ar) 12697 return; 12698 12699 db2dbm = test_bit(WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT, 12700 ar->ab->wmi_ab.svc_map); 12701 12702 link_sinfo->rx_duration = arsta->rx_duration; 12703 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION); 12704 12705 link_sinfo->tx_duration = arsta->tx_duration; 12706 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION); 12707 12708 if (arsta->txrate.legacy || arsta->txrate.nss) { 12709 if (arsta->txrate.legacy) { 12710 link_sinfo->txrate.legacy = arsta->txrate.legacy; 12711 } else { 12712 link_sinfo->txrate.mcs = arsta->txrate.mcs; 12713 link_sinfo->txrate.nss = arsta->txrate.nss; 12714 link_sinfo->txrate.bw = arsta->txrate.bw; 12715 link_sinfo->txrate.he_gi = arsta->txrate.he_gi; 12716 link_sinfo->txrate.he_dcm = arsta->txrate.he_dcm; 12717 link_sinfo->txrate.he_ru_alloc = 12718 arsta->txrate.he_ru_alloc; 12719 link_sinfo->txrate.eht_gi = arsta->txrate.eht_gi; 12720 link_sinfo->txrate.eht_ru_alloc = 12721 arsta->txrate.eht_ru_alloc; 12722 } 12723 link_sinfo->txrate.flags = arsta->txrate.flags; 12724 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE); 12725 } 12726 12727 /* TODO: Use real NF instead of default one. */ 12728 signal = arsta->rssi_comb; 12729 12730 params.pdev_id = ar->pdev->pdev_id; 12731 params.vdev_id = 0; 12732 params.stats_id = WMI_REQUEST_VDEV_STAT; 12733 12734 if (!signal && 12735 ahsta->ahvif->vdev_type == WMI_VDEV_TYPE_STA && 12736 !(ath12k_mac_get_fw_stats(ar, ¶ms))) 12737 signal = arsta->rssi_beacon; 12738 12739 if (signal) { 12740 link_sinfo->signal = 12741 db2dbm ? signal : signal + ATH12K_DEFAULT_NOISE_FLOOR; 12742 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL); 12743 } 12744 12745 link_sinfo->signal_avg = ewma_avg_rssi_read(&arsta->avg_rssi); 12746 12747 if (!db2dbm) 12748 link_sinfo->signal_avg += ATH12K_DEFAULT_NOISE_FLOOR; 12749 12750 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG); 12751 12752 link_sinfo->tx_retries = arsta->tx_retry_count; 12753 link_sinfo->tx_failed = arsta->tx_retry_failed; 12754 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES); 12755 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED); 12756 } 12757 12758 static int ath12k_mac_op_cancel_remain_on_channel(struct ieee80211_hw *hw, 12759 struct ieee80211_vif *vif) 12760 { 12761 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 12762 struct ath12k *ar; 12763 12764 ar = ath12k_ah_to_ar(ah, 0); 12765 12766 lockdep_assert_wiphy(hw->wiphy); 12767 12768 spin_lock_bh(&ar->data_lock); 12769 ar->scan.roc_notify = false; 12770 spin_unlock_bh(&ar->data_lock); 12771 12772 ath12k_scan_abort(ar); 12773 12774 cancel_delayed_work_sync(&ar->scan.timeout); 12775 wiphy_work_cancel(hw->wiphy, &ar->scan.vdev_clean_wk); 12776 12777 return 0; 12778 } 12779 12780 static int ath12k_mac_op_remain_on_channel(struct ieee80211_hw *hw, 12781 struct ieee80211_vif *vif, 12782 struct ieee80211_channel *chan, 12783 int duration, 12784 enum ieee80211_roc_type type) 12785 { 12786 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 12787 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 12788 struct ath12k_link_vif *arvif; 12789 struct ath12k *ar; 12790 u32 scan_time_msec; 12791 bool create = true; 12792 u8 link_id; 12793 int ret; 12794 12795 lockdep_assert_wiphy(hw->wiphy); 12796 12797 ar = ath12k_mac_select_scan_device(hw, vif, chan->center_freq); 12798 if (!ar) 12799 return -EINVAL; 12800 12801 /* check if any of the links of ML VIF is already started on 12802 * radio(ar) corresponding to given scan frequency and use it, 12803 * if not use deflink(link 0) for scan purpose. 12804 */ 12805 12806 link_id = ath12k_mac_find_link_id_by_ar(ahvif, ar); 12807 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id); 12808 /* If the vif is already assigned to a specific vdev of an ar, 12809 * check whether its already started, vdev which is started 12810 * are not allowed to switch to a new radio. 12811 * If the vdev is not started, but was earlier created on a 12812 * different ar, delete that vdev and create a new one. We don't 12813 * delete at the scan stop as an optimization to avoid redundant 12814 * delete-create vdev's for the same ar, in case the request is 12815 * always on the same band for the vif 12816 */ 12817 if (arvif->is_created) { 12818 if (WARN_ON(!arvif->ar)) 12819 return -EINVAL; 12820 12821 if (ar != arvif->ar && arvif->is_started) 12822 return -EBUSY; 12823 12824 if (ar != arvif->ar) { 12825 ath12k_mac_remove_link_interface(hw, arvif); 12826 ath12k_mac_unassign_link_vif(arvif); 12827 } else { 12828 create = false; 12829 } 12830 } 12831 12832 if (create) { 12833 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id); 12834 12835 ret = ath12k_mac_vdev_create(ar, arvif); 12836 if (ret) { 12837 ath12k_warn(ar->ab, "unable to create scan vdev for roc: %d\n", 12838 ret); 12839 return ret; 12840 } 12841 } 12842 12843 spin_lock_bh(&ar->data_lock); 12844 12845 switch (ar->scan.state) { 12846 case ATH12K_SCAN_IDLE: 12847 reinit_completion(&ar->scan.started); 12848 reinit_completion(&ar->scan.completed); 12849 reinit_completion(&ar->scan.on_channel); 12850 ar->scan.state = ATH12K_SCAN_STARTING; 12851 ar->scan.is_roc = true; 12852 ar->scan.arvif = arvif; 12853 ar->scan.roc_freq = chan->center_freq; 12854 ar->scan.roc_notify = true; 12855 ret = 0; 12856 break; 12857 case ATH12K_SCAN_STARTING: 12858 case ATH12K_SCAN_RUNNING: 12859 case ATH12K_SCAN_ABORTING: 12860 ret = -EBUSY; 12861 break; 12862 } 12863 12864 spin_unlock_bh(&ar->data_lock); 12865 12866 if (ret) 12867 return ret; 12868 12869 scan_time_msec = hw->wiphy->max_remain_on_channel_duration * 2; 12870 12871 struct ath12k_wmi_scan_req_arg *arg __free(kfree) = 12872 kzalloc(sizeof(*arg), GFP_KERNEL); 12873 if (!arg) 12874 return -ENOMEM; 12875 12876 ath12k_wmi_start_scan_init(ar, arg); 12877 arg->num_chan = 1; 12878 12879 u32 *chan_list __free(kfree) = kcalloc(arg->num_chan, sizeof(*chan_list), 12880 GFP_KERNEL); 12881 if (!chan_list) 12882 return -ENOMEM; 12883 12884 arg->chan_list = chan_list; 12885 arg->vdev_id = arvif->vdev_id; 12886 arg->scan_id = ATH12K_SCAN_ID; 12887 arg->chan_list[0] = chan->center_freq; 12888 arg->dwell_time_active = scan_time_msec; 12889 arg->dwell_time_passive = scan_time_msec; 12890 arg->max_scan_time = scan_time_msec; 12891 arg->scan_f_passive = 1; 12892 arg->burst_duration = duration; 12893 12894 ret = ath12k_start_scan(ar, arg); 12895 if (ret) { 12896 ath12k_warn(ar->ab, "failed to start roc scan: %d\n", ret); 12897 12898 spin_lock_bh(&ar->data_lock); 12899 ar->scan.state = ATH12K_SCAN_IDLE; 12900 spin_unlock_bh(&ar->data_lock); 12901 return ret; 12902 } 12903 12904 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3 * HZ); 12905 if (ret == 0) { 12906 ath12k_warn(ar->ab, "failed to switch to channel for roc scan\n"); 12907 ret = ath12k_scan_stop(ar); 12908 if (ret) 12909 ath12k_warn(ar->ab, "failed to stop scan: %d\n", ret); 12910 return -ETIMEDOUT; 12911 } 12912 12913 ieee80211_queue_delayed_work(hw, &ar->scan.timeout, 12914 msecs_to_jiffies(duration)); 12915 12916 return 0; 12917 } 12918 12919 static void ath12k_mac_op_set_rekey_data(struct ieee80211_hw *hw, 12920 struct ieee80211_vif *vif, 12921 struct cfg80211_gtk_rekey_data *data) 12922 { 12923 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 12924 struct ath12k_rekey_data *rekey_data; 12925 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 12926 struct ath12k *ar = ath12k_ah_to_ar(ah, 0); 12927 struct ath12k_link_vif *arvif; 12928 12929 lockdep_assert_wiphy(hw->wiphy); 12930 12931 arvif = &ahvif->deflink; 12932 rekey_data = &arvif->rekey_data; 12933 12934 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac set rekey data vdev %d\n", 12935 arvif->vdev_id); 12936 12937 memcpy(rekey_data->kck, data->kck, NL80211_KCK_LEN); 12938 memcpy(rekey_data->kek, data->kek, NL80211_KEK_LEN); 12939 12940 /* The supplicant works on big-endian, the firmware expects it on 12941 * little endian. 12942 */ 12943 rekey_data->replay_ctr = get_unaligned_be64(data->replay_ctr); 12944 12945 arvif->rekey_data.enable_offload = true; 12946 12947 ath12k_dbg_dump(ar->ab, ATH12K_DBG_MAC, "kck", NULL, 12948 rekey_data->kck, NL80211_KCK_LEN); 12949 ath12k_dbg_dump(ar->ab, ATH12K_DBG_MAC, "kek", NULL, 12950 rekey_data->kck, NL80211_KEK_LEN); 12951 ath12k_dbg_dump(ar->ab, ATH12K_DBG_MAC, "replay ctr", NULL, 12952 &rekey_data->replay_ctr, sizeof(rekey_data->replay_ctr)); 12953 } 12954 12955 static const struct ieee80211_ops ath12k_ops = { 12956 .tx = ath12k_mac_op_tx, 12957 .wake_tx_queue = ieee80211_handle_wake_tx_queue, 12958 .start = ath12k_mac_op_start, 12959 .stop = ath12k_mac_op_stop, 12960 .reconfig_complete = ath12k_mac_op_reconfig_complete, 12961 .add_interface = ath12k_mac_op_add_interface, 12962 .remove_interface = ath12k_mac_op_remove_interface, 12963 .update_vif_offload = ath12k_mac_op_update_vif_offload, 12964 .config = ath12k_mac_op_config, 12965 .link_info_changed = ath12k_mac_op_link_info_changed, 12966 .vif_cfg_changed = ath12k_mac_op_vif_cfg_changed, 12967 .change_vif_links = ath12k_mac_op_change_vif_links, 12968 .configure_filter = ath12k_mac_op_configure_filter, 12969 .hw_scan = ath12k_mac_op_hw_scan, 12970 .cancel_hw_scan = ath12k_mac_op_cancel_hw_scan, 12971 .set_key = ath12k_mac_op_set_key, 12972 .set_rekey_data = ath12k_mac_op_set_rekey_data, 12973 .sta_state = ath12k_mac_op_sta_state, 12974 .sta_set_txpwr = ath12k_mac_op_sta_set_txpwr, 12975 .link_sta_rc_update = ath12k_mac_op_link_sta_rc_update, 12976 .conf_tx = ath12k_mac_op_conf_tx, 12977 .set_antenna = ath12k_mac_op_set_antenna, 12978 .get_antenna = ath12k_mac_op_get_antenna, 12979 .ampdu_action = ath12k_mac_op_ampdu_action, 12980 .add_chanctx = ath12k_mac_op_add_chanctx, 12981 .remove_chanctx = ath12k_mac_op_remove_chanctx, 12982 .change_chanctx = ath12k_mac_op_change_chanctx, 12983 .assign_vif_chanctx = ath12k_mac_op_assign_vif_chanctx, 12984 .unassign_vif_chanctx = ath12k_mac_op_unassign_vif_chanctx, 12985 .switch_vif_chanctx = ath12k_mac_op_switch_vif_chanctx, 12986 .get_txpower = ath12k_mac_op_get_txpower, 12987 .set_rts_threshold = ath12k_mac_op_set_rts_threshold, 12988 .set_frag_threshold = ath12k_mac_op_set_frag_threshold, 12989 .set_bitrate_mask = ath12k_mac_op_set_bitrate_mask, 12990 .get_survey = ath12k_mac_op_get_survey, 12991 .flush = ath12k_mac_op_flush, 12992 .sta_statistics = ath12k_mac_op_sta_statistics, 12993 .link_sta_statistics = ath12k_mac_op_link_sta_statistics, 12994 .remain_on_channel = ath12k_mac_op_remain_on_channel, 12995 .cancel_remain_on_channel = ath12k_mac_op_cancel_remain_on_channel, 12996 .change_sta_links = ath12k_mac_op_change_sta_links, 12997 .can_activate_links = ath12k_mac_op_can_activate_links, 12998 #ifdef CONFIG_PM 12999 .suspend = ath12k_wow_op_suspend, 13000 .resume = ath12k_wow_op_resume, 13001 .set_wakeup = ath12k_wow_op_set_wakeup, 13002 #endif 13003 #ifdef CONFIG_ATH12K_DEBUGFS 13004 .vif_add_debugfs = ath12k_debugfs_op_vif_add, 13005 #endif 13006 CFG80211_TESTMODE_CMD(ath12k_tm_cmd) 13007 #ifdef CONFIG_ATH12K_DEBUGFS 13008 .link_sta_add_debugfs = ath12k_debugfs_link_sta_op_add, 13009 #endif 13010 }; 13011 13012 void ath12k_mac_update_freq_range(struct ath12k *ar, 13013 u32 freq_low, u32 freq_high) 13014 { 13015 if (!(freq_low && freq_high)) 13016 return; 13017 13018 if (ar->freq_range.start_freq || ar->freq_range.end_freq) { 13019 ar->freq_range.start_freq = min(ar->freq_range.start_freq, 13020 MHZ_TO_KHZ(freq_low)); 13021 ar->freq_range.end_freq = max(ar->freq_range.end_freq, 13022 MHZ_TO_KHZ(freq_high)); 13023 } else { 13024 ar->freq_range.start_freq = MHZ_TO_KHZ(freq_low); 13025 ar->freq_range.end_freq = MHZ_TO_KHZ(freq_high); 13026 } 13027 13028 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 13029 "mac pdev %u freq limit updated. New range %u->%u MHz\n", 13030 ar->pdev->pdev_id, KHZ_TO_MHZ(ar->freq_range.start_freq), 13031 KHZ_TO_MHZ(ar->freq_range.end_freq)); 13032 } 13033 13034 static void ath12k_mac_update_ch_list(struct ath12k *ar, 13035 struct ieee80211_supported_band *band, 13036 u32 freq_low, u32 freq_high) 13037 { 13038 int i; 13039 13040 if (!(freq_low && freq_high)) 13041 return; 13042 13043 for (i = 0; i < band->n_channels; i++) { 13044 if (band->channels[i].center_freq < freq_low || 13045 band->channels[i].center_freq > freq_high) 13046 band->channels[i].flags |= IEEE80211_CHAN_DISABLED; 13047 } 13048 } 13049 13050 static u32 ath12k_get_phy_id(struct ath12k *ar, u32 band) 13051 { 13052 struct ath12k_pdev *pdev = ar->pdev; 13053 struct ath12k_pdev_cap *pdev_cap = &pdev->cap; 13054 13055 if (band == WMI_HOST_WLAN_2GHZ_CAP) 13056 return pdev_cap->band[NL80211_BAND_2GHZ].phy_id; 13057 13058 if (band == WMI_HOST_WLAN_5GHZ_CAP) 13059 return pdev_cap->band[NL80211_BAND_5GHZ].phy_id; 13060 13061 ath12k_warn(ar->ab, "unsupported phy cap:%d\n", band); 13062 13063 return 0; 13064 } 13065 13066 static int ath12k_mac_update_band(struct ath12k *ar, 13067 struct ieee80211_supported_band *orig_band, 13068 struct ieee80211_supported_band *new_band) 13069 { 13070 int i; 13071 13072 if (!orig_band || !new_band) 13073 return -EINVAL; 13074 13075 if (orig_band->band != new_band->band) 13076 return -EINVAL; 13077 13078 for (i = 0; i < new_band->n_channels; i++) { 13079 if (new_band->channels[i].flags & IEEE80211_CHAN_DISABLED) 13080 continue; 13081 /* An enabled channel in new_band should not be already enabled 13082 * in the orig_band 13083 */ 13084 if (WARN_ON(!(orig_band->channels[i].flags & 13085 IEEE80211_CHAN_DISABLED))) 13086 return -EINVAL; 13087 orig_band->channels[i].flags &= ~IEEE80211_CHAN_DISABLED; 13088 } 13089 return 0; 13090 } 13091 13092 static int ath12k_mac_setup_channels_rates(struct ath12k *ar, 13093 u32 supported_bands, 13094 struct ieee80211_supported_band *bands[]) 13095 { 13096 struct ieee80211_supported_band *band; 13097 struct ath12k_wmi_hal_reg_capabilities_ext_arg *reg_cap; 13098 struct ath12k_base *ab = ar->ab; 13099 u32 phy_id, freq_low, freq_high; 13100 struct ath12k_hw *ah = ar->ah; 13101 void *channels; 13102 int ret; 13103 13104 BUILD_BUG_ON((ARRAY_SIZE(ath12k_2ghz_channels) + 13105 ARRAY_SIZE(ath12k_5ghz_channels) + 13106 ARRAY_SIZE(ath12k_6ghz_channels)) != 13107 ATH12K_NUM_CHANS); 13108 13109 reg_cap = &ab->hal_reg_cap[ar->pdev_idx]; 13110 13111 if (supported_bands & WMI_HOST_WLAN_2GHZ_CAP) { 13112 channels = kmemdup(ath12k_2ghz_channels, 13113 sizeof(ath12k_2ghz_channels), 13114 GFP_KERNEL); 13115 if (!channels) 13116 return -ENOMEM; 13117 13118 band = &ar->mac.sbands[NL80211_BAND_2GHZ]; 13119 band->band = NL80211_BAND_2GHZ; 13120 band->n_channels = ARRAY_SIZE(ath12k_2ghz_channels); 13121 band->channels = channels; 13122 band->n_bitrates = ath12k_g_rates_size; 13123 band->bitrates = ath12k_g_rates; 13124 13125 if (ab->hw_params->single_pdev_only) { 13126 phy_id = ath12k_get_phy_id(ar, WMI_HOST_WLAN_2GHZ_CAP); 13127 reg_cap = &ab->hal_reg_cap[phy_id]; 13128 } 13129 13130 freq_low = max(reg_cap->low_2ghz_chan, 13131 ab->reg_freq_2ghz.start_freq); 13132 freq_high = min(reg_cap->high_2ghz_chan, 13133 ab->reg_freq_2ghz.end_freq); 13134 13135 ath12k_mac_update_ch_list(ar, band, 13136 reg_cap->low_2ghz_chan, 13137 reg_cap->high_2ghz_chan); 13138 13139 ath12k_mac_update_freq_range(ar, freq_low, freq_high); 13140 13141 if (!bands[NL80211_BAND_2GHZ]) { 13142 bands[NL80211_BAND_2GHZ] = band; 13143 } else { 13144 /* Split mac in same band under same wiphy */ 13145 ret = ath12k_mac_update_band(ar, bands[NL80211_BAND_2GHZ], band); 13146 if (ret) { 13147 kfree(channels); 13148 band->channels = NULL; 13149 return ret; 13150 } 13151 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac pdev %u identified as 2 GHz split mac with start freq %d end freq %d", 13152 ar->pdev->pdev_id, 13153 KHZ_TO_MHZ(ar->freq_range.start_freq), 13154 KHZ_TO_MHZ(ar->freq_range.end_freq)); 13155 } 13156 } 13157 13158 if (supported_bands & WMI_HOST_WLAN_5GHZ_CAP) { 13159 if (reg_cap->high_5ghz_chan >= ATH12K_MIN_6GHZ_FREQ) { 13160 channels = kmemdup(ath12k_6ghz_channels, 13161 sizeof(ath12k_6ghz_channels), GFP_KERNEL); 13162 if (!channels) { 13163 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); 13164 return -ENOMEM; 13165 } 13166 13167 ar->supports_6ghz = true; 13168 band = &ar->mac.sbands[NL80211_BAND_6GHZ]; 13169 band->band = NL80211_BAND_6GHZ; 13170 band->n_channels = ARRAY_SIZE(ath12k_6ghz_channels); 13171 band->channels = channels; 13172 band->n_bitrates = ath12k_a_rates_size; 13173 band->bitrates = ath12k_a_rates; 13174 13175 freq_low = max(reg_cap->low_5ghz_chan, 13176 ab->reg_freq_6ghz.start_freq); 13177 freq_high = min(reg_cap->high_5ghz_chan, 13178 ab->reg_freq_6ghz.end_freq); 13179 13180 ath12k_mac_update_ch_list(ar, band, 13181 reg_cap->low_5ghz_chan, 13182 reg_cap->high_5ghz_chan); 13183 13184 ath12k_mac_update_freq_range(ar, freq_low, freq_high); 13185 ah->use_6ghz_regd = true; 13186 13187 if (!bands[NL80211_BAND_6GHZ]) { 13188 bands[NL80211_BAND_6GHZ] = band; 13189 } else { 13190 /* Split mac in same band under same wiphy */ 13191 ret = ath12k_mac_update_band(ar, 13192 bands[NL80211_BAND_6GHZ], 13193 band); 13194 if (ret) { 13195 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); 13196 ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL; 13197 kfree(channels); 13198 band->channels = NULL; 13199 return ret; 13200 } 13201 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac pdev %u identified as 6 GHz split mac with start freq %d end freq %d", 13202 ar->pdev->pdev_id, 13203 KHZ_TO_MHZ(ar->freq_range.start_freq), 13204 KHZ_TO_MHZ(ar->freq_range.end_freq)); 13205 } 13206 } 13207 13208 if (reg_cap->low_5ghz_chan < ATH12K_MIN_6GHZ_FREQ) { 13209 channels = kmemdup(ath12k_5ghz_channels, 13210 sizeof(ath12k_5ghz_channels), 13211 GFP_KERNEL); 13212 if (!channels) { 13213 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); 13214 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels); 13215 return -ENOMEM; 13216 } 13217 13218 band = &ar->mac.sbands[NL80211_BAND_5GHZ]; 13219 band->band = NL80211_BAND_5GHZ; 13220 band->n_channels = ARRAY_SIZE(ath12k_5ghz_channels); 13221 band->channels = channels; 13222 band->n_bitrates = ath12k_a_rates_size; 13223 band->bitrates = ath12k_a_rates; 13224 13225 if (ab->hw_params->single_pdev_only) { 13226 phy_id = ath12k_get_phy_id(ar, WMI_HOST_WLAN_5GHZ_CAP); 13227 reg_cap = &ab->hal_reg_cap[phy_id]; 13228 } 13229 13230 freq_low = max(reg_cap->low_5ghz_chan, 13231 ab->reg_freq_5ghz.start_freq); 13232 freq_high = min(reg_cap->high_5ghz_chan, 13233 ab->reg_freq_5ghz.end_freq); 13234 13235 ath12k_mac_update_ch_list(ar, band, 13236 reg_cap->low_5ghz_chan, 13237 reg_cap->high_5ghz_chan); 13238 13239 ath12k_mac_update_freq_range(ar, freq_low, freq_high); 13240 13241 if (!bands[NL80211_BAND_5GHZ]) { 13242 bands[NL80211_BAND_5GHZ] = band; 13243 } else { 13244 /* Split mac in same band under same wiphy */ 13245 ret = ath12k_mac_update_band(ar, 13246 bands[NL80211_BAND_5GHZ], 13247 band); 13248 if (ret) { 13249 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); 13250 ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL; 13251 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels); 13252 ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL; 13253 kfree(channels); 13254 band->channels = NULL; 13255 return ret; 13256 } 13257 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac pdev %u identified as 5 GHz split mac with start freq %d end freq %d", 13258 ar->pdev->pdev_id, 13259 KHZ_TO_MHZ(ar->freq_range.start_freq), 13260 KHZ_TO_MHZ(ar->freq_range.end_freq)); 13261 } 13262 } 13263 } 13264 13265 return 0; 13266 } 13267 13268 static u16 ath12k_mac_get_ifmodes(struct ath12k_hw *ah) 13269 { 13270 struct ath12k *ar; 13271 int i; 13272 u16 interface_modes = U16_MAX; 13273 13274 for_each_ar(ah, ar, i) 13275 interface_modes &= ar->ab->hw_params->interface_modes; 13276 13277 return interface_modes == U16_MAX ? 0 : interface_modes; 13278 } 13279 13280 static bool ath12k_mac_is_iface_mode_enable(struct ath12k_hw *ah, 13281 enum nl80211_iftype type) 13282 { 13283 struct ath12k *ar; 13284 int i; 13285 u16 interface_modes, mode = 0; 13286 bool is_enable = false; 13287 13288 if (type == NL80211_IFTYPE_MESH_POINT) { 13289 if (IS_ENABLED(CONFIG_MAC80211_MESH)) 13290 mode = BIT(type); 13291 } else { 13292 mode = BIT(type); 13293 } 13294 13295 for_each_ar(ah, ar, i) { 13296 interface_modes = ar->ab->hw_params->interface_modes; 13297 if (interface_modes & mode) { 13298 is_enable = true; 13299 break; 13300 } 13301 } 13302 13303 return is_enable; 13304 } 13305 13306 static int 13307 ath12k_mac_setup_radio_iface_comb(struct ath12k *ar, 13308 struct ieee80211_iface_combination *comb) 13309 { 13310 u16 interface_modes = ar->ab->hw_params->interface_modes; 13311 struct ieee80211_iface_limit *limits; 13312 int n_limits, max_interfaces; 13313 bool ap, mesh, p2p; 13314 13315 ap = interface_modes & BIT(NL80211_IFTYPE_AP); 13316 p2p = interface_modes & BIT(NL80211_IFTYPE_P2P_DEVICE); 13317 13318 mesh = IS_ENABLED(CONFIG_MAC80211_MESH) && 13319 (interface_modes & BIT(NL80211_IFTYPE_MESH_POINT)); 13320 13321 if ((ap || mesh) && !p2p) { 13322 n_limits = 2; 13323 max_interfaces = 16; 13324 } else if (p2p) { 13325 n_limits = 3; 13326 if (ap || mesh) 13327 max_interfaces = 16; 13328 else 13329 max_interfaces = 3; 13330 } else { 13331 n_limits = 1; 13332 max_interfaces = 1; 13333 } 13334 13335 limits = kcalloc(n_limits, sizeof(*limits), GFP_KERNEL); 13336 if (!limits) 13337 return -ENOMEM; 13338 13339 limits[0].max = 1; 13340 limits[0].types |= BIT(NL80211_IFTYPE_STATION); 13341 13342 if (ap || mesh || p2p) 13343 limits[1].max = max_interfaces; 13344 13345 if (ap) 13346 limits[1].types |= BIT(NL80211_IFTYPE_AP); 13347 13348 if (mesh) 13349 limits[1].types |= BIT(NL80211_IFTYPE_MESH_POINT); 13350 13351 if (p2p) { 13352 limits[1].types |= BIT(NL80211_IFTYPE_P2P_CLIENT) | 13353 BIT(NL80211_IFTYPE_P2P_GO); 13354 limits[2].max = 1; 13355 limits[2].types |= BIT(NL80211_IFTYPE_P2P_DEVICE); 13356 } 13357 13358 comb[0].limits = limits; 13359 comb[0].n_limits = n_limits; 13360 comb[0].max_interfaces = max_interfaces; 13361 comb[0].beacon_int_infra_match = true; 13362 comb[0].beacon_int_min_gcd = 100; 13363 13364 if (ar->ab->hw_params->single_pdev_only) { 13365 comb[0].num_different_channels = 2; 13366 } else { 13367 comb[0].num_different_channels = 1; 13368 comb[0].radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) | 13369 BIT(NL80211_CHAN_WIDTH_20) | 13370 BIT(NL80211_CHAN_WIDTH_40) | 13371 BIT(NL80211_CHAN_WIDTH_80) | 13372 BIT(NL80211_CHAN_WIDTH_160); 13373 } 13374 13375 return 0; 13376 } 13377 13378 static int 13379 ath12k_mac_setup_global_iface_comb(struct ath12k_hw *ah, 13380 struct wiphy_radio *radio, 13381 u8 n_radio, 13382 struct ieee80211_iface_combination *comb) 13383 { 13384 const struct ieee80211_iface_combination *iter_comb; 13385 struct ieee80211_iface_limit *limits; 13386 int i, j, n_limits; 13387 bool ap, mesh, p2p; 13388 13389 if (!n_radio) 13390 return 0; 13391 13392 ap = ath12k_mac_is_iface_mode_enable(ah, NL80211_IFTYPE_AP); 13393 p2p = ath12k_mac_is_iface_mode_enable(ah, NL80211_IFTYPE_P2P_DEVICE); 13394 mesh = ath12k_mac_is_iface_mode_enable(ah, NL80211_IFTYPE_MESH_POINT); 13395 13396 if ((ap || mesh) && !p2p) 13397 n_limits = 2; 13398 else if (p2p) 13399 n_limits = 3; 13400 else 13401 n_limits = 1; 13402 13403 limits = kcalloc(n_limits, sizeof(*limits), GFP_KERNEL); 13404 if (!limits) 13405 return -ENOMEM; 13406 13407 for (i = 0; i < n_radio; i++) { 13408 iter_comb = radio[i].iface_combinations; 13409 for (j = 0; j < iter_comb->n_limits && j < n_limits; j++) { 13410 limits[j].types |= iter_comb->limits[j].types; 13411 limits[j].max += iter_comb->limits[j].max; 13412 } 13413 13414 comb->max_interfaces += iter_comb->max_interfaces; 13415 comb->num_different_channels += iter_comb->num_different_channels; 13416 comb->radar_detect_widths |= iter_comb->radar_detect_widths; 13417 } 13418 13419 comb->limits = limits; 13420 comb->n_limits = n_limits; 13421 comb->beacon_int_infra_match = true; 13422 comb->beacon_int_min_gcd = 100; 13423 13424 return 0; 13425 } 13426 13427 static 13428 void ath12k_mac_cleanup_iface_comb(const struct ieee80211_iface_combination *iface_comb) 13429 { 13430 kfree(iface_comb[0].limits); 13431 kfree(iface_comb); 13432 } 13433 13434 static void ath12k_mac_cleanup_iface_combinations(struct ath12k_hw *ah) 13435 { 13436 struct wiphy *wiphy = ah->hw->wiphy; 13437 const struct wiphy_radio *radio; 13438 int i; 13439 13440 if (wiphy->n_radio > 0) { 13441 radio = wiphy->radio; 13442 for (i = 0; i < wiphy->n_radio; i++) 13443 ath12k_mac_cleanup_iface_comb(radio[i].iface_combinations); 13444 13445 kfree(wiphy->radio); 13446 } 13447 13448 ath12k_mac_cleanup_iface_comb(wiphy->iface_combinations); 13449 } 13450 13451 static int ath12k_mac_setup_iface_combinations(struct ath12k_hw *ah) 13452 { 13453 struct ieee80211_iface_combination *combinations, *comb; 13454 struct wiphy *wiphy = ah->hw->wiphy; 13455 struct wiphy_radio *radio; 13456 struct ath12k *ar; 13457 int i, ret; 13458 13459 combinations = kzalloc(sizeof(*combinations), GFP_KERNEL); 13460 if (!combinations) 13461 return -ENOMEM; 13462 13463 if (ah->num_radio == 1) { 13464 ret = ath12k_mac_setup_radio_iface_comb(&ah->radio[0], 13465 combinations); 13466 if (ret) { 13467 ath12k_hw_warn(ah, "failed to setup radio interface combinations for one radio: %d", 13468 ret); 13469 goto err_free_combinations; 13470 } 13471 13472 goto out; 13473 } 13474 13475 /* there are multiple radios */ 13476 13477 radio = kcalloc(ah->num_radio, sizeof(*radio), GFP_KERNEL); 13478 if (!radio) { 13479 ret = -ENOMEM; 13480 goto err_free_combinations; 13481 } 13482 13483 for_each_ar(ah, ar, i) { 13484 comb = kzalloc(sizeof(*comb), GFP_KERNEL); 13485 if (!comb) { 13486 ret = -ENOMEM; 13487 goto err_free_radios; 13488 } 13489 13490 ret = ath12k_mac_setup_radio_iface_comb(ar, comb); 13491 if (ret) { 13492 ath12k_hw_warn(ah, "failed to setup radio interface combinations for radio %d: %d", 13493 i, ret); 13494 kfree(comb); 13495 goto err_free_radios; 13496 } 13497 13498 radio[i].freq_range = &ar->freq_range; 13499 radio[i].n_freq_range = 1; 13500 13501 radio[i].iface_combinations = comb; 13502 radio[i].n_iface_combinations = 1; 13503 } 13504 13505 ret = ath12k_mac_setup_global_iface_comb(ah, radio, ah->num_radio, combinations); 13506 if (ret) { 13507 ath12k_hw_warn(ah, "failed to setup global interface combinations: %d", 13508 ret); 13509 goto err_free_all_radios; 13510 } 13511 13512 wiphy->radio = radio; 13513 wiphy->n_radio = ah->num_radio; 13514 13515 out: 13516 wiphy->iface_combinations = combinations; 13517 wiphy->n_iface_combinations = 1; 13518 13519 return 0; 13520 13521 err_free_all_radios: 13522 i = ah->num_radio; 13523 13524 err_free_radios: 13525 while (i--) 13526 ath12k_mac_cleanup_iface_comb(radio[i].iface_combinations); 13527 13528 kfree(radio); 13529 13530 err_free_combinations: 13531 kfree(combinations); 13532 13533 return ret; 13534 } 13535 13536 static const u8 ath12k_if_types_ext_capa[] = { 13537 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING, 13538 [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT, 13539 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF, 13540 }; 13541 13542 static const u8 ath12k_if_types_ext_capa_sta[] = { 13543 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING, 13544 [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT, 13545 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF, 13546 [9] = WLAN_EXT_CAPA10_TWT_REQUESTER_SUPPORT, 13547 }; 13548 13549 static const u8 ath12k_if_types_ext_capa_ap[] = { 13550 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING, 13551 [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT, 13552 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF, 13553 [9] = WLAN_EXT_CAPA10_TWT_RESPONDER_SUPPORT, 13554 [10] = WLAN_EXT_CAPA11_EMA_SUPPORT, 13555 }; 13556 13557 static struct wiphy_iftype_ext_capab ath12k_iftypes_ext_capa[] = { 13558 { 13559 .extended_capabilities = ath12k_if_types_ext_capa, 13560 .extended_capabilities_mask = ath12k_if_types_ext_capa, 13561 .extended_capabilities_len = sizeof(ath12k_if_types_ext_capa), 13562 }, { 13563 .iftype = NL80211_IFTYPE_STATION, 13564 .extended_capabilities = ath12k_if_types_ext_capa_sta, 13565 .extended_capabilities_mask = ath12k_if_types_ext_capa_sta, 13566 .extended_capabilities_len = 13567 sizeof(ath12k_if_types_ext_capa_sta), 13568 }, { 13569 .iftype = NL80211_IFTYPE_AP, 13570 .extended_capabilities = ath12k_if_types_ext_capa_ap, 13571 .extended_capabilities_mask = ath12k_if_types_ext_capa_ap, 13572 .extended_capabilities_len = 13573 sizeof(ath12k_if_types_ext_capa_ap), 13574 .eml_capabilities = 0, 13575 .mld_capa_and_ops = 0, 13576 }, 13577 }; 13578 13579 static void ath12k_mac_cleanup_unregister(struct ath12k *ar) 13580 { 13581 idr_for_each(&ar->txmgmt_idr, ath12k_mac_tx_mgmt_pending_free, ar); 13582 idr_destroy(&ar->txmgmt_idr); 13583 13584 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); 13585 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels); 13586 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels); 13587 } 13588 13589 static void ath12k_mac_hw_unregister(struct ath12k_hw *ah) 13590 { 13591 struct ieee80211_hw *hw = ah->hw; 13592 struct ath12k *ar; 13593 int i; 13594 13595 for_each_ar(ah, ar, i) { 13596 cancel_work_sync(&ar->regd_channel_update_work); 13597 cancel_work_sync(&ar->regd_update_work); 13598 ath12k_debugfs_unregister(ar); 13599 ath12k_fw_stats_reset(ar); 13600 } 13601 13602 ieee80211_unregister_hw(hw); 13603 13604 for_each_ar(ah, ar, i) 13605 ath12k_mac_cleanup_unregister(ar); 13606 13607 ath12k_mac_cleanup_iface_combinations(ah); 13608 13609 SET_IEEE80211_DEV(hw, NULL); 13610 } 13611 13612 static int ath12k_mac_setup_register(struct ath12k *ar, 13613 u32 *ht_cap, 13614 struct ieee80211_supported_band *bands[]) 13615 { 13616 struct ath12k_pdev_cap *cap = &ar->pdev->cap; 13617 int ret; 13618 13619 init_waitqueue_head(&ar->txmgmt_empty_waitq); 13620 idr_init(&ar->txmgmt_idr); 13621 spin_lock_init(&ar->txmgmt_idr_lock); 13622 13623 ath12k_pdev_caps_update(ar); 13624 13625 ret = ath12k_mac_setup_channels_rates(ar, 13626 cap->supported_bands, 13627 bands); 13628 if (ret) 13629 return ret; 13630 13631 ath12k_mac_setup_ht_vht_cap(ar, cap, ht_cap); 13632 ath12k_mac_setup_sband_iftype_data(ar, cap); 13633 13634 ar->max_num_stations = ath12k_core_get_max_station_per_radio(ar->ab); 13635 ar->max_num_peers = ath12k_core_get_max_peers_per_radio(ar->ab); 13636 13637 ar->rssi_info.min_nf_dbm = ATH12K_DEFAULT_NOISE_FLOOR; 13638 ar->rssi_info.temp_offset = 0; 13639 ar->rssi_info.noise_floor = ar->rssi_info.min_nf_dbm + ar->rssi_info.temp_offset; 13640 13641 return 0; 13642 } 13643 13644 static int ath12k_mac_hw_register(struct ath12k_hw *ah) 13645 { 13646 struct ieee80211_hw *hw = ah->hw; 13647 struct wiphy *wiphy = hw->wiphy; 13648 struct ath12k *ar = ath12k_ah_to_ar(ah, 0); 13649 struct ath12k_base *ab = ar->ab; 13650 struct ath12k_pdev *pdev; 13651 struct ath12k_pdev_cap *cap; 13652 static const u32 cipher_suites[] = { 13653 WLAN_CIPHER_SUITE_TKIP, 13654 WLAN_CIPHER_SUITE_CCMP, 13655 WLAN_CIPHER_SUITE_AES_CMAC, 13656 WLAN_CIPHER_SUITE_BIP_CMAC_256, 13657 WLAN_CIPHER_SUITE_BIP_GMAC_128, 13658 WLAN_CIPHER_SUITE_BIP_GMAC_256, 13659 WLAN_CIPHER_SUITE_GCMP, 13660 WLAN_CIPHER_SUITE_GCMP_256, 13661 WLAN_CIPHER_SUITE_CCMP_256, 13662 }; 13663 int ret, i, j; 13664 u32 ht_cap = U32_MAX, antennas_rx = 0, antennas_tx = 0; 13665 bool is_6ghz = false, is_raw_mode = false, is_monitor_disable = false; 13666 u8 *mac_addr = NULL; 13667 u8 mbssid_max_interfaces = 0; 13668 13669 wiphy->max_ap_assoc_sta = 0; 13670 13671 for_each_ar(ah, ar, i) { 13672 u32 ht_cap_info = 0; 13673 13674 pdev = ar->pdev; 13675 if (ar->ab->pdevs_macaddr_valid) { 13676 ether_addr_copy(ar->mac_addr, pdev->mac_addr); 13677 } else { 13678 ether_addr_copy(ar->mac_addr, ar->ab->mac_addr); 13679 ar->mac_addr[4] += ar->pdev_idx; 13680 } 13681 13682 ret = ath12k_mac_setup_register(ar, &ht_cap_info, hw->wiphy->bands); 13683 if (ret) 13684 goto err_cleanup_unregister; 13685 13686 /* 6 GHz does not support HT Cap, hence do not consider it */ 13687 if (!ar->supports_6ghz) 13688 ht_cap &= ht_cap_info; 13689 13690 wiphy->max_ap_assoc_sta += ar->max_num_stations; 13691 13692 /* Advertise the max antenna support of all radios, driver can handle 13693 * per pdev specific antenna setting based on pdev cap when antenna 13694 * changes are made 13695 */ 13696 cap = &pdev->cap; 13697 13698 antennas_rx = max_t(u32, antennas_rx, cap->rx_chain_mask); 13699 antennas_tx = max_t(u32, antennas_tx, cap->tx_chain_mask); 13700 13701 if (ar->supports_6ghz) 13702 is_6ghz = true; 13703 13704 if (test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags)) 13705 is_raw_mode = true; 13706 13707 if (!ar->ab->hw_params->supports_monitor) 13708 is_monitor_disable = true; 13709 13710 if (i == 0) 13711 mac_addr = ar->mac_addr; 13712 else 13713 mac_addr = ab->mac_addr; 13714 13715 mbssid_max_interfaces += TARGET_NUM_VDEVS; 13716 } 13717 13718 wiphy->available_antennas_rx = antennas_rx; 13719 wiphy->available_antennas_tx = antennas_tx; 13720 13721 SET_IEEE80211_PERM_ADDR(hw, mac_addr); 13722 SET_IEEE80211_DEV(hw, ab->dev); 13723 13724 ret = ath12k_mac_setup_iface_combinations(ah); 13725 if (ret) { 13726 ath12k_err(ab, "failed to setup interface combinations: %d\n", ret); 13727 goto err_complete_cleanup_unregister; 13728 } 13729 13730 wiphy->interface_modes = ath12k_mac_get_ifmodes(ah); 13731 13732 if (ah->num_radio == 1 && 13733 wiphy->bands[NL80211_BAND_2GHZ] && 13734 wiphy->bands[NL80211_BAND_5GHZ] && 13735 wiphy->bands[NL80211_BAND_6GHZ]) 13736 ieee80211_hw_set(hw, SINGLE_SCAN_ON_ALL_BANDS); 13737 13738 ieee80211_hw_set(hw, SIGNAL_DBM); 13739 ieee80211_hw_set(hw, SUPPORTS_PS); 13740 ieee80211_hw_set(hw, SUPPORTS_DYNAMIC_PS); 13741 ieee80211_hw_set(hw, MFP_CAPABLE); 13742 ieee80211_hw_set(hw, REPORTS_TX_ACK_STATUS); 13743 ieee80211_hw_set(hw, HAS_RATE_CONTROL); 13744 ieee80211_hw_set(hw, AP_LINK_PS); 13745 ieee80211_hw_set(hw, SPECTRUM_MGMT); 13746 ieee80211_hw_set(hw, CONNECTION_MONITOR); 13747 ieee80211_hw_set(hw, SUPPORTS_PER_STA_GTK); 13748 ieee80211_hw_set(hw, CHANCTX_STA_CSA); 13749 ieee80211_hw_set(hw, QUEUE_CONTROL); 13750 ieee80211_hw_set(hw, SUPPORTS_TX_FRAG); 13751 ieee80211_hw_set(hw, REPORTS_LOW_ACK); 13752 ieee80211_hw_set(hw, NO_VIRTUAL_MONITOR); 13753 13754 if (cap->nss_ratio_enabled) 13755 ieee80211_hw_set(hw, SUPPORTS_VHT_EXT_NSS_BW); 13756 13757 if ((ht_cap & WMI_HT_CAP_ENABLED) || is_6ghz) { 13758 ieee80211_hw_set(hw, AMPDU_AGGREGATION); 13759 ieee80211_hw_set(hw, TX_AMPDU_SETUP_IN_HW); 13760 ieee80211_hw_set(hw, SUPPORTS_REORDERING_BUFFER); 13761 ieee80211_hw_set(hw, SUPPORTS_AMSDU_IN_AMPDU); 13762 ieee80211_hw_set(hw, USES_RSS); 13763 } 13764 13765 wiphy->features |= NL80211_FEATURE_STATIC_SMPS; 13766 wiphy->flags |= WIPHY_FLAG_IBSS_RSN; 13767 13768 /* TODO: Check if HT capability advertised from firmware is different 13769 * for each band for a dual band capable radio. It will be tricky to 13770 * handle it when the ht capability different for each band. 13771 */ 13772 if (ht_cap & WMI_HT_CAP_DYNAMIC_SMPS || 13773 (is_6ghz && ab->hw_params->supports_dynamic_smps_6ghz)) 13774 wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS; 13775 13776 wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID; 13777 wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN; 13778 13779 hw->max_listen_interval = ATH12K_MAX_HW_LISTEN_INTERVAL; 13780 13781 wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL; 13782 wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH; 13783 wiphy->max_remain_on_channel_duration = 5000; 13784 13785 wiphy->flags |= WIPHY_FLAG_AP_UAPSD; 13786 wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE | 13787 NL80211_FEATURE_AP_SCAN; 13788 13789 wiphy->features |= NL80211_FEATURE_TX_POWER_INSERTION; 13790 13791 /* MLO is not yet supported so disable Wireless Extensions for now 13792 * to make sure ath12k users don't use it. This flag can be removed 13793 * once WIPHY_FLAG_SUPPORTS_MLO is enabled. 13794 */ 13795 wiphy->flags |= WIPHY_FLAG_DISABLE_WEXT; 13796 13797 /* Copy over MLO related capabilities received from 13798 * WMI_SERVICE_READY_EXT2_EVENT if single_chip_mlo_supp is set. 13799 */ 13800 if (ab->ag->mlo_capable) { 13801 ath12k_iftypes_ext_capa[2].eml_capabilities = cap->eml_cap; 13802 ath12k_iftypes_ext_capa[2].mld_capa_and_ops = cap->mld_cap; 13803 wiphy->flags |= WIPHY_FLAG_SUPPORTS_MLO; 13804 13805 ieee80211_hw_set(hw, MLO_MCAST_MULTI_LINK_TX); 13806 } 13807 13808 hw->queues = ATH12K_HW_MAX_QUEUES; 13809 wiphy->tx_queue_len = ATH12K_QUEUE_LEN; 13810 hw->offchannel_tx_hw_queue = ATH12K_HW_MAX_QUEUES - 1; 13811 hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF_EHT; 13812 13813 hw->vif_data_size = sizeof(struct ath12k_vif); 13814 hw->sta_data_size = sizeof(struct ath12k_sta); 13815 hw->extra_tx_headroom = ab->hw_params->iova_mask; 13816 13817 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST); 13818 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_STA_TX_PWR); 13819 13820 wiphy->cipher_suites = cipher_suites; 13821 wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites); 13822 13823 wiphy->iftype_ext_capab = ath12k_iftypes_ext_capa; 13824 wiphy->num_iftype_ext_capab = ARRAY_SIZE(ath12k_iftypes_ext_capa); 13825 13826 wiphy->mbssid_max_interfaces = mbssid_max_interfaces; 13827 wiphy->ema_max_profile_periodicity = TARGET_EMA_MAX_PROFILE_PERIOD; 13828 ieee80211_hw_set(hw, SUPPORTS_MULTI_BSSID); 13829 13830 if (is_6ghz) { 13831 wiphy_ext_feature_set(wiphy, 13832 NL80211_EXT_FEATURE_FILS_DISCOVERY); 13833 wiphy_ext_feature_set(wiphy, 13834 NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP); 13835 } 13836 13837 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_PUNCT); 13838 if (test_bit(WMI_TLV_SERVICE_BEACON_PROTECTION_SUPPORT, ab->wmi_ab.svc_map)) 13839 wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_BEACON_PROTECTION); 13840 13841 ath12k_reg_init(hw); 13842 13843 if (!is_raw_mode) { 13844 hw->netdev_features = NETIF_F_HW_CSUM; 13845 ieee80211_hw_set(hw, SW_CRYPTO_CONTROL); 13846 ieee80211_hw_set(hw, SUPPORT_FAST_XMIT); 13847 } 13848 13849 if (test_bit(WMI_TLV_SERVICE_NLO, ar->wmi->wmi_ab->svc_map)) { 13850 wiphy->max_sched_scan_ssids = WMI_PNO_MAX_SUPP_NETWORKS; 13851 wiphy->max_match_sets = WMI_PNO_MAX_SUPP_NETWORKS; 13852 wiphy->max_sched_scan_ie_len = WMI_PNO_MAX_IE_LENGTH; 13853 wiphy->max_sched_scan_plans = WMI_PNO_MAX_SCHED_SCAN_PLANS; 13854 wiphy->max_sched_scan_plan_interval = 13855 WMI_PNO_MAX_SCHED_SCAN_PLAN_INT; 13856 wiphy->max_sched_scan_plan_iterations = 13857 WMI_PNO_MAX_SCHED_SCAN_PLAN_ITRNS; 13858 wiphy->features |= NL80211_FEATURE_ND_RANDOM_MAC_ADDR; 13859 } 13860 13861 ret = ath12k_wow_init(ar); 13862 if (ret) { 13863 ath12k_warn(ar->ab, "failed to init wow: %d\n", ret); 13864 goto err_cleanup_if_combs; 13865 } 13866 13867 /* Boot-time regulatory updates have already been processed. 13868 * Mark them as complete now, because after registration, 13869 * cfg80211 will notify us again if there are any pending hints. 13870 * We need to wait for those hints to be processed, so it's 13871 * important to mark the boot-time updates as complete before 13872 * proceeding with registration. 13873 */ 13874 for_each_ar(ah, ar, i) 13875 complete_all(&ar->regd_update_completed); 13876 13877 ret = ieee80211_register_hw(hw); 13878 if (ret) { 13879 ath12k_err(ab, "ieee80211 registration failed: %d\n", ret); 13880 goto err_cleanup_if_combs; 13881 } 13882 13883 if (is_monitor_disable) 13884 /* There's a race between calling ieee80211_register_hw() 13885 * and here where the monitor mode is enabled for a little 13886 * while. But that time is so short and in practise it make 13887 * a difference in real life. 13888 */ 13889 wiphy->interface_modes &= ~BIT(NL80211_IFTYPE_MONITOR); 13890 13891 for_each_ar(ah, ar, i) { 13892 /* Apply the regd received during initialization */ 13893 ret = ath12k_regd_update(ar, true); 13894 if (ret) { 13895 ath12k_err(ar->ab, "ath12k regd update failed: %d\n", ret); 13896 goto err_unregister_hw; 13897 } 13898 13899 if (ar->ab->hw_params->current_cc_support && ab->new_alpha2[0]) { 13900 struct wmi_set_current_country_arg current_cc = {}; 13901 13902 memcpy(¤t_cc.alpha2, ab->new_alpha2, 2); 13903 memcpy(&ar->alpha2, ab->new_alpha2, 2); 13904 13905 reinit_completion(&ar->regd_update_completed); 13906 13907 ret = ath12k_wmi_send_set_current_country_cmd(ar, ¤t_cc); 13908 if (ret) 13909 ath12k_warn(ar->ab, 13910 "failed set cc code for mac register: %d\n", 13911 ret); 13912 } 13913 13914 ath12k_fw_stats_init(ar); 13915 ath12k_debugfs_register(ar); 13916 } 13917 13918 return 0; 13919 13920 err_unregister_hw: 13921 for_each_ar(ah, ar, i) 13922 ath12k_debugfs_unregister(ar); 13923 13924 ieee80211_unregister_hw(hw); 13925 13926 err_cleanup_if_combs: 13927 ath12k_mac_cleanup_iface_combinations(ah); 13928 13929 err_complete_cleanup_unregister: 13930 i = ah->num_radio; 13931 13932 err_cleanup_unregister: 13933 for (j = 0; j < i; j++) { 13934 ar = ath12k_ah_to_ar(ah, j); 13935 ath12k_mac_cleanup_unregister(ar); 13936 } 13937 13938 SET_IEEE80211_DEV(hw, NULL); 13939 13940 return ret; 13941 } 13942 13943 static void ath12k_mac_setup(struct ath12k *ar) 13944 { 13945 struct ath12k_base *ab = ar->ab; 13946 struct ath12k_pdev *pdev = ar->pdev; 13947 u8 pdev_idx = ar->pdev_idx; 13948 13949 ar->lmac_id = ath12k_hw_get_mac_from_pdev_id(ab->hw_params, pdev_idx); 13950 13951 ar->wmi = &ab->wmi_ab.wmi[pdev_idx]; 13952 /* FIXME: wmi[0] is already initialized during attach, 13953 * Should we do this again? 13954 */ 13955 ath12k_wmi_pdev_attach(ab, pdev_idx); 13956 13957 ar->cfg_tx_chainmask = pdev->cap.tx_chain_mask; 13958 ar->cfg_rx_chainmask = pdev->cap.rx_chain_mask; 13959 ar->num_tx_chains = hweight32(pdev->cap.tx_chain_mask); 13960 ar->num_rx_chains = hweight32(pdev->cap.rx_chain_mask); 13961 ar->scan.arvif = NULL; 13962 ar->vdev_id_11d_scan = ATH12K_11D_INVALID_VDEV_ID; 13963 13964 spin_lock_init(&ar->data_lock); 13965 INIT_LIST_HEAD(&ar->arvifs); 13966 INIT_LIST_HEAD(&ar->ppdu_stats_info); 13967 13968 init_completion(&ar->vdev_setup_done); 13969 init_completion(&ar->vdev_delete_done); 13970 init_completion(&ar->peer_assoc_done); 13971 init_completion(&ar->peer_delete_done); 13972 init_completion(&ar->install_key_done); 13973 init_completion(&ar->bss_survey_done); 13974 init_completion(&ar->scan.started); 13975 init_completion(&ar->scan.completed); 13976 init_completion(&ar->scan.on_channel); 13977 init_completion(&ar->mlo_setup_done); 13978 init_completion(&ar->completed_11d_scan); 13979 init_completion(&ar->regd_update_completed); 13980 13981 INIT_DELAYED_WORK(&ar->scan.timeout, ath12k_scan_timeout_work); 13982 wiphy_work_init(&ar->scan.vdev_clean_wk, ath12k_scan_vdev_clean_work); 13983 INIT_WORK(&ar->regd_channel_update_work, ath12k_regd_update_chan_list_work); 13984 INIT_LIST_HEAD(&ar->regd_channel_update_queue); 13985 INIT_WORK(&ar->regd_update_work, ath12k_regd_update_work); 13986 13987 wiphy_work_init(&ar->wmi_mgmt_tx_work, ath12k_mgmt_over_wmi_tx_work); 13988 skb_queue_head_init(&ar->wmi_mgmt_tx_queue); 13989 13990 ar->monitor_vdev_id = -1; 13991 ar->monitor_vdev_created = false; 13992 ar->monitor_started = false; 13993 } 13994 13995 static int __ath12k_mac_mlo_setup(struct ath12k *ar) 13996 { 13997 u8 num_link = 0, partner_link_id[ATH12K_GROUP_MAX_RADIO] = {}; 13998 struct ath12k_base *partner_ab, *ab = ar->ab; 13999 struct ath12k_hw_group *ag = ab->ag; 14000 struct wmi_mlo_setup_arg mlo = {}; 14001 struct ath12k_pdev *pdev; 14002 unsigned long time_left; 14003 int i, j, ret; 14004 14005 lockdep_assert_held(&ag->mutex); 14006 14007 reinit_completion(&ar->mlo_setup_done); 14008 14009 for (i = 0; i < ag->num_devices; i++) { 14010 partner_ab = ag->ab[i]; 14011 14012 for (j = 0; j < partner_ab->num_radios; j++) { 14013 pdev = &partner_ab->pdevs[j]; 14014 14015 /* Avoid the self link */ 14016 if (ar == pdev->ar) 14017 continue; 14018 14019 partner_link_id[num_link] = pdev->hw_link_id; 14020 num_link++; 14021 14022 ath12k_dbg(ab, ATH12K_DBG_MAC, "device %d pdev %d hw_link_id %d num_link %d\n", 14023 i, j, pdev->hw_link_id, num_link); 14024 } 14025 } 14026 14027 if (num_link == 0) 14028 return 0; 14029 14030 mlo.group_id = cpu_to_le32(ag->id); 14031 mlo.partner_link_id = partner_link_id; 14032 mlo.num_partner_links = num_link; 14033 ar->mlo_setup_status = 0; 14034 14035 ath12k_dbg(ab, ATH12K_DBG_MAC, "group id %d num_link %d\n", ag->id, num_link); 14036 14037 ret = ath12k_wmi_mlo_setup(ar, &mlo); 14038 if (ret) { 14039 ath12k_err(ab, "failed to send setup MLO WMI command for pdev %d: %d\n", 14040 ar->pdev_idx, ret); 14041 return ret; 14042 } 14043 14044 time_left = wait_for_completion_timeout(&ar->mlo_setup_done, 14045 WMI_MLO_CMD_TIMEOUT_HZ); 14046 14047 if (!time_left || ar->mlo_setup_status) 14048 return ar->mlo_setup_status ? : -ETIMEDOUT; 14049 14050 ath12k_dbg(ab, ATH12K_DBG_MAC, "mlo setup done for pdev %d\n", ar->pdev_idx); 14051 14052 return 0; 14053 } 14054 14055 static int __ath12k_mac_mlo_teardown(struct ath12k *ar) 14056 { 14057 struct ath12k_base *ab = ar->ab; 14058 int ret; 14059 u8 num_link; 14060 14061 if (test_bit(ATH12K_FLAG_RECOVERY, &ab->dev_flags)) 14062 return 0; 14063 14064 num_link = ath12k_get_num_partner_link(ar); 14065 14066 if (num_link == 0) 14067 return 0; 14068 14069 ret = ath12k_wmi_mlo_teardown(ar); 14070 if (ret) { 14071 ath12k_warn(ab, "failed to send MLO teardown WMI command for pdev %d: %d\n", 14072 ar->pdev_idx, ret); 14073 return ret; 14074 } 14075 14076 ath12k_dbg(ab, ATH12K_DBG_MAC, "mlo teardown for pdev %d\n", ar->pdev_idx); 14077 14078 return 0; 14079 } 14080 14081 int ath12k_mac_mlo_setup(struct ath12k_hw_group *ag) 14082 { 14083 struct ath12k_hw *ah; 14084 struct ath12k *ar; 14085 int ret; 14086 int i, j; 14087 14088 for (i = 0; i < ag->num_hw; i++) { 14089 ah = ag->ah[i]; 14090 if (!ah) 14091 continue; 14092 14093 for_each_ar(ah, ar, j) { 14094 ar = &ah->radio[j]; 14095 ret = __ath12k_mac_mlo_setup(ar); 14096 if (ret) { 14097 ath12k_err(ar->ab, "failed to setup MLO: %d\n", ret); 14098 goto err_setup; 14099 } 14100 } 14101 } 14102 14103 return 0; 14104 14105 err_setup: 14106 for (i = i - 1; i >= 0; i--) { 14107 ah = ag->ah[i]; 14108 if (!ah) 14109 continue; 14110 14111 for (j = j - 1; j >= 0; j--) { 14112 ar = &ah->radio[j]; 14113 if (!ar) 14114 continue; 14115 14116 __ath12k_mac_mlo_teardown(ar); 14117 } 14118 } 14119 14120 return ret; 14121 } 14122 14123 void ath12k_mac_mlo_teardown(struct ath12k_hw_group *ag) 14124 { 14125 struct ath12k_hw *ah; 14126 struct ath12k *ar; 14127 int ret, i, j; 14128 14129 for (i = 0; i < ag->num_hw; i++) { 14130 ah = ag->ah[i]; 14131 if (!ah) 14132 continue; 14133 14134 for_each_ar(ah, ar, j) { 14135 ar = &ah->radio[j]; 14136 ret = __ath12k_mac_mlo_teardown(ar); 14137 if (ret) { 14138 ath12k_err(ar->ab, "failed to teardown MLO: %d\n", ret); 14139 break; 14140 } 14141 } 14142 } 14143 } 14144 14145 int ath12k_mac_register(struct ath12k_hw_group *ag) 14146 { 14147 struct ath12k_hw *ah; 14148 int i; 14149 int ret; 14150 14151 for (i = 0; i < ag->num_hw; i++) { 14152 ah = ath12k_ag_to_ah(ag, i); 14153 14154 ret = ath12k_mac_hw_register(ah); 14155 if (ret) 14156 goto err; 14157 } 14158 14159 return 0; 14160 14161 err: 14162 for (i = i - 1; i >= 0; i--) { 14163 ah = ath12k_ag_to_ah(ag, i); 14164 if (!ah) 14165 continue; 14166 14167 ath12k_mac_hw_unregister(ah); 14168 } 14169 14170 return ret; 14171 } 14172 14173 void ath12k_mac_unregister(struct ath12k_hw_group *ag) 14174 { 14175 struct ath12k_hw *ah; 14176 int i; 14177 14178 for (i = ag->num_hw - 1; i >= 0; i--) { 14179 ah = ath12k_ag_to_ah(ag, i); 14180 if (!ah) 14181 continue; 14182 14183 ath12k_mac_hw_unregister(ah); 14184 } 14185 } 14186 14187 static void ath12k_mac_hw_destroy(struct ath12k_hw *ah) 14188 { 14189 ieee80211_free_hw(ah->hw); 14190 } 14191 14192 static struct ath12k_hw *ath12k_mac_hw_allocate(struct ath12k_hw_group *ag, 14193 struct ath12k_pdev_map *pdev_map, 14194 u8 num_pdev_map) 14195 { 14196 struct ieee80211_hw *hw; 14197 struct ath12k *ar; 14198 struct ath12k_base *ab; 14199 struct ath12k_pdev *pdev; 14200 struct ath12k_hw *ah; 14201 int i; 14202 u8 pdev_idx; 14203 14204 hw = ieee80211_alloc_hw(struct_size(ah, radio, num_pdev_map), 14205 &ath12k_ops); 14206 if (!hw) 14207 return NULL; 14208 14209 ah = ath12k_hw_to_ah(hw); 14210 ah->hw = hw; 14211 ah->num_radio = num_pdev_map; 14212 14213 mutex_init(&ah->hw_mutex); 14214 INIT_LIST_HEAD(&ah->ml_peers); 14215 14216 for (i = 0; i < num_pdev_map; i++) { 14217 ab = pdev_map[i].ab; 14218 pdev_idx = pdev_map[i].pdev_idx; 14219 pdev = &ab->pdevs[pdev_idx]; 14220 14221 ar = ath12k_ah_to_ar(ah, i); 14222 ar->ah = ah; 14223 ar->ab = ab; 14224 ar->hw_link_id = pdev->hw_link_id; 14225 ar->pdev = pdev; 14226 ar->pdev_idx = pdev_idx; 14227 pdev->ar = ar; 14228 14229 ag->hw_links[ar->hw_link_id].device_id = ab->device_id; 14230 ag->hw_links[ar->hw_link_id].pdev_idx = pdev_idx; 14231 14232 ath12k_mac_setup(ar); 14233 ath12k_dp_pdev_pre_alloc(ar); 14234 } 14235 14236 return ah; 14237 } 14238 14239 void ath12k_mac_destroy(struct ath12k_hw_group *ag) 14240 { 14241 struct ath12k_pdev *pdev; 14242 struct ath12k_base *ab = ag->ab[0]; 14243 int i, j; 14244 struct ath12k_hw *ah; 14245 14246 for (i = 0; i < ag->num_devices; i++) { 14247 ab = ag->ab[i]; 14248 if (!ab) 14249 continue; 14250 14251 for (j = 0; j < ab->num_radios; j++) { 14252 pdev = &ab->pdevs[j]; 14253 if (!pdev->ar) 14254 continue; 14255 pdev->ar = NULL; 14256 } 14257 } 14258 14259 for (i = 0; i < ag->num_hw; i++) { 14260 ah = ath12k_ag_to_ah(ag, i); 14261 if (!ah) 14262 continue; 14263 14264 ath12k_mac_hw_destroy(ah); 14265 ath12k_ag_set_ah(ag, i, NULL); 14266 } 14267 } 14268 14269 static void ath12k_mac_set_device_defaults(struct ath12k_base *ab) 14270 { 14271 /* Initialize channel counters frequency value in hertz */ 14272 ab->cc_freq_hz = 320000; 14273 ab->free_vdev_map = (1LL << (ab->num_radios * TARGET_NUM_VDEVS)) - 1; 14274 } 14275 14276 int ath12k_mac_allocate(struct ath12k_hw_group *ag) 14277 { 14278 struct ath12k_pdev_map pdev_map[ATH12K_GROUP_MAX_RADIO]; 14279 int mac_id, device_id, total_radio, num_hw; 14280 struct ath12k_base *ab; 14281 struct ath12k_hw *ah; 14282 int ret, i, j; 14283 u8 radio_per_hw; 14284 14285 total_radio = 0; 14286 for (i = 0; i < ag->num_devices; i++) { 14287 ab = ag->ab[i]; 14288 if (!ab) 14289 continue; 14290 14291 ath12k_debugfs_pdev_create(ab); 14292 ath12k_mac_set_device_defaults(ab); 14293 total_radio += ab->num_radios; 14294 } 14295 14296 if (!total_radio) 14297 return -EINVAL; 14298 14299 if (WARN_ON(total_radio > ATH12K_GROUP_MAX_RADIO)) 14300 return -ENOSPC; 14301 14302 /* All pdev get combined and register as single wiphy based on 14303 * hardware group which participate in multi-link operation else 14304 * each pdev get register separately. 14305 */ 14306 if (ag->mlo_capable) 14307 radio_per_hw = total_radio; 14308 else 14309 radio_per_hw = 1; 14310 14311 num_hw = total_radio / radio_per_hw; 14312 14313 ag->num_hw = 0; 14314 device_id = 0; 14315 mac_id = 0; 14316 for (i = 0; i < num_hw; i++) { 14317 for (j = 0; j < radio_per_hw; j++) { 14318 if (device_id >= ag->num_devices || !ag->ab[device_id]) { 14319 ret = -ENOSPC; 14320 goto err; 14321 } 14322 14323 ab = ag->ab[device_id]; 14324 pdev_map[j].ab = ab; 14325 pdev_map[j].pdev_idx = mac_id; 14326 mac_id++; 14327 14328 /* If mac_id falls beyond the current device MACs then 14329 * move to next device 14330 */ 14331 if (mac_id >= ab->num_radios) { 14332 mac_id = 0; 14333 device_id++; 14334 } 14335 } 14336 14337 ab = pdev_map->ab; 14338 14339 ah = ath12k_mac_hw_allocate(ag, pdev_map, radio_per_hw); 14340 if (!ah) { 14341 ath12k_warn(ab, "failed to allocate mac80211 hw device for hw_idx %d\n", 14342 i); 14343 ret = -ENOMEM; 14344 goto err; 14345 } 14346 14347 ah->dev = ab->dev; 14348 14349 ag->ah[i] = ah; 14350 ag->num_hw++; 14351 } 14352 14353 return 0; 14354 14355 err: 14356 for (i = i - 1; i >= 0; i--) { 14357 ah = ath12k_ag_to_ah(ag, i); 14358 if (!ah) 14359 continue; 14360 14361 ath12k_mac_hw_destroy(ah); 14362 ath12k_ag_set_ah(ag, i, NULL); 14363 } 14364 14365 return ret; 14366 } 14367 14368 int ath12k_mac_vif_set_keepalive(struct ath12k_link_vif *arvif, 14369 enum wmi_sta_keepalive_method method, 14370 u32 interval) 14371 { 14372 struct wmi_sta_keepalive_arg arg = {}; 14373 struct ath12k *ar = arvif->ar; 14374 int ret; 14375 14376 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 14377 14378 if (arvif->ahvif->vdev_type != WMI_VDEV_TYPE_STA) 14379 return 0; 14380 14381 if (!test_bit(WMI_TLV_SERVICE_STA_KEEP_ALIVE, ar->ab->wmi_ab.svc_map)) 14382 return 0; 14383 14384 arg.vdev_id = arvif->vdev_id; 14385 arg.enabled = 1; 14386 arg.method = method; 14387 arg.interval = interval; 14388 14389 ret = ath12k_wmi_sta_keepalive(ar, &arg); 14390 if (ret) { 14391 ath12k_warn(ar->ab, "failed to set keepalive on vdev %i: %d\n", 14392 arvif->vdev_id, ret); 14393 return ret; 14394 } 14395 14396 return 0; 14397 } 14398