1 // SPDX-License-Identifier: BSD-3-Clause-Clear 2 /* 3 * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved. 4 * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. 5 */ 6 7 #include <net/mac80211.h> 8 #include <net/cfg80211.h> 9 #include <linux/etherdevice.h> 10 11 #include "mac.h" 12 #include "core.h" 13 #include "debug.h" 14 #include "wmi.h" 15 #include "hw.h" 16 #include "dp_tx.h" 17 #include "dp_rx.h" 18 #include "testmode.h" 19 #include "peer.h" 20 #include "debugfs.h" 21 #include "hif.h" 22 #include "wow.h" 23 #include "debugfs_sta.h" 24 #include "dp.h" 25 #include "dp_cmn.h" 26 27 #define CHAN2G(_channel, _freq, _flags) { \ 28 .band = NL80211_BAND_2GHZ, \ 29 .hw_value = (_channel), \ 30 .center_freq = (_freq), \ 31 .flags = (_flags), \ 32 .max_antenna_gain = 0, \ 33 .max_power = 30, \ 34 } 35 36 #define CHAN5G(_channel, _freq, _flags) { \ 37 .band = NL80211_BAND_5GHZ, \ 38 .hw_value = (_channel), \ 39 .center_freq = (_freq), \ 40 .flags = (_flags), \ 41 .max_antenna_gain = 0, \ 42 .max_power = 30, \ 43 } 44 45 #define CHAN6G(_channel, _freq, _flags) { \ 46 .band = NL80211_BAND_6GHZ, \ 47 .hw_value = (_channel), \ 48 .center_freq = (_freq), \ 49 .flags = (_flags), \ 50 .max_antenna_gain = 0, \ 51 .max_power = 30, \ 52 } 53 54 static const struct ieee80211_channel ath12k_2ghz_channels[] = { 55 CHAN2G(1, 2412, 0), 56 CHAN2G(2, 2417, 0), 57 CHAN2G(3, 2422, 0), 58 CHAN2G(4, 2427, 0), 59 CHAN2G(5, 2432, 0), 60 CHAN2G(6, 2437, 0), 61 CHAN2G(7, 2442, 0), 62 CHAN2G(8, 2447, 0), 63 CHAN2G(9, 2452, 0), 64 CHAN2G(10, 2457, 0), 65 CHAN2G(11, 2462, 0), 66 CHAN2G(12, 2467, 0), 67 CHAN2G(13, 2472, 0), 68 CHAN2G(14, 2484, 0), 69 }; 70 71 static const struct ieee80211_channel ath12k_5ghz_channels[] = { 72 CHAN5G(36, 5180, 0), 73 CHAN5G(40, 5200, 0), 74 CHAN5G(44, 5220, 0), 75 CHAN5G(48, 5240, 0), 76 CHAN5G(52, 5260, 0), 77 CHAN5G(56, 5280, 0), 78 CHAN5G(60, 5300, 0), 79 CHAN5G(64, 5320, 0), 80 CHAN5G(100, 5500, 0), 81 CHAN5G(104, 5520, 0), 82 CHAN5G(108, 5540, 0), 83 CHAN5G(112, 5560, 0), 84 CHAN5G(116, 5580, 0), 85 CHAN5G(120, 5600, 0), 86 CHAN5G(124, 5620, 0), 87 CHAN5G(128, 5640, 0), 88 CHAN5G(132, 5660, 0), 89 CHAN5G(136, 5680, 0), 90 CHAN5G(140, 5700, 0), 91 CHAN5G(144, 5720, 0), 92 CHAN5G(149, 5745, 0), 93 CHAN5G(153, 5765, 0), 94 CHAN5G(157, 5785, 0), 95 CHAN5G(161, 5805, 0), 96 CHAN5G(165, 5825, 0), 97 CHAN5G(169, 5845, 0), 98 CHAN5G(173, 5865, 0), 99 }; 100 101 static const struct ieee80211_channel ath12k_6ghz_channels[] = { 102 /* Operating Class 136 */ 103 CHAN6G(2, 5935, 0), 104 105 /* Operating Classes 131-135 */ 106 CHAN6G(1, 5955, 0), 107 CHAN6G(5, 5975, 0), 108 CHAN6G(9, 5995, 0), 109 CHAN6G(13, 6015, 0), 110 CHAN6G(17, 6035, 0), 111 CHAN6G(21, 6055, 0), 112 CHAN6G(25, 6075, 0), 113 CHAN6G(29, 6095, 0), 114 CHAN6G(33, 6115, 0), 115 CHAN6G(37, 6135, 0), 116 CHAN6G(41, 6155, 0), 117 CHAN6G(45, 6175, 0), 118 CHAN6G(49, 6195, 0), 119 CHAN6G(53, 6215, 0), 120 CHAN6G(57, 6235, 0), 121 CHAN6G(61, 6255, 0), 122 CHAN6G(65, 6275, 0), 123 CHAN6G(69, 6295, 0), 124 CHAN6G(73, 6315, 0), 125 CHAN6G(77, 6335, 0), 126 CHAN6G(81, 6355, 0), 127 CHAN6G(85, 6375, 0), 128 CHAN6G(89, 6395, 0), 129 CHAN6G(93, 6415, 0), 130 CHAN6G(97, 6435, 0), 131 CHAN6G(101, 6455, 0), 132 CHAN6G(105, 6475, 0), 133 CHAN6G(109, 6495, 0), 134 CHAN6G(113, 6515, 0), 135 CHAN6G(117, 6535, 0), 136 CHAN6G(121, 6555, 0), 137 CHAN6G(125, 6575, 0), 138 CHAN6G(129, 6595, 0), 139 CHAN6G(133, 6615, 0), 140 CHAN6G(137, 6635, 0), 141 CHAN6G(141, 6655, 0), 142 CHAN6G(145, 6675, 0), 143 CHAN6G(149, 6695, 0), 144 CHAN6G(153, 6715, 0), 145 CHAN6G(157, 6735, 0), 146 CHAN6G(161, 6755, 0), 147 CHAN6G(165, 6775, 0), 148 CHAN6G(169, 6795, 0), 149 CHAN6G(173, 6815, 0), 150 CHAN6G(177, 6835, 0), 151 CHAN6G(181, 6855, 0), 152 CHAN6G(185, 6875, 0), 153 CHAN6G(189, 6895, 0), 154 CHAN6G(193, 6915, 0), 155 CHAN6G(197, 6935, 0), 156 CHAN6G(201, 6955, 0), 157 CHAN6G(205, 6975, 0), 158 CHAN6G(209, 6995, 0), 159 CHAN6G(213, 7015, 0), 160 CHAN6G(217, 7035, 0), 161 CHAN6G(221, 7055, 0), 162 CHAN6G(225, 7075, 0), 163 CHAN6G(229, 7095, 0), 164 CHAN6G(233, 7115, 0), 165 }; 166 167 #define ATH12K_MAC_RATE_A_M(bps, code) \ 168 { .bitrate = (bps), .hw_value = (code),\ 169 .flags = IEEE80211_RATE_MANDATORY_A } 170 171 #define ATH12K_MAC_RATE_B(bps, code, code_short) \ 172 { .bitrate = (bps), .hw_value = (code), .hw_value_short = (code_short),\ 173 .flags = IEEE80211_RATE_SHORT_PREAMBLE } 174 175 static struct ieee80211_rate ath12k_legacy_rates[] = { 176 { .bitrate = 10, 177 .hw_value = ATH12K_HW_RATE_CCK_LP_1M }, 178 ATH12K_MAC_RATE_B(20, ATH12K_HW_RATE_CCK_LP_2M, 179 ATH12K_HW_RATE_CCK_SP_2M), 180 ATH12K_MAC_RATE_B(55, ATH12K_HW_RATE_CCK_LP_5_5M, 181 ATH12K_HW_RATE_CCK_SP_5_5M), 182 ATH12K_MAC_RATE_B(110, ATH12K_HW_RATE_CCK_LP_11M, 183 ATH12K_HW_RATE_CCK_SP_11M), 184 ATH12K_MAC_RATE_A_M(60, ATH12K_HW_RATE_OFDM_6M), 185 ATH12K_MAC_RATE_A_M(90, ATH12K_HW_RATE_OFDM_9M), 186 ATH12K_MAC_RATE_A_M(120, ATH12K_HW_RATE_OFDM_12M), 187 ATH12K_MAC_RATE_A_M(180, ATH12K_HW_RATE_OFDM_18M), 188 ATH12K_MAC_RATE_A_M(240, ATH12K_HW_RATE_OFDM_24M), 189 ATH12K_MAC_RATE_A_M(360, ATH12K_HW_RATE_OFDM_36M), 190 ATH12K_MAC_RATE_A_M(480, ATH12K_HW_RATE_OFDM_48M), 191 ATH12K_MAC_RATE_A_M(540, ATH12K_HW_RATE_OFDM_54M), 192 }; 193 194 static const int 195 ath12k_phymodes[NUM_NL80211_BANDS][ATH12K_CHAN_WIDTH_NUM] = { 196 [NL80211_BAND_2GHZ] = { 197 [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN, 198 [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN, 199 [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11BE_EHT20_2G, 200 [NL80211_CHAN_WIDTH_20] = MODE_11BE_EHT20_2G, 201 [NL80211_CHAN_WIDTH_40] = MODE_11BE_EHT40_2G, 202 [NL80211_CHAN_WIDTH_80] = MODE_UNKNOWN, 203 [NL80211_CHAN_WIDTH_80P80] = MODE_UNKNOWN, 204 [NL80211_CHAN_WIDTH_160] = MODE_UNKNOWN, 205 [NL80211_CHAN_WIDTH_320] = MODE_UNKNOWN, 206 }, 207 [NL80211_BAND_5GHZ] = { 208 [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN, 209 [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN, 210 [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11BE_EHT20, 211 [NL80211_CHAN_WIDTH_20] = MODE_11BE_EHT20, 212 [NL80211_CHAN_WIDTH_40] = MODE_11BE_EHT40, 213 [NL80211_CHAN_WIDTH_80] = MODE_11BE_EHT80, 214 [NL80211_CHAN_WIDTH_160] = MODE_11BE_EHT160, 215 [NL80211_CHAN_WIDTH_80P80] = MODE_UNKNOWN, 216 [NL80211_CHAN_WIDTH_320] = MODE_11BE_EHT320, 217 }, 218 [NL80211_BAND_6GHZ] = { 219 [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN, 220 [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN, 221 [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11BE_EHT20, 222 [NL80211_CHAN_WIDTH_20] = MODE_11BE_EHT20, 223 [NL80211_CHAN_WIDTH_40] = MODE_11BE_EHT40, 224 [NL80211_CHAN_WIDTH_80] = MODE_11BE_EHT80, 225 [NL80211_CHAN_WIDTH_160] = MODE_11BE_EHT160, 226 [NL80211_CHAN_WIDTH_80P80] = MODE_UNKNOWN, 227 [NL80211_CHAN_WIDTH_320] = MODE_11BE_EHT320, 228 }, 229 230 }; 231 232 const struct htt_rx_ring_tlv_filter ath12k_mac_mon_status_filter_default = { 233 .rx_filter = HTT_RX_FILTER_TLV_FLAGS_MPDU_START | 234 HTT_RX_FILTER_TLV_FLAGS_PPDU_END | 235 HTT_RX_FILTER_TLV_FLAGS_PPDU_END_STATUS_DONE | 236 HTT_RX_FILTER_TLV_FLAGS_PPDU_START_USER_INFO, 237 .pkt_filter_flags0 = HTT_RX_FP_MGMT_FILTER_FLAGS0, 238 .pkt_filter_flags1 = HTT_RX_FP_MGMT_FILTER_FLAGS1, 239 .pkt_filter_flags2 = HTT_RX_FP_CTRL_FILTER_FLASG2, 240 .pkt_filter_flags3 = HTT_RX_FP_DATA_FILTER_FLASG3 | 241 HTT_RX_FP_CTRL_FILTER_FLASG3 242 }; 243 244 #define ATH12K_MAC_FIRST_OFDM_RATE_IDX 4 245 #define ath12k_g_rates ath12k_legacy_rates 246 #define ath12k_g_rates_size (ARRAY_SIZE(ath12k_legacy_rates)) 247 #define ath12k_a_rates (ath12k_legacy_rates + 4) 248 #define ath12k_a_rates_size (ARRAY_SIZE(ath12k_legacy_rates) - 4) 249 250 #define ATH12K_MAC_SCAN_TIMEOUT_MSECS 200 /* in msecs */ 251 252 static const u32 ath12k_smps_map[] = { 253 [WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC, 254 [WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC, 255 [WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE, 256 [WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE, 257 }; 258 259 static int ath12k_start_vdev_delay(struct ath12k *ar, 260 struct ath12k_link_vif *arvif); 261 static void ath12k_mac_stop(struct ath12k *ar); 262 static int ath12k_mac_vdev_create(struct ath12k *ar, struct ath12k_link_vif *arvif); 263 static int ath12k_mac_vdev_delete(struct ath12k *ar, struct ath12k_link_vif *arvif); 264 265 static const char *ath12k_mac_phymode_str(enum wmi_phy_mode mode) 266 { 267 switch (mode) { 268 case MODE_11A: 269 return "11a"; 270 case MODE_11G: 271 return "11g"; 272 case MODE_11B: 273 return "11b"; 274 case MODE_11GONLY: 275 return "11gonly"; 276 case MODE_11NA_HT20: 277 return "11na-ht20"; 278 case MODE_11NG_HT20: 279 return "11ng-ht20"; 280 case MODE_11NA_HT40: 281 return "11na-ht40"; 282 case MODE_11NG_HT40: 283 return "11ng-ht40"; 284 case MODE_11AC_VHT20: 285 return "11ac-vht20"; 286 case MODE_11AC_VHT40: 287 return "11ac-vht40"; 288 case MODE_11AC_VHT80: 289 return "11ac-vht80"; 290 case MODE_11AC_VHT160: 291 return "11ac-vht160"; 292 case MODE_11AC_VHT80_80: 293 return "11ac-vht80+80"; 294 case MODE_11AC_VHT20_2G: 295 return "11ac-vht20-2g"; 296 case MODE_11AC_VHT40_2G: 297 return "11ac-vht40-2g"; 298 case MODE_11AC_VHT80_2G: 299 return "11ac-vht80-2g"; 300 case MODE_11AX_HE20: 301 return "11ax-he20"; 302 case MODE_11AX_HE40: 303 return "11ax-he40"; 304 case MODE_11AX_HE80: 305 return "11ax-he80"; 306 case MODE_11AX_HE80_80: 307 return "11ax-he80+80"; 308 case MODE_11AX_HE160: 309 return "11ax-he160"; 310 case MODE_11AX_HE20_2G: 311 return "11ax-he20-2g"; 312 case MODE_11AX_HE40_2G: 313 return "11ax-he40-2g"; 314 case MODE_11AX_HE80_2G: 315 return "11ax-he80-2g"; 316 case MODE_11BE_EHT20: 317 return "11be-eht20"; 318 case MODE_11BE_EHT40: 319 return "11be-eht40"; 320 case MODE_11BE_EHT80: 321 return "11be-eht80"; 322 case MODE_11BE_EHT80_80: 323 return "11be-eht80+80"; 324 case MODE_11BE_EHT160: 325 return "11be-eht160"; 326 case MODE_11BE_EHT160_160: 327 return "11be-eht160+160"; 328 case MODE_11BE_EHT320: 329 return "11be-eht320"; 330 case MODE_11BE_EHT20_2G: 331 return "11be-eht20-2g"; 332 case MODE_11BE_EHT40_2G: 333 return "11be-eht40-2g"; 334 case MODE_UNKNOWN: 335 /* skip */ 336 break; 337 338 /* no default handler to allow compiler to check that the 339 * enum is fully handled 340 */ 341 } 342 343 return "<unknown>"; 344 } 345 346 u16 ath12k_mac_he_convert_tones_to_ru_tones(u16 tones) 347 { 348 switch (tones) { 349 case 26: 350 return RU_26; 351 case 52: 352 return RU_52; 353 case 106: 354 return RU_106; 355 case 242: 356 return RU_242; 357 case 484: 358 return RU_484; 359 case 996: 360 return RU_996; 361 case (996 * 2): 362 return RU_2X996; 363 default: 364 return RU_26; 365 } 366 } 367 EXPORT_SYMBOL(ath12k_mac_he_convert_tones_to_ru_tones); 368 369 enum nl80211_eht_gi ath12k_mac_eht_gi_to_nl80211_eht_gi(u8 sgi) 370 { 371 switch (sgi) { 372 case RX_MSDU_START_SGI_0_8_US: 373 return NL80211_RATE_INFO_EHT_GI_0_8; 374 case RX_MSDU_START_SGI_1_6_US: 375 return NL80211_RATE_INFO_EHT_GI_1_6; 376 case RX_MSDU_START_SGI_3_2_US: 377 return NL80211_RATE_INFO_EHT_GI_3_2; 378 default: 379 return NL80211_RATE_INFO_EHT_GI_0_8; 380 } 381 } 382 EXPORT_SYMBOL(ath12k_mac_eht_gi_to_nl80211_eht_gi); 383 384 enum nl80211_eht_ru_alloc ath12k_mac_eht_ru_tones_to_nl80211_eht_ru_alloc(u16 ru_tones) 385 { 386 switch (ru_tones) { 387 case 26: 388 return NL80211_RATE_INFO_EHT_RU_ALLOC_26; 389 case 52: 390 return NL80211_RATE_INFO_EHT_RU_ALLOC_52; 391 case (52 + 26): 392 return NL80211_RATE_INFO_EHT_RU_ALLOC_52P26; 393 case 106: 394 return NL80211_RATE_INFO_EHT_RU_ALLOC_106; 395 case (106 + 26): 396 return NL80211_RATE_INFO_EHT_RU_ALLOC_106P26; 397 case 242: 398 return NL80211_RATE_INFO_EHT_RU_ALLOC_242; 399 case 484: 400 return NL80211_RATE_INFO_EHT_RU_ALLOC_484; 401 case (484 + 242): 402 return NL80211_RATE_INFO_EHT_RU_ALLOC_484P242; 403 case 996: 404 return NL80211_RATE_INFO_EHT_RU_ALLOC_996; 405 case (996 + 484): 406 return NL80211_RATE_INFO_EHT_RU_ALLOC_996P484; 407 case (996 + 484 + 242): 408 return NL80211_RATE_INFO_EHT_RU_ALLOC_996P484P242; 409 case (2 * 996): 410 return NL80211_RATE_INFO_EHT_RU_ALLOC_2x996; 411 case (2 * 996 + 484): 412 return NL80211_RATE_INFO_EHT_RU_ALLOC_2x996P484; 413 case (3 * 996): 414 return NL80211_RATE_INFO_EHT_RU_ALLOC_3x996; 415 case (3 * 996 + 484): 416 return NL80211_RATE_INFO_EHT_RU_ALLOC_3x996P484; 417 case (4 * 996): 418 return NL80211_RATE_INFO_EHT_RU_ALLOC_4x996; 419 default: 420 return NL80211_RATE_INFO_EHT_RU_ALLOC_26; 421 } 422 } 423 EXPORT_SYMBOL(ath12k_mac_eht_ru_tones_to_nl80211_eht_ru_alloc); 424 425 enum rate_info_bw 426 ath12k_mac_bw_to_mac80211_bw(enum ath12k_supported_bw bw) 427 { 428 u8 ret = RATE_INFO_BW_20; 429 430 switch (bw) { 431 case ATH12K_BW_20: 432 ret = RATE_INFO_BW_20; 433 break; 434 case ATH12K_BW_40: 435 ret = RATE_INFO_BW_40; 436 break; 437 case ATH12K_BW_80: 438 ret = RATE_INFO_BW_80; 439 break; 440 case ATH12K_BW_160: 441 ret = RATE_INFO_BW_160; 442 break; 443 case ATH12K_BW_320: 444 ret = RATE_INFO_BW_320; 445 break; 446 } 447 448 return ret; 449 } 450 EXPORT_SYMBOL(ath12k_mac_bw_to_mac80211_bw); 451 452 enum ath12k_supported_bw ath12k_mac_mac80211_bw_to_ath12k_bw(enum rate_info_bw bw) 453 { 454 switch (bw) { 455 case RATE_INFO_BW_20: 456 return ATH12K_BW_20; 457 case RATE_INFO_BW_40: 458 return ATH12K_BW_40; 459 case RATE_INFO_BW_80: 460 return ATH12K_BW_80; 461 case RATE_INFO_BW_160: 462 return ATH12K_BW_160; 463 case RATE_INFO_BW_320: 464 return ATH12K_BW_320; 465 default: 466 return ATH12K_BW_20; 467 } 468 } 469 470 int ath12k_mac_hw_ratecode_to_legacy_rate(u8 hw_rc, u8 preamble, u8 *rateidx, 471 u16 *rate) 472 { 473 /* As default, it is OFDM rates */ 474 int i = ATH12K_MAC_FIRST_OFDM_RATE_IDX; 475 int max_rates_idx = ath12k_g_rates_size; 476 477 if (preamble == WMI_RATE_PREAMBLE_CCK) { 478 hw_rc &= ~ATH12K_HW_RATECODE_CCK_SHORT_PREAM_MASK; 479 i = 0; 480 max_rates_idx = ATH12K_MAC_FIRST_OFDM_RATE_IDX; 481 } 482 483 while (i < max_rates_idx) { 484 if (hw_rc == ath12k_legacy_rates[i].hw_value) { 485 *rateidx = i; 486 *rate = ath12k_legacy_rates[i].bitrate; 487 return 0; 488 } 489 i++; 490 } 491 492 return -EINVAL; 493 } 494 EXPORT_SYMBOL(ath12k_mac_hw_ratecode_to_legacy_rate); 495 496 u8 ath12k_mac_bitrate_to_idx(const struct ieee80211_supported_band *sband, 497 u32 bitrate) 498 { 499 int i; 500 501 for (i = 0; i < sband->n_bitrates; i++) 502 if (sband->bitrates[i].bitrate == bitrate) 503 return i; 504 505 return 0; 506 } 507 508 static u32 509 ath12k_mac_max_ht_nss(const u8 *ht_mcs_mask) 510 { 511 int nss; 512 513 for (nss = IEEE80211_HT_MCS_MASK_LEN - 1; nss >= 0; nss--) 514 if (ht_mcs_mask[nss]) 515 return nss + 1; 516 517 return 1; 518 } 519 520 static u32 521 ath12k_mac_max_vht_nss(const u16 *vht_mcs_mask) 522 { 523 int nss; 524 525 for (nss = NL80211_VHT_NSS_MAX - 1; nss >= 0; nss--) 526 if (vht_mcs_mask[nss]) 527 return nss + 1; 528 529 return 1; 530 } 531 532 static u32 533 ath12k_mac_max_he_nss(const u16 he_mcs_mask[NL80211_HE_NSS_MAX]) 534 { 535 int nss; 536 537 for (nss = NL80211_HE_NSS_MAX - 1; nss >= 0; nss--) 538 if (he_mcs_mask[nss]) 539 return nss + 1; 540 541 return 1; 542 } 543 544 static u32 545 ath12k_mac_max_eht_nss(const u16 eht_mcs_mask[NL80211_EHT_NSS_MAX]) 546 { 547 int nss; 548 549 for (nss = NL80211_EHT_NSS_MAX - 1; nss >= 0; nss--) 550 if (eht_mcs_mask[nss]) 551 return nss + 1; 552 553 return 1; 554 } 555 556 static u32 557 ath12k_mac_max_eht_mcs_nss(const u8 *eht_mcs, int eht_mcs_set_size) 558 { 559 int i; 560 u8 nss = 0; 561 562 for (i = 0; i < eht_mcs_set_size; i++) 563 nss = max(nss, u8_get_bits(eht_mcs[i], IEEE80211_EHT_MCS_NSS_RX)); 564 565 return nss; 566 } 567 568 static u8 ath12k_parse_mpdudensity(u8 mpdudensity) 569 { 570 /* From IEEE Std 802.11-2020 defined values for "Minimum MPDU Start Spacing": 571 * 0 for no restriction 572 * 1 for 1/4 us 573 * 2 for 1/2 us 574 * 3 for 1 us 575 * 4 for 2 us 576 * 5 for 4 us 577 * 6 for 8 us 578 * 7 for 16 us 579 */ 580 switch (mpdudensity) { 581 case 0: 582 return 0; 583 case 1: 584 case 2: 585 case 3: 586 /* Our lower layer calculations limit our precision to 587 * 1 microsecond 588 */ 589 return 1; 590 case 4: 591 return 2; 592 case 5: 593 return 4; 594 case 6: 595 return 8; 596 case 7: 597 return 16; 598 default: 599 return 0; 600 } 601 } 602 603 static int ath12k_mac_vif_link_chan(struct ieee80211_vif *vif, u8 link_id, 604 struct cfg80211_chan_def *def) 605 { 606 struct ieee80211_bss_conf *link_conf; 607 struct ieee80211_chanctx_conf *conf; 608 609 rcu_read_lock(); 610 link_conf = rcu_dereference(vif->link_conf[link_id]); 611 612 if (!link_conf) { 613 rcu_read_unlock(); 614 return -ENOLINK; 615 } 616 617 conf = rcu_dereference(link_conf->chanctx_conf); 618 if (!conf) { 619 rcu_read_unlock(); 620 return -ENOENT; 621 } 622 *def = conf->def; 623 rcu_read_unlock(); 624 625 return 0; 626 } 627 628 static struct ath12k_link_vif * 629 ath12k_mac_get_tx_arvif(struct ath12k_link_vif *arvif, 630 struct ieee80211_bss_conf *link_conf) 631 { 632 struct ieee80211_bss_conf *tx_bss_conf; 633 struct ath12k *ar = arvif->ar; 634 struct ath12k_vif *tx_ahvif; 635 636 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 637 638 tx_bss_conf = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy, 639 link_conf->tx_bss_conf); 640 if (tx_bss_conf) { 641 tx_ahvif = ath12k_vif_to_ahvif(tx_bss_conf->vif); 642 return wiphy_dereference(tx_ahvif->ah->hw->wiphy, 643 tx_ahvif->link[tx_bss_conf->link_id]); 644 } 645 646 return NULL; 647 } 648 649 static const u8 *ath12k_mac_get_tx_bssid(struct ath12k_link_vif *arvif) 650 { 651 struct ieee80211_bss_conf *link_conf; 652 struct ath12k_link_vif *tx_arvif; 653 struct ath12k *ar = arvif->ar; 654 655 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 656 657 link_conf = ath12k_mac_get_link_bss_conf(arvif); 658 if (!link_conf) { 659 ath12k_warn(ar->ab, 660 "unable to access bss link conf for link %u required to retrieve transmitting link conf\n", 661 arvif->link_id); 662 return NULL; 663 } 664 if (link_conf->vif->type == NL80211_IFTYPE_STATION) { 665 if (link_conf->nontransmitted) 666 return link_conf->transmitter_bssid; 667 } else { 668 tx_arvif = ath12k_mac_get_tx_arvif(arvif, link_conf); 669 if (tx_arvif) 670 return tx_arvif->bssid; 671 } 672 673 return NULL; 674 } 675 676 struct ieee80211_bss_conf * 677 ath12k_mac_get_link_bss_conf(struct ath12k_link_vif *arvif) 678 { 679 struct ieee80211_vif *vif = arvif->ahvif->vif; 680 struct ieee80211_bss_conf *link_conf; 681 struct ath12k *ar = arvif->ar; 682 683 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 684 685 if (arvif->link_id >= IEEE80211_MLD_MAX_NUM_LINKS) 686 return NULL; 687 688 link_conf = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy, 689 vif->link_conf[arvif->link_id]); 690 691 return link_conf; 692 } 693 694 static struct ieee80211_link_sta *ath12k_mac_get_link_sta(struct ath12k_link_sta *arsta) 695 { 696 struct ath12k_sta *ahsta = arsta->ahsta; 697 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(ahsta); 698 struct ieee80211_link_sta *link_sta; 699 700 lockdep_assert_wiphy(ahsta->ahvif->ah->hw->wiphy); 701 702 if (arsta->link_id >= IEEE80211_MLD_MAX_NUM_LINKS) 703 return NULL; 704 705 link_sta = wiphy_dereference(ahsta->ahvif->ah->hw->wiphy, 706 sta->link[arsta->link_id]); 707 708 return link_sta; 709 } 710 711 static bool ath12k_mac_bitrate_is_cck(int bitrate) 712 { 713 switch (bitrate) { 714 case 10: 715 case 20: 716 case 55: 717 case 110: 718 return true; 719 } 720 721 return false; 722 } 723 724 u8 ath12k_mac_hw_rate_to_idx(const struct ieee80211_supported_band *sband, 725 u8 hw_rate, bool cck) 726 { 727 const struct ieee80211_rate *rate; 728 int i; 729 730 for (i = 0; i < sband->n_bitrates; i++) { 731 rate = &sband->bitrates[i]; 732 733 if (ath12k_mac_bitrate_is_cck(rate->bitrate) != cck) 734 continue; 735 736 /* To handle 802.11a PPDU type */ 737 if ((!cck) && (rate->hw_value == hw_rate) && 738 (rate->flags & IEEE80211_RATE_MANDATORY_A)) 739 return i; 740 /* To handle 802.11b short PPDU type */ 741 else if (rate->flags & IEEE80211_RATE_SHORT_PREAMBLE && 742 rate->hw_value_short == hw_rate) 743 return i; 744 /* To handle 802.11b long PPDU type */ 745 else if (rate->hw_value == hw_rate) 746 return i; 747 } 748 749 return 0; 750 } 751 752 static u8 ath12k_mac_bitrate_to_rate(int bitrate) 753 { 754 return DIV_ROUND_UP(bitrate, 5) | 755 (ath12k_mac_bitrate_is_cck(bitrate) ? BIT(7) : 0); 756 } 757 758 static void ath12k_get_arvif_iter(void *data, u8 *mac, 759 struct ieee80211_vif *vif) 760 { 761 struct ath12k_vif_iter *arvif_iter = data; 762 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 763 unsigned long links_map = ahvif->links_map; 764 struct ath12k_link_vif *arvif; 765 u8 link_id; 766 767 for_each_set_bit(link_id, &links_map, IEEE80211_MLD_MAX_NUM_LINKS) { 768 arvif = rcu_dereference(ahvif->link[link_id]); 769 770 if (WARN_ON(!arvif)) 771 continue; 772 773 if (!arvif->is_created) 774 continue; 775 776 if (arvif->vdev_id == arvif_iter->vdev_id && 777 arvif->ar == arvif_iter->ar) { 778 arvif_iter->arvif = arvif; 779 break; 780 } 781 } 782 } 783 784 struct ath12k_link_vif *ath12k_mac_get_arvif(struct ath12k *ar, u32 vdev_id) 785 { 786 struct ath12k_vif_iter arvif_iter = {}; 787 u32 flags; 788 789 /* To use the arvif returned, caller must have held rcu read lock. 790 */ 791 WARN_ON(!rcu_read_lock_any_held()); 792 arvif_iter.vdev_id = vdev_id; 793 arvif_iter.ar = ar; 794 795 flags = IEEE80211_IFACE_ITER_RESUME_ALL; 796 ieee80211_iterate_active_interfaces_atomic(ath12k_ar_to_hw(ar), 797 flags, 798 ath12k_get_arvif_iter, 799 &arvif_iter); 800 if (!arvif_iter.arvif) { 801 ath12k_warn(ar->ab, "No VIF found for vdev %d\n", vdev_id); 802 return NULL; 803 } 804 805 return arvif_iter.arvif; 806 } 807 808 struct ath12k_link_vif *ath12k_mac_get_arvif_by_vdev_id(struct ath12k_base *ab, 809 u32 vdev_id) 810 { 811 int i; 812 struct ath12k_pdev *pdev; 813 struct ath12k_link_vif *arvif; 814 815 for (i = 0; i < ab->num_radios; i++) { 816 pdev = rcu_dereference(ab->pdevs_active[i]); 817 if (pdev && pdev->ar && 818 (pdev->ar->allocated_vdev_map & (1LL << vdev_id))) { 819 arvif = ath12k_mac_get_arvif(pdev->ar, vdev_id); 820 if (arvif) 821 return arvif; 822 } 823 } 824 825 return NULL; 826 } 827 828 struct ath12k *ath12k_mac_get_ar_by_vdev_id(struct ath12k_base *ab, u32 vdev_id) 829 { 830 int i; 831 struct ath12k_pdev *pdev; 832 833 for (i = 0; i < ab->num_radios; i++) { 834 pdev = rcu_dereference(ab->pdevs_active[i]); 835 if (pdev && pdev->ar) { 836 if (pdev->ar->allocated_vdev_map & (1LL << vdev_id)) 837 return pdev->ar; 838 } 839 } 840 841 return NULL; 842 } 843 844 struct ath12k *ath12k_mac_get_ar_by_pdev_id(struct ath12k_base *ab, u32 pdev_id) 845 { 846 int i; 847 struct ath12k_pdev *pdev; 848 849 if (ab->hw_params->single_pdev_only) { 850 pdev = rcu_dereference(ab->pdevs_active[0]); 851 return pdev ? pdev->ar : NULL; 852 } 853 854 if (WARN_ON(pdev_id > ab->num_radios)) 855 return NULL; 856 857 for (i = 0; i < ab->num_radios; i++) { 858 if (ab->fw_mode == ATH12K_FIRMWARE_MODE_FTM) 859 pdev = &ab->pdevs[i]; 860 else 861 pdev = rcu_dereference(ab->pdevs_active[i]); 862 863 if (pdev && pdev->pdev_id == pdev_id) 864 return (pdev->ar ? pdev->ar : NULL); 865 } 866 867 return NULL; 868 } 869 870 static bool ath12k_mac_is_ml_arvif(struct ath12k_link_vif *arvif) 871 { 872 struct ath12k_vif *ahvif = arvif->ahvif; 873 874 lockdep_assert_wiphy(ahvif->ah->hw->wiphy); 875 876 if (ahvif->vif->valid_links & BIT(arvif->link_id)) 877 return true; 878 879 return false; 880 } 881 882 static struct ath12k *ath12k_mac_get_ar_by_chan(struct ieee80211_hw *hw, 883 struct ieee80211_channel *channel) 884 { 885 struct ath12k_hw *ah = hw->priv; 886 struct ath12k *ar; 887 int i; 888 889 ar = ah->radio; 890 891 if (ah->num_radio == 1) 892 return ar; 893 894 for_each_ar(ah, ar, i) { 895 if (channel->center_freq >= KHZ_TO_MHZ(ar->freq_range.start_freq) && 896 channel->center_freq <= KHZ_TO_MHZ(ar->freq_range.end_freq)) 897 return ar; 898 } 899 return NULL; 900 } 901 902 static struct ath12k *ath12k_get_ar_by_ctx(struct ieee80211_hw *hw, 903 struct ieee80211_chanctx_conf *ctx) 904 { 905 if (!ctx) 906 return NULL; 907 908 return ath12k_mac_get_ar_by_chan(hw, ctx->def.chan); 909 } 910 911 struct ath12k *ath12k_get_ar_by_vif(struct ieee80211_hw *hw, 912 struct ieee80211_vif *vif, 913 u8 link_id) 914 { 915 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 916 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 917 struct ath12k_link_vif *arvif; 918 919 lockdep_assert_wiphy(hw->wiphy); 920 921 /* If there is one pdev within ah, then we return 922 * ar directly. 923 */ 924 if (ah->num_radio == 1) 925 return ah->radio; 926 927 if (!(ahvif->links_map & BIT(link_id))) 928 return NULL; 929 930 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 931 if (arvif && arvif->is_created) 932 return arvif->ar; 933 934 return NULL; 935 } 936 937 void ath12k_mac_get_any_chanctx_conf_iter(struct ieee80211_hw *hw, 938 struct ieee80211_chanctx_conf *conf, 939 void *data) 940 { 941 struct ath12k_mac_get_any_chanctx_conf_arg *arg = data; 942 struct ath12k *ctx_ar = ath12k_get_ar_by_ctx(hw, conf); 943 944 if (ctx_ar == arg->ar) 945 arg->chanctx_conf = conf; 946 } 947 948 static struct ath12k_link_vif *ath12k_mac_get_vif_up(struct ath12k *ar) 949 { 950 struct ath12k_link_vif *arvif; 951 952 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 953 954 list_for_each_entry(arvif, &ar->arvifs, list) { 955 if (arvif->is_up) 956 return arvif; 957 } 958 959 return NULL; 960 } 961 962 static bool ath12k_mac_band_match(enum nl80211_band band1, enum WMI_HOST_WLAN_BAND band2) 963 { 964 switch (band1) { 965 case NL80211_BAND_2GHZ: 966 if (band2 & WMI_HOST_WLAN_2GHZ_CAP) 967 return true; 968 break; 969 case NL80211_BAND_5GHZ: 970 case NL80211_BAND_6GHZ: 971 if (band2 & WMI_HOST_WLAN_5GHZ_CAP) 972 return true; 973 break; 974 default: 975 return false; 976 } 977 978 return false; 979 } 980 981 static u8 ath12k_mac_get_target_pdev_id_from_vif(struct ath12k_link_vif *arvif) 982 { 983 struct ath12k *ar = arvif->ar; 984 struct ath12k_base *ab = ar->ab; 985 struct ieee80211_vif *vif = arvif->ahvif->vif; 986 struct cfg80211_chan_def def; 987 enum nl80211_band band; 988 u8 pdev_id = ab->fw_pdev[0].pdev_id; 989 int i; 990 991 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) 992 return pdev_id; 993 994 band = def.chan->band; 995 996 for (i = 0; i < ab->fw_pdev_count; i++) { 997 if (ath12k_mac_band_match(band, ab->fw_pdev[i].supported_bands)) 998 return ab->fw_pdev[i].pdev_id; 999 } 1000 1001 return pdev_id; 1002 } 1003 1004 u8 ath12k_mac_get_target_pdev_id(struct ath12k *ar) 1005 { 1006 struct ath12k_link_vif *arvif; 1007 struct ath12k_base *ab = ar->ab; 1008 1009 if (!ab->hw_params->single_pdev_only) 1010 return ar->pdev->pdev_id; 1011 1012 arvif = ath12k_mac_get_vif_up(ar); 1013 1014 /* fw_pdev array has pdev ids derived from phy capability 1015 * service ready event (pdev_and_hw_link_ids). 1016 * If no vif is active, return default first index. 1017 */ 1018 if (!arvif) 1019 return ar->ab->fw_pdev[0].pdev_id; 1020 1021 /* If active vif is found, return the pdev id matching chandef band */ 1022 return ath12k_mac_get_target_pdev_id_from_vif(arvif); 1023 } 1024 1025 static void ath12k_pdev_caps_update(struct ath12k *ar) 1026 { 1027 struct ath12k_base *ab = ar->ab; 1028 1029 ar->max_tx_power = ab->target_caps.hw_max_tx_power; 1030 1031 /* FIXME: Set min_tx_power to ab->target_caps.hw_min_tx_power. 1032 * But since the received value in svcrdy is same as hw_max_tx_power, 1033 * we can set ar->min_tx_power to 0 currently until 1034 * this is fixed in firmware 1035 */ 1036 ar->min_tx_power = 0; 1037 1038 ar->txpower_limit_2g = ar->max_tx_power; 1039 ar->txpower_limit_5g = ar->max_tx_power; 1040 ar->txpower_scale = WMI_HOST_TP_SCALE_MAX; 1041 } 1042 1043 static int ath12k_mac_txpower_recalc(struct ath12k *ar) 1044 { 1045 struct ath12k_pdev *pdev = ar->pdev; 1046 struct ath12k_link_vif *arvif; 1047 int ret, txpower = -1; 1048 u32 param; 1049 1050 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 1051 1052 list_for_each_entry(arvif, &ar->arvifs, list) { 1053 if (arvif->txpower <= 0) 1054 continue; 1055 1056 if (txpower == -1) 1057 txpower = arvif->txpower; 1058 else 1059 txpower = min(txpower, arvif->txpower); 1060 } 1061 1062 if (txpower == -1) 1063 return 0; 1064 1065 /* txpwr is set as 2 units per dBm in FW*/ 1066 txpower = min_t(u32, max_t(u32, ar->min_tx_power, txpower), 1067 ar->max_tx_power) * 2; 1068 1069 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "txpower to set in hw %d\n", 1070 txpower / 2); 1071 1072 if ((pdev->cap.supported_bands & WMI_HOST_WLAN_2GHZ_CAP) && 1073 ar->txpower_limit_2g != txpower) { 1074 param = WMI_PDEV_PARAM_TXPOWER_LIMIT2G; 1075 ret = ath12k_wmi_pdev_set_param(ar, param, 1076 txpower, ar->pdev->pdev_id); 1077 if (ret) 1078 goto fail; 1079 ar->txpower_limit_2g = txpower; 1080 } 1081 1082 if ((pdev->cap.supported_bands & WMI_HOST_WLAN_5GHZ_CAP) && 1083 ar->txpower_limit_5g != txpower) { 1084 param = WMI_PDEV_PARAM_TXPOWER_LIMIT5G; 1085 ret = ath12k_wmi_pdev_set_param(ar, param, 1086 txpower, ar->pdev->pdev_id); 1087 if (ret) 1088 goto fail; 1089 ar->txpower_limit_5g = txpower; 1090 } 1091 1092 return 0; 1093 1094 fail: 1095 ath12k_warn(ar->ab, "failed to recalc txpower limit %d using pdev param %d: %d\n", 1096 txpower / 2, param, ret); 1097 return ret; 1098 } 1099 1100 static int ath12k_recalc_rtscts_prot(struct ath12k_link_vif *arvif) 1101 { 1102 struct ath12k *ar = arvif->ar; 1103 u32 vdev_param, rts_cts; 1104 int ret; 1105 1106 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 1107 1108 vdev_param = WMI_VDEV_PARAM_ENABLE_RTSCTS; 1109 1110 /* Enable RTS/CTS protection for sw retries (when legacy stations 1111 * are in BSS) or by default only for second rate series. 1112 * TODO: Check if we need to enable CTS 2 Self in any case 1113 */ 1114 rts_cts = WMI_USE_RTS_CTS; 1115 1116 if (arvif->num_legacy_stations > 0) 1117 rts_cts |= WMI_RTSCTS_ACROSS_SW_RETRIES << 4; 1118 else 1119 rts_cts |= WMI_RTSCTS_FOR_SECOND_RATESERIES << 4; 1120 1121 /* Need not send duplicate param value to firmware */ 1122 if (arvif->rtscts_prot_mode == rts_cts) 1123 return 0; 1124 1125 arvif->rtscts_prot_mode = rts_cts; 1126 1127 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d recalc rts/cts prot %d\n", 1128 arvif->vdev_id, rts_cts); 1129 1130 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 1131 vdev_param, rts_cts); 1132 if (ret) 1133 ath12k_warn(ar->ab, "failed to recalculate rts/cts prot for vdev %d: %d\n", 1134 arvif->vdev_id, ret); 1135 1136 return ret; 1137 } 1138 1139 static int ath12k_mac_set_kickout(struct ath12k_link_vif *arvif) 1140 { 1141 struct ath12k *ar = arvif->ar; 1142 u32 param; 1143 int ret; 1144 1145 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_STA_KICKOUT_TH, 1146 ATH12K_KICKOUT_THRESHOLD, 1147 ar->pdev->pdev_id); 1148 if (ret) { 1149 ath12k_warn(ar->ab, "failed to set kickout threshold on vdev %i: %d\n", 1150 arvif->vdev_id, ret); 1151 return ret; 1152 } 1153 1154 param = WMI_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS; 1155 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, 1156 ATH12K_KEEPALIVE_MIN_IDLE); 1157 if (ret) { 1158 ath12k_warn(ar->ab, "failed to set keepalive minimum idle time on vdev %i: %d\n", 1159 arvif->vdev_id, ret); 1160 return ret; 1161 } 1162 1163 param = WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS; 1164 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, 1165 ATH12K_KEEPALIVE_MAX_IDLE); 1166 if (ret) { 1167 ath12k_warn(ar->ab, "failed to set keepalive maximum idle time on vdev %i: %d\n", 1168 arvif->vdev_id, ret); 1169 return ret; 1170 } 1171 1172 param = WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS; 1173 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, 1174 ATH12K_KEEPALIVE_MAX_UNRESPONSIVE); 1175 if (ret) { 1176 ath12k_warn(ar->ab, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n", 1177 arvif->vdev_id, ret); 1178 return ret; 1179 } 1180 1181 return 0; 1182 } 1183 1184 static void ath12k_mac_link_sta_rhash_cleanup(void *data, struct ieee80211_sta *sta) 1185 { 1186 u8 link_id; 1187 unsigned long links_map; 1188 struct ath12k_sta *ahsta; 1189 struct ath12k *ar = data; 1190 struct ath12k_link_sta *arsta; 1191 struct ath12k_link_vif *arvif; 1192 struct ath12k_base *ab = ar->ab; 1193 1194 ahsta = ath12k_sta_to_ahsta(sta); 1195 links_map = ahsta->links_map; 1196 1197 rcu_read_lock(); 1198 for_each_set_bit(link_id, &links_map, IEEE80211_MLD_MAX_NUM_LINKS) { 1199 arsta = rcu_dereference(ahsta->link[link_id]); 1200 if (!arsta) 1201 continue; 1202 arvif = arsta->arvif; 1203 if (!(arvif->ar == ar)) 1204 continue; 1205 1206 spin_lock_bh(&ab->base_lock); 1207 ath12k_link_sta_rhash_delete(ab, arsta); 1208 spin_unlock_bh(&ab->base_lock); 1209 } 1210 rcu_read_unlock(); 1211 } 1212 1213 void ath12k_mac_peer_cleanup_all(struct ath12k *ar) 1214 { 1215 struct ath12k_dp_link_peer *peer, *tmp; 1216 struct ath12k_base *ab = ar->ab; 1217 struct ath12k_dp *dp = ath12k_ab_to_dp(ab); 1218 struct ath12k_link_vif *arvif, *tmp_vif; 1219 struct ath12k_dp_hw *dp_hw = &ar->ah->dp_hw; 1220 struct ath12k_dp_peer *dp_peer = NULL; 1221 u16 peerid_index; 1222 struct list_head peers; 1223 1224 INIT_LIST_HEAD(&peers); 1225 1226 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 1227 1228 spin_lock_bh(&dp->dp_lock); 1229 list_for_each_entry_safe(peer, tmp, &dp->peers, list) { 1230 /* Skip Rx TID cleanup for self peer */ 1231 if (peer->sta && peer->dp_peer) 1232 ath12k_dp_rx_peer_tid_cleanup(ar, peer); 1233 1234 /* cleanup dp peer */ 1235 spin_lock_bh(&dp_hw->peer_lock); 1236 dp_peer = peer->dp_peer; 1237 peerid_index = ath12k_dp_peer_get_peerid_index(dp, peer->peer_id); 1238 rcu_assign_pointer(dp_peer->link_peers[peer->link_id], NULL); 1239 rcu_assign_pointer(dp_hw->dp_peers[peerid_index], NULL); 1240 spin_unlock_bh(&dp_hw->peer_lock); 1241 1242 ath12k_dp_link_peer_rhash_delete(dp, peer); 1243 1244 list_move(&peer->list, &peers); 1245 } 1246 spin_unlock_bh(&dp->dp_lock); 1247 1248 synchronize_rcu(); 1249 1250 list_for_each_entry_safe(peer, tmp, &peers, list) { 1251 ath12k_dp_link_peer_free(peer); 1252 } 1253 1254 ar->num_peers = 0; 1255 ar->num_stations = 0; 1256 1257 /* Cleanup rhash table maintained for arsta by iterating over sta */ 1258 ieee80211_iterate_stations_mtx(ar->ah->hw, ath12k_mac_link_sta_rhash_cleanup, 1259 ar); 1260 1261 /* Delete all the self dp_peers on asserted radio */ 1262 list_for_each_entry_safe_reverse(arvif, tmp_vif, &ar->arvifs, list) { 1263 if ((arvif->ahvif->vdev_type == WMI_VDEV_TYPE_AP) && 1264 (arvif->link_id < IEEE80211_MLD_MAX_NUM_LINKS)) { 1265 ath12k_dp_peer_delete(dp_hw, arvif->bssid, NULL); 1266 arvif->num_stations = 0; 1267 } 1268 } 1269 } 1270 1271 void ath12k_mac_dp_peer_cleanup(struct ath12k_hw *ah) 1272 { 1273 struct list_head peers; 1274 struct ath12k_dp_peer *dp_peer, *tmp; 1275 struct ath12k_dp_hw *dp_hw = &ah->dp_hw; 1276 1277 INIT_LIST_HEAD(&peers); 1278 1279 spin_lock_bh(&dp_hw->peer_lock); 1280 list_for_each_entry_safe(dp_peer, tmp, &dp_hw->dp_peers_list, list) { 1281 if (dp_peer->is_mlo) { 1282 rcu_assign_pointer(dp_hw->dp_peers[dp_peer->peer_id], NULL); 1283 clear_bit(dp_peer->peer_id, ah->free_ml_peer_id_map); 1284 } 1285 1286 list_move(&dp_peer->list, &peers); 1287 } 1288 1289 spin_unlock_bh(&dp_hw->peer_lock); 1290 1291 synchronize_rcu(); 1292 1293 list_for_each_entry_safe(dp_peer, tmp, &peers, list) { 1294 list_del(&dp_peer->list); 1295 kfree(dp_peer); 1296 } 1297 } 1298 1299 static int ath12k_mac_vdev_setup_sync(struct ath12k *ar) 1300 { 1301 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 1302 1303 if (test_bit(ATH12K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags)) 1304 return -ESHUTDOWN; 1305 1306 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "vdev setup timeout %d\n", 1307 ATH12K_VDEV_SETUP_TIMEOUT_HZ); 1308 1309 if (!wait_for_completion_timeout(&ar->vdev_setup_done, 1310 ATH12K_VDEV_SETUP_TIMEOUT_HZ)) 1311 return -ETIMEDOUT; 1312 1313 return ar->last_wmi_vdev_start_status ? -EINVAL : 0; 1314 } 1315 1316 static int ath12k_monitor_vdev_up(struct ath12k *ar, int vdev_id) 1317 { 1318 struct ath12k_wmi_vdev_up_params params = {}; 1319 int ret; 1320 1321 params.vdev_id = vdev_id; 1322 params.bssid = ar->mac_addr; 1323 ret = ath12k_wmi_vdev_up(ar, ¶ms); 1324 if (ret) { 1325 ath12k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n", 1326 vdev_id, ret); 1327 return ret; 1328 } 1329 1330 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %i started\n", 1331 vdev_id); 1332 return 0; 1333 } 1334 1335 static int ath12k_mac_monitor_vdev_start(struct ath12k *ar, int vdev_id, 1336 struct cfg80211_chan_def *chandef) 1337 { 1338 struct ieee80211_channel *channel; 1339 struct wmi_vdev_start_req_arg arg = {}; 1340 struct ath12k_wmi_vdev_up_params params = {}; 1341 int ret; 1342 1343 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 1344 1345 channel = chandef->chan; 1346 arg.vdev_id = vdev_id; 1347 arg.freq = channel->center_freq; 1348 arg.band_center_freq1 = chandef->center_freq1; 1349 arg.band_center_freq2 = chandef->center_freq2; 1350 arg.mode = ath12k_phymodes[chandef->chan->band][chandef->width]; 1351 arg.chan_radar = !!(channel->flags & IEEE80211_CHAN_RADAR); 1352 1353 arg.min_power = 0; 1354 arg.max_power = channel->max_power; 1355 arg.max_reg_power = channel->max_reg_power; 1356 arg.max_antenna_gain = channel->max_antenna_gain; 1357 1358 arg.pref_tx_streams = ar->num_tx_chains; 1359 arg.pref_rx_streams = ar->num_rx_chains; 1360 arg.punct_bitmap = 0xFFFFFFFF; 1361 1362 arg.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR); 1363 1364 reinit_completion(&ar->vdev_setup_done); 1365 reinit_completion(&ar->vdev_delete_done); 1366 1367 ret = ath12k_wmi_vdev_start(ar, &arg, false); 1368 if (ret) { 1369 ath12k_warn(ar->ab, "failed to request monitor vdev %i start: %d\n", 1370 vdev_id, ret); 1371 return ret; 1372 } 1373 1374 ret = ath12k_mac_vdev_setup_sync(ar); 1375 if (ret) { 1376 ath12k_warn(ar->ab, "failed to synchronize setup for monitor vdev %i start: %d\n", 1377 vdev_id, ret); 1378 return ret; 1379 } 1380 1381 params.vdev_id = vdev_id; 1382 params.bssid = ar->mac_addr; 1383 ret = ath12k_wmi_vdev_up(ar, ¶ms); 1384 if (ret) { 1385 ath12k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n", 1386 vdev_id, ret); 1387 goto vdev_stop; 1388 } 1389 1390 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %i started\n", 1391 vdev_id); 1392 return 0; 1393 1394 vdev_stop: 1395 ret = ath12k_wmi_vdev_stop(ar, vdev_id); 1396 if (ret) 1397 ath12k_warn(ar->ab, "failed to stop monitor vdev %i after start failure: %d\n", 1398 vdev_id, ret); 1399 return ret; 1400 } 1401 1402 static int ath12k_mac_monitor_vdev_stop(struct ath12k *ar) 1403 { 1404 int ret; 1405 1406 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 1407 1408 reinit_completion(&ar->vdev_setup_done); 1409 1410 ret = ath12k_wmi_vdev_stop(ar, ar->monitor_vdev_id); 1411 if (ret) 1412 ath12k_warn(ar->ab, "failed to request monitor vdev %i stop: %d\n", 1413 ar->monitor_vdev_id, ret); 1414 1415 ret = ath12k_mac_vdev_setup_sync(ar); 1416 if (ret) 1417 ath12k_warn(ar->ab, "failed to synchronize monitor vdev %i stop: %d\n", 1418 ar->monitor_vdev_id, ret); 1419 1420 ret = ath12k_wmi_vdev_down(ar, ar->monitor_vdev_id); 1421 if (ret) 1422 ath12k_warn(ar->ab, "failed to put down monitor vdev %i: %d\n", 1423 ar->monitor_vdev_id, ret); 1424 1425 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %i stopped\n", 1426 ar->monitor_vdev_id); 1427 return ret; 1428 } 1429 1430 static int ath12k_mac_monitor_vdev_delete(struct ath12k *ar) 1431 { 1432 int ret; 1433 unsigned long time_left; 1434 1435 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 1436 1437 if (!ar->monitor_vdev_created) 1438 return 0; 1439 1440 reinit_completion(&ar->vdev_delete_done); 1441 1442 ret = ath12k_wmi_vdev_delete(ar, ar->monitor_vdev_id); 1443 if (ret) { 1444 ath12k_warn(ar->ab, "failed to request wmi monitor vdev %i removal: %d\n", 1445 ar->monitor_vdev_id, ret); 1446 return ret; 1447 } 1448 1449 time_left = wait_for_completion_timeout(&ar->vdev_delete_done, 1450 ATH12K_VDEV_DELETE_TIMEOUT_HZ); 1451 if (time_left == 0) { 1452 ath12k_warn(ar->ab, "Timeout in receiving vdev delete response\n"); 1453 } else { 1454 ar->allocated_vdev_map &= ~(1LL << ar->monitor_vdev_id); 1455 ar->ab->free_vdev_map |= 1LL << (ar->monitor_vdev_id); 1456 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %d deleted\n", 1457 ar->monitor_vdev_id); 1458 ar->num_created_vdevs--; 1459 ar->monitor_vdev_id = -1; 1460 ar->monitor_vdev_created = false; 1461 } 1462 1463 return ret; 1464 } 1465 1466 static int ath12k_mac_monitor_start(struct ath12k *ar) 1467 { 1468 struct ath12k_mac_get_any_chanctx_conf_arg arg; 1469 int ret; 1470 1471 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 1472 1473 if (ar->monitor_started) 1474 return 0; 1475 1476 arg.ar = ar; 1477 arg.chanctx_conf = NULL; 1478 ieee80211_iter_chan_contexts_atomic(ath12k_ar_to_hw(ar), 1479 ath12k_mac_get_any_chanctx_conf_iter, 1480 &arg); 1481 if (!arg.chanctx_conf) 1482 return 0; 1483 1484 ret = ath12k_mac_monitor_vdev_start(ar, ar->monitor_vdev_id, 1485 &arg.chanctx_conf->def); 1486 if (ret) { 1487 ath12k_warn(ar->ab, "failed to start monitor vdev: %d\n", ret); 1488 return ret; 1489 } 1490 1491 ret = ath12k_dp_tx_htt_monitor_mode_ring_config(ar, false); 1492 if (ret) { 1493 ath12k_warn(ar->ab, "fail to set monitor filter: %d\n", ret); 1494 return ret; 1495 } 1496 1497 ar->monitor_started = true; 1498 ar->num_started_vdevs++; 1499 1500 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor started\n"); 1501 1502 return 0; 1503 } 1504 1505 static int ath12k_mac_monitor_stop(struct ath12k *ar) 1506 { 1507 int ret; 1508 1509 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 1510 1511 if (!ar->monitor_started) 1512 return 0; 1513 1514 ret = ath12k_mac_monitor_vdev_stop(ar); 1515 if (ret) { 1516 ath12k_warn(ar->ab, "failed to stop monitor vdev: %d\n", ret); 1517 return ret; 1518 } 1519 1520 ar->monitor_started = false; 1521 ar->num_started_vdevs--; 1522 ret = ath12k_dp_tx_htt_monitor_mode_ring_config(ar, true); 1523 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor stopped ret %d\n", ret); 1524 return ret; 1525 } 1526 1527 int ath12k_mac_vdev_stop(struct ath12k_link_vif *arvif) 1528 { 1529 struct ath12k_vif *ahvif = arvif->ahvif; 1530 struct ath12k *ar = arvif->ar; 1531 int ret; 1532 1533 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 1534 1535 reinit_completion(&ar->vdev_setup_done); 1536 1537 ret = ath12k_wmi_vdev_stop(ar, arvif->vdev_id); 1538 if (ret) { 1539 ath12k_warn(ar->ab, "failed to stop WMI vdev %i: %d\n", 1540 arvif->vdev_id, ret); 1541 goto err; 1542 } 1543 1544 ret = ath12k_mac_vdev_setup_sync(ar); 1545 if (ret) { 1546 ath12k_warn(ar->ab, "failed to synchronize setup for vdev %i: %d\n", 1547 arvif->vdev_id, ret); 1548 goto err; 1549 } 1550 1551 WARN_ON(ar->num_started_vdevs == 0); 1552 1553 ar->num_started_vdevs--; 1554 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "vdev %pM stopped, vdev_id %d\n", 1555 ahvif->vif->addr, arvif->vdev_id); 1556 1557 if (test_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags)) { 1558 clear_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags); 1559 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "CAC Stopped for vdev %d\n", 1560 arvif->vdev_id); 1561 } 1562 1563 return 0; 1564 err: 1565 return ret; 1566 } 1567 1568 int ath12k_mac_op_config(struct ieee80211_hw *hw, int radio_idx, u32 changed) 1569 { 1570 return 0; 1571 } 1572 EXPORT_SYMBOL(ath12k_mac_op_config); 1573 1574 static int ath12k_mac_setup_bcn_p2p_ie(struct ath12k_link_vif *arvif, 1575 struct sk_buff *bcn) 1576 { 1577 struct ath12k *ar = arvif->ar; 1578 struct ieee80211_mgmt *mgmt; 1579 const u8 *p2p_ie; 1580 int ret; 1581 1582 mgmt = (void *)bcn->data; 1583 p2p_ie = cfg80211_find_vendor_ie(WLAN_OUI_WFA, WLAN_OUI_TYPE_WFA_P2P, 1584 mgmt->u.beacon.variable, 1585 bcn->len - (mgmt->u.beacon.variable - 1586 bcn->data)); 1587 if (!p2p_ie) { 1588 ath12k_warn(ar->ab, "no P2P ie found in beacon\n"); 1589 return -ENOENT; 1590 } 1591 1592 ret = ath12k_wmi_p2p_go_bcn_ie(ar, arvif->vdev_id, p2p_ie); 1593 if (ret) { 1594 ath12k_warn(ar->ab, "failed to submit P2P GO bcn ie for vdev %i: %d\n", 1595 arvif->vdev_id, ret); 1596 return ret; 1597 } 1598 1599 return 0; 1600 } 1601 1602 static int ath12k_mac_remove_vendor_ie(struct sk_buff *skb, unsigned int oui, 1603 u8 oui_type, size_t ie_offset) 1604 { 1605 const u8 *next, *end; 1606 size_t len; 1607 u8 *ie; 1608 1609 if (WARN_ON(skb->len < ie_offset)) 1610 return -EINVAL; 1611 1612 ie = (u8 *)cfg80211_find_vendor_ie(oui, oui_type, 1613 skb->data + ie_offset, 1614 skb->len - ie_offset); 1615 if (!ie) 1616 return -ENOENT; 1617 1618 len = ie[1] + 2; 1619 end = skb->data + skb->len; 1620 next = ie + len; 1621 1622 if (WARN_ON(next > end)) 1623 return -EINVAL; 1624 1625 memmove(ie, next, end - next); 1626 skb_trim(skb, skb->len - len); 1627 1628 return 0; 1629 } 1630 1631 static void ath12k_mac_set_arvif_ies(struct ath12k_link_vif *arvif, 1632 struct ath12k_link_vif *tx_arvif, 1633 struct sk_buff *bcn, 1634 u8 bssid_index, bool *nontx_profile_found) 1635 { 1636 struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)bcn->data; 1637 const struct element *elem, *nontx, *index, *nie, *ext_cap_ie; 1638 const u8 *start, *tail; 1639 u16 rem_len; 1640 u8 i; 1641 1642 start = bcn->data + ieee80211_get_hdrlen_from_skb(bcn) + sizeof(mgmt->u.beacon); 1643 tail = skb_tail_pointer(bcn); 1644 rem_len = tail - start; 1645 1646 arvif->rsnie_present = false; 1647 arvif->wpaie_present = false; 1648 1649 if (cfg80211_find_ie(WLAN_EID_RSN, start, rem_len)) 1650 arvif->rsnie_present = true; 1651 if (cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT, WLAN_OUI_TYPE_MICROSOFT_WPA, 1652 start, rem_len)) 1653 arvif->wpaie_present = true; 1654 1655 ext_cap_ie = cfg80211_find_elem(WLAN_EID_EXT_CAPABILITY, start, rem_len); 1656 if (ext_cap_ie && ext_cap_ie->datalen >= 11 && 1657 (ext_cap_ie->data[10] & WLAN_EXT_CAPA11_BCN_PROTECT)) 1658 tx_arvif->beacon_prot = true; 1659 1660 /* Return from here for the transmitted profile */ 1661 if (!bssid_index) 1662 return; 1663 1664 /* Initial rsnie_present for the nontransmitted profile is set to be same as that 1665 * of the transmitted profile. It will be changed if security configurations are 1666 * different. 1667 */ 1668 *nontx_profile_found = false; 1669 for_each_element_id(elem, WLAN_EID_MULTIPLE_BSSID, start, rem_len) { 1670 /* Fixed minimum MBSSID element length with at least one 1671 * nontransmitted BSSID profile is 12 bytes as given below; 1672 * 1 (max BSSID indicator) + 1673 * 2 (Nontransmitted BSSID profile: Subelement ID + length) + 1674 * 4 (Nontransmitted BSSID Capabilities: tag + length + info) 1675 * 2 (Nontransmitted BSSID SSID: tag + length) 1676 * 3 (Nontransmitted BSSID Index: tag + length + BSSID index 1677 */ 1678 if (elem->datalen < 12 || elem->data[0] < 1) 1679 continue; /* Max BSSID indicator must be >=1 */ 1680 1681 for_each_element(nontx, elem->data + 1, elem->datalen - 1) { 1682 start = nontx->data; 1683 1684 if (nontx->id != 0 || nontx->datalen < 4) 1685 continue; /* Invalid nontransmitted profile */ 1686 1687 if (nontx->data[0] != WLAN_EID_NON_TX_BSSID_CAP || 1688 nontx->data[1] != 2) { 1689 continue; /* Missing nontransmitted BSS capabilities */ 1690 } 1691 1692 if (nontx->data[4] != WLAN_EID_SSID) 1693 continue; /* Missing SSID for nontransmitted BSS */ 1694 1695 index = cfg80211_find_elem(WLAN_EID_MULTI_BSSID_IDX, 1696 start, nontx->datalen); 1697 if (!index || index->datalen < 1 || index->data[0] == 0) 1698 continue; /* Invalid MBSSID Index element */ 1699 1700 if (index->data[0] == bssid_index) { 1701 *nontx_profile_found = true; 1702 1703 /* Check if nontx BSS has beacon protection enabled */ 1704 if (!tx_arvif->beacon_prot) { 1705 ext_cap_ie = 1706 cfg80211_find_elem(WLAN_EID_EXT_CAPABILITY, 1707 nontx->data, 1708 nontx->datalen); 1709 if (ext_cap_ie && ext_cap_ie->datalen >= 11 && 1710 (ext_cap_ie->data[10] & 1711 WLAN_EXT_CAPA11_BCN_PROTECT)) 1712 tx_arvif->beacon_prot = true; 1713 } 1714 1715 if (cfg80211_find_ie(WLAN_EID_RSN, 1716 nontx->data, 1717 nontx->datalen)) { 1718 arvif->rsnie_present = true; 1719 return; 1720 } else if (!arvif->rsnie_present) { 1721 return; /* Both tx and nontx BSS are open */ 1722 } 1723 1724 nie = cfg80211_find_ext_elem(WLAN_EID_EXT_NON_INHERITANCE, 1725 nontx->data, 1726 nontx->datalen); 1727 if (!nie || nie->datalen < 2) 1728 return; /* Invalid non-inheritance element */ 1729 1730 for (i = 1; i < nie->datalen - 1; i++) { 1731 if (nie->data[i] == WLAN_EID_RSN) { 1732 arvif->rsnie_present = false; 1733 break; 1734 } 1735 } 1736 1737 return; 1738 } 1739 } 1740 } 1741 } 1742 1743 static int ath12k_mac_setup_bcn_tmpl_ema(struct ath12k_link_vif *arvif, 1744 struct ath12k_link_vif *tx_arvif, 1745 u8 bssid_index) 1746 { 1747 struct ath12k_wmi_bcn_tmpl_ema_arg ema_args; 1748 struct ieee80211_ema_beacons *beacons; 1749 bool nontx_profile_found = false; 1750 int ret = 0; 1751 u8 i; 1752 1753 beacons = ieee80211_beacon_get_template_ema_list(ath12k_ar_to_hw(tx_arvif->ar), 1754 tx_arvif->ahvif->vif, 1755 tx_arvif->link_id); 1756 if (!beacons || !beacons->cnt) { 1757 ath12k_warn(arvif->ar->ab, 1758 "failed to get ema beacon templates from mac80211\n"); 1759 return -EPERM; 1760 } 1761 1762 if (tx_arvif == arvif) 1763 ath12k_mac_set_arvif_ies(arvif, tx_arvif, beacons->bcn[0].skb, 0, NULL); 1764 1765 for (i = 0; i < beacons->cnt; i++) { 1766 if (tx_arvif != arvif && !nontx_profile_found) 1767 ath12k_mac_set_arvif_ies(arvif, tx_arvif, beacons->bcn[i].skb, 1768 bssid_index, 1769 &nontx_profile_found); 1770 1771 ema_args.bcn_cnt = beacons->cnt; 1772 ema_args.bcn_index = i; 1773 ret = ath12k_wmi_bcn_tmpl(tx_arvif, &beacons->bcn[i].offs, 1774 beacons->bcn[i].skb, &ema_args); 1775 if (ret) { 1776 ath12k_warn(tx_arvif->ar->ab, 1777 "failed to set ema beacon template id %i error %d\n", 1778 i, ret); 1779 break; 1780 } 1781 } 1782 1783 if (tx_arvif != arvif && !nontx_profile_found) 1784 ath12k_warn(arvif->ar->ab, 1785 "nontransmitted bssid index %u not found in beacon template\n", 1786 bssid_index); 1787 1788 ieee80211_beacon_free_ema_list(beacons); 1789 return ret; 1790 } 1791 1792 static int ath12k_mac_setup_bcn_tmpl(struct ath12k_link_vif *arvif) 1793 { 1794 struct ath12k_vif *ahvif = arvif->ahvif; 1795 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif); 1796 struct ieee80211_bss_conf *link_conf; 1797 struct ath12k_link_vif *tx_arvif; 1798 struct ath12k *ar = arvif->ar; 1799 struct ath12k_base *ab = ar->ab; 1800 struct ieee80211_mutable_offsets offs = {}; 1801 bool nontx_profile_found = false; 1802 struct sk_buff *bcn; 1803 int ret; 1804 1805 if (ahvif->vdev_type != WMI_VDEV_TYPE_AP) 1806 return 0; 1807 1808 link_conf = ath12k_mac_get_link_bss_conf(arvif); 1809 if (!link_conf) { 1810 ath12k_warn(ar->ab, "unable to access bss link conf to set bcn tmpl for vif %pM link %u\n", 1811 vif->addr, arvif->link_id); 1812 return -ENOLINK; 1813 } 1814 1815 tx_arvif = ath12k_mac_get_tx_arvif(arvif, link_conf); 1816 if (tx_arvif) { 1817 if (tx_arvif != arvif && arvif->is_up) 1818 return 0; 1819 1820 if (link_conf->ema_ap) 1821 return ath12k_mac_setup_bcn_tmpl_ema(arvif, tx_arvif, 1822 link_conf->bssid_index); 1823 } else { 1824 tx_arvif = arvif; 1825 } 1826 1827 bcn = ieee80211_beacon_get_template(ath12k_ar_to_hw(tx_arvif->ar), 1828 tx_arvif->ahvif->vif, 1829 &offs, tx_arvif->link_id); 1830 if (!bcn) { 1831 ath12k_warn(ab, "failed to get beacon template from mac80211\n"); 1832 return -EPERM; 1833 } 1834 1835 if (tx_arvif == arvif) { 1836 ath12k_mac_set_arvif_ies(arvif, tx_arvif, bcn, 0, NULL); 1837 } else { 1838 ath12k_mac_set_arvif_ies(arvif, tx_arvif, bcn, 1839 link_conf->bssid_index, 1840 &nontx_profile_found); 1841 if (!nontx_profile_found) 1842 ath12k_warn(ab, 1843 "nontransmitted profile not found in beacon template\n"); 1844 } 1845 1846 if (ahvif->vif->type == NL80211_IFTYPE_AP && ahvif->vif->p2p) { 1847 ret = ath12k_mac_setup_bcn_p2p_ie(arvif, bcn); 1848 if (ret) { 1849 ath12k_warn(ab, "failed to setup P2P GO bcn ie: %d\n", 1850 ret); 1851 goto free_bcn_skb; 1852 } 1853 1854 /* P2P IE is inserted by firmware automatically (as 1855 * configured above) so remove it from the base beacon 1856 * template to avoid duplicate P2P IEs in beacon frames. 1857 */ 1858 ret = ath12k_mac_remove_vendor_ie(bcn, WLAN_OUI_WFA, 1859 WLAN_OUI_TYPE_WFA_P2P, 1860 offsetof(struct ieee80211_mgmt, 1861 u.beacon.variable)); 1862 if (ret) { 1863 ath12k_warn(ab, "failed to remove P2P vendor ie: %d\n", 1864 ret); 1865 goto free_bcn_skb; 1866 } 1867 } 1868 1869 ret = ath12k_wmi_bcn_tmpl(arvif, &offs, bcn, NULL); 1870 1871 if (ret) 1872 ath12k_warn(ab, "failed to submit beacon template command: %d\n", 1873 ret); 1874 1875 free_bcn_skb: 1876 kfree_skb(bcn); 1877 return ret; 1878 } 1879 1880 static void ath12k_control_beaconing(struct ath12k_link_vif *arvif, 1881 struct ieee80211_bss_conf *info) 1882 { 1883 struct ath12k_wmi_vdev_up_params params = {}; 1884 struct ath12k_vif *ahvif = arvif->ahvif; 1885 struct ath12k *ar = arvif->ar; 1886 int ret; 1887 1888 lockdep_assert_wiphy(ath12k_ar_to_hw(arvif->ar)->wiphy); 1889 1890 if (!info->enable_beacon) { 1891 ret = ath12k_wmi_vdev_down(ar, arvif->vdev_id); 1892 if (ret) 1893 ath12k_warn(ar->ab, "failed to down vdev_id %i: %d\n", 1894 arvif->vdev_id, ret); 1895 1896 arvif->is_up = false; 1897 return; 1898 } 1899 1900 /* Install the beacon template to the FW */ 1901 ret = ath12k_mac_setup_bcn_tmpl(arvif); 1902 if (ret) { 1903 ath12k_warn(ar->ab, "failed to update bcn tmpl during vdev up: %d\n", 1904 ret); 1905 return; 1906 } 1907 1908 ahvif->aid = 0; 1909 1910 ether_addr_copy(arvif->bssid, info->addr); 1911 1912 params.vdev_id = arvif->vdev_id; 1913 params.aid = ahvif->aid; 1914 params.bssid = arvif->bssid; 1915 params.tx_bssid = ath12k_mac_get_tx_bssid(arvif); 1916 if (params.tx_bssid) { 1917 params.nontx_profile_idx = info->bssid_index; 1918 params.nontx_profile_cnt = 1 << info->bssid_indicator; 1919 } 1920 ret = ath12k_wmi_vdev_up(arvif->ar, ¶ms); 1921 if (ret) { 1922 ath12k_warn(ar->ab, "failed to bring up vdev %d: %i\n", 1923 arvif->vdev_id, ret); 1924 return; 1925 } 1926 1927 arvif->is_up = true; 1928 1929 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id); 1930 } 1931 1932 static void ath12k_mac_handle_beacon_iter(void *data, u8 *mac, 1933 struct ieee80211_vif *vif) 1934 { 1935 struct sk_buff *skb = data; 1936 struct ieee80211_mgmt *mgmt = (void *)skb->data; 1937 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 1938 struct ath12k_link_vif *arvif = &ahvif->deflink; 1939 1940 if (vif->type != NL80211_IFTYPE_STATION || !arvif->is_created) 1941 return; 1942 1943 if (!ether_addr_equal(mgmt->bssid, vif->bss_conf.bssid)) 1944 return; 1945 1946 cancel_delayed_work(&arvif->connection_loss_work); 1947 } 1948 1949 void ath12k_mac_handle_beacon(struct ath12k *ar, struct sk_buff *skb) 1950 { 1951 ieee80211_iterate_active_interfaces_atomic(ath12k_ar_to_hw(ar), 1952 IEEE80211_IFACE_ITER_NORMAL, 1953 ath12k_mac_handle_beacon_iter, 1954 skb); 1955 } 1956 1957 void ath12k_mac_handle_beacon_miss(struct ath12k *ar, 1958 struct ath12k_link_vif *arvif) 1959 { 1960 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar); 1961 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 1962 1963 if (!(arvif->is_created && arvif->is_up)) 1964 return; 1965 1966 ieee80211_beacon_loss(vif); 1967 1968 /* Firmware doesn't report beacon loss events repeatedly. If AP probe 1969 * (done by mac80211) succeeds but beacons do not resume then it 1970 * doesn't make sense to continue operation. Queue connection loss work 1971 * which can be cancelled when beacon is received. 1972 */ 1973 ieee80211_queue_delayed_work(hw, &arvif->connection_loss_work, 1974 ATH12K_CONNECTION_LOSS_HZ); 1975 } 1976 1977 static void ath12k_mac_vif_sta_connection_loss_work(struct work_struct *work) 1978 { 1979 struct ath12k_link_vif *arvif = container_of(work, struct ath12k_link_vif, 1980 connection_loss_work.work); 1981 struct ieee80211_vif *vif = arvif->ahvif->vif; 1982 1983 if (!arvif->is_up) 1984 return; 1985 1986 ieee80211_connection_loss(vif); 1987 } 1988 1989 static void ath12k_peer_assoc_h_basic(struct ath12k *ar, 1990 struct ath12k_link_vif *arvif, 1991 struct ath12k_link_sta *arsta, 1992 struct ath12k_wmi_peer_assoc_arg *arg) 1993 { 1994 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 1995 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 1996 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar); 1997 struct ieee80211_bss_conf *bss_conf; 1998 u32 aid; 1999 2000 lockdep_assert_wiphy(hw->wiphy); 2001 2002 if (vif->type == NL80211_IFTYPE_STATION) 2003 aid = vif->cfg.aid; 2004 else 2005 aid = sta->aid; 2006 2007 ether_addr_copy(arg->peer_mac, arsta->addr); 2008 arg->vdev_id = arvif->vdev_id; 2009 arg->peer_associd = aid; 2010 arg->auth_flag = true; 2011 /* TODO: STA WAR in ath10k for listen interval required? */ 2012 arg->peer_listen_intval = hw->conf.listen_interval; 2013 arg->peer_nss = 1; 2014 2015 bss_conf = ath12k_mac_get_link_bss_conf(arvif); 2016 if (!bss_conf) { 2017 ath12k_warn(ar->ab, "unable to access bss link conf in peer assoc for vif %pM link %u\n", 2018 vif->addr, arvif->link_id); 2019 return; 2020 } 2021 2022 arg->peer_caps = bss_conf->assoc_capability; 2023 } 2024 2025 static void ath12k_peer_assoc_h_crypto(struct ath12k *ar, 2026 struct ath12k_link_vif *arvif, 2027 struct ath12k_link_sta *arsta, 2028 struct ath12k_wmi_peer_assoc_arg *arg) 2029 { 2030 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 2031 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 2032 struct ieee80211_bss_conf *info; 2033 struct cfg80211_chan_def def; 2034 struct cfg80211_bss *bss; 2035 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar); 2036 const u8 *rsnie = NULL; 2037 const u8 *wpaie = NULL; 2038 2039 lockdep_assert_wiphy(hw->wiphy); 2040 2041 info = ath12k_mac_get_link_bss_conf(arvif); 2042 if (!info) { 2043 ath12k_warn(ar->ab, "unable to access bss link conf for peer assoc crypto for vif %pM link %u\n", 2044 vif->addr, arvif->link_id); 2045 return; 2046 } 2047 2048 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) 2049 return; 2050 2051 bss = cfg80211_get_bss(hw->wiphy, def.chan, info->bssid, NULL, 0, 2052 IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY); 2053 2054 if (arvif->rsnie_present || arvif->wpaie_present) { 2055 arg->need_ptk_4_way = true; 2056 if (arvif->wpaie_present) 2057 arg->need_gtk_2_way = true; 2058 } else if (bss) { 2059 const struct cfg80211_bss_ies *ies; 2060 2061 rcu_read_lock(); 2062 rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN); 2063 2064 ies = rcu_dereference(bss->ies); 2065 2066 wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT, 2067 WLAN_OUI_TYPE_MICROSOFT_WPA, 2068 ies->data, 2069 ies->len); 2070 rcu_read_unlock(); 2071 cfg80211_put_bss(hw->wiphy, bss); 2072 } 2073 2074 /* FIXME: base on RSN IE/WPA IE is a correct idea? */ 2075 if (rsnie || wpaie) { 2076 ath12k_dbg(ar->ab, ATH12K_DBG_WMI, 2077 "%s: rsn ie found\n", __func__); 2078 arg->need_ptk_4_way = true; 2079 } 2080 2081 if (wpaie) { 2082 ath12k_dbg(ar->ab, ATH12K_DBG_WMI, 2083 "%s: wpa ie found\n", __func__); 2084 arg->need_gtk_2_way = true; 2085 } 2086 2087 if (sta->mfp) { 2088 /* TODO: Need to check if FW supports PMF? */ 2089 arg->is_pmf_enabled = true; 2090 } 2091 2092 /* TODO: safe_mode_enabled (bypass 4-way handshake) flag req? */ 2093 } 2094 2095 static void ath12k_peer_assoc_h_rates(struct ath12k *ar, 2096 struct ath12k_link_vif *arvif, 2097 struct ath12k_link_sta *arsta, 2098 struct ath12k_wmi_peer_assoc_arg *arg) 2099 { 2100 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 2101 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 2102 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates; 2103 struct ieee80211_link_sta *link_sta; 2104 struct cfg80211_chan_def def; 2105 const struct ieee80211_supported_band *sband; 2106 const struct ieee80211_rate *rates; 2107 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar); 2108 enum nl80211_band band; 2109 u32 ratemask; 2110 u8 rate; 2111 int i; 2112 2113 lockdep_assert_wiphy(hw->wiphy); 2114 2115 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) 2116 return; 2117 2118 link_sta = ath12k_mac_get_link_sta(arsta); 2119 if (!link_sta) { 2120 ath12k_warn(ar->ab, "unable to access link sta in peer assoc rates for sta %pM link %u\n", 2121 sta->addr, arsta->link_id); 2122 return; 2123 } 2124 2125 band = def.chan->band; 2126 sband = hw->wiphy->bands[band]; 2127 ratemask = link_sta->supp_rates[band]; 2128 ratemask &= arvif->bitrate_mask.control[band].legacy; 2129 rates = sband->bitrates; 2130 2131 rateset->num_rates = 0; 2132 2133 for (i = 0; i < 32; i++, ratemask >>= 1, rates++) { 2134 if (!(ratemask & 1)) 2135 continue; 2136 2137 rate = ath12k_mac_bitrate_to_rate(rates->bitrate); 2138 rateset->rates[rateset->num_rates] = rate; 2139 rateset->num_rates++; 2140 } 2141 } 2142 2143 static bool 2144 ath12k_peer_assoc_h_ht_masked(const u8 *ht_mcs_mask) 2145 { 2146 int nss; 2147 2148 for (nss = 0; nss < IEEE80211_HT_MCS_MASK_LEN; nss++) 2149 if (ht_mcs_mask[nss]) 2150 return false; 2151 2152 return true; 2153 } 2154 2155 static bool 2156 ath12k_peer_assoc_h_vht_masked(const u16 *vht_mcs_mask) 2157 { 2158 int nss; 2159 2160 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) 2161 if (vht_mcs_mask[nss]) 2162 return false; 2163 2164 return true; 2165 } 2166 2167 static void ath12k_peer_assoc_h_ht(struct ath12k *ar, 2168 struct ath12k_link_vif *arvif, 2169 struct ath12k_link_sta *arsta, 2170 struct ath12k_wmi_peer_assoc_arg *arg) 2171 { 2172 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 2173 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 2174 const struct ieee80211_sta_ht_cap *ht_cap; 2175 struct ieee80211_link_sta *link_sta; 2176 struct cfg80211_chan_def def; 2177 enum nl80211_band band; 2178 const u8 *ht_mcs_mask; 2179 int i, n; 2180 u8 max_nss; 2181 u32 stbc; 2182 2183 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 2184 2185 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) 2186 return; 2187 2188 link_sta = ath12k_mac_get_link_sta(arsta); 2189 if (!link_sta) { 2190 ath12k_warn(ar->ab, "unable to access link sta in peer assoc ht for sta %pM link %u\n", 2191 sta->addr, arsta->link_id); 2192 return; 2193 } 2194 2195 ht_cap = &link_sta->ht_cap; 2196 if (!ht_cap->ht_supported) 2197 return; 2198 2199 band = def.chan->band; 2200 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs; 2201 2202 if (ath12k_peer_assoc_h_ht_masked(ht_mcs_mask)) 2203 return; 2204 2205 arg->ht_flag = true; 2206 2207 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR + 2208 ht_cap->ampdu_factor)) - 1; 2209 2210 arg->peer_mpdu_density = 2211 ath12k_parse_mpdudensity(ht_cap->ampdu_density); 2212 2213 arg->peer_ht_caps = ht_cap->cap; 2214 arg->peer_rate_caps |= WMI_HOST_RC_HT_FLAG; 2215 2216 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING) 2217 arg->ldpc_flag = true; 2218 2219 if (link_sta->bandwidth >= IEEE80211_STA_RX_BW_40) { 2220 arg->bw_40 = true; 2221 arg->peer_rate_caps |= WMI_HOST_RC_CW40_FLAG; 2222 } 2223 2224 /* As firmware handles these two flags (IEEE80211_HT_CAP_SGI_20 2225 * and IEEE80211_HT_CAP_SGI_40) for enabling SGI, reset both 2226 * flags if guard interval is to force Long GI 2227 */ 2228 if (arvif->bitrate_mask.control[band].gi == NL80211_TXRATE_FORCE_LGI) { 2229 arg->peer_ht_caps &= ~(IEEE80211_HT_CAP_SGI_20 | IEEE80211_HT_CAP_SGI_40); 2230 } else { 2231 /* Enable SGI flag if either SGI_20 or SGI_40 is supported */ 2232 if (ht_cap->cap & (IEEE80211_HT_CAP_SGI_20 | IEEE80211_HT_CAP_SGI_40)) 2233 arg->peer_rate_caps |= WMI_HOST_RC_SGI_FLAG; 2234 } 2235 2236 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) { 2237 arg->peer_rate_caps |= WMI_HOST_RC_TX_STBC_FLAG; 2238 arg->stbc_flag = true; 2239 } 2240 2241 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) { 2242 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC; 2243 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT; 2244 stbc = stbc << WMI_HOST_RC_RX_STBC_FLAG_S; 2245 arg->peer_rate_caps |= stbc; 2246 arg->stbc_flag = true; 2247 } 2248 2249 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2]) 2250 arg->peer_rate_caps |= WMI_HOST_RC_TS_FLAG; 2251 else if (ht_cap->mcs.rx_mask[1]) 2252 arg->peer_rate_caps |= WMI_HOST_RC_DS_FLAG; 2253 2254 for (i = 0, n = 0, max_nss = 0; i < IEEE80211_HT_MCS_MASK_LEN * 8; i++) 2255 if ((ht_cap->mcs.rx_mask[i / 8] & BIT(i % 8)) && 2256 (ht_mcs_mask[i / 8] & BIT(i % 8))) { 2257 max_nss = (i / 8) + 1; 2258 arg->peer_ht_rates.rates[n++] = i; 2259 } 2260 2261 /* This is a workaround for HT-enabled STAs which break the spec 2262 * and have no HT capabilities RX mask (no HT RX MCS map). 2263 * 2264 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS), 2265 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs. 2266 * 2267 * Firmware asserts if such situation occurs. 2268 */ 2269 if (n == 0) { 2270 arg->peer_ht_rates.num_rates = 8; 2271 for (i = 0; i < arg->peer_ht_rates.num_rates; i++) 2272 arg->peer_ht_rates.rates[i] = i; 2273 } else { 2274 arg->peer_ht_rates.num_rates = n; 2275 arg->peer_nss = min(link_sta->rx_nss, max_nss); 2276 } 2277 2278 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n", 2279 arg->peer_mac, 2280 arg->peer_ht_rates.num_rates, 2281 arg->peer_nss); 2282 } 2283 2284 static int ath12k_mac_get_max_vht_mcs_map(u16 mcs_map, int nss) 2285 { 2286 switch ((mcs_map >> (2 * nss)) & 0x3) { 2287 case IEEE80211_VHT_MCS_SUPPORT_0_7: return BIT(8) - 1; 2288 case IEEE80211_VHT_MCS_SUPPORT_0_8: return BIT(9) - 1; 2289 case IEEE80211_VHT_MCS_SUPPORT_0_9: return BIT(10) - 1; 2290 } 2291 return 0; 2292 } 2293 2294 static u16 2295 ath12k_peer_assoc_h_vht_limit(u16 tx_mcs_set, 2296 const u16 vht_mcs_limit[NL80211_VHT_NSS_MAX]) 2297 { 2298 int idx_limit; 2299 int nss; 2300 u16 mcs_map; 2301 u16 mcs; 2302 2303 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) { 2304 mcs_map = ath12k_mac_get_max_vht_mcs_map(tx_mcs_set, nss) & 2305 vht_mcs_limit[nss]; 2306 2307 if (mcs_map) 2308 idx_limit = fls(mcs_map) - 1; 2309 else 2310 idx_limit = -1; 2311 2312 switch (idx_limit) { 2313 case 0: 2314 case 1: 2315 case 2: 2316 case 3: 2317 case 4: 2318 case 5: 2319 case 6: 2320 case 7: 2321 mcs = IEEE80211_VHT_MCS_SUPPORT_0_7; 2322 break; 2323 case 8: 2324 mcs = IEEE80211_VHT_MCS_SUPPORT_0_8; 2325 break; 2326 case 9: 2327 mcs = IEEE80211_VHT_MCS_SUPPORT_0_9; 2328 break; 2329 default: 2330 WARN_ON(1); 2331 fallthrough; 2332 case -1: 2333 mcs = IEEE80211_VHT_MCS_NOT_SUPPORTED; 2334 break; 2335 } 2336 2337 tx_mcs_set &= ~(0x3 << (nss * 2)); 2338 tx_mcs_set |= mcs << (nss * 2); 2339 } 2340 2341 return tx_mcs_set; 2342 } 2343 2344 static u8 ath12k_get_nss_160mhz(struct ath12k *ar, 2345 u8 max_nss) 2346 { 2347 u8 nss_ratio_info = ar->pdev->cap.nss_ratio_info; 2348 u8 max_sup_nss = 0; 2349 2350 switch (nss_ratio_info) { 2351 case WMI_NSS_RATIO_1BY2_NSS: 2352 max_sup_nss = max_nss >> 1; 2353 break; 2354 case WMI_NSS_RATIO_3BY4_NSS: 2355 ath12k_warn(ar->ab, "WMI_NSS_RATIO_3BY4_NSS not supported\n"); 2356 break; 2357 case WMI_NSS_RATIO_1_NSS: 2358 max_sup_nss = max_nss; 2359 break; 2360 case WMI_NSS_RATIO_2_NSS: 2361 ath12k_warn(ar->ab, "WMI_NSS_RATIO_2_NSS not supported\n"); 2362 break; 2363 default: 2364 ath12k_warn(ar->ab, "invalid nss ratio received from fw: %d\n", 2365 nss_ratio_info); 2366 break; 2367 } 2368 2369 return max_sup_nss; 2370 } 2371 2372 static void ath12k_peer_assoc_h_vht(struct ath12k *ar, 2373 struct ath12k_link_vif *arvif, 2374 struct ath12k_link_sta *arsta, 2375 struct ath12k_wmi_peer_assoc_arg *arg) 2376 { 2377 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 2378 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 2379 const struct ieee80211_sta_vht_cap *vht_cap; 2380 struct ieee80211_link_sta *link_sta; 2381 struct cfg80211_chan_def def; 2382 enum nl80211_band band; 2383 u16 *vht_mcs_mask; 2384 u8 ampdu_factor; 2385 u8 max_nss, vht_mcs; 2386 int i, vht_nss, nss_idx; 2387 bool user_rate_valid = true; 2388 u32 rx_nss, tx_nss, nss_160; 2389 2390 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 2391 2392 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) 2393 return; 2394 2395 link_sta = ath12k_mac_get_link_sta(arsta); 2396 if (!link_sta) { 2397 ath12k_warn(ar->ab, "unable to access link sta in peer assoc vht for sta %pM link %u\n", 2398 sta->addr, arsta->link_id); 2399 return; 2400 } 2401 2402 vht_cap = &link_sta->vht_cap; 2403 if (!vht_cap->vht_supported) 2404 return; 2405 2406 band = def.chan->band; 2407 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs; 2408 2409 if (ath12k_peer_assoc_h_vht_masked(vht_mcs_mask)) 2410 return; 2411 2412 arg->vht_flag = true; 2413 2414 /* TODO: similar flags required? */ 2415 arg->vht_capable = true; 2416 2417 if (def.chan->band == NL80211_BAND_2GHZ) 2418 arg->vht_ng_flag = true; 2419 2420 arg->peer_vht_caps = vht_cap->cap; 2421 2422 ampdu_factor = (vht_cap->cap & 2423 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >> 2424 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT; 2425 2426 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to 2427 * zero in VHT IE. Using it would result in degraded throughput. 2428 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep 2429 * it if VHT max_mpdu is smaller. 2430 */ 2431 arg->peer_max_mpdu = max(arg->peer_max_mpdu, 2432 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR + 2433 ampdu_factor)) - 1); 2434 2435 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80) 2436 arg->bw_80 = true; 2437 2438 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) 2439 arg->bw_160 = true; 2440 2441 vht_nss = ath12k_mac_max_vht_nss(vht_mcs_mask); 2442 2443 if (vht_nss > link_sta->rx_nss) { 2444 user_rate_valid = false; 2445 for (nss_idx = link_sta->rx_nss - 1; nss_idx >= 0; nss_idx--) { 2446 if (vht_mcs_mask[nss_idx]) { 2447 user_rate_valid = true; 2448 break; 2449 } 2450 } 2451 } 2452 2453 if (!user_rate_valid) { 2454 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 2455 "Setting vht range MCS value to peer supported nss:%d for peer %pM\n", 2456 link_sta->rx_nss, arsta->addr); 2457 vht_mcs_mask[link_sta->rx_nss - 1] = vht_mcs_mask[vht_nss - 1]; 2458 } 2459 2460 /* Calculate peer NSS capability from VHT capabilities if STA 2461 * supports VHT. 2462 */ 2463 for (i = 0, max_nss = 0, vht_mcs = 0; i < NL80211_VHT_NSS_MAX; i++) { 2464 vht_mcs = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map) >> 2465 (2 * i) & 3; 2466 2467 if (vht_mcs != IEEE80211_VHT_MCS_NOT_SUPPORTED && 2468 vht_mcs_mask[i]) 2469 max_nss = i + 1; 2470 } 2471 arg->peer_nss = min(link_sta->rx_nss, max_nss); 2472 arg->rx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.rx_highest); 2473 arg->rx_mcs_set = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map); 2474 arg->rx_mcs_set = ath12k_peer_assoc_h_vht_limit(arg->rx_mcs_set, vht_mcs_mask); 2475 2476 arg->tx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.tx_highest); 2477 arg->tx_mcs_set = __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map); 2478 2479 /* In QCN9274 platform, VHT MCS rate 10 and 11 is enabled by default. 2480 * VHT MCS rate 10 and 11 is not supported in 11ac standard. 2481 * so explicitly disable the VHT MCS rate 10 and 11 in 11ac mode. 2482 */ 2483 arg->tx_mcs_set &= ~IEEE80211_VHT_MCS_SUPPORT_0_11_MASK; 2484 arg->tx_mcs_set |= IEEE80211_DISABLE_VHT_MCS_SUPPORT_0_11; 2485 2486 if ((arg->tx_mcs_set & IEEE80211_VHT_MCS_NOT_SUPPORTED) == 2487 IEEE80211_VHT_MCS_NOT_SUPPORTED) 2488 arg->peer_vht_caps &= ~IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE; 2489 2490 /* TODO: Check */ 2491 arg->tx_max_mcs_nss = 0xFF; 2492 2493 if (arg->peer_phymode == MODE_11AC_VHT160) { 2494 tx_nss = ath12k_get_nss_160mhz(ar, max_nss); 2495 rx_nss = min(arg->peer_nss, tx_nss); 2496 arg->peer_bw_rxnss_override = ATH12K_BW_NSS_MAP_ENABLE; 2497 2498 if (!rx_nss) { 2499 ath12k_warn(ar->ab, "invalid max_nss\n"); 2500 return; 2501 } 2502 2503 nss_160 = u32_encode_bits(rx_nss - 1, ATH12K_PEER_RX_NSS_160MHZ); 2504 arg->peer_bw_rxnss_override |= nss_160; 2505 } 2506 2507 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 2508 "mac vht peer %pM max_mpdu %d flags 0x%x nss_override 0x%x\n", 2509 arsta->addr, arg->peer_max_mpdu, arg->peer_flags, 2510 arg->peer_bw_rxnss_override); 2511 } 2512 2513 static int ath12k_mac_get_max_he_mcs_map(u16 mcs_map, int nss) 2514 { 2515 switch ((mcs_map >> (2 * nss)) & 0x3) { 2516 case IEEE80211_HE_MCS_SUPPORT_0_7: return BIT(8) - 1; 2517 case IEEE80211_HE_MCS_SUPPORT_0_9: return BIT(10) - 1; 2518 case IEEE80211_HE_MCS_SUPPORT_0_11: return BIT(12) - 1; 2519 } 2520 return 0; 2521 } 2522 2523 static u16 ath12k_peer_assoc_h_he_limit(u16 tx_mcs_set, 2524 const u16 *he_mcs_limit) 2525 { 2526 int idx_limit; 2527 int nss; 2528 u16 mcs_map; 2529 u16 mcs; 2530 2531 for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++) { 2532 mcs_map = ath12k_mac_get_max_he_mcs_map(tx_mcs_set, nss) & 2533 he_mcs_limit[nss]; 2534 2535 if (mcs_map) 2536 idx_limit = fls(mcs_map) - 1; 2537 else 2538 idx_limit = -1; 2539 2540 switch (idx_limit) { 2541 case 0 ... 7: 2542 mcs = IEEE80211_HE_MCS_SUPPORT_0_7; 2543 break; 2544 case 8: 2545 case 9: 2546 mcs = IEEE80211_HE_MCS_SUPPORT_0_9; 2547 break; 2548 case 10: 2549 case 11: 2550 mcs = IEEE80211_HE_MCS_SUPPORT_0_11; 2551 break; 2552 default: 2553 WARN_ON(1); 2554 fallthrough; 2555 case -1: 2556 mcs = IEEE80211_HE_MCS_NOT_SUPPORTED; 2557 break; 2558 } 2559 2560 tx_mcs_set &= ~(0x3 << (nss * 2)); 2561 tx_mcs_set |= mcs << (nss * 2); 2562 } 2563 2564 return tx_mcs_set; 2565 } 2566 2567 static bool 2568 ath12k_peer_assoc_h_he_masked(const u16 he_mcs_mask[NL80211_HE_NSS_MAX]) 2569 { 2570 int nss; 2571 2572 for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++) 2573 if (he_mcs_mask[nss]) 2574 return false; 2575 2576 return true; 2577 } 2578 2579 static void ath12k_peer_assoc_h_he(struct ath12k *ar, 2580 struct ath12k_link_vif *arvif, 2581 struct ath12k_link_sta *arsta, 2582 struct ath12k_wmi_peer_assoc_arg *arg) 2583 { 2584 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 2585 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 2586 const struct ieee80211_sta_he_cap *he_cap; 2587 struct ieee80211_bss_conf *link_conf; 2588 struct ieee80211_link_sta *link_sta; 2589 struct cfg80211_chan_def def; 2590 int i; 2591 u8 ampdu_factor, max_nss; 2592 u8 rx_mcs_80 = IEEE80211_HE_MCS_NOT_SUPPORTED; 2593 u8 rx_mcs_160 = IEEE80211_HE_MCS_NOT_SUPPORTED; 2594 u16 mcs_160_map, mcs_80_map; 2595 u8 link_id = arvif->link_id; 2596 bool support_160; 2597 enum nl80211_band band; 2598 u16 *he_mcs_mask; 2599 u8 he_mcs; 2600 u16 he_tx_mcs = 0, v = 0; 2601 int he_nss, nss_idx; 2602 bool user_rate_valid = true; 2603 u32 rx_nss, tx_nss, nss_160; 2604 2605 if (WARN_ON(ath12k_mac_vif_link_chan(vif, link_id, &def))) 2606 return; 2607 2608 link_conf = ath12k_mac_get_link_bss_conf(arvif); 2609 if (!link_conf) { 2610 ath12k_warn(ar->ab, "unable to access bss link conf in peer assoc he for vif %pM link %u", 2611 vif->addr, link_id); 2612 return; 2613 } 2614 2615 link_sta = ath12k_mac_get_link_sta(arsta); 2616 if (!link_sta) { 2617 ath12k_warn(ar->ab, "unable to access link sta in peer assoc he for sta %pM link %u\n", 2618 sta->addr, arsta->link_id); 2619 return; 2620 } 2621 2622 he_cap = &link_sta->he_cap; 2623 if (!he_cap->has_he) 2624 return; 2625 2626 band = def.chan->band; 2627 he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs; 2628 2629 if (ath12k_peer_assoc_h_he_masked(he_mcs_mask)) 2630 return; 2631 2632 arg->he_flag = true; 2633 2634 support_160 = !!(he_cap->he_cap_elem.phy_cap_info[0] & 2635 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G); 2636 2637 /* Supported HE-MCS and NSS Set of peer he_cap is intersection with self he_cp */ 2638 mcs_160_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160); 2639 mcs_80_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80); 2640 2641 if (support_160) { 2642 for (i = 7; i >= 0; i--) { 2643 u8 mcs_160 = (mcs_160_map >> (2 * i)) & 3; 2644 2645 if (mcs_160 != IEEE80211_HE_MCS_NOT_SUPPORTED) { 2646 rx_mcs_160 = i + 1; 2647 break; 2648 } 2649 } 2650 } 2651 2652 for (i = 7; i >= 0; i--) { 2653 u8 mcs_80 = (mcs_80_map >> (2 * i)) & 3; 2654 2655 if (mcs_80 != IEEE80211_HE_MCS_NOT_SUPPORTED) { 2656 rx_mcs_80 = i + 1; 2657 break; 2658 } 2659 } 2660 2661 if (support_160) 2662 max_nss = min(rx_mcs_80, rx_mcs_160); 2663 else 2664 max_nss = rx_mcs_80; 2665 2666 arg->peer_nss = min(link_sta->rx_nss, max_nss); 2667 2668 memcpy(&arg->peer_he_cap_macinfo, he_cap->he_cap_elem.mac_cap_info, 2669 sizeof(he_cap->he_cap_elem.mac_cap_info)); 2670 memcpy(&arg->peer_he_cap_phyinfo, he_cap->he_cap_elem.phy_cap_info, 2671 sizeof(he_cap->he_cap_elem.phy_cap_info)); 2672 arg->peer_he_ops = link_conf->he_oper.params; 2673 2674 /* the top most byte is used to indicate BSS color info */ 2675 arg->peer_he_ops &= 0xffffff; 2676 2677 /* As per section 26.6.1 IEEE Std 802.11ax‐2022, if the Max AMPDU 2678 * Exponent Extension in HE cap is zero, use the arg->peer_max_mpdu 2679 * as calculated while parsing VHT caps(if VHT caps is present) 2680 * or HT caps (if VHT caps is not present). 2681 * 2682 * For non-zero value of Max AMPDU Exponent Extension in HE MAC caps, 2683 * if a HE STA sends VHT cap and HE cap IE in assoc request then, use 2684 * MAX_AMPDU_LEN_FACTOR as 20 to calculate max_ampdu length. 2685 * If a HE STA that does not send VHT cap, but HE and HT cap in assoc 2686 * request, then use MAX_AMPDU_LEN_FACTOR as 16 to calculate max_ampdu 2687 * length. 2688 */ 2689 ampdu_factor = u8_get_bits(he_cap->he_cap_elem.mac_cap_info[3], 2690 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK); 2691 2692 if (ampdu_factor) { 2693 if (link_sta->vht_cap.vht_supported) 2694 arg->peer_max_mpdu = (1 << (IEEE80211_HE_VHT_MAX_AMPDU_FACTOR + 2695 ampdu_factor)) - 1; 2696 else if (link_sta->ht_cap.ht_supported) 2697 arg->peer_max_mpdu = (1 << (IEEE80211_HE_HT_MAX_AMPDU_FACTOR + 2698 ampdu_factor)) - 1; 2699 } 2700 2701 if (he_cap->he_cap_elem.phy_cap_info[6] & 2702 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) { 2703 int bit = 7; 2704 int nss, ru; 2705 2706 arg->peer_ppet.numss_m1 = he_cap->ppe_thres[0] & 2707 IEEE80211_PPE_THRES_NSS_MASK; 2708 arg->peer_ppet.ru_bit_mask = 2709 (he_cap->ppe_thres[0] & 2710 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK) >> 2711 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS; 2712 2713 for (nss = 0; nss <= arg->peer_ppet.numss_m1; nss++) { 2714 for (ru = 0; ru < 4; ru++) { 2715 u32 val = 0; 2716 int i; 2717 2718 if ((arg->peer_ppet.ru_bit_mask & BIT(ru)) == 0) 2719 continue; 2720 for (i = 0; i < 6; i++) { 2721 val >>= 1; 2722 val |= ((he_cap->ppe_thres[bit / 8] >> 2723 (bit % 8)) & 0x1) << 5; 2724 bit++; 2725 } 2726 arg->peer_ppet.ppet16_ppet8_ru3_ru0[nss] |= 2727 val << (ru * 6); 2728 } 2729 } 2730 } 2731 2732 if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_RES) 2733 arg->twt_responder = true; 2734 if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_REQ) 2735 arg->twt_requester = true; 2736 2737 he_nss = ath12k_mac_max_he_nss(he_mcs_mask); 2738 2739 if (he_nss > link_sta->rx_nss) { 2740 user_rate_valid = false; 2741 for (nss_idx = link_sta->rx_nss - 1; nss_idx >= 0; nss_idx--) { 2742 if (he_mcs_mask[nss_idx]) { 2743 user_rate_valid = true; 2744 break; 2745 } 2746 } 2747 } 2748 2749 if (!user_rate_valid) { 2750 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 2751 "Setting he range MCS value to peer supported nss:%d for peer %pM\n", 2752 link_sta->rx_nss, arsta->addr); 2753 he_mcs_mask[link_sta->rx_nss - 1] = he_mcs_mask[he_nss - 1]; 2754 } 2755 2756 switch (link_sta->bandwidth) { 2757 case IEEE80211_STA_RX_BW_160: 2758 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160); 2759 v = ath12k_peer_assoc_h_he_limit(v, he_mcs_mask); 2760 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v; 2761 2762 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_160); 2763 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v; 2764 2765 arg->peer_he_mcs_count++; 2766 if (!he_tx_mcs) 2767 he_tx_mcs = v; 2768 fallthrough; 2769 2770 default: 2771 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80); 2772 v = ath12k_peer_assoc_h_he_limit(v, he_mcs_mask); 2773 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v; 2774 2775 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80); 2776 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v; 2777 2778 arg->peer_he_mcs_count++; 2779 if (!he_tx_mcs) 2780 he_tx_mcs = v; 2781 break; 2782 } 2783 2784 /* Calculate peer NSS capability from HE capabilities if STA 2785 * supports HE. 2786 */ 2787 for (i = 0, max_nss = 0, he_mcs = 0; i < NL80211_HE_NSS_MAX; i++) { 2788 he_mcs = he_tx_mcs >> (2 * i) & 3; 2789 2790 /* In case of fixed rates, MCS Range in he_tx_mcs might have 2791 * unsupported range, with he_mcs_mask set, so check either of them 2792 * to find nss. 2793 */ 2794 if (he_mcs != IEEE80211_HE_MCS_NOT_SUPPORTED || 2795 he_mcs_mask[i]) 2796 max_nss = i + 1; 2797 } 2798 2799 max_nss = min(max_nss, ar->num_tx_chains); 2800 arg->peer_nss = min(link_sta->rx_nss, max_nss); 2801 2802 if (arg->peer_phymode == MODE_11AX_HE160) { 2803 tx_nss = ath12k_get_nss_160mhz(ar, ar->num_tx_chains); 2804 rx_nss = min(arg->peer_nss, tx_nss); 2805 2806 arg->peer_nss = min(link_sta->rx_nss, ar->num_rx_chains); 2807 arg->peer_bw_rxnss_override = ATH12K_BW_NSS_MAP_ENABLE; 2808 2809 if (!rx_nss) { 2810 ath12k_warn(ar->ab, "invalid max_nss\n"); 2811 return; 2812 } 2813 2814 nss_160 = u32_encode_bits(rx_nss - 1, ATH12K_PEER_RX_NSS_160MHZ); 2815 arg->peer_bw_rxnss_override |= nss_160; 2816 } 2817 2818 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 2819 "mac he peer %pM nss %d mcs cnt %d nss_override 0x%x\n", 2820 arsta->addr, arg->peer_nss, 2821 arg->peer_he_mcs_count, 2822 arg->peer_bw_rxnss_override); 2823 } 2824 2825 static void ath12k_peer_assoc_h_he_6ghz(struct ath12k *ar, 2826 struct ath12k_link_vif *arvif, 2827 struct ath12k_link_sta *arsta, 2828 struct ath12k_wmi_peer_assoc_arg *arg) 2829 { 2830 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 2831 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 2832 const struct ieee80211_sta_he_cap *he_cap; 2833 struct ieee80211_link_sta *link_sta; 2834 struct cfg80211_chan_def def; 2835 enum nl80211_band band; 2836 u8 ampdu_factor, mpdu_density; 2837 2838 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) 2839 return; 2840 2841 band = def.chan->band; 2842 2843 link_sta = ath12k_mac_get_link_sta(arsta); 2844 if (!link_sta) { 2845 ath12k_warn(ar->ab, "unable to access link sta in peer assoc he 6ghz for sta %pM link %u\n", 2846 sta->addr, arsta->link_id); 2847 return; 2848 } 2849 2850 he_cap = &link_sta->he_cap; 2851 2852 if (!arg->he_flag || band != NL80211_BAND_6GHZ || !link_sta->he_6ghz_capa.capa) 2853 return; 2854 2855 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) 2856 arg->bw_40 = true; 2857 2858 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80) 2859 arg->bw_80 = true; 2860 2861 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) 2862 arg->bw_160 = true; 2863 2864 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_320) 2865 arg->bw_320 = true; 2866 2867 arg->peer_he_caps_6ghz = le16_to_cpu(link_sta->he_6ghz_capa.capa); 2868 2869 mpdu_density = u32_get_bits(arg->peer_he_caps_6ghz, 2870 IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START); 2871 arg->peer_mpdu_density = ath12k_parse_mpdudensity(mpdu_density); 2872 2873 /* From IEEE Std 802.11ax-2021 - Section 10.12.2: An HE STA shall be capable of 2874 * receiving A-MPDU where the A-MPDU pre-EOF padding length is up to the value 2875 * indicated by the Maximum A-MPDU Length Exponent Extension field in the HE 2876 * Capabilities element and the Maximum A-MPDU Length Exponent field in HE 6 GHz 2877 * Band Capabilities element in the 6 GHz band. 2878 * 2879 * Here, we are extracting the Max A-MPDU Exponent Extension from HE caps and 2880 * factor is the Maximum A-MPDU Length Exponent from HE 6 GHZ Band capability. 2881 */ 2882 ampdu_factor = u8_get_bits(he_cap->he_cap_elem.mac_cap_info[3], 2883 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK) + 2884 u32_get_bits(arg->peer_he_caps_6ghz, 2885 IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP); 2886 2887 arg->peer_max_mpdu = (1u << (IEEE80211_HE_6GHZ_MAX_AMPDU_FACTOR + 2888 ampdu_factor)) - 1; 2889 } 2890 2891 static int ath12k_get_smps_from_capa(const struct ieee80211_sta_ht_cap *ht_cap, 2892 const struct ieee80211_he_6ghz_capa *he_6ghz_capa, 2893 int *smps) 2894 { 2895 if (ht_cap->ht_supported) 2896 *smps = u16_get_bits(ht_cap->cap, IEEE80211_HT_CAP_SM_PS); 2897 else 2898 *smps = le16_get_bits(he_6ghz_capa->capa, 2899 IEEE80211_HE_6GHZ_CAP_SM_PS); 2900 2901 if (*smps >= ARRAY_SIZE(ath12k_smps_map)) 2902 return -EINVAL; 2903 2904 return 0; 2905 } 2906 2907 static void ath12k_peer_assoc_h_smps(struct ath12k_link_sta *arsta, 2908 struct ath12k_wmi_peer_assoc_arg *arg) 2909 { 2910 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 2911 const struct ieee80211_he_6ghz_capa *he_6ghz_capa; 2912 struct ath12k_link_vif *arvif = arsta->arvif; 2913 const struct ieee80211_sta_ht_cap *ht_cap; 2914 struct ieee80211_link_sta *link_sta; 2915 struct ath12k *ar = arvif->ar; 2916 int smps; 2917 2918 link_sta = ath12k_mac_get_link_sta(arsta); 2919 if (!link_sta) { 2920 ath12k_warn(ar->ab, "unable to access link sta in peer assoc he for sta %pM link %u\n", 2921 sta->addr, arsta->link_id); 2922 return; 2923 } 2924 2925 he_6ghz_capa = &link_sta->he_6ghz_capa; 2926 ht_cap = &link_sta->ht_cap; 2927 2928 if (!ht_cap->ht_supported && !he_6ghz_capa->capa) 2929 return; 2930 2931 if (ath12k_get_smps_from_capa(ht_cap, he_6ghz_capa, &smps)) 2932 return; 2933 2934 switch (smps) { 2935 case WLAN_HT_CAP_SM_PS_STATIC: 2936 arg->static_mimops_flag = true; 2937 break; 2938 case WLAN_HT_CAP_SM_PS_DYNAMIC: 2939 arg->dynamic_mimops_flag = true; 2940 break; 2941 case WLAN_HT_CAP_SM_PS_DISABLED: 2942 arg->spatial_mux_flag = true; 2943 break; 2944 default: 2945 break; 2946 } 2947 } 2948 2949 static void ath12k_peer_assoc_h_qos(struct ath12k *ar, 2950 struct ath12k_link_vif *arvif, 2951 struct ath12k_link_sta *arsta, 2952 struct ath12k_wmi_peer_assoc_arg *arg) 2953 { 2954 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 2955 2956 switch (arvif->ahvif->vdev_type) { 2957 case WMI_VDEV_TYPE_AP: 2958 if (sta->wme) { 2959 /* TODO: Check WME vs QoS */ 2960 arg->is_wme_set = true; 2961 arg->qos_flag = true; 2962 } 2963 2964 if (sta->wme && sta->uapsd_queues) { 2965 /* TODO: Check WME vs QoS */ 2966 arg->is_wme_set = true; 2967 arg->apsd_flag = true; 2968 arg->peer_rate_caps |= WMI_HOST_RC_UAPSD_FLAG; 2969 } 2970 break; 2971 case WMI_VDEV_TYPE_STA: 2972 if (sta->wme) { 2973 arg->is_wme_set = true; 2974 arg->qos_flag = true; 2975 } 2976 break; 2977 default: 2978 break; 2979 } 2980 2981 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac peer %pM qos %d\n", 2982 arsta->addr, arg->qos_flag); 2983 } 2984 2985 static int ath12k_peer_assoc_qos_ap(struct ath12k *ar, 2986 struct ath12k_link_vif *arvif, 2987 struct ath12k_link_sta *arsta) 2988 { 2989 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 2990 struct ath12k_wmi_ap_ps_arg arg; 2991 u32 max_sp; 2992 u32 uapsd; 2993 int ret; 2994 2995 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 2996 2997 arg.vdev_id = arvif->vdev_id; 2998 2999 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n", 3000 sta->uapsd_queues, sta->max_sp); 3001 3002 uapsd = 0; 3003 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO) 3004 uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN | 3005 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN; 3006 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI) 3007 uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN | 3008 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN; 3009 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK) 3010 uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN | 3011 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN; 3012 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE) 3013 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN | 3014 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN; 3015 3016 max_sp = 0; 3017 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP) 3018 max_sp = sta->max_sp; 3019 3020 arg.param = WMI_AP_PS_PEER_PARAM_UAPSD; 3021 arg.value = uapsd; 3022 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg); 3023 if (ret) 3024 goto err; 3025 3026 arg.param = WMI_AP_PS_PEER_PARAM_MAX_SP; 3027 arg.value = max_sp; 3028 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg); 3029 if (ret) 3030 goto err; 3031 3032 /* TODO: revisit during testing */ 3033 arg.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_FRMTYPE; 3034 arg.value = DISABLE_SIFS_RESPONSE_TRIGGER; 3035 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg); 3036 if (ret) 3037 goto err; 3038 3039 arg.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_UAPSD; 3040 arg.value = DISABLE_SIFS_RESPONSE_TRIGGER; 3041 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg); 3042 if (ret) 3043 goto err; 3044 3045 return 0; 3046 3047 err: 3048 ath12k_warn(ar->ab, "failed to set ap ps peer param %d for vdev %i: %d\n", 3049 arg.param, arvif->vdev_id, ret); 3050 return ret; 3051 } 3052 3053 static bool ath12k_mac_sta_has_ofdm_only(struct ieee80211_link_sta *sta) 3054 { 3055 return sta->supp_rates[NL80211_BAND_2GHZ] >> 3056 ATH12K_MAC_FIRST_OFDM_RATE_IDX; 3057 } 3058 3059 static enum wmi_phy_mode ath12k_mac_get_phymode_vht(struct ath12k *ar, 3060 struct ieee80211_link_sta *link_sta) 3061 { 3062 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) { 3063 if (link_sta->vht_cap.cap & (IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ | 3064 IEEE80211_VHT_CAP_EXT_NSS_BW_MASK)) 3065 return MODE_11AC_VHT160; 3066 3067 /* Allow STA to connect even if it does not explicitly advertise 160 MHz 3068 * support 3069 */ 3070 return MODE_11AC_VHT160; 3071 } 3072 3073 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80) 3074 return MODE_11AC_VHT80; 3075 3076 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) 3077 return MODE_11AC_VHT40; 3078 3079 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_20) 3080 return MODE_11AC_VHT20; 3081 3082 return MODE_UNKNOWN; 3083 } 3084 3085 static enum wmi_phy_mode ath12k_mac_get_phymode_he(struct ath12k *ar, 3086 struct ieee80211_link_sta *link_sta) 3087 { 3088 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) { 3089 if (link_sta->he_cap.he_cap_elem.phy_cap_info[0] & 3090 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G) 3091 return MODE_11AX_HE160; 3092 3093 return MODE_UNKNOWN; 3094 } 3095 3096 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80) 3097 return MODE_11AX_HE80; 3098 3099 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) 3100 return MODE_11AX_HE40; 3101 3102 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_20) 3103 return MODE_11AX_HE20; 3104 3105 return MODE_UNKNOWN; 3106 } 3107 3108 static enum wmi_phy_mode ath12k_mac_get_phymode_eht(struct ath12k *ar, 3109 struct ieee80211_link_sta *link_sta) 3110 { 3111 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_320) 3112 if (link_sta->eht_cap.eht_cap_elem.phy_cap_info[0] & 3113 IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ) 3114 return MODE_11BE_EHT320; 3115 3116 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) { 3117 if (link_sta->he_cap.he_cap_elem.phy_cap_info[0] & 3118 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G) 3119 return MODE_11BE_EHT160; 3120 3121 ath12k_warn(ar->ab, "invalid EHT PHY capability info for 160 Mhz: %d\n", 3122 link_sta->he_cap.he_cap_elem.phy_cap_info[0]); 3123 3124 return MODE_UNKNOWN; 3125 } 3126 3127 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80) 3128 return MODE_11BE_EHT80; 3129 3130 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) 3131 return MODE_11BE_EHT40; 3132 3133 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_20) 3134 return MODE_11BE_EHT20; 3135 3136 return MODE_UNKNOWN; 3137 } 3138 3139 static bool 3140 ath12k_peer_assoc_h_eht_masked(const u16 eht_mcs_mask[NL80211_EHT_NSS_MAX]) 3141 { 3142 int nss; 3143 3144 for (nss = 0; nss < NL80211_EHT_NSS_MAX; nss++) 3145 if (eht_mcs_mask[nss]) 3146 return false; 3147 3148 return true; 3149 } 3150 3151 static void ath12k_peer_assoc_h_phymode(struct ath12k *ar, 3152 struct ath12k_link_vif *arvif, 3153 struct ath12k_link_sta *arsta, 3154 struct ath12k_wmi_peer_assoc_arg *arg) 3155 { 3156 struct ieee80211_link_sta *link_sta; 3157 struct cfg80211_chan_def def; 3158 enum nl80211_band band; 3159 const u8 *ht_mcs_mask; 3160 const u16 *vht_mcs_mask; 3161 const u16 *he_mcs_mask; 3162 const u16 *eht_mcs_mask; 3163 enum wmi_phy_mode phymode = MODE_UNKNOWN; 3164 3165 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 3166 3167 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 3168 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 3169 3170 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) 3171 return; 3172 3173 band = def.chan->band; 3174 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs; 3175 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs; 3176 he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs; 3177 eht_mcs_mask = arvif->bitrate_mask.control[band].eht_mcs; 3178 3179 link_sta = ath12k_mac_get_link_sta(arsta); 3180 if (!link_sta) { 3181 ath12k_warn(ar->ab, "unable to access link sta in peer assoc he for sta %pM link %u\n", 3182 sta->addr, arsta->link_id); 3183 return; 3184 } 3185 3186 switch (band) { 3187 case NL80211_BAND_2GHZ: 3188 if (link_sta->eht_cap.has_eht && 3189 !ath12k_peer_assoc_h_eht_masked(eht_mcs_mask)) { 3190 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) 3191 phymode = MODE_11BE_EHT40_2G; 3192 else 3193 phymode = MODE_11BE_EHT20_2G; 3194 } else if (link_sta->he_cap.has_he && 3195 !ath12k_peer_assoc_h_he_masked(he_mcs_mask)) { 3196 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80) 3197 phymode = MODE_11AX_HE80_2G; 3198 else if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) 3199 phymode = MODE_11AX_HE40_2G; 3200 else 3201 phymode = MODE_11AX_HE20_2G; 3202 } else if (link_sta->vht_cap.vht_supported && 3203 !ath12k_peer_assoc_h_vht_masked(vht_mcs_mask)) { 3204 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) 3205 phymode = MODE_11AC_VHT40; 3206 else 3207 phymode = MODE_11AC_VHT20; 3208 } else if (link_sta->ht_cap.ht_supported && 3209 !ath12k_peer_assoc_h_ht_masked(ht_mcs_mask)) { 3210 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40) 3211 phymode = MODE_11NG_HT40; 3212 else 3213 phymode = MODE_11NG_HT20; 3214 } else if (ath12k_mac_sta_has_ofdm_only(link_sta)) { 3215 phymode = MODE_11G; 3216 } else { 3217 phymode = MODE_11B; 3218 } 3219 break; 3220 case NL80211_BAND_5GHZ: 3221 case NL80211_BAND_6GHZ: 3222 /* Check EHT first */ 3223 if (link_sta->eht_cap.has_eht) { 3224 phymode = ath12k_mac_get_phymode_eht(ar, link_sta); 3225 } else if (link_sta->he_cap.has_he && 3226 !ath12k_peer_assoc_h_he_masked(he_mcs_mask)) { 3227 phymode = ath12k_mac_get_phymode_he(ar, link_sta); 3228 } else if (link_sta->vht_cap.vht_supported && 3229 !ath12k_peer_assoc_h_vht_masked(vht_mcs_mask)) { 3230 phymode = ath12k_mac_get_phymode_vht(ar, link_sta); 3231 } else if (link_sta->ht_cap.ht_supported && 3232 !ath12k_peer_assoc_h_ht_masked(ht_mcs_mask)) { 3233 if (link_sta->bandwidth >= IEEE80211_STA_RX_BW_40) 3234 phymode = MODE_11NA_HT40; 3235 else 3236 phymode = MODE_11NA_HT20; 3237 } else { 3238 phymode = MODE_11A; 3239 } 3240 break; 3241 default: 3242 break; 3243 } 3244 3245 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac peer %pM phymode %s\n", 3246 arsta->addr, ath12k_mac_phymode_str(phymode)); 3247 3248 arg->peer_phymode = phymode; 3249 WARN_ON(phymode == MODE_UNKNOWN); 3250 } 3251 3252 #define ATH12K_EHT_MCS_7_ENABLED 0x00FF 3253 #define ATH12K_EHT_MCS_9_ENABLED 0x0300 3254 #define ATH12K_EHT_MCS_11_ENABLED 0x0C00 3255 #define ATH12K_EHT_MCS_13_ENABLED 0x3000 3256 3257 static void ath12k_mac_set_eht_mcs(u8 rx_tx_mcs7, u8 rx_tx_mcs9, 3258 u8 rx_tx_mcs11, u8 rx_tx_mcs13, 3259 u32 *rx_mcs, u32 *tx_mcs, 3260 const u16 eht_mcs_limit[NL80211_EHT_NSS_MAX]) 3261 { 3262 int nss; 3263 u8 mcs_7 = 0, mcs_9 = 0, mcs_11 = 0, mcs_13 = 0; 3264 u8 peer_mcs_7, peer_mcs_9, peer_mcs_11, peer_mcs_13; 3265 3266 for (nss = 0; nss < NL80211_EHT_NSS_MAX; nss++) { 3267 if (eht_mcs_limit[nss] & ATH12K_EHT_MCS_7_ENABLED) 3268 mcs_7++; 3269 if (eht_mcs_limit[nss] & ATH12K_EHT_MCS_9_ENABLED) 3270 mcs_9++; 3271 if (eht_mcs_limit[nss] & ATH12K_EHT_MCS_11_ENABLED) 3272 mcs_11++; 3273 if (eht_mcs_limit[nss] & ATH12K_EHT_MCS_13_ENABLED) 3274 mcs_13++; 3275 } 3276 3277 peer_mcs_7 = u8_get_bits(rx_tx_mcs7, IEEE80211_EHT_MCS_NSS_RX); 3278 peer_mcs_9 = u8_get_bits(rx_tx_mcs9, IEEE80211_EHT_MCS_NSS_RX); 3279 peer_mcs_11 = u8_get_bits(rx_tx_mcs11, IEEE80211_EHT_MCS_NSS_RX); 3280 peer_mcs_13 = u8_get_bits(rx_tx_mcs13, IEEE80211_EHT_MCS_NSS_RX); 3281 3282 *rx_mcs = u32_encode_bits(min(peer_mcs_7, mcs_7), WMI_EHT_MCS_NSS_0_7) | 3283 u32_encode_bits(min(peer_mcs_9, mcs_9), WMI_EHT_MCS_NSS_8_9) | 3284 u32_encode_bits(min(peer_mcs_11, mcs_11), WMI_EHT_MCS_NSS_10_11) | 3285 u32_encode_bits(min(peer_mcs_13, mcs_13), WMI_EHT_MCS_NSS_12_13); 3286 3287 peer_mcs_7 = u8_get_bits(rx_tx_mcs7, IEEE80211_EHT_MCS_NSS_TX); 3288 peer_mcs_9 = u8_get_bits(rx_tx_mcs9, IEEE80211_EHT_MCS_NSS_TX); 3289 peer_mcs_11 = u8_get_bits(rx_tx_mcs11, IEEE80211_EHT_MCS_NSS_TX); 3290 peer_mcs_13 = u8_get_bits(rx_tx_mcs13, IEEE80211_EHT_MCS_NSS_TX); 3291 3292 *tx_mcs = u32_encode_bits(min(peer_mcs_7, mcs_7), WMI_EHT_MCS_NSS_0_7) | 3293 u32_encode_bits(min(peer_mcs_9, mcs_9), WMI_EHT_MCS_NSS_8_9) | 3294 u32_encode_bits(min(peer_mcs_11, mcs_11), WMI_EHT_MCS_NSS_10_11) | 3295 u32_encode_bits(min(peer_mcs_13, mcs_13), WMI_EHT_MCS_NSS_12_13); 3296 } 3297 3298 static void ath12k_mac_set_eht_ppe_threshold(const u8 *ppe_thres, 3299 struct ath12k_wmi_ppe_threshold_arg *ppet) 3300 { 3301 u32 bit_pos = IEEE80211_EHT_PPE_THRES_INFO_HEADER_SIZE, val; 3302 u8 nss, ru, i; 3303 u8 ppet_bit_len_per_ru = IEEE80211_EHT_PPE_THRES_INFO_PPET_SIZE * 2; 3304 3305 ppet->numss_m1 = u8_get_bits(ppe_thres[0], IEEE80211_EHT_PPE_THRES_NSS_MASK); 3306 ppet->ru_bit_mask = u16_get_bits(get_unaligned_le16(ppe_thres), 3307 IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK); 3308 3309 for (nss = 0; nss <= ppet->numss_m1; nss++) { 3310 for (ru = 0; 3311 ru < hweight16(IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK); 3312 ru++) { 3313 if ((ppet->ru_bit_mask & BIT(ru)) == 0) 3314 continue; 3315 3316 val = 0; 3317 for (i = 0; i < ppet_bit_len_per_ru; i++) { 3318 val |= (((ppe_thres[bit_pos / 8] >> 3319 (bit_pos % 8)) & 0x1) << i); 3320 bit_pos++; 3321 } 3322 ppet->ppet16_ppet8_ru3_ru0[nss] |= 3323 (val << (ru * ppet_bit_len_per_ru)); 3324 } 3325 } 3326 } 3327 3328 static void ath12k_peer_assoc_h_eht(struct ath12k *ar, 3329 struct ath12k_link_vif *arvif, 3330 struct ath12k_link_sta *arsta, 3331 struct ath12k_wmi_peer_assoc_arg *arg) 3332 { 3333 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 3334 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 3335 const struct ieee80211_eht_mcs_nss_supp *own_eht_mcs_nss_supp; 3336 const struct ieee80211_eht_mcs_nss_supp_20mhz_only *bw_20; 3337 const struct ieee80211_sta_eht_cap *eht_cap, *own_eht_cap; 3338 const struct ieee80211_sband_iftype_data *iftd; 3339 const struct ieee80211_eht_mcs_nss_supp_bw *bw; 3340 const struct ieee80211_sta_he_cap *he_cap; 3341 struct ieee80211_link_sta *link_sta; 3342 struct ieee80211_bss_conf *link_conf; 3343 struct cfg80211_chan_def def; 3344 bool user_rate_valid = true; 3345 enum nl80211_band band; 3346 int eht_nss, nss_idx; 3347 u32 *rx_mcs, *tx_mcs; 3348 u16 *eht_mcs_mask; 3349 u8 max_nss = 0; 3350 3351 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 3352 3353 link_sta = ath12k_mac_get_link_sta(arsta); 3354 if (!link_sta) { 3355 ath12k_warn(ar->ab, "unable to access link sta in peer assoc eht for sta %pM link %u\n", 3356 sta->addr, arsta->link_id); 3357 return; 3358 } 3359 3360 link_conf = ath12k_mac_get_link_bss_conf(arvif); 3361 if (!link_conf) { 3362 ath12k_warn(ar->ab, "unable to access link_conf in peer assoc eht set\n"); 3363 return; 3364 } 3365 3366 eht_cap = &link_sta->eht_cap; 3367 he_cap = &link_sta->he_cap; 3368 if (!he_cap->has_he || !eht_cap->has_eht) 3369 return; 3370 3371 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) 3372 return; 3373 3374 band = def.chan->band; 3375 eht_mcs_mask = arvif->bitrate_mask.control[band].eht_mcs; 3376 3377 iftd = ieee80211_get_sband_iftype_data(&ar->mac.sbands[band], vif->type); 3378 if (!iftd) { 3379 ath12k_warn(ar->ab, 3380 "unable to access iftype_data in struct ieee80211_supported_band\n"); 3381 return; 3382 } 3383 3384 own_eht_cap = &iftd->eht_cap; 3385 own_eht_mcs_nss_supp = &own_eht_cap->eht_mcs_nss_supp; 3386 3387 arg->eht_flag = true; 3388 3389 if ((eht_cap->eht_cap_elem.phy_cap_info[5] & 3390 IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT) && 3391 eht_cap->eht_ppe_thres[0] != 0) 3392 ath12k_mac_set_eht_ppe_threshold(eht_cap->eht_ppe_thres, 3393 &arg->peer_eht_ppet); 3394 3395 memcpy(arg->peer_eht_cap_mac, eht_cap->eht_cap_elem.mac_cap_info, 3396 sizeof(eht_cap->eht_cap_elem.mac_cap_info)); 3397 memcpy(arg->peer_eht_cap_phy, eht_cap->eht_cap_elem.phy_cap_info, 3398 sizeof(eht_cap->eht_cap_elem.phy_cap_info)); 3399 3400 rx_mcs = arg->peer_eht_rx_mcs_set; 3401 tx_mcs = arg->peer_eht_tx_mcs_set; 3402 3403 eht_nss = ath12k_mac_max_eht_mcs_nss((void *)own_eht_mcs_nss_supp, 3404 sizeof(*own_eht_mcs_nss_supp)); 3405 if (eht_nss > link_sta->rx_nss) { 3406 user_rate_valid = false; 3407 for (nss_idx = (link_sta->rx_nss - 1); nss_idx >= 0; nss_idx--) { 3408 if (eht_mcs_mask[nss_idx]) { 3409 user_rate_valid = true; 3410 break; 3411 } 3412 } 3413 } 3414 3415 if (!user_rate_valid) { 3416 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 3417 "Setting eht range MCS value to peer supported nss %d for peer %pM\n", 3418 link_sta->rx_nss, arsta->addr); 3419 eht_mcs_mask[link_sta->rx_nss - 1] = eht_mcs_mask[eht_nss - 1]; 3420 } 3421 3422 bw_20 = &eht_cap->eht_mcs_nss_supp.only_20mhz; 3423 bw = &eht_cap->eht_mcs_nss_supp.bw._80; 3424 3425 switch (link_sta->bandwidth) { 3426 case IEEE80211_STA_RX_BW_320: 3427 bw = &eht_cap->eht_mcs_nss_supp.bw._320; 3428 ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss, 3429 bw->rx_tx_mcs9_max_nss, 3430 bw->rx_tx_mcs11_max_nss, 3431 bw->rx_tx_mcs13_max_nss, 3432 &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_320], 3433 &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_320], 3434 eht_mcs_mask); 3435 arg->peer_eht_mcs_count++; 3436 fallthrough; 3437 case IEEE80211_STA_RX_BW_160: 3438 bw = &eht_cap->eht_mcs_nss_supp.bw._160; 3439 ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss, 3440 bw->rx_tx_mcs9_max_nss, 3441 bw->rx_tx_mcs11_max_nss, 3442 bw->rx_tx_mcs13_max_nss, 3443 &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_160], 3444 &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_160], 3445 eht_mcs_mask); 3446 arg->peer_eht_mcs_count++; 3447 fallthrough; 3448 default: 3449 if (!(link_sta->he_cap.he_cap_elem.phy_cap_info[0] & 3450 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_MASK_ALL)) { 3451 bw_20 = &eht_cap->eht_mcs_nss_supp.only_20mhz; 3452 3453 ath12k_mac_set_eht_mcs(bw_20->rx_tx_mcs7_max_nss, 3454 bw_20->rx_tx_mcs9_max_nss, 3455 bw_20->rx_tx_mcs11_max_nss, 3456 bw_20->rx_tx_mcs13_max_nss, 3457 &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80], 3458 &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80], 3459 eht_mcs_mask); 3460 } else { 3461 bw = &eht_cap->eht_mcs_nss_supp.bw._80; 3462 ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss, 3463 bw->rx_tx_mcs9_max_nss, 3464 bw->rx_tx_mcs11_max_nss, 3465 bw->rx_tx_mcs13_max_nss, 3466 &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80], 3467 &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80], 3468 eht_mcs_mask); 3469 } 3470 3471 arg->peer_eht_mcs_count++; 3472 break; 3473 } 3474 3475 arg->punct_bitmap = ~arvif->punct_bitmap; 3476 arg->eht_disable_mcs15 = link_conf->eht_disable_mcs15; 3477 3478 if (!(link_sta->he_cap.he_cap_elem.phy_cap_info[0] & 3479 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_MASK_ALL)) { 3480 if (bw_20->rx_tx_mcs13_max_nss) 3481 max_nss = max(max_nss, u8_get_bits(bw_20->rx_tx_mcs13_max_nss, 3482 IEEE80211_EHT_MCS_NSS_RX)); 3483 if (bw_20->rx_tx_mcs11_max_nss) 3484 max_nss = max(max_nss, u8_get_bits(bw_20->rx_tx_mcs11_max_nss, 3485 IEEE80211_EHT_MCS_NSS_RX)); 3486 if (bw_20->rx_tx_mcs9_max_nss) 3487 max_nss = max(max_nss, u8_get_bits(bw_20->rx_tx_mcs9_max_nss, 3488 IEEE80211_EHT_MCS_NSS_RX)); 3489 if (bw_20->rx_tx_mcs7_max_nss) 3490 max_nss = max(max_nss, u8_get_bits(bw_20->rx_tx_mcs7_max_nss, 3491 IEEE80211_EHT_MCS_NSS_RX)); 3492 } else { 3493 if (bw->rx_tx_mcs13_max_nss) 3494 max_nss = max(max_nss, u8_get_bits(bw->rx_tx_mcs13_max_nss, 3495 IEEE80211_EHT_MCS_NSS_RX)); 3496 if (bw->rx_tx_mcs11_max_nss) 3497 max_nss = max(max_nss, u8_get_bits(bw->rx_tx_mcs11_max_nss, 3498 IEEE80211_EHT_MCS_NSS_RX)); 3499 if (bw->rx_tx_mcs9_max_nss) 3500 max_nss = max(max_nss, u8_get_bits(bw->rx_tx_mcs9_max_nss, 3501 IEEE80211_EHT_MCS_NSS_RX)); 3502 } 3503 3504 max_nss = min(max_nss, (uint8_t)eht_nss); 3505 3506 arg->peer_nss = min(link_sta->rx_nss, max_nss); 3507 3508 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 3509 "mac eht peer %pM nss %d mcs cnt %d ru_punct_bitmap 0x%x\n", 3510 arsta->addr, arg->peer_nss, arg->peer_eht_mcs_count, 3511 arg->punct_bitmap); 3512 } 3513 3514 static void ath12k_peer_assoc_h_mlo(struct ath12k_link_sta *arsta, 3515 struct ath12k_wmi_peer_assoc_arg *arg) 3516 { 3517 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 3518 struct peer_assoc_mlo_params *ml = &arg->ml; 3519 struct ath12k_sta *ahsta = arsta->ahsta; 3520 struct ath12k_link_sta *arsta_p; 3521 struct ath12k_link_vif *arvif; 3522 unsigned long links; 3523 u8 link_id; 3524 int i; 3525 3526 if (!sta->mlo || ahsta->ml_peer_id == ATH12K_MLO_PEER_ID_INVALID) 3527 return; 3528 3529 ml->enabled = true; 3530 ml->assoc_link = arsta->is_assoc_link; 3531 3532 /* For now considering the primary umac based on assoc link */ 3533 ml->primary_umac = arsta->is_assoc_link; 3534 ml->peer_id_valid = true; 3535 ml->logical_link_idx_valid = true; 3536 3537 ether_addr_copy(ml->mld_addr, sta->addr); 3538 ml->logical_link_idx = arsta->link_idx; 3539 ml->ml_peer_id = ahsta->ml_peer_id; 3540 ml->ieee_link_id = arsta->link_id; 3541 ml->num_partner_links = 0; 3542 ml->eml_cap = sta->eml_cap; 3543 links = ahsta->links_map; 3544 3545 rcu_read_lock(); 3546 3547 i = 0; 3548 3549 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) { 3550 if (i >= ATH12K_WMI_MLO_MAX_LINKS) 3551 break; 3552 3553 arsta_p = rcu_dereference(ahsta->link[link_id]); 3554 arvif = rcu_dereference(ahsta->ahvif->link[link_id]); 3555 3556 if (arsta_p == arsta) 3557 continue; 3558 3559 if (!arvif->is_started) 3560 continue; 3561 3562 ml->partner_info[i].vdev_id = arvif->vdev_id; 3563 ml->partner_info[i].hw_link_id = arvif->ar->pdev->hw_link_id; 3564 ml->partner_info[i].assoc_link = arsta_p->is_assoc_link; 3565 ml->partner_info[i].primary_umac = arsta_p->is_assoc_link; 3566 ml->partner_info[i].logical_link_idx_valid = true; 3567 ml->partner_info[i].logical_link_idx = arsta_p->link_idx; 3568 ml->num_partner_links++; 3569 3570 i++; 3571 } 3572 3573 rcu_read_unlock(); 3574 } 3575 3576 static void ath12k_peer_assoc_prepare(struct ath12k *ar, 3577 struct ath12k_link_vif *arvif, 3578 struct ath12k_link_sta *arsta, 3579 struct ath12k_wmi_peer_assoc_arg *arg, 3580 bool reassoc) 3581 { 3582 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 3583 3584 memset(arg, 0, sizeof(*arg)); 3585 3586 reinit_completion(&ar->peer_assoc_done); 3587 3588 arg->peer_new_assoc = !reassoc; 3589 ath12k_peer_assoc_h_basic(ar, arvif, arsta, arg); 3590 ath12k_peer_assoc_h_crypto(ar, arvif, arsta, arg); 3591 ath12k_peer_assoc_h_rates(ar, arvif, arsta, arg); 3592 ath12k_peer_assoc_h_ht(ar, arvif, arsta, arg); 3593 ath12k_peer_assoc_h_vht(ar, arvif, arsta, arg); 3594 ath12k_peer_assoc_h_he(ar, arvif, arsta, arg); 3595 ath12k_peer_assoc_h_he_6ghz(ar, arvif, arsta, arg); 3596 ath12k_peer_assoc_h_eht(ar, arvif, arsta, arg); 3597 ath12k_peer_assoc_h_qos(ar, arvif, arsta, arg); 3598 ath12k_peer_assoc_h_phymode(ar, arvif, arsta, arg); 3599 ath12k_peer_assoc_h_smps(arsta, arg); 3600 ath12k_peer_assoc_h_mlo(arsta, arg); 3601 3602 arsta->peer_nss = arg->peer_nss; 3603 /* TODO: amsdu_disable req? */ 3604 } 3605 3606 static int ath12k_setup_peer_smps(struct ath12k *ar, struct ath12k_link_vif *arvif, 3607 const u8 *addr, 3608 const struct ieee80211_sta_ht_cap *ht_cap, 3609 const struct ieee80211_he_6ghz_capa *he_6ghz_capa) 3610 { 3611 int smps, ret = 0; 3612 3613 if (!ht_cap->ht_supported && !he_6ghz_capa) 3614 return 0; 3615 3616 ret = ath12k_get_smps_from_capa(ht_cap, he_6ghz_capa, &smps); 3617 if (ret < 0) 3618 return ret; 3619 3620 return ath12k_wmi_set_peer_param(ar, addr, arvif->vdev_id, 3621 WMI_PEER_MIMO_PS_STATE, 3622 ath12k_smps_map[smps]); 3623 } 3624 3625 static int ath12k_mac_set_he_txbf_conf(struct ath12k_link_vif *arvif) 3626 { 3627 struct ath12k_vif *ahvif = arvif->ahvif; 3628 struct ath12k *ar = arvif->ar; 3629 u32 param = WMI_VDEV_PARAM_SET_HEMU_MODE; 3630 u32 value = 0; 3631 int ret; 3632 struct ieee80211_bss_conf *link_conf; 3633 3634 link_conf = ath12k_mac_get_link_bss_conf(arvif); 3635 if (!link_conf) { 3636 ath12k_warn(ar->ab, "unable to access bss link conf in txbf conf\n"); 3637 return -EINVAL; 3638 } 3639 3640 if (!link_conf->he_support) 3641 return 0; 3642 3643 if (link_conf->he_su_beamformer) { 3644 value |= u32_encode_bits(HE_SU_BFER_ENABLE, HE_MODE_SU_TX_BFER); 3645 if (link_conf->he_mu_beamformer && 3646 ahvif->vdev_type == WMI_VDEV_TYPE_AP) 3647 value |= u32_encode_bits(HE_MU_BFER_ENABLE, HE_MODE_MU_TX_BFER); 3648 } 3649 3650 if (ahvif->vif->type != NL80211_IFTYPE_MESH_POINT) { 3651 value |= u32_encode_bits(HE_DL_MUOFDMA_ENABLE, HE_MODE_DL_OFDMA) | 3652 u32_encode_bits(HE_UL_MUOFDMA_ENABLE, HE_MODE_UL_OFDMA); 3653 3654 if (link_conf->he_full_ul_mumimo) 3655 value |= u32_encode_bits(HE_UL_MUMIMO_ENABLE, HE_MODE_UL_MUMIMO); 3656 3657 if (link_conf->he_su_beamformee) 3658 value |= u32_encode_bits(HE_SU_BFEE_ENABLE, HE_MODE_SU_TX_BFEE); 3659 } 3660 3661 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, value); 3662 if (ret) { 3663 ath12k_warn(ar->ab, "failed to set vdev %d HE MU mode: %d\n", 3664 arvif->vdev_id, ret); 3665 return ret; 3666 } 3667 3668 param = WMI_VDEV_PARAM_SET_HE_SOUNDING_MODE; 3669 value = u32_encode_bits(HE_VHT_SOUNDING_MODE_ENABLE, HE_VHT_SOUNDING_MODE) | 3670 u32_encode_bits(HE_TRIG_NONTRIG_SOUNDING_MODE_ENABLE, 3671 HE_TRIG_NONTRIG_SOUNDING_MODE); 3672 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 3673 param, value); 3674 if (ret) { 3675 ath12k_warn(ar->ab, "failed to set vdev %d sounding mode: %d\n", 3676 arvif->vdev_id, ret); 3677 return ret; 3678 } 3679 3680 return 0; 3681 } 3682 3683 static int ath12k_mac_vif_recalc_sta_he_txbf(struct ath12k *ar, 3684 struct ath12k_link_vif *arvif, 3685 struct ieee80211_sta_he_cap *he_cap, 3686 int *hemode) 3687 { 3688 struct ieee80211_vif *vif = arvif->ahvif->vif; 3689 struct ieee80211_he_cap_elem he_cap_elem = {}; 3690 struct ieee80211_sta_he_cap *cap_band; 3691 struct cfg80211_chan_def def; 3692 u8 link_id = arvif->link_id; 3693 struct ieee80211_bss_conf *link_conf; 3694 3695 link_conf = ath12k_mac_get_link_bss_conf(arvif); 3696 if (!link_conf) { 3697 ath12k_warn(ar->ab, "unable to access bss link conf in recalc txbf conf\n"); 3698 return -EINVAL; 3699 } 3700 3701 if (!link_conf->he_support) 3702 return 0; 3703 3704 if (vif->type != NL80211_IFTYPE_STATION) 3705 return -EINVAL; 3706 3707 if (WARN_ON(ath12k_mac_vif_link_chan(vif, link_id, &def))) 3708 return -EINVAL; 3709 3710 if (def.chan->band == NL80211_BAND_2GHZ) 3711 cap_band = &ar->mac.iftype[NL80211_BAND_2GHZ][vif->type].he_cap; 3712 else 3713 cap_band = &ar->mac.iftype[NL80211_BAND_5GHZ][vif->type].he_cap; 3714 3715 memcpy(&he_cap_elem, &cap_band->he_cap_elem, sizeof(he_cap_elem)); 3716 3717 *hemode = 0; 3718 if (HECAP_PHY_SUBFME_GET(he_cap_elem.phy_cap_info)) { 3719 if (HECAP_PHY_SUBFMR_GET(he_cap->he_cap_elem.phy_cap_info)) 3720 *hemode |= u32_encode_bits(HE_SU_BFEE_ENABLE, HE_MODE_SU_TX_BFEE); 3721 if (HECAP_PHY_MUBFMR_GET(he_cap->he_cap_elem.phy_cap_info)) 3722 *hemode |= u32_encode_bits(HE_MU_BFEE_ENABLE, HE_MODE_MU_TX_BFEE); 3723 } 3724 3725 if (vif->type != NL80211_IFTYPE_MESH_POINT) { 3726 *hemode |= u32_encode_bits(HE_DL_MUOFDMA_ENABLE, HE_MODE_DL_OFDMA) | 3727 u32_encode_bits(HE_UL_MUOFDMA_ENABLE, HE_MODE_UL_OFDMA); 3728 3729 if (HECAP_PHY_ULMUMIMO_GET(he_cap_elem.phy_cap_info)) 3730 if (HECAP_PHY_ULMUMIMO_GET(he_cap->he_cap_elem.phy_cap_info)) 3731 *hemode |= u32_encode_bits(HE_UL_MUMIMO_ENABLE, 3732 HE_MODE_UL_MUMIMO); 3733 3734 if (u32_get_bits(*hemode, HE_MODE_MU_TX_BFEE)) 3735 *hemode |= u32_encode_bits(HE_SU_BFEE_ENABLE, HE_MODE_SU_TX_BFEE); 3736 3737 if (u32_get_bits(*hemode, HE_MODE_MU_TX_BFER)) 3738 *hemode |= u32_encode_bits(HE_SU_BFER_ENABLE, HE_MODE_SU_TX_BFER); 3739 } 3740 3741 return 0; 3742 } 3743 3744 static int ath12k_mac_set_eht_txbf_conf(struct ath12k_link_vif *arvif) 3745 { 3746 struct ath12k_vif *ahvif = arvif->ahvif; 3747 struct ath12k *ar = arvif->ar; 3748 u32 param = WMI_VDEV_PARAM_SET_EHT_MU_MODE; 3749 u32 value = 0; 3750 int ret; 3751 struct ieee80211_bss_conf *link_conf; 3752 3753 link_conf = ath12k_mac_get_link_bss_conf(arvif); 3754 if (!link_conf) { 3755 ath12k_warn(ar->ab, "unable to access bss link conf in eht txbf conf\n"); 3756 return -ENOENT; 3757 } 3758 3759 if (!link_conf->eht_support) 3760 return 0; 3761 3762 if (link_conf->eht_su_beamformer) { 3763 value |= u32_encode_bits(EHT_SU_BFER_ENABLE, EHT_MODE_SU_TX_BFER); 3764 if (link_conf->eht_mu_beamformer && 3765 ahvif->vdev_type == WMI_VDEV_TYPE_AP) 3766 value |= u32_encode_bits(EHT_MU_BFER_ENABLE, 3767 EHT_MODE_MU_TX_BFER) | 3768 u32_encode_bits(EHT_DL_MUOFDMA_ENABLE, 3769 EHT_MODE_DL_OFDMA_MUMIMO) | 3770 u32_encode_bits(EHT_UL_MUOFDMA_ENABLE, 3771 EHT_MODE_UL_OFDMA_MUMIMO); 3772 } 3773 3774 if (ahvif->vif->type != NL80211_IFTYPE_MESH_POINT) { 3775 value |= u32_encode_bits(EHT_DL_MUOFDMA_ENABLE, EHT_MODE_DL_OFDMA) | 3776 u32_encode_bits(EHT_UL_MUOFDMA_ENABLE, EHT_MODE_UL_OFDMA); 3777 3778 if (link_conf->eht_80mhz_full_bw_ul_mumimo) 3779 value |= u32_encode_bits(EHT_UL_MUMIMO_ENABLE, EHT_MODE_MUMIMO); 3780 3781 if (link_conf->eht_su_beamformee) 3782 value |= u32_encode_bits(EHT_SU_BFEE_ENABLE, 3783 EHT_MODE_SU_TX_BFEE); 3784 } 3785 3786 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, value); 3787 if (ret) { 3788 ath12k_warn(ar->ab, "failed to set vdev %d EHT MU mode: %d\n", 3789 arvif->vdev_id, ret); 3790 return ret; 3791 } 3792 3793 return 0; 3794 } 3795 3796 static u32 ath12k_mac_ieee80211_sta_bw_to_wmi(struct ath12k *ar, 3797 struct ieee80211_link_sta *link_sta) 3798 { 3799 u32 bw; 3800 3801 switch (link_sta->bandwidth) { 3802 case IEEE80211_STA_RX_BW_20: 3803 bw = WMI_PEER_CHWIDTH_20MHZ; 3804 break; 3805 case IEEE80211_STA_RX_BW_40: 3806 bw = WMI_PEER_CHWIDTH_40MHZ; 3807 break; 3808 case IEEE80211_STA_RX_BW_80: 3809 bw = WMI_PEER_CHWIDTH_80MHZ; 3810 break; 3811 case IEEE80211_STA_RX_BW_160: 3812 bw = WMI_PEER_CHWIDTH_160MHZ; 3813 break; 3814 case IEEE80211_STA_RX_BW_320: 3815 bw = WMI_PEER_CHWIDTH_320MHZ; 3816 break; 3817 default: 3818 ath12k_warn(ar->ab, "Invalid bandwidth %d for link station %pM\n", 3819 link_sta->bandwidth, link_sta->addr); 3820 bw = WMI_PEER_CHWIDTH_20MHZ; 3821 break; 3822 } 3823 3824 return bw; 3825 } 3826 3827 static void ath12k_bss_assoc(struct ath12k *ar, 3828 struct ath12k_link_vif *arvif, 3829 struct ieee80211_bss_conf *bss_conf) 3830 { 3831 struct ath12k_vif *ahvif = arvif->ahvif; 3832 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif); 3833 struct ath12k_wmi_vdev_up_params params = {}; 3834 struct ieee80211_link_sta *link_sta; 3835 u8 link_id = bss_conf->link_id; 3836 struct ath12k_link_sta *arsta; 3837 struct ieee80211_sta *ap_sta; 3838 struct ath12k_sta *ahsta; 3839 struct ath12k_dp_link_peer *peer; 3840 bool is_auth = false; 3841 u32 hemode = 0; 3842 int ret; 3843 struct ath12k_dp *dp = ath12k_ab_to_dp(ar->ab); 3844 3845 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 3846 3847 struct ath12k_wmi_peer_assoc_arg *peer_arg __free(kfree) = 3848 kzalloc_obj(*peer_arg); 3849 if (!peer_arg) 3850 return; 3851 3852 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 3853 "mac vdev %i link id %u assoc bssid %pM aid %d\n", 3854 arvif->vdev_id, link_id, arvif->bssid, ahvif->aid); 3855 3856 rcu_read_lock(); 3857 3858 /* During ML connection, cfg.ap_addr has the MLD address. For 3859 * non-ML connection, it has the BSSID. 3860 */ 3861 ap_sta = ieee80211_find_sta(vif, vif->cfg.ap_addr); 3862 if (!ap_sta) { 3863 ath12k_warn(ar->ab, "failed to find station entry for bss %pM vdev %i\n", 3864 vif->cfg.ap_addr, arvif->vdev_id); 3865 rcu_read_unlock(); 3866 return; 3867 } 3868 3869 ahsta = ath12k_sta_to_ahsta(ap_sta); 3870 3871 arsta = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy, 3872 ahsta->link[link_id]); 3873 if (WARN_ON(!arsta)) { 3874 rcu_read_unlock(); 3875 return; 3876 } 3877 3878 link_sta = ath12k_mac_get_link_sta(arsta); 3879 if (WARN_ON(!link_sta)) { 3880 rcu_read_unlock(); 3881 return; 3882 } 3883 3884 ath12k_peer_assoc_prepare(ar, arvif, arsta, peer_arg, false); 3885 3886 /* link_sta->he_cap must be protected by rcu_read_lock */ 3887 ret = ath12k_mac_vif_recalc_sta_he_txbf(ar, arvif, &link_sta->he_cap, &hemode); 3888 if (ret) { 3889 ath12k_warn(ar->ab, "failed to recalc he txbf for vdev %i on bss %pM: %d\n", 3890 arvif->vdev_id, bss_conf->bssid, ret); 3891 rcu_read_unlock(); 3892 return; 3893 } 3894 3895 rcu_read_unlock(); 3896 3897 /* keep this before ath12k_wmi_send_peer_assoc_cmd() */ 3898 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 3899 WMI_VDEV_PARAM_SET_HEMU_MODE, hemode); 3900 if (ret) { 3901 ath12k_warn(ar->ab, "failed to submit vdev param txbf 0x%x: %d\n", 3902 hemode, ret); 3903 return; 3904 } 3905 3906 peer_arg->is_assoc = true; 3907 ret = ath12k_wmi_send_peer_assoc_cmd(ar, peer_arg); 3908 if (ret) { 3909 ath12k_warn(ar->ab, "failed to run peer assoc for %pM vdev %i: %d\n", 3910 bss_conf->bssid, arvif->vdev_id, ret); 3911 return; 3912 } 3913 3914 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) { 3915 ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n", 3916 bss_conf->bssid, arvif->vdev_id); 3917 return; 3918 } 3919 3920 ret = ath12k_setup_peer_smps(ar, arvif, bss_conf->bssid, 3921 &link_sta->ht_cap, &link_sta->he_6ghz_capa); 3922 if (ret) { 3923 ath12k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n", 3924 arvif->vdev_id, ret); 3925 return; 3926 } 3927 3928 WARN_ON(arvif->is_up); 3929 3930 ahvif->aid = vif->cfg.aid; 3931 ether_addr_copy(arvif->bssid, bss_conf->bssid); 3932 3933 params.vdev_id = arvif->vdev_id; 3934 params.aid = ahvif->aid; 3935 params.bssid = arvif->bssid; 3936 params.tx_bssid = ath12k_mac_get_tx_bssid(arvif); 3937 if (params.tx_bssid) { 3938 params.nontx_profile_idx = bss_conf->bssid_index; 3939 params.nontx_profile_cnt = 1 << bss_conf->bssid_indicator; 3940 } 3941 ret = ath12k_wmi_vdev_up(ar, ¶ms); 3942 if (ret) { 3943 ath12k_warn(ar->ab, "failed to set vdev %d up: %d\n", 3944 arvif->vdev_id, ret); 3945 return; 3946 } 3947 3948 arvif->is_up = true; 3949 arvif->rekey_data.enable_offload = false; 3950 3951 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 3952 "mac vdev %d up (associated) bssid %pM aid %d\n", 3953 arvif->vdev_id, bss_conf->bssid, vif->cfg.aid); 3954 3955 spin_lock_bh(&dp->dp_lock); 3956 3957 peer = ath12k_dp_link_peer_find_by_vdev_and_addr(dp, arvif->vdev_id, 3958 arvif->bssid); 3959 if (peer && peer->is_authorized) 3960 is_auth = true; 3961 3962 spin_unlock_bh(&dp->dp_lock); 3963 3964 /* Authorize BSS Peer */ 3965 if (is_auth) { 3966 ret = ath12k_wmi_set_peer_param(ar, arvif->bssid, 3967 arvif->vdev_id, 3968 WMI_PEER_AUTHORIZE, 3969 1); 3970 if (ret) 3971 ath12k_warn(ar->ab, "Unable to authorize BSS peer: %d\n", ret); 3972 } 3973 3974 ret = ath12k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id, 3975 &bss_conf->he_obss_pd); 3976 if (ret) 3977 ath12k_warn(ar->ab, "failed to set vdev %i OBSS PD parameters: %d\n", 3978 arvif->vdev_id, ret); 3979 3980 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map) && 3981 ahvif->vdev_type == WMI_VDEV_TYPE_STA && 3982 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) 3983 ath12k_mac_11d_scan_stop_all(ar->ab); 3984 } 3985 3986 static void ath12k_bss_disassoc(struct ath12k *ar, 3987 struct ath12k_link_vif *arvif) 3988 { 3989 int ret; 3990 3991 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 3992 3993 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n", 3994 arvif->vdev_id, arvif->bssid); 3995 3996 ret = ath12k_wmi_vdev_down(ar, arvif->vdev_id); 3997 if (ret) 3998 ath12k_warn(ar->ab, "failed to down vdev %i: %d\n", 3999 arvif->vdev_id, ret); 4000 4001 arvif->is_up = false; 4002 4003 memset(&arvif->rekey_data, 0, sizeof(arvif->rekey_data)); 4004 4005 cancel_delayed_work(&arvif->connection_loss_work); 4006 } 4007 4008 static u32 ath12k_mac_get_rate_hw_value(int bitrate) 4009 { 4010 u32 preamble; 4011 u16 hw_value; 4012 int rate; 4013 size_t i; 4014 4015 if (ath12k_mac_bitrate_is_cck(bitrate)) 4016 preamble = WMI_RATE_PREAMBLE_CCK; 4017 else 4018 preamble = WMI_RATE_PREAMBLE_OFDM; 4019 4020 for (i = 0; i < ARRAY_SIZE(ath12k_legacy_rates); i++) { 4021 if (ath12k_legacy_rates[i].bitrate != bitrate) 4022 continue; 4023 4024 hw_value = ath12k_legacy_rates[i].hw_value; 4025 rate = ATH12K_HW_RATE_CODE(hw_value, 0, preamble); 4026 4027 return rate; 4028 } 4029 4030 return -EINVAL; 4031 } 4032 4033 static void ath12k_recalculate_mgmt_rate(struct ath12k *ar, 4034 struct ath12k_link_vif *arvif, 4035 struct cfg80211_chan_def *def) 4036 { 4037 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 4038 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar); 4039 const struct ieee80211_supported_band *sband; 4040 struct ieee80211_bss_conf *bss_conf; 4041 u8 basic_rate_idx; 4042 int hw_rate_code; 4043 u32 vdev_param; 4044 u16 bitrate; 4045 int ret; 4046 4047 lockdep_assert_wiphy(hw->wiphy); 4048 4049 bss_conf = ath12k_mac_get_link_bss_conf(arvif); 4050 if (!bss_conf) { 4051 ath12k_warn(ar->ab, "unable to access bss link conf in mgmt rate calc for vif %pM link %u\n", 4052 vif->addr, arvif->link_id); 4053 return; 4054 } 4055 4056 sband = hw->wiphy->bands[def->chan->band]; 4057 if (bss_conf->basic_rates) 4058 basic_rate_idx = __ffs(bss_conf->basic_rates); 4059 else 4060 basic_rate_idx = 0; 4061 bitrate = sband->bitrates[basic_rate_idx].bitrate; 4062 4063 hw_rate_code = ath12k_mac_get_rate_hw_value(bitrate); 4064 if (hw_rate_code < 0) { 4065 ath12k_warn(ar->ab, "bitrate not supported %d\n", bitrate); 4066 return; 4067 } 4068 4069 vdev_param = WMI_VDEV_PARAM_MGMT_RATE; 4070 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param, 4071 hw_rate_code); 4072 if (ret) 4073 ath12k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret); 4074 4075 vdev_param = WMI_VDEV_PARAM_BEACON_RATE; 4076 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param, 4077 hw_rate_code); 4078 if (ret) 4079 ath12k_warn(ar->ab, "failed to set beacon tx rate %d\n", ret); 4080 } 4081 4082 static void ath12k_mac_bcn_tx_event(struct ath12k_link_vif *arvif) 4083 { 4084 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 4085 struct ieee80211_bss_conf *link_conf; 4086 4087 link_conf = ath12k_mac_get_link_bss_conf(arvif); 4088 if (!link_conf) { 4089 ath12k_warn(arvif->ar->ab, "failed to get link conf for vdev %u\n", 4090 arvif->vdev_id); 4091 return; 4092 } 4093 4094 if (link_conf->color_change_active) { 4095 if (ieee80211_beacon_cntdwn_is_complete(vif, arvif->link_id)) { 4096 ieee80211_color_change_finish(vif, arvif->link_id); 4097 return; 4098 } 4099 4100 ieee80211_beacon_update_cntdwn(vif, arvif->link_id); 4101 ath12k_mac_setup_bcn_tmpl(arvif); 4102 } 4103 } 4104 4105 static void ath12k_mac_bcn_tx_work(struct wiphy *wiphy, struct wiphy_work *work) 4106 { 4107 struct ath12k_link_vif *arvif = container_of(work, struct ath12k_link_vif, 4108 bcn_tx_work); 4109 4110 lockdep_assert_wiphy(wiphy); 4111 ath12k_mac_bcn_tx_event(arvif); 4112 } 4113 4114 static void ath12k_mac_init_arvif(struct ath12k_vif *ahvif, 4115 struct ath12k_link_vif *arvif, int link_id) 4116 { 4117 struct ath12k_hw *ah = ahvif->ah; 4118 u8 _link_id; 4119 int i; 4120 4121 lockdep_assert_wiphy(ah->hw->wiphy); 4122 4123 if (WARN_ON(!arvif)) 4124 return; 4125 4126 if (WARN_ON(link_id >= ATH12K_NUM_MAX_LINKS)) 4127 return; 4128 4129 if (link_id < 0) 4130 _link_id = 0; 4131 else 4132 _link_id = link_id; 4133 4134 arvif->ahvif = ahvif; 4135 arvif->link_id = _link_id; 4136 4137 /* Protects the datapath stats update on a per link basis */ 4138 spin_lock_init(&arvif->link_stats_lock); 4139 4140 INIT_LIST_HEAD(&arvif->list); 4141 INIT_DELAYED_WORK(&arvif->connection_loss_work, 4142 ath12k_mac_vif_sta_connection_loss_work); 4143 wiphy_work_init(&arvif->bcn_tx_work, ath12k_mac_bcn_tx_work); 4144 4145 arvif->num_stations = 0; 4146 4147 for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) { 4148 arvif->bitrate_mask.control[i].legacy = 0xffffffff; 4149 arvif->bitrate_mask.control[i].gi = NL80211_TXRATE_DEFAULT_GI; 4150 memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff, 4151 sizeof(arvif->bitrate_mask.control[i].ht_mcs)); 4152 memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff, 4153 sizeof(arvif->bitrate_mask.control[i].vht_mcs)); 4154 memset(arvif->bitrate_mask.control[i].he_mcs, 0xff, 4155 sizeof(arvif->bitrate_mask.control[i].he_mcs)); 4156 memset(arvif->bitrate_mask.control[i].eht_mcs, 0xff, 4157 sizeof(arvif->bitrate_mask.control[i].eht_mcs)); 4158 } 4159 4160 /* Handle MLO related assignments */ 4161 if (link_id >= 0) { 4162 rcu_assign_pointer(ahvif->link[arvif->link_id], arvif); 4163 ahvif->links_map |= BIT(_link_id); 4164 } 4165 4166 ath12k_generic_dbg(ATH12K_DBG_MAC, 4167 "mac init link arvif (link_id %d%s) for vif %pM. links_map 0x%x", 4168 _link_id, (link_id < 0) ? " deflink" : "", ahvif->vif->addr, 4169 ahvif->links_map); 4170 } 4171 4172 static void ath12k_mac_remove_link_interface(struct ieee80211_hw *hw, 4173 struct ath12k_link_vif *arvif) 4174 { 4175 struct ath12k_vif *ahvif = arvif->ahvif; 4176 struct ath12k_hw *ah = hw->priv; 4177 struct ath12k *ar = arvif->ar; 4178 int ret; 4179 4180 lockdep_assert_wiphy(ah->hw->wiphy); 4181 4182 cancel_delayed_work_sync(&arvif->connection_loss_work); 4183 wiphy_work_cancel(ath12k_ar_to_hw(ar)->wiphy, &arvif->bcn_tx_work); 4184 4185 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac remove link interface (vdev %d link id %d)", 4186 arvif->vdev_id, arvif->link_id); 4187 4188 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map) && 4189 ahvif->vdev_type == WMI_VDEV_TYPE_STA && 4190 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) 4191 ath12k_mac_11d_scan_stop(ar); 4192 4193 if (ahvif->vdev_type == WMI_VDEV_TYPE_AP) { 4194 ret = ath12k_peer_delete(ar, arvif->vdev_id, arvif->bssid); 4195 if (ret) 4196 ath12k_warn(ar->ab, "failed to submit AP self-peer removal on vdev %d link id %d: %d", 4197 arvif->vdev_id, arvif->link_id, ret); 4198 4199 if (arvif->link_id < IEEE80211_MLD_MAX_NUM_LINKS) 4200 ath12k_dp_peer_delete(&ah->dp_hw, arvif->bssid, NULL); 4201 } 4202 ath12k_mac_vdev_delete(ar, arvif); 4203 } 4204 4205 static struct ath12k_link_vif *ath12k_mac_assign_link_vif(struct ath12k_hw *ah, 4206 struct ieee80211_vif *vif, 4207 u8 link_id) 4208 { 4209 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 4210 struct ath12k_link_vif *arvif; 4211 4212 lockdep_assert_wiphy(ah->hw->wiphy); 4213 4214 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]); 4215 if (arvif) 4216 return arvif; 4217 4218 /* If this is the first link arvif being created for an ML VIF 4219 * use the preallocated deflink memory except for scan arvifs 4220 */ 4221 if (!ahvif->links_map && link_id < ATH12K_FIRST_SCAN_LINK) { 4222 arvif = &ahvif->deflink; 4223 4224 if (vif->type == NL80211_IFTYPE_STATION) 4225 arvif->is_sta_assoc_link = true; 4226 } else { 4227 arvif = kzalloc_obj(*arvif); 4228 if (!arvif) 4229 return NULL; 4230 } 4231 4232 ath12k_mac_init_arvif(ahvif, arvif, link_id); 4233 4234 return arvif; 4235 } 4236 4237 static void ath12k_mac_unassign_link_vif(struct ath12k_link_vif *arvif) 4238 { 4239 struct ath12k_vif *ahvif = arvif->ahvif; 4240 struct ath12k_hw *ah = ahvif->ah; 4241 4242 lockdep_assert_wiphy(ah->hw->wiphy); 4243 4244 rcu_assign_pointer(ahvif->link[arvif->link_id], NULL); 4245 synchronize_rcu(); 4246 ahvif->links_map &= ~BIT(arvif->link_id); 4247 4248 if (arvif != &ahvif->deflink) 4249 kfree(arvif); 4250 else 4251 memset(arvif, 0, sizeof(*arvif)); 4252 } 4253 4254 int 4255 ath12k_mac_op_change_vif_links(struct ieee80211_hw *hw, 4256 struct ieee80211_vif *vif, 4257 u16 old_links, u16 new_links, 4258 struct ieee80211_bss_conf *ol[IEEE80211_MLD_MAX_NUM_LINKS]) 4259 { 4260 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 4261 unsigned long to_remove = old_links & ~new_links; 4262 unsigned long to_add = ~old_links & new_links; 4263 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 4264 struct ath12k_link_vif *arvif; 4265 u8 link_id; 4266 4267 lockdep_assert_wiphy(hw->wiphy); 4268 4269 ath12k_generic_dbg(ATH12K_DBG_MAC, 4270 "mac vif link changed for MLD %pM old_links 0x%x new_links 0x%x\n", 4271 vif->addr, old_links, new_links); 4272 4273 for_each_set_bit(link_id, &to_add, IEEE80211_MLD_MAX_NUM_LINKS) { 4274 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 4275 /* mac80211 wants to add link but driver already has the 4276 * link. This should not happen ideally. 4277 */ 4278 if (WARN_ON(arvif)) 4279 return -EINVAL; 4280 4281 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id); 4282 if (WARN_ON(!arvif)) 4283 return -EINVAL; 4284 } 4285 4286 for_each_set_bit(link_id, &to_remove, IEEE80211_MLD_MAX_NUM_LINKS) { 4287 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 4288 if (WARN_ON(!arvif)) 4289 return -EINVAL; 4290 4291 if (!arvif->is_created) { 4292 ath12k_mac_unassign_link_vif(arvif); 4293 continue; 4294 } 4295 4296 if (WARN_ON(!arvif->ar)) 4297 return -EINVAL; 4298 4299 ath12k_mac_remove_link_interface(hw, arvif); 4300 ath12k_mac_unassign_link_vif(arvif); 4301 } 4302 4303 return 0; 4304 } 4305 EXPORT_SYMBOL(ath12k_mac_op_change_vif_links); 4306 4307 static int ath12k_mac_fils_discovery(struct ath12k_link_vif *arvif, 4308 struct ieee80211_bss_conf *info) 4309 { 4310 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 4311 struct ath12k *ar = arvif->ar; 4312 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar); 4313 struct sk_buff *tmpl; 4314 int ret; 4315 u32 interval; 4316 bool unsol_bcast_probe_resp_enabled = false; 4317 4318 if (info->fils_discovery.max_interval) { 4319 interval = info->fils_discovery.max_interval; 4320 4321 tmpl = ieee80211_get_fils_discovery_tmpl(hw, vif, 4322 info->link_id); 4323 if (tmpl) 4324 ret = ath12k_wmi_fils_discovery_tmpl(ar, arvif->vdev_id, 4325 tmpl); 4326 } else if (info->unsol_bcast_probe_resp_interval) { 4327 unsol_bcast_probe_resp_enabled = 1; 4328 interval = info->unsol_bcast_probe_resp_interval; 4329 4330 tmpl = ieee80211_get_unsol_bcast_probe_resp_tmpl(hw, vif, 4331 info->link_id); 4332 if (tmpl) 4333 ret = ath12k_wmi_probe_resp_tmpl(ar, arvif->vdev_id, 4334 tmpl); 4335 } else { /* Disable */ 4336 return ath12k_wmi_fils_discovery(ar, arvif->vdev_id, 0, false); 4337 } 4338 4339 if (!tmpl) { 4340 ath12k_warn(ar->ab, 4341 "mac vdev %i failed to retrieve %s template\n", 4342 arvif->vdev_id, (unsol_bcast_probe_resp_enabled ? 4343 "unsolicited broadcast probe response" : 4344 "FILS discovery")); 4345 return -EPERM; 4346 } 4347 kfree_skb(tmpl); 4348 4349 if (!ret) 4350 ret = ath12k_wmi_fils_discovery(ar, arvif->vdev_id, interval, 4351 unsol_bcast_probe_resp_enabled); 4352 4353 return ret; 4354 } 4355 4356 void ath12k_mac_op_vif_cfg_changed(struct ieee80211_hw *hw, 4357 struct ieee80211_vif *vif, 4358 u64 changed) 4359 { 4360 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 4361 unsigned long links = ahvif->links_map; 4362 struct ieee80211_bss_conf *info; 4363 struct ath12k_link_vif *arvif; 4364 struct ieee80211_sta *sta; 4365 struct ath12k_sta *ahsta; 4366 struct ath12k *ar; 4367 u8 link_id; 4368 4369 lockdep_assert_wiphy(hw->wiphy); 4370 4371 if (changed & BSS_CHANGED_SSID && vif->type == NL80211_IFTYPE_AP) { 4372 ahvif->u.ap.ssid_len = vif->cfg.ssid_len; 4373 if (vif->cfg.ssid_len) 4374 memcpy(ahvif->u.ap.ssid, vif->cfg.ssid, vif->cfg.ssid_len); 4375 } 4376 4377 if (changed & BSS_CHANGED_ASSOC) { 4378 if (vif->cfg.assoc) { 4379 /* only in station mode we can get here, so it's safe 4380 * to use ap_addr 4381 */ 4382 rcu_read_lock(); 4383 sta = ieee80211_find_sta(vif, vif->cfg.ap_addr); 4384 if (!sta) { 4385 rcu_read_unlock(); 4386 WARN_ONCE(1, "failed to find sta with addr %pM\n", 4387 vif->cfg.ap_addr); 4388 return; 4389 } 4390 4391 ahsta = ath12k_sta_to_ahsta(sta); 4392 arvif = wiphy_dereference(hw->wiphy, 4393 ahvif->link[ahsta->assoc_link_id]); 4394 rcu_read_unlock(); 4395 4396 ar = arvif->ar; 4397 /* there is no reason for which an assoc link's 4398 * bss info does not exist 4399 */ 4400 info = ath12k_mac_get_link_bss_conf(arvif); 4401 ath12k_bss_assoc(ar, arvif, info); 4402 4403 /* exclude assoc link as it is done above */ 4404 links &= ~BIT(ahsta->assoc_link_id); 4405 } 4406 4407 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) { 4408 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 4409 if (!arvif || !arvif->ar) 4410 continue; 4411 4412 ar = arvif->ar; 4413 4414 if (vif->cfg.assoc) { 4415 info = ath12k_mac_get_link_bss_conf(arvif); 4416 if (!info) 4417 continue; 4418 4419 ath12k_bss_assoc(ar, arvif, info); 4420 } else { 4421 ath12k_bss_disassoc(ar, arvif); 4422 } 4423 } 4424 } 4425 } 4426 EXPORT_SYMBOL(ath12k_mac_op_vif_cfg_changed); 4427 4428 static void ath12k_mac_vif_setup_ps(struct ath12k_link_vif *arvif) 4429 { 4430 struct ath12k *ar = arvif->ar; 4431 struct ieee80211_vif *vif = arvif->ahvif->vif; 4432 struct ieee80211_conf *conf = &ath12k_ar_to_hw(ar)->conf; 4433 enum wmi_sta_powersave_param param; 4434 struct ieee80211_bss_conf *info; 4435 enum wmi_sta_ps_mode psmode; 4436 int ret; 4437 int timeout; 4438 bool enable_ps; 4439 4440 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 4441 4442 if (vif->type != NL80211_IFTYPE_STATION) 4443 return; 4444 4445 enable_ps = arvif->ahvif->ps; 4446 if (enable_ps) { 4447 psmode = WMI_STA_PS_MODE_ENABLED; 4448 param = WMI_STA_PS_PARAM_INACTIVITY_TIME; 4449 4450 timeout = conf->dynamic_ps_timeout; 4451 if (timeout == 0) { 4452 info = ath12k_mac_get_link_bss_conf(arvif); 4453 if (!info) { 4454 ath12k_warn(ar->ab, "unable to access bss link conf in setup ps for vif %pM link %u\n", 4455 vif->addr, arvif->link_id); 4456 return; 4457 } 4458 4459 /* firmware doesn't like 0 */ 4460 timeout = ieee80211_tu_to_usec(info->beacon_int) / 1000; 4461 } 4462 4463 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param, 4464 timeout); 4465 if (ret) { 4466 ath12k_warn(ar->ab, "failed to set inactivity time for vdev %d: %i\n", 4467 arvif->vdev_id, ret); 4468 return; 4469 } 4470 } else { 4471 psmode = WMI_STA_PS_MODE_DISABLED; 4472 } 4473 4474 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d psmode %s\n", 4475 arvif->vdev_id, psmode ? "enable" : "disable"); 4476 4477 ret = ath12k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, psmode); 4478 if (ret) 4479 ath12k_warn(ar->ab, "failed to set sta power save mode %d for vdev %d: %d\n", 4480 psmode, arvif->vdev_id, ret); 4481 } 4482 4483 static bool ath12k_mac_supports_tpc(struct ath12k *ar, struct ath12k_vif *ahvif, 4484 const struct cfg80211_chan_def *chandef) 4485 { 4486 return ath12k_wmi_supports_6ghz_cc_ext(ar) && 4487 test_bit(WMI_TLV_SERVICE_EXT_TPC_REG_SUPPORT, ar->ab->wmi_ab.svc_map) && 4488 (ahvif->vdev_type == WMI_VDEV_TYPE_STA || 4489 ahvif->vdev_type == WMI_VDEV_TYPE_AP) && 4490 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE && 4491 chandef->chan && 4492 chandef->chan->band == NL80211_BAND_6GHZ; 4493 } 4494 4495 static void ath12k_wmi_vdev_params_up(struct ath12k *ar, 4496 struct ath12k_link_vif *arvif, 4497 struct ath12k_link_vif *tx_arvif, 4498 struct ieee80211_bss_conf *info, u16 aid) 4499 { 4500 struct ath12k_wmi_vdev_up_params params = { 4501 .vdev_id = arvif->vdev_id, 4502 .aid = aid, 4503 .bssid = arvif->bssid 4504 }; 4505 int ret; 4506 4507 if (tx_arvif) { 4508 params.tx_bssid = tx_arvif->bssid; 4509 params.nontx_profile_idx = info->bssid_index; 4510 params.nontx_profile_cnt = 1 << info->bssid_indicator; 4511 } 4512 4513 ret = ath12k_wmi_vdev_up(arvif->ar, ¶ms); 4514 if (ret) 4515 ath12k_warn(ar->ab, "failed to bring vdev up %d: %d\n", 4516 arvif->vdev_id, ret); 4517 } 4518 4519 static int ath12k_mac_config_obss_pd(struct ath12k_link_vif *arvif, 4520 const struct ieee80211_he_obss_pd *he_obss_pd) 4521 { 4522 struct ath12k_wmi_obss_pd_arg obss_pd_arg = {}; 4523 u32 srg_bitmap[2], non_srg_bitmap[2]; 4524 struct ath12k *ar = arvif->ar; 4525 u32 param_id, pdev_id; 4526 u32 param_val; 4527 int ret; 4528 4529 if (ar->ab->hw_params->single_pdev_only) 4530 pdev_id = ath12k_mac_get_target_pdev_id_from_vif(arvif); 4531 else 4532 pdev_id = ar->pdev->pdev_id; 4533 4534 /* Set and enable SRG/non-SRG OBSS PD threshold */ 4535 param_id = WMI_PDEV_PARAM_SET_CMD_OBSS_PD_THRESHOLD; 4536 if (ar->monitor_started || !he_obss_pd->enable) { 4537 ret = ath12k_wmi_pdev_set_param(ar, param_id, 0, pdev_id); 4538 if (ret) 4539 ath12k_warn(ar->ab, 4540 "failed to set OBSS PD threshold for pdev %u: %d\n", 4541 pdev_id, ret); 4542 return ret; 4543 } 4544 4545 /* 4546 * This service flag indicates firmware support for SRG/SRP-based 4547 * spatial reuse. It also specifies whether OBSS PD threshold values 4548 * should be interpreted as dB (offset) or dBm (absolute) units. 4549 */ 4550 obss_pd_arg.srp_support = test_bit(WMI_TLV_SERVICE_SRG_SRP_SPATIAL_REUSE_SUPPORT, 4551 ar->ab->wmi_ab.svc_map); 4552 4553 if (!(he_obss_pd->sr_ctrl & 4554 IEEE80211_HE_SPR_NON_SRG_OBSS_PD_SR_DISALLOWED)) { 4555 if (he_obss_pd->sr_ctrl & IEEE80211_HE_SPR_NON_SRG_OFFSET_PRESENT) 4556 obss_pd_arg.non_srg_th = ATH12K_OBSS_PD_MAX_THRESHOLD + 4557 he_obss_pd->non_srg_max_offset; 4558 else 4559 obss_pd_arg.non_srg_th = ATH12K_OBSS_PD_NON_SRG_MAX_THRESHOLD; 4560 4561 if (!obss_pd_arg.srp_support) 4562 obss_pd_arg.non_srg_th -= ATH12K_DEFAULT_NOISE_FLOOR; 4563 4564 obss_pd_arg.non_srg_enabled = true; 4565 } 4566 4567 if (he_obss_pd->sr_ctrl & IEEE80211_HE_SPR_SRG_INFORMATION_PRESENT) { 4568 obss_pd_arg.srg_th = ATH12K_OBSS_PD_MAX_THRESHOLD + 4569 he_obss_pd->max_offset; 4570 obss_pd_arg.srg_enabled = true; 4571 } 4572 4573 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 4574 "pdev %u OBSS PD sr_ctrl 0x%x srg_th %d dBm non_srg_th %d dBm\n", 4575 pdev_id, he_obss_pd->sr_ctrl, 4576 obss_pd_arg.srg_th, obss_pd_arg.non_srg_th); 4577 4578 param_val = ath12k_wmi_build_obss_pd(&obss_pd_arg); 4579 ret = ath12k_wmi_pdev_set_param(ar, param_id, param_val, pdev_id); 4580 if (ret) { 4581 ath12k_warn(ar->ab, 4582 "failed to set OBSS PD threshold for pdev %u: %d\n", 4583 pdev_id, ret); 4584 return ret; 4585 } 4586 4587 /* Enable OBSS PD for all access category */ 4588 param_id = WMI_PDEV_PARAM_SET_CMD_OBSS_PD_PER_AC; 4589 param_val = 0xf; 4590 ret = ath12k_wmi_pdev_set_param(ar, param_id, param_val, pdev_id); 4591 if (ret) { 4592 ath12k_warn(ar->ab, 4593 "failed to set OBSS PD per ac for pdev %u: %d\n", 4594 pdev_id, ret); 4595 return ret; 4596 } 4597 4598 /* Set SR prohibit */ 4599 param_id = WMI_PDEV_PARAM_ENABLE_SR_PROHIBIT; 4600 param_val = !!(he_obss_pd->sr_ctrl & 4601 IEEE80211_HE_SPR_HESIGA_SR_VAL15_ALLOWED); 4602 ret = ath12k_wmi_pdev_set_param(ar, param_id, param_val, pdev_id); 4603 if (ret) { 4604 ath12k_warn(ar->ab, "failed to set SR prohibit for pdev %u: %d\n", 4605 pdev_id, ret); 4606 return ret; 4607 } 4608 4609 if (!obss_pd_arg.srp_support) 4610 return 0; 4611 4612 memcpy(srg_bitmap, he_obss_pd->bss_color_bitmap, sizeof(srg_bitmap)); 4613 /* Set SRG BSS color bitmap */ 4614 ret = ath12k_wmi_pdev_set_srg_bss_color_bitmap(ar, pdev_id, srg_bitmap); 4615 if (ret) { 4616 ath12k_warn(ar->ab, 4617 "failed to set SRG bss color bitmap for pdev %u: %d\n", 4618 pdev_id, ret); 4619 return ret; 4620 } 4621 4622 /* Enable BSS colors for SRG */ 4623 ret = ath12k_wmi_pdev_srg_obss_color_enable_bitmap(ar, pdev_id, srg_bitmap); 4624 if (ret) { 4625 ath12k_warn(ar->ab, 4626 "failed to enable SRG bss color bitmap pdev %u: %d\n", 4627 pdev_id, ret); 4628 return ret; 4629 } 4630 4631 memcpy(srg_bitmap, he_obss_pd->partial_bssid_bitmap, sizeof(srg_bitmap)); 4632 /* Set SRG partial bssid bitmap */ 4633 ret = ath12k_wmi_pdev_set_srg_partial_bssid_bitmap(ar, pdev_id, srg_bitmap); 4634 if (ret) { 4635 ath12k_warn(ar->ab, 4636 "failed to set SRG partial bssid bitmap for pdev %u: %d\n", 4637 pdev_id, ret); 4638 return ret; 4639 } 4640 4641 /* Enable partial bssid mask for SRG */ 4642 ret = ath12k_wmi_pdev_srg_obss_bssid_enable_bitmap(ar, pdev_id, srg_bitmap); 4643 if (ret) { 4644 ath12k_warn(ar->ab, 4645 "failed to enable SRG bssid bitmap pdev %u: %d\n", 4646 pdev_id, ret); 4647 return ret; 4648 } 4649 4650 /* 4651 * No explicit non-SRG bitmap from mac80211; enable all colors/bssids 4652 * as non-SRG candidates. Actual SRG members are filtered by SRG bitmaps. 4653 */ 4654 memset(non_srg_bitmap, 0xff, sizeof(non_srg_bitmap)); 4655 4656 /* Enable BSS colors for non-SRG */ 4657 ret = ath12k_wmi_pdev_non_srg_obss_color_enable_bitmap(ar, pdev_id, 4658 non_srg_bitmap); 4659 if (ret) { 4660 ath12k_warn(ar->ab, 4661 "failed to enable non SRG color bitmap pdev %u: %d\n", 4662 pdev_id, ret); 4663 return ret; 4664 } 4665 4666 /* Enable partial bssid mask for non-SRG */ 4667 ret = ath12k_wmi_pdev_non_srg_obss_bssid_enable_bitmap(ar, pdev_id, 4668 non_srg_bitmap); 4669 if (ret) { 4670 ath12k_warn(ar->ab, 4671 "failed to enable non SRG bssid bitmap pdev %u: %d\n", 4672 pdev_id, ret); 4673 return ret; 4674 } 4675 4676 return 0; 4677 } 4678 4679 static void ath12k_mac_bss_info_changed(struct ath12k *ar, 4680 struct ath12k_link_vif *arvif, 4681 struct ieee80211_bss_conf *info, 4682 u64 changed) 4683 { 4684 struct ath12k_vif *ahvif = arvif->ahvif; 4685 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif); 4686 struct ieee80211_vif_cfg *vif_cfg = &vif->cfg; 4687 struct ath12k_link_vif *tx_arvif; 4688 struct cfg80211_chan_def def; 4689 u32 param_id, param_value; 4690 enum nl80211_band band; 4691 u32 vdev_param; 4692 int mcast_rate; 4693 u32 preamble; 4694 u16 hw_value; 4695 u16 bitrate; 4696 u8 rateidx; 4697 u32 rate; 4698 int ret; 4699 4700 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 4701 4702 if (changed & BSS_CHANGED_BEACON_INT) { 4703 arvif->beacon_interval = info->beacon_int; 4704 4705 param_id = WMI_VDEV_PARAM_BEACON_INTERVAL; 4706 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 4707 param_id, 4708 arvif->beacon_interval); 4709 if (ret) 4710 ath12k_warn(ar->ab, "Failed to set beacon interval for VDEV: %d\n", 4711 arvif->vdev_id); 4712 else 4713 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 4714 "Beacon interval: %d set for VDEV: %d\n", 4715 arvif->beacon_interval, arvif->vdev_id); 4716 } 4717 4718 if (changed & BSS_CHANGED_BEACON) { 4719 param_id = WMI_PDEV_PARAM_BEACON_TX_MODE; 4720 param_value = WMI_BEACON_BURST_MODE; 4721 ret = ath12k_wmi_pdev_set_param(ar, param_id, 4722 param_value, ar->pdev->pdev_id); 4723 if (ret) 4724 ath12k_warn(ar->ab, "Failed to set beacon mode for VDEV: %d\n", 4725 arvif->vdev_id); 4726 else 4727 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 4728 "Set burst beacon mode for VDEV: %d\n", 4729 arvif->vdev_id); 4730 4731 /* In MBSSID case, need to install transmitting VIF's template first */ 4732 4733 ret = ath12k_mac_setup_bcn_tmpl(arvif); 4734 if (ret) 4735 ath12k_warn(ar->ab, "failed to update bcn template: %d\n", 4736 ret); 4737 4738 if (!arvif->is_csa_in_progress) 4739 goto skip_vdev_up; 4740 4741 tx_arvif = ath12k_mac_get_tx_arvif(arvif, info); 4742 if (tx_arvif && arvif != tx_arvif && tx_arvif->is_csa_in_progress) 4743 /* skip non tx vif's */ 4744 goto skip_vdev_up; 4745 4746 ath12k_wmi_vdev_params_up(ar, arvif, tx_arvif, info, ahvif->aid); 4747 4748 arvif->is_csa_in_progress = false; 4749 4750 if (tx_arvif && arvif == tx_arvif) { 4751 struct ath12k_link_vif *arvif_itr; 4752 4753 list_for_each_entry(arvif_itr, &ar->arvifs, list) { 4754 if (!arvif_itr->is_csa_in_progress) 4755 continue; 4756 4757 ath12k_wmi_vdev_params_up(ar, arvif, tx_arvif, 4758 info, ahvif->aid); 4759 arvif_itr->is_csa_in_progress = false; 4760 } 4761 } 4762 } 4763 4764 skip_vdev_up: 4765 4766 if (changed & (BSS_CHANGED_BEACON_INFO | BSS_CHANGED_BEACON)) { 4767 arvif->dtim_period = info->dtim_period; 4768 4769 param_id = WMI_VDEV_PARAM_DTIM_PERIOD; 4770 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 4771 param_id, 4772 arvif->dtim_period); 4773 4774 if (ret) 4775 ath12k_warn(ar->ab, "Failed to set dtim period for VDEV %d: %i\n", 4776 arvif->vdev_id, ret); 4777 else 4778 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 4779 "DTIM period: %d set for VDEV: %d\n", 4780 arvif->dtim_period, arvif->vdev_id); 4781 } 4782 4783 if (changed & BSS_CHANGED_SSID && 4784 vif->type == NL80211_IFTYPE_AP) { 4785 ahvif->u.ap.ssid_len = vif->cfg.ssid_len; 4786 if (vif->cfg.ssid_len) 4787 memcpy(ahvif->u.ap.ssid, vif->cfg.ssid, vif->cfg.ssid_len); 4788 ahvif->u.ap.hidden_ssid = info->hidden_ssid; 4789 } 4790 4791 if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid)) 4792 ether_addr_copy(arvif->bssid, info->bssid); 4793 4794 if (changed & BSS_CHANGED_BEACON_ENABLED) { 4795 if (info->enable_beacon) { 4796 ret = ath12k_mac_set_he_txbf_conf(arvif); 4797 if (ret) 4798 ath12k_warn(ar->ab, 4799 "failed to set HE TXBF config for vdev: %d\n", 4800 arvif->vdev_id); 4801 4802 ret = ath12k_mac_set_eht_txbf_conf(arvif); 4803 if (ret) 4804 ath12k_warn(ar->ab, 4805 "failed to set EHT TXBF config for vdev: %d\n", 4806 arvif->vdev_id); 4807 } 4808 ath12k_control_beaconing(arvif, info); 4809 4810 if (arvif->is_up && info->he_support && 4811 info->he_oper.params) { 4812 /* TODO: Extend to support 1024 BA Bitmap size */ 4813 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 4814 WMI_VDEV_PARAM_BA_MODE, 4815 WMI_BA_MODE_BUFFER_SIZE_256); 4816 if (ret) 4817 ath12k_warn(ar->ab, 4818 "failed to set BA BUFFER SIZE 256 for vdev: %d\n", 4819 arvif->vdev_id); 4820 4821 param_id = WMI_VDEV_PARAM_HEOPS_0_31; 4822 param_value = info->he_oper.params; 4823 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 4824 param_id, param_value); 4825 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 4826 "he oper param: %x set for VDEV: %d\n", 4827 param_value, arvif->vdev_id); 4828 4829 if (ret) 4830 ath12k_warn(ar->ab, "Failed to set he oper params %x for VDEV %d: %i\n", 4831 param_value, arvif->vdev_id, ret); 4832 } 4833 } 4834 4835 if (changed & BSS_CHANGED_ERP_CTS_PROT) { 4836 u32 cts_prot; 4837 4838 cts_prot = !!(info->use_cts_prot); 4839 param_id = WMI_VDEV_PARAM_PROTECTION_MODE; 4840 4841 if (arvif->is_started) { 4842 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 4843 param_id, cts_prot); 4844 if (ret) 4845 ath12k_warn(ar->ab, "Failed to set CTS prot for VDEV: %d\n", 4846 arvif->vdev_id); 4847 else 4848 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "Set CTS prot: %d for VDEV: %d\n", 4849 cts_prot, arvif->vdev_id); 4850 } else { 4851 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "defer protection mode setup, vdev is not ready yet\n"); 4852 } 4853 } 4854 4855 if (changed & BSS_CHANGED_ERP_SLOT) { 4856 u32 slottime; 4857 4858 if (info->use_short_slot) 4859 slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */ 4860 4861 else 4862 slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */ 4863 4864 param_id = WMI_VDEV_PARAM_SLOT_TIME; 4865 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 4866 param_id, slottime); 4867 if (ret) 4868 ath12k_warn(ar->ab, "Failed to set erp slot for VDEV: %d\n", 4869 arvif->vdev_id); 4870 else 4871 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 4872 "Set slottime: %d for VDEV: %d\n", 4873 slottime, arvif->vdev_id); 4874 } 4875 4876 if (changed & BSS_CHANGED_ERP_PREAMBLE) { 4877 u32 preamble; 4878 4879 if (info->use_short_preamble) 4880 preamble = WMI_VDEV_PREAMBLE_SHORT; 4881 else 4882 preamble = WMI_VDEV_PREAMBLE_LONG; 4883 4884 param_id = WMI_VDEV_PARAM_PREAMBLE; 4885 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 4886 param_id, preamble); 4887 if (ret) 4888 ath12k_warn(ar->ab, "Failed to set preamble for VDEV: %d\n", 4889 arvif->vdev_id); 4890 else 4891 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 4892 "Set preamble: %d for VDEV: %d\n", 4893 preamble, arvif->vdev_id); 4894 } 4895 4896 if (changed & BSS_CHANGED_ASSOC) { 4897 if (vif->cfg.assoc) 4898 ath12k_bss_assoc(ar, arvif, info); 4899 else 4900 ath12k_bss_disassoc(ar, arvif); 4901 } 4902 4903 if (changed & BSS_CHANGED_TXPOWER) { 4904 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev_id %i txpower %d\n", 4905 arvif->vdev_id, info->txpower); 4906 4907 arvif->txpower = info->txpower; 4908 ath12k_mac_txpower_recalc(ar); 4909 } 4910 4911 if (changed & BSS_CHANGED_MCAST_RATE && 4912 !ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)) { 4913 band = def.chan->band; 4914 mcast_rate = info->mcast_rate[band]; 4915 4916 if (mcast_rate > 0) { 4917 rateidx = mcast_rate - 1; 4918 } else { 4919 if (info->basic_rates) 4920 rateidx = __ffs(info->basic_rates); 4921 else 4922 rateidx = 0; 4923 } 4924 4925 if (ar->pdev->cap.supported_bands & WMI_HOST_WLAN_5GHZ_CAP) 4926 rateidx += ATH12K_MAC_FIRST_OFDM_RATE_IDX; 4927 4928 bitrate = ath12k_legacy_rates[rateidx].bitrate; 4929 hw_value = ath12k_legacy_rates[rateidx].hw_value; 4930 4931 if (ath12k_mac_bitrate_is_cck(bitrate)) 4932 preamble = WMI_RATE_PREAMBLE_CCK; 4933 else 4934 preamble = WMI_RATE_PREAMBLE_OFDM; 4935 4936 rate = ATH12K_HW_RATE_CODE(hw_value, 0, preamble); 4937 4938 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 4939 "mac vdev %d mcast_rate %x\n", 4940 arvif->vdev_id, rate); 4941 4942 vdev_param = WMI_VDEV_PARAM_MCAST_DATA_RATE; 4943 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 4944 vdev_param, rate); 4945 if (ret) 4946 ath12k_warn(ar->ab, 4947 "failed to set mcast rate on vdev %i: %d\n", 4948 arvif->vdev_id, ret); 4949 4950 vdev_param = WMI_VDEV_PARAM_BCAST_DATA_RATE; 4951 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 4952 vdev_param, rate); 4953 if (ret) 4954 ath12k_warn(ar->ab, 4955 "failed to set bcast rate on vdev %i: %d\n", 4956 arvif->vdev_id, ret); 4957 } 4958 4959 if (changed & BSS_CHANGED_BASIC_RATES && 4960 !ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)) 4961 ath12k_recalculate_mgmt_rate(ar, arvif, &def); 4962 4963 if (changed & BSS_CHANGED_TWT) { 4964 if (info->twt_requester || info->twt_responder) 4965 ath12k_wmi_send_twt_enable_cmd(ar, ar->pdev->pdev_id); 4966 else 4967 ath12k_wmi_send_twt_disable_cmd(ar, ar->pdev->pdev_id); 4968 } 4969 4970 if (changed & BSS_CHANGED_HE_OBSS_PD) { 4971 if (vif->type == NL80211_IFTYPE_AP) 4972 ath12k_mac_config_obss_pd(arvif, &info->he_obss_pd); 4973 else 4974 ath12k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id, 4975 &info->he_obss_pd); 4976 } 4977 4978 if (changed & BSS_CHANGED_HE_BSS_COLOR) { 4979 if (vif->type == NL80211_IFTYPE_AP) { 4980 ret = ath12k_wmi_obss_color_cfg_cmd(ar, 4981 arvif->vdev_id, 4982 info->he_bss_color.color, 4983 ATH12K_BSS_COLOR_AP_PERIODS, 4984 info->he_bss_color.enabled); 4985 if (ret) 4986 ath12k_warn(ar->ab, "failed to set bss color collision on vdev %u: %d\n", 4987 arvif->vdev_id, ret); 4988 4989 param_id = WMI_VDEV_PARAM_BSS_COLOR; 4990 if (info->he_bss_color.enabled) 4991 param_value = info->he_bss_color.color << 4992 IEEE80211_HE_OPERATION_BSS_COLOR_OFFSET; 4993 else 4994 param_value = IEEE80211_HE_OPERATION_BSS_COLOR_DISABLED; 4995 4996 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 4997 param_id, 4998 param_value); 4999 if (ret) 5000 ath12k_warn(ar->ab, "failed to set bss color param on vdev %u: %d\n", 5001 arvif->vdev_id, ret); 5002 else 5003 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "bss color param 0x%x set on vdev %u\n", 5004 param_value, arvif->vdev_id); 5005 } else if (vif->type == NL80211_IFTYPE_STATION) { 5006 ret = ath12k_wmi_send_bss_color_change_enable_cmd(ar, 5007 arvif->vdev_id, 5008 1); 5009 if (ret) 5010 ath12k_warn(ar->ab, "failed to enable bss color change on vdev %i: %d\n", 5011 arvif->vdev_id, ret); 5012 ret = ath12k_wmi_obss_color_cfg_cmd(ar, 5013 arvif->vdev_id, 5014 0, 5015 ATH12K_BSS_COLOR_STA_PERIODS, 5016 1); 5017 if (ret) 5018 ath12k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n", 5019 arvif->vdev_id, ret); 5020 } 5021 } 5022 5023 ath12k_mac_fils_discovery(arvif, info); 5024 5025 if (changed & BSS_CHANGED_PS && 5026 ar->ab->hw_params->supports_sta_ps) { 5027 ahvif->ps = vif_cfg->ps; 5028 ath12k_mac_vif_setup_ps(arvif); 5029 } 5030 } 5031 5032 static struct ath12k_vif_cache *ath12k_ahvif_get_link_cache(struct ath12k_vif *ahvif, 5033 u8 link_id) 5034 { 5035 if (!ahvif->cache[link_id]) { 5036 ahvif->cache[link_id] = kzalloc_obj(*ahvif->cache[0]); 5037 if (ahvif->cache[link_id]) 5038 INIT_LIST_HEAD(&ahvif->cache[link_id]->key_conf.list); 5039 } 5040 5041 return ahvif->cache[link_id]; 5042 } 5043 5044 static void ath12k_ahvif_put_link_key_cache(struct ath12k_vif_cache *cache) 5045 { 5046 struct ath12k_key_conf *key_conf, *tmp; 5047 5048 if (!cache || list_empty(&cache->key_conf.list)) 5049 return; 5050 list_for_each_entry_safe(key_conf, tmp, &cache->key_conf.list, list) { 5051 list_del(&key_conf->list); 5052 kfree(key_conf); 5053 } 5054 } 5055 5056 static void ath12k_ahvif_put_link_cache(struct ath12k_vif *ahvif, u8 link_id) 5057 { 5058 if (link_id >= IEEE80211_MLD_MAX_NUM_LINKS) 5059 return; 5060 5061 ath12k_ahvif_put_link_key_cache(ahvif->cache[link_id]); 5062 kfree(ahvif->cache[link_id]); 5063 ahvif->cache[link_id] = NULL; 5064 } 5065 5066 void ath12k_mac_op_link_info_changed(struct ieee80211_hw *hw, 5067 struct ieee80211_vif *vif, 5068 struct ieee80211_bss_conf *info, 5069 u64 changed) 5070 { 5071 struct ath12k *ar; 5072 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 5073 struct ath12k_vif_cache *cache; 5074 struct ath12k_link_vif *arvif; 5075 u8 link_id = info->link_id; 5076 5077 lockdep_assert_wiphy(hw->wiphy); 5078 5079 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 5080 5081 /* if the vdev is not created on a certain radio, 5082 * cache the info to be updated later on vdev creation 5083 */ 5084 5085 if (!arvif || !arvif->is_created) { 5086 cache = ath12k_ahvif_get_link_cache(ahvif, link_id); 5087 if (!cache) 5088 return; 5089 5090 cache->bss_conf_changed |= changed; 5091 5092 return; 5093 } 5094 5095 ar = arvif->ar; 5096 5097 ath12k_mac_bss_info_changed(ar, arvif, info, changed); 5098 } 5099 EXPORT_SYMBOL(ath12k_mac_op_link_info_changed); 5100 5101 static struct ath12k* 5102 ath12k_mac_select_scan_device(struct ieee80211_hw *hw, 5103 struct ieee80211_vif *vif, 5104 u32 center_freq) 5105 { 5106 struct ath12k_hw *ah = hw->priv; 5107 enum nl80211_band band; 5108 struct ath12k *ar; 5109 int i; 5110 5111 if (ah->num_radio == 1) 5112 return ah->radio; 5113 5114 /* Currently mac80211 supports splitting scan requests into 5115 * multiple scan requests per band. 5116 * Loop through first channel and determine the scan radio 5117 * TODO: There could be 5 GHz low/high channels in that case 5118 * split the hw request and perform multiple scans 5119 */ 5120 5121 if (center_freq < ATH12K_MIN_5GHZ_FREQ) 5122 band = NL80211_BAND_2GHZ; 5123 else if (center_freq < ATH12K_MIN_6GHZ_FREQ) 5124 band = NL80211_BAND_5GHZ; 5125 else 5126 band = NL80211_BAND_6GHZ; 5127 5128 for_each_ar(ah, ar, i) { 5129 if (ar->mac.sbands[band].channels && 5130 center_freq >= KHZ_TO_MHZ(ar->freq_range.start_freq) && 5131 center_freq <= KHZ_TO_MHZ(ar->freq_range.end_freq)) 5132 return ar; 5133 } 5134 5135 return NULL; 5136 } 5137 5138 void __ath12k_mac_scan_finish(struct ath12k *ar) 5139 { 5140 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar); 5141 5142 lockdep_assert_held(&ar->data_lock); 5143 5144 switch (ar->scan.state) { 5145 case ATH12K_SCAN_IDLE: 5146 break; 5147 case ATH12K_SCAN_RUNNING: 5148 case ATH12K_SCAN_ABORTING: 5149 if (ar->scan.is_roc && ar->scan.roc_notify) 5150 ieee80211_remain_on_channel_expired(hw); 5151 fallthrough; 5152 case ATH12K_SCAN_STARTING: 5153 cancel_delayed_work(&ar->scan.timeout); 5154 complete_all(&ar->scan.completed); 5155 wiphy_work_queue(ar->ah->hw->wiphy, &ar->scan.vdev_clean_wk); 5156 break; 5157 } 5158 } 5159 5160 void ath12k_mac_scan_finish(struct ath12k *ar) 5161 { 5162 spin_lock_bh(&ar->data_lock); 5163 __ath12k_mac_scan_finish(ar); 5164 spin_unlock_bh(&ar->data_lock); 5165 } 5166 5167 static int ath12k_scan_stop(struct ath12k *ar) 5168 { 5169 struct ath12k_wmi_scan_cancel_arg arg = { 5170 .req_type = WLAN_SCAN_CANCEL_SINGLE, 5171 .scan_id = ATH12K_SCAN_ID, 5172 }; 5173 int ret; 5174 5175 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 5176 5177 /* TODO: Fill other STOP Params */ 5178 arg.pdev_id = ar->pdev->pdev_id; 5179 5180 ret = ath12k_wmi_send_scan_stop_cmd(ar, &arg); 5181 if (ret) { 5182 ath12k_warn(ar->ab, "failed to stop wmi scan: %d\n", ret); 5183 goto out; 5184 } 5185 5186 ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ); 5187 if (ret == 0) { 5188 ath12k_warn(ar->ab, 5189 "failed to receive scan abort comple: timed out\n"); 5190 ret = -ETIMEDOUT; 5191 } else if (ret > 0) { 5192 ret = 0; 5193 } 5194 5195 out: 5196 /* Scan state should be updated in scan completion worker but in 5197 * case firmware fails to deliver the event (for whatever reason) 5198 * it is desired to clean up scan state anyway. Firmware may have 5199 * just dropped the scan completion event delivery due to transport 5200 * pipe being overflown with data and/or it can recover on its own 5201 * before next scan request is submitted. 5202 */ 5203 spin_lock_bh(&ar->data_lock); 5204 if (ret) 5205 __ath12k_mac_scan_finish(ar); 5206 spin_unlock_bh(&ar->data_lock); 5207 5208 return ret; 5209 } 5210 5211 static void ath12k_scan_abort(struct ath12k *ar) 5212 { 5213 int ret; 5214 5215 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 5216 5217 spin_lock_bh(&ar->data_lock); 5218 5219 switch (ar->scan.state) { 5220 case ATH12K_SCAN_IDLE: 5221 /* This can happen if timeout worker kicked in and called 5222 * abortion while scan completion was being processed. 5223 */ 5224 break; 5225 case ATH12K_SCAN_STARTING: 5226 case ATH12K_SCAN_ABORTING: 5227 ath12k_warn(ar->ab, "refusing scan abortion due to invalid scan state: %d\n", 5228 ar->scan.state); 5229 break; 5230 case ATH12K_SCAN_RUNNING: 5231 ar->scan.state = ATH12K_SCAN_ABORTING; 5232 spin_unlock_bh(&ar->data_lock); 5233 5234 ret = ath12k_scan_stop(ar); 5235 if (ret) 5236 ath12k_warn(ar->ab, "failed to abort scan: %d\n", ret); 5237 5238 spin_lock_bh(&ar->data_lock); 5239 break; 5240 } 5241 5242 spin_unlock_bh(&ar->data_lock); 5243 } 5244 5245 static void ath12k_scan_timeout_work(struct work_struct *work) 5246 { 5247 struct ath12k *ar = container_of(work, struct ath12k, 5248 scan.timeout.work); 5249 5250 wiphy_lock(ath12k_ar_to_hw(ar)->wiphy); 5251 ath12k_scan_abort(ar); 5252 wiphy_unlock(ath12k_ar_to_hw(ar)->wiphy); 5253 } 5254 5255 static void ath12k_mac_scan_send_complete(struct ath12k *ar, 5256 struct cfg80211_scan_info *info) 5257 { 5258 struct ath12k_hw *ah = ar->ah; 5259 struct ath12k *partner_ar; 5260 int i; 5261 5262 lockdep_assert_wiphy(ah->hw->wiphy); 5263 5264 for_each_ar(ah, partner_ar, i) 5265 if (partner_ar != ar && 5266 partner_ar->scan.state == ATH12K_SCAN_RUNNING) 5267 return; 5268 5269 ieee80211_scan_completed(ah->hw, info); 5270 } 5271 5272 static void ath12k_scan_vdev_clean_work(struct wiphy *wiphy, struct wiphy_work *work) 5273 { 5274 struct ath12k *ar = container_of(work, struct ath12k, 5275 scan.vdev_clean_wk); 5276 struct ath12k_hw *ah = ar->ah; 5277 struct ath12k_link_vif *arvif; 5278 5279 lockdep_assert_wiphy(wiphy); 5280 5281 arvif = ar->scan.arvif; 5282 5283 /* The scan vdev has already been deleted. This can occur when a 5284 * new scan request is made on the same vif with a different 5285 * frequency, causing the scan arvif to move from one radio to 5286 * another. Or, scan was abrupted and via remove interface, the 5287 * arvif is already deleted. Alternatively, if the scan vdev is not 5288 * being used as an actual vdev, then do not delete it. 5289 */ 5290 if (!arvif || arvif->is_started) 5291 goto work_complete; 5292 5293 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac clean scan vdev (link id %u)", 5294 arvif->link_id); 5295 5296 ath12k_mac_remove_link_interface(ah->hw, arvif); 5297 ath12k_mac_unassign_link_vif(arvif); 5298 5299 work_complete: 5300 spin_lock_bh(&ar->data_lock); 5301 ar->scan.arvif = NULL; 5302 if (!ar->scan.is_roc) { 5303 struct cfg80211_scan_info info = { 5304 .aborted = ((ar->scan.state == 5305 ATH12K_SCAN_ABORTING) || 5306 (ar->scan.state == 5307 ATH12K_SCAN_STARTING)), 5308 }; 5309 5310 ath12k_mac_scan_send_complete(ar, &info); 5311 } 5312 5313 ar->scan.state = ATH12K_SCAN_IDLE; 5314 ar->scan_channel = NULL; 5315 ar->scan.roc_freq = 0; 5316 spin_unlock_bh(&ar->data_lock); 5317 } 5318 5319 static int ath12k_start_scan(struct ath12k *ar, 5320 struct ath12k_wmi_scan_req_arg *arg) 5321 { 5322 int ret; 5323 5324 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 5325 5326 ret = ath12k_wmi_send_scan_start_cmd(ar, arg); 5327 if (ret) 5328 return ret; 5329 5330 ret = wait_for_completion_timeout(&ar->scan.started, 1 * HZ); 5331 if (ret == 0) { 5332 ret = ath12k_scan_stop(ar); 5333 if (ret) 5334 ath12k_warn(ar->ab, "failed to stop scan: %d\n", ret); 5335 5336 return -ETIMEDOUT; 5337 } 5338 5339 /* If we failed to start the scan, return error code at 5340 * this point. This is probably due to some issue in the 5341 * firmware, but no need to wedge the driver due to that... 5342 */ 5343 spin_lock_bh(&ar->data_lock); 5344 if (ar->scan.state == ATH12K_SCAN_IDLE) { 5345 spin_unlock_bh(&ar->data_lock); 5346 return -EINVAL; 5347 } 5348 spin_unlock_bh(&ar->data_lock); 5349 5350 return 0; 5351 } 5352 5353 int ath12k_mac_get_fw_stats(struct ath12k *ar, 5354 struct ath12k_fw_stats_req_params *param) 5355 { 5356 struct ath12k_base *ab = ar->ab; 5357 struct ath12k_hw *ah = ath12k_ar_to_ah(ar); 5358 unsigned long time_left; 5359 int ret; 5360 5361 guard(mutex)(&ah->hw_mutex); 5362 5363 if (ah->state != ATH12K_HW_STATE_ON) 5364 return -ENETDOWN; 5365 5366 reinit_completion(&ar->fw_stats_complete); 5367 reinit_completion(&ar->fw_stats_done); 5368 5369 ret = ath12k_wmi_send_stats_request_cmd(ar, param->stats_id, 5370 param->vdev_id, param->pdev_id); 5371 if (ret) { 5372 ath12k_warn(ab, "failed to request fw stats: %d\n", ret); 5373 return ret; 5374 } 5375 5376 ath12k_dbg(ab, ATH12K_DBG_WMI, 5377 "get fw stat pdev id %d vdev id %d stats id 0x%x\n", 5378 param->pdev_id, param->vdev_id, param->stats_id); 5379 5380 time_left = wait_for_completion_timeout(&ar->fw_stats_complete, 1 * HZ); 5381 if (!time_left) { 5382 ath12k_warn(ab, "time out while waiting for get fw stats\n"); 5383 return -ETIMEDOUT; 5384 } 5385 5386 /* Firmware sends WMI_UPDATE_STATS_EVENTID back-to-back 5387 * when stats data buffer limit is reached. fw_stats_complete 5388 * is completed once host receives first event from firmware, but 5389 * still there could be more events following. Below is to wait 5390 * until firmware completes sending all the events. 5391 */ 5392 time_left = wait_for_completion_timeout(&ar->fw_stats_done, 3 * HZ); 5393 if (!time_left) { 5394 ath12k_warn(ab, "time out while waiting for fw stats done\n"); 5395 return -ETIMEDOUT; 5396 } 5397 5398 return 0; 5399 } 5400 5401 int ath12k_mac_op_get_txpower(struct ieee80211_hw *hw, 5402 struct ieee80211_vif *vif, 5403 unsigned int link_id, 5404 int *dbm) 5405 { 5406 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 5407 struct ath12k_fw_stats_req_params params = {}; 5408 struct ath12k_fw_stats_pdev *pdev; 5409 struct ath12k_hw *ah = hw->priv; 5410 struct ath12k_link_vif *arvif; 5411 struct ath12k_base *ab; 5412 struct ath12k *ar; 5413 int ret; 5414 5415 /* Final Tx power is minimum of Target Power, CTL power, Regulatory 5416 * Power, PSD EIRP Power. We just know the Regulatory power from the 5417 * regulatory rules obtained. FW knows all these power and sets the min 5418 * of these. Hence, we request the FW pdev stats in which FW reports 5419 * the minimum of all vdev's channel Tx power. 5420 */ 5421 lockdep_assert_wiphy(hw->wiphy); 5422 5423 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]); 5424 if (!arvif || !arvif->ar) 5425 return -EINVAL; 5426 5427 ar = arvif->ar; 5428 ab = ar->ab; 5429 if (ah->state != ATH12K_HW_STATE_ON) 5430 goto err_fallback; 5431 5432 if (test_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags)) 5433 return -EAGAIN; 5434 5435 /* Limit the requests to Firmware for fetching the tx power */ 5436 if (ar->chan_tx_pwr != ATH12K_PDEV_TX_POWER_INVALID && 5437 time_before(jiffies, 5438 msecs_to_jiffies(ATH12K_PDEV_TX_POWER_REFRESH_TIME_MSECS) + 5439 ar->last_tx_power_update)) 5440 goto send_tx_power; 5441 5442 params.pdev_id = ath12k_mac_get_target_pdev_id(ar); 5443 params.vdev_id = arvif->vdev_id; 5444 params.stats_id = WMI_REQUEST_PDEV_STAT; 5445 ret = ath12k_mac_get_fw_stats(ar, ¶ms); 5446 if (ret) { 5447 ath12k_warn(ab, "failed to request fw pdev stats: %d\n", ret); 5448 goto err_fallback; 5449 } 5450 5451 spin_lock_bh(&ar->data_lock); 5452 pdev = list_first_entry_or_null(&ar->fw_stats.pdevs, 5453 struct ath12k_fw_stats_pdev, list); 5454 if (!pdev) { 5455 spin_unlock_bh(&ar->data_lock); 5456 goto err_fallback; 5457 } 5458 5459 /* tx power reported by firmware is in units of 0.5 dBm */ 5460 ar->chan_tx_pwr = pdev->chan_tx_power / 2; 5461 spin_unlock_bh(&ar->data_lock); 5462 ar->last_tx_power_update = jiffies; 5463 ath12k_fw_stats_reset(ar); 5464 5465 send_tx_power: 5466 *dbm = ar->chan_tx_pwr; 5467 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "txpower fetched from firmware %d dBm\n", 5468 *dbm); 5469 return 0; 5470 5471 err_fallback: 5472 /* We didn't get txpower from FW. Hence, relying on vif->bss_conf.txpower */ 5473 *dbm = vif->bss_conf.txpower; 5474 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "txpower from firmware NaN, reported %d dBm\n", 5475 *dbm); 5476 return 0; 5477 } 5478 EXPORT_SYMBOL(ath12k_mac_op_get_txpower); 5479 5480 static u8 5481 ath12k_mac_find_link_id_by_ar(struct ath12k_vif *ahvif, struct ath12k *ar) 5482 { 5483 struct ath12k_link_vif *arvif; 5484 struct ath12k_hw *ah = ahvif->ah; 5485 unsigned long links = ahvif->links_map; 5486 unsigned long scan_links_map; 5487 u8 link_id; 5488 5489 lockdep_assert_wiphy(ah->hw->wiphy); 5490 5491 for_each_set_bit(link_id, &links, ATH12K_NUM_MAX_LINKS) { 5492 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]); 5493 5494 if (!arvif || !arvif->is_created) 5495 continue; 5496 5497 if (ar == arvif->ar) 5498 return link_id; 5499 } 5500 5501 /* input ar is not assigned to any of the links of ML VIF, use next 5502 * available scan link for scan vdev creation. There are cases where 5503 * single scan req needs to be split in driver and initiate separate 5504 * scan requests to firmware based on device. 5505 */ 5506 5507 /* Unset all non-scan links (0-14) of scan_links_map so that ffs() will 5508 * choose an available link among scan links (i.e link id >= 15) 5509 */ 5510 scan_links_map = ~ahvif->links_map & ATH12K_SCAN_LINKS_MASK; 5511 if (scan_links_map) 5512 return __ffs(scan_links_map); 5513 5514 return ATH12K_FIRST_SCAN_LINK; 5515 } 5516 5517 static int ath12k_mac_initiate_hw_scan(struct ieee80211_hw *hw, 5518 struct ieee80211_vif *vif, 5519 struct ieee80211_scan_request *hw_req, 5520 int n_channels, 5521 struct ieee80211_channel **chan_list, 5522 struct ath12k *ar) 5523 { 5524 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 5525 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 5526 struct ath12k_link_vif *arvif; 5527 struct cfg80211_scan_request *req = &hw_req->req; 5528 struct ath12k_wmi_scan_req_arg *arg = NULL; 5529 u8 link_id; 5530 int ret; 5531 int i; 5532 bool create = true; 5533 5534 lockdep_assert_wiphy(hw->wiphy); 5535 5536 arvif = &ahvif->deflink; 5537 5538 /* check if any of the links of ML VIF is already started on 5539 * radio(ar) corresponding to given scan frequency and use it, 5540 * if not use scan link (link id >= 15) for scan purpose. 5541 */ 5542 link_id = ath12k_mac_find_link_id_by_ar(ahvif, ar); 5543 /* All scan links are occupied. ideally this shouldn't happen as 5544 * mac80211 won't schedule scan for same band until ongoing scan is 5545 * completed, don't try to exceed max links just in case if it happens. 5546 */ 5547 if (link_id >= ATH12K_NUM_MAX_LINKS) 5548 return -EBUSY; 5549 5550 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id); 5551 5552 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac link ID %d selected for scan", 5553 arvif->link_id); 5554 5555 /* If the vif is already assigned to a specific vdev of an ar, 5556 * check whether its already started, vdev which is started 5557 * are not allowed to switch to a new radio. 5558 * If the vdev is not started, but was earlier created on a 5559 * different ar, delete that vdev and create a new one. We don't 5560 * delete at the scan stop as an optimization to avoid redundant 5561 * delete-create vdev's for the same ar, in case the request is 5562 * always on the same band for the vif 5563 */ 5564 if (arvif->is_created) { 5565 if (WARN_ON(!arvif->ar)) 5566 return -EINVAL; 5567 5568 if (ar != arvif->ar && arvif->is_started) 5569 return -EINVAL; 5570 5571 if (ar != arvif->ar) { 5572 ath12k_mac_remove_link_interface(hw, arvif); 5573 ath12k_mac_unassign_link_vif(arvif); 5574 } else { 5575 create = false; 5576 } 5577 } 5578 5579 if (create) { 5580 /* Previous arvif would've been cleared in radio switch block 5581 * above, assign arvif again for create. 5582 */ 5583 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id); 5584 5585 ret = ath12k_mac_vdev_create(ar, arvif); 5586 if (ret) { 5587 ath12k_warn(ar->ab, "unable to create scan vdev %d\n", ret); 5588 ath12k_mac_unassign_link_vif(arvif); 5589 return ret; 5590 } 5591 } 5592 5593 spin_lock_bh(&ar->data_lock); 5594 switch (ar->scan.state) { 5595 case ATH12K_SCAN_IDLE: 5596 reinit_completion(&ar->scan.started); 5597 reinit_completion(&ar->scan.completed); 5598 ar->scan.state = ATH12K_SCAN_STARTING; 5599 ar->scan.is_roc = false; 5600 ar->scan.arvif = arvif; 5601 ret = 0; 5602 break; 5603 case ATH12K_SCAN_STARTING: 5604 case ATH12K_SCAN_RUNNING: 5605 case ATH12K_SCAN_ABORTING: 5606 ret = -EBUSY; 5607 break; 5608 } 5609 spin_unlock_bh(&ar->data_lock); 5610 5611 if (ret) 5612 goto exit; 5613 5614 arg = kzalloc_obj(*arg); 5615 if (!arg) { 5616 ret = -ENOMEM; 5617 goto exit; 5618 } 5619 5620 ath12k_wmi_start_scan_init(ar, arg); 5621 arg->vdev_id = arvif->vdev_id; 5622 arg->scan_id = ATH12K_SCAN_ID; 5623 5624 if (req->ie_len) { 5625 arg->extraie.ptr = kmemdup(req->ie, req->ie_len, GFP_KERNEL); 5626 if (!arg->extraie.ptr) { 5627 ret = -ENOMEM; 5628 goto exit; 5629 } 5630 arg->extraie.len = req->ie_len; 5631 } 5632 5633 if (req->n_ssids) { 5634 arg->num_ssids = req->n_ssids; 5635 for (i = 0; i < arg->num_ssids; i++) 5636 arg->ssid[i] = req->ssids[i]; 5637 } else { 5638 arg->scan_f_passive = 1; 5639 } 5640 5641 if (n_channels) { 5642 arg->num_chan = n_channels; 5643 arg->chan_list = kcalloc(arg->num_chan, sizeof(*arg->chan_list), 5644 GFP_KERNEL); 5645 if (!arg->chan_list) { 5646 ret = -ENOMEM; 5647 goto exit; 5648 } 5649 5650 for (i = 0; i < arg->num_chan; i++) 5651 arg->chan_list[i] = chan_list[i]->center_freq; 5652 } 5653 5654 ret = ath12k_start_scan(ar, arg); 5655 if (ret) { 5656 if (ret == -EBUSY) 5657 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 5658 "scan engine is busy 11d state %d\n", ar->state_11d); 5659 else 5660 ath12k_warn(ar->ab, "failed to start hw scan: %d\n", ret); 5661 5662 spin_lock_bh(&ar->data_lock); 5663 ar->scan.state = ATH12K_SCAN_IDLE; 5664 spin_unlock_bh(&ar->data_lock); 5665 goto exit; 5666 } 5667 5668 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac scan started"); 5669 5670 /* Add a margin to account for event/command processing */ 5671 ieee80211_queue_delayed_work(ath12k_ar_to_hw(ar), &ar->scan.timeout, 5672 msecs_to_jiffies(arg->max_scan_time + 5673 ATH12K_MAC_SCAN_TIMEOUT_MSECS)); 5674 5675 exit: 5676 if (arg) { 5677 kfree(arg->chan_list); 5678 kfree(arg->extraie.ptr); 5679 kfree(arg); 5680 } 5681 5682 if (ar->state_11d == ATH12K_11D_PREPARING && 5683 ahvif->vdev_type == WMI_VDEV_TYPE_STA && 5684 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) 5685 ath12k_mac_11d_scan_start(ar, arvif->vdev_id); 5686 5687 return ret; 5688 } 5689 5690 int ath12k_mac_op_hw_scan(struct ieee80211_hw *hw, 5691 struct ieee80211_vif *vif, 5692 struct ieee80211_scan_request *hw_req) 5693 { 5694 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 5695 struct ieee80211_channel **chan_list, *chan; 5696 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 5697 unsigned long links_map, link_id; 5698 struct ath12k_link_vif *arvif; 5699 struct ath12k *ar, *scan_ar; 5700 int i, j, ret = 0; 5701 5702 lockdep_assert_wiphy(hw->wiphy); 5703 5704 chan_list = kzalloc_objs(*chan_list, hw_req->req.n_channels); 5705 if (!chan_list) 5706 return -ENOMEM; 5707 5708 /* There could be channels that belong to multiple underlying radio 5709 * in same scan request as mac80211 sees it as single band. In that 5710 * case split the hw_req based on frequency range and schedule scans to 5711 * corresponding radio. 5712 */ 5713 for_each_ar(ah, ar, i) { 5714 int n_chans = 0; 5715 5716 for (j = 0; j < hw_req->req.n_channels; j++) { 5717 chan = hw_req->req.channels[j]; 5718 scan_ar = ath12k_mac_select_scan_device(hw, vif, 5719 chan->center_freq); 5720 if (!scan_ar) { 5721 ath12k_hw_warn(ah, "unable to select scan device for freq %d\n", 5722 chan->center_freq); 5723 ret = -EINVAL; 5724 goto abort; 5725 } 5726 if (ar != scan_ar) 5727 continue; 5728 5729 chan_list[n_chans++] = chan; 5730 } 5731 if (n_chans) { 5732 ret = ath12k_mac_initiate_hw_scan(hw, vif, hw_req, n_chans, 5733 chan_list, ar); 5734 if (ret) 5735 goto abort; 5736 } 5737 } 5738 abort: 5739 /* If any of the parallel scans initiated fails, abort all and 5740 * remove the scan interfaces created. Return complete scan 5741 * failure as mac80211 assumes this as single scan request. 5742 */ 5743 if (ret) { 5744 ath12k_hw_warn(ah, "Scan failed %d , cleanup all scan vdevs\n", ret); 5745 links_map = ahvif->links_map; 5746 for_each_set_bit(link_id, &links_map, ATH12K_NUM_MAX_LINKS) { 5747 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 5748 if (!arvif) 5749 continue; 5750 5751 ar = arvif->ar; 5752 if (ar->scan.arvif == arvif) { 5753 wiphy_work_cancel(hw->wiphy, &ar->scan.vdev_clean_wk); 5754 spin_lock_bh(&ar->data_lock); 5755 ar->scan.arvif = NULL; 5756 ar->scan.state = ATH12K_SCAN_IDLE; 5757 ar->scan_channel = NULL; 5758 ar->scan.roc_freq = 0; 5759 spin_unlock_bh(&ar->data_lock); 5760 } 5761 if (link_id >= ATH12K_FIRST_SCAN_LINK) { 5762 ath12k_mac_remove_link_interface(hw, arvif); 5763 ath12k_mac_unassign_link_vif(arvif); 5764 } 5765 } 5766 } 5767 kfree(chan_list); 5768 return ret; 5769 } 5770 EXPORT_SYMBOL(ath12k_mac_op_hw_scan); 5771 5772 void ath12k_mac_op_cancel_hw_scan(struct ieee80211_hw *hw, 5773 struct ieee80211_vif *vif) 5774 { 5775 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 5776 unsigned long link_id, links_map = ahvif->links_map; 5777 struct ath12k_link_vif *arvif; 5778 struct ath12k *ar; 5779 5780 lockdep_assert_wiphy(hw->wiphy); 5781 5782 for_each_set_bit(link_id, &links_map, ATH12K_NUM_MAX_LINKS) { 5783 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 5784 if (!arvif || !arvif->is_created || 5785 arvif->ar->scan.arvif != arvif) 5786 continue; 5787 5788 ar = arvif->ar; 5789 5790 ath12k_scan_abort(ar); 5791 5792 cancel_delayed_work_sync(&ar->scan.timeout); 5793 } 5794 } 5795 EXPORT_SYMBOL(ath12k_mac_op_cancel_hw_scan); 5796 5797 static int ath12k_install_key(struct ath12k_link_vif *arvif, 5798 struct ieee80211_key_conf *key, 5799 enum set_key_cmd cmd, 5800 const u8 *macaddr, u32 flags) 5801 { 5802 int ret; 5803 struct ath12k *ar = arvif->ar; 5804 struct wmi_vdev_install_key_arg arg = { 5805 .vdev_id = arvif->vdev_id, 5806 .key_idx = key->keyidx, 5807 .key_len = key->keylen, 5808 .key_data = key->key, 5809 .key_flags = flags, 5810 .ieee80211_key_cipher = key->cipher, 5811 .macaddr = macaddr, 5812 }; 5813 struct ath12k_vif *ahvif = arvif->ahvif; 5814 5815 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 5816 5817 if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags)) 5818 return 0; 5819 5820 if (cmd == DISABLE_KEY) { 5821 /* TODO: Check if FW expects value other than NONE for del */ 5822 /* arg.key_cipher = WMI_CIPHER_NONE; */ 5823 arg.key_len = 0; 5824 arg.key_data = NULL; 5825 goto check_order; 5826 } 5827 5828 switch (key->cipher) { 5829 case WLAN_CIPHER_SUITE_CCMP: 5830 case WLAN_CIPHER_SUITE_CCMP_256: 5831 arg.key_cipher = WMI_CIPHER_AES_CCM; 5832 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT; 5833 break; 5834 case WLAN_CIPHER_SUITE_TKIP: 5835 arg.key_cipher = WMI_CIPHER_TKIP; 5836 arg.key_txmic_len = 8; 5837 arg.key_rxmic_len = 8; 5838 break; 5839 case WLAN_CIPHER_SUITE_GCMP: 5840 case WLAN_CIPHER_SUITE_GCMP_256: 5841 arg.key_cipher = WMI_CIPHER_AES_GCM; 5842 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT; 5843 break; 5844 case WLAN_CIPHER_SUITE_AES_CMAC: 5845 arg.key_cipher = WMI_CIPHER_AES_CMAC; 5846 break; 5847 case WLAN_CIPHER_SUITE_BIP_GMAC_128: 5848 case WLAN_CIPHER_SUITE_BIP_GMAC_256: 5849 arg.key_cipher = WMI_CIPHER_AES_GMAC; 5850 break; 5851 case WLAN_CIPHER_SUITE_BIP_CMAC_256: 5852 arg.key_cipher = WMI_CIPHER_AES_CMAC; 5853 break; 5854 default: 5855 ath12k_warn(ar->ab, "cipher %d is not supported\n", key->cipher); 5856 return -EOPNOTSUPP; 5857 } 5858 5859 if (test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags)) 5860 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV | 5861 IEEE80211_KEY_FLAG_RESERVE_TAILROOM; 5862 5863 check_order: 5864 if (ahvif->vdev_type == WMI_VDEV_TYPE_STA && 5865 arg.key_flags == WMI_KEY_GROUP) { 5866 if (cmd == SET_KEY) { 5867 if (arvif->pairwise_key_done) { 5868 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 5869 "vdev %u pairwise key done, go install group key\n", 5870 arg.vdev_id); 5871 goto install; 5872 } else { 5873 /* WCN7850 firmware requires pairwise key to be installed 5874 * before group key. In case group key comes first, cache 5875 * it and return. Will revisit it once pairwise key gets 5876 * installed. 5877 */ 5878 arvif->group_key = arg; 5879 arvif->group_key_valid = true; 5880 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 5881 "vdev %u group key before pairwise key, cache and skip\n", 5882 arg.vdev_id); 5883 5884 ret = 0; 5885 goto out; 5886 } 5887 } else { 5888 arvif->group_key_valid = false; 5889 } 5890 } 5891 5892 install: 5893 reinit_completion(&ar->install_key_done); 5894 5895 ret = ath12k_wmi_vdev_install_key(arvif->ar, &arg); 5896 if (ret) 5897 return ret; 5898 5899 if (!wait_for_completion_timeout(&ar->install_key_done, 1 * HZ)) 5900 return -ETIMEDOUT; 5901 5902 if (ether_addr_equal(arg.macaddr, arvif->bssid)) 5903 ahvif->dp_vif.key_cipher = arg.ieee80211_key_cipher; 5904 5905 if (ar->install_key_status) { 5906 ret = -EINVAL; 5907 goto out; 5908 } 5909 5910 if (ahvif->vdev_type == WMI_VDEV_TYPE_STA && 5911 arg.key_flags == WMI_KEY_PAIRWISE) { 5912 if (cmd == SET_KEY) { 5913 arvif->pairwise_key_done = true; 5914 if (arvif->group_key_valid) { 5915 /* Install cached GTK */ 5916 arvif->group_key_valid = false; 5917 arg = arvif->group_key; 5918 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 5919 "vdev %u pairwise key done, group key ready, go install\n", 5920 arg.vdev_id); 5921 goto install; 5922 } 5923 } else { 5924 arvif->pairwise_key_done = false; 5925 } 5926 } 5927 5928 out: 5929 if (ret) { 5930 /* In case of failure userspace may not do DISABLE_KEY 5931 * but triggers re-connection directly, so manually reset 5932 * status here. 5933 */ 5934 arvif->group_key_valid = false; 5935 arvif->pairwise_key_done = false; 5936 } 5937 5938 return ret; 5939 } 5940 5941 static int ath12k_clear_peer_keys(struct ath12k_link_vif *arvif, 5942 const u8 *addr) 5943 { 5944 struct ath12k *ar = arvif->ar; 5945 struct ath12k_base *ab = ar->ab; 5946 struct ath12k_dp_link_peer *peer; 5947 int first_errno = 0; 5948 int ret; 5949 int i, len; 5950 u32 flags = 0; 5951 struct ath12k_dp *dp = ath12k_ab_to_dp(ab); 5952 struct ieee80211_key_conf *keys[WMI_MAX_KEY_INDEX + 1] = {}; 5953 5954 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 5955 5956 spin_lock_bh(&dp->dp_lock); 5957 peer = ath12k_dp_link_peer_find_by_vdev_and_addr(dp, arvif->vdev_id, addr); 5958 if (!peer || !peer->dp_peer) { 5959 spin_unlock_bh(&dp->dp_lock); 5960 return -ENOENT; 5961 } 5962 5963 len = ARRAY_SIZE(peer->dp_peer->keys); 5964 for (i = 0; i < len; i++) { 5965 if (!peer->dp_peer->keys[i]) 5966 continue; 5967 5968 keys[i] = peer->dp_peer->keys[i]; 5969 peer->dp_peer->keys[i] = NULL; 5970 } 5971 5972 spin_unlock_bh(&dp->dp_lock); 5973 5974 for (i = 0; i < len; i++) { 5975 if (!keys[i]) 5976 continue; 5977 5978 /* key flags are not required to delete the key */ 5979 ret = ath12k_install_key(arvif, keys[i], 5980 DISABLE_KEY, addr, flags); 5981 if (ret < 0 && first_errno == 0) 5982 first_errno = ret; 5983 5984 if (ret < 0) 5985 ath12k_warn(ab, "failed to remove peer key %d: %d\n", 5986 i, ret); 5987 } 5988 5989 return first_errno; 5990 } 5991 5992 static int ath12k_mac_set_key(struct ath12k *ar, enum set_key_cmd cmd, 5993 struct ath12k_link_vif *arvif, 5994 struct ath12k_link_sta *arsta, 5995 struct ieee80211_key_conf *key) 5996 { 5997 struct ieee80211_sta *sta = NULL; 5998 struct ath12k_base *ab = ar->ab; 5999 struct ath12k_dp_link_peer *peer; 6000 struct ath12k_sta *ahsta; 6001 const u8 *peer_addr; 6002 int ret; 6003 u32 flags = 0; 6004 struct ath12k_dp *dp = ath12k_ab_to_dp(ab); 6005 6006 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 6007 6008 if (arsta) 6009 sta = ath12k_ahsta_to_sta(arsta->ahsta); 6010 6011 if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ab->dev_flags)) 6012 return 1; 6013 6014 if (sta) 6015 peer_addr = arsta->addr; 6016 else 6017 peer_addr = arvif->bssid; 6018 6019 key->hw_key_idx = key->keyidx; 6020 6021 /* the peer should not disappear in mid-way (unless FW goes awry) since 6022 * we already hold wiphy lock. we just make sure its there now. 6023 */ 6024 spin_lock_bh(&dp->dp_lock); 6025 peer = ath12k_dp_link_peer_find_by_vdev_and_addr(dp, arvif->vdev_id, 6026 peer_addr); 6027 if (!peer || !peer->dp_peer) { 6028 spin_unlock_bh(&dp->dp_lock); 6029 6030 if (cmd == SET_KEY) { 6031 ath12k_warn(ab, "cannot install key for non-existent peer %pM\n", 6032 peer_addr); 6033 return -EOPNOTSUPP; 6034 } 6035 6036 /* if the peer doesn't exist there is no key to disable 6037 * anymore 6038 */ 6039 return 0; 6040 } 6041 6042 spin_unlock_bh(&dp->dp_lock); 6043 6044 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) 6045 flags = WMI_KEY_PAIRWISE; 6046 else 6047 flags = WMI_KEY_GROUP; 6048 6049 ret = ath12k_install_key(arvif, key, cmd, peer_addr, flags); 6050 if (ret) { 6051 ath12k_warn(ab, "ath12k_install_key failed (%d)\n", ret); 6052 return ret; 6053 } 6054 6055 ret = ath12k_dp_rx_peer_pn_replay_config(arvif, peer_addr, cmd, key); 6056 if (ret) { 6057 ath12k_warn(ab, "failed to offload PN replay detection %d\n", ret); 6058 return ret; 6059 } 6060 6061 spin_lock_bh(&dp->dp_lock); 6062 peer = ath12k_dp_link_peer_find_by_vdev_and_addr(dp, arvif->vdev_id, 6063 peer_addr); 6064 if (peer && peer->dp_peer && cmd == SET_KEY) { 6065 peer->dp_peer->keys[key->keyidx] = key; 6066 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) { 6067 peer->dp_peer->ucast_keyidx = key->keyidx; 6068 peer->dp_peer->sec_type = 6069 ath12k_dp_tx_get_encrypt_type(key->cipher); 6070 } else { 6071 peer->dp_peer->mcast_keyidx = key->keyidx; 6072 peer->dp_peer->sec_type_grp = 6073 ath12k_dp_tx_get_encrypt_type(key->cipher); 6074 } 6075 } else if (peer && peer->dp_peer && cmd == DISABLE_KEY) { 6076 peer->dp_peer->keys[key->keyidx] = NULL; 6077 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) 6078 peer->dp_peer->ucast_keyidx = 0; 6079 else 6080 peer->dp_peer->mcast_keyidx = 0; 6081 } else if (!peer) 6082 /* impossible unless FW goes crazy */ 6083 ath12k_warn(ab, "peer %pM disappeared!\n", peer_addr); 6084 6085 if (sta) { 6086 ahsta = ath12k_sta_to_ahsta(sta); 6087 6088 switch (key->cipher) { 6089 case WLAN_CIPHER_SUITE_TKIP: 6090 case WLAN_CIPHER_SUITE_CCMP: 6091 case WLAN_CIPHER_SUITE_CCMP_256: 6092 case WLAN_CIPHER_SUITE_GCMP: 6093 case WLAN_CIPHER_SUITE_GCMP_256: 6094 if (cmd == SET_KEY) 6095 ahsta->pn_type = HAL_PN_TYPE_WPA; 6096 else 6097 ahsta->pn_type = HAL_PN_TYPE_NONE; 6098 break; 6099 default: 6100 ahsta->pn_type = HAL_PN_TYPE_NONE; 6101 break; 6102 } 6103 } 6104 6105 spin_unlock_bh(&dp->dp_lock); 6106 6107 return 0; 6108 } 6109 6110 static int ath12k_mac_update_key_cache(struct ath12k_vif_cache *cache, 6111 enum set_key_cmd cmd, 6112 struct ieee80211_sta *sta, 6113 struct ieee80211_key_conf *key) 6114 { 6115 struct ath12k_key_conf *key_conf, *tmp; 6116 6117 list_for_each_entry_safe(key_conf, tmp, &cache->key_conf.list, list) { 6118 if (key_conf->key != key) 6119 continue; 6120 6121 /* If SET key entry is already present in cache, nothing to do, 6122 * just return 6123 */ 6124 if (cmd == SET_KEY) 6125 return 0; 6126 6127 /* DEL key for an old SET key which driver hasn't flushed yet. 6128 */ 6129 list_del(&key_conf->list); 6130 kfree(key_conf); 6131 } 6132 6133 if (cmd == SET_KEY) { 6134 key_conf = kzalloc_obj(*key_conf); 6135 6136 if (!key_conf) 6137 return -ENOMEM; 6138 6139 key_conf->cmd = cmd; 6140 key_conf->sta = sta; 6141 key_conf->key = key; 6142 list_add_tail(&key_conf->list, 6143 &cache->key_conf.list); 6144 } 6145 6146 return 0; 6147 } 6148 6149 int ath12k_mac_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd, 6150 struct ieee80211_vif *vif, struct ieee80211_sta *sta, 6151 struct ieee80211_key_conf *key) 6152 { 6153 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 6154 struct ath12k_link_vif *arvif; 6155 struct ath12k_link_sta *arsta = NULL; 6156 struct ath12k_vif_cache *cache; 6157 struct ath12k_sta *ahsta; 6158 unsigned long links; 6159 u8 link_id; 6160 int ret; 6161 6162 lockdep_assert_wiphy(hw->wiphy); 6163 6164 /* IGTK needs to be done in host software */ 6165 if (key->keyidx == 4 || key->keyidx == 5) 6166 return 1; 6167 6168 if (key->keyidx > WMI_MAX_KEY_INDEX) 6169 return -ENOSPC; 6170 6171 if (sta) { 6172 ahsta = ath12k_sta_to_ahsta(sta); 6173 6174 /* For an ML STA Pairwise key is same for all associated link Stations, 6175 * hence do set key for all link STAs which are active. 6176 */ 6177 if (sta->mlo) { 6178 links = ahsta->links_map; 6179 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) { 6180 arvif = wiphy_dereference(hw->wiphy, 6181 ahvif->link[link_id]); 6182 arsta = wiphy_dereference(hw->wiphy, 6183 ahsta->link[link_id]); 6184 6185 if (WARN_ON(!arvif || !arsta)) 6186 /* arvif and arsta are expected to be valid when 6187 * STA is present. 6188 */ 6189 continue; 6190 6191 ret = ath12k_mac_set_key(arvif->ar, cmd, arvif, 6192 arsta, key); 6193 if (ret) 6194 break; 6195 } 6196 6197 return 0; 6198 } 6199 6200 arsta = &ahsta->deflink; 6201 arvif = arsta->arvif; 6202 if (WARN_ON(!arvif)) 6203 return -EINVAL; 6204 6205 ret = ath12k_mac_set_key(arvif->ar, cmd, arvif, arsta, key); 6206 if (ret) 6207 return ret; 6208 6209 return 0; 6210 } 6211 6212 if (key->link_id >= 0 && key->link_id < IEEE80211_MLD_MAX_NUM_LINKS) { 6213 link_id = key->link_id; 6214 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 6215 } else { 6216 link_id = 0; 6217 arvif = &ahvif->deflink; 6218 } 6219 6220 if (!arvif || !arvif->is_created) { 6221 cache = ath12k_ahvif_get_link_cache(ahvif, link_id); 6222 if (!cache) 6223 return -ENOSPC; 6224 6225 ret = ath12k_mac_update_key_cache(cache, cmd, sta, key); 6226 if (ret) 6227 return ret; 6228 6229 return 0; 6230 } 6231 6232 ret = ath12k_mac_set_key(arvif->ar, cmd, arvif, NULL, key); 6233 if (ret) 6234 return ret; 6235 6236 return 0; 6237 } 6238 EXPORT_SYMBOL(ath12k_mac_op_set_key); 6239 6240 static int 6241 ath12k_mac_bitrate_mask_num_vht_rates(struct ath12k *ar, 6242 enum nl80211_band band, 6243 const struct cfg80211_bitrate_mask *mask) 6244 { 6245 int num_rates = 0; 6246 int i; 6247 6248 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) 6249 num_rates += hweight16(mask->control[band].vht_mcs[i]); 6250 6251 return num_rates; 6252 } 6253 6254 static int 6255 ath12k_mac_bitrate_mask_num_he_rates(struct ath12k *ar, 6256 enum nl80211_band band, 6257 const struct cfg80211_bitrate_mask *mask) 6258 { 6259 int num_rates = 0; 6260 int i; 6261 6262 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) 6263 num_rates += hweight16(mask->control[band].he_mcs[i]); 6264 6265 return num_rates; 6266 } 6267 6268 static int 6269 ath12k_mac_bitrate_mask_num_eht_rates(struct ath12k *ar, 6270 enum nl80211_band band, 6271 const struct cfg80211_bitrate_mask *mask) 6272 { 6273 int num_rates = 0; 6274 int i; 6275 6276 for (i = 0; i < ARRAY_SIZE(mask->control[band].eht_mcs); i++) 6277 num_rates += hweight16(mask->control[band].eht_mcs[i]); 6278 6279 return num_rates; 6280 } 6281 6282 static int 6283 ath12k_mac_set_peer_vht_fixed_rate(struct ath12k_link_vif *arvif, 6284 struct ath12k_link_sta *arsta, 6285 const struct cfg80211_bitrate_mask *mask, 6286 enum nl80211_band band) 6287 { 6288 struct ath12k *ar = arvif->ar; 6289 u8 vht_rate, nss; 6290 u32 rate_code; 6291 int ret, i; 6292 6293 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 6294 6295 nss = 0; 6296 6297 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) { 6298 if (hweight16(mask->control[band].vht_mcs[i]) == 1) { 6299 nss = i + 1; 6300 vht_rate = ffs(mask->control[band].vht_mcs[i]) - 1; 6301 } 6302 } 6303 6304 if (!nss) { 6305 ath12k_warn(ar->ab, "No single VHT Fixed rate found to set for %pM", 6306 arsta->addr); 6307 return -EINVAL; 6308 } 6309 6310 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 6311 "Setting Fixed VHT Rate for peer %pM. Device will not switch to any other selected rates", 6312 arsta->addr); 6313 6314 rate_code = ATH12K_HW_RATE_CODE(vht_rate, nss - 1, 6315 WMI_RATE_PREAMBLE_VHT); 6316 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, 6317 arvif->vdev_id, 6318 WMI_PEER_PARAM_FIXED_RATE, 6319 rate_code); 6320 if (ret) 6321 ath12k_warn(ar->ab, 6322 "failed to update STA %pM Fixed Rate %d: %d\n", 6323 arsta->addr, rate_code, ret); 6324 6325 return ret; 6326 } 6327 6328 static int 6329 ath12k_mac_set_peer_he_fixed_rate(struct ath12k_link_vif *arvif, 6330 struct ath12k_link_sta *arsta, 6331 const struct cfg80211_bitrate_mask *mask, 6332 enum nl80211_band band) 6333 { 6334 struct ath12k *ar = arvif->ar; 6335 u8 he_rate, nss; 6336 u32 rate_code; 6337 int ret, i; 6338 struct ath12k_sta *ahsta = arsta->ahsta; 6339 struct ieee80211_sta *sta; 6340 6341 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 6342 6343 sta = ath12k_ahsta_to_sta(ahsta); 6344 nss = 0; 6345 6346 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) { 6347 if (hweight16(mask->control[band].he_mcs[i]) == 1) { 6348 nss = i + 1; 6349 he_rate = ffs(mask->control[band].he_mcs[i]) - 1; 6350 } 6351 } 6352 6353 if (!nss) { 6354 ath12k_warn(ar->ab, "No single HE Fixed rate found to set for %pM", 6355 arsta->addr); 6356 return -EINVAL; 6357 } 6358 6359 /* Avoid updating invalid nss as fixed rate*/ 6360 if (nss > sta->deflink.rx_nss) 6361 return -EINVAL; 6362 6363 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 6364 "Setting Fixed HE Rate for peer %pM. Device will not switch to any other selected rates", 6365 arsta->addr); 6366 6367 rate_code = ATH12K_HW_RATE_CODE(he_rate, nss - 1, 6368 WMI_RATE_PREAMBLE_HE); 6369 6370 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, 6371 arvif->vdev_id, 6372 WMI_PEER_PARAM_FIXED_RATE, 6373 rate_code); 6374 if (ret) 6375 ath12k_warn(ar->ab, 6376 "failed to update STA %pM Fixed Rate %d: %d\n", 6377 arsta->addr, rate_code, ret); 6378 6379 return ret; 6380 } 6381 6382 static int 6383 ath12k_mac_set_peer_eht_fixed_rate(struct ath12k_link_vif *arvif, 6384 struct ath12k_link_sta *arsta, 6385 const struct cfg80211_bitrate_mask *mask, 6386 enum nl80211_band band) 6387 { 6388 struct ath12k_sta *ahsta = arsta->ahsta; 6389 struct ath12k *ar = arvif->ar; 6390 struct ieee80211_sta *sta; 6391 struct ieee80211_link_sta *link_sta; 6392 u8 eht_rate, nss = 0; 6393 u32 rate_code; 6394 int ret, i; 6395 6396 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 6397 6398 sta = ath12k_ahsta_to_sta(ahsta); 6399 6400 for (i = 0; i < ARRAY_SIZE(mask->control[band].eht_mcs); i++) { 6401 if (hweight16(mask->control[band].eht_mcs[i]) == 1) { 6402 nss = i + 1; 6403 eht_rate = ffs(mask->control[band].eht_mcs[i]) - 1; 6404 } 6405 } 6406 6407 if (!nss) { 6408 ath12k_warn(ar->ab, "No single EHT Fixed rate found to set for %pM\n", 6409 arsta->addr); 6410 return -EINVAL; 6411 } 6412 6413 /* Avoid updating invalid nss as fixed rate*/ 6414 link_sta = ath12k_mac_get_link_sta(arsta); 6415 if (!link_sta || nss > link_sta->rx_nss) { 6416 ath12k_warn(ar->ab, 6417 "unable to access link sta for sta %pM link %u or fixed nss of %u is not supported by sta\n", 6418 sta->addr, arsta->link_id, nss); 6419 return -EINVAL; 6420 } 6421 6422 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 6423 "Setting Fixed EHT Rate for peer %pM. Device will not switch to any other selected rates\n", 6424 arsta->addr); 6425 6426 rate_code = ATH12K_HW_RATE_CODE(eht_rate, nss - 1, 6427 WMI_RATE_PREAMBLE_EHT); 6428 6429 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, 6430 arvif->vdev_id, 6431 WMI_PEER_PARAM_FIXED_RATE, 6432 rate_code); 6433 if (ret) 6434 ath12k_warn(ar->ab, 6435 "failed to update STA %pM Fixed Rate %d: %d\n", 6436 arsta->addr, rate_code, ret); 6437 6438 return ret; 6439 } 6440 6441 static int ath12k_mac_station_assoc(struct ath12k *ar, 6442 struct ath12k_link_vif *arvif, 6443 struct ath12k_link_sta *arsta, 6444 bool reassoc) 6445 { 6446 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 6447 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 6448 struct ieee80211_link_sta *link_sta; 6449 int ret; 6450 struct cfg80211_chan_def def; 6451 enum nl80211_band band; 6452 struct cfg80211_bitrate_mask *mask; 6453 u8 num_vht_rates, num_he_rates, num_eht_rates; 6454 u8 link_id = arvif->link_id; 6455 6456 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 6457 6458 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) 6459 return -EPERM; 6460 6461 if (WARN_ON(!rcu_access_pointer(sta->link[link_id]))) 6462 return -EINVAL; 6463 6464 band = def.chan->band; 6465 mask = &arvif->bitrate_mask; 6466 6467 struct ath12k_wmi_peer_assoc_arg *peer_arg __free(kfree) = 6468 kzalloc_obj(*peer_arg); 6469 if (!peer_arg) 6470 return -ENOMEM; 6471 6472 ath12k_peer_assoc_prepare(ar, arvif, arsta, peer_arg, reassoc); 6473 6474 if (peer_arg->peer_nss < 1) { 6475 ath12k_warn(ar->ab, 6476 "invalid peer NSS %d\n", peer_arg->peer_nss); 6477 return -EINVAL; 6478 } 6479 6480 peer_arg->is_assoc = true; 6481 ret = ath12k_wmi_send_peer_assoc_cmd(ar, peer_arg); 6482 if (ret) { 6483 ath12k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n", 6484 arsta->addr, arvif->vdev_id, ret); 6485 return ret; 6486 } 6487 6488 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) { 6489 ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n", 6490 arsta->addr, arvif->vdev_id); 6491 return -ETIMEDOUT; 6492 } 6493 6494 num_vht_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band, mask); 6495 num_he_rates = ath12k_mac_bitrate_mask_num_he_rates(ar, band, mask); 6496 num_eht_rates = ath12k_mac_bitrate_mask_num_eht_rates(ar, band, mask); 6497 6498 /* If single VHT/HE/EHT rate is configured (by set_bitrate_mask()), 6499 * peer_assoc will disable VHT/HE/EHT. This is now enabled by a peer 6500 * specific fixed param. 6501 * Note that all other rates and NSS will be disabled for this peer. 6502 */ 6503 link_sta = ath12k_mac_get_link_sta(arsta); 6504 if (!link_sta) { 6505 ath12k_warn(ar->ab, "unable to access link sta in station assoc\n"); 6506 return -EINVAL; 6507 } 6508 6509 spin_lock_bh(&ar->data_lock); 6510 arsta->bw = ath12k_mac_ieee80211_sta_bw_to_wmi(ar, link_sta); 6511 arsta->bw_prev = link_sta->bandwidth; 6512 spin_unlock_bh(&ar->data_lock); 6513 6514 if (link_sta->vht_cap.vht_supported && num_vht_rates == 1) { 6515 ret = ath12k_mac_set_peer_vht_fixed_rate(arvif, arsta, mask, band); 6516 } else if (link_sta->he_cap.has_he && num_he_rates == 1) { 6517 ret = ath12k_mac_set_peer_he_fixed_rate(arvif, arsta, mask, band); 6518 if (ret) 6519 return ret; 6520 } else if (link_sta->eht_cap.has_eht && num_eht_rates == 1) { 6521 ret = ath12k_mac_set_peer_eht_fixed_rate(arvif, arsta, mask, band); 6522 if (ret) 6523 return ret; 6524 } 6525 6526 /* Re-assoc is run only to update supported rates for given station. It 6527 * doesn't make much sense to reconfigure the peer completely. 6528 */ 6529 if (reassoc) 6530 return 0; 6531 6532 ret = ath12k_setup_peer_smps(ar, arvif, arsta->addr, 6533 &link_sta->ht_cap, &link_sta->he_6ghz_capa); 6534 if (ret) { 6535 ath12k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n", 6536 arvif->vdev_id, ret); 6537 return ret; 6538 } 6539 6540 if (!sta->wme) { 6541 arvif->num_legacy_stations++; 6542 ret = ath12k_recalc_rtscts_prot(arvif); 6543 if (ret) 6544 return ret; 6545 } 6546 6547 if (sta->wme && sta->uapsd_queues) { 6548 ret = ath12k_peer_assoc_qos_ap(ar, arvif, arsta); 6549 if (ret) { 6550 ath12k_warn(ar->ab, "failed to set qos params for STA %pM for vdev %i: %d\n", 6551 arsta->addr, arvif->vdev_id, ret); 6552 return ret; 6553 } 6554 } 6555 6556 return 0; 6557 } 6558 6559 static int ath12k_mac_station_disassoc(struct ath12k *ar, 6560 struct ath12k_link_vif *arvif, 6561 struct ath12k_link_sta *arsta) 6562 { 6563 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 6564 6565 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 6566 6567 if (!sta->wme) { 6568 arvif->num_legacy_stations--; 6569 return ath12k_recalc_rtscts_prot(arvif); 6570 } 6571 6572 return 0; 6573 } 6574 6575 static void ath12k_sta_rc_update_wk(struct wiphy *wiphy, struct wiphy_work *wk) 6576 { 6577 struct ieee80211_link_sta *link_sta; 6578 struct ath12k *ar; 6579 struct ath12k_link_vif *arvif; 6580 struct ieee80211_sta *sta; 6581 struct cfg80211_chan_def def; 6582 enum nl80211_band band; 6583 const u8 *ht_mcs_mask; 6584 const u16 *vht_mcs_mask; 6585 const u16 *he_mcs_mask; 6586 const u16 *eht_mcs_mask; 6587 u32 changed, bw, nss, mac_nss, smps, bw_prev; 6588 int err, num_vht_rates, num_he_rates, num_eht_rates; 6589 const struct cfg80211_bitrate_mask *mask; 6590 enum wmi_phy_mode peer_phymode; 6591 struct ath12k_link_sta *arsta; 6592 struct ieee80211_vif *vif; 6593 6594 lockdep_assert_wiphy(wiphy); 6595 6596 arsta = container_of(wk, struct ath12k_link_sta, update_wk); 6597 sta = ath12k_ahsta_to_sta(arsta->ahsta); 6598 arvif = arsta->arvif; 6599 vif = ath12k_ahvif_to_vif(arvif->ahvif); 6600 ar = arvif->ar; 6601 6602 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))) 6603 return; 6604 6605 band = def.chan->band; 6606 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs; 6607 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs; 6608 he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs; 6609 eht_mcs_mask = arvif->bitrate_mask.control[band].eht_mcs; 6610 6611 spin_lock_bh(&ar->data_lock); 6612 6613 changed = arsta->changed; 6614 arsta->changed = 0; 6615 6616 bw = arsta->bw; 6617 bw_prev = arsta->bw_prev; 6618 nss = arsta->nss; 6619 smps = arsta->smps; 6620 6621 spin_unlock_bh(&ar->data_lock); 6622 6623 nss = max_t(u32, 1, nss); 6624 mac_nss = max3(ath12k_mac_max_ht_nss(ht_mcs_mask), 6625 ath12k_mac_max_vht_nss(vht_mcs_mask), 6626 ath12k_mac_max_he_nss(he_mcs_mask)); 6627 mac_nss = max(mac_nss, ath12k_mac_max_eht_nss(eht_mcs_mask)); 6628 nss = min(nss, mac_nss); 6629 6630 struct ath12k_wmi_peer_assoc_arg *peer_arg __free(kfree) = 6631 kzalloc_obj(*peer_arg); 6632 if (!peer_arg) 6633 return; 6634 6635 if (changed & IEEE80211_RC_BW_CHANGED) { 6636 ath12k_peer_assoc_h_phymode(ar, arvif, arsta, peer_arg); 6637 peer_phymode = peer_arg->peer_phymode; 6638 6639 if (bw > bw_prev) { 6640 /* Phymode shows maximum supported channel width, if we 6641 * upgrade bandwidth then due to sanity check of firmware, 6642 * we have to send WMI_PEER_PHYMODE followed by 6643 * WMI_PEER_CHWIDTH 6644 */ 6645 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac bandwidth upgrade for sta %pM new %d old %d\n", 6646 arsta->addr, bw, bw_prev); 6647 err = ath12k_wmi_set_peer_param(ar, arsta->addr, 6648 arvif->vdev_id, WMI_PEER_PHYMODE, 6649 peer_phymode); 6650 if (err) { 6651 ath12k_warn(ar->ab, "failed to update STA %pM to peer phymode %d: %d\n", 6652 arsta->addr, peer_phymode, err); 6653 return; 6654 } 6655 err = ath12k_wmi_set_peer_param(ar, arsta->addr, 6656 arvif->vdev_id, WMI_PEER_CHWIDTH, 6657 bw); 6658 if (err) 6659 ath12k_warn(ar->ab, "failed to update STA %pM to peer bandwidth %d: %d\n", 6660 arsta->addr, bw, err); 6661 } else { 6662 /* When we downgrade bandwidth this will conflict with phymode 6663 * and cause to trigger firmware crash. In this case we send 6664 * WMI_PEER_CHWIDTH followed by WMI_PEER_PHYMODE 6665 */ 6666 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac bandwidth downgrade for sta %pM new %d old %d\n", 6667 arsta->addr, bw, bw_prev); 6668 err = ath12k_wmi_set_peer_param(ar, arsta->addr, 6669 arvif->vdev_id, WMI_PEER_CHWIDTH, 6670 bw); 6671 if (err) { 6672 ath12k_warn(ar->ab, "failed to update STA %pM peer to bandwidth %d: %d\n", 6673 arsta->addr, bw, err); 6674 return; 6675 } 6676 err = ath12k_wmi_set_peer_param(ar, arsta->addr, 6677 arvif->vdev_id, WMI_PEER_PHYMODE, 6678 peer_phymode); 6679 if (err) 6680 ath12k_warn(ar->ab, "failed to update STA %pM to peer phymode %d: %d\n", 6681 arsta->addr, peer_phymode, err); 6682 } 6683 } 6684 6685 if (changed & IEEE80211_RC_NSS_CHANGED) { 6686 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac update sta %pM nss %d\n", 6687 arsta->addr, nss); 6688 6689 err = ath12k_wmi_set_peer_param(ar, arsta->addr, arvif->vdev_id, 6690 WMI_PEER_NSS, nss); 6691 if (err) 6692 ath12k_warn(ar->ab, "failed to update STA %pM nss %d: %d\n", 6693 arsta->addr, nss, err); 6694 } 6695 6696 if (changed & IEEE80211_RC_SMPS_CHANGED) { 6697 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac update sta %pM smps %d\n", 6698 arsta->addr, smps); 6699 6700 err = ath12k_wmi_set_peer_param(ar, arsta->addr, arvif->vdev_id, 6701 WMI_PEER_MIMO_PS_STATE, smps); 6702 if (err) 6703 ath12k_warn(ar->ab, "failed to update STA %pM smps %d: %d\n", 6704 arsta->addr, smps, err); 6705 } 6706 6707 if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) { 6708 mask = &arvif->bitrate_mask; 6709 num_vht_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band, 6710 mask); 6711 num_he_rates = ath12k_mac_bitrate_mask_num_he_rates(ar, band, 6712 mask); 6713 num_eht_rates = ath12k_mac_bitrate_mask_num_eht_rates(ar, band, 6714 mask); 6715 6716 /* Peer_assoc_prepare will reject vht rates in 6717 * bitrate_mask if its not available in range format and 6718 * sets vht tx_rateset as unsupported. So multiple VHT MCS 6719 * setting(eg. MCS 4,5,6) per peer is not supported here. 6720 * But, Single rate in VHT mask can be set as per-peer 6721 * fixed rate. But even if any HT rates are configured in 6722 * the bitrate mask, device will not switch to those rates 6723 * when per-peer Fixed rate is set. 6724 * TODO: Check RATEMASK_CMDID to support auto rates selection 6725 * across HT/VHT and for multiple VHT MCS support. 6726 */ 6727 link_sta = ath12k_mac_get_link_sta(arsta); 6728 if (!link_sta) { 6729 ath12k_warn(ar->ab, "unable to access link sta in peer assoc he for sta %pM link %u\n", 6730 sta->addr, arsta->link_id); 6731 return; 6732 } 6733 6734 if (link_sta->vht_cap.vht_supported && num_vht_rates == 1) { 6735 ath12k_mac_set_peer_vht_fixed_rate(arvif, arsta, mask, 6736 band); 6737 } else if (link_sta->he_cap.has_he && num_he_rates == 1) { 6738 ath12k_mac_set_peer_he_fixed_rate(arvif, arsta, mask, band); 6739 } else if (link_sta->eht_cap.has_eht && num_eht_rates == 1) { 6740 err = ath12k_mac_set_peer_eht_fixed_rate(arvif, arsta, 6741 mask, band); 6742 if (err) { 6743 ath12k_warn(ar->ab, 6744 "failed to set peer EHT fixed rate for STA %pM ret %d\n", 6745 arsta->addr, err); 6746 return; 6747 } 6748 } else { 6749 /* If the peer is non-VHT/HE/EHT or no fixed VHT/HE/EHT 6750 * rate is provided in the new bitrate mask we set the 6751 * other rates using peer_assoc command. Also clear 6752 * the peer fixed rate settings as it has higher proprity 6753 * than peer assoc 6754 */ 6755 err = ath12k_wmi_set_peer_param(ar, arsta->addr, 6756 arvif->vdev_id, 6757 WMI_PEER_PARAM_FIXED_RATE, 6758 WMI_FIXED_RATE_NONE); 6759 if (err) 6760 ath12k_warn(ar->ab, 6761 "failed to disable peer fixed rate for STA %pM ret %d\n", 6762 arsta->addr, err); 6763 6764 ath12k_peer_assoc_prepare(ar, arvif, arsta, 6765 peer_arg, true); 6766 6767 peer_arg->is_assoc = false; 6768 err = ath12k_wmi_send_peer_assoc_cmd(ar, peer_arg); 6769 if (err) 6770 ath12k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n", 6771 arsta->addr, arvif->vdev_id, err); 6772 6773 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) 6774 ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n", 6775 arsta->addr, arvif->vdev_id); 6776 } 6777 } 6778 } 6779 6780 static void ath12k_mac_free_unassign_link_sta(struct ath12k_hw *ah, 6781 struct ath12k_sta *ahsta, 6782 u8 link_id) 6783 { 6784 struct ath12k_link_sta *arsta; 6785 6786 lockdep_assert_wiphy(ah->hw->wiphy); 6787 6788 if (WARN_ON(link_id >= IEEE80211_MLD_MAX_NUM_LINKS)) 6789 return; 6790 6791 arsta = wiphy_dereference(ah->hw->wiphy, ahsta->link[link_id]); 6792 if (WARN_ON(!arsta)) 6793 return; 6794 6795 ahsta->links_map &= ~BIT(link_id); 6796 ahsta->free_logical_link_idx_map |= BIT(arsta->link_idx); 6797 6798 rcu_assign_pointer(ahsta->link[link_id], NULL); 6799 synchronize_rcu(); 6800 6801 if (arsta == &ahsta->deflink) { 6802 arsta->link_id = ATH12K_INVALID_LINK_ID; 6803 arsta->ahsta = NULL; 6804 arsta->arvif = NULL; 6805 return; 6806 } 6807 6808 kfree(arsta); 6809 } 6810 6811 static int ath12k_mac_inc_num_stations(struct ath12k_link_vif *arvif, 6812 struct ath12k_link_sta *arsta) 6813 { 6814 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 6815 struct ath12k *ar = arvif->ar; 6816 6817 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 6818 6819 if (arvif->ahvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls) 6820 return 0; 6821 6822 if (ar->num_stations >= ar->max_num_stations) 6823 return -ENOBUFS; 6824 6825 ar->num_stations++; 6826 arvif->num_stations++; 6827 6828 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 6829 "mac station %pM connected to vdev %u num_stations %u\n", 6830 arsta->addr, arvif->vdev_id, arvif->num_stations); 6831 6832 return 0; 6833 } 6834 6835 static void ath12k_mac_dec_num_stations(struct ath12k_link_vif *arvif, 6836 struct ath12k_link_sta *arsta) 6837 { 6838 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 6839 struct ath12k *ar = arvif->ar; 6840 6841 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 6842 6843 if (arvif->ahvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls) 6844 return; 6845 6846 ar->num_stations--; 6847 6848 if (arvif->num_stations) { 6849 arvif->num_stations--; 6850 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 6851 "mac station %pM disconnected from vdev %u num_stations %u\n", 6852 arsta->addr, arvif->vdev_id, arvif->num_stations); 6853 } else { 6854 ath12k_warn(ar->ab, 6855 "mac station %pM disconnect for vdev %u without any connected station\n", 6856 arsta->addr, arvif->vdev_id); 6857 } 6858 } 6859 6860 static void ath12k_mac_station_post_remove(struct ath12k *ar, 6861 struct ath12k_link_vif *arvif, 6862 struct ath12k_link_sta *arsta) 6863 { 6864 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 6865 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 6866 struct ath12k_dp_link_peer *peer; 6867 struct ath12k_dp *dp = ath12k_ab_to_dp(ar->ab); 6868 6869 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 6870 6871 ath12k_mac_dec_num_stations(arvif, arsta); 6872 6873 spin_lock_bh(&dp->dp_lock); 6874 6875 peer = ath12k_dp_link_peer_find_by_vdev_and_addr(dp, arvif->vdev_id, 6876 arsta->addr); 6877 if (peer && peer->sta == sta) { 6878 ath12k_warn(ar->ab, "Found peer entry %pM n vdev %i after it was supposedly removed\n", 6879 vif->addr, arvif->vdev_id); 6880 peer->sta = NULL; 6881 6882 ath12k_dp_link_peer_free(peer); 6883 ar->num_peers--; 6884 } 6885 6886 spin_unlock_bh(&dp->dp_lock); 6887 } 6888 6889 static int ath12k_mac_station_unauthorize(struct ath12k *ar, 6890 struct ath12k_link_vif *arvif, 6891 struct ath12k_link_sta *arsta) 6892 { 6893 struct ath12k_dp_link_peer *peer; 6894 int ret; 6895 struct ath12k_dp *dp = ath12k_ab_to_dp(ar->ab); 6896 6897 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 6898 6899 spin_lock_bh(&dp->dp_lock); 6900 6901 peer = ath12k_dp_link_peer_find_by_vdev_and_addr(dp, arvif->vdev_id, 6902 arsta->addr); 6903 if (peer) 6904 peer->is_authorized = false; 6905 6906 spin_unlock_bh(&dp->dp_lock); 6907 6908 /* Driver must clear the keys during the state change from 6909 * IEEE80211_STA_AUTHORIZED to IEEE80211_STA_ASSOC, since after 6910 * returning from here, mac80211 is going to delete the keys 6911 * in __sta_info_destroy_part2(). This will ensure that the driver does 6912 * not retain stale key references after mac80211 deletes the keys. 6913 */ 6914 ret = ath12k_clear_peer_keys(arvif, arsta->addr); 6915 if (ret) { 6916 ath12k_warn(ar->ab, "failed to clear all peer keys for vdev %i: %d\n", 6917 arvif->vdev_id, ret); 6918 return ret; 6919 } 6920 6921 return 0; 6922 } 6923 6924 static int ath12k_mac_station_authorize(struct ath12k *ar, 6925 struct ath12k_link_vif *arvif, 6926 struct ath12k_link_sta *arsta) 6927 { 6928 struct ath12k_dp_link_peer *peer; 6929 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 6930 int ret; 6931 struct ath12k_dp *dp = ath12k_ab_to_dp(ar->ab); 6932 6933 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 6934 6935 spin_lock_bh(&dp->dp_lock); 6936 6937 peer = ath12k_dp_link_peer_find_by_vdev_and_addr(dp, arvif->vdev_id, 6938 arsta->addr); 6939 if (peer) 6940 peer->is_authorized = true; 6941 6942 spin_unlock_bh(&dp->dp_lock); 6943 6944 if (vif->type == NL80211_IFTYPE_STATION && arvif->is_up) { 6945 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, 6946 arvif->vdev_id, 6947 WMI_PEER_AUTHORIZE, 6948 1); 6949 if (ret) { 6950 ath12k_warn(ar->ab, "Unable to authorize peer %pM vdev %d: %d\n", 6951 arsta->addr, arvif->vdev_id, ret); 6952 return ret; 6953 } 6954 } 6955 6956 return 0; 6957 } 6958 6959 static int ath12k_mac_station_remove(struct ath12k *ar, 6960 struct ath12k_link_vif *arvif, 6961 struct ath12k_link_sta *arsta) 6962 { 6963 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 6964 struct ath12k_vif *ahvif = arvif->ahvif; 6965 int ret = 0; 6966 struct ath12k_link_sta *temp_arsta; 6967 6968 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 6969 6970 wiphy_work_cancel(ar->ah->hw->wiphy, &arsta->update_wk); 6971 6972 if (ahvif->vdev_type == WMI_VDEV_TYPE_STA) { 6973 ath12k_bss_disassoc(ar, arvif); 6974 ret = ath12k_mac_vdev_stop(arvif); 6975 if (ret) 6976 ath12k_warn(ar->ab, "failed to stop vdev %i: %d\n", 6977 arvif->vdev_id, ret); 6978 } 6979 6980 if (sta->mlo) 6981 return ret; 6982 6983 ath12k_dp_peer_cleanup(ar, arvif->vdev_id, arsta->addr); 6984 6985 ret = ath12k_peer_delete(ar, arvif->vdev_id, arsta->addr); 6986 if (ret) 6987 ath12k_warn(ar->ab, "Failed to delete peer: %pM for VDEV: %d\n", 6988 arsta->addr, arvif->vdev_id); 6989 else 6990 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "Removed peer: %pM for VDEV: %d\n", 6991 arsta->addr, arvif->vdev_id); 6992 6993 ath12k_mac_station_post_remove(ar, arvif, arsta); 6994 6995 spin_lock_bh(&ar->ab->base_lock); 6996 6997 /* To handle roaming and split phy scenario */ 6998 temp_arsta = ath12k_link_sta_find_by_addr(ar->ab, arsta->addr); 6999 if (temp_arsta && temp_arsta->arvif->ar == ar) 7000 ath12k_link_sta_rhash_delete(ar->ab, arsta); 7001 7002 spin_unlock_bh(&ar->ab->base_lock); 7003 7004 if (sta->valid_links) 7005 ath12k_mac_free_unassign_link_sta(ahvif->ah, 7006 arsta->ahsta, arsta->link_id); 7007 7008 return ret; 7009 } 7010 7011 static int ath12k_mac_station_add(struct ath12k *ar, 7012 struct ath12k_link_vif *arvif, 7013 struct ath12k_link_sta *arsta) 7014 { 7015 struct ath12k_base *ab = ar->ab; 7016 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 7017 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta); 7018 struct ath12k_wmi_peer_create_arg peer_param = {}; 7019 int ret; 7020 struct ath12k_link_sta *temp_arsta; 7021 7022 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 7023 7024 ret = ath12k_mac_inc_num_stations(arvif, arsta); 7025 if (ret) { 7026 ath12k_warn(ab, "refusing to associate station: too many connected already (%d)\n", 7027 ar->max_num_stations); 7028 goto exit; 7029 } 7030 7031 spin_lock_bh(&ab->base_lock); 7032 7033 /* 7034 * In case of Split PHY and roaming scenario, pdev idx 7035 * might differ but both the pdev will share same rhash 7036 * table. In that case update the rhash table if link_sta is 7037 * already present 7038 */ 7039 temp_arsta = ath12k_link_sta_find_by_addr(ab, arsta->addr); 7040 if (temp_arsta && temp_arsta->arvif->ar != ar) 7041 ath12k_link_sta_rhash_delete(ab, temp_arsta); 7042 7043 ret = ath12k_link_sta_rhash_add(ab, arsta); 7044 spin_unlock_bh(&ab->base_lock); 7045 if (ret) { 7046 ath12k_warn(ab, "Failed to add arsta: %pM to hash table, ret: %d", 7047 arsta->addr, ret); 7048 goto dec_num_station; 7049 } 7050 7051 peer_param.vdev_id = arvif->vdev_id; 7052 peer_param.peer_addr = arsta->addr; 7053 peer_param.peer_type = WMI_PEER_TYPE_DEFAULT; 7054 peer_param.ml_enabled = sta->mlo; 7055 7056 ret = ath12k_peer_create(ar, arvif, sta, &peer_param); 7057 if (ret) { 7058 ath12k_warn(ab, "Failed to add peer: %pM for VDEV: %d\n", 7059 arsta->addr, arvif->vdev_id); 7060 goto free_peer; 7061 } 7062 7063 ath12k_dbg(ab, ATH12K_DBG_MAC, "Added peer: %pM for VDEV: %d\n", 7064 arsta->addr, arvif->vdev_id); 7065 7066 if (ieee80211_vif_is_mesh(vif)) { 7067 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, 7068 arvif->vdev_id, 7069 WMI_PEER_USE_4ADDR, 1); 7070 if (ret) { 7071 ath12k_warn(ab, "failed to STA %pM 4addr capability: %d\n", 7072 arsta->addr, ret); 7073 goto free_peer; 7074 } 7075 } 7076 7077 ret = ath12k_dp_peer_setup(ar, arvif->vdev_id, arsta->addr); 7078 if (ret) { 7079 ath12k_warn(ab, "failed to setup dp for peer %pM on vdev %i (%d)\n", 7080 arsta->addr, arvif->vdev_id, ret); 7081 goto free_peer; 7082 } 7083 7084 if (ab->hw_params->vdev_start_delay && 7085 !arvif->is_started && 7086 arvif->ahvif->vdev_type != WMI_VDEV_TYPE_AP) { 7087 ret = ath12k_start_vdev_delay(ar, arvif); 7088 if (ret) { 7089 ath12k_warn(ab, "failed to delay vdev start: %d\n", ret); 7090 goto free_peer; 7091 } 7092 } 7093 7094 return 0; 7095 7096 free_peer: 7097 ath12k_peer_delete(ar, arvif->vdev_id, arsta->addr); 7098 spin_lock_bh(&ab->base_lock); 7099 ath12k_link_sta_rhash_delete(ab, arsta); 7100 spin_unlock_bh(&ab->base_lock); 7101 dec_num_station: 7102 ath12k_mac_dec_num_stations(arvif, arsta); 7103 exit: 7104 return ret; 7105 } 7106 7107 static int ath12k_mac_assign_link_sta(struct ath12k_hw *ah, 7108 struct ath12k_sta *ahsta, 7109 struct ath12k_link_sta *arsta, 7110 struct ath12k_vif *ahvif, 7111 u8 link_id) 7112 { 7113 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(ahsta); 7114 struct ieee80211_link_sta *link_sta; 7115 struct ath12k_link_vif *arvif; 7116 int link_idx; 7117 7118 lockdep_assert_wiphy(ah->hw->wiphy); 7119 7120 if (!arsta || link_id >= IEEE80211_MLD_MAX_NUM_LINKS) 7121 return -EINVAL; 7122 7123 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]); 7124 if (!arvif) 7125 return -EINVAL; 7126 7127 memset(arsta, 0, sizeof(*arsta)); 7128 7129 link_sta = wiphy_dereference(ah->hw->wiphy, sta->link[link_id]); 7130 if (!link_sta) 7131 return -EINVAL; 7132 7133 ether_addr_copy(arsta->addr, link_sta->addr); 7134 7135 if (!ahsta->free_logical_link_idx_map) 7136 return -ENOSPC; 7137 7138 /* 7139 * Allocate a logical link index by selecting the first available bit 7140 * from the free logical index map 7141 */ 7142 link_idx = __ffs(ahsta->free_logical_link_idx_map); 7143 ahsta->free_logical_link_idx_map &= ~BIT(link_idx); 7144 arsta->link_idx = link_idx; 7145 7146 arsta->link_id = link_id; 7147 ahsta->links_map |= BIT(arsta->link_id); 7148 arsta->arvif = arvif; 7149 arsta->ahsta = ahsta; 7150 ahsta->ahvif = ahvif; 7151 7152 wiphy_work_init(&arsta->update_wk, ath12k_sta_rc_update_wk); 7153 7154 rcu_assign_pointer(ahsta->link[link_id], arsta); 7155 7156 return 0; 7157 } 7158 7159 static void ath12k_mac_ml_station_remove(struct ath12k_vif *ahvif, 7160 struct ath12k_sta *ahsta) 7161 { 7162 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(ahsta); 7163 struct ath12k_hw *ah = ahvif->ah; 7164 struct ath12k_link_vif *arvif; 7165 struct ath12k_link_sta *arsta; 7166 unsigned long links; 7167 struct ath12k *ar; 7168 u8 link_id; 7169 7170 lockdep_assert_wiphy(ah->hw->wiphy); 7171 7172 ath12k_peer_mlo_link_peers_delete(ahvif, ahsta); 7173 7174 /* validate link station removal and clear arsta links */ 7175 links = ahsta->links_map; 7176 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) { 7177 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]); 7178 arsta = wiphy_dereference(ah->hw->wiphy, ahsta->link[link_id]); 7179 if (!arvif || !arsta) 7180 continue; 7181 7182 ar = arvif->ar; 7183 7184 ath12k_mac_station_post_remove(ar, arvif, arsta); 7185 7186 spin_lock_bh(&ar->ab->base_lock); 7187 ath12k_link_sta_rhash_delete(ar->ab, arsta); 7188 spin_unlock_bh(&ar->ab->base_lock); 7189 7190 ath12k_mac_free_unassign_link_sta(ah, ahsta, link_id); 7191 } 7192 7193 if (sta->mlo) { 7194 clear_bit(ahsta->ml_peer_id, ah->free_ml_peer_id_map); 7195 ahsta->ml_peer_id = ATH12K_MLO_PEER_ID_INVALID; 7196 } 7197 } 7198 7199 static int ath12k_mac_handle_link_sta_state(struct ieee80211_hw *hw, 7200 struct ath12k_link_vif *arvif, 7201 struct ath12k_link_sta *arsta, 7202 enum ieee80211_sta_state old_state, 7203 enum ieee80211_sta_state new_state) 7204 { 7205 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 7206 struct ieee80211_bss_conf *link_conf; 7207 struct ath12k *ar = arvif->ar; 7208 struct ath12k_reg_info *reg_info; 7209 struct ath12k_base *ab = ar->ab; 7210 int ret = 0; 7211 7212 lockdep_assert_wiphy(hw->wiphy); 7213 7214 ath12k_dbg(ab, ATH12K_DBG_MAC, "mac handle link %u sta %pM state %d -> %d\n", 7215 arsta->link_id, arsta->addr, old_state, new_state); 7216 7217 /* IEEE80211_STA_NONE -> IEEE80211_STA_NOTEXIST: Remove the station 7218 * from driver 7219 */ 7220 if ((old_state == IEEE80211_STA_NONE && 7221 new_state == IEEE80211_STA_NOTEXIST)) { 7222 ret = ath12k_mac_station_remove(ar, arvif, arsta); 7223 if (ret) { 7224 ath12k_warn(ab, "Failed to remove station: %pM for VDEV: %d\n", 7225 arsta->addr, arvif->vdev_id); 7226 goto exit; 7227 } 7228 } 7229 7230 /* IEEE80211_STA_NOTEXIST -> IEEE80211_STA_NONE: Add new station to driver */ 7231 if (old_state == IEEE80211_STA_NOTEXIST && 7232 new_state == IEEE80211_STA_NONE) { 7233 ret = ath12k_mac_station_add(ar, arvif, arsta); 7234 if (ret) 7235 ath12k_warn(ab, "Failed to add station: %pM for VDEV: %d\n", 7236 arsta->addr, arvif->vdev_id); 7237 7238 /* IEEE80211_STA_AUTH -> IEEE80211_STA_ASSOC: Send station assoc command for 7239 * peer associated to AP/Mesh/ADHOC vif type. 7240 */ 7241 } else if (old_state == IEEE80211_STA_AUTH && 7242 new_state == IEEE80211_STA_ASSOC && 7243 (vif->type == NL80211_IFTYPE_AP || 7244 vif->type == NL80211_IFTYPE_MESH_POINT || 7245 vif->type == NL80211_IFTYPE_ADHOC)) { 7246 ret = ath12k_mac_station_assoc(ar, arvif, arsta, false); 7247 if (ret) 7248 ath12k_warn(ab, "Failed to associate station: %pM\n", 7249 arsta->addr); 7250 7251 /* IEEE80211_STA_ASSOC -> IEEE80211_STA_AUTHORIZED: set peer status as 7252 * authorized 7253 */ 7254 } else if (old_state == IEEE80211_STA_ASSOC && 7255 new_state == IEEE80211_STA_AUTHORIZED) { 7256 ret = ath12k_mac_station_authorize(ar, arvif, arsta); 7257 if (ret) { 7258 ath12k_warn(ab, "Failed to authorize station: %pM\n", 7259 arsta->addr); 7260 goto exit; 7261 } 7262 7263 if (ath12k_wmi_supports_6ghz_cc_ext(ar) && 7264 arvif->ahvif->vdev_type == WMI_VDEV_TYPE_STA) { 7265 link_conf = ath12k_mac_get_link_bss_conf(arvif); 7266 reg_info = ab->reg_info[ar->pdev_idx]; 7267 ath12k_dbg(ab, ATH12K_DBG_MAC, "connection done, update reg rules\n"); 7268 ath12k_hw_to_ah(hw)->regd_updated = false; 7269 ath12k_reg_handle_chan_list(ab, reg_info, arvif->ahvif->vdev_type, 7270 link_conf->power_type); 7271 } 7272 7273 /* IEEE80211_STA_AUTHORIZED -> IEEE80211_STA_ASSOC: station may be in removal, 7274 * deauthorize it. 7275 */ 7276 } else if (old_state == IEEE80211_STA_AUTHORIZED && 7277 new_state == IEEE80211_STA_ASSOC) { 7278 ath12k_mac_station_unauthorize(ar, arvif, arsta); 7279 7280 /* IEEE80211_STA_ASSOC -> IEEE80211_STA_AUTH: disassoc peer connected to 7281 * AP/mesh/ADHOC vif type. 7282 */ 7283 } else if (old_state == IEEE80211_STA_ASSOC && 7284 new_state == IEEE80211_STA_AUTH && 7285 (vif->type == NL80211_IFTYPE_AP || 7286 vif->type == NL80211_IFTYPE_MESH_POINT || 7287 vif->type == NL80211_IFTYPE_ADHOC)) { 7288 ret = ath12k_mac_station_disassoc(ar, arvif, arsta); 7289 if (ret) 7290 ath12k_warn(ab, "Failed to disassociate station: %pM\n", 7291 arsta->addr); 7292 } 7293 7294 exit: 7295 return ret; 7296 } 7297 7298 static bool ath12k_mac_is_freq_on_mac(struct ath12k_hw_mode_freq_range_arg *freq_range, 7299 u32 freq, u8 mac_id) 7300 { 7301 return (freq >= freq_range[mac_id].low_2ghz_freq && 7302 freq <= freq_range[mac_id].high_2ghz_freq) || 7303 (freq >= freq_range[mac_id].low_5ghz_freq && 7304 freq <= freq_range[mac_id].high_5ghz_freq); 7305 } 7306 7307 static bool 7308 ath12k_mac_2_freq_same_mac_in_freq_range(struct ath12k_base *ab, 7309 struct ath12k_hw_mode_freq_range_arg *freq_range, 7310 u32 freq_link1, u32 freq_link2) 7311 { 7312 u8 i; 7313 7314 for (i = 0; i < MAX_RADIOS; i++) { 7315 if (ath12k_mac_is_freq_on_mac(freq_range, freq_link1, i) && 7316 ath12k_mac_is_freq_on_mac(freq_range, freq_link2, i)) 7317 return true; 7318 } 7319 7320 return false; 7321 } 7322 7323 static bool ath12k_mac_is_hw_dbs_capable(struct ath12k_base *ab) 7324 { 7325 return test_bit(WMI_TLV_SERVICE_DUAL_BAND_SIMULTANEOUS_SUPPORT, 7326 ab->wmi_ab.svc_map) && 7327 ab->wmi_ab.hw_mode_info.support_dbs; 7328 } 7329 7330 static bool ath12k_mac_2_freq_same_mac_in_dbs(struct ath12k_base *ab, 7331 u32 freq_link1, u32 freq_link2) 7332 { 7333 struct ath12k_hw_mode_freq_range_arg *freq_range; 7334 7335 if (!ath12k_mac_is_hw_dbs_capable(ab)) 7336 return true; 7337 7338 freq_range = ab->wmi_ab.hw_mode_info.freq_range_caps[ATH12K_HW_MODE_DBS]; 7339 return ath12k_mac_2_freq_same_mac_in_freq_range(ab, freq_range, 7340 freq_link1, freq_link2); 7341 } 7342 7343 static bool ath12k_mac_is_hw_sbs_capable(struct ath12k_base *ab) 7344 { 7345 return test_bit(WMI_TLV_SERVICE_DUAL_BAND_SIMULTANEOUS_SUPPORT, 7346 ab->wmi_ab.svc_map) && 7347 ab->wmi_ab.hw_mode_info.support_sbs; 7348 } 7349 7350 static bool ath12k_mac_2_freq_same_mac_in_sbs(struct ath12k_base *ab, 7351 u32 freq_link1, u32 freq_link2) 7352 { 7353 struct ath12k_hw_mode_info *info = &ab->wmi_ab.hw_mode_info; 7354 struct ath12k_hw_mode_freq_range_arg *sbs_uppr_share; 7355 struct ath12k_hw_mode_freq_range_arg *sbs_low_share; 7356 struct ath12k_hw_mode_freq_range_arg *sbs_range; 7357 7358 if (!ath12k_mac_is_hw_sbs_capable(ab)) 7359 return true; 7360 7361 if (ab->wmi_ab.sbs_lower_band_end_freq) { 7362 sbs_uppr_share = info->freq_range_caps[ATH12K_HW_MODE_SBS_UPPER_SHARE]; 7363 sbs_low_share = info->freq_range_caps[ATH12K_HW_MODE_SBS_LOWER_SHARE]; 7364 7365 return ath12k_mac_2_freq_same_mac_in_freq_range(ab, sbs_low_share, 7366 freq_link1, freq_link2) || 7367 ath12k_mac_2_freq_same_mac_in_freq_range(ab, sbs_uppr_share, 7368 freq_link1, freq_link2); 7369 } 7370 7371 sbs_range = info->freq_range_caps[ATH12K_HW_MODE_SBS]; 7372 return ath12k_mac_2_freq_same_mac_in_freq_range(ab, sbs_range, 7373 freq_link1, freq_link2); 7374 } 7375 7376 static bool ath12k_mac_freqs_on_same_mac(struct ath12k_base *ab, 7377 u32 freq_link1, u32 freq_link2) 7378 { 7379 return ath12k_mac_2_freq_same_mac_in_dbs(ab, freq_link1, freq_link2) && 7380 ath12k_mac_2_freq_same_mac_in_sbs(ab, freq_link1, freq_link2); 7381 } 7382 7383 static int ath12k_mac_mlo_sta_set_link_active(struct ath12k_base *ab, 7384 enum wmi_mlo_link_force_reason reason, 7385 enum wmi_mlo_link_force_mode mode, 7386 u8 *mlo_vdev_id_lst, 7387 u8 num_mlo_vdev, 7388 u8 *mlo_inactive_vdev_lst, 7389 u8 num_mlo_inactive_vdev) 7390 { 7391 struct wmi_mlo_link_set_active_arg param = {}; 7392 u32 entry_idx, entry_offset, vdev_idx; 7393 u8 vdev_id; 7394 7395 param.reason = reason; 7396 param.force_mode = mode; 7397 7398 for (vdev_idx = 0; vdev_idx < num_mlo_vdev; vdev_idx++) { 7399 vdev_id = mlo_vdev_id_lst[vdev_idx]; 7400 entry_idx = vdev_id / 32; 7401 entry_offset = vdev_id % 32; 7402 if (entry_idx >= WMI_MLO_LINK_NUM_SZ) { 7403 ath12k_warn(ab, "Invalid entry_idx %d num_mlo_vdev %d vdev %d", 7404 entry_idx, num_mlo_vdev, vdev_id); 7405 return -EINVAL; 7406 } 7407 param.vdev_bitmap[entry_idx] |= 1 << entry_offset; 7408 /* update entry number if entry index changed */ 7409 if (param.num_vdev_bitmap < entry_idx + 1) 7410 param.num_vdev_bitmap = entry_idx + 1; 7411 } 7412 7413 ath12k_dbg(ab, ATH12K_DBG_MAC, 7414 "num_vdev_bitmap %d vdev_bitmap[0] = 0x%x, vdev_bitmap[1] = 0x%x", 7415 param.num_vdev_bitmap, param.vdev_bitmap[0], param.vdev_bitmap[1]); 7416 7417 if (mode == WMI_MLO_LINK_FORCE_MODE_ACTIVE_INACTIVE) { 7418 for (vdev_idx = 0; vdev_idx < num_mlo_inactive_vdev; vdev_idx++) { 7419 vdev_id = mlo_inactive_vdev_lst[vdev_idx]; 7420 entry_idx = vdev_id / 32; 7421 entry_offset = vdev_id % 32; 7422 if (entry_idx >= WMI_MLO_LINK_NUM_SZ) { 7423 ath12k_warn(ab, "Invalid entry_idx %d num_mlo_vdev %d vdev %d", 7424 entry_idx, num_mlo_inactive_vdev, vdev_id); 7425 return -EINVAL; 7426 } 7427 param.inactive_vdev_bitmap[entry_idx] |= 1 << entry_offset; 7428 /* update entry number if entry index changed */ 7429 if (param.num_inactive_vdev_bitmap < entry_idx + 1) 7430 param.num_inactive_vdev_bitmap = entry_idx + 1; 7431 } 7432 7433 ath12k_dbg(ab, ATH12K_DBG_MAC, 7434 "num_vdev_bitmap %d inactive_vdev_bitmap[0] = 0x%x, inactive_vdev_bitmap[1] = 0x%x", 7435 param.num_inactive_vdev_bitmap, 7436 param.inactive_vdev_bitmap[0], 7437 param.inactive_vdev_bitmap[1]); 7438 } 7439 7440 if (mode == WMI_MLO_LINK_FORCE_MODE_ACTIVE_LINK_NUM || 7441 mode == WMI_MLO_LINK_FORCE_MODE_INACTIVE_LINK_NUM) { 7442 param.num_link_entry = 1; 7443 param.link_num[0].num_of_link = num_mlo_vdev - 1; 7444 } 7445 7446 return ath12k_wmi_send_mlo_link_set_active_cmd(ab, ¶m); 7447 } 7448 7449 static int ath12k_mac_mlo_sta_update_link_active(struct ath12k_base *ab, 7450 struct ieee80211_hw *hw, 7451 struct ath12k_vif *ahvif) 7452 { 7453 u8 mlo_vdev_id_lst[IEEE80211_MLD_MAX_NUM_LINKS] = {}; 7454 u32 mlo_freq_list[IEEE80211_MLD_MAX_NUM_LINKS] = {}; 7455 unsigned long links = ahvif->links_map; 7456 enum wmi_mlo_link_force_reason reason; 7457 struct ieee80211_chanctx_conf *conf; 7458 enum wmi_mlo_link_force_mode mode; 7459 struct ieee80211_bss_conf *info; 7460 struct ath12k_link_vif *arvif; 7461 u8 num_mlo_vdev = 0; 7462 u8 link_id; 7463 7464 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) { 7465 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 7466 /* make sure vdev is created on this device */ 7467 if (!arvif || !arvif->is_created || arvif->ar->ab != ab) 7468 continue; 7469 7470 info = ath12k_mac_get_link_bss_conf(arvif); 7471 conf = wiphy_dereference(hw->wiphy, info->chanctx_conf); 7472 mlo_freq_list[num_mlo_vdev] = conf->def.chan->center_freq; 7473 7474 mlo_vdev_id_lst[num_mlo_vdev] = arvif->vdev_id; 7475 num_mlo_vdev++; 7476 } 7477 7478 /* It is not allowed to activate more links than a single device 7479 * supported. Something goes wrong if we reach here. 7480 */ 7481 if (num_mlo_vdev > ATH12K_NUM_MAX_ACTIVE_LINKS_PER_DEVICE) { 7482 WARN_ON_ONCE(1); 7483 return -EINVAL; 7484 } 7485 7486 /* if 2 links are established and both link channels fall on the 7487 * same hardware MAC, send command to firmware to deactivate one 7488 * of them. 7489 */ 7490 if (num_mlo_vdev == 2 && 7491 ath12k_mac_freqs_on_same_mac(ab, mlo_freq_list[0], 7492 mlo_freq_list[1])) { 7493 mode = WMI_MLO_LINK_FORCE_MODE_INACTIVE_LINK_NUM; 7494 reason = WMI_MLO_LINK_FORCE_REASON_NEW_CONNECT; 7495 return ath12k_mac_mlo_sta_set_link_active(ab, reason, mode, 7496 mlo_vdev_id_lst, num_mlo_vdev, 7497 NULL, 0); 7498 } 7499 7500 return 0; 7501 } 7502 7503 static bool ath12k_mac_are_sbs_chan(struct ath12k_base *ab, u32 freq_1, u32 freq_2) 7504 { 7505 if (!ath12k_mac_is_hw_sbs_capable(ab)) 7506 return false; 7507 7508 if (ath12k_is_2ghz_channel_freq(freq_1) || 7509 ath12k_is_2ghz_channel_freq(freq_2)) 7510 return false; 7511 7512 return !ath12k_mac_2_freq_same_mac_in_sbs(ab, freq_1, freq_2); 7513 } 7514 7515 static bool ath12k_mac_are_dbs_chan(struct ath12k_base *ab, u32 freq_1, u32 freq_2) 7516 { 7517 if (!ath12k_mac_is_hw_dbs_capable(ab)) 7518 return false; 7519 7520 return !ath12k_mac_2_freq_same_mac_in_dbs(ab, freq_1, freq_2); 7521 } 7522 7523 static int ath12k_mac_select_links(struct ath12k_base *ab, 7524 struct ieee80211_vif *vif, 7525 struct ieee80211_hw *hw, 7526 u16 *selected_links) 7527 { 7528 unsigned long useful_links = ieee80211_vif_usable_links(vif); 7529 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 7530 u8 num_useful_links = hweight_long(useful_links); 7531 struct ieee80211_chanctx_conf *chanctx; 7532 struct ath12k_link_vif *assoc_arvif; 7533 u32 assoc_link_freq, partner_freq; 7534 u16 sbs_links = 0, dbs_links = 0; 7535 struct ieee80211_bss_conf *info; 7536 struct ieee80211_channel *chan; 7537 struct ieee80211_sta *sta; 7538 struct ath12k_sta *ahsta; 7539 u8 link_id; 7540 7541 /* activate all useful links if less than max supported */ 7542 if (num_useful_links <= ATH12K_NUM_MAX_ACTIVE_LINKS_PER_DEVICE) { 7543 *selected_links = useful_links; 7544 return 0; 7545 } 7546 7547 /* only in station mode we can get here, so it's safe 7548 * to use ap_addr 7549 */ 7550 rcu_read_lock(); 7551 sta = ieee80211_find_sta(vif, vif->cfg.ap_addr); 7552 if (!sta) { 7553 rcu_read_unlock(); 7554 ath12k_warn(ab, "failed to find sta with addr %pM\n", vif->cfg.ap_addr); 7555 return -EINVAL; 7556 } 7557 7558 ahsta = ath12k_sta_to_ahsta(sta); 7559 assoc_arvif = wiphy_dereference(hw->wiphy, ahvif->link[ahsta->assoc_link_id]); 7560 info = ath12k_mac_get_link_bss_conf(assoc_arvif); 7561 chanctx = rcu_dereference(info->chanctx_conf); 7562 assoc_link_freq = chanctx->def.chan->center_freq; 7563 rcu_read_unlock(); 7564 ath12k_dbg(ab, ATH12K_DBG_MAC, "assoc link %u freq %u\n", 7565 assoc_arvif->link_id, assoc_link_freq); 7566 7567 /* assoc link is already activated and has to be kept active, 7568 * only need to select a partner link from others. 7569 */ 7570 useful_links &= ~BIT(assoc_arvif->link_id); 7571 for_each_set_bit(link_id, &useful_links, IEEE80211_MLD_MAX_NUM_LINKS) { 7572 info = wiphy_dereference(hw->wiphy, vif->link_conf[link_id]); 7573 if (!info) { 7574 ath12k_warn(ab, "failed to get link info for link: %u\n", 7575 link_id); 7576 return -ENOLINK; 7577 } 7578 7579 chan = info->chanreq.oper.chan; 7580 if (!chan) { 7581 ath12k_warn(ab, "failed to get chan for link: %u\n", link_id); 7582 return -EINVAL; 7583 } 7584 7585 partner_freq = chan->center_freq; 7586 if (ath12k_mac_are_sbs_chan(ab, assoc_link_freq, partner_freq)) { 7587 sbs_links |= BIT(link_id); 7588 ath12k_dbg(ab, ATH12K_DBG_MAC, "new SBS link %u freq %u\n", 7589 link_id, partner_freq); 7590 continue; 7591 } 7592 7593 if (ath12k_mac_are_dbs_chan(ab, assoc_link_freq, partner_freq)) { 7594 dbs_links |= BIT(link_id); 7595 ath12k_dbg(ab, ATH12K_DBG_MAC, "new DBS link %u freq %u\n", 7596 link_id, partner_freq); 7597 continue; 7598 } 7599 7600 ath12k_dbg(ab, ATH12K_DBG_MAC, "non DBS/SBS link %u freq %u\n", 7601 link_id, partner_freq); 7602 } 7603 7604 /* choose the first candidate no matter how many is in the list */ 7605 if (sbs_links) 7606 link_id = __ffs(sbs_links); 7607 else if (dbs_links) 7608 link_id = __ffs(dbs_links); 7609 else 7610 link_id = ffs(useful_links) - 1; 7611 7612 ath12k_dbg(ab, ATH12K_DBG_MAC, "select partner link %u\n", link_id); 7613 7614 *selected_links = BIT(assoc_arvif->link_id) | BIT(link_id); 7615 7616 return 0; 7617 } 7618 7619 int ath12k_mac_op_sta_state(struct ieee80211_hw *hw, 7620 struct ieee80211_vif *vif, 7621 struct ieee80211_sta *sta, 7622 enum ieee80211_sta_state old_state, 7623 enum ieee80211_sta_state new_state) 7624 { 7625 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 7626 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta); 7627 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 7628 struct ath12k_base *prev_ab = NULL, *ab; 7629 struct ath12k_link_vif *arvif; 7630 struct ath12k_link_sta *arsta; 7631 unsigned long valid_links; 7632 u16 selected_links = 0; 7633 u8 link_id = 0, i; 7634 struct ath12k *ar; 7635 int ret = -EINVAL; 7636 struct ath12k_dp_peer_create_params dp_params = {}; 7637 7638 lockdep_assert_wiphy(hw->wiphy); 7639 7640 if (ieee80211_vif_is_mld(vif) && sta->valid_links) { 7641 WARN_ON(!sta->mlo && hweight16(sta->valid_links) != 1); 7642 link_id = ffs(sta->valid_links) - 1; 7643 } 7644 7645 /* IEEE80211_STA_NOTEXIST -> IEEE80211_STA_NONE: 7646 * New station add received. If this is a ML station then 7647 * ahsta->links_map will be zero and sta->valid_links will be 1. 7648 * Assign default link to the first link sta. 7649 */ 7650 if (old_state == IEEE80211_STA_NOTEXIST && 7651 new_state == IEEE80211_STA_NONE) { 7652 memset(ahsta, 0, sizeof(*ahsta)); 7653 ahsta->free_logical_link_idx_map = U16_MAX; 7654 7655 arsta = &ahsta->deflink; 7656 7657 /* ML sta */ 7658 if (sta->mlo && !ahsta->links_map && 7659 (hweight16(sta->valid_links) == 1)) { 7660 ahsta->ml_peer_id = ath12k_peer_ml_alloc(ah); 7661 if (ahsta->ml_peer_id == ATH12K_MLO_PEER_ID_INVALID) { 7662 ath12k_hw_warn(ah, "unable to allocate ML peer id for sta %pM", 7663 sta->addr); 7664 goto exit; 7665 } 7666 7667 dp_params.is_mlo = true; 7668 dp_params.peer_id = ahsta->ml_peer_id | ATH12K_PEER_ML_ID_VALID; 7669 } 7670 7671 dp_params.sta = sta; 7672 7673 if (vif->type == NL80211_IFTYPE_AP) 7674 dp_params.ucast_ra_only = true; 7675 7676 ret = ath12k_dp_peer_create(&ah->dp_hw, sta->addr, &dp_params); 7677 if (ret) { 7678 ath12k_hw_warn(ah, "unable to create ath12k_dp_peer for sta %pM, ret: %d", 7679 sta->addr, ret); 7680 7681 goto ml_peer_id_clear; 7682 } 7683 7684 ret = ath12k_mac_assign_link_sta(ah, ahsta, arsta, ahvif, 7685 link_id); 7686 if (ret) { 7687 ath12k_hw_warn(ah, "unable assign link %d for sta %pM", 7688 link_id, sta->addr); 7689 goto peer_delete; 7690 } 7691 7692 /* above arsta will get memset, hence do this after assign 7693 * link sta 7694 */ 7695 if (sta->mlo) { 7696 /* For station mode, arvif->is_sta_assoc_link has been set when 7697 * vdev starts. Make sure the arvif/arsta pair have same setting 7698 */ 7699 if (vif->type == NL80211_IFTYPE_STATION && 7700 !arsta->arvif->is_sta_assoc_link) { 7701 ath12k_hw_warn(ah, "failed to verify assoc link setting with link id %u\n", 7702 link_id); 7703 ret = -EINVAL; 7704 goto exit; 7705 } 7706 7707 arsta->is_assoc_link = true; 7708 ahsta->assoc_link_id = link_id; 7709 } 7710 } 7711 7712 /* In the ML station scenario, activate all partner links once the 7713 * client is transitioning to the associated state. 7714 * 7715 * FIXME: Ideally, this activation should occur when the client 7716 * transitions to the authorized state. However, there are some 7717 * issues with handling this in the firmware. Until the firmware 7718 * can manage it properly, activate the links when the client is 7719 * about to move to the associated state. 7720 */ 7721 if (ieee80211_vif_is_mld(vif) && vif->type == NL80211_IFTYPE_STATION && 7722 old_state == IEEE80211_STA_AUTH && new_state == IEEE80211_STA_ASSOC) { 7723 /* TODO: for now only do link selection for single device 7724 * MLO case. Other cases would be handled in the future. 7725 */ 7726 ab = ah->radio[0].ab; 7727 if (ab->ag->num_devices == 1) { 7728 ret = ath12k_mac_select_links(ab, vif, hw, &selected_links); 7729 if (ret) { 7730 ath12k_warn(ab, 7731 "failed to get selected links: %d\n", ret); 7732 goto exit; 7733 } 7734 } else { 7735 selected_links = ieee80211_vif_usable_links(vif); 7736 } 7737 7738 ieee80211_set_active_links(vif, selected_links); 7739 } 7740 7741 /* Handle all the other state transitions in generic way */ 7742 valid_links = ahsta->links_map; 7743 for_each_set_bit(link_id, &valid_links, IEEE80211_MLD_MAX_NUM_LINKS) { 7744 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 7745 arsta = wiphy_dereference(hw->wiphy, ahsta->link[link_id]); 7746 /* some assumptions went wrong! */ 7747 if (WARN_ON(!arvif || !arsta)) 7748 continue; 7749 7750 /* vdev might be in deleted */ 7751 if (WARN_ON(!arvif->ar)) 7752 continue; 7753 7754 ret = ath12k_mac_handle_link_sta_state(hw, arvif, arsta, 7755 old_state, new_state); 7756 if (ret) { 7757 ath12k_hw_warn(ah, "unable to move link sta %d of sta %pM from state %d to %d", 7758 link_id, arsta->addr, old_state, new_state); 7759 7760 if (old_state == IEEE80211_STA_NOTEXIST && 7761 new_state == IEEE80211_STA_NONE) 7762 goto peer_delete; 7763 else 7764 goto exit; 7765 } 7766 } 7767 7768 if (ieee80211_vif_is_mld(vif) && vif->type == NL80211_IFTYPE_STATION && 7769 old_state == IEEE80211_STA_ASSOC && new_state == IEEE80211_STA_AUTHORIZED) { 7770 for_each_ar(ah, ar, i) { 7771 ab = ar->ab; 7772 if (prev_ab == ab) 7773 continue; 7774 7775 ret = ath12k_mac_mlo_sta_update_link_active(ab, hw, ahvif); 7776 if (ret) { 7777 ath12k_warn(ab, 7778 "failed to update link active state on connect %d\n", 7779 ret); 7780 goto exit; 7781 } 7782 7783 prev_ab = ab; 7784 } 7785 } 7786 /* IEEE80211_STA_NONE -> IEEE80211_STA_NOTEXIST: 7787 * Remove the station from driver (handle ML sta here since that 7788 * needs special handling. Normal sta will be handled in generic 7789 * handler below 7790 */ 7791 if (old_state == IEEE80211_STA_NONE && 7792 new_state == IEEE80211_STA_NOTEXIST) { 7793 if (sta->mlo) 7794 ath12k_mac_ml_station_remove(ahvif, ahsta); 7795 7796 ath12k_dp_peer_delete(&ah->dp_hw, sta->addr, sta); 7797 } 7798 7799 ret = 0; 7800 goto exit; 7801 7802 peer_delete: 7803 ath12k_dp_peer_delete(&ah->dp_hw, sta->addr, sta); 7804 ml_peer_id_clear: 7805 if (sta->mlo) { 7806 clear_bit(ahsta->ml_peer_id, ah->free_ml_peer_id_map); 7807 ahsta->ml_peer_id = ATH12K_MLO_PEER_ID_INVALID; 7808 } 7809 exit: 7810 /* update the state if everything went well */ 7811 if (!ret) 7812 ahsta->state = new_state; 7813 7814 return ret; 7815 } 7816 EXPORT_SYMBOL(ath12k_mac_op_sta_state); 7817 7818 int ath12k_mac_op_sta_set_txpwr(struct ieee80211_hw *hw, 7819 struct ieee80211_vif *vif, 7820 struct ieee80211_sta *sta) 7821 { 7822 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta); 7823 struct ath12k *ar; 7824 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 7825 struct ath12k_link_vif *arvif; 7826 struct ath12k_link_sta *arsta; 7827 u8 link_id; 7828 int ret; 7829 s16 txpwr; 7830 7831 lockdep_assert_wiphy(hw->wiphy); 7832 7833 /* TODO: use link id from mac80211 once that's implemented */ 7834 link_id = 0; 7835 7836 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 7837 arsta = wiphy_dereference(hw->wiphy, ahsta->link[link_id]); 7838 7839 if (sta->deflink.txpwr.type == NL80211_TX_POWER_AUTOMATIC) { 7840 txpwr = 0; 7841 } else { 7842 txpwr = sta->deflink.txpwr.power; 7843 if (!txpwr) { 7844 ret = -EINVAL; 7845 goto out; 7846 } 7847 } 7848 7849 if (txpwr > ATH12K_TX_POWER_MAX_VAL || txpwr < ATH12K_TX_POWER_MIN_VAL) { 7850 ret = -EINVAL; 7851 goto out; 7852 } 7853 7854 ar = arvif->ar; 7855 7856 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, arvif->vdev_id, 7857 WMI_PEER_USE_FIXED_PWR, txpwr); 7858 if (ret) { 7859 ath12k_warn(ar->ab, "failed to set tx power for station ret: %d\n", 7860 ret); 7861 goto out; 7862 } 7863 7864 out: 7865 return ret; 7866 } 7867 EXPORT_SYMBOL(ath12k_mac_op_sta_set_txpwr); 7868 7869 void ath12k_mac_op_link_sta_rc_update(struct ieee80211_hw *hw, 7870 struct ieee80211_vif *vif, 7871 struct ieee80211_link_sta *link_sta, 7872 u32 changed) 7873 { 7874 struct ieee80211_sta *sta = link_sta->sta; 7875 struct ath12k *ar; 7876 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta); 7877 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 7878 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 7879 struct ath12k_link_sta *arsta; 7880 struct ath12k_link_vif *arvif; 7881 struct ath12k_dp_link_peer *peer; 7882 u32 bw, smps; 7883 struct ath12k_dp *dp; 7884 7885 rcu_read_lock(); 7886 arvif = rcu_dereference(ahvif->link[link_sta->link_id]); 7887 if (!arvif) { 7888 ath12k_hw_warn(ah, "mac sta rc update failed to fetch link vif on link id %u for peer %pM\n", 7889 link_sta->link_id, sta->addr); 7890 rcu_read_unlock(); 7891 return; 7892 } 7893 7894 ar = arvif->ar; 7895 dp = ath12k_ab_to_dp(ar->ab); 7896 7897 arsta = rcu_dereference(ahsta->link[link_sta->link_id]); 7898 if (!arsta) { 7899 rcu_read_unlock(); 7900 ath12k_warn(ar->ab, "mac sta rc update failed to fetch link sta on link id %u for peer %pM\n", 7901 link_sta->link_id, sta->addr); 7902 return; 7903 } 7904 spin_lock_bh(&dp->dp_lock); 7905 7906 peer = ath12k_dp_link_peer_find_by_vdev_and_addr(dp, arvif->vdev_id, 7907 arsta->addr); 7908 if (!peer) { 7909 spin_unlock_bh(&dp->dp_lock); 7910 rcu_read_unlock(); 7911 ath12k_warn(ar->ab, "mac sta rc update failed to find peer %pM on vdev %i\n", 7912 arsta->addr, arvif->vdev_id); 7913 return; 7914 } 7915 7916 spin_unlock_bh(&dp->dp_lock); 7917 7918 if (arsta->link_id >= IEEE80211_MLD_MAX_NUM_LINKS) { 7919 rcu_read_unlock(); 7920 return; 7921 } 7922 7923 link_sta = rcu_dereference(sta->link[arsta->link_id]); 7924 if (!link_sta) { 7925 rcu_read_unlock(); 7926 ath12k_warn(ar->ab, "unable to access link sta in rc update for sta %pM link %u\n", 7927 sta->addr, arsta->link_id); 7928 return; 7929 } 7930 7931 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 7932 "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n", 7933 arsta->addr, changed, link_sta->bandwidth, link_sta->rx_nss, 7934 link_sta->smps_mode); 7935 7936 spin_lock_bh(&ar->data_lock); 7937 7938 if (changed & IEEE80211_RC_BW_CHANGED) { 7939 bw = ath12k_mac_ieee80211_sta_bw_to_wmi(ar, link_sta); 7940 arsta->bw_prev = arsta->bw; 7941 arsta->bw = bw; 7942 } 7943 7944 if (changed & IEEE80211_RC_NSS_CHANGED) 7945 arsta->nss = link_sta->rx_nss; 7946 7947 if (changed & IEEE80211_RC_SMPS_CHANGED) { 7948 smps = WMI_PEER_SMPS_PS_NONE; 7949 7950 switch (link_sta->smps_mode) { 7951 case IEEE80211_SMPS_AUTOMATIC: 7952 case IEEE80211_SMPS_OFF: 7953 smps = WMI_PEER_SMPS_PS_NONE; 7954 break; 7955 case IEEE80211_SMPS_STATIC: 7956 smps = WMI_PEER_SMPS_STATIC; 7957 break; 7958 case IEEE80211_SMPS_DYNAMIC: 7959 smps = WMI_PEER_SMPS_DYNAMIC; 7960 break; 7961 default: 7962 ath12k_warn(ar->ab, "Invalid smps %d in sta rc update for %pM link %u\n", 7963 link_sta->smps_mode, arsta->addr, link_sta->link_id); 7964 smps = WMI_PEER_SMPS_PS_NONE; 7965 break; 7966 } 7967 7968 arsta->smps = smps; 7969 } 7970 7971 arsta->changed |= changed; 7972 7973 spin_unlock_bh(&ar->data_lock); 7974 7975 wiphy_work_queue(hw->wiphy, &arsta->update_wk); 7976 7977 rcu_read_unlock(); 7978 } 7979 EXPORT_SYMBOL(ath12k_mac_op_link_sta_rc_update); 7980 7981 static struct ath12k_link_sta *ath12k_mac_alloc_assign_link_sta(struct ath12k_hw *ah, 7982 struct ath12k_sta *ahsta, 7983 struct ath12k_vif *ahvif, 7984 u8 link_id) 7985 { 7986 struct ath12k_link_sta *arsta; 7987 int ret; 7988 7989 lockdep_assert_wiphy(ah->hw->wiphy); 7990 7991 if (link_id >= IEEE80211_MLD_MAX_NUM_LINKS) 7992 return NULL; 7993 7994 arsta = wiphy_dereference(ah->hw->wiphy, ahsta->link[link_id]); 7995 if (arsta) 7996 return NULL; 7997 7998 arsta = kmalloc_obj(*arsta); 7999 if (!arsta) 8000 return NULL; 8001 8002 ret = ath12k_mac_assign_link_sta(ah, ahsta, arsta, ahvif, link_id); 8003 if (ret) { 8004 kfree(arsta); 8005 return NULL; 8006 } 8007 8008 return arsta; 8009 } 8010 8011 int ath12k_mac_op_change_sta_links(struct ieee80211_hw *hw, 8012 struct ieee80211_vif *vif, 8013 struct ieee80211_sta *sta, 8014 u16 old_links, u16 new_links) 8015 { 8016 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 8017 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta); 8018 struct ath12k_hw *ah = hw->priv; 8019 struct ath12k_link_vif *arvif; 8020 struct ath12k_link_sta *arsta; 8021 unsigned long valid_links; 8022 struct ath12k *ar; 8023 u8 link_id; 8024 int ret; 8025 8026 lockdep_assert_wiphy(hw->wiphy); 8027 8028 if (!sta->valid_links) 8029 return -EINVAL; 8030 8031 /* Firmware does not support removal of one of link stas. All sta 8032 * would be removed during ML STA delete in sta_state(), hence link 8033 * sta removal is not handled here. 8034 */ 8035 if (new_links < old_links) 8036 return 0; 8037 8038 if (ahsta->ml_peer_id == ATH12K_MLO_PEER_ID_INVALID) { 8039 ath12k_hw_warn(ah, "unable to add link for ml sta %pM", sta->addr); 8040 return -EINVAL; 8041 } 8042 8043 /* this op is expected only after initial sta insertion with default link */ 8044 if (WARN_ON(ahsta->links_map == 0)) 8045 return -EINVAL; 8046 8047 valid_links = new_links; 8048 for_each_set_bit(link_id, &valid_links, IEEE80211_MLD_MAX_NUM_LINKS) { 8049 if (ahsta->links_map & BIT(link_id)) 8050 continue; 8051 8052 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 8053 arsta = ath12k_mac_alloc_assign_link_sta(ah, ahsta, ahvif, link_id); 8054 8055 if (!arvif || !arsta) { 8056 ath12k_hw_warn(ah, "Failed to alloc/assign link sta"); 8057 continue; 8058 } 8059 8060 ar = arvif->ar; 8061 if (!ar) 8062 continue; 8063 8064 ret = ath12k_mac_station_add(ar, arvif, arsta); 8065 if (ret) { 8066 ath12k_warn(ar->ab, "Failed to add station: %pM for VDEV: %d\n", 8067 arsta->addr, arvif->vdev_id); 8068 ath12k_mac_free_unassign_link_sta(ah, ahsta, link_id); 8069 return ret; 8070 } 8071 } 8072 8073 return 0; 8074 } 8075 EXPORT_SYMBOL(ath12k_mac_op_change_sta_links); 8076 8077 bool ath12k_mac_op_can_activate_links(struct ieee80211_hw *hw, 8078 struct ieee80211_vif *vif, 8079 u16 active_links) 8080 { 8081 /* TODO: Handle recovery case */ 8082 8083 return true; 8084 } 8085 EXPORT_SYMBOL(ath12k_mac_op_can_activate_links); 8086 8087 static int ath12k_conf_tx_uapsd(struct ath12k_link_vif *arvif, 8088 u16 ac, bool enable) 8089 { 8090 struct ath12k *ar = arvif->ar; 8091 struct ath12k_vif *ahvif = arvif->ahvif; 8092 u32 value; 8093 int ret; 8094 8095 if (ahvif->vdev_type != WMI_VDEV_TYPE_STA) 8096 return 0; 8097 8098 switch (ac) { 8099 case IEEE80211_AC_VO: 8100 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN | 8101 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN; 8102 break; 8103 case IEEE80211_AC_VI: 8104 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN | 8105 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN; 8106 break; 8107 case IEEE80211_AC_BE: 8108 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN | 8109 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN; 8110 break; 8111 case IEEE80211_AC_BK: 8112 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN | 8113 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN; 8114 break; 8115 } 8116 8117 if (enable) 8118 ahvif->u.sta.uapsd |= value; 8119 else 8120 ahvif->u.sta.uapsd &= ~value; 8121 8122 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, 8123 WMI_STA_PS_PARAM_UAPSD, 8124 ahvif->u.sta.uapsd); 8125 if (ret) { 8126 ath12k_warn(ar->ab, "could not set uapsd params %d\n", ret); 8127 goto exit; 8128 } 8129 8130 if (ahvif->u.sta.uapsd) 8131 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD; 8132 else 8133 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE; 8134 8135 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, 8136 WMI_STA_PS_PARAM_RX_WAKE_POLICY, 8137 value); 8138 if (ret) 8139 ath12k_warn(ar->ab, "could not set rx wake param %d\n", ret); 8140 8141 exit: 8142 return ret; 8143 } 8144 8145 static int ath12k_mac_conf_tx(struct ath12k_link_vif *arvif, u16 ac, 8146 const struct ieee80211_tx_queue_params *params) 8147 { 8148 struct wmi_wmm_params_arg *p = NULL; 8149 struct ath12k *ar = arvif->ar; 8150 struct ath12k_base *ab = ar->ab; 8151 int ret; 8152 8153 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 8154 8155 switch (ac) { 8156 case IEEE80211_AC_VO: 8157 p = &arvif->wmm_params.ac_vo; 8158 break; 8159 case IEEE80211_AC_VI: 8160 p = &arvif->wmm_params.ac_vi; 8161 break; 8162 case IEEE80211_AC_BE: 8163 p = &arvif->wmm_params.ac_be; 8164 break; 8165 case IEEE80211_AC_BK: 8166 p = &arvif->wmm_params.ac_bk; 8167 break; 8168 } 8169 8170 if (WARN_ON(!p)) { 8171 ret = -EINVAL; 8172 goto exit; 8173 } 8174 8175 p->cwmin = params->cw_min; 8176 p->cwmax = params->cw_max; 8177 p->aifs = params->aifs; 8178 p->txop = params->txop; 8179 8180 ret = ath12k_wmi_send_wmm_update_cmd(ar, arvif->vdev_id, 8181 &arvif->wmm_params); 8182 if (ret) { 8183 ath12k_warn(ab, "pdev idx %d failed to set wmm params: %d\n", 8184 ar->pdev_idx, ret); 8185 goto exit; 8186 } 8187 8188 ret = ath12k_conf_tx_uapsd(arvif, ac, params->uapsd); 8189 if (ret) 8190 ath12k_warn(ab, "pdev idx %d failed to set sta uapsd: %d\n", 8191 ar->pdev_idx, ret); 8192 8193 exit: 8194 return ret; 8195 } 8196 8197 int ath12k_mac_op_conf_tx(struct ieee80211_hw *hw, 8198 struct ieee80211_vif *vif, 8199 unsigned int link_id, u16 ac, 8200 const struct ieee80211_tx_queue_params *params) 8201 { 8202 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 8203 struct ath12k_link_vif *arvif; 8204 struct ath12k_vif_cache *cache; 8205 int ret; 8206 8207 lockdep_assert_wiphy(hw->wiphy); 8208 8209 if (link_id >= IEEE80211_MLD_MAX_NUM_LINKS) 8210 return -EINVAL; 8211 8212 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 8213 if (!arvif || !arvif->is_created) { 8214 cache = ath12k_ahvif_get_link_cache(ahvif, link_id); 8215 if (!cache) 8216 return -ENOSPC; 8217 8218 cache->tx_conf.changed = true; 8219 cache->tx_conf.ac = ac; 8220 cache->tx_conf.tx_queue_params = *params; 8221 8222 return 0; 8223 } 8224 8225 ret = ath12k_mac_conf_tx(arvif, ac, params); 8226 8227 return ret; 8228 } 8229 EXPORT_SYMBOL(ath12k_mac_op_conf_tx); 8230 8231 static struct ieee80211_sta_ht_cap 8232 ath12k_create_ht_cap(struct ath12k *ar, u32 ar_ht_cap, u32 rate_cap_rx_chainmask) 8233 { 8234 int i; 8235 struct ieee80211_sta_ht_cap ht_cap = {}; 8236 u32 ar_vht_cap = ar->pdev->cap.vht_cap; 8237 8238 if (!(ar_ht_cap & WMI_HT_CAP_ENABLED)) 8239 return ht_cap; 8240 8241 ht_cap.ht_supported = 1; 8242 ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K; 8243 ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_NONE; 8244 ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40; 8245 ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40; 8246 ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT; 8247 8248 if (ar_ht_cap & WMI_HT_CAP_HT20_SGI) 8249 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20; 8250 8251 if (ar_ht_cap & WMI_HT_CAP_HT40_SGI) 8252 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40; 8253 8254 if (ar_ht_cap & WMI_HT_CAP_DYNAMIC_SMPS) { 8255 u32 smps; 8256 8257 smps = WLAN_HT_CAP_SM_PS_DYNAMIC; 8258 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT; 8259 8260 ht_cap.cap |= smps; 8261 } 8262 8263 if (ar_ht_cap & WMI_HT_CAP_TX_STBC) 8264 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC; 8265 8266 if (ar_ht_cap & WMI_HT_CAP_RX_STBC) { 8267 u32 stbc; 8268 8269 stbc = ar_ht_cap; 8270 stbc &= WMI_HT_CAP_RX_STBC; 8271 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT; 8272 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT; 8273 stbc &= IEEE80211_HT_CAP_RX_STBC; 8274 8275 ht_cap.cap |= stbc; 8276 } 8277 8278 if (ar_ht_cap & WMI_HT_CAP_RX_LDPC) 8279 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING; 8280 8281 if (ar_ht_cap & WMI_HT_CAP_L_SIG_TXOP_PROT) 8282 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT; 8283 8284 if (ar_vht_cap & WMI_VHT_CAP_MAX_MPDU_LEN_MASK) 8285 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU; 8286 8287 for (i = 0; i < ar->num_rx_chains; i++) { 8288 if (rate_cap_rx_chainmask & BIT(i)) 8289 ht_cap.mcs.rx_mask[i] = 0xFF; 8290 } 8291 8292 ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED; 8293 8294 return ht_cap; 8295 } 8296 8297 static int ath12k_mac_set_txbf_conf(struct ath12k_link_vif *arvif) 8298 { 8299 u32 value = 0; 8300 struct ath12k *ar = arvif->ar; 8301 struct ath12k_vif *ahvif = arvif->ahvif; 8302 int nsts; 8303 int sound_dim; 8304 u32 vht_cap = ar->pdev->cap.vht_cap; 8305 u32 vdev_param = WMI_VDEV_PARAM_TXBF; 8306 8307 if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)) { 8308 nsts = vht_cap & IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK; 8309 nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT; 8310 value |= SM(nsts, WMI_TXBF_STS_CAP_OFFSET); 8311 } 8312 8313 if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)) { 8314 sound_dim = vht_cap & 8315 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK; 8316 sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT; 8317 if (sound_dim > (ar->num_tx_chains - 1)) 8318 sound_dim = ar->num_tx_chains - 1; 8319 value |= SM(sound_dim, WMI_BF_SOUND_DIM_OFFSET); 8320 } 8321 8322 if (!value) 8323 return 0; 8324 8325 if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) { 8326 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER; 8327 8328 if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) && 8329 ahvif->vdev_type == WMI_VDEV_TYPE_AP) 8330 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFER; 8331 } 8332 8333 if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE) { 8334 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE; 8335 8336 if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE) && 8337 ahvif->vdev_type == WMI_VDEV_TYPE_STA) 8338 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE; 8339 } 8340 8341 return ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 8342 vdev_param, value); 8343 } 8344 8345 static void ath12k_set_vht_txbf_cap(struct ath12k *ar, u32 *vht_cap) 8346 { 8347 bool subfer, subfee; 8348 int sound_dim = 0; 8349 8350 subfer = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)); 8351 subfee = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)); 8352 8353 if (ar->num_tx_chains < 2) { 8354 *vht_cap &= ~(IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE); 8355 subfer = false; 8356 } 8357 8358 /* If SU Beaformer is not set, then disable MU Beamformer Capability */ 8359 if (!subfer) 8360 *vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE); 8361 8362 /* If SU Beaformee is not set, then disable MU Beamformee Capability */ 8363 if (!subfee) 8364 *vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE); 8365 8366 sound_dim = u32_get_bits(*vht_cap, 8367 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK); 8368 *vht_cap = u32_replace_bits(*vht_cap, 0, 8369 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK); 8370 8371 /* TODO: Need to check invalid STS and Sound_dim values set by FW? */ 8372 8373 /* Enable Sounding Dimension Field only if SU BF is enabled */ 8374 if (subfer) { 8375 if (sound_dim > (ar->num_tx_chains - 1)) 8376 sound_dim = ar->num_tx_chains - 1; 8377 8378 *vht_cap = u32_replace_bits(*vht_cap, sound_dim, 8379 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK); 8380 } 8381 8382 /* Use the STS advertised by FW unless SU Beamformee is not supported*/ 8383 if (!subfee) 8384 *vht_cap &= ~(IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK); 8385 } 8386 8387 static struct ieee80211_sta_vht_cap 8388 ath12k_create_vht_cap(struct ath12k *ar, u32 rate_cap_tx_chainmask, 8389 u32 rate_cap_rx_chainmask) 8390 { 8391 struct ieee80211_sta_vht_cap vht_cap = {}; 8392 u16 txmcs_map, rxmcs_map; 8393 int i; 8394 8395 vht_cap.vht_supported = 1; 8396 vht_cap.cap = ar->pdev->cap.vht_cap; 8397 8398 ath12k_set_vht_txbf_cap(ar, &vht_cap.cap); 8399 8400 /* 80P80 is not supported */ 8401 vht_cap.cap &= ~IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ; 8402 8403 rxmcs_map = 0; 8404 txmcs_map = 0; 8405 for (i = 0; i < 8; i++) { 8406 if (i < ar->num_tx_chains && rate_cap_tx_chainmask & BIT(i)) 8407 txmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2); 8408 else 8409 txmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2); 8410 8411 if (i < ar->num_rx_chains && rate_cap_rx_chainmask & BIT(i)) 8412 rxmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2); 8413 else 8414 rxmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2); 8415 } 8416 8417 if (rate_cap_tx_chainmask <= 1) 8418 vht_cap.cap &= ~IEEE80211_VHT_CAP_TXSTBC; 8419 8420 vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(rxmcs_map); 8421 vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(txmcs_map); 8422 8423 /* Check if the HW supports 1:1 NSS ratio and reset 8424 * EXT NSS BW Support field to 0 to indicate 1:1 ratio 8425 */ 8426 if (ar->pdev->cap.nss_ratio_info == WMI_NSS_RATIO_1_NSS) 8427 vht_cap.cap &= ~IEEE80211_VHT_CAP_EXT_NSS_BW_MASK; 8428 8429 return vht_cap; 8430 } 8431 8432 static void ath12k_mac_setup_ht_vht_cap(struct ath12k *ar, 8433 struct ath12k_pdev_cap *cap, 8434 u32 *ht_cap_info) 8435 { 8436 struct ieee80211_supported_band *band; 8437 u32 rate_cap_tx_chainmask; 8438 u32 rate_cap_rx_chainmask; 8439 u32 ht_cap; 8440 8441 rate_cap_tx_chainmask = ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift; 8442 rate_cap_rx_chainmask = ar->cfg_rx_chainmask >> cap->rx_chain_mask_shift; 8443 8444 if (cap->supported_bands & WMI_HOST_WLAN_2GHZ_CAP) { 8445 band = &ar->mac.sbands[NL80211_BAND_2GHZ]; 8446 ht_cap = cap->band[NL80211_BAND_2GHZ].ht_cap_info; 8447 if (ht_cap_info) 8448 *ht_cap_info = ht_cap; 8449 band->ht_cap = ath12k_create_ht_cap(ar, ht_cap, 8450 rate_cap_rx_chainmask); 8451 } 8452 8453 if (cap->supported_bands & WMI_HOST_WLAN_5GHZ_CAP && 8454 (ar->ab->hw_params->single_pdev_only || 8455 !ar->supports_6ghz)) { 8456 band = &ar->mac.sbands[NL80211_BAND_5GHZ]; 8457 ht_cap = cap->band[NL80211_BAND_5GHZ].ht_cap_info; 8458 if (ht_cap_info) 8459 *ht_cap_info = ht_cap; 8460 band->ht_cap = ath12k_create_ht_cap(ar, ht_cap, 8461 rate_cap_rx_chainmask); 8462 band->vht_cap = ath12k_create_vht_cap(ar, rate_cap_tx_chainmask, 8463 rate_cap_rx_chainmask); 8464 } 8465 } 8466 8467 static int ath12k_check_chain_mask(struct ath12k *ar, u32 ant, bool is_tx_ant) 8468 { 8469 /* TODO: Check the request chainmask against the supported 8470 * chainmask table which is advertised in extented_service_ready event 8471 */ 8472 8473 return 0; 8474 } 8475 8476 static void ath12k_gen_ppe_thresh(struct ath12k_wmi_ppe_threshold_arg *fw_ppet, 8477 u8 *he_ppet) 8478 { 8479 int nss, ru; 8480 u8 bit = 7; 8481 8482 he_ppet[0] = fw_ppet->numss_m1 & IEEE80211_PPE_THRES_NSS_MASK; 8483 he_ppet[0] |= (fw_ppet->ru_bit_mask << 8484 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS) & 8485 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK; 8486 for (nss = 0; nss <= fw_ppet->numss_m1; nss++) { 8487 for (ru = 0; ru < 4; ru++) { 8488 u8 val; 8489 int i; 8490 8491 if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0) 8492 continue; 8493 val = (fw_ppet->ppet16_ppet8_ru3_ru0[nss] >> (ru * 6)) & 8494 0x3f; 8495 val = ((val >> 3) & 0x7) | ((val & 0x7) << 3); 8496 for (i = 5; i >= 0; i--) { 8497 he_ppet[bit / 8] |= 8498 ((val >> i) & 0x1) << ((bit % 8)); 8499 bit++; 8500 } 8501 } 8502 } 8503 } 8504 8505 static void 8506 ath12k_mac_filter_he_cap_mesh(struct ieee80211_he_cap_elem *he_cap_elem) 8507 { 8508 u8 m; 8509 8510 m = IEEE80211_HE_MAC_CAP0_TWT_RES | 8511 IEEE80211_HE_MAC_CAP0_TWT_REQ; 8512 he_cap_elem->mac_cap_info[0] &= ~m; 8513 8514 m = IEEE80211_HE_MAC_CAP2_TRS | 8515 IEEE80211_HE_MAC_CAP2_BCAST_TWT | 8516 IEEE80211_HE_MAC_CAP2_MU_CASCADING; 8517 he_cap_elem->mac_cap_info[2] &= ~m; 8518 8519 m = IEEE80211_HE_MAC_CAP3_FLEX_TWT_SCHED | 8520 IEEE80211_HE_MAC_CAP2_BCAST_TWT | 8521 IEEE80211_HE_MAC_CAP2_MU_CASCADING; 8522 he_cap_elem->mac_cap_info[3] &= ~m; 8523 8524 m = IEEE80211_HE_MAC_CAP4_BSRP_BQRP_A_MPDU_AGG | 8525 IEEE80211_HE_MAC_CAP4_BQR; 8526 he_cap_elem->mac_cap_info[4] &= ~m; 8527 8528 m = IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECTIVE_TRANSMISSION | 8529 IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU | 8530 IEEE80211_HE_MAC_CAP5_PUNCTURED_SOUNDING | 8531 IEEE80211_HE_MAC_CAP5_HT_VHT_TRIG_FRAME_RX; 8532 he_cap_elem->mac_cap_info[5] &= ~m; 8533 8534 m = IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO | 8535 IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO; 8536 he_cap_elem->phy_cap_info[2] &= ~m; 8537 8538 m = IEEE80211_HE_PHY_CAP3_RX_PARTIAL_BW_SU_IN_20MHZ_MU | 8539 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK | 8540 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_MASK; 8541 he_cap_elem->phy_cap_info[3] &= ~m; 8542 8543 m = IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER; 8544 he_cap_elem->phy_cap_info[4] &= ~m; 8545 8546 m = IEEE80211_HE_PHY_CAP5_NG16_MU_FEEDBACK; 8547 he_cap_elem->phy_cap_info[5] &= ~m; 8548 8549 m = IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU | 8550 IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB | 8551 IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB | 8552 IEEE80211_HE_PHY_CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO; 8553 he_cap_elem->phy_cap_info[6] &= ~m; 8554 8555 m = IEEE80211_HE_PHY_CAP7_PSR_BASED_SR | 8556 IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP | 8557 IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ | 8558 IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ; 8559 he_cap_elem->phy_cap_info[7] &= ~m; 8560 8561 m = IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI | 8562 IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G | 8563 IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU | 8564 IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU; 8565 he_cap_elem->phy_cap_info[8] &= ~m; 8566 8567 m = IEEE80211_HE_PHY_CAP9_LONGER_THAN_16_SIGB_OFDM_SYM | 8568 IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK | 8569 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU | 8570 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU | 8571 IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_COMP_SIGB | 8572 IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_NON_COMP_SIGB; 8573 he_cap_elem->phy_cap_info[9] &= ~m; 8574 } 8575 8576 static __le16 ath12k_mac_setup_he_6ghz_cap(struct ath12k_pdev_cap *pcap, 8577 struct ath12k_band_cap *bcap) 8578 { 8579 u8 val; 8580 8581 bcap->he_6ghz_capa = IEEE80211_HT_MPDU_DENSITY_NONE; 8582 if (bcap->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) 8583 bcap->he_6ghz_capa |= 8584 u32_encode_bits(WLAN_HT_CAP_SM_PS_DYNAMIC, 8585 IEEE80211_HE_6GHZ_CAP_SM_PS); 8586 else 8587 bcap->he_6ghz_capa |= 8588 u32_encode_bits(WLAN_HT_CAP_SM_PS_DISABLED, 8589 IEEE80211_HE_6GHZ_CAP_SM_PS); 8590 val = u32_get_bits(pcap->vht_cap, 8591 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK); 8592 bcap->he_6ghz_capa |= 8593 u32_encode_bits(val, IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP); 8594 val = u32_get_bits(pcap->vht_cap, 8595 IEEE80211_VHT_CAP_MAX_MPDU_MASK); 8596 bcap->he_6ghz_capa |= 8597 u32_encode_bits(val, IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN); 8598 if (pcap->vht_cap & IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN) 8599 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS; 8600 if (pcap->vht_cap & IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN) 8601 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS; 8602 8603 return cpu_to_le16(bcap->he_6ghz_capa); 8604 } 8605 8606 static void ath12k_mac_set_hemcsmap(struct ath12k *ar, 8607 struct ath12k_pdev_cap *cap, 8608 struct ieee80211_sta_he_cap *he_cap) 8609 { 8610 struct ieee80211_he_mcs_nss_supp *mcs_nss = &he_cap->he_mcs_nss_supp; 8611 u8 maxtxnss_160 = ath12k_get_nss_160mhz(ar, ar->num_tx_chains); 8612 u8 maxrxnss_160 = ath12k_get_nss_160mhz(ar, ar->num_rx_chains); 8613 u16 txmcs_map_160 = 0, rxmcs_map_160 = 0; 8614 u16 txmcs_map = 0, rxmcs_map = 0; 8615 u32 i; 8616 8617 for (i = 0; i < 8; i++) { 8618 if (i < ar->num_tx_chains && 8619 (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i)) 8620 txmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2); 8621 else 8622 txmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2); 8623 8624 if (i < ar->num_rx_chains && 8625 (ar->cfg_rx_chainmask >> cap->tx_chain_mask_shift) & BIT(i)) 8626 rxmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2); 8627 else 8628 rxmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2); 8629 8630 if (i < maxtxnss_160 && 8631 (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i)) 8632 txmcs_map_160 |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2); 8633 else 8634 txmcs_map_160 |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2); 8635 8636 if (i < maxrxnss_160 && 8637 (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i)) 8638 rxmcs_map_160 |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2); 8639 else 8640 rxmcs_map_160 |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2); 8641 } 8642 8643 mcs_nss->rx_mcs_80 = cpu_to_le16(rxmcs_map & 0xffff); 8644 mcs_nss->tx_mcs_80 = cpu_to_le16(txmcs_map & 0xffff); 8645 mcs_nss->rx_mcs_160 = cpu_to_le16(rxmcs_map_160 & 0xffff); 8646 mcs_nss->tx_mcs_160 = cpu_to_le16(txmcs_map_160 & 0xffff); 8647 } 8648 8649 static void ath12k_mac_copy_he_cap(struct ath12k *ar, 8650 struct ath12k_band_cap *band_cap, 8651 int iftype, u8 num_tx_chains, 8652 struct ieee80211_sta_he_cap *he_cap) 8653 { 8654 struct ieee80211_he_cap_elem *he_cap_elem = &he_cap->he_cap_elem; 8655 8656 he_cap->has_he = true; 8657 memcpy(he_cap_elem->mac_cap_info, band_cap->he_cap_info, 8658 sizeof(he_cap_elem->mac_cap_info)); 8659 memcpy(he_cap_elem->phy_cap_info, band_cap->he_cap_phy_info, 8660 sizeof(he_cap_elem->phy_cap_info)); 8661 8662 he_cap_elem->mac_cap_info[1] &= 8663 IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_MASK; 8664 he_cap_elem->phy_cap_info[0] &= 8665 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G | 8666 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G | 8667 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G; 8668 /* 80PLUS80 is not supported */ 8669 he_cap_elem->phy_cap_info[0] &= 8670 ~IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G; 8671 he_cap_elem->phy_cap_info[5] &= 8672 ~IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK; 8673 he_cap_elem->phy_cap_info[5] |= num_tx_chains - 1; 8674 8675 switch (iftype) { 8676 case NL80211_IFTYPE_AP: 8677 he_cap_elem->mac_cap_info[2] &= 8678 ~IEEE80211_HE_MAC_CAP2_BCAST_TWT; 8679 he_cap_elem->phy_cap_info[3] &= 8680 ~IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK; 8681 he_cap_elem->phy_cap_info[9] |= 8682 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU; 8683 break; 8684 case NL80211_IFTYPE_STATION: 8685 he_cap_elem->mac_cap_info[0] &= ~IEEE80211_HE_MAC_CAP0_TWT_RES; 8686 he_cap_elem->mac_cap_info[0] |= IEEE80211_HE_MAC_CAP0_TWT_REQ; 8687 he_cap_elem->phy_cap_info[9] |= 8688 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU; 8689 break; 8690 case NL80211_IFTYPE_MESH_POINT: 8691 ath12k_mac_filter_he_cap_mesh(he_cap_elem); 8692 break; 8693 } 8694 8695 ath12k_mac_set_hemcsmap(ar, &ar->pdev->cap, he_cap); 8696 memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres)); 8697 if (he_cap_elem->phy_cap_info[6] & 8698 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) 8699 ath12k_gen_ppe_thresh(&band_cap->he_ppet, he_cap->ppe_thres); 8700 } 8701 8702 static void 8703 ath12k_mac_copy_eht_mcs_nss(struct ath12k_band_cap *band_cap, 8704 struct ieee80211_eht_mcs_nss_supp *mcs_nss, 8705 const struct ieee80211_he_cap_elem *he_cap, 8706 const struct ieee80211_eht_cap_elem_fixed *eht_cap) 8707 { 8708 if ((he_cap->phy_cap_info[0] & 8709 (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G | 8710 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G | 8711 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G | 8712 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)) == 0) 8713 memcpy(&mcs_nss->only_20mhz, &band_cap->eht_mcs_20_only, 8714 sizeof(struct ieee80211_eht_mcs_nss_supp_20mhz_only)); 8715 8716 if (he_cap->phy_cap_info[0] & 8717 (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G | 8718 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G)) 8719 memcpy(&mcs_nss->bw._80, &band_cap->eht_mcs_80, 8720 sizeof(struct ieee80211_eht_mcs_nss_supp_bw)); 8721 8722 if (he_cap->phy_cap_info[0] & 8723 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G) 8724 memcpy(&mcs_nss->bw._160, &band_cap->eht_mcs_160, 8725 sizeof(struct ieee80211_eht_mcs_nss_supp_bw)); 8726 8727 if (eht_cap->phy_cap_info[0] & IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ) 8728 memcpy(&mcs_nss->bw._320, &band_cap->eht_mcs_320, 8729 sizeof(struct ieee80211_eht_mcs_nss_supp_bw)); 8730 } 8731 8732 static void ath12k_mac_copy_eht_ppe_thresh(struct ath12k_wmi_ppe_threshold_arg *fw_ppet, 8733 struct ieee80211_sta_eht_cap *cap) 8734 { 8735 u16 bit = IEEE80211_EHT_PPE_THRES_INFO_HEADER_SIZE; 8736 u8 i, nss, ru, ppet_bit_len_per_ru = IEEE80211_EHT_PPE_THRES_INFO_PPET_SIZE * 2; 8737 8738 u8p_replace_bits(&cap->eht_ppe_thres[0], fw_ppet->numss_m1, 8739 IEEE80211_EHT_PPE_THRES_NSS_MASK); 8740 8741 u16p_replace_bits((u16 *)&cap->eht_ppe_thres[0], fw_ppet->ru_bit_mask, 8742 IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK); 8743 8744 for (nss = 0; nss <= fw_ppet->numss_m1; nss++) { 8745 for (ru = 0; 8746 ru < hweight16(IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK); 8747 ru++) { 8748 u32 val = 0; 8749 8750 if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0) 8751 continue; 8752 8753 u32p_replace_bits(&val, fw_ppet->ppet16_ppet8_ru3_ru0[nss] >> 8754 (ru * ppet_bit_len_per_ru), 8755 GENMASK(ppet_bit_len_per_ru - 1, 0)); 8756 8757 for (i = 0; i < ppet_bit_len_per_ru; i++) { 8758 cap->eht_ppe_thres[bit / 8] |= 8759 (((val >> i) & 0x1) << ((bit % 8))); 8760 bit++; 8761 } 8762 } 8763 } 8764 } 8765 8766 static void 8767 ath12k_mac_filter_eht_cap_mesh(struct ieee80211_eht_cap_elem_fixed 8768 *eht_cap_elem) 8769 { 8770 u8 m; 8771 8772 m = IEEE80211_EHT_MAC_CAP0_EPCS_PRIO_ACCESS; 8773 eht_cap_elem->mac_cap_info[0] &= ~m; 8774 8775 m = IEEE80211_EHT_PHY_CAP0_PARTIAL_BW_UL_MU_MIMO; 8776 eht_cap_elem->phy_cap_info[0] &= ~m; 8777 8778 m = IEEE80211_EHT_PHY_CAP3_NG_16_MU_FEEDBACK | 8779 IEEE80211_EHT_PHY_CAP3_CODEBOOK_7_5_MU_FDBK | 8780 IEEE80211_EHT_PHY_CAP3_TRIG_MU_BF_PART_BW_FDBK | 8781 IEEE80211_EHT_PHY_CAP3_TRIG_CQI_FDBK; 8782 eht_cap_elem->phy_cap_info[3] &= ~m; 8783 8784 m = IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO | 8785 IEEE80211_EHT_PHY_CAP4_PSR_SR_SUPP | 8786 IEEE80211_EHT_PHY_CAP4_POWER_BOOST_FACT_SUPP | 8787 IEEE80211_EHT_PHY_CAP4_EHT_MU_PPDU_4_EHT_LTF_08_GI; 8788 eht_cap_elem->phy_cap_info[4] &= ~m; 8789 8790 m = IEEE80211_EHT_PHY_CAP5_NON_TRIG_CQI_FEEDBACK | 8791 IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP | 8792 IEEE80211_EHT_PHY_CAP5_RX_LESS_242_TONE_RU_SUPP | 8793 IEEE80211_EHT_PHY_CAP5_MAX_NUM_SUPP_EHT_LTF_MASK; 8794 eht_cap_elem->phy_cap_info[5] &= ~m; 8795 8796 m = IEEE80211_EHT_PHY_CAP6_MAX_NUM_SUPP_EHT_LTF_MASK; 8797 eht_cap_elem->phy_cap_info[6] &= ~m; 8798 8799 m = IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ | 8800 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ | 8801 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ | 8802 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ | 8803 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ | 8804 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ; 8805 eht_cap_elem->phy_cap_info[7] &= ~m; 8806 } 8807 8808 static void ath12k_mac_copy_eht_cap(struct ath12k *ar, 8809 struct ath12k_band_cap *band_cap, 8810 struct ieee80211_he_cap_elem *he_cap_elem, 8811 int iftype, 8812 struct ieee80211_sta_eht_cap *eht_cap) 8813 { 8814 struct ieee80211_eht_cap_elem_fixed *eht_cap_elem = &eht_cap->eht_cap_elem; 8815 8816 memset(eht_cap, 0, sizeof(struct ieee80211_sta_eht_cap)); 8817 8818 if (!(test_bit(WMI_TLV_SERVICE_11BE, ar->ab->wmi_ab.svc_map)) || 8819 ath12k_acpi_get_disable_11be(ar->ab)) 8820 return; 8821 8822 eht_cap->has_eht = true; 8823 memcpy(eht_cap_elem->mac_cap_info, band_cap->eht_cap_mac_info, 8824 sizeof(eht_cap_elem->mac_cap_info)); 8825 memcpy(eht_cap_elem->phy_cap_info, band_cap->eht_cap_phy_info, 8826 sizeof(eht_cap_elem->phy_cap_info)); 8827 8828 switch (iftype) { 8829 case NL80211_IFTYPE_AP: 8830 eht_cap_elem->phy_cap_info[0] &= 8831 ~IEEE80211_EHT_PHY_CAP0_242_TONE_RU_GT20MHZ; 8832 eht_cap_elem->phy_cap_info[4] &= 8833 ~IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO; 8834 eht_cap_elem->phy_cap_info[5] &= 8835 ~IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP; 8836 break; 8837 case NL80211_IFTYPE_STATION: 8838 eht_cap_elem->phy_cap_info[7] &= 8839 ~(IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ | 8840 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ | 8841 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ); 8842 eht_cap_elem->phy_cap_info[7] &= 8843 ~(IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ | 8844 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ | 8845 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ); 8846 break; 8847 case NL80211_IFTYPE_MESH_POINT: 8848 ath12k_mac_filter_eht_cap_mesh(eht_cap_elem); 8849 break; 8850 default: 8851 break; 8852 } 8853 8854 ath12k_mac_copy_eht_mcs_nss(band_cap, &eht_cap->eht_mcs_nss_supp, 8855 he_cap_elem, eht_cap_elem); 8856 8857 if (eht_cap_elem->phy_cap_info[5] & 8858 IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT) 8859 ath12k_mac_copy_eht_ppe_thresh(&band_cap->eht_ppet, eht_cap); 8860 } 8861 8862 static int ath12k_mac_copy_sband_iftype_data(struct ath12k *ar, 8863 struct ath12k_pdev_cap *cap, 8864 struct ieee80211_sband_iftype_data *data, 8865 int band) 8866 { 8867 struct ath12k_band_cap *band_cap = &cap->band[band]; 8868 int i, idx = 0; 8869 8870 for (i = 0; i < NUM_NL80211_IFTYPES; i++) { 8871 struct ieee80211_sta_he_cap *he_cap = &data[idx].he_cap; 8872 8873 switch (i) { 8874 case NL80211_IFTYPE_STATION: 8875 case NL80211_IFTYPE_AP: 8876 case NL80211_IFTYPE_MESH_POINT: 8877 break; 8878 8879 default: 8880 continue; 8881 } 8882 8883 data[idx].types_mask = BIT(i); 8884 8885 ath12k_mac_copy_he_cap(ar, band_cap, i, ar->num_tx_chains, he_cap); 8886 if (band == NL80211_BAND_6GHZ) { 8887 data[idx].he_6ghz_capa.capa = 8888 ath12k_mac_setup_he_6ghz_cap(cap, band_cap); 8889 } 8890 ath12k_mac_copy_eht_cap(ar, band_cap, &he_cap->he_cap_elem, i, 8891 &data[idx].eht_cap); 8892 idx++; 8893 } 8894 8895 return idx; 8896 } 8897 8898 static void ath12k_mac_setup_sband_iftype_data(struct ath12k *ar, 8899 struct ath12k_pdev_cap *cap) 8900 { 8901 struct ieee80211_supported_band *sband; 8902 enum nl80211_band band; 8903 int count; 8904 8905 if (cap->supported_bands & WMI_HOST_WLAN_2GHZ_CAP) { 8906 band = NL80211_BAND_2GHZ; 8907 count = ath12k_mac_copy_sband_iftype_data(ar, cap, 8908 ar->mac.iftype[band], 8909 band); 8910 sband = &ar->mac.sbands[band]; 8911 _ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band], 8912 count); 8913 } 8914 8915 if (cap->supported_bands & WMI_HOST_WLAN_5GHZ_CAP) { 8916 band = NL80211_BAND_5GHZ; 8917 count = ath12k_mac_copy_sband_iftype_data(ar, cap, 8918 ar->mac.iftype[band], 8919 band); 8920 sband = &ar->mac.sbands[band]; 8921 _ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band], 8922 count); 8923 } 8924 8925 if (cap->supported_bands & WMI_HOST_WLAN_5GHZ_CAP && 8926 ar->supports_6ghz) { 8927 band = NL80211_BAND_6GHZ; 8928 count = ath12k_mac_copy_sband_iftype_data(ar, cap, 8929 ar->mac.iftype[band], 8930 band); 8931 sband = &ar->mac.sbands[band]; 8932 _ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band], 8933 count); 8934 } 8935 } 8936 8937 static int __ath12k_set_antenna(struct ath12k *ar, u32 tx_ant, u32 rx_ant) 8938 { 8939 struct ath12k_hw *ah = ath12k_ar_to_ah(ar); 8940 int ret; 8941 8942 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 8943 8944 if (ath12k_check_chain_mask(ar, tx_ant, true)) 8945 return -EINVAL; 8946 8947 if (ath12k_check_chain_mask(ar, rx_ant, false)) 8948 return -EINVAL; 8949 8950 /* Since we advertised the max cap of all radios combined during wiphy 8951 * registration, ensure we don't set the antenna config higher than the 8952 * limits 8953 */ 8954 tx_ant = min_t(u32, tx_ant, ar->pdev->cap.tx_chain_mask); 8955 rx_ant = min_t(u32, rx_ant, ar->pdev->cap.rx_chain_mask); 8956 8957 ar->cfg_tx_chainmask = tx_ant; 8958 ar->cfg_rx_chainmask = rx_ant; 8959 8960 if (ah->state != ATH12K_HW_STATE_ON && 8961 ah->state != ATH12K_HW_STATE_RESTARTED) 8962 return 0; 8963 8964 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_TX_CHAIN_MASK, 8965 tx_ant, ar->pdev->pdev_id); 8966 if (ret) { 8967 ath12k_warn(ar->ab, "failed to set tx-chainmask: %d, req 0x%x\n", 8968 ret, tx_ant); 8969 return ret; 8970 } 8971 8972 ar->num_tx_chains = hweight32(tx_ant); 8973 8974 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RX_CHAIN_MASK, 8975 rx_ant, ar->pdev->pdev_id); 8976 if (ret) { 8977 ath12k_warn(ar->ab, "failed to set rx-chainmask: %d, req 0x%x\n", 8978 ret, rx_ant); 8979 return ret; 8980 } 8981 8982 ar->num_rx_chains = hweight32(rx_ant); 8983 8984 /* Reload HT/VHT/HE capability */ 8985 ath12k_mac_setup_ht_vht_cap(ar, &ar->pdev->cap, NULL); 8986 ath12k_mac_setup_sband_iftype_data(ar, &ar->pdev->cap); 8987 8988 return 0; 8989 } 8990 8991 static void ath12k_mgmt_over_wmi_tx_drop(struct ath12k *ar, struct sk_buff *skb) 8992 { 8993 int num_mgmt; 8994 8995 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 8996 8997 ieee80211_free_txskb(ath12k_ar_to_hw(ar), skb); 8998 8999 num_mgmt = atomic_dec_if_positive(&ar->num_pending_mgmt_tx); 9000 9001 if (num_mgmt < 0) 9002 WARN_ON_ONCE(1); 9003 9004 if (!num_mgmt) 9005 wake_up(&ar->txmgmt_empty_waitq); 9006 } 9007 9008 static void ath12k_mac_tx_mgmt_free(struct ath12k *ar, int buf_id) 9009 { 9010 struct sk_buff *msdu; 9011 struct ieee80211_tx_info *info; 9012 9013 spin_lock_bh(&ar->txmgmt_idr_lock); 9014 msdu = idr_remove(&ar->txmgmt_idr, buf_id); 9015 spin_unlock_bh(&ar->txmgmt_idr_lock); 9016 9017 if (!msdu) 9018 return; 9019 9020 dma_unmap_single(ar->ab->dev, ATH12K_SKB_CB(msdu)->paddr, msdu->len, 9021 DMA_TO_DEVICE); 9022 9023 info = IEEE80211_SKB_CB(msdu); 9024 memset(&info->status, 0, sizeof(info->status)); 9025 9026 ath12k_mgmt_over_wmi_tx_drop(ar, msdu); 9027 } 9028 9029 int ath12k_mac_tx_mgmt_pending_free(int buf_id, void *skb, void *ctx) 9030 { 9031 struct ath12k *ar = ctx; 9032 9033 ath12k_mac_tx_mgmt_free(ar, buf_id); 9034 9035 return 0; 9036 } 9037 9038 static int ath12k_mac_vif_txmgmt_idr_remove(int buf_id, void *skb, void *ctx) 9039 { 9040 struct ieee80211_vif *vif = ctx; 9041 struct ath12k_skb_cb *skb_cb = ATH12K_SKB_CB(skb); 9042 struct ath12k *ar = skb_cb->ar; 9043 9044 if (skb_cb->vif == vif) 9045 ath12k_mac_tx_mgmt_free(ar, buf_id); 9046 9047 return 0; 9048 } 9049 9050 static int ath12k_mac_mgmt_tx_wmi(struct ath12k *ar, struct ath12k_link_vif *arvif, 9051 struct sk_buff *skb) 9052 { 9053 struct ath12k_base *ab = ar->ab; 9054 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 9055 struct ath12k_skb_cb *skb_cb = ATH12K_SKB_CB(skb); 9056 struct ieee80211_tx_info *info; 9057 enum hal_encrypt_type enctype; 9058 unsigned int mic_len; 9059 dma_addr_t paddr; 9060 int buf_id; 9061 int ret; 9062 9063 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 9064 9065 skb_cb->ar = ar; 9066 spin_lock_bh(&ar->txmgmt_idr_lock); 9067 buf_id = idr_alloc(&ar->txmgmt_idr, skb, 0, 9068 ATH12K_TX_MGMT_NUM_PENDING_MAX, GFP_ATOMIC); 9069 spin_unlock_bh(&ar->txmgmt_idr_lock); 9070 if (buf_id < 0) 9071 return -ENOSPC; 9072 9073 info = IEEE80211_SKB_CB(skb); 9074 if ((skb_cb->flags & ATH12K_SKB_CIPHER_SET) && 9075 !(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) { 9076 if ((ieee80211_is_action(hdr->frame_control) || 9077 ieee80211_is_deauth(hdr->frame_control) || 9078 ieee80211_is_disassoc(hdr->frame_control)) && 9079 ieee80211_has_protected(hdr->frame_control)) { 9080 enctype = ath12k_dp_tx_get_encrypt_type(skb_cb->cipher); 9081 mic_len = ath12k_dp_rx_crypto_mic_len(ab->dp, enctype); 9082 skb_put(skb, mic_len); 9083 } 9084 } 9085 9086 paddr = dma_map_single(ab->dev, skb->data, skb->len, DMA_TO_DEVICE); 9087 if (dma_mapping_error(ab->dev, paddr)) { 9088 ath12k_warn(ab, "failed to DMA map mgmt Tx buffer\n"); 9089 ret = -EIO; 9090 goto err_free_idr; 9091 } 9092 9093 skb_cb->paddr = paddr; 9094 9095 ret = ath12k_wmi_mgmt_send(arvif, buf_id, skb); 9096 if (ret) { 9097 ath12k_warn(ar->ab, "failed to send mgmt frame: %d\n", ret); 9098 goto err_unmap_buf; 9099 } 9100 9101 return 0; 9102 9103 err_unmap_buf: 9104 dma_unmap_single(ab->dev, skb_cb->paddr, 9105 skb->len, DMA_TO_DEVICE); 9106 err_free_idr: 9107 spin_lock_bh(&ar->txmgmt_idr_lock); 9108 idr_remove(&ar->txmgmt_idr, buf_id); 9109 spin_unlock_bh(&ar->txmgmt_idr_lock); 9110 9111 return ret; 9112 } 9113 9114 static void ath12k_mgmt_over_wmi_tx_purge(struct ath12k *ar) 9115 { 9116 struct sk_buff *skb; 9117 9118 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) 9119 ath12k_mgmt_over_wmi_tx_drop(ar, skb); 9120 } 9121 9122 static int ath12k_mac_mgmt_action_frame_fill_elem_data(struct ath12k_link_vif *arvif, 9123 struct sk_buff *skb) 9124 { 9125 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 9126 u8 category, *buf, iv_len, action_code, dialog_token; 9127 struct ieee80211_bss_conf *link_conf; 9128 struct ieee80211_chanctx_conf *conf; 9129 int cur_tx_power, max_tx_power; 9130 struct ath12k *ar = arvif->ar; 9131 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar); 9132 struct wiphy *wiphy = hw->wiphy; 9133 struct ath12k_skb_cb *skb_cb; 9134 struct ieee80211_mgmt *mgmt; 9135 unsigned int remaining_len; 9136 bool has_protected; 9137 9138 lockdep_assert_wiphy(wiphy); 9139 9140 /* make sure category field is present */ 9141 if (skb->len < IEEE80211_MIN_ACTION_SIZE(category)) 9142 return -EINVAL; 9143 9144 remaining_len = skb->len - IEEE80211_MIN_ACTION_SIZE(category); 9145 has_protected = ieee80211_has_protected(hdr->frame_control); 9146 9147 /* In case of SW crypto and hdr protected (PMF), packet will already be encrypted, 9148 * we can't put in data in this case 9149 */ 9150 if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags) && 9151 has_protected) 9152 return 0; 9153 9154 mgmt = (struct ieee80211_mgmt *)hdr; 9155 buf = (u8 *)&mgmt->u.action; 9156 9157 /* FCTL_PROTECTED frame might have extra space added for HDR_LEN. Offset that 9158 * many bytes if it is there 9159 */ 9160 if (has_protected) { 9161 skb_cb = ATH12K_SKB_CB(skb); 9162 9163 switch (skb_cb->cipher) { 9164 /* Cipher suite having flag %IEEE80211_KEY_FLAG_GENERATE_IV_MGMT set in 9165 * key needs to be processed. See ath12k_install_key() 9166 */ 9167 case WLAN_CIPHER_SUITE_CCMP: 9168 case WLAN_CIPHER_SUITE_CCMP_256: 9169 case WLAN_CIPHER_SUITE_GCMP: 9170 case WLAN_CIPHER_SUITE_GCMP_256: 9171 iv_len = IEEE80211_CCMP_HDR_LEN; 9172 break; 9173 case WLAN_CIPHER_SUITE_TKIP: 9174 iv_len = 0; 9175 break; 9176 default: 9177 return -EINVAL; 9178 } 9179 9180 if (remaining_len < iv_len) 9181 return -EINVAL; 9182 9183 buf += iv_len; 9184 remaining_len -= iv_len; 9185 } 9186 9187 category = *buf++; 9188 /* category code is already taken care in %IEEE80211_MIN_ACTION_SIZE hence 9189 * no need to adjust remaining_len 9190 */ 9191 9192 switch (category) { 9193 case WLAN_CATEGORY_RADIO_MEASUREMENT: 9194 /* need action code and dialog token */ 9195 if (remaining_len < 2) 9196 return -EINVAL; 9197 9198 /* Packet Format: 9199 * Action Code | Dialog Token | Variable Len (based on Action Code) 9200 */ 9201 action_code = *buf++; 9202 dialog_token = *buf++; 9203 remaining_len -= 2; 9204 9205 link_conf = ath12k_mac_get_link_bss_conf(arvif); 9206 if (!link_conf) { 9207 ath12k_warn(ar->ab, 9208 "failed to get bss link conf for vdev %d in RM handling\n", 9209 arvif->vdev_id); 9210 return -EINVAL; 9211 } 9212 9213 conf = wiphy_dereference(wiphy, link_conf->chanctx_conf); 9214 if (!conf) 9215 return -ENOENT; 9216 9217 cur_tx_power = link_conf->txpower; 9218 max_tx_power = min(conf->def.chan->max_reg_power, 9219 (int)ar->max_tx_power / 2); 9220 9221 ath12k_mac_op_get_txpower(hw, arvif->ahvif->vif, arvif->link_id, 9222 &cur_tx_power); 9223 9224 switch (action_code) { 9225 case WLAN_RM_ACTION_LINK_MEASUREMENT_REQUEST: 9226 /* need variable fields to be present in len */ 9227 if (remaining_len < 2) 9228 return -EINVAL; 9229 9230 /* Variable length format as defined in IEEE 802.11-2024, 9231 * Figure 9-1187-Link Measurement Request frame Action field 9232 * format. 9233 * Transmit Power | Max Tx Power 9234 * We fill both of these. 9235 */ 9236 *buf++ = cur_tx_power; 9237 *buf = max_tx_power; 9238 9239 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 9240 "RRM: Link Measurement Req dialog_token %u cur_tx_power %d max_tx_power %d\n", 9241 dialog_token, cur_tx_power, max_tx_power); 9242 break; 9243 case WLAN_RM_ACTION_LINK_MEASUREMENT_REPORT: 9244 /* need variable fields to be present in len */ 9245 if (remaining_len < 3) 9246 return -EINVAL; 9247 9248 /* Variable length format as defined in IEEE 802.11-2024, 9249 * Figure 9-1188-Link Measurement Report frame Action field format 9250 * TPC Report | Variable Fields 9251 * 9252 * TPC Report Format: 9253 * Element ID | Len | Tx Power | Link Margin 9254 * 9255 * We fill Tx power in the TPC Report (2nd index) 9256 */ 9257 buf[2] = cur_tx_power; 9258 9259 /* TODO: At present, Link margin data is not present so can't 9260 * really fill it now. Once it is available, it can be added 9261 * here 9262 */ 9263 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 9264 "RRM: Link Measurement Report dialog_token %u cur_tx_power %d\n", 9265 dialog_token, cur_tx_power); 9266 break; 9267 default: 9268 return -EINVAL; 9269 } 9270 break; 9271 default: 9272 /* nothing to fill */ 9273 return 0; 9274 } 9275 9276 return 0; 9277 } 9278 9279 static int ath12k_mac_mgmt_frame_fill_elem_data(struct ath12k_link_vif *arvif, 9280 struct sk_buff *skb) 9281 { 9282 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 9283 9284 if (!ieee80211_is_action(hdr->frame_control)) 9285 return 0; 9286 9287 return ath12k_mac_mgmt_action_frame_fill_elem_data(arvif, skb); 9288 } 9289 9290 static void ath12k_mgmt_over_wmi_tx_work(struct wiphy *wiphy, struct wiphy_work *work) 9291 { 9292 struct ath12k *ar = container_of(work, struct ath12k, wmi_mgmt_tx_work); 9293 struct ath12k_hw *ah = ar->ah; 9294 struct ath12k_skb_cb *skb_cb; 9295 struct ath12k_vif *ahvif; 9296 struct ath12k_link_vif *arvif; 9297 struct sk_buff *skb; 9298 int ret; 9299 9300 lockdep_assert_wiphy(wiphy); 9301 9302 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) { 9303 skb_cb = ATH12K_SKB_CB(skb); 9304 if (!skb_cb->vif) { 9305 ath12k_warn(ar->ab, "no vif found for mgmt frame\n"); 9306 ath12k_mgmt_over_wmi_tx_drop(ar, skb); 9307 continue; 9308 } 9309 9310 ahvif = ath12k_vif_to_ahvif(skb_cb->vif); 9311 if (!(ahvif->links_map & BIT(skb_cb->link_id))) { 9312 ath12k_warn(ar->ab, 9313 "invalid linkid %u in mgmt over wmi tx with linkmap 0x%x\n", 9314 skb_cb->link_id, ahvif->links_map); 9315 ath12k_mgmt_over_wmi_tx_drop(ar, skb); 9316 continue; 9317 } 9318 9319 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[skb_cb->link_id]); 9320 if (ar->allocated_vdev_map & (1LL << arvif->vdev_id)) { 9321 /* Fill in the data which is required to be filled by the driver 9322 * For example: Max Tx power in Link Measurement Request/Report 9323 */ 9324 ret = ath12k_mac_mgmt_frame_fill_elem_data(arvif, skb); 9325 if (ret) { 9326 /* If we couldn't fill the data due to any reason, 9327 * let's not discard transmitting the packet. 9328 * For example: Software crypto and PMF case 9329 */ 9330 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 9331 "Failed to fill the required data for the mgmt packet err %d\n", 9332 ret); 9333 } 9334 9335 ret = ath12k_mac_mgmt_tx_wmi(ar, arvif, skb); 9336 if (ret) { 9337 ath12k_warn(ar->ab, "failed to tx mgmt frame, vdev_id %d :%d\n", 9338 arvif->vdev_id, ret); 9339 ath12k_mgmt_over_wmi_tx_drop(ar, skb); 9340 } 9341 } else { 9342 ath12k_warn(ar->ab, 9343 "dropping mgmt frame for vdev %d link %u is_started %d\n", 9344 arvif->vdev_id, 9345 skb_cb->link_id, 9346 arvif->is_started); 9347 ath12k_mgmt_over_wmi_tx_drop(ar, skb); 9348 } 9349 } 9350 } 9351 9352 int ath12k_mac_mgmt_tx(struct ath12k *ar, struct sk_buff *skb, 9353 bool is_prb_rsp) 9354 { 9355 struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue; 9356 9357 if (test_bit(ATH12K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags)) 9358 return -ESHUTDOWN; 9359 9360 /* Drop probe response packets when the pending management tx 9361 * count has reached a certain threshold, so as to prioritize 9362 * other mgmt packets like auth and assoc to be sent on time 9363 * for establishing successful connections. 9364 */ 9365 if (is_prb_rsp && 9366 atomic_read(&ar->num_pending_mgmt_tx) > ATH12K_PRB_RSP_DROP_THRESHOLD) { 9367 ath12k_warn(ar->ab, 9368 "dropping probe response as pending queue is almost full\n"); 9369 return -ENOSPC; 9370 } 9371 9372 if (skb_queue_len_lockless(q) >= ATH12K_TX_MGMT_NUM_PENDING_MAX) { 9373 ath12k_warn(ar->ab, "mgmt tx queue is full\n"); 9374 return -ENOSPC; 9375 } 9376 9377 skb_queue_tail(q, skb); 9378 atomic_inc(&ar->num_pending_mgmt_tx); 9379 wiphy_work_queue(ath12k_ar_to_hw(ar)->wiphy, &ar->wmi_mgmt_tx_work); 9380 9381 return 0; 9382 } 9383 EXPORT_SYMBOL(ath12k_mac_mgmt_tx); 9384 9385 void ath12k_mac_add_p2p_noa_ie(struct ath12k *ar, 9386 struct ieee80211_vif *vif, 9387 struct sk_buff *skb, 9388 bool is_prb_rsp) 9389 { 9390 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 9391 9392 if (likely(!is_prb_rsp)) 9393 return; 9394 9395 spin_lock_bh(&ar->data_lock); 9396 9397 if (ahvif->u.ap.noa_data && 9398 !pskb_expand_head(skb, 0, ahvif->u.ap.noa_len, 9399 GFP_ATOMIC)) 9400 skb_put_data(skb, ahvif->u.ap.noa_data, 9401 ahvif->u.ap.noa_len); 9402 9403 spin_unlock_bh(&ar->data_lock); 9404 } 9405 EXPORT_SYMBOL(ath12k_mac_add_p2p_noa_ie); 9406 9407 /* Note: called under rcu_read_lock() */ 9408 void ath12k_mlo_mcast_update_tx_link_address(struct ieee80211_vif *vif, 9409 u8 link_id, struct sk_buff *skb, 9410 u32 info_flags) 9411 { 9412 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 9413 struct ieee80211_bss_conf *bss_conf; 9414 9415 if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP) 9416 return; 9417 9418 bss_conf = rcu_dereference(vif->link_conf[link_id]); 9419 if (bss_conf) 9420 ether_addr_copy(hdr->addr2, bss_conf->addr); 9421 } 9422 EXPORT_SYMBOL(ath12k_mlo_mcast_update_tx_link_address); 9423 9424 /* Note: called under rcu_read_lock() */ 9425 u8 ath12k_mac_get_tx_link(struct ieee80211_sta *sta, struct ieee80211_vif *vif, 9426 u8 link, struct sk_buff *skb, u32 info_flags) 9427 { 9428 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 9429 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 9430 struct ieee80211_link_sta *link_sta; 9431 struct ieee80211_bss_conf *bss_conf; 9432 struct ath12k_sta *ahsta; 9433 9434 /* Use the link id passed or the default vif link */ 9435 if (!sta) { 9436 if (link != IEEE80211_LINK_UNSPECIFIED) 9437 return link; 9438 9439 return ahvif->deflink.link_id; 9440 } 9441 9442 ahsta = ath12k_sta_to_ahsta(sta); 9443 9444 /* Below translation ensures we pass proper A2 & A3 for non ML clients. 9445 * Also it assumes for now support only for MLO AP in this path 9446 */ 9447 if (!sta->mlo) { 9448 link = ahsta->deflink.link_id; 9449 9450 if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP) 9451 return link; 9452 9453 bss_conf = rcu_dereference(vif->link_conf[link]); 9454 if (bss_conf) { 9455 ether_addr_copy(hdr->addr2, bss_conf->addr); 9456 if (!ieee80211_has_tods(hdr->frame_control) && 9457 !ieee80211_has_fromds(hdr->frame_control)) 9458 ether_addr_copy(hdr->addr3, bss_conf->addr); 9459 } 9460 9461 return link; 9462 } 9463 9464 /* enqueue eth enacap & data frames on primary link, FW does link 9465 * selection and address translation. 9466 */ 9467 if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP || 9468 ieee80211_is_data(hdr->frame_control)) 9469 return ahsta->assoc_link_id; 9470 9471 /* 802.11 frame cases */ 9472 if (link == IEEE80211_LINK_UNSPECIFIED) 9473 link = ahsta->deflink.link_id; 9474 9475 if (!ieee80211_is_mgmt(hdr->frame_control)) 9476 return link; 9477 9478 /* Perform address conversion for ML STA Tx */ 9479 bss_conf = rcu_dereference(vif->link_conf[link]); 9480 link_sta = rcu_dereference(sta->link[link]); 9481 9482 if (bss_conf && link_sta) { 9483 ether_addr_copy(hdr->addr1, link_sta->addr); 9484 ether_addr_copy(hdr->addr2, bss_conf->addr); 9485 9486 if (vif->type == NL80211_IFTYPE_STATION && bss_conf->bssid) 9487 ether_addr_copy(hdr->addr3, bss_conf->bssid); 9488 else if (vif->type == NL80211_IFTYPE_AP) 9489 ether_addr_copy(hdr->addr3, bss_conf->addr); 9490 9491 return link; 9492 } 9493 9494 if (bss_conf) { 9495 /* In certain cases where a ML sta associated and added subset of 9496 * links on which the ML AP is active, but now sends some frame 9497 * (ex. Probe request) on a different link which is active in our 9498 * MLD but was not added during previous association, we can 9499 * still honor the Tx to that ML STA via the requested link. 9500 * The control would reach here in such case only when that link 9501 * address is same as the MLD address or in worst case clients 9502 * used MLD address at TA wrongly which would have helped 9503 * identify the ML sta object and pass it here. 9504 * If the link address of that STA is different from MLD address, 9505 * then the sta object would be NULL and control won't reach 9506 * here but return at the start of the function itself with !sta 9507 * check. Also this would not need any translation at hdr->addr1 9508 * from MLD to link address since the RA is the MLD address 9509 * (same as that link address ideally) already. 9510 */ 9511 ether_addr_copy(hdr->addr2, bss_conf->addr); 9512 9513 if (vif->type == NL80211_IFTYPE_STATION && bss_conf->bssid) 9514 ether_addr_copy(hdr->addr3, bss_conf->bssid); 9515 else if (vif->type == NL80211_IFTYPE_AP) 9516 ether_addr_copy(hdr->addr3, bss_conf->addr); 9517 } 9518 9519 return link; 9520 } 9521 EXPORT_SYMBOL(ath12k_mac_get_tx_link); 9522 9523 void ath12k_mac_drain_tx(struct ath12k *ar) 9524 { 9525 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 9526 9527 /* make sure rcu-protected mac80211 tx path itself is drained */ 9528 synchronize_net(); 9529 9530 wiphy_work_cancel(ath12k_ar_to_hw(ar)->wiphy, &ar->wmi_mgmt_tx_work); 9531 ath12k_mgmt_over_wmi_tx_purge(ar); 9532 } 9533 9534 static int ath12k_mac_config_mon_status_default(struct ath12k *ar, bool enable) 9535 { 9536 struct htt_rx_ring_tlv_filter tlv_filter = {}; 9537 struct ath12k_base *ab = ar->ab; 9538 u32 ring_id, i; 9539 int ret = 0; 9540 9541 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 9542 9543 if (!ab->hw_params->rxdma1_enable) 9544 return ret; 9545 9546 if (enable) { 9547 tlv_filter = ath12k_mac_mon_status_filter_default; 9548 9549 if (ath12k_debugfs_rx_filter(ar)) 9550 tlv_filter.rx_filter = ath12k_debugfs_rx_filter(ar); 9551 } else { 9552 tlv_filter.rxmon_disable = true; 9553 } 9554 9555 for (i = 0; i < ab->hw_params->num_rxdma_per_pdev; i++) { 9556 ring_id = ar->dp.rxdma_mon_dst_ring[i].ring_id; 9557 ret = ath12k_dp_tx_htt_rx_filter_setup(ab, ring_id, 9558 ar->dp.mac_id + i, 9559 HAL_RXDMA_MONITOR_DST, 9560 DP_RXDMA_REFILL_RING_SIZE, 9561 &tlv_filter); 9562 if (ret) { 9563 ath12k_err(ab, 9564 "failed to setup filter for monitor buf %d\n", 9565 ret); 9566 } 9567 } 9568 9569 return ret; 9570 } 9571 9572 static int ath12k_mac_start(struct ath12k *ar) 9573 { 9574 struct ath12k_hw *ah = ar->ah; 9575 struct ath12k_base *ab = ar->ab; 9576 struct ath12k_pdev *pdev = ar->pdev; 9577 int ret; 9578 9579 lockdep_assert_held(&ah->hw_mutex); 9580 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 9581 9582 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_PMF_QOS, 9583 1, pdev->pdev_id); 9584 9585 if (ret) { 9586 ath12k_err(ab, "failed to enable PMF QOS: %d\n", ret); 9587 goto err; 9588 } 9589 9590 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_DYNAMIC_BW, 1, 9591 pdev->pdev_id); 9592 if (ret) { 9593 ath12k_err(ab, "failed to enable dynamic bw: %d\n", ret); 9594 goto err; 9595 } 9596 9597 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_ARP_AC_OVERRIDE, 9598 0, pdev->pdev_id); 9599 if (ret) { 9600 ath12k_err(ab, "failed to set ac override for ARP: %d\n", 9601 ret); 9602 goto err; 9603 } 9604 9605 ret = ath12k_wmi_send_dfs_phyerr_offload_enable_cmd(ar, pdev->pdev_id); 9606 if (ret) { 9607 ath12k_err(ab, "failed to offload radar detection: %d\n", 9608 ret); 9609 goto err; 9610 } 9611 9612 ret = ath12k_dp_tx_htt_h2t_ppdu_stats_req(ar, 9613 HTT_PPDU_STATS_TAG_DEFAULT); 9614 if (ret) { 9615 ath12k_err(ab, "failed to req ppdu stats: %d\n", ret); 9616 goto err; 9617 } 9618 9619 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_MESH_MCAST_ENABLE, 9620 1, pdev->pdev_id); 9621 9622 if (ret) { 9623 ath12k_err(ab, "failed to enable MESH MCAST ENABLE: (%d\n", ret); 9624 goto err; 9625 } 9626 9627 __ath12k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask); 9628 9629 /* TODO: Do we need to enable ANI? */ 9630 9631 ret = ath12k_reg_update_chan_list(ar, false); 9632 9633 /* The ar state alone can be turned off for non supported country 9634 * without returning the error value. As we need to update the channel 9635 * for the next ar. 9636 */ 9637 if (ret) { 9638 if (ret == -EINVAL) 9639 ret = 0; 9640 goto err; 9641 } 9642 9643 ar->num_started_vdevs = 0; 9644 ar->num_created_vdevs = 0; 9645 ar->num_peers = 0; 9646 ar->allocated_vdev_map = 0; 9647 ar->chan_tx_pwr = ATH12K_PDEV_TX_POWER_INVALID; 9648 9649 /* Configure monitor status ring with default rx_filter to get rx status 9650 * such as rssi, rx_duration. 9651 */ 9652 ret = ath12k_mac_config_mon_status_default(ar, true); 9653 if (ret && (ret != -EOPNOTSUPP)) { 9654 ath12k_err(ab, "failed to configure monitor status ring with default rx_filter: (%d)\n", 9655 ret); 9656 goto err; 9657 } 9658 9659 if (ret == -EOPNOTSUPP) 9660 ath12k_dbg(ab, ATH12K_DBG_MAC, 9661 "monitor status config is not yet supported"); 9662 9663 /* Configure the hash seed for hash based reo dest ring selection */ 9664 ath12k_wmi_pdev_lro_cfg(ar, ar->pdev->pdev_id); 9665 9666 /* allow device to enter IMPS */ 9667 if (ab->hw_params->idle_ps) { 9668 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_IDLE_PS_CONFIG, 9669 1, pdev->pdev_id); 9670 if (ret) { 9671 ath12k_err(ab, "failed to enable idle ps: %d\n", ret); 9672 goto err; 9673 } 9674 } 9675 9676 rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx], 9677 &ab->pdevs[ar->pdev_idx]); 9678 9679 return 0; 9680 err: 9681 9682 return ret; 9683 } 9684 9685 static void ath12k_drain_tx(struct ath12k_hw *ah) 9686 { 9687 struct ath12k *ar; 9688 int i; 9689 9690 lockdep_assert_wiphy(ah->hw->wiphy); 9691 9692 for_each_ar(ah, ar, i) 9693 ath12k_mac_drain_tx(ar); 9694 } 9695 9696 int ath12k_mac_op_start(struct ieee80211_hw *hw) 9697 { 9698 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 9699 struct ath12k *ar; 9700 int ret, i; 9701 9702 if (ath12k_ftm_mode) 9703 return -EPERM; 9704 9705 lockdep_assert_wiphy(hw->wiphy); 9706 9707 ath12k_drain_tx(ah); 9708 9709 guard(mutex)(&ah->hw_mutex); 9710 9711 switch (ah->state) { 9712 case ATH12K_HW_STATE_OFF: 9713 ah->state = ATH12K_HW_STATE_ON; 9714 break; 9715 case ATH12K_HW_STATE_RESTARTING: 9716 ah->state = ATH12K_HW_STATE_RESTARTED; 9717 break; 9718 case ATH12K_HW_STATE_RESTARTED: 9719 case ATH12K_HW_STATE_WEDGED: 9720 case ATH12K_HW_STATE_ON: 9721 case ATH12K_HW_STATE_TM: 9722 ah->state = ATH12K_HW_STATE_OFF; 9723 9724 WARN_ON(1); 9725 return -EINVAL; 9726 } 9727 9728 for_each_ar(ah, ar, i) { 9729 ret = ath12k_mac_start(ar); 9730 if (ret) { 9731 ah->state = ATH12K_HW_STATE_OFF; 9732 9733 ath12k_err(ar->ab, "fail to start mac operations in pdev idx %d ret %d\n", 9734 ar->pdev_idx, ret); 9735 goto fail_start; 9736 } 9737 } 9738 9739 return 0; 9740 9741 fail_start: 9742 for (; i > 0; i--) { 9743 ar = ath12k_ah_to_ar(ah, i - 1); 9744 ath12k_mac_stop(ar); 9745 } 9746 9747 return ret; 9748 } 9749 EXPORT_SYMBOL(ath12k_mac_op_start); 9750 9751 int ath12k_mac_rfkill_config(struct ath12k *ar) 9752 { 9753 struct ath12k_base *ab = ar->ab; 9754 u32 param; 9755 int ret; 9756 9757 if (ab->hw_params->rfkill_pin == 0) 9758 return -EOPNOTSUPP; 9759 9760 ath12k_dbg(ab, ATH12K_DBG_MAC, 9761 "mac rfkill_pin %d rfkill_cfg %d rfkill_on_level %d", 9762 ab->hw_params->rfkill_pin, ab->hw_params->rfkill_cfg, 9763 ab->hw_params->rfkill_on_level); 9764 9765 param = u32_encode_bits(ab->hw_params->rfkill_on_level, 9766 WMI_RFKILL_CFG_RADIO_LEVEL) | 9767 u32_encode_bits(ab->hw_params->rfkill_pin, 9768 WMI_RFKILL_CFG_GPIO_PIN_NUM) | 9769 u32_encode_bits(ab->hw_params->rfkill_cfg, 9770 WMI_RFKILL_CFG_PIN_AS_GPIO); 9771 9772 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_HW_RFKILL_CONFIG, 9773 param, ar->pdev->pdev_id); 9774 if (ret) { 9775 ath12k_warn(ab, 9776 "failed to set rfkill config 0x%x: %d\n", 9777 param, ret); 9778 return ret; 9779 } 9780 9781 return 0; 9782 } 9783 9784 int ath12k_mac_rfkill_enable_radio(struct ath12k *ar, bool enable) 9785 { 9786 enum wmi_rfkill_enable_radio param; 9787 int ret; 9788 9789 if (enable) 9790 param = WMI_RFKILL_ENABLE_RADIO_ON; 9791 else 9792 param = WMI_RFKILL_ENABLE_RADIO_OFF; 9793 9794 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac %d rfkill enable %d", 9795 ar->pdev_idx, param); 9796 9797 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RFKILL_ENABLE, 9798 param, ar->pdev->pdev_id); 9799 if (ret) { 9800 ath12k_warn(ar->ab, "failed to set rfkill enable param %d: %d\n", 9801 param, ret); 9802 return ret; 9803 } 9804 9805 return 0; 9806 } 9807 9808 static void ath12k_mac_stop(struct ath12k *ar) 9809 { 9810 struct ath12k_pdev_dp *dp_pdev = &ar->dp; 9811 struct ath12k_hw *ah = ar->ah; 9812 struct htt_ppdu_stats_info *ppdu_stats, *tmp; 9813 struct ath12k_wmi_scan_chan_list_arg *arg; 9814 int ret; 9815 9816 lockdep_assert_held(&ah->hw_mutex); 9817 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 9818 9819 ret = ath12k_mac_config_mon_status_default(ar, false); 9820 if (ret && (ret != -EOPNOTSUPP)) 9821 ath12k_err(ar->ab, "failed to clear rx_filter for monitor status ring: (%d)\n", 9822 ret); 9823 9824 clear_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags); 9825 9826 cancel_delayed_work_sync(&ar->scan.timeout); 9827 wiphy_work_cancel(ath12k_ar_to_hw(ar)->wiphy, &ar->scan.vdev_clean_wk); 9828 cancel_work_sync(&ar->regd_channel_update_work); 9829 cancel_work_sync(&ar->regd_update_work); 9830 cancel_work_sync(&ar->ab->rfkill_work); 9831 cancel_work_sync(&ar->ab->update_11d_work); 9832 ar->state_11d = ATH12K_11D_IDLE; 9833 complete(&ar->completed_11d_scan); 9834 9835 spin_lock_bh(&dp_pdev->ppdu_list_lock); 9836 list_for_each_entry_safe(ppdu_stats, tmp, &dp_pdev->ppdu_stats_info, list) { 9837 list_del(&ppdu_stats->list); 9838 kfree(ppdu_stats); 9839 } 9840 spin_unlock_bh(&dp_pdev->ppdu_list_lock); 9841 9842 spin_lock_bh(&ar->data_lock); 9843 while ((arg = list_first_entry_or_null(&ar->regd_channel_update_queue, 9844 struct ath12k_wmi_scan_chan_list_arg, 9845 list))) { 9846 list_del(&arg->list); 9847 kfree(arg); 9848 } 9849 spin_unlock_bh(&ar->data_lock); 9850 9851 rcu_assign_pointer(ar->ab->pdevs_active[ar->pdev_idx], NULL); 9852 9853 synchronize_rcu(); 9854 9855 atomic_set(&ar->num_pending_mgmt_tx, 0); 9856 } 9857 9858 void ath12k_mac_op_stop(struct ieee80211_hw *hw, bool suspend) 9859 { 9860 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 9861 struct ath12k *ar; 9862 int i; 9863 9864 lockdep_assert_wiphy(hw->wiphy); 9865 9866 ath12k_drain_tx(ah); 9867 9868 mutex_lock(&ah->hw_mutex); 9869 9870 ah->state = ATH12K_HW_STATE_OFF; 9871 9872 for_each_ar(ah, ar, i) 9873 ath12k_mac_stop(ar); 9874 9875 mutex_unlock(&ah->hw_mutex); 9876 } 9877 EXPORT_SYMBOL(ath12k_mac_op_stop); 9878 9879 static u8 9880 ath12k_mac_get_vdev_stats_id(struct ath12k_link_vif *arvif) 9881 { 9882 struct ath12k_base *ab = arvif->ar->ab; 9883 u8 vdev_stats_id = 0; 9884 9885 do { 9886 if (ab->free_vdev_stats_id_map & (1LL << vdev_stats_id)) { 9887 vdev_stats_id++; 9888 if (vdev_stats_id >= ATH12K_MAX_VDEV_STATS_ID) { 9889 vdev_stats_id = ATH12K_INVAL_VDEV_STATS_ID; 9890 break; 9891 } 9892 } else { 9893 ab->free_vdev_stats_id_map |= (1LL << vdev_stats_id); 9894 break; 9895 } 9896 } while (vdev_stats_id); 9897 9898 arvif->vdev_stats_id = vdev_stats_id; 9899 return vdev_stats_id; 9900 } 9901 9902 static int ath12k_mac_setup_vdev_params_mbssid(struct ath12k_link_vif *arvif, 9903 u32 *flags, u32 *tx_vdev_id) 9904 { 9905 struct ath12k_vif *ahvif = arvif->ahvif; 9906 struct ieee80211_bss_conf *link_conf; 9907 struct ath12k *ar = arvif->ar; 9908 struct ath12k_link_vif *tx_arvif; 9909 9910 link_conf = ath12k_mac_get_link_bss_conf(arvif); 9911 if (!link_conf) { 9912 ath12k_warn(ar->ab, "unable to access bss link conf in set mbssid params for vif %pM link %u\n", 9913 ahvif->vif->addr, arvif->link_id); 9914 return -ENOLINK; 9915 } 9916 9917 tx_arvif = ath12k_mac_get_tx_arvif(arvif, link_conf); 9918 if (!tx_arvif) 9919 return 0; 9920 9921 if (link_conf->nontransmitted) { 9922 if (ath12k_ar_to_hw(ar)->wiphy != 9923 ath12k_ar_to_hw(tx_arvif->ar)->wiphy) 9924 return -EINVAL; 9925 9926 *flags = WMI_VDEV_MBSSID_FLAGS_NON_TRANSMIT_AP; 9927 *tx_vdev_id = tx_arvif->vdev_id; 9928 } else if (tx_arvif == arvif) { 9929 *flags = WMI_VDEV_MBSSID_FLAGS_TRANSMIT_AP; 9930 } else { 9931 return -EINVAL; 9932 } 9933 9934 if (link_conf->ema_ap) 9935 *flags |= WMI_VDEV_MBSSID_FLAGS_EMA_MODE; 9936 9937 return 0; 9938 } 9939 9940 static int ath12k_mac_setup_vdev_create_arg(struct ath12k_link_vif *arvif, 9941 struct ath12k_wmi_vdev_create_arg *arg) 9942 { 9943 struct ath12k *ar = arvif->ar; 9944 struct ath12k_pdev *pdev = ar->pdev; 9945 struct ath12k_vif *ahvif = arvif->ahvif; 9946 int ret; 9947 9948 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 9949 9950 arg->if_id = arvif->vdev_id; 9951 arg->type = ahvif->vdev_type; 9952 arg->subtype = ahvif->vdev_subtype; 9953 arg->pdev_id = pdev->pdev_id; 9954 9955 arg->mbssid_flags = WMI_VDEV_MBSSID_FLAGS_NON_MBSSID_AP; 9956 arg->mbssid_tx_vdev_id = 0; 9957 if (!test_bit(WMI_TLV_SERVICE_MBSS_PARAM_IN_VDEV_START_SUPPORT, 9958 ar->ab->wmi_ab.svc_map)) { 9959 ret = ath12k_mac_setup_vdev_params_mbssid(arvif, 9960 &arg->mbssid_flags, 9961 &arg->mbssid_tx_vdev_id); 9962 if (ret) 9963 return ret; 9964 } 9965 9966 if (pdev->cap.supported_bands & WMI_HOST_WLAN_2GHZ_CAP) { 9967 arg->chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains; 9968 arg->chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains; 9969 } 9970 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5GHZ_CAP) { 9971 arg->chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains; 9972 arg->chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains; 9973 } 9974 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5GHZ_CAP && 9975 ar->supports_6ghz) { 9976 arg->chains[NL80211_BAND_6GHZ].tx = ar->num_tx_chains; 9977 arg->chains[NL80211_BAND_6GHZ].rx = ar->num_rx_chains; 9978 } 9979 9980 arg->if_stats_id = ath12k_mac_get_vdev_stats_id(arvif); 9981 9982 if (ath12k_mac_is_ml_arvif(arvif)) { 9983 if (hweight16(ahvif->vif->valid_links) > ATH12K_WMI_MLO_MAX_LINKS) { 9984 ath12k_warn(ar->ab, "too many MLO links during setting up vdev: %d", 9985 ahvif->vif->valid_links); 9986 return -EINVAL; 9987 } 9988 9989 ether_addr_copy(arg->mld_addr, ahvif->vif->addr); 9990 } 9991 9992 return 0; 9993 } 9994 9995 static void ath12k_mac_update_vif_offload(struct ath12k_link_vif *arvif) 9996 { 9997 struct ath12k_vif *ahvif = arvif->ahvif; 9998 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif); 9999 struct ath12k *ar = arvif->ar; 10000 struct ath12k_base *ab = ar->ab; 10001 u32 param_id, param_value; 10002 int ret; 10003 10004 param_id = WMI_VDEV_PARAM_TX_ENCAP_TYPE; 10005 if (vif->type != NL80211_IFTYPE_STATION && 10006 vif->type != NL80211_IFTYPE_AP) 10007 vif->offload_flags &= ~(IEEE80211_OFFLOAD_ENCAP_ENABLED | 10008 IEEE80211_OFFLOAD_DECAP_ENABLED); 10009 10010 if (vif->offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED) 10011 ahvif->dp_vif.tx_encap_type = ATH12K_HW_TXRX_ETHERNET; 10012 else if (test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags)) 10013 ahvif->dp_vif.tx_encap_type = ATH12K_HW_TXRX_RAW; 10014 else 10015 ahvif->dp_vif.tx_encap_type = ATH12K_HW_TXRX_NATIVE_WIFI; 10016 10017 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 10018 param_id, ahvif->dp_vif.tx_encap_type); 10019 if (ret) { 10020 ath12k_warn(ab, "failed to set vdev %d tx encap mode: %d\n", 10021 arvif->vdev_id, ret); 10022 vif->offload_flags &= ~IEEE80211_OFFLOAD_ENCAP_ENABLED; 10023 } 10024 10025 param_id = WMI_VDEV_PARAM_RX_DECAP_TYPE; 10026 if (vif->offload_flags & IEEE80211_OFFLOAD_DECAP_ENABLED) 10027 param_value = ATH12K_HW_TXRX_ETHERNET; 10028 else if (test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags)) 10029 param_value = ATH12K_HW_TXRX_RAW; 10030 else 10031 param_value = ATH12K_HW_TXRX_NATIVE_WIFI; 10032 10033 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 10034 param_id, param_value); 10035 if (ret) { 10036 ath12k_warn(ab, "failed to set vdev %d rx decap mode: %d\n", 10037 arvif->vdev_id, ret); 10038 vif->offload_flags &= ~IEEE80211_OFFLOAD_DECAP_ENABLED; 10039 } 10040 } 10041 10042 void ath12k_mac_op_update_vif_offload(struct ieee80211_hw *hw, 10043 struct ieee80211_vif *vif) 10044 { 10045 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 10046 struct ath12k_link_vif *arvif; 10047 unsigned long links; 10048 int link_id; 10049 10050 lockdep_assert_wiphy(hw->wiphy); 10051 10052 if (vif->valid_links) { 10053 links = vif->valid_links; 10054 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) { 10055 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 10056 if (!(arvif && arvif->ar)) 10057 continue; 10058 10059 ath12k_mac_update_vif_offload(arvif); 10060 } 10061 10062 return; 10063 } 10064 10065 ath12k_mac_update_vif_offload(&ahvif->deflink); 10066 } 10067 EXPORT_SYMBOL(ath12k_mac_op_update_vif_offload); 10068 10069 static bool ath12k_mac_vif_ap_active_any(struct ath12k_base *ab) 10070 { 10071 struct ath12k *ar; 10072 struct ath12k_pdev *pdev; 10073 struct ath12k_link_vif *arvif; 10074 int i; 10075 10076 for (i = 0; i < ab->num_radios; i++) { 10077 pdev = &ab->pdevs[i]; 10078 ar = pdev->ar; 10079 list_for_each_entry(arvif, &ar->arvifs, list) { 10080 if (arvif->is_up && 10081 arvif->ahvif->vdev_type == WMI_VDEV_TYPE_AP) 10082 return true; 10083 } 10084 } 10085 return false; 10086 } 10087 10088 void ath12k_mac_11d_scan_start(struct ath12k *ar, u32 vdev_id) 10089 { 10090 struct wmi_11d_scan_start_arg arg; 10091 int ret; 10092 10093 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 10094 10095 if (ar->regdom_set_by_user) 10096 goto fin; 10097 10098 if (ar->vdev_id_11d_scan != ATH12K_11D_INVALID_VDEV_ID) 10099 goto fin; 10100 10101 if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map)) 10102 goto fin; 10103 10104 if (ath12k_mac_vif_ap_active_any(ar->ab)) 10105 goto fin; 10106 10107 arg.vdev_id = vdev_id; 10108 arg.start_interval_msec = 0; 10109 arg.scan_period_msec = ATH12K_SCAN_11D_INTERVAL; 10110 10111 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 10112 "mac start 11d scan for vdev %d\n", vdev_id); 10113 10114 ret = ath12k_wmi_send_11d_scan_start_cmd(ar, &arg); 10115 if (ret) { 10116 ath12k_warn(ar->ab, "failed to start 11d scan vdev %d ret: %d\n", 10117 vdev_id, ret); 10118 } else { 10119 ar->vdev_id_11d_scan = vdev_id; 10120 if (ar->state_11d == ATH12K_11D_PREPARING) 10121 ar->state_11d = ATH12K_11D_RUNNING; 10122 } 10123 10124 fin: 10125 if (ar->state_11d == ATH12K_11D_PREPARING) { 10126 ar->state_11d = ATH12K_11D_IDLE; 10127 complete(&ar->completed_11d_scan); 10128 } 10129 } 10130 10131 void ath12k_mac_11d_scan_stop(struct ath12k *ar) 10132 { 10133 int ret; 10134 u32 vdev_id; 10135 10136 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 10137 10138 if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map)) 10139 return; 10140 10141 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac stop 11d for vdev %d\n", 10142 ar->vdev_id_11d_scan); 10143 10144 if (ar->state_11d == ATH12K_11D_PREPARING) { 10145 ar->state_11d = ATH12K_11D_IDLE; 10146 complete(&ar->completed_11d_scan); 10147 } 10148 10149 if (ar->vdev_id_11d_scan != ATH12K_11D_INVALID_VDEV_ID) { 10150 vdev_id = ar->vdev_id_11d_scan; 10151 10152 ret = ath12k_wmi_send_11d_scan_stop_cmd(ar, vdev_id); 10153 if (ret) { 10154 ath12k_warn(ar->ab, 10155 "failed to stopt 11d scan vdev %d ret: %d\n", 10156 vdev_id, ret); 10157 } else { 10158 ar->vdev_id_11d_scan = ATH12K_11D_INVALID_VDEV_ID; 10159 ar->state_11d = ATH12K_11D_IDLE; 10160 complete(&ar->completed_11d_scan); 10161 } 10162 } 10163 } 10164 10165 void ath12k_mac_11d_scan_stop_all(struct ath12k_base *ab) 10166 { 10167 struct ath12k *ar; 10168 struct ath12k_pdev *pdev; 10169 int i; 10170 10171 ath12k_dbg(ab, ATH12K_DBG_MAC, "mac stop soc 11d scan\n"); 10172 10173 for (i = 0; i < ab->num_radios; i++) { 10174 pdev = &ab->pdevs[i]; 10175 ar = pdev->ar; 10176 10177 ath12k_mac_11d_scan_stop(ar); 10178 } 10179 } 10180 10181 static void ath12k_mac_determine_vdev_type(struct ieee80211_vif *vif, 10182 struct ath12k_vif *ahvif) 10183 { 10184 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE; 10185 10186 switch (vif->type) { 10187 case NL80211_IFTYPE_UNSPECIFIED: 10188 case NL80211_IFTYPE_STATION: 10189 ahvif->vdev_type = WMI_VDEV_TYPE_STA; 10190 10191 if (vif->p2p) 10192 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_CLIENT; 10193 10194 break; 10195 case NL80211_IFTYPE_MESH_POINT: 10196 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_MESH_11S; 10197 fallthrough; 10198 case NL80211_IFTYPE_AP: 10199 ahvif->vdev_type = WMI_VDEV_TYPE_AP; 10200 10201 if (vif->p2p) 10202 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO; 10203 10204 break; 10205 case NL80211_IFTYPE_MONITOR: 10206 ahvif->vdev_type = WMI_VDEV_TYPE_MONITOR; 10207 break; 10208 case NL80211_IFTYPE_P2P_DEVICE: 10209 ahvif->vdev_type = WMI_VDEV_TYPE_STA; 10210 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE; 10211 break; 10212 default: 10213 WARN_ON(1); 10214 break; 10215 } 10216 } 10217 10218 int ath12k_mac_vdev_create(struct ath12k *ar, struct ath12k_link_vif *arvif) 10219 { 10220 struct ath12k_hw *ah = ar->ah; 10221 struct ath12k_base *ab = ar->ab; 10222 struct ieee80211_hw *hw = ah->hw; 10223 struct ath12k_vif *ahvif = arvif->ahvif; 10224 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif); 10225 struct ath12k_wmi_vdev_create_arg vdev_arg = {}; 10226 struct ath12k_wmi_peer_create_arg peer_param = {}; 10227 struct ieee80211_bss_conf *link_conf = NULL; 10228 u32 param_id, param_value; 10229 u16 nss; 10230 int i; 10231 int ret, vdev_id; 10232 u8 link_id; 10233 struct ath12k_dp_link_vif *dp_link_vif = NULL; 10234 struct ath12k_dp_peer_create_params params = {}; 10235 bool dp_peer_created = false; 10236 10237 lockdep_assert_wiphy(hw->wiphy); 10238 10239 /* In NO_VIRTUAL_MONITOR, its necessary to restrict only one monitor 10240 * interface in each radio 10241 */ 10242 if (vif->type == NL80211_IFTYPE_MONITOR && ar->monitor_vdev_created) 10243 return -EINVAL; 10244 10245 if (ar->num_created_vdevs >= TARGET_NUM_VDEVS(ab)) { 10246 ath12k_warn(ab, "failed to create vdev, reached max vdev limit %d\n", 10247 TARGET_NUM_VDEVS(ab)); 10248 return -ENOSPC; 10249 } 10250 10251 link_id = arvif->link_id; 10252 10253 if (link_id < IEEE80211_MLD_MAX_NUM_LINKS) { 10254 link_conf = wiphy_dereference(hw->wiphy, vif->link_conf[link_id]); 10255 if (!link_conf) { 10256 ath12k_warn(ar->ab, "unable to access bss link conf in vdev create for vif %pM link %u\n", 10257 vif->addr, arvif->link_id); 10258 return -ENOLINK; 10259 } 10260 } 10261 10262 if (link_conf) 10263 memcpy(arvif->bssid, link_conf->addr, ETH_ALEN); 10264 else 10265 memcpy(arvif->bssid, vif->addr, ETH_ALEN); 10266 10267 arvif->ar = ar; 10268 vdev_id = __ffs64(ab->free_vdev_map); 10269 arvif->vdev_id = vdev_id; 10270 if (vif->type == NL80211_IFTYPE_MONITOR) 10271 ar->monitor_vdev_id = vdev_id; 10272 10273 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev create id %d type %d subtype %d map %llx\n", 10274 arvif->vdev_id, ahvif->vdev_type, ahvif->vdev_subtype, 10275 ab->free_vdev_map); 10276 10277 vif->cab_queue = arvif->vdev_id % (ATH12K_HW_MAX_QUEUES - 1); 10278 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++) 10279 vif->hw_queue[i] = i % (ATH12K_HW_MAX_QUEUES - 1); 10280 10281 ret = ath12k_mac_setup_vdev_create_arg(arvif, &vdev_arg); 10282 if (ret) { 10283 ath12k_warn(ab, "failed to create vdev parameters %d: %d\n", 10284 arvif->vdev_id, ret); 10285 goto err; 10286 } 10287 10288 ret = ath12k_wmi_vdev_create(ar, arvif->bssid, &vdev_arg); 10289 if (ret) { 10290 ath12k_warn(ab, "failed to create WMI vdev %d: %d\n", 10291 arvif->vdev_id, ret); 10292 return ret; 10293 } 10294 10295 ar->num_created_vdevs++; 10296 arvif->is_created = true; 10297 ath12k_dbg(ab, ATH12K_DBG_MAC, "vdev %pM created, vdev_id %d\n", 10298 vif->addr, arvif->vdev_id); 10299 ar->allocated_vdev_map |= 1LL << arvif->vdev_id; 10300 ab->free_vdev_map &= ~(1LL << arvif->vdev_id); 10301 10302 spin_lock_bh(&ar->data_lock); 10303 list_add(&arvif->list, &ar->arvifs); 10304 spin_unlock_bh(&ar->data_lock); 10305 10306 ath12k_mac_update_vif_offload(arvif); 10307 10308 nss = hweight32(ar->cfg_tx_chainmask) ? : 1; 10309 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 10310 WMI_VDEV_PARAM_NSS, nss); 10311 if (ret) { 10312 ath12k_warn(ab, "failed to set vdev %d chainmask 0x%x, nss %d :%d\n", 10313 arvif->vdev_id, ar->cfg_tx_chainmask, nss, ret); 10314 goto err_vdev_del; 10315 } 10316 10317 dp_link_vif = ath12k_dp_vif_to_dp_link_vif(&ahvif->dp_vif, arvif->link_id); 10318 10319 dp_link_vif->vdev_id = arvif->vdev_id; 10320 dp_link_vif->lmac_id = ar->lmac_id; 10321 dp_link_vif->pdev_idx = ar->pdev_idx; 10322 10323 switch (ahvif->vdev_type) { 10324 case WMI_VDEV_TYPE_AP: 10325 params.ucast_ra_only = true; 10326 10327 if (arvif->link_id < IEEE80211_MLD_MAX_NUM_LINKS) { 10328 ret = ath12k_dp_peer_create(&ah->dp_hw, arvif->bssid, ¶ms); 10329 if (ret) { 10330 ath12k_warn(ab, "failed to vdev %d create dp_peer for AP: %d\n", 10331 arvif->vdev_id, ret); 10332 goto err_vdev_del; 10333 } 10334 dp_peer_created = true; 10335 } 10336 10337 peer_param.vdev_id = arvif->vdev_id; 10338 peer_param.peer_addr = arvif->bssid; 10339 peer_param.peer_type = WMI_PEER_TYPE_DEFAULT; 10340 ret = ath12k_peer_create(ar, arvif, NULL, &peer_param); 10341 if (ret) { 10342 ath12k_warn(ab, "failed to vdev %d create peer for AP: %d\n", 10343 arvif->vdev_id, ret); 10344 goto err_dp_peer_del; 10345 } 10346 10347 ret = ath12k_mac_set_kickout(arvif); 10348 if (ret) { 10349 ath12k_warn(ar->ab, "failed to set vdev %i kickout parameters: %d\n", 10350 arvif->vdev_id, ret); 10351 goto err_peer_del; 10352 } 10353 ath12k_mac_11d_scan_stop_all(ar->ab); 10354 break; 10355 case WMI_VDEV_TYPE_STA: 10356 param_id = WMI_STA_PS_PARAM_RX_WAKE_POLICY; 10357 param_value = WMI_STA_PS_RX_WAKE_POLICY_WAKE; 10358 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, 10359 param_id, param_value); 10360 if (ret) { 10361 ath12k_warn(ar->ab, "failed to set vdev %d RX wake policy: %d\n", 10362 arvif->vdev_id, ret); 10363 goto err_peer_del; 10364 } 10365 10366 param_id = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD; 10367 param_value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS; 10368 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, 10369 param_id, param_value); 10370 if (ret) { 10371 ath12k_warn(ar->ab, "failed to set vdev %d TX wake threshold: %d\n", 10372 arvif->vdev_id, ret); 10373 goto err_peer_del; 10374 } 10375 10376 param_id = WMI_STA_PS_PARAM_PSPOLL_COUNT; 10377 param_value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX; 10378 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, 10379 param_id, param_value); 10380 if (ret) { 10381 ath12k_warn(ar->ab, "failed to set vdev %d pspoll count: %d\n", 10382 arvif->vdev_id, ret); 10383 goto err_peer_del; 10384 } 10385 10386 ret = ath12k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, false); 10387 if (ret) { 10388 ath12k_warn(ar->ab, "failed to disable vdev %d ps mode: %d\n", 10389 arvif->vdev_id, ret); 10390 goto err_peer_del; 10391 } 10392 10393 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ab->wmi_ab.svc_map) && 10394 ahvif->vdev_type == WMI_VDEV_TYPE_STA && 10395 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) { 10396 reinit_completion(&ar->completed_11d_scan); 10397 ar->state_11d = ATH12K_11D_PREPARING; 10398 } 10399 break; 10400 case WMI_VDEV_TYPE_MONITOR: 10401 ar->monitor_vdev_created = true; 10402 break; 10403 default: 10404 break; 10405 } 10406 10407 if (link_conf) 10408 arvif->txpower = link_conf->txpower; 10409 else 10410 arvif->txpower = NL80211_TX_POWER_AUTOMATIC; 10411 10412 ret = ath12k_mac_txpower_recalc(ar); 10413 if (ret) 10414 goto err_peer_del; 10415 10416 param_id = WMI_VDEV_PARAM_RTS_THRESHOLD; 10417 param_value = hw->wiphy->rts_threshold; 10418 ar->rts_threshold = param_value; 10419 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 10420 param_id, param_value); 10421 if (ret) { 10422 ath12k_warn(ar->ab, "failed to set rts threshold for vdev %d: %d\n", 10423 arvif->vdev_id, ret); 10424 } 10425 10426 ath12k_dp_vdev_tx_attach(ar, arvif); 10427 10428 return ret; 10429 10430 err_peer_del: 10431 if (ahvif->vdev_type == WMI_VDEV_TYPE_AP) { 10432 reinit_completion(&ar->peer_delete_done); 10433 10434 ret = ath12k_wmi_send_peer_delete_cmd(ar, arvif->bssid, 10435 arvif->vdev_id); 10436 if (ret) { 10437 ath12k_warn(ar->ab, "failed to delete peer vdev_id %d addr %pM\n", 10438 arvif->vdev_id, arvif->bssid); 10439 goto err; 10440 } 10441 10442 ret = ath12k_wait_for_peer_delete_done(ar, arvif->vdev_id, 10443 arvif->bssid); 10444 if (ret) 10445 goto err_vdev_del; 10446 10447 ar->num_peers--; 10448 } 10449 10450 err_dp_peer_del: 10451 if (dp_peer_created) 10452 ath12k_dp_peer_delete(&ah->dp_hw, arvif->bssid, NULL); 10453 10454 err_vdev_del: 10455 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { 10456 ar->monitor_vdev_id = -1; 10457 ar->monitor_vdev_created = false; 10458 } 10459 10460 ath12k_wmi_vdev_delete(ar, arvif->vdev_id); 10461 ar->num_created_vdevs--; 10462 arvif->is_created = false; 10463 arvif->ar = NULL; 10464 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id); 10465 ab->free_vdev_map |= 1LL << arvif->vdev_id; 10466 ab->free_vdev_stats_id_map &= ~(1LL << arvif->vdev_stats_id); 10467 spin_lock_bh(&ar->data_lock); 10468 list_del(&arvif->list); 10469 spin_unlock_bh(&ar->data_lock); 10470 10471 err: 10472 arvif->ar = NULL; 10473 return ret; 10474 } 10475 10476 static void ath12k_mac_vif_flush_key_cache(struct ath12k_link_vif *arvif) 10477 { 10478 struct ath12k_key_conf *key_conf, *tmp; 10479 struct ath12k_vif *ahvif = arvif->ahvif; 10480 struct ath12k_hw *ah = ahvif->ah; 10481 struct ath12k_sta *ahsta; 10482 struct ath12k_link_sta *arsta; 10483 struct ath12k_vif_cache *cache = ahvif->cache[arvif->link_id]; 10484 int ret; 10485 10486 lockdep_assert_wiphy(ah->hw->wiphy); 10487 10488 list_for_each_entry_safe(key_conf, tmp, &cache->key_conf.list, list) { 10489 arsta = NULL; 10490 if (key_conf->sta) { 10491 ahsta = ath12k_sta_to_ahsta(key_conf->sta); 10492 arsta = wiphy_dereference(ah->hw->wiphy, 10493 ahsta->link[arvif->link_id]); 10494 if (!arsta) 10495 goto free_cache; 10496 } 10497 10498 ret = ath12k_mac_set_key(arvif->ar, key_conf->cmd, 10499 arvif, arsta, 10500 key_conf->key); 10501 if (ret) 10502 ath12k_warn(arvif->ar->ab, "unable to apply set key param to vdev %d ret %d\n", 10503 arvif->vdev_id, ret); 10504 free_cache: 10505 list_del(&key_conf->list); 10506 kfree(key_conf); 10507 } 10508 } 10509 10510 static void ath12k_mac_vif_cache_flush(struct ath12k *ar, struct ath12k_link_vif *arvif) 10511 { 10512 struct ath12k_vif *ahvif = arvif->ahvif; 10513 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif); 10514 struct ath12k_vif_cache *cache = ahvif->cache[arvif->link_id]; 10515 struct ath12k_base *ab = ar->ab; 10516 struct ieee80211_bss_conf *link_conf; 10517 10518 int ret; 10519 10520 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 10521 10522 if (!cache) 10523 return; 10524 10525 if (cache->tx_conf.changed) { 10526 ret = ath12k_mac_conf_tx(arvif, cache->tx_conf.ac, 10527 &cache->tx_conf.tx_queue_params); 10528 if (ret) 10529 ath12k_warn(ab, 10530 "unable to apply tx config parameters to vdev %d\n", 10531 ret); 10532 } 10533 10534 if (cache->bss_conf_changed) { 10535 link_conf = ath12k_mac_get_link_bss_conf(arvif); 10536 if (!link_conf) { 10537 ath12k_warn(ar->ab, "unable to access bss link conf in cache flush for vif %pM link %u\n", 10538 vif->addr, arvif->link_id); 10539 return; 10540 } 10541 ath12k_mac_bss_info_changed(ar, arvif, link_conf, 10542 cache->bss_conf_changed); 10543 } 10544 10545 if (!list_empty(&cache->key_conf.list)) 10546 ath12k_mac_vif_flush_key_cache(arvif); 10547 10548 ath12k_ahvif_put_link_cache(ahvif, arvif->link_id); 10549 } 10550 10551 static struct ath12k *ath12k_mac_assign_vif_to_vdev(struct ieee80211_hw *hw, 10552 struct ath12k_link_vif *arvif, 10553 struct ieee80211_chanctx_conf *ctx) 10554 { 10555 struct ath12k_vif *ahvif = arvif->ahvif; 10556 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif); 10557 struct ath12k_link_vif *scan_arvif; 10558 struct ath12k_hw *ah = hw->priv; 10559 struct ath12k *ar; 10560 struct ath12k_base *ab; 10561 u8 link_id = arvif->link_id, scan_link_id; 10562 unsigned long scan_link_map; 10563 int ret; 10564 10565 lockdep_assert_wiphy(hw->wiphy); 10566 10567 if (ah->num_radio == 1) 10568 ar = ah->radio; 10569 else if (ctx) 10570 ar = ath12k_get_ar_by_ctx(hw, ctx); 10571 else 10572 return NULL; 10573 10574 if (!ar) 10575 return NULL; 10576 10577 /* cleanup the scan vdev if we are done scan on that ar 10578 * and now we want to create for actual usage. 10579 */ 10580 if (ieee80211_vif_is_mld(vif)) { 10581 scan_link_map = ahvif->links_map & ATH12K_SCAN_LINKS_MASK; 10582 for_each_set_bit(scan_link_id, &scan_link_map, ATH12K_NUM_MAX_LINKS) { 10583 scan_arvif = wiphy_dereference(hw->wiphy, 10584 ahvif->link[scan_link_id]); 10585 if (scan_arvif && scan_arvif->ar == ar) { 10586 ar->scan.arvif = NULL; 10587 ath12k_mac_remove_link_interface(hw, scan_arvif); 10588 ath12k_mac_unassign_link_vif(scan_arvif); 10589 break; 10590 } 10591 } 10592 } 10593 10594 if (arvif->ar) { 10595 /* This is not expected really */ 10596 if (WARN_ON(!arvif->is_created)) { 10597 arvif->ar = NULL; 10598 return NULL; 10599 } 10600 10601 if (ah->num_radio == 1) 10602 return arvif->ar; 10603 10604 /* This can happen as scan vdev gets created during multiple scans 10605 * across different radios before a vdev is brought up in 10606 * a certain radio. 10607 */ 10608 if (ar != arvif->ar) { 10609 if (WARN_ON(arvif->is_started)) 10610 return NULL; 10611 10612 ath12k_mac_remove_link_interface(hw, arvif); 10613 ath12k_mac_unassign_link_vif(arvif); 10614 } 10615 } 10616 10617 ab = ar->ab; 10618 10619 /* Assign arvif again here since previous radio switch block 10620 * would've unassigned and cleared it. 10621 */ 10622 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id); 10623 if (vif->type == NL80211_IFTYPE_AP && 10624 ar->num_peers > (ar->max_num_peers - 1)) { 10625 ath12k_warn(ab, "failed to create vdev due to insufficient peer entry resource in firmware\n"); 10626 goto unlock; 10627 } 10628 10629 if (arvif->is_created) 10630 goto flush; 10631 10632 ret = ath12k_mac_vdev_create(ar, arvif); 10633 if (ret) { 10634 ath12k_warn(ab, "failed to create vdev %pM ret %d", vif->addr, ret); 10635 goto unlock; 10636 } 10637 10638 flush: 10639 /* If the vdev is created during channel assign and not during 10640 * add_interface(), Apply any parameters for the vdev which were received 10641 * after add_interface, corresponding to this vif. 10642 */ 10643 ath12k_mac_vif_cache_flush(ar, arvif); 10644 unlock: 10645 return arvif->ar; 10646 } 10647 10648 int ath12k_mac_op_add_interface(struct ieee80211_hw *hw, 10649 struct ieee80211_vif *vif) 10650 { 10651 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 10652 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 10653 struct ath12k_reg_info *reg_info; 10654 struct ath12k_link_vif *arvif; 10655 struct ath12k_base *ab; 10656 struct ath12k *ar; 10657 int i; 10658 10659 lockdep_assert_wiphy(hw->wiphy); 10660 10661 memset(ahvif, 0, sizeof(*ahvif)); 10662 10663 ahvif->ah = ah; 10664 ahvif->vif = vif; 10665 arvif = &ahvif->deflink; 10666 10667 ath12k_mac_init_arvif(ahvif, arvif, -1); 10668 10669 /* Allocate Default Queue now and reassign during actual vdev create */ 10670 vif->cab_queue = ATH12K_HW_DEFAULT_QUEUE; 10671 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++) 10672 vif->hw_queue[i] = ATH12K_HW_DEFAULT_QUEUE; 10673 10674 vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD; 10675 10676 ath12k_mac_determine_vdev_type(vif, ahvif); 10677 10678 for_each_ar(ah, ar, i) { 10679 if (!ath12k_wmi_supports_6ghz_cc_ext(ar)) 10680 continue; 10681 10682 ab = ar->ab; 10683 reg_info = ab->reg_info[ar->pdev_idx]; 10684 ath12k_dbg(ab, ATH12K_DBG_MAC, "interface added to change reg rules\n"); 10685 ah->regd_updated = false; 10686 ath12k_reg_handle_chan_list(ab, reg_info, ahvif->vdev_type, 10687 IEEE80211_REG_UNSET_AP); 10688 break; 10689 } 10690 10691 /* Defer vdev creation until assign_chanctx or hw_scan is initiated as driver 10692 * will not know if this interface is an ML vif at this point. 10693 */ 10694 return 0; 10695 } 10696 EXPORT_SYMBOL(ath12k_mac_op_add_interface); 10697 10698 static void ath12k_mac_vif_unref(struct ath12k_dp *dp, struct ieee80211_vif *vif) 10699 { 10700 struct ath12k_tx_desc_info *tx_desc_info; 10701 struct ath12k_skb_cb *skb_cb; 10702 struct sk_buff *skb; 10703 int i; 10704 10705 for (i = 0; i < ATH12K_HW_MAX_QUEUES; i++) { 10706 spin_lock_bh(&dp->tx_desc_lock[i]); 10707 10708 list_for_each_entry(tx_desc_info, &dp->tx_desc_used_list[i], 10709 list) { 10710 skb = tx_desc_info->skb; 10711 if (!skb) 10712 continue; 10713 10714 skb_cb = ATH12K_SKB_CB(skb); 10715 if (skb_cb->vif == vif) 10716 skb_cb->vif = NULL; 10717 } 10718 10719 spin_unlock_bh(&dp->tx_desc_lock[i]); 10720 } 10721 } 10722 10723 static int ath12k_mac_vdev_delete(struct ath12k *ar, struct ath12k_link_vif *arvif) 10724 { 10725 struct ath12k_vif *ahvif = arvif->ahvif; 10726 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif); 10727 struct ath12k_dp_link_vif *dp_link_vif; 10728 struct ath12k_base *ab = ar->ab; 10729 unsigned long time_left; 10730 int ret; 10731 10732 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 10733 10734 reinit_completion(&ar->vdev_delete_done); 10735 10736 ret = ath12k_wmi_vdev_delete(ar, arvif->vdev_id); 10737 if (ret) { 10738 ath12k_warn(ab, "failed to delete WMI vdev %d: %d\n", 10739 arvif->vdev_id, ret); 10740 goto err_vdev_del; 10741 } 10742 10743 time_left = wait_for_completion_timeout(&ar->vdev_delete_done, 10744 ATH12K_VDEV_DELETE_TIMEOUT_HZ); 10745 if (time_left == 0) { 10746 ath12k_warn(ab, "Timeout in receiving vdev delete response\n"); 10747 goto err_vdev_del; 10748 } 10749 10750 ab->free_vdev_map |= 1LL << arvif->vdev_id; 10751 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id); 10752 ar->num_created_vdevs--; 10753 10754 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { 10755 ar->monitor_vdev_id = -1; 10756 ar->monitor_vdev_created = false; 10757 } 10758 10759 ath12k_dbg(ab, ATH12K_DBG_MAC, "vdev %pM deleted, vdev_id %d\n", 10760 vif->addr, arvif->vdev_id); 10761 10762 err_vdev_del: 10763 spin_lock_bh(&ar->data_lock); 10764 list_del(&arvif->list); 10765 spin_unlock_bh(&ar->data_lock); 10766 10767 ath12k_peer_cleanup(ar, arvif->vdev_id); 10768 ath12k_ahvif_put_link_cache(ahvif, arvif->link_id); 10769 10770 idr_for_each(&ar->txmgmt_idr, 10771 ath12k_mac_vif_txmgmt_idr_remove, vif); 10772 10773 ath12k_mac_vif_unref(ath12k_ab_to_dp(ab), vif); 10774 10775 dp_link_vif = ath12k_dp_vif_to_dp_link_vif(&ahvif->dp_vif, arvif->link_id); 10776 ath12k_dp_tx_put_bank_profile(ath12k_ab_to_dp(ab), dp_link_vif->bank_id); 10777 10778 /* Recalc txpower for remaining vdev */ 10779 ath12k_mac_txpower_recalc(ar); 10780 10781 /* TODO: recal traffic pause state based on the available vdevs */ 10782 arvif->is_created = false; 10783 arvif->ar = NULL; 10784 10785 return ret; 10786 } 10787 10788 void ath12k_mac_op_remove_interface(struct ieee80211_hw *hw, 10789 struct ieee80211_vif *vif) 10790 { 10791 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 10792 struct ath12k_link_vif *arvif; 10793 struct ath12k *ar; 10794 u8 link_id; 10795 10796 lockdep_assert_wiphy(hw->wiphy); 10797 10798 for (link_id = 0; link_id < ATH12K_NUM_MAX_LINKS; link_id++) { 10799 /* if we cached some config but never received assign chanctx, 10800 * free the allocated cache. 10801 */ 10802 ath12k_ahvif_put_link_cache(ahvif, link_id); 10803 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 10804 if (!arvif || !arvif->is_created) 10805 continue; 10806 10807 ar = arvif->ar; 10808 10809 /* Scan abortion is in progress since before this, cancel_hw_scan() 10810 * is expected to be executed. Since link is anyways going to be removed 10811 * now, just cancel the worker and send the scan aborted to user space 10812 */ 10813 if (ar->scan.arvif == arvif) { 10814 wiphy_work_cancel(hw->wiphy, &ar->scan.vdev_clean_wk); 10815 10816 spin_lock_bh(&ar->data_lock); 10817 ar->scan.arvif = NULL; 10818 if (!ar->scan.is_roc) { 10819 struct cfg80211_scan_info info = { 10820 .aborted = true, 10821 }; 10822 10823 ath12k_mac_scan_send_complete(ar, &info); 10824 } 10825 10826 ar->scan.state = ATH12K_SCAN_IDLE; 10827 ar->scan_channel = NULL; 10828 ar->scan.roc_freq = 0; 10829 spin_unlock_bh(&ar->data_lock); 10830 } 10831 10832 ath12k_mac_remove_link_interface(hw, arvif); 10833 ath12k_mac_unassign_link_vif(arvif); 10834 } 10835 } 10836 EXPORT_SYMBOL(ath12k_mac_op_remove_interface); 10837 10838 /* FIXME: Has to be verified. */ 10839 #define SUPPORTED_FILTERS \ 10840 (FIF_ALLMULTI | \ 10841 FIF_CONTROL | \ 10842 FIF_PSPOLL | \ 10843 FIF_OTHER_BSS | \ 10844 FIF_BCN_PRBRESP_PROMISC | \ 10845 FIF_PROBE_REQ | \ 10846 FIF_FCSFAIL) 10847 10848 void ath12k_mac_op_configure_filter(struct ieee80211_hw *hw, 10849 unsigned int changed_flags, 10850 unsigned int *total_flags, 10851 u64 multicast) 10852 { 10853 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 10854 struct ath12k *ar; 10855 10856 lockdep_assert_wiphy(hw->wiphy); 10857 10858 ar = ath12k_ah_to_ar(ah, 0); 10859 10860 *total_flags &= SUPPORTED_FILTERS; 10861 ar->filter_flags = *total_flags; 10862 } 10863 EXPORT_SYMBOL(ath12k_mac_op_configure_filter); 10864 10865 int ath12k_mac_op_get_antenna(struct ieee80211_hw *hw, int radio_idx, 10866 u32 *tx_ant, u32 *rx_ant) 10867 { 10868 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 10869 int antennas_rx = 0, antennas_tx = 0; 10870 struct ath12k *ar; 10871 int i; 10872 10873 lockdep_assert_wiphy(hw->wiphy); 10874 10875 for_each_ar(ah, ar, i) { 10876 antennas_rx = max_t(u32, antennas_rx, ar->cfg_rx_chainmask); 10877 antennas_tx = max_t(u32, antennas_tx, ar->cfg_tx_chainmask); 10878 } 10879 10880 *tx_ant = antennas_tx; 10881 *rx_ant = antennas_rx; 10882 10883 return 0; 10884 } 10885 EXPORT_SYMBOL(ath12k_mac_op_get_antenna); 10886 10887 int ath12k_mac_op_set_antenna(struct ieee80211_hw *hw, int radio_idx, 10888 u32 tx_ant, u32 rx_ant) 10889 { 10890 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 10891 struct ath12k *ar; 10892 int ret = 0; 10893 int i; 10894 10895 lockdep_assert_wiphy(hw->wiphy); 10896 10897 for_each_ar(ah, ar, i) { 10898 ret = __ath12k_set_antenna(ar, tx_ant, rx_ant); 10899 if (ret) 10900 break; 10901 } 10902 10903 return ret; 10904 } 10905 EXPORT_SYMBOL(ath12k_mac_op_set_antenna); 10906 10907 static int ath12k_mac_ampdu_action(struct ieee80211_hw *hw, 10908 struct ieee80211_vif *vif, 10909 struct ieee80211_ampdu_params *params, 10910 u8 link_id) 10911 { 10912 struct ath12k *ar; 10913 int ret = -EINVAL; 10914 10915 lockdep_assert_wiphy(hw->wiphy); 10916 10917 ar = ath12k_get_ar_by_vif(hw, vif, link_id); 10918 if (!ar) 10919 return -EINVAL; 10920 10921 switch (params->action) { 10922 case IEEE80211_AMPDU_RX_START: 10923 ret = ath12k_dp_rx_ampdu_start(ar, params, link_id); 10924 break; 10925 case IEEE80211_AMPDU_RX_STOP: 10926 ret = ath12k_dp_rx_ampdu_stop(ar, params, link_id); 10927 break; 10928 case IEEE80211_AMPDU_TX_START: 10929 case IEEE80211_AMPDU_TX_STOP_CONT: 10930 case IEEE80211_AMPDU_TX_STOP_FLUSH: 10931 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT: 10932 case IEEE80211_AMPDU_TX_OPERATIONAL: 10933 /* Tx A-MPDU aggregation offloaded to hw/fw so deny mac80211 10934 * Tx aggregation requests. 10935 */ 10936 ret = -EOPNOTSUPP; 10937 break; 10938 } 10939 10940 if (ret) 10941 ath12k_warn(ar->ab, "unable to perform ampdu action %d for vif %pM link %u ret %d\n", 10942 params->action, vif->addr, link_id, ret); 10943 10944 return ret; 10945 } 10946 10947 int ath12k_mac_op_ampdu_action(struct ieee80211_hw *hw, 10948 struct ieee80211_vif *vif, 10949 struct ieee80211_ampdu_params *params) 10950 { 10951 struct ieee80211_sta *sta = params->sta; 10952 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta); 10953 unsigned long links_map = ahsta->links_map; 10954 int ret = -EINVAL; 10955 u8 link_id; 10956 10957 lockdep_assert_wiphy(hw->wiphy); 10958 10959 if (WARN_ON(!links_map)) 10960 return ret; 10961 10962 for_each_set_bit(link_id, &links_map, IEEE80211_MLD_MAX_NUM_LINKS) { 10963 ret = ath12k_mac_ampdu_action(hw, vif, params, link_id); 10964 if (ret) 10965 return ret; 10966 } 10967 10968 return 0; 10969 } 10970 EXPORT_SYMBOL(ath12k_mac_op_ampdu_action); 10971 10972 int ath12k_mac_op_add_chanctx(struct ieee80211_hw *hw, 10973 struct ieee80211_chanctx_conf *ctx) 10974 { 10975 struct ath12k *ar; 10976 struct ath12k_base *ab; 10977 10978 lockdep_assert_wiphy(hw->wiphy); 10979 10980 ar = ath12k_get_ar_by_ctx(hw, ctx); 10981 if (!ar) 10982 return -EINVAL; 10983 10984 ab = ar->ab; 10985 10986 ath12k_dbg(ab, ATH12K_DBG_MAC, 10987 "mac chanctx add freq %u width %d ptr %p\n", 10988 ctx->def.chan->center_freq, ctx->def.width, ctx); 10989 10990 spin_lock_bh(&ar->data_lock); 10991 /* TODO: In case of multiple channel context, populate rx_channel from 10992 * Rx PPDU desc information. 10993 */ 10994 ar->rx_channel = ctx->def.chan; 10995 spin_unlock_bh(&ar->data_lock); 10996 ar->chan_tx_pwr = ATH12K_PDEV_TX_POWER_INVALID; 10997 10998 return 0; 10999 } 11000 EXPORT_SYMBOL(ath12k_mac_op_add_chanctx); 11001 11002 void ath12k_mac_op_remove_chanctx(struct ieee80211_hw *hw, 11003 struct ieee80211_chanctx_conf *ctx) 11004 { 11005 struct ath12k *ar; 11006 struct ath12k_base *ab; 11007 11008 lockdep_assert_wiphy(hw->wiphy); 11009 11010 ar = ath12k_get_ar_by_ctx(hw, ctx); 11011 if (!ar) 11012 return; 11013 11014 ab = ar->ab; 11015 11016 ath12k_dbg(ab, ATH12K_DBG_MAC, 11017 "mac chanctx remove freq %u width %d ptr %p\n", 11018 ctx->def.chan->center_freq, ctx->def.width, ctx); 11019 11020 spin_lock_bh(&ar->data_lock); 11021 /* TODO: In case of there is one more channel context left, populate 11022 * rx_channel with the channel of that remaining channel context. 11023 */ 11024 ar->rx_channel = NULL; 11025 spin_unlock_bh(&ar->data_lock); 11026 ar->chan_tx_pwr = ATH12K_PDEV_TX_POWER_INVALID; 11027 } 11028 EXPORT_SYMBOL(ath12k_mac_op_remove_chanctx); 11029 11030 static enum wmi_phy_mode 11031 ath12k_mac_check_down_grade_phy_mode(struct ath12k *ar, 11032 enum wmi_phy_mode mode, 11033 enum nl80211_band band, 11034 enum nl80211_iftype type) 11035 { 11036 struct ieee80211_sta_eht_cap *eht_cap = NULL; 11037 enum wmi_phy_mode down_mode; 11038 int n = ar->mac.sbands[band].n_iftype_data; 11039 int i; 11040 struct ieee80211_sband_iftype_data *data; 11041 11042 if (mode < MODE_11BE_EHT20) 11043 return mode; 11044 11045 data = ar->mac.iftype[band]; 11046 for (i = 0; i < n; i++) { 11047 if (data[i].types_mask & BIT(type)) { 11048 eht_cap = &data[i].eht_cap; 11049 break; 11050 } 11051 } 11052 11053 if (eht_cap && eht_cap->has_eht) 11054 return mode; 11055 11056 switch (mode) { 11057 case MODE_11BE_EHT20: 11058 down_mode = MODE_11AX_HE20; 11059 break; 11060 case MODE_11BE_EHT40: 11061 down_mode = MODE_11AX_HE40; 11062 break; 11063 case MODE_11BE_EHT80: 11064 down_mode = MODE_11AX_HE80; 11065 break; 11066 case MODE_11BE_EHT80_80: 11067 down_mode = MODE_11AX_HE80_80; 11068 break; 11069 case MODE_11BE_EHT160: 11070 case MODE_11BE_EHT160_160: 11071 case MODE_11BE_EHT320: 11072 down_mode = MODE_11AX_HE160; 11073 break; 11074 case MODE_11BE_EHT20_2G: 11075 down_mode = MODE_11AX_HE20_2G; 11076 break; 11077 case MODE_11BE_EHT40_2G: 11078 down_mode = MODE_11AX_HE40_2G; 11079 break; 11080 default: 11081 down_mode = mode; 11082 break; 11083 } 11084 11085 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 11086 "mac vdev start phymode %s downgrade to %s\n", 11087 ath12k_mac_phymode_str(mode), 11088 ath12k_mac_phymode_str(down_mode)); 11089 11090 return down_mode; 11091 } 11092 11093 static void 11094 ath12k_mac_mlo_get_vdev_args(struct ath12k_link_vif *arvif, 11095 struct wmi_ml_arg *ml_arg) 11096 { 11097 struct ath12k_vif *ahvif = arvif->ahvif; 11098 struct wmi_ml_partner_info *partner_info; 11099 struct ieee80211_bss_conf *link_conf; 11100 struct ath12k_link_vif *arvif_p; 11101 unsigned long links; 11102 u8 link_id; 11103 11104 lockdep_assert_wiphy(ahvif->ah->hw->wiphy); 11105 11106 if (!ath12k_mac_is_ml_arvif(arvif)) 11107 return; 11108 11109 if (hweight16(ahvif->vif->valid_links) > ATH12K_WMI_MLO_MAX_LINKS) 11110 return; 11111 11112 ml_arg->enabled = true; 11113 11114 /* Driver always add a new link via VDEV START, FW takes 11115 * care of internally adding this link to existing 11116 * link vdevs which are advertised as partners below 11117 */ 11118 ml_arg->link_add = true; 11119 11120 ml_arg->assoc_link = arvif->is_sta_assoc_link; 11121 11122 partner_info = ml_arg->partner_info; 11123 11124 links = ahvif->links_map; 11125 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) { 11126 arvif_p = wiphy_dereference(ahvif->ah->hw->wiphy, ahvif->link[link_id]); 11127 11128 if (WARN_ON(!arvif_p)) 11129 continue; 11130 11131 if (arvif == arvif_p) 11132 continue; 11133 11134 if (!arvif_p->is_started) 11135 continue; 11136 11137 link_conf = wiphy_dereference(ahvif->ah->hw->wiphy, 11138 ahvif->vif->link_conf[arvif_p->link_id]); 11139 11140 if (!link_conf) 11141 continue; 11142 11143 partner_info->vdev_id = arvif_p->vdev_id; 11144 partner_info->hw_link_id = arvif_p->ar->pdev->hw_link_id; 11145 ether_addr_copy(partner_info->addr, link_conf->addr); 11146 ml_arg->num_partner_links++; 11147 partner_info++; 11148 } 11149 } 11150 11151 static int 11152 ath12k_mac_vdev_start_restart(struct ath12k_link_vif *arvif, 11153 struct ieee80211_chanctx_conf *ctx, 11154 bool restart) 11155 { 11156 struct ath12k *ar = arvif->ar; 11157 struct ath12k_base *ab = ar->ab; 11158 struct wmi_vdev_start_req_arg arg = {}; 11159 const struct cfg80211_chan_def *chandef = &ctx->def; 11160 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar); 11161 struct ath12k_vif *ahvif = arvif->ahvif; 11162 struct ieee80211_bss_conf *link_conf; 11163 unsigned int dfs_cac_time; 11164 int ret; 11165 11166 lockdep_assert_wiphy(hw->wiphy); 11167 11168 link_conf = ath12k_mac_get_link_bss_conf(arvif); 11169 if (!link_conf) { 11170 ath12k_warn(ar->ab, "unable to access bss link conf in vdev start for vif %pM link %u\n", 11171 ahvif->vif->addr, arvif->link_id); 11172 return -ENOLINK; 11173 } 11174 11175 reinit_completion(&ar->vdev_setup_done); 11176 11177 arg.vdev_id = arvif->vdev_id; 11178 arg.dtim_period = arvif->dtim_period; 11179 arg.bcn_intval = arvif->beacon_interval; 11180 arg.punct_bitmap = ~arvif->punct_bitmap; 11181 11182 arg.freq = chandef->chan->center_freq; 11183 arg.band_center_freq1 = chandef->center_freq1; 11184 arg.band_center_freq2 = chandef->center_freq2; 11185 arg.mode = ath12k_phymodes[chandef->chan->band][chandef->width]; 11186 11187 arg.mode = ath12k_mac_check_down_grade_phy_mode(ar, arg.mode, 11188 chandef->chan->band, 11189 ahvif->vif->type); 11190 arg.min_power = 0; 11191 arg.max_power = chandef->chan->max_power; 11192 arg.max_reg_power = chandef->chan->max_reg_power; 11193 arg.max_antenna_gain = chandef->chan->max_antenna_gain; 11194 11195 arg.pref_tx_streams = ar->num_tx_chains; 11196 arg.pref_rx_streams = ar->num_rx_chains; 11197 11198 arg.mbssid_flags = WMI_VDEV_MBSSID_FLAGS_NON_MBSSID_AP; 11199 arg.mbssid_tx_vdev_id = 0; 11200 if (test_bit(WMI_TLV_SERVICE_MBSS_PARAM_IN_VDEV_START_SUPPORT, 11201 ar->ab->wmi_ab.svc_map)) { 11202 ret = ath12k_mac_setup_vdev_params_mbssid(arvif, 11203 &arg.mbssid_flags, 11204 &arg.mbssid_tx_vdev_id); 11205 if (ret) 11206 return ret; 11207 } 11208 11209 if (ahvif->vdev_type == WMI_VDEV_TYPE_AP) { 11210 arg.ssid = ahvif->u.ap.ssid; 11211 arg.ssid_len = ahvif->u.ap.ssid_len; 11212 arg.hidden_ssid = ahvif->u.ap.hidden_ssid; 11213 11214 /* For now allow DFS for AP mode */ 11215 arg.chan_radar = !!(chandef->chan->flags & IEEE80211_CHAN_RADAR); 11216 11217 arg.freq2_radar = ctx->radar_enabled; 11218 11219 arg.passive = arg.chan_radar; 11220 11221 spin_lock_bh(&ab->base_lock); 11222 arg.regdomain = ar->ab->dfs_region; 11223 spin_unlock_bh(&ab->base_lock); 11224 11225 /* TODO: Notify if secondary 80Mhz also needs radar detection */ 11226 } 11227 11228 arg.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR); 11229 11230 if (!restart) 11231 ath12k_mac_mlo_get_vdev_args(arvif, &arg.ml); 11232 11233 ath12k_dbg(ab, ATH12K_DBG_MAC, 11234 "mac vdev %d start center_freq %d phymode %s punct_bitmap 0x%x\n", 11235 arg.vdev_id, arg.freq, 11236 ath12k_mac_phymode_str(arg.mode), arg.punct_bitmap); 11237 11238 ret = ath12k_wmi_vdev_start(ar, &arg, restart); 11239 if (ret) { 11240 ath12k_warn(ar->ab, "failed to %s WMI vdev %i\n", 11241 restart ? "restart" : "start", arg.vdev_id); 11242 return ret; 11243 } 11244 11245 ret = ath12k_mac_vdev_setup_sync(ar); 11246 if (ret) { 11247 ath12k_warn(ab, "failed to synchronize setup for vdev %i %s: %d\n", 11248 arg.vdev_id, restart ? "restart" : "start", ret); 11249 return ret; 11250 } 11251 11252 /* TODO: For now we only set TPC power here. However when 11253 * channel changes, say CSA, it should be updated again. 11254 */ 11255 if (ath12k_mac_supports_tpc(ar, ahvif, chandef)) { 11256 ath12k_mac_fill_reg_tpc_info(ar, arvif, ctx); 11257 ath12k_wmi_send_vdev_set_tpc_power(ar, arvif->vdev_id, 11258 &arvif->reg_tpc_info); 11259 } 11260 11261 ar->num_started_vdevs++; 11262 ath12k_dbg(ab, ATH12K_DBG_MAC, "vdev %pM started, vdev_id %d\n", 11263 ahvif->vif->addr, arvif->vdev_id); 11264 11265 /* Enable CAC Running Flag in the driver by checking all sub-channel's DFS 11266 * state as NL80211_DFS_USABLE which indicates CAC needs to be 11267 * done before channel usage. This flag is used to drop rx packets. 11268 * during CAC. 11269 */ 11270 /* TODO: Set the flag for other interface types as required */ 11271 if (arvif->ahvif->vdev_type == WMI_VDEV_TYPE_AP && ctx->radar_enabled && 11272 cfg80211_chandef_dfs_usable(hw->wiphy, chandef)) { 11273 set_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags); 11274 dfs_cac_time = cfg80211_chandef_dfs_cac_time(hw->wiphy, chandef); 11275 11276 ath12k_dbg(ab, ATH12K_DBG_MAC, 11277 "CAC started dfs_cac_time %u center_freq %d center_freq1 %d for vdev %d\n", 11278 dfs_cac_time, arg.freq, arg.band_center_freq1, arg.vdev_id); 11279 } 11280 11281 ret = ath12k_mac_set_txbf_conf(arvif); 11282 if (ret) 11283 ath12k_warn(ab, "failed to set txbf conf for vdev %d: %d\n", 11284 arvif->vdev_id, ret); 11285 11286 return 0; 11287 } 11288 11289 static int ath12k_mac_vdev_start(struct ath12k_link_vif *arvif, 11290 struct ieee80211_chanctx_conf *ctx) 11291 { 11292 return ath12k_mac_vdev_start_restart(arvif, ctx, false); 11293 } 11294 11295 static int ath12k_mac_vdev_restart(struct ath12k_link_vif *arvif, 11296 struct ieee80211_chanctx_conf *ctx) 11297 { 11298 return ath12k_mac_vdev_start_restart(arvif, ctx, true); 11299 } 11300 11301 struct ath12k_mac_change_chanctx_arg { 11302 struct ieee80211_chanctx_conf *ctx; 11303 struct ieee80211_vif_chanctx_switch *vifs; 11304 int n_vifs; 11305 int next_vif; 11306 struct ath12k *ar; 11307 }; 11308 11309 static void 11310 ath12k_mac_change_chanctx_cnt_iter(void *data, u8 *mac, 11311 struct ieee80211_vif *vif) 11312 { 11313 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 11314 struct ath12k_mac_change_chanctx_arg *arg = data; 11315 struct ieee80211_bss_conf *link_conf; 11316 struct ath12k_link_vif *arvif; 11317 unsigned long links_map; 11318 u8 link_id; 11319 11320 lockdep_assert_wiphy(ahvif->ah->hw->wiphy); 11321 11322 links_map = ahvif->links_map; 11323 for_each_set_bit(link_id, &links_map, IEEE80211_MLD_MAX_NUM_LINKS) { 11324 arvif = wiphy_dereference(ahvif->ah->hw->wiphy, ahvif->link[link_id]); 11325 if (WARN_ON(!arvif)) 11326 continue; 11327 11328 if (!arvif->is_created || arvif->ar != arg->ar) 11329 continue; 11330 11331 link_conf = wiphy_dereference(ahvif->ah->hw->wiphy, 11332 vif->link_conf[link_id]); 11333 if (WARN_ON(!link_conf)) 11334 continue; 11335 11336 if (rcu_access_pointer(link_conf->chanctx_conf) != arg->ctx) 11337 continue; 11338 11339 arg->n_vifs++; 11340 } 11341 } 11342 11343 static void 11344 ath12k_mac_change_chanctx_fill_iter(void *data, u8 *mac, 11345 struct ieee80211_vif *vif) 11346 { 11347 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 11348 struct ath12k_mac_change_chanctx_arg *arg = data; 11349 struct ieee80211_bss_conf *link_conf; 11350 struct ieee80211_chanctx_conf *ctx; 11351 struct ath12k_link_vif *arvif; 11352 unsigned long links_map; 11353 u8 link_id; 11354 11355 lockdep_assert_wiphy(ahvif->ah->hw->wiphy); 11356 11357 links_map = ahvif->links_map; 11358 for_each_set_bit(link_id, &links_map, IEEE80211_MLD_MAX_NUM_LINKS) { 11359 arvif = wiphy_dereference(ahvif->ah->hw->wiphy, ahvif->link[link_id]); 11360 if (WARN_ON(!arvif)) 11361 continue; 11362 11363 if (!arvif->is_created || arvif->ar != arg->ar) 11364 continue; 11365 11366 link_conf = wiphy_dereference(ahvif->ah->hw->wiphy, 11367 vif->link_conf[arvif->link_id]); 11368 if (WARN_ON(!link_conf)) 11369 continue; 11370 11371 ctx = rcu_access_pointer(link_conf->chanctx_conf); 11372 if (ctx != arg->ctx) 11373 continue; 11374 11375 if (WARN_ON(arg->next_vif == arg->n_vifs)) 11376 return; 11377 11378 arg->vifs[arg->next_vif].vif = vif; 11379 arg->vifs[arg->next_vif].old_ctx = ctx; 11380 arg->vifs[arg->next_vif].new_ctx = ctx; 11381 arg->vifs[arg->next_vif].link_conf = link_conf; 11382 arg->next_vif++; 11383 } 11384 } 11385 11386 static u32 ath12k_mac_nlwidth_to_wmiwidth(enum nl80211_chan_width width) 11387 { 11388 switch (width) { 11389 case NL80211_CHAN_WIDTH_20: 11390 return WMI_CHAN_WIDTH_20; 11391 case NL80211_CHAN_WIDTH_40: 11392 return WMI_CHAN_WIDTH_40; 11393 case NL80211_CHAN_WIDTH_80: 11394 return WMI_CHAN_WIDTH_80; 11395 case NL80211_CHAN_WIDTH_160: 11396 return WMI_CHAN_WIDTH_160; 11397 case NL80211_CHAN_WIDTH_80P80: 11398 return WMI_CHAN_WIDTH_80P80; 11399 case NL80211_CHAN_WIDTH_5: 11400 return WMI_CHAN_WIDTH_5; 11401 case NL80211_CHAN_WIDTH_10: 11402 return WMI_CHAN_WIDTH_10; 11403 case NL80211_CHAN_WIDTH_320: 11404 return WMI_CHAN_WIDTH_320; 11405 default: 11406 WARN_ON(1); 11407 return WMI_CHAN_WIDTH_20; 11408 } 11409 } 11410 11411 static int ath12k_mac_update_peer_puncturing_width(struct ath12k *ar, 11412 struct ath12k_link_vif *arvif, 11413 struct cfg80211_chan_def def) 11414 { 11415 u32 param_id, param_value; 11416 int ret; 11417 11418 if (arvif->ahvif->vdev_type != WMI_VDEV_TYPE_STA) 11419 return 0; 11420 11421 param_id = WMI_PEER_CHWIDTH_PUNCTURE_20MHZ_BITMAP; 11422 param_value = ath12k_mac_nlwidth_to_wmiwidth(def.width) | 11423 u32_encode_bits((~def.punctured), 11424 WMI_PEER_PUNCTURE_BITMAP); 11425 11426 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 11427 "punctured bitmap %02x width %d vdev %d\n", 11428 def.punctured, def.width, arvif->vdev_id); 11429 11430 ret = ath12k_wmi_set_peer_param(ar, arvif->bssid, 11431 arvif->vdev_id, param_id, 11432 param_value); 11433 11434 return ret; 11435 } 11436 11437 static void 11438 ath12k_mac_update_vif_chan(struct ath12k *ar, 11439 struct ieee80211_vif_chanctx_switch *vifs, 11440 int n_vifs) 11441 { 11442 struct ath12k_wmi_vdev_up_params params = {}; 11443 struct ieee80211_bss_conf *link_conf; 11444 struct ath12k_base *ab = ar->ab; 11445 struct ath12k_link_vif *arvif; 11446 struct ieee80211_vif *vif; 11447 struct ath12k_vif *ahvif; 11448 u8 link_id; 11449 int ret; 11450 int i; 11451 bool monitor_vif = false; 11452 11453 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 11454 11455 for (i = 0; i < n_vifs; i++) { 11456 vif = vifs[i].vif; 11457 ahvif = ath12k_vif_to_ahvif(vif); 11458 link_conf = vifs[i].link_conf; 11459 link_id = link_conf->link_id; 11460 arvif = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy, 11461 ahvif->link[link_id]); 11462 11463 if (vif->type == NL80211_IFTYPE_MONITOR) { 11464 monitor_vif = true; 11465 continue; 11466 } 11467 11468 ath12k_dbg(ab, ATH12K_DBG_MAC, 11469 "mac chanctx switch vdev_id %i freq %u->%u width %d->%d\n", 11470 arvif->vdev_id, 11471 vifs[i].old_ctx->def.chan->center_freq, 11472 vifs[i].new_ctx->def.chan->center_freq, 11473 vifs[i].old_ctx->def.width, 11474 vifs[i].new_ctx->def.width); 11475 11476 if (WARN_ON(!arvif->is_started)) 11477 continue; 11478 11479 arvif->punct_bitmap = vifs[i].new_ctx->def.punctured; 11480 11481 /* Firmware expect vdev_restart only if vdev is up. 11482 * If vdev is down then it expect vdev_stop->vdev_start. 11483 */ 11484 if (arvif->is_up) { 11485 ret = ath12k_mac_vdev_restart(arvif, vifs[i].new_ctx); 11486 if (ret) { 11487 ath12k_warn(ab, "failed to restart vdev %d: %d\n", 11488 arvif->vdev_id, ret); 11489 continue; 11490 } 11491 } else { 11492 ret = ath12k_mac_vdev_stop(arvif); 11493 if (ret) { 11494 ath12k_warn(ab, "failed to stop vdev %d: %d\n", 11495 arvif->vdev_id, ret); 11496 continue; 11497 } 11498 11499 ret = ath12k_mac_vdev_start(arvif, vifs[i].new_ctx); 11500 if (ret) 11501 ath12k_warn(ab, "failed to start vdev %d: %d\n", 11502 arvif->vdev_id, ret); 11503 continue; 11504 } 11505 11506 ret = ath12k_mac_update_peer_puncturing_width(arvif->ar, arvif, 11507 vifs[i].new_ctx->def); 11508 if (ret) { 11509 ath12k_warn(ar->ab, 11510 "failed to update puncturing bitmap %02x and width %d: %d\n", 11511 vifs[i].new_ctx->def.punctured, 11512 vifs[i].new_ctx->def.width, ret); 11513 continue; 11514 } 11515 11516 /* Defer VDEV bring-up during CSA to avoid installing stale 11517 * beacon templates. The beacon content is updated only 11518 * after CSA finalize, so we mark CSA in progress and skip 11519 * VDEV_UP for now. It will be handled later in 11520 * bss_info_changed(). 11521 */ 11522 if (link_conf->csa_active && 11523 arvif->ahvif->vdev_type == WMI_VDEV_TYPE_AP) { 11524 arvif->is_csa_in_progress = true; 11525 continue; 11526 } 11527 11528 ret = ath12k_mac_setup_bcn_tmpl(arvif); 11529 if (ret) 11530 ath12k_warn(ab, "failed to update bcn tmpl during csa: %d\n", 11531 ret); 11532 11533 memset(¶ms, 0, sizeof(params)); 11534 params.vdev_id = arvif->vdev_id; 11535 params.aid = ahvif->aid; 11536 params.bssid = arvif->bssid; 11537 params.tx_bssid = ath12k_mac_get_tx_bssid(arvif); 11538 if (params.tx_bssid) { 11539 params.nontx_profile_idx = link_conf->bssid_index; 11540 params.nontx_profile_cnt = 1 << link_conf->bssid_indicator; 11541 } 11542 ret = ath12k_wmi_vdev_up(arvif->ar, ¶ms); 11543 if (ret) { 11544 ath12k_warn(ab, "failed to bring vdev up %d: %d\n", 11545 arvif->vdev_id, ret); 11546 continue; 11547 } 11548 } 11549 11550 /* Restart the internal monitor vdev on new channel */ 11551 if (!monitor_vif && ar->monitor_vdev_created) { 11552 if (!ath12k_mac_monitor_stop(ar)) 11553 ath12k_mac_monitor_start(ar); 11554 } 11555 } 11556 11557 static void 11558 ath12k_mac_update_active_vif_chan(struct ath12k *ar, 11559 struct ieee80211_chanctx_conf *ctx) 11560 { 11561 struct ath12k_mac_change_chanctx_arg arg = { .ctx = ctx, .ar = ar }; 11562 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar); 11563 11564 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 11565 11566 ieee80211_iterate_active_interfaces_atomic(hw, 11567 IEEE80211_IFACE_ITER_NORMAL, 11568 ath12k_mac_change_chanctx_cnt_iter, 11569 &arg); 11570 if (arg.n_vifs == 0) 11571 return; 11572 11573 arg.vifs = kzalloc_objs(arg.vifs[0], arg.n_vifs); 11574 if (!arg.vifs) 11575 return; 11576 11577 ieee80211_iterate_active_interfaces_atomic(hw, 11578 IEEE80211_IFACE_ITER_NORMAL, 11579 ath12k_mac_change_chanctx_fill_iter, 11580 &arg); 11581 11582 ath12k_mac_update_vif_chan(ar, arg.vifs, arg.n_vifs); 11583 11584 kfree(arg.vifs); 11585 } 11586 11587 void ath12k_mac_op_change_chanctx(struct ieee80211_hw *hw, 11588 struct ieee80211_chanctx_conf *ctx, 11589 u32 changed) 11590 { 11591 struct ath12k *ar; 11592 struct ath12k_base *ab; 11593 11594 lockdep_assert_wiphy(hw->wiphy); 11595 11596 ar = ath12k_get_ar_by_ctx(hw, ctx); 11597 if (!ar) 11598 return; 11599 11600 ab = ar->ab; 11601 11602 ath12k_dbg(ab, ATH12K_DBG_MAC, 11603 "mac chanctx change freq %u width %d ptr %p changed %x\n", 11604 ctx->def.chan->center_freq, ctx->def.width, ctx, changed); 11605 11606 /* This shouldn't really happen because channel switching should use 11607 * switch_vif_chanctx(). 11608 */ 11609 if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL)) 11610 return; 11611 11612 if (changed & IEEE80211_CHANCTX_CHANGE_WIDTH || 11613 changed & IEEE80211_CHANCTX_CHANGE_RADAR || 11614 changed & IEEE80211_CHANCTX_CHANGE_PUNCTURING) 11615 ath12k_mac_update_active_vif_chan(ar, ctx); 11616 11617 /* TODO: Recalc radar detection */ 11618 } 11619 EXPORT_SYMBOL(ath12k_mac_op_change_chanctx); 11620 11621 static int ath12k_start_vdev_delay(struct ath12k *ar, 11622 struct ath12k_link_vif *arvif) 11623 { 11624 struct ath12k_base *ab = ar->ab; 11625 struct ath12k_vif *ahvif = arvif->ahvif; 11626 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif); 11627 struct ieee80211_chanctx_conf *chanctx; 11628 struct ieee80211_bss_conf *link_conf; 11629 int ret; 11630 11631 if (WARN_ON(arvif->is_started)) 11632 return -EBUSY; 11633 11634 link_conf = ath12k_mac_get_link_bss_conf(arvif); 11635 if (!link_conf) { 11636 ath12k_warn(ab, "failed to get link conf for vdev %u\n", arvif->vdev_id); 11637 return -EINVAL; 11638 } 11639 11640 chanctx = wiphy_dereference(ath12k_ar_to_hw(arvif->ar)->wiphy, 11641 link_conf->chanctx_conf); 11642 ret = ath12k_mac_vdev_start(arvif, chanctx); 11643 if (ret) { 11644 ath12k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n", 11645 arvif->vdev_id, vif->addr, 11646 chanctx->def.chan->center_freq, ret); 11647 return ret; 11648 } 11649 11650 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { 11651 ret = ath12k_monitor_vdev_up(ar, arvif->vdev_id); 11652 if (ret) { 11653 ath12k_warn(ab, "failed put monitor up: %d\n", ret); 11654 return ret; 11655 } 11656 } 11657 11658 arvif->is_started = true; 11659 11660 /* TODO: Setup ps and cts/rts protection */ 11661 return 0; 11662 } 11663 11664 static u8 ath12k_mac_get_num_pwr_levels(struct cfg80211_chan_def *chan_def) 11665 { 11666 if (chan_def->chan->flags & IEEE80211_CHAN_PSD) { 11667 switch (chan_def->width) { 11668 case NL80211_CHAN_WIDTH_20: 11669 return 1; 11670 case NL80211_CHAN_WIDTH_40: 11671 return 2; 11672 case NL80211_CHAN_WIDTH_80: 11673 return 4; 11674 case NL80211_CHAN_WIDTH_160: 11675 return 8; 11676 case NL80211_CHAN_WIDTH_320: 11677 return 16; 11678 default: 11679 return 1; 11680 } 11681 } else { 11682 switch (chan_def->width) { 11683 case NL80211_CHAN_WIDTH_20: 11684 return 1; 11685 case NL80211_CHAN_WIDTH_40: 11686 return 2; 11687 case NL80211_CHAN_WIDTH_80: 11688 return 3; 11689 case NL80211_CHAN_WIDTH_160: 11690 return 4; 11691 case NL80211_CHAN_WIDTH_320: 11692 return 5; 11693 default: 11694 return 1; 11695 } 11696 } 11697 } 11698 11699 static u16 ath12k_mac_get_6ghz_start_frequency(struct cfg80211_chan_def *chan_def) 11700 { 11701 u16 diff_seq; 11702 11703 /* It is to get the lowest channel number's center frequency of the chan. 11704 * For example, 11705 * bandwidth=40 MHz, center frequency is 5965, lowest channel is 1 11706 * with center frequency 5955, its diff is 5965 - 5955 = 10. 11707 * bandwidth=80 MHz, center frequency is 5985, lowest channel is 1 11708 * with center frequency 5955, its diff is 5985 - 5955 = 30. 11709 * bandwidth=160 MHz, center frequency is 6025, lowest channel is 1 11710 * with center frequency 5955, its diff is 6025 - 5955 = 70. 11711 * bandwidth=320 MHz, center frequency is 6105, lowest channel is 1 11712 * with center frequency 5955, its diff is 6105 - 5955 = 70. 11713 */ 11714 switch (chan_def->width) { 11715 case NL80211_CHAN_WIDTH_320: 11716 diff_seq = 150; 11717 break; 11718 case NL80211_CHAN_WIDTH_160: 11719 diff_seq = 70; 11720 break; 11721 case NL80211_CHAN_WIDTH_80: 11722 diff_seq = 30; 11723 break; 11724 case NL80211_CHAN_WIDTH_40: 11725 diff_seq = 10; 11726 break; 11727 default: 11728 diff_seq = 0; 11729 } 11730 11731 return chan_def->center_freq1 - diff_seq; 11732 } 11733 11734 static u16 ath12k_mac_get_seg_freq(struct cfg80211_chan_def *chan_def, 11735 u16 start_seq, u8 seq) 11736 { 11737 u16 seg_seq; 11738 11739 /* It is to get the center frequency of the specific bandwidth. 11740 * start_seq means the lowest channel number's center frequency. 11741 * seq 0/1/2/3 means 20 MHz/40 MHz/80 MHz/160 MHz. 11742 * For example, 11743 * lowest channel is 1, its center frequency 5955, 11744 * center frequency is 5955 when bandwidth=20 MHz, its diff is 5955 - 5955 = 0. 11745 * lowest channel is 1, its center frequency 5955, 11746 * center frequency is 5965 when bandwidth=40 MHz, its diff is 5965 - 5955 = 10. 11747 * lowest channel is 1, its center frequency 5955, 11748 * center frequency is 5985 when bandwidth=80 MHz, its diff is 5985 - 5955 = 30. 11749 * lowest channel is 1, its center frequency 5955, 11750 * center frequency is 6025 when bandwidth=160 MHz, its diff is 6025 - 5955 = 70. 11751 */ 11752 seg_seq = 10 * (BIT(seq) - 1); 11753 return seg_seq + start_seq; 11754 } 11755 11756 static void ath12k_mac_get_psd_channel(struct ath12k *ar, 11757 u16 step_freq, 11758 u16 *start_freq, 11759 u16 *center_freq, 11760 u8 i, 11761 struct ieee80211_channel **temp_chan, 11762 s8 *tx_power) 11763 { 11764 /* It is to get the center frequency for each 20 MHz. 11765 * For example, if the chan is 160 MHz and center frequency is 6025, 11766 * then it include 8 channels, they are 1/5/9/13/17/21/25/29, 11767 * channel number 1's center frequency is 5955, it is parameter start_freq. 11768 * parameter i is the step of the 8 channels. i is 0~7 for the 8 channels. 11769 * the channel 1/5/9/13/17/21/25/29 maps i=0/1/2/3/4/5/6/7, 11770 * and maps its center frequency is 5955/5975/5995/6015/6035/6055/6075/6095, 11771 * the gap is 20 for each channel, parameter step_freq means the gap. 11772 * after get the center frequency of each channel, it is easy to find the 11773 * struct ieee80211_channel of it and get the max_reg_power. 11774 */ 11775 *center_freq = *start_freq + i * step_freq; 11776 *temp_chan = ieee80211_get_channel(ar->ah->hw->wiphy, *center_freq); 11777 *tx_power = (*temp_chan)->max_reg_power; 11778 } 11779 11780 static void ath12k_mac_get_eirp_power(struct ath12k *ar, 11781 u16 *start_freq, 11782 u16 *center_freq, 11783 u8 i, 11784 struct ieee80211_channel **temp_chan, 11785 struct cfg80211_chan_def *def, 11786 s8 *tx_power) 11787 { 11788 /* It is to get the center frequency for 20 MHz/40 MHz/80 MHz/ 11789 * 160 MHz bandwidth, and then plus 10 to the center frequency, 11790 * it is the center frequency of a channel number. 11791 * For example, when configured channel number is 1. 11792 * center frequency is 5965 when bandwidth=40 MHz, after plus 10, it is 5975, 11793 * then it is channel number 5. 11794 * center frequency is 5985 when bandwidth=80 MHz, after plus 10, it is 5995, 11795 * then it is channel number 9. 11796 * center frequency is 6025 when bandwidth=160 MHz, after plus 10, it is 6035, 11797 * then it is channel number 17. 11798 * after get the center frequency of each channel, it is easy to find the 11799 * struct ieee80211_channel of it and get the max_reg_power. 11800 */ 11801 *center_freq = ath12k_mac_get_seg_freq(def, *start_freq, i); 11802 11803 /* For the 20 MHz, its center frequency is same with same channel */ 11804 if (i != 0) 11805 *center_freq += 10; 11806 11807 *temp_chan = ieee80211_get_channel(ar->ah->hw->wiphy, *center_freq); 11808 *tx_power = (*temp_chan)->max_reg_power; 11809 } 11810 11811 void ath12k_mac_fill_reg_tpc_info(struct ath12k *ar, 11812 struct ath12k_link_vif *arvif, 11813 struct ieee80211_chanctx_conf *ctx) 11814 { 11815 struct ath12k_base *ab = ar->ab; 11816 struct ath12k_reg_tpc_power_info *reg_tpc_info = &arvif->reg_tpc_info; 11817 struct ieee80211_bss_conf *bss_conf = ath12k_mac_get_link_bss_conf(arvif); 11818 struct ieee80211_channel *chan, *temp_chan; 11819 u8 pwr_lvl_idx, num_pwr_levels, pwr_reduction; 11820 bool is_psd_power = false, is_tpe_present = false; 11821 s8 max_tx_power[ATH12K_NUM_PWR_LEVELS], psd_power, tx_power; 11822 s8 eirp_power = 0; 11823 struct ath12k_vif *ahvif = arvif->ahvif; 11824 u16 start_freq, center_freq; 11825 u8 reg_6ghz_power_mode; 11826 11827 chan = ctx->def.chan; 11828 start_freq = ath12k_mac_get_6ghz_start_frequency(&ctx->def); 11829 pwr_reduction = bss_conf->pwr_reduction; 11830 11831 if (arvif->reg_tpc_info.num_pwr_levels) { 11832 is_tpe_present = true; 11833 num_pwr_levels = arvif->reg_tpc_info.num_pwr_levels; 11834 } else { 11835 num_pwr_levels = ath12k_mac_get_num_pwr_levels(&ctx->def); 11836 } 11837 11838 for (pwr_lvl_idx = 0; pwr_lvl_idx < num_pwr_levels; pwr_lvl_idx++) { 11839 /* STA received TPE IE*/ 11840 if (is_tpe_present) { 11841 /* local power is PSD power*/ 11842 if (chan->flags & IEEE80211_CHAN_PSD) { 11843 /* Connecting AP is psd power */ 11844 if (reg_tpc_info->is_psd_power) { 11845 is_psd_power = true; 11846 ath12k_mac_get_psd_channel(ar, 20, 11847 &start_freq, 11848 ¢er_freq, 11849 pwr_lvl_idx, 11850 &temp_chan, 11851 &tx_power); 11852 psd_power = temp_chan->psd; 11853 eirp_power = tx_power; 11854 max_tx_power[pwr_lvl_idx] = 11855 min_t(s8, 11856 psd_power, 11857 reg_tpc_info->tpe[pwr_lvl_idx]); 11858 /* Connecting AP is not psd power */ 11859 } else { 11860 ath12k_mac_get_eirp_power(ar, 11861 &start_freq, 11862 ¢er_freq, 11863 pwr_lvl_idx, 11864 &temp_chan, 11865 &ctx->def, 11866 &tx_power); 11867 psd_power = temp_chan->psd; 11868 /* convert psd power to EIRP power based 11869 * on channel width 11870 */ 11871 tx_power = 11872 min_t(s8, tx_power, 11873 psd_power + 13 + pwr_lvl_idx * 3); 11874 max_tx_power[pwr_lvl_idx] = 11875 min_t(s8, 11876 tx_power, 11877 reg_tpc_info->tpe[pwr_lvl_idx]); 11878 } 11879 /* local power is not PSD power */ 11880 } else { 11881 /* Connecting AP is psd power */ 11882 if (reg_tpc_info->is_psd_power) { 11883 is_psd_power = true; 11884 ath12k_mac_get_psd_channel(ar, 20, 11885 &start_freq, 11886 ¢er_freq, 11887 pwr_lvl_idx, 11888 &temp_chan, 11889 &tx_power); 11890 eirp_power = tx_power; 11891 max_tx_power[pwr_lvl_idx] = 11892 reg_tpc_info->tpe[pwr_lvl_idx]; 11893 /* Connecting AP is not psd power */ 11894 } else { 11895 ath12k_mac_get_eirp_power(ar, 11896 &start_freq, 11897 ¢er_freq, 11898 pwr_lvl_idx, 11899 &temp_chan, 11900 &ctx->def, 11901 &tx_power); 11902 max_tx_power[pwr_lvl_idx] = 11903 min_t(s8, 11904 tx_power, 11905 reg_tpc_info->tpe[pwr_lvl_idx]); 11906 } 11907 } 11908 /* STA not received TPE IE */ 11909 } else { 11910 /* local power is PSD power*/ 11911 if (chan->flags & IEEE80211_CHAN_PSD) { 11912 is_psd_power = true; 11913 ath12k_mac_get_psd_channel(ar, 20, 11914 &start_freq, 11915 ¢er_freq, 11916 pwr_lvl_idx, 11917 &temp_chan, 11918 &tx_power); 11919 psd_power = temp_chan->psd; 11920 eirp_power = tx_power; 11921 max_tx_power[pwr_lvl_idx] = psd_power; 11922 } else { 11923 ath12k_mac_get_eirp_power(ar, 11924 &start_freq, 11925 ¢er_freq, 11926 pwr_lvl_idx, 11927 &temp_chan, 11928 &ctx->def, 11929 &tx_power); 11930 max_tx_power[pwr_lvl_idx] = tx_power; 11931 } 11932 } 11933 11934 if (is_psd_power) { 11935 /* If AP local power constraint is present */ 11936 if (pwr_reduction) 11937 eirp_power = eirp_power - pwr_reduction; 11938 11939 /* If firmware updated max tx power is non zero, then take 11940 * the min of firmware updated ap tx power 11941 * and max power derived from above mentioned parameters. 11942 */ 11943 ath12k_dbg(ab, ATH12K_DBG_MAC, 11944 "eirp power : %d firmware report power : %d\n", 11945 eirp_power, ar->max_allowed_tx_power); 11946 /* Firmware reports lower max_allowed_tx_power during vdev 11947 * start response. In case of 6 GHz, firmware is not aware 11948 * of EIRP power unless driver sets EIRP power through WMI 11949 * TPC command. So radio which does not support idle power 11950 * save can set maximum calculated EIRP power directly to 11951 * firmware through TPC command without min comparison with 11952 * vdev start response's max_allowed_tx_power. 11953 */ 11954 if (ar->max_allowed_tx_power && ab->hw_params->idle_ps) 11955 eirp_power = min_t(s8, 11956 eirp_power, 11957 ar->max_allowed_tx_power); 11958 } else { 11959 /* If AP local power constraint is present */ 11960 if (pwr_reduction) 11961 max_tx_power[pwr_lvl_idx] = 11962 max_tx_power[pwr_lvl_idx] - pwr_reduction; 11963 /* If firmware updated max tx power is non zero, then take 11964 * the min of firmware updated ap tx power 11965 * and max power derived from above mentioned parameters. 11966 */ 11967 if (ar->max_allowed_tx_power && ab->hw_params->idle_ps) 11968 max_tx_power[pwr_lvl_idx] = 11969 min_t(s8, 11970 max_tx_power[pwr_lvl_idx], 11971 ar->max_allowed_tx_power); 11972 } 11973 reg_tpc_info->chan_power_info[pwr_lvl_idx].chan_cfreq = center_freq; 11974 reg_tpc_info->chan_power_info[pwr_lvl_idx].tx_power = 11975 max_tx_power[pwr_lvl_idx]; 11976 } 11977 11978 reg_tpc_info->num_pwr_levels = num_pwr_levels; 11979 reg_tpc_info->is_psd_power = is_psd_power; 11980 reg_tpc_info->eirp_power = eirp_power; 11981 if (ahvif->vdev_type == WMI_VDEV_TYPE_STA) 11982 reg_6ghz_power_mode = bss_conf->power_type; 11983 else 11984 /* For now, LPI is the only supported AP power mode */ 11985 reg_6ghz_power_mode = IEEE80211_REG_LPI_AP; 11986 11987 reg_tpc_info->ap_power_type = 11988 ath12k_reg_ap_pwr_convert(reg_6ghz_power_mode); 11989 } 11990 11991 static void ath12k_mac_parse_tx_pwr_env(struct ath12k *ar, 11992 struct ath12k_link_vif *arvif) 11993 { 11994 struct ieee80211_bss_conf *bss_conf = ath12k_mac_get_link_bss_conf(arvif); 11995 struct ath12k_reg_tpc_power_info *tpc_info = &arvif->reg_tpc_info; 11996 struct ieee80211_parsed_tpe_eirp *local_non_psd, *reg_non_psd; 11997 struct ieee80211_parsed_tpe_psd *local_psd, *reg_psd; 11998 struct ieee80211_parsed_tpe *tpe = &bss_conf->tpe; 11999 enum wmi_reg_6g_client_type client_type; 12000 struct ath12k_reg_info *reg_info; 12001 struct ath12k_base *ab = ar->ab; 12002 bool psd_valid, non_psd_valid; 12003 int i; 12004 12005 reg_info = ab->reg_info[ar->pdev_idx]; 12006 client_type = reg_info->client_type; 12007 12008 local_psd = &tpe->psd_local[client_type]; 12009 reg_psd = &tpe->psd_reg_client[client_type]; 12010 local_non_psd = &tpe->max_local[client_type]; 12011 reg_non_psd = &tpe->max_reg_client[client_type]; 12012 12013 psd_valid = local_psd->valid | reg_psd->valid; 12014 non_psd_valid = local_non_psd->valid | reg_non_psd->valid; 12015 12016 if (!psd_valid && !non_psd_valid) { 12017 ath12k_warn(ab, 12018 "no transmit power envelope match client power type %d\n", 12019 client_type); 12020 return; 12021 } 12022 12023 if (psd_valid) { 12024 tpc_info->is_psd_power = true; 12025 12026 tpc_info->num_pwr_levels = max(local_psd->count, 12027 reg_psd->count); 12028 tpc_info->num_pwr_levels = 12029 min3(tpc_info->num_pwr_levels, 12030 IEEE80211_TPE_PSD_ENTRIES_320MHZ, 12031 ATH12K_NUM_PWR_LEVELS); 12032 12033 for (i = 0; i < tpc_info->num_pwr_levels; i++) { 12034 tpc_info->tpe[i] = min(local_psd->power[i], 12035 reg_psd->power[i]) / 2; 12036 ath12k_dbg(ab, ATH12K_DBG_MAC, 12037 "TPE PSD power[%d] : %d\n", 12038 i, tpc_info->tpe[i]); 12039 } 12040 } else { 12041 tpc_info->is_psd_power = false; 12042 tpc_info->eirp_power = 0; 12043 12044 tpc_info->num_pwr_levels = max(local_non_psd->count, 12045 reg_non_psd->count); 12046 tpc_info->num_pwr_levels = 12047 min3(tpc_info->num_pwr_levels, 12048 IEEE80211_TPE_EIRP_ENTRIES_320MHZ, 12049 ATH12K_NUM_PWR_LEVELS); 12050 12051 for (i = 0; i < tpc_info->num_pwr_levels; i++) { 12052 tpc_info->tpe[i] = min(local_non_psd->power[i], 12053 reg_non_psd->power[i]) / 2; 12054 ath12k_dbg(ab, ATH12K_DBG_MAC, 12055 "non PSD power[%d] : %d\n", 12056 i, tpc_info->tpe[i]); 12057 } 12058 } 12059 } 12060 12061 int 12062 ath12k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw, 12063 struct ieee80211_vif *vif, 12064 struct ieee80211_bss_conf *link_conf, 12065 struct ieee80211_chanctx_conf *ctx) 12066 { 12067 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 12068 struct ath12k *ar; 12069 struct ath12k_base *ab; 12070 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 12071 u8 link_id = link_conf->link_id; 12072 struct ath12k_link_vif *arvif; 12073 int ret; 12074 12075 lockdep_assert_wiphy(hw->wiphy); 12076 12077 /* For multi radio wiphy, the vdev was not created during add_interface 12078 * create now since we have a channel ctx now to assign to a specific ar/fw 12079 */ 12080 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id); 12081 if (!arvif) { 12082 WARN_ON(1); 12083 return -ENOMEM; 12084 } 12085 12086 ar = ath12k_mac_assign_vif_to_vdev(hw, arvif, ctx); 12087 if (!ar) { 12088 ath12k_hw_warn(ah, "failed to assign chanctx for vif %pM link id %u link vif is already started", 12089 vif->addr, link_id); 12090 return -EINVAL; 12091 } 12092 12093 ab = ar->ab; 12094 12095 ath12k_dbg(ab, ATH12K_DBG_MAC, 12096 "mac chanctx assign ptr %p vdev_id %i\n", 12097 ctx, arvif->vdev_id); 12098 12099 if (ath12k_wmi_supports_6ghz_cc_ext(ar) && 12100 ctx->def.chan->band == NL80211_BAND_6GHZ && 12101 ahvif->vdev_type == WMI_VDEV_TYPE_STA) 12102 ath12k_mac_parse_tx_pwr_env(ar, arvif); 12103 12104 arvif->punct_bitmap = ctx->def.punctured; 12105 12106 /* for some targets bss peer must be created before vdev_start */ 12107 if (ab->hw_params->vdev_start_delay && 12108 ahvif->vdev_type != WMI_VDEV_TYPE_AP && 12109 ahvif->vdev_type != WMI_VDEV_TYPE_MONITOR && 12110 !ath12k_dp_link_peer_exist_by_vdev_id(ath12k_ab_to_dp(ab), arvif->vdev_id)) { 12111 ret = 0; 12112 goto out; 12113 } 12114 12115 if (WARN_ON(arvif->is_started)) { 12116 ret = -EBUSY; 12117 goto out; 12118 } 12119 12120 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { 12121 ret = ath12k_mac_monitor_start(ar); 12122 if (ret) { 12123 ath12k_mac_monitor_vdev_delete(ar); 12124 goto out; 12125 } 12126 12127 arvif->is_started = true; 12128 goto out; 12129 } 12130 12131 ret = ath12k_mac_vdev_start(arvif, ctx); 12132 if (ret) { 12133 ath12k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n", 12134 arvif->vdev_id, vif->addr, 12135 ctx->def.chan->center_freq, ret); 12136 goto out; 12137 } 12138 12139 arvif->is_started = true; 12140 12141 /* TODO: Setup ps and cts/rts protection */ 12142 12143 out: 12144 return ret; 12145 } 12146 EXPORT_SYMBOL(ath12k_mac_op_assign_vif_chanctx); 12147 12148 void 12149 ath12k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw, 12150 struct ieee80211_vif *vif, 12151 struct ieee80211_bss_conf *link_conf, 12152 struct ieee80211_chanctx_conf *ctx) 12153 { 12154 struct ath12k *ar; 12155 struct ath12k_base *ab; 12156 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 12157 struct ath12k_link_vif *arvif; 12158 u8 link_id = link_conf->link_id; 12159 int ret; 12160 12161 lockdep_assert_wiphy(hw->wiphy); 12162 12163 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 12164 12165 /* The vif is expected to be attached to an ar's VDEV. 12166 * We leave the vif/vdev in this function as is 12167 * and not delete the vdev symmetric to assign_vif_chanctx() 12168 * the VDEV will be deleted and unassigned either during 12169 * remove_interface() or when there is a change in channel 12170 * that moves the vif to a new ar 12171 */ 12172 if (!arvif || !arvif->is_created) 12173 return; 12174 12175 ar = arvif->ar; 12176 ab = ar->ab; 12177 12178 ath12k_dbg(ab, ATH12K_DBG_MAC, 12179 "mac chanctx unassign ptr %p vdev_id %i\n", 12180 ctx, arvif->vdev_id); 12181 12182 WARN_ON(!arvif->is_started); 12183 12184 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { 12185 ret = ath12k_mac_monitor_stop(ar); 12186 if (ret) 12187 return; 12188 12189 arvif->is_started = false; 12190 } 12191 12192 if (ahvif->vdev_type != WMI_VDEV_TYPE_STA && 12193 ahvif->vdev_type != WMI_VDEV_TYPE_MONITOR) { 12194 ath12k_bss_disassoc(ar, arvif); 12195 ret = ath12k_mac_vdev_stop(arvif); 12196 if (ret) 12197 ath12k_warn(ab, "failed to stop vdev %i: %d\n", 12198 arvif->vdev_id, ret); 12199 } 12200 arvif->is_started = false; 12201 12202 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ab->wmi_ab.svc_map) && 12203 ahvif->vdev_type == WMI_VDEV_TYPE_STA && 12204 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE && 12205 ar->state_11d != ATH12K_11D_PREPARING) { 12206 reinit_completion(&ar->completed_11d_scan); 12207 ar->state_11d = ATH12K_11D_PREPARING; 12208 } 12209 12210 if (ar->scan.arvif == arvif && ar->scan.state == ATH12K_SCAN_RUNNING) { 12211 ath12k_scan_abort(ar); 12212 ar->scan.arvif = NULL; 12213 } 12214 } 12215 EXPORT_SYMBOL(ath12k_mac_op_unassign_vif_chanctx); 12216 12217 int 12218 ath12k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw, 12219 struct ieee80211_vif_chanctx_switch *vifs, 12220 int n_vifs, 12221 enum ieee80211_chanctx_switch_mode mode) 12222 { 12223 struct ath12k *ar; 12224 12225 lockdep_assert_wiphy(hw->wiphy); 12226 12227 ar = ath12k_get_ar_by_ctx(hw, vifs->old_ctx); 12228 if (!ar) 12229 return -EINVAL; 12230 12231 /* Switching channels across radio is not allowed */ 12232 if (ar != ath12k_get_ar_by_ctx(hw, vifs->new_ctx)) 12233 return -EINVAL; 12234 12235 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 12236 "mac chanctx switch n_vifs %d mode %d\n", 12237 n_vifs, mode); 12238 ath12k_mac_update_vif_chan(ar, vifs, n_vifs); 12239 12240 return 0; 12241 } 12242 EXPORT_SYMBOL(ath12k_mac_op_switch_vif_chanctx); 12243 12244 static int 12245 ath12k_set_vdev_param_to_all_vifs(struct ath12k *ar, int param, u32 value) 12246 { 12247 struct ath12k_link_vif *arvif; 12248 int ret = 0; 12249 12250 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 12251 12252 list_for_each_entry(arvif, &ar->arvifs, list) { 12253 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "setting mac vdev %d param %d value %d\n", 12254 param, arvif->vdev_id, value); 12255 12256 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 12257 param, value); 12258 if (ret) { 12259 ath12k_warn(ar->ab, "failed to set param %d for vdev %d: %d\n", 12260 param, arvif->vdev_id, ret); 12261 break; 12262 } 12263 } 12264 12265 return ret; 12266 } 12267 12268 /* mac80211 stores device specific RTS/Fragmentation threshold value, 12269 * this is set interface specific to firmware from ath12k driver 12270 */ 12271 int ath12k_mac_op_set_rts_threshold(struct ieee80211_hw *hw, 12272 int radio_idx, u32 value) 12273 { 12274 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 12275 struct wiphy *wiphy = hw->wiphy; 12276 struct ath12k *ar; 12277 int param_id = WMI_VDEV_PARAM_RTS_THRESHOLD; 12278 int ret = 0, ret_err, i; 12279 12280 lockdep_assert_wiphy(hw->wiphy); 12281 12282 if (radio_idx >= wiphy->n_radio || radio_idx < -1) 12283 return -EINVAL; 12284 12285 if (radio_idx != -1) { 12286 /* Update RTS threshold in specified radio */ 12287 ar = ath12k_ah_to_ar(ah, radio_idx); 12288 ret = ath12k_set_vdev_param_to_all_vifs(ar, param_id, value); 12289 if (ret) { 12290 ath12k_warn(ar->ab, 12291 "failed to set RTS config for all vdevs of pdev %d", 12292 ar->pdev->pdev_id); 12293 return ret; 12294 } 12295 12296 ar->rts_threshold = value; 12297 return 0; 12298 } 12299 12300 /* Radio_index passed is -1, so set RTS threshold for all radios. */ 12301 for_each_ar(ah, ar, i) { 12302 ret = ath12k_set_vdev_param_to_all_vifs(ar, param_id, value); 12303 if (ret) { 12304 ath12k_warn(ar->ab, "failed to set RTS config for all vdevs of pdev %d", 12305 ar->pdev->pdev_id); 12306 break; 12307 } 12308 } 12309 if (!ret) { 12310 /* Setting new RTS threshold for vdevs of all radios passed, so update 12311 * the RTS threshold value for all radios 12312 */ 12313 for_each_ar(ah, ar, i) 12314 ar->rts_threshold = value; 12315 return 0; 12316 } 12317 12318 /* RTS threshold config failed, revert to the previous RTS threshold */ 12319 for (i = i - 1; i >= 0; i--) { 12320 ar = ath12k_ah_to_ar(ah, i); 12321 ret_err = ath12k_set_vdev_param_to_all_vifs(ar, param_id, 12322 ar->rts_threshold); 12323 if (ret_err) 12324 ath12k_warn(ar->ab, 12325 "failed to restore RTS threshold for all vdevs of pdev %d", 12326 ar->pdev->pdev_id); 12327 } 12328 12329 return ret; 12330 } 12331 EXPORT_SYMBOL(ath12k_mac_op_set_rts_threshold); 12332 12333 int ath12k_mac_op_set_frag_threshold(struct ieee80211_hw *hw, 12334 int radio_idx, u32 value) 12335 { 12336 /* Even though there's a WMI vdev param for fragmentation threshold no 12337 * known firmware actually implements it. Moreover it is not possible to 12338 * rely frame fragmentation to mac80211 because firmware clears the 12339 * "more fragments" bit in frame control making it impossible for remote 12340 * devices to reassemble frames. 12341 * 12342 * Hence implement a dummy callback just to say fragmentation isn't 12343 * supported. This effectively prevents mac80211 from doing frame 12344 * fragmentation in software. 12345 */ 12346 12347 lockdep_assert_wiphy(hw->wiphy); 12348 12349 return -EOPNOTSUPP; 12350 } 12351 EXPORT_SYMBOL(ath12k_mac_op_set_frag_threshold); 12352 12353 static int ath12k_mac_flush(struct ath12k *ar) 12354 { 12355 long time_left; 12356 int ret = 0; 12357 12358 time_left = wait_event_timeout(ar->dp.tx_empty_waitq, 12359 (atomic_read(&ar->dp.num_tx_pending) == 0), 12360 ATH12K_FLUSH_TIMEOUT); 12361 if (time_left == 0) { 12362 ath12k_warn(ar->ab, 12363 "failed to flush transmit queue, data pkts pending %d\n", 12364 atomic_read(&ar->dp.num_tx_pending)); 12365 ret = -ETIMEDOUT; 12366 } 12367 12368 time_left = wait_event_timeout(ar->txmgmt_empty_waitq, 12369 (atomic_read(&ar->num_pending_mgmt_tx) == 0), 12370 ATH12K_FLUSH_TIMEOUT); 12371 if (time_left == 0) { 12372 ath12k_warn(ar->ab, 12373 "failed to flush mgmt transmit queue, mgmt pkts pending %d\n", 12374 atomic_read(&ar->num_pending_mgmt_tx)); 12375 ret = -ETIMEDOUT; 12376 } 12377 12378 return ret; 12379 } 12380 12381 int ath12k_mac_wait_tx_complete(struct ath12k *ar) 12382 { 12383 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 12384 12385 ath12k_mac_drain_tx(ar); 12386 return ath12k_mac_flush(ar); 12387 } 12388 12389 void ath12k_mac_op_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 12390 u32 queues, bool drop) 12391 { 12392 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 12393 struct ath12k_link_vif *arvif; 12394 struct ath12k_vif *ahvif; 12395 unsigned long links; 12396 struct ath12k *ar; 12397 u8 link_id; 12398 int i; 12399 12400 lockdep_assert_wiphy(hw->wiphy); 12401 12402 if (drop) 12403 return; 12404 12405 for_each_ar(ah, ar, i) 12406 wiphy_work_flush(hw->wiphy, &ar->wmi_mgmt_tx_work); 12407 12408 /* vif can be NULL when flush() is considered for hw */ 12409 if (!vif) { 12410 for_each_ar(ah, ar, i) 12411 ath12k_mac_flush(ar); 12412 return; 12413 } 12414 12415 ahvif = ath12k_vif_to_ahvif(vif); 12416 links = ahvif->links_map; 12417 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) { 12418 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]); 12419 if (!(arvif && arvif->ar)) 12420 continue; 12421 12422 ath12k_mac_flush(arvif->ar); 12423 } 12424 } 12425 EXPORT_SYMBOL(ath12k_mac_op_flush); 12426 12427 static int 12428 ath12k_mac_bitrate_mask_num_ht_rates(struct ath12k *ar, 12429 enum nl80211_band band, 12430 const struct cfg80211_bitrate_mask *mask) 12431 { 12432 int num_rates = 0; 12433 int i; 12434 12435 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) 12436 num_rates += hweight16(mask->control[band].ht_mcs[i]); 12437 12438 return num_rates; 12439 } 12440 12441 static bool 12442 ath12k_mac_has_single_legacy_rate(struct ath12k *ar, 12443 enum nl80211_band band, 12444 const struct cfg80211_bitrate_mask *mask) 12445 { 12446 int num_rates = 0; 12447 12448 num_rates = hweight32(mask->control[band].legacy); 12449 12450 if (ath12k_mac_bitrate_mask_num_ht_rates(ar, band, mask)) 12451 return false; 12452 12453 if (ath12k_mac_bitrate_mask_num_vht_rates(ar, band, mask)) 12454 return false; 12455 12456 if (ath12k_mac_bitrate_mask_num_he_rates(ar, band, mask)) 12457 return false; 12458 12459 if (ath12k_mac_bitrate_mask_num_eht_rates(ar, band, mask)) 12460 return false; 12461 12462 return num_rates == 1; 12463 } 12464 12465 static __le16 12466 ath12k_mac_get_tx_mcs_map(const struct ieee80211_sta_he_cap *he_cap) 12467 { 12468 if (he_cap->he_cap_elem.phy_cap_info[0] & 12469 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G) 12470 return he_cap->he_mcs_nss_supp.tx_mcs_160; 12471 12472 return he_cap->he_mcs_nss_supp.tx_mcs_80; 12473 } 12474 12475 static bool 12476 ath12k_mac_bitrate_mask_get_single_nss(struct ath12k *ar, 12477 struct ieee80211_vif *vif, 12478 enum nl80211_band band, 12479 const struct cfg80211_bitrate_mask *mask, 12480 int *nss) 12481 { 12482 struct ieee80211_supported_band *sband = &ar->mac.sbands[band]; 12483 u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); 12484 const struct ieee80211_sband_iftype_data *data; 12485 const struct ieee80211_sta_he_cap *he_cap; 12486 u16 he_mcs_map = 0; 12487 u16 eht_mcs_map = 0; 12488 u8 ht_nss_mask = 0; 12489 u8 vht_nss_mask = 0; 12490 u8 he_nss_mask = 0; 12491 u8 eht_nss_mask = 0; 12492 u8 mcs_nss_len; 12493 int i; 12494 12495 /* No need to consider legacy here. Basic rates are always present 12496 * in bitrate mask 12497 */ 12498 12499 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) { 12500 if (mask->control[band].ht_mcs[i] == 0) 12501 continue; 12502 else if (mask->control[band].ht_mcs[i] == 12503 sband->ht_cap.mcs.rx_mask[i]) 12504 ht_nss_mask |= BIT(i); 12505 else 12506 return false; 12507 } 12508 12509 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) { 12510 if (mask->control[band].vht_mcs[i] == 0) 12511 continue; 12512 else if (mask->control[band].vht_mcs[i] == 12513 ath12k_mac_get_max_vht_mcs_map(vht_mcs_map, i)) 12514 vht_nss_mask |= BIT(i); 12515 else 12516 return false; 12517 } 12518 12519 he_cap = ieee80211_get_he_iftype_cap_vif(sband, vif); 12520 if (!he_cap) 12521 return false; 12522 12523 he_mcs_map = le16_to_cpu(ath12k_mac_get_tx_mcs_map(he_cap)); 12524 12525 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) { 12526 if (mask->control[band].he_mcs[i] == 0) 12527 continue; 12528 12529 if (mask->control[band].he_mcs[i] == 12530 ath12k_mac_get_max_he_mcs_map(he_mcs_map, i)) 12531 he_nss_mask |= BIT(i); 12532 else 12533 return false; 12534 } 12535 12536 data = ieee80211_get_sband_iftype_data(sband, vif->type); 12537 12538 mcs_nss_len = ieee80211_eht_mcs_nss_size(&data->he_cap.he_cap_elem, 12539 &data->eht_cap.eht_cap_elem, 12540 false); 12541 if (mcs_nss_len == 4) { 12542 /* 20 MHz only STA case */ 12543 const struct ieee80211_eht_mcs_nss_supp_20mhz_only *eht_mcs_nss = 12544 &data->eht_cap.eht_mcs_nss_supp.only_20mhz; 12545 if (eht_mcs_nss->rx_tx_mcs13_max_nss) 12546 eht_mcs_map = 0x1fff; 12547 else if (eht_mcs_nss->rx_tx_mcs11_max_nss) 12548 eht_mcs_map = 0x07ff; 12549 else if (eht_mcs_nss->rx_tx_mcs9_max_nss) 12550 eht_mcs_map = 0x01ff; 12551 else 12552 eht_mcs_map = 0x007f; 12553 } else { 12554 const struct ieee80211_eht_mcs_nss_supp_bw *eht_mcs_nss; 12555 12556 switch (mcs_nss_len) { 12557 case 9: 12558 eht_mcs_nss = &data->eht_cap.eht_mcs_nss_supp.bw._320; 12559 break; 12560 case 6: 12561 eht_mcs_nss = &data->eht_cap.eht_mcs_nss_supp.bw._160; 12562 break; 12563 case 3: 12564 eht_mcs_nss = &data->eht_cap.eht_mcs_nss_supp.bw._80; 12565 break; 12566 default: 12567 return false; 12568 } 12569 12570 if (eht_mcs_nss->rx_tx_mcs13_max_nss) 12571 eht_mcs_map = 0x1fff; 12572 else if (eht_mcs_nss->rx_tx_mcs11_max_nss) 12573 eht_mcs_map = 0x7ff; 12574 else 12575 eht_mcs_map = 0x1ff; 12576 } 12577 12578 for (i = 0; i < ARRAY_SIZE(mask->control[band].eht_mcs); i++) { 12579 if (mask->control[band].eht_mcs[i] == 0) 12580 continue; 12581 12582 if (mask->control[band].eht_mcs[i] < eht_mcs_map) 12583 eht_nss_mask |= BIT(i); 12584 else 12585 return false; 12586 } 12587 12588 if (ht_nss_mask != vht_nss_mask || ht_nss_mask != he_nss_mask || 12589 ht_nss_mask != eht_nss_mask) 12590 return false; 12591 12592 if (ht_nss_mask == 0) 12593 return false; 12594 12595 if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask) 12596 return false; 12597 12598 *nss = fls(ht_nss_mask); 12599 12600 return true; 12601 } 12602 12603 static int 12604 ath12k_mac_get_single_legacy_rate(struct ath12k *ar, 12605 enum nl80211_band band, 12606 const struct cfg80211_bitrate_mask *mask, 12607 u32 *rate, u8 *nss) 12608 { 12609 int rate_idx; 12610 u16 bitrate; 12611 u8 preamble; 12612 u8 hw_rate; 12613 12614 if (hweight32(mask->control[band].legacy) != 1) 12615 return -EINVAL; 12616 12617 rate_idx = ffs(mask->control[band].legacy) - 1; 12618 12619 if (band == NL80211_BAND_5GHZ || band == NL80211_BAND_6GHZ) 12620 rate_idx += ATH12K_MAC_FIRST_OFDM_RATE_IDX; 12621 12622 hw_rate = ath12k_legacy_rates[rate_idx].hw_value; 12623 bitrate = ath12k_legacy_rates[rate_idx].bitrate; 12624 12625 if (ath12k_mac_bitrate_is_cck(bitrate)) 12626 preamble = WMI_RATE_PREAMBLE_CCK; 12627 else 12628 preamble = WMI_RATE_PREAMBLE_OFDM; 12629 12630 *nss = 1; 12631 *rate = ATH12K_HW_RATE_CODE(hw_rate, 0, preamble); 12632 12633 return 0; 12634 } 12635 12636 static int 12637 ath12k_mac_set_fixed_rate_gi_ltf(struct ath12k_link_vif *arvif, u8 gi, u8 ltf, 12638 u32 param) 12639 { 12640 struct ath12k *ar = arvif->ar; 12641 int ret; 12642 12643 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 12644 12645 /* 0.8 = 0, 1.6 = 2 and 3.2 = 3. */ 12646 if (gi && gi != 0xFF) 12647 gi += 1; 12648 12649 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 12650 WMI_VDEV_PARAM_SGI, gi); 12651 if (ret) { 12652 ath12k_warn(ar->ab, "failed to set GI:%d, error:%d\n", 12653 gi, ret); 12654 return ret; 12655 } 12656 12657 if (param == WMI_VDEV_PARAM_HE_LTF) { 12658 /* HE values start from 1 */ 12659 if (ltf != 0xFF) 12660 ltf += 1; 12661 } else { 12662 /* EHT values start from 5 */ 12663 if (ltf != 0xFF) 12664 ltf += 4; 12665 } 12666 12667 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 12668 param, ltf); 12669 if (ret) { 12670 ath12k_warn(ar->ab, "failed to set LTF:%d, error:%d\n", 12671 ltf, ret); 12672 return ret; 12673 } 12674 return 0; 12675 } 12676 12677 static int 12678 ath12k_mac_set_auto_rate_gi_ltf(struct ath12k_link_vif *arvif, u16 gi, u8 ltf) 12679 { 12680 struct ath12k *ar = arvif->ar; 12681 int ret; 12682 u32 ar_gi_ltf; 12683 12684 if (gi != 0xFF) { 12685 switch (gi) { 12686 case ATH12K_RATE_INFO_GI_0_8: 12687 gi = WMI_AUTORATE_800NS_GI; 12688 break; 12689 case ATH12K_RATE_INFO_GI_1_6: 12690 gi = WMI_AUTORATE_1600NS_GI; 12691 break; 12692 case ATH12K_RATE_INFO_GI_3_2: 12693 gi = WMI_AUTORATE_3200NS_GI; 12694 break; 12695 default: 12696 ath12k_warn(ar->ab, "Invalid GI\n"); 12697 return -EINVAL; 12698 } 12699 } 12700 12701 if (ltf != 0xFF) { 12702 switch (ltf) { 12703 case ATH12K_RATE_INFO_1XLTF: 12704 ltf = WMI_AUTORATE_LTF_1X; 12705 break; 12706 case ATH12K_RATE_INFO_2XLTF: 12707 ltf = WMI_AUTORATE_LTF_2X; 12708 break; 12709 case ATH12K_RATE_INFO_4XLTF: 12710 ltf = WMI_AUTORATE_LTF_4X; 12711 break; 12712 default: 12713 ath12k_warn(ar->ab, "Invalid LTF\n"); 12714 return -EINVAL; 12715 } 12716 } 12717 12718 ar_gi_ltf = gi | ltf; 12719 12720 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 12721 WMI_VDEV_PARAM_AUTORATE_MISC_CFG, 12722 ar_gi_ltf); 12723 if (ret) { 12724 ath12k_warn(ar->ab, 12725 "failed to set autorate GI:%u, LTF:%u params, error:%d\n", 12726 gi, ltf, ret); 12727 return ret; 12728 } 12729 12730 return 0; 12731 } 12732 12733 static u32 ath12k_mac_nlgi_to_wmigi(enum nl80211_txrate_gi gi) 12734 { 12735 switch (gi) { 12736 case NL80211_TXRATE_DEFAULT_GI: 12737 return WMI_GI_400_NS; 12738 case NL80211_TXRATE_FORCE_LGI: 12739 return WMI_GI_800_NS; 12740 default: 12741 return WMI_GI_400_NS; 12742 } 12743 } 12744 12745 static int ath12k_mac_set_rate_params(struct ath12k_link_vif *arvif, 12746 u32 rate, u8 nss, u8 sgi, u8 ldpc, 12747 u8 he_gi, u8 he_ltf, bool he_fixed_rate, 12748 u8 eht_gi, u8 eht_ltf, 12749 bool eht_fixed_rate) 12750 { 12751 struct ieee80211_bss_conf *link_conf; 12752 struct ath12k *ar = arvif->ar; 12753 bool he_support, eht_support, gi_ltf_set = false; 12754 u32 vdev_param; 12755 u32 param_value; 12756 int ret; 12757 12758 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 12759 12760 link_conf = ath12k_mac_get_link_bss_conf(arvif); 12761 if (!link_conf) 12762 return -EINVAL; 12763 12764 he_support = link_conf->he_support; 12765 eht_support = link_conf->eht_support; 12766 12767 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 12768 "mac set rate params vdev %i rate 0x%02x nss 0x%02x sgi 0x%02x ldpc 0x%02x\n", 12769 arvif->vdev_id, rate, nss, sgi, ldpc); 12770 12771 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 12772 "he_gi 0x%02x he_ltf 0x%02x he_fixed_rate %d\n", he_gi, 12773 he_ltf, he_fixed_rate); 12774 12775 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 12776 "eht_gi 0x%02x eht_ltf 0x%02x eht_fixed_rate %d\n", 12777 eht_gi, eht_ltf, eht_fixed_rate); 12778 12779 if (!he_support && !eht_support) { 12780 vdev_param = WMI_VDEV_PARAM_FIXED_RATE; 12781 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 12782 vdev_param, rate); 12783 if (ret) { 12784 ath12k_warn(ar->ab, "failed to set fixed rate param 0x%02x: %d\n", 12785 rate, ret); 12786 return ret; 12787 } 12788 } 12789 12790 vdev_param = WMI_VDEV_PARAM_NSS; 12791 12792 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 12793 vdev_param, nss); 12794 if (ret) { 12795 ath12k_warn(ar->ab, "failed to set nss param %d: %d\n", 12796 nss, ret); 12797 return ret; 12798 } 12799 12800 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 12801 WMI_VDEV_PARAM_LDPC, ldpc); 12802 if (ret) { 12803 ath12k_warn(ar->ab, "failed to set ldpc param %d: %d\n", 12804 ldpc, ret); 12805 return ret; 12806 } 12807 12808 if (eht_support) { 12809 if (eht_fixed_rate) 12810 ret = ath12k_mac_set_fixed_rate_gi_ltf(arvif, eht_gi, eht_ltf, 12811 WMI_VDEV_PARAM_EHT_LTF); 12812 else 12813 ret = ath12k_mac_set_auto_rate_gi_ltf(arvif, eht_gi, eht_ltf); 12814 12815 if (ret) { 12816 ath12k_warn(ar->ab, 12817 "failed to set EHT LTF/GI params %d/%d: %d\n", 12818 eht_gi, eht_ltf, ret); 12819 return ret; 12820 } 12821 gi_ltf_set = true; 12822 } 12823 12824 if (he_support) { 12825 if (he_fixed_rate) 12826 ret = ath12k_mac_set_fixed_rate_gi_ltf(arvif, he_gi, he_ltf, 12827 WMI_VDEV_PARAM_HE_LTF); 12828 else 12829 ret = ath12k_mac_set_auto_rate_gi_ltf(arvif, he_gi, he_ltf); 12830 if (ret) 12831 return ret; 12832 gi_ltf_set = true; 12833 } 12834 12835 if (!gi_ltf_set) { 12836 vdev_param = WMI_VDEV_PARAM_SGI; 12837 param_value = ath12k_mac_nlgi_to_wmigi(sgi); 12838 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, 12839 vdev_param, param_value); 12840 if (ret) { 12841 ath12k_warn(ar->ab, "failed to set sgi param %d: %d\n", 12842 sgi, ret); 12843 return ret; 12844 } 12845 } 12846 12847 return 0; 12848 } 12849 12850 static bool 12851 ath12k_mac_vht_mcs_range_present(struct ath12k *ar, 12852 enum nl80211_band band, 12853 const struct cfg80211_bitrate_mask *mask) 12854 { 12855 int i; 12856 u16 vht_mcs; 12857 12858 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) { 12859 vht_mcs = mask->control[band].vht_mcs[i]; 12860 12861 switch (vht_mcs) { 12862 case 0: 12863 case BIT(8) - 1: 12864 case BIT(9) - 1: 12865 case BIT(10) - 1: 12866 break; 12867 default: 12868 return false; 12869 } 12870 } 12871 12872 return true; 12873 } 12874 12875 static bool 12876 ath12k_mac_he_mcs_range_present(struct ath12k *ar, 12877 enum nl80211_band band, 12878 const struct cfg80211_bitrate_mask *mask) 12879 { 12880 int i; 12881 u16 he_mcs; 12882 12883 for (i = 0; i < NL80211_HE_NSS_MAX; i++) { 12884 he_mcs = mask->control[band].he_mcs[i]; 12885 12886 switch (he_mcs) { 12887 case 0: 12888 case BIT(8) - 1: 12889 case BIT(10) - 1: 12890 case BIT(12) - 1: 12891 break; 12892 default: 12893 return false; 12894 } 12895 } 12896 12897 return true; 12898 } 12899 12900 static bool 12901 ath12k_mac_eht_mcs_range_present(struct ath12k *ar, 12902 enum nl80211_band band, 12903 const struct cfg80211_bitrate_mask *mask) 12904 { 12905 u16 eht_mcs; 12906 int i; 12907 12908 for (i = 0; i < NL80211_EHT_NSS_MAX; i++) { 12909 eht_mcs = mask->control[band].eht_mcs[i]; 12910 12911 switch (eht_mcs) { 12912 case 0: 12913 case BIT(8) - 1: 12914 case BIT(10) - 1: 12915 case BIT(12) - 1: 12916 case BIT(14) - 1: 12917 break; 12918 case BIT(15) - 1: 12919 case BIT(16) - 1: 12920 case BIT(16) - BIT(14) - 1: 12921 if (i != 0) 12922 return false; 12923 break; 12924 default: 12925 return false; 12926 } 12927 } 12928 12929 return true; 12930 } 12931 12932 static void ath12k_mac_set_bitrate_mask_iter(void *data, 12933 struct ieee80211_sta *sta) 12934 { 12935 struct ath12k_link_vif *arvif = data; 12936 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta); 12937 struct ath12k_link_sta *arsta; 12938 struct ath12k *ar = arvif->ar; 12939 12940 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 12941 12942 arsta = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy, 12943 ahsta->link[arvif->link_id]); 12944 if (!arsta || arsta->arvif != arvif) 12945 return; 12946 12947 spin_lock_bh(&ar->data_lock); 12948 arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED; 12949 spin_unlock_bh(&ar->data_lock); 12950 12951 wiphy_work_queue(ath12k_ar_to_hw(ar)->wiphy, &arsta->update_wk); 12952 } 12953 12954 static void ath12k_mac_disable_peer_fixed_rate(void *data, 12955 struct ieee80211_sta *sta) 12956 { 12957 struct ath12k_link_vif *arvif = data; 12958 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta); 12959 struct ath12k_link_sta *arsta; 12960 struct ath12k *ar = arvif->ar; 12961 int ret; 12962 12963 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 12964 12965 arsta = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy, 12966 ahsta->link[arvif->link_id]); 12967 12968 if (!arsta || arsta->arvif != arvif) 12969 return; 12970 12971 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, 12972 arvif->vdev_id, 12973 WMI_PEER_PARAM_FIXED_RATE, 12974 WMI_FIXED_RATE_NONE); 12975 if (ret) 12976 ath12k_warn(ar->ab, 12977 "failed to disable peer fixed rate for STA %pM ret %d\n", 12978 arsta->addr, ret); 12979 } 12980 12981 static bool 12982 ath12k_mac_validate_fixed_rate_settings(struct ath12k *ar, enum nl80211_band band, 12983 const struct cfg80211_bitrate_mask *mask, 12984 unsigned int link_id) 12985 { 12986 bool eht_fixed_rate = false, he_fixed_rate = false, vht_fixed_rate = false; 12987 const u16 *vht_mcs_mask, *he_mcs_mask, *eht_mcs_mask; 12988 struct ieee80211_link_sta *link_sta; 12989 struct ath12k_dp_link_peer *peer, *tmp; 12990 u8 vht_nss, he_nss, eht_nss; 12991 int ret = true; 12992 struct ath12k_base *ab = ar->ab; 12993 struct ath12k_dp *dp = ath12k_ab_to_dp(ab); 12994 12995 vht_mcs_mask = mask->control[band].vht_mcs; 12996 he_mcs_mask = mask->control[band].he_mcs; 12997 eht_mcs_mask = mask->control[band].eht_mcs; 12998 12999 if (ath12k_mac_bitrate_mask_num_vht_rates(ar, band, mask) == 1) 13000 vht_fixed_rate = true; 13001 13002 if (ath12k_mac_bitrate_mask_num_he_rates(ar, band, mask) == 1) 13003 he_fixed_rate = true; 13004 13005 if (ath12k_mac_bitrate_mask_num_eht_rates(ar, band, mask) == 1) 13006 eht_fixed_rate = true; 13007 13008 if (!vht_fixed_rate && !he_fixed_rate && !eht_fixed_rate) 13009 return true; 13010 13011 vht_nss = ath12k_mac_max_vht_nss(vht_mcs_mask); 13012 he_nss = ath12k_mac_max_he_nss(he_mcs_mask); 13013 eht_nss = ath12k_mac_max_eht_nss(eht_mcs_mask); 13014 13015 rcu_read_lock(); 13016 spin_lock_bh(&dp->dp_lock); 13017 list_for_each_entry_safe(peer, tmp, &dp->peers, list) { 13018 if (peer->sta) { 13019 link_sta = rcu_dereference(peer->sta->link[link_id]); 13020 if (!link_sta) { 13021 ret = false; 13022 goto exit; 13023 } 13024 13025 if (vht_fixed_rate && (!link_sta->vht_cap.vht_supported || 13026 link_sta->rx_nss < vht_nss)) { 13027 ret = false; 13028 goto exit; 13029 } 13030 if (he_fixed_rate && (!link_sta->he_cap.has_he || 13031 link_sta->rx_nss < he_nss)) { 13032 ret = false; 13033 goto exit; 13034 } 13035 if (eht_fixed_rate && (!link_sta->eht_cap.has_eht || 13036 link_sta->rx_nss < eht_nss)) { 13037 ret = false; 13038 goto exit; 13039 } 13040 } 13041 } 13042 exit: 13043 spin_unlock_bh(&dp->dp_lock); 13044 rcu_read_unlock(); 13045 return ret; 13046 } 13047 13048 int 13049 ath12k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw, 13050 struct ieee80211_vif *vif, 13051 const struct cfg80211_bitrate_mask *mask) 13052 { 13053 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 13054 struct ath12k_link_vif *arvif; 13055 struct cfg80211_chan_def def; 13056 struct ath12k *ar; 13057 enum nl80211_band band; 13058 const u8 *ht_mcs_mask; 13059 const u16 *vht_mcs_mask; 13060 const u16 *he_mcs_mask; 13061 const u16 *eht_mcs_mask; 13062 u8 he_ltf = 0; 13063 u8 he_gi = 0; 13064 u8 eht_ltf = 0, eht_gi = 0; 13065 u32 rate; 13066 u8 nss, mac_nss; 13067 u8 sgi; 13068 u8 ldpc; 13069 int single_nss; 13070 int ret; 13071 int num_rates; 13072 bool he_fixed_rate = false; 13073 bool eht_fixed_rate = false; 13074 13075 lockdep_assert_wiphy(hw->wiphy); 13076 13077 arvif = &ahvif->deflink; 13078 13079 ar = arvif->ar; 13080 if (ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)) { 13081 ret = -EPERM; 13082 goto out; 13083 } 13084 13085 band = def.chan->band; 13086 ht_mcs_mask = mask->control[band].ht_mcs; 13087 vht_mcs_mask = mask->control[band].vht_mcs; 13088 he_mcs_mask = mask->control[band].he_mcs; 13089 eht_mcs_mask = mask->control[band].eht_mcs; 13090 ldpc = !!(ar->ht_cap_info & WMI_HT_CAP_LDPC); 13091 13092 sgi = mask->control[band].gi; 13093 if (sgi == NL80211_TXRATE_FORCE_SGI) { 13094 ret = -EINVAL; 13095 goto out; 13096 } 13097 13098 he_gi = mask->control[band].he_gi; 13099 he_ltf = mask->control[band].he_ltf; 13100 13101 eht_gi = mask->control[band].eht_gi; 13102 eht_ltf = mask->control[band].eht_ltf; 13103 13104 /* mac80211 doesn't support sending a fixed HT/VHT MCS alone, rather it 13105 * requires passing at least one of used basic rates along with them. 13106 * Fixed rate setting across different preambles(legacy, HT, VHT) is 13107 * not supported by the FW. Hence use of FIXED_RATE vdev param is not 13108 * suitable for setting single HT/VHT rates. 13109 * But, there could be a single basic rate passed from userspace which 13110 * can be done through the FIXED_RATE param. 13111 */ 13112 if (ath12k_mac_has_single_legacy_rate(ar, band, mask)) { 13113 ret = ath12k_mac_get_single_legacy_rate(ar, band, mask, &rate, 13114 &nss); 13115 if (ret) { 13116 ath12k_warn(ar->ab, "failed to get single legacy rate for vdev %i: %d\n", 13117 arvif->vdev_id, ret); 13118 goto out; 13119 } 13120 13121 ieee80211_iterate_stations_mtx(hw, 13122 ath12k_mac_disable_peer_fixed_rate, 13123 arvif); 13124 } else if (ath12k_mac_bitrate_mask_get_single_nss(ar, vif, band, mask, 13125 &single_nss)) { 13126 rate = WMI_FIXED_RATE_NONE; 13127 nss = single_nss; 13128 arvif->bitrate_mask = *mask; 13129 13130 ieee80211_iterate_stations_atomic(hw, 13131 ath12k_mac_set_bitrate_mask_iter, 13132 arvif); 13133 } else { 13134 rate = WMI_FIXED_RATE_NONE; 13135 13136 if (!ath12k_mac_validate_fixed_rate_settings(ar, band, 13137 mask, arvif->link_id)) 13138 ath12k_warn(ar->ab, 13139 "failed to update fixed rate settings due to mcs/nss incompatibility\n"); 13140 13141 mac_nss = max(max3(ath12k_mac_max_ht_nss(ht_mcs_mask), 13142 ath12k_mac_max_vht_nss(vht_mcs_mask), 13143 ath12k_mac_max_he_nss(he_mcs_mask)), 13144 ath12k_mac_max_eht_nss(eht_mcs_mask)); 13145 nss = min_t(u32, ar->num_tx_chains, mac_nss); 13146 13147 /* If multiple rates across different preambles are given 13148 * we can reconfigure this info with all peers using PEER_ASSOC 13149 * command with the below exception cases. 13150 * - Single VHT Rate : peer_assoc command accommodates only MCS 13151 * range values i.e 0-7, 0-8, 0-9 for VHT. Though mac80211 13152 * mandates passing basic rates along with HT/VHT rates, FW 13153 * doesn't allow switching from VHT to Legacy. Hence instead of 13154 * setting legacy and VHT rates using RATEMASK_CMD vdev cmd, 13155 * we could set this VHT rate as peer fixed rate param, which 13156 * will override FIXED rate and FW rate control algorithm. 13157 * If single VHT rate is passed along with HT rates, we select 13158 * the VHT rate as fixed rate for vht peers. 13159 * - Multiple VHT Rates : When Multiple VHT rates are given,this 13160 * can be set using RATEMASK CMD which uses FW rate-ctl alg. 13161 * TODO: Setting multiple VHT MCS and replacing peer_assoc with 13162 * RATEMASK_CMDID can cover all use cases of setting rates 13163 * across multiple preambles and rates within same type. 13164 * But requires more validation of the command at this point. 13165 */ 13166 13167 num_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band, 13168 mask); 13169 13170 if (!ath12k_mac_vht_mcs_range_present(ar, band, mask) && 13171 num_rates > 1) { 13172 /* TODO: Handle multiple VHT MCS values setting using 13173 * RATEMASK CMD 13174 */ 13175 ath12k_warn(ar->ab, 13176 "Setting more than one MCS Value in bitrate mask not supported\n"); 13177 ret = -EINVAL; 13178 goto out; 13179 } 13180 13181 num_rates = ath12k_mac_bitrate_mask_num_he_rates(ar, band, mask); 13182 if (num_rates == 1) 13183 he_fixed_rate = true; 13184 13185 if (!ath12k_mac_he_mcs_range_present(ar, band, mask) && 13186 num_rates > 1) { 13187 ath12k_warn(ar->ab, 13188 "Setting more than one HE MCS Value in bitrate mask not supported\n"); 13189 ret = -EINVAL; 13190 goto out; 13191 } 13192 13193 num_rates = ath12k_mac_bitrate_mask_num_eht_rates(ar, band, 13194 mask); 13195 if (num_rates == 1) 13196 eht_fixed_rate = true; 13197 13198 if (!ath12k_mac_eht_mcs_range_present(ar, band, mask) && 13199 num_rates > 1) { 13200 ath12k_warn(ar->ab, 13201 "Setting more than one EHT MCS Value in bitrate mask not supported\n"); 13202 ret = -EINVAL; 13203 goto out; 13204 } 13205 13206 ieee80211_iterate_stations_mtx(hw, 13207 ath12k_mac_disable_peer_fixed_rate, 13208 arvif); 13209 13210 arvif->bitrate_mask = *mask; 13211 ieee80211_iterate_stations_mtx(hw, 13212 ath12k_mac_set_bitrate_mask_iter, 13213 arvif); 13214 } 13215 13216 ret = ath12k_mac_set_rate_params(arvif, rate, nss, sgi, ldpc, he_gi, 13217 he_ltf, he_fixed_rate, eht_gi, eht_ltf, 13218 eht_fixed_rate); 13219 if (ret) { 13220 ath12k_warn(ar->ab, "failed to set rate params on vdev %i: %d\n", 13221 arvif->vdev_id, ret); 13222 } 13223 13224 out: 13225 return ret; 13226 } 13227 EXPORT_SYMBOL(ath12k_mac_op_set_bitrate_mask); 13228 13229 void 13230 ath12k_mac_op_reconfig_complete(struct ieee80211_hw *hw, 13231 enum ieee80211_reconfig_type reconfig_type) 13232 { 13233 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 13234 struct ath12k *ar; 13235 struct ath12k_base *ab; 13236 struct ath12k_vif *ahvif; 13237 struct ath12k_link_vif *arvif; 13238 int recovery_count, i; 13239 13240 lockdep_assert_wiphy(hw->wiphy); 13241 13242 if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART) 13243 return; 13244 13245 guard(mutex)(&ah->hw_mutex); 13246 13247 if (ah->state != ATH12K_HW_STATE_RESTARTED) 13248 return; 13249 13250 ah->state = ATH12K_HW_STATE_ON; 13251 ieee80211_wake_queues(hw); 13252 13253 for_each_ar(ah, ar, i) { 13254 ab = ar->ab; 13255 13256 ath12k_warn(ar->ab, "pdev %d successfully recovered\n", 13257 ar->pdev->pdev_id); 13258 13259 if (ar->ab->hw_params->current_cc_support && 13260 ar->alpha2[0] != 0 && ar->alpha2[1] != 0) { 13261 struct wmi_set_current_country_arg arg = {}; 13262 13263 memcpy(&arg.alpha2, ar->alpha2, 2); 13264 reinit_completion(&ar->regd_update_completed); 13265 ath12k_wmi_send_set_current_country_cmd(ar, &arg); 13266 } 13267 13268 if (ab->is_reset) { 13269 recovery_count = atomic_inc_return(&ab->recovery_count); 13270 13271 ath12k_dbg(ab, ATH12K_DBG_BOOT, "recovery count %d\n", 13272 recovery_count); 13273 13274 /* When there are multiple radios in an SOC, 13275 * the recovery has to be done for each radio 13276 */ 13277 if (recovery_count == ab->num_radios) { 13278 atomic_dec(&ab->reset_count); 13279 complete(&ab->reset_complete); 13280 ab->is_reset = false; 13281 atomic_set(&ab->fail_cont_count, 0); 13282 ath12k_dbg(ab, ATH12K_DBG_BOOT, "reset success\n"); 13283 } 13284 } 13285 13286 list_for_each_entry(arvif, &ar->arvifs, list) { 13287 ahvif = arvif->ahvif; 13288 ath12k_dbg(ab, ATH12K_DBG_BOOT, 13289 "reconfig cipher %d up %d vdev type %d\n", 13290 ahvif->dp_vif.key_cipher, 13291 arvif->is_up, 13292 ahvif->vdev_type); 13293 13294 /* After trigger disconnect, then upper layer will 13295 * trigger connect again, then the PN number of 13296 * upper layer will be reset to keep up with AP 13297 * side, hence PN number mismatch will not happen. 13298 */ 13299 if (arvif->is_up && 13300 ahvif->vdev_type == WMI_VDEV_TYPE_STA && 13301 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) { 13302 ieee80211_hw_restart_disconnect(ahvif->vif); 13303 13304 ath12k_dbg(ab, ATH12K_DBG_BOOT, 13305 "restart disconnect\n"); 13306 } 13307 } 13308 } 13309 } 13310 EXPORT_SYMBOL(ath12k_mac_op_reconfig_complete); 13311 13312 static void 13313 ath12k_mac_update_bss_chan_survey(struct ath12k *ar, 13314 struct ieee80211_channel *channel) 13315 { 13316 int ret; 13317 enum wmi_bss_chan_info_req_type type = WMI_BSS_SURVEY_REQ_TYPE_READ; 13318 13319 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 13320 13321 if (!test_bit(WMI_TLV_SERVICE_BSS_CHANNEL_INFO_64, ar->ab->wmi_ab.svc_map) || 13322 ar->rx_channel != channel) 13323 return; 13324 13325 if (ar->scan.state != ATH12K_SCAN_IDLE) { 13326 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 13327 "ignoring bss chan info req while scanning..\n"); 13328 return; 13329 } 13330 13331 reinit_completion(&ar->bss_survey_done); 13332 13333 ret = ath12k_wmi_pdev_bss_chan_info_request(ar, type); 13334 if (ret) { 13335 ath12k_warn(ar->ab, "failed to send pdev bss chan info request\n"); 13336 return; 13337 } 13338 13339 ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ); 13340 if (ret == 0) 13341 ath12k_warn(ar->ab, "bss channel survey timed out\n"); 13342 } 13343 13344 int ath12k_mac_op_get_survey(struct ieee80211_hw *hw, int idx, 13345 struct survey_info *survey) 13346 { 13347 struct ath12k *ar; 13348 struct ieee80211_supported_band *sband; 13349 struct survey_info *ar_survey; 13350 13351 lockdep_assert_wiphy(hw->wiphy); 13352 13353 if (idx >= ATH12K_NUM_CHANS) 13354 return -ENOENT; 13355 13356 sband = hw->wiphy->bands[NL80211_BAND_2GHZ]; 13357 if (sband && idx >= sband->n_channels) { 13358 idx -= sband->n_channels; 13359 sband = NULL; 13360 } 13361 13362 if (!sband) 13363 sband = hw->wiphy->bands[NL80211_BAND_5GHZ]; 13364 if (sband && idx >= sband->n_channels) { 13365 idx -= sband->n_channels; 13366 sband = NULL; 13367 } 13368 13369 if (!sband) 13370 sband = hw->wiphy->bands[NL80211_BAND_6GHZ]; 13371 13372 if (!sband || idx >= sband->n_channels) 13373 return -ENOENT; 13374 13375 ar = ath12k_mac_get_ar_by_chan(hw, &sband->channels[idx]); 13376 if (!ar) { 13377 if (sband->channels[idx].flags & IEEE80211_CHAN_DISABLED) { 13378 memset(survey, 0, sizeof(*survey)); 13379 return 0; 13380 } 13381 return -ENOENT; 13382 } 13383 13384 ar_survey = &ar->survey[idx]; 13385 13386 ath12k_mac_update_bss_chan_survey(ar, &sband->channels[idx]); 13387 13388 spin_lock_bh(&ar->data_lock); 13389 memcpy(survey, ar_survey, sizeof(*survey)); 13390 spin_unlock_bh(&ar->data_lock); 13391 13392 survey->channel = &sband->channels[idx]; 13393 13394 if (ar->rx_channel == survey->channel) 13395 survey->filled |= SURVEY_INFO_IN_USE; 13396 13397 return 0; 13398 } 13399 EXPORT_SYMBOL(ath12k_mac_op_get_survey); 13400 13401 static void ath12k_mac_put_chain_rssi(struct station_info *sinfo, 13402 struct ath12k_link_sta *arsta) 13403 { 13404 s8 rssi; 13405 int i; 13406 13407 for (i = 0; i < ARRAY_SIZE(sinfo->chain_signal); i++) { 13408 sinfo->chains &= ~BIT(i); 13409 rssi = arsta->chain_signal[i]; 13410 13411 if (rssi != ATH12K_DEFAULT_NOISE_FLOOR && 13412 rssi != ATH12K_INVALID_RSSI_FULL && 13413 rssi != ATH12K_INVALID_RSSI_EMPTY && 13414 rssi != 0) { 13415 sinfo->chain_signal[i] = rssi; 13416 sinfo->chains |= BIT(i); 13417 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL); 13418 } 13419 } 13420 } 13421 13422 void ath12k_mac_op_sta_statistics(struct ieee80211_hw *hw, 13423 struct ieee80211_vif *vif, 13424 struct ieee80211_sta *sta, 13425 struct station_info *sinfo) 13426 { 13427 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta); 13428 struct ath12k_dp_link_peer_rate_info rate_info = {}; 13429 struct ath12k_fw_stats_req_params params = {}; 13430 struct ath12k_dp_link_peer *peer; 13431 struct ath12k_link_sta *arsta; 13432 s8 signal, noise_floor; 13433 struct ath12k_dp *dp; 13434 struct ath12k *ar; 13435 bool db2dbm; 13436 13437 lockdep_assert_wiphy(hw->wiphy); 13438 13439 arsta = &ahsta->deflink; 13440 ar = ath12k_get_ar_by_vif(hw, vif, arsta->link_id); 13441 if (!ar) 13442 return; 13443 13444 dp = ath12k_ab_to_dp(ar->ab); 13445 ath12k_dp_link_peer_get_sta_rate_info_stats(dp, arsta->addr, &rate_info); 13446 13447 db2dbm = test_bit(WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT, 13448 ar->ab->wmi_ab.svc_map); 13449 13450 sinfo->rx_duration = rate_info.rx_duration; 13451 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION); 13452 13453 sinfo->tx_duration = rate_info.tx_duration; 13454 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION); 13455 13456 if (rate_info.txrate.legacy || rate_info.txrate.nss) { 13457 if (rate_info.txrate.legacy) { 13458 sinfo->txrate.legacy = rate_info.txrate.legacy; 13459 } else { 13460 sinfo->txrate.mcs = rate_info.txrate.mcs; 13461 sinfo->txrate.nss = rate_info.txrate.nss; 13462 sinfo->txrate.bw = rate_info.txrate.bw; 13463 sinfo->txrate.he_gi = rate_info.txrate.he_gi; 13464 sinfo->txrate.he_dcm = rate_info.txrate.he_dcm; 13465 sinfo->txrate.he_ru_alloc = rate_info.txrate.he_ru_alloc; 13466 sinfo->txrate.eht_gi = rate_info.txrate.eht_gi; 13467 sinfo->txrate.eht_ru_alloc = rate_info.txrate.eht_ru_alloc; 13468 } 13469 sinfo->txrate.flags = rate_info.txrate.flags; 13470 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE); 13471 } 13472 13473 /* TODO: Use real NF instead of default one. */ 13474 signal = rate_info.rssi_comb; 13475 13476 params.pdev_id = ath12k_mac_get_target_pdev_id(ar); 13477 params.vdev_id = 0; 13478 params.stats_id = WMI_REQUEST_VDEV_STAT; 13479 13480 if (!signal && 13481 ahsta->ahvif->vdev_type == WMI_VDEV_TYPE_STA && 13482 !(ath12k_mac_get_fw_stats(ar, ¶ms))) { 13483 signal = arsta->rssi_beacon; 13484 ath12k_fw_stats_reset(ar); 13485 } 13486 13487 params.stats_id = WMI_REQUEST_RSSI_PER_CHAIN_STAT; 13488 if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) && 13489 ahsta->ahvif->vdev_type == WMI_VDEV_TYPE_STA && 13490 !(ath12k_mac_get_fw_stats(ar, ¶ms))) { 13491 ath12k_mac_put_chain_rssi(sinfo, arsta); 13492 ath12k_fw_stats_reset(ar); 13493 } 13494 13495 spin_lock_bh(&ar->data_lock); 13496 noise_floor = ath12k_pdev_get_noise_floor(ar); 13497 spin_unlock_bh(&ar->data_lock); 13498 13499 if (signal) { 13500 sinfo->signal = db2dbm ? signal : signal + noise_floor; 13501 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL); 13502 } 13503 13504 sinfo->signal_avg = rate_info.signal_avg; 13505 13506 if (!db2dbm) 13507 sinfo->signal_avg += noise_floor; 13508 13509 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG); 13510 13511 spin_lock_bh(&dp->dp_lock); 13512 peer = ath12k_dp_link_peer_find_by_addr(dp, arsta->addr); 13513 if (!peer) { 13514 spin_unlock_bh(&dp->dp_lock); 13515 return; 13516 } 13517 13518 sinfo->tx_retries = peer->tx_retry_count; 13519 sinfo->tx_failed = peer->tx_retry_failed; 13520 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES); 13521 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED); 13522 13523 spin_unlock_bh(&dp->dp_lock); 13524 } 13525 EXPORT_SYMBOL(ath12k_mac_op_sta_statistics); 13526 13527 void ath12k_mac_op_link_sta_statistics(struct ieee80211_hw *hw, 13528 struct ieee80211_vif *vif, 13529 struct ieee80211_link_sta *link_sta, 13530 struct link_station_info *link_sinfo) 13531 { 13532 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(link_sta->sta); 13533 struct ath12k_fw_stats_req_params params = {}; 13534 struct ath12k_dp_link_peer *peer; 13535 struct ath12k_link_sta *arsta; 13536 struct ath12k *ar; 13537 s8 signal; 13538 bool db2dbm; 13539 13540 lockdep_assert_wiphy(hw->wiphy); 13541 13542 arsta = wiphy_dereference(hw->wiphy, ahsta->link[link_sta->link_id]); 13543 13544 if (!arsta) 13545 return; 13546 13547 ar = ath12k_get_ar_by_vif(hw, vif, arsta->link_id); 13548 if (!ar) 13549 return; 13550 13551 db2dbm = test_bit(WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT, 13552 ar->ab->wmi_ab.svc_map); 13553 13554 spin_lock_bh(&ar->ab->dp->dp_lock); 13555 peer = ath12k_dp_link_peer_find_by_addr(ar->ab->dp, arsta->addr); 13556 if (!peer) { 13557 spin_unlock_bh(&ar->ab->dp->dp_lock); 13558 return; 13559 } 13560 13561 link_sinfo->rx_duration = peer->rx_duration; 13562 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION); 13563 13564 link_sinfo->tx_duration = peer->tx_duration; 13565 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION); 13566 13567 if (peer->txrate.legacy || peer->txrate.nss) { 13568 if (peer->txrate.legacy) { 13569 link_sinfo->txrate.legacy = peer->txrate.legacy; 13570 } else { 13571 link_sinfo->txrate.mcs = peer->txrate.mcs; 13572 link_sinfo->txrate.nss = peer->txrate.nss; 13573 link_sinfo->txrate.bw = peer->txrate.bw; 13574 link_sinfo->txrate.he_gi = peer->txrate.he_gi; 13575 link_sinfo->txrate.he_dcm = peer->txrate.he_dcm; 13576 link_sinfo->txrate.he_ru_alloc = 13577 peer->txrate.he_ru_alloc; 13578 link_sinfo->txrate.eht_gi = peer->txrate.eht_gi; 13579 link_sinfo->txrate.eht_ru_alloc = 13580 peer->txrate.eht_ru_alloc; 13581 } 13582 link_sinfo->txrate.flags = peer->txrate.flags; 13583 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE); 13584 } 13585 13586 link_sinfo->signal_avg = ewma_avg_rssi_read(&peer->avg_rssi); 13587 13588 if (!db2dbm) 13589 link_sinfo->signal_avg += ATH12K_DEFAULT_NOISE_FLOOR; 13590 13591 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG); 13592 13593 link_sinfo->tx_retries = peer->tx_retry_count; 13594 link_sinfo->tx_failed = peer->tx_retry_failed; 13595 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES); 13596 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED); 13597 13598 /* TODO: Use real NF instead of default one. */ 13599 signal = peer->rssi_comb; 13600 13601 spin_unlock_bh(&ar->ab->dp->dp_lock); 13602 13603 if (!signal && ahsta->ahvif->vdev_type == WMI_VDEV_TYPE_STA) { 13604 params.pdev_id = ath12k_mac_get_target_pdev_id(ar); 13605 params.vdev_id = 0; 13606 params.stats_id = WMI_REQUEST_VDEV_STAT; 13607 13608 if (!ath12k_mac_get_fw_stats(ar, ¶ms)) { 13609 signal = arsta->rssi_beacon; 13610 ath12k_fw_stats_reset(ar); 13611 } 13612 } 13613 13614 if (signal) { 13615 link_sinfo->signal = 13616 db2dbm ? signal : signal + ATH12K_DEFAULT_NOISE_FLOOR; 13617 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL); 13618 } 13619 } 13620 EXPORT_SYMBOL(ath12k_mac_op_link_sta_statistics); 13621 13622 int ath12k_mac_op_cancel_remain_on_channel(struct ieee80211_hw *hw, 13623 struct ieee80211_vif *vif) 13624 { 13625 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 13626 struct ath12k *ar; 13627 13628 ar = ath12k_ah_to_ar(ah, 0); 13629 13630 lockdep_assert_wiphy(hw->wiphy); 13631 13632 spin_lock_bh(&ar->data_lock); 13633 ar->scan.roc_notify = false; 13634 spin_unlock_bh(&ar->data_lock); 13635 13636 ath12k_scan_abort(ar); 13637 13638 cancel_delayed_work_sync(&ar->scan.timeout); 13639 wiphy_work_flush(hw->wiphy, &ar->scan.vdev_clean_wk); 13640 13641 return 0; 13642 } 13643 EXPORT_SYMBOL(ath12k_mac_op_cancel_remain_on_channel); 13644 13645 int ath12k_mac_op_remain_on_channel(struct ieee80211_hw *hw, 13646 struct ieee80211_vif *vif, 13647 struct ieee80211_channel *chan, 13648 int duration, 13649 enum ieee80211_roc_type type) 13650 { 13651 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 13652 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 13653 struct ath12k_link_vif *arvif; 13654 struct ath12k *ar; 13655 u32 scan_time_msec; 13656 bool create = true; 13657 u8 link_id; 13658 int ret; 13659 13660 lockdep_assert_wiphy(hw->wiphy); 13661 13662 ar = ath12k_mac_select_scan_device(hw, vif, chan->center_freq); 13663 if (!ar) 13664 return -EINVAL; 13665 13666 /* check if any of the links of ML VIF is already started on 13667 * radio(ar) corresponding to given scan frequency and use it, 13668 * if not use deflink(link 0) for scan purpose. 13669 */ 13670 13671 link_id = ath12k_mac_find_link_id_by_ar(ahvif, ar); 13672 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id); 13673 /* If the vif is already assigned to a specific vdev of an ar, 13674 * check whether its already started, vdev which is started 13675 * are not allowed to switch to a new radio. 13676 * If the vdev is not started, but was earlier created on a 13677 * different ar, delete that vdev and create a new one. We don't 13678 * delete at the scan stop as an optimization to avoid redundant 13679 * delete-create vdev's for the same ar, in case the request is 13680 * always on the same band for the vif 13681 */ 13682 if (arvif->is_created) { 13683 if (WARN_ON(!arvif->ar)) 13684 return -EINVAL; 13685 13686 if (ar != arvif->ar && arvif->is_started) 13687 return -EBUSY; 13688 13689 if (ar != arvif->ar) { 13690 ath12k_mac_remove_link_interface(hw, arvif); 13691 ath12k_mac_unassign_link_vif(arvif); 13692 } else { 13693 create = false; 13694 } 13695 } 13696 13697 if (create) { 13698 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id); 13699 13700 ret = ath12k_mac_vdev_create(ar, arvif); 13701 if (ret) { 13702 ath12k_warn(ar->ab, "unable to create scan vdev for roc: %d\n", 13703 ret); 13704 ath12k_mac_unassign_link_vif(arvif); 13705 return ret; 13706 } 13707 } 13708 13709 spin_lock_bh(&ar->data_lock); 13710 13711 switch (ar->scan.state) { 13712 case ATH12K_SCAN_IDLE: 13713 reinit_completion(&ar->scan.started); 13714 reinit_completion(&ar->scan.completed); 13715 reinit_completion(&ar->scan.on_channel); 13716 ar->scan.state = ATH12K_SCAN_STARTING; 13717 ar->scan.is_roc = true; 13718 ar->scan.arvif = arvif; 13719 ar->scan.roc_freq = chan->center_freq; 13720 ar->scan.roc_notify = true; 13721 ret = 0; 13722 break; 13723 case ATH12K_SCAN_STARTING: 13724 case ATH12K_SCAN_RUNNING: 13725 case ATH12K_SCAN_ABORTING: 13726 ret = -EBUSY; 13727 break; 13728 } 13729 13730 spin_unlock_bh(&ar->data_lock); 13731 13732 if (ret) 13733 return ret; 13734 13735 scan_time_msec = hw->wiphy->max_remain_on_channel_duration * 2; 13736 13737 struct ath12k_wmi_scan_req_arg *arg __free(kfree) = 13738 kzalloc_obj(*arg); 13739 if (!arg) 13740 return -ENOMEM; 13741 13742 ath12k_wmi_start_scan_init(ar, arg); 13743 arg->num_chan = 1; 13744 13745 u32 *chan_list __free(kfree) = kcalloc(arg->num_chan, sizeof(*chan_list), 13746 GFP_KERNEL); 13747 if (!chan_list) 13748 return -ENOMEM; 13749 13750 arg->chan_list = chan_list; 13751 arg->vdev_id = arvif->vdev_id; 13752 arg->scan_id = ATH12K_SCAN_ID; 13753 arg->chan_list[0] = chan->center_freq; 13754 arg->dwell_time_active = scan_time_msec; 13755 arg->dwell_time_passive = scan_time_msec; 13756 arg->max_scan_time = scan_time_msec; 13757 arg->scan_f_passive = 1; 13758 arg->burst_duration = duration; 13759 13760 ret = ath12k_start_scan(ar, arg); 13761 if (ret) { 13762 ath12k_warn(ar->ab, "failed to start roc scan: %d\n", ret); 13763 13764 spin_lock_bh(&ar->data_lock); 13765 ar->scan.state = ATH12K_SCAN_IDLE; 13766 spin_unlock_bh(&ar->data_lock); 13767 return ret; 13768 } 13769 13770 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3 * HZ); 13771 if (ret == 0) { 13772 ath12k_warn(ar->ab, "failed to switch to channel for roc scan\n"); 13773 ret = ath12k_scan_stop(ar); 13774 if (ret) 13775 ath12k_warn(ar->ab, "failed to stop scan: %d\n", ret); 13776 return -ETIMEDOUT; 13777 } 13778 13779 ieee80211_queue_delayed_work(hw, &ar->scan.timeout, 13780 msecs_to_jiffies(duration)); 13781 13782 return 0; 13783 } 13784 EXPORT_SYMBOL(ath12k_mac_op_remain_on_channel); 13785 13786 void ath12k_mac_op_set_rekey_data(struct ieee80211_hw *hw, 13787 struct ieee80211_vif *vif, 13788 struct cfg80211_gtk_rekey_data *data) 13789 { 13790 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif); 13791 struct ath12k_rekey_data *rekey_data; 13792 struct ath12k_hw *ah = ath12k_hw_to_ah(hw); 13793 struct ath12k *ar = ath12k_ah_to_ar(ah, 0); 13794 struct ath12k_link_vif *arvif; 13795 13796 lockdep_assert_wiphy(hw->wiphy); 13797 13798 arvif = &ahvif->deflink; 13799 rekey_data = &arvif->rekey_data; 13800 13801 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac set rekey data vdev %d\n", 13802 arvif->vdev_id); 13803 13804 memcpy(rekey_data->kck, data->kck, NL80211_KCK_LEN); 13805 memcpy(rekey_data->kek, data->kek, NL80211_KEK_LEN); 13806 13807 /* The supplicant works on big-endian, the firmware expects it on 13808 * little endian. 13809 */ 13810 rekey_data->replay_ctr = get_unaligned_be64(data->replay_ctr); 13811 13812 arvif->rekey_data.enable_offload = true; 13813 13814 ath12k_dbg_dump(ar->ab, ATH12K_DBG_MAC, "kck", NULL, 13815 rekey_data->kck, NL80211_KCK_LEN); 13816 ath12k_dbg_dump(ar->ab, ATH12K_DBG_MAC, "kek", NULL, 13817 rekey_data->kck, NL80211_KEK_LEN); 13818 ath12k_dbg_dump(ar->ab, ATH12K_DBG_MAC, "replay ctr", NULL, 13819 &rekey_data->replay_ctr, sizeof(rekey_data->replay_ctr)); 13820 } 13821 EXPORT_SYMBOL(ath12k_mac_op_set_rekey_data); 13822 13823 void ath12k_mac_update_freq_range(struct ath12k *ar, 13824 u32 freq_low, u32 freq_high) 13825 { 13826 if (!(freq_low && freq_high)) 13827 return; 13828 13829 if (ar->freq_range.start_freq || ar->freq_range.end_freq) { 13830 ar->freq_range.start_freq = min(ar->freq_range.start_freq, 13831 MHZ_TO_KHZ(freq_low)); 13832 ar->freq_range.end_freq = max(ar->freq_range.end_freq, 13833 MHZ_TO_KHZ(freq_high)); 13834 } else { 13835 ar->freq_range.start_freq = MHZ_TO_KHZ(freq_low); 13836 ar->freq_range.end_freq = MHZ_TO_KHZ(freq_high); 13837 } 13838 13839 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 13840 "mac pdev %u freq limit updated. New range %u->%u MHz\n", 13841 ar->pdev->pdev_id, KHZ_TO_MHZ(ar->freq_range.start_freq), 13842 KHZ_TO_MHZ(ar->freq_range.end_freq)); 13843 } 13844 13845 static void ath12k_mac_update_ch_list(struct ath12k *ar, 13846 struct ieee80211_supported_band *band, 13847 u32 freq_low, u32 freq_high) 13848 { 13849 int i; 13850 13851 if (!(freq_low && freq_high)) 13852 return; 13853 13854 for (i = 0; i < band->n_channels; i++) { 13855 if (band->channels[i].center_freq < freq_low || 13856 band->channels[i].center_freq > freq_high) 13857 band->channels[i].flags |= IEEE80211_CHAN_DISABLED; 13858 } 13859 } 13860 13861 static u32 ath12k_get_phy_id(struct ath12k *ar, u32 band) 13862 { 13863 struct ath12k_pdev *pdev = ar->pdev; 13864 struct ath12k_pdev_cap *pdev_cap = &pdev->cap; 13865 13866 if (band == WMI_HOST_WLAN_2GHZ_CAP) 13867 return pdev_cap->band[NL80211_BAND_2GHZ].phy_id; 13868 13869 if (band == WMI_HOST_WLAN_5GHZ_CAP) 13870 return pdev_cap->band[NL80211_BAND_5GHZ].phy_id; 13871 13872 ath12k_warn(ar->ab, "unsupported phy cap:%d\n", band); 13873 13874 return 0; 13875 } 13876 13877 static int ath12k_mac_update_band(struct ath12k *ar, 13878 struct ieee80211_supported_band *orig_band, 13879 struct ieee80211_supported_band *new_band) 13880 { 13881 int i; 13882 13883 if (!orig_band || !new_band) 13884 return -EINVAL; 13885 13886 if (orig_band->band != new_band->band) 13887 return -EINVAL; 13888 13889 for (i = 0; i < new_band->n_channels; i++) { 13890 if (new_band->channels[i].flags & IEEE80211_CHAN_DISABLED) 13891 continue; 13892 /* An enabled channel in new_band should not be already enabled 13893 * in the orig_band 13894 */ 13895 if (WARN_ON(!(orig_band->channels[i].flags & 13896 IEEE80211_CHAN_DISABLED))) 13897 return -EINVAL; 13898 orig_band->channels[i].flags &= ~IEEE80211_CHAN_DISABLED; 13899 } 13900 return 0; 13901 } 13902 13903 static int ath12k_mac_setup_channels_rates(struct ath12k *ar, 13904 u32 supported_bands, 13905 struct ieee80211_supported_band *bands[]) 13906 { 13907 struct ieee80211_supported_band *band; 13908 struct ath12k_wmi_hal_reg_capabilities_ext_arg *reg_cap; 13909 struct ath12k_base *ab = ar->ab; 13910 u32 phy_id, freq_low, freq_high; 13911 struct ath12k_hw *ah = ar->ah; 13912 void *channels; 13913 int ret; 13914 13915 BUILD_BUG_ON((ARRAY_SIZE(ath12k_2ghz_channels) + 13916 ARRAY_SIZE(ath12k_5ghz_channels) + 13917 ARRAY_SIZE(ath12k_6ghz_channels)) != 13918 ATH12K_NUM_CHANS); 13919 13920 reg_cap = &ab->hal_reg_cap[ar->pdev_idx]; 13921 13922 if (supported_bands & WMI_HOST_WLAN_2GHZ_CAP) { 13923 channels = kmemdup(ath12k_2ghz_channels, 13924 sizeof(ath12k_2ghz_channels), 13925 GFP_KERNEL); 13926 if (!channels) 13927 return -ENOMEM; 13928 13929 band = &ar->mac.sbands[NL80211_BAND_2GHZ]; 13930 band->band = NL80211_BAND_2GHZ; 13931 band->n_channels = ARRAY_SIZE(ath12k_2ghz_channels); 13932 band->channels = channels; 13933 band->n_bitrates = ath12k_g_rates_size; 13934 band->bitrates = ath12k_g_rates; 13935 13936 if (ab->hw_params->single_pdev_only) { 13937 phy_id = ath12k_get_phy_id(ar, WMI_HOST_WLAN_2GHZ_CAP); 13938 reg_cap = &ab->hal_reg_cap[phy_id]; 13939 } 13940 13941 freq_low = max(reg_cap->low_2ghz_chan, 13942 ab->reg_freq_2ghz.start_freq); 13943 freq_high = min(reg_cap->high_2ghz_chan, 13944 ab->reg_freq_2ghz.end_freq); 13945 13946 ath12k_mac_update_ch_list(ar, band, 13947 reg_cap->low_2ghz_chan, 13948 reg_cap->high_2ghz_chan); 13949 13950 ath12k_mac_update_freq_range(ar, freq_low, freq_high); 13951 13952 if (!bands[NL80211_BAND_2GHZ]) { 13953 bands[NL80211_BAND_2GHZ] = band; 13954 } else { 13955 /* Split mac in same band under same wiphy */ 13956 ret = ath12k_mac_update_band(ar, bands[NL80211_BAND_2GHZ], band); 13957 if (ret) { 13958 kfree(channels); 13959 band->channels = NULL; 13960 return ret; 13961 } 13962 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac pdev %u identified as 2 GHz split mac with start freq %d end freq %d", 13963 ar->pdev->pdev_id, 13964 KHZ_TO_MHZ(ar->freq_range.start_freq), 13965 KHZ_TO_MHZ(ar->freq_range.end_freq)); 13966 } 13967 } 13968 13969 if (supported_bands & WMI_HOST_WLAN_5GHZ_CAP) { 13970 if (reg_cap->high_5ghz_chan >= ATH12K_MIN_6GHZ_FREQ) { 13971 channels = kmemdup(ath12k_6ghz_channels, 13972 sizeof(ath12k_6ghz_channels), GFP_KERNEL); 13973 if (!channels) { 13974 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); 13975 return -ENOMEM; 13976 } 13977 13978 ar->supports_6ghz = true; 13979 band = &ar->mac.sbands[NL80211_BAND_6GHZ]; 13980 band->band = NL80211_BAND_6GHZ; 13981 band->n_channels = ARRAY_SIZE(ath12k_6ghz_channels); 13982 band->channels = channels; 13983 band->n_bitrates = ath12k_a_rates_size; 13984 band->bitrates = ath12k_a_rates; 13985 13986 freq_low = max(reg_cap->low_5ghz_chan, 13987 ab->reg_freq_6ghz.start_freq); 13988 freq_high = min(reg_cap->high_5ghz_chan, 13989 ab->reg_freq_6ghz.end_freq); 13990 13991 ath12k_mac_update_ch_list(ar, band, 13992 reg_cap->low_5ghz_chan, 13993 reg_cap->high_5ghz_chan); 13994 13995 ath12k_mac_update_freq_range(ar, freq_low, freq_high); 13996 ah->use_6ghz_regd = true; 13997 13998 if (!bands[NL80211_BAND_6GHZ]) { 13999 bands[NL80211_BAND_6GHZ] = band; 14000 } else { 14001 /* Split mac in same band under same wiphy */ 14002 ret = ath12k_mac_update_band(ar, 14003 bands[NL80211_BAND_6GHZ], 14004 band); 14005 if (ret) { 14006 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); 14007 ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL; 14008 kfree(channels); 14009 band->channels = NULL; 14010 return ret; 14011 } 14012 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac pdev %u identified as 6 GHz split mac with start freq %d end freq %d", 14013 ar->pdev->pdev_id, 14014 KHZ_TO_MHZ(ar->freq_range.start_freq), 14015 KHZ_TO_MHZ(ar->freq_range.end_freq)); 14016 } 14017 } 14018 14019 if (reg_cap->low_5ghz_chan < ATH12K_MIN_6GHZ_FREQ) { 14020 channels = kmemdup(ath12k_5ghz_channels, 14021 sizeof(ath12k_5ghz_channels), 14022 GFP_KERNEL); 14023 if (!channels) { 14024 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); 14025 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels); 14026 return -ENOMEM; 14027 } 14028 14029 band = &ar->mac.sbands[NL80211_BAND_5GHZ]; 14030 band->band = NL80211_BAND_5GHZ; 14031 band->n_channels = ARRAY_SIZE(ath12k_5ghz_channels); 14032 band->channels = channels; 14033 band->n_bitrates = ath12k_a_rates_size; 14034 band->bitrates = ath12k_a_rates; 14035 14036 if (ab->hw_params->single_pdev_only) { 14037 phy_id = ath12k_get_phy_id(ar, WMI_HOST_WLAN_5GHZ_CAP); 14038 reg_cap = &ab->hal_reg_cap[phy_id]; 14039 } 14040 14041 freq_low = max(reg_cap->low_5ghz_chan, 14042 ab->reg_freq_5ghz.start_freq); 14043 freq_high = min(reg_cap->high_5ghz_chan, 14044 ab->reg_freq_5ghz.end_freq); 14045 14046 ath12k_mac_update_ch_list(ar, band, 14047 reg_cap->low_5ghz_chan, 14048 reg_cap->high_5ghz_chan); 14049 14050 ath12k_mac_update_freq_range(ar, freq_low, freq_high); 14051 14052 if (!bands[NL80211_BAND_5GHZ]) { 14053 bands[NL80211_BAND_5GHZ] = band; 14054 } else { 14055 /* Split mac in same band under same wiphy */ 14056 ret = ath12k_mac_update_band(ar, 14057 bands[NL80211_BAND_5GHZ], 14058 band); 14059 if (ret) { 14060 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); 14061 ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL; 14062 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels); 14063 ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL; 14064 kfree(channels); 14065 band->channels = NULL; 14066 return ret; 14067 } 14068 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac pdev %u identified as 5 GHz split mac with start freq %d end freq %d", 14069 ar->pdev->pdev_id, 14070 KHZ_TO_MHZ(ar->freq_range.start_freq), 14071 KHZ_TO_MHZ(ar->freq_range.end_freq)); 14072 } 14073 } 14074 } 14075 14076 return 0; 14077 } 14078 14079 static u16 ath12k_mac_get_ifmodes(struct ath12k_hw *ah) 14080 { 14081 struct ath12k *ar; 14082 int i; 14083 u16 interface_modes = U16_MAX; 14084 14085 for_each_ar(ah, ar, i) 14086 interface_modes &= ar->ab->hw_params->interface_modes; 14087 14088 return interface_modes == U16_MAX ? 0 : interface_modes; 14089 } 14090 14091 static bool ath12k_mac_is_iface_mode_enable(struct ath12k_hw *ah, 14092 enum nl80211_iftype type) 14093 { 14094 struct ath12k *ar; 14095 int i; 14096 u16 interface_modes, mode = 0; 14097 bool is_enable = false; 14098 14099 if (type == NL80211_IFTYPE_MESH_POINT) { 14100 if (IS_ENABLED(CONFIG_MAC80211_MESH)) 14101 mode = BIT(type); 14102 } else { 14103 mode = BIT(type); 14104 } 14105 14106 for_each_ar(ah, ar, i) { 14107 interface_modes = ar->ab->hw_params->interface_modes; 14108 if (interface_modes & mode) { 14109 is_enable = true; 14110 break; 14111 } 14112 } 14113 14114 return is_enable; 14115 } 14116 14117 static int 14118 ath12k_mac_setup_radio_iface_comb(struct ath12k *ar, 14119 struct ieee80211_iface_combination *comb) 14120 { 14121 u16 interface_modes = ar->ab->hw_params->interface_modes; 14122 struct ieee80211_iface_limit *limits; 14123 int n_limits, max_interfaces; 14124 bool ap, mesh, p2p; 14125 14126 ap = interface_modes & BIT(NL80211_IFTYPE_AP); 14127 p2p = interface_modes & BIT(NL80211_IFTYPE_P2P_DEVICE); 14128 14129 mesh = IS_ENABLED(CONFIG_MAC80211_MESH) && 14130 (interface_modes & BIT(NL80211_IFTYPE_MESH_POINT)); 14131 14132 if ((ap || mesh) && !p2p) { 14133 n_limits = 2; 14134 max_interfaces = 16; 14135 } else if (p2p) { 14136 n_limits = 3; 14137 if (ap || mesh) 14138 max_interfaces = 16; 14139 else 14140 max_interfaces = 3; 14141 } else { 14142 n_limits = 1; 14143 max_interfaces = 1; 14144 } 14145 14146 limits = kzalloc_objs(*limits, n_limits); 14147 if (!limits) 14148 return -ENOMEM; 14149 14150 limits[0].max = 1; 14151 limits[0].types |= BIT(NL80211_IFTYPE_STATION); 14152 14153 if (ap || mesh || p2p) 14154 limits[1].max = max_interfaces; 14155 14156 if (ap) 14157 limits[1].types |= BIT(NL80211_IFTYPE_AP); 14158 14159 if (mesh) 14160 limits[1].types |= BIT(NL80211_IFTYPE_MESH_POINT); 14161 14162 if (p2p) { 14163 limits[1].types |= BIT(NL80211_IFTYPE_P2P_CLIENT) | 14164 BIT(NL80211_IFTYPE_P2P_GO); 14165 limits[2].max = 1; 14166 limits[2].types |= BIT(NL80211_IFTYPE_P2P_DEVICE); 14167 } 14168 14169 comb[0].limits = limits; 14170 comb[0].n_limits = n_limits; 14171 comb[0].max_interfaces = max_interfaces; 14172 comb[0].beacon_int_infra_match = true; 14173 comb[0].beacon_int_min_gcd = 100; 14174 14175 comb[0].num_different_channels = 1; 14176 comb[0].radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) | 14177 BIT(NL80211_CHAN_WIDTH_20) | 14178 BIT(NL80211_CHAN_WIDTH_40) | 14179 BIT(NL80211_CHAN_WIDTH_80) | 14180 BIT(NL80211_CHAN_WIDTH_160); 14181 14182 return 0; 14183 } 14184 14185 static int 14186 ath12k_mac_setup_global_iface_comb(struct ath12k_hw *ah, 14187 struct wiphy_radio *radio, 14188 u8 n_radio, 14189 struct ieee80211_iface_combination *comb) 14190 { 14191 const struct ieee80211_iface_combination *iter_comb; 14192 struct ieee80211_iface_limit *limits; 14193 int i, j, n_limits; 14194 bool ap, mesh, p2p; 14195 14196 if (!n_radio) 14197 return 0; 14198 14199 ap = ath12k_mac_is_iface_mode_enable(ah, NL80211_IFTYPE_AP); 14200 p2p = ath12k_mac_is_iface_mode_enable(ah, NL80211_IFTYPE_P2P_DEVICE); 14201 mesh = ath12k_mac_is_iface_mode_enable(ah, NL80211_IFTYPE_MESH_POINT); 14202 14203 if ((ap || mesh) && !p2p) 14204 n_limits = 2; 14205 else if (p2p) 14206 n_limits = 3; 14207 else 14208 n_limits = 1; 14209 14210 limits = kzalloc_objs(*limits, n_limits); 14211 if (!limits) 14212 return -ENOMEM; 14213 14214 for (i = 0; i < n_radio; i++) { 14215 iter_comb = radio[i].iface_combinations; 14216 for (j = 0; j < iter_comb->n_limits && j < n_limits; j++) { 14217 limits[j].types |= iter_comb->limits[j].types; 14218 limits[j].max += iter_comb->limits[j].max; 14219 } 14220 14221 comb->max_interfaces += iter_comb->max_interfaces; 14222 comb->num_different_channels += iter_comb->num_different_channels; 14223 comb->radar_detect_widths |= iter_comb->radar_detect_widths; 14224 } 14225 14226 comb->limits = limits; 14227 comb->n_limits = n_limits; 14228 comb->beacon_int_infra_match = true; 14229 comb->beacon_int_min_gcd = 100; 14230 14231 return 0; 14232 } 14233 14234 static 14235 void ath12k_mac_cleanup_iface_comb(const struct ieee80211_iface_combination *iface_comb) 14236 { 14237 kfree(iface_comb[0].limits); 14238 kfree(iface_comb); 14239 } 14240 14241 static void ath12k_mac_cleanup_iface_combinations(struct ath12k_hw *ah) 14242 { 14243 struct wiphy *wiphy = ah->hw->wiphy; 14244 const struct wiphy_radio *radio; 14245 int i; 14246 14247 if (wiphy->n_radio > 0) { 14248 radio = wiphy->radio; 14249 for (i = 0; i < wiphy->n_radio; i++) 14250 ath12k_mac_cleanup_iface_comb(radio[i].iface_combinations); 14251 14252 kfree(wiphy->radio); 14253 } 14254 14255 ath12k_mac_cleanup_iface_comb(wiphy->iface_combinations); 14256 } 14257 14258 static int ath12k_mac_setup_iface_combinations(struct ath12k_hw *ah) 14259 { 14260 struct ieee80211_iface_combination *combinations, *comb; 14261 struct wiphy *wiphy = ah->hw->wiphy; 14262 struct wiphy_radio *radio; 14263 int n_combinations = 1; 14264 struct ath12k *ar; 14265 int i, ret; 14266 14267 if (ah->num_radio == 1) { 14268 ar = &ah->radio[0]; 14269 14270 if (ar->ab->hw_params->single_pdev_only) 14271 n_combinations = 2; 14272 14273 combinations = kzalloc_objs(*combinations, n_combinations); 14274 if (!combinations) 14275 return -ENOMEM; 14276 14277 ret = ath12k_mac_setup_radio_iface_comb(ar, combinations); 14278 if (ret) { 14279 ath12k_hw_warn(ah, "failed to setup radio interface combinations for one radio: %d", 14280 ret); 14281 goto err_free_combinations; 14282 } 14283 14284 if (ar->ab->hw_params->single_pdev_only) { 14285 comb = combinations + 1; 14286 memcpy(comb, combinations, sizeof(*comb)); 14287 comb->num_different_channels = 2; 14288 comb->radar_detect_widths = 0; 14289 } 14290 14291 goto out; 14292 } 14293 14294 combinations = kzalloc_objs(*combinations, n_combinations); 14295 if (!combinations) 14296 return -ENOMEM; 14297 14298 /* there are multiple radios */ 14299 14300 radio = kzalloc_objs(*radio, ah->num_radio); 14301 if (!radio) { 14302 ret = -ENOMEM; 14303 goto err_free_combinations; 14304 } 14305 14306 for_each_ar(ah, ar, i) { 14307 comb = kzalloc_obj(*comb); 14308 if (!comb) { 14309 ret = -ENOMEM; 14310 goto err_free_radios; 14311 } 14312 14313 ret = ath12k_mac_setup_radio_iface_comb(ar, comb); 14314 if (ret) { 14315 ath12k_hw_warn(ah, "failed to setup radio interface combinations for radio %d: %d", 14316 i, ret); 14317 kfree(comb); 14318 goto err_free_radios; 14319 } 14320 14321 radio[i].freq_range = &ar->freq_range; 14322 radio[i].n_freq_range = 1; 14323 14324 radio[i].iface_combinations = comb; 14325 radio[i].n_iface_combinations = 1; 14326 } 14327 14328 ret = ath12k_mac_setup_global_iface_comb(ah, radio, ah->num_radio, combinations); 14329 if (ret) { 14330 ath12k_hw_warn(ah, "failed to setup global interface combinations: %d", 14331 ret); 14332 goto err_free_all_radios; 14333 } 14334 14335 wiphy->radio = radio; 14336 wiphy->n_radio = ah->num_radio; 14337 14338 out: 14339 wiphy->iface_combinations = combinations; 14340 wiphy->n_iface_combinations = n_combinations; 14341 14342 return 0; 14343 14344 err_free_all_radios: 14345 i = ah->num_radio; 14346 14347 err_free_radios: 14348 while (i--) 14349 ath12k_mac_cleanup_iface_comb(radio[i].iface_combinations); 14350 14351 kfree(radio); 14352 14353 err_free_combinations: 14354 kfree(combinations); 14355 14356 return ret; 14357 } 14358 14359 static const u8 ath12k_if_types_ext_capa[] = { 14360 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING, 14361 [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT, 14362 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF, 14363 }; 14364 14365 static const u8 ath12k_if_types_ext_capa_sta[] = { 14366 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING, 14367 [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT, 14368 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF, 14369 [9] = WLAN_EXT_CAPA10_TWT_REQUESTER_SUPPORT, 14370 }; 14371 14372 static const u8 ath12k_if_types_ext_capa_ap[] = { 14373 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING, 14374 [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT, 14375 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF, 14376 [9] = WLAN_EXT_CAPA10_TWT_RESPONDER_SUPPORT, 14377 [10] = WLAN_EXT_CAPA11_EMA_SUPPORT, 14378 }; 14379 14380 static struct wiphy_iftype_ext_capab ath12k_iftypes_ext_capa[] = { 14381 { 14382 .extended_capabilities = ath12k_if_types_ext_capa, 14383 .extended_capabilities_mask = ath12k_if_types_ext_capa, 14384 .extended_capabilities_len = sizeof(ath12k_if_types_ext_capa), 14385 }, { 14386 .iftype = NL80211_IFTYPE_STATION, 14387 .extended_capabilities = ath12k_if_types_ext_capa_sta, 14388 .extended_capabilities_mask = ath12k_if_types_ext_capa_sta, 14389 .extended_capabilities_len = 14390 sizeof(ath12k_if_types_ext_capa_sta), 14391 }, { 14392 .iftype = NL80211_IFTYPE_AP, 14393 .extended_capabilities = ath12k_if_types_ext_capa_ap, 14394 .extended_capabilities_mask = ath12k_if_types_ext_capa_ap, 14395 .extended_capabilities_len = 14396 sizeof(ath12k_if_types_ext_capa_ap), 14397 .eml_capabilities = 0, 14398 .mld_capa_and_ops = 0, 14399 }, 14400 }; 14401 14402 static void ath12k_mac_cleanup_unregister(struct ath12k *ar) 14403 { 14404 idr_for_each(&ar->txmgmt_idr, ath12k_mac_tx_mgmt_pending_free, ar); 14405 idr_destroy(&ar->txmgmt_idr); 14406 14407 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels); 14408 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels); 14409 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels); 14410 } 14411 14412 static void ath12k_mac_hw_unregister(struct ath12k_hw *ah) 14413 { 14414 struct ieee80211_hw *hw = ah->hw; 14415 struct ath12k *ar; 14416 int i; 14417 14418 for_each_ar(ah, ar, i) { 14419 cancel_work_sync(&ar->regd_channel_update_work); 14420 cancel_work_sync(&ar->regd_update_work); 14421 ath12k_debugfs_unregister(ar); 14422 ath12k_fw_stats_reset(ar); 14423 } 14424 14425 ieee80211_unregister_hw(hw); 14426 14427 for_each_ar(ah, ar, i) 14428 ath12k_mac_cleanup_unregister(ar); 14429 14430 ath12k_mac_cleanup_iface_combinations(ah); 14431 14432 SET_IEEE80211_DEV(hw, NULL); 14433 } 14434 14435 static int ath12k_mac_setup_register(struct ath12k *ar, 14436 u32 *ht_cap, 14437 struct ieee80211_supported_band *bands[]) 14438 { 14439 struct ath12k_pdev_cap *cap = &ar->pdev->cap; 14440 int ret; 14441 14442 init_waitqueue_head(&ar->txmgmt_empty_waitq); 14443 idr_init(&ar->txmgmt_idr); 14444 spin_lock_init(&ar->txmgmt_idr_lock); 14445 14446 ath12k_pdev_caps_update(ar); 14447 14448 ret = ath12k_mac_setup_channels_rates(ar, 14449 cap->supported_bands, 14450 bands); 14451 if (ret) 14452 return ret; 14453 14454 ath12k_mac_setup_ht_vht_cap(ar, cap, ht_cap); 14455 ath12k_mac_setup_sband_iftype_data(ar, cap); 14456 14457 ar->max_num_stations = ath12k_core_get_max_station_per_radio(ar->ab); 14458 ar->max_num_peers = ath12k_core_get_max_peers_per_radio(ar->ab); 14459 14460 ar->rssi_info.min_nf_dbm = ATH12K_DEFAULT_NOISE_FLOOR; 14461 ar->rssi_info.temp_offset = 0; 14462 ar->rssi_info.noise_floor = ar->rssi_info.min_nf_dbm + ar->rssi_info.temp_offset; 14463 14464 return 0; 14465 } 14466 14467 static int ath12k_mac_hw_register(struct ath12k_hw *ah) 14468 { 14469 struct ieee80211_hw *hw = ah->hw; 14470 struct wiphy *wiphy = hw->wiphy; 14471 struct ath12k *ar = ath12k_ah_to_ar(ah, 0); 14472 struct ath12k_base *ab = ar->ab; 14473 struct ath12k_pdev *pdev; 14474 struct ath12k_pdev_cap *cap; 14475 static const u32 cipher_suites[] = { 14476 WLAN_CIPHER_SUITE_TKIP, 14477 WLAN_CIPHER_SUITE_CCMP, 14478 WLAN_CIPHER_SUITE_AES_CMAC, 14479 WLAN_CIPHER_SUITE_BIP_CMAC_256, 14480 WLAN_CIPHER_SUITE_BIP_GMAC_128, 14481 WLAN_CIPHER_SUITE_BIP_GMAC_256, 14482 WLAN_CIPHER_SUITE_GCMP, 14483 WLAN_CIPHER_SUITE_GCMP_256, 14484 WLAN_CIPHER_SUITE_CCMP_256, 14485 }; 14486 int ret, i, j; 14487 u32 ht_cap = U32_MAX, antennas_rx = 0, antennas_tx = 0; 14488 bool is_6ghz = false, is_raw_mode = false, is_monitor_disable = false; 14489 u8 *mac_addr = NULL; 14490 u8 mbssid_max_interfaces = 0; 14491 14492 wiphy->max_ap_assoc_sta = 0; 14493 14494 for_each_ar(ah, ar, i) { 14495 u32 ht_cap_info = 0; 14496 14497 pdev = ar->pdev; 14498 if (ar->ab->pdevs_macaddr_valid) { 14499 ether_addr_copy(ar->mac_addr, pdev->mac_addr); 14500 } else { 14501 ether_addr_copy(ar->mac_addr, ar->ab->mac_addr); 14502 ar->mac_addr[4] += ar->pdev_idx; 14503 } 14504 14505 ret = ath12k_mac_setup_register(ar, &ht_cap_info, hw->wiphy->bands); 14506 if (ret) 14507 goto err_cleanup_unregister; 14508 14509 /* 6 GHz does not support HT Cap, hence do not consider it */ 14510 if (!ar->supports_6ghz) 14511 ht_cap &= ht_cap_info; 14512 14513 wiphy->max_ap_assoc_sta += ar->max_num_stations; 14514 14515 /* Advertise the max antenna support of all radios, driver can handle 14516 * per pdev specific antenna setting based on pdev cap when antenna 14517 * changes are made 14518 */ 14519 cap = &pdev->cap; 14520 14521 antennas_rx = max_t(u32, antennas_rx, cap->rx_chain_mask); 14522 antennas_tx = max_t(u32, antennas_tx, cap->tx_chain_mask); 14523 14524 if (ar->supports_6ghz) 14525 is_6ghz = true; 14526 14527 if (test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags)) 14528 is_raw_mode = true; 14529 14530 if (!ar->ab->hw_params->supports_monitor) 14531 is_monitor_disable = true; 14532 14533 if (i == 0) 14534 mac_addr = ar->mac_addr; 14535 else 14536 mac_addr = ab->mac_addr; 14537 14538 mbssid_max_interfaces += TARGET_NUM_VDEVS(ar->ab); 14539 } 14540 14541 wiphy->available_antennas_rx = antennas_rx; 14542 wiphy->available_antennas_tx = antennas_tx; 14543 14544 SET_IEEE80211_PERM_ADDR(hw, mac_addr); 14545 SET_IEEE80211_DEV(hw, ab->dev); 14546 14547 ret = ath12k_mac_setup_iface_combinations(ah); 14548 if (ret) { 14549 ath12k_err(ab, "failed to setup interface combinations: %d\n", ret); 14550 goto err_complete_cleanup_unregister; 14551 } 14552 14553 wiphy->interface_modes = ath12k_mac_get_ifmodes(ah); 14554 14555 if (ah->num_radio == 1 && 14556 wiphy->bands[NL80211_BAND_2GHZ] && 14557 wiphy->bands[NL80211_BAND_5GHZ] && 14558 wiphy->bands[NL80211_BAND_6GHZ]) 14559 ieee80211_hw_set(hw, SINGLE_SCAN_ON_ALL_BANDS); 14560 14561 ieee80211_hw_set(hw, SIGNAL_DBM); 14562 ieee80211_hw_set(hw, SUPPORTS_PS); 14563 ieee80211_hw_set(hw, SUPPORTS_DYNAMIC_PS); 14564 ieee80211_hw_set(hw, MFP_CAPABLE); 14565 ieee80211_hw_set(hw, REPORTS_TX_ACK_STATUS); 14566 ieee80211_hw_set(hw, HAS_RATE_CONTROL); 14567 ieee80211_hw_set(hw, AP_LINK_PS); 14568 ieee80211_hw_set(hw, SPECTRUM_MGMT); 14569 ieee80211_hw_set(hw, CONNECTION_MONITOR); 14570 ieee80211_hw_set(hw, SUPPORTS_PER_STA_GTK); 14571 ieee80211_hw_set(hw, CHANCTX_STA_CSA); 14572 ieee80211_hw_set(hw, QUEUE_CONTROL); 14573 ieee80211_hw_set(hw, SUPPORTS_TX_FRAG); 14574 ieee80211_hw_set(hw, REPORTS_LOW_ACK); 14575 ieee80211_hw_set(hw, NO_VIRTUAL_MONITOR); 14576 14577 if (test_bit(WMI_TLV_SERVICE_ETH_OFFLOAD, ar->wmi->wmi_ab->svc_map)) { 14578 ieee80211_hw_set(hw, SUPPORTS_TX_ENCAP_OFFLOAD); 14579 ieee80211_hw_set(hw, SUPPORTS_RX_DECAP_OFFLOAD); 14580 } 14581 14582 if (cap->nss_ratio_enabled) 14583 ieee80211_hw_set(hw, SUPPORTS_VHT_EXT_NSS_BW); 14584 14585 if ((ht_cap & WMI_HT_CAP_ENABLED) || is_6ghz) { 14586 ieee80211_hw_set(hw, AMPDU_AGGREGATION); 14587 ieee80211_hw_set(hw, TX_AMPDU_SETUP_IN_HW); 14588 ieee80211_hw_set(hw, SUPPORTS_REORDERING_BUFFER); 14589 ieee80211_hw_set(hw, SUPPORTS_AMSDU_IN_AMPDU); 14590 ieee80211_hw_set(hw, USES_RSS); 14591 } 14592 14593 wiphy->features |= NL80211_FEATURE_STATIC_SMPS; 14594 wiphy->flags |= WIPHY_FLAG_IBSS_RSN; 14595 14596 /* TODO: Check if HT capability advertised from firmware is different 14597 * for each band for a dual band capable radio. It will be tricky to 14598 * handle it when the ht capability different for each band. 14599 */ 14600 if (ht_cap & WMI_HT_CAP_DYNAMIC_SMPS || 14601 (is_6ghz && ab->hw_params->supports_dynamic_smps_6ghz)) 14602 wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS; 14603 14604 wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID; 14605 wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN; 14606 14607 hw->max_listen_interval = ATH12K_MAX_HW_LISTEN_INTERVAL; 14608 14609 wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL; 14610 wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH; 14611 wiphy->max_remain_on_channel_duration = 5000; 14612 14613 wiphy->flags |= WIPHY_FLAG_AP_UAPSD; 14614 wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE | 14615 NL80211_FEATURE_AP_SCAN; 14616 14617 wiphy->features |= NL80211_FEATURE_TX_POWER_INSERTION; 14618 14619 /* MLO is not yet supported so disable Wireless Extensions for now 14620 * to make sure ath12k users don't use it. This flag can be removed 14621 * once WIPHY_FLAG_SUPPORTS_MLO is enabled. 14622 */ 14623 wiphy->flags |= WIPHY_FLAG_DISABLE_WEXT; 14624 14625 /* Copy over MLO related capabilities received from 14626 * WMI_SERVICE_READY_EXT2_EVENT if single_chip_mlo_supp is set. 14627 */ 14628 if (ab->ag->mlo_capable) { 14629 ath12k_iftypes_ext_capa[2].eml_capabilities = cap->eml_cap; 14630 ath12k_iftypes_ext_capa[2].mld_capa_and_ops = cap->mld_cap; 14631 wiphy->flags |= WIPHY_FLAG_SUPPORTS_MLO; 14632 14633 ieee80211_hw_set(hw, MLO_MCAST_MULTI_LINK_TX); 14634 } 14635 14636 hw->queues = ATH12K_HW_MAX_QUEUES; 14637 wiphy->tx_queue_len = ATH12K_QUEUE_LEN; 14638 hw->offchannel_tx_hw_queue = ATH12K_HW_MAX_QUEUES - 1; 14639 hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF_EHT; 14640 14641 hw->vif_data_size = sizeof(struct ath12k_vif); 14642 hw->sta_data_size = sizeof(struct ath12k_sta); 14643 hw->extra_tx_headroom = ab->hw_params->iova_mask; 14644 14645 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST); 14646 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_STA_TX_PWR); 14647 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT); 14648 if (test_bit(WMI_TLV_SERVICE_BSS_COLOR_OFFLOAD, 14649 ab->wmi_ab.svc_map)) { 14650 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_BSS_COLOR); 14651 ieee80211_hw_set(hw, DETECTS_COLOR_COLLISION); 14652 } 14653 14654 wiphy->cipher_suites = cipher_suites; 14655 wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites); 14656 14657 wiphy->iftype_ext_capab = ath12k_iftypes_ext_capa; 14658 wiphy->num_iftype_ext_capab = ARRAY_SIZE(ath12k_iftypes_ext_capa); 14659 14660 wiphy->mbssid_max_interfaces = mbssid_max_interfaces; 14661 wiphy->ema_max_profile_periodicity = TARGET_EMA_MAX_PROFILE_PERIOD; 14662 ieee80211_hw_set(hw, SUPPORTS_MULTI_BSSID); 14663 14664 if (is_6ghz) { 14665 wiphy_ext_feature_set(wiphy, 14666 NL80211_EXT_FEATURE_FILS_DISCOVERY); 14667 wiphy_ext_feature_set(wiphy, 14668 NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP); 14669 } 14670 14671 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_PUNCT); 14672 if (test_bit(WMI_TLV_SERVICE_BEACON_PROTECTION_SUPPORT, ab->wmi_ab.svc_map)) 14673 wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_BEACON_PROTECTION); 14674 14675 ath12k_reg_init(hw); 14676 14677 if (!is_raw_mode) { 14678 hw->netdev_features = NETIF_F_HW_CSUM; 14679 ieee80211_hw_set(hw, SW_CRYPTO_CONTROL); 14680 ieee80211_hw_set(hw, SUPPORT_FAST_XMIT); 14681 } 14682 14683 if (test_bit(WMI_TLV_SERVICE_NLO, ar->wmi->wmi_ab->svc_map)) { 14684 wiphy->max_sched_scan_ssids = WMI_PNO_MAX_SUPP_NETWORKS; 14685 wiphy->max_match_sets = WMI_PNO_MAX_SUPP_NETWORKS; 14686 wiphy->max_sched_scan_ie_len = WMI_PNO_MAX_IE_LENGTH; 14687 wiphy->max_sched_scan_plans = WMI_PNO_MAX_SCHED_SCAN_PLANS; 14688 wiphy->max_sched_scan_plan_interval = 14689 WMI_PNO_MAX_SCHED_SCAN_PLAN_INT; 14690 wiphy->max_sched_scan_plan_iterations = 14691 WMI_PNO_MAX_SCHED_SCAN_PLAN_ITRNS; 14692 wiphy->features |= NL80211_FEATURE_ND_RANDOM_MAC_ADDR; 14693 } 14694 14695 ret = ath12k_wow_init(ar); 14696 if (ret) { 14697 ath12k_warn(ar->ab, "failed to init wow: %d\n", ret); 14698 goto err_cleanup_if_combs; 14699 } 14700 14701 /* Boot-time regulatory updates have already been processed. 14702 * Mark them as complete now, because after registration, 14703 * cfg80211 will notify us again if there are any pending hints. 14704 * We need to wait for those hints to be processed, so it's 14705 * important to mark the boot-time updates as complete before 14706 * proceeding with registration. 14707 */ 14708 for_each_ar(ah, ar, i) 14709 complete_all(&ar->regd_update_completed); 14710 14711 ret = ieee80211_register_hw(hw); 14712 if (ret) { 14713 ath12k_err(ab, "ieee80211 registration failed: %d\n", ret); 14714 goto err_cleanup_if_combs; 14715 } 14716 14717 if (is_monitor_disable) 14718 /* There's a race between calling ieee80211_register_hw() 14719 * and here where the monitor mode is enabled for a little 14720 * while. But that time is so short and in practice it doesn't make 14721 * a difference in real life. 14722 */ 14723 wiphy->interface_modes &= ~BIT(NL80211_IFTYPE_MONITOR); 14724 14725 for_each_ar(ah, ar, i) { 14726 /* Apply the regd received during initialization */ 14727 ret = ath12k_regd_update(ar, true); 14728 if (ret) { 14729 ath12k_err(ar->ab, "ath12k regd update failed: %d\n", ret); 14730 goto err_unregister_hw; 14731 } 14732 14733 if (ar->ab->hw_params->current_cc_support && ab->new_alpha2[0]) { 14734 struct wmi_set_current_country_arg current_cc = {}; 14735 14736 memcpy(¤t_cc.alpha2, ab->new_alpha2, 2); 14737 memcpy(&ar->alpha2, ab->new_alpha2, 2); 14738 14739 reinit_completion(&ar->regd_update_completed); 14740 14741 ret = ath12k_wmi_send_set_current_country_cmd(ar, ¤t_cc); 14742 if (ret) 14743 ath12k_warn(ar->ab, 14744 "failed set cc code for mac register: %d\n", 14745 ret); 14746 } 14747 14748 ath12k_fw_stats_init(ar); 14749 ath12k_debugfs_register(ar); 14750 } 14751 14752 return 0; 14753 14754 err_unregister_hw: 14755 for_each_ar(ah, ar, i) 14756 ath12k_debugfs_unregister(ar); 14757 14758 ieee80211_unregister_hw(hw); 14759 14760 err_cleanup_if_combs: 14761 ath12k_mac_cleanup_iface_combinations(ah); 14762 14763 err_complete_cleanup_unregister: 14764 i = ah->num_radio; 14765 14766 err_cleanup_unregister: 14767 for (j = 0; j < i; j++) { 14768 ar = ath12k_ah_to_ar(ah, j); 14769 ath12k_mac_cleanup_unregister(ar); 14770 } 14771 14772 SET_IEEE80211_DEV(hw, NULL); 14773 14774 return ret; 14775 } 14776 14777 static void ath12k_mac_setup(struct ath12k *ar) 14778 { 14779 struct ath12k_base *ab = ar->ab; 14780 struct ath12k_pdev *pdev = ar->pdev; 14781 u8 pdev_idx = ar->pdev_idx; 14782 14783 ar->lmac_id = ath12k_hw_get_mac_from_pdev_id(ab->hw_params, pdev_idx); 14784 14785 ar->wmi = &ab->wmi_ab.wmi[pdev_idx]; 14786 /* FIXME: wmi[0] is already initialized during attach, 14787 * Should we do this again? 14788 */ 14789 ath12k_wmi_pdev_attach(ab, pdev_idx); 14790 14791 ar->cfg_tx_chainmask = pdev->cap.tx_chain_mask; 14792 ar->cfg_rx_chainmask = pdev->cap.rx_chain_mask; 14793 ar->num_tx_chains = hweight32(pdev->cap.tx_chain_mask); 14794 ar->num_rx_chains = hweight32(pdev->cap.rx_chain_mask); 14795 ar->scan.arvif = NULL; 14796 ar->vdev_id_11d_scan = ATH12K_11D_INVALID_VDEV_ID; 14797 14798 spin_lock_init(&ar->data_lock); 14799 spin_lock_init(&ar->dp.ppdu_list_lock); 14800 INIT_LIST_HEAD(&ar->arvifs); 14801 INIT_LIST_HEAD(&ar->dp.ppdu_stats_info); 14802 14803 init_completion(&ar->vdev_setup_done); 14804 init_completion(&ar->vdev_delete_done); 14805 init_completion(&ar->peer_assoc_done); 14806 init_completion(&ar->peer_delete_done); 14807 init_completion(&ar->install_key_done); 14808 init_completion(&ar->bss_survey_done); 14809 init_completion(&ar->scan.started); 14810 init_completion(&ar->scan.completed); 14811 init_completion(&ar->scan.on_channel); 14812 init_completion(&ar->mlo_setup_done); 14813 init_completion(&ar->completed_11d_scan); 14814 init_completion(&ar->regd_update_completed); 14815 init_completion(&ar->thermal.wmi_sync); 14816 14817 ar->thermal.temperature = 0; 14818 ar->thermal.hwmon_dev = NULL; 14819 14820 INIT_DELAYED_WORK(&ar->scan.timeout, ath12k_scan_timeout_work); 14821 wiphy_work_init(&ar->scan.vdev_clean_wk, ath12k_scan_vdev_clean_work); 14822 INIT_WORK(&ar->regd_channel_update_work, ath12k_regd_update_chan_list_work); 14823 INIT_LIST_HEAD(&ar->regd_channel_update_queue); 14824 INIT_WORK(&ar->regd_update_work, ath12k_regd_update_work); 14825 14826 wiphy_work_init(&ar->wmi_mgmt_tx_work, ath12k_mgmt_over_wmi_tx_work); 14827 skb_queue_head_init(&ar->wmi_mgmt_tx_queue); 14828 14829 ar->monitor_vdev_id = -1; 14830 ar->monitor_vdev_created = false; 14831 ar->monitor_started = false; 14832 } 14833 14834 static int __ath12k_mac_mlo_setup(struct ath12k *ar) 14835 { 14836 u8 num_link = 0, partner_link_id[ATH12K_GROUP_MAX_RADIO] = {}; 14837 struct ath12k_base *partner_ab, *ab = ar->ab; 14838 struct ath12k_hw_group *ag = ab->ag; 14839 struct wmi_mlo_setup_arg mlo = {}; 14840 struct ath12k_pdev *pdev; 14841 unsigned long time_left; 14842 int i, j, ret; 14843 14844 lockdep_assert_held(&ag->mutex); 14845 14846 reinit_completion(&ar->mlo_setup_done); 14847 14848 for (i = 0; i < ag->num_devices; i++) { 14849 partner_ab = ag->ab[i]; 14850 14851 for (j = 0; j < partner_ab->num_radios; j++) { 14852 pdev = &partner_ab->pdevs[j]; 14853 14854 /* Avoid the self link */ 14855 if (ar == pdev->ar) 14856 continue; 14857 14858 partner_link_id[num_link] = pdev->hw_link_id; 14859 num_link++; 14860 14861 ath12k_dbg(ab, ATH12K_DBG_MAC, "device %d pdev %d hw_link_id %d num_link %d\n", 14862 i, j, pdev->hw_link_id, num_link); 14863 } 14864 } 14865 14866 if (num_link == 0) 14867 return 0; 14868 14869 mlo.group_id = cpu_to_le32(ag->id); 14870 mlo.partner_link_id = partner_link_id; 14871 mlo.num_partner_links = num_link; 14872 ar->mlo_setup_status = 0; 14873 14874 ath12k_dbg(ab, ATH12K_DBG_MAC, "group id %d num_link %d\n", ag->id, num_link); 14875 14876 ret = ath12k_wmi_mlo_setup(ar, &mlo); 14877 if (ret) { 14878 ath12k_err(ab, "failed to send setup MLO WMI command for pdev %d: %d\n", 14879 ar->pdev_idx, ret); 14880 return ret; 14881 } 14882 14883 time_left = wait_for_completion_timeout(&ar->mlo_setup_done, 14884 WMI_MLO_CMD_TIMEOUT_HZ); 14885 14886 if (!time_left || ar->mlo_setup_status) 14887 return ar->mlo_setup_status ? : -ETIMEDOUT; 14888 14889 ath12k_dbg(ab, ATH12K_DBG_MAC, "mlo setup done for pdev %d\n", ar->pdev_idx); 14890 14891 return 0; 14892 } 14893 14894 static int __ath12k_mac_mlo_teardown(struct ath12k *ar) 14895 { 14896 struct ath12k_base *ab = ar->ab; 14897 int ret; 14898 u8 num_link; 14899 14900 if (test_bit(ATH12K_FLAG_RECOVERY, &ab->dev_flags)) 14901 return 0; 14902 14903 num_link = ath12k_get_num_partner_link(ar); 14904 14905 if (num_link == 0) 14906 return 0; 14907 14908 ret = ath12k_wmi_mlo_teardown(ar); 14909 if (ret) { 14910 ath12k_warn(ab, "failed to send MLO teardown WMI command for pdev %d: %d\n", 14911 ar->pdev_idx, ret); 14912 return ret; 14913 } 14914 14915 ath12k_dbg(ab, ATH12K_DBG_MAC, "mlo teardown for pdev %d\n", ar->pdev_idx); 14916 14917 return 0; 14918 } 14919 14920 int ath12k_mac_mlo_setup(struct ath12k_hw_group *ag) 14921 { 14922 struct ath12k_hw *ah; 14923 struct ath12k *ar; 14924 int ret; 14925 int i, j; 14926 14927 for (i = 0; i < ag->num_hw; i++) { 14928 ah = ag->ah[i]; 14929 if (!ah) 14930 continue; 14931 14932 for_each_ar(ah, ar, j) { 14933 ar = &ah->radio[j]; 14934 ret = __ath12k_mac_mlo_setup(ar); 14935 if (ret) { 14936 ath12k_err(ar->ab, "failed to setup MLO: %d\n", ret); 14937 goto err_setup; 14938 } 14939 } 14940 } 14941 14942 return 0; 14943 14944 err_setup: 14945 for (i = i - 1; i >= 0; i--) { 14946 ah = ag->ah[i]; 14947 if (!ah) 14948 continue; 14949 14950 for (j = j - 1; j >= 0; j--) { 14951 ar = &ah->radio[j]; 14952 if (!ar) 14953 continue; 14954 14955 __ath12k_mac_mlo_teardown(ar); 14956 } 14957 } 14958 14959 return ret; 14960 } 14961 14962 void ath12k_mac_mlo_teardown(struct ath12k_hw_group *ag) 14963 { 14964 struct ath12k_hw *ah; 14965 struct ath12k *ar; 14966 int ret, i, j; 14967 14968 for (i = 0; i < ag->num_hw; i++) { 14969 ah = ag->ah[i]; 14970 if (!ah) 14971 continue; 14972 14973 for_each_ar(ah, ar, j) { 14974 ar = &ah->radio[j]; 14975 ret = __ath12k_mac_mlo_teardown(ar); 14976 if (ret) { 14977 ath12k_err(ar->ab, "failed to teardown MLO: %d\n", ret); 14978 break; 14979 } 14980 } 14981 } 14982 } 14983 14984 int ath12k_mac_register(struct ath12k_hw_group *ag) 14985 { 14986 struct ath12k_hw *ah; 14987 int i; 14988 int ret; 14989 14990 for (i = 0; i < ag->num_hw; i++) { 14991 ah = ath12k_ag_to_ah(ag, i); 14992 14993 ret = ath12k_mac_hw_register(ah); 14994 if (ret) 14995 goto err; 14996 } 14997 14998 return 0; 14999 15000 err: 15001 for (i = i - 1; i >= 0; i--) { 15002 ah = ath12k_ag_to_ah(ag, i); 15003 if (!ah) 15004 continue; 15005 15006 ath12k_mac_hw_unregister(ah); 15007 } 15008 15009 return ret; 15010 } 15011 15012 void ath12k_mac_unregister(struct ath12k_hw_group *ag) 15013 { 15014 struct ath12k_hw *ah; 15015 int i; 15016 15017 for (i = ag->num_hw - 1; i >= 0; i--) { 15018 ah = ath12k_ag_to_ah(ag, i); 15019 if (!ah) 15020 continue; 15021 15022 ath12k_mac_hw_unregister(ah); 15023 } 15024 } 15025 15026 static void ath12k_mac_hw_destroy(struct ath12k_hw *ah) 15027 { 15028 ieee80211_free_hw(ah->hw); 15029 } 15030 15031 static struct ath12k_hw *ath12k_mac_hw_allocate(struct ath12k_hw_group *ag, 15032 struct ath12k_pdev_map *pdev_map, 15033 u8 num_pdev_map) 15034 { 15035 struct ieee80211_hw *hw; 15036 struct ath12k *ar; 15037 struct ath12k_base *ab; 15038 struct ath12k_pdev *pdev; 15039 struct ath12k_hw *ah; 15040 int i; 15041 u8 pdev_idx; 15042 15043 hw = ieee80211_alloc_hw(struct_size(ah, radio, num_pdev_map), 15044 pdev_map->ab->ath12k_ops); 15045 if (!hw) 15046 return NULL; 15047 15048 ah = ath12k_hw_to_ah(hw); 15049 ah->hw = hw; 15050 ah->num_radio = num_pdev_map; 15051 15052 mutex_init(&ah->hw_mutex); 15053 15054 spin_lock_init(&ah->dp_hw.peer_lock); 15055 INIT_LIST_HEAD(&ah->dp_hw.dp_peers_list); 15056 15057 for (i = 0; i < num_pdev_map; i++) { 15058 ab = pdev_map[i].ab; 15059 pdev_idx = pdev_map[i].pdev_idx; 15060 pdev = &ab->pdevs[pdev_idx]; 15061 15062 ar = ath12k_ah_to_ar(ah, i); 15063 ar->ah = ah; 15064 ar->ab = ab; 15065 ar->hw_link_id = pdev->hw_link_id; 15066 ar->pdev = pdev; 15067 ar->pdev_idx = pdev_idx; 15068 ar->radio_idx = i; 15069 pdev->ar = ar; 15070 15071 ag->hw_links[ar->hw_link_id].device_id = ab->device_id; 15072 ag->hw_links[ar->hw_link_id].pdev_idx = pdev_idx; 15073 15074 ath12k_mac_setup(ar); 15075 ath12k_dp_pdev_pre_alloc(ar); 15076 } 15077 15078 return ah; 15079 } 15080 15081 void ath12k_mac_destroy(struct ath12k_hw_group *ag) 15082 { 15083 struct ath12k_pdev *pdev; 15084 struct ath12k_base *ab = ag->ab[0]; 15085 int i, j; 15086 struct ath12k_hw *ah; 15087 15088 for (i = 0; i < ag->num_devices; i++) { 15089 ab = ag->ab[i]; 15090 if (!ab) 15091 continue; 15092 15093 for (j = 0; j < ab->num_radios; j++) { 15094 pdev = &ab->pdevs[j]; 15095 if (!pdev->ar) 15096 continue; 15097 pdev->ar = NULL; 15098 } 15099 } 15100 15101 for (i = 0; i < ag->num_hw; i++) { 15102 ah = ath12k_ag_to_ah(ag, i); 15103 if (!ah) 15104 continue; 15105 15106 ath12k_mac_hw_destroy(ah); 15107 ath12k_ag_set_ah(ag, i, NULL); 15108 } 15109 } 15110 15111 static void ath12k_mac_set_device_defaults(struct ath12k_base *ab) 15112 { 15113 int total_vdev; 15114 15115 /* Initialize channel counters frequency value in hertz */ 15116 ab->cc_freq_hz = 320000; 15117 total_vdev = ab->num_radios * TARGET_NUM_VDEVS(ab); 15118 ab->free_vdev_map = (1LL << total_vdev) - 1; 15119 } 15120 15121 int ath12k_mac_allocate(struct ath12k_hw_group *ag) 15122 { 15123 struct ath12k_pdev_map pdev_map[ATH12K_GROUP_MAX_RADIO]; 15124 int mac_id, device_id, total_radio, num_hw; 15125 struct ath12k_base *ab; 15126 struct ath12k_hw *ah; 15127 int ret, i, j; 15128 u8 radio_per_hw; 15129 15130 total_radio = 0; 15131 for (i = 0; i < ag->num_devices; i++) { 15132 ab = ag->ab[i]; 15133 if (!ab) 15134 continue; 15135 15136 ath12k_mac_set_device_defaults(ab); 15137 total_radio += ab->num_radios; 15138 } 15139 15140 if (!total_radio) 15141 return -EINVAL; 15142 15143 if (WARN_ON(total_radio > ATH12K_GROUP_MAX_RADIO)) 15144 return -ENOSPC; 15145 15146 /* All pdev get combined and register as single wiphy based on 15147 * hardware group which participate in multi-link operation else 15148 * each pdev get register separately. 15149 */ 15150 if (ag->mlo_capable) 15151 radio_per_hw = total_radio; 15152 else 15153 radio_per_hw = 1; 15154 15155 num_hw = total_radio / radio_per_hw; 15156 15157 ag->num_hw = 0; 15158 device_id = 0; 15159 mac_id = 0; 15160 for (i = 0; i < num_hw; i++) { 15161 for (j = 0; j < radio_per_hw; j++) { 15162 if (device_id >= ag->num_devices || !ag->ab[device_id]) { 15163 ret = -ENOSPC; 15164 goto err; 15165 } 15166 15167 ab = ag->ab[device_id]; 15168 pdev_map[j].ab = ab; 15169 pdev_map[j].pdev_idx = mac_id; 15170 mac_id++; 15171 15172 /* If mac_id falls beyond the current device MACs then 15173 * move to next device 15174 */ 15175 if (mac_id >= ab->num_radios) { 15176 mac_id = 0; 15177 device_id++; 15178 } 15179 } 15180 15181 ab = pdev_map->ab; 15182 15183 ah = ath12k_mac_hw_allocate(ag, pdev_map, radio_per_hw); 15184 if (!ah) { 15185 ath12k_warn(ab, "failed to allocate mac80211 hw device for hw_idx %d\n", 15186 i); 15187 ret = -ENOMEM; 15188 goto err; 15189 } 15190 15191 ah->dev = ab->dev; 15192 15193 ag->ah[i] = ah; 15194 ag->num_hw++; 15195 } 15196 15197 return 0; 15198 15199 err: 15200 for (i = i - 1; i >= 0; i--) { 15201 ah = ath12k_ag_to_ah(ag, i); 15202 if (!ah) 15203 continue; 15204 15205 ath12k_mac_hw_destroy(ah); 15206 ath12k_ag_set_ah(ag, i, NULL); 15207 } 15208 15209 return ret; 15210 } 15211 15212 int ath12k_mac_vif_set_keepalive(struct ath12k_link_vif *arvif, 15213 enum wmi_sta_keepalive_method method, 15214 u32 interval) 15215 { 15216 struct wmi_sta_keepalive_arg arg = {}; 15217 struct ath12k *ar = arvif->ar; 15218 int ret; 15219 15220 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy); 15221 15222 if (arvif->ahvif->vdev_type != WMI_VDEV_TYPE_STA) 15223 return 0; 15224 15225 if (!test_bit(WMI_TLV_SERVICE_STA_KEEP_ALIVE, ar->ab->wmi_ab.svc_map)) 15226 return 0; 15227 15228 arg.vdev_id = arvif->vdev_id; 15229 arg.enabled = 1; 15230 arg.method = method; 15231 arg.interval = interval; 15232 15233 ret = ath12k_wmi_sta_keepalive(ar, &arg); 15234 if (ret) { 15235 ath12k_warn(ar->ab, "failed to set keepalive on vdev %i: %d\n", 15236 arvif->vdev_id, ret); 15237 return ret; 15238 } 15239 15240 return 0; 15241 } 15242