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