1 // SPDX-License-Identifier: BSD-3-Clause-Clear 2 /* 3 * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved. 4 * Copyright (c) 2021-2025 Qualcomm Innovation Center, Inc. All rights reserved. 5 */ 6 7 #include <net/mac80211.h> 8 #include <net/cfg80211.h> 9 #include <linux/etherdevice.h> 10 11 #include "mac.h" 12 #include "core.h" 13 #include "debug.h" 14 #include "wmi.h" 15 #include "hw.h" 16 #include "dp_tx.h" 17 #include "dp_rx.h" 18 #include "testmode.h" 19 #include "peer.h" 20 #include "debugfs.h" 21 #include "hif.h" 22 #include "wow.h" 23 #include "debugfs_sta.h" 24 25 #define CHAN2G(_channel, _freq, _flags) { \ 26 .band = NL80211_BAND_2GHZ, \ 27 .hw_value = (_channel), \ 28 .center_freq = (_freq), \ 29 .flags = (_flags), \ 30 .max_antenna_gain = 0, \ 31 .max_power = 30, \ 32 } 33 34 #define CHAN5G(_channel, _freq, _flags) { \ 35 .band = NL80211_BAND_5GHZ, \ 36 .hw_value = (_channel), \ 37 .center_freq = (_freq), \ 38 .flags = (_flags), \ 39 .max_antenna_gain = 0, \ 40 .max_power = 30, \ 41 } 42 43 #define CHAN6G(_channel, _freq, _flags) { \ 44 .band = NL80211_BAND_6GHZ, \ 45 .hw_value = (_channel), \ 46 .center_freq = (_freq), \ 47 .flags = (_flags), \ 48 .max_antenna_gain = 0, \ 49 .max_power = 30, \ 50 } 51 52 static const struct ieee80211_channel ath12k_2ghz_channels[] = { 53 CHAN2G(1, 2412, 0), 54 CHAN2G(2, 2417, 0), 55 CHAN2G(3, 2422, 0), 56 CHAN2G(4, 2427, 0), 57 CHAN2G(5, 2432, 0), 58 CHAN2G(6, 2437, 0), 59 CHAN2G(7, 2442, 0), 60 CHAN2G(8, 2447, 0), 61 CHAN2G(9, 2452, 0), 62 CHAN2G(10, 2457, 0), 63 CHAN2G(11, 2462, 0), 64 CHAN2G(12, 2467, 0), 65 CHAN2G(13, 2472, 0), 66 CHAN2G(14, 2484, 0), 67 }; 68 69 static const struct ieee80211_channel ath12k_5ghz_channels[] = { 70 CHAN5G(36, 5180, 0), 71 CHAN5G(40, 5200, 0), 72 CHAN5G(44, 5220, 0), 73 CHAN5G(48, 5240, 0), 74 CHAN5G(52, 5260, 0), 75 CHAN5G(56, 5280, 0), 76 CHAN5G(60, 5300, 0), 77 CHAN5G(64, 5320, 0), 78 CHAN5G(100, 5500, 0), 79 CHAN5G(104, 5520, 0), 80 CHAN5G(108, 5540, 0), 81 CHAN5G(112, 5560, 0), 82 CHAN5G(116, 5580, 0), 83 CHAN5G(120, 5600, 0), 84 CHAN5G(124, 5620, 0), 85 CHAN5G(128, 5640, 0), 86 CHAN5G(132, 5660, 0), 87 CHAN5G(136, 5680, 0), 88 CHAN5G(140, 5700, 0), 89 CHAN5G(144, 5720, 0), 90 CHAN5G(149, 5745, 0), 91 CHAN5G(153, 5765, 0), 92 CHAN5G(157, 5785, 0), 93 CHAN5G(161, 5805, 0), 94 CHAN5G(165, 5825, 0), 95 CHAN5G(169, 5845, 0), 96 CHAN5G(173, 5865, 0), 97 }; 98 99 static const struct ieee80211_channel ath12k_6ghz_channels[] = { 100 /* Operating Class 136 */ 101 CHAN6G(2, 5935, 0), 102 103 /* Operating Classes 131-135 */ 104 CHAN6G(1, 5955, 0), 105 CHAN6G(5, 5975, 0), 106 CHAN6G(9, 5995, 0), 107 CHAN6G(13, 6015, 0), 108 CHAN6G(17, 6035, 0), 109 CHAN6G(21, 6055, 0), 110 CHAN6G(25, 6075, 0), 111 CHAN6G(29, 6095, 0), 112 CHAN6G(33, 6115, 0), 113 CHAN6G(37, 6135, 0), 114 CHAN6G(41, 6155, 0), 115 CHAN6G(45, 6175, 0), 116 CHAN6G(49, 6195, 0), 117 CHAN6G(53, 6215, 0), 118 CHAN6G(57, 6235, 0), 119 CHAN6G(61, 6255, 0), 120 CHAN6G(65, 6275, 0), 121 CHAN6G(69, 6295, 0), 122 CHAN6G(73, 6315, 0), 123 CHAN6G(77, 6335, 0), 124 CHAN6G(81, 6355, 0), 125 CHAN6G(85, 6375, 0), 126 CHAN6G(89, 6395, 0), 127 CHAN6G(93, 6415, 0), 128 CHAN6G(97, 6435, 0), 129 CHAN6G(101, 6455, 0), 130 CHAN6G(105, 6475, 0), 131 CHAN6G(109, 6495, 0), 132 CHAN6G(113, 6515, 0), 133 CHAN6G(117, 6535, 0), 134 CHAN6G(121, 6555, 0), 135 CHAN6G(125, 6575, 0), 136 CHAN6G(129, 6595, 0), 137 CHAN6G(133, 6615, 0), 138 CHAN6G(137, 6635, 0), 139 CHAN6G(141, 6655, 0), 140 CHAN6G(145, 6675, 0), 141 CHAN6G(149, 6695, 0), 142 CHAN6G(153, 6715, 0), 143 CHAN6G(157, 6735, 0), 144 CHAN6G(161, 6755, 0), 145 CHAN6G(165, 6775, 0), 146 CHAN6G(169, 6795, 0), 147 CHAN6G(173, 6815, 0), 148 CHAN6G(177, 6835, 0), 149 CHAN6G(181, 6855, 0), 150 CHAN6G(185, 6875, 0), 151 CHAN6G(189, 6895, 0), 152 CHAN6G(193, 6915, 0), 153 CHAN6G(197, 6935, 0), 154 CHAN6G(201, 6955, 0), 155 CHAN6G(205, 6975, 0), 156 CHAN6G(209, 6995, 0), 157 CHAN6G(213, 7015, 0), 158 CHAN6G(217, 7035, 0), 159 CHAN6G(221, 7055, 0), 160 CHAN6G(225, 7075, 0), 161 CHAN6G(229, 7095, 0), 162 CHAN6G(233, 7115, 0), 163 }; 164 165 static struct ieee80211_rate ath12k_legacy_rates[] = { 166 { .bitrate = 10, 167 .hw_value = ATH12K_HW_RATE_CCK_LP_1M }, 168 { .bitrate = 20, 169 .hw_value = ATH12K_HW_RATE_CCK_LP_2M, 170 .hw_value_short = ATH12K_HW_RATE_CCK_SP_2M, 171 .flags = IEEE80211_RATE_SHORT_PREAMBLE }, 172 { .bitrate = 55, 173 .hw_value = ATH12K_HW_RATE_CCK_LP_5_5M, 174 .hw_value_short = ATH12K_HW_RATE_CCK_SP_5_5M, 175 .flags = IEEE80211_RATE_SHORT_PREAMBLE }, 176 { .bitrate = 110, 177 .hw_value = ATH12K_HW_RATE_CCK_LP_11M, 178 .hw_value_short = ATH12K_HW_RATE_CCK_SP_11M, 179 .flags = IEEE80211_RATE_SHORT_PREAMBLE }, 180 181 { .bitrate = 60, .hw_value = ATH12K_HW_RATE_OFDM_6M }, 182 { .bitrate = 90, .hw_value = ATH12K_HW_RATE_OFDM_9M }, 183 { .bitrate = 120, .hw_value = ATH12K_HW_RATE_OFDM_12M }, 184 { .bitrate = 180, .hw_value = ATH12K_HW_RATE_OFDM_18M }, 185 { .bitrate = 240, .hw_value = ATH12K_HW_RATE_OFDM_24M }, 186 { .bitrate = 360, .hw_value = ATH12K_HW_RATE_OFDM_36M }, 187 { .bitrate = 480, .hw_value = ATH12K_HW_RATE_OFDM_48M }, 188 { .bitrate = 540, .hw_value = ATH12K_HW_RATE_OFDM_54M }, 189 }; 190 191 static const int 192 ath12k_phymodes[NUM_NL80211_BANDS][ATH12K_CHAN_WIDTH_NUM] = { 193 [NL80211_BAND_2GHZ] = { 194 [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN, 195 [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN, 196 [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11BE_EHT20_2G, 197 [NL80211_CHAN_WIDTH_20] = MODE_11BE_EHT20_2G, 198 [NL80211_CHAN_WIDTH_40] = MODE_11BE_EHT40_2G, 199 [NL80211_CHAN_WIDTH_80] = MODE_UNKNOWN, 200 [NL80211_CHAN_WIDTH_80P80] = MODE_UNKNOWN, 201 [NL80211_CHAN_WIDTH_160] = MODE_UNKNOWN, 202 [NL80211_CHAN_WIDTH_320] = MODE_UNKNOWN, 203 }, 204 [NL80211_BAND_5GHZ] = { 205 [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN, 206 [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN, 207 [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11BE_EHT20, 208 [NL80211_CHAN_WIDTH_20] = MODE_11BE_EHT20, 209 [NL80211_CHAN_WIDTH_40] = MODE_11BE_EHT40, 210 [NL80211_CHAN_WIDTH_80] = MODE_11BE_EHT80, 211 [NL80211_CHAN_WIDTH_160] = MODE_11BE_EHT160, 212 [NL80211_CHAN_WIDTH_80P80] = MODE_UNKNOWN, 213 [NL80211_CHAN_WIDTH_320] = MODE_11BE_EHT320, 214 }, 215 [NL80211_BAND_6GHZ] = { 216 [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN, 217 [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN, 218 [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11BE_EHT20, 219 [NL80211_CHAN_WIDTH_20] = MODE_11BE_EHT20, 220 [NL80211_CHAN_WIDTH_40] = MODE_11BE_EHT40, 221 [NL80211_CHAN_WIDTH_80] = MODE_11BE_EHT80, 222 [NL80211_CHAN_WIDTH_160] = MODE_11BE_EHT160, 223 [NL80211_CHAN_WIDTH_80P80] = MODE_UNKNOWN, 224 [NL80211_CHAN_WIDTH_320] = MODE_11BE_EHT320, 225 }, 226 227 }; 228 229 const struct htt_rx_ring_tlv_filter ath12k_mac_mon_status_filter_default = { 230 .rx_filter = HTT_RX_FILTER_TLV_FLAGS_MPDU_START | 231 HTT_RX_FILTER_TLV_FLAGS_PPDU_END | 232 HTT_RX_FILTER_TLV_FLAGS_PPDU_END_STATUS_DONE | 233 HTT_RX_FILTER_TLV_FLAGS_PPDU_START_USER_INFO, 234 .pkt_filter_flags0 = HTT_RX_FP_MGMT_FILTER_FLAGS0, 235 .pkt_filter_flags1 = HTT_RX_FP_MGMT_FILTER_FLAGS1, 236 .pkt_filter_flags2 = HTT_RX_FP_CTRL_FILTER_FLASG2, 237 .pkt_filter_flags3 = HTT_RX_FP_DATA_FILTER_FLASG3 | 238 HTT_RX_FP_CTRL_FILTER_FLASG3 239 }; 240 241 #define ATH12K_MAC_FIRST_OFDM_RATE_IDX 4 242 #define ath12k_g_rates ath12k_legacy_rates 243 #define ath12k_g_rates_size (ARRAY_SIZE(ath12k_legacy_rates)) 244 #define ath12k_a_rates (ath12k_legacy_rates + 4) 245 #define ath12k_a_rates_size (ARRAY_SIZE(ath12k_legacy_rates) - 4) 246 247 #define ATH12K_MAC_SCAN_TIMEOUT_MSECS 200 /* in msecs */ 248 249 static const u32 ath12k_smps_map[] = { 250 [WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC, 251 [WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC, 252 [WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE, 253 [WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE, 254 }; 255 256 static int ath12k_start_vdev_delay(struct ath12k *ar, 257 struct ath12k_link_vif *arvif); 258 static void ath12k_mac_stop(struct ath12k *ar); 259 static int ath12k_mac_vdev_create(struct ath12k *ar, struct ath12k_link_vif *arvif); 260 static int ath12k_mac_vdev_delete(struct ath12k *ar, struct ath12k_link_vif *arvif); 261 262 static const char *ath12k_mac_phymode_str(enum wmi_phy_mode mode) 263 { 264 switch (mode) { 265 case MODE_11A: 266 return "11a"; 267 case MODE_11G: 268 return "11g"; 269 case MODE_11B: 270 return "11b"; 271 case MODE_11GONLY: 272 return "11gonly"; 273 case MODE_11NA_HT20: 274 return "11na-ht20"; 275 case MODE_11NG_HT20: 276 return "11ng-ht20"; 277 case MODE_11NA_HT40: 278 return "11na-ht40"; 279 case MODE_11NG_HT40: 280 return "11ng-ht40"; 281 case MODE_11AC_VHT20: 282 return "11ac-vht20"; 283 case MODE_11AC_VHT40: 284 return "11ac-vht40"; 285 case MODE_11AC_VHT80: 286 return "11ac-vht80"; 287 case MODE_11AC_VHT160: 288 return "11ac-vht160"; 289 case MODE_11AC_VHT80_80: 290 return "11ac-vht80+80"; 291 case MODE_11AC_VHT20_2G: 292 return "11ac-vht20-2g"; 293 case MODE_11AC_VHT40_2G: 294 return "11ac-vht40-2g"; 295 case MODE_11AC_VHT80_2G: 296 return "11ac-vht80-2g"; 297 case MODE_11AX_HE20: 298 return "11ax-he20"; 299 case MODE_11AX_HE40: 300 return "11ax-he40"; 301 case MODE_11AX_HE80: 302 return "11ax-he80"; 303 case MODE_11AX_HE80_80: 304 return "11ax-he80+80"; 305 case MODE_11AX_HE160: 306 return "11ax-he160"; 307 case MODE_11AX_HE20_2G: 308 return "11ax-he20-2g"; 309 case MODE_11AX_HE40_2G: 310 return "11ax-he40-2g"; 311 case MODE_11AX_HE80_2G: 312 return "11ax-he80-2g"; 313 case MODE_11BE_EHT20: 314 return "11be-eht20"; 315 case MODE_11BE_EHT40: 316 return "11be-eht40"; 317 case MODE_11BE_EHT80: 318 return "11be-eht80"; 319 case MODE_11BE_EHT80_80: 320 return "11be-eht80+80"; 321 case MODE_11BE_EHT160: 322 return "11be-eht160"; 323 case MODE_11BE_EHT160_160: 324 return "11be-eht160+160"; 325 case MODE_11BE_EHT320: 326 return "11be-eht320"; 327 case MODE_11BE_EHT20_2G: 328 return "11be-eht20-2g"; 329 case MODE_11BE_EHT40_2G: 330 return "11be-eht40-2g"; 331 case MODE_UNKNOWN: 332 /* skip */ 333 break; 334 335 /* no default handler to allow compiler to check that the 336 * enum is fully handled 337 */ 338 } 339 340 return "<unknown>"; 341 } 342 343 u16 ath12k_mac_he_convert_tones_to_ru_tones(u16 tones) 344 { 345 switch (tones) { 346 case 26: 347 return RU_26; 348 case 52: 349 return RU_52; 350 case 106: 351 return RU_106; 352 case 242: 353 return RU_242; 354 case 484: 355 return RU_484; 356 case 996: 357 return RU_996; 358 case (996 * 2): 359 return RU_2X996; 360 default: 361 return RU_26; 362 } 363 } 364 365 enum nl80211_eht_gi ath12k_mac_eht_gi_to_nl80211_eht_gi(u8 sgi) 366 { 367 switch (sgi) { 368 case RX_MSDU_START_SGI_0_8_US: 369 return NL80211_RATE_INFO_EHT_GI_0_8; 370 case RX_MSDU_START_SGI_1_6_US: 371 return NL80211_RATE_INFO_EHT_GI_1_6; 372 case RX_MSDU_START_SGI_3_2_US: 373 return NL80211_RATE_INFO_EHT_GI_3_2; 374 default: 375 return NL80211_RATE_INFO_EHT_GI_0_8; 376 } 377 } 378 379 enum nl80211_eht_ru_alloc ath12k_mac_eht_ru_tones_to_nl80211_eht_ru_alloc(u16 ru_tones) 380 { 381 switch (ru_tones) { 382 case 26: 383 return NL80211_RATE_INFO_EHT_RU_ALLOC_26; 384 case 52: 385 return NL80211_RATE_INFO_EHT_RU_ALLOC_52; 386 case (52 + 26): 387 return NL80211_RATE_INFO_EHT_RU_ALLOC_52P26; 388 case 106: 389 return NL80211_RATE_INFO_EHT_RU_ALLOC_106; 390 case (106 + 26): 391 return NL80211_RATE_INFO_EHT_RU_ALLOC_106P26; 392 case 242: 393 return NL80211_RATE_INFO_EHT_RU_ALLOC_242; 394 case 484: 395 return NL80211_RATE_INFO_EHT_RU_ALLOC_484; 396 case (484 + 242): 397 return NL80211_RATE_INFO_EHT_RU_ALLOC_484P242; 398 case 996: 399 return NL80211_RATE_INFO_EHT_RU_ALLOC_996; 400 case (996 + 484): 401 return NL80211_RATE_INFO_EHT_RU_ALLOC_996P484; 402 case (996 + 484 + 242): 403 return NL80211_RATE_INFO_EHT_RU_ALLOC_996P484P242; 404 case (2 * 996): 405 return NL80211_RATE_INFO_EHT_RU_ALLOC_2x996; 406 case (2 * 996 + 484): 407 return NL80211_RATE_INFO_EHT_RU_ALLOC_2x996P484; 408 case (3 * 996): 409 return NL80211_RATE_INFO_EHT_RU_ALLOC_3x996; 410 case (3 * 996 + 484): 411 return NL80211_RATE_INFO_EHT_RU_ALLOC_3x996P484; 412 case (4 * 996): 413 return NL80211_RATE_INFO_EHT_RU_ALLOC_4x996; 414 default: 415 return NL80211_RATE_INFO_EHT_RU_ALLOC_26; 416 } 417 } 418 419 enum rate_info_bw 420 ath12k_mac_bw_to_mac80211_bw(enum ath12k_supported_bw bw) 421 { 422 u8 ret = RATE_INFO_BW_20; 423 424 switch (bw) { 425 case ATH12K_BW_20: 426 ret = RATE_INFO_BW_20; 427 break; 428 case ATH12K_BW_40: 429 ret = RATE_INFO_BW_40; 430 break; 431 case ATH12K_BW_80: 432 ret = RATE_INFO_BW_80; 433 break; 434 case ATH12K_BW_160: 435 ret = RATE_INFO_BW_160; 436 break; 437 case ATH12K_BW_320: 438 ret = RATE_INFO_BW_320; 439 break; 440 } 441 442 return ret; 443 } 444 445 enum ath12k_supported_bw ath12k_mac_mac80211_bw_to_ath12k_bw(enum rate_info_bw bw) 446 { 447 switch (bw) { 448 case RATE_INFO_BW_20: 449 return ATH12K_BW_20; 450 case RATE_INFO_BW_40: 451 return ATH12K_BW_40; 452 case RATE_INFO_BW_80: 453 return ATH12K_BW_80; 454 case RATE_INFO_BW_160: 455 return ATH12K_BW_160; 456 case RATE_INFO_BW_320: 457 return ATH12K_BW_320; 458 default: 459 return ATH12K_BW_20; 460 } 461 } 462 463 int ath12k_mac_hw_ratecode_to_legacy_rate(u8 hw_rc, u8 preamble, u8 *rateidx, 464 u16 *rate) 465 { 466 /* As default, it is OFDM rates */ 467 int i = ATH12K_MAC_FIRST_OFDM_RATE_IDX; 468 int max_rates_idx = ath12k_g_rates_size; 469 470 if (preamble == WMI_RATE_PREAMBLE_CCK) { 471 hw_rc &= ~ATH12K_HW_RATECODE_CCK_SHORT_PREAM_MASK; 472 i = 0; 473 max_rates_idx = ATH12K_MAC_FIRST_OFDM_RATE_IDX; 474 } 475 476 while (i < max_rates_idx) { 477 if (hw_rc == ath12k_legacy_rates[i].hw_value) { 478 *rateidx = i; 479 *rate = ath12k_legacy_rates[i].bitrate; 480 return 0; 481 } 482 i++; 483 } 484 485 return -EINVAL; 486 } 487 488 u8 ath12k_mac_bitrate_to_idx(const struct ieee80211_supported_band *sband, 489 u32 bitrate) 490 { 491 int i; 492 493 for (i = 0; i < sband->n_bitrates; i++) 494 if (sband->bitrates[i].bitrate == bitrate) 495 return i; 496 497 return 0; 498 } 499 500 static u32 501 ath12k_mac_max_ht_nss(const u8 *ht_mcs_mask) 502 { 503 int nss; 504 505 for (nss = IEEE80211_HT_MCS_MASK_LEN - 1; nss >= 0; nss--) 506 if (ht_mcs_mask[nss]) 507 return nss + 1; 508 509 return 1; 510 } 511 512 static u32 513 ath12k_mac_max_vht_nss(const u16 *vht_mcs_mask) 514 { 515 int nss; 516 517 for (nss = NL80211_VHT_NSS_MAX - 1; nss >= 0; nss--) 518 if (vht_mcs_mask[nss]) 519 return nss + 1; 520 521 return 1; 522 } 523 524 static u32 525 ath12k_mac_max_he_nss(const u16 he_mcs_mask[NL80211_HE_NSS_MAX]) 526 { 527 int nss; 528 529 for (nss = NL80211_HE_NSS_MAX - 1; nss >= 0; nss--) 530 if (he_mcs_mask[nss]) 531 return nss + 1; 532 533 return 1; 534 } 535 536 static u8 ath12k_parse_mpdudensity(u8 mpdudensity) 537 { 538 /* From IEEE Std 802.11-2020 defined values for "Minimum MPDU Start Spacing": 539 * 0 for no restriction 540 * 1 for 1/4 us 541 * 2 for 1/2 us 542 * 3 for 1 us 543 * 4 for 2 us 544 * 5 for 4 us 545 * 6 for 8 us 546 * 7 for 16 us 547 */ 548 switch (mpdudensity) { 549 case 0: 550 return 0; 551 case 1: 552 case 2: 553 case 3: 554 /* Our lower layer calculations limit our precision to 555 * 1 microsecond 556 */ 557 return 1; 558 case 4: 559 return 2; 560 case 5: 561 return 4; 562 case 6: 563 return 8; 564 case 7: 565 return 16; 566 default: 567 return 0; 568 } 569 } 570 571 static int ath12k_mac_vif_link_chan(struct ieee80211_vif *vif, u8 link_id, 572 struct cfg80211_chan_def *def) 573 { 574 struct ieee80211_bss_conf *link_conf; 575 struct ieee80211_chanctx_conf *conf; 576 577 rcu_read_lock(); 578 link_conf = rcu_dereference(vif->link_conf[link_id]); 579 580 if (!link_conf) { 581 rcu_read_unlock(); 582 return -ENOLINK; 583 } 584 585 conf = rcu_dereference(link_conf->chanctx_conf); 586 if (!conf) { 587 rcu_read_unlock(); 588 return -ENOENT; 589 } 590 *def = conf->def; 591 rcu_read_unlock(); 592 593 return 0; 594 } 595 596 static struct ath12k_link_vif * 597 ath12k_mac_get_tx_arvif(struct ath12k_link_vif *arvif, 598 struct ieee80211_bss_conf *link_conf) 599 { 600 struct ieee80211_bss_conf *tx_bss_conf; 601 struct ath12k *ar = arvif->ar; 602 struct ath12k_vif *tx_ahvif; 603 604 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 605 606 tx_bss_conf = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy, 607 link_conf->tx_bss_conf); 608 if (tx_bss_conf) { 609 tx_ahvif = ath12k_vif_to_ahvif(tx_bss_conf->vif); 610 return wiphy_dereference(tx_ahvif->ah->hw->wiphy, 611 tx_ahvif->link[tx_bss_conf->link_id]); 612 } 613 614 return NULL; 615 } 616 617 static const u8 *ath12k_mac_get_tx_bssid(struct ath12k_link_vif *arvif) 618 { 619 struct ieee80211_bss_conf *link_conf; 620 struct ath12k_link_vif *tx_arvif; 621 struct ath12k *ar = arvif->ar; 622 623 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 624 625 link_conf = ath12k_mac_get_link_bss_conf(arvif); 626 if (!link_conf) { 627 ath12k_warn(ar->ab, 628 "unable to access bss link conf for link %u required to retrieve transmitting link conf\n", 629 arvif->link_id); 630 return NULL; 631 } 632 if (link_conf->vif->type == NL80211_IFTYPE_STATION) { 633 if (link_conf->nontransmitted) 634 return link_conf->transmitter_bssid; 635 } else { 636 tx_arvif = ath12k_mac_get_tx_arvif(arvif, link_conf); 637 if (tx_arvif) 638 return tx_arvif->bssid; 639 } 640 641 return NULL; 642 } 643 644 struct ieee80211_bss_conf * 645 ath12k_mac_get_link_bss_conf(struct ath12k_link_vif *arvif) 646 { 647 struct ieee80211_vif *vif = arvif->ahvif->vif; 648 struct ieee80211_bss_conf *link_conf; 649 struct ath12k *ar = arvif->ar; 650 651 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 652 653 if (arvif->link_id >= IEEE80211_MLD_MAX_NUM_LINKS) 654 return NULL; 655 656 link_conf = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy, 657 vif->link_conf[arvif->link_id]); 658 659 return link_conf; 660 } 661 662 static struct ieee80211_link_sta *ath12k_mac_get_link_sta(struct ath12k_link_sta *arsta) 663 { 664 struct ath12k_sta *ahsta = arsta->ahsta; 665 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(ahsta); 666 struct ieee80211_link_sta *link_sta; 667 668 lockdep_assert_wiphy(ahsta->ahvif->ah->hw->wiphy); 669 670 if (arsta->link_id >= IEEE80211_MLD_MAX_NUM_LINKS) 671 return NULL; 672 673 link_sta = wiphy_dereference(ahsta->ahvif->ah->hw->wiphy, 674 sta->link[arsta->link_id]); 675 676 return link_sta; 677 } 678 679 static bool ath12k_mac_bitrate_is_cck(int bitrate) 680 { 681 switch (bitrate) { 682 case 10: 683 case 20: 684 case 55: 685 case 110: 686 return true; 687 } 688 689 return false; 690 } 691 692 u8 ath12k_mac_hw_rate_to_idx(const struct ieee80211_supported_band *sband, 693 u8 hw_rate, bool cck) 694 { 695 const struct ieee80211_rate *rate; 696 int i; 697 698 for (i = 0; i < sband->n_bitrates; i++) { 699 rate = &sband->bitrates[i]; 700 701 if (ath12k_mac_bitrate_is_cck(rate->bitrate) != cck) 702 continue; 703 704 if (rate->hw_value == hw_rate) 705 return i; 706 else if (rate->flags & IEEE80211_RATE_SHORT_PREAMBLE && 707 rate->hw_value_short == hw_rate) 708 return i; 709 } 710 711 return 0; 712 } 713 714 static u8 ath12k_mac_bitrate_to_rate(int bitrate) 715 { 716 return DIV_ROUND_UP(bitrate, 5) | 717 (ath12k_mac_bitrate_is_cck(bitrate) ? BIT(7) : 0); 718 } 719 720 static void ath12k_get_arvif_iter(void *data, u8 *mac, 721 struct ieee80211_vif *vif) 722 { 723 struct ath12k_vif_iter *arvif_iter = data; 724 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 725 unsigned long links_map = ahvif->links_map; 726 struct ath12k_link_vif *arvif; 727 u8 link_id; 728 729 for_each_set_bit(link_id, &links_map, IEEE80211_MLD_MAX_NUM_LINKS) { 730 arvif = rcu_dereference(ahvif->link[link_id]); 731 732 if (WARN_ON(!arvif)) 733 continue; 734 735 if (!arvif->is_created) 736 continue; 737 738 if (arvif->vdev_id == arvif_iter->vdev_id && 739 arvif->ar == arvif_iter->ar) { 740 arvif_iter->arvif = arvif; 741 break; 742 } 743 } 744 } 745 746 struct ath12k_link_vif *ath12k_mac_get_arvif(struct ath12k *ar, u32 vdev_id) 747 { 748 struct ath12k_vif_iter arvif_iter = {}; 749 u32 flags; 750 751 /* To use the arvif returned, caller must have held rcu read lock. 752 */ 753 WARN_ON(!rcu_read_lock_any_held()); 754 arvif_iter.vdev_id = vdev_id; 755 arvif_iter.ar = ar; 756 757 flags = IEEE80211_IFACE_ITER_RESUME_ALL; 758 ieee80211_iterate_active_interfaces_atomic(ath12k_ar_to_hw(ar), 759 flags, 760 ath12k_get_arvif_iter, 761 &arvif_iter); 762 if (!arvif_iter.arvif) { 763 ath12k_warn(ar->ab, "No VIF found for vdev %d\n", vdev_id); 764 return NULL; 765 } 766 767 return arvif_iter.arvif; 768 } 769 770 struct ath12k_link_vif *ath12k_mac_get_arvif_by_vdev_id(struct ath12k_base *ab, 771 u32 vdev_id) 772 { 773 int i; 774 struct ath12k_pdev *pdev; 775 struct ath12k_link_vif *arvif; 776 777 for (i = 0; i < ab->num_radios; i++) { 778 pdev = rcu_dereference(ab->pdevs_active[i]); 779 if (pdev && pdev->ar && 780 (pdev->ar->allocated_vdev_map & (1LL << vdev_id))) { 781 arvif = ath12k_mac_get_arvif(pdev->ar, vdev_id); 782 if (arvif) 783 return arvif; 784 } 785 } 786 787 return NULL; 788 } 789 790 struct ath12k *ath12k_mac_get_ar_by_vdev_id(struct ath12k_base *ab, u32 vdev_id) 791 { 792 int i; 793 struct ath12k_pdev *pdev; 794 795 for (i = 0; i < ab->num_radios; i++) { 796 pdev = rcu_dereference(ab->pdevs_active[i]); 797 if (pdev && pdev->ar) { 798 if (pdev->ar->allocated_vdev_map & (1LL << vdev_id)) 799 return pdev->ar; 800 } 801 } 802 803 return NULL; 804 } 805 806 struct ath12k *ath12k_mac_get_ar_by_pdev_id(struct ath12k_base *ab, u32 pdev_id) 807 { 808 int i; 809 struct ath12k_pdev *pdev; 810 811 if (ab->hw_params->single_pdev_only) { 812 pdev = rcu_dereference(ab->pdevs_active[0]); 813 return pdev ? pdev->ar : NULL; 814 } 815 816 if (WARN_ON(pdev_id > ab->num_radios)) 817 return NULL; 818 819 for (i = 0; i < ab->num_radios; i++) { 820 if (ab->fw_mode == ATH12K_FIRMWARE_MODE_FTM) 821 pdev = &ab->pdevs[i]; 822 else 823 pdev = rcu_dereference(ab->pdevs_active[i]); 824 825 if (pdev && pdev->pdev_id == pdev_id) 826 return (pdev->ar ? pdev->ar : NULL); 827 } 828 829 return NULL; 830 } 831 832 static bool ath12k_mac_is_ml_arvif(struct ath12k_link_vif *arvif) 833 { 834 struct ath12k_vif *ahvif = arvif->ahvif; 835 836 lockdep_assert_wiphy(ahvif->ah->hw->wiphy); 837 838 if (ahvif->vif->valid_links & BIT(arvif->link_id)) 839 return true; 840 841 return false; 842 } 843 844 static struct ath12k *ath12k_mac_get_ar_by_chan(struct ieee80211_hw *hw, 845 struct ieee80211_channel *channel) 846 { 847 struct ath12k_hw *ah = hw->priv; 848 struct ath12k *ar; 849 int i; 850 851 ar = ah->radio; 852 853 if (ah->num_radio == 1) 854 return ar; 855 856 for_each_ar(ah, ar, i) { 857 if (channel->center_freq >= KHZ_TO_MHZ(ar->freq_range.start_freq) && 858 channel->center_freq <= KHZ_TO_MHZ(ar->freq_range.end_freq)) 859 return ar; 860 } 861 return NULL; 862 } 863 864 static struct ath12k *ath12k_get_ar_by_ctx(struct ieee80211_hw *hw, 865 struct ieee80211_chanctx_conf *ctx) 866 { 867 if (!ctx) 868 return NULL; 869 870 return ath12k_mac_get_ar_by_chan(hw, ctx->def.chan); 871 } 872 873 struct ath12k *ath12k_get_ar_by_vif(struct ieee80211_hw *hw, 874 struct ieee80211_vif *vif, 875 u8 link_id) 876 { 877 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 878 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 879 struct ath12k_link_vif *arvif; 880 881 lockdep_assert_wiphy(hw->wiphy); 882 883 /* If there is one pdev within ah, then we return 884 * ar directly. 885 */ 886 if (ah->num_radio == 1) 887 return ah->radio; 888 889 if (!(ahvif->links_map & BIT(link_id))) 890 return NULL; 891 892 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 893 if (arvif && arvif->is_created) 894 return arvif->ar; 895 896 return NULL; 897 } 898 899 void ath12k_mac_get_any_chanctx_conf_iter(struct ieee80211_hw *hw, 900 struct ieee80211_chanctx_conf *conf, 901 void *data) 902 { 903 struct ath12k_mac_get_any_chanctx_conf_arg *arg = data; 904 struct ath12k *ctx_ar = ath12k_get_ar_by_ctx(hw, conf); 905 906 if (ctx_ar == arg->ar) 907 arg->chanctx_conf = conf; 908 } 909 910 static struct ath12k_link_vif *ath12k_mac_get_vif_up(struct ath12k *ar) 911 { 912 struct ath12k_link_vif *arvif; 913 914 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 915 916 list_for_each_entry(arvif, &ar->arvifs, list) { 917 if (arvif->is_up) 918 return arvif; 919 } 920 921 return NULL; 922 } 923 924 static bool ath12k_mac_band_match(enum nl80211_band band1, enum WMI_HOST_WLAN_BAND band2) 925 { 926 switch (band1) { 927 case NL80211_BAND_2GHZ: 928 if (band2 & WMI_HOST_WLAN_2GHZ_CAP) 929 return true; 930 break; 931 case NL80211_BAND_5GHZ: 932 case NL80211_BAND_6GHZ: 933 if (band2 & WMI_HOST_WLAN_5GHZ_CAP) 934 return true; 935 break; 936 default: 937 return false; 938 } 939 940 return false; 941 } 942 943 static u8 ath12k_mac_get_target_pdev_id_from_vif(struct ath12k_link_vif *arvif) 944 { 945 struct ath12k *ar = arvif->ar; 946 struct ath12k_base *ab = ar->ab; 947 struct ieee80211_vif *vif = arvif->ahvif->vif; 948 struct cfg80211_chan_def def; 949 enum nl80211_band band; 950 u8 pdev_id = ab->fw_pdev[0].pdev_id; 951 int i; 952 953 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) 954 return pdev_id; 955 956 band = def.chan->band; 957 958 for (i = 0; i < ab->fw_pdev_count; i++) { 959 if (ath12k_mac_band_match(band, ab->fw_pdev[i].supported_bands)) 960 return ab->fw_pdev[i].pdev_id; 961 } 962 963 return pdev_id; 964 } 965 966 u8 ath12k_mac_get_target_pdev_id(struct ath12k *ar) 967 { 968 struct ath12k_link_vif *arvif; 969 struct ath12k_base *ab = ar->ab; 970 971 if (!ab->hw_params->single_pdev_only) 972 return ar->pdev->pdev_id; 973 974 arvif = ath12k_mac_get_vif_up(ar); 975 976 /* fw_pdev array has pdev ids derived from phy capability 977 * service ready event (pdev_and_hw_link_ids). 978 * If no vif is active, return default first index. 979 */ 980 if (!arvif) 981 return ar->ab->fw_pdev[0].pdev_id; 982 983 /* If active vif is found, return the pdev id matching chandef band */ 984 return ath12k_mac_get_target_pdev_id_from_vif(arvif); 985 } 986 987 static void ath12k_pdev_caps_update(struct ath12k *ar) 988 { 989 struct ath12k_base *ab = ar->ab; 990 991 ar->max_tx_power = ab->target_caps.hw_max_tx_power; 992 993 /* FIXME: Set min_tx_power to ab->target_caps.hw_min_tx_power. 994 * But since the received value in svcrdy is same as hw_max_tx_power, 995 * we can set ar->min_tx_power to 0 currently until 996 * this is fixed in firmware 997 */ 998 ar->min_tx_power = 0; 999 1000 ar->txpower_limit_2g = ar->max_tx_power; 1001 ar->txpower_limit_5g = ar->max_tx_power; 1002 ar->txpower_scale = WMI_HOST_TP_SCALE_MAX; 1003 } 1004 1005 static int ath12k_mac_txpower_recalc(struct ath12k *ar) 1006 { 1007 struct ath12k_pdev *pdev = ar->pdev; 1008 struct ath12k_link_vif *arvif; 1009 int ret, txpower = -1; 1010 u32 param; 1011 1012 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 1013 1014 list_for_each_entry(arvif, &ar->arvifs, list) { 1015 if (arvif->txpower <= 0) 1016 continue; 1017 1018 if (txpower == -1) 1019 txpower = arvif->txpower; 1020 else 1021 txpower = min(txpower, arvif->txpower); 1022 } 1023 1024 if (txpower == -1) 1025 return 0; 1026 1027 /* txpwr is set as 2 units per dBm in FW*/ 1028 txpower = min_t(u32, max_t(u32, ar->min_tx_power, txpower), 1029 ar->max_tx_power) * 2; 1030 1031 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "txpower to set in hw %d\n", 1032 txpower / 2); 1033 1034 if ((pdev->cap.supported_bands & WMI_HOST_WLAN_2GHZ_CAP) && 1035 ar->txpower_limit_2g != txpower) { 1036 param = WMI_PDEV_PARAM_TXPOWER_LIMIT2G; 1037 ret = ath12k_wmi_pdev_set_param(ar, param, 1038 txpower, ar->pdev->pdev_id); 1039 if (ret) 1040 goto fail; 1041 ar->txpower_limit_2g = txpower; 1042 } 1043 1044 if ((pdev->cap.supported_bands & WMI_HOST_WLAN_5GHZ_CAP) && 1045 ar->txpower_limit_5g != txpower) { 1046 param = WMI_PDEV_PARAM_TXPOWER_LIMIT5G; 1047 ret = ath12k_wmi_pdev_set_param(ar, param, 1048 txpower, ar->pdev->pdev_id); 1049 if (ret) 1050 goto fail; 1051 ar->txpower_limit_5g = txpower; 1052 } 1053 1054 return 0; 1055 1056 fail: 1057 ath12k_warn(ar->ab, "failed to recalc txpower limit %d using pdev param %d: %d\n", 1058 txpower / 2, param, ret); 1059 return ret; 1060 } 1061 1062 static int ath12k_recalc_rtscts_prot(struct ath12k_link_vif *arvif) 1063 { 1064 struct ath12k *ar = arvif->ar; 1065 u32 vdev_param, rts_cts; 1066 int ret; 1067 1068 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 1069 1070 vdev_param = WMI_VDEV_PARAM_ENABLE_RTSCTS; 1071 1072 /* Enable RTS/CTS protection for sw retries (when legacy stations 1073 * are in BSS) or by default only for second rate series. 1074 * TODO: Check if we need to enable CTS 2 Self in any case 1075 */ 1076 rts_cts = WMI_USE_RTS_CTS; 1077 1078 if (arvif->num_legacy_stations > 0) 1079 rts_cts |= WMI_RTSCTS_ACROSS_SW_RETRIES << 4; 1080 else 1081 rts_cts |= WMI_RTSCTS_FOR_SECOND_RATESERIES << 4; 1082 1083 /* Need not send duplicate param value to firmware */ 1084 if (arvif->rtscts_prot_mode == rts_cts) 1085 return 0; 1086 1087 arvif->rtscts_prot_mode = rts_cts; 1088 1089 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d recalc rts/cts prot %d\n", 1090 arvif->vdev_id, rts_cts); 1091 1092 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 1093 vdev_param, rts_cts); 1094 if (ret) 1095 ath12k_warn(ar->ab, "failed to recalculate rts/cts prot for vdev %d: %d\n", 1096 arvif->vdev_id, ret); 1097 1098 return ret; 1099 } 1100 1101 static int ath12k_mac_set_kickout(struct ath12k_link_vif *arvif) 1102 { 1103 struct ath12k *ar = arvif->ar; 1104 u32 param; 1105 int ret; 1106 1107 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_STA_KICKOUT_TH, 1108 ATH12K_KICKOUT_THRESHOLD, 1109 ar->pdev->pdev_id); 1110 if (ret) { 1111 ath12k_warn(ar->ab, "failed to set kickout threshold on vdev %i: %d\n", 1112 arvif->vdev_id, ret); 1113 return ret; 1114 } 1115 1116 param = WMI_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS; 1117 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, 1118 ATH12K_KEEPALIVE_MIN_IDLE); 1119 if (ret) { 1120 ath12k_warn(ar->ab, "failed to set keepalive minimum idle time on vdev %i: %d\n", 1121 arvif->vdev_id, ret); 1122 return ret; 1123 } 1124 1125 param = WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS; 1126 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, 1127 ATH12K_KEEPALIVE_MAX_IDLE); 1128 if (ret) { 1129 ath12k_warn(ar->ab, "failed to set keepalive maximum idle time on vdev %i: %d\n", 1130 arvif->vdev_id, ret); 1131 return ret; 1132 } 1133 1134 param = WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS; 1135 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, 1136 ATH12K_KEEPALIVE_MAX_UNRESPONSIVE); 1137 if (ret) { 1138 ath12k_warn(ar->ab, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n", 1139 arvif->vdev_id, ret); 1140 return ret; 1141 } 1142 1143 return 0; 1144 } 1145 1146 void ath12k_mac_peer_cleanup_all(struct ath12k *ar) 1147 { 1148 struct ath12k_peer *peer, *tmp; 1149 struct ath12k_base *ab = ar->ab; 1150 1151 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 1152 1153 spin_lock_bh(&ab->base_lock); 1154 list_for_each_entry_safe(peer, tmp, &ab->peers, list) { 1155 /* Skip Rx TID cleanup for self peer */ 1156 if (peer->sta) 1157 ath12k_dp_rx_peer_tid_cleanup(ar, peer); 1158 1159 list_del(&peer->list); 1160 kfree(peer); 1161 } 1162 spin_unlock_bh(&ab->base_lock); 1163 1164 ar->num_peers = 0; 1165 ar->num_stations = 0; 1166 } 1167 1168 static int ath12k_mac_vdev_setup_sync(struct ath12k *ar) 1169 { 1170 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 1171 1172 if (test_bit(ATH12K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags)) 1173 return -ESHUTDOWN; 1174 1175 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "vdev setup timeout %d\n", 1176 ATH12K_VDEV_SETUP_TIMEOUT_HZ); 1177 1178 if (!wait_for_completion_timeout(&ar->vdev_setup_done, 1179 ATH12K_VDEV_SETUP_TIMEOUT_HZ)) 1180 return -ETIMEDOUT; 1181 1182 return ar->last_wmi_vdev_start_status ? -EINVAL : 0; 1183 } 1184 1185 static int ath12k_monitor_vdev_up(struct ath12k *ar, int vdev_id) 1186 { 1187 struct ath12k_wmi_vdev_up_params params = {}; 1188 int ret; 1189 1190 params.vdev_id = vdev_id; 1191 params.bssid = ar->mac_addr; 1192 ret = ath12k_wmi_vdev_up(ar, ¶ms); 1193 if (ret) { 1194 ath12k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n", 1195 vdev_id, ret); 1196 return ret; 1197 } 1198 1199 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %i started\n", 1200 vdev_id); 1201 return 0; 1202 } 1203 1204 static int ath12k_mac_monitor_vdev_start(struct ath12k *ar, int vdev_id, 1205 struct cfg80211_chan_def *chandef) 1206 { 1207 struct ieee80211_channel *channel; 1208 struct wmi_vdev_start_req_arg arg = {}; 1209 struct ath12k_wmi_vdev_up_params params = {}; 1210 int ret; 1211 1212 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 1213 1214 channel = chandef->chan; 1215 arg.vdev_id = vdev_id; 1216 arg.freq = channel->center_freq; 1217 arg.band_center_freq1 = chandef->center_freq1; 1218 arg.band_center_freq2 = chandef->center_freq2; 1219 arg.mode = ath12k_phymodes[chandef->chan->band][chandef->width]; 1220 arg.chan_radar = !!(channel->flags & IEEE80211_CHAN_RADAR); 1221 1222 arg.min_power = 0; 1223 arg.max_power = channel->max_power; 1224 arg.max_reg_power = channel->max_reg_power; 1225 arg.max_antenna_gain = channel->max_antenna_gain; 1226 1227 arg.pref_tx_streams = ar->num_tx_chains; 1228 arg.pref_rx_streams = ar->num_rx_chains; 1229 arg.punct_bitmap = 0xFFFFFFFF; 1230 1231 arg.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR); 1232 1233 reinit_completion(&ar->vdev_setup_done); 1234 reinit_completion(&ar->vdev_delete_done); 1235 1236 ret = ath12k_wmi_vdev_start(ar, &arg, false); 1237 if (ret) { 1238 ath12k_warn(ar->ab, "failed to request monitor vdev %i start: %d\n", 1239 vdev_id, ret); 1240 return ret; 1241 } 1242 1243 ret = ath12k_mac_vdev_setup_sync(ar); 1244 if (ret) { 1245 ath12k_warn(ar->ab, "failed to synchronize setup for monitor vdev %i start: %d\n", 1246 vdev_id, ret); 1247 return ret; 1248 } 1249 1250 params.vdev_id = vdev_id; 1251 params.bssid = ar->mac_addr; 1252 ret = ath12k_wmi_vdev_up(ar, ¶ms); 1253 if (ret) { 1254 ath12k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n", 1255 vdev_id, ret); 1256 goto vdev_stop; 1257 } 1258 1259 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %i started\n", 1260 vdev_id); 1261 return 0; 1262 1263 vdev_stop: 1264 ret = ath12k_wmi_vdev_stop(ar, vdev_id); 1265 if (ret) 1266 ath12k_warn(ar->ab, "failed to stop monitor vdev %i after start failure: %d\n", 1267 vdev_id, ret); 1268 return ret; 1269 } 1270 1271 static int ath12k_mac_monitor_vdev_stop(struct ath12k *ar) 1272 { 1273 int ret; 1274 1275 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 1276 1277 reinit_completion(&ar->vdev_setup_done); 1278 1279 ret = ath12k_wmi_vdev_stop(ar, ar->monitor_vdev_id); 1280 if (ret) 1281 ath12k_warn(ar->ab, "failed to request monitor vdev %i stop: %d\n", 1282 ar->monitor_vdev_id, ret); 1283 1284 ret = ath12k_mac_vdev_setup_sync(ar); 1285 if (ret) 1286 ath12k_warn(ar->ab, "failed to synchronize monitor vdev %i stop: %d\n", 1287 ar->monitor_vdev_id, ret); 1288 1289 ret = ath12k_wmi_vdev_down(ar, ar->monitor_vdev_id); 1290 if (ret) 1291 ath12k_warn(ar->ab, "failed to put down monitor vdev %i: %d\n", 1292 ar->monitor_vdev_id, ret); 1293 1294 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %i stopped\n", 1295 ar->monitor_vdev_id); 1296 return ret; 1297 } 1298 1299 static int ath12k_mac_monitor_vdev_delete(struct ath12k *ar) 1300 { 1301 int ret; 1302 unsigned long time_left; 1303 1304 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 1305 1306 if (!ar->monitor_vdev_created) 1307 return 0; 1308 1309 reinit_completion(&ar->vdev_delete_done); 1310 1311 ret = ath12k_wmi_vdev_delete(ar, ar->monitor_vdev_id); 1312 if (ret) { 1313 ath12k_warn(ar->ab, "failed to request wmi monitor vdev %i removal: %d\n", 1314 ar->monitor_vdev_id, ret); 1315 return ret; 1316 } 1317 1318 time_left = wait_for_completion_timeout(&ar->vdev_delete_done, 1319 ATH12K_VDEV_DELETE_TIMEOUT_HZ); 1320 if (time_left == 0) { 1321 ath12k_warn(ar->ab, "Timeout in receiving vdev delete response\n"); 1322 } else { 1323 ar->allocated_vdev_map &= ~(1LL << ar->monitor_vdev_id); 1324 ar->ab->free_vdev_map |= 1LL << (ar->monitor_vdev_id); 1325 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %d deleted\n", 1326 ar->monitor_vdev_id); 1327 ar->num_created_vdevs--; 1328 ar->monitor_vdev_id = -1; 1329 ar->monitor_vdev_created = false; 1330 } 1331 1332 return ret; 1333 } 1334 1335 static int ath12k_mac_monitor_start(struct ath12k *ar) 1336 { 1337 struct ath12k_mac_get_any_chanctx_conf_arg arg; 1338 int ret; 1339 1340 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 1341 1342 if (ar->monitor_started) 1343 return 0; 1344 1345 arg.ar = ar; 1346 arg.chanctx_conf = NULL; 1347 ieee80211_iter_chan_contexts_atomic(ath12k_ar_to_hw(ar), 1348 ath12k_mac_get_any_chanctx_conf_iter, 1349 &arg); 1350 if (!arg.chanctx_conf) 1351 return 0; 1352 1353 ret = ath12k_mac_monitor_vdev_start(ar, ar->monitor_vdev_id, 1354 &arg.chanctx_conf->def); 1355 if (ret) { 1356 ath12k_warn(ar->ab, "failed to start monitor vdev: %d\n", ret); 1357 return ret; 1358 } 1359 1360 ret = ath12k_dp_tx_htt_monitor_mode_ring_config(ar, false); 1361 if (ret) { 1362 ath12k_warn(ar->ab, "fail to set monitor filter: %d\n", ret); 1363 return ret; 1364 } 1365 1366 ar->monitor_started = true; 1367 ar->num_started_vdevs++; 1368 1369 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor started\n"); 1370 1371 return 0; 1372 } 1373 1374 static int ath12k_mac_monitor_stop(struct ath12k *ar) 1375 { 1376 int ret; 1377 1378 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 1379 1380 if (!ar->monitor_started) 1381 return 0; 1382 1383 ret = ath12k_mac_monitor_vdev_stop(ar); 1384 if (ret) { 1385 ath12k_warn(ar->ab, "failed to stop monitor vdev: %d\n", ret); 1386 return ret; 1387 } 1388 1389 ar->monitor_started = false; 1390 ar->num_started_vdevs--; 1391 ret = ath12k_dp_tx_htt_monitor_mode_ring_config(ar, true); 1392 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor stopped ret %d\n", ret); 1393 return ret; 1394 } 1395 1396 int ath12k_mac_vdev_stop(struct ath12k_link_vif *arvif) 1397 { 1398 struct ath12k_vif *ahvif = arvif->ahvif; 1399 struct ath12k *ar = arvif->ar; 1400 int ret; 1401 1402 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 1403 1404 reinit_completion(&ar->vdev_setup_done); 1405 1406 ret = ath12k_wmi_vdev_stop(ar, arvif->vdev_id); 1407 if (ret) { 1408 ath12k_warn(ar->ab, "failed to stop WMI vdev %i: %d\n", 1409 arvif->vdev_id, ret); 1410 goto err; 1411 } 1412 1413 ret = ath12k_mac_vdev_setup_sync(ar); 1414 if (ret) { 1415 ath12k_warn(ar->ab, "failed to synchronize setup for vdev %i: %d\n", 1416 arvif->vdev_id, ret); 1417 goto err; 1418 } 1419 1420 WARN_ON(ar->num_started_vdevs == 0); 1421 1422 ar->num_started_vdevs--; 1423 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "vdev %pM stopped, vdev_id %d\n", 1424 ahvif->vif->addr, arvif->vdev_id); 1425 1426 if (test_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags)) { 1427 clear_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags); 1428 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "CAC Stopped for vdev %d\n", 1429 arvif->vdev_id); 1430 } 1431 1432 return 0; 1433 err: 1434 return ret; 1435 } 1436 1437 static int ath12k_mac_op_config(struct ieee80211_hw *hw, int radio_idx, u32 changed) 1438 { 1439 return 0; 1440 } 1441 1442 static int ath12k_mac_setup_bcn_p2p_ie(struct ath12k_link_vif *arvif, 1443 struct sk_buff *bcn) 1444 { 1445 struct ath12k *ar = arvif->ar; 1446 struct ieee80211_mgmt *mgmt; 1447 const u8 *p2p_ie; 1448 int ret; 1449 1450 mgmt = (void *)bcn->data; 1451 p2p_ie = cfg80211_find_vendor_ie(WLAN_OUI_WFA, WLAN_OUI_TYPE_WFA_P2P, 1452 mgmt->u.beacon.variable, 1453 bcn->len - (mgmt->u.beacon.variable - 1454 bcn->data)); 1455 if (!p2p_ie) { 1456 ath12k_warn(ar->ab, "no P2P ie found in beacon\n"); 1457 return -ENOENT; 1458 } 1459 1460 ret = ath12k_wmi_p2p_go_bcn_ie(ar, arvif->vdev_id, p2p_ie); 1461 if (ret) { 1462 ath12k_warn(ar->ab, "failed to submit P2P GO bcn ie for vdev %i: %d\n", 1463 arvif->vdev_id, ret); 1464 return ret; 1465 } 1466 1467 return 0; 1468 } 1469 1470 static int ath12k_mac_remove_vendor_ie(struct sk_buff *skb, unsigned int oui, 1471 u8 oui_type, size_t ie_offset) 1472 { 1473 const u8 *next, *end; 1474 size_t len; 1475 u8 *ie; 1476 1477 if (WARN_ON(skb->len < ie_offset)) 1478 return -EINVAL; 1479 1480 ie = (u8 *)cfg80211_find_vendor_ie(oui, oui_type, 1481 skb->data + ie_offset, 1482 skb->len - ie_offset); 1483 if (!ie) 1484 return -ENOENT; 1485 1486 len = ie[1] + 2; 1487 end = skb->data + skb->len; 1488 next = ie + len; 1489 1490 if (WARN_ON(next > end)) 1491 return -EINVAL; 1492 1493 memmove(ie, next, end - next); 1494 skb_trim(skb, skb->len - len); 1495 1496 return 0; 1497 } 1498 1499 static void ath12k_mac_set_arvif_ies(struct ath12k_link_vif *arvif, 1500 struct ath12k_link_vif *tx_arvif, 1501 struct sk_buff *bcn, 1502 u8 bssid_index, bool *nontx_profile_found) 1503 { 1504 struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)bcn->data; 1505 const struct element *elem, *nontx, *index, *nie, *ext_cap_ie; 1506 const u8 *start, *tail; 1507 u16 rem_len; 1508 u8 i; 1509 1510 start = bcn->data + ieee80211_get_hdrlen_from_skb(bcn) + sizeof(mgmt->u.beacon); 1511 tail = skb_tail_pointer(bcn); 1512 rem_len = tail - start; 1513 1514 arvif->rsnie_present = false; 1515 arvif->wpaie_present = false; 1516 1517 if (cfg80211_find_ie(WLAN_EID_RSN, start, rem_len)) 1518 arvif->rsnie_present = true; 1519 if (cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT, WLAN_OUI_TYPE_MICROSOFT_WPA, 1520 start, rem_len)) 1521 arvif->wpaie_present = true; 1522 1523 ext_cap_ie = cfg80211_find_elem(WLAN_EID_EXT_CAPABILITY, start, rem_len); 1524 if (ext_cap_ie && ext_cap_ie->datalen >= 11 && 1525 (ext_cap_ie->data[10] & WLAN_EXT_CAPA11_BCN_PROTECT)) 1526 tx_arvif->beacon_prot = true; 1527 1528 /* Return from here for the transmitted profile */ 1529 if (!bssid_index) 1530 return; 1531 1532 /* Initial rsnie_present for the nontransmitted profile is set to be same as that 1533 * of the transmitted profile. It will be changed if security configurations are 1534 * different. 1535 */ 1536 *nontx_profile_found = false; 1537 for_each_element_id(elem, WLAN_EID_MULTIPLE_BSSID, start, rem_len) { 1538 /* Fixed minimum MBSSID element length with at least one 1539 * nontransmitted BSSID profile is 12 bytes as given below; 1540 * 1 (max BSSID indicator) + 1541 * 2 (Nontransmitted BSSID profile: Subelement ID + length) + 1542 * 4 (Nontransmitted BSSID Capabilities: tag + length + info) 1543 * 2 (Nontransmitted BSSID SSID: tag + length) 1544 * 3 (Nontransmitted BSSID Index: tag + length + BSSID index 1545 */ 1546 if (elem->datalen < 12 || elem->data[0] < 1) 1547 continue; /* Max BSSID indicator must be >=1 */ 1548 1549 for_each_element(nontx, elem->data + 1, elem->datalen - 1) { 1550 start = nontx->data; 1551 1552 if (nontx->id != 0 || nontx->datalen < 4) 1553 continue; /* Invalid nontransmitted profile */ 1554 1555 if (nontx->data[0] != WLAN_EID_NON_TX_BSSID_CAP || 1556 nontx->data[1] != 2) { 1557 continue; /* Missing nontransmitted BSS capabilities */ 1558 } 1559 1560 if (nontx->data[4] != WLAN_EID_SSID) 1561 continue; /* Missing SSID for nontransmitted BSS */ 1562 1563 index = cfg80211_find_elem(WLAN_EID_MULTI_BSSID_IDX, 1564 start, nontx->datalen); 1565 if (!index || index->datalen < 1 || index->data[0] == 0) 1566 continue; /* Invalid MBSSID Index element */ 1567 1568 if (index->data[0] == bssid_index) { 1569 *nontx_profile_found = true; 1570 1571 /* Check if nontx BSS has beacon protection enabled */ 1572 if (!tx_arvif->beacon_prot) { 1573 ext_cap_ie = 1574 cfg80211_find_elem(WLAN_EID_EXT_CAPABILITY, 1575 nontx->data, 1576 nontx->datalen); 1577 if (ext_cap_ie && ext_cap_ie->datalen >= 11 && 1578 (ext_cap_ie->data[10] & 1579 WLAN_EXT_CAPA11_BCN_PROTECT)) 1580 tx_arvif->beacon_prot = true; 1581 } 1582 1583 if (cfg80211_find_ie(WLAN_EID_RSN, 1584 nontx->data, 1585 nontx->datalen)) { 1586 arvif->rsnie_present = true; 1587 return; 1588 } else if (!arvif->rsnie_present) { 1589 return; /* Both tx and nontx BSS are open */ 1590 } 1591 1592 nie = cfg80211_find_ext_elem(WLAN_EID_EXT_NON_INHERITANCE, 1593 nontx->data, 1594 nontx->datalen); 1595 if (!nie || nie->datalen < 2) 1596 return; /* Invalid non-inheritance element */ 1597 1598 for (i = 1; i < nie->datalen - 1; i++) { 1599 if (nie->data[i] == WLAN_EID_RSN) { 1600 arvif->rsnie_present = false; 1601 break; 1602 } 1603 } 1604 1605 return; 1606 } 1607 } 1608 } 1609 } 1610 1611 static int ath12k_mac_setup_bcn_tmpl_ema(struct ath12k_link_vif *arvif, 1612 struct ath12k_link_vif *tx_arvif, 1613 u8 bssid_index) 1614 { 1615 struct ath12k_wmi_bcn_tmpl_ema_arg ema_args; 1616 struct ieee80211_ema_beacons *beacons; 1617 bool nontx_profile_found = false; 1618 int ret = 0; 1619 u8 i; 1620 1621 beacons = ieee80211_beacon_get_template_ema_list(ath12k_ar_to_hw(tx_arvif->ar), 1622 tx_arvif->ahvif->vif, 1623 tx_arvif->link_id); 1624 if (!beacons || !beacons->cnt) { 1625 ath12k_warn(arvif->ar->ab, 1626 "failed to get ema beacon templates from mac80211\n"); 1627 return -EPERM; 1628 } 1629 1630 if (tx_arvif == arvif) 1631 ath12k_mac_set_arvif_ies(arvif, tx_arvif, beacons->bcn[0].skb, 0, NULL); 1632 1633 for (i = 0; i < beacons->cnt; i++) { 1634 if (tx_arvif != arvif && !nontx_profile_found) 1635 ath12k_mac_set_arvif_ies(arvif, tx_arvif, beacons->bcn[i].skb, 1636 bssid_index, 1637 &nontx_profile_found); 1638 1639 ema_args.bcn_cnt = beacons->cnt; 1640 ema_args.bcn_index = i; 1641 ret = ath12k_wmi_bcn_tmpl(tx_arvif, &beacons->bcn[i].offs, 1642 beacons->bcn[i].skb, &ema_args); 1643 if (ret) { 1644 ath12k_warn(tx_arvif->ar->ab, 1645 "failed to set ema beacon template id %i error %d\n", 1646 i, ret); 1647 break; 1648 } 1649 } 1650 1651 if (tx_arvif != arvif && !nontx_profile_found) 1652 ath12k_warn(arvif->ar->ab, 1653 "nontransmitted bssid index %u not found in beacon template\n", 1654 bssid_index); 1655 1656 ieee80211_beacon_free_ema_list(beacons); 1657 return ret; 1658 } 1659 1660 static int ath12k_mac_setup_bcn_tmpl(struct ath12k_link_vif *arvif) 1661 { 1662 struct ath12k_vif *ahvif = arvif->ahvif; 1663 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif); 1664 struct ieee80211_bss_conf *link_conf; 1665 struct ath12k_link_vif *tx_arvif; 1666 struct ath12k *ar = arvif->ar; 1667 struct ath12k_base *ab = ar->ab; 1668 struct ieee80211_mutable_offsets offs = {}; 1669 bool nontx_profile_found = false; 1670 struct sk_buff *bcn; 1671 int ret; 1672 1673 if (ahvif->vdev_type != WMI_VDEV_TYPE_AP) 1674 return 0; 1675 1676 link_conf = ath12k_mac_get_link_bss_conf(arvif); 1677 if (!link_conf) { 1678 ath12k_warn(ar->ab, "unable to access bss link conf to set bcn tmpl for vif %pM link %u\n", 1679 vif->addr, arvif->link_id); 1680 return -ENOLINK; 1681 } 1682 1683 tx_arvif = ath12k_mac_get_tx_arvif(arvif, link_conf); 1684 if (tx_arvif) { 1685 if (tx_arvif != arvif && arvif->is_up) 1686 return 0; 1687 1688 if (link_conf->ema_ap) 1689 return ath12k_mac_setup_bcn_tmpl_ema(arvif, tx_arvif, 1690 link_conf->bssid_index); 1691 } else { 1692 tx_arvif = arvif; 1693 } 1694 1695 bcn = ieee80211_beacon_get_template(ath12k_ar_to_hw(tx_arvif->ar), 1696 tx_arvif->ahvif->vif, 1697 &offs, tx_arvif->link_id); 1698 if (!bcn) { 1699 ath12k_warn(ab, "failed to get beacon template from mac80211\n"); 1700 return -EPERM; 1701 } 1702 1703 if (tx_arvif == arvif) { 1704 ath12k_mac_set_arvif_ies(arvif, tx_arvif, bcn, 0, NULL); 1705 } else { 1706 ath12k_mac_set_arvif_ies(arvif, tx_arvif, bcn, 1707 link_conf->bssid_index, 1708 &nontx_profile_found); 1709 if (!nontx_profile_found) 1710 ath12k_warn(ab, 1711 "nontransmitted profile not found in beacon template\n"); 1712 } 1713 1714 if (ahvif->vif->type == NL80211_IFTYPE_AP && ahvif->vif->p2p) { 1715 ret = ath12k_mac_setup_bcn_p2p_ie(arvif, bcn); 1716 if (ret) { 1717 ath12k_warn(ab, "failed to setup P2P GO bcn ie: %d\n", 1718 ret); 1719 goto free_bcn_skb; 1720 } 1721 1722 /* P2P IE is inserted by firmware automatically (as 1723 * configured above) so remove it from the base beacon 1724 * template to avoid duplicate P2P IEs in beacon frames. 1725 */ 1726 ret = ath12k_mac_remove_vendor_ie(bcn, WLAN_OUI_WFA, 1727 WLAN_OUI_TYPE_WFA_P2P, 1728 offsetof(struct ieee80211_mgmt, 1729 u.beacon.variable)); 1730 if (ret) { 1731 ath12k_warn(ab, "failed to remove P2P vendor ie: %d\n", 1732 ret); 1733 goto free_bcn_skb; 1734 } 1735 } 1736 1737 ret = ath12k_wmi_bcn_tmpl(arvif, &offs, bcn, NULL); 1738 1739 if (ret) 1740 ath12k_warn(ab, "failed to submit beacon template command: %d\n", 1741 ret); 1742 1743 free_bcn_skb: 1744 kfree_skb(bcn); 1745 return ret; 1746 } 1747 1748 static void ath12k_control_beaconing(struct ath12k_link_vif *arvif, 1749 struct ieee80211_bss_conf *info) 1750 { 1751 struct ath12k_wmi_vdev_up_params params = {}; 1752 struct ath12k_vif *ahvif = arvif->ahvif; 1753 struct ath12k *ar = arvif->ar; 1754 int ret; 1755 1756 lockdep_assert_wiphy(ath12k_ar_to_hw(arvif->ar)->wiphy); 1757 1758 if (!info->enable_beacon) { 1759 ret = ath12k_wmi_vdev_down(ar, arvif->vdev_id); 1760 if (ret) 1761 ath12k_warn(ar->ab, "failed to down vdev_id %i: %d\n", 1762 arvif->vdev_id, ret); 1763 1764 arvif->is_up = false; 1765 return; 1766 } 1767 1768 /* Install the beacon template to the FW */ 1769 ret = ath12k_mac_setup_bcn_tmpl(arvif); 1770 if (ret) { 1771 ath12k_warn(ar->ab, "failed to update bcn tmpl during vdev up: %d\n", 1772 ret); 1773 return; 1774 } 1775 1776 ahvif->aid = 0; 1777 1778 ether_addr_copy(arvif->bssid, info->addr); 1779 1780 params.vdev_id = arvif->vdev_id; 1781 params.aid = ahvif->aid; 1782 params.bssid = arvif->bssid; 1783 params.tx_bssid = ath12k_mac_get_tx_bssid(arvif); 1784 if (params.tx_bssid) { 1785 params.nontx_profile_idx = info->bssid_index; 1786 params.nontx_profile_cnt = 1 << info->bssid_indicator; 1787 } 1788 ret = ath12k_wmi_vdev_up(arvif->ar, ¶ms); 1789 if (ret) { 1790 ath12k_warn(ar->ab, "failed to bring up vdev %d: %i\n", 1791 arvif->vdev_id, ret); 1792 return; 1793 } 1794 1795 arvif->is_up = true; 1796 1797 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id); 1798 } 1799 1800 static void ath12k_mac_handle_beacon_iter(void *data, u8 *mac, 1801 struct ieee80211_vif *vif) 1802 { 1803 struct sk_buff *skb = data; 1804 struct ieee80211_mgmt *mgmt = (void *)skb->data; 1805 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 1806 struct ath12k_link_vif *arvif = &ahvif->deflink; 1807 1808 if (vif->type != NL80211_IFTYPE_STATION || !arvif->is_created) 1809 return; 1810 1811 if (!ether_addr_equal(mgmt->bssid, vif->bss_conf.bssid)) 1812 return; 1813 1814 cancel_delayed_work(&arvif->connection_loss_work); 1815 } 1816 1817 void ath12k_mac_handle_beacon(struct ath12k *ar, struct sk_buff *skb) 1818 { 1819 ieee80211_iterate_active_interfaces_atomic(ath12k_ar_to_hw(ar), 1820 IEEE80211_IFACE_ITER_NORMAL, 1821 ath12k_mac_handle_beacon_iter, 1822 skb); 1823 } 1824 1825 static void ath12k_mac_handle_beacon_miss_iter(void *data, u8 *mac, 1826 struct ieee80211_vif *vif) 1827 { 1828 u32 *vdev_id = data; 1829 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 1830 struct ath12k_link_vif *arvif = &ahvif->deflink; 1831 struct ieee80211_hw *hw; 1832 1833 if (!arvif->is_created || arvif->vdev_id != *vdev_id) 1834 return; 1835 1836 if (!arvif->is_up) 1837 return; 1838 1839 ieee80211_beacon_loss(vif); 1840 hw = ath12k_ar_to_hw(arvif->ar); 1841 1842 /* Firmware doesn't report beacon loss events repeatedly. If AP probe 1843 * (done by mac80211) succeeds but beacons do not resume then it 1844 * doesn't make sense to continue operation. Queue connection loss work 1845 * which can be cancelled when beacon is received. 1846 */ 1847 ieee80211_queue_delayed_work(hw, &arvif->connection_loss_work, 1848 ATH12K_CONNECTION_LOSS_HZ); 1849 } 1850 1851 void ath12k_mac_handle_beacon_miss(struct ath12k *ar, u32 vdev_id) 1852 { 1853 ieee80211_iterate_active_interfaces_atomic(ath12k_ar_to_hw(ar), 1854 IEEE80211_IFACE_ITER_NORMAL, 1855 ath12k_mac_handle_beacon_miss_iter, 1856 &vdev_id); 1857 } 1858 1859 static void ath12k_mac_vif_sta_connection_loss_work(struct work_struct *work) 1860 { 1861 struct ath12k_link_vif *arvif = container_of(work, struct ath12k_link_vif, 1862 connection_loss_work.work); 1863 struct ieee80211_vif *vif = arvif->ahvif->vif; 1864 1865 if (!arvif->is_up) 1866 return; 1867 1868 ieee80211_connection_loss(vif); 1869 } 1870 1871 static void ath12k_peer_assoc_h_basic(struct ath12k *ar, 1872 struct ath12k_link_vif *arvif, 1873 struct ath12k_link_sta *arsta, 1874 struct ath12k_wmi_peer_assoc_arg *arg) 1875 { 1876 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 1877 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 1878 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar); 1879 struct ieee80211_bss_conf *bss_conf; 1880 u32 aid; 1881 1882 lockdep_assert_wiphy(hw->wiphy); 1883 1884 if (vif->type == NL80211_IFTYPE_STATION) 1885 aid = vif->cfg.aid; 1886 else 1887 aid = sta->aid; 1888 1889 ether_addr_copy(arg->peer_mac, arsta->addr); 1890 arg->vdev_id = arvif->vdev_id; 1891 arg->peer_associd = aid; 1892 arg->auth_flag = true; 1893 /* TODO: STA WAR in ath10k for listen interval required? */ 1894 arg->peer_listen_intval = hw->conf.listen_interval; 1895 arg->peer_nss = 1; 1896 1897 bss_conf = ath12k_mac_get_link_bss_conf(arvif); 1898 if (!bss_conf) { 1899 ath12k_warn(ar->ab, "unable to access bss link conf in peer assoc for vif %pM link %u\n", 1900 vif->addr, arvif->link_id); 1901 return; 1902 } 1903 1904 arg->peer_caps = bss_conf->assoc_capability; 1905 } 1906 1907 static void ath12k_peer_assoc_h_crypto(struct ath12k *ar, 1908 struct ath12k_link_vif *arvif, 1909 struct ath12k_link_sta *arsta, 1910 struct ath12k_wmi_peer_assoc_arg *arg) 1911 { 1912 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 1913 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 1914 struct ieee80211_bss_conf *info; 1915 struct cfg80211_chan_def def; 1916 struct cfg80211_bss *bss; 1917 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar); 1918 const u8 *rsnie = NULL; 1919 const u8 *wpaie = NULL; 1920 1921 lockdep_assert_wiphy(hw->wiphy); 1922 1923 info = ath12k_mac_get_link_bss_conf(arvif); 1924 if (!info) { 1925 ath12k_warn(ar->ab, "unable to access bss link conf for peer assoc crypto for vif %pM link %u\n", 1926 vif->addr, arvif->link_id); 1927 return; 1928 } 1929 1930 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) 1931 return; 1932 1933 bss = cfg80211_get_bss(hw->wiphy, def.chan, info->bssid, NULL, 0, 1934 IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY); 1935 1936 if (arvif->rsnie_present || arvif->wpaie_present) { 1937 arg->need_ptk_4_way = true; 1938 if (arvif->wpaie_present) 1939 arg->need_gtk_2_way = true; 1940 } else if (bss) { 1941 const struct cfg80211_bss_ies *ies; 1942 1943 rcu_read_lock(); 1944 rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN); 1945 1946 ies = rcu_dereference(bss->ies); 1947 1948 wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT, 1949 WLAN_OUI_TYPE_MICROSOFT_WPA, 1950 ies->data, 1951 ies->len); 1952 rcu_read_unlock(); 1953 cfg80211_put_bss(hw->wiphy, bss); 1954 } 1955 1956 /* FIXME: base on RSN IE/WPA IE is a correct idea? */ 1957 if (rsnie || wpaie) { 1958 ath12k_dbg(ar->ab, ATH12K_DBG_WMI, 1959 "%s: rsn ie found\n", __func__); 1960 arg->need_ptk_4_way = true; 1961 } 1962 1963 if (wpaie) { 1964 ath12k_dbg(ar->ab, ATH12K_DBG_WMI, 1965 "%s: wpa ie found\n", __func__); 1966 arg->need_gtk_2_way = true; 1967 } 1968 1969 if (sta->mfp) { 1970 /* TODO: Need to check if FW supports PMF? */ 1971 arg->is_pmf_enabled = true; 1972 } 1973 1974 /* TODO: safe_mode_enabled (bypass 4-way handshake) flag req? */ 1975 } 1976 1977 static void ath12k_peer_assoc_h_rates(struct ath12k *ar, 1978 struct ath12k_link_vif *arvif, 1979 struct ath12k_link_sta *arsta, 1980 struct ath12k_wmi_peer_assoc_arg *arg) 1981 { 1982 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 1983 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 1984 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates; 1985 struct ieee80211_link_sta *link_sta; 1986 struct cfg80211_chan_def def; 1987 const struct ieee80211_supported_band *sband; 1988 const struct ieee80211_rate *rates; 1989 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar); 1990 enum nl80211_band band; 1991 u32 ratemask; 1992 u8 rate; 1993 int i; 1994 1995 lockdep_assert_wiphy(hw->wiphy); 1996 1997 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) 1998 return; 1999 2000 link_sta = ath12k_mac_get_link_sta(arsta); 2001 if (!link_sta) { 2002 ath12k_warn(ar->ab, "unable to access link sta in peer assoc rates for sta %pM link %u\n", 2003 sta->addr, arsta->link_id); 2004 return; 2005 } 2006 2007 band = def.chan->band; 2008 sband = hw->wiphy->bands[band]; 2009 ratemask = link_sta->supp_rates[band]; 2010 ratemask &= arvif->bitrate_mask.control[band].legacy; 2011 rates = sband->bitrates; 2012 2013 rateset->num_rates = 0; 2014 2015 for (i = 0; i < 32; i++, ratemask >>= 1, rates++) { 2016 if (!(ratemask & 1)) 2017 continue; 2018 2019 rate = ath12k_mac_bitrate_to_rate(rates->bitrate); 2020 rateset->rates[rateset->num_rates] = rate; 2021 rateset->num_rates++; 2022 } 2023 } 2024 2025 static bool 2026 ath12k_peer_assoc_h_ht_masked(const u8 *ht_mcs_mask) 2027 { 2028 int nss; 2029 2030 for (nss = 0; nss < IEEE80211_HT_MCS_MASK_LEN; nss++) 2031 if (ht_mcs_mask[nss]) 2032 return false; 2033 2034 return true; 2035 } 2036 2037 static bool 2038 ath12k_peer_assoc_h_vht_masked(const u16 *vht_mcs_mask) 2039 { 2040 int nss; 2041 2042 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) 2043 if (vht_mcs_mask[nss]) 2044 return false; 2045 2046 return true; 2047 } 2048 2049 static void ath12k_peer_assoc_h_ht(struct ath12k *ar, 2050 struct ath12k_link_vif *arvif, 2051 struct ath12k_link_sta *arsta, 2052 struct ath12k_wmi_peer_assoc_arg *arg) 2053 { 2054 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 2055 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 2056 const struct ieee80211_sta_ht_cap *ht_cap; 2057 struct ieee80211_link_sta *link_sta; 2058 struct cfg80211_chan_def def; 2059 enum nl80211_band band; 2060 const u8 *ht_mcs_mask; 2061 int i, n; 2062 u8 max_nss; 2063 u32 stbc; 2064 2065 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 2066 2067 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) 2068 return; 2069 2070 link_sta = ath12k_mac_get_link_sta(arsta); 2071 if (!link_sta) { 2072 ath12k_warn(ar->ab, "unable to access link sta in peer assoc ht for sta %pM link %u\n", 2073 sta->addr, arsta->link_id); 2074 return; 2075 } 2076 2077 ht_cap = &link_sta->ht_cap; 2078 if (!ht_cap->ht_supported) 2079 return; 2080 2081 band = def.chan->band; 2082 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs; 2083 2084 if (ath12k_peer_assoc_h_ht_masked(ht_mcs_mask)) 2085 return; 2086 2087 arg->ht_flag = true; 2088 2089 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR + 2090 ht_cap->ampdu_factor)) - 1; 2091 2092 arg->peer_mpdu_density = 2093 ath12k_parse_mpdudensity(ht_cap->ampdu_density); 2094 2095 arg->peer_ht_caps = ht_cap->cap; 2096 arg->peer_rate_caps |= WMI_HOST_RC_HT_FLAG; 2097 2098 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING) 2099 arg->ldpc_flag = true; 2100 2101 if (link_sta->bandwidth >= IEEE80211_STA_RX_BW_40) { 2102 arg->bw_40 = true; 2103 arg->peer_rate_caps |= WMI_HOST_RC_CW40_FLAG; 2104 } 2105 2106 /* As firmware handles these two flags (IEEE80211_HT_CAP_SGI_20 2107 * and IEEE80211_HT_CAP_SGI_40) for enabling SGI, reset both 2108 * flags if guard interval is to force Long GI 2109 */ 2110 if (arvif->bitrate_mask.control[band].gi == NL80211_TXRATE_FORCE_LGI) { 2111 arg->peer_ht_caps &= ~(IEEE80211_HT_CAP_SGI_20 | IEEE80211_HT_CAP_SGI_40); 2112 } else { 2113 /* Enable SGI flag if either SGI_20 or SGI_40 is supported */ 2114 if (ht_cap->cap & (IEEE80211_HT_CAP_SGI_20 | IEEE80211_HT_CAP_SGI_40)) 2115 arg->peer_rate_caps |= WMI_HOST_RC_SGI_FLAG; 2116 } 2117 2118 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) { 2119 arg->peer_rate_caps |= WMI_HOST_RC_TX_STBC_FLAG; 2120 arg->stbc_flag = true; 2121 } 2122 2123 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) { 2124 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC; 2125 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT; 2126 stbc = stbc << WMI_HOST_RC_RX_STBC_FLAG_S; 2127 arg->peer_rate_caps |= stbc; 2128 arg->stbc_flag = true; 2129 } 2130 2131 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2]) 2132 arg->peer_rate_caps |= WMI_HOST_RC_TS_FLAG; 2133 else if (ht_cap->mcs.rx_mask[1]) 2134 arg->peer_rate_caps |= WMI_HOST_RC_DS_FLAG; 2135 2136 for (i = 0, n = 0, max_nss = 0; i < IEEE80211_HT_MCS_MASK_LEN * 8; i++) 2137 if ((ht_cap->mcs.rx_mask[i / 8] & BIT(i % 8)) && 2138 (ht_mcs_mask[i / 8] & BIT(i % 8))) { 2139 max_nss = (i / 8) + 1; 2140 arg->peer_ht_rates.rates[n++] = i; 2141 } 2142 2143 /* This is a workaround for HT-enabled STAs which break the spec 2144 * and have no HT capabilities RX mask (no HT RX MCS map). 2145 * 2146 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS), 2147 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs. 2148 * 2149 * Firmware asserts if such situation occurs. 2150 */ 2151 if (n == 0) { 2152 arg->peer_ht_rates.num_rates = 8; 2153 for (i = 0; i < arg->peer_ht_rates.num_rates; i++) 2154 arg->peer_ht_rates.rates[i] = i; 2155 } else { 2156 arg->peer_ht_rates.num_rates = n; 2157 arg->peer_nss = min(link_sta->rx_nss, max_nss); 2158 } 2159 2160 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n", 2161 arg->peer_mac, 2162 arg->peer_ht_rates.num_rates, 2163 arg->peer_nss); 2164 } 2165 2166 static int ath12k_mac_get_max_vht_mcs_map(u16 mcs_map, int nss) 2167 { 2168 switch ((mcs_map >> (2 * nss)) & 0x3) { 2169 case IEEE80211_VHT_MCS_SUPPORT_0_7: return BIT(8) - 1; 2170 case IEEE80211_VHT_MCS_SUPPORT_0_8: return BIT(9) - 1; 2171 case IEEE80211_VHT_MCS_SUPPORT_0_9: return BIT(10) - 1; 2172 } 2173 return 0; 2174 } 2175 2176 static u16 2177 ath12k_peer_assoc_h_vht_limit(u16 tx_mcs_set, 2178 const u16 vht_mcs_limit[NL80211_VHT_NSS_MAX]) 2179 { 2180 int idx_limit; 2181 int nss; 2182 u16 mcs_map; 2183 u16 mcs; 2184 2185 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) { 2186 mcs_map = ath12k_mac_get_max_vht_mcs_map(tx_mcs_set, nss) & 2187 vht_mcs_limit[nss]; 2188 2189 if (mcs_map) 2190 idx_limit = fls(mcs_map) - 1; 2191 else 2192 idx_limit = -1; 2193 2194 switch (idx_limit) { 2195 case 0: 2196 case 1: 2197 case 2: 2198 case 3: 2199 case 4: 2200 case 5: 2201 case 6: 2202 case 7: 2203 mcs = IEEE80211_VHT_MCS_SUPPORT_0_7; 2204 break; 2205 case 8: 2206 mcs = IEEE80211_VHT_MCS_SUPPORT_0_8; 2207 break; 2208 case 9: 2209 mcs = IEEE80211_VHT_MCS_SUPPORT_0_9; 2210 break; 2211 default: 2212 WARN_ON(1); 2213 fallthrough; 2214 case -1: 2215 mcs = IEEE80211_VHT_MCS_NOT_SUPPORTED; 2216 break; 2217 } 2218 2219 tx_mcs_set &= ~(0x3 << (nss * 2)); 2220 tx_mcs_set |= mcs << (nss * 2); 2221 } 2222 2223 return tx_mcs_set; 2224 } 2225 2226 static u8 ath12k_get_nss_160mhz(struct ath12k *ar, 2227 u8 max_nss) 2228 { 2229 u8 nss_ratio_info = ar->pdev->cap.nss_ratio_info; 2230 u8 max_sup_nss = 0; 2231 2232 switch (nss_ratio_info) { 2233 case WMI_NSS_RATIO_1BY2_NSS: 2234 max_sup_nss = max_nss >> 1; 2235 break; 2236 case WMI_NSS_RATIO_3BY4_NSS: 2237 ath12k_warn(ar->ab, "WMI_NSS_RATIO_3BY4_NSS not supported\n"); 2238 break; 2239 case WMI_NSS_RATIO_1_NSS: 2240 max_sup_nss = max_nss; 2241 break; 2242 case WMI_NSS_RATIO_2_NSS: 2243 ath12k_warn(ar->ab, "WMI_NSS_RATIO_2_NSS not supported\n"); 2244 break; 2245 default: 2246 ath12k_warn(ar->ab, "invalid nss ratio received from fw: %d\n", 2247 nss_ratio_info); 2248 break; 2249 } 2250 2251 return max_sup_nss; 2252 } 2253 2254 static void ath12k_peer_assoc_h_vht(struct ath12k *ar, 2255 struct ath12k_link_vif *arvif, 2256 struct ath12k_link_sta *arsta, 2257 struct ath12k_wmi_peer_assoc_arg *arg) 2258 { 2259 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 2260 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 2261 const struct ieee80211_sta_vht_cap *vht_cap; 2262 struct ieee80211_link_sta *link_sta; 2263 struct cfg80211_chan_def def; 2264 enum nl80211_band band; 2265 u16 *vht_mcs_mask; 2266 u16 tx_mcs_map; 2267 u8 ampdu_factor; 2268 u8 max_nss, vht_mcs; 2269 int i, vht_nss, nss_idx; 2270 bool user_rate_valid = true; 2271 u32 rx_nss, tx_nss, nss_160; 2272 2273 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 2274 2275 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) 2276 return; 2277 2278 link_sta = ath12k_mac_get_link_sta(arsta); 2279 if (!link_sta) { 2280 ath12k_warn(ar->ab, "unable to access link sta in peer assoc vht for sta %pM link %u\n", 2281 sta->addr, arsta->link_id); 2282 return; 2283 } 2284 2285 vht_cap = &link_sta->vht_cap; 2286 if (!vht_cap->vht_supported) 2287 return; 2288 2289 band = def.chan->band; 2290 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs; 2291 2292 if (ath12k_peer_assoc_h_vht_masked(vht_mcs_mask)) 2293 return; 2294 2295 arg->vht_flag = true; 2296 2297 /* TODO: similar flags required? */ 2298 arg->vht_capable = true; 2299 2300 if (def.chan->band == NL80211_BAND_2GHZ) 2301 arg->vht_ng_flag = true; 2302 2303 arg->peer_vht_caps = vht_cap->cap; 2304 2305 ampdu_factor = (vht_cap->cap & 2306 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >> 2307 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT; 2308 2309 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to 2310 * zero in VHT IE. Using it would result in degraded throughput. 2311 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep 2312 * it if VHT max_mpdu is smaller. 2313 */ 2314 arg->peer_max_mpdu = max(arg->peer_max_mpdu, 2315 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR + 2316 ampdu_factor)) - 1); 2317 2318 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80) 2319 arg->bw_80 = true; 2320 2321 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) 2322 arg->bw_160 = true; 2323 2324 vht_nss = ath12k_mac_max_vht_nss(vht_mcs_mask); 2325 2326 if (vht_nss > link_sta->rx_nss) { 2327 user_rate_valid = false; 2328 for (nss_idx = link_sta->rx_nss - 1; nss_idx >= 0; nss_idx--) { 2329 if (vht_mcs_mask[nss_idx]) { 2330 user_rate_valid = true; 2331 break; 2332 } 2333 } 2334 } 2335 2336 if (!user_rate_valid) { 2337 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 2338 "Setting vht range MCS value to peer supported nss:%d for peer %pM\n", 2339 link_sta->rx_nss, arsta->addr); 2340 vht_mcs_mask[link_sta->rx_nss - 1] = vht_mcs_mask[vht_nss - 1]; 2341 } 2342 2343 /* Calculate peer NSS capability from VHT capabilities if STA 2344 * supports VHT. 2345 */ 2346 for (i = 0, max_nss = 0, vht_mcs = 0; i < NL80211_VHT_NSS_MAX; i++) { 2347 vht_mcs = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map) >> 2348 (2 * i) & 3; 2349 2350 if (vht_mcs != IEEE80211_VHT_MCS_NOT_SUPPORTED && 2351 vht_mcs_mask[i]) 2352 max_nss = i + 1; 2353 } 2354 arg->peer_nss = min(link_sta->rx_nss, max_nss); 2355 arg->rx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.rx_highest); 2356 arg->rx_mcs_set = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map); 2357 arg->tx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.tx_highest); 2358 2359 tx_mcs_map = __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map); 2360 arg->tx_mcs_set = ath12k_peer_assoc_h_vht_limit(tx_mcs_map, vht_mcs_mask); 2361 2362 /* In QCN9274 platform, VHT MCS rate 10 and 11 is enabled by default. 2363 * VHT MCS rate 10 and 11 is not supported in 11ac standard. 2364 * so explicitly disable the VHT MCS rate 10 and 11 in 11ac mode. 2365 */ 2366 arg->tx_mcs_set &= ~IEEE80211_VHT_MCS_SUPPORT_0_11_MASK; 2367 arg->tx_mcs_set |= IEEE80211_DISABLE_VHT_MCS_SUPPORT_0_11; 2368 2369 if ((arg->tx_mcs_set & IEEE80211_VHT_MCS_NOT_SUPPORTED) == 2370 IEEE80211_VHT_MCS_NOT_SUPPORTED) 2371 arg->peer_vht_caps &= ~IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE; 2372 2373 /* TODO: Check */ 2374 arg->tx_max_mcs_nss = 0xFF; 2375 2376 if (arg->peer_phymode == MODE_11AC_VHT160) { 2377 tx_nss = ath12k_get_nss_160mhz(ar, max_nss); 2378 rx_nss = min(arg->peer_nss, tx_nss); 2379 arg->peer_bw_rxnss_override = ATH12K_BW_NSS_MAP_ENABLE; 2380 2381 if (!rx_nss) { 2382 ath12k_warn(ar->ab, "invalid max_nss\n"); 2383 return; 2384 } 2385 2386 nss_160 = u32_encode_bits(rx_nss - 1, ATH12K_PEER_RX_NSS_160MHZ); 2387 arg->peer_bw_rxnss_override |= nss_160; 2388 } 2389 2390 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 2391 "mac vht peer %pM max_mpdu %d flags 0x%x nss_override 0x%x\n", 2392 arsta->addr, arg->peer_max_mpdu, arg->peer_flags, 2393 arg->peer_bw_rxnss_override); 2394 } 2395 2396 static int ath12k_mac_get_max_he_mcs_map(u16 mcs_map, int nss) 2397 { 2398 switch ((mcs_map >> (2 * nss)) & 0x3) { 2399 case IEEE80211_HE_MCS_SUPPORT_0_7: return BIT(8) - 1; 2400 case IEEE80211_HE_MCS_SUPPORT_0_9: return BIT(10) - 1; 2401 case IEEE80211_HE_MCS_SUPPORT_0_11: return BIT(12) - 1; 2402 } 2403 return 0; 2404 } 2405 2406 static u16 ath12k_peer_assoc_h_he_limit(u16 tx_mcs_set, 2407 const u16 *he_mcs_limit) 2408 { 2409 int idx_limit; 2410 int nss; 2411 u16 mcs_map; 2412 u16 mcs; 2413 2414 for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++) { 2415 mcs_map = ath12k_mac_get_max_he_mcs_map(tx_mcs_set, nss) & 2416 he_mcs_limit[nss]; 2417 2418 if (mcs_map) 2419 idx_limit = fls(mcs_map) - 1; 2420 else 2421 idx_limit = -1; 2422 2423 switch (idx_limit) { 2424 case 0 ... 7: 2425 mcs = IEEE80211_HE_MCS_SUPPORT_0_7; 2426 break; 2427 case 8: 2428 case 9: 2429 mcs = IEEE80211_HE_MCS_SUPPORT_0_9; 2430 break; 2431 case 10: 2432 case 11: 2433 mcs = IEEE80211_HE_MCS_SUPPORT_0_11; 2434 break; 2435 default: 2436 WARN_ON(1); 2437 fallthrough; 2438 case -1: 2439 mcs = IEEE80211_HE_MCS_NOT_SUPPORTED; 2440 break; 2441 } 2442 2443 tx_mcs_set &= ~(0x3 << (nss * 2)); 2444 tx_mcs_set |= mcs << (nss * 2); 2445 } 2446 2447 return tx_mcs_set; 2448 } 2449 2450 static bool 2451 ath12k_peer_assoc_h_he_masked(const u16 he_mcs_mask[NL80211_HE_NSS_MAX]) 2452 { 2453 int nss; 2454 2455 for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++) 2456 if (he_mcs_mask[nss]) 2457 return false; 2458 2459 return true; 2460 } 2461 2462 static void ath12k_peer_assoc_h_he(struct ath12k *ar, 2463 struct ath12k_link_vif *arvif, 2464 struct ath12k_link_sta *arsta, 2465 struct ath12k_wmi_peer_assoc_arg *arg) 2466 { 2467 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 2468 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 2469 const struct ieee80211_sta_he_cap *he_cap; 2470 struct ieee80211_bss_conf *link_conf; 2471 struct ieee80211_link_sta *link_sta; 2472 struct cfg80211_chan_def def; 2473 int i; 2474 u8 ampdu_factor, max_nss; 2475 u8 rx_mcs_80 = IEEE80211_HE_MCS_NOT_SUPPORTED; 2476 u8 rx_mcs_160 = IEEE80211_HE_MCS_NOT_SUPPORTED; 2477 u16 mcs_160_map, mcs_80_map; 2478 u8 link_id = arvif->link_id; 2479 bool support_160; 2480 enum nl80211_band band; 2481 u16 *he_mcs_mask; 2482 u8 he_mcs; 2483 u16 he_tx_mcs = 0, v = 0; 2484 int he_nss, nss_idx; 2485 bool user_rate_valid = true; 2486 u32 rx_nss, tx_nss, nss_160; 2487 2488 if (WARN_ON(ath12k_mac_vif_link_chan(vif, link_id, &def))) 2489 return; 2490 2491 link_conf = ath12k_mac_get_link_bss_conf(arvif); 2492 if (!link_conf) { 2493 ath12k_warn(ar->ab, "unable to access bss link conf in peer assoc he for vif %pM link %u", 2494 vif->addr, link_id); 2495 return; 2496 } 2497 2498 link_sta = ath12k_mac_get_link_sta(arsta); 2499 if (!link_sta) { 2500 ath12k_warn(ar->ab, "unable to access link sta in peer assoc he for sta %pM link %u\n", 2501 sta->addr, arsta->link_id); 2502 return; 2503 } 2504 2505 he_cap = &link_sta->he_cap; 2506 if (!he_cap->has_he) 2507 return; 2508 2509 band = def.chan->band; 2510 he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs; 2511 2512 if (ath12k_peer_assoc_h_he_masked(he_mcs_mask)) 2513 return; 2514 2515 arg->he_flag = true; 2516 2517 support_160 = !!(he_cap->he_cap_elem.phy_cap_info[0] & 2518 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G); 2519 2520 /* Supported HE-MCS and NSS Set of peer he_cap is intersection with self he_cp */ 2521 mcs_160_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160); 2522 mcs_80_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80); 2523 2524 if (support_160) { 2525 for (i = 7; i >= 0; i--) { 2526 u8 mcs_160 = (mcs_160_map >> (2 * i)) & 3; 2527 2528 if (mcs_160 != IEEE80211_HE_MCS_NOT_SUPPORTED) { 2529 rx_mcs_160 = i + 1; 2530 break; 2531 } 2532 } 2533 } 2534 2535 for (i = 7; i >= 0; i--) { 2536 u8 mcs_80 = (mcs_80_map >> (2 * i)) & 3; 2537 2538 if (mcs_80 != IEEE80211_HE_MCS_NOT_SUPPORTED) { 2539 rx_mcs_80 = i + 1; 2540 break; 2541 } 2542 } 2543 2544 if (support_160) 2545 max_nss = min(rx_mcs_80, rx_mcs_160); 2546 else 2547 max_nss = rx_mcs_80; 2548 2549 arg->peer_nss = min(link_sta->rx_nss, max_nss); 2550 2551 memcpy(&arg->peer_he_cap_macinfo, he_cap->he_cap_elem.mac_cap_info, 2552 sizeof(he_cap->he_cap_elem.mac_cap_info)); 2553 memcpy(&arg->peer_he_cap_phyinfo, he_cap->he_cap_elem.phy_cap_info, 2554 sizeof(he_cap->he_cap_elem.phy_cap_info)); 2555 arg->peer_he_ops = link_conf->he_oper.params; 2556 2557 /* the top most byte is used to indicate BSS color info */ 2558 arg->peer_he_ops &= 0xffffff; 2559 2560 /* As per section 26.6.1 IEEE Std 802.11ax‐2022, if the Max AMPDU 2561 * Exponent Extension in HE cap is zero, use the arg->peer_max_mpdu 2562 * as calculated while parsing VHT caps(if VHT caps is present) 2563 * or HT caps (if VHT caps is not present). 2564 * 2565 * For non-zero value of Max AMPDU Exponent Extension in HE MAC caps, 2566 * if a HE STA sends VHT cap and HE cap IE in assoc request then, use 2567 * MAX_AMPDU_LEN_FACTOR as 20 to calculate max_ampdu length. 2568 * If a HE STA that does not send VHT cap, but HE and HT cap in assoc 2569 * request, then use MAX_AMPDU_LEN_FACTOR as 16 to calculate max_ampdu 2570 * length. 2571 */ 2572 ampdu_factor = u8_get_bits(he_cap->he_cap_elem.mac_cap_info[3], 2573 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK); 2574 2575 if (ampdu_factor) { 2576 if (link_sta->vht_cap.vht_supported) 2577 arg->peer_max_mpdu = (1 << (IEEE80211_HE_VHT_MAX_AMPDU_FACTOR + 2578 ampdu_factor)) - 1; 2579 else if (link_sta->ht_cap.ht_supported) 2580 arg->peer_max_mpdu = (1 << (IEEE80211_HE_HT_MAX_AMPDU_FACTOR + 2581 ampdu_factor)) - 1; 2582 } 2583 2584 if (he_cap->he_cap_elem.phy_cap_info[6] & 2585 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) { 2586 int bit = 7; 2587 int nss, ru; 2588 2589 arg->peer_ppet.numss_m1 = he_cap->ppe_thres[0] & 2590 IEEE80211_PPE_THRES_NSS_MASK; 2591 arg->peer_ppet.ru_bit_mask = 2592 (he_cap->ppe_thres[0] & 2593 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK) >> 2594 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS; 2595 2596 for (nss = 0; nss <= arg->peer_ppet.numss_m1; nss++) { 2597 for (ru = 0; ru < 4; ru++) { 2598 u32 val = 0; 2599 int i; 2600 2601 if ((arg->peer_ppet.ru_bit_mask & BIT(ru)) == 0) 2602 continue; 2603 for (i = 0; i < 6; i++) { 2604 val >>= 1; 2605 val |= ((he_cap->ppe_thres[bit / 8] >> 2606 (bit % 8)) & 0x1) << 5; 2607 bit++; 2608 } 2609 arg->peer_ppet.ppet16_ppet8_ru3_ru0[nss] |= 2610 val << (ru * 6); 2611 } 2612 } 2613 } 2614 2615 if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_RES) 2616 arg->twt_responder = true; 2617 if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_REQ) 2618 arg->twt_requester = true; 2619 2620 he_nss = ath12k_mac_max_he_nss(he_mcs_mask); 2621 2622 if (he_nss > link_sta->rx_nss) { 2623 user_rate_valid = false; 2624 for (nss_idx = link_sta->rx_nss - 1; nss_idx >= 0; nss_idx--) { 2625 if (he_mcs_mask[nss_idx]) { 2626 user_rate_valid = true; 2627 break; 2628 } 2629 } 2630 } 2631 2632 if (!user_rate_valid) { 2633 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 2634 "Setting he range MCS value to peer supported nss:%d for peer %pM\n", 2635 link_sta->rx_nss, arsta->addr); 2636 he_mcs_mask[link_sta->rx_nss - 1] = he_mcs_mask[he_nss - 1]; 2637 } 2638 2639 switch (link_sta->bandwidth) { 2640 case IEEE80211_STA_RX_BW_160: 2641 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160); 2642 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v; 2643 2644 v = ath12k_peer_assoc_h_he_limit(v, he_mcs_mask); 2645 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v; 2646 2647 arg->peer_he_mcs_count++; 2648 if (!he_tx_mcs) 2649 he_tx_mcs = v; 2650 fallthrough; 2651 2652 default: 2653 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80); 2654 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v; 2655 2656 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80); 2657 v = ath12k_peer_assoc_h_he_limit(v, he_mcs_mask); 2658 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v; 2659 2660 arg->peer_he_mcs_count++; 2661 if (!he_tx_mcs) 2662 he_tx_mcs = v; 2663 break; 2664 } 2665 2666 /* Calculate peer NSS capability from HE capabilities if STA 2667 * supports HE. 2668 */ 2669 for (i = 0, max_nss = 0, he_mcs = 0; i < NL80211_HE_NSS_MAX; i++) { 2670 he_mcs = he_tx_mcs >> (2 * i) & 3; 2671 2672 /* In case of fixed rates, MCS Range in he_tx_mcs might have 2673 * unsupported range, with he_mcs_mask set, so check either of them 2674 * to find nss. 2675 */ 2676 if (he_mcs != IEEE80211_HE_MCS_NOT_SUPPORTED || 2677 he_mcs_mask[i]) 2678 max_nss = i + 1; 2679 } 2680 2681 max_nss = min(max_nss, ar->num_tx_chains); 2682 arg->peer_nss = min(link_sta->rx_nss, max_nss); 2683 2684 if (arg->peer_phymode == MODE_11AX_HE160) { 2685 tx_nss = ath12k_get_nss_160mhz(ar, ar->num_tx_chains); 2686 rx_nss = min(arg->peer_nss, tx_nss); 2687 2688 arg->peer_nss = min(link_sta->rx_nss, ar->num_rx_chains); 2689 arg->peer_bw_rxnss_override = ATH12K_BW_NSS_MAP_ENABLE; 2690 2691 if (!rx_nss) { 2692 ath12k_warn(ar->ab, "invalid max_nss\n"); 2693 return; 2694 } 2695 2696 nss_160 = u32_encode_bits(rx_nss - 1, ATH12K_PEER_RX_NSS_160MHZ); 2697 arg->peer_bw_rxnss_override |= nss_160; 2698 } 2699 2700 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 2701 "mac he peer %pM nss %d mcs cnt %d nss_override 0x%x\n", 2702 arsta->addr, arg->peer_nss, 2703 arg->peer_he_mcs_count, 2704 arg->peer_bw_rxnss_override); 2705 } 2706 2707 static void ath12k_peer_assoc_h_he_6ghz(struct ath12k *ar, 2708 struct ath12k_link_vif *arvif, 2709 struct ath12k_link_sta *arsta, 2710 struct ath12k_wmi_peer_assoc_arg *arg) 2711 { 2712 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 2713 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 2714 const struct ieee80211_sta_he_cap *he_cap; 2715 struct ieee80211_link_sta *link_sta; 2716 struct cfg80211_chan_def def; 2717 enum nl80211_band band; 2718 u8 ampdu_factor, mpdu_density; 2719 2720 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) 2721 return; 2722 2723 band = def.chan->band; 2724 2725 link_sta = ath12k_mac_get_link_sta(arsta); 2726 if (!link_sta) { 2727 ath12k_warn(ar->ab, "unable to access link sta in peer assoc he 6ghz for sta %pM link %u\n", 2728 sta->addr, arsta->link_id); 2729 return; 2730 } 2731 2732 he_cap = &link_sta->he_cap; 2733 2734 if (!arg->he_flag || band != NL80211_BAND_6GHZ || !link_sta->he_6ghz_capa.capa) 2735 return; 2736 2737 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) 2738 arg->bw_40 = true; 2739 2740 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80) 2741 arg->bw_80 = true; 2742 2743 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) 2744 arg->bw_160 = true; 2745 2746 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_320) 2747 arg->bw_320 = true; 2748 2749 arg->peer_he_caps_6ghz = le16_to_cpu(link_sta->he_6ghz_capa.capa); 2750 2751 mpdu_density = u32_get_bits(arg->peer_he_caps_6ghz, 2752 IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START); 2753 arg->peer_mpdu_density = ath12k_parse_mpdudensity(mpdu_density); 2754 2755 /* From IEEE Std 802.11ax-2021 - Section 10.12.2: An HE STA shall be capable of 2756 * receiving A-MPDU where the A-MPDU pre-EOF padding length is up to the value 2757 * indicated by the Maximum A-MPDU Length Exponent Extension field in the HE 2758 * Capabilities element and the Maximum A-MPDU Length Exponent field in HE 6 GHz 2759 * Band Capabilities element in the 6 GHz band. 2760 * 2761 * Here, we are extracting the Max A-MPDU Exponent Extension from HE caps and 2762 * factor is the Maximum A-MPDU Length Exponent from HE 6 GHZ Band capability. 2763 */ 2764 ampdu_factor = u8_get_bits(he_cap->he_cap_elem.mac_cap_info[3], 2765 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK) + 2766 u32_get_bits(arg->peer_he_caps_6ghz, 2767 IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP); 2768 2769 arg->peer_max_mpdu = (1u << (IEEE80211_HE_6GHZ_MAX_AMPDU_FACTOR + 2770 ampdu_factor)) - 1; 2771 } 2772 2773 static int ath12k_get_smps_from_capa(const struct ieee80211_sta_ht_cap *ht_cap, 2774 const struct ieee80211_he_6ghz_capa *he_6ghz_capa, 2775 int *smps) 2776 { 2777 if (ht_cap->ht_supported) 2778 *smps = u16_get_bits(ht_cap->cap, IEEE80211_HT_CAP_SM_PS); 2779 else 2780 *smps = le16_get_bits(he_6ghz_capa->capa, 2781 IEEE80211_HE_6GHZ_CAP_SM_PS); 2782 2783 if (*smps >= ARRAY_SIZE(ath12k_smps_map)) 2784 return -EINVAL; 2785 2786 return 0; 2787 } 2788 2789 static void ath12k_peer_assoc_h_smps(struct ath12k_link_sta *arsta, 2790 struct ath12k_wmi_peer_assoc_arg *arg) 2791 { 2792 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 2793 const struct ieee80211_he_6ghz_capa *he_6ghz_capa; 2794 struct ath12k_link_vif *arvif = arsta->arvif; 2795 const struct ieee80211_sta_ht_cap *ht_cap; 2796 struct ieee80211_link_sta *link_sta; 2797 struct ath12k *ar = arvif->ar; 2798 int smps; 2799 2800 link_sta = ath12k_mac_get_link_sta(arsta); 2801 if (!link_sta) { 2802 ath12k_warn(ar->ab, "unable to access link sta in peer assoc he for sta %pM link %u\n", 2803 sta->addr, arsta->link_id); 2804 return; 2805 } 2806 2807 he_6ghz_capa = &link_sta->he_6ghz_capa; 2808 ht_cap = &link_sta->ht_cap; 2809 2810 if (!ht_cap->ht_supported && !he_6ghz_capa->capa) 2811 return; 2812 2813 if (ath12k_get_smps_from_capa(ht_cap, he_6ghz_capa, &smps)) 2814 return; 2815 2816 switch (smps) { 2817 case WLAN_HT_CAP_SM_PS_STATIC: 2818 arg->static_mimops_flag = true; 2819 break; 2820 case WLAN_HT_CAP_SM_PS_DYNAMIC: 2821 arg->dynamic_mimops_flag = true; 2822 break; 2823 case WLAN_HT_CAP_SM_PS_DISABLED: 2824 arg->spatial_mux_flag = true; 2825 break; 2826 default: 2827 break; 2828 } 2829 } 2830 2831 static void ath12k_peer_assoc_h_qos(struct ath12k *ar, 2832 struct ath12k_link_vif *arvif, 2833 struct ath12k_link_sta *arsta, 2834 struct ath12k_wmi_peer_assoc_arg *arg) 2835 { 2836 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 2837 2838 switch (arvif->ahvif->vdev_type) { 2839 case WMI_VDEV_TYPE_AP: 2840 if (sta->wme) { 2841 /* TODO: Check WME vs QoS */ 2842 arg->is_wme_set = true; 2843 arg->qos_flag = true; 2844 } 2845 2846 if (sta->wme && sta->uapsd_queues) { 2847 /* TODO: Check WME vs QoS */ 2848 arg->is_wme_set = true; 2849 arg->apsd_flag = true; 2850 arg->peer_rate_caps |= WMI_HOST_RC_UAPSD_FLAG; 2851 } 2852 break; 2853 case WMI_VDEV_TYPE_STA: 2854 if (sta->wme) { 2855 arg->is_wme_set = true; 2856 arg->qos_flag = true; 2857 } 2858 break; 2859 default: 2860 break; 2861 } 2862 2863 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac peer %pM qos %d\n", 2864 arsta->addr, arg->qos_flag); 2865 } 2866 2867 static int ath12k_peer_assoc_qos_ap(struct ath12k *ar, 2868 struct ath12k_link_vif *arvif, 2869 struct ath12k_link_sta *arsta) 2870 { 2871 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 2872 struct ath12k_wmi_ap_ps_arg arg; 2873 u32 max_sp; 2874 u32 uapsd; 2875 int ret; 2876 2877 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 2878 2879 arg.vdev_id = arvif->vdev_id; 2880 2881 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n", 2882 sta->uapsd_queues, sta->max_sp); 2883 2884 uapsd = 0; 2885 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO) 2886 uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN | 2887 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN; 2888 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI) 2889 uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN | 2890 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN; 2891 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK) 2892 uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN | 2893 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN; 2894 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE) 2895 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN | 2896 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN; 2897 2898 max_sp = 0; 2899 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP) 2900 max_sp = sta->max_sp; 2901 2902 arg.param = WMI_AP_PS_PEER_PARAM_UAPSD; 2903 arg.value = uapsd; 2904 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg); 2905 if (ret) 2906 goto err; 2907 2908 arg.param = WMI_AP_PS_PEER_PARAM_MAX_SP; 2909 arg.value = max_sp; 2910 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg); 2911 if (ret) 2912 goto err; 2913 2914 /* TODO: revisit during testing */ 2915 arg.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_FRMTYPE; 2916 arg.value = DISABLE_SIFS_RESPONSE_TRIGGER; 2917 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg); 2918 if (ret) 2919 goto err; 2920 2921 arg.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_UAPSD; 2922 arg.value = DISABLE_SIFS_RESPONSE_TRIGGER; 2923 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg); 2924 if (ret) 2925 goto err; 2926 2927 return 0; 2928 2929 err: 2930 ath12k_warn(ar->ab, "failed to set ap ps peer param %d for vdev %i: %d\n", 2931 arg.param, arvif->vdev_id, ret); 2932 return ret; 2933 } 2934 2935 static bool ath12k_mac_sta_has_ofdm_only(struct ieee80211_link_sta *sta) 2936 { 2937 return sta->supp_rates[NL80211_BAND_2GHZ] >> 2938 ATH12K_MAC_FIRST_OFDM_RATE_IDX; 2939 } 2940 2941 static enum wmi_phy_mode ath12k_mac_get_phymode_vht(struct ath12k *ar, 2942 struct ieee80211_link_sta *link_sta) 2943 { 2944 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) { 2945 if (link_sta->vht_cap.cap & (IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ | 2946 IEEE80211_VHT_CAP_EXT_NSS_BW_MASK)) 2947 return MODE_11AC_VHT160; 2948 2949 /* Allow STA to connect even if it does not explicitly advertise 160 MHz 2950 * support 2951 */ 2952 return MODE_11AC_VHT160; 2953 } 2954 2955 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80) 2956 return MODE_11AC_VHT80; 2957 2958 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) 2959 return MODE_11AC_VHT40; 2960 2961 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_20) 2962 return MODE_11AC_VHT20; 2963 2964 return MODE_UNKNOWN; 2965 } 2966 2967 static enum wmi_phy_mode ath12k_mac_get_phymode_he(struct ath12k *ar, 2968 struct ieee80211_link_sta *link_sta) 2969 { 2970 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) { 2971 if (link_sta->he_cap.he_cap_elem.phy_cap_info[0] & 2972 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G) 2973 return MODE_11AX_HE160; 2974 2975 return MODE_UNKNOWN; 2976 } 2977 2978 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80) 2979 return MODE_11AX_HE80; 2980 2981 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) 2982 return MODE_11AX_HE40; 2983 2984 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_20) 2985 return MODE_11AX_HE20; 2986 2987 return MODE_UNKNOWN; 2988 } 2989 2990 static enum wmi_phy_mode ath12k_mac_get_phymode_eht(struct ath12k *ar, 2991 struct ieee80211_link_sta *link_sta) 2992 { 2993 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_320) 2994 if (link_sta->eht_cap.eht_cap_elem.phy_cap_info[0] & 2995 IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ) 2996 return MODE_11BE_EHT320; 2997 2998 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) { 2999 if (link_sta->he_cap.he_cap_elem.phy_cap_info[0] & 3000 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G) 3001 return MODE_11BE_EHT160; 3002 3003 ath12k_warn(ar->ab, "invalid EHT PHY capability info for 160 Mhz: %d\n", 3004 link_sta->he_cap.he_cap_elem.phy_cap_info[0]); 3005 3006 return MODE_UNKNOWN; 3007 } 3008 3009 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80) 3010 return MODE_11BE_EHT80; 3011 3012 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) 3013 return MODE_11BE_EHT40; 3014 3015 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_20) 3016 return MODE_11BE_EHT20; 3017 3018 return MODE_UNKNOWN; 3019 } 3020 3021 static void ath12k_peer_assoc_h_phymode(struct ath12k *ar, 3022 struct ath12k_link_vif *arvif, 3023 struct ath12k_link_sta *arsta, 3024 struct ath12k_wmi_peer_assoc_arg *arg) 3025 { 3026 struct ieee80211_link_sta *link_sta; 3027 struct cfg80211_chan_def def; 3028 enum nl80211_band band; 3029 const u8 *ht_mcs_mask; 3030 const u16 *vht_mcs_mask; 3031 const u16 *he_mcs_mask; 3032 enum wmi_phy_mode phymode = MODE_UNKNOWN; 3033 3034 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 3035 3036 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 3037 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 3038 3039 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) 3040 return; 3041 3042 band = def.chan->band; 3043 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs; 3044 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs; 3045 he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs; 3046 3047 link_sta = ath12k_mac_get_link_sta(arsta); 3048 if (!link_sta) { 3049 ath12k_warn(ar->ab, "unable to access link sta in peer assoc he for sta %pM link %u\n", 3050 sta->addr, arsta->link_id); 3051 return; 3052 } 3053 3054 switch (band) { 3055 case NL80211_BAND_2GHZ: 3056 if (link_sta->eht_cap.has_eht) { 3057 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) 3058 phymode = MODE_11BE_EHT40_2G; 3059 else 3060 phymode = MODE_11BE_EHT20_2G; 3061 } else if (link_sta->he_cap.has_he && 3062 !ath12k_peer_assoc_h_he_masked(he_mcs_mask)) { 3063 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80) 3064 phymode = MODE_11AX_HE80_2G; 3065 else if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) 3066 phymode = MODE_11AX_HE40_2G; 3067 else 3068 phymode = MODE_11AX_HE20_2G; 3069 } else if (link_sta->vht_cap.vht_supported && 3070 !ath12k_peer_assoc_h_vht_masked(vht_mcs_mask)) { 3071 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) 3072 phymode = MODE_11AC_VHT40; 3073 else 3074 phymode = MODE_11AC_VHT20; 3075 } else if (link_sta->ht_cap.ht_supported && 3076 !ath12k_peer_assoc_h_ht_masked(ht_mcs_mask)) { 3077 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) 3078 phymode = MODE_11NG_HT40; 3079 else 3080 phymode = MODE_11NG_HT20; 3081 } else if (ath12k_mac_sta_has_ofdm_only(link_sta)) { 3082 phymode = MODE_11G; 3083 } else { 3084 phymode = MODE_11B; 3085 } 3086 break; 3087 case NL80211_BAND_5GHZ: 3088 case NL80211_BAND_6GHZ: 3089 /* Check EHT first */ 3090 if (link_sta->eht_cap.has_eht) { 3091 phymode = ath12k_mac_get_phymode_eht(ar, link_sta); 3092 } else if (link_sta->he_cap.has_he && 3093 !ath12k_peer_assoc_h_he_masked(he_mcs_mask)) { 3094 phymode = ath12k_mac_get_phymode_he(ar, link_sta); 3095 } else if (link_sta->vht_cap.vht_supported && 3096 !ath12k_peer_assoc_h_vht_masked(vht_mcs_mask)) { 3097 phymode = ath12k_mac_get_phymode_vht(ar, link_sta); 3098 } else if (link_sta->ht_cap.ht_supported && 3099 !ath12k_peer_assoc_h_ht_masked(ht_mcs_mask)) { 3100 if (link_sta->bandwidth >= IEEE80211_STA_RX_BW_40) 3101 phymode = MODE_11NA_HT40; 3102 else 3103 phymode = MODE_11NA_HT20; 3104 } else { 3105 phymode = MODE_11A; 3106 } 3107 break; 3108 default: 3109 break; 3110 } 3111 3112 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac peer %pM phymode %s\n", 3113 arsta->addr, ath12k_mac_phymode_str(phymode)); 3114 3115 arg->peer_phymode = phymode; 3116 WARN_ON(phymode == MODE_UNKNOWN); 3117 } 3118 3119 static void ath12k_mac_set_eht_mcs(u8 rx_tx_mcs7, u8 rx_tx_mcs9, 3120 u8 rx_tx_mcs11, u8 rx_tx_mcs13, 3121 u32 *rx_mcs, u32 *tx_mcs) 3122 { 3123 *rx_mcs = 0; 3124 u32p_replace_bits(rx_mcs, 3125 u8_get_bits(rx_tx_mcs7, IEEE80211_EHT_MCS_NSS_RX), 3126 WMI_EHT_MCS_NSS_0_7); 3127 u32p_replace_bits(rx_mcs, 3128 u8_get_bits(rx_tx_mcs9, IEEE80211_EHT_MCS_NSS_RX), 3129 WMI_EHT_MCS_NSS_8_9); 3130 u32p_replace_bits(rx_mcs, 3131 u8_get_bits(rx_tx_mcs11, IEEE80211_EHT_MCS_NSS_RX), 3132 WMI_EHT_MCS_NSS_10_11); 3133 u32p_replace_bits(rx_mcs, 3134 u8_get_bits(rx_tx_mcs13, IEEE80211_EHT_MCS_NSS_RX), 3135 WMI_EHT_MCS_NSS_12_13); 3136 3137 *tx_mcs = 0; 3138 u32p_replace_bits(tx_mcs, 3139 u8_get_bits(rx_tx_mcs7, IEEE80211_EHT_MCS_NSS_TX), 3140 WMI_EHT_MCS_NSS_0_7); 3141 u32p_replace_bits(tx_mcs, 3142 u8_get_bits(rx_tx_mcs9, IEEE80211_EHT_MCS_NSS_TX), 3143 WMI_EHT_MCS_NSS_8_9); 3144 u32p_replace_bits(tx_mcs, 3145 u8_get_bits(rx_tx_mcs11, IEEE80211_EHT_MCS_NSS_TX), 3146 WMI_EHT_MCS_NSS_10_11); 3147 u32p_replace_bits(tx_mcs, 3148 u8_get_bits(rx_tx_mcs13, IEEE80211_EHT_MCS_NSS_TX), 3149 WMI_EHT_MCS_NSS_12_13); 3150 } 3151 3152 static void ath12k_mac_set_eht_ppe_threshold(const u8 *ppe_thres, 3153 struct ath12k_wmi_ppe_threshold_arg *ppet) 3154 { 3155 u32 bit_pos = IEEE80211_EHT_PPE_THRES_INFO_HEADER_SIZE, val; 3156 u8 nss, ru, i; 3157 u8 ppet_bit_len_per_ru = IEEE80211_EHT_PPE_THRES_INFO_PPET_SIZE * 2; 3158 3159 ppet->numss_m1 = u8_get_bits(ppe_thres[0], IEEE80211_EHT_PPE_THRES_NSS_MASK); 3160 ppet->ru_bit_mask = u16_get_bits(get_unaligned_le16(ppe_thres), 3161 IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK); 3162 3163 for (nss = 0; nss <= ppet->numss_m1; nss++) { 3164 for (ru = 0; 3165 ru < hweight16(IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK); 3166 ru++) { 3167 if ((ppet->ru_bit_mask & BIT(ru)) == 0) 3168 continue; 3169 3170 val = 0; 3171 for (i = 0; i < ppet_bit_len_per_ru; i++) { 3172 val |= (((ppe_thres[bit_pos / 8] >> 3173 (bit_pos % 8)) & 0x1) << i); 3174 bit_pos++; 3175 } 3176 ppet->ppet16_ppet8_ru3_ru0[nss] |= 3177 (val << (ru * ppet_bit_len_per_ru)); 3178 } 3179 } 3180 } 3181 3182 static void ath12k_peer_assoc_h_eht(struct ath12k *ar, 3183 struct ath12k_link_vif *arvif, 3184 struct ath12k_link_sta *arsta, 3185 struct ath12k_wmi_peer_assoc_arg *arg) 3186 { 3187 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 3188 const struct ieee80211_eht_mcs_nss_supp_20mhz_only *bw_20; 3189 const struct ieee80211_eht_mcs_nss_supp_bw *bw; 3190 const struct ieee80211_sta_eht_cap *eht_cap; 3191 const struct ieee80211_sta_he_cap *he_cap; 3192 struct ieee80211_link_sta *link_sta; 3193 struct ieee80211_bss_conf *link_conf; 3194 u32 *rx_mcs, *tx_mcs; 3195 3196 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 3197 3198 link_sta = ath12k_mac_get_link_sta(arsta); 3199 if (!link_sta) { 3200 ath12k_warn(ar->ab, "unable to access link sta in peer assoc eht for sta %pM link %u\n", 3201 sta->addr, arsta->link_id); 3202 return; 3203 } 3204 3205 link_conf = ath12k_mac_get_link_bss_conf(arvif); 3206 if (!link_conf) { 3207 ath12k_warn(ar->ab, "unable to access link_conf in peer assoc eht set\n"); 3208 return; 3209 } 3210 3211 eht_cap = &link_sta->eht_cap; 3212 he_cap = &link_sta->he_cap; 3213 if (!he_cap->has_he || !eht_cap->has_eht) 3214 return; 3215 3216 arg->eht_flag = true; 3217 3218 if ((eht_cap->eht_cap_elem.phy_cap_info[5] & 3219 IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT) && 3220 eht_cap->eht_ppe_thres[0] != 0) 3221 ath12k_mac_set_eht_ppe_threshold(eht_cap->eht_ppe_thres, 3222 &arg->peer_eht_ppet); 3223 3224 memcpy(arg->peer_eht_cap_mac, eht_cap->eht_cap_elem.mac_cap_info, 3225 sizeof(eht_cap->eht_cap_elem.mac_cap_info)); 3226 memcpy(arg->peer_eht_cap_phy, eht_cap->eht_cap_elem.phy_cap_info, 3227 sizeof(eht_cap->eht_cap_elem.phy_cap_info)); 3228 3229 rx_mcs = arg->peer_eht_rx_mcs_set; 3230 tx_mcs = arg->peer_eht_tx_mcs_set; 3231 3232 switch (link_sta->bandwidth) { 3233 case IEEE80211_STA_RX_BW_320: 3234 bw = &eht_cap->eht_mcs_nss_supp.bw._320; 3235 ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss, 3236 bw->rx_tx_mcs9_max_nss, 3237 bw->rx_tx_mcs11_max_nss, 3238 bw->rx_tx_mcs13_max_nss, 3239 &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_320], 3240 &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_320]); 3241 arg->peer_eht_mcs_count++; 3242 fallthrough; 3243 case IEEE80211_STA_RX_BW_160: 3244 bw = &eht_cap->eht_mcs_nss_supp.bw._160; 3245 ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss, 3246 bw->rx_tx_mcs9_max_nss, 3247 bw->rx_tx_mcs11_max_nss, 3248 bw->rx_tx_mcs13_max_nss, 3249 &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_160], 3250 &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_160]); 3251 arg->peer_eht_mcs_count++; 3252 fallthrough; 3253 default: 3254 if ((he_cap->he_cap_elem.phy_cap_info[0] & 3255 (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G | 3256 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G | 3257 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G | 3258 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)) == 0) { 3259 bw_20 = &eht_cap->eht_mcs_nss_supp.only_20mhz; 3260 3261 ath12k_mac_set_eht_mcs(bw_20->rx_tx_mcs7_max_nss, 3262 bw_20->rx_tx_mcs9_max_nss, 3263 bw_20->rx_tx_mcs11_max_nss, 3264 bw_20->rx_tx_mcs13_max_nss, 3265 &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80], 3266 &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80]); 3267 } else { 3268 bw = &eht_cap->eht_mcs_nss_supp.bw._80; 3269 ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss, 3270 bw->rx_tx_mcs9_max_nss, 3271 bw->rx_tx_mcs11_max_nss, 3272 bw->rx_tx_mcs13_max_nss, 3273 &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80], 3274 &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80]); 3275 } 3276 3277 arg->peer_eht_mcs_count++; 3278 break; 3279 } 3280 3281 arg->punct_bitmap = ~arvif->punct_bitmap; 3282 arg->eht_disable_mcs15 = link_conf->eht_disable_mcs15; 3283 } 3284 3285 static void ath12k_peer_assoc_h_mlo(struct ath12k_link_sta *arsta, 3286 struct ath12k_wmi_peer_assoc_arg *arg) 3287 { 3288 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 3289 struct peer_assoc_mlo_params *ml = &arg->ml; 3290 struct ath12k_sta *ahsta = arsta->ahsta; 3291 struct ath12k_link_sta *arsta_p; 3292 struct ath12k_link_vif *arvif; 3293 unsigned long links; 3294 u8 link_id; 3295 int i; 3296 3297 if (!sta->mlo || ahsta->ml_peer_id == ATH12K_MLO_PEER_ID_INVALID) 3298 return; 3299 3300 ml->enabled = true; 3301 ml->assoc_link = arsta->is_assoc_link; 3302 3303 /* For now considering the primary umac based on assoc link */ 3304 ml->primary_umac = arsta->is_assoc_link; 3305 ml->peer_id_valid = true; 3306 ml->logical_link_idx_valid = true; 3307 3308 ether_addr_copy(ml->mld_addr, sta->addr); 3309 ml->logical_link_idx = arsta->link_idx; 3310 ml->ml_peer_id = ahsta->ml_peer_id; 3311 ml->ieee_link_id = arsta->link_id; 3312 ml->num_partner_links = 0; 3313 ml->eml_cap = sta->eml_cap; 3314 links = ahsta->links_map; 3315 3316 rcu_read_lock(); 3317 3318 i = 0; 3319 3320 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) { 3321 if (i >= ATH12K_WMI_MLO_MAX_LINKS) 3322 break; 3323 3324 arsta_p = rcu_dereference(ahsta->link[link_id]); 3325 arvif = rcu_dereference(ahsta->ahvif->link[link_id]); 3326 3327 if (arsta_p == arsta) 3328 continue; 3329 3330 if (!arvif->is_started) 3331 continue; 3332 3333 ml->partner_info[i].vdev_id = arvif->vdev_id; 3334 ml->partner_info[i].hw_link_id = arvif->ar->pdev->hw_link_id; 3335 ml->partner_info[i].assoc_link = arsta_p->is_assoc_link; 3336 ml->partner_info[i].primary_umac = arsta_p->is_assoc_link; 3337 ml->partner_info[i].logical_link_idx_valid = true; 3338 ml->partner_info[i].logical_link_idx = arsta_p->link_idx; 3339 ml->num_partner_links++; 3340 3341 i++; 3342 } 3343 3344 rcu_read_unlock(); 3345 } 3346 3347 static void ath12k_peer_assoc_prepare(struct ath12k *ar, 3348 struct ath12k_link_vif *arvif, 3349 struct ath12k_link_sta *arsta, 3350 struct ath12k_wmi_peer_assoc_arg *arg, 3351 bool reassoc) 3352 { 3353 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 3354 3355 memset(arg, 0, sizeof(*arg)); 3356 3357 reinit_completion(&ar->peer_assoc_done); 3358 3359 arg->peer_new_assoc = !reassoc; 3360 ath12k_peer_assoc_h_basic(ar, arvif, arsta, arg); 3361 ath12k_peer_assoc_h_crypto(ar, arvif, arsta, arg); 3362 ath12k_peer_assoc_h_rates(ar, arvif, arsta, arg); 3363 ath12k_peer_assoc_h_ht(ar, arvif, arsta, arg); 3364 ath12k_peer_assoc_h_vht(ar, arvif, arsta, arg); 3365 ath12k_peer_assoc_h_he(ar, arvif, arsta, arg); 3366 ath12k_peer_assoc_h_he_6ghz(ar, arvif, arsta, arg); 3367 ath12k_peer_assoc_h_eht(ar, arvif, arsta, arg); 3368 ath12k_peer_assoc_h_qos(ar, arvif, arsta, arg); 3369 ath12k_peer_assoc_h_phymode(ar, arvif, arsta, arg); 3370 ath12k_peer_assoc_h_smps(arsta, arg); 3371 ath12k_peer_assoc_h_mlo(arsta, arg); 3372 3373 arsta->peer_nss = arg->peer_nss; 3374 /* TODO: amsdu_disable req? */ 3375 } 3376 3377 static int ath12k_setup_peer_smps(struct ath12k *ar, struct ath12k_link_vif *arvif, 3378 const u8 *addr, 3379 const struct ieee80211_sta_ht_cap *ht_cap, 3380 const struct ieee80211_he_6ghz_capa *he_6ghz_capa) 3381 { 3382 int smps, ret = 0; 3383 3384 if (!ht_cap->ht_supported && !he_6ghz_capa) 3385 return 0; 3386 3387 ret = ath12k_get_smps_from_capa(ht_cap, he_6ghz_capa, &smps); 3388 if (ret < 0) 3389 return ret; 3390 3391 return ath12k_wmi_set_peer_param(ar, addr, arvif->vdev_id, 3392 WMI_PEER_MIMO_PS_STATE, 3393 ath12k_smps_map[smps]); 3394 } 3395 3396 static int ath12k_mac_set_he_txbf_conf(struct ath12k_link_vif *arvif) 3397 { 3398 struct ath12k_vif *ahvif = arvif->ahvif; 3399 struct ath12k *ar = arvif->ar; 3400 u32 param = WMI_VDEV_PARAM_SET_HEMU_MODE; 3401 u32 value = 0; 3402 int ret; 3403 struct ieee80211_bss_conf *link_conf; 3404 3405 link_conf = ath12k_mac_get_link_bss_conf(arvif); 3406 if (!link_conf) { 3407 ath12k_warn(ar->ab, "unable to access bss link conf in txbf conf\n"); 3408 return -EINVAL; 3409 } 3410 3411 if (!link_conf->he_support) 3412 return 0; 3413 3414 if (link_conf->he_su_beamformer) { 3415 value |= u32_encode_bits(HE_SU_BFER_ENABLE, HE_MODE_SU_TX_BFER); 3416 if (link_conf->he_mu_beamformer && 3417 ahvif->vdev_type == WMI_VDEV_TYPE_AP) 3418 value |= u32_encode_bits(HE_MU_BFER_ENABLE, HE_MODE_MU_TX_BFER); 3419 } 3420 3421 if (ahvif->vif->type != NL80211_IFTYPE_MESH_POINT) { 3422 value |= u32_encode_bits(HE_DL_MUOFDMA_ENABLE, HE_MODE_DL_OFDMA) | 3423 u32_encode_bits(HE_UL_MUOFDMA_ENABLE, HE_MODE_UL_OFDMA); 3424 3425 if (link_conf->he_full_ul_mumimo) 3426 value |= u32_encode_bits(HE_UL_MUMIMO_ENABLE, HE_MODE_UL_MUMIMO); 3427 3428 if (link_conf->he_su_beamformee) 3429 value |= u32_encode_bits(HE_SU_BFEE_ENABLE, HE_MODE_SU_TX_BFEE); 3430 } 3431 3432 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, value); 3433 if (ret) { 3434 ath12k_warn(ar->ab, "failed to set vdev %d HE MU mode: %d\n", 3435 arvif->vdev_id, ret); 3436 return ret; 3437 } 3438 3439 param = WMI_VDEV_PARAM_SET_HE_SOUNDING_MODE; 3440 value = u32_encode_bits(HE_VHT_SOUNDING_MODE_ENABLE, HE_VHT_SOUNDING_MODE) | 3441 u32_encode_bits(HE_TRIG_NONTRIG_SOUNDING_MODE_ENABLE, 3442 HE_TRIG_NONTRIG_SOUNDING_MODE); 3443 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 3444 param, value); 3445 if (ret) { 3446 ath12k_warn(ar->ab, "failed to set vdev %d sounding mode: %d\n", 3447 arvif->vdev_id, ret); 3448 return ret; 3449 } 3450 3451 return 0; 3452 } 3453 3454 static int ath12k_mac_vif_recalc_sta_he_txbf(struct ath12k *ar, 3455 struct ath12k_link_vif *arvif, 3456 struct ieee80211_sta_he_cap *he_cap, 3457 int *hemode) 3458 { 3459 struct ieee80211_vif *vif = arvif->ahvif->vif; 3460 struct ieee80211_he_cap_elem he_cap_elem = {}; 3461 struct ieee80211_sta_he_cap *cap_band; 3462 struct cfg80211_chan_def def; 3463 u8 link_id = arvif->link_id; 3464 struct ieee80211_bss_conf *link_conf; 3465 3466 link_conf = ath12k_mac_get_link_bss_conf(arvif); 3467 if (!link_conf) { 3468 ath12k_warn(ar->ab, "unable to access bss link conf in recalc txbf conf\n"); 3469 return -EINVAL; 3470 } 3471 3472 if (!link_conf->he_support) 3473 return 0; 3474 3475 if (vif->type != NL80211_IFTYPE_STATION) 3476 return -EINVAL; 3477 3478 if (WARN_ON(ath12k_mac_vif_link_chan(vif, link_id, &def))) 3479 return -EINVAL; 3480 3481 if (def.chan->band == NL80211_BAND_2GHZ) 3482 cap_band = &ar->mac.iftype[NL80211_BAND_2GHZ][vif->type].he_cap; 3483 else 3484 cap_band = &ar->mac.iftype[NL80211_BAND_5GHZ][vif->type].he_cap; 3485 3486 memcpy(&he_cap_elem, &cap_band->he_cap_elem, sizeof(he_cap_elem)); 3487 3488 *hemode = 0; 3489 if (HECAP_PHY_SUBFME_GET(he_cap_elem.phy_cap_info)) { 3490 if (HECAP_PHY_SUBFMR_GET(he_cap->he_cap_elem.phy_cap_info)) 3491 *hemode |= u32_encode_bits(HE_SU_BFEE_ENABLE, HE_MODE_SU_TX_BFEE); 3492 if (HECAP_PHY_MUBFMR_GET(he_cap->he_cap_elem.phy_cap_info)) 3493 *hemode |= u32_encode_bits(HE_MU_BFEE_ENABLE, HE_MODE_MU_TX_BFEE); 3494 } 3495 3496 if (vif->type != NL80211_IFTYPE_MESH_POINT) { 3497 *hemode |= u32_encode_bits(HE_DL_MUOFDMA_ENABLE, HE_MODE_DL_OFDMA) | 3498 u32_encode_bits(HE_UL_MUOFDMA_ENABLE, HE_MODE_UL_OFDMA); 3499 3500 if (HECAP_PHY_ULMUMIMO_GET(he_cap_elem.phy_cap_info)) 3501 if (HECAP_PHY_ULMUMIMO_GET(he_cap->he_cap_elem.phy_cap_info)) 3502 *hemode |= u32_encode_bits(HE_UL_MUMIMO_ENABLE, 3503 HE_MODE_UL_MUMIMO); 3504 3505 if (u32_get_bits(*hemode, HE_MODE_MU_TX_BFEE)) 3506 *hemode |= u32_encode_bits(HE_SU_BFEE_ENABLE, HE_MODE_SU_TX_BFEE); 3507 3508 if (u32_get_bits(*hemode, HE_MODE_MU_TX_BFER)) 3509 *hemode |= u32_encode_bits(HE_SU_BFER_ENABLE, HE_MODE_SU_TX_BFER); 3510 } 3511 3512 return 0; 3513 } 3514 3515 static int ath12k_mac_set_eht_txbf_conf(struct ath12k_link_vif *arvif) 3516 { 3517 struct ath12k_vif *ahvif = arvif->ahvif; 3518 struct ath12k *ar = arvif->ar; 3519 u32 param = WMI_VDEV_PARAM_SET_EHT_MU_MODE; 3520 u32 value = 0; 3521 int ret; 3522 struct ieee80211_bss_conf *link_conf; 3523 3524 link_conf = ath12k_mac_get_link_bss_conf(arvif); 3525 if (!link_conf) { 3526 ath12k_warn(ar->ab, "unable to access bss link conf in eht txbf conf\n"); 3527 return -ENOENT; 3528 } 3529 3530 if (!link_conf->eht_support) 3531 return 0; 3532 3533 if (link_conf->eht_su_beamformer) { 3534 value |= u32_encode_bits(EHT_SU_BFER_ENABLE, EHT_MODE_SU_TX_BFER); 3535 if (link_conf->eht_mu_beamformer && 3536 ahvif->vdev_type == WMI_VDEV_TYPE_AP) 3537 value |= u32_encode_bits(EHT_MU_BFER_ENABLE, 3538 EHT_MODE_MU_TX_BFER) | 3539 u32_encode_bits(EHT_DL_MUOFDMA_ENABLE, 3540 EHT_MODE_DL_OFDMA_MUMIMO) | 3541 u32_encode_bits(EHT_UL_MUOFDMA_ENABLE, 3542 EHT_MODE_UL_OFDMA_MUMIMO); 3543 } 3544 3545 if (ahvif->vif->type != NL80211_IFTYPE_MESH_POINT) { 3546 value |= u32_encode_bits(EHT_DL_MUOFDMA_ENABLE, EHT_MODE_DL_OFDMA) | 3547 u32_encode_bits(EHT_UL_MUOFDMA_ENABLE, EHT_MODE_UL_OFDMA); 3548 3549 if (link_conf->eht_80mhz_full_bw_ul_mumimo) 3550 value |= u32_encode_bits(EHT_UL_MUMIMO_ENABLE, EHT_MODE_MUMIMO); 3551 3552 if (link_conf->eht_su_beamformee) 3553 value |= u32_encode_bits(EHT_SU_BFEE_ENABLE, 3554 EHT_MODE_SU_TX_BFEE); 3555 } 3556 3557 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, value); 3558 if (ret) { 3559 ath12k_warn(ar->ab, "failed to set vdev %d EHT MU mode: %d\n", 3560 arvif->vdev_id, ret); 3561 return ret; 3562 } 3563 3564 return 0; 3565 } 3566 3567 static u32 ath12k_mac_ieee80211_sta_bw_to_wmi(struct ath12k *ar, 3568 struct ieee80211_link_sta *link_sta) 3569 { 3570 u32 bw; 3571 3572 switch (link_sta->bandwidth) { 3573 case IEEE80211_STA_RX_BW_20: 3574 bw = WMI_PEER_CHWIDTH_20MHZ; 3575 break; 3576 case IEEE80211_STA_RX_BW_40: 3577 bw = WMI_PEER_CHWIDTH_40MHZ; 3578 break; 3579 case IEEE80211_STA_RX_BW_80: 3580 bw = WMI_PEER_CHWIDTH_80MHZ; 3581 break; 3582 case IEEE80211_STA_RX_BW_160: 3583 bw = WMI_PEER_CHWIDTH_160MHZ; 3584 break; 3585 case IEEE80211_STA_RX_BW_320: 3586 bw = WMI_PEER_CHWIDTH_320MHZ; 3587 break; 3588 default: 3589 ath12k_warn(ar->ab, "Invalid bandwidth %d for link station %pM\n", 3590 link_sta->bandwidth, link_sta->addr); 3591 bw = WMI_PEER_CHWIDTH_20MHZ; 3592 break; 3593 } 3594 3595 return bw; 3596 } 3597 3598 static void ath12k_bss_assoc(struct ath12k *ar, 3599 struct ath12k_link_vif *arvif, 3600 struct ieee80211_bss_conf *bss_conf) 3601 { 3602 struct ath12k_vif *ahvif = arvif->ahvif; 3603 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif); 3604 struct ath12k_wmi_vdev_up_params params = {}; 3605 struct ieee80211_link_sta *link_sta; 3606 u8 link_id = bss_conf->link_id; 3607 struct ath12k_link_sta *arsta; 3608 struct ieee80211_sta *ap_sta; 3609 struct ath12k_sta *ahsta; 3610 struct ath12k_peer *peer; 3611 bool is_auth = false; 3612 u32 hemode = 0; 3613 int ret; 3614 3615 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 3616 3617 struct ath12k_wmi_peer_assoc_arg *peer_arg __free(kfree) = 3618 kzalloc(sizeof(*peer_arg), GFP_KERNEL); 3619 if (!peer_arg) 3620 return; 3621 3622 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 3623 "mac vdev %i link id %u assoc bssid %pM aid %d\n", 3624 arvif->vdev_id, link_id, arvif->bssid, ahvif->aid); 3625 3626 rcu_read_lock(); 3627 3628 /* During ML connection, cfg.ap_addr has the MLD address. For 3629 * non-ML connection, it has the BSSID. 3630 */ 3631 ap_sta = ieee80211_find_sta(vif, vif->cfg.ap_addr); 3632 if (!ap_sta) { 3633 ath12k_warn(ar->ab, "failed to find station entry for bss %pM vdev %i\n", 3634 vif->cfg.ap_addr, arvif->vdev_id); 3635 rcu_read_unlock(); 3636 return; 3637 } 3638 3639 ahsta = ath12k_sta_to_ahsta(ap_sta); 3640 3641 arsta = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy, 3642 ahsta->link[link_id]); 3643 if (WARN_ON(!arsta)) { 3644 rcu_read_unlock(); 3645 return; 3646 } 3647 3648 link_sta = ath12k_mac_get_link_sta(arsta); 3649 if (WARN_ON(!link_sta)) { 3650 rcu_read_unlock(); 3651 return; 3652 } 3653 3654 ath12k_peer_assoc_prepare(ar, arvif, arsta, peer_arg, false); 3655 3656 /* link_sta->he_cap must be protected by rcu_read_lock */ 3657 ret = ath12k_mac_vif_recalc_sta_he_txbf(ar, arvif, &link_sta->he_cap, &hemode); 3658 if (ret) { 3659 ath12k_warn(ar->ab, "failed to recalc he txbf for vdev %i on bss %pM: %d\n", 3660 arvif->vdev_id, bss_conf->bssid, ret); 3661 rcu_read_unlock(); 3662 return; 3663 } 3664 3665 rcu_read_unlock(); 3666 3667 /* keep this before ath12k_wmi_send_peer_assoc_cmd() */ 3668 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 3669 WMI_VDEV_PARAM_SET_HEMU_MODE, hemode); 3670 if (ret) { 3671 ath12k_warn(ar->ab, "failed to submit vdev param txbf 0x%x: %d\n", 3672 hemode, ret); 3673 return; 3674 } 3675 3676 peer_arg->is_assoc = true; 3677 ret = ath12k_wmi_send_peer_assoc_cmd(ar, peer_arg); 3678 if (ret) { 3679 ath12k_warn(ar->ab, "failed to run peer assoc for %pM vdev %i: %d\n", 3680 bss_conf->bssid, arvif->vdev_id, ret); 3681 return; 3682 } 3683 3684 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) { 3685 ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n", 3686 bss_conf->bssid, arvif->vdev_id); 3687 return; 3688 } 3689 3690 ret = ath12k_setup_peer_smps(ar, arvif, bss_conf->bssid, 3691 &link_sta->ht_cap, &link_sta->he_6ghz_capa); 3692 if (ret) { 3693 ath12k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n", 3694 arvif->vdev_id, ret); 3695 return; 3696 } 3697 3698 WARN_ON(arvif->is_up); 3699 3700 ahvif->aid = vif->cfg.aid; 3701 ether_addr_copy(arvif->bssid, bss_conf->bssid); 3702 3703 params.vdev_id = arvif->vdev_id; 3704 params.aid = ahvif->aid; 3705 params.bssid = arvif->bssid; 3706 params.tx_bssid = ath12k_mac_get_tx_bssid(arvif); 3707 if (params.tx_bssid) { 3708 params.nontx_profile_idx = bss_conf->bssid_index; 3709 params.nontx_profile_cnt = 1 << bss_conf->bssid_indicator; 3710 } 3711 ret = ath12k_wmi_vdev_up(ar, ¶ms); 3712 if (ret) { 3713 ath12k_warn(ar->ab, "failed to set vdev %d up: %d\n", 3714 arvif->vdev_id, ret); 3715 return; 3716 } 3717 3718 arvif->is_up = true; 3719 arvif->rekey_data.enable_offload = false; 3720 3721 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 3722 "mac vdev %d up (associated) bssid %pM aid %d\n", 3723 arvif->vdev_id, bss_conf->bssid, vif->cfg.aid); 3724 3725 spin_lock_bh(&ar->ab->base_lock); 3726 3727 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arvif->bssid); 3728 if (peer && peer->is_authorized) 3729 is_auth = true; 3730 3731 spin_unlock_bh(&ar->ab->base_lock); 3732 3733 /* Authorize BSS Peer */ 3734 if (is_auth) { 3735 ret = ath12k_wmi_set_peer_param(ar, arvif->bssid, 3736 arvif->vdev_id, 3737 WMI_PEER_AUTHORIZE, 3738 1); 3739 if (ret) 3740 ath12k_warn(ar->ab, "Unable to authorize BSS peer: %d\n", ret); 3741 } 3742 3743 ret = ath12k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id, 3744 &bss_conf->he_obss_pd); 3745 if (ret) 3746 ath12k_warn(ar->ab, "failed to set vdev %i OBSS PD parameters: %d\n", 3747 arvif->vdev_id, ret); 3748 3749 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map) && 3750 ahvif->vdev_type == WMI_VDEV_TYPE_STA && 3751 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) 3752 ath12k_mac_11d_scan_stop_all(ar->ab); 3753 } 3754 3755 static void ath12k_bss_disassoc(struct ath12k *ar, 3756 struct ath12k_link_vif *arvif) 3757 { 3758 int ret; 3759 3760 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 3761 3762 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n", 3763 arvif->vdev_id, arvif->bssid); 3764 3765 ret = ath12k_wmi_vdev_down(ar, arvif->vdev_id); 3766 if (ret) 3767 ath12k_warn(ar->ab, "failed to down vdev %i: %d\n", 3768 arvif->vdev_id, ret); 3769 3770 arvif->is_up = false; 3771 3772 memset(&arvif->rekey_data, 0, sizeof(arvif->rekey_data)); 3773 3774 cancel_delayed_work(&arvif->connection_loss_work); 3775 } 3776 3777 static u32 ath12k_mac_get_rate_hw_value(int bitrate) 3778 { 3779 u32 preamble; 3780 u16 hw_value; 3781 int rate; 3782 size_t i; 3783 3784 if (ath12k_mac_bitrate_is_cck(bitrate)) 3785 preamble = WMI_RATE_PREAMBLE_CCK; 3786 else 3787 preamble = WMI_RATE_PREAMBLE_OFDM; 3788 3789 for (i = 0; i < ARRAY_SIZE(ath12k_legacy_rates); i++) { 3790 if (ath12k_legacy_rates[i].bitrate != bitrate) 3791 continue; 3792 3793 hw_value = ath12k_legacy_rates[i].hw_value; 3794 rate = ATH12K_HW_RATE_CODE(hw_value, 0, preamble); 3795 3796 return rate; 3797 } 3798 3799 return -EINVAL; 3800 } 3801 3802 static void ath12k_recalculate_mgmt_rate(struct ath12k *ar, 3803 struct ath12k_link_vif *arvif, 3804 struct cfg80211_chan_def *def) 3805 { 3806 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 3807 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar); 3808 const struct ieee80211_supported_band *sband; 3809 struct ieee80211_bss_conf *bss_conf; 3810 u8 basic_rate_idx; 3811 int hw_rate_code; 3812 u32 vdev_param; 3813 u16 bitrate; 3814 int ret; 3815 3816 lockdep_assert_wiphy(hw->wiphy); 3817 3818 bss_conf = ath12k_mac_get_link_bss_conf(arvif); 3819 if (!bss_conf) { 3820 ath12k_warn(ar->ab, "unable to access bss link conf in mgmt rate calc for vif %pM link %u\n", 3821 vif->addr, arvif->link_id); 3822 return; 3823 } 3824 3825 sband = hw->wiphy->bands[def->chan->band]; 3826 if (bss_conf->basic_rates) 3827 basic_rate_idx = __ffs(bss_conf->basic_rates); 3828 else 3829 basic_rate_idx = 0; 3830 bitrate = sband->bitrates[basic_rate_idx].bitrate; 3831 3832 hw_rate_code = ath12k_mac_get_rate_hw_value(bitrate); 3833 if (hw_rate_code < 0) { 3834 ath12k_warn(ar->ab, "bitrate not supported %d\n", bitrate); 3835 return; 3836 } 3837 3838 vdev_param = WMI_VDEV_PARAM_MGMT_RATE; 3839 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param, 3840 hw_rate_code); 3841 if (ret) 3842 ath12k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret); 3843 3844 vdev_param = WMI_VDEV_PARAM_BEACON_RATE; 3845 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param, 3846 hw_rate_code); 3847 if (ret) 3848 ath12k_warn(ar->ab, "failed to set beacon tx rate %d\n", ret); 3849 } 3850 3851 static void ath12k_mac_init_arvif(struct ath12k_vif *ahvif, 3852 struct ath12k_link_vif *arvif, int link_id) 3853 { 3854 struct ath12k_hw *ah = ahvif->ah; 3855 u8 _link_id; 3856 int i; 3857 3858 lockdep_assert_wiphy(ah->hw->wiphy); 3859 3860 if (WARN_ON(!arvif)) 3861 return; 3862 3863 if (WARN_ON(link_id >= ATH12K_NUM_MAX_LINKS)) 3864 return; 3865 3866 if (link_id < 0) 3867 _link_id = 0; 3868 else 3869 _link_id = link_id; 3870 3871 arvif->ahvif = ahvif; 3872 arvif->link_id = _link_id; 3873 3874 /* Protects the datapath stats update on a per link basis */ 3875 spin_lock_init(&arvif->link_stats_lock); 3876 3877 INIT_LIST_HEAD(&arvif->list); 3878 INIT_DELAYED_WORK(&arvif->connection_loss_work, 3879 ath12k_mac_vif_sta_connection_loss_work); 3880 3881 arvif->num_stations = 0; 3882 3883 for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) { 3884 arvif->bitrate_mask.control[i].legacy = 0xffffffff; 3885 arvif->bitrate_mask.control[i].gi = NL80211_TXRATE_DEFAULT_GI; 3886 memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff, 3887 sizeof(arvif->bitrate_mask.control[i].ht_mcs)); 3888 memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff, 3889 sizeof(arvif->bitrate_mask.control[i].vht_mcs)); 3890 memset(arvif->bitrate_mask.control[i].he_mcs, 0xff, 3891 sizeof(arvif->bitrate_mask.control[i].he_mcs)); 3892 } 3893 3894 /* Handle MLO related assignments */ 3895 if (link_id >= 0) { 3896 rcu_assign_pointer(ahvif->link[arvif->link_id], arvif); 3897 ahvif->links_map |= BIT(_link_id); 3898 } 3899 3900 ath12k_generic_dbg(ATH12K_DBG_MAC, 3901 "mac init link arvif (link_id %d%s) for vif %pM. links_map 0x%x", 3902 _link_id, (link_id < 0) ? " deflink" : "", ahvif->vif->addr, 3903 ahvif->links_map); 3904 } 3905 3906 static void ath12k_mac_remove_link_interface(struct ieee80211_hw *hw, 3907 struct ath12k_link_vif *arvif) 3908 { 3909 struct ath12k_vif *ahvif = arvif->ahvif; 3910 struct ath12k_hw *ah = hw->priv; 3911 struct ath12k *ar = arvif->ar; 3912 int ret; 3913 3914 lockdep_assert_wiphy(ah->hw->wiphy); 3915 3916 cancel_delayed_work_sync(&arvif->connection_loss_work); 3917 3918 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac remove link interface (vdev %d link id %d)", 3919 arvif->vdev_id, arvif->link_id); 3920 3921 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map) && 3922 ahvif->vdev_type == WMI_VDEV_TYPE_STA && 3923 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) 3924 ath12k_mac_11d_scan_stop(ar); 3925 3926 if (ahvif->vdev_type == WMI_VDEV_TYPE_AP) { 3927 ret = ath12k_peer_delete(ar, arvif->vdev_id, arvif->bssid); 3928 if (ret) 3929 ath12k_warn(ar->ab, "failed to submit AP self-peer removal on vdev %d link id %d: %d", 3930 arvif->vdev_id, arvif->link_id, ret); 3931 } 3932 ath12k_mac_vdev_delete(ar, arvif); 3933 } 3934 3935 static struct ath12k_link_vif *ath12k_mac_assign_link_vif(struct ath12k_hw *ah, 3936 struct ieee80211_vif *vif, 3937 u8 link_id) 3938 { 3939 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 3940 struct ath12k_link_vif *arvif; 3941 3942 lockdep_assert_wiphy(ah->hw->wiphy); 3943 3944 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]); 3945 if (arvif) 3946 return arvif; 3947 3948 /* If this is the first link arvif being created for an ML VIF 3949 * use the preallocated deflink memory except for scan arvifs 3950 */ 3951 if (!ahvif->links_map && link_id < ATH12K_FIRST_SCAN_LINK) { 3952 arvif = &ahvif->deflink; 3953 3954 if (vif->type == NL80211_IFTYPE_STATION) 3955 arvif->is_sta_assoc_link = true; 3956 } else { 3957 arvif = kzalloc(sizeof(*arvif), GFP_KERNEL); 3958 if (!arvif) 3959 return NULL; 3960 } 3961 3962 ath12k_mac_init_arvif(ahvif, arvif, link_id); 3963 3964 return arvif; 3965 } 3966 3967 static void ath12k_mac_unassign_link_vif(struct ath12k_link_vif *arvif) 3968 { 3969 struct ath12k_vif *ahvif = arvif->ahvif; 3970 struct ath12k_hw *ah = ahvif->ah; 3971 3972 lockdep_assert_wiphy(ah->hw->wiphy); 3973 3974 rcu_assign_pointer(ahvif->link[arvif->link_id], NULL); 3975 synchronize_rcu(); 3976 ahvif->links_map &= ~BIT(arvif->link_id); 3977 3978 if (arvif != &ahvif->deflink) 3979 kfree(arvif); 3980 else 3981 memset(arvif, 0, sizeof(*arvif)); 3982 } 3983 3984 static int 3985 ath12k_mac_op_change_vif_links(struct ieee80211_hw *hw, 3986 struct ieee80211_vif *vif, 3987 u16 old_links, u16 new_links, 3988 struct ieee80211_bss_conf *ol[IEEE80211_MLD_MAX_NUM_LINKS]) 3989 { 3990 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 3991 unsigned long to_remove = old_links & ~new_links; 3992 unsigned long to_add = ~old_links & new_links; 3993 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 3994 struct ath12k_link_vif *arvif; 3995 u8 link_id; 3996 3997 lockdep_assert_wiphy(hw->wiphy); 3998 3999 ath12k_generic_dbg(ATH12K_DBG_MAC, 4000 "mac vif link changed for MLD %pM old_links 0x%x new_links 0x%x\n", 4001 vif->addr, old_links, new_links); 4002 4003 for_each_set_bit(link_id, &to_add, IEEE80211_MLD_MAX_NUM_LINKS) { 4004 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 4005 /* mac80211 wants to add link but driver already has the 4006 * link. This should not happen ideally. 4007 */ 4008 if (WARN_ON(arvif)) 4009 return -EINVAL; 4010 4011 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id); 4012 if (WARN_ON(!arvif)) 4013 return -EINVAL; 4014 } 4015 4016 for_each_set_bit(link_id, &to_remove, IEEE80211_MLD_MAX_NUM_LINKS) { 4017 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 4018 if (WARN_ON(!arvif)) 4019 return -EINVAL; 4020 4021 if (!arvif->is_created) 4022 continue; 4023 4024 if (WARN_ON(!arvif->ar)) 4025 return -EINVAL; 4026 4027 ath12k_mac_remove_link_interface(hw, arvif); 4028 ath12k_mac_unassign_link_vif(arvif); 4029 } 4030 4031 return 0; 4032 } 4033 4034 static int ath12k_mac_fils_discovery(struct ath12k_link_vif *arvif, 4035 struct ieee80211_bss_conf *info) 4036 { 4037 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 4038 struct ath12k *ar = arvif->ar; 4039 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar); 4040 struct sk_buff *tmpl; 4041 int ret; 4042 u32 interval; 4043 bool unsol_bcast_probe_resp_enabled = false; 4044 4045 if (info->fils_discovery.max_interval) { 4046 interval = info->fils_discovery.max_interval; 4047 4048 tmpl = ieee80211_get_fils_discovery_tmpl(hw, vif); 4049 if (tmpl) 4050 ret = ath12k_wmi_fils_discovery_tmpl(ar, arvif->vdev_id, 4051 tmpl); 4052 } else if (info->unsol_bcast_probe_resp_interval) { 4053 unsol_bcast_probe_resp_enabled = 1; 4054 interval = info->unsol_bcast_probe_resp_interval; 4055 4056 tmpl = ieee80211_get_unsol_bcast_probe_resp_tmpl(hw, vif); 4057 if (tmpl) 4058 ret = ath12k_wmi_probe_resp_tmpl(ar, arvif->vdev_id, 4059 tmpl); 4060 } else { /* Disable */ 4061 return ath12k_wmi_fils_discovery(ar, arvif->vdev_id, 0, false); 4062 } 4063 4064 if (!tmpl) { 4065 ath12k_warn(ar->ab, 4066 "mac vdev %i failed to retrieve %s template\n", 4067 arvif->vdev_id, (unsol_bcast_probe_resp_enabled ? 4068 "unsolicited broadcast probe response" : 4069 "FILS discovery")); 4070 return -EPERM; 4071 } 4072 kfree_skb(tmpl); 4073 4074 if (!ret) 4075 ret = ath12k_wmi_fils_discovery(ar, arvif->vdev_id, interval, 4076 unsol_bcast_probe_resp_enabled); 4077 4078 return ret; 4079 } 4080 4081 static void ath12k_mac_vif_setup_ps(struct ath12k_link_vif *arvif) 4082 { 4083 struct ath12k *ar = arvif->ar; 4084 struct ieee80211_vif *vif = arvif->ahvif->vif; 4085 struct ieee80211_conf *conf = &ath12k_ar_to_hw(ar)->conf; 4086 enum wmi_sta_powersave_param param; 4087 struct ieee80211_bss_conf *info; 4088 enum wmi_sta_ps_mode psmode; 4089 int ret; 4090 int timeout; 4091 bool enable_ps; 4092 4093 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 4094 4095 if (vif->type != NL80211_IFTYPE_STATION) 4096 return; 4097 4098 enable_ps = arvif->ahvif->ps; 4099 if (enable_ps) { 4100 psmode = WMI_STA_PS_MODE_ENABLED; 4101 param = WMI_STA_PS_PARAM_INACTIVITY_TIME; 4102 4103 timeout = conf->dynamic_ps_timeout; 4104 if (timeout == 0) { 4105 info = ath12k_mac_get_link_bss_conf(arvif); 4106 if (!info) { 4107 ath12k_warn(ar->ab, "unable to access bss link conf in setup ps for vif %pM link %u\n", 4108 vif->addr, arvif->link_id); 4109 return; 4110 } 4111 4112 /* firmware doesn't like 0 */ 4113 timeout = ieee80211_tu_to_usec(info->beacon_int) / 1000; 4114 } 4115 4116 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param, 4117 timeout); 4118 if (ret) { 4119 ath12k_warn(ar->ab, "failed to set inactivity time for vdev %d: %i\n", 4120 arvif->vdev_id, ret); 4121 return; 4122 } 4123 } else { 4124 psmode = WMI_STA_PS_MODE_DISABLED; 4125 } 4126 4127 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d psmode %s\n", 4128 arvif->vdev_id, psmode ? "enable" : "disable"); 4129 4130 ret = ath12k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, psmode); 4131 if (ret) 4132 ath12k_warn(ar->ab, "failed to set sta power save mode %d for vdev %d: %d\n", 4133 psmode, arvif->vdev_id, ret); 4134 } 4135 4136 static void ath12k_mac_op_vif_cfg_changed(struct ieee80211_hw *hw, 4137 struct ieee80211_vif *vif, 4138 u64 changed) 4139 { 4140 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 4141 unsigned long links = ahvif->links_map; 4142 struct ieee80211_vif_cfg *vif_cfg; 4143 struct ieee80211_bss_conf *info; 4144 struct ath12k_link_vif *arvif; 4145 struct ieee80211_sta *sta; 4146 struct ath12k_sta *ahsta; 4147 struct ath12k *ar; 4148 u8 link_id; 4149 4150 lockdep_assert_wiphy(hw->wiphy); 4151 4152 if (changed & BSS_CHANGED_SSID && vif->type == NL80211_IFTYPE_AP) { 4153 ahvif->u.ap.ssid_len = vif->cfg.ssid_len; 4154 if (vif->cfg.ssid_len) 4155 memcpy(ahvif->u.ap.ssid, vif->cfg.ssid, vif->cfg.ssid_len); 4156 } 4157 4158 if (changed & BSS_CHANGED_ASSOC) { 4159 if (vif->cfg.assoc) { 4160 /* only in station mode we can get here, so it's safe 4161 * to use ap_addr 4162 */ 4163 rcu_read_lock(); 4164 sta = ieee80211_find_sta(vif, vif->cfg.ap_addr); 4165 if (!sta) { 4166 rcu_read_unlock(); 4167 WARN_ONCE(1, "failed to find sta with addr %pM\n", 4168 vif->cfg.ap_addr); 4169 return; 4170 } 4171 4172 ahsta = ath12k_sta_to_ahsta(sta); 4173 arvif = wiphy_dereference(hw->wiphy, 4174 ahvif->link[ahsta->assoc_link_id]); 4175 rcu_read_unlock(); 4176 4177 ar = arvif->ar; 4178 /* there is no reason for which an assoc link's 4179 * bss info does not exist 4180 */ 4181 info = ath12k_mac_get_link_bss_conf(arvif); 4182 ath12k_bss_assoc(ar, arvif, info); 4183 4184 /* exclude assoc link as it is done above */ 4185 links &= ~BIT(ahsta->assoc_link_id); 4186 } 4187 4188 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) { 4189 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 4190 if (!arvif || !arvif->ar) 4191 continue; 4192 4193 ar = arvif->ar; 4194 4195 if (vif->cfg.assoc) { 4196 info = ath12k_mac_get_link_bss_conf(arvif); 4197 if (!info) 4198 continue; 4199 4200 ath12k_bss_assoc(ar, arvif, info); 4201 } else { 4202 ath12k_bss_disassoc(ar, arvif); 4203 } 4204 } 4205 } 4206 4207 if (changed & BSS_CHANGED_PS) { 4208 links = ahvif->links_map; 4209 vif_cfg = &vif->cfg; 4210 4211 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) { 4212 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 4213 if (!arvif || !arvif->ar) 4214 continue; 4215 4216 ar = arvif->ar; 4217 4218 if (ar->ab->hw_params->supports_sta_ps) { 4219 ahvif->ps = vif_cfg->ps; 4220 ath12k_mac_vif_setup_ps(arvif); 4221 } 4222 } 4223 } 4224 } 4225 4226 static bool ath12k_mac_supports_tpc(struct ath12k *ar, struct ath12k_vif *ahvif, 4227 const struct cfg80211_chan_def *chandef) 4228 { 4229 return ath12k_wmi_supports_6ghz_cc_ext(ar) && 4230 test_bit(WMI_TLV_SERVICE_EXT_TPC_REG_SUPPORT, ar->ab->wmi_ab.svc_map) && 4231 (ahvif->vdev_type == WMI_VDEV_TYPE_STA || 4232 ahvif->vdev_type == WMI_VDEV_TYPE_AP) && 4233 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE && 4234 chandef->chan && 4235 chandef->chan->band == NL80211_BAND_6GHZ; 4236 } 4237 4238 static void ath12k_mac_bss_info_changed(struct ath12k *ar, 4239 struct ath12k_link_vif *arvif, 4240 struct ieee80211_bss_conf *info, 4241 u64 changed) 4242 { 4243 struct ath12k_vif *ahvif = arvif->ahvif; 4244 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif); 4245 struct cfg80211_chan_def def; 4246 u32 param_id, param_value; 4247 enum nl80211_band band; 4248 u32 vdev_param; 4249 int mcast_rate; 4250 u32 preamble; 4251 u16 hw_value; 4252 u16 bitrate; 4253 int ret; 4254 u8 rateidx; 4255 u32 rate; 4256 4257 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 4258 4259 if (changed & BSS_CHANGED_BEACON_INT) { 4260 arvif->beacon_interval = info->beacon_int; 4261 4262 param_id = WMI_VDEV_PARAM_BEACON_INTERVAL; 4263 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 4264 param_id, 4265 arvif->beacon_interval); 4266 if (ret) 4267 ath12k_warn(ar->ab, "Failed to set beacon interval for VDEV: %d\n", 4268 arvif->vdev_id); 4269 else 4270 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 4271 "Beacon interval: %d set for VDEV: %d\n", 4272 arvif->beacon_interval, arvif->vdev_id); 4273 } 4274 4275 if (changed & BSS_CHANGED_BEACON) { 4276 param_id = WMI_PDEV_PARAM_BEACON_TX_MODE; 4277 param_value = WMI_BEACON_BURST_MODE; 4278 ret = ath12k_wmi_pdev_set_param(ar, param_id, 4279 param_value, ar->pdev->pdev_id); 4280 if (ret) 4281 ath12k_warn(ar->ab, "Failed to set beacon mode for VDEV: %d\n", 4282 arvif->vdev_id); 4283 else 4284 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 4285 "Set burst beacon mode for VDEV: %d\n", 4286 arvif->vdev_id); 4287 4288 ret = ath12k_mac_setup_bcn_tmpl(arvif); 4289 if (ret) 4290 ath12k_warn(ar->ab, "failed to update bcn template: %d\n", 4291 ret); 4292 } 4293 4294 if (changed & (BSS_CHANGED_BEACON_INFO | BSS_CHANGED_BEACON)) { 4295 arvif->dtim_period = info->dtim_period; 4296 4297 param_id = WMI_VDEV_PARAM_DTIM_PERIOD; 4298 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 4299 param_id, 4300 arvif->dtim_period); 4301 4302 if (ret) 4303 ath12k_warn(ar->ab, "Failed to set dtim period for VDEV %d: %i\n", 4304 arvif->vdev_id, ret); 4305 else 4306 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 4307 "DTIM period: %d set for VDEV: %d\n", 4308 arvif->dtim_period, arvif->vdev_id); 4309 } 4310 4311 if (changed & BSS_CHANGED_SSID && 4312 vif->type == NL80211_IFTYPE_AP) { 4313 ahvif->u.ap.ssid_len = vif->cfg.ssid_len; 4314 if (vif->cfg.ssid_len) 4315 memcpy(ahvif->u.ap.ssid, vif->cfg.ssid, vif->cfg.ssid_len); 4316 ahvif->u.ap.hidden_ssid = info->hidden_ssid; 4317 } 4318 4319 if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid)) 4320 ether_addr_copy(arvif->bssid, info->bssid); 4321 4322 if (changed & BSS_CHANGED_BEACON_ENABLED) { 4323 if (info->enable_beacon) { 4324 ret = ath12k_mac_set_he_txbf_conf(arvif); 4325 if (ret) 4326 ath12k_warn(ar->ab, 4327 "failed to set HE TXBF config for vdev: %d\n", 4328 arvif->vdev_id); 4329 4330 ret = ath12k_mac_set_eht_txbf_conf(arvif); 4331 if (ret) 4332 ath12k_warn(ar->ab, 4333 "failed to set EHT TXBF config for vdev: %d\n", 4334 arvif->vdev_id); 4335 } 4336 ath12k_control_beaconing(arvif, info); 4337 4338 if (arvif->is_up && info->he_support && 4339 info->he_oper.params) { 4340 /* TODO: Extend to support 1024 BA Bitmap size */ 4341 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 4342 WMI_VDEV_PARAM_BA_MODE, 4343 WMI_BA_MODE_BUFFER_SIZE_256); 4344 if (ret) 4345 ath12k_warn(ar->ab, 4346 "failed to set BA BUFFER SIZE 256 for vdev: %d\n", 4347 arvif->vdev_id); 4348 4349 param_id = WMI_VDEV_PARAM_HEOPS_0_31; 4350 param_value = info->he_oper.params; 4351 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 4352 param_id, param_value); 4353 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 4354 "he oper param: %x set for VDEV: %d\n", 4355 param_value, arvif->vdev_id); 4356 4357 if (ret) 4358 ath12k_warn(ar->ab, "Failed to set he oper params %x for VDEV %d: %i\n", 4359 param_value, arvif->vdev_id, ret); 4360 } 4361 } 4362 4363 if (changed & BSS_CHANGED_ERP_CTS_PROT) { 4364 u32 cts_prot; 4365 4366 cts_prot = !!(info->use_cts_prot); 4367 param_id = WMI_VDEV_PARAM_PROTECTION_MODE; 4368 4369 if (arvif->is_started) { 4370 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 4371 param_id, cts_prot); 4372 if (ret) 4373 ath12k_warn(ar->ab, "Failed to set CTS prot for VDEV: %d\n", 4374 arvif->vdev_id); 4375 else 4376 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "Set CTS prot: %d for VDEV: %d\n", 4377 cts_prot, arvif->vdev_id); 4378 } else { 4379 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "defer protection mode setup, vdev is not ready yet\n"); 4380 } 4381 } 4382 4383 if (changed & BSS_CHANGED_ERP_SLOT) { 4384 u32 slottime; 4385 4386 if (info->use_short_slot) 4387 slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */ 4388 4389 else 4390 slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */ 4391 4392 param_id = WMI_VDEV_PARAM_SLOT_TIME; 4393 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 4394 param_id, slottime); 4395 if (ret) 4396 ath12k_warn(ar->ab, "Failed to set erp slot for VDEV: %d\n", 4397 arvif->vdev_id); 4398 else 4399 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 4400 "Set slottime: %d for VDEV: %d\n", 4401 slottime, arvif->vdev_id); 4402 } 4403 4404 if (changed & BSS_CHANGED_ERP_PREAMBLE) { 4405 u32 preamble; 4406 4407 if (info->use_short_preamble) 4408 preamble = WMI_VDEV_PREAMBLE_SHORT; 4409 else 4410 preamble = WMI_VDEV_PREAMBLE_LONG; 4411 4412 param_id = WMI_VDEV_PARAM_PREAMBLE; 4413 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 4414 param_id, preamble); 4415 if (ret) 4416 ath12k_warn(ar->ab, "Failed to set preamble for VDEV: %d\n", 4417 arvif->vdev_id); 4418 else 4419 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 4420 "Set preamble: %d for VDEV: %d\n", 4421 preamble, arvif->vdev_id); 4422 } 4423 4424 if (changed & BSS_CHANGED_ASSOC) { 4425 if (vif->cfg.assoc) 4426 ath12k_bss_assoc(ar, arvif, info); 4427 else 4428 ath12k_bss_disassoc(ar, arvif); 4429 } 4430 4431 if (changed & BSS_CHANGED_TXPOWER) { 4432 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev_id %i txpower %d\n", 4433 arvif->vdev_id, info->txpower); 4434 4435 arvif->txpower = info->txpower; 4436 ath12k_mac_txpower_recalc(ar); 4437 } 4438 4439 if (changed & BSS_CHANGED_MCAST_RATE && 4440 !ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)) { 4441 band = def.chan->band; 4442 mcast_rate = info->mcast_rate[band]; 4443 4444 if (mcast_rate > 0) { 4445 rateidx = mcast_rate - 1; 4446 } else { 4447 if (info->basic_rates) 4448 rateidx = __ffs(info->basic_rates); 4449 else 4450 rateidx = 0; 4451 } 4452 4453 if (ar->pdev->cap.supported_bands & WMI_HOST_WLAN_5GHZ_CAP) 4454 rateidx += ATH12K_MAC_FIRST_OFDM_RATE_IDX; 4455 4456 bitrate = ath12k_legacy_rates[rateidx].bitrate; 4457 hw_value = ath12k_legacy_rates[rateidx].hw_value; 4458 4459 if (ath12k_mac_bitrate_is_cck(bitrate)) 4460 preamble = WMI_RATE_PREAMBLE_CCK; 4461 else 4462 preamble = WMI_RATE_PREAMBLE_OFDM; 4463 4464 rate = ATH12K_HW_RATE_CODE(hw_value, 0, preamble); 4465 4466 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 4467 "mac vdev %d mcast_rate %x\n", 4468 arvif->vdev_id, rate); 4469 4470 vdev_param = WMI_VDEV_PARAM_MCAST_DATA_RATE; 4471 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 4472 vdev_param, rate); 4473 if (ret) 4474 ath12k_warn(ar->ab, 4475 "failed to set mcast rate on vdev %i: %d\n", 4476 arvif->vdev_id, ret); 4477 4478 vdev_param = WMI_VDEV_PARAM_BCAST_DATA_RATE; 4479 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 4480 vdev_param, rate); 4481 if (ret) 4482 ath12k_warn(ar->ab, 4483 "failed to set bcast rate on vdev %i: %d\n", 4484 arvif->vdev_id, ret); 4485 } 4486 4487 if (changed & BSS_CHANGED_BASIC_RATES && 4488 !ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)) 4489 ath12k_recalculate_mgmt_rate(ar, arvif, &def); 4490 4491 if (changed & BSS_CHANGED_TWT) { 4492 if (info->twt_requester || info->twt_responder) 4493 ath12k_wmi_send_twt_enable_cmd(ar, ar->pdev->pdev_id); 4494 else 4495 ath12k_wmi_send_twt_disable_cmd(ar, ar->pdev->pdev_id); 4496 } 4497 4498 if (changed & BSS_CHANGED_HE_OBSS_PD) 4499 ath12k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id, 4500 &info->he_obss_pd); 4501 4502 if (changed & BSS_CHANGED_HE_BSS_COLOR) { 4503 if (vif->type == NL80211_IFTYPE_AP) { 4504 ret = ath12k_wmi_obss_color_cfg_cmd(ar, 4505 arvif->vdev_id, 4506 info->he_bss_color.color, 4507 ATH12K_BSS_COLOR_AP_PERIODS, 4508 info->he_bss_color.enabled); 4509 if (ret) 4510 ath12k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n", 4511 arvif->vdev_id, ret); 4512 } else if (vif->type == NL80211_IFTYPE_STATION) { 4513 ret = ath12k_wmi_send_bss_color_change_enable_cmd(ar, 4514 arvif->vdev_id, 4515 1); 4516 if (ret) 4517 ath12k_warn(ar->ab, "failed to enable bss color change on vdev %i: %d\n", 4518 arvif->vdev_id, ret); 4519 ret = ath12k_wmi_obss_color_cfg_cmd(ar, 4520 arvif->vdev_id, 4521 0, 4522 ATH12K_BSS_COLOR_STA_PERIODS, 4523 1); 4524 if (ret) 4525 ath12k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n", 4526 arvif->vdev_id, ret); 4527 } 4528 } 4529 4530 ath12k_mac_fils_discovery(arvif, info); 4531 } 4532 4533 static struct ath12k_vif_cache *ath12k_ahvif_get_link_cache(struct ath12k_vif *ahvif, 4534 u8 link_id) 4535 { 4536 if (!ahvif->cache[link_id]) { 4537 ahvif->cache[link_id] = kzalloc(sizeof(*ahvif->cache[0]), GFP_KERNEL); 4538 if (ahvif->cache[link_id]) 4539 INIT_LIST_HEAD(&ahvif->cache[link_id]->key_conf.list); 4540 } 4541 4542 return ahvif->cache[link_id]; 4543 } 4544 4545 static void ath12k_ahvif_put_link_key_cache(struct ath12k_vif_cache *cache) 4546 { 4547 struct ath12k_key_conf *key_conf, *tmp; 4548 4549 if (!cache || list_empty(&cache->key_conf.list)) 4550 return; 4551 list_for_each_entry_safe(key_conf, tmp, &cache->key_conf.list, list) { 4552 list_del(&key_conf->list); 4553 kfree(key_conf); 4554 } 4555 } 4556 4557 static void ath12k_ahvif_put_link_cache(struct ath12k_vif *ahvif, u8 link_id) 4558 { 4559 if (link_id >= IEEE80211_MLD_MAX_NUM_LINKS) 4560 return; 4561 4562 ath12k_ahvif_put_link_key_cache(ahvif->cache[link_id]); 4563 kfree(ahvif->cache[link_id]); 4564 ahvif->cache[link_id] = NULL; 4565 } 4566 4567 static void ath12k_mac_op_link_info_changed(struct ieee80211_hw *hw, 4568 struct ieee80211_vif *vif, 4569 struct ieee80211_bss_conf *info, 4570 u64 changed) 4571 { 4572 struct ath12k *ar; 4573 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 4574 struct ath12k_vif_cache *cache; 4575 struct ath12k_link_vif *arvif; 4576 u8 link_id = info->link_id; 4577 4578 lockdep_assert_wiphy(hw->wiphy); 4579 4580 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 4581 4582 /* if the vdev is not created on a certain radio, 4583 * cache the info to be updated later on vdev creation 4584 */ 4585 4586 if (!arvif || !arvif->is_created) { 4587 cache = ath12k_ahvif_get_link_cache(ahvif, link_id); 4588 if (!cache) 4589 return; 4590 4591 cache->bss_conf_changed |= changed; 4592 4593 return; 4594 } 4595 4596 ar = arvif->ar; 4597 4598 ath12k_mac_bss_info_changed(ar, arvif, info, changed); 4599 } 4600 4601 static struct ath12k* 4602 ath12k_mac_select_scan_device(struct ieee80211_hw *hw, 4603 struct ieee80211_vif *vif, 4604 u32 center_freq) 4605 { 4606 struct ath12k_hw *ah = hw->priv; 4607 enum nl80211_band band; 4608 struct ath12k *ar; 4609 int i; 4610 4611 if (ah->num_radio == 1) 4612 return ah->radio; 4613 4614 /* Currently mac80211 supports splitting scan requests into 4615 * multiple scan requests per band. 4616 * Loop through first channel and determine the scan radio 4617 * TODO: There could be 5 GHz low/high channels in that case 4618 * split the hw request and perform multiple scans 4619 */ 4620 4621 if (center_freq < ATH12K_MIN_5GHZ_FREQ) 4622 band = NL80211_BAND_2GHZ; 4623 else if (center_freq < ATH12K_MIN_6GHZ_FREQ) 4624 band = NL80211_BAND_5GHZ; 4625 else 4626 band = NL80211_BAND_6GHZ; 4627 4628 for_each_ar(ah, ar, i) { 4629 if (ar->mac.sbands[band].channels && 4630 center_freq >= KHZ_TO_MHZ(ar->freq_range.start_freq) && 4631 center_freq <= KHZ_TO_MHZ(ar->freq_range.end_freq)) 4632 return ar; 4633 } 4634 4635 return NULL; 4636 } 4637 4638 void __ath12k_mac_scan_finish(struct ath12k *ar) 4639 { 4640 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar); 4641 4642 lockdep_assert_held(&ar->data_lock); 4643 4644 switch (ar->scan.state) { 4645 case ATH12K_SCAN_IDLE: 4646 break; 4647 case ATH12K_SCAN_RUNNING: 4648 case ATH12K_SCAN_ABORTING: 4649 if (ar->scan.is_roc && ar->scan.roc_notify) 4650 ieee80211_remain_on_channel_expired(hw); 4651 fallthrough; 4652 case ATH12K_SCAN_STARTING: 4653 cancel_delayed_work(&ar->scan.timeout); 4654 complete_all(&ar->scan.completed); 4655 wiphy_work_queue(ar->ah->hw->wiphy, &ar->scan.vdev_clean_wk); 4656 break; 4657 } 4658 } 4659 4660 void ath12k_mac_scan_finish(struct ath12k *ar) 4661 { 4662 spin_lock_bh(&ar->data_lock); 4663 __ath12k_mac_scan_finish(ar); 4664 spin_unlock_bh(&ar->data_lock); 4665 } 4666 4667 static int ath12k_scan_stop(struct ath12k *ar) 4668 { 4669 struct ath12k_wmi_scan_cancel_arg arg = { 4670 .req_type = WLAN_SCAN_CANCEL_SINGLE, 4671 .scan_id = ATH12K_SCAN_ID, 4672 }; 4673 int ret; 4674 4675 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 4676 4677 /* TODO: Fill other STOP Params */ 4678 arg.pdev_id = ar->pdev->pdev_id; 4679 4680 ret = ath12k_wmi_send_scan_stop_cmd(ar, &arg); 4681 if (ret) { 4682 ath12k_warn(ar->ab, "failed to stop wmi scan: %d\n", ret); 4683 goto out; 4684 } 4685 4686 ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ); 4687 if (ret == 0) { 4688 ath12k_warn(ar->ab, 4689 "failed to receive scan abort comple: timed out\n"); 4690 ret = -ETIMEDOUT; 4691 } else if (ret > 0) { 4692 ret = 0; 4693 } 4694 4695 out: 4696 /* Scan state should be updated in scan completion worker but in 4697 * case firmware fails to deliver the event (for whatever reason) 4698 * it is desired to clean up scan state anyway. Firmware may have 4699 * just dropped the scan completion event delivery due to transport 4700 * pipe being overflown with data and/or it can recover on its own 4701 * before next scan request is submitted. 4702 */ 4703 spin_lock_bh(&ar->data_lock); 4704 if (ret) 4705 __ath12k_mac_scan_finish(ar); 4706 spin_unlock_bh(&ar->data_lock); 4707 4708 return ret; 4709 } 4710 4711 static void ath12k_scan_abort(struct ath12k *ar) 4712 { 4713 int ret; 4714 4715 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 4716 4717 spin_lock_bh(&ar->data_lock); 4718 4719 switch (ar->scan.state) { 4720 case ATH12K_SCAN_IDLE: 4721 /* This can happen if timeout worker kicked in and called 4722 * abortion while scan completion was being processed. 4723 */ 4724 break; 4725 case ATH12K_SCAN_STARTING: 4726 case ATH12K_SCAN_ABORTING: 4727 ath12k_warn(ar->ab, "refusing scan abortion due to invalid scan state: %d\n", 4728 ar->scan.state); 4729 break; 4730 case ATH12K_SCAN_RUNNING: 4731 ar->scan.state = ATH12K_SCAN_ABORTING; 4732 spin_unlock_bh(&ar->data_lock); 4733 4734 ret = ath12k_scan_stop(ar); 4735 if (ret) 4736 ath12k_warn(ar->ab, "failed to abort scan: %d\n", ret); 4737 4738 spin_lock_bh(&ar->data_lock); 4739 break; 4740 } 4741 4742 spin_unlock_bh(&ar->data_lock); 4743 } 4744 4745 static void ath12k_scan_timeout_work(struct work_struct *work) 4746 { 4747 struct ath12k *ar = container_of(work, struct ath12k, 4748 scan.timeout.work); 4749 4750 wiphy_lock(ath12k_ar_to_hw(ar)->wiphy); 4751 ath12k_scan_abort(ar); 4752 wiphy_unlock(ath12k_ar_to_hw(ar)->wiphy); 4753 } 4754 4755 static void ath12k_mac_scan_send_complete(struct ath12k *ar, 4756 struct cfg80211_scan_info *info) 4757 { 4758 struct ath12k_hw *ah = ar->ah; 4759 struct ath12k *partner_ar; 4760 int i; 4761 4762 lockdep_assert_wiphy(ah->hw->wiphy); 4763 4764 for_each_ar(ah, partner_ar, i) 4765 if (partner_ar != ar && 4766 partner_ar->scan.state == ATH12K_SCAN_RUNNING) 4767 return; 4768 4769 ieee80211_scan_completed(ah->hw, info); 4770 } 4771 4772 static void ath12k_scan_vdev_clean_work(struct wiphy *wiphy, struct wiphy_work *work) 4773 { 4774 struct ath12k *ar = container_of(work, struct ath12k, 4775 scan.vdev_clean_wk); 4776 struct ath12k_hw *ah = ar->ah; 4777 struct ath12k_link_vif *arvif; 4778 4779 lockdep_assert_wiphy(wiphy); 4780 4781 arvif = ar->scan.arvif; 4782 4783 /* The scan vdev has already been deleted. This can occur when a 4784 * new scan request is made on the same vif with a different 4785 * frequency, causing the scan arvif to move from one radio to 4786 * another. Or, scan was abrupted and via remove interface, the 4787 * arvif is already deleted. Alternatively, if the scan vdev is not 4788 * being used as an actual vdev, then do not delete it. 4789 */ 4790 if (!arvif || arvif->is_started) 4791 goto work_complete; 4792 4793 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac clean scan vdev (link id %u)", 4794 arvif->link_id); 4795 4796 ath12k_mac_remove_link_interface(ah->hw, arvif); 4797 ath12k_mac_unassign_link_vif(arvif); 4798 4799 work_complete: 4800 spin_lock_bh(&ar->data_lock); 4801 ar->scan.arvif = NULL; 4802 if (!ar->scan.is_roc) { 4803 struct cfg80211_scan_info info = { 4804 .aborted = ((ar->scan.state == 4805 ATH12K_SCAN_ABORTING) || 4806 (ar->scan.state == 4807 ATH12K_SCAN_STARTING)), 4808 }; 4809 4810 ath12k_mac_scan_send_complete(ar, &info); 4811 } 4812 4813 ar->scan.state = ATH12K_SCAN_IDLE; 4814 ar->scan_channel = NULL; 4815 ar->scan.roc_freq = 0; 4816 spin_unlock_bh(&ar->data_lock); 4817 } 4818 4819 static int ath12k_start_scan(struct ath12k *ar, 4820 struct ath12k_wmi_scan_req_arg *arg) 4821 { 4822 int ret; 4823 4824 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 4825 4826 ret = ath12k_wmi_send_scan_start_cmd(ar, arg); 4827 if (ret) 4828 return ret; 4829 4830 ret = wait_for_completion_timeout(&ar->scan.started, 1 * HZ); 4831 if (ret == 0) { 4832 ret = ath12k_scan_stop(ar); 4833 if (ret) 4834 ath12k_warn(ar->ab, "failed to stop scan: %d\n", ret); 4835 4836 return -ETIMEDOUT; 4837 } 4838 4839 /* If we failed to start the scan, return error code at 4840 * this point. This is probably due to some issue in the 4841 * firmware, but no need to wedge the driver due to that... 4842 */ 4843 spin_lock_bh(&ar->data_lock); 4844 if (ar->scan.state == ATH12K_SCAN_IDLE) { 4845 spin_unlock_bh(&ar->data_lock); 4846 return -EINVAL; 4847 } 4848 spin_unlock_bh(&ar->data_lock); 4849 4850 return 0; 4851 } 4852 4853 int ath12k_mac_get_fw_stats(struct ath12k *ar, 4854 struct ath12k_fw_stats_req_params *param) 4855 { 4856 struct ath12k_base *ab = ar->ab; 4857 struct ath12k_hw *ah = ath12k_ar_to_ah(ar); 4858 unsigned long time_left; 4859 int ret; 4860 4861 guard(mutex)(&ah->hw_mutex); 4862 4863 if (ah->state != ATH12K_HW_STATE_ON) 4864 return -ENETDOWN; 4865 4866 ath12k_fw_stats_reset(ar); 4867 4868 reinit_completion(&ar->fw_stats_complete); 4869 reinit_completion(&ar->fw_stats_done); 4870 4871 ret = ath12k_wmi_send_stats_request_cmd(ar, param->stats_id, 4872 param->vdev_id, param->pdev_id); 4873 if (ret) { 4874 ath12k_warn(ab, "failed to request fw stats: %d\n", ret); 4875 return ret; 4876 } 4877 4878 ath12k_dbg(ab, ATH12K_DBG_WMI, 4879 "get fw stat pdev id %d vdev id %d stats id 0x%x\n", 4880 param->pdev_id, param->vdev_id, param->stats_id); 4881 4882 time_left = wait_for_completion_timeout(&ar->fw_stats_complete, 1 * HZ); 4883 if (!time_left) { 4884 ath12k_warn(ab, "time out while waiting for get fw stats\n"); 4885 return -ETIMEDOUT; 4886 } 4887 4888 /* Firmware sends WMI_UPDATE_STATS_EVENTID back-to-back 4889 * when stats data buffer limit is reached. fw_stats_complete 4890 * is completed once host receives first event from firmware, but 4891 * still there could be more events following. Below is to wait 4892 * until firmware completes sending all the events. 4893 */ 4894 time_left = wait_for_completion_timeout(&ar->fw_stats_done, 3 * HZ); 4895 if (!time_left) { 4896 ath12k_warn(ab, "time out while waiting for fw stats done\n"); 4897 return -ETIMEDOUT; 4898 } 4899 4900 return 0; 4901 } 4902 4903 static int ath12k_mac_op_get_txpower(struct ieee80211_hw *hw, 4904 struct ieee80211_vif *vif, 4905 unsigned int link_id, 4906 int *dbm) 4907 { 4908 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 4909 struct ath12k_fw_stats_req_params params = {}; 4910 struct ath12k_fw_stats_pdev *pdev; 4911 struct ath12k_hw *ah = hw->priv; 4912 struct ath12k_link_vif *arvif; 4913 struct ath12k_base *ab; 4914 struct ath12k *ar; 4915 int ret; 4916 4917 /* Final Tx power is minimum of Target Power, CTL power, Regulatory 4918 * Power, PSD EIRP Power. We just know the Regulatory power from the 4919 * regulatory rules obtained. FW knows all these power and sets the min 4920 * of these. Hence, we request the FW pdev stats in which FW reports 4921 * the minimum of all vdev's channel Tx power. 4922 */ 4923 lockdep_assert_wiphy(hw->wiphy); 4924 4925 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]); 4926 if (!arvif || !arvif->ar) 4927 return -EINVAL; 4928 4929 ar = arvif->ar; 4930 ab = ar->ab; 4931 if (ah->state != ATH12K_HW_STATE_ON) 4932 goto err_fallback; 4933 4934 if (test_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags)) 4935 return -EAGAIN; 4936 4937 /* Limit the requests to Firmware for fetching the tx power */ 4938 if (ar->chan_tx_pwr != ATH12K_PDEV_TX_POWER_INVALID && 4939 time_before(jiffies, 4940 msecs_to_jiffies(ATH12K_PDEV_TX_POWER_REFRESH_TIME_MSECS) + 4941 ar->last_tx_power_update)) 4942 goto send_tx_power; 4943 4944 params.pdev_id = ar->pdev->pdev_id; 4945 params.vdev_id = arvif->vdev_id; 4946 params.stats_id = WMI_REQUEST_PDEV_STAT; 4947 ret = ath12k_mac_get_fw_stats(ar, ¶ms); 4948 if (ret) { 4949 ath12k_warn(ab, "failed to request fw pdev stats: %d\n", ret); 4950 goto err_fallback; 4951 } 4952 4953 spin_lock_bh(&ar->data_lock); 4954 pdev = list_first_entry_or_null(&ar->fw_stats.pdevs, 4955 struct ath12k_fw_stats_pdev, list); 4956 if (!pdev) { 4957 spin_unlock_bh(&ar->data_lock); 4958 goto err_fallback; 4959 } 4960 4961 /* tx power reported by firmware is in units of 0.5 dBm */ 4962 ar->chan_tx_pwr = pdev->chan_tx_power / 2; 4963 spin_unlock_bh(&ar->data_lock); 4964 ar->last_tx_power_update = jiffies; 4965 4966 send_tx_power: 4967 *dbm = ar->chan_tx_pwr; 4968 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "txpower fetched from firmware %d dBm\n", 4969 *dbm); 4970 return 0; 4971 4972 err_fallback: 4973 /* We didn't get txpower from FW. Hence, relying on vif->bss_conf.txpower */ 4974 *dbm = vif->bss_conf.txpower; 4975 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "txpower from firmware NaN, reported %d dBm\n", 4976 *dbm); 4977 return 0; 4978 } 4979 4980 static u8 4981 ath12k_mac_find_link_id_by_ar(struct ath12k_vif *ahvif, struct ath12k *ar) 4982 { 4983 struct ath12k_link_vif *arvif; 4984 struct ath12k_hw *ah = ahvif->ah; 4985 unsigned long links = ahvif->links_map; 4986 unsigned long scan_links_map; 4987 u8 link_id; 4988 4989 lockdep_assert_wiphy(ah->hw->wiphy); 4990 4991 for_each_set_bit(link_id, &links, ATH12K_NUM_MAX_LINKS) { 4992 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]); 4993 4994 if (!arvif || !arvif->is_created) 4995 continue; 4996 4997 if (ar == arvif->ar) 4998 return link_id; 4999 } 5000 5001 /* input ar is not assigned to any of the links of ML VIF, use next 5002 * available scan link for scan vdev creation. There are cases where 5003 * single scan req needs to be split in driver and initiate separate 5004 * scan requests to firmware based on device. 5005 */ 5006 5007 /* Unset all non-scan links (0-14) of scan_links_map so that ffs() will 5008 * choose an available link among scan links (i.e link id >= 15) 5009 */ 5010 scan_links_map = ~ahvif->links_map & ATH12K_SCAN_LINKS_MASK; 5011 if (scan_links_map) 5012 return __ffs(scan_links_map); 5013 5014 return ATH12K_FIRST_SCAN_LINK; 5015 } 5016 5017 static int ath12k_mac_initiate_hw_scan(struct ieee80211_hw *hw, 5018 struct ieee80211_vif *vif, 5019 struct ieee80211_scan_request *hw_req, 5020 int n_channels, 5021 struct ieee80211_channel **chan_list, 5022 struct ath12k *ar) 5023 { 5024 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 5025 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 5026 struct ath12k_link_vif *arvif; 5027 struct cfg80211_scan_request *req = &hw_req->req; 5028 struct ath12k_wmi_scan_req_arg *arg = NULL; 5029 u8 link_id; 5030 int ret; 5031 int i; 5032 bool create = true; 5033 5034 lockdep_assert_wiphy(hw->wiphy); 5035 5036 arvif = &ahvif->deflink; 5037 5038 /* check if any of the links of ML VIF is already started on 5039 * radio(ar) corresponding to given scan frequency and use it, 5040 * if not use scan link (link id >= 15) for scan purpose. 5041 */ 5042 link_id = ath12k_mac_find_link_id_by_ar(ahvif, ar); 5043 /* All scan links are occupied. ideally this shouldn't happen as 5044 * mac80211 won't schedule scan for same band until ongoing scan is 5045 * completed, don't try to exceed max links just in case if it happens. 5046 */ 5047 if (link_id >= ATH12K_NUM_MAX_LINKS) 5048 return -EBUSY; 5049 5050 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id); 5051 5052 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac link ID %d selected for scan", 5053 arvif->link_id); 5054 5055 /* If the vif is already assigned to a specific vdev of an ar, 5056 * check whether its already started, vdev which is started 5057 * are not allowed to switch to a new radio. 5058 * If the vdev is not started, but was earlier created on a 5059 * different ar, delete that vdev and create a new one. We don't 5060 * delete at the scan stop as an optimization to avoid redundant 5061 * delete-create vdev's for the same ar, in case the request is 5062 * always on the same band for the vif 5063 */ 5064 if (arvif->is_created) { 5065 if (WARN_ON(!arvif->ar)) 5066 return -EINVAL; 5067 5068 if (ar != arvif->ar && arvif->is_started) 5069 return -EINVAL; 5070 5071 if (ar != arvif->ar) { 5072 ath12k_mac_remove_link_interface(hw, arvif); 5073 ath12k_mac_unassign_link_vif(arvif); 5074 } else { 5075 create = false; 5076 } 5077 } 5078 5079 if (create) { 5080 /* Previous arvif would've been cleared in radio switch block 5081 * above, assign arvif again for create. 5082 */ 5083 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id); 5084 5085 ret = ath12k_mac_vdev_create(ar, arvif); 5086 if (ret) { 5087 ath12k_warn(ar->ab, "unable to create scan vdev %d\n", ret); 5088 return -EINVAL; 5089 } 5090 } 5091 5092 spin_lock_bh(&ar->data_lock); 5093 switch (ar->scan.state) { 5094 case ATH12K_SCAN_IDLE: 5095 reinit_completion(&ar->scan.started); 5096 reinit_completion(&ar->scan.completed); 5097 ar->scan.state = ATH12K_SCAN_STARTING; 5098 ar->scan.is_roc = false; 5099 ar->scan.arvif = arvif; 5100 ret = 0; 5101 break; 5102 case ATH12K_SCAN_STARTING: 5103 case ATH12K_SCAN_RUNNING: 5104 case ATH12K_SCAN_ABORTING: 5105 ret = -EBUSY; 5106 break; 5107 } 5108 spin_unlock_bh(&ar->data_lock); 5109 5110 if (ret) 5111 goto exit; 5112 5113 arg = kzalloc(sizeof(*arg), GFP_KERNEL); 5114 if (!arg) { 5115 ret = -ENOMEM; 5116 goto exit; 5117 } 5118 5119 ath12k_wmi_start_scan_init(ar, arg); 5120 arg->vdev_id = arvif->vdev_id; 5121 arg->scan_id = ATH12K_SCAN_ID; 5122 5123 if (req->ie_len) { 5124 arg->extraie.ptr = kmemdup(req->ie, req->ie_len, GFP_KERNEL); 5125 if (!arg->extraie.ptr) { 5126 ret = -ENOMEM; 5127 goto exit; 5128 } 5129 arg->extraie.len = req->ie_len; 5130 } 5131 5132 if (req->n_ssids) { 5133 arg->num_ssids = req->n_ssids; 5134 for (i = 0; i < arg->num_ssids; i++) 5135 arg->ssid[i] = req->ssids[i]; 5136 } else { 5137 arg->scan_f_passive = 1; 5138 } 5139 5140 if (n_channels) { 5141 arg->num_chan = n_channels; 5142 arg->chan_list = kcalloc(arg->num_chan, sizeof(*arg->chan_list), 5143 GFP_KERNEL); 5144 if (!arg->chan_list) { 5145 ret = -ENOMEM; 5146 goto exit; 5147 } 5148 5149 for (i = 0; i < arg->num_chan; i++) 5150 arg->chan_list[i] = chan_list[i]->center_freq; 5151 } 5152 5153 ret = ath12k_start_scan(ar, arg); 5154 if (ret) { 5155 if (ret == -EBUSY) 5156 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 5157 "scan engine is busy 11d state %d\n", ar->state_11d); 5158 else 5159 ath12k_warn(ar->ab, "failed to start hw scan: %d\n", ret); 5160 5161 spin_lock_bh(&ar->data_lock); 5162 ar->scan.state = ATH12K_SCAN_IDLE; 5163 spin_unlock_bh(&ar->data_lock); 5164 goto exit; 5165 } 5166 5167 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac scan started"); 5168 5169 /* Add a margin to account for event/command processing */ 5170 ieee80211_queue_delayed_work(ath12k_ar_to_hw(ar), &ar->scan.timeout, 5171 msecs_to_jiffies(arg->max_scan_time + 5172 ATH12K_MAC_SCAN_TIMEOUT_MSECS)); 5173 5174 exit: 5175 if (arg) { 5176 kfree(arg->chan_list); 5177 kfree(arg->extraie.ptr); 5178 kfree(arg); 5179 } 5180 5181 if (ar->state_11d == ATH12K_11D_PREPARING && 5182 ahvif->vdev_type == WMI_VDEV_TYPE_STA && 5183 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) 5184 ath12k_mac_11d_scan_start(ar, arvif->vdev_id); 5185 5186 return ret; 5187 } 5188 5189 static int ath12k_mac_op_hw_scan(struct ieee80211_hw *hw, 5190 struct ieee80211_vif *vif, 5191 struct ieee80211_scan_request *hw_req) 5192 { 5193 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 5194 struct ieee80211_channel **chan_list, *chan; 5195 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 5196 unsigned long links_map, link_id; 5197 struct ath12k_link_vif *arvif; 5198 struct ath12k *ar, *scan_ar; 5199 int i, j, ret = 0; 5200 5201 lockdep_assert_wiphy(hw->wiphy); 5202 5203 chan_list = kcalloc(hw_req->req.n_channels, sizeof(*chan_list), GFP_KERNEL); 5204 if (!chan_list) 5205 return -ENOMEM; 5206 5207 /* There could be channels that belong to multiple underlying radio 5208 * in same scan request as mac80211 sees it as single band. In that 5209 * case split the hw_req based on frequency range and schedule scans to 5210 * corresponding radio. 5211 */ 5212 for_each_ar(ah, ar, i) { 5213 int n_chans = 0; 5214 5215 for (j = 0; j < hw_req->req.n_channels; j++) { 5216 chan = hw_req->req.channels[j]; 5217 scan_ar = ath12k_mac_select_scan_device(hw, vif, 5218 chan->center_freq); 5219 if (!scan_ar) { 5220 ath12k_hw_warn(ah, "unable to select scan device for freq %d\n", 5221 chan->center_freq); 5222 ret = -EINVAL; 5223 goto abort; 5224 } 5225 if (ar != scan_ar) 5226 continue; 5227 5228 chan_list[n_chans++] = chan; 5229 } 5230 if (n_chans) { 5231 ret = ath12k_mac_initiate_hw_scan(hw, vif, hw_req, n_chans, 5232 chan_list, ar); 5233 if (ret) 5234 goto abort; 5235 } 5236 } 5237 abort: 5238 /* If any of the parallel scans initiated fails, abort all and 5239 * remove the scan interfaces created. Return complete scan 5240 * failure as mac80211 assumes this as single scan request. 5241 */ 5242 if (ret) { 5243 ath12k_hw_warn(ah, "Scan failed %d , cleanup all scan vdevs\n", ret); 5244 links_map = ahvif->links_map; 5245 for_each_set_bit(link_id, &links_map, ATH12K_NUM_MAX_LINKS) { 5246 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 5247 if (!arvif) 5248 continue; 5249 5250 ar = arvif->ar; 5251 if (ar->scan.arvif == arvif) { 5252 wiphy_work_cancel(hw->wiphy, &ar->scan.vdev_clean_wk); 5253 spin_lock_bh(&ar->data_lock); 5254 ar->scan.arvif = NULL; 5255 ar->scan.state = ATH12K_SCAN_IDLE; 5256 ar->scan_channel = NULL; 5257 ar->scan.roc_freq = 0; 5258 spin_unlock_bh(&ar->data_lock); 5259 } 5260 if (link_id >= ATH12K_FIRST_SCAN_LINK) { 5261 ath12k_mac_remove_link_interface(hw, arvif); 5262 ath12k_mac_unassign_link_vif(arvif); 5263 } 5264 } 5265 } 5266 kfree(chan_list); 5267 return ret; 5268 } 5269 5270 static void ath12k_mac_op_cancel_hw_scan(struct ieee80211_hw *hw, 5271 struct ieee80211_vif *vif) 5272 { 5273 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 5274 unsigned long link_id, links_map = ahvif->links_map; 5275 struct ath12k_link_vif *arvif; 5276 struct ath12k *ar; 5277 5278 lockdep_assert_wiphy(hw->wiphy); 5279 5280 for_each_set_bit(link_id, &links_map, ATH12K_NUM_MAX_LINKS) { 5281 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 5282 if (!arvif || arvif->is_started) 5283 continue; 5284 5285 ar = arvif->ar; 5286 5287 ath12k_scan_abort(ar); 5288 5289 cancel_delayed_work_sync(&ar->scan.timeout); 5290 } 5291 } 5292 5293 static int ath12k_install_key(struct ath12k_link_vif *arvif, 5294 struct ieee80211_key_conf *key, 5295 enum set_key_cmd cmd, 5296 const u8 *macaddr, u32 flags) 5297 { 5298 int ret; 5299 struct ath12k *ar = arvif->ar; 5300 struct wmi_vdev_install_key_arg arg = { 5301 .vdev_id = arvif->vdev_id, 5302 .key_idx = key->keyidx, 5303 .key_len = key->keylen, 5304 .key_data = key->key, 5305 .key_flags = flags, 5306 .ieee80211_key_cipher = key->cipher, 5307 .macaddr = macaddr, 5308 }; 5309 struct ath12k_vif *ahvif = arvif->ahvif; 5310 5311 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 5312 5313 if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags)) 5314 return 0; 5315 5316 if (cmd == DISABLE_KEY) { 5317 /* TODO: Check if FW expects value other than NONE for del */ 5318 /* arg.key_cipher = WMI_CIPHER_NONE; */ 5319 arg.key_len = 0; 5320 arg.key_data = NULL; 5321 goto check_order; 5322 } 5323 5324 switch (key->cipher) { 5325 case WLAN_CIPHER_SUITE_CCMP: 5326 case WLAN_CIPHER_SUITE_CCMP_256: 5327 arg.key_cipher = WMI_CIPHER_AES_CCM; 5328 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT; 5329 break; 5330 case WLAN_CIPHER_SUITE_TKIP: 5331 arg.key_cipher = WMI_CIPHER_TKIP; 5332 arg.key_txmic_len = 8; 5333 arg.key_rxmic_len = 8; 5334 break; 5335 case WLAN_CIPHER_SUITE_GCMP: 5336 case WLAN_CIPHER_SUITE_GCMP_256: 5337 arg.key_cipher = WMI_CIPHER_AES_GCM; 5338 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT; 5339 break; 5340 case WLAN_CIPHER_SUITE_AES_CMAC: 5341 arg.key_cipher = WMI_CIPHER_AES_CMAC; 5342 break; 5343 case WLAN_CIPHER_SUITE_BIP_GMAC_128: 5344 case WLAN_CIPHER_SUITE_BIP_GMAC_256: 5345 arg.key_cipher = WMI_CIPHER_AES_GMAC; 5346 break; 5347 case WLAN_CIPHER_SUITE_BIP_CMAC_256: 5348 arg.key_cipher = WMI_CIPHER_AES_CMAC; 5349 break; 5350 default: 5351 ath12k_warn(ar->ab, "cipher %d is not supported\n", key->cipher); 5352 return -EOPNOTSUPP; 5353 } 5354 5355 if (test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags)) 5356 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV | 5357 IEEE80211_KEY_FLAG_RESERVE_TAILROOM; 5358 5359 check_order: 5360 if (ahvif->vdev_type == WMI_VDEV_TYPE_STA && 5361 arg.key_flags == WMI_KEY_GROUP) { 5362 if (cmd == SET_KEY) { 5363 if (arvif->pairwise_key_done) { 5364 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 5365 "vdev %u pairwise key done, go install group key\n", 5366 arg.vdev_id); 5367 goto install; 5368 } else { 5369 /* WCN7850 firmware requires pairwise key to be installed 5370 * before group key. In case group key comes first, cache 5371 * it and return. Will revisit it once pairwise key gets 5372 * installed. 5373 */ 5374 arvif->group_key = arg; 5375 arvif->group_key_valid = true; 5376 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 5377 "vdev %u group key before pairwise key, cache and skip\n", 5378 arg.vdev_id); 5379 5380 ret = 0; 5381 goto out; 5382 } 5383 } else { 5384 arvif->group_key_valid = false; 5385 } 5386 } 5387 5388 install: 5389 reinit_completion(&ar->install_key_done); 5390 5391 ret = ath12k_wmi_vdev_install_key(arvif->ar, &arg); 5392 if (ret) 5393 return ret; 5394 5395 if (!wait_for_completion_timeout(&ar->install_key_done, 1 * HZ)) 5396 return -ETIMEDOUT; 5397 5398 if (ether_addr_equal(arg.macaddr, arvif->bssid)) 5399 ahvif->key_cipher = arg.ieee80211_key_cipher; 5400 5401 if (ar->install_key_status) { 5402 ret = -EINVAL; 5403 goto out; 5404 } 5405 5406 if (ahvif->vdev_type == WMI_VDEV_TYPE_STA && 5407 arg.key_flags == WMI_KEY_PAIRWISE) { 5408 if (cmd == SET_KEY) { 5409 arvif->pairwise_key_done = true; 5410 if (arvif->group_key_valid) { 5411 /* Install cached GTK */ 5412 arvif->group_key_valid = false; 5413 arg = arvif->group_key; 5414 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 5415 "vdev %u pairwise key done, group key ready, go install\n", 5416 arg.vdev_id); 5417 goto install; 5418 } 5419 } else { 5420 arvif->pairwise_key_done = false; 5421 } 5422 } 5423 5424 out: 5425 if (ret) { 5426 /* In case of failure userspace may not do DISABLE_KEY 5427 * but triggers re-connection directly, so manually reset 5428 * status here. 5429 */ 5430 arvif->group_key_valid = false; 5431 arvif->pairwise_key_done = false; 5432 } 5433 5434 return ret; 5435 } 5436 5437 static int ath12k_clear_peer_keys(struct ath12k_link_vif *arvif, 5438 const u8 *addr) 5439 { 5440 struct ath12k *ar = arvif->ar; 5441 struct ath12k_base *ab = ar->ab; 5442 struct ath12k_peer *peer; 5443 int first_errno = 0; 5444 int ret; 5445 int i; 5446 u32 flags = 0; 5447 5448 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 5449 5450 spin_lock_bh(&ab->base_lock); 5451 peer = ath12k_peer_find(ab, arvif->vdev_id, addr); 5452 spin_unlock_bh(&ab->base_lock); 5453 5454 if (!peer) 5455 return -ENOENT; 5456 5457 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) { 5458 if (!peer->keys[i]) 5459 continue; 5460 5461 /* key flags are not required to delete the key */ 5462 ret = ath12k_install_key(arvif, peer->keys[i], 5463 DISABLE_KEY, addr, flags); 5464 if (ret < 0 && first_errno == 0) 5465 first_errno = ret; 5466 5467 if (ret < 0) 5468 ath12k_warn(ab, "failed to remove peer key %d: %d\n", 5469 i, ret); 5470 5471 spin_lock_bh(&ab->base_lock); 5472 peer->keys[i] = NULL; 5473 spin_unlock_bh(&ab->base_lock); 5474 } 5475 5476 return first_errno; 5477 } 5478 5479 static int ath12k_mac_set_key(struct ath12k *ar, enum set_key_cmd cmd, 5480 struct ath12k_link_vif *arvif, 5481 struct ath12k_link_sta *arsta, 5482 struct ieee80211_key_conf *key) 5483 { 5484 struct ieee80211_sta *sta = NULL; 5485 struct ath12k_base *ab = ar->ab; 5486 struct ath12k_peer *peer; 5487 struct ath12k_sta *ahsta; 5488 const u8 *peer_addr; 5489 int ret; 5490 u32 flags = 0; 5491 5492 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 5493 5494 if (arsta) 5495 sta = ath12k_ahsta_to_sta(arsta->ahsta); 5496 5497 if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ab->dev_flags)) 5498 return 1; 5499 5500 if (sta) 5501 peer_addr = arsta->addr; 5502 else 5503 peer_addr = arvif->bssid; 5504 5505 key->hw_key_idx = key->keyidx; 5506 5507 /* the peer should not disappear in mid-way (unless FW goes awry) since 5508 * we already hold wiphy lock. we just make sure its there now. 5509 */ 5510 spin_lock_bh(&ab->base_lock); 5511 peer = ath12k_peer_find(ab, arvif->vdev_id, peer_addr); 5512 spin_unlock_bh(&ab->base_lock); 5513 5514 if (!peer) { 5515 if (cmd == SET_KEY) { 5516 ath12k_warn(ab, "cannot install key for non-existent peer %pM\n", 5517 peer_addr); 5518 return -EOPNOTSUPP; 5519 } 5520 5521 /* if the peer doesn't exist there is no key to disable 5522 * anymore 5523 */ 5524 return 0; 5525 } 5526 5527 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) 5528 flags = WMI_KEY_PAIRWISE; 5529 else 5530 flags = WMI_KEY_GROUP; 5531 5532 ret = ath12k_install_key(arvif, key, cmd, peer_addr, flags); 5533 if (ret) { 5534 ath12k_warn(ab, "ath12k_install_key failed (%d)\n", ret); 5535 return ret; 5536 } 5537 5538 ret = ath12k_dp_rx_peer_pn_replay_config(arvif, peer_addr, cmd, key); 5539 if (ret) { 5540 ath12k_warn(ab, "failed to offload PN replay detection %d\n", ret); 5541 return ret; 5542 } 5543 5544 spin_lock_bh(&ab->base_lock); 5545 peer = ath12k_peer_find(ab, arvif->vdev_id, peer_addr); 5546 if (peer && cmd == SET_KEY) { 5547 peer->keys[key->keyidx] = key; 5548 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) { 5549 peer->ucast_keyidx = key->keyidx; 5550 peer->sec_type = ath12k_dp_tx_get_encrypt_type(key->cipher); 5551 } else { 5552 peer->mcast_keyidx = key->keyidx; 5553 peer->sec_type_grp = ath12k_dp_tx_get_encrypt_type(key->cipher); 5554 } 5555 } else if (peer && cmd == DISABLE_KEY) { 5556 peer->keys[key->keyidx] = NULL; 5557 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) 5558 peer->ucast_keyidx = 0; 5559 else 5560 peer->mcast_keyidx = 0; 5561 } else if (!peer) 5562 /* impossible unless FW goes crazy */ 5563 ath12k_warn(ab, "peer %pM disappeared!\n", peer_addr); 5564 5565 if (sta) { 5566 ahsta = ath12k_sta_to_ahsta(sta); 5567 5568 switch (key->cipher) { 5569 case WLAN_CIPHER_SUITE_TKIP: 5570 case WLAN_CIPHER_SUITE_CCMP: 5571 case WLAN_CIPHER_SUITE_CCMP_256: 5572 case WLAN_CIPHER_SUITE_GCMP: 5573 case WLAN_CIPHER_SUITE_GCMP_256: 5574 if (cmd == SET_KEY) 5575 ahsta->pn_type = HAL_PN_TYPE_WPA; 5576 else 5577 ahsta->pn_type = HAL_PN_TYPE_NONE; 5578 break; 5579 default: 5580 ahsta->pn_type = HAL_PN_TYPE_NONE; 5581 break; 5582 } 5583 } 5584 5585 spin_unlock_bh(&ab->base_lock); 5586 5587 return 0; 5588 } 5589 5590 static int ath12k_mac_update_key_cache(struct ath12k_vif_cache *cache, 5591 enum set_key_cmd cmd, 5592 struct ieee80211_sta *sta, 5593 struct ieee80211_key_conf *key) 5594 { 5595 struct ath12k_key_conf *key_conf, *tmp; 5596 5597 list_for_each_entry_safe(key_conf, tmp, &cache->key_conf.list, list) { 5598 if (key_conf->key != key) 5599 continue; 5600 5601 /* If SET key entry is already present in cache, nothing to do, 5602 * just return 5603 */ 5604 if (cmd == SET_KEY) 5605 return 0; 5606 5607 /* DEL key for an old SET key which driver hasn't flushed yet. 5608 */ 5609 list_del(&key_conf->list); 5610 kfree(key_conf); 5611 } 5612 5613 if (cmd == SET_KEY) { 5614 key_conf = kzalloc(sizeof(*key_conf), GFP_KERNEL); 5615 5616 if (!key_conf) 5617 return -ENOMEM; 5618 5619 key_conf->cmd = cmd; 5620 key_conf->sta = sta; 5621 key_conf->key = key; 5622 list_add_tail(&key_conf->list, 5623 &cache->key_conf.list); 5624 } 5625 5626 return 0; 5627 } 5628 5629 static int ath12k_mac_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd, 5630 struct ieee80211_vif *vif, struct ieee80211_sta *sta, 5631 struct ieee80211_key_conf *key) 5632 { 5633 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 5634 struct ath12k_link_vif *arvif; 5635 struct ath12k_link_sta *arsta = NULL; 5636 struct ath12k_vif_cache *cache; 5637 struct ath12k_sta *ahsta; 5638 unsigned long links; 5639 u8 link_id; 5640 int ret; 5641 5642 lockdep_assert_wiphy(hw->wiphy); 5643 5644 /* IGTK needs to be done in host software */ 5645 if (key->keyidx == 4 || key->keyidx == 5) 5646 return 1; 5647 5648 if (key->keyidx > WMI_MAX_KEY_INDEX) 5649 return -ENOSPC; 5650 5651 if (sta) { 5652 ahsta = ath12k_sta_to_ahsta(sta); 5653 5654 /* For an ML STA Pairwise key is same for all associated link Stations, 5655 * hence do set key for all link STAs which are active. 5656 */ 5657 if (sta->mlo) { 5658 links = ahsta->links_map; 5659 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) { 5660 arvif = wiphy_dereference(hw->wiphy, 5661 ahvif->link[link_id]); 5662 arsta = wiphy_dereference(hw->wiphy, 5663 ahsta->link[link_id]); 5664 5665 if (WARN_ON(!arvif || !arsta)) 5666 /* arvif and arsta are expected to be valid when 5667 * STA is present. 5668 */ 5669 continue; 5670 5671 ret = ath12k_mac_set_key(arvif->ar, cmd, arvif, 5672 arsta, key); 5673 if (ret) 5674 break; 5675 } 5676 5677 return 0; 5678 } 5679 5680 arsta = &ahsta->deflink; 5681 arvif = arsta->arvif; 5682 if (WARN_ON(!arvif)) 5683 return -EINVAL; 5684 5685 ret = ath12k_mac_set_key(arvif->ar, cmd, arvif, arsta, key); 5686 if (ret) 5687 return ret; 5688 5689 return 0; 5690 } 5691 5692 if (key->link_id >= 0 && key->link_id < IEEE80211_MLD_MAX_NUM_LINKS) { 5693 link_id = key->link_id; 5694 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 5695 } else { 5696 link_id = 0; 5697 arvif = &ahvif->deflink; 5698 } 5699 5700 if (!arvif || !arvif->is_created) { 5701 cache = ath12k_ahvif_get_link_cache(ahvif, link_id); 5702 if (!cache) 5703 return -ENOSPC; 5704 5705 ret = ath12k_mac_update_key_cache(cache, cmd, sta, key); 5706 if (ret) 5707 return ret; 5708 5709 return 0; 5710 } 5711 5712 ret = ath12k_mac_set_key(arvif->ar, cmd, arvif, NULL, key); 5713 if (ret) 5714 return ret; 5715 5716 return 0; 5717 } 5718 5719 static int 5720 ath12k_mac_bitrate_mask_num_vht_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].vht_mcs); i++) 5728 num_rates += hweight16(mask->control[band].vht_mcs[i]); 5729 5730 return num_rates; 5731 } 5732 5733 static int 5734 ath12k_mac_bitrate_mask_num_he_rates(struct ath12k *ar, 5735 enum nl80211_band band, 5736 const struct cfg80211_bitrate_mask *mask) 5737 { 5738 int num_rates = 0; 5739 int i; 5740 5741 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) 5742 num_rates += hweight16(mask->control[band].he_mcs[i]); 5743 5744 return num_rates; 5745 } 5746 5747 static int 5748 ath12k_mac_set_peer_vht_fixed_rate(struct ath12k_link_vif *arvif, 5749 struct ath12k_link_sta *arsta, 5750 const struct cfg80211_bitrate_mask *mask, 5751 enum nl80211_band band) 5752 { 5753 struct ath12k *ar = arvif->ar; 5754 u8 vht_rate, nss; 5755 u32 rate_code; 5756 int ret, i; 5757 5758 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 5759 5760 nss = 0; 5761 5762 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) { 5763 if (hweight16(mask->control[band].vht_mcs[i]) == 1) { 5764 nss = i + 1; 5765 vht_rate = ffs(mask->control[band].vht_mcs[i]) - 1; 5766 } 5767 } 5768 5769 if (!nss) { 5770 ath12k_warn(ar->ab, "No single VHT Fixed rate found to set for %pM", 5771 arsta->addr); 5772 return -EINVAL; 5773 } 5774 5775 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 5776 "Setting Fixed VHT Rate for peer %pM. Device will not switch to any other selected rates", 5777 arsta->addr); 5778 5779 rate_code = ATH12K_HW_RATE_CODE(vht_rate, nss - 1, 5780 WMI_RATE_PREAMBLE_VHT); 5781 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, 5782 arvif->vdev_id, 5783 WMI_PEER_PARAM_FIXED_RATE, 5784 rate_code); 5785 if (ret) 5786 ath12k_warn(ar->ab, 5787 "failed to update STA %pM Fixed Rate %d: %d\n", 5788 arsta->addr, rate_code, ret); 5789 5790 return ret; 5791 } 5792 5793 static int 5794 ath12k_mac_set_peer_he_fixed_rate(struct ath12k_link_vif *arvif, 5795 struct ath12k_link_sta *arsta, 5796 const struct cfg80211_bitrate_mask *mask, 5797 enum nl80211_band band) 5798 { 5799 struct ath12k *ar = arvif->ar; 5800 u8 he_rate, nss; 5801 u32 rate_code; 5802 int ret, i; 5803 struct ath12k_sta *ahsta = arsta->ahsta; 5804 struct ieee80211_sta *sta; 5805 5806 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 5807 5808 sta = ath12k_ahsta_to_sta(ahsta); 5809 nss = 0; 5810 5811 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) { 5812 if (hweight16(mask->control[band].he_mcs[i]) == 1) { 5813 nss = i + 1; 5814 he_rate = ffs(mask->control[band].he_mcs[i]) - 1; 5815 } 5816 } 5817 5818 if (!nss) { 5819 ath12k_warn(ar->ab, "No single HE Fixed rate found to set for %pM", 5820 arsta->addr); 5821 return -EINVAL; 5822 } 5823 5824 /* Avoid updating invalid nss as fixed rate*/ 5825 if (nss > sta->deflink.rx_nss) 5826 return -EINVAL; 5827 5828 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 5829 "Setting Fixed HE Rate for peer %pM. Device will not switch to any other selected rates", 5830 arsta->addr); 5831 5832 rate_code = ATH12K_HW_RATE_CODE(he_rate, nss - 1, 5833 WMI_RATE_PREAMBLE_HE); 5834 5835 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, 5836 arvif->vdev_id, 5837 WMI_PEER_PARAM_FIXED_RATE, 5838 rate_code); 5839 if (ret) 5840 ath12k_warn(ar->ab, 5841 "failed to update STA %pM Fixed Rate %d: %d\n", 5842 arsta->addr, rate_code, ret); 5843 5844 return ret; 5845 } 5846 5847 static int ath12k_mac_station_assoc(struct ath12k *ar, 5848 struct ath12k_link_vif *arvif, 5849 struct ath12k_link_sta *arsta, 5850 bool reassoc) 5851 { 5852 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 5853 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 5854 struct ieee80211_link_sta *link_sta; 5855 int ret; 5856 struct cfg80211_chan_def def; 5857 enum nl80211_band band; 5858 struct cfg80211_bitrate_mask *mask; 5859 u8 num_vht_rates, num_he_rates; 5860 u8 link_id = arvif->link_id; 5861 5862 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 5863 5864 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) 5865 return -EPERM; 5866 5867 if (WARN_ON(!rcu_access_pointer(sta->link[link_id]))) 5868 return -EINVAL; 5869 5870 band = def.chan->band; 5871 mask = &arvif->bitrate_mask; 5872 5873 struct ath12k_wmi_peer_assoc_arg *peer_arg __free(kfree) = 5874 kzalloc(sizeof(*peer_arg), GFP_KERNEL); 5875 if (!peer_arg) 5876 return -ENOMEM; 5877 5878 ath12k_peer_assoc_prepare(ar, arvif, arsta, peer_arg, reassoc); 5879 5880 if (peer_arg->peer_nss < 1) { 5881 ath12k_warn(ar->ab, 5882 "invalid peer NSS %d\n", peer_arg->peer_nss); 5883 return -EINVAL; 5884 } 5885 5886 peer_arg->is_assoc = true; 5887 ret = ath12k_wmi_send_peer_assoc_cmd(ar, peer_arg); 5888 if (ret) { 5889 ath12k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n", 5890 arsta->addr, arvif->vdev_id, ret); 5891 return ret; 5892 } 5893 5894 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) { 5895 ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n", 5896 arsta->addr, arvif->vdev_id); 5897 return -ETIMEDOUT; 5898 } 5899 5900 num_vht_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band, mask); 5901 num_he_rates = ath12k_mac_bitrate_mask_num_he_rates(ar, band, mask); 5902 5903 /* If single VHT/HE rate is configured (by set_bitrate_mask()), 5904 * peer_assoc will disable VHT/HE. This is now enabled by a peer specific 5905 * fixed param. 5906 * Note that all other rates and NSS will be disabled for this peer. 5907 */ 5908 link_sta = ath12k_mac_get_link_sta(arsta); 5909 if (!link_sta) { 5910 ath12k_warn(ar->ab, "unable to access link sta in station assoc\n"); 5911 return -EINVAL; 5912 } 5913 5914 spin_lock_bh(&ar->data_lock); 5915 arsta->bw = ath12k_mac_ieee80211_sta_bw_to_wmi(ar, link_sta); 5916 arsta->bw_prev = link_sta->bandwidth; 5917 spin_unlock_bh(&ar->data_lock); 5918 5919 if (link_sta->vht_cap.vht_supported && num_vht_rates == 1) { 5920 ret = ath12k_mac_set_peer_vht_fixed_rate(arvif, arsta, mask, band); 5921 } else if (link_sta->he_cap.has_he && num_he_rates == 1) { 5922 ret = ath12k_mac_set_peer_he_fixed_rate(arvif, arsta, mask, band); 5923 if (ret) 5924 return ret; 5925 } 5926 5927 /* Re-assoc is run only to update supported rates for given station. It 5928 * doesn't make much sense to reconfigure the peer completely. 5929 */ 5930 if (reassoc) 5931 return 0; 5932 5933 ret = ath12k_setup_peer_smps(ar, arvif, arsta->addr, 5934 &link_sta->ht_cap, &link_sta->he_6ghz_capa); 5935 if (ret) { 5936 ath12k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n", 5937 arvif->vdev_id, ret); 5938 return ret; 5939 } 5940 5941 if (!sta->wme) { 5942 arvif->num_legacy_stations++; 5943 ret = ath12k_recalc_rtscts_prot(arvif); 5944 if (ret) 5945 return ret; 5946 } 5947 5948 if (sta->wme && sta->uapsd_queues) { 5949 ret = ath12k_peer_assoc_qos_ap(ar, arvif, arsta); 5950 if (ret) { 5951 ath12k_warn(ar->ab, "failed to set qos params for STA %pM for vdev %i: %d\n", 5952 arsta->addr, arvif->vdev_id, ret); 5953 return ret; 5954 } 5955 } 5956 5957 return 0; 5958 } 5959 5960 static int ath12k_mac_station_disassoc(struct ath12k *ar, 5961 struct ath12k_link_vif *arvif, 5962 struct ath12k_link_sta *arsta) 5963 { 5964 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 5965 5966 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 5967 5968 if (!sta->wme) { 5969 arvif->num_legacy_stations--; 5970 return ath12k_recalc_rtscts_prot(arvif); 5971 } 5972 5973 return 0; 5974 } 5975 5976 static void ath12k_sta_rc_update_wk(struct wiphy *wiphy, struct wiphy_work *wk) 5977 { 5978 struct ieee80211_link_sta *link_sta; 5979 struct ath12k *ar; 5980 struct ath12k_link_vif *arvif; 5981 struct ieee80211_sta *sta; 5982 struct cfg80211_chan_def def; 5983 enum nl80211_band band; 5984 const u8 *ht_mcs_mask; 5985 const u16 *vht_mcs_mask; 5986 const u16 *he_mcs_mask; 5987 u32 changed, bw, nss, mac_nss, smps, bw_prev; 5988 int err, num_vht_rates, num_he_rates; 5989 const struct cfg80211_bitrate_mask *mask; 5990 enum wmi_phy_mode peer_phymode; 5991 struct ath12k_link_sta *arsta; 5992 struct ieee80211_vif *vif; 5993 5994 lockdep_assert_wiphy(wiphy); 5995 5996 arsta = container_of(wk, struct ath12k_link_sta, update_wk); 5997 sta = ath12k_ahsta_to_sta(arsta->ahsta); 5998 arvif = arsta->arvif; 5999 vif = ath12k_ahvif_to_vif(arvif->ahvif); 6000 ar = arvif->ar; 6001 6002 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) 6003 return; 6004 6005 band = def.chan->band; 6006 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs; 6007 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs; 6008 he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs; 6009 6010 spin_lock_bh(&ar->data_lock); 6011 6012 changed = arsta->changed; 6013 arsta->changed = 0; 6014 6015 bw = arsta->bw; 6016 bw_prev = arsta->bw_prev; 6017 nss = arsta->nss; 6018 smps = arsta->smps; 6019 6020 spin_unlock_bh(&ar->data_lock); 6021 6022 nss = max_t(u32, 1, nss); 6023 mac_nss = max3(ath12k_mac_max_ht_nss(ht_mcs_mask), 6024 ath12k_mac_max_vht_nss(vht_mcs_mask), 6025 ath12k_mac_max_he_nss(he_mcs_mask)); 6026 nss = min(nss, mac_nss); 6027 6028 struct ath12k_wmi_peer_assoc_arg *peer_arg __free(kfree) = 6029 kzalloc(sizeof(*peer_arg), GFP_KERNEL); 6030 if (!peer_arg) 6031 return; 6032 6033 if (changed & IEEE80211_RC_BW_CHANGED) { 6034 ath12k_peer_assoc_h_phymode(ar, arvif, arsta, peer_arg); 6035 peer_phymode = peer_arg->peer_phymode; 6036 6037 if (bw > bw_prev) { 6038 /* Phymode shows maximum supported channel width, if we 6039 * upgrade bandwidth then due to sanity check of firmware, 6040 * we have to send WMI_PEER_PHYMODE followed by 6041 * WMI_PEER_CHWIDTH 6042 */ 6043 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac bandwidth upgrade for sta %pM new %d old %d\n", 6044 arsta->addr, bw, bw_prev); 6045 err = ath12k_wmi_set_peer_param(ar, arsta->addr, 6046 arvif->vdev_id, WMI_PEER_PHYMODE, 6047 peer_phymode); 6048 if (err) { 6049 ath12k_warn(ar->ab, "failed to update STA %pM to peer phymode %d: %d\n", 6050 arsta->addr, peer_phymode, err); 6051 return; 6052 } 6053 err = ath12k_wmi_set_peer_param(ar, arsta->addr, 6054 arvif->vdev_id, WMI_PEER_CHWIDTH, 6055 bw); 6056 if (err) 6057 ath12k_warn(ar->ab, "failed to update STA %pM to peer bandwidth %d: %d\n", 6058 arsta->addr, bw, err); 6059 } else { 6060 /* When we downgrade bandwidth this will conflict with phymode 6061 * and cause to trigger firmware crash. In this case we send 6062 * WMI_PEER_CHWIDTH followed by WMI_PEER_PHYMODE 6063 */ 6064 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac bandwidth downgrade for sta %pM new %d old %d\n", 6065 arsta->addr, bw, bw_prev); 6066 err = ath12k_wmi_set_peer_param(ar, arsta->addr, 6067 arvif->vdev_id, WMI_PEER_CHWIDTH, 6068 bw); 6069 if (err) { 6070 ath12k_warn(ar->ab, "failed to update STA %pM peer to bandwidth %d: %d\n", 6071 arsta->addr, bw, err); 6072 return; 6073 } 6074 err = ath12k_wmi_set_peer_param(ar, arsta->addr, 6075 arvif->vdev_id, WMI_PEER_PHYMODE, 6076 peer_phymode); 6077 if (err) 6078 ath12k_warn(ar->ab, "failed to update STA %pM to peer phymode %d: %d\n", 6079 arsta->addr, peer_phymode, err); 6080 } 6081 } 6082 6083 if (changed & IEEE80211_RC_NSS_CHANGED) { 6084 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac update sta %pM nss %d\n", 6085 arsta->addr, nss); 6086 6087 err = ath12k_wmi_set_peer_param(ar, arsta->addr, arvif->vdev_id, 6088 WMI_PEER_NSS, nss); 6089 if (err) 6090 ath12k_warn(ar->ab, "failed to update STA %pM nss %d: %d\n", 6091 arsta->addr, nss, err); 6092 } 6093 6094 if (changed & IEEE80211_RC_SMPS_CHANGED) { 6095 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac update sta %pM smps %d\n", 6096 arsta->addr, smps); 6097 6098 err = ath12k_wmi_set_peer_param(ar, arsta->addr, arvif->vdev_id, 6099 WMI_PEER_MIMO_PS_STATE, smps); 6100 if (err) 6101 ath12k_warn(ar->ab, "failed to update STA %pM smps %d: %d\n", 6102 arsta->addr, smps, err); 6103 } 6104 6105 if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) { 6106 mask = &arvif->bitrate_mask; 6107 num_vht_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band, 6108 mask); 6109 num_he_rates = ath12k_mac_bitrate_mask_num_he_rates(ar, band, 6110 mask); 6111 6112 /* Peer_assoc_prepare will reject vht rates in 6113 * bitrate_mask if its not available in range format and 6114 * sets vht tx_rateset as unsupported. So multiple VHT MCS 6115 * setting(eg. MCS 4,5,6) per peer is not supported here. 6116 * But, Single rate in VHT mask can be set as per-peer 6117 * fixed rate. But even if any HT rates are configured in 6118 * the bitrate mask, device will not switch to those rates 6119 * when per-peer Fixed rate is set. 6120 * TODO: Check RATEMASK_CMDID to support auto rates selection 6121 * across HT/VHT and for multiple VHT MCS support. 6122 */ 6123 link_sta = ath12k_mac_get_link_sta(arsta); 6124 if (!link_sta) { 6125 ath12k_warn(ar->ab, "unable to access link sta in peer assoc he for sta %pM link %u\n", 6126 sta->addr, arsta->link_id); 6127 return; 6128 } 6129 6130 if (link_sta->vht_cap.vht_supported && num_vht_rates == 1) { 6131 ath12k_mac_set_peer_vht_fixed_rate(arvif, arsta, mask, 6132 band); 6133 } else if (link_sta->he_cap.has_he && num_he_rates == 1) { 6134 ath12k_mac_set_peer_he_fixed_rate(arvif, arsta, mask, band); 6135 } else { 6136 /* If the peer is non-VHT/HE or no fixed VHT/HE rate 6137 * is provided in the new bitrate mask we set the 6138 * other rates using peer_assoc command. Also clear 6139 * the peer fixed rate settings as it has higher proprity 6140 * than peer assoc 6141 */ 6142 err = ath12k_wmi_set_peer_param(ar, arsta->addr, 6143 arvif->vdev_id, 6144 WMI_PEER_PARAM_FIXED_RATE, 6145 WMI_FIXED_RATE_NONE); 6146 if (err) 6147 ath12k_warn(ar->ab, 6148 "failed to disable peer fixed rate for STA %pM ret %d\n", 6149 arsta->addr, err); 6150 6151 ath12k_peer_assoc_prepare(ar, arvif, arsta, 6152 peer_arg, true); 6153 6154 peer_arg->is_assoc = false; 6155 err = ath12k_wmi_send_peer_assoc_cmd(ar, peer_arg); 6156 if (err) 6157 ath12k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n", 6158 arsta->addr, arvif->vdev_id, err); 6159 6160 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) 6161 ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n", 6162 arsta->addr, arvif->vdev_id); 6163 } 6164 } 6165 } 6166 6167 static void ath12k_mac_free_unassign_link_sta(struct ath12k_hw *ah, 6168 struct ath12k_sta *ahsta, 6169 u8 link_id) 6170 { 6171 struct ath12k_link_sta *arsta; 6172 6173 lockdep_assert_wiphy(ah->hw->wiphy); 6174 6175 if (WARN_ON(link_id >= IEEE80211_MLD_MAX_NUM_LINKS)) 6176 return; 6177 6178 arsta = wiphy_dereference(ah->hw->wiphy, ahsta->link[link_id]); 6179 if (WARN_ON(!arsta)) 6180 return; 6181 6182 ahsta->links_map &= ~BIT(link_id); 6183 rcu_assign_pointer(ahsta->link[link_id], NULL); 6184 synchronize_rcu(); 6185 6186 if (arsta == &ahsta->deflink) { 6187 arsta->link_id = ATH12K_INVALID_LINK_ID; 6188 arsta->ahsta = NULL; 6189 arsta->arvif = NULL; 6190 return; 6191 } 6192 6193 kfree(arsta); 6194 } 6195 6196 static int ath12k_mac_inc_num_stations(struct ath12k_link_vif *arvif, 6197 struct ath12k_link_sta *arsta) 6198 { 6199 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 6200 struct ath12k *ar = arvif->ar; 6201 6202 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 6203 6204 if (arvif->ahvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls) 6205 return 0; 6206 6207 if (ar->num_stations >= ar->max_num_stations) 6208 return -ENOBUFS; 6209 6210 ar->num_stations++; 6211 arvif->num_stations++; 6212 6213 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 6214 "mac station %pM connected to vdev %u num_stations %u\n", 6215 arsta->addr, arvif->vdev_id, arvif->num_stations); 6216 6217 return 0; 6218 } 6219 6220 static void ath12k_mac_dec_num_stations(struct ath12k_link_vif *arvif, 6221 struct ath12k_link_sta *arsta) 6222 { 6223 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 6224 struct ath12k *ar = arvif->ar; 6225 6226 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 6227 6228 if (arvif->ahvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls) 6229 return; 6230 6231 ar->num_stations--; 6232 6233 if (arvif->num_stations) { 6234 arvif->num_stations--; 6235 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 6236 "mac station %pM disconnected from vdev %u num_stations %u\n", 6237 arsta->addr, arvif->vdev_id, arvif->num_stations); 6238 } else { 6239 ath12k_warn(ar->ab, 6240 "mac station %pM disconnect for vdev %u without any connected station\n", 6241 arsta->addr, arvif->vdev_id); 6242 } 6243 } 6244 6245 static void ath12k_mac_station_post_remove(struct ath12k *ar, 6246 struct ath12k_link_vif *arvif, 6247 struct ath12k_link_sta *arsta) 6248 { 6249 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 6250 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 6251 struct ath12k_peer *peer; 6252 6253 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 6254 6255 ath12k_mac_dec_num_stations(arvif, arsta); 6256 6257 spin_lock_bh(&ar->ab->base_lock); 6258 6259 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr); 6260 if (peer && peer->sta == sta) { 6261 ath12k_warn(ar->ab, "Found peer entry %pM n vdev %i after it was supposedly removed\n", 6262 vif->addr, arvif->vdev_id); 6263 peer->sta = NULL; 6264 list_del(&peer->list); 6265 kfree(peer); 6266 ar->num_peers--; 6267 } 6268 6269 spin_unlock_bh(&ar->ab->base_lock); 6270 6271 kfree(arsta->rx_stats); 6272 arsta->rx_stats = NULL; 6273 } 6274 6275 static int ath12k_mac_station_unauthorize(struct ath12k *ar, 6276 struct ath12k_link_vif *arvif, 6277 struct ath12k_link_sta *arsta) 6278 { 6279 struct ath12k_peer *peer; 6280 int ret; 6281 6282 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 6283 6284 spin_lock_bh(&ar->ab->base_lock); 6285 6286 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr); 6287 if (peer) 6288 peer->is_authorized = false; 6289 6290 spin_unlock_bh(&ar->ab->base_lock); 6291 6292 /* Driver must clear the keys during the state change from 6293 * IEEE80211_STA_AUTHORIZED to IEEE80211_STA_ASSOC, since after 6294 * returning from here, mac80211 is going to delete the keys 6295 * in __sta_info_destroy_part2(). This will ensure that the driver does 6296 * not retain stale key references after mac80211 deletes the keys. 6297 */ 6298 ret = ath12k_clear_peer_keys(arvif, arsta->addr); 6299 if (ret) { 6300 ath12k_warn(ar->ab, "failed to clear all peer keys for vdev %i: %d\n", 6301 arvif->vdev_id, ret); 6302 return ret; 6303 } 6304 6305 return 0; 6306 } 6307 6308 static int ath12k_mac_station_authorize(struct ath12k *ar, 6309 struct ath12k_link_vif *arvif, 6310 struct ath12k_link_sta *arsta) 6311 { 6312 struct ath12k_peer *peer; 6313 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 6314 int ret; 6315 6316 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 6317 6318 spin_lock_bh(&ar->ab->base_lock); 6319 6320 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr); 6321 if (peer) 6322 peer->is_authorized = true; 6323 6324 spin_unlock_bh(&ar->ab->base_lock); 6325 6326 if (vif->type == NL80211_IFTYPE_STATION && arvif->is_up) { 6327 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, 6328 arvif->vdev_id, 6329 WMI_PEER_AUTHORIZE, 6330 1); 6331 if (ret) { 6332 ath12k_warn(ar->ab, "Unable to authorize peer %pM vdev %d: %d\n", 6333 arsta->addr, arvif->vdev_id, ret); 6334 return ret; 6335 } 6336 } 6337 6338 return 0; 6339 } 6340 6341 static int ath12k_mac_station_remove(struct ath12k *ar, 6342 struct ath12k_link_vif *arvif, 6343 struct ath12k_link_sta *arsta) 6344 { 6345 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 6346 struct ath12k_vif *ahvif = arvif->ahvif; 6347 int ret = 0; 6348 6349 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 6350 6351 wiphy_work_cancel(ar->ah->hw->wiphy, &arsta->update_wk); 6352 6353 if (ahvif->vdev_type == WMI_VDEV_TYPE_STA) { 6354 ath12k_bss_disassoc(ar, arvif); 6355 ret = ath12k_mac_vdev_stop(arvif); 6356 if (ret) 6357 ath12k_warn(ar->ab, "failed to stop vdev %i: %d\n", 6358 arvif->vdev_id, ret); 6359 } 6360 6361 if (sta->mlo) 6362 return ret; 6363 6364 ath12k_dp_peer_cleanup(ar, arvif->vdev_id, arsta->addr); 6365 6366 ret = ath12k_peer_delete(ar, arvif->vdev_id, arsta->addr); 6367 if (ret) 6368 ath12k_warn(ar->ab, "Failed to delete peer: %pM for VDEV: %d\n", 6369 arsta->addr, arvif->vdev_id); 6370 else 6371 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "Removed peer: %pM for VDEV: %d\n", 6372 arsta->addr, arvif->vdev_id); 6373 6374 ath12k_mac_station_post_remove(ar, arvif, arsta); 6375 6376 if (sta->valid_links) 6377 ath12k_mac_free_unassign_link_sta(ahvif->ah, 6378 arsta->ahsta, arsta->link_id); 6379 6380 return ret; 6381 } 6382 6383 static int ath12k_mac_station_add(struct ath12k *ar, 6384 struct ath12k_link_vif *arvif, 6385 struct ath12k_link_sta *arsta) 6386 { 6387 struct ath12k_base *ab = ar->ab; 6388 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 6389 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 6390 struct ath12k_wmi_peer_create_arg peer_param = {}; 6391 int ret; 6392 6393 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 6394 6395 ret = ath12k_mac_inc_num_stations(arvif, arsta); 6396 if (ret) { 6397 ath12k_warn(ab, "refusing to associate station: too many connected already (%d)\n", 6398 ar->max_num_stations); 6399 goto exit; 6400 } 6401 6402 if (ath12k_debugfs_is_extd_rx_stats_enabled(ar) && !arsta->rx_stats) { 6403 arsta->rx_stats = kzalloc(sizeof(*arsta->rx_stats), GFP_KERNEL); 6404 if (!arsta->rx_stats) { 6405 ret = -ENOMEM; 6406 goto dec_num_station; 6407 } 6408 } 6409 6410 peer_param.vdev_id = arvif->vdev_id; 6411 peer_param.peer_addr = arsta->addr; 6412 peer_param.peer_type = WMI_PEER_TYPE_DEFAULT; 6413 peer_param.ml_enabled = sta->mlo; 6414 6415 ret = ath12k_peer_create(ar, arvif, sta, &peer_param); 6416 if (ret) { 6417 ath12k_warn(ab, "Failed to add peer: %pM for VDEV: %d\n", 6418 arsta->addr, arvif->vdev_id); 6419 goto free_peer; 6420 } 6421 6422 ath12k_dbg(ab, ATH12K_DBG_MAC, "Added peer: %pM for VDEV: %d\n", 6423 arsta->addr, arvif->vdev_id); 6424 6425 if (ieee80211_vif_is_mesh(vif)) { 6426 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, 6427 arvif->vdev_id, 6428 WMI_PEER_USE_4ADDR, 1); 6429 if (ret) { 6430 ath12k_warn(ab, "failed to STA %pM 4addr capability: %d\n", 6431 arsta->addr, ret); 6432 goto free_peer; 6433 } 6434 } 6435 6436 ret = ath12k_dp_peer_setup(ar, arvif->vdev_id, arsta->addr); 6437 if (ret) { 6438 ath12k_warn(ab, "failed to setup dp for peer %pM on vdev %i (%d)\n", 6439 arsta->addr, arvif->vdev_id, ret); 6440 goto free_peer; 6441 } 6442 6443 if (ab->hw_params->vdev_start_delay && 6444 !arvif->is_started && 6445 arvif->ahvif->vdev_type != WMI_VDEV_TYPE_AP) { 6446 ret = ath12k_start_vdev_delay(ar, arvif); 6447 if (ret) { 6448 ath12k_warn(ab, "failed to delay vdev start: %d\n", ret); 6449 goto free_peer; 6450 } 6451 } 6452 6453 ewma_avg_rssi_init(&arsta->avg_rssi); 6454 return 0; 6455 6456 free_peer: 6457 ath12k_peer_delete(ar, arvif->vdev_id, arsta->addr); 6458 kfree(arsta->rx_stats); 6459 arsta->rx_stats = NULL; 6460 dec_num_station: 6461 ath12k_mac_dec_num_stations(arvif, arsta); 6462 exit: 6463 return ret; 6464 } 6465 6466 static int ath12k_mac_assign_link_sta(struct ath12k_hw *ah, 6467 struct ath12k_sta *ahsta, 6468 struct ath12k_link_sta *arsta, 6469 struct ath12k_vif *ahvif, 6470 u8 link_id) 6471 { 6472 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(ahsta); 6473 struct ieee80211_link_sta *link_sta; 6474 struct ath12k_link_vif *arvif; 6475 6476 lockdep_assert_wiphy(ah->hw->wiphy); 6477 6478 if (!arsta || link_id >= IEEE80211_MLD_MAX_NUM_LINKS) 6479 return -EINVAL; 6480 6481 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]); 6482 if (!arvif) 6483 return -EINVAL; 6484 6485 memset(arsta, 0, sizeof(*arsta)); 6486 6487 link_sta = wiphy_dereference(ah->hw->wiphy, sta->link[link_id]); 6488 if (!link_sta) 6489 return -EINVAL; 6490 6491 ether_addr_copy(arsta->addr, link_sta->addr); 6492 6493 /* logical index of the link sta in order of creation */ 6494 arsta->link_idx = ahsta->num_peer++; 6495 6496 arsta->link_id = link_id; 6497 ahsta->links_map |= BIT(arsta->link_id); 6498 arsta->arvif = arvif; 6499 arsta->ahsta = ahsta; 6500 ahsta->ahvif = ahvif; 6501 6502 wiphy_work_init(&arsta->update_wk, ath12k_sta_rc_update_wk); 6503 6504 rcu_assign_pointer(ahsta->link[link_id], arsta); 6505 6506 return 0; 6507 } 6508 6509 static void ath12k_mac_ml_station_remove(struct ath12k_vif *ahvif, 6510 struct ath12k_sta *ahsta) 6511 { 6512 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(ahsta); 6513 struct ath12k_hw *ah = ahvif->ah; 6514 struct ath12k_link_vif *arvif; 6515 struct ath12k_link_sta *arsta; 6516 unsigned long links; 6517 struct ath12k *ar; 6518 u8 link_id; 6519 6520 lockdep_assert_wiphy(ah->hw->wiphy); 6521 6522 ath12k_peer_mlo_link_peers_delete(ahvif, ahsta); 6523 6524 /* validate link station removal and clear arsta links */ 6525 links = ahsta->links_map; 6526 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) { 6527 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]); 6528 arsta = wiphy_dereference(ah->hw->wiphy, ahsta->link[link_id]); 6529 if (!arvif || !arsta) 6530 continue; 6531 6532 ar = arvif->ar; 6533 6534 ath12k_mac_station_post_remove(ar, arvif, arsta); 6535 6536 ath12k_mac_free_unassign_link_sta(ah, ahsta, link_id); 6537 } 6538 6539 ath12k_peer_ml_delete(ah, sta); 6540 } 6541 6542 static int ath12k_mac_handle_link_sta_state(struct ieee80211_hw *hw, 6543 struct ath12k_link_vif *arvif, 6544 struct ath12k_link_sta *arsta, 6545 enum ieee80211_sta_state old_state, 6546 enum ieee80211_sta_state new_state) 6547 { 6548 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 6549 struct ieee80211_bss_conf *link_conf; 6550 struct ath12k *ar = arvif->ar; 6551 struct ath12k_reg_info *reg_info; 6552 struct ath12k_base *ab = ar->ab; 6553 int ret = 0; 6554 6555 lockdep_assert_wiphy(hw->wiphy); 6556 6557 ath12k_dbg(ab, ATH12K_DBG_MAC, "mac handle link %u sta %pM state %d -> %d\n", 6558 arsta->link_id, arsta->addr, old_state, new_state); 6559 6560 /* IEEE80211_STA_NONE -> IEEE80211_STA_NOTEXIST: Remove the station 6561 * from driver 6562 */ 6563 if ((old_state == IEEE80211_STA_NONE && 6564 new_state == IEEE80211_STA_NOTEXIST)) { 6565 ret = ath12k_mac_station_remove(ar, arvif, arsta); 6566 if (ret) { 6567 ath12k_warn(ab, "Failed to remove station: %pM for VDEV: %d\n", 6568 arsta->addr, arvif->vdev_id); 6569 goto exit; 6570 } 6571 } 6572 6573 /* IEEE80211_STA_NOTEXIST -> IEEE80211_STA_NONE: Add new station to driver */ 6574 if (old_state == IEEE80211_STA_NOTEXIST && 6575 new_state == IEEE80211_STA_NONE) { 6576 ret = ath12k_mac_station_add(ar, arvif, arsta); 6577 if (ret) 6578 ath12k_warn(ab, "Failed to add station: %pM for VDEV: %d\n", 6579 arsta->addr, arvif->vdev_id); 6580 6581 /* IEEE80211_STA_AUTH -> IEEE80211_STA_ASSOC: Send station assoc command for 6582 * peer associated to AP/Mesh/ADHOC vif type. 6583 */ 6584 } else if (old_state == IEEE80211_STA_AUTH && 6585 new_state == IEEE80211_STA_ASSOC && 6586 (vif->type == NL80211_IFTYPE_AP || 6587 vif->type == NL80211_IFTYPE_MESH_POINT || 6588 vif->type == NL80211_IFTYPE_ADHOC)) { 6589 ret = ath12k_mac_station_assoc(ar, arvif, arsta, false); 6590 if (ret) 6591 ath12k_warn(ab, "Failed to associate station: %pM\n", 6592 arsta->addr); 6593 6594 /* IEEE80211_STA_ASSOC -> IEEE80211_STA_AUTHORIZED: set peer status as 6595 * authorized 6596 */ 6597 } else if (old_state == IEEE80211_STA_ASSOC && 6598 new_state == IEEE80211_STA_AUTHORIZED) { 6599 ret = ath12k_mac_station_authorize(ar, arvif, arsta); 6600 if (ret) { 6601 ath12k_warn(ab, "Failed to authorize station: %pM\n", 6602 arsta->addr); 6603 goto exit; 6604 } 6605 6606 if (ath12k_wmi_supports_6ghz_cc_ext(ar) && 6607 arvif->ahvif->vdev_type == WMI_VDEV_TYPE_STA) { 6608 link_conf = ath12k_mac_get_link_bss_conf(arvif); 6609 reg_info = ab->reg_info[ar->pdev_idx]; 6610 ath12k_dbg(ab, ATH12K_DBG_MAC, "connection done, update reg rules\n"); 6611 ath12k_hw_to_ah(hw)->regd_updated = false; 6612 ath12k_reg_handle_chan_list(ab, reg_info, arvif->ahvif->vdev_type, 6613 link_conf->power_type); 6614 } 6615 6616 /* IEEE80211_STA_AUTHORIZED -> IEEE80211_STA_ASSOC: station may be in removal, 6617 * deauthorize it. 6618 */ 6619 } else if (old_state == IEEE80211_STA_AUTHORIZED && 6620 new_state == IEEE80211_STA_ASSOC) { 6621 ath12k_mac_station_unauthorize(ar, arvif, arsta); 6622 6623 /* IEEE80211_STA_ASSOC -> IEEE80211_STA_AUTH: disassoc peer connected to 6624 * AP/mesh/ADHOC vif type. 6625 */ 6626 } else if (old_state == IEEE80211_STA_ASSOC && 6627 new_state == IEEE80211_STA_AUTH && 6628 (vif->type == NL80211_IFTYPE_AP || 6629 vif->type == NL80211_IFTYPE_MESH_POINT || 6630 vif->type == NL80211_IFTYPE_ADHOC)) { 6631 ret = ath12k_mac_station_disassoc(ar, arvif, arsta); 6632 if (ret) 6633 ath12k_warn(ab, "Failed to disassociate station: %pM\n", 6634 arsta->addr); 6635 } 6636 6637 exit: 6638 return ret; 6639 } 6640 6641 static bool ath12k_mac_is_freq_on_mac(struct ath12k_hw_mode_freq_range_arg *freq_range, 6642 u32 freq, u8 mac_id) 6643 { 6644 return (freq >= freq_range[mac_id].low_2ghz_freq && 6645 freq <= freq_range[mac_id].high_2ghz_freq) || 6646 (freq >= freq_range[mac_id].low_5ghz_freq && 6647 freq <= freq_range[mac_id].high_5ghz_freq); 6648 } 6649 6650 static bool 6651 ath12k_mac_2_freq_same_mac_in_freq_range(struct ath12k_base *ab, 6652 struct ath12k_hw_mode_freq_range_arg *freq_range, 6653 u32 freq_link1, u32 freq_link2) 6654 { 6655 u8 i; 6656 6657 for (i = 0; i < MAX_RADIOS; i++) { 6658 if (ath12k_mac_is_freq_on_mac(freq_range, freq_link1, i) && 6659 ath12k_mac_is_freq_on_mac(freq_range, freq_link2, i)) 6660 return true; 6661 } 6662 6663 return false; 6664 } 6665 6666 static bool ath12k_mac_is_hw_dbs_capable(struct ath12k_base *ab) 6667 { 6668 return test_bit(WMI_TLV_SERVICE_DUAL_BAND_SIMULTANEOUS_SUPPORT, 6669 ab->wmi_ab.svc_map) && 6670 ab->wmi_ab.hw_mode_info.support_dbs; 6671 } 6672 6673 static bool ath12k_mac_2_freq_same_mac_in_dbs(struct ath12k_base *ab, 6674 u32 freq_link1, u32 freq_link2) 6675 { 6676 struct ath12k_hw_mode_freq_range_arg *freq_range; 6677 6678 if (!ath12k_mac_is_hw_dbs_capable(ab)) 6679 return true; 6680 6681 freq_range = ab->wmi_ab.hw_mode_info.freq_range_caps[ATH12K_HW_MODE_DBS]; 6682 return ath12k_mac_2_freq_same_mac_in_freq_range(ab, freq_range, 6683 freq_link1, freq_link2); 6684 } 6685 6686 static bool ath12k_mac_is_hw_sbs_capable(struct ath12k_base *ab) 6687 { 6688 return test_bit(WMI_TLV_SERVICE_DUAL_BAND_SIMULTANEOUS_SUPPORT, 6689 ab->wmi_ab.svc_map) && 6690 ab->wmi_ab.hw_mode_info.support_sbs; 6691 } 6692 6693 static bool ath12k_mac_2_freq_same_mac_in_sbs(struct ath12k_base *ab, 6694 u32 freq_link1, u32 freq_link2) 6695 { 6696 struct ath12k_hw_mode_info *info = &ab->wmi_ab.hw_mode_info; 6697 struct ath12k_hw_mode_freq_range_arg *sbs_uppr_share; 6698 struct ath12k_hw_mode_freq_range_arg *sbs_low_share; 6699 struct ath12k_hw_mode_freq_range_arg *sbs_range; 6700 6701 if (!ath12k_mac_is_hw_sbs_capable(ab)) 6702 return true; 6703 6704 if (ab->wmi_ab.sbs_lower_band_end_freq) { 6705 sbs_uppr_share = info->freq_range_caps[ATH12K_HW_MODE_SBS_UPPER_SHARE]; 6706 sbs_low_share = info->freq_range_caps[ATH12K_HW_MODE_SBS_LOWER_SHARE]; 6707 6708 return ath12k_mac_2_freq_same_mac_in_freq_range(ab, sbs_low_share, 6709 freq_link1, freq_link2) || 6710 ath12k_mac_2_freq_same_mac_in_freq_range(ab, sbs_uppr_share, 6711 freq_link1, freq_link2); 6712 } 6713 6714 sbs_range = info->freq_range_caps[ATH12K_HW_MODE_SBS]; 6715 return ath12k_mac_2_freq_same_mac_in_freq_range(ab, sbs_range, 6716 freq_link1, freq_link2); 6717 } 6718 6719 static bool ath12k_mac_freqs_on_same_mac(struct ath12k_base *ab, 6720 u32 freq_link1, u32 freq_link2) 6721 { 6722 return ath12k_mac_2_freq_same_mac_in_dbs(ab, freq_link1, freq_link2) && 6723 ath12k_mac_2_freq_same_mac_in_sbs(ab, freq_link1, freq_link2); 6724 } 6725 6726 static int ath12k_mac_mlo_sta_set_link_active(struct ath12k_base *ab, 6727 enum wmi_mlo_link_force_reason reason, 6728 enum wmi_mlo_link_force_mode mode, 6729 u8 *mlo_vdev_id_lst, 6730 u8 num_mlo_vdev, 6731 u8 *mlo_inactive_vdev_lst, 6732 u8 num_mlo_inactive_vdev) 6733 { 6734 struct wmi_mlo_link_set_active_arg param = {}; 6735 u32 entry_idx, entry_offset, vdev_idx; 6736 u8 vdev_id; 6737 6738 param.reason = reason; 6739 param.force_mode = mode; 6740 6741 for (vdev_idx = 0; vdev_idx < num_mlo_vdev; vdev_idx++) { 6742 vdev_id = mlo_vdev_id_lst[vdev_idx]; 6743 entry_idx = vdev_id / 32; 6744 entry_offset = vdev_id % 32; 6745 if (entry_idx >= WMI_MLO_LINK_NUM_SZ) { 6746 ath12k_warn(ab, "Invalid entry_idx %d num_mlo_vdev %d vdev %d", 6747 entry_idx, num_mlo_vdev, vdev_id); 6748 return -EINVAL; 6749 } 6750 param.vdev_bitmap[entry_idx] |= 1 << entry_offset; 6751 /* update entry number if entry index changed */ 6752 if (param.num_vdev_bitmap < entry_idx + 1) 6753 param.num_vdev_bitmap = entry_idx + 1; 6754 } 6755 6756 ath12k_dbg(ab, ATH12K_DBG_MAC, 6757 "num_vdev_bitmap %d vdev_bitmap[0] = 0x%x, vdev_bitmap[1] = 0x%x", 6758 param.num_vdev_bitmap, param.vdev_bitmap[0], param.vdev_bitmap[1]); 6759 6760 if (mode == WMI_MLO_LINK_FORCE_MODE_ACTIVE_INACTIVE) { 6761 for (vdev_idx = 0; vdev_idx < num_mlo_inactive_vdev; vdev_idx++) { 6762 vdev_id = mlo_inactive_vdev_lst[vdev_idx]; 6763 entry_idx = vdev_id / 32; 6764 entry_offset = vdev_id % 32; 6765 if (entry_idx >= WMI_MLO_LINK_NUM_SZ) { 6766 ath12k_warn(ab, "Invalid entry_idx %d num_mlo_vdev %d vdev %d", 6767 entry_idx, num_mlo_inactive_vdev, vdev_id); 6768 return -EINVAL; 6769 } 6770 param.inactive_vdev_bitmap[entry_idx] |= 1 << entry_offset; 6771 /* update entry number if entry index changed */ 6772 if (param.num_inactive_vdev_bitmap < entry_idx + 1) 6773 param.num_inactive_vdev_bitmap = entry_idx + 1; 6774 } 6775 6776 ath12k_dbg(ab, ATH12K_DBG_MAC, 6777 "num_vdev_bitmap %d inactive_vdev_bitmap[0] = 0x%x, inactive_vdev_bitmap[1] = 0x%x", 6778 param.num_inactive_vdev_bitmap, 6779 param.inactive_vdev_bitmap[0], 6780 param.inactive_vdev_bitmap[1]); 6781 } 6782 6783 if (mode == WMI_MLO_LINK_FORCE_MODE_ACTIVE_LINK_NUM || 6784 mode == WMI_MLO_LINK_FORCE_MODE_INACTIVE_LINK_NUM) { 6785 param.num_link_entry = 1; 6786 param.link_num[0].num_of_link = num_mlo_vdev - 1; 6787 } 6788 6789 return ath12k_wmi_send_mlo_link_set_active_cmd(ab, ¶m); 6790 } 6791 6792 static int ath12k_mac_mlo_sta_update_link_active(struct ath12k_base *ab, 6793 struct ieee80211_hw *hw, 6794 struct ath12k_vif *ahvif) 6795 { 6796 u8 mlo_vdev_id_lst[IEEE80211_MLD_MAX_NUM_LINKS] = {}; 6797 u32 mlo_freq_list[IEEE80211_MLD_MAX_NUM_LINKS] = {}; 6798 unsigned long links = ahvif->links_map; 6799 enum wmi_mlo_link_force_reason reason; 6800 struct ieee80211_chanctx_conf *conf; 6801 enum wmi_mlo_link_force_mode mode; 6802 struct ieee80211_bss_conf *info; 6803 struct ath12k_link_vif *arvif; 6804 u8 num_mlo_vdev = 0; 6805 u8 link_id; 6806 6807 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) { 6808 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 6809 /* make sure vdev is created on this device */ 6810 if (!arvif || !arvif->is_created || arvif->ar->ab != ab) 6811 continue; 6812 6813 info = ath12k_mac_get_link_bss_conf(arvif); 6814 conf = wiphy_dereference(hw->wiphy, info->chanctx_conf); 6815 mlo_freq_list[num_mlo_vdev] = conf->def.chan->center_freq; 6816 6817 mlo_vdev_id_lst[num_mlo_vdev] = arvif->vdev_id; 6818 num_mlo_vdev++; 6819 } 6820 6821 /* It is not allowed to activate more links than a single device 6822 * supported. Something goes wrong if we reach here. 6823 */ 6824 if (num_mlo_vdev > ATH12K_NUM_MAX_ACTIVE_LINKS_PER_DEVICE) { 6825 WARN_ON_ONCE(1); 6826 return -EINVAL; 6827 } 6828 6829 /* if 2 links are established and both link channels fall on the 6830 * same hardware MAC, send command to firmware to deactivate one 6831 * of them. 6832 */ 6833 if (num_mlo_vdev == 2 && 6834 ath12k_mac_freqs_on_same_mac(ab, mlo_freq_list[0], 6835 mlo_freq_list[1])) { 6836 mode = WMI_MLO_LINK_FORCE_MODE_INACTIVE_LINK_NUM; 6837 reason = WMI_MLO_LINK_FORCE_REASON_NEW_CONNECT; 6838 return ath12k_mac_mlo_sta_set_link_active(ab, reason, mode, 6839 mlo_vdev_id_lst, num_mlo_vdev, 6840 NULL, 0); 6841 } 6842 6843 return 0; 6844 } 6845 6846 static bool ath12k_mac_are_sbs_chan(struct ath12k_base *ab, u32 freq_1, u32 freq_2) 6847 { 6848 if (!ath12k_mac_is_hw_sbs_capable(ab)) 6849 return false; 6850 6851 if (ath12k_is_2ghz_channel_freq(freq_1) || 6852 ath12k_is_2ghz_channel_freq(freq_2)) 6853 return false; 6854 6855 return !ath12k_mac_2_freq_same_mac_in_sbs(ab, freq_1, freq_2); 6856 } 6857 6858 static bool ath12k_mac_are_dbs_chan(struct ath12k_base *ab, u32 freq_1, u32 freq_2) 6859 { 6860 if (!ath12k_mac_is_hw_dbs_capable(ab)) 6861 return false; 6862 6863 return !ath12k_mac_2_freq_same_mac_in_dbs(ab, freq_1, freq_2); 6864 } 6865 6866 static int ath12k_mac_select_links(struct ath12k_base *ab, 6867 struct ieee80211_vif *vif, 6868 struct ieee80211_hw *hw, 6869 u16 *selected_links) 6870 { 6871 unsigned long useful_links = ieee80211_vif_usable_links(vif); 6872 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 6873 u8 num_useful_links = hweight_long(useful_links); 6874 struct ieee80211_chanctx_conf *chanctx; 6875 struct ath12k_link_vif *assoc_arvif; 6876 u32 assoc_link_freq, partner_freq; 6877 u16 sbs_links = 0, dbs_links = 0; 6878 struct ieee80211_bss_conf *info; 6879 struct ieee80211_channel *chan; 6880 struct ieee80211_sta *sta; 6881 struct ath12k_sta *ahsta; 6882 u8 link_id; 6883 6884 /* activate all useful links if less than max supported */ 6885 if (num_useful_links <= ATH12K_NUM_MAX_ACTIVE_LINKS_PER_DEVICE) { 6886 *selected_links = useful_links; 6887 return 0; 6888 } 6889 6890 /* only in station mode we can get here, so it's safe 6891 * to use ap_addr 6892 */ 6893 rcu_read_lock(); 6894 sta = ieee80211_find_sta(vif, vif->cfg.ap_addr); 6895 if (!sta) { 6896 rcu_read_unlock(); 6897 ath12k_warn(ab, "failed to find sta with addr %pM\n", vif->cfg.ap_addr); 6898 return -EINVAL; 6899 } 6900 6901 ahsta = ath12k_sta_to_ahsta(sta); 6902 assoc_arvif = wiphy_dereference(hw->wiphy, ahvif->link[ahsta->assoc_link_id]); 6903 info = ath12k_mac_get_link_bss_conf(assoc_arvif); 6904 chanctx = rcu_dereference(info->chanctx_conf); 6905 assoc_link_freq = chanctx->def.chan->center_freq; 6906 rcu_read_unlock(); 6907 ath12k_dbg(ab, ATH12K_DBG_MAC, "assoc link %u freq %u\n", 6908 assoc_arvif->link_id, assoc_link_freq); 6909 6910 /* assoc link is already activated and has to be kept active, 6911 * only need to select a partner link from others. 6912 */ 6913 useful_links &= ~BIT(assoc_arvif->link_id); 6914 for_each_set_bit(link_id, &useful_links, IEEE80211_MLD_MAX_NUM_LINKS) { 6915 info = wiphy_dereference(hw->wiphy, vif->link_conf[link_id]); 6916 if (!info) { 6917 ath12k_warn(ab, "failed to get link info for link: %u\n", 6918 link_id); 6919 return -ENOLINK; 6920 } 6921 6922 chan = info->chanreq.oper.chan; 6923 if (!chan) { 6924 ath12k_warn(ab, "failed to get chan for link: %u\n", link_id); 6925 return -EINVAL; 6926 } 6927 6928 partner_freq = chan->center_freq; 6929 if (ath12k_mac_are_sbs_chan(ab, assoc_link_freq, partner_freq)) { 6930 sbs_links |= BIT(link_id); 6931 ath12k_dbg(ab, ATH12K_DBG_MAC, "new SBS link %u freq %u\n", 6932 link_id, partner_freq); 6933 continue; 6934 } 6935 6936 if (ath12k_mac_are_dbs_chan(ab, assoc_link_freq, partner_freq)) { 6937 dbs_links |= BIT(link_id); 6938 ath12k_dbg(ab, ATH12K_DBG_MAC, "new DBS link %u freq %u\n", 6939 link_id, partner_freq); 6940 continue; 6941 } 6942 6943 ath12k_dbg(ab, ATH12K_DBG_MAC, "non DBS/SBS link %u freq %u\n", 6944 link_id, partner_freq); 6945 } 6946 6947 /* choose the first candidate no matter how many is in the list */ 6948 if (sbs_links) 6949 link_id = __ffs(sbs_links); 6950 else if (dbs_links) 6951 link_id = __ffs(dbs_links); 6952 else 6953 link_id = ffs(useful_links) - 1; 6954 6955 ath12k_dbg(ab, ATH12K_DBG_MAC, "select partner link %u\n", link_id); 6956 6957 *selected_links = BIT(assoc_arvif->link_id) | BIT(link_id); 6958 6959 return 0; 6960 } 6961 6962 static int ath12k_mac_op_sta_state(struct ieee80211_hw *hw, 6963 struct ieee80211_vif *vif, 6964 struct ieee80211_sta *sta, 6965 enum ieee80211_sta_state old_state, 6966 enum ieee80211_sta_state new_state) 6967 { 6968 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 6969 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta); 6970 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 6971 struct ath12k_base *prev_ab = NULL, *ab; 6972 struct ath12k_link_vif *arvif; 6973 struct ath12k_link_sta *arsta; 6974 unsigned long valid_links; 6975 u16 selected_links = 0; 6976 u8 link_id = 0, i; 6977 struct ath12k *ar; 6978 int ret; 6979 6980 lockdep_assert_wiphy(hw->wiphy); 6981 6982 if (ieee80211_vif_is_mld(vif) && sta->valid_links) { 6983 WARN_ON(!sta->mlo && hweight16(sta->valid_links) != 1); 6984 link_id = ffs(sta->valid_links) - 1; 6985 } 6986 6987 /* IEEE80211_STA_NOTEXIST -> IEEE80211_STA_NONE: 6988 * New station add received. If this is a ML station then 6989 * ahsta->links_map will be zero and sta->valid_links will be 1. 6990 * Assign default link to the first link sta. 6991 */ 6992 if (old_state == IEEE80211_STA_NOTEXIST && 6993 new_state == IEEE80211_STA_NONE) { 6994 memset(ahsta, 0, sizeof(*ahsta)); 6995 6996 arsta = &ahsta->deflink; 6997 6998 /* ML sta */ 6999 if (sta->mlo && !ahsta->links_map && 7000 (hweight16(sta->valid_links) == 1)) { 7001 ret = ath12k_peer_ml_create(ah, sta); 7002 if (ret) { 7003 ath12k_hw_warn(ah, "unable to create ML peer for sta %pM", 7004 sta->addr); 7005 goto exit; 7006 } 7007 } 7008 7009 ret = ath12k_mac_assign_link_sta(ah, ahsta, arsta, ahvif, 7010 link_id); 7011 if (ret) { 7012 ath12k_hw_warn(ah, "unable assign link %d for sta %pM", 7013 link_id, sta->addr); 7014 goto exit; 7015 } 7016 7017 /* above arsta will get memset, hence do this after assign 7018 * link sta 7019 */ 7020 if (sta->mlo) { 7021 /* For station mode, arvif->is_sta_assoc_link has been set when 7022 * vdev starts. Make sure the arvif/arsta pair have same setting 7023 */ 7024 if (vif->type == NL80211_IFTYPE_STATION && 7025 !arsta->arvif->is_sta_assoc_link) { 7026 ath12k_hw_warn(ah, "failed to verify assoc link setting with link id %u\n", 7027 link_id); 7028 ret = -EINVAL; 7029 goto exit; 7030 } 7031 7032 arsta->is_assoc_link = true; 7033 ahsta->assoc_link_id = link_id; 7034 } 7035 } 7036 7037 /* In the ML station scenario, activate all partner links once the 7038 * client is transitioning to the associated state. 7039 * 7040 * FIXME: Ideally, this activation should occur when the client 7041 * transitions to the authorized state. However, there are some 7042 * issues with handling this in the firmware. Until the firmware 7043 * can manage it properly, activate the links when the client is 7044 * about to move to the associated state. 7045 */ 7046 if (ieee80211_vif_is_mld(vif) && vif->type == NL80211_IFTYPE_STATION && 7047 old_state == IEEE80211_STA_AUTH && new_state == IEEE80211_STA_ASSOC) { 7048 /* TODO: for now only do link selection for single device 7049 * MLO case. Other cases would be handled in the future. 7050 */ 7051 ab = ah->radio[0].ab; 7052 if (ab->ag->num_devices == 1) { 7053 ret = ath12k_mac_select_links(ab, vif, hw, &selected_links); 7054 if (ret) { 7055 ath12k_warn(ab, 7056 "failed to get selected links: %d\n", ret); 7057 goto exit; 7058 } 7059 } else { 7060 selected_links = ieee80211_vif_usable_links(vif); 7061 } 7062 7063 ieee80211_set_active_links(vif, selected_links); 7064 } 7065 7066 /* Handle all the other state transitions in generic way */ 7067 valid_links = ahsta->links_map; 7068 for_each_set_bit(link_id, &valid_links, IEEE80211_MLD_MAX_NUM_LINKS) { 7069 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 7070 arsta = wiphy_dereference(hw->wiphy, ahsta->link[link_id]); 7071 /* some assumptions went wrong! */ 7072 if (WARN_ON(!arvif || !arsta)) 7073 continue; 7074 7075 /* vdev might be in deleted */ 7076 if (WARN_ON(!arvif->ar)) 7077 continue; 7078 7079 ret = ath12k_mac_handle_link_sta_state(hw, arvif, arsta, 7080 old_state, new_state); 7081 if (ret) { 7082 ath12k_hw_warn(ah, "unable to move link sta %d of sta %pM from state %d to %d", 7083 link_id, arsta->addr, old_state, new_state); 7084 goto exit; 7085 } 7086 } 7087 7088 if (ieee80211_vif_is_mld(vif) && vif->type == NL80211_IFTYPE_STATION && 7089 old_state == IEEE80211_STA_ASSOC && new_state == IEEE80211_STA_AUTHORIZED) { 7090 for_each_ar(ah, ar, i) { 7091 ab = ar->ab; 7092 if (prev_ab == ab) 7093 continue; 7094 7095 ret = ath12k_mac_mlo_sta_update_link_active(ab, hw, ahvif); 7096 if (ret) { 7097 ath12k_warn(ab, 7098 "failed to update link active state on connect %d\n", 7099 ret); 7100 goto exit; 7101 } 7102 7103 prev_ab = ab; 7104 } 7105 } 7106 /* IEEE80211_STA_NONE -> IEEE80211_STA_NOTEXIST: 7107 * Remove the station from driver (handle ML sta here since that 7108 * needs special handling. Normal sta will be handled in generic 7109 * handler below 7110 */ 7111 if (old_state == IEEE80211_STA_NONE && 7112 new_state == IEEE80211_STA_NOTEXIST && sta->mlo) 7113 ath12k_mac_ml_station_remove(ahvif, ahsta); 7114 7115 ret = 0; 7116 7117 exit: 7118 /* update the state if everything went well */ 7119 if (!ret) 7120 ahsta->state = new_state; 7121 7122 return ret; 7123 } 7124 7125 static int ath12k_mac_op_sta_set_txpwr(struct ieee80211_hw *hw, 7126 struct ieee80211_vif *vif, 7127 struct ieee80211_sta *sta) 7128 { 7129 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta); 7130 struct ath12k *ar; 7131 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 7132 struct ath12k_link_vif *arvif; 7133 struct ath12k_link_sta *arsta; 7134 u8 link_id; 7135 int ret; 7136 s16 txpwr; 7137 7138 lockdep_assert_wiphy(hw->wiphy); 7139 7140 /* TODO: use link id from mac80211 once that's implemented */ 7141 link_id = 0; 7142 7143 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 7144 arsta = wiphy_dereference(hw->wiphy, ahsta->link[link_id]); 7145 7146 if (sta->deflink.txpwr.type == NL80211_TX_POWER_AUTOMATIC) { 7147 txpwr = 0; 7148 } else { 7149 txpwr = sta->deflink.txpwr.power; 7150 if (!txpwr) { 7151 ret = -EINVAL; 7152 goto out; 7153 } 7154 } 7155 7156 if (txpwr > ATH12K_TX_POWER_MAX_VAL || txpwr < ATH12K_TX_POWER_MIN_VAL) { 7157 ret = -EINVAL; 7158 goto out; 7159 } 7160 7161 ar = arvif->ar; 7162 7163 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, arvif->vdev_id, 7164 WMI_PEER_USE_FIXED_PWR, txpwr); 7165 if (ret) { 7166 ath12k_warn(ar->ab, "failed to set tx power for station ret: %d\n", 7167 ret); 7168 goto out; 7169 } 7170 7171 out: 7172 return ret; 7173 } 7174 7175 static void ath12k_mac_op_link_sta_rc_update(struct ieee80211_hw *hw, 7176 struct ieee80211_vif *vif, 7177 struct ieee80211_link_sta *link_sta, 7178 u32 changed) 7179 { 7180 struct ieee80211_sta *sta = link_sta->sta; 7181 struct ath12k *ar; 7182 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta); 7183 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 7184 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 7185 struct ath12k_link_sta *arsta; 7186 struct ath12k_link_vif *arvif; 7187 struct ath12k_peer *peer; 7188 u32 bw, smps; 7189 7190 rcu_read_lock(); 7191 arvif = rcu_dereference(ahvif->link[link_sta->link_id]); 7192 if (!arvif) { 7193 ath12k_hw_warn(ah, "mac sta rc update failed to fetch link vif on link id %u for peer %pM\n", 7194 link_sta->link_id, sta->addr); 7195 rcu_read_unlock(); 7196 return; 7197 } 7198 7199 ar = arvif->ar; 7200 7201 arsta = rcu_dereference(ahsta->link[link_sta->link_id]); 7202 if (!arsta) { 7203 rcu_read_unlock(); 7204 ath12k_warn(ar->ab, "mac sta rc update failed to fetch link sta on link id %u for peer %pM\n", 7205 link_sta->link_id, sta->addr); 7206 return; 7207 } 7208 spin_lock_bh(&ar->ab->base_lock); 7209 7210 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr); 7211 if (!peer) { 7212 spin_unlock_bh(&ar->ab->base_lock); 7213 rcu_read_unlock(); 7214 ath12k_warn(ar->ab, "mac sta rc update failed to find peer %pM on vdev %i\n", 7215 arsta->addr, arvif->vdev_id); 7216 return; 7217 } 7218 7219 spin_unlock_bh(&ar->ab->base_lock); 7220 7221 if (arsta->link_id >= IEEE80211_MLD_MAX_NUM_LINKS) { 7222 rcu_read_unlock(); 7223 return; 7224 } 7225 7226 link_sta = rcu_dereference(sta->link[arsta->link_id]); 7227 if (!link_sta) { 7228 rcu_read_unlock(); 7229 ath12k_warn(ar->ab, "unable to access link sta in rc update for sta %pM link %u\n", 7230 sta->addr, arsta->link_id); 7231 return; 7232 } 7233 7234 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 7235 "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n", 7236 arsta->addr, changed, link_sta->bandwidth, link_sta->rx_nss, 7237 link_sta->smps_mode); 7238 7239 spin_lock_bh(&ar->data_lock); 7240 7241 if (changed & IEEE80211_RC_BW_CHANGED) { 7242 bw = ath12k_mac_ieee80211_sta_bw_to_wmi(ar, link_sta); 7243 arsta->bw_prev = arsta->bw; 7244 arsta->bw = bw; 7245 } 7246 7247 if (changed & IEEE80211_RC_NSS_CHANGED) 7248 arsta->nss = link_sta->rx_nss; 7249 7250 if (changed & IEEE80211_RC_SMPS_CHANGED) { 7251 smps = WMI_PEER_SMPS_PS_NONE; 7252 7253 switch (link_sta->smps_mode) { 7254 case IEEE80211_SMPS_AUTOMATIC: 7255 case IEEE80211_SMPS_OFF: 7256 smps = WMI_PEER_SMPS_PS_NONE; 7257 break; 7258 case IEEE80211_SMPS_STATIC: 7259 smps = WMI_PEER_SMPS_STATIC; 7260 break; 7261 case IEEE80211_SMPS_DYNAMIC: 7262 smps = WMI_PEER_SMPS_DYNAMIC; 7263 break; 7264 default: 7265 ath12k_warn(ar->ab, "Invalid smps %d in sta rc update for %pM link %u\n", 7266 link_sta->smps_mode, arsta->addr, link_sta->link_id); 7267 smps = WMI_PEER_SMPS_PS_NONE; 7268 break; 7269 } 7270 7271 arsta->smps = smps; 7272 } 7273 7274 arsta->changed |= changed; 7275 7276 spin_unlock_bh(&ar->data_lock); 7277 7278 wiphy_work_queue(hw->wiphy, &arsta->update_wk); 7279 7280 rcu_read_unlock(); 7281 } 7282 7283 static struct ath12k_link_sta *ath12k_mac_alloc_assign_link_sta(struct ath12k_hw *ah, 7284 struct ath12k_sta *ahsta, 7285 struct ath12k_vif *ahvif, 7286 u8 link_id) 7287 { 7288 struct ath12k_link_sta *arsta; 7289 int ret; 7290 7291 lockdep_assert_wiphy(ah->hw->wiphy); 7292 7293 if (link_id >= IEEE80211_MLD_MAX_NUM_LINKS) 7294 return NULL; 7295 7296 arsta = wiphy_dereference(ah->hw->wiphy, ahsta->link[link_id]); 7297 if (arsta) 7298 return NULL; 7299 7300 arsta = kmalloc(sizeof(*arsta), GFP_KERNEL); 7301 if (!arsta) 7302 return NULL; 7303 7304 ret = ath12k_mac_assign_link_sta(ah, ahsta, arsta, ahvif, link_id); 7305 if (ret) { 7306 kfree(arsta); 7307 return NULL; 7308 } 7309 7310 return arsta; 7311 } 7312 7313 static int ath12k_mac_op_change_sta_links(struct ieee80211_hw *hw, 7314 struct ieee80211_vif *vif, 7315 struct ieee80211_sta *sta, 7316 u16 old_links, u16 new_links) 7317 { 7318 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 7319 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta); 7320 struct ath12k_hw *ah = hw->priv; 7321 struct ath12k_link_vif *arvif; 7322 struct ath12k_link_sta *arsta; 7323 unsigned long valid_links; 7324 struct ath12k *ar; 7325 u8 link_id; 7326 int ret; 7327 7328 lockdep_assert_wiphy(hw->wiphy); 7329 7330 if (!sta->valid_links) 7331 return -EINVAL; 7332 7333 /* Firmware does not support removal of one of link stas. All sta 7334 * would be removed during ML STA delete in sta_state(), hence link 7335 * sta removal is not handled here. 7336 */ 7337 if (new_links < old_links) 7338 return 0; 7339 7340 if (ahsta->ml_peer_id == ATH12K_MLO_PEER_ID_INVALID) { 7341 ath12k_hw_warn(ah, "unable to add link for ml sta %pM", sta->addr); 7342 return -EINVAL; 7343 } 7344 7345 /* this op is expected only after initial sta insertion with default link */ 7346 if (WARN_ON(ahsta->links_map == 0)) 7347 return -EINVAL; 7348 7349 valid_links = new_links; 7350 for_each_set_bit(link_id, &valid_links, IEEE80211_MLD_MAX_NUM_LINKS) { 7351 if (ahsta->links_map & BIT(link_id)) 7352 continue; 7353 7354 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 7355 arsta = ath12k_mac_alloc_assign_link_sta(ah, ahsta, ahvif, link_id); 7356 7357 if (!arvif || !arsta) { 7358 ath12k_hw_warn(ah, "Failed to alloc/assign link sta"); 7359 continue; 7360 } 7361 7362 ar = arvif->ar; 7363 if (!ar) 7364 continue; 7365 7366 ret = ath12k_mac_station_add(ar, arvif, arsta); 7367 if (ret) { 7368 ath12k_warn(ar->ab, "Failed to add station: %pM for VDEV: %d\n", 7369 arsta->addr, arvif->vdev_id); 7370 ath12k_mac_free_unassign_link_sta(ah, ahsta, link_id); 7371 return ret; 7372 } 7373 } 7374 7375 return 0; 7376 } 7377 7378 static bool ath12k_mac_op_can_activate_links(struct ieee80211_hw *hw, 7379 struct ieee80211_vif *vif, 7380 u16 active_links) 7381 { 7382 /* TODO: Handle recovery case */ 7383 7384 return true; 7385 } 7386 7387 static int ath12k_conf_tx_uapsd(struct ath12k_link_vif *arvif, 7388 u16 ac, bool enable) 7389 { 7390 struct ath12k *ar = arvif->ar; 7391 struct ath12k_vif *ahvif = arvif->ahvif; 7392 u32 value; 7393 int ret; 7394 7395 if (ahvif->vdev_type != WMI_VDEV_TYPE_STA) 7396 return 0; 7397 7398 switch (ac) { 7399 case IEEE80211_AC_VO: 7400 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN | 7401 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN; 7402 break; 7403 case IEEE80211_AC_VI: 7404 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN | 7405 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN; 7406 break; 7407 case IEEE80211_AC_BE: 7408 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN | 7409 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN; 7410 break; 7411 case IEEE80211_AC_BK: 7412 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN | 7413 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN; 7414 break; 7415 } 7416 7417 if (enable) 7418 ahvif->u.sta.uapsd |= value; 7419 else 7420 ahvif->u.sta.uapsd &= ~value; 7421 7422 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, 7423 WMI_STA_PS_PARAM_UAPSD, 7424 ahvif->u.sta.uapsd); 7425 if (ret) { 7426 ath12k_warn(ar->ab, "could not set uapsd params %d\n", ret); 7427 goto exit; 7428 } 7429 7430 if (ahvif->u.sta.uapsd) 7431 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD; 7432 else 7433 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE; 7434 7435 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, 7436 WMI_STA_PS_PARAM_RX_WAKE_POLICY, 7437 value); 7438 if (ret) 7439 ath12k_warn(ar->ab, "could not set rx wake param %d\n", ret); 7440 7441 exit: 7442 return ret; 7443 } 7444 7445 static int ath12k_mac_conf_tx(struct ath12k_link_vif *arvif, u16 ac, 7446 const struct ieee80211_tx_queue_params *params) 7447 { 7448 struct wmi_wmm_params_arg *p = NULL; 7449 struct ath12k *ar = arvif->ar; 7450 struct ath12k_base *ab = ar->ab; 7451 int ret; 7452 7453 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 7454 7455 switch (ac) { 7456 case IEEE80211_AC_VO: 7457 p = &arvif->wmm_params.ac_vo; 7458 break; 7459 case IEEE80211_AC_VI: 7460 p = &arvif->wmm_params.ac_vi; 7461 break; 7462 case IEEE80211_AC_BE: 7463 p = &arvif->wmm_params.ac_be; 7464 break; 7465 case IEEE80211_AC_BK: 7466 p = &arvif->wmm_params.ac_bk; 7467 break; 7468 } 7469 7470 if (WARN_ON(!p)) { 7471 ret = -EINVAL; 7472 goto exit; 7473 } 7474 7475 p->cwmin = params->cw_min; 7476 p->cwmax = params->cw_max; 7477 p->aifs = params->aifs; 7478 p->txop = params->txop; 7479 7480 ret = ath12k_wmi_send_wmm_update_cmd(ar, arvif->vdev_id, 7481 &arvif->wmm_params); 7482 if (ret) { 7483 ath12k_warn(ab, "pdev idx %d failed to set wmm params: %d\n", 7484 ar->pdev_idx, ret); 7485 goto exit; 7486 } 7487 7488 ret = ath12k_conf_tx_uapsd(arvif, ac, params->uapsd); 7489 if (ret) 7490 ath12k_warn(ab, "pdev idx %d failed to set sta uapsd: %d\n", 7491 ar->pdev_idx, ret); 7492 7493 exit: 7494 return ret; 7495 } 7496 7497 static int ath12k_mac_op_conf_tx(struct ieee80211_hw *hw, 7498 struct ieee80211_vif *vif, 7499 unsigned int link_id, u16 ac, 7500 const struct ieee80211_tx_queue_params *params) 7501 { 7502 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 7503 struct ath12k_link_vif *arvif; 7504 struct ath12k_vif_cache *cache; 7505 int ret; 7506 7507 lockdep_assert_wiphy(hw->wiphy); 7508 7509 if (link_id >= IEEE80211_MLD_MAX_NUM_LINKS) 7510 return -EINVAL; 7511 7512 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 7513 if (!arvif || !arvif->is_created) { 7514 cache = ath12k_ahvif_get_link_cache(ahvif, link_id); 7515 if (!cache) 7516 return -ENOSPC; 7517 7518 cache->tx_conf.changed = true; 7519 cache->tx_conf.ac = ac; 7520 cache->tx_conf.tx_queue_params = *params; 7521 7522 return 0; 7523 } 7524 7525 ret = ath12k_mac_conf_tx(arvif, ac, params); 7526 7527 return ret; 7528 } 7529 7530 static struct ieee80211_sta_ht_cap 7531 ath12k_create_ht_cap(struct ath12k *ar, u32 ar_ht_cap, u32 rate_cap_rx_chainmask) 7532 { 7533 int i; 7534 struct ieee80211_sta_ht_cap ht_cap = {}; 7535 u32 ar_vht_cap = ar->pdev->cap.vht_cap; 7536 7537 if (!(ar_ht_cap & WMI_HT_CAP_ENABLED)) 7538 return ht_cap; 7539 7540 ht_cap.ht_supported = 1; 7541 ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K; 7542 ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_NONE; 7543 ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40; 7544 ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40; 7545 ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT; 7546 7547 if (ar_ht_cap & WMI_HT_CAP_HT20_SGI) 7548 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20; 7549 7550 if (ar_ht_cap & WMI_HT_CAP_HT40_SGI) 7551 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40; 7552 7553 if (ar_ht_cap & WMI_HT_CAP_DYNAMIC_SMPS) { 7554 u32 smps; 7555 7556 smps = WLAN_HT_CAP_SM_PS_DYNAMIC; 7557 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT; 7558 7559 ht_cap.cap |= smps; 7560 } 7561 7562 if (ar_ht_cap & WMI_HT_CAP_TX_STBC) 7563 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC; 7564 7565 if (ar_ht_cap & WMI_HT_CAP_RX_STBC) { 7566 u32 stbc; 7567 7568 stbc = ar_ht_cap; 7569 stbc &= WMI_HT_CAP_RX_STBC; 7570 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT; 7571 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT; 7572 stbc &= IEEE80211_HT_CAP_RX_STBC; 7573 7574 ht_cap.cap |= stbc; 7575 } 7576 7577 if (ar_ht_cap & WMI_HT_CAP_RX_LDPC) 7578 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING; 7579 7580 if (ar_ht_cap & WMI_HT_CAP_L_SIG_TXOP_PROT) 7581 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT; 7582 7583 if (ar_vht_cap & WMI_VHT_CAP_MAX_MPDU_LEN_MASK) 7584 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU; 7585 7586 for (i = 0; i < ar->num_rx_chains; i++) { 7587 if (rate_cap_rx_chainmask & BIT(i)) 7588 ht_cap.mcs.rx_mask[i] = 0xFF; 7589 } 7590 7591 ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED; 7592 7593 return ht_cap; 7594 } 7595 7596 static int ath12k_mac_set_txbf_conf(struct ath12k_link_vif *arvif) 7597 { 7598 u32 value = 0; 7599 struct ath12k *ar = arvif->ar; 7600 struct ath12k_vif *ahvif = arvif->ahvif; 7601 int nsts; 7602 int sound_dim; 7603 u32 vht_cap = ar->pdev->cap.vht_cap; 7604 u32 vdev_param = WMI_VDEV_PARAM_TXBF; 7605 7606 if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)) { 7607 nsts = vht_cap & IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK; 7608 nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT; 7609 value |= SM(nsts, WMI_TXBF_STS_CAP_OFFSET); 7610 } 7611 7612 if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)) { 7613 sound_dim = vht_cap & 7614 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK; 7615 sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT; 7616 if (sound_dim > (ar->num_tx_chains - 1)) 7617 sound_dim = ar->num_tx_chains - 1; 7618 value |= SM(sound_dim, WMI_BF_SOUND_DIM_OFFSET); 7619 } 7620 7621 if (!value) 7622 return 0; 7623 7624 if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) { 7625 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER; 7626 7627 if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) && 7628 ahvif->vdev_type == WMI_VDEV_TYPE_AP) 7629 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFER; 7630 } 7631 7632 if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE) { 7633 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE; 7634 7635 if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE) && 7636 ahvif->vdev_type == WMI_VDEV_TYPE_STA) 7637 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE; 7638 } 7639 7640 return ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 7641 vdev_param, value); 7642 } 7643 7644 static void ath12k_set_vht_txbf_cap(struct ath12k *ar, u32 *vht_cap) 7645 { 7646 bool subfer, subfee; 7647 int sound_dim = 0; 7648 7649 subfer = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)); 7650 subfee = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)); 7651 7652 if (ar->num_tx_chains < 2) { 7653 *vht_cap &= ~(IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE); 7654 subfer = false; 7655 } 7656 7657 /* If SU Beaformer is not set, then disable MU Beamformer Capability */ 7658 if (!subfer) 7659 *vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE); 7660 7661 /* If SU Beaformee is not set, then disable MU Beamformee Capability */ 7662 if (!subfee) 7663 *vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE); 7664 7665 sound_dim = u32_get_bits(*vht_cap, 7666 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK); 7667 *vht_cap = u32_replace_bits(*vht_cap, 0, 7668 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK); 7669 7670 /* TODO: Need to check invalid STS and Sound_dim values set by FW? */ 7671 7672 /* Enable Sounding Dimension Field only if SU BF is enabled */ 7673 if (subfer) { 7674 if (sound_dim > (ar->num_tx_chains - 1)) 7675 sound_dim = ar->num_tx_chains - 1; 7676 7677 *vht_cap = u32_replace_bits(*vht_cap, sound_dim, 7678 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK); 7679 } 7680 7681 /* Use the STS advertised by FW unless SU Beamformee is not supported*/ 7682 if (!subfee) 7683 *vht_cap &= ~(IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK); 7684 } 7685 7686 static struct ieee80211_sta_vht_cap 7687 ath12k_create_vht_cap(struct ath12k *ar, u32 rate_cap_tx_chainmask, 7688 u32 rate_cap_rx_chainmask) 7689 { 7690 struct ieee80211_sta_vht_cap vht_cap = {}; 7691 u16 txmcs_map, rxmcs_map; 7692 int i; 7693 7694 vht_cap.vht_supported = 1; 7695 vht_cap.cap = ar->pdev->cap.vht_cap; 7696 7697 ath12k_set_vht_txbf_cap(ar, &vht_cap.cap); 7698 7699 /* 80P80 is not supported */ 7700 vht_cap.cap &= ~IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ; 7701 7702 rxmcs_map = 0; 7703 txmcs_map = 0; 7704 for (i = 0; i < 8; i++) { 7705 if (i < ar->num_tx_chains && rate_cap_tx_chainmask & BIT(i)) 7706 txmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2); 7707 else 7708 txmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2); 7709 7710 if (i < ar->num_rx_chains && rate_cap_rx_chainmask & BIT(i)) 7711 rxmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2); 7712 else 7713 rxmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2); 7714 } 7715 7716 if (rate_cap_tx_chainmask <= 1) 7717 vht_cap.cap &= ~IEEE80211_VHT_CAP_TXSTBC; 7718 7719 vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(rxmcs_map); 7720 vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(txmcs_map); 7721 7722 /* Check if the HW supports 1:1 NSS ratio and reset 7723 * EXT NSS BW Support field to 0 to indicate 1:1 ratio 7724 */ 7725 if (ar->pdev->cap.nss_ratio_info == WMI_NSS_RATIO_1_NSS) 7726 vht_cap.cap &= ~IEEE80211_VHT_CAP_EXT_NSS_BW_MASK; 7727 7728 return vht_cap; 7729 } 7730 7731 static void ath12k_mac_setup_ht_vht_cap(struct ath12k *ar, 7732 struct ath12k_pdev_cap *cap, 7733 u32 *ht_cap_info) 7734 { 7735 struct ieee80211_supported_band *band; 7736 u32 rate_cap_tx_chainmask; 7737 u32 rate_cap_rx_chainmask; 7738 u32 ht_cap; 7739 7740 rate_cap_tx_chainmask = ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift; 7741 rate_cap_rx_chainmask = ar->cfg_rx_chainmask >> cap->rx_chain_mask_shift; 7742 7743 if (cap->supported_bands & WMI_HOST_WLAN_2GHZ_CAP) { 7744 band = &ar->mac.sbands[NL80211_BAND_2GHZ]; 7745 ht_cap = cap->band[NL80211_BAND_2GHZ].ht_cap_info; 7746 if (ht_cap_info) 7747 *ht_cap_info = ht_cap; 7748 band->ht_cap = ath12k_create_ht_cap(ar, ht_cap, 7749 rate_cap_rx_chainmask); 7750 } 7751 7752 if (cap->supported_bands & WMI_HOST_WLAN_5GHZ_CAP && 7753 (ar->ab->hw_params->single_pdev_only || 7754 !ar->supports_6ghz)) { 7755 band = &ar->mac.sbands[NL80211_BAND_5GHZ]; 7756 ht_cap = cap->band[NL80211_BAND_5GHZ].ht_cap_info; 7757 if (ht_cap_info) 7758 *ht_cap_info = ht_cap; 7759 band->ht_cap = ath12k_create_ht_cap(ar, ht_cap, 7760 rate_cap_rx_chainmask); 7761 band->vht_cap = ath12k_create_vht_cap(ar, rate_cap_tx_chainmask, 7762 rate_cap_rx_chainmask); 7763 } 7764 } 7765 7766 static int ath12k_check_chain_mask(struct ath12k *ar, u32 ant, bool is_tx_ant) 7767 { 7768 /* TODO: Check the request chainmask against the supported 7769 * chainmask table which is advertised in extented_service_ready event 7770 */ 7771 7772 return 0; 7773 } 7774 7775 static void ath12k_gen_ppe_thresh(struct ath12k_wmi_ppe_threshold_arg *fw_ppet, 7776 u8 *he_ppet) 7777 { 7778 int nss, ru; 7779 u8 bit = 7; 7780 7781 he_ppet[0] = fw_ppet->numss_m1 & IEEE80211_PPE_THRES_NSS_MASK; 7782 he_ppet[0] |= (fw_ppet->ru_bit_mask << 7783 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS) & 7784 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK; 7785 for (nss = 0; nss <= fw_ppet->numss_m1; nss++) { 7786 for (ru = 0; ru < 4; ru++) { 7787 u8 val; 7788 int i; 7789 7790 if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0) 7791 continue; 7792 val = (fw_ppet->ppet16_ppet8_ru3_ru0[nss] >> (ru * 6)) & 7793 0x3f; 7794 val = ((val >> 3) & 0x7) | ((val & 0x7) << 3); 7795 for (i = 5; i >= 0; i--) { 7796 he_ppet[bit / 8] |= 7797 ((val >> i) & 0x1) << ((bit % 8)); 7798 bit++; 7799 } 7800 } 7801 } 7802 } 7803 7804 static void 7805 ath12k_mac_filter_he_cap_mesh(struct ieee80211_he_cap_elem *he_cap_elem) 7806 { 7807 u8 m; 7808 7809 m = IEEE80211_HE_MAC_CAP0_TWT_RES | 7810 IEEE80211_HE_MAC_CAP0_TWT_REQ; 7811 he_cap_elem->mac_cap_info[0] &= ~m; 7812 7813 m = IEEE80211_HE_MAC_CAP2_TRS | 7814 IEEE80211_HE_MAC_CAP2_BCAST_TWT | 7815 IEEE80211_HE_MAC_CAP2_MU_CASCADING; 7816 he_cap_elem->mac_cap_info[2] &= ~m; 7817 7818 m = IEEE80211_HE_MAC_CAP3_FLEX_TWT_SCHED | 7819 IEEE80211_HE_MAC_CAP2_BCAST_TWT | 7820 IEEE80211_HE_MAC_CAP2_MU_CASCADING; 7821 he_cap_elem->mac_cap_info[3] &= ~m; 7822 7823 m = IEEE80211_HE_MAC_CAP4_BSRP_BQRP_A_MPDU_AGG | 7824 IEEE80211_HE_MAC_CAP4_BQR; 7825 he_cap_elem->mac_cap_info[4] &= ~m; 7826 7827 m = IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECTIVE_TRANSMISSION | 7828 IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU | 7829 IEEE80211_HE_MAC_CAP5_PUNCTURED_SOUNDING | 7830 IEEE80211_HE_MAC_CAP5_HT_VHT_TRIG_FRAME_RX; 7831 he_cap_elem->mac_cap_info[5] &= ~m; 7832 7833 m = IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO | 7834 IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO; 7835 he_cap_elem->phy_cap_info[2] &= ~m; 7836 7837 m = IEEE80211_HE_PHY_CAP3_RX_PARTIAL_BW_SU_IN_20MHZ_MU | 7838 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK | 7839 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_MASK; 7840 he_cap_elem->phy_cap_info[3] &= ~m; 7841 7842 m = IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER; 7843 he_cap_elem->phy_cap_info[4] &= ~m; 7844 7845 m = IEEE80211_HE_PHY_CAP5_NG16_MU_FEEDBACK; 7846 he_cap_elem->phy_cap_info[5] &= ~m; 7847 7848 m = IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU | 7849 IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB | 7850 IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB | 7851 IEEE80211_HE_PHY_CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO; 7852 he_cap_elem->phy_cap_info[6] &= ~m; 7853 7854 m = IEEE80211_HE_PHY_CAP7_PSR_BASED_SR | 7855 IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP | 7856 IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ | 7857 IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ; 7858 he_cap_elem->phy_cap_info[7] &= ~m; 7859 7860 m = IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI | 7861 IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G | 7862 IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU | 7863 IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU; 7864 he_cap_elem->phy_cap_info[8] &= ~m; 7865 7866 m = IEEE80211_HE_PHY_CAP9_LONGER_THAN_16_SIGB_OFDM_SYM | 7867 IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK | 7868 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU | 7869 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU | 7870 IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_COMP_SIGB | 7871 IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_NON_COMP_SIGB; 7872 he_cap_elem->phy_cap_info[9] &= ~m; 7873 } 7874 7875 static __le16 ath12k_mac_setup_he_6ghz_cap(struct ath12k_pdev_cap *pcap, 7876 struct ath12k_band_cap *bcap) 7877 { 7878 u8 val; 7879 7880 bcap->he_6ghz_capa = IEEE80211_HT_MPDU_DENSITY_NONE; 7881 if (bcap->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) 7882 bcap->he_6ghz_capa |= 7883 u32_encode_bits(WLAN_HT_CAP_SM_PS_DYNAMIC, 7884 IEEE80211_HE_6GHZ_CAP_SM_PS); 7885 else 7886 bcap->he_6ghz_capa |= 7887 u32_encode_bits(WLAN_HT_CAP_SM_PS_DISABLED, 7888 IEEE80211_HE_6GHZ_CAP_SM_PS); 7889 val = u32_get_bits(pcap->vht_cap, 7890 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK); 7891 bcap->he_6ghz_capa |= 7892 u32_encode_bits(val, IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP); 7893 val = u32_get_bits(pcap->vht_cap, 7894 IEEE80211_VHT_CAP_MAX_MPDU_MASK); 7895 bcap->he_6ghz_capa |= 7896 u32_encode_bits(val, IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN); 7897 if (pcap->vht_cap & IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN) 7898 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS; 7899 if (pcap->vht_cap & IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN) 7900 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS; 7901 7902 return cpu_to_le16(bcap->he_6ghz_capa); 7903 } 7904 7905 static void ath12k_mac_set_hemcsmap(struct ath12k *ar, 7906 struct ath12k_pdev_cap *cap, 7907 struct ieee80211_sta_he_cap *he_cap) 7908 { 7909 struct ieee80211_he_mcs_nss_supp *mcs_nss = &he_cap->he_mcs_nss_supp; 7910 u8 maxtxnss_160 = ath12k_get_nss_160mhz(ar, ar->num_tx_chains); 7911 u8 maxrxnss_160 = ath12k_get_nss_160mhz(ar, ar->num_rx_chains); 7912 u16 txmcs_map_160 = 0, rxmcs_map_160 = 0; 7913 u16 txmcs_map = 0, rxmcs_map = 0; 7914 u32 i; 7915 7916 for (i = 0; i < 8; i++) { 7917 if (i < ar->num_tx_chains && 7918 (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i)) 7919 txmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2); 7920 else 7921 txmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2); 7922 7923 if (i < ar->num_rx_chains && 7924 (ar->cfg_rx_chainmask >> cap->tx_chain_mask_shift) & BIT(i)) 7925 rxmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2); 7926 else 7927 rxmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2); 7928 7929 if (i < maxtxnss_160 && 7930 (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i)) 7931 txmcs_map_160 |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2); 7932 else 7933 txmcs_map_160 |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2); 7934 7935 if (i < maxrxnss_160 && 7936 (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i)) 7937 rxmcs_map_160 |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2); 7938 else 7939 rxmcs_map_160 |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2); 7940 } 7941 7942 mcs_nss->rx_mcs_80 = cpu_to_le16(rxmcs_map & 0xffff); 7943 mcs_nss->tx_mcs_80 = cpu_to_le16(txmcs_map & 0xffff); 7944 mcs_nss->rx_mcs_160 = cpu_to_le16(rxmcs_map_160 & 0xffff); 7945 mcs_nss->tx_mcs_160 = cpu_to_le16(txmcs_map_160 & 0xffff); 7946 } 7947 7948 static void ath12k_mac_copy_he_cap(struct ath12k *ar, 7949 struct ath12k_band_cap *band_cap, 7950 int iftype, u8 num_tx_chains, 7951 struct ieee80211_sta_he_cap *he_cap) 7952 { 7953 struct ieee80211_he_cap_elem *he_cap_elem = &he_cap->he_cap_elem; 7954 7955 he_cap->has_he = true; 7956 memcpy(he_cap_elem->mac_cap_info, band_cap->he_cap_info, 7957 sizeof(he_cap_elem->mac_cap_info)); 7958 memcpy(he_cap_elem->phy_cap_info, band_cap->he_cap_phy_info, 7959 sizeof(he_cap_elem->phy_cap_info)); 7960 7961 he_cap_elem->mac_cap_info[1] &= 7962 IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_MASK; 7963 he_cap_elem->phy_cap_info[0] &= 7964 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G | 7965 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G | 7966 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G; 7967 /* 80PLUS80 is not supported */ 7968 he_cap_elem->phy_cap_info[0] &= 7969 ~IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G; 7970 he_cap_elem->phy_cap_info[5] &= 7971 ~IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK; 7972 he_cap_elem->phy_cap_info[5] |= num_tx_chains - 1; 7973 7974 switch (iftype) { 7975 case NL80211_IFTYPE_AP: 7976 he_cap_elem->mac_cap_info[2] &= 7977 ~IEEE80211_HE_MAC_CAP2_BCAST_TWT; 7978 he_cap_elem->phy_cap_info[3] &= 7979 ~IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK; 7980 he_cap_elem->phy_cap_info[9] |= 7981 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU; 7982 break; 7983 case NL80211_IFTYPE_STATION: 7984 he_cap_elem->mac_cap_info[0] &= ~IEEE80211_HE_MAC_CAP0_TWT_RES; 7985 he_cap_elem->mac_cap_info[0] |= IEEE80211_HE_MAC_CAP0_TWT_REQ; 7986 he_cap_elem->phy_cap_info[9] |= 7987 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU; 7988 break; 7989 case NL80211_IFTYPE_MESH_POINT: 7990 ath12k_mac_filter_he_cap_mesh(he_cap_elem); 7991 break; 7992 } 7993 7994 ath12k_mac_set_hemcsmap(ar, &ar->pdev->cap, he_cap); 7995 memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres)); 7996 if (he_cap_elem->phy_cap_info[6] & 7997 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) 7998 ath12k_gen_ppe_thresh(&band_cap->he_ppet, he_cap->ppe_thres); 7999 } 8000 8001 static void 8002 ath12k_mac_copy_eht_mcs_nss(struct ath12k_band_cap *band_cap, 8003 struct ieee80211_eht_mcs_nss_supp *mcs_nss, 8004 const struct ieee80211_he_cap_elem *he_cap, 8005 const struct ieee80211_eht_cap_elem_fixed *eht_cap) 8006 { 8007 if ((he_cap->phy_cap_info[0] & 8008 (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G | 8009 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G | 8010 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G | 8011 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)) == 0) 8012 memcpy(&mcs_nss->only_20mhz, &band_cap->eht_mcs_20_only, 8013 sizeof(struct ieee80211_eht_mcs_nss_supp_20mhz_only)); 8014 8015 if (he_cap->phy_cap_info[0] & 8016 (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G | 8017 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G)) 8018 memcpy(&mcs_nss->bw._80, &band_cap->eht_mcs_80, 8019 sizeof(struct ieee80211_eht_mcs_nss_supp_bw)); 8020 8021 if (he_cap->phy_cap_info[0] & 8022 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G) 8023 memcpy(&mcs_nss->bw._160, &band_cap->eht_mcs_160, 8024 sizeof(struct ieee80211_eht_mcs_nss_supp_bw)); 8025 8026 if (eht_cap->phy_cap_info[0] & IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ) 8027 memcpy(&mcs_nss->bw._320, &band_cap->eht_mcs_320, 8028 sizeof(struct ieee80211_eht_mcs_nss_supp_bw)); 8029 } 8030 8031 static void ath12k_mac_copy_eht_ppe_thresh(struct ath12k_wmi_ppe_threshold_arg *fw_ppet, 8032 struct ieee80211_sta_eht_cap *cap) 8033 { 8034 u16 bit = IEEE80211_EHT_PPE_THRES_INFO_HEADER_SIZE; 8035 u8 i, nss, ru, ppet_bit_len_per_ru = IEEE80211_EHT_PPE_THRES_INFO_PPET_SIZE * 2; 8036 8037 u8p_replace_bits(&cap->eht_ppe_thres[0], fw_ppet->numss_m1, 8038 IEEE80211_EHT_PPE_THRES_NSS_MASK); 8039 8040 u16p_replace_bits((u16 *)&cap->eht_ppe_thres[0], fw_ppet->ru_bit_mask, 8041 IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK); 8042 8043 for (nss = 0; nss <= fw_ppet->numss_m1; nss++) { 8044 for (ru = 0; 8045 ru < hweight16(IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK); 8046 ru++) { 8047 u32 val = 0; 8048 8049 if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0) 8050 continue; 8051 8052 u32p_replace_bits(&val, fw_ppet->ppet16_ppet8_ru3_ru0[nss] >> 8053 (ru * ppet_bit_len_per_ru), 8054 GENMASK(ppet_bit_len_per_ru - 1, 0)); 8055 8056 for (i = 0; i < ppet_bit_len_per_ru; i++) { 8057 cap->eht_ppe_thres[bit / 8] |= 8058 (((val >> i) & 0x1) << ((bit % 8))); 8059 bit++; 8060 } 8061 } 8062 } 8063 } 8064 8065 static void 8066 ath12k_mac_filter_eht_cap_mesh(struct ieee80211_eht_cap_elem_fixed 8067 *eht_cap_elem) 8068 { 8069 u8 m; 8070 8071 m = IEEE80211_EHT_MAC_CAP0_EPCS_PRIO_ACCESS; 8072 eht_cap_elem->mac_cap_info[0] &= ~m; 8073 8074 m = IEEE80211_EHT_PHY_CAP0_PARTIAL_BW_UL_MU_MIMO; 8075 eht_cap_elem->phy_cap_info[0] &= ~m; 8076 8077 m = IEEE80211_EHT_PHY_CAP3_NG_16_MU_FEEDBACK | 8078 IEEE80211_EHT_PHY_CAP3_CODEBOOK_7_5_MU_FDBK | 8079 IEEE80211_EHT_PHY_CAP3_TRIG_MU_BF_PART_BW_FDBK | 8080 IEEE80211_EHT_PHY_CAP3_TRIG_CQI_FDBK; 8081 eht_cap_elem->phy_cap_info[3] &= ~m; 8082 8083 m = IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO | 8084 IEEE80211_EHT_PHY_CAP4_PSR_SR_SUPP | 8085 IEEE80211_EHT_PHY_CAP4_POWER_BOOST_FACT_SUPP | 8086 IEEE80211_EHT_PHY_CAP4_EHT_MU_PPDU_4_EHT_LTF_08_GI; 8087 eht_cap_elem->phy_cap_info[4] &= ~m; 8088 8089 m = IEEE80211_EHT_PHY_CAP5_NON_TRIG_CQI_FEEDBACK | 8090 IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP | 8091 IEEE80211_EHT_PHY_CAP5_RX_LESS_242_TONE_RU_SUPP | 8092 IEEE80211_EHT_PHY_CAP5_MAX_NUM_SUPP_EHT_LTF_MASK; 8093 eht_cap_elem->phy_cap_info[5] &= ~m; 8094 8095 m = IEEE80211_EHT_PHY_CAP6_MAX_NUM_SUPP_EHT_LTF_MASK; 8096 eht_cap_elem->phy_cap_info[6] &= ~m; 8097 8098 m = IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ | 8099 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ | 8100 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ | 8101 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ | 8102 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ | 8103 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ; 8104 eht_cap_elem->phy_cap_info[7] &= ~m; 8105 } 8106 8107 static void ath12k_mac_copy_eht_cap(struct ath12k *ar, 8108 struct ath12k_band_cap *band_cap, 8109 struct ieee80211_he_cap_elem *he_cap_elem, 8110 int iftype, 8111 struct ieee80211_sta_eht_cap *eht_cap) 8112 { 8113 struct ieee80211_eht_cap_elem_fixed *eht_cap_elem = &eht_cap->eht_cap_elem; 8114 8115 memset(eht_cap, 0, sizeof(struct ieee80211_sta_eht_cap)); 8116 8117 if (!(test_bit(WMI_TLV_SERVICE_11BE, ar->ab->wmi_ab.svc_map)) || 8118 ath12k_acpi_get_disable_11be(ar->ab)) 8119 return; 8120 8121 eht_cap->has_eht = true; 8122 memcpy(eht_cap_elem->mac_cap_info, band_cap->eht_cap_mac_info, 8123 sizeof(eht_cap_elem->mac_cap_info)); 8124 memcpy(eht_cap_elem->phy_cap_info, band_cap->eht_cap_phy_info, 8125 sizeof(eht_cap_elem->phy_cap_info)); 8126 8127 switch (iftype) { 8128 case NL80211_IFTYPE_AP: 8129 eht_cap_elem->phy_cap_info[0] &= 8130 ~IEEE80211_EHT_PHY_CAP0_242_TONE_RU_GT20MHZ; 8131 eht_cap_elem->phy_cap_info[4] &= 8132 ~IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO; 8133 eht_cap_elem->phy_cap_info[5] &= 8134 ~IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP; 8135 break; 8136 case NL80211_IFTYPE_STATION: 8137 eht_cap_elem->phy_cap_info[7] &= 8138 ~(IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ | 8139 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ | 8140 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ); 8141 eht_cap_elem->phy_cap_info[7] &= 8142 ~(IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ | 8143 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ | 8144 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ); 8145 break; 8146 case NL80211_IFTYPE_MESH_POINT: 8147 ath12k_mac_filter_eht_cap_mesh(eht_cap_elem); 8148 break; 8149 default: 8150 break; 8151 } 8152 8153 ath12k_mac_copy_eht_mcs_nss(band_cap, &eht_cap->eht_mcs_nss_supp, 8154 he_cap_elem, eht_cap_elem); 8155 8156 if (eht_cap_elem->phy_cap_info[5] & 8157 IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT) 8158 ath12k_mac_copy_eht_ppe_thresh(&band_cap->eht_ppet, eht_cap); 8159 } 8160 8161 static int ath12k_mac_copy_sband_iftype_data(struct ath12k *ar, 8162 struct ath12k_pdev_cap *cap, 8163 struct ieee80211_sband_iftype_data *data, 8164 int band) 8165 { 8166 struct ath12k_band_cap *band_cap = &cap->band[band]; 8167 int i, idx = 0; 8168 8169 for (i = 0; i < NUM_NL80211_IFTYPES; i++) { 8170 struct ieee80211_sta_he_cap *he_cap = &data[idx].he_cap; 8171 8172 switch (i) { 8173 case NL80211_IFTYPE_STATION: 8174 case NL80211_IFTYPE_AP: 8175 case NL80211_IFTYPE_MESH_POINT: 8176 break; 8177 8178 default: 8179 continue; 8180 } 8181 8182 data[idx].types_mask = BIT(i); 8183 8184 ath12k_mac_copy_he_cap(ar, band_cap, i, ar->num_tx_chains, he_cap); 8185 if (band == NL80211_BAND_6GHZ) { 8186 data[idx].he_6ghz_capa.capa = 8187 ath12k_mac_setup_he_6ghz_cap(cap, band_cap); 8188 } 8189 ath12k_mac_copy_eht_cap(ar, band_cap, &he_cap->he_cap_elem, i, 8190 &data[idx].eht_cap); 8191 idx++; 8192 } 8193 8194 return idx; 8195 } 8196 8197 static void ath12k_mac_setup_sband_iftype_data(struct ath12k *ar, 8198 struct ath12k_pdev_cap *cap) 8199 { 8200 struct ieee80211_supported_band *sband; 8201 enum nl80211_band band; 8202 int count; 8203 8204 if (cap->supported_bands & WMI_HOST_WLAN_2GHZ_CAP) { 8205 band = NL80211_BAND_2GHZ; 8206 count = ath12k_mac_copy_sband_iftype_data(ar, cap, 8207 ar->mac.iftype[band], 8208 band); 8209 sband = &ar->mac.sbands[band]; 8210 _ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band], 8211 count); 8212 } 8213 8214 if (cap->supported_bands & WMI_HOST_WLAN_5GHZ_CAP) { 8215 band = NL80211_BAND_5GHZ; 8216 count = ath12k_mac_copy_sband_iftype_data(ar, cap, 8217 ar->mac.iftype[band], 8218 band); 8219 sband = &ar->mac.sbands[band]; 8220 _ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band], 8221 count); 8222 } 8223 8224 if (cap->supported_bands & WMI_HOST_WLAN_5GHZ_CAP && 8225 ar->supports_6ghz) { 8226 band = NL80211_BAND_6GHZ; 8227 count = ath12k_mac_copy_sband_iftype_data(ar, cap, 8228 ar->mac.iftype[band], 8229 band); 8230 sband = &ar->mac.sbands[band]; 8231 _ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band], 8232 count); 8233 } 8234 } 8235 8236 static int __ath12k_set_antenna(struct ath12k *ar, u32 tx_ant, u32 rx_ant) 8237 { 8238 struct ath12k_hw *ah = ath12k_ar_to_ah(ar); 8239 int ret; 8240 8241 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 8242 8243 if (ath12k_check_chain_mask(ar, tx_ant, true)) 8244 return -EINVAL; 8245 8246 if (ath12k_check_chain_mask(ar, rx_ant, false)) 8247 return -EINVAL; 8248 8249 /* Since we advertised the max cap of all radios combined during wiphy 8250 * registration, ensure we don't set the antenna config higher than the 8251 * limits 8252 */ 8253 tx_ant = min_t(u32, tx_ant, ar->pdev->cap.tx_chain_mask); 8254 rx_ant = min_t(u32, rx_ant, ar->pdev->cap.rx_chain_mask); 8255 8256 ar->cfg_tx_chainmask = tx_ant; 8257 ar->cfg_rx_chainmask = rx_ant; 8258 8259 if (ah->state != ATH12K_HW_STATE_ON && 8260 ah->state != ATH12K_HW_STATE_RESTARTED) 8261 return 0; 8262 8263 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_TX_CHAIN_MASK, 8264 tx_ant, ar->pdev->pdev_id); 8265 if (ret) { 8266 ath12k_warn(ar->ab, "failed to set tx-chainmask: %d, req 0x%x\n", 8267 ret, tx_ant); 8268 return ret; 8269 } 8270 8271 ar->num_tx_chains = hweight32(tx_ant); 8272 8273 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RX_CHAIN_MASK, 8274 rx_ant, ar->pdev->pdev_id); 8275 if (ret) { 8276 ath12k_warn(ar->ab, "failed to set rx-chainmask: %d, req 0x%x\n", 8277 ret, rx_ant); 8278 return ret; 8279 } 8280 8281 ar->num_rx_chains = hweight32(rx_ant); 8282 8283 /* Reload HT/VHT/HE capability */ 8284 ath12k_mac_setup_ht_vht_cap(ar, &ar->pdev->cap, NULL); 8285 ath12k_mac_setup_sband_iftype_data(ar, &ar->pdev->cap); 8286 8287 return 0; 8288 } 8289 8290 static void ath12k_mgmt_over_wmi_tx_drop(struct ath12k *ar, struct sk_buff *skb) 8291 { 8292 int num_mgmt; 8293 8294 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 8295 8296 ieee80211_free_txskb(ath12k_ar_to_hw(ar), skb); 8297 8298 num_mgmt = atomic_dec_if_positive(&ar->num_pending_mgmt_tx); 8299 8300 if (num_mgmt < 0) 8301 WARN_ON_ONCE(1); 8302 8303 if (!num_mgmt) 8304 wake_up(&ar->txmgmt_empty_waitq); 8305 } 8306 8307 int ath12k_mac_tx_mgmt_pending_free(int buf_id, void *skb, void *ctx) 8308 { 8309 struct sk_buff *msdu = skb; 8310 struct ieee80211_tx_info *info; 8311 struct ath12k *ar = ctx; 8312 struct ath12k_base *ab = ar->ab; 8313 8314 spin_lock_bh(&ar->txmgmt_idr_lock); 8315 idr_remove(&ar->txmgmt_idr, buf_id); 8316 spin_unlock_bh(&ar->txmgmt_idr_lock); 8317 dma_unmap_single(ab->dev, ATH12K_SKB_CB(msdu)->paddr, msdu->len, 8318 DMA_TO_DEVICE); 8319 8320 info = IEEE80211_SKB_CB(msdu); 8321 memset(&info->status, 0, sizeof(info->status)); 8322 8323 ath12k_mgmt_over_wmi_tx_drop(ar, skb); 8324 8325 return 0; 8326 } 8327 8328 static int ath12k_mac_vif_txmgmt_idr_remove(int buf_id, void *skb, void *ctx) 8329 { 8330 struct ieee80211_vif *vif = ctx; 8331 struct ath12k_skb_cb *skb_cb = ATH12K_SKB_CB(skb); 8332 struct sk_buff *msdu = skb; 8333 struct ath12k *ar = skb_cb->ar; 8334 struct ath12k_base *ab = ar->ab; 8335 8336 if (skb_cb->vif == vif) { 8337 spin_lock_bh(&ar->txmgmt_idr_lock); 8338 idr_remove(&ar->txmgmt_idr, buf_id); 8339 spin_unlock_bh(&ar->txmgmt_idr_lock); 8340 dma_unmap_single(ab->dev, skb_cb->paddr, msdu->len, 8341 DMA_TO_DEVICE); 8342 } 8343 8344 return 0; 8345 } 8346 8347 static int ath12k_mac_mgmt_tx_wmi(struct ath12k *ar, struct ath12k_link_vif *arvif, 8348 struct sk_buff *skb) 8349 { 8350 struct ath12k_base *ab = ar->ab; 8351 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 8352 struct ath12k_skb_cb *skb_cb = ATH12K_SKB_CB(skb); 8353 struct ieee80211_tx_info *info; 8354 enum hal_encrypt_type enctype; 8355 unsigned int mic_len; 8356 dma_addr_t paddr; 8357 int buf_id; 8358 int ret; 8359 8360 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 8361 8362 skb_cb->ar = ar; 8363 spin_lock_bh(&ar->txmgmt_idr_lock); 8364 buf_id = idr_alloc(&ar->txmgmt_idr, skb, 0, 8365 ATH12K_TX_MGMT_NUM_PENDING_MAX, GFP_ATOMIC); 8366 spin_unlock_bh(&ar->txmgmt_idr_lock); 8367 if (buf_id < 0) 8368 return -ENOSPC; 8369 8370 info = IEEE80211_SKB_CB(skb); 8371 if ((skb_cb->flags & ATH12K_SKB_CIPHER_SET) && 8372 !(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) { 8373 if ((ieee80211_is_action(hdr->frame_control) || 8374 ieee80211_is_deauth(hdr->frame_control) || 8375 ieee80211_is_disassoc(hdr->frame_control)) && 8376 ieee80211_has_protected(hdr->frame_control)) { 8377 enctype = ath12k_dp_tx_get_encrypt_type(skb_cb->cipher); 8378 mic_len = ath12k_dp_rx_crypto_mic_len(ar, enctype); 8379 skb_put(skb, mic_len); 8380 } 8381 } 8382 8383 paddr = dma_map_single(ab->dev, skb->data, skb->len, DMA_TO_DEVICE); 8384 if (dma_mapping_error(ab->dev, paddr)) { 8385 ath12k_warn(ab, "failed to DMA map mgmt Tx buffer\n"); 8386 ret = -EIO; 8387 goto err_free_idr; 8388 } 8389 8390 skb_cb->paddr = paddr; 8391 8392 ret = ath12k_wmi_mgmt_send(arvif, buf_id, skb); 8393 if (ret) { 8394 ath12k_warn(ar->ab, "failed to send mgmt frame: %d\n", ret); 8395 goto err_unmap_buf; 8396 } 8397 8398 return 0; 8399 8400 err_unmap_buf: 8401 dma_unmap_single(ab->dev, skb_cb->paddr, 8402 skb->len, DMA_TO_DEVICE); 8403 err_free_idr: 8404 spin_lock_bh(&ar->txmgmt_idr_lock); 8405 idr_remove(&ar->txmgmt_idr, buf_id); 8406 spin_unlock_bh(&ar->txmgmt_idr_lock); 8407 8408 return ret; 8409 } 8410 8411 static void ath12k_mgmt_over_wmi_tx_purge(struct ath12k *ar) 8412 { 8413 struct sk_buff *skb; 8414 8415 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) 8416 ath12k_mgmt_over_wmi_tx_drop(ar, skb); 8417 } 8418 8419 static int ath12k_mac_mgmt_action_frame_fill_elem_data(struct ath12k_link_vif *arvif, 8420 struct sk_buff *skb) 8421 { 8422 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 8423 u8 category, *buf, iv_len, action_code, dialog_token; 8424 struct ieee80211_bss_conf *link_conf; 8425 struct ieee80211_chanctx_conf *conf; 8426 int cur_tx_power, max_tx_power; 8427 struct ath12k *ar = arvif->ar; 8428 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar); 8429 struct wiphy *wiphy = hw->wiphy; 8430 struct ath12k_skb_cb *skb_cb; 8431 struct ieee80211_mgmt *mgmt; 8432 unsigned int remaining_len; 8433 bool has_protected; 8434 8435 lockdep_assert_wiphy(wiphy); 8436 8437 /* make sure category field is present */ 8438 if (skb->len < IEEE80211_MIN_ACTION_SIZE) 8439 return -EINVAL; 8440 8441 remaining_len = skb->len - IEEE80211_MIN_ACTION_SIZE; 8442 has_protected = ieee80211_has_protected(hdr->frame_control); 8443 8444 /* In case of SW crypto and hdr protected (PMF), packet will already be encrypted, 8445 * we can't put in data in this case 8446 */ 8447 if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags) && 8448 has_protected) 8449 return 0; 8450 8451 mgmt = (struct ieee80211_mgmt *)hdr; 8452 buf = (u8 *)&mgmt->u.action; 8453 8454 /* FCTL_PROTECTED frame might have extra space added for HDR_LEN. Offset that 8455 * many bytes if it is there 8456 */ 8457 if (has_protected) { 8458 skb_cb = ATH12K_SKB_CB(skb); 8459 8460 switch (skb_cb->cipher) { 8461 /* Cipher suite having flag %IEEE80211_KEY_FLAG_GENERATE_IV_MGMT set in 8462 * key needs to be processed. See ath12k_install_key() 8463 */ 8464 case WLAN_CIPHER_SUITE_CCMP: 8465 case WLAN_CIPHER_SUITE_CCMP_256: 8466 case WLAN_CIPHER_SUITE_GCMP: 8467 case WLAN_CIPHER_SUITE_GCMP_256: 8468 iv_len = IEEE80211_CCMP_HDR_LEN; 8469 break; 8470 case WLAN_CIPHER_SUITE_TKIP: 8471 iv_len = 0; 8472 break; 8473 default: 8474 return -EINVAL; 8475 } 8476 8477 if (remaining_len < iv_len) 8478 return -EINVAL; 8479 8480 buf += iv_len; 8481 remaining_len -= iv_len; 8482 } 8483 8484 category = *buf++; 8485 /* category code is already taken care in %IEEE80211_MIN_ACTION_SIZE hence 8486 * no need to adjust remaining_len 8487 */ 8488 8489 switch (category) { 8490 case WLAN_CATEGORY_RADIO_MEASUREMENT: 8491 /* need action code and dialog token */ 8492 if (remaining_len < 2) 8493 return -EINVAL; 8494 8495 /* Packet Format: 8496 * Action Code | Dialog Token | Variable Len (based on Action Code) 8497 */ 8498 action_code = *buf++; 8499 dialog_token = *buf++; 8500 remaining_len -= 2; 8501 8502 link_conf = ath12k_mac_get_link_bss_conf(arvif); 8503 if (!link_conf) { 8504 ath12k_warn(ar->ab, 8505 "failed to get bss link conf for vdev %d in RM handling\n", 8506 arvif->vdev_id); 8507 return -EINVAL; 8508 } 8509 8510 conf = wiphy_dereference(wiphy, link_conf->chanctx_conf); 8511 if (!conf) 8512 return -ENOENT; 8513 8514 cur_tx_power = link_conf->txpower; 8515 max_tx_power = min(conf->def.chan->max_reg_power, 8516 (int)ar->max_tx_power / 2); 8517 8518 ath12k_mac_op_get_txpower(hw, arvif->ahvif->vif, arvif->link_id, 8519 &cur_tx_power); 8520 8521 switch (action_code) { 8522 case WLAN_RM_ACTION_LINK_MEASUREMENT_REQUEST: 8523 /* need variable fields to be present in len */ 8524 if (remaining_len < 2) 8525 return -EINVAL; 8526 8527 /* Variable length format as defined in IEEE 802.11-2024, 8528 * Figure 9-1187-Link Measurement Request frame Action field 8529 * format. 8530 * Transmit Power | Max Tx Power 8531 * We fill both of these. 8532 */ 8533 *buf++ = cur_tx_power; 8534 *buf = max_tx_power; 8535 8536 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 8537 "RRM: Link Measurement Req dialog_token %u cur_tx_power %d max_tx_power %d\n", 8538 dialog_token, cur_tx_power, max_tx_power); 8539 break; 8540 case WLAN_RM_ACTION_LINK_MEASUREMENT_REPORT: 8541 /* need variable fields to be present in len */ 8542 if (remaining_len < 3) 8543 return -EINVAL; 8544 8545 /* Variable length format as defined in IEEE 802.11-2024, 8546 * Figure 9-1188-Link Measurement Report frame Action field format 8547 * TPC Report | Variable Fields 8548 * 8549 * TPC Report Format: 8550 * Element ID | Len | Tx Power | Link Margin 8551 * 8552 * We fill Tx power in the TPC Report (2nd index) 8553 */ 8554 buf[2] = cur_tx_power; 8555 8556 /* TODO: At present, Link margin data is not present so can't 8557 * really fill it now. Once it is available, it can be added 8558 * here 8559 */ 8560 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 8561 "RRM: Link Measurement Report dialog_token %u cur_tx_power %d\n", 8562 dialog_token, cur_tx_power); 8563 break; 8564 default: 8565 return -EINVAL; 8566 } 8567 break; 8568 default: 8569 /* nothing to fill */ 8570 return 0; 8571 } 8572 8573 return 0; 8574 } 8575 8576 static int ath12k_mac_mgmt_frame_fill_elem_data(struct ath12k_link_vif *arvif, 8577 struct sk_buff *skb) 8578 { 8579 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 8580 8581 if (!ieee80211_is_action(hdr->frame_control)) 8582 return 0; 8583 8584 return ath12k_mac_mgmt_action_frame_fill_elem_data(arvif, skb); 8585 } 8586 8587 static void ath12k_mgmt_over_wmi_tx_work(struct wiphy *wiphy, struct wiphy_work *work) 8588 { 8589 struct ath12k *ar = container_of(work, struct ath12k, wmi_mgmt_tx_work); 8590 struct ath12k_hw *ah = ar->ah; 8591 struct ath12k_skb_cb *skb_cb; 8592 struct ath12k_vif *ahvif; 8593 struct ath12k_link_vif *arvif; 8594 struct sk_buff *skb; 8595 int ret; 8596 8597 lockdep_assert_wiphy(wiphy); 8598 8599 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) { 8600 skb_cb = ATH12K_SKB_CB(skb); 8601 if (!skb_cb->vif) { 8602 ath12k_warn(ar->ab, "no vif found for mgmt frame\n"); 8603 ath12k_mgmt_over_wmi_tx_drop(ar, skb); 8604 continue; 8605 } 8606 8607 ahvif = ath12k_vif_to_ahvif(skb_cb->vif); 8608 if (!(ahvif->links_map & BIT(skb_cb->link_id))) { 8609 ath12k_warn(ar->ab, 8610 "invalid linkid %u in mgmt over wmi tx with linkmap 0x%x\n", 8611 skb_cb->link_id, ahvif->links_map); 8612 ath12k_mgmt_over_wmi_tx_drop(ar, skb); 8613 continue; 8614 } 8615 8616 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[skb_cb->link_id]); 8617 if (ar->allocated_vdev_map & (1LL << arvif->vdev_id)) { 8618 /* Fill in the data which is required to be filled by the driver 8619 * For example: Max Tx power in Link Measurement Request/Report 8620 */ 8621 ret = ath12k_mac_mgmt_frame_fill_elem_data(arvif, skb); 8622 if (ret) { 8623 /* If we couldn't fill the data due to any reason, 8624 * let's not discard transmitting the packet. 8625 * For example: Software crypto and PMF case 8626 */ 8627 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 8628 "Failed to fill the required data for the mgmt packet err %d\n", 8629 ret); 8630 } 8631 8632 ret = ath12k_mac_mgmt_tx_wmi(ar, arvif, skb); 8633 if (ret) { 8634 ath12k_warn(ar->ab, "failed to tx mgmt frame, vdev_id %d :%d\n", 8635 arvif->vdev_id, ret); 8636 ath12k_mgmt_over_wmi_tx_drop(ar, skb); 8637 } 8638 } else { 8639 ath12k_warn(ar->ab, 8640 "dropping mgmt frame for vdev %d link %u is_started %d\n", 8641 arvif->vdev_id, 8642 skb_cb->link_id, 8643 arvif->is_started); 8644 ath12k_mgmt_over_wmi_tx_drop(ar, skb); 8645 } 8646 } 8647 } 8648 8649 static int ath12k_mac_mgmt_tx(struct ath12k *ar, struct sk_buff *skb, 8650 bool is_prb_rsp) 8651 { 8652 struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue; 8653 8654 if (test_bit(ATH12K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags)) 8655 return -ESHUTDOWN; 8656 8657 /* Drop probe response packets when the pending management tx 8658 * count has reached a certain threshold, so as to prioritize 8659 * other mgmt packets like auth and assoc to be sent on time 8660 * for establishing successful connections. 8661 */ 8662 if (is_prb_rsp && 8663 atomic_read(&ar->num_pending_mgmt_tx) > ATH12K_PRB_RSP_DROP_THRESHOLD) { 8664 ath12k_warn(ar->ab, 8665 "dropping probe response as pending queue is almost full\n"); 8666 return -ENOSPC; 8667 } 8668 8669 if (skb_queue_len_lockless(q) >= ATH12K_TX_MGMT_NUM_PENDING_MAX) { 8670 ath12k_warn(ar->ab, "mgmt tx queue is full\n"); 8671 return -ENOSPC; 8672 } 8673 8674 skb_queue_tail(q, skb); 8675 atomic_inc(&ar->num_pending_mgmt_tx); 8676 wiphy_work_queue(ath12k_ar_to_hw(ar)->wiphy, &ar->wmi_mgmt_tx_work); 8677 8678 return 0; 8679 } 8680 8681 static void ath12k_mac_add_p2p_noa_ie(struct ath12k *ar, 8682 struct ieee80211_vif *vif, 8683 struct sk_buff *skb, 8684 bool is_prb_rsp) 8685 { 8686 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 8687 8688 if (likely(!is_prb_rsp)) 8689 return; 8690 8691 spin_lock_bh(&ar->data_lock); 8692 8693 if (ahvif->u.ap.noa_data && 8694 !pskb_expand_head(skb, 0, ahvif->u.ap.noa_len, 8695 GFP_ATOMIC)) 8696 skb_put_data(skb, ahvif->u.ap.noa_data, 8697 ahvif->u.ap.noa_len); 8698 8699 spin_unlock_bh(&ar->data_lock); 8700 } 8701 8702 /* Note: called under rcu_read_lock() */ 8703 static void ath12k_mlo_mcast_update_tx_link_address(struct ieee80211_vif *vif, 8704 u8 link_id, struct sk_buff *skb, 8705 u32 info_flags) 8706 { 8707 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 8708 struct ieee80211_bss_conf *bss_conf; 8709 8710 if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP) 8711 return; 8712 8713 bss_conf = rcu_dereference(vif->link_conf[link_id]); 8714 if (bss_conf) 8715 ether_addr_copy(hdr->addr2, bss_conf->addr); 8716 } 8717 8718 /* Note: called under rcu_read_lock() */ 8719 static u8 ath12k_mac_get_tx_link(struct ieee80211_sta *sta, struct ieee80211_vif *vif, 8720 u8 link, struct sk_buff *skb, u32 info_flags) 8721 { 8722 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 8723 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 8724 struct ieee80211_link_sta *link_sta; 8725 struct ieee80211_bss_conf *bss_conf; 8726 struct ath12k_sta *ahsta; 8727 8728 /* Use the link id passed or the default vif link */ 8729 if (!sta) { 8730 if (link != IEEE80211_LINK_UNSPECIFIED) 8731 return link; 8732 8733 return ahvif->deflink.link_id; 8734 } 8735 8736 ahsta = ath12k_sta_to_ahsta(sta); 8737 8738 /* Below translation ensures we pass proper A2 & A3 for non ML clients. 8739 * Also it assumes for now support only for MLO AP in this path 8740 */ 8741 if (!sta->mlo) { 8742 link = ahsta->deflink.link_id; 8743 8744 if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP) 8745 return link; 8746 8747 bss_conf = rcu_dereference(vif->link_conf[link]); 8748 if (bss_conf) { 8749 ether_addr_copy(hdr->addr2, bss_conf->addr); 8750 if (!ieee80211_has_tods(hdr->frame_control) && 8751 !ieee80211_has_fromds(hdr->frame_control)) 8752 ether_addr_copy(hdr->addr3, bss_conf->addr); 8753 } 8754 8755 return link; 8756 } 8757 8758 /* enqueue eth enacap & data frames on primary link, FW does link 8759 * selection and address translation. 8760 */ 8761 if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP || 8762 ieee80211_is_data(hdr->frame_control)) 8763 return ahsta->assoc_link_id; 8764 8765 /* 802.11 frame cases */ 8766 if (link == IEEE80211_LINK_UNSPECIFIED) 8767 link = ahsta->deflink.link_id; 8768 8769 if (!ieee80211_is_mgmt(hdr->frame_control)) 8770 return link; 8771 8772 /* Perform address conversion for ML STA Tx */ 8773 bss_conf = rcu_dereference(vif->link_conf[link]); 8774 link_sta = rcu_dereference(sta->link[link]); 8775 8776 if (bss_conf && link_sta) { 8777 ether_addr_copy(hdr->addr1, link_sta->addr); 8778 ether_addr_copy(hdr->addr2, bss_conf->addr); 8779 8780 if (vif->type == NL80211_IFTYPE_STATION && bss_conf->bssid) 8781 ether_addr_copy(hdr->addr3, bss_conf->bssid); 8782 else if (vif->type == NL80211_IFTYPE_AP) 8783 ether_addr_copy(hdr->addr3, bss_conf->addr); 8784 8785 return link; 8786 } 8787 8788 if (bss_conf) { 8789 /* In certain cases where a ML sta associated and added subset of 8790 * links on which the ML AP is active, but now sends some frame 8791 * (ex. Probe request) on a different link which is active in our 8792 * MLD but was not added during previous association, we can 8793 * still honor the Tx to that ML STA via the requested link. 8794 * The control would reach here in such case only when that link 8795 * address is same as the MLD address or in worst case clients 8796 * used MLD address at TA wrongly which would have helped 8797 * identify the ML sta object and pass it here. 8798 * If the link address of that STA is different from MLD address, 8799 * then the sta object would be NULL and control won't reach 8800 * here but return at the start of the function itself with !sta 8801 * check. Also this would not need any translation at hdr->addr1 8802 * from MLD to link address since the RA is the MLD address 8803 * (same as that link address ideally) already. 8804 */ 8805 ether_addr_copy(hdr->addr2, bss_conf->addr); 8806 8807 if (vif->type == NL80211_IFTYPE_STATION && bss_conf->bssid) 8808 ether_addr_copy(hdr->addr3, bss_conf->bssid); 8809 else if (vif->type == NL80211_IFTYPE_AP) 8810 ether_addr_copy(hdr->addr3, bss_conf->addr); 8811 } 8812 8813 return link; 8814 } 8815 8816 /* Note: called under rcu_read_lock() */ 8817 static void ath12k_mac_op_tx(struct ieee80211_hw *hw, 8818 struct ieee80211_tx_control *control, 8819 struct sk_buff *skb) 8820 { 8821 struct ath12k_skb_cb *skb_cb = ATH12K_SKB_CB(skb); 8822 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 8823 struct ieee80211_vif *vif = info->control.vif; 8824 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 8825 struct ath12k_link_vif *arvif = &ahvif->deflink; 8826 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 8827 struct ieee80211_key_conf *key = info->control.hw_key; 8828 struct ieee80211_sta *sta = control->sta; 8829 struct ath12k_link_vif *tmp_arvif; 8830 u32 info_flags = info->flags; 8831 struct sk_buff *msdu_copied; 8832 struct ath12k *ar, *tmp_ar; 8833 struct ath12k_peer *peer; 8834 unsigned long links_map; 8835 bool is_mcast = false; 8836 bool is_dvlan = false; 8837 struct ethhdr *eth; 8838 bool is_prb_rsp; 8839 u16 mcbc_gsn; 8840 u8 link_id; 8841 int ret; 8842 8843 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { 8844 ieee80211_free_txskb(hw, skb); 8845 return; 8846 } 8847 8848 link_id = u32_get_bits(info->control.flags, IEEE80211_TX_CTRL_MLO_LINK); 8849 memset(skb_cb, 0, sizeof(*skb_cb)); 8850 skb_cb->vif = vif; 8851 8852 if (key) { 8853 skb_cb->cipher = key->cipher; 8854 skb_cb->flags |= ATH12K_SKB_CIPHER_SET; 8855 } 8856 8857 /* handle only for MLO case, use deflink for non MLO case */ 8858 if (ieee80211_vif_is_mld(vif)) { 8859 link_id = ath12k_mac_get_tx_link(sta, vif, link_id, skb, info_flags); 8860 if (link_id >= IEEE80211_MLD_MAX_NUM_LINKS) { 8861 ieee80211_free_txskb(hw, skb); 8862 return; 8863 } 8864 } else { 8865 link_id = 0; 8866 } 8867 8868 arvif = rcu_dereference(ahvif->link[link_id]); 8869 if (!arvif || !arvif->ar) { 8870 ath12k_warn(ahvif->ah, "failed to find arvif link id %u for frame transmission", 8871 link_id); 8872 ieee80211_free_txskb(hw, skb); 8873 return; 8874 } 8875 8876 ar = arvif->ar; 8877 skb_cb->link_id = link_id; 8878 is_prb_rsp = ieee80211_is_probe_resp(hdr->frame_control); 8879 8880 if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP) { 8881 eth = (struct ethhdr *)skb->data; 8882 is_mcast = is_multicast_ether_addr(eth->h_dest); 8883 8884 skb_cb->flags |= ATH12K_SKB_HW_80211_ENCAP; 8885 } else if (ieee80211_is_mgmt(hdr->frame_control)) { 8886 if (sta && sta->mlo) 8887 skb_cb->flags |= ATH12K_SKB_MLO_STA; 8888 8889 ret = ath12k_mac_mgmt_tx(ar, skb, is_prb_rsp); 8890 if (ret) { 8891 ath12k_warn(ar->ab, "failed to queue management frame %d\n", 8892 ret); 8893 ieee80211_free_txskb(hw, skb); 8894 } 8895 return; 8896 } 8897 8898 if (!(info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) 8899 is_mcast = is_multicast_ether_addr(hdr->addr1); 8900 8901 /* This is case only for P2P_GO */ 8902 if (vif->type == NL80211_IFTYPE_AP && vif->p2p) 8903 ath12k_mac_add_p2p_noa_ie(ar, vif, skb, is_prb_rsp); 8904 8905 /* Checking if it is a DVLAN frame */ 8906 if (!test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags) && 8907 !(skb_cb->flags & ATH12K_SKB_HW_80211_ENCAP) && 8908 !(skb_cb->flags & ATH12K_SKB_CIPHER_SET) && 8909 ieee80211_has_protected(hdr->frame_control)) 8910 is_dvlan = true; 8911 8912 if (!vif->valid_links || !is_mcast || is_dvlan || 8913 (skb_cb->flags & ATH12K_SKB_HW_80211_ENCAP) || 8914 test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags)) { 8915 ret = ath12k_dp_tx(ar, arvif, skb, false, 0, is_mcast); 8916 if (unlikely(ret)) { 8917 ath12k_warn(ar->ab, "failed to transmit frame %d\n", ret); 8918 ieee80211_free_txskb(ar->ah->hw, skb); 8919 return; 8920 } 8921 } else { 8922 mcbc_gsn = atomic_inc_return(&ahvif->mcbc_gsn) & 0xfff; 8923 8924 links_map = ahvif->links_map; 8925 for_each_set_bit(link_id, &links_map, 8926 IEEE80211_MLD_MAX_NUM_LINKS) { 8927 tmp_arvif = rcu_dereference(ahvif->link[link_id]); 8928 if (!tmp_arvif || !tmp_arvif->is_up) 8929 continue; 8930 8931 tmp_ar = tmp_arvif->ar; 8932 msdu_copied = skb_copy(skb, GFP_ATOMIC); 8933 if (!msdu_copied) { 8934 ath12k_err(ar->ab, 8935 "skb copy failure link_id 0x%X vdevid 0x%X\n", 8936 link_id, tmp_arvif->vdev_id); 8937 continue; 8938 } 8939 8940 ath12k_mlo_mcast_update_tx_link_address(vif, link_id, 8941 msdu_copied, 8942 info_flags); 8943 8944 skb_cb = ATH12K_SKB_CB(msdu_copied); 8945 skb_cb->link_id = link_id; 8946 8947 /* For open mode, skip peer find logic */ 8948 if (unlikely(!ahvif->key_cipher)) 8949 goto skip_peer_find; 8950 8951 spin_lock_bh(&tmp_ar->ab->base_lock); 8952 peer = ath12k_peer_find_by_addr(tmp_ar->ab, tmp_arvif->bssid); 8953 if (!peer) { 8954 spin_unlock_bh(&tmp_ar->ab->base_lock); 8955 ath12k_warn(tmp_ar->ab, 8956 "failed to find peer for vdev_id 0x%X addr %pM link_map 0x%X\n", 8957 tmp_arvif->vdev_id, tmp_arvif->bssid, 8958 ahvif->links_map); 8959 dev_kfree_skb_any(msdu_copied); 8960 continue; 8961 } 8962 8963 key = peer->keys[peer->mcast_keyidx]; 8964 if (key) { 8965 skb_cb->cipher = key->cipher; 8966 skb_cb->flags |= ATH12K_SKB_CIPHER_SET; 8967 8968 hdr = (struct ieee80211_hdr *)msdu_copied->data; 8969 if (!ieee80211_has_protected(hdr->frame_control)) 8970 hdr->frame_control |= 8971 cpu_to_le16(IEEE80211_FCTL_PROTECTED); 8972 } 8973 spin_unlock_bh(&tmp_ar->ab->base_lock); 8974 8975 skip_peer_find: 8976 ret = ath12k_dp_tx(tmp_ar, tmp_arvif, 8977 msdu_copied, true, mcbc_gsn, is_mcast); 8978 if (unlikely(ret)) { 8979 if (ret == -ENOMEM) { 8980 /* Drops are expected during heavy multicast 8981 * frame flood. Print with debug log 8982 * level to avoid lot of console prints 8983 */ 8984 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 8985 "failed to transmit frame %d\n", 8986 ret); 8987 } else { 8988 ath12k_warn(ar->ab, 8989 "failed to transmit frame %d\n", 8990 ret); 8991 } 8992 8993 dev_kfree_skb_any(msdu_copied); 8994 } 8995 } 8996 ieee80211_free_txskb(ar->ah->hw, skb); 8997 } 8998 } 8999 9000 void ath12k_mac_drain_tx(struct ath12k *ar) 9001 { 9002 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 9003 9004 /* make sure rcu-protected mac80211 tx path itself is drained */ 9005 synchronize_net(); 9006 9007 wiphy_work_cancel(ath12k_ar_to_hw(ar)->wiphy, &ar->wmi_mgmt_tx_work); 9008 ath12k_mgmt_over_wmi_tx_purge(ar); 9009 } 9010 9011 static int ath12k_mac_config_mon_status_default(struct ath12k *ar, bool enable) 9012 { 9013 struct htt_rx_ring_tlv_filter tlv_filter = {}; 9014 struct ath12k_base *ab = ar->ab; 9015 u32 ring_id, i; 9016 int ret = 0; 9017 9018 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 9019 9020 if (!ab->hw_params->rxdma1_enable) 9021 return ret; 9022 9023 if (enable) { 9024 tlv_filter = ath12k_mac_mon_status_filter_default; 9025 9026 if (ath12k_debugfs_rx_filter(ar)) 9027 tlv_filter.rx_filter = ath12k_debugfs_rx_filter(ar); 9028 } else { 9029 tlv_filter.rxmon_disable = true; 9030 } 9031 9032 for (i = 0; i < ab->hw_params->num_rxdma_per_pdev; i++) { 9033 ring_id = ar->dp.rxdma_mon_dst_ring[i].ring_id; 9034 ret = ath12k_dp_tx_htt_rx_filter_setup(ab, ring_id, 9035 ar->dp.mac_id + i, 9036 HAL_RXDMA_MONITOR_DST, 9037 DP_RXDMA_REFILL_RING_SIZE, 9038 &tlv_filter); 9039 if (ret) { 9040 ath12k_err(ab, 9041 "failed to setup filter for monitor buf %d\n", 9042 ret); 9043 } 9044 } 9045 9046 return ret; 9047 } 9048 9049 static int ath12k_mac_start(struct ath12k *ar) 9050 { 9051 struct ath12k_hw *ah = ar->ah; 9052 struct ath12k_base *ab = ar->ab; 9053 struct ath12k_pdev *pdev = ar->pdev; 9054 int ret; 9055 9056 lockdep_assert_held(&ah->hw_mutex); 9057 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 9058 9059 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_PMF_QOS, 9060 1, pdev->pdev_id); 9061 9062 if (ret) { 9063 ath12k_err(ab, "failed to enable PMF QOS: %d\n", ret); 9064 goto err; 9065 } 9066 9067 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_DYNAMIC_BW, 1, 9068 pdev->pdev_id); 9069 if (ret) { 9070 ath12k_err(ab, "failed to enable dynamic bw: %d\n", ret); 9071 goto err; 9072 } 9073 9074 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_ARP_AC_OVERRIDE, 9075 0, pdev->pdev_id); 9076 if (ret) { 9077 ath12k_err(ab, "failed to set ac override for ARP: %d\n", 9078 ret); 9079 goto err; 9080 } 9081 9082 ret = ath12k_wmi_send_dfs_phyerr_offload_enable_cmd(ar, pdev->pdev_id); 9083 if (ret) { 9084 ath12k_err(ab, "failed to offload radar detection: %d\n", 9085 ret); 9086 goto err; 9087 } 9088 9089 ret = ath12k_dp_tx_htt_h2t_ppdu_stats_req(ar, 9090 HTT_PPDU_STATS_TAG_DEFAULT); 9091 if (ret) { 9092 ath12k_err(ab, "failed to req ppdu stats: %d\n", ret); 9093 goto err; 9094 } 9095 9096 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_MESH_MCAST_ENABLE, 9097 1, pdev->pdev_id); 9098 9099 if (ret) { 9100 ath12k_err(ab, "failed to enable MESH MCAST ENABLE: (%d\n", ret); 9101 goto err; 9102 } 9103 9104 __ath12k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask); 9105 9106 /* TODO: Do we need to enable ANI? */ 9107 9108 ret = ath12k_reg_update_chan_list(ar, false); 9109 9110 /* The ar state alone can be turned off for non supported country 9111 * without returning the error value. As we need to update the channel 9112 * for the next ar. 9113 */ 9114 if (ret) { 9115 if (ret == -EINVAL) 9116 ret = 0; 9117 goto err; 9118 } 9119 9120 ar->num_started_vdevs = 0; 9121 ar->num_created_vdevs = 0; 9122 ar->num_peers = 0; 9123 ar->allocated_vdev_map = 0; 9124 ar->chan_tx_pwr = ATH12K_PDEV_TX_POWER_INVALID; 9125 9126 /* Configure monitor status ring with default rx_filter to get rx status 9127 * such as rssi, rx_duration. 9128 */ 9129 ret = ath12k_mac_config_mon_status_default(ar, true); 9130 if (ret && (ret != -EOPNOTSUPP)) { 9131 ath12k_err(ab, "failed to configure monitor status ring with default rx_filter: (%d)\n", 9132 ret); 9133 goto err; 9134 } 9135 9136 if (ret == -EOPNOTSUPP) 9137 ath12k_dbg(ab, ATH12K_DBG_MAC, 9138 "monitor status config is not yet supported"); 9139 9140 /* Configure the hash seed for hash based reo dest ring selection */ 9141 ath12k_wmi_pdev_lro_cfg(ar, ar->pdev->pdev_id); 9142 9143 /* allow device to enter IMPS */ 9144 if (ab->hw_params->idle_ps) { 9145 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_IDLE_PS_CONFIG, 9146 1, pdev->pdev_id); 9147 if (ret) { 9148 ath12k_err(ab, "failed to enable idle ps: %d\n", ret); 9149 goto err; 9150 } 9151 } 9152 9153 rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx], 9154 &ab->pdevs[ar->pdev_idx]); 9155 9156 return 0; 9157 err: 9158 9159 return ret; 9160 } 9161 9162 static void ath12k_drain_tx(struct ath12k_hw *ah) 9163 { 9164 struct ath12k *ar; 9165 int i; 9166 9167 lockdep_assert_wiphy(ah->hw->wiphy); 9168 9169 for_each_ar(ah, ar, i) 9170 ath12k_mac_drain_tx(ar); 9171 } 9172 9173 static int ath12k_mac_op_start(struct ieee80211_hw *hw) 9174 { 9175 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 9176 struct ath12k *ar; 9177 int ret, i; 9178 9179 if (ath12k_ftm_mode) 9180 return -EPERM; 9181 9182 lockdep_assert_wiphy(hw->wiphy); 9183 9184 ath12k_drain_tx(ah); 9185 9186 guard(mutex)(&ah->hw_mutex); 9187 9188 switch (ah->state) { 9189 case ATH12K_HW_STATE_OFF: 9190 ah->state = ATH12K_HW_STATE_ON; 9191 break; 9192 case ATH12K_HW_STATE_RESTARTING: 9193 ah->state = ATH12K_HW_STATE_RESTARTED; 9194 break; 9195 case ATH12K_HW_STATE_RESTARTED: 9196 case ATH12K_HW_STATE_WEDGED: 9197 case ATH12K_HW_STATE_ON: 9198 case ATH12K_HW_STATE_TM: 9199 ah->state = ATH12K_HW_STATE_OFF; 9200 9201 WARN_ON(1); 9202 return -EINVAL; 9203 } 9204 9205 for_each_ar(ah, ar, i) { 9206 ret = ath12k_mac_start(ar); 9207 if (ret) { 9208 ah->state = ATH12K_HW_STATE_OFF; 9209 9210 ath12k_err(ar->ab, "fail to start mac operations in pdev idx %d ret %d\n", 9211 ar->pdev_idx, ret); 9212 goto fail_start; 9213 } 9214 } 9215 9216 return 0; 9217 9218 fail_start: 9219 for (; i > 0; i--) { 9220 ar = ath12k_ah_to_ar(ah, i - 1); 9221 ath12k_mac_stop(ar); 9222 } 9223 9224 return ret; 9225 } 9226 9227 int ath12k_mac_rfkill_config(struct ath12k *ar) 9228 { 9229 struct ath12k_base *ab = ar->ab; 9230 u32 param; 9231 int ret; 9232 9233 if (ab->hw_params->rfkill_pin == 0) 9234 return -EOPNOTSUPP; 9235 9236 ath12k_dbg(ab, ATH12K_DBG_MAC, 9237 "mac rfkill_pin %d rfkill_cfg %d rfkill_on_level %d", 9238 ab->hw_params->rfkill_pin, ab->hw_params->rfkill_cfg, 9239 ab->hw_params->rfkill_on_level); 9240 9241 param = u32_encode_bits(ab->hw_params->rfkill_on_level, 9242 WMI_RFKILL_CFG_RADIO_LEVEL) | 9243 u32_encode_bits(ab->hw_params->rfkill_pin, 9244 WMI_RFKILL_CFG_GPIO_PIN_NUM) | 9245 u32_encode_bits(ab->hw_params->rfkill_cfg, 9246 WMI_RFKILL_CFG_PIN_AS_GPIO); 9247 9248 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_HW_RFKILL_CONFIG, 9249 param, ar->pdev->pdev_id); 9250 if (ret) { 9251 ath12k_warn(ab, 9252 "failed to set rfkill config 0x%x: %d\n", 9253 param, ret); 9254 return ret; 9255 } 9256 9257 return 0; 9258 } 9259 9260 int ath12k_mac_rfkill_enable_radio(struct ath12k *ar, bool enable) 9261 { 9262 enum wmi_rfkill_enable_radio param; 9263 int ret; 9264 9265 if (enable) 9266 param = WMI_RFKILL_ENABLE_RADIO_ON; 9267 else 9268 param = WMI_RFKILL_ENABLE_RADIO_OFF; 9269 9270 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac %d rfkill enable %d", 9271 ar->pdev_idx, param); 9272 9273 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RFKILL_ENABLE, 9274 param, ar->pdev->pdev_id); 9275 if (ret) { 9276 ath12k_warn(ar->ab, "failed to set rfkill enable param %d: %d\n", 9277 param, ret); 9278 return ret; 9279 } 9280 9281 return 0; 9282 } 9283 9284 static void ath12k_mac_stop(struct ath12k *ar) 9285 { 9286 struct ath12k_hw *ah = ar->ah; 9287 struct htt_ppdu_stats_info *ppdu_stats, *tmp; 9288 struct ath12k_wmi_scan_chan_list_arg *arg; 9289 int ret; 9290 9291 lockdep_assert_held(&ah->hw_mutex); 9292 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 9293 9294 ret = ath12k_mac_config_mon_status_default(ar, false); 9295 if (ret && (ret != -EOPNOTSUPP)) 9296 ath12k_err(ar->ab, "failed to clear rx_filter for monitor status ring: (%d)\n", 9297 ret); 9298 9299 clear_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags); 9300 9301 cancel_delayed_work_sync(&ar->scan.timeout); 9302 wiphy_work_cancel(ath12k_ar_to_hw(ar)->wiphy, &ar->scan.vdev_clean_wk); 9303 cancel_work_sync(&ar->regd_channel_update_work); 9304 cancel_work_sync(&ar->regd_update_work); 9305 cancel_work_sync(&ar->ab->rfkill_work); 9306 cancel_work_sync(&ar->ab->update_11d_work); 9307 ar->state_11d = ATH12K_11D_IDLE; 9308 complete(&ar->completed_11d_scan); 9309 9310 spin_lock_bh(&ar->data_lock); 9311 9312 list_for_each_entry_safe(ppdu_stats, tmp, &ar->ppdu_stats_info, list) { 9313 list_del(&ppdu_stats->list); 9314 kfree(ppdu_stats); 9315 } 9316 9317 while ((arg = list_first_entry_or_null(&ar->regd_channel_update_queue, 9318 struct ath12k_wmi_scan_chan_list_arg, 9319 list))) { 9320 list_del(&arg->list); 9321 kfree(arg); 9322 } 9323 spin_unlock_bh(&ar->data_lock); 9324 9325 rcu_assign_pointer(ar->ab->pdevs_active[ar->pdev_idx], NULL); 9326 9327 synchronize_rcu(); 9328 9329 atomic_set(&ar->num_pending_mgmt_tx, 0); 9330 } 9331 9332 static void ath12k_mac_op_stop(struct ieee80211_hw *hw, bool suspend) 9333 { 9334 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 9335 struct ath12k *ar; 9336 int i; 9337 9338 lockdep_assert_wiphy(hw->wiphy); 9339 9340 ath12k_drain_tx(ah); 9341 9342 mutex_lock(&ah->hw_mutex); 9343 9344 ah->state = ATH12K_HW_STATE_OFF; 9345 9346 for_each_ar(ah, ar, i) 9347 ath12k_mac_stop(ar); 9348 9349 mutex_unlock(&ah->hw_mutex); 9350 } 9351 9352 static u8 9353 ath12k_mac_get_vdev_stats_id(struct ath12k_link_vif *arvif) 9354 { 9355 struct ath12k_base *ab = arvif->ar->ab; 9356 u8 vdev_stats_id = 0; 9357 9358 do { 9359 if (ab->free_vdev_stats_id_map & (1LL << vdev_stats_id)) { 9360 vdev_stats_id++; 9361 if (vdev_stats_id >= ATH12K_MAX_VDEV_STATS_ID) { 9362 vdev_stats_id = ATH12K_INVAL_VDEV_STATS_ID; 9363 break; 9364 } 9365 } else { 9366 ab->free_vdev_stats_id_map |= (1LL << vdev_stats_id); 9367 break; 9368 } 9369 } while (vdev_stats_id); 9370 9371 arvif->vdev_stats_id = vdev_stats_id; 9372 return vdev_stats_id; 9373 } 9374 9375 static int ath12k_mac_setup_vdev_params_mbssid(struct ath12k_link_vif *arvif, 9376 u32 *flags, u32 *tx_vdev_id) 9377 { 9378 struct ath12k_vif *ahvif = arvif->ahvif; 9379 struct ieee80211_bss_conf *link_conf; 9380 struct ath12k *ar = arvif->ar; 9381 struct ath12k_link_vif *tx_arvif; 9382 9383 link_conf = ath12k_mac_get_link_bss_conf(arvif); 9384 if (!link_conf) { 9385 ath12k_warn(ar->ab, "unable to access bss link conf in set mbssid params for vif %pM link %u\n", 9386 ahvif->vif->addr, arvif->link_id); 9387 return -ENOLINK; 9388 } 9389 9390 tx_arvif = ath12k_mac_get_tx_arvif(arvif, link_conf); 9391 if (!tx_arvif) 9392 return 0; 9393 9394 if (link_conf->nontransmitted) { 9395 if (ath12k_ar_to_hw(ar)->wiphy != 9396 ath12k_ar_to_hw(tx_arvif->ar)->wiphy) 9397 return -EINVAL; 9398 9399 *flags = WMI_VDEV_MBSSID_FLAGS_NON_TRANSMIT_AP; 9400 *tx_vdev_id = tx_arvif->vdev_id; 9401 } else if (tx_arvif == arvif) { 9402 *flags = WMI_VDEV_MBSSID_FLAGS_TRANSMIT_AP; 9403 } else { 9404 return -EINVAL; 9405 } 9406 9407 if (link_conf->ema_ap) 9408 *flags |= WMI_VDEV_MBSSID_FLAGS_EMA_MODE; 9409 9410 return 0; 9411 } 9412 9413 static int ath12k_mac_setup_vdev_create_arg(struct ath12k_link_vif *arvif, 9414 struct ath12k_wmi_vdev_create_arg *arg) 9415 { 9416 struct ath12k *ar = arvif->ar; 9417 struct ath12k_pdev *pdev = ar->pdev; 9418 struct ath12k_vif *ahvif = arvif->ahvif; 9419 int ret; 9420 9421 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 9422 9423 arg->if_id = arvif->vdev_id; 9424 arg->type = ahvif->vdev_type; 9425 arg->subtype = ahvif->vdev_subtype; 9426 arg->pdev_id = pdev->pdev_id; 9427 9428 arg->mbssid_flags = WMI_VDEV_MBSSID_FLAGS_NON_MBSSID_AP; 9429 arg->mbssid_tx_vdev_id = 0; 9430 if (!test_bit(WMI_TLV_SERVICE_MBSS_PARAM_IN_VDEV_START_SUPPORT, 9431 ar->ab->wmi_ab.svc_map)) { 9432 ret = ath12k_mac_setup_vdev_params_mbssid(arvif, 9433 &arg->mbssid_flags, 9434 &arg->mbssid_tx_vdev_id); 9435 if (ret) 9436 return ret; 9437 } 9438 9439 if (pdev->cap.supported_bands & WMI_HOST_WLAN_2GHZ_CAP) { 9440 arg->chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains; 9441 arg->chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains; 9442 } 9443 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5GHZ_CAP) { 9444 arg->chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains; 9445 arg->chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains; 9446 } 9447 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5GHZ_CAP && 9448 ar->supports_6ghz) { 9449 arg->chains[NL80211_BAND_6GHZ].tx = ar->num_tx_chains; 9450 arg->chains[NL80211_BAND_6GHZ].rx = ar->num_rx_chains; 9451 } 9452 9453 arg->if_stats_id = ath12k_mac_get_vdev_stats_id(arvif); 9454 9455 if (ath12k_mac_is_ml_arvif(arvif)) { 9456 if (hweight16(ahvif->vif->valid_links) > ATH12K_WMI_MLO_MAX_LINKS) { 9457 ath12k_warn(ar->ab, "too many MLO links during setting up vdev: %d", 9458 ahvif->vif->valid_links); 9459 return -EINVAL; 9460 } 9461 9462 ether_addr_copy(arg->mld_addr, ahvif->vif->addr); 9463 } 9464 9465 return 0; 9466 } 9467 9468 static void ath12k_mac_update_vif_offload(struct ath12k_link_vif *arvif) 9469 { 9470 struct ath12k_vif *ahvif = arvif->ahvif; 9471 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif); 9472 struct ath12k *ar = arvif->ar; 9473 struct ath12k_base *ab = ar->ab; 9474 u32 param_id, param_value; 9475 int ret; 9476 9477 param_id = WMI_VDEV_PARAM_TX_ENCAP_TYPE; 9478 if (vif->type != NL80211_IFTYPE_STATION && 9479 vif->type != NL80211_IFTYPE_AP) 9480 vif->offload_flags &= ~(IEEE80211_OFFLOAD_ENCAP_ENABLED | 9481 IEEE80211_OFFLOAD_DECAP_ENABLED); 9482 9483 if (vif->offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED) 9484 ahvif->tx_encap_type = ATH12K_HW_TXRX_ETHERNET; 9485 else if (test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags)) 9486 ahvif->tx_encap_type = ATH12K_HW_TXRX_RAW; 9487 else 9488 ahvif->tx_encap_type = ATH12K_HW_TXRX_NATIVE_WIFI; 9489 9490 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 9491 param_id, ahvif->tx_encap_type); 9492 if (ret) { 9493 ath12k_warn(ab, "failed to set vdev %d tx encap mode: %d\n", 9494 arvif->vdev_id, ret); 9495 vif->offload_flags &= ~IEEE80211_OFFLOAD_ENCAP_ENABLED; 9496 } 9497 9498 param_id = WMI_VDEV_PARAM_RX_DECAP_TYPE; 9499 if (vif->offload_flags & IEEE80211_OFFLOAD_DECAP_ENABLED) 9500 param_value = ATH12K_HW_TXRX_ETHERNET; 9501 else if (test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags)) 9502 param_value = ATH12K_HW_TXRX_RAW; 9503 else 9504 param_value = ATH12K_HW_TXRX_NATIVE_WIFI; 9505 9506 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 9507 param_id, param_value); 9508 if (ret) { 9509 ath12k_warn(ab, "failed to set vdev %d rx decap mode: %d\n", 9510 arvif->vdev_id, ret); 9511 vif->offload_flags &= ~IEEE80211_OFFLOAD_DECAP_ENABLED; 9512 } 9513 } 9514 9515 static void ath12k_mac_op_update_vif_offload(struct ieee80211_hw *hw, 9516 struct ieee80211_vif *vif) 9517 { 9518 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 9519 struct ath12k_link_vif *arvif; 9520 unsigned long links; 9521 int link_id; 9522 9523 lockdep_assert_wiphy(hw->wiphy); 9524 9525 if (vif->valid_links) { 9526 links = vif->valid_links; 9527 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) { 9528 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 9529 if (!(arvif && arvif->ar)) 9530 continue; 9531 9532 ath12k_mac_update_vif_offload(arvif); 9533 } 9534 9535 return; 9536 } 9537 9538 ath12k_mac_update_vif_offload(&ahvif->deflink); 9539 } 9540 9541 static bool ath12k_mac_vif_ap_active_any(struct ath12k_base *ab) 9542 { 9543 struct ath12k *ar; 9544 struct ath12k_pdev *pdev; 9545 struct ath12k_link_vif *arvif; 9546 int i; 9547 9548 for (i = 0; i < ab->num_radios; i++) { 9549 pdev = &ab->pdevs[i]; 9550 ar = pdev->ar; 9551 list_for_each_entry(arvif, &ar->arvifs, list) { 9552 if (arvif->is_up && 9553 arvif->ahvif->vdev_type == WMI_VDEV_TYPE_AP) 9554 return true; 9555 } 9556 } 9557 return false; 9558 } 9559 9560 void ath12k_mac_11d_scan_start(struct ath12k *ar, u32 vdev_id) 9561 { 9562 struct wmi_11d_scan_start_arg arg; 9563 int ret; 9564 9565 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 9566 9567 if (ar->regdom_set_by_user) 9568 goto fin; 9569 9570 if (ar->vdev_id_11d_scan != ATH12K_11D_INVALID_VDEV_ID) 9571 goto fin; 9572 9573 if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map)) 9574 goto fin; 9575 9576 if (ath12k_mac_vif_ap_active_any(ar->ab)) 9577 goto fin; 9578 9579 arg.vdev_id = vdev_id; 9580 arg.start_interval_msec = 0; 9581 arg.scan_period_msec = ATH12K_SCAN_11D_INTERVAL; 9582 9583 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 9584 "mac start 11d scan for vdev %d\n", vdev_id); 9585 9586 ret = ath12k_wmi_send_11d_scan_start_cmd(ar, &arg); 9587 if (ret) { 9588 ath12k_warn(ar->ab, "failed to start 11d scan vdev %d ret: %d\n", 9589 vdev_id, ret); 9590 } else { 9591 ar->vdev_id_11d_scan = vdev_id; 9592 if (ar->state_11d == ATH12K_11D_PREPARING) 9593 ar->state_11d = ATH12K_11D_RUNNING; 9594 } 9595 9596 fin: 9597 if (ar->state_11d == ATH12K_11D_PREPARING) { 9598 ar->state_11d = ATH12K_11D_IDLE; 9599 complete(&ar->completed_11d_scan); 9600 } 9601 } 9602 9603 void ath12k_mac_11d_scan_stop(struct ath12k *ar) 9604 { 9605 int ret; 9606 u32 vdev_id; 9607 9608 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 9609 9610 if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map)) 9611 return; 9612 9613 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac stop 11d for vdev %d\n", 9614 ar->vdev_id_11d_scan); 9615 9616 if (ar->state_11d == ATH12K_11D_PREPARING) { 9617 ar->state_11d = ATH12K_11D_IDLE; 9618 complete(&ar->completed_11d_scan); 9619 } 9620 9621 if (ar->vdev_id_11d_scan != ATH12K_11D_INVALID_VDEV_ID) { 9622 vdev_id = ar->vdev_id_11d_scan; 9623 9624 ret = ath12k_wmi_send_11d_scan_stop_cmd(ar, vdev_id); 9625 if (ret) { 9626 ath12k_warn(ar->ab, 9627 "failed to stopt 11d scan vdev %d ret: %d\n", 9628 vdev_id, ret); 9629 } else { 9630 ar->vdev_id_11d_scan = ATH12K_11D_INVALID_VDEV_ID; 9631 ar->state_11d = ATH12K_11D_IDLE; 9632 complete(&ar->completed_11d_scan); 9633 } 9634 } 9635 } 9636 9637 void ath12k_mac_11d_scan_stop_all(struct ath12k_base *ab) 9638 { 9639 struct ath12k *ar; 9640 struct ath12k_pdev *pdev; 9641 int i; 9642 9643 ath12k_dbg(ab, ATH12K_DBG_MAC, "mac stop soc 11d scan\n"); 9644 9645 for (i = 0; i < ab->num_radios; i++) { 9646 pdev = &ab->pdevs[i]; 9647 ar = pdev->ar; 9648 9649 ath12k_mac_11d_scan_stop(ar); 9650 } 9651 } 9652 9653 static void ath12k_mac_determine_vdev_type(struct ieee80211_vif *vif, 9654 struct ath12k_vif *ahvif) 9655 { 9656 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE; 9657 9658 switch (vif->type) { 9659 case NL80211_IFTYPE_UNSPECIFIED: 9660 case NL80211_IFTYPE_STATION: 9661 ahvif->vdev_type = WMI_VDEV_TYPE_STA; 9662 9663 if (vif->p2p) 9664 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_CLIENT; 9665 9666 break; 9667 case NL80211_IFTYPE_MESH_POINT: 9668 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_MESH_11S; 9669 fallthrough; 9670 case NL80211_IFTYPE_AP: 9671 ahvif->vdev_type = WMI_VDEV_TYPE_AP; 9672 9673 if (vif->p2p) 9674 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO; 9675 9676 break; 9677 case NL80211_IFTYPE_MONITOR: 9678 ahvif->vdev_type = WMI_VDEV_TYPE_MONITOR; 9679 break; 9680 case NL80211_IFTYPE_P2P_DEVICE: 9681 ahvif->vdev_type = WMI_VDEV_TYPE_STA; 9682 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE; 9683 break; 9684 default: 9685 WARN_ON(1); 9686 break; 9687 } 9688 } 9689 9690 int ath12k_mac_vdev_create(struct ath12k *ar, struct ath12k_link_vif *arvif) 9691 { 9692 struct ath12k_hw *ah = ar->ah; 9693 struct ath12k_base *ab = ar->ab; 9694 struct ieee80211_hw *hw = ah->hw; 9695 struct ath12k_vif *ahvif = arvif->ahvif; 9696 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif); 9697 struct ath12k_wmi_vdev_create_arg vdev_arg = {}; 9698 struct ath12k_wmi_peer_create_arg peer_param = {}; 9699 struct ieee80211_bss_conf *link_conf = NULL; 9700 u32 param_id, param_value; 9701 u16 nss; 9702 int i; 9703 int ret, vdev_id; 9704 u8 link_id; 9705 9706 lockdep_assert_wiphy(hw->wiphy); 9707 9708 /* In NO_VIRTUAL_MONITOR, its necessary to restrict only one monitor 9709 * interface in each radio 9710 */ 9711 if (vif->type == NL80211_IFTYPE_MONITOR && ar->monitor_vdev_created) 9712 return -EINVAL; 9713 9714 link_id = arvif->link_id; 9715 9716 if (link_id < IEEE80211_MLD_MAX_NUM_LINKS) { 9717 link_conf = wiphy_dereference(hw->wiphy, vif->link_conf[link_id]); 9718 if (!link_conf) { 9719 ath12k_warn(ar->ab, "unable to access bss link conf in vdev create for vif %pM link %u\n", 9720 vif->addr, arvif->link_id); 9721 return -ENOLINK; 9722 } 9723 } 9724 9725 if (link_conf) 9726 memcpy(arvif->bssid, link_conf->addr, ETH_ALEN); 9727 else 9728 memcpy(arvif->bssid, vif->addr, ETH_ALEN); 9729 9730 arvif->ar = ar; 9731 vdev_id = __ffs64(ab->free_vdev_map); 9732 arvif->vdev_id = vdev_id; 9733 if (vif->type == NL80211_IFTYPE_MONITOR) 9734 ar->monitor_vdev_id = vdev_id; 9735 9736 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev create id %d type %d subtype %d map %llx\n", 9737 arvif->vdev_id, ahvif->vdev_type, ahvif->vdev_subtype, 9738 ab->free_vdev_map); 9739 9740 vif->cab_queue = arvif->vdev_id % (ATH12K_HW_MAX_QUEUES - 1); 9741 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++) 9742 vif->hw_queue[i] = i % (ATH12K_HW_MAX_QUEUES - 1); 9743 9744 ret = ath12k_mac_setup_vdev_create_arg(arvif, &vdev_arg); 9745 if (ret) { 9746 ath12k_warn(ab, "failed to create vdev parameters %d: %d\n", 9747 arvif->vdev_id, ret); 9748 goto err; 9749 } 9750 9751 ret = ath12k_wmi_vdev_create(ar, arvif->bssid, &vdev_arg); 9752 if (ret) { 9753 ath12k_warn(ab, "failed to create WMI vdev %d: %d\n", 9754 arvif->vdev_id, ret); 9755 return ret; 9756 } 9757 9758 ar->num_created_vdevs++; 9759 arvif->is_created = true; 9760 ath12k_dbg(ab, ATH12K_DBG_MAC, "vdev %pM created, vdev_id %d\n", 9761 vif->addr, arvif->vdev_id); 9762 ar->allocated_vdev_map |= 1LL << arvif->vdev_id; 9763 ab->free_vdev_map &= ~(1LL << arvif->vdev_id); 9764 9765 spin_lock_bh(&ar->data_lock); 9766 list_add(&arvif->list, &ar->arvifs); 9767 spin_unlock_bh(&ar->data_lock); 9768 9769 ath12k_mac_update_vif_offload(arvif); 9770 9771 nss = hweight32(ar->cfg_tx_chainmask) ? : 1; 9772 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 9773 WMI_VDEV_PARAM_NSS, nss); 9774 if (ret) { 9775 ath12k_warn(ab, "failed to set vdev %d chainmask 0x%x, nss %d :%d\n", 9776 arvif->vdev_id, ar->cfg_tx_chainmask, nss, ret); 9777 goto err_vdev_del; 9778 } 9779 9780 switch (ahvif->vdev_type) { 9781 case WMI_VDEV_TYPE_AP: 9782 peer_param.vdev_id = arvif->vdev_id; 9783 peer_param.peer_addr = arvif->bssid; 9784 peer_param.peer_type = WMI_PEER_TYPE_DEFAULT; 9785 ret = ath12k_peer_create(ar, arvif, NULL, &peer_param); 9786 if (ret) { 9787 ath12k_warn(ab, "failed to vdev %d create peer for AP: %d\n", 9788 arvif->vdev_id, ret); 9789 goto err_vdev_del; 9790 } 9791 9792 ret = ath12k_mac_set_kickout(arvif); 9793 if (ret) { 9794 ath12k_warn(ar->ab, "failed to set vdev %i kickout parameters: %d\n", 9795 arvif->vdev_id, ret); 9796 goto err_peer_del; 9797 } 9798 ath12k_mac_11d_scan_stop_all(ar->ab); 9799 break; 9800 case WMI_VDEV_TYPE_STA: 9801 param_id = WMI_STA_PS_PARAM_RX_WAKE_POLICY; 9802 param_value = WMI_STA_PS_RX_WAKE_POLICY_WAKE; 9803 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, 9804 param_id, param_value); 9805 if (ret) { 9806 ath12k_warn(ar->ab, "failed to set vdev %d RX wake policy: %d\n", 9807 arvif->vdev_id, ret); 9808 goto err_peer_del; 9809 } 9810 9811 param_id = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD; 9812 param_value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS; 9813 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, 9814 param_id, param_value); 9815 if (ret) { 9816 ath12k_warn(ar->ab, "failed to set vdev %d TX wake threshold: %d\n", 9817 arvif->vdev_id, ret); 9818 goto err_peer_del; 9819 } 9820 9821 param_id = WMI_STA_PS_PARAM_PSPOLL_COUNT; 9822 param_value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX; 9823 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, 9824 param_id, param_value); 9825 if (ret) { 9826 ath12k_warn(ar->ab, "failed to set vdev %d pspoll count: %d\n", 9827 arvif->vdev_id, ret); 9828 goto err_peer_del; 9829 } 9830 9831 ret = ath12k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, false); 9832 if (ret) { 9833 ath12k_warn(ar->ab, "failed to disable vdev %d ps mode: %d\n", 9834 arvif->vdev_id, ret); 9835 goto err_peer_del; 9836 } 9837 9838 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ab->wmi_ab.svc_map) && 9839 ahvif->vdev_type == WMI_VDEV_TYPE_STA && 9840 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) { 9841 reinit_completion(&ar->completed_11d_scan); 9842 ar->state_11d = ATH12K_11D_PREPARING; 9843 } 9844 break; 9845 case WMI_VDEV_TYPE_MONITOR: 9846 ar->monitor_vdev_created = true; 9847 break; 9848 default: 9849 break; 9850 } 9851 9852 if (link_conf) 9853 arvif->txpower = link_conf->txpower; 9854 else 9855 arvif->txpower = NL80211_TX_POWER_AUTOMATIC; 9856 9857 ret = ath12k_mac_txpower_recalc(ar); 9858 if (ret) 9859 goto err_peer_del; 9860 9861 param_id = WMI_VDEV_PARAM_RTS_THRESHOLD; 9862 param_value = hw->wiphy->rts_threshold; 9863 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 9864 param_id, param_value); 9865 if (ret) { 9866 ath12k_warn(ar->ab, "failed to set rts threshold for vdev %d: %d\n", 9867 arvif->vdev_id, ret); 9868 } 9869 9870 ath12k_dp_vdev_tx_attach(ar, arvif); 9871 9872 return ret; 9873 9874 err_peer_del: 9875 if (ahvif->vdev_type == WMI_VDEV_TYPE_AP) { 9876 reinit_completion(&ar->peer_delete_done); 9877 9878 ret = ath12k_wmi_send_peer_delete_cmd(ar, arvif->bssid, 9879 arvif->vdev_id); 9880 if (ret) { 9881 ath12k_warn(ar->ab, "failed to delete peer vdev_id %d addr %pM\n", 9882 arvif->vdev_id, arvif->bssid); 9883 goto err; 9884 } 9885 9886 ret = ath12k_wait_for_peer_delete_done(ar, arvif->vdev_id, 9887 arvif->bssid); 9888 if (ret) 9889 goto err_vdev_del; 9890 9891 ar->num_peers--; 9892 } 9893 9894 err_vdev_del: 9895 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { 9896 ar->monitor_vdev_id = -1; 9897 ar->monitor_vdev_created = false; 9898 } 9899 9900 ath12k_wmi_vdev_delete(ar, arvif->vdev_id); 9901 ar->num_created_vdevs--; 9902 arvif->is_created = false; 9903 arvif->ar = NULL; 9904 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id); 9905 ab->free_vdev_map |= 1LL << arvif->vdev_id; 9906 ab->free_vdev_stats_id_map &= ~(1LL << arvif->vdev_stats_id); 9907 spin_lock_bh(&ar->data_lock); 9908 list_del(&arvif->list); 9909 spin_unlock_bh(&ar->data_lock); 9910 9911 err: 9912 arvif->ar = NULL; 9913 return ret; 9914 } 9915 9916 static void ath12k_mac_vif_flush_key_cache(struct ath12k_link_vif *arvif) 9917 { 9918 struct ath12k_key_conf *key_conf, *tmp; 9919 struct ath12k_vif *ahvif = arvif->ahvif; 9920 struct ath12k_hw *ah = ahvif->ah; 9921 struct ath12k_sta *ahsta; 9922 struct ath12k_link_sta *arsta; 9923 struct ath12k_vif_cache *cache = ahvif->cache[arvif->link_id]; 9924 int ret; 9925 9926 lockdep_assert_wiphy(ah->hw->wiphy); 9927 9928 list_for_each_entry_safe(key_conf, tmp, &cache->key_conf.list, list) { 9929 arsta = NULL; 9930 if (key_conf->sta) { 9931 ahsta = ath12k_sta_to_ahsta(key_conf->sta); 9932 arsta = wiphy_dereference(ah->hw->wiphy, 9933 ahsta->link[arvif->link_id]); 9934 if (!arsta) 9935 goto free_cache; 9936 } 9937 9938 ret = ath12k_mac_set_key(arvif->ar, key_conf->cmd, 9939 arvif, arsta, 9940 key_conf->key); 9941 if (ret) 9942 ath12k_warn(arvif->ar->ab, "unable to apply set key param to vdev %d ret %d\n", 9943 arvif->vdev_id, ret); 9944 free_cache: 9945 list_del(&key_conf->list); 9946 kfree(key_conf); 9947 } 9948 } 9949 9950 static void ath12k_mac_vif_cache_flush(struct ath12k *ar, struct ath12k_link_vif *arvif) 9951 { 9952 struct ath12k_vif *ahvif = arvif->ahvif; 9953 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif); 9954 struct ath12k_vif_cache *cache = ahvif->cache[arvif->link_id]; 9955 struct ath12k_base *ab = ar->ab; 9956 struct ieee80211_bss_conf *link_conf; 9957 9958 int ret; 9959 9960 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 9961 9962 if (!cache) 9963 return; 9964 9965 if (cache->tx_conf.changed) { 9966 ret = ath12k_mac_conf_tx(arvif, cache->tx_conf.ac, 9967 &cache->tx_conf.tx_queue_params); 9968 if (ret) 9969 ath12k_warn(ab, 9970 "unable to apply tx config parameters to vdev %d\n", 9971 ret); 9972 } 9973 9974 if (cache->bss_conf_changed) { 9975 link_conf = ath12k_mac_get_link_bss_conf(arvif); 9976 if (!link_conf) { 9977 ath12k_warn(ar->ab, "unable to access bss link conf in cache flush for vif %pM link %u\n", 9978 vif->addr, arvif->link_id); 9979 return; 9980 } 9981 ath12k_mac_bss_info_changed(ar, arvif, link_conf, 9982 cache->bss_conf_changed); 9983 } 9984 9985 if (!list_empty(&cache->key_conf.list)) 9986 ath12k_mac_vif_flush_key_cache(arvif); 9987 9988 ath12k_ahvif_put_link_cache(ahvif, arvif->link_id); 9989 } 9990 9991 static struct ath12k *ath12k_mac_assign_vif_to_vdev(struct ieee80211_hw *hw, 9992 struct ath12k_link_vif *arvif, 9993 struct ieee80211_chanctx_conf *ctx) 9994 { 9995 struct ath12k_vif *ahvif = arvif->ahvif; 9996 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif); 9997 struct ath12k_link_vif *scan_arvif; 9998 struct ath12k_hw *ah = hw->priv; 9999 struct ath12k *ar; 10000 struct ath12k_base *ab; 10001 u8 link_id = arvif->link_id, scan_link_id; 10002 unsigned long scan_link_map; 10003 int ret; 10004 10005 lockdep_assert_wiphy(hw->wiphy); 10006 10007 if (ah->num_radio == 1) 10008 ar = ah->radio; 10009 else if (ctx) 10010 ar = ath12k_get_ar_by_ctx(hw, ctx); 10011 else 10012 return NULL; 10013 10014 if (!ar) 10015 return NULL; 10016 10017 /* cleanup the scan vdev if we are done scan on that ar 10018 * and now we want to create for actual usage. 10019 */ 10020 if (ieee80211_vif_is_mld(vif)) { 10021 scan_link_map = ahvif->links_map & ATH12K_SCAN_LINKS_MASK; 10022 for_each_set_bit(scan_link_id, &scan_link_map, ATH12K_NUM_MAX_LINKS) { 10023 scan_arvif = wiphy_dereference(hw->wiphy, 10024 ahvif->link[scan_link_id]); 10025 if (scan_arvif && scan_arvif->ar == ar) { 10026 ar->scan.arvif = NULL; 10027 ath12k_mac_remove_link_interface(hw, scan_arvif); 10028 ath12k_mac_unassign_link_vif(scan_arvif); 10029 break; 10030 } 10031 } 10032 } 10033 10034 if (arvif->ar) { 10035 /* This is not expected really */ 10036 if (WARN_ON(!arvif->is_created)) { 10037 arvif->ar = NULL; 10038 return NULL; 10039 } 10040 10041 if (ah->num_radio == 1) 10042 return arvif->ar; 10043 10044 /* This can happen as scan vdev gets created during multiple scans 10045 * across different radios before a vdev is brought up in 10046 * a certain radio. 10047 */ 10048 if (ar != arvif->ar) { 10049 if (WARN_ON(arvif->is_started)) 10050 return NULL; 10051 10052 ath12k_mac_remove_link_interface(hw, arvif); 10053 ath12k_mac_unassign_link_vif(arvif); 10054 } 10055 } 10056 10057 ab = ar->ab; 10058 10059 /* Assign arvif again here since previous radio switch block 10060 * would've unassigned and cleared it. 10061 */ 10062 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id); 10063 if (vif->type == NL80211_IFTYPE_AP && 10064 ar->num_peers > (ar->max_num_peers - 1)) { 10065 ath12k_warn(ab, "failed to create vdev due to insufficient peer entry resource in firmware\n"); 10066 goto unlock; 10067 } 10068 10069 if (arvif->is_created) 10070 goto flush; 10071 10072 if (ar->num_created_vdevs > (TARGET_NUM_VDEVS(ab) - 1)) { 10073 ath12k_warn(ab, "failed to create vdev, reached max vdev limit %d\n", 10074 TARGET_NUM_VDEVS(ab)); 10075 goto unlock; 10076 } 10077 10078 ret = ath12k_mac_vdev_create(ar, arvif); 10079 if (ret) { 10080 ath12k_warn(ab, "failed to create vdev %pM ret %d", vif->addr, ret); 10081 goto unlock; 10082 } 10083 10084 flush: 10085 /* If the vdev is created during channel assign and not during 10086 * add_interface(), Apply any parameters for the vdev which were received 10087 * after add_interface, corresponding to this vif. 10088 */ 10089 ath12k_mac_vif_cache_flush(ar, arvif); 10090 unlock: 10091 return arvif->ar; 10092 } 10093 10094 static int ath12k_mac_op_add_interface(struct ieee80211_hw *hw, 10095 struct ieee80211_vif *vif) 10096 { 10097 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 10098 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 10099 struct ath12k_reg_info *reg_info; 10100 struct ath12k_link_vif *arvif; 10101 struct ath12k_base *ab; 10102 struct ath12k *ar; 10103 int i; 10104 10105 lockdep_assert_wiphy(hw->wiphy); 10106 10107 memset(ahvif, 0, sizeof(*ahvif)); 10108 10109 ahvif->ah = ah; 10110 ahvif->vif = vif; 10111 arvif = &ahvif->deflink; 10112 10113 ath12k_mac_init_arvif(ahvif, arvif, -1); 10114 10115 /* Allocate Default Queue now and reassign during actual vdev create */ 10116 vif->cab_queue = ATH12K_HW_DEFAULT_QUEUE; 10117 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++) 10118 vif->hw_queue[i] = ATH12K_HW_DEFAULT_QUEUE; 10119 10120 vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD; 10121 10122 ath12k_mac_determine_vdev_type(vif, ahvif); 10123 10124 for_each_ar(ah, ar, i) { 10125 if (!ath12k_wmi_supports_6ghz_cc_ext(ar)) 10126 continue; 10127 10128 ab = ar->ab; 10129 reg_info = ab->reg_info[ar->pdev_idx]; 10130 ath12k_dbg(ab, ATH12K_DBG_MAC, "interface added to change reg rules\n"); 10131 ah->regd_updated = false; 10132 ath12k_reg_handle_chan_list(ab, reg_info, ahvif->vdev_type, 10133 IEEE80211_REG_UNSET_AP); 10134 break; 10135 } 10136 10137 /* Defer vdev creation until assign_chanctx or hw_scan is initiated as driver 10138 * will not know if this interface is an ML vif at this point. 10139 */ 10140 return 0; 10141 } 10142 10143 static void ath12k_mac_vif_unref(struct ath12k_dp *dp, struct ieee80211_vif *vif) 10144 { 10145 struct ath12k_tx_desc_info *tx_desc_info; 10146 struct ath12k_skb_cb *skb_cb; 10147 struct sk_buff *skb; 10148 int i; 10149 10150 for (i = 0; i < ATH12K_HW_MAX_QUEUES; i++) { 10151 spin_lock_bh(&dp->tx_desc_lock[i]); 10152 10153 list_for_each_entry(tx_desc_info, &dp->tx_desc_used_list[i], 10154 list) { 10155 skb = tx_desc_info->skb; 10156 if (!skb) 10157 continue; 10158 10159 skb_cb = ATH12K_SKB_CB(skb); 10160 if (skb_cb->vif == vif) 10161 skb_cb->vif = NULL; 10162 } 10163 10164 spin_unlock_bh(&dp->tx_desc_lock[i]); 10165 } 10166 } 10167 10168 static int ath12k_mac_vdev_delete(struct ath12k *ar, struct ath12k_link_vif *arvif) 10169 { 10170 struct ath12k_vif *ahvif = arvif->ahvif; 10171 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif); 10172 struct ath12k_base *ab = ar->ab; 10173 unsigned long time_left; 10174 int ret; 10175 10176 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 10177 10178 reinit_completion(&ar->vdev_delete_done); 10179 10180 ret = ath12k_wmi_vdev_delete(ar, arvif->vdev_id); 10181 if (ret) { 10182 ath12k_warn(ab, "failed to delete WMI vdev %d: %d\n", 10183 arvif->vdev_id, ret); 10184 goto err_vdev_del; 10185 } 10186 10187 time_left = wait_for_completion_timeout(&ar->vdev_delete_done, 10188 ATH12K_VDEV_DELETE_TIMEOUT_HZ); 10189 if (time_left == 0) { 10190 ath12k_warn(ab, "Timeout in receiving vdev delete response\n"); 10191 goto err_vdev_del; 10192 } 10193 10194 ab->free_vdev_map |= 1LL << arvif->vdev_id; 10195 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id); 10196 ar->num_created_vdevs--; 10197 10198 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { 10199 ar->monitor_vdev_id = -1; 10200 ar->monitor_vdev_created = false; 10201 } 10202 10203 ath12k_dbg(ab, ATH12K_DBG_MAC, "vdev %pM deleted, vdev_id %d\n", 10204 vif->addr, arvif->vdev_id); 10205 10206 err_vdev_del: 10207 spin_lock_bh(&ar->data_lock); 10208 list_del(&arvif->list); 10209 spin_unlock_bh(&ar->data_lock); 10210 10211 ath12k_peer_cleanup(ar, arvif->vdev_id); 10212 ath12k_ahvif_put_link_cache(ahvif, arvif->link_id); 10213 10214 idr_for_each(&ar->txmgmt_idr, 10215 ath12k_mac_vif_txmgmt_idr_remove, vif); 10216 10217 ath12k_mac_vif_unref(&ab->dp, vif); 10218 ath12k_dp_tx_put_bank_profile(&ab->dp, arvif->bank_id); 10219 10220 /* Recalc txpower for remaining vdev */ 10221 ath12k_mac_txpower_recalc(ar); 10222 10223 /* TODO: recal traffic pause state based on the available vdevs */ 10224 arvif->is_created = false; 10225 arvif->ar = NULL; 10226 10227 return ret; 10228 } 10229 10230 static void ath12k_mac_op_remove_interface(struct ieee80211_hw *hw, 10231 struct ieee80211_vif *vif) 10232 { 10233 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 10234 struct ath12k_link_vif *arvif; 10235 struct ath12k *ar; 10236 u8 link_id; 10237 10238 lockdep_assert_wiphy(hw->wiphy); 10239 10240 for (link_id = 0; link_id < ATH12K_NUM_MAX_LINKS; link_id++) { 10241 /* if we cached some config but never received assign chanctx, 10242 * free the allocated cache. 10243 */ 10244 ath12k_ahvif_put_link_cache(ahvif, link_id); 10245 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 10246 if (!arvif || !arvif->is_created) 10247 continue; 10248 10249 ar = arvif->ar; 10250 10251 /* Scan abortion is in progress since before this, cancel_hw_scan() 10252 * is expected to be executed. Since link is anyways going to be removed 10253 * now, just cancel the worker and send the scan aborted to user space 10254 */ 10255 if (ar->scan.arvif == arvif) { 10256 wiphy_work_cancel(hw->wiphy, &ar->scan.vdev_clean_wk); 10257 10258 spin_lock_bh(&ar->data_lock); 10259 ar->scan.arvif = NULL; 10260 if (!ar->scan.is_roc) { 10261 struct cfg80211_scan_info info = { 10262 .aborted = true, 10263 }; 10264 10265 ath12k_mac_scan_send_complete(ar, &info); 10266 } 10267 10268 ar->scan.state = ATH12K_SCAN_IDLE; 10269 ar->scan_channel = NULL; 10270 ar->scan.roc_freq = 0; 10271 spin_unlock_bh(&ar->data_lock); 10272 } 10273 10274 ath12k_mac_remove_link_interface(hw, arvif); 10275 ath12k_mac_unassign_link_vif(arvif); 10276 } 10277 } 10278 10279 /* FIXME: Has to be verified. */ 10280 #define SUPPORTED_FILTERS \ 10281 (FIF_ALLMULTI | \ 10282 FIF_CONTROL | \ 10283 FIF_PSPOLL | \ 10284 FIF_OTHER_BSS | \ 10285 FIF_BCN_PRBRESP_PROMISC | \ 10286 FIF_PROBE_REQ | \ 10287 FIF_FCSFAIL) 10288 10289 static void ath12k_mac_op_configure_filter(struct ieee80211_hw *hw, 10290 unsigned int changed_flags, 10291 unsigned int *total_flags, 10292 u64 multicast) 10293 { 10294 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 10295 struct ath12k *ar; 10296 10297 lockdep_assert_wiphy(hw->wiphy); 10298 10299 ar = ath12k_ah_to_ar(ah, 0); 10300 10301 *total_flags &= SUPPORTED_FILTERS; 10302 ar->filter_flags = *total_flags; 10303 } 10304 10305 static int ath12k_mac_op_get_antenna(struct ieee80211_hw *hw, int radio_idx, 10306 u32 *tx_ant, u32 *rx_ant) 10307 { 10308 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 10309 int antennas_rx = 0, antennas_tx = 0; 10310 struct ath12k *ar; 10311 int i; 10312 10313 lockdep_assert_wiphy(hw->wiphy); 10314 10315 for_each_ar(ah, ar, i) { 10316 antennas_rx = max_t(u32, antennas_rx, ar->cfg_rx_chainmask); 10317 antennas_tx = max_t(u32, antennas_tx, ar->cfg_tx_chainmask); 10318 } 10319 10320 *tx_ant = antennas_tx; 10321 *rx_ant = antennas_rx; 10322 10323 return 0; 10324 } 10325 10326 static int ath12k_mac_op_set_antenna(struct ieee80211_hw *hw, int radio_idx, 10327 u32 tx_ant, u32 rx_ant) 10328 { 10329 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 10330 struct ath12k *ar; 10331 int ret = 0; 10332 int i; 10333 10334 lockdep_assert_wiphy(hw->wiphy); 10335 10336 for_each_ar(ah, ar, i) { 10337 ret = __ath12k_set_antenna(ar, tx_ant, rx_ant); 10338 if (ret) 10339 break; 10340 } 10341 10342 return ret; 10343 } 10344 10345 static int ath12k_mac_ampdu_action(struct ieee80211_hw *hw, 10346 struct ieee80211_vif *vif, 10347 struct ieee80211_ampdu_params *params, 10348 u8 link_id) 10349 { 10350 struct ath12k *ar; 10351 int ret = -EINVAL; 10352 10353 lockdep_assert_wiphy(hw->wiphy); 10354 10355 ar = ath12k_get_ar_by_vif(hw, vif, link_id); 10356 if (!ar) 10357 return -EINVAL; 10358 10359 switch (params->action) { 10360 case IEEE80211_AMPDU_RX_START: 10361 ret = ath12k_dp_rx_ampdu_start(ar, params, link_id); 10362 break; 10363 case IEEE80211_AMPDU_RX_STOP: 10364 ret = ath12k_dp_rx_ampdu_stop(ar, params, link_id); 10365 break; 10366 case IEEE80211_AMPDU_TX_START: 10367 case IEEE80211_AMPDU_TX_STOP_CONT: 10368 case IEEE80211_AMPDU_TX_STOP_FLUSH: 10369 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT: 10370 case IEEE80211_AMPDU_TX_OPERATIONAL: 10371 /* Tx A-MPDU aggregation offloaded to hw/fw so deny mac80211 10372 * Tx aggregation requests. 10373 */ 10374 ret = -EOPNOTSUPP; 10375 break; 10376 } 10377 10378 if (ret) 10379 ath12k_warn(ar->ab, "unable to perform ampdu action %d for vif %pM link %u ret %d\n", 10380 params->action, vif->addr, link_id, ret); 10381 10382 return ret; 10383 } 10384 10385 static int ath12k_mac_op_ampdu_action(struct ieee80211_hw *hw, 10386 struct ieee80211_vif *vif, 10387 struct ieee80211_ampdu_params *params) 10388 { 10389 struct ieee80211_sta *sta = params->sta; 10390 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta); 10391 unsigned long links_map = ahsta->links_map; 10392 int ret = -EINVAL; 10393 u8 link_id; 10394 10395 lockdep_assert_wiphy(hw->wiphy); 10396 10397 if (WARN_ON(!links_map)) 10398 return ret; 10399 10400 for_each_set_bit(link_id, &links_map, IEEE80211_MLD_MAX_NUM_LINKS) { 10401 ret = ath12k_mac_ampdu_action(hw, vif, params, link_id); 10402 if (ret) 10403 return ret; 10404 } 10405 10406 return 0; 10407 } 10408 10409 static int ath12k_mac_op_add_chanctx(struct ieee80211_hw *hw, 10410 struct ieee80211_chanctx_conf *ctx) 10411 { 10412 struct ath12k *ar; 10413 struct ath12k_base *ab; 10414 10415 lockdep_assert_wiphy(hw->wiphy); 10416 10417 ar = ath12k_get_ar_by_ctx(hw, ctx); 10418 if (!ar) 10419 return -EINVAL; 10420 10421 ab = ar->ab; 10422 10423 ath12k_dbg(ab, ATH12K_DBG_MAC, 10424 "mac chanctx add freq %u width %d ptr %p\n", 10425 ctx->def.chan->center_freq, ctx->def.width, ctx); 10426 10427 spin_lock_bh(&ar->data_lock); 10428 /* TODO: In case of multiple channel context, populate rx_channel from 10429 * Rx PPDU desc information. 10430 */ 10431 ar->rx_channel = ctx->def.chan; 10432 spin_unlock_bh(&ar->data_lock); 10433 ar->chan_tx_pwr = ATH12K_PDEV_TX_POWER_INVALID; 10434 10435 return 0; 10436 } 10437 10438 static void ath12k_mac_op_remove_chanctx(struct ieee80211_hw *hw, 10439 struct ieee80211_chanctx_conf *ctx) 10440 { 10441 struct ath12k *ar; 10442 struct ath12k_base *ab; 10443 10444 lockdep_assert_wiphy(hw->wiphy); 10445 10446 ar = ath12k_get_ar_by_ctx(hw, ctx); 10447 if (!ar) 10448 return; 10449 10450 ab = ar->ab; 10451 10452 ath12k_dbg(ab, ATH12K_DBG_MAC, 10453 "mac chanctx remove freq %u width %d ptr %p\n", 10454 ctx->def.chan->center_freq, ctx->def.width, ctx); 10455 10456 spin_lock_bh(&ar->data_lock); 10457 /* TODO: In case of there is one more channel context left, populate 10458 * rx_channel with the channel of that remaining channel context. 10459 */ 10460 ar->rx_channel = NULL; 10461 spin_unlock_bh(&ar->data_lock); 10462 ar->chan_tx_pwr = ATH12K_PDEV_TX_POWER_INVALID; 10463 } 10464 10465 static enum wmi_phy_mode 10466 ath12k_mac_check_down_grade_phy_mode(struct ath12k *ar, 10467 enum wmi_phy_mode mode, 10468 enum nl80211_band band, 10469 enum nl80211_iftype type) 10470 { 10471 struct ieee80211_sta_eht_cap *eht_cap = NULL; 10472 enum wmi_phy_mode down_mode; 10473 int n = ar->mac.sbands[band].n_iftype_data; 10474 int i; 10475 struct ieee80211_sband_iftype_data *data; 10476 10477 if (mode < MODE_11BE_EHT20) 10478 return mode; 10479 10480 data = ar->mac.iftype[band]; 10481 for (i = 0; i < n; i++) { 10482 if (data[i].types_mask & BIT(type)) { 10483 eht_cap = &data[i].eht_cap; 10484 break; 10485 } 10486 } 10487 10488 if (eht_cap && eht_cap->has_eht) 10489 return mode; 10490 10491 switch (mode) { 10492 case MODE_11BE_EHT20: 10493 down_mode = MODE_11AX_HE20; 10494 break; 10495 case MODE_11BE_EHT40: 10496 down_mode = MODE_11AX_HE40; 10497 break; 10498 case MODE_11BE_EHT80: 10499 down_mode = MODE_11AX_HE80; 10500 break; 10501 case MODE_11BE_EHT80_80: 10502 down_mode = MODE_11AX_HE80_80; 10503 break; 10504 case MODE_11BE_EHT160: 10505 case MODE_11BE_EHT160_160: 10506 case MODE_11BE_EHT320: 10507 down_mode = MODE_11AX_HE160; 10508 break; 10509 case MODE_11BE_EHT20_2G: 10510 down_mode = MODE_11AX_HE20_2G; 10511 break; 10512 case MODE_11BE_EHT40_2G: 10513 down_mode = MODE_11AX_HE40_2G; 10514 break; 10515 default: 10516 down_mode = mode; 10517 break; 10518 } 10519 10520 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 10521 "mac vdev start phymode %s downgrade to %s\n", 10522 ath12k_mac_phymode_str(mode), 10523 ath12k_mac_phymode_str(down_mode)); 10524 10525 return down_mode; 10526 } 10527 10528 static void 10529 ath12k_mac_mlo_get_vdev_args(struct ath12k_link_vif *arvif, 10530 struct wmi_ml_arg *ml_arg) 10531 { 10532 struct ath12k_vif *ahvif = arvif->ahvif; 10533 struct wmi_ml_partner_info *partner_info; 10534 struct ieee80211_bss_conf *link_conf; 10535 struct ath12k_link_vif *arvif_p; 10536 unsigned long links; 10537 u8 link_id; 10538 10539 lockdep_assert_wiphy(ahvif->ah->hw->wiphy); 10540 10541 if (!ath12k_mac_is_ml_arvif(arvif)) 10542 return; 10543 10544 if (hweight16(ahvif->vif->valid_links) > ATH12K_WMI_MLO_MAX_LINKS) 10545 return; 10546 10547 ml_arg->enabled = true; 10548 10549 /* Driver always add a new link via VDEV START, FW takes 10550 * care of internally adding this link to existing 10551 * link vdevs which are advertised as partners below 10552 */ 10553 ml_arg->link_add = true; 10554 10555 ml_arg->assoc_link = arvif->is_sta_assoc_link; 10556 10557 partner_info = ml_arg->partner_info; 10558 10559 links = ahvif->links_map; 10560 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) { 10561 arvif_p = wiphy_dereference(ahvif->ah->hw->wiphy, ahvif->link[link_id]); 10562 10563 if (WARN_ON(!arvif_p)) 10564 continue; 10565 10566 if (arvif == arvif_p) 10567 continue; 10568 10569 if (!arvif_p->is_created) 10570 continue; 10571 10572 link_conf = wiphy_dereference(ahvif->ah->hw->wiphy, 10573 ahvif->vif->link_conf[arvif_p->link_id]); 10574 10575 if (!link_conf) 10576 continue; 10577 10578 partner_info->vdev_id = arvif_p->vdev_id; 10579 partner_info->hw_link_id = arvif_p->ar->pdev->hw_link_id; 10580 ether_addr_copy(partner_info->addr, link_conf->addr); 10581 ml_arg->num_partner_links++; 10582 partner_info++; 10583 } 10584 } 10585 10586 static int 10587 ath12k_mac_vdev_start_restart(struct ath12k_link_vif *arvif, 10588 struct ieee80211_chanctx_conf *ctx, 10589 bool restart) 10590 { 10591 struct ath12k *ar = arvif->ar; 10592 struct ath12k_base *ab = ar->ab; 10593 struct wmi_vdev_start_req_arg arg = {}; 10594 const struct cfg80211_chan_def *chandef = &ctx->def; 10595 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar); 10596 struct ath12k_vif *ahvif = arvif->ahvif; 10597 struct ieee80211_bss_conf *link_conf; 10598 unsigned int dfs_cac_time; 10599 int ret; 10600 10601 lockdep_assert_wiphy(hw->wiphy); 10602 10603 link_conf = ath12k_mac_get_link_bss_conf(arvif); 10604 if (!link_conf) { 10605 ath12k_warn(ar->ab, "unable to access bss link conf in vdev start for vif %pM link %u\n", 10606 ahvif->vif->addr, arvif->link_id); 10607 return -ENOLINK; 10608 } 10609 10610 reinit_completion(&ar->vdev_setup_done); 10611 10612 arg.vdev_id = arvif->vdev_id; 10613 arg.dtim_period = arvif->dtim_period; 10614 arg.bcn_intval = arvif->beacon_interval; 10615 arg.punct_bitmap = ~arvif->punct_bitmap; 10616 10617 arg.freq = chandef->chan->center_freq; 10618 arg.band_center_freq1 = chandef->center_freq1; 10619 arg.band_center_freq2 = chandef->center_freq2; 10620 arg.mode = ath12k_phymodes[chandef->chan->band][chandef->width]; 10621 10622 arg.mode = ath12k_mac_check_down_grade_phy_mode(ar, arg.mode, 10623 chandef->chan->band, 10624 ahvif->vif->type); 10625 arg.min_power = 0; 10626 arg.max_power = chandef->chan->max_power; 10627 arg.max_reg_power = chandef->chan->max_reg_power; 10628 arg.max_antenna_gain = chandef->chan->max_antenna_gain; 10629 10630 arg.pref_tx_streams = ar->num_tx_chains; 10631 arg.pref_rx_streams = ar->num_rx_chains; 10632 10633 arg.mbssid_flags = WMI_VDEV_MBSSID_FLAGS_NON_MBSSID_AP; 10634 arg.mbssid_tx_vdev_id = 0; 10635 if (test_bit(WMI_TLV_SERVICE_MBSS_PARAM_IN_VDEV_START_SUPPORT, 10636 ar->ab->wmi_ab.svc_map)) { 10637 ret = ath12k_mac_setup_vdev_params_mbssid(arvif, 10638 &arg.mbssid_flags, 10639 &arg.mbssid_tx_vdev_id); 10640 if (ret) 10641 return ret; 10642 } 10643 10644 if (ahvif->vdev_type == WMI_VDEV_TYPE_AP) { 10645 arg.ssid = ahvif->u.ap.ssid; 10646 arg.ssid_len = ahvif->u.ap.ssid_len; 10647 arg.hidden_ssid = ahvif->u.ap.hidden_ssid; 10648 10649 /* For now allow DFS for AP mode */ 10650 arg.chan_radar = !!(chandef->chan->flags & IEEE80211_CHAN_RADAR); 10651 10652 arg.freq2_radar = ctx->radar_enabled; 10653 10654 arg.passive = arg.chan_radar; 10655 10656 spin_lock_bh(&ab->base_lock); 10657 arg.regdomain = ar->ab->dfs_region; 10658 spin_unlock_bh(&ab->base_lock); 10659 10660 /* TODO: Notify if secondary 80Mhz also needs radar detection */ 10661 } 10662 10663 arg.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR); 10664 10665 if (!restart) 10666 ath12k_mac_mlo_get_vdev_args(arvif, &arg.ml); 10667 10668 ath12k_dbg(ab, ATH12K_DBG_MAC, 10669 "mac vdev %d start center_freq %d phymode %s punct_bitmap 0x%x\n", 10670 arg.vdev_id, arg.freq, 10671 ath12k_mac_phymode_str(arg.mode), arg.punct_bitmap); 10672 10673 ret = ath12k_wmi_vdev_start(ar, &arg, restart); 10674 if (ret) { 10675 ath12k_warn(ar->ab, "failed to %s WMI vdev %i\n", 10676 restart ? "restart" : "start", arg.vdev_id); 10677 return ret; 10678 } 10679 10680 ret = ath12k_mac_vdev_setup_sync(ar); 10681 if (ret) { 10682 ath12k_warn(ab, "failed to synchronize setup for vdev %i %s: %d\n", 10683 arg.vdev_id, restart ? "restart" : "start", ret); 10684 return ret; 10685 } 10686 10687 /* TODO: For now we only set TPC power here. However when 10688 * channel changes, say CSA, it should be updated again. 10689 */ 10690 if (ath12k_mac_supports_tpc(ar, ahvif, chandef)) { 10691 ath12k_mac_fill_reg_tpc_info(ar, arvif, ctx); 10692 ath12k_wmi_send_vdev_set_tpc_power(ar, arvif->vdev_id, 10693 &arvif->reg_tpc_info); 10694 } 10695 10696 ar->num_started_vdevs++; 10697 ath12k_dbg(ab, ATH12K_DBG_MAC, "vdev %pM started, vdev_id %d\n", 10698 ahvif->vif->addr, arvif->vdev_id); 10699 10700 /* Enable CAC Running Flag in the driver by checking all sub-channel's DFS 10701 * state as NL80211_DFS_USABLE which indicates CAC needs to be 10702 * done before channel usage. This flag is used to drop rx packets. 10703 * during CAC. 10704 */ 10705 /* TODO: Set the flag for other interface types as required */ 10706 if (arvif->ahvif->vdev_type == WMI_VDEV_TYPE_AP && ctx->radar_enabled && 10707 cfg80211_chandef_dfs_usable(hw->wiphy, chandef)) { 10708 set_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags); 10709 dfs_cac_time = cfg80211_chandef_dfs_cac_time(hw->wiphy, chandef); 10710 10711 ath12k_dbg(ab, ATH12K_DBG_MAC, 10712 "CAC started dfs_cac_time %u center_freq %d center_freq1 %d for vdev %d\n", 10713 dfs_cac_time, arg.freq, arg.band_center_freq1, arg.vdev_id); 10714 } 10715 10716 ret = ath12k_mac_set_txbf_conf(arvif); 10717 if (ret) 10718 ath12k_warn(ab, "failed to set txbf conf for vdev %d: %d\n", 10719 arvif->vdev_id, ret); 10720 10721 return 0; 10722 } 10723 10724 static int ath12k_mac_vdev_start(struct ath12k_link_vif *arvif, 10725 struct ieee80211_chanctx_conf *ctx) 10726 { 10727 return ath12k_mac_vdev_start_restart(arvif, ctx, false); 10728 } 10729 10730 static int ath12k_mac_vdev_restart(struct ath12k_link_vif *arvif, 10731 struct ieee80211_chanctx_conf *ctx) 10732 { 10733 return ath12k_mac_vdev_start_restart(arvif, ctx, true); 10734 } 10735 10736 struct ath12k_mac_change_chanctx_arg { 10737 struct ieee80211_chanctx_conf *ctx; 10738 struct ieee80211_vif_chanctx_switch *vifs; 10739 int n_vifs; 10740 int next_vif; 10741 struct ath12k *ar; 10742 }; 10743 10744 static void 10745 ath12k_mac_change_chanctx_cnt_iter(void *data, u8 *mac, 10746 struct ieee80211_vif *vif) 10747 { 10748 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 10749 struct ath12k_mac_change_chanctx_arg *arg = data; 10750 struct ieee80211_bss_conf *link_conf; 10751 struct ath12k_link_vif *arvif; 10752 unsigned long links_map; 10753 u8 link_id; 10754 10755 lockdep_assert_wiphy(ahvif->ah->hw->wiphy); 10756 10757 links_map = ahvif->links_map; 10758 for_each_set_bit(link_id, &links_map, IEEE80211_MLD_MAX_NUM_LINKS) { 10759 arvif = wiphy_dereference(ahvif->ah->hw->wiphy, ahvif->link[link_id]); 10760 if (WARN_ON(!arvif)) 10761 continue; 10762 10763 if (!arvif->is_created || arvif->ar != arg->ar) 10764 continue; 10765 10766 link_conf = wiphy_dereference(ahvif->ah->hw->wiphy, 10767 vif->link_conf[link_id]); 10768 if (WARN_ON(!link_conf)) 10769 continue; 10770 10771 if (rcu_access_pointer(link_conf->chanctx_conf) != arg->ctx) 10772 continue; 10773 10774 arg->n_vifs++; 10775 } 10776 } 10777 10778 static void 10779 ath12k_mac_change_chanctx_fill_iter(void *data, u8 *mac, 10780 struct ieee80211_vif *vif) 10781 { 10782 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 10783 struct ath12k_mac_change_chanctx_arg *arg = data; 10784 struct ieee80211_bss_conf *link_conf; 10785 struct ieee80211_chanctx_conf *ctx; 10786 struct ath12k_link_vif *arvif; 10787 unsigned long links_map; 10788 u8 link_id; 10789 10790 lockdep_assert_wiphy(ahvif->ah->hw->wiphy); 10791 10792 links_map = ahvif->links_map; 10793 for_each_set_bit(link_id, &links_map, IEEE80211_MLD_MAX_NUM_LINKS) { 10794 arvif = wiphy_dereference(ahvif->ah->hw->wiphy, ahvif->link[link_id]); 10795 if (WARN_ON(!arvif)) 10796 continue; 10797 10798 if (!arvif->is_created || arvif->ar != arg->ar) 10799 continue; 10800 10801 link_conf = wiphy_dereference(ahvif->ah->hw->wiphy, 10802 vif->link_conf[arvif->link_id]); 10803 if (WARN_ON(!link_conf)) 10804 continue; 10805 10806 ctx = rcu_access_pointer(link_conf->chanctx_conf); 10807 if (ctx != arg->ctx) 10808 continue; 10809 10810 if (WARN_ON(arg->next_vif == arg->n_vifs)) 10811 return; 10812 10813 arg->vifs[arg->next_vif].vif = vif; 10814 arg->vifs[arg->next_vif].old_ctx = ctx; 10815 arg->vifs[arg->next_vif].new_ctx = ctx; 10816 arg->vifs[arg->next_vif].link_conf = link_conf; 10817 arg->next_vif++; 10818 } 10819 } 10820 10821 static u32 ath12k_mac_nlwidth_to_wmiwidth(enum nl80211_chan_width width) 10822 { 10823 switch (width) { 10824 case NL80211_CHAN_WIDTH_20: 10825 return WMI_CHAN_WIDTH_20; 10826 case NL80211_CHAN_WIDTH_40: 10827 return WMI_CHAN_WIDTH_40; 10828 case NL80211_CHAN_WIDTH_80: 10829 return WMI_CHAN_WIDTH_80; 10830 case NL80211_CHAN_WIDTH_160: 10831 return WMI_CHAN_WIDTH_160; 10832 case NL80211_CHAN_WIDTH_80P80: 10833 return WMI_CHAN_WIDTH_80P80; 10834 case NL80211_CHAN_WIDTH_5: 10835 return WMI_CHAN_WIDTH_5; 10836 case NL80211_CHAN_WIDTH_10: 10837 return WMI_CHAN_WIDTH_10; 10838 case NL80211_CHAN_WIDTH_320: 10839 return WMI_CHAN_WIDTH_320; 10840 default: 10841 WARN_ON(1); 10842 return WMI_CHAN_WIDTH_20; 10843 } 10844 } 10845 10846 static int ath12k_mac_update_peer_puncturing_width(struct ath12k *ar, 10847 struct ath12k_link_vif *arvif, 10848 struct cfg80211_chan_def def) 10849 { 10850 u32 param_id, param_value; 10851 int ret; 10852 10853 if (arvif->ahvif->vdev_type != WMI_VDEV_TYPE_STA) 10854 return 0; 10855 10856 param_id = WMI_PEER_CHWIDTH_PUNCTURE_20MHZ_BITMAP; 10857 param_value = ath12k_mac_nlwidth_to_wmiwidth(def.width) | 10858 u32_encode_bits((~def.punctured), 10859 WMI_PEER_PUNCTURE_BITMAP); 10860 10861 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 10862 "punctured bitmap %02x width %d vdev %d\n", 10863 def.punctured, def.width, arvif->vdev_id); 10864 10865 ret = ath12k_wmi_set_peer_param(ar, arvif->bssid, 10866 arvif->vdev_id, param_id, 10867 param_value); 10868 10869 return ret; 10870 } 10871 10872 static void 10873 ath12k_mac_update_vif_chan(struct ath12k *ar, 10874 struct ieee80211_vif_chanctx_switch *vifs, 10875 int n_vifs) 10876 { 10877 struct ath12k_wmi_vdev_up_params params = {}; 10878 struct ath12k_link_vif *arvif; 10879 struct ieee80211_bss_conf *link_conf; 10880 struct ath12k_base *ab = ar->ab; 10881 struct ieee80211_vif *vif; 10882 struct ath12k_vif *ahvif; 10883 u8 link_id; 10884 int ret; 10885 int i; 10886 bool monitor_vif = false; 10887 10888 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 10889 10890 for (i = 0; i < n_vifs; i++) { 10891 vif = vifs[i].vif; 10892 ahvif = ath12k_vif_to_ahvif(vif); 10893 link_conf = vifs[i].link_conf; 10894 link_id = link_conf->link_id; 10895 arvif = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy, 10896 ahvif->link[link_id]); 10897 10898 if (vif->type == NL80211_IFTYPE_MONITOR) { 10899 monitor_vif = true; 10900 continue; 10901 } 10902 10903 ath12k_dbg(ab, ATH12K_DBG_MAC, 10904 "mac chanctx switch vdev_id %i freq %u->%u width %d->%d\n", 10905 arvif->vdev_id, 10906 vifs[i].old_ctx->def.chan->center_freq, 10907 vifs[i].new_ctx->def.chan->center_freq, 10908 vifs[i].old_ctx->def.width, 10909 vifs[i].new_ctx->def.width); 10910 10911 if (WARN_ON(!arvif->is_started)) 10912 continue; 10913 10914 arvif->punct_bitmap = vifs[i].new_ctx->def.punctured; 10915 10916 /* Firmware expect vdev_restart only if vdev is up. 10917 * If vdev is down then it expect vdev_stop->vdev_start. 10918 */ 10919 if (arvif->is_up) { 10920 ret = ath12k_mac_vdev_restart(arvif, vifs[i].new_ctx); 10921 if (ret) { 10922 ath12k_warn(ab, "failed to restart vdev %d: %d\n", 10923 arvif->vdev_id, ret); 10924 continue; 10925 } 10926 } else { 10927 ret = ath12k_mac_vdev_stop(arvif); 10928 if (ret) { 10929 ath12k_warn(ab, "failed to stop vdev %d: %d\n", 10930 arvif->vdev_id, ret); 10931 continue; 10932 } 10933 10934 ret = ath12k_mac_vdev_start(arvif, vifs[i].new_ctx); 10935 if (ret) 10936 ath12k_warn(ab, "failed to start vdev %d: %d\n", 10937 arvif->vdev_id, ret); 10938 continue; 10939 } 10940 10941 ret = ath12k_mac_setup_bcn_tmpl(arvif); 10942 if (ret) 10943 ath12k_warn(ab, "failed to update bcn tmpl during csa: %d\n", 10944 ret); 10945 10946 memset(¶ms, 0, sizeof(params)); 10947 params.vdev_id = arvif->vdev_id; 10948 params.aid = ahvif->aid; 10949 params.bssid = arvif->bssid; 10950 params.tx_bssid = ath12k_mac_get_tx_bssid(arvif); 10951 if (params.tx_bssid) { 10952 params.nontx_profile_idx = link_conf->bssid_index; 10953 params.nontx_profile_cnt = 1 << link_conf->bssid_indicator; 10954 } 10955 ret = ath12k_wmi_vdev_up(arvif->ar, ¶ms); 10956 if (ret) { 10957 ath12k_warn(ab, "failed to bring vdev up %d: %d\n", 10958 arvif->vdev_id, ret); 10959 continue; 10960 } 10961 10962 ret = ath12k_mac_update_peer_puncturing_width(arvif->ar, arvif, 10963 vifs[i].new_ctx->def); 10964 if (ret) { 10965 ath12k_warn(ar->ab, 10966 "failed to update puncturing bitmap %02x and width %d: %d\n", 10967 vifs[i].new_ctx->def.punctured, 10968 vifs[i].new_ctx->def.width, ret); 10969 continue; 10970 } 10971 } 10972 10973 /* Restart the internal monitor vdev on new channel */ 10974 if (!monitor_vif && ar->monitor_vdev_created) { 10975 if (!ath12k_mac_monitor_stop(ar)) 10976 ath12k_mac_monitor_start(ar); 10977 } 10978 } 10979 10980 static void 10981 ath12k_mac_update_active_vif_chan(struct ath12k *ar, 10982 struct ieee80211_chanctx_conf *ctx) 10983 { 10984 struct ath12k_mac_change_chanctx_arg arg = { .ctx = ctx, .ar = ar }; 10985 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar); 10986 10987 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 10988 10989 ieee80211_iterate_active_interfaces_atomic(hw, 10990 IEEE80211_IFACE_ITER_NORMAL, 10991 ath12k_mac_change_chanctx_cnt_iter, 10992 &arg); 10993 if (arg.n_vifs == 0) 10994 return; 10995 10996 arg.vifs = kcalloc(arg.n_vifs, sizeof(arg.vifs[0]), GFP_KERNEL); 10997 if (!arg.vifs) 10998 return; 10999 11000 ieee80211_iterate_active_interfaces_atomic(hw, 11001 IEEE80211_IFACE_ITER_NORMAL, 11002 ath12k_mac_change_chanctx_fill_iter, 11003 &arg); 11004 11005 ath12k_mac_update_vif_chan(ar, arg.vifs, arg.n_vifs); 11006 11007 kfree(arg.vifs); 11008 } 11009 11010 static void ath12k_mac_op_change_chanctx(struct ieee80211_hw *hw, 11011 struct ieee80211_chanctx_conf *ctx, 11012 u32 changed) 11013 { 11014 struct ath12k *ar; 11015 struct ath12k_base *ab; 11016 11017 lockdep_assert_wiphy(hw->wiphy); 11018 11019 ar = ath12k_get_ar_by_ctx(hw, ctx); 11020 if (!ar) 11021 return; 11022 11023 ab = ar->ab; 11024 11025 ath12k_dbg(ab, ATH12K_DBG_MAC, 11026 "mac chanctx change freq %u width %d ptr %p changed %x\n", 11027 ctx->def.chan->center_freq, ctx->def.width, ctx, changed); 11028 11029 /* This shouldn't really happen because channel switching should use 11030 * switch_vif_chanctx(). 11031 */ 11032 if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL)) 11033 return; 11034 11035 if (changed & IEEE80211_CHANCTX_CHANGE_WIDTH || 11036 changed & IEEE80211_CHANCTX_CHANGE_RADAR || 11037 changed & IEEE80211_CHANCTX_CHANGE_PUNCTURING) 11038 ath12k_mac_update_active_vif_chan(ar, ctx); 11039 11040 /* TODO: Recalc radar detection */ 11041 } 11042 11043 static int ath12k_start_vdev_delay(struct ath12k *ar, 11044 struct ath12k_link_vif *arvif) 11045 { 11046 struct ath12k_base *ab = ar->ab; 11047 struct ath12k_vif *ahvif = arvif->ahvif; 11048 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 11049 struct ieee80211_chanctx_conf *chanctx; 11050 struct ieee80211_bss_conf *link_conf; 11051 int ret; 11052 11053 if (WARN_ON(arvif->is_started)) 11054 return -EBUSY; 11055 11056 link_conf = ath12k_mac_get_link_bss_conf(arvif); 11057 if (!link_conf) { 11058 ath12k_warn(ab, "failed to get link conf for vdev %u\n", arvif->vdev_id); 11059 return -EINVAL; 11060 } 11061 11062 chanctx = wiphy_dereference(ath12k_ar_to_hw(arvif->ar)->wiphy, 11063 link_conf->chanctx_conf); 11064 ret = ath12k_mac_vdev_start(arvif, chanctx); 11065 if (ret) { 11066 ath12k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n", 11067 arvif->vdev_id, vif->addr, 11068 chanctx->def.chan->center_freq, ret); 11069 return ret; 11070 } 11071 11072 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { 11073 ret = ath12k_monitor_vdev_up(ar, arvif->vdev_id); 11074 if (ret) { 11075 ath12k_warn(ab, "failed put monitor up: %d\n", ret); 11076 return ret; 11077 } 11078 } 11079 11080 arvif->is_started = true; 11081 11082 /* TODO: Setup ps and cts/rts protection */ 11083 return 0; 11084 } 11085 11086 static u8 ath12k_mac_get_num_pwr_levels(struct cfg80211_chan_def *chan_def) 11087 { 11088 if (chan_def->chan->flags & IEEE80211_CHAN_PSD) { 11089 switch (chan_def->width) { 11090 case NL80211_CHAN_WIDTH_20: 11091 return 1; 11092 case NL80211_CHAN_WIDTH_40: 11093 return 2; 11094 case NL80211_CHAN_WIDTH_80: 11095 return 4; 11096 case NL80211_CHAN_WIDTH_160: 11097 return 8; 11098 case NL80211_CHAN_WIDTH_320: 11099 return 16; 11100 default: 11101 return 1; 11102 } 11103 } else { 11104 switch (chan_def->width) { 11105 case NL80211_CHAN_WIDTH_20: 11106 return 1; 11107 case NL80211_CHAN_WIDTH_40: 11108 return 2; 11109 case NL80211_CHAN_WIDTH_80: 11110 return 3; 11111 case NL80211_CHAN_WIDTH_160: 11112 return 4; 11113 case NL80211_CHAN_WIDTH_320: 11114 return 5; 11115 default: 11116 return 1; 11117 } 11118 } 11119 } 11120 11121 static u16 ath12k_mac_get_6ghz_start_frequency(struct cfg80211_chan_def *chan_def) 11122 { 11123 u16 diff_seq; 11124 11125 /* It is to get the lowest channel number's center frequency of the chan. 11126 * For example, 11127 * bandwidth=40 MHz, center frequency is 5965, lowest channel is 1 11128 * with center frequency 5955, its diff is 5965 - 5955 = 10. 11129 * bandwidth=80 MHz, center frequency is 5985, lowest channel is 1 11130 * with center frequency 5955, its diff is 5985 - 5955 = 30. 11131 * bandwidth=160 MHz, center frequency is 6025, lowest channel is 1 11132 * with center frequency 5955, its diff is 6025 - 5955 = 70. 11133 * bandwidth=320 MHz, center frequency is 6105, lowest channel is 1 11134 * with center frequency 5955, its diff is 6105 - 5955 = 70. 11135 */ 11136 switch (chan_def->width) { 11137 case NL80211_CHAN_WIDTH_320: 11138 diff_seq = 150; 11139 break; 11140 case NL80211_CHAN_WIDTH_160: 11141 diff_seq = 70; 11142 break; 11143 case NL80211_CHAN_WIDTH_80: 11144 diff_seq = 30; 11145 break; 11146 case NL80211_CHAN_WIDTH_40: 11147 diff_seq = 10; 11148 break; 11149 default: 11150 diff_seq = 0; 11151 } 11152 11153 return chan_def->center_freq1 - diff_seq; 11154 } 11155 11156 static u16 ath12k_mac_get_seg_freq(struct cfg80211_chan_def *chan_def, 11157 u16 start_seq, u8 seq) 11158 { 11159 u16 seg_seq; 11160 11161 /* It is to get the center frequency of the specific bandwidth. 11162 * start_seq means the lowest channel number's center frequency. 11163 * seq 0/1/2/3 means 20 MHz/40 MHz/80 MHz/160 MHz. 11164 * For example, 11165 * lowest channel is 1, its center frequency 5955, 11166 * center frequency is 5955 when bandwidth=20 MHz, its diff is 5955 - 5955 = 0. 11167 * lowest channel is 1, its center frequency 5955, 11168 * center frequency is 5965 when bandwidth=40 MHz, its diff is 5965 - 5955 = 10. 11169 * lowest channel is 1, its center frequency 5955, 11170 * center frequency is 5985 when bandwidth=80 MHz, its diff is 5985 - 5955 = 30. 11171 * lowest channel is 1, its center frequency 5955, 11172 * center frequency is 6025 when bandwidth=160 MHz, its diff is 6025 - 5955 = 70. 11173 */ 11174 seg_seq = 10 * (BIT(seq) - 1); 11175 return seg_seq + start_seq; 11176 } 11177 11178 static void ath12k_mac_get_psd_channel(struct ath12k *ar, 11179 u16 step_freq, 11180 u16 *start_freq, 11181 u16 *center_freq, 11182 u8 i, 11183 struct ieee80211_channel **temp_chan, 11184 s8 *tx_power) 11185 { 11186 /* It is to get the center frequency for each 20 MHz. 11187 * For example, if the chan is 160 MHz and center frequency is 6025, 11188 * then it include 8 channels, they are 1/5/9/13/17/21/25/29, 11189 * channel number 1's center frequency is 5955, it is parameter start_freq. 11190 * parameter i is the step of the 8 channels. i is 0~7 for the 8 channels. 11191 * the channel 1/5/9/13/17/21/25/29 maps i=0/1/2/3/4/5/6/7, 11192 * and maps its center frequency is 5955/5975/5995/6015/6035/6055/6075/6095, 11193 * the gap is 20 for each channel, parameter step_freq means the gap. 11194 * after get the center frequency of each channel, it is easy to find the 11195 * struct ieee80211_channel of it and get the max_reg_power. 11196 */ 11197 *center_freq = *start_freq + i * step_freq; 11198 *temp_chan = ieee80211_get_channel(ar->ah->hw->wiphy, *center_freq); 11199 *tx_power = (*temp_chan)->max_reg_power; 11200 } 11201 11202 static void ath12k_mac_get_eirp_power(struct ath12k *ar, 11203 u16 *start_freq, 11204 u16 *center_freq, 11205 u8 i, 11206 struct ieee80211_channel **temp_chan, 11207 struct cfg80211_chan_def *def, 11208 s8 *tx_power) 11209 { 11210 /* It is to get the center frequency for 20 MHz/40 MHz/80 MHz/ 11211 * 160 MHz bandwidth, and then plus 10 to the center frequency, 11212 * it is the center frequency of a channel number. 11213 * For example, when configured channel number is 1. 11214 * center frequency is 5965 when bandwidth=40 MHz, after plus 10, it is 5975, 11215 * then it is channel number 5. 11216 * center frequency is 5985 when bandwidth=80 MHz, after plus 10, it is 5995, 11217 * then it is channel number 9. 11218 * center frequency is 6025 when bandwidth=160 MHz, after plus 10, it is 6035, 11219 * then it is channel number 17. 11220 * after get the center frequency of each channel, it is easy to find the 11221 * struct ieee80211_channel of it and get the max_reg_power. 11222 */ 11223 *center_freq = ath12k_mac_get_seg_freq(def, *start_freq, i); 11224 11225 /* For the 20 MHz, its center frequency is same with same channel */ 11226 if (i != 0) 11227 *center_freq += 10; 11228 11229 *temp_chan = ieee80211_get_channel(ar->ah->hw->wiphy, *center_freq); 11230 *tx_power = (*temp_chan)->max_reg_power; 11231 } 11232 11233 void ath12k_mac_fill_reg_tpc_info(struct ath12k *ar, 11234 struct ath12k_link_vif *arvif, 11235 struct ieee80211_chanctx_conf *ctx) 11236 { 11237 struct ath12k_base *ab = ar->ab; 11238 struct ath12k_reg_tpc_power_info *reg_tpc_info = &arvif->reg_tpc_info; 11239 struct ieee80211_bss_conf *bss_conf = ath12k_mac_get_link_bss_conf(arvif); 11240 struct ieee80211_channel *chan, *temp_chan; 11241 u8 pwr_lvl_idx, num_pwr_levels, pwr_reduction; 11242 bool is_psd_power = false, is_tpe_present = false; 11243 s8 max_tx_power[ATH12K_NUM_PWR_LEVELS], 11244 psd_power, tx_power, eirp_power; 11245 struct ath12k_vif *ahvif = arvif->ahvif; 11246 u16 start_freq, center_freq; 11247 u8 reg_6ghz_power_mode; 11248 11249 chan = ctx->def.chan; 11250 start_freq = ath12k_mac_get_6ghz_start_frequency(&ctx->def); 11251 pwr_reduction = bss_conf->pwr_reduction; 11252 11253 if (arvif->reg_tpc_info.num_pwr_levels) { 11254 is_tpe_present = true; 11255 num_pwr_levels = arvif->reg_tpc_info.num_pwr_levels; 11256 } else { 11257 num_pwr_levels = ath12k_mac_get_num_pwr_levels(&ctx->def); 11258 } 11259 11260 for (pwr_lvl_idx = 0; pwr_lvl_idx < num_pwr_levels; pwr_lvl_idx++) { 11261 /* STA received TPE IE*/ 11262 if (is_tpe_present) { 11263 /* local power is PSD power*/ 11264 if (chan->flags & IEEE80211_CHAN_PSD) { 11265 /* Connecting AP is psd power */ 11266 if (reg_tpc_info->is_psd_power) { 11267 is_psd_power = true; 11268 ath12k_mac_get_psd_channel(ar, 20, 11269 &start_freq, 11270 ¢er_freq, 11271 pwr_lvl_idx, 11272 &temp_chan, 11273 &tx_power); 11274 psd_power = temp_chan->psd; 11275 eirp_power = tx_power; 11276 max_tx_power[pwr_lvl_idx] = 11277 min_t(s8, 11278 psd_power, 11279 reg_tpc_info->tpe[pwr_lvl_idx]); 11280 /* Connecting AP is not psd power */ 11281 } else { 11282 ath12k_mac_get_eirp_power(ar, 11283 &start_freq, 11284 ¢er_freq, 11285 pwr_lvl_idx, 11286 &temp_chan, 11287 &ctx->def, 11288 &tx_power); 11289 psd_power = temp_chan->psd; 11290 /* convert psd power to EIRP power based 11291 * on channel width 11292 */ 11293 tx_power = 11294 min_t(s8, tx_power, 11295 psd_power + 13 + pwr_lvl_idx * 3); 11296 max_tx_power[pwr_lvl_idx] = 11297 min_t(s8, 11298 tx_power, 11299 reg_tpc_info->tpe[pwr_lvl_idx]); 11300 } 11301 /* local power is not PSD power */ 11302 } else { 11303 /* Connecting AP is psd power */ 11304 if (reg_tpc_info->is_psd_power) { 11305 is_psd_power = true; 11306 ath12k_mac_get_psd_channel(ar, 20, 11307 &start_freq, 11308 ¢er_freq, 11309 pwr_lvl_idx, 11310 &temp_chan, 11311 &tx_power); 11312 eirp_power = tx_power; 11313 max_tx_power[pwr_lvl_idx] = 11314 reg_tpc_info->tpe[pwr_lvl_idx]; 11315 /* Connecting AP is not psd power */ 11316 } else { 11317 ath12k_mac_get_eirp_power(ar, 11318 &start_freq, 11319 ¢er_freq, 11320 pwr_lvl_idx, 11321 &temp_chan, 11322 &ctx->def, 11323 &tx_power); 11324 max_tx_power[pwr_lvl_idx] = 11325 min_t(s8, 11326 tx_power, 11327 reg_tpc_info->tpe[pwr_lvl_idx]); 11328 } 11329 } 11330 /* STA not received TPE IE */ 11331 } else { 11332 /* local power is PSD power*/ 11333 if (chan->flags & IEEE80211_CHAN_PSD) { 11334 is_psd_power = true; 11335 ath12k_mac_get_psd_channel(ar, 20, 11336 &start_freq, 11337 ¢er_freq, 11338 pwr_lvl_idx, 11339 &temp_chan, 11340 &tx_power); 11341 psd_power = temp_chan->psd; 11342 eirp_power = tx_power; 11343 max_tx_power[pwr_lvl_idx] = psd_power; 11344 } else { 11345 ath12k_mac_get_eirp_power(ar, 11346 &start_freq, 11347 ¢er_freq, 11348 pwr_lvl_idx, 11349 &temp_chan, 11350 &ctx->def, 11351 &tx_power); 11352 max_tx_power[pwr_lvl_idx] = tx_power; 11353 } 11354 } 11355 11356 if (is_psd_power) { 11357 /* If AP local power constraint is present */ 11358 if (pwr_reduction) 11359 eirp_power = eirp_power - pwr_reduction; 11360 11361 /* If firmware updated max tx power is non zero, then take 11362 * the min of firmware updated ap tx power 11363 * and max power derived from above mentioned parameters. 11364 */ 11365 ath12k_dbg(ab, ATH12K_DBG_MAC, 11366 "eirp power : %d firmware report power : %d\n", 11367 eirp_power, ar->max_allowed_tx_power); 11368 /* Firmware reports lower max_allowed_tx_power during vdev 11369 * start response. In case of 6 GHz, firmware is not aware 11370 * of EIRP power unless driver sets EIRP power through WMI 11371 * TPC command. So radio which does not support idle power 11372 * save can set maximum calculated EIRP power directly to 11373 * firmware through TPC command without min comparison with 11374 * vdev start response's max_allowed_tx_power. 11375 */ 11376 if (ar->max_allowed_tx_power && ab->hw_params->idle_ps) 11377 eirp_power = min_t(s8, 11378 eirp_power, 11379 ar->max_allowed_tx_power); 11380 } else { 11381 /* If AP local power constraint is present */ 11382 if (pwr_reduction) 11383 max_tx_power[pwr_lvl_idx] = 11384 max_tx_power[pwr_lvl_idx] - pwr_reduction; 11385 /* If firmware updated max tx power is non zero, then take 11386 * the min of firmware updated ap tx power 11387 * and max power derived from above mentioned parameters. 11388 */ 11389 if (ar->max_allowed_tx_power && ab->hw_params->idle_ps) 11390 max_tx_power[pwr_lvl_idx] = 11391 min_t(s8, 11392 max_tx_power[pwr_lvl_idx], 11393 ar->max_allowed_tx_power); 11394 } 11395 reg_tpc_info->chan_power_info[pwr_lvl_idx].chan_cfreq = center_freq; 11396 reg_tpc_info->chan_power_info[pwr_lvl_idx].tx_power = 11397 max_tx_power[pwr_lvl_idx]; 11398 } 11399 11400 reg_tpc_info->num_pwr_levels = num_pwr_levels; 11401 reg_tpc_info->is_psd_power = is_psd_power; 11402 reg_tpc_info->eirp_power = eirp_power; 11403 if (ahvif->vdev_type == WMI_VDEV_TYPE_STA) 11404 reg_6ghz_power_mode = bss_conf->power_type; 11405 else 11406 /* For now, LPI is the only supported AP power mode */ 11407 reg_6ghz_power_mode = IEEE80211_REG_LPI_AP; 11408 11409 reg_tpc_info->ap_power_type = 11410 ath12k_reg_ap_pwr_convert(reg_6ghz_power_mode); 11411 } 11412 11413 static void ath12k_mac_parse_tx_pwr_env(struct ath12k *ar, 11414 struct ath12k_link_vif *arvif) 11415 { 11416 struct ieee80211_bss_conf *bss_conf = ath12k_mac_get_link_bss_conf(arvif); 11417 struct ath12k_reg_tpc_power_info *tpc_info = &arvif->reg_tpc_info; 11418 struct ieee80211_parsed_tpe_eirp *local_non_psd, *reg_non_psd; 11419 struct ieee80211_parsed_tpe_psd *local_psd, *reg_psd; 11420 struct ieee80211_parsed_tpe *tpe = &bss_conf->tpe; 11421 enum wmi_reg_6g_client_type client_type; 11422 struct ath12k_reg_info *reg_info; 11423 struct ath12k_base *ab = ar->ab; 11424 bool psd_valid, non_psd_valid; 11425 int i; 11426 11427 reg_info = ab->reg_info[ar->pdev_idx]; 11428 client_type = reg_info->client_type; 11429 11430 local_psd = &tpe->psd_local[client_type]; 11431 reg_psd = &tpe->psd_reg_client[client_type]; 11432 local_non_psd = &tpe->max_local[client_type]; 11433 reg_non_psd = &tpe->max_reg_client[client_type]; 11434 11435 psd_valid = local_psd->valid | reg_psd->valid; 11436 non_psd_valid = local_non_psd->valid | reg_non_psd->valid; 11437 11438 if (!psd_valid && !non_psd_valid) { 11439 ath12k_warn(ab, 11440 "no transmit power envelope match client power type %d\n", 11441 client_type); 11442 return; 11443 } 11444 11445 if (psd_valid) { 11446 tpc_info->is_psd_power = true; 11447 11448 tpc_info->num_pwr_levels = max(local_psd->count, 11449 reg_psd->count); 11450 if (tpc_info->num_pwr_levels > ATH12K_NUM_PWR_LEVELS) 11451 tpc_info->num_pwr_levels = ATH12K_NUM_PWR_LEVELS; 11452 11453 for (i = 0; i < tpc_info->num_pwr_levels; i++) { 11454 tpc_info->tpe[i] = min(local_psd->power[i], 11455 reg_psd->power[i]) / 2; 11456 ath12k_dbg(ab, ATH12K_DBG_MAC, 11457 "TPE PSD power[%d] : %d\n", 11458 i, tpc_info->tpe[i]); 11459 } 11460 } else { 11461 tpc_info->is_psd_power = false; 11462 tpc_info->eirp_power = 0; 11463 11464 tpc_info->num_pwr_levels = max(local_non_psd->count, 11465 reg_non_psd->count); 11466 if (tpc_info->num_pwr_levels > ATH12K_NUM_PWR_LEVELS) 11467 tpc_info->num_pwr_levels = ATH12K_NUM_PWR_LEVELS; 11468 11469 for (i = 0; i < tpc_info->num_pwr_levels; i++) { 11470 tpc_info->tpe[i] = min(local_non_psd->power[i], 11471 reg_non_psd->power[i]) / 2; 11472 ath12k_dbg(ab, ATH12K_DBG_MAC, 11473 "non PSD power[%d] : %d\n", 11474 i, tpc_info->tpe[i]); 11475 } 11476 } 11477 } 11478 11479 static int 11480 ath12k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw, 11481 struct ieee80211_vif *vif, 11482 struct ieee80211_bss_conf *link_conf, 11483 struct ieee80211_chanctx_conf *ctx) 11484 { 11485 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 11486 struct ath12k *ar; 11487 struct ath12k_base *ab; 11488 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 11489 u8 link_id = link_conf->link_id; 11490 struct ath12k_link_vif *arvif; 11491 int ret; 11492 11493 lockdep_assert_wiphy(hw->wiphy); 11494 11495 /* For multi radio wiphy, the vdev was not created during add_interface 11496 * create now since we have a channel ctx now to assign to a specific ar/fw 11497 */ 11498 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id); 11499 if (!arvif) { 11500 WARN_ON(1); 11501 return -ENOMEM; 11502 } 11503 11504 ar = ath12k_mac_assign_vif_to_vdev(hw, arvif, ctx); 11505 if (!ar) { 11506 ath12k_hw_warn(ah, "failed to assign chanctx for vif %pM link id %u link vif is already started", 11507 vif->addr, link_id); 11508 return -EINVAL; 11509 } 11510 11511 ab = ar->ab; 11512 11513 ath12k_dbg(ab, ATH12K_DBG_MAC, 11514 "mac chanctx assign ptr %p vdev_id %i\n", 11515 ctx, arvif->vdev_id); 11516 11517 if (ath12k_wmi_supports_6ghz_cc_ext(ar) && 11518 ctx->def.chan->band == NL80211_BAND_6GHZ && 11519 ahvif->vdev_type == WMI_VDEV_TYPE_STA) 11520 ath12k_mac_parse_tx_pwr_env(ar, arvif); 11521 11522 arvif->punct_bitmap = ctx->def.punctured; 11523 11524 /* for some targets bss peer must be created before vdev_start */ 11525 if (ab->hw_params->vdev_start_delay && 11526 ahvif->vdev_type != WMI_VDEV_TYPE_AP && 11527 ahvif->vdev_type != WMI_VDEV_TYPE_MONITOR && 11528 !ath12k_peer_exist_by_vdev_id(ab, arvif->vdev_id)) { 11529 ret = 0; 11530 goto out; 11531 } 11532 11533 if (WARN_ON(arvif->is_started)) { 11534 ret = -EBUSY; 11535 goto out; 11536 } 11537 11538 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { 11539 ret = ath12k_mac_monitor_start(ar); 11540 if (ret) { 11541 ath12k_mac_monitor_vdev_delete(ar); 11542 goto out; 11543 } 11544 11545 arvif->is_started = true; 11546 goto out; 11547 } 11548 11549 ret = ath12k_mac_vdev_start(arvif, ctx); 11550 if (ret) { 11551 ath12k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n", 11552 arvif->vdev_id, vif->addr, 11553 ctx->def.chan->center_freq, ret); 11554 goto out; 11555 } 11556 11557 arvif->is_started = true; 11558 11559 /* TODO: Setup ps and cts/rts protection */ 11560 11561 out: 11562 return ret; 11563 } 11564 11565 static void 11566 ath12k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw, 11567 struct ieee80211_vif *vif, 11568 struct ieee80211_bss_conf *link_conf, 11569 struct ieee80211_chanctx_conf *ctx) 11570 { 11571 struct ath12k *ar; 11572 struct ath12k_base *ab; 11573 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 11574 struct ath12k_link_vif *arvif; 11575 u8 link_id = link_conf->link_id; 11576 int ret; 11577 11578 lockdep_assert_wiphy(hw->wiphy); 11579 11580 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 11581 11582 /* The vif is expected to be attached to an ar's VDEV. 11583 * We leave the vif/vdev in this function as is 11584 * and not delete the vdev symmetric to assign_vif_chanctx() 11585 * the VDEV will be deleted and unassigned either during 11586 * remove_interface() or when there is a change in channel 11587 * that moves the vif to a new ar 11588 */ 11589 if (!arvif || !arvif->is_created) 11590 return; 11591 11592 ar = arvif->ar; 11593 ab = ar->ab; 11594 11595 ath12k_dbg(ab, ATH12K_DBG_MAC, 11596 "mac chanctx unassign ptr %p vdev_id %i\n", 11597 ctx, arvif->vdev_id); 11598 11599 WARN_ON(!arvif->is_started); 11600 11601 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { 11602 ret = ath12k_mac_monitor_stop(ar); 11603 if (ret) 11604 return; 11605 11606 arvif->is_started = false; 11607 } 11608 11609 if (ahvif->vdev_type != WMI_VDEV_TYPE_STA && 11610 ahvif->vdev_type != WMI_VDEV_TYPE_MONITOR) { 11611 ath12k_bss_disassoc(ar, arvif); 11612 ret = ath12k_mac_vdev_stop(arvif); 11613 if (ret) 11614 ath12k_warn(ab, "failed to stop vdev %i: %d\n", 11615 arvif->vdev_id, ret); 11616 } 11617 arvif->is_started = false; 11618 11619 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ab->wmi_ab.svc_map) && 11620 ahvif->vdev_type == WMI_VDEV_TYPE_STA && 11621 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE && 11622 ar->state_11d != ATH12K_11D_PREPARING) { 11623 reinit_completion(&ar->completed_11d_scan); 11624 ar->state_11d = ATH12K_11D_PREPARING; 11625 } 11626 11627 if (ar->scan.arvif == arvif && ar->scan.state == ATH12K_SCAN_RUNNING) { 11628 ath12k_scan_abort(ar); 11629 ar->scan.arvif = NULL; 11630 } 11631 } 11632 11633 static int 11634 ath12k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw, 11635 struct ieee80211_vif_chanctx_switch *vifs, 11636 int n_vifs, 11637 enum ieee80211_chanctx_switch_mode mode) 11638 { 11639 struct ath12k *ar; 11640 11641 lockdep_assert_wiphy(hw->wiphy); 11642 11643 ar = ath12k_get_ar_by_ctx(hw, vifs->old_ctx); 11644 if (!ar) 11645 return -EINVAL; 11646 11647 /* Switching channels across radio is not allowed */ 11648 if (ar != ath12k_get_ar_by_ctx(hw, vifs->new_ctx)) 11649 return -EINVAL; 11650 11651 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 11652 "mac chanctx switch n_vifs %d mode %d\n", 11653 n_vifs, mode); 11654 ath12k_mac_update_vif_chan(ar, vifs, n_vifs); 11655 11656 return 0; 11657 } 11658 11659 static int 11660 ath12k_set_vdev_param_to_all_vifs(struct ath12k *ar, int param, u32 value) 11661 { 11662 struct ath12k_link_vif *arvif; 11663 int ret = 0; 11664 11665 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 11666 11667 list_for_each_entry(arvif, &ar->arvifs, list) { 11668 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "setting mac vdev %d param %d value %d\n", 11669 param, arvif->vdev_id, value); 11670 11671 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 11672 param, value); 11673 if (ret) { 11674 ath12k_warn(ar->ab, "failed to set param %d for vdev %d: %d\n", 11675 param, arvif->vdev_id, ret); 11676 break; 11677 } 11678 } 11679 11680 return ret; 11681 } 11682 11683 /* mac80211 stores device specific RTS/Fragmentation threshold value, 11684 * this is set interface specific to firmware from ath12k driver 11685 */ 11686 static int ath12k_mac_op_set_rts_threshold(struct ieee80211_hw *hw, 11687 int radio_idx, u32 value) 11688 { 11689 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 11690 struct ath12k *ar; 11691 int param_id = WMI_VDEV_PARAM_RTS_THRESHOLD, ret = 0, i; 11692 11693 lockdep_assert_wiphy(hw->wiphy); 11694 11695 /* Currently we set the rts threshold value to all the vifs across 11696 * all radios of the single wiphy. 11697 * TODO Once support for vif specific RTS threshold in mac80211 is 11698 * available, ath12k can make use of it. 11699 */ 11700 for_each_ar(ah, ar, i) { 11701 ret = ath12k_set_vdev_param_to_all_vifs(ar, param_id, value); 11702 if (ret) { 11703 ath12k_warn(ar->ab, "failed to set RTS config for all vdevs of pdev %d", 11704 ar->pdev->pdev_id); 11705 break; 11706 } 11707 } 11708 11709 return ret; 11710 } 11711 11712 static int ath12k_mac_op_set_frag_threshold(struct ieee80211_hw *hw, 11713 int radio_idx, u32 value) 11714 { 11715 /* Even though there's a WMI vdev param for fragmentation threshold no 11716 * known firmware actually implements it. Moreover it is not possible to 11717 * rely frame fragmentation to mac80211 because firmware clears the 11718 * "more fragments" bit in frame control making it impossible for remote 11719 * devices to reassemble frames. 11720 * 11721 * Hence implement a dummy callback just to say fragmentation isn't 11722 * supported. This effectively prevents mac80211 from doing frame 11723 * fragmentation in software. 11724 */ 11725 11726 lockdep_assert_wiphy(hw->wiphy); 11727 11728 return -EOPNOTSUPP; 11729 } 11730 11731 static int ath12k_mac_flush(struct ath12k *ar) 11732 { 11733 long time_left; 11734 int ret = 0; 11735 11736 time_left = wait_event_timeout(ar->dp.tx_empty_waitq, 11737 (atomic_read(&ar->dp.num_tx_pending) == 0), 11738 ATH12K_FLUSH_TIMEOUT); 11739 if (time_left == 0) { 11740 ath12k_warn(ar->ab, 11741 "failed to flush transmit queue, data pkts pending %d\n", 11742 atomic_read(&ar->dp.num_tx_pending)); 11743 ret = -ETIMEDOUT; 11744 } 11745 11746 time_left = wait_event_timeout(ar->txmgmt_empty_waitq, 11747 (atomic_read(&ar->num_pending_mgmt_tx) == 0), 11748 ATH12K_FLUSH_TIMEOUT); 11749 if (time_left == 0) { 11750 ath12k_warn(ar->ab, 11751 "failed to flush mgmt transmit queue, mgmt pkts pending %d\n", 11752 atomic_read(&ar->num_pending_mgmt_tx)); 11753 ret = -ETIMEDOUT; 11754 } 11755 11756 return ret; 11757 } 11758 11759 int ath12k_mac_wait_tx_complete(struct ath12k *ar) 11760 { 11761 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 11762 11763 ath12k_mac_drain_tx(ar); 11764 return ath12k_mac_flush(ar); 11765 } 11766 11767 static void ath12k_mac_op_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 11768 u32 queues, bool drop) 11769 { 11770 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 11771 struct ath12k_link_vif *arvif; 11772 struct ath12k_vif *ahvif; 11773 unsigned long links; 11774 struct ath12k *ar; 11775 u8 link_id; 11776 int i; 11777 11778 lockdep_assert_wiphy(hw->wiphy); 11779 11780 if (drop) 11781 return; 11782 11783 /* vif can be NULL when flush() is considered for hw */ 11784 if (!vif) { 11785 for_each_ar(ah, ar, i) 11786 ath12k_mac_flush(ar); 11787 return; 11788 } 11789 11790 for_each_ar(ah, ar, i) 11791 wiphy_work_flush(hw->wiphy, &ar->wmi_mgmt_tx_work); 11792 11793 ahvif = ath12k_vif_to_ahvif(vif); 11794 links = ahvif->links_map; 11795 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) { 11796 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 11797 if (!(arvif && arvif->ar)) 11798 continue; 11799 11800 ath12k_mac_flush(arvif->ar); 11801 } 11802 } 11803 11804 static int 11805 ath12k_mac_bitrate_mask_num_ht_rates(struct ath12k *ar, 11806 enum nl80211_band band, 11807 const struct cfg80211_bitrate_mask *mask) 11808 { 11809 int num_rates = 0; 11810 int i; 11811 11812 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) 11813 num_rates += hweight16(mask->control[band].ht_mcs[i]); 11814 11815 return num_rates; 11816 } 11817 11818 static bool 11819 ath12k_mac_has_single_legacy_rate(struct ath12k *ar, 11820 enum nl80211_band band, 11821 const struct cfg80211_bitrate_mask *mask) 11822 { 11823 int num_rates = 0; 11824 11825 num_rates = hweight32(mask->control[band].legacy); 11826 11827 if (ath12k_mac_bitrate_mask_num_ht_rates(ar, band, mask)) 11828 return false; 11829 11830 if (ath12k_mac_bitrate_mask_num_vht_rates(ar, band, mask)) 11831 return false; 11832 11833 if (ath12k_mac_bitrate_mask_num_he_rates(ar, band, mask)) 11834 return false; 11835 11836 return num_rates == 1; 11837 } 11838 11839 static __le16 11840 ath12k_mac_get_tx_mcs_map(const struct ieee80211_sta_he_cap *he_cap) 11841 { 11842 if (he_cap->he_cap_elem.phy_cap_info[0] & 11843 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G) 11844 return he_cap->he_mcs_nss_supp.tx_mcs_160; 11845 11846 return he_cap->he_mcs_nss_supp.tx_mcs_80; 11847 } 11848 11849 static bool 11850 ath12k_mac_bitrate_mask_get_single_nss(struct ath12k *ar, 11851 struct ieee80211_vif *vif, 11852 enum nl80211_band band, 11853 const struct cfg80211_bitrate_mask *mask, 11854 int *nss) 11855 { 11856 struct ieee80211_supported_band *sband = &ar->mac.sbands[band]; 11857 u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); 11858 const struct ieee80211_sta_he_cap *he_cap; 11859 u16 he_mcs_map = 0; 11860 u8 ht_nss_mask = 0; 11861 u8 vht_nss_mask = 0; 11862 u8 he_nss_mask = 0; 11863 int i; 11864 11865 /* No need to consider legacy here. Basic rates are always present 11866 * in bitrate mask 11867 */ 11868 11869 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) { 11870 if (mask->control[band].ht_mcs[i] == 0) 11871 continue; 11872 else if (mask->control[band].ht_mcs[i] == 11873 sband->ht_cap.mcs.rx_mask[i]) 11874 ht_nss_mask |= BIT(i); 11875 else 11876 return false; 11877 } 11878 11879 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) { 11880 if (mask->control[band].vht_mcs[i] == 0) 11881 continue; 11882 else if (mask->control[band].vht_mcs[i] == 11883 ath12k_mac_get_max_vht_mcs_map(vht_mcs_map, i)) 11884 vht_nss_mask |= BIT(i); 11885 else 11886 return false; 11887 } 11888 11889 he_cap = ieee80211_get_he_iftype_cap_vif(sband, vif); 11890 if (!he_cap) 11891 return false; 11892 11893 he_mcs_map = le16_to_cpu(ath12k_mac_get_tx_mcs_map(he_cap)); 11894 11895 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) { 11896 if (mask->control[band].he_mcs[i] == 0) 11897 continue; 11898 11899 if (mask->control[band].he_mcs[i] == 11900 ath12k_mac_get_max_he_mcs_map(he_mcs_map, i)) 11901 he_nss_mask |= BIT(i); 11902 else 11903 return false; 11904 } 11905 11906 if (ht_nss_mask != vht_nss_mask || ht_nss_mask != he_nss_mask) 11907 return false; 11908 11909 if (ht_nss_mask == 0) 11910 return false; 11911 11912 if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask) 11913 return false; 11914 11915 *nss = fls(ht_nss_mask); 11916 11917 return true; 11918 } 11919 11920 static int 11921 ath12k_mac_get_single_legacy_rate(struct ath12k *ar, 11922 enum nl80211_band band, 11923 const struct cfg80211_bitrate_mask *mask, 11924 u32 *rate, u8 *nss) 11925 { 11926 int rate_idx; 11927 u16 bitrate; 11928 u8 preamble; 11929 u8 hw_rate; 11930 11931 if (hweight32(mask->control[band].legacy) != 1) 11932 return -EINVAL; 11933 11934 rate_idx = ffs(mask->control[band].legacy) - 1; 11935 11936 if (band == NL80211_BAND_5GHZ || band == NL80211_BAND_6GHZ) 11937 rate_idx += ATH12K_MAC_FIRST_OFDM_RATE_IDX; 11938 11939 hw_rate = ath12k_legacy_rates[rate_idx].hw_value; 11940 bitrate = ath12k_legacy_rates[rate_idx].bitrate; 11941 11942 if (ath12k_mac_bitrate_is_cck(bitrate)) 11943 preamble = WMI_RATE_PREAMBLE_CCK; 11944 else 11945 preamble = WMI_RATE_PREAMBLE_OFDM; 11946 11947 *nss = 1; 11948 *rate = ATH12K_HW_RATE_CODE(hw_rate, 0, preamble); 11949 11950 return 0; 11951 } 11952 11953 static int 11954 ath12k_mac_set_fixed_rate_gi_ltf(struct ath12k_link_vif *arvif, u8 he_gi, u8 he_ltf) 11955 { 11956 struct ath12k *ar = arvif->ar; 11957 int ret; 11958 11959 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 11960 11961 /* 0.8 = 0, 1.6 = 2 and 3.2 = 3. */ 11962 if (he_gi && he_gi != 0xFF) 11963 he_gi += 1; 11964 11965 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 11966 WMI_VDEV_PARAM_SGI, he_gi); 11967 if (ret) { 11968 ath12k_warn(ar->ab, "failed to set HE GI:%d, error:%d\n", 11969 he_gi, ret); 11970 return ret; 11971 } 11972 /* start from 1 */ 11973 if (he_ltf != 0xFF) 11974 he_ltf += 1; 11975 11976 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 11977 WMI_VDEV_PARAM_HE_LTF, he_ltf); 11978 if (ret) { 11979 ath12k_warn(ar->ab, "failed to set HE LTF:%d, error:%d\n", 11980 he_ltf, ret); 11981 return ret; 11982 } 11983 return 0; 11984 } 11985 11986 static int 11987 ath12k_mac_set_auto_rate_gi_ltf(struct ath12k_link_vif *arvif, u16 he_gi, u8 he_ltf) 11988 { 11989 struct ath12k *ar = arvif->ar; 11990 int ret; 11991 u32 he_ar_gi_ltf; 11992 11993 if (he_gi != 0xFF) { 11994 switch (he_gi) { 11995 case NL80211_RATE_INFO_HE_GI_0_8: 11996 he_gi = WMI_AUTORATE_800NS_GI; 11997 break; 11998 case NL80211_RATE_INFO_HE_GI_1_6: 11999 he_gi = WMI_AUTORATE_1600NS_GI; 12000 break; 12001 case NL80211_RATE_INFO_HE_GI_3_2: 12002 he_gi = WMI_AUTORATE_3200NS_GI; 12003 break; 12004 default: 12005 ath12k_warn(ar->ab, "Invalid GI\n"); 12006 return -EINVAL; 12007 } 12008 } 12009 12010 if (he_ltf != 0xFF) { 12011 switch (he_ltf) { 12012 case NL80211_RATE_INFO_HE_1XLTF: 12013 he_ltf = WMI_HE_AUTORATE_LTF_1X; 12014 break; 12015 case NL80211_RATE_INFO_HE_2XLTF: 12016 he_ltf = WMI_HE_AUTORATE_LTF_2X; 12017 break; 12018 case NL80211_RATE_INFO_HE_4XLTF: 12019 he_ltf = WMI_HE_AUTORATE_LTF_4X; 12020 break; 12021 default: 12022 ath12k_warn(ar->ab, "Invalid LTF\n"); 12023 return -EINVAL; 12024 } 12025 } 12026 12027 he_ar_gi_ltf = he_gi | he_ltf; 12028 12029 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 12030 WMI_VDEV_PARAM_AUTORATE_MISC_CFG, 12031 he_ar_gi_ltf); 12032 if (ret) { 12033 ath12k_warn(ar->ab, 12034 "failed to set HE autorate GI:%u, LTF:%u params, error:%d\n", 12035 he_gi, he_ltf, ret); 12036 return ret; 12037 } 12038 12039 return 0; 12040 } 12041 12042 static u32 ath12k_mac_nlgi_to_wmigi(enum nl80211_txrate_gi gi) 12043 { 12044 switch (gi) { 12045 case NL80211_TXRATE_DEFAULT_GI: 12046 return WMI_GI_400_NS; 12047 case NL80211_TXRATE_FORCE_LGI: 12048 return WMI_GI_800_NS; 12049 default: 12050 return WMI_GI_400_NS; 12051 } 12052 } 12053 12054 static int ath12k_mac_set_rate_params(struct ath12k_link_vif *arvif, 12055 u32 rate, u8 nss, u8 sgi, u8 ldpc, 12056 u8 he_gi, u8 he_ltf, bool he_fixed_rate) 12057 { 12058 struct ieee80211_bss_conf *link_conf; 12059 struct ath12k *ar = arvif->ar; 12060 u32 vdev_param; 12061 u32 param_value; 12062 int ret; 12063 bool he_support; 12064 12065 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 12066 12067 link_conf = ath12k_mac_get_link_bss_conf(arvif); 12068 if (!link_conf) 12069 return -EINVAL; 12070 12071 he_support = link_conf->he_support; 12072 12073 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 12074 "mac set rate params vdev %i rate 0x%02x nss 0x%02x sgi 0x%02x ldpc 0x%02x\n", 12075 arvif->vdev_id, rate, nss, sgi, ldpc); 12076 12077 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 12078 "he_gi 0x%02x he_ltf 0x%02x he_fixed_rate %d\n", he_gi, 12079 he_ltf, he_fixed_rate); 12080 12081 if (!he_support) { 12082 vdev_param = WMI_VDEV_PARAM_FIXED_RATE; 12083 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 12084 vdev_param, rate); 12085 if (ret) { 12086 ath12k_warn(ar->ab, "failed to set fixed rate param 0x%02x: %d\n", 12087 rate, ret); 12088 return ret; 12089 } 12090 } 12091 12092 vdev_param = WMI_VDEV_PARAM_NSS; 12093 12094 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 12095 vdev_param, nss); 12096 if (ret) { 12097 ath12k_warn(ar->ab, "failed to set nss param %d: %d\n", 12098 nss, ret); 12099 return ret; 12100 } 12101 12102 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 12103 WMI_VDEV_PARAM_LDPC, ldpc); 12104 if (ret) { 12105 ath12k_warn(ar->ab, "failed to set ldpc param %d: %d\n", 12106 ldpc, ret); 12107 return ret; 12108 } 12109 12110 if (he_support) { 12111 if (he_fixed_rate) 12112 ret = ath12k_mac_set_fixed_rate_gi_ltf(arvif, he_gi, he_ltf); 12113 else 12114 ret = ath12k_mac_set_auto_rate_gi_ltf(arvif, he_gi, he_ltf); 12115 if (ret) 12116 return ret; 12117 } else { 12118 vdev_param = WMI_VDEV_PARAM_SGI; 12119 param_value = ath12k_mac_nlgi_to_wmigi(sgi); 12120 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 12121 vdev_param, param_value); 12122 if (ret) { 12123 ath12k_warn(ar->ab, "failed to set sgi param %d: %d\n", 12124 sgi, ret); 12125 return ret; 12126 } 12127 } 12128 12129 return 0; 12130 } 12131 12132 static bool 12133 ath12k_mac_vht_mcs_range_present(struct ath12k *ar, 12134 enum nl80211_band band, 12135 const struct cfg80211_bitrate_mask *mask) 12136 { 12137 int i; 12138 u16 vht_mcs; 12139 12140 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) { 12141 vht_mcs = mask->control[band].vht_mcs[i]; 12142 12143 switch (vht_mcs) { 12144 case 0: 12145 case BIT(8) - 1: 12146 case BIT(9) - 1: 12147 case BIT(10) - 1: 12148 break; 12149 default: 12150 return false; 12151 } 12152 } 12153 12154 return true; 12155 } 12156 12157 static bool 12158 ath12k_mac_he_mcs_range_present(struct ath12k *ar, 12159 enum nl80211_band band, 12160 const struct cfg80211_bitrate_mask *mask) 12161 { 12162 int i; 12163 u16 he_mcs; 12164 12165 for (i = 0; i < NL80211_HE_NSS_MAX; i++) { 12166 he_mcs = mask->control[band].he_mcs[i]; 12167 12168 switch (he_mcs) { 12169 case 0: 12170 case BIT(8) - 1: 12171 case BIT(10) - 1: 12172 case BIT(12) - 1: 12173 break; 12174 default: 12175 return false; 12176 } 12177 } 12178 12179 return true; 12180 } 12181 12182 static void ath12k_mac_set_bitrate_mask_iter(void *data, 12183 struct ieee80211_sta *sta) 12184 { 12185 struct ath12k_link_vif *arvif = data; 12186 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta); 12187 struct ath12k_link_sta *arsta; 12188 struct ath12k *ar = arvif->ar; 12189 12190 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 12191 12192 arsta = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy, 12193 ahsta->link[arvif->link_id]); 12194 if (!arsta || arsta->arvif != arvif) 12195 return; 12196 12197 spin_lock_bh(&ar->data_lock); 12198 arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED; 12199 spin_unlock_bh(&ar->data_lock); 12200 12201 wiphy_work_queue(ath12k_ar_to_hw(ar)->wiphy, &arsta->update_wk); 12202 } 12203 12204 static void ath12k_mac_disable_peer_fixed_rate(void *data, 12205 struct ieee80211_sta *sta) 12206 { 12207 struct ath12k_link_vif *arvif = data; 12208 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta); 12209 struct ath12k_link_sta *arsta; 12210 struct ath12k *ar = arvif->ar; 12211 int ret; 12212 12213 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 12214 12215 arsta = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy, 12216 ahsta->link[arvif->link_id]); 12217 12218 if (!arsta || arsta->arvif != arvif) 12219 return; 12220 12221 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, 12222 arvif->vdev_id, 12223 WMI_PEER_PARAM_FIXED_RATE, 12224 WMI_FIXED_RATE_NONE); 12225 if (ret) 12226 ath12k_warn(ar->ab, 12227 "failed to disable peer fixed rate for STA %pM ret %d\n", 12228 arsta->addr, ret); 12229 } 12230 12231 static bool 12232 ath12k_mac_validate_fixed_rate_settings(struct ath12k *ar, enum nl80211_band band, 12233 const struct cfg80211_bitrate_mask *mask, 12234 unsigned int link_id) 12235 { 12236 bool he_fixed_rate = false, vht_fixed_rate = false; 12237 const u16 *vht_mcs_mask, *he_mcs_mask; 12238 struct ieee80211_link_sta *link_sta; 12239 struct ath12k_peer *peer, *tmp; 12240 u8 vht_nss, he_nss; 12241 int ret = true; 12242 12243 vht_mcs_mask = mask->control[band].vht_mcs; 12244 he_mcs_mask = mask->control[band].he_mcs; 12245 12246 if (ath12k_mac_bitrate_mask_num_vht_rates(ar, band, mask) == 1) 12247 vht_fixed_rate = true; 12248 12249 if (ath12k_mac_bitrate_mask_num_he_rates(ar, band, mask) == 1) 12250 he_fixed_rate = true; 12251 12252 if (!vht_fixed_rate && !he_fixed_rate) 12253 return true; 12254 12255 vht_nss = ath12k_mac_max_vht_nss(vht_mcs_mask); 12256 he_nss = ath12k_mac_max_he_nss(he_mcs_mask); 12257 12258 rcu_read_lock(); 12259 spin_lock_bh(&ar->ab->base_lock); 12260 list_for_each_entry_safe(peer, tmp, &ar->ab->peers, list) { 12261 if (peer->sta) { 12262 link_sta = rcu_dereference(peer->sta->link[link_id]); 12263 if (!link_sta) { 12264 ret = false; 12265 goto exit; 12266 } 12267 12268 if (vht_fixed_rate && (!link_sta->vht_cap.vht_supported || 12269 link_sta->rx_nss < vht_nss)) { 12270 ret = false; 12271 goto exit; 12272 } 12273 if (he_fixed_rate && (!link_sta->he_cap.has_he || 12274 link_sta->rx_nss < he_nss)) { 12275 ret = false; 12276 goto exit; 12277 } 12278 } 12279 } 12280 exit: 12281 spin_unlock_bh(&ar->ab->base_lock); 12282 rcu_read_unlock(); 12283 return ret; 12284 } 12285 12286 static int 12287 ath12k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw, 12288 struct ieee80211_vif *vif, 12289 const struct cfg80211_bitrate_mask *mask) 12290 { 12291 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 12292 struct ath12k_link_vif *arvif; 12293 struct cfg80211_chan_def def; 12294 struct ath12k *ar; 12295 enum nl80211_band band; 12296 const u8 *ht_mcs_mask; 12297 const u16 *vht_mcs_mask; 12298 const u16 *he_mcs_mask; 12299 u8 he_ltf = 0; 12300 u8 he_gi = 0; 12301 u32 rate; 12302 u8 nss, mac_nss; 12303 u8 sgi; 12304 u8 ldpc; 12305 int single_nss; 12306 int ret; 12307 int num_rates; 12308 bool he_fixed_rate = false; 12309 12310 lockdep_assert_wiphy(hw->wiphy); 12311 12312 arvif = &ahvif->deflink; 12313 12314 ar = arvif->ar; 12315 if (ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)) { 12316 ret = -EPERM; 12317 goto out; 12318 } 12319 12320 band = def.chan->band; 12321 ht_mcs_mask = mask->control[band].ht_mcs; 12322 vht_mcs_mask = mask->control[band].vht_mcs; 12323 he_mcs_mask = mask->control[band].he_mcs; 12324 ldpc = !!(ar->ht_cap_info & WMI_HT_CAP_LDPC); 12325 12326 sgi = mask->control[band].gi; 12327 if (sgi == NL80211_TXRATE_FORCE_SGI) { 12328 ret = -EINVAL; 12329 goto out; 12330 } 12331 12332 he_gi = mask->control[band].he_gi; 12333 he_ltf = mask->control[band].he_ltf; 12334 12335 /* mac80211 doesn't support sending a fixed HT/VHT MCS alone, rather it 12336 * requires passing at least one of used basic rates along with them. 12337 * Fixed rate setting across different preambles(legacy, HT, VHT) is 12338 * not supported by the FW. Hence use of FIXED_RATE vdev param is not 12339 * suitable for setting single HT/VHT rates. 12340 * But, there could be a single basic rate passed from userspace which 12341 * can be done through the FIXED_RATE param. 12342 */ 12343 if (ath12k_mac_has_single_legacy_rate(ar, band, mask)) { 12344 ret = ath12k_mac_get_single_legacy_rate(ar, band, mask, &rate, 12345 &nss); 12346 if (ret) { 12347 ath12k_warn(ar->ab, "failed to get single legacy rate for vdev %i: %d\n", 12348 arvif->vdev_id, ret); 12349 goto out; 12350 } 12351 12352 ieee80211_iterate_stations_mtx(hw, 12353 ath12k_mac_disable_peer_fixed_rate, 12354 arvif); 12355 } else if (ath12k_mac_bitrate_mask_get_single_nss(ar, vif, band, mask, 12356 &single_nss)) { 12357 rate = WMI_FIXED_RATE_NONE; 12358 nss = single_nss; 12359 arvif->bitrate_mask = *mask; 12360 12361 ieee80211_iterate_stations_atomic(hw, 12362 ath12k_mac_set_bitrate_mask_iter, 12363 arvif); 12364 } else { 12365 rate = WMI_FIXED_RATE_NONE; 12366 12367 if (!ath12k_mac_validate_fixed_rate_settings(ar, band, 12368 mask, arvif->link_id)) 12369 ath12k_warn(ar->ab, 12370 "failed to update fixed rate settings due to mcs/nss incompatibility\n"); 12371 12372 mac_nss = max3(ath12k_mac_max_ht_nss(ht_mcs_mask), 12373 ath12k_mac_max_vht_nss(vht_mcs_mask), 12374 ath12k_mac_max_he_nss(he_mcs_mask)); 12375 nss = min_t(u32, ar->num_tx_chains, mac_nss); 12376 12377 /* If multiple rates across different preambles are given 12378 * we can reconfigure this info with all peers using PEER_ASSOC 12379 * command with the below exception cases. 12380 * - Single VHT Rate : peer_assoc command accommodates only MCS 12381 * range values i.e 0-7, 0-8, 0-9 for VHT. Though mac80211 12382 * mandates passing basic rates along with HT/VHT rates, FW 12383 * doesn't allow switching from VHT to Legacy. Hence instead of 12384 * setting legacy and VHT rates using RATEMASK_CMD vdev cmd, 12385 * we could set this VHT rate as peer fixed rate param, which 12386 * will override FIXED rate and FW rate control algorithm. 12387 * If single VHT rate is passed along with HT rates, we select 12388 * the VHT rate as fixed rate for vht peers. 12389 * - Multiple VHT Rates : When Multiple VHT rates are given,this 12390 * can be set using RATEMASK CMD which uses FW rate-ctl alg. 12391 * TODO: Setting multiple VHT MCS and replacing peer_assoc with 12392 * RATEMASK_CMDID can cover all use cases of setting rates 12393 * across multiple preambles and rates within same type. 12394 * But requires more validation of the command at this point. 12395 */ 12396 12397 num_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band, 12398 mask); 12399 12400 if (!ath12k_mac_vht_mcs_range_present(ar, band, mask) && 12401 num_rates > 1) { 12402 /* TODO: Handle multiple VHT MCS values setting using 12403 * RATEMASK CMD 12404 */ 12405 ath12k_warn(ar->ab, 12406 "Setting more than one MCS Value in bitrate mask not supported\n"); 12407 ret = -EINVAL; 12408 goto out; 12409 } 12410 12411 num_rates = ath12k_mac_bitrate_mask_num_he_rates(ar, band, mask); 12412 if (num_rates == 1) 12413 he_fixed_rate = true; 12414 12415 if (!ath12k_mac_he_mcs_range_present(ar, band, mask) && 12416 num_rates > 1) { 12417 ath12k_warn(ar->ab, 12418 "Setting more than one HE MCS Value in bitrate mask not supported\n"); 12419 ret = -EINVAL; 12420 goto out; 12421 } 12422 ieee80211_iterate_stations_mtx(hw, 12423 ath12k_mac_disable_peer_fixed_rate, 12424 arvif); 12425 12426 arvif->bitrate_mask = *mask; 12427 ieee80211_iterate_stations_mtx(hw, 12428 ath12k_mac_set_bitrate_mask_iter, 12429 arvif); 12430 } 12431 12432 ret = ath12k_mac_set_rate_params(arvif, rate, nss, sgi, ldpc, he_gi, 12433 he_ltf, he_fixed_rate); 12434 if (ret) { 12435 ath12k_warn(ar->ab, "failed to set rate params on vdev %i: %d\n", 12436 arvif->vdev_id, ret); 12437 } 12438 12439 out: 12440 return ret; 12441 } 12442 12443 static void 12444 ath12k_mac_op_reconfig_complete(struct ieee80211_hw *hw, 12445 enum ieee80211_reconfig_type reconfig_type) 12446 { 12447 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 12448 struct ath12k *ar; 12449 struct ath12k_base *ab; 12450 struct ath12k_vif *ahvif; 12451 struct ath12k_link_vif *arvif; 12452 int recovery_count, i; 12453 12454 lockdep_assert_wiphy(hw->wiphy); 12455 12456 if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART) 12457 return; 12458 12459 guard(mutex)(&ah->hw_mutex); 12460 12461 if (ah->state != ATH12K_HW_STATE_RESTARTED) 12462 return; 12463 12464 ah->state = ATH12K_HW_STATE_ON; 12465 ieee80211_wake_queues(hw); 12466 12467 for_each_ar(ah, ar, i) { 12468 ab = ar->ab; 12469 12470 ath12k_warn(ar->ab, "pdev %d successfully recovered\n", 12471 ar->pdev->pdev_id); 12472 12473 if (ar->ab->hw_params->current_cc_support && 12474 ar->alpha2[0] != 0 && ar->alpha2[1] != 0) { 12475 struct wmi_set_current_country_arg arg = {}; 12476 12477 memcpy(&arg.alpha2, ar->alpha2, 2); 12478 reinit_completion(&ar->regd_update_completed); 12479 ath12k_wmi_send_set_current_country_cmd(ar, &arg); 12480 } 12481 12482 if (ab->is_reset) { 12483 recovery_count = atomic_inc_return(&ab->recovery_count); 12484 12485 ath12k_dbg(ab, ATH12K_DBG_BOOT, "recovery count %d\n", 12486 recovery_count); 12487 12488 /* When there are multiple radios in an SOC, 12489 * the recovery has to be done for each radio 12490 */ 12491 if (recovery_count == ab->num_radios) { 12492 atomic_dec(&ab->reset_count); 12493 complete(&ab->reset_complete); 12494 ab->is_reset = false; 12495 atomic_set(&ab->fail_cont_count, 0); 12496 ath12k_dbg(ab, ATH12K_DBG_BOOT, "reset success\n"); 12497 } 12498 } 12499 12500 list_for_each_entry(arvif, &ar->arvifs, list) { 12501 ahvif = arvif->ahvif; 12502 ath12k_dbg(ab, ATH12K_DBG_BOOT, 12503 "reconfig cipher %d up %d vdev type %d\n", 12504 ahvif->key_cipher, 12505 arvif->is_up, 12506 ahvif->vdev_type); 12507 12508 /* After trigger disconnect, then upper layer will 12509 * trigger connect again, then the PN number of 12510 * upper layer will be reset to keep up with AP 12511 * side, hence PN number mismatch will not happen. 12512 */ 12513 if (arvif->is_up && 12514 ahvif->vdev_type == WMI_VDEV_TYPE_STA && 12515 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) { 12516 ieee80211_hw_restart_disconnect(ahvif->vif); 12517 12518 ath12k_dbg(ab, ATH12K_DBG_BOOT, 12519 "restart disconnect\n"); 12520 } 12521 } 12522 } 12523 } 12524 12525 static void 12526 ath12k_mac_update_bss_chan_survey(struct ath12k *ar, 12527 struct ieee80211_channel *channel) 12528 { 12529 int ret; 12530 enum wmi_bss_chan_info_req_type type = WMI_BSS_SURVEY_REQ_TYPE_READ; 12531 12532 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 12533 12534 if (!test_bit(WMI_TLV_SERVICE_BSS_CHANNEL_INFO_64, ar->ab->wmi_ab.svc_map) || 12535 ar->rx_channel != channel) 12536 return; 12537 12538 if (ar->scan.state != ATH12K_SCAN_IDLE) { 12539 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 12540 "ignoring bss chan info req while scanning..\n"); 12541 return; 12542 } 12543 12544 reinit_completion(&ar->bss_survey_done); 12545 12546 ret = ath12k_wmi_pdev_bss_chan_info_request(ar, type); 12547 if (ret) { 12548 ath12k_warn(ar->ab, "failed to send pdev bss chan info request\n"); 12549 return; 12550 } 12551 12552 ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ); 12553 if (ret == 0) 12554 ath12k_warn(ar->ab, "bss channel survey timed out\n"); 12555 } 12556 12557 static int ath12k_mac_op_get_survey(struct ieee80211_hw *hw, int idx, 12558 struct survey_info *survey) 12559 { 12560 struct ath12k *ar; 12561 struct ieee80211_supported_band *sband; 12562 struct survey_info *ar_survey; 12563 12564 lockdep_assert_wiphy(hw->wiphy); 12565 12566 if (idx >= ATH12K_NUM_CHANS) 12567 return -ENOENT; 12568 12569 sband = hw->wiphy->bands[NL80211_BAND_2GHZ]; 12570 if (sband && idx >= sband->n_channels) { 12571 idx -= sband->n_channels; 12572 sband = NULL; 12573 } 12574 12575 if (!sband) 12576 sband = hw->wiphy->bands[NL80211_BAND_5GHZ]; 12577 if (sband && idx >= sband->n_channels) { 12578 idx -= sband->n_channels; 12579 sband = NULL; 12580 } 12581 12582 if (!sband) 12583 sband = hw->wiphy->bands[NL80211_BAND_6GHZ]; 12584 12585 if (!sband || idx >= sband->n_channels) 12586 return -ENOENT; 12587 12588 ar = ath12k_mac_get_ar_by_chan(hw, &sband->channels[idx]); 12589 if (!ar) { 12590 if (sband->channels[idx].flags & IEEE80211_CHAN_DISABLED) { 12591 memset(survey, 0, sizeof(*survey)); 12592 return 0; 12593 } 12594 return -ENOENT; 12595 } 12596 12597 ar_survey = &ar->survey[idx]; 12598 12599 ath12k_mac_update_bss_chan_survey(ar, &sband->channels[idx]); 12600 12601 spin_lock_bh(&ar->data_lock); 12602 memcpy(survey, ar_survey, sizeof(*survey)); 12603 spin_unlock_bh(&ar->data_lock); 12604 12605 survey->channel = &sband->channels[idx]; 12606 12607 if (ar->rx_channel == survey->channel) 12608 survey->filled |= SURVEY_INFO_IN_USE; 12609 12610 return 0; 12611 } 12612 12613 static void ath12k_mac_op_sta_statistics(struct ieee80211_hw *hw, 12614 struct ieee80211_vif *vif, 12615 struct ieee80211_sta *sta, 12616 struct station_info *sinfo) 12617 { 12618 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta); 12619 struct ath12k_fw_stats_req_params params = {}; 12620 struct ath12k_link_sta *arsta; 12621 s8 signal, noise_floor; 12622 struct ath12k *ar; 12623 bool db2dbm; 12624 12625 lockdep_assert_wiphy(hw->wiphy); 12626 12627 arsta = &ahsta->deflink; 12628 ar = ath12k_get_ar_by_vif(hw, vif, arsta->link_id); 12629 if (!ar) 12630 return; 12631 12632 db2dbm = test_bit(WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT, 12633 ar->ab->wmi_ab.svc_map); 12634 12635 sinfo->rx_duration = arsta->rx_duration; 12636 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION); 12637 12638 sinfo->tx_duration = arsta->tx_duration; 12639 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION); 12640 12641 if (arsta->txrate.legacy || arsta->txrate.nss) { 12642 if (arsta->txrate.legacy) { 12643 sinfo->txrate.legacy = arsta->txrate.legacy; 12644 } else { 12645 sinfo->txrate.mcs = arsta->txrate.mcs; 12646 sinfo->txrate.nss = arsta->txrate.nss; 12647 sinfo->txrate.bw = arsta->txrate.bw; 12648 sinfo->txrate.he_gi = arsta->txrate.he_gi; 12649 sinfo->txrate.he_dcm = arsta->txrate.he_dcm; 12650 sinfo->txrate.he_ru_alloc = arsta->txrate.he_ru_alloc; 12651 sinfo->txrate.eht_gi = arsta->txrate.eht_gi; 12652 sinfo->txrate.eht_ru_alloc = arsta->txrate.eht_ru_alloc; 12653 } 12654 sinfo->txrate.flags = arsta->txrate.flags; 12655 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE); 12656 } 12657 12658 /* TODO: Use real NF instead of default one. */ 12659 signal = arsta->rssi_comb; 12660 12661 params.pdev_id = ar->pdev->pdev_id; 12662 params.vdev_id = 0; 12663 params.stats_id = WMI_REQUEST_VDEV_STAT; 12664 12665 if (!signal && 12666 ahsta->ahvif->vdev_type == WMI_VDEV_TYPE_STA && 12667 !(ath12k_mac_get_fw_stats(ar, ¶ms))) 12668 signal = arsta->rssi_beacon; 12669 12670 spin_lock_bh(&ar->data_lock); 12671 noise_floor = ath12k_pdev_get_noise_floor(ar); 12672 spin_unlock_bh(&ar->data_lock); 12673 12674 if (signal) { 12675 sinfo->signal = db2dbm ? signal : signal + noise_floor; 12676 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL); 12677 } 12678 12679 sinfo->signal_avg = ewma_avg_rssi_read(&arsta->avg_rssi); 12680 12681 if (!db2dbm) 12682 sinfo->signal_avg += noise_floor; 12683 12684 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG); 12685 12686 sinfo->tx_retries = arsta->tx_retry_count; 12687 sinfo->tx_failed = arsta->tx_retry_failed; 12688 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES); 12689 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED); 12690 } 12691 12692 static void ath12k_mac_op_link_sta_statistics(struct ieee80211_hw *hw, 12693 struct ieee80211_vif *vif, 12694 struct ieee80211_link_sta *link_sta, 12695 struct link_station_info *link_sinfo) 12696 { 12697 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(link_sta->sta); 12698 struct ath12k_fw_stats_req_params params = {}; 12699 struct ath12k_link_sta *arsta; 12700 struct ath12k *ar; 12701 s8 signal; 12702 bool db2dbm; 12703 12704 lockdep_assert_wiphy(hw->wiphy); 12705 12706 arsta = wiphy_dereference(hw->wiphy, ahsta->link[link_sta->link_id]); 12707 12708 if (!arsta) 12709 return; 12710 12711 ar = ath12k_get_ar_by_vif(hw, vif, arsta->link_id); 12712 if (!ar) 12713 return; 12714 12715 db2dbm = test_bit(WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT, 12716 ar->ab->wmi_ab.svc_map); 12717 12718 link_sinfo->rx_duration = arsta->rx_duration; 12719 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION); 12720 12721 link_sinfo->tx_duration = arsta->tx_duration; 12722 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION); 12723 12724 if (arsta->txrate.legacy || arsta->txrate.nss) { 12725 if (arsta->txrate.legacy) { 12726 link_sinfo->txrate.legacy = arsta->txrate.legacy; 12727 } else { 12728 link_sinfo->txrate.mcs = arsta->txrate.mcs; 12729 link_sinfo->txrate.nss = arsta->txrate.nss; 12730 link_sinfo->txrate.bw = arsta->txrate.bw; 12731 link_sinfo->txrate.he_gi = arsta->txrate.he_gi; 12732 link_sinfo->txrate.he_dcm = arsta->txrate.he_dcm; 12733 link_sinfo->txrate.he_ru_alloc = 12734 arsta->txrate.he_ru_alloc; 12735 link_sinfo->txrate.eht_gi = arsta->txrate.eht_gi; 12736 link_sinfo->txrate.eht_ru_alloc = 12737 arsta->txrate.eht_ru_alloc; 12738 } 12739 link_sinfo->txrate.flags = arsta->txrate.flags; 12740 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE); 12741 } 12742 12743 /* TODO: Use real NF instead of default one. */ 12744 signal = arsta->rssi_comb; 12745 12746 params.pdev_id = ar->pdev->pdev_id; 12747 params.vdev_id = 0; 12748 params.stats_id = WMI_REQUEST_VDEV_STAT; 12749 12750 if (!signal && 12751 ahsta->ahvif->vdev_type == WMI_VDEV_TYPE_STA && 12752 !(ath12k_mac_get_fw_stats(ar, ¶ms))) 12753 signal = arsta->rssi_beacon; 12754 12755 if (signal) { 12756 link_sinfo->signal = 12757 db2dbm ? signal : signal + ATH12K_DEFAULT_NOISE_FLOOR; 12758 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL); 12759 } 12760 12761 link_sinfo->signal_avg = ewma_avg_rssi_read(&arsta->avg_rssi); 12762 12763 if (!db2dbm) 12764 link_sinfo->signal_avg += ATH12K_DEFAULT_NOISE_FLOOR; 12765 12766 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG); 12767 12768 link_sinfo->tx_retries = arsta->tx_retry_count; 12769 link_sinfo->tx_failed = arsta->tx_retry_failed; 12770 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES); 12771 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED); 12772 } 12773 12774 static int ath12k_mac_op_cancel_remain_on_channel(struct ieee80211_hw *hw, 12775 struct ieee80211_vif *vif) 12776 { 12777 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 12778 struct ath12k *ar; 12779 12780 ar = ath12k_ah_to_ar(ah, 0); 12781 12782 lockdep_assert_wiphy(hw->wiphy); 12783 12784 spin_lock_bh(&ar->data_lock); 12785 ar->scan.roc_notify = false; 12786 spin_unlock_bh(&ar->data_lock); 12787 12788 ath12k_scan_abort(ar); 12789 12790 cancel_delayed_work_sync(&ar->scan.timeout); 12791 wiphy_work_cancel(hw->wiphy, &ar->scan.vdev_clean_wk); 12792 12793 return 0; 12794 } 12795 12796 static int ath12k_mac_op_remain_on_channel(struct ieee80211_hw *hw, 12797 struct ieee80211_vif *vif, 12798 struct ieee80211_channel *chan, 12799 int duration, 12800 enum ieee80211_roc_type type) 12801 { 12802 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 12803 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 12804 struct ath12k_link_vif *arvif; 12805 struct ath12k *ar; 12806 u32 scan_time_msec; 12807 bool create = true; 12808 u8 link_id; 12809 int ret; 12810 12811 lockdep_assert_wiphy(hw->wiphy); 12812 12813 ar = ath12k_mac_select_scan_device(hw, vif, chan->center_freq); 12814 if (!ar) 12815 return -EINVAL; 12816 12817 /* check if any of the links of ML VIF is already started on 12818 * radio(ar) corresponding to given scan frequency and use it, 12819 * if not use deflink(link 0) for scan purpose. 12820 */ 12821 12822 link_id = ath12k_mac_find_link_id_by_ar(ahvif, ar); 12823 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id); 12824 /* If the vif is already assigned to a specific vdev of an ar, 12825 * check whether its already started, vdev which is started 12826 * are not allowed to switch to a new radio. 12827 * If the vdev is not started, but was earlier created on a 12828 * different ar, delete that vdev and create a new one. We don't 12829 * delete at the scan stop as an optimization to avoid redundant 12830 * delete-create vdev's for the same ar, in case the request is 12831 * always on the same band for the vif 12832 */ 12833 if (arvif->is_created) { 12834 if (WARN_ON(!arvif->ar)) 12835 return -EINVAL; 12836 12837 if (ar != arvif->ar && arvif->is_started) 12838 return -EBUSY; 12839 12840 if (ar != arvif->ar) { 12841 ath12k_mac_remove_link_interface(hw, arvif); 12842 ath12k_mac_unassign_link_vif(arvif); 12843 } else { 12844 create = false; 12845 } 12846 } 12847 12848 if (create) { 12849 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id); 12850 12851 ret = ath12k_mac_vdev_create(ar, arvif); 12852 if (ret) { 12853 ath12k_warn(ar->ab, "unable to create scan vdev for roc: %d\n", 12854 ret); 12855 return ret; 12856 } 12857 } 12858 12859 spin_lock_bh(&ar->data_lock); 12860 12861 switch (ar->scan.state) { 12862 case ATH12K_SCAN_IDLE: 12863 reinit_completion(&ar->scan.started); 12864 reinit_completion(&ar->scan.completed); 12865 reinit_completion(&ar->scan.on_channel); 12866 ar->scan.state = ATH12K_SCAN_STARTING; 12867 ar->scan.is_roc = true; 12868 ar->scan.arvif = arvif; 12869 ar->scan.roc_freq = chan->center_freq; 12870 ar->scan.roc_notify = true; 12871 ret = 0; 12872 break; 12873 case ATH12K_SCAN_STARTING: 12874 case ATH12K_SCAN_RUNNING: 12875 case ATH12K_SCAN_ABORTING: 12876 ret = -EBUSY; 12877 break; 12878 } 12879 12880 spin_unlock_bh(&ar->data_lock); 12881 12882 if (ret) 12883 return ret; 12884 12885 scan_time_msec = hw->wiphy->max_remain_on_channel_duration * 2; 12886 12887 struct ath12k_wmi_scan_req_arg *arg __free(kfree) = 12888 kzalloc(sizeof(*arg), GFP_KERNEL); 12889 if (!arg) 12890 return -ENOMEM; 12891 12892 ath12k_wmi_start_scan_init(ar, arg); 12893 arg->num_chan = 1; 12894 12895 u32 *chan_list __free(kfree) = kcalloc(arg->num_chan, sizeof(*chan_list), 12896 GFP_KERNEL); 12897 if (!chan_list) 12898 return -ENOMEM; 12899 12900 arg->chan_list = chan_list; 12901 arg->vdev_id = arvif->vdev_id; 12902 arg->scan_id = ATH12K_SCAN_ID; 12903 arg->chan_list[0] = chan->center_freq; 12904 arg->dwell_time_active = scan_time_msec; 12905 arg->dwell_time_passive = scan_time_msec; 12906 arg->max_scan_time = scan_time_msec; 12907 arg->scan_f_passive = 1; 12908 arg->burst_duration = duration; 12909 12910 ret = ath12k_start_scan(ar, arg); 12911 if (ret) { 12912 ath12k_warn(ar->ab, "failed to start roc scan: %d\n", ret); 12913 12914 spin_lock_bh(&ar->data_lock); 12915 ar->scan.state = ATH12K_SCAN_IDLE; 12916 spin_unlock_bh(&ar->data_lock); 12917 return ret; 12918 } 12919 12920 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3 * HZ); 12921 if (ret == 0) { 12922 ath12k_warn(ar->ab, "failed to switch to channel for roc scan\n"); 12923 ret = ath12k_scan_stop(ar); 12924 if (ret) 12925 ath12k_warn(ar->ab, "failed to stop scan: %d\n", ret); 12926 return -ETIMEDOUT; 12927 } 12928 12929 ieee80211_queue_delayed_work(hw, &ar->scan.timeout, 12930 msecs_to_jiffies(duration)); 12931 12932 return 0; 12933 } 12934 12935 static void ath12k_mac_op_set_rekey_data(struct ieee80211_hw *hw, 12936 struct ieee80211_vif *vif, 12937 struct cfg80211_gtk_rekey_data *data) 12938 { 12939 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 12940 struct ath12k_rekey_data *rekey_data; 12941 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 12942 struct ath12k *ar = ath12k_ah_to_ar(ah, 0); 12943 struct ath12k_link_vif *arvif; 12944 12945 lockdep_assert_wiphy(hw->wiphy); 12946 12947 arvif = &ahvif->deflink; 12948 rekey_data = &arvif->rekey_data; 12949 12950 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac set rekey data vdev %d\n", 12951 arvif->vdev_id); 12952 12953 memcpy(rekey_data->kck, data->kck, NL80211_KCK_LEN); 12954 memcpy(rekey_data->kek, data->kek, NL80211_KEK_LEN); 12955 12956 /* The supplicant works on big-endian, the firmware expects it on 12957 * little endian. 12958 */ 12959 rekey_data->replay_ctr = get_unaligned_be64(data->replay_ctr); 12960 12961 arvif->rekey_data.enable_offload = true; 12962 12963 ath12k_dbg_dump(ar->ab, ATH12K_DBG_MAC, "kck", NULL, 12964 rekey_data->kck, NL80211_KCK_LEN); 12965 ath12k_dbg_dump(ar->ab, ATH12K_DBG_MAC, "kek", NULL, 12966 rekey_data->kck, NL80211_KEK_LEN); 12967 ath12k_dbg_dump(ar->ab, ATH12K_DBG_MAC, "replay ctr", NULL, 12968 &rekey_data->replay_ctr, sizeof(rekey_data->replay_ctr)); 12969 } 12970 12971 static const struct ieee80211_ops ath12k_ops = { 12972 .tx = ath12k_mac_op_tx, 12973 .wake_tx_queue = ieee80211_handle_wake_tx_queue, 12974 .start = ath12k_mac_op_start, 12975 .stop = ath12k_mac_op_stop, 12976 .reconfig_complete = ath12k_mac_op_reconfig_complete, 12977 .add_interface = ath12k_mac_op_add_interface, 12978 .remove_interface = ath12k_mac_op_remove_interface, 12979 .update_vif_offload = ath12k_mac_op_update_vif_offload, 12980 .config = ath12k_mac_op_config, 12981 .link_info_changed = ath12k_mac_op_link_info_changed, 12982 .vif_cfg_changed = ath12k_mac_op_vif_cfg_changed, 12983 .change_vif_links = ath12k_mac_op_change_vif_links, 12984 .configure_filter = ath12k_mac_op_configure_filter, 12985 .hw_scan = ath12k_mac_op_hw_scan, 12986 .cancel_hw_scan = ath12k_mac_op_cancel_hw_scan, 12987 .set_key = ath12k_mac_op_set_key, 12988 .set_rekey_data = ath12k_mac_op_set_rekey_data, 12989 .sta_state = ath12k_mac_op_sta_state, 12990 .sta_set_txpwr = ath12k_mac_op_sta_set_txpwr, 12991 .link_sta_rc_update = ath12k_mac_op_link_sta_rc_update, 12992 .conf_tx = ath12k_mac_op_conf_tx, 12993 .set_antenna = ath12k_mac_op_set_antenna, 12994 .get_antenna = ath12k_mac_op_get_antenna, 12995 .ampdu_action = ath12k_mac_op_ampdu_action, 12996 .add_chanctx = ath12k_mac_op_add_chanctx, 12997 .remove_chanctx = ath12k_mac_op_remove_chanctx, 12998 .change_chanctx = ath12k_mac_op_change_chanctx, 12999 .assign_vif_chanctx = ath12k_mac_op_assign_vif_chanctx, 13000 .unassign_vif_chanctx = ath12k_mac_op_unassign_vif_chanctx, 13001 .switch_vif_chanctx = ath12k_mac_op_switch_vif_chanctx, 13002 .get_txpower = ath12k_mac_op_get_txpower, 13003 .set_rts_threshold = ath12k_mac_op_set_rts_threshold, 13004 .set_frag_threshold = ath12k_mac_op_set_frag_threshold, 13005 .set_bitrate_mask = ath12k_mac_op_set_bitrate_mask, 13006 .get_survey = ath12k_mac_op_get_survey, 13007 .flush = ath12k_mac_op_flush, 13008 .sta_statistics = ath12k_mac_op_sta_statistics, 13009 .link_sta_statistics = ath12k_mac_op_link_sta_statistics, 13010 .remain_on_channel = ath12k_mac_op_remain_on_channel, 13011 .cancel_remain_on_channel = ath12k_mac_op_cancel_remain_on_channel, 13012 .change_sta_links = ath12k_mac_op_change_sta_links, 13013 .can_activate_links = ath12k_mac_op_can_activate_links, 13014 #ifdef CONFIG_PM 13015 .suspend = ath12k_wow_op_suspend, 13016 .resume = ath12k_wow_op_resume, 13017 .set_wakeup = ath12k_wow_op_set_wakeup, 13018 #endif 13019 #ifdef CONFIG_ATH12K_DEBUGFS 13020 .vif_add_debugfs = ath12k_debugfs_op_vif_add, 13021 #endif 13022 CFG80211_TESTMODE_CMD(ath12k_tm_cmd) 13023 #ifdef CONFIG_ATH12K_DEBUGFS 13024 .link_sta_add_debugfs = ath12k_debugfs_link_sta_op_add, 13025 #endif 13026 }; 13027 13028 void ath12k_mac_update_freq_range(struct ath12k *ar, 13029 u32 freq_low, u32 freq_high) 13030 { 13031 if (!(freq_low && freq_high)) 13032 return; 13033 13034 if (ar->freq_range.start_freq || ar->freq_range.end_freq) { 13035 ar->freq_range.start_freq = min(ar->freq_range.start_freq, 13036 MHZ_TO_KHZ(freq_low)); 13037 ar->freq_range.end_freq = max(ar->freq_range.end_freq, 13038 MHZ_TO_KHZ(freq_high)); 13039 } else { 13040 ar->freq_range.start_freq = MHZ_TO_KHZ(freq_low); 13041 ar->freq_range.end_freq = MHZ_TO_KHZ(freq_high); 13042 } 13043 13044 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 13045 "mac pdev %u freq limit updated. New range %u->%u MHz\n", 13046 ar->pdev->pdev_id, KHZ_TO_MHZ(ar->freq_range.start_freq), 13047 KHZ_TO_MHZ(ar->freq_range.end_freq)); 13048 } 13049 13050 static void ath12k_mac_update_ch_list(struct ath12k *ar, 13051 struct ieee80211_supported_band *band, 13052 u32 freq_low, u32 freq_high) 13053 { 13054 int i; 13055 13056 if (!(freq_low && freq_high)) 13057 return; 13058 13059 for (i = 0; i < band->n_channels; i++) { 13060 if (band->channels[i].center_freq < freq_low || 13061 band->channels[i].center_freq > freq_high) 13062 band->channels[i].flags |= IEEE80211_CHAN_DISABLED; 13063 } 13064 } 13065 13066 static u32 ath12k_get_phy_id(struct ath12k *ar, u32 band) 13067 { 13068 struct ath12k_pdev *pdev = ar->pdev; 13069 struct ath12k_pdev_cap *pdev_cap = &pdev->cap; 13070 13071 if (band == WMI_HOST_WLAN_2GHZ_CAP) 13072 return pdev_cap->band[NL80211_BAND_2GHZ].phy_id; 13073 13074 if (band == WMI_HOST_WLAN_5GHZ_CAP) 13075 return pdev_cap->band[NL80211_BAND_5GHZ].phy_id; 13076 13077 ath12k_warn(ar->ab, "unsupported phy cap:%d\n", band); 13078 13079 return 0; 13080 } 13081 13082 static int ath12k_mac_update_band(struct ath12k *ar, 13083 struct ieee80211_supported_band *orig_band, 13084 struct ieee80211_supported_band *new_band) 13085 { 13086 int i; 13087 13088 if (!orig_band || !new_band) 13089 return -EINVAL; 13090 13091 if (orig_band->band != new_band->band) 13092 return -EINVAL; 13093 13094 for (i = 0; i < new_band->n_channels; i++) { 13095 if (new_band->channels[i].flags & IEEE80211_CHAN_DISABLED) 13096 continue; 13097 /* An enabled channel in new_band should not be already enabled 13098 * in the orig_band 13099 */ 13100 if (WARN_ON(!(orig_band->channels[i].flags & 13101 IEEE80211_CHAN_DISABLED))) 13102 return -EINVAL; 13103 orig_band->channels[i].flags &= ~IEEE80211_CHAN_DISABLED; 13104 } 13105 return 0; 13106 } 13107 13108 static int ath12k_mac_setup_channels_rates(struct ath12k *ar, 13109 u32 supported_bands, 13110 struct ieee80211_supported_band *bands[]) 13111 { 13112 struct ieee80211_supported_band *band; 13113 struct ath12k_wmi_hal_reg_capabilities_ext_arg *reg_cap; 13114 struct ath12k_base *ab = ar->ab; 13115 u32 phy_id, freq_low, freq_high; 13116 struct ath12k_hw *ah = ar->ah; 13117 void *channels; 13118 int ret; 13119 13120 BUILD_BUG_ON((ARRAY_SIZE(ath12k_2ghz_channels) + 13121 ARRAY_SIZE(ath12k_5ghz_channels) + 13122 ARRAY_SIZE(ath12k_6ghz_channels)) != 13123 ATH12K_NUM_CHANS); 13124 13125 reg_cap = &ab->hal_reg_cap[ar->pdev_idx]; 13126 13127 if (supported_bands & WMI_HOST_WLAN_2GHZ_CAP) { 13128 channels = kmemdup(ath12k_2ghz_channels, 13129 sizeof(ath12k_2ghz_channels), 13130 GFP_KERNEL); 13131 if (!channels) 13132 return -ENOMEM; 13133 13134 band = &ar->mac.sbands[NL80211_BAND_2GHZ]; 13135 band->band = NL80211_BAND_2GHZ; 13136 band->n_channels = ARRAY_SIZE(ath12k_2ghz_channels); 13137 band->channels = channels; 13138 band->n_bitrates = ath12k_g_rates_size; 13139 band->bitrates = ath12k_g_rates; 13140 13141 if (ab->hw_params->single_pdev_only) { 13142 phy_id = ath12k_get_phy_id(ar, WMI_HOST_WLAN_2GHZ_CAP); 13143 reg_cap = &ab->hal_reg_cap[phy_id]; 13144 } 13145 13146 freq_low = max(reg_cap->low_2ghz_chan, 13147 ab->reg_freq_2ghz.start_freq); 13148 freq_high = min(reg_cap->high_2ghz_chan, 13149 ab->reg_freq_2ghz.end_freq); 13150 13151 ath12k_mac_update_ch_list(ar, band, 13152 reg_cap->low_2ghz_chan, 13153 reg_cap->high_2ghz_chan); 13154 13155 ath12k_mac_update_freq_range(ar, freq_low, freq_high); 13156 13157 if (!bands[NL80211_BAND_2GHZ]) { 13158 bands[NL80211_BAND_2GHZ] = band; 13159 } else { 13160 /* Split mac in same band under same wiphy */ 13161 ret = ath12k_mac_update_band(ar, bands[NL80211_BAND_2GHZ], band); 13162 if (ret) { 13163 kfree(channels); 13164 band->channels = NULL; 13165 return ret; 13166 } 13167 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac pdev %u identified as 2 GHz split mac with start freq %d end freq %d", 13168 ar->pdev->pdev_id, 13169 KHZ_TO_MHZ(ar->freq_range.start_freq), 13170 KHZ_TO_MHZ(ar->freq_range.end_freq)); 13171 } 13172 } 13173 13174 if (supported_bands & WMI_HOST_WLAN_5GHZ_CAP) { 13175 if (reg_cap->high_5ghz_chan >= ATH12K_MIN_6GHZ_FREQ) { 13176 channels = kmemdup(ath12k_6ghz_channels, 13177 sizeof(ath12k_6ghz_channels), GFP_KERNEL); 13178 if (!channels) { 13179 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); 13180 return -ENOMEM; 13181 } 13182 13183 ar->supports_6ghz = true; 13184 band = &ar->mac.sbands[NL80211_BAND_6GHZ]; 13185 band->band = NL80211_BAND_6GHZ; 13186 band->n_channels = ARRAY_SIZE(ath12k_6ghz_channels); 13187 band->channels = channels; 13188 band->n_bitrates = ath12k_a_rates_size; 13189 band->bitrates = ath12k_a_rates; 13190 13191 freq_low = max(reg_cap->low_5ghz_chan, 13192 ab->reg_freq_6ghz.start_freq); 13193 freq_high = min(reg_cap->high_5ghz_chan, 13194 ab->reg_freq_6ghz.end_freq); 13195 13196 ath12k_mac_update_ch_list(ar, band, 13197 reg_cap->low_5ghz_chan, 13198 reg_cap->high_5ghz_chan); 13199 13200 ath12k_mac_update_freq_range(ar, freq_low, freq_high); 13201 ah->use_6ghz_regd = true; 13202 13203 if (!bands[NL80211_BAND_6GHZ]) { 13204 bands[NL80211_BAND_6GHZ] = band; 13205 } else { 13206 /* Split mac in same band under same wiphy */ 13207 ret = ath12k_mac_update_band(ar, 13208 bands[NL80211_BAND_6GHZ], 13209 band); 13210 if (ret) { 13211 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); 13212 ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL; 13213 kfree(channels); 13214 band->channels = NULL; 13215 return ret; 13216 } 13217 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac pdev %u identified as 6 GHz split mac with start freq %d end freq %d", 13218 ar->pdev->pdev_id, 13219 KHZ_TO_MHZ(ar->freq_range.start_freq), 13220 KHZ_TO_MHZ(ar->freq_range.end_freq)); 13221 } 13222 } 13223 13224 if (reg_cap->low_5ghz_chan < ATH12K_MIN_6GHZ_FREQ) { 13225 channels = kmemdup(ath12k_5ghz_channels, 13226 sizeof(ath12k_5ghz_channels), 13227 GFP_KERNEL); 13228 if (!channels) { 13229 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); 13230 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels); 13231 return -ENOMEM; 13232 } 13233 13234 band = &ar->mac.sbands[NL80211_BAND_5GHZ]; 13235 band->band = NL80211_BAND_5GHZ; 13236 band->n_channels = ARRAY_SIZE(ath12k_5ghz_channels); 13237 band->channels = channels; 13238 band->n_bitrates = ath12k_a_rates_size; 13239 band->bitrates = ath12k_a_rates; 13240 13241 if (ab->hw_params->single_pdev_only) { 13242 phy_id = ath12k_get_phy_id(ar, WMI_HOST_WLAN_5GHZ_CAP); 13243 reg_cap = &ab->hal_reg_cap[phy_id]; 13244 } 13245 13246 freq_low = max(reg_cap->low_5ghz_chan, 13247 ab->reg_freq_5ghz.start_freq); 13248 freq_high = min(reg_cap->high_5ghz_chan, 13249 ab->reg_freq_5ghz.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 13257 if (!bands[NL80211_BAND_5GHZ]) { 13258 bands[NL80211_BAND_5GHZ] = band; 13259 } else { 13260 /* Split mac in same band under same wiphy */ 13261 ret = ath12k_mac_update_band(ar, 13262 bands[NL80211_BAND_5GHZ], 13263 band); 13264 if (ret) { 13265 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); 13266 ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL; 13267 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels); 13268 ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL; 13269 kfree(channels); 13270 band->channels = NULL; 13271 return ret; 13272 } 13273 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac pdev %u identified as 5 GHz split mac with start freq %d end freq %d", 13274 ar->pdev->pdev_id, 13275 KHZ_TO_MHZ(ar->freq_range.start_freq), 13276 KHZ_TO_MHZ(ar->freq_range.end_freq)); 13277 } 13278 } 13279 } 13280 13281 return 0; 13282 } 13283 13284 static u16 ath12k_mac_get_ifmodes(struct ath12k_hw *ah) 13285 { 13286 struct ath12k *ar; 13287 int i; 13288 u16 interface_modes = U16_MAX; 13289 13290 for_each_ar(ah, ar, i) 13291 interface_modes &= ar->ab->hw_params->interface_modes; 13292 13293 return interface_modes == U16_MAX ? 0 : interface_modes; 13294 } 13295 13296 static bool ath12k_mac_is_iface_mode_enable(struct ath12k_hw *ah, 13297 enum nl80211_iftype type) 13298 { 13299 struct ath12k *ar; 13300 int i; 13301 u16 interface_modes, mode = 0; 13302 bool is_enable = false; 13303 13304 if (type == NL80211_IFTYPE_MESH_POINT) { 13305 if (IS_ENABLED(CONFIG_MAC80211_MESH)) 13306 mode = BIT(type); 13307 } else { 13308 mode = BIT(type); 13309 } 13310 13311 for_each_ar(ah, ar, i) { 13312 interface_modes = ar->ab->hw_params->interface_modes; 13313 if (interface_modes & mode) { 13314 is_enable = true; 13315 break; 13316 } 13317 } 13318 13319 return is_enable; 13320 } 13321 13322 static int 13323 ath12k_mac_setup_radio_iface_comb(struct ath12k *ar, 13324 struct ieee80211_iface_combination *comb) 13325 { 13326 u16 interface_modes = ar->ab->hw_params->interface_modes; 13327 struct ieee80211_iface_limit *limits; 13328 int n_limits, max_interfaces; 13329 bool ap, mesh, p2p; 13330 13331 ap = interface_modes & BIT(NL80211_IFTYPE_AP); 13332 p2p = interface_modes & BIT(NL80211_IFTYPE_P2P_DEVICE); 13333 13334 mesh = IS_ENABLED(CONFIG_MAC80211_MESH) && 13335 (interface_modes & BIT(NL80211_IFTYPE_MESH_POINT)); 13336 13337 if ((ap || mesh) && !p2p) { 13338 n_limits = 2; 13339 max_interfaces = 16; 13340 } else if (p2p) { 13341 n_limits = 3; 13342 if (ap || mesh) 13343 max_interfaces = 16; 13344 else 13345 max_interfaces = 3; 13346 } else { 13347 n_limits = 1; 13348 max_interfaces = 1; 13349 } 13350 13351 limits = kcalloc(n_limits, sizeof(*limits), GFP_KERNEL); 13352 if (!limits) 13353 return -ENOMEM; 13354 13355 limits[0].max = 1; 13356 limits[0].types |= BIT(NL80211_IFTYPE_STATION); 13357 13358 if (ap || mesh || p2p) 13359 limits[1].max = max_interfaces; 13360 13361 if (ap) 13362 limits[1].types |= BIT(NL80211_IFTYPE_AP); 13363 13364 if (mesh) 13365 limits[1].types |= BIT(NL80211_IFTYPE_MESH_POINT); 13366 13367 if (p2p) { 13368 limits[1].types |= BIT(NL80211_IFTYPE_P2P_CLIENT) | 13369 BIT(NL80211_IFTYPE_P2P_GO); 13370 limits[2].max = 1; 13371 limits[2].types |= BIT(NL80211_IFTYPE_P2P_DEVICE); 13372 } 13373 13374 comb[0].limits = limits; 13375 comb[0].n_limits = n_limits; 13376 comb[0].max_interfaces = max_interfaces; 13377 comb[0].beacon_int_infra_match = true; 13378 comb[0].beacon_int_min_gcd = 100; 13379 13380 comb[0].num_different_channels = 1; 13381 comb[0].radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) | 13382 BIT(NL80211_CHAN_WIDTH_20) | 13383 BIT(NL80211_CHAN_WIDTH_40) | 13384 BIT(NL80211_CHAN_WIDTH_80) | 13385 BIT(NL80211_CHAN_WIDTH_160); 13386 13387 return 0; 13388 } 13389 13390 static int 13391 ath12k_mac_setup_global_iface_comb(struct ath12k_hw *ah, 13392 struct wiphy_radio *radio, 13393 u8 n_radio, 13394 struct ieee80211_iface_combination *comb) 13395 { 13396 const struct ieee80211_iface_combination *iter_comb; 13397 struct ieee80211_iface_limit *limits; 13398 int i, j, n_limits; 13399 bool ap, mesh, p2p; 13400 13401 if (!n_radio) 13402 return 0; 13403 13404 ap = ath12k_mac_is_iface_mode_enable(ah, NL80211_IFTYPE_AP); 13405 p2p = ath12k_mac_is_iface_mode_enable(ah, NL80211_IFTYPE_P2P_DEVICE); 13406 mesh = ath12k_mac_is_iface_mode_enable(ah, NL80211_IFTYPE_MESH_POINT); 13407 13408 if ((ap || mesh) && !p2p) 13409 n_limits = 2; 13410 else if (p2p) 13411 n_limits = 3; 13412 else 13413 n_limits = 1; 13414 13415 limits = kcalloc(n_limits, sizeof(*limits), GFP_KERNEL); 13416 if (!limits) 13417 return -ENOMEM; 13418 13419 for (i = 0; i < n_radio; i++) { 13420 iter_comb = radio[i].iface_combinations; 13421 for (j = 0; j < iter_comb->n_limits && j < n_limits; j++) { 13422 limits[j].types |= iter_comb->limits[j].types; 13423 limits[j].max += iter_comb->limits[j].max; 13424 } 13425 13426 comb->max_interfaces += iter_comb->max_interfaces; 13427 comb->num_different_channels += iter_comb->num_different_channels; 13428 comb->radar_detect_widths |= iter_comb->radar_detect_widths; 13429 } 13430 13431 comb->limits = limits; 13432 comb->n_limits = n_limits; 13433 comb->beacon_int_infra_match = true; 13434 comb->beacon_int_min_gcd = 100; 13435 13436 return 0; 13437 } 13438 13439 static 13440 void ath12k_mac_cleanup_iface_comb(const struct ieee80211_iface_combination *iface_comb) 13441 { 13442 kfree(iface_comb[0].limits); 13443 kfree(iface_comb); 13444 } 13445 13446 static void ath12k_mac_cleanup_iface_combinations(struct ath12k_hw *ah) 13447 { 13448 struct wiphy *wiphy = ah->hw->wiphy; 13449 const struct wiphy_radio *radio; 13450 int i; 13451 13452 if (wiphy->n_radio > 0) { 13453 radio = wiphy->radio; 13454 for (i = 0; i < wiphy->n_radio; i++) 13455 ath12k_mac_cleanup_iface_comb(radio[i].iface_combinations); 13456 13457 kfree(wiphy->radio); 13458 } 13459 13460 ath12k_mac_cleanup_iface_comb(wiphy->iface_combinations); 13461 } 13462 13463 static int ath12k_mac_setup_iface_combinations(struct ath12k_hw *ah) 13464 { 13465 struct ieee80211_iface_combination *combinations, *comb; 13466 struct wiphy *wiphy = ah->hw->wiphy; 13467 struct wiphy_radio *radio; 13468 int n_combinations = 1; 13469 struct ath12k *ar; 13470 int i, ret; 13471 13472 if (ah->num_radio == 1) { 13473 ar = &ah->radio[0]; 13474 13475 if (ar->ab->hw_params->single_pdev_only) 13476 n_combinations = 2; 13477 13478 combinations = kcalloc(n_combinations, sizeof(*combinations), 13479 GFP_KERNEL); 13480 if (!combinations) 13481 return -ENOMEM; 13482 13483 ret = ath12k_mac_setup_radio_iface_comb(ar, combinations); 13484 if (ret) { 13485 ath12k_hw_warn(ah, "failed to setup radio interface combinations for one radio: %d", 13486 ret); 13487 goto err_free_combinations; 13488 } 13489 13490 if (ar->ab->hw_params->single_pdev_only) { 13491 comb = combinations + 1; 13492 memcpy(comb, combinations, sizeof(*comb)); 13493 comb->num_different_channels = 2; 13494 comb->radar_detect_widths = 0; 13495 } 13496 13497 goto out; 13498 } 13499 13500 combinations = kcalloc(n_combinations, sizeof(*combinations), GFP_KERNEL); 13501 if (!combinations) 13502 return -ENOMEM; 13503 13504 /* there are multiple radios */ 13505 13506 radio = kcalloc(ah->num_radio, sizeof(*radio), GFP_KERNEL); 13507 if (!radio) { 13508 ret = -ENOMEM; 13509 goto err_free_combinations; 13510 } 13511 13512 for_each_ar(ah, ar, i) { 13513 comb = kzalloc(sizeof(*comb), GFP_KERNEL); 13514 if (!comb) { 13515 ret = -ENOMEM; 13516 goto err_free_radios; 13517 } 13518 13519 ret = ath12k_mac_setup_radio_iface_comb(ar, comb); 13520 if (ret) { 13521 ath12k_hw_warn(ah, "failed to setup radio interface combinations for radio %d: %d", 13522 i, ret); 13523 kfree(comb); 13524 goto err_free_radios; 13525 } 13526 13527 radio[i].freq_range = &ar->freq_range; 13528 radio[i].n_freq_range = 1; 13529 13530 radio[i].iface_combinations = comb; 13531 radio[i].n_iface_combinations = 1; 13532 } 13533 13534 ret = ath12k_mac_setup_global_iface_comb(ah, radio, ah->num_radio, combinations); 13535 if (ret) { 13536 ath12k_hw_warn(ah, "failed to setup global interface combinations: %d", 13537 ret); 13538 goto err_free_all_radios; 13539 } 13540 13541 wiphy->radio = radio; 13542 wiphy->n_radio = ah->num_radio; 13543 13544 out: 13545 wiphy->iface_combinations = combinations; 13546 wiphy->n_iface_combinations = n_combinations; 13547 13548 return 0; 13549 13550 err_free_all_radios: 13551 i = ah->num_radio; 13552 13553 err_free_radios: 13554 while (i--) 13555 ath12k_mac_cleanup_iface_comb(radio[i].iface_combinations); 13556 13557 kfree(radio); 13558 13559 err_free_combinations: 13560 kfree(combinations); 13561 13562 return ret; 13563 } 13564 13565 static const u8 ath12k_if_types_ext_capa[] = { 13566 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING, 13567 [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT, 13568 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF, 13569 }; 13570 13571 static const u8 ath12k_if_types_ext_capa_sta[] = { 13572 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING, 13573 [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT, 13574 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF, 13575 [9] = WLAN_EXT_CAPA10_TWT_REQUESTER_SUPPORT, 13576 }; 13577 13578 static const u8 ath12k_if_types_ext_capa_ap[] = { 13579 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING, 13580 [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT, 13581 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF, 13582 [9] = WLAN_EXT_CAPA10_TWT_RESPONDER_SUPPORT, 13583 [10] = WLAN_EXT_CAPA11_EMA_SUPPORT, 13584 }; 13585 13586 static struct wiphy_iftype_ext_capab ath12k_iftypes_ext_capa[] = { 13587 { 13588 .extended_capabilities = ath12k_if_types_ext_capa, 13589 .extended_capabilities_mask = ath12k_if_types_ext_capa, 13590 .extended_capabilities_len = sizeof(ath12k_if_types_ext_capa), 13591 }, { 13592 .iftype = NL80211_IFTYPE_STATION, 13593 .extended_capabilities = ath12k_if_types_ext_capa_sta, 13594 .extended_capabilities_mask = ath12k_if_types_ext_capa_sta, 13595 .extended_capabilities_len = 13596 sizeof(ath12k_if_types_ext_capa_sta), 13597 }, { 13598 .iftype = NL80211_IFTYPE_AP, 13599 .extended_capabilities = ath12k_if_types_ext_capa_ap, 13600 .extended_capabilities_mask = ath12k_if_types_ext_capa_ap, 13601 .extended_capabilities_len = 13602 sizeof(ath12k_if_types_ext_capa_ap), 13603 .eml_capabilities = 0, 13604 .mld_capa_and_ops = 0, 13605 }, 13606 }; 13607 13608 static void ath12k_mac_cleanup_unregister(struct ath12k *ar) 13609 { 13610 idr_for_each(&ar->txmgmt_idr, ath12k_mac_tx_mgmt_pending_free, ar); 13611 idr_destroy(&ar->txmgmt_idr); 13612 13613 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); 13614 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels); 13615 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels); 13616 } 13617 13618 static void ath12k_mac_hw_unregister(struct ath12k_hw *ah) 13619 { 13620 struct ieee80211_hw *hw = ah->hw; 13621 struct ath12k *ar; 13622 int i; 13623 13624 for_each_ar(ah, ar, i) { 13625 cancel_work_sync(&ar->regd_channel_update_work); 13626 cancel_work_sync(&ar->regd_update_work); 13627 ath12k_debugfs_unregister(ar); 13628 ath12k_fw_stats_reset(ar); 13629 } 13630 13631 ieee80211_unregister_hw(hw); 13632 13633 for_each_ar(ah, ar, i) 13634 ath12k_mac_cleanup_unregister(ar); 13635 13636 ath12k_mac_cleanup_iface_combinations(ah); 13637 13638 SET_IEEE80211_DEV(hw, NULL); 13639 } 13640 13641 static int ath12k_mac_setup_register(struct ath12k *ar, 13642 u32 *ht_cap, 13643 struct ieee80211_supported_band *bands[]) 13644 { 13645 struct ath12k_pdev_cap *cap = &ar->pdev->cap; 13646 int ret; 13647 13648 init_waitqueue_head(&ar->txmgmt_empty_waitq); 13649 idr_init(&ar->txmgmt_idr); 13650 spin_lock_init(&ar->txmgmt_idr_lock); 13651 13652 ath12k_pdev_caps_update(ar); 13653 13654 ret = ath12k_mac_setup_channels_rates(ar, 13655 cap->supported_bands, 13656 bands); 13657 if (ret) 13658 return ret; 13659 13660 ath12k_mac_setup_ht_vht_cap(ar, cap, ht_cap); 13661 ath12k_mac_setup_sband_iftype_data(ar, cap); 13662 13663 ar->max_num_stations = ath12k_core_get_max_station_per_radio(ar->ab); 13664 ar->max_num_peers = ath12k_core_get_max_peers_per_radio(ar->ab); 13665 13666 ar->rssi_info.min_nf_dbm = ATH12K_DEFAULT_NOISE_FLOOR; 13667 ar->rssi_info.temp_offset = 0; 13668 ar->rssi_info.noise_floor = ar->rssi_info.min_nf_dbm + ar->rssi_info.temp_offset; 13669 13670 return 0; 13671 } 13672 13673 static int ath12k_mac_hw_register(struct ath12k_hw *ah) 13674 { 13675 struct ieee80211_hw *hw = ah->hw; 13676 struct wiphy *wiphy = hw->wiphy; 13677 struct ath12k *ar = ath12k_ah_to_ar(ah, 0); 13678 struct ath12k_base *ab = ar->ab; 13679 struct ath12k_pdev *pdev; 13680 struct ath12k_pdev_cap *cap; 13681 static const u32 cipher_suites[] = { 13682 WLAN_CIPHER_SUITE_TKIP, 13683 WLAN_CIPHER_SUITE_CCMP, 13684 WLAN_CIPHER_SUITE_AES_CMAC, 13685 WLAN_CIPHER_SUITE_BIP_CMAC_256, 13686 WLAN_CIPHER_SUITE_BIP_GMAC_128, 13687 WLAN_CIPHER_SUITE_BIP_GMAC_256, 13688 WLAN_CIPHER_SUITE_GCMP, 13689 WLAN_CIPHER_SUITE_GCMP_256, 13690 WLAN_CIPHER_SUITE_CCMP_256, 13691 }; 13692 int ret, i, j; 13693 u32 ht_cap = U32_MAX, antennas_rx = 0, antennas_tx = 0; 13694 bool is_6ghz = false, is_raw_mode = false, is_monitor_disable = false; 13695 u8 *mac_addr = NULL; 13696 u8 mbssid_max_interfaces = 0; 13697 13698 wiphy->max_ap_assoc_sta = 0; 13699 13700 for_each_ar(ah, ar, i) { 13701 u32 ht_cap_info = 0; 13702 13703 pdev = ar->pdev; 13704 if (ar->ab->pdevs_macaddr_valid) { 13705 ether_addr_copy(ar->mac_addr, pdev->mac_addr); 13706 } else { 13707 ether_addr_copy(ar->mac_addr, ar->ab->mac_addr); 13708 ar->mac_addr[4] += ar->pdev_idx; 13709 } 13710 13711 ret = ath12k_mac_setup_register(ar, &ht_cap_info, hw->wiphy->bands); 13712 if (ret) 13713 goto err_cleanup_unregister; 13714 13715 /* 6 GHz does not support HT Cap, hence do not consider it */ 13716 if (!ar->supports_6ghz) 13717 ht_cap &= ht_cap_info; 13718 13719 wiphy->max_ap_assoc_sta += ar->max_num_stations; 13720 13721 /* Advertise the max antenna support of all radios, driver can handle 13722 * per pdev specific antenna setting based on pdev cap when antenna 13723 * changes are made 13724 */ 13725 cap = &pdev->cap; 13726 13727 antennas_rx = max_t(u32, antennas_rx, cap->rx_chain_mask); 13728 antennas_tx = max_t(u32, antennas_tx, cap->tx_chain_mask); 13729 13730 if (ar->supports_6ghz) 13731 is_6ghz = true; 13732 13733 if (test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags)) 13734 is_raw_mode = true; 13735 13736 if (!ar->ab->hw_params->supports_monitor) 13737 is_monitor_disable = true; 13738 13739 if (i == 0) 13740 mac_addr = ar->mac_addr; 13741 else 13742 mac_addr = ab->mac_addr; 13743 13744 mbssid_max_interfaces += TARGET_NUM_VDEVS(ar->ab); 13745 } 13746 13747 wiphy->available_antennas_rx = antennas_rx; 13748 wiphy->available_antennas_tx = antennas_tx; 13749 13750 SET_IEEE80211_PERM_ADDR(hw, mac_addr); 13751 SET_IEEE80211_DEV(hw, ab->dev); 13752 13753 ret = ath12k_mac_setup_iface_combinations(ah); 13754 if (ret) { 13755 ath12k_err(ab, "failed to setup interface combinations: %d\n", ret); 13756 goto err_complete_cleanup_unregister; 13757 } 13758 13759 wiphy->interface_modes = ath12k_mac_get_ifmodes(ah); 13760 13761 if (ah->num_radio == 1 && 13762 wiphy->bands[NL80211_BAND_2GHZ] && 13763 wiphy->bands[NL80211_BAND_5GHZ] && 13764 wiphy->bands[NL80211_BAND_6GHZ]) 13765 ieee80211_hw_set(hw, SINGLE_SCAN_ON_ALL_BANDS); 13766 13767 ieee80211_hw_set(hw, SIGNAL_DBM); 13768 ieee80211_hw_set(hw, SUPPORTS_PS); 13769 ieee80211_hw_set(hw, SUPPORTS_DYNAMIC_PS); 13770 ieee80211_hw_set(hw, MFP_CAPABLE); 13771 ieee80211_hw_set(hw, REPORTS_TX_ACK_STATUS); 13772 ieee80211_hw_set(hw, HAS_RATE_CONTROL); 13773 ieee80211_hw_set(hw, AP_LINK_PS); 13774 ieee80211_hw_set(hw, SPECTRUM_MGMT); 13775 ieee80211_hw_set(hw, CONNECTION_MONITOR); 13776 ieee80211_hw_set(hw, SUPPORTS_PER_STA_GTK); 13777 ieee80211_hw_set(hw, CHANCTX_STA_CSA); 13778 ieee80211_hw_set(hw, QUEUE_CONTROL); 13779 ieee80211_hw_set(hw, SUPPORTS_TX_FRAG); 13780 ieee80211_hw_set(hw, REPORTS_LOW_ACK); 13781 ieee80211_hw_set(hw, NO_VIRTUAL_MONITOR); 13782 13783 if (test_bit(WMI_TLV_SERVICE_ETH_OFFLOAD, ar->wmi->wmi_ab->svc_map)) { 13784 ieee80211_hw_set(hw, SUPPORTS_TX_ENCAP_OFFLOAD); 13785 ieee80211_hw_set(hw, SUPPORTS_RX_DECAP_OFFLOAD); 13786 } 13787 13788 if (cap->nss_ratio_enabled) 13789 ieee80211_hw_set(hw, SUPPORTS_VHT_EXT_NSS_BW); 13790 13791 if ((ht_cap & WMI_HT_CAP_ENABLED) || is_6ghz) { 13792 ieee80211_hw_set(hw, AMPDU_AGGREGATION); 13793 ieee80211_hw_set(hw, TX_AMPDU_SETUP_IN_HW); 13794 ieee80211_hw_set(hw, SUPPORTS_REORDERING_BUFFER); 13795 ieee80211_hw_set(hw, SUPPORTS_AMSDU_IN_AMPDU); 13796 ieee80211_hw_set(hw, USES_RSS); 13797 } 13798 13799 wiphy->features |= NL80211_FEATURE_STATIC_SMPS; 13800 wiphy->flags |= WIPHY_FLAG_IBSS_RSN; 13801 13802 /* TODO: Check if HT capability advertised from firmware is different 13803 * for each band for a dual band capable radio. It will be tricky to 13804 * handle it when the ht capability different for each band. 13805 */ 13806 if (ht_cap & WMI_HT_CAP_DYNAMIC_SMPS || 13807 (is_6ghz && ab->hw_params->supports_dynamic_smps_6ghz)) 13808 wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS; 13809 13810 wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID; 13811 wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN; 13812 13813 hw->max_listen_interval = ATH12K_MAX_HW_LISTEN_INTERVAL; 13814 13815 wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL; 13816 wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH; 13817 wiphy->max_remain_on_channel_duration = 5000; 13818 13819 wiphy->flags |= WIPHY_FLAG_AP_UAPSD; 13820 wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE | 13821 NL80211_FEATURE_AP_SCAN; 13822 13823 wiphy->features |= NL80211_FEATURE_TX_POWER_INSERTION; 13824 13825 /* MLO is not yet supported so disable Wireless Extensions for now 13826 * to make sure ath12k users don't use it. This flag can be removed 13827 * once WIPHY_FLAG_SUPPORTS_MLO is enabled. 13828 */ 13829 wiphy->flags |= WIPHY_FLAG_DISABLE_WEXT; 13830 13831 /* Copy over MLO related capabilities received from 13832 * WMI_SERVICE_READY_EXT2_EVENT if single_chip_mlo_supp is set. 13833 */ 13834 if (ab->ag->mlo_capable) { 13835 ath12k_iftypes_ext_capa[2].eml_capabilities = cap->eml_cap; 13836 ath12k_iftypes_ext_capa[2].mld_capa_and_ops = cap->mld_cap; 13837 wiphy->flags |= WIPHY_FLAG_SUPPORTS_MLO; 13838 13839 ieee80211_hw_set(hw, MLO_MCAST_MULTI_LINK_TX); 13840 } 13841 13842 hw->queues = ATH12K_HW_MAX_QUEUES; 13843 wiphy->tx_queue_len = ATH12K_QUEUE_LEN; 13844 hw->offchannel_tx_hw_queue = ATH12K_HW_MAX_QUEUES - 1; 13845 hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF_EHT; 13846 13847 hw->vif_data_size = sizeof(struct ath12k_vif); 13848 hw->sta_data_size = sizeof(struct ath12k_sta); 13849 hw->extra_tx_headroom = ab->hw_params->iova_mask; 13850 13851 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST); 13852 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_STA_TX_PWR); 13853 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT); 13854 13855 wiphy->cipher_suites = cipher_suites; 13856 wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites); 13857 13858 wiphy->iftype_ext_capab = ath12k_iftypes_ext_capa; 13859 wiphy->num_iftype_ext_capab = ARRAY_SIZE(ath12k_iftypes_ext_capa); 13860 13861 wiphy->mbssid_max_interfaces = mbssid_max_interfaces; 13862 wiphy->ema_max_profile_periodicity = TARGET_EMA_MAX_PROFILE_PERIOD; 13863 ieee80211_hw_set(hw, SUPPORTS_MULTI_BSSID); 13864 13865 if (is_6ghz) { 13866 wiphy_ext_feature_set(wiphy, 13867 NL80211_EXT_FEATURE_FILS_DISCOVERY); 13868 wiphy_ext_feature_set(wiphy, 13869 NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP); 13870 } 13871 13872 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_PUNCT); 13873 if (test_bit(WMI_TLV_SERVICE_BEACON_PROTECTION_SUPPORT, ab->wmi_ab.svc_map)) 13874 wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_BEACON_PROTECTION); 13875 13876 ath12k_reg_init(hw); 13877 13878 if (!is_raw_mode) { 13879 hw->netdev_features = NETIF_F_HW_CSUM; 13880 ieee80211_hw_set(hw, SW_CRYPTO_CONTROL); 13881 ieee80211_hw_set(hw, SUPPORT_FAST_XMIT); 13882 } 13883 13884 if (test_bit(WMI_TLV_SERVICE_NLO, ar->wmi->wmi_ab->svc_map)) { 13885 wiphy->max_sched_scan_ssids = WMI_PNO_MAX_SUPP_NETWORKS; 13886 wiphy->max_match_sets = WMI_PNO_MAX_SUPP_NETWORKS; 13887 wiphy->max_sched_scan_ie_len = WMI_PNO_MAX_IE_LENGTH; 13888 wiphy->max_sched_scan_plans = WMI_PNO_MAX_SCHED_SCAN_PLANS; 13889 wiphy->max_sched_scan_plan_interval = 13890 WMI_PNO_MAX_SCHED_SCAN_PLAN_INT; 13891 wiphy->max_sched_scan_plan_iterations = 13892 WMI_PNO_MAX_SCHED_SCAN_PLAN_ITRNS; 13893 wiphy->features |= NL80211_FEATURE_ND_RANDOM_MAC_ADDR; 13894 } 13895 13896 ret = ath12k_wow_init(ar); 13897 if (ret) { 13898 ath12k_warn(ar->ab, "failed to init wow: %d\n", ret); 13899 goto err_cleanup_if_combs; 13900 } 13901 13902 /* Boot-time regulatory updates have already been processed. 13903 * Mark them as complete now, because after registration, 13904 * cfg80211 will notify us again if there are any pending hints. 13905 * We need to wait for those hints to be processed, so it's 13906 * important to mark the boot-time updates as complete before 13907 * proceeding with registration. 13908 */ 13909 for_each_ar(ah, ar, i) 13910 complete_all(&ar->regd_update_completed); 13911 13912 ret = ieee80211_register_hw(hw); 13913 if (ret) { 13914 ath12k_err(ab, "ieee80211 registration failed: %d\n", ret); 13915 goto err_cleanup_if_combs; 13916 } 13917 13918 if (is_monitor_disable) 13919 /* There's a race between calling ieee80211_register_hw() 13920 * and here where the monitor mode is enabled for a little 13921 * while. But that time is so short and in practise it make 13922 * a difference in real life. 13923 */ 13924 wiphy->interface_modes &= ~BIT(NL80211_IFTYPE_MONITOR); 13925 13926 for_each_ar(ah, ar, i) { 13927 /* Apply the regd received during initialization */ 13928 ret = ath12k_regd_update(ar, true); 13929 if (ret) { 13930 ath12k_err(ar->ab, "ath12k regd update failed: %d\n", ret); 13931 goto err_unregister_hw; 13932 } 13933 13934 if (ar->ab->hw_params->current_cc_support && ab->new_alpha2[0]) { 13935 struct wmi_set_current_country_arg current_cc = {}; 13936 13937 memcpy(¤t_cc.alpha2, ab->new_alpha2, 2); 13938 memcpy(&ar->alpha2, ab->new_alpha2, 2); 13939 13940 reinit_completion(&ar->regd_update_completed); 13941 13942 ret = ath12k_wmi_send_set_current_country_cmd(ar, ¤t_cc); 13943 if (ret) 13944 ath12k_warn(ar->ab, 13945 "failed set cc code for mac register: %d\n", 13946 ret); 13947 } 13948 13949 ath12k_fw_stats_init(ar); 13950 ath12k_debugfs_register(ar); 13951 } 13952 13953 return 0; 13954 13955 err_unregister_hw: 13956 for_each_ar(ah, ar, i) 13957 ath12k_debugfs_unregister(ar); 13958 13959 ieee80211_unregister_hw(hw); 13960 13961 err_cleanup_if_combs: 13962 ath12k_mac_cleanup_iface_combinations(ah); 13963 13964 err_complete_cleanup_unregister: 13965 i = ah->num_radio; 13966 13967 err_cleanup_unregister: 13968 for (j = 0; j < i; j++) { 13969 ar = ath12k_ah_to_ar(ah, j); 13970 ath12k_mac_cleanup_unregister(ar); 13971 } 13972 13973 SET_IEEE80211_DEV(hw, NULL); 13974 13975 return ret; 13976 } 13977 13978 static void ath12k_mac_setup(struct ath12k *ar) 13979 { 13980 struct ath12k_base *ab = ar->ab; 13981 struct ath12k_pdev *pdev = ar->pdev; 13982 u8 pdev_idx = ar->pdev_idx; 13983 13984 ar->lmac_id = ath12k_hw_get_mac_from_pdev_id(ab->hw_params, pdev_idx); 13985 13986 ar->wmi = &ab->wmi_ab.wmi[pdev_idx]; 13987 /* FIXME: wmi[0] is already initialized during attach, 13988 * Should we do this again? 13989 */ 13990 ath12k_wmi_pdev_attach(ab, pdev_idx); 13991 13992 ar->cfg_tx_chainmask = pdev->cap.tx_chain_mask; 13993 ar->cfg_rx_chainmask = pdev->cap.rx_chain_mask; 13994 ar->num_tx_chains = hweight32(pdev->cap.tx_chain_mask); 13995 ar->num_rx_chains = hweight32(pdev->cap.rx_chain_mask); 13996 ar->scan.arvif = NULL; 13997 ar->vdev_id_11d_scan = ATH12K_11D_INVALID_VDEV_ID; 13998 13999 spin_lock_init(&ar->data_lock); 14000 INIT_LIST_HEAD(&ar->arvifs); 14001 INIT_LIST_HEAD(&ar->ppdu_stats_info); 14002 14003 init_completion(&ar->vdev_setup_done); 14004 init_completion(&ar->vdev_delete_done); 14005 init_completion(&ar->peer_assoc_done); 14006 init_completion(&ar->peer_delete_done); 14007 init_completion(&ar->install_key_done); 14008 init_completion(&ar->bss_survey_done); 14009 init_completion(&ar->scan.started); 14010 init_completion(&ar->scan.completed); 14011 init_completion(&ar->scan.on_channel); 14012 init_completion(&ar->mlo_setup_done); 14013 init_completion(&ar->completed_11d_scan); 14014 init_completion(&ar->regd_update_completed); 14015 14016 INIT_DELAYED_WORK(&ar->scan.timeout, ath12k_scan_timeout_work); 14017 wiphy_work_init(&ar->scan.vdev_clean_wk, ath12k_scan_vdev_clean_work); 14018 INIT_WORK(&ar->regd_channel_update_work, ath12k_regd_update_chan_list_work); 14019 INIT_LIST_HEAD(&ar->regd_channel_update_queue); 14020 INIT_WORK(&ar->regd_update_work, ath12k_regd_update_work); 14021 14022 wiphy_work_init(&ar->wmi_mgmt_tx_work, ath12k_mgmt_over_wmi_tx_work); 14023 skb_queue_head_init(&ar->wmi_mgmt_tx_queue); 14024 14025 ar->monitor_vdev_id = -1; 14026 ar->monitor_vdev_created = false; 14027 ar->monitor_started = false; 14028 } 14029 14030 static int __ath12k_mac_mlo_setup(struct ath12k *ar) 14031 { 14032 u8 num_link = 0, partner_link_id[ATH12K_GROUP_MAX_RADIO] = {}; 14033 struct ath12k_base *partner_ab, *ab = ar->ab; 14034 struct ath12k_hw_group *ag = ab->ag; 14035 struct wmi_mlo_setup_arg mlo = {}; 14036 struct ath12k_pdev *pdev; 14037 unsigned long time_left; 14038 int i, j, ret; 14039 14040 lockdep_assert_held(&ag->mutex); 14041 14042 reinit_completion(&ar->mlo_setup_done); 14043 14044 for (i = 0; i < ag->num_devices; i++) { 14045 partner_ab = ag->ab[i]; 14046 14047 for (j = 0; j < partner_ab->num_radios; j++) { 14048 pdev = &partner_ab->pdevs[j]; 14049 14050 /* Avoid the self link */ 14051 if (ar == pdev->ar) 14052 continue; 14053 14054 partner_link_id[num_link] = pdev->hw_link_id; 14055 num_link++; 14056 14057 ath12k_dbg(ab, ATH12K_DBG_MAC, "device %d pdev %d hw_link_id %d num_link %d\n", 14058 i, j, pdev->hw_link_id, num_link); 14059 } 14060 } 14061 14062 if (num_link == 0) 14063 return 0; 14064 14065 mlo.group_id = cpu_to_le32(ag->id); 14066 mlo.partner_link_id = partner_link_id; 14067 mlo.num_partner_links = num_link; 14068 ar->mlo_setup_status = 0; 14069 14070 ath12k_dbg(ab, ATH12K_DBG_MAC, "group id %d num_link %d\n", ag->id, num_link); 14071 14072 ret = ath12k_wmi_mlo_setup(ar, &mlo); 14073 if (ret) { 14074 ath12k_err(ab, "failed to send setup MLO WMI command for pdev %d: %d\n", 14075 ar->pdev_idx, ret); 14076 return ret; 14077 } 14078 14079 time_left = wait_for_completion_timeout(&ar->mlo_setup_done, 14080 WMI_MLO_CMD_TIMEOUT_HZ); 14081 14082 if (!time_left || ar->mlo_setup_status) 14083 return ar->mlo_setup_status ? : -ETIMEDOUT; 14084 14085 ath12k_dbg(ab, ATH12K_DBG_MAC, "mlo setup done for pdev %d\n", ar->pdev_idx); 14086 14087 return 0; 14088 } 14089 14090 static int __ath12k_mac_mlo_teardown(struct ath12k *ar) 14091 { 14092 struct ath12k_base *ab = ar->ab; 14093 int ret; 14094 u8 num_link; 14095 14096 if (test_bit(ATH12K_FLAG_RECOVERY, &ab->dev_flags)) 14097 return 0; 14098 14099 num_link = ath12k_get_num_partner_link(ar); 14100 14101 if (num_link == 0) 14102 return 0; 14103 14104 ret = ath12k_wmi_mlo_teardown(ar); 14105 if (ret) { 14106 ath12k_warn(ab, "failed to send MLO teardown WMI command for pdev %d: %d\n", 14107 ar->pdev_idx, ret); 14108 return ret; 14109 } 14110 14111 ath12k_dbg(ab, ATH12K_DBG_MAC, "mlo teardown for pdev %d\n", ar->pdev_idx); 14112 14113 return 0; 14114 } 14115 14116 int ath12k_mac_mlo_setup(struct ath12k_hw_group *ag) 14117 { 14118 struct ath12k_hw *ah; 14119 struct ath12k *ar; 14120 int ret; 14121 int i, j; 14122 14123 for (i = 0; i < ag->num_hw; i++) { 14124 ah = ag->ah[i]; 14125 if (!ah) 14126 continue; 14127 14128 for_each_ar(ah, ar, j) { 14129 ar = &ah->radio[j]; 14130 ret = __ath12k_mac_mlo_setup(ar); 14131 if (ret) { 14132 ath12k_err(ar->ab, "failed to setup MLO: %d\n", ret); 14133 goto err_setup; 14134 } 14135 } 14136 } 14137 14138 return 0; 14139 14140 err_setup: 14141 for (i = i - 1; i >= 0; i--) { 14142 ah = ag->ah[i]; 14143 if (!ah) 14144 continue; 14145 14146 for (j = j - 1; j >= 0; j--) { 14147 ar = &ah->radio[j]; 14148 if (!ar) 14149 continue; 14150 14151 __ath12k_mac_mlo_teardown(ar); 14152 } 14153 } 14154 14155 return ret; 14156 } 14157 14158 void ath12k_mac_mlo_teardown(struct ath12k_hw_group *ag) 14159 { 14160 struct ath12k_hw *ah; 14161 struct ath12k *ar; 14162 int ret, i, j; 14163 14164 for (i = 0; i < ag->num_hw; i++) { 14165 ah = ag->ah[i]; 14166 if (!ah) 14167 continue; 14168 14169 for_each_ar(ah, ar, j) { 14170 ar = &ah->radio[j]; 14171 ret = __ath12k_mac_mlo_teardown(ar); 14172 if (ret) { 14173 ath12k_err(ar->ab, "failed to teardown MLO: %d\n", ret); 14174 break; 14175 } 14176 } 14177 } 14178 } 14179 14180 int ath12k_mac_register(struct ath12k_hw_group *ag) 14181 { 14182 struct ath12k_hw *ah; 14183 int i; 14184 int ret; 14185 14186 for (i = 0; i < ag->num_hw; i++) { 14187 ah = ath12k_ag_to_ah(ag, i); 14188 14189 ret = ath12k_mac_hw_register(ah); 14190 if (ret) 14191 goto err; 14192 } 14193 14194 return 0; 14195 14196 err: 14197 for (i = i - 1; i >= 0; i--) { 14198 ah = ath12k_ag_to_ah(ag, i); 14199 if (!ah) 14200 continue; 14201 14202 ath12k_mac_hw_unregister(ah); 14203 } 14204 14205 return ret; 14206 } 14207 14208 void ath12k_mac_unregister(struct ath12k_hw_group *ag) 14209 { 14210 struct ath12k_hw *ah; 14211 int i; 14212 14213 for (i = ag->num_hw - 1; i >= 0; i--) { 14214 ah = ath12k_ag_to_ah(ag, i); 14215 if (!ah) 14216 continue; 14217 14218 ath12k_mac_hw_unregister(ah); 14219 } 14220 } 14221 14222 static void ath12k_mac_hw_destroy(struct ath12k_hw *ah) 14223 { 14224 ieee80211_free_hw(ah->hw); 14225 } 14226 14227 static struct ath12k_hw *ath12k_mac_hw_allocate(struct ath12k_hw_group *ag, 14228 struct ath12k_pdev_map *pdev_map, 14229 u8 num_pdev_map) 14230 { 14231 struct ieee80211_hw *hw; 14232 struct ath12k *ar; 14233 struct ath12k_base *ab; 14234 struct ath12k_pdev *pdev; 14235 struct ath12k_hw *ah; 14236 int i; 14237 u8 pdev_idx; 14238 14239 hw = ieee80211_alloc_hw(struct_size(ah, radio, num_pdev_map), 14240 &ath12k_ops); 14241 if (!hw) 14242 return NULL; 14243 14244 ah = ath12k_hw_to_ah(hw); 14245 ah->hw = hw; 14246 ah->num_radio = num_pdev_map; 14247 14248 mutex_init(&ah->hw_mutex); 14249 INIT_LIST_HEAD(&ah->ml_peers); 14250 14251 for (i = 0; i < num_pdev_map; i++) { 14252 ab = pdev_map[i].ab; 14253 pdev_idx = pdev_map[i].pdev_idx; 14254 pdev = &ab->pdevs[pdev_idx]; 14255 14256 ar = ath12k_ah_to_ar(ah, i); 14257 ar->ah = ah; 14258 ar->ab = ab; 14259 ar->hw_link_id = pdev->hw_link_id; 14260 ar->pdev = pdev; 14261 ar->pdev_idx = pdev_idx; 14262 pdev->ar = ar; 14263 14264 ag->hw_links[ar->hw_link_id].device_id = ab->device_id; 14265 ag->hw_links[ar->hw_link_id].pdev_idx = pdev_idx; 14266 14267 ath12k_mac_setup(ar); 14268 ath12k_dp_pdev_pre_alloc(ar); 14269 } 14270 14271 return ah; 14272 } 14273 14274 void ath12k_mac_destroy(struct ath12k_hw_group *ag) 14275 { 14276 struct ath12k_pdev *pdev; 14277 struct ath12k_base *ab = ag->ab[0]; 14278 int i, j; 14279 struct ath12k_hw *ah; 14280 14281 for (i = 0; i < ag->num_devices; i++) { 14282 ab = ag->ab[i]; 14283 if (!ab) 14284 continue; 14285 14286 for (j = 0; j < ab->num_radios; j++) { 14287 pdev = &ab->pdevs[j]; 14288 if (!pdev->ar) 14289 continue; 14290 pdev->ar = NULL; 14291 } 14292 } 14293 14294 for (i = 0; i < ag->num_hw; i++) { 14295 ah = ath12k_ag_to_ah(ag, i); 14296 if (!ah) 14297 continue; 14298 14299 ath12k_mac_hw_destroy(ah); 14300 ath12k_ag_set_ah(ag, i, NULL); 14301 } 14302 } 14303 14304 static void ath12k_mac_set_device_defaults(struct ath12k_base *ab) 14305 { 14306 int total_vdev; 14307 14308 /* Initialize channel counters frequency value in hertz */ 14309 ab->cc_freq_hz = 320000; 14310 total_vdev = ab->num_radios * TARGET_NUM_VDEVS(ab); 14311 ab->free_vdev_map = (1LL << total_vdev) - 1; 14312 } 14313 14314 int ath12k_mac_allocate(struct ath12k_hw_group *ag) 14315 { 14316 struct ath12k_pdev_map pdev_map[ATH12K_GROUP_MAX_RADIO]; 14317 int mac_id, device_id, total_radio, num_hw; 14318 struct ath12k_base *ab; 14319 struct ath12k_hw *ah; 14320 int ret, i, j; 14321 u8 radio_per_hw; 14322 14323 total_radio = 0; 14324 for (i = 0; i < ag->num_devices; i++) { 14325 ab = ag->ab[i]; 14326 if (!ab) 14327 continue; 14328 14329 ath12k_debugfs_pdev_create(ab); 14330 ath12k_mac_set_device_defaults(ab); 14331 total_radio += ab->num_radios; 14332 } 14333 14334 if (!total_radio) 14335 return -EINVAL; 14336 14337 if (WARN_ON(total_radio > ATH12K_GROUP_MAX_RADIO)) 14338 return -ENOSPC; 14339 14340 /* All pdev get combined and register as single wiphy based on 14341 * hardware group which participate in multi-link operation else 14342 * each pdev get register separately. 14343 */ 14344 if (ag->mlo_capable) 14345 radio_per_hw = total_radio; 14346 else 14347 radio_per_hw = 1; 14348 14349 num_hw = total_radio / radio_per_hw; 14350 14351 ag->num_hw = 0; 14352 device_id = 0; 14353 mac_id = 0; 14354 for (i = 0; i < num_hw; i++) { 14355 for (j = 0; j < radio_per_hw; j++) { 14356 if (device_id >= ag->num_devices || !ag->ab[device_id]) { 14357 ret = -ENOSPC; 14358 goto err; 14359 } 14360 14361 ab = ag->ab[device_id]; 14362 pdev_map[j].ab = ab; 14363 pdev_map[j].pdev_idx = mac_id; 14364 mac_id++; 14365 14366 /* If mac_id falls beyond the current device MACs then 14367 * move to next device 14368 */ 14369 if (mac_id >= ab->num_radios) { 14370 mac_id = 0; 14371 device_id++; 14372 } 14373 } 14374 14375 ab = pdev_map->ab; 14376 14377 ah = ath12k_mac_hw_allocate(ag, pdev_map, radio_per_hw); 14378 if (!ah) { 14379 ath12k_warn(ab, "failed to allocate mac80211 hw device for hw_idx %d\n", 14380 i); 14381 ret = -ENOMEM; 14382 goto err; 14383 } 14384 14385 ah->dev = ab->dev; 14386 14387 ag->ah[i] = ah; 14388 ag->num_hw++; 14389 } 14390 14391 return 0; 14392 14393 err: 14394 for (i = i - 1; i >= 0; i--) { 14395 ah = ath12k_ag_to_ah(ag, i); 14396 if (!ah) 14397 continue; 14398 14399 ath12k_mac_hw_destroy(ah); 14400 ath12k_ag_set_ah(ag, i, NULL); 14401 } 14402 14403 return ret; 14404 } 14405 14406 int ath12k_mac_vif_set_keepalive(struct ath12k_link_vif *arvif, 14407 enum wmi_sta_keepalive_method method, 14408 u32 interval) 14409 { 14410 struct wmi_sta_keepalive_arg arg = {}; 14411 struct ath12k *ar = arvif->ar; 14412 int ret; 14413 14414 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 14415 14416 if (arvif->ahvif->vdev_type != WMI_VDEV_TYPE_STA) 14417 return 0; 14418 14419 if (!test_bit(WMI_TLV_SERVICE_STA_KEEP_ALIVE, ar->ab->wmi_ab.svc_map)) 14420 return 0; 14421 14422 arg.vdev_id = arvif->vdev_id; 14423 arg.enabled = 1; 14424 arg.method = method; 14425 arg.interval = interval; 14426 14427 ret = ath12k_wmi_sta_keepalive(ar, &arg); 14428 if (ret) { 14429 ath12k_warn(ar->ab, "failed to set keepalive on vdev %i: %d\n", 14430 arvif->vdev_id, ret); 14431 return ret; 14432 } 14433 14434 return 0; 14435 } 14436