mac80211.c (40658B)
1// SPDX-License-Identifier: ISC 2/* 3 * Copyright (C) 2016 Felix Fietkau <nbd@nbd.name> 4 */ 5#include <linux/sched.h> 6#include <linux/of.h> 7#include "mt76.h" 8 9#define CHAN2G(_idx, _freq) { \ 10 .band = NL80211_BAND_2GHZ, \ 11 .center_freq = (_freq), \ 12 .hw_value = (_idx), \ 13 .max_power = 30, \ 14} 15 16#define CHAN5G(_idx, _freq) { \ 17 .band = NL80211_BAND_5GHZ, \ 18 .center_freq = (_freq), \ 19 .hw_value = (_idx), \ 20 .max_power = 30, \ 21} 22 23#define CHAN6G(_idx, _freq) { \ 24 .band = NL80211_BAND_6GHZ, \ 25 .center_freq = (_freq), \ 26 .hw_value = (_idx), \ 27 .max_power = 30, \ 28} 29 30static const struct ieee80211_channel mt76_channels_2ghz[] = { 31 CHAN2G(1, 2412), 32 CHAN2G(2, 2417), 33 CHAN2G(3, 2422), 34 CHAN2G(4, 2427), 35 CHAN2G(5, 2432), 36 CHAN2G(6, 2437), 37 CHAN2G(7, 2442), 38 CHAN2G(8, 2447), 39 CHAN2G(9, 2452), 40 CHAN2G(10, 2457), 41 CHAN2G(11, 2462), 42 CHAN2G(12, 2467), 43 CHAN2G(13, 2472), 44 CHAN2G(14, 2484), 45}; 46 47static const struct ieee80211_channel mt76_channels_5ghz[] = { 48 CHAN5G(36, 5180), 49 CHAN5G(40, 5200), 50 CHAN5G(44, 5220), 51 CHAN5G(48, 5240), 52 53 CHAN5G(52, 5260), 54 CHAN5G(56, 5280), 55 CHAN5G(60, 5300), 56 CHAN5G(64, 5320), 57 58 CHAN5G(100, 5500), 59 CHAN5G(104, 5520), 60 CHAN5G(108, 5540), 61 CHAN5G(112, 5560), 62 CHAN5G(116, 5580), 63 CHAN5G(120, 5600), 64 CHAN5G(124, 5620), 65 CHAN5G(128, 5640), 66 CHAN5G(132, 5660), 67 CHAN5G(136, 5680), 68 CHAN5G(140, 5700), 69 CHAN5G(144, 5720), 70 71 CHAN5G(149, 5745), 72 CHAN5G(153, 5765), 73 CHAN5G(157, 5785), 74 CHAN5G(161, 5805), 75 CHAN5G(165, 5825), 76 CHAN5G(169, 5845), 77 CHAN5G(173, 5865), 78}; 79 80static const struct ieee80211_channel mt76_channels_6ghz[] = { 81 /* UNII-5 */ 82 CHAN6G(1, 5955), 83 CHAN6G(5, 5975), 84 CHAN6G(9, 5995), 85 CHAN6G(13, 6015), 86 CHAN6G(17, 6035), 87 CHAN6G(21, 6055), 88 CHAN6G(25, 6075), 89 CHAN6G(29, 6095), 90 CHAN6G(33, 6115), 91 CHAN6G(37, 6135), 92 CHAN6G(41, 6155), 93 CHAN6G(45, 6175), 94 CHAN6G(49, 6195), 95 CHAN6G(53, 6215), 96 CHAN6G(57, 6235), 97 CHAN6G(61, 6255), 98 CHAN6G(65, 6275), 99 CHAN6G(69, 6295), 100 CHAN6G(73, 6315), 101 CHAN6G(77, 6335), 102 CHAN6G(81, 6355), 103 CHAN6G(85, 6375), 104 CHAN6G(89, 6395), 105 CHAN6G(93, 6415), 106 /* UNII-6 */ 107 CHAN6G(97, 6435), 108 CHAN6G(101, 6455), 109 CHAN6G(105, 6475), 110 CHAN6G(109, 6495), 111 CHAN6G(113, 6515), 112 CHAN6G(117, 6535), 113 /* UNII-7 */ 114 CHAN6G(121, 6555), 115 CHAN6G(125, 6575), 116 CHAN6G(129, 6595), 117 CHAN6G(133, 6615), 118 CHAN6G(137, 6635), 119 CHAN6G(141, 6655), 120 CHAN6G(145, 6675), 121 CHAN6G(149, 6695), 122 CHAN6G(153, 6715), 123 CHAN6G(157, 6735), 124 CHAN6G(161, 6755), 125 CHAN6G(165, 6775), 126 CHAN6G(169, 6795), 127 CHAN6G(173, 6815), 128 CHAN6G(177, 6835), 129 CHAN6G(181, 6855), 130 CHAN6G(185, 6875), 131 /* UNII-8 */ 132 CHAN6G(189, 6895), 133 CHAN6G(193, 6915), 134 CHAN6G(197, 6935), 135 CHAN6G(201, 6955), 136 CHAN6G(205, 6975), 137 CHAN6G(209, 6995), 138 CHAN6G(213, 7015), 139 CHAN6G(217, 7035), 140 CHAN6G(221, 7055), 141 CHAN6G(225, 7075), 142 CHAN6G(229, 7095), 143 CHAN6G(233, 7115), 144}; 145 146static const struct ieee80211_tpt_blink mt76_tpt_blink[] = { 147 { .throughput = 0 * 1024, .blink_time = 334 }, 148 { .throughput = 1 * 1024, .blink_time = 260 }, 149 { .throughput = 5 * 1024, .blink_time = 220 }, 150 { .throughput = 10 * 1024, .blink_time = 190 }, 151 { .throughput = 20 * 1024, .blink_time = 170 }, 152 { .throughput = 50 * 1024, .blink_time = 150 }, 153 { .throughput = 70 * 1024, .blink_time = 130 }, 154 { .throughput = 100 * 1024, .blink_time = 110 }, 155 { .throughput = 200 * 1024, .blink_time = 80 }, 156 { .throughput = 300 * 1024, .blink_time = 50 }, 157}; 158 159struct ieee80211_rate mt76_rates[] = { 160 CCK_RATE(0, 10), 161 CCK_RATE(1, 20), 162 CCK_RATE(2, 55), 163 CCK_RATE(3, 110), 164 OFDM_RATE(11, 60), 165 OFDM_RATE(15, 90), 166 OFDM_RATE(10, 120), 167 OFDM_RATE(14, 180), 168 OFDM_RATE(9, 240), 169 OFDM_RATE(13, 360), 170 OFDM_RATE(8, 480), 171 OFDM_RATE(12, 540), 172}; 173EXPORT_SYMBOL_GPL(mt76_rates); 174 175static const struct cfg80211_sar_freq_ranges mt76_sar_freq_ranges[] = { 176 { .start_freq = 2402, .end_freq = 2494, }, 177 { .start_freq = 5150, .end_freq = 5350, }, 178 { .start_freq = 5350, .end_freq = 5470, }, 179 { .start_freq = 5470, .end_freq = 5725, }, 180 { .start_freq = 5725, .end_freq = 5950, }, 181}; 182 183static const struct cfg80211_sar_capa mt76_sar_capa = { 184 .type = NL80211_SAR_TYPE_POWER, 185 .num_freq_ranges = ARRAY_SIZE(mt76_sar_freq_ranges), 186 .freq_ranges = &mt76_sar_freq_ranges[0], 187}; 188 189static int mt76_led_init(struct mt76_dev *dev) 190{ 191 struct device_node *np = dev->dev->of_node; 192 struct ieee80211_hw *hw = dev->hw; 193 int led_pin; 194 195 if (!dev->led_cdev.brightness_set && !dev->led_cdev.blink_set) 196 return 0; 197 198 snprintf(dev->led_name, sizeof(dev->led_name), 199 "mt76-%s", wiphy_name(hw->wiphy)); 200 201 dev->led_cdev.name = dev->led_name; 202 dev->led_cdev.default_trigger = 203 ieee80211_create_tpt_led_trigger(hw, 204 IEEE80211_TPT_LEDTRIG_FL_RADIO, 205 mt76_tpt_blink, 206 ARRAY_SIZE(mt76_tpt_blink)); 207 208 np = of_get_child_by_name(np, "led"); 209 if (np) { 210 if (!of_property_read_u32(np, "led-sources", &led_pin)) 211 dev->led_pin = led_pin; 212 dev->led_al = of_property_read_bool(np, "led-active-low"); 213 } 214 215 return led_classdev_register(dev->dev, &dev->led_cdev); 216} 217 218static void mt76_led_cleanup(struct mt76_dev *dev) 219{ 220 if (!dev->led_cdev.brightness_set && !dev->led_cdev.blink_set) 221 return; 222 223 led_classdev_unregister(&dev->led_cdev); 224} 225 226static void mt76_init_stream_cap(struct mt76_phy *phy, 227 struct ieee80211_supported_band *sband, 228 bool vht) 229{ 230 struct ieee80211_sta_ht_cap *ht_cap = &sband->ht_cap; 231 int i, nstream = hweight8(phy->antenna_mask); 232 struct ieee80211_sta_vht_cap *vht_cap; 233 u16 mcs_map = 0; 234 235 if (nstream > 1) 236 ht_cap->cap |= IEEE80211_HT_CAP_TX_STBC; 237 else 238 ht_cap->cap &= ~IEEE80211_HT_CAP_TX_STBC; 239 240 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) 241 ht_cap->mcs.rx_mask[i] = i < nstream ? 0xff : 0; 242 243 if (!vht) 244 return; 245 246 vht_cap = &sband->vht_cap; 247 if (nstream > 1) 248 vht_cap->cap |= IEEE80211_VHT_CAP_TXSTBC; 249 else 250 vht_cap->cap &= ~IEEE80211_VHT_CAP_TXSTBC; 251 vht_cap->cap |= IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN | 252 IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN; 253 254 for (i = 0; i < 8; i++) { 255 if (i < nstream) 256 mcs_map |= (IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2)); 257 else 258 mcs_map |= 259 (IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2)); 260 } 261 vht_cap->vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map); 262 vht_cap->vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map); 263} 264 265void mt76_set_stream_caps(struct mt76_phy *phy, bool vht) 266{ 267 if (phy->cap.has_2ghz) 268 mt76_init_stream_cap(phy, &phy->sband_2g.sband, false); 269 if (phy->cap.has_5ghz) 270 mt76_init_stream_cap(phy, &phy->sband_5g.sband, vht); 271 if (phy->cap.has_6ghz) 272 mt76_init_stream_cap(phy, &phy->sband_6g.sband, vht); 273} 274EXPORT_SYMBOL_GPL(mt76_set_stream_caps); 275 276static int 277mt76_init_sband(struct mt76_phy *phy, struct mt76_sband *msband, 278 const struct ieee80211_channel *chan, int n_chan, 279 struct ieee80211_rate *rates, int n_rates, 280 bool ht, bool vht) 281{ 282 struct ieee80211_supported_band *sband = &msband->sband; 283 struct ieee80211_sta_vht_cap *vht_cap; 284 struct ieee80211_sta_ht_cap *ht_cap; 285 struct mt76_dev *dev = phy->dev; 286 void *chanlist; 287 int size; 288 289 size = n_chan * sizeof(*chan); 290 chanlist = devm_kmemdup(dev->dev, chan, size, GFP_KERNEL); 291 if (!chanlist) 292 return -ENOMEM; 293 294 msband->chan = devm_kcalloc(dev->dev, n_chan, sizeof(*msband->chan), 295 GFP_KERNEL); 296 if (!msband->chan) 297 return -ENOMEM; 298 299 sband->channels = chanlist; 300 sband->n_channels = n_chan; 301 sband->bitrates = rates; 302 sband->n_bitrates = n_rates; 303 304 if (!ht) 305 return 0; 306 307 ht_cap = &sband->ht_cap; 308 ht_cap->ht_supported = true; 309 ht_cap->cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40 | 310 IEEE80211_HT_CAP_GRN_FLD | 311 IEEE80211_HT_CAP_SGI_20 | 312 IEEE80211_HT_CAP_SGI_40 | 313 (1 << IEEE80211_HT_CAP_RX_STBC_SHIFT); 314 315 ht_cap->mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED; 316 ht_cap->ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K; 317 318 mt76_init_stream_cap(phy, sband, vht); 319 320 if (!vht) 321 return 0; 322 323 vht_cap = &sband->vht_cap; 324 vht_cap->vht_supported = true; 325 vht_cap->cap |= IEEE80211_VHT_CAP_RXLDPC | 326 IEEE80211_VHT_CAP_RXSTBC_1 | 327 IEEE80211_VHT_CAP_SHORT_GI_80 | 328 (3 << IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT); 329 330 return 0; 331} 332 333static int 334mt76_init_sband_2g(struct mt76_phy *phy, struct ieee80211_rate *rates, 335 int n_rates) 336{ 337 phy->hw->wiphy->bands[NL80211_BAND_2GHZ] = &phy->sband_2g.sband; 338 339 return mt76_init_sband(phy, &phy->sband_2g, mt76_channels_2ghz, 340 ARRAY_SIZE(mt76_channels_2ghz), rates, 341 n_rates, true, false); 342} 343 344static int 345mt76_init_sband_5g(struct mt76_phy *phy, struct ieee80211_rate *rates, 346 int n_rates, bool vht) 347{ 348 phy->hw->wiphy->bands[NL80211_BAND_5GHZ] = &phy->sband_5g.sband; 349 350 return mt76_init_sband(phy, &phy->sband_5g, mt76_channels_5ghz, 351 ARRAY_SIZE(mt76_channels_5ghz), rates, 352 n_rates, true, vht); 353} 354 355static int 356mt76_init_sband_6g(struct mt76_phy *phy, struct ieee80211_rate *rates, 357 int n_rates) 358{ 359 phy->hw->wiphy->bands[NL80211_BAND_6GHZ] = &phy->sband_6g.sband; 360 361 return mt76_init_sband(phy, &phy->sband_6g, mt76_channels_6ghz, 362 ARRAY_SIZE(mt76_channels_6ghz), rates, 363 n_rates, false, false); 364} 365 366static void 367mt76_check_sband(struct mt76_phy *phy, struct mt76_sband *msband, 368 enum nl80211_band band) 369{ 370 struct ieee80211_supported_band *sband = &msband->sband; 371 bool found = false; 372 int i; 373 374 if (!sband) 375 return; 376 377 for (i = 0; i < sband->n_channels; i++) { 378 if (sband->channels[i].flags & IEEE80211_CHAN_DISABLED) 379 continue; 380 381 found = true; 382 break; 383 } 384 385 if (found) { 386 phy->chandef.chan = &sband->channels[0]; 387 phy->chan_state = &msband->chan[0]; 388 return; 389 } 390 391 sband->n_channels = 0; 392 phy->hw->wiphy->bands[band] = NULL; 393} 394 395static int 396mt76_phy_init(struct mt76_phy *phy, struct ieee80211_hw *hw) 397{ 398 struct mt76_dev *dev = phy->dev; 399 struct wiphy *wiphy = hw->wiphy; 400 401 SET_IEEE80211_DEV(hw, dev->dev); 402 SET_IEEE80211_PERM_ADDR(hw, phy->macaddr); 403 404 wiphy->features |= NL80211_FEATURE_ACTIVE_MONITOR; 405 wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH | 406 WIPHY_FLAG_SUPPORTS_TDLS | 407 WIPHY_FLAG_AP_UAPSD; 408 409 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST); 410 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_AIRTIME_FAIRNESS); 411 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_AQL); 412 413 wiphy->available_antennas_tx = phy->antenna_mask; 414 wiphy->available_antennas_rx = phy->antenna_mask; 415 416 wiphy->sar_capa = &mt76_sar_capa; 417 phy->frp = devm_kcalloc(dev->dev, wiphy->sar_capa->num_freq_ranges, 418 sizeof(struct mt76_freq_range_power), 419 GFP_KERNEL); 420 if (!phy->frp) 421 return -ENOMEM; 422 423 hw->txq_data_size = sizeof(struct mt76_txq); 424 hw->uapsd_max_sp_len = IEEE80211_WMM_IE_STA_QOSINFO_SP_ALL; 425 426 if (!hw->max_tx_fragments) 427 hw->max_tx_fragments = 16; 428 429 ieee80211_hw_set(hw, SIGNAL_DBM); 430 ieee80211_hw_set(hw, AMPDU_AGGREGATION); 431 ieee80211_hw_set(hw, SUPPORTS_RC_TABLE); 432 ieee80211_hw_set(hw, SUPPORT_FAST_XMIT); 433 ieee80211_hw_set(hw, SUPPORTS_CLONED_SKBS); 434 ieee80211_hw_set(hw, SUPPORTS_AMSDU_IN_AMPDU); 435 ieee80211_hw_set(hw, SUPPORTS_REORDERING_BUFFER); 436 ieee80211_hw_set(hw, TX_AMSDU); 437 ieee80211_hw_set(hw, TX_FRAG_LIST); 438 ieee80211_hw_set(hw, MFP_CAPABLE); 439 ieee80211_hw_set(hw, AP_LINK_PS); 440 ieee80211_hw_set(hw, REPORTS_TX_ACK_STATUS); 441 442 return 0; 443} 444 445struct mt76_phy * 446mt76_alloc_phy(struct mt76_dev *dev, unsigned int size, 447 const struct ieee80211_ops *ops) 448{ 449 struct ieee80211_hw *hw; 450 unsigned int phy_size; 451 struct mt76_phy *phy; 452 453 phy_size = ALIGN(sizeof(*phy), 8); 454 hw = ieee80211_alloc_hw(size + phy_size, ops); 455 if (!hw) 456 return NULL; 457 458 phy = hw->priv; 459 phy->dev = dev; 460 phy->hw = hw; 461 phy->priv = hw->priv + phy_size; 462 463 hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; 464 hw->wiphy->interface_modes = 465 BIT(NL80211_IFTYPE_STATION) | 466 BIT(NL80211_IFTYPE_AP) | 467#ifdef CONFIG_MAC80211_MESH 468 BIT(NL80211_IFTYPE_MESH_POINT) | 469#endif 470 BIT(NL80211_IFTYPE_P2P_CLIENT) | 471 BIT(NL80211_IFTYPE_P2P_GO) | 472 BIT(NL80211_IFTYPE_ADHOC); 473 474 return phy; 475} 476EXPORT_SYMBOL_GPL(mt76_alloc_phy); 477 478int mt76_register_phy(struct mt76_phy *phy, bool vht, 479 struct ieee80211_rate *rates, int n_rates) 480{ 481 int ret; 482 483 ret = mt76_phy_init(phy, phy->hw); 484 if (ret) 485 return ret; 486 487 if (phy->cap.has_2ghz) { 488 ret = mt76_init_sband_2g(phy, rates, n_rates); 489 if (ret) 490 return ret; 491 } 492 493 if (phy->cap.has_5ghz) { 494 ret = mt76_init_sband_5g(phy, rates + 4, n_rates - 4, vht); 495 if (ret) 496 return ret; 497 } 498 499 if (phy->cap.has_6ghz) { 500 ret = mt76_init_sband_6g(phy, rates + 4, n_rates - 4); 501 if (ret) 502 return ret; 503 } 504 505 wiphy_read_of_freq_limits(phy->hw->wiphy); 506 mt76_check_sband(phy, &phy->sband_2g, NL80211_BAND_2GHZ); 507 mt76_check_sband(phy, &phy->sband_5g, NL80211_BAND_5GHZ); 508 mt76_check_sband(phy, &phy->sband_6g, NL80211_BAND_6GHZ); 509 510 ret = ieee80211_register_hw(phy->hw); 511 if (ret) 512 return ret; 513 514 phy->dev->phy2 = phy; 515 516 return 0; 517} 518EXPORT_SYMBOL_GPL(mt76_register_phy); 519 520void mt76_unregister_phy(struct mt76_phy *phy) 521{ 522 struct mt76_dev *dev = phy->dev; 523 524 mt76_tx_status_check(dev, true); 525 ieee80211_unregister_hw(phy->hw); 526 dev->phy2 = NULL; 527} 528EXPORT_SYMBOL_GPL(mt76_unregister_phy); 529 530struct mt76_dev * 531mt76_alloc_device(struct device *pdev, unsigned int size, 532 const struct ieee80211_ops *ops, 533 const struct mt76_driver_ops *drv_ops) 534{ 535 struct ieee80211_hw *hw; 536 struct mt76_phy *phy; 537 struct mt76_dev *dev; 538 int i; 539 540 hw = ieee80211_alloc_hw(size, ops); 541 if (!hw) 542 return NULL; 543 544 dev = hw->priv; 545 dev->hw = hw; 546 dev->dev = pdev; 547 dev->drv = drv_ops; 548 dev->dma_dev = pdev; 549 550 phy = &dev->phy; 551 phy->dev = dev; 552 phy->hw = hw; 553 554 spin_lock_init(&dev->rx_lock); 555 spin_lock_init(&dev->lock); 556 spin_lock_init(&dev->cc_lock); 557 spin_lock_init(&dev->status_lock); 558 mutex_init(&dev->mutex); 559 init_waitqueue_head(&dev->tx_wait); 560 561 skb_queue_head_init(&dev->mcu.res_q); 562 init_waitqueue_head(&dev->mcu.wait); 563 mutex_init(&dev->mcu.mutex); 564 dev->tx_worker.fn = mt76_tx_worker; 565 566 hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; 567 hw->wiphy->interface_modes = 568 BIT(NL80211_IFTYPE_STATION) | 569 BIT(NL80211_IFTYPE_AP) | 570#ifdef CONFIG_MAC80211_MESH 571 BIT(NL80211_IFTYPE_MESH_POINT) | 572#endif 573 BIT(NL80211_IFTYPE_P2P_CLIENT) | 574 BIT(NL80211_IFTYPE_P2P_GO) | 575 BIT(NL80211_IFTYPE_ADHOC); 576 577 spin_lock_init(&dev->token_lock); 578 idr_init(&dev->token); 579 580 INIT_LIST_HEAD(&dev->wcid_list); 581 582 INIT_LIST_HEAD(&dev->txwi_cache); 583 dev->token_size = dev->drv->token_size; 584 585 for (i = 0; i < ARRAY_SIZE(dev->q_rx); i++) 586 skb_queue_head_init(&dev->rx_skb[i]); 587 588 dev->wq = alloc_ordered_workqueue("mt76", 0); 589 if (!dev->wq) { 590 ieee80211_free_hw(hw); 591 return NULL; 592 } 593 594 return dev; 595} 596EXPORT_SYMBOL_GPL(mt76_alloc_device); 597 598int mt76_register_device(struct mt76_dev *dev, bool vht, 599 struct ieee80211_rate *rates, int n_rates) 600{ 601 struct ieee80211_hw *hw = dev->hw; 602 struct mt76_phy *phy = &dev->phy; 603 int ret; 604 605 dev_set_drvdata(dev->dev, dev); 606 ret = mt76_phy_init(phy, hw); 607 if (ret) 608 return ret; 609 610 if (phy->cap.has_2ghz) { 611 ret = mt76_init_sband_2g(phy, rates, n_rates); 612 if (ret) 613 return ret; 614 } 615 616 if (phy->cap.has_5ghz) { 617 ret = mt76_init_sband_5g(phy, rates + 4, n_rates - 4, vht); 618 if (ret) 619 return ret; 620 } 621 622 if (phy->cap.has_6ghz) { 623 ret = mt76_init_sband_6g(phy, rates + 4, n_rates - 4); 624 if (ret) 625 return ret; 626 } 627 628 wiphy_read_of_freq_limits(hw->wiphy); 629 mt76_check_sband(&dev->phy, &phy->sband_2g, NL80211_BAND_2GHZ); 630 mt76_check_sband(&dev->phy, &phy->sband_5g, NL80211_BAND_5GHZ); 631 mt76_check_sband(&dev->phy, &phy->sband_6g, NL80211_BAND_6GHZ); 632 633 if (IS_ENABLED(CONFIG_MT76_LEDS)) { 634 ret = mt76_led_init(dev); 635 if (ret) 636 return ret; 637 } 638 639 ret = ieee80211_register_hw(hw); 640 if (ret) 641 return ret; 642 643 WARN_ON(mt76_worker_setup(hw, &dev->tx_worker, NULL, "tx")); 644 sched_set_fifo_low(dev->tx_worker.task); 645 646 return 0; 647} 648EXPORT_SYMBOL_GPL(mt76_register_device); 649 650void mt76_unregister_device(struct mt76_dev *dev) 651{ 652 struct ieee80211_hw *hw = dev->hw; 653 654 if (IS_ENABLED(CONFIG_MT76_LEDS)) 655 mt76_led_cleanup(dev); 656 mt76_tx_status_check(dev, true); 657 ieee80211_unregister_hw(hw); 658} 659EXPORT_SYMBOL_GPL(mt76_unregister_device); 660 661void mt76_free_device(struct mt76_dev *dev) 662{ 663 mt76_worker_teardown(&dev->tx_worker); 664 if (dev->wq) { 665 destroy_workqueue(dev->wq); 666 dev->wq = NULL; 667 } 668 ieee80211_free_hw(dev->hw); 669} 670EXPORT_SYMBOL_GPL(mt76_free_device); 671 672static void mt76_rx_release_amsdu(struct mt76_phy *phy, enum mt76_rxq_id q) 673{ 674 struct sk_buff *skb = phy->rx_amsdu[q].head; 675 struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb; 676 struct mt76_dev *dev = phy->dev; 677 678 phy->rx_amsdu[q].head = NULL; 679 phy->rx_amsdu[q].tail = NULL; 680 681 /* 682 * Validate if the amsdu has a proper first subframe. 683 * A single MSDU can be parsed as A-MSDU when the unauthenticated A-MSDU 684 * flag of the QoS header gets flipped. In such cases, the first 685 * subframe has a LLC/SNAP header in the location of the destination 686 * address. 687 */ 688 if (skb_shinfo(skb)->frag_list) { 689 int offset = 0; 690 691 if (!(status->flag & RX_FLAG_8023)) { 692 offset = ieee80211_get_hdrlen_from_skb(skb); 693 694 if ((status->flag & 695 (RX_FLAG_DECRYPTED | RX_FLAG_IV_STRIPPED)) == 696 RX_FLAG_DECRYPTED) 697 offset += 8; 698 } 699 700 if (ether_addr_equal(skb->data + offset, rfc1042_header)) { 701 dev_kfree_skb(skb); 702 return; 703 } 704 } 705 __skb_queue_tail(&dev->rx_skb[q], skb); 706} 707 708static void mt76_rx_release_burst(struct mt76_phy *phy, enum mt76_rxq_id q, 709 struct sk_buff *skb) 710{ 711 struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb; 712 713 if (phy->rx_amsdu[q].head && 714 (!status->amsdu || status->first_amsdu || 715 status->seqno != phy->rx_amsdu[q].seqno)) 716 mt76_rx_release_amsdu(phy, q); 717 718 if (!phy->rx_amsdu[q].head) { 719 phy->rx_amsdu[q].tail = &skb_shinfo(skb)->frag_list; 720 phy->rx_amsdu[q].seqno = status->seqno; 721 phy->rx_amsdu[q].head = skb; 722 } else { 723 *phy->rx_amsdu[q].tail = skb; 724 phy->rx_amsdu[q].tail = &skb->next; 725 } 726 727 if (!status->amsdu || status->last_amsdu) 728 mt76_rx_release_amsdu(phy, q); 729} 730 731void mt76_rx(struct mt76_dev *dev, enum mt76_rxq_id q, struct sk_buff *skb) 732{ 733 struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb; 734 struct mt76_phy *phy = mt76_dev_phy(dev, status->ext_phy); 735 736 if (!test_bit(MT76_STATE_RUNNING, &phy->state)) { 737 dev_kfree_skb(skb); 738 return; 739 } 740 741#ifdef CONFIG_NL80211_TESTMODE 742 if (phy->test.state == MT76_TM_STATE_RX_FRAMES) { 743 phy->test.rx_stats.packets[q]++; 744 if (status->flag & RX_FLAG_FAILED_FCS_CRC) 745 phy->test.rx_stats.fcs_error[q]++; 746 } 747#endif 748 749 mt76_rx_release_burst(phy, q, skb); 750} 751EXPORT_SYMBOL_GPL(mt76_rx); 752 753bool mt76_has_tx_pending(struct mt76_phy *phy) 754{ 755 struct mt76_queue *q; 756 int i; 757 758 for (i = 0; i < __MT_TXQ_MAX; i++) { 759 q = phy->q_tx[i]; 760 if (q && q->queued) 761 return true; 762 } 763 764 return false; 765} 766EXPORT_SYMBOL_GPL(mt76_has_tx_pending); 767 768static struct mt76_channel_state * 769mt76_channel_state(struct mt76_phy *phy, struct ieee80211_channel *c) 770{ 771 struct mt76_sband *msband; 772 int idx; 773 774 if (c->band == NL80211_BAND_2GHZ) 775 msband = &phy->sband_2g; 776 else if (c->band == NL80211_BAND_6GHZ) 777 msband = &phy->sband_6g; 778 else 779 msband = &phy->sband_5g; 780 781 idx = c - &msband->sband.channels[0]; 782 return &msband->chan[idx]; 783} 784 785void mt76_update_survey_active_time(struct mt76_phy *phy, ktime_t time) 786{ 787 struct mt76_channel_state *state = phy->chan_state; 788 789 state->cc_active += ktime_to_us(ktime_sub(time, 790 phy->survey_time)); 791 phy->survey_time = time; 792} 793EXPORT_SYMBOL_GPL(mt76_update_survey_active_time); 794 795void mt76_update_survey(struct mt76_phy *phy) 796{ 797 struct mt76_dev *dev = phy->dev; 798 ktime_t cur_time; 799 800 if (dev->drv->update_survey) 801 dev->drv->update_survey(phy); 802 803 cur_time = ktime_get_boottime(); 804 mt76_update_survey_active_time(phy, cur_time); 805 806 if (dev->drv->drv_flags & MT_DRV_SW_RX_AIRTIME) { 807 struct mt76_channel_state *state = phy->chan_state; 808 809 spin_lock_bh(&dev->cc_lock); 810 state->cc_bss_rx += dev->cur_cc_bss_rx; 811 dev->cur_cc_bss_rx = 0; 812 spin_unlock_bh(&dev->cc_lock); 813 } 814} 815EXPORT_SYMBOL_GPL(mt76_update_survey); 816 817void mt76_set_channel(struct mt76_phy *phy) 818{ 819 struct mt76_dev *dev = phy->dev; 820 struct ieee80211_hw *hw = phy->hw; 821 struct cfg80211_chan_def *chandef = &hw->conf.chandef; 822 bool offchannel = hw->conf.flags & IEEE80211_CONF_OFFCHANNEL; 823 int timeout = HZ / 5; 824 825 wait_event_timeout(dev->tx_wait, !mt76_has_tx_pending(phy), timeout); 826 mt76_update_survey(phy); 827 828 if (phy->chandef.chan->center_freq != chandef->chan->center_freq || 829 phy->chandef.width != chandef->width) 830 phy->dfs_state = MT_DFS_STATE_UNKNOWN; 831 832 phy->chandef = *chandef; 833 phy->chan_state = mt76_channel_state(phy, chandef->chan); 834 835 if (!offchannel) 836 phy->main_chan = chandef->chan; 837 838 if (chandef->chan != phy->main_chan) 839 memset(phy->chan_state, 0, sizeof(*phy->chan_state)); 840} 841EXPORT_SYMBOL_GPL(mt76_set_channel); 842 843int mt76_get_survey(struct ieee80211_hw *hw, int idx, 844 struct survey_info *survey) 845{ 846 struct mt76_phy *phy = hw->priv; 847 struct mt76_dev *dev = phy->dev; 848 struct mt76_sband *sband; 849 struct ieee80211_channel *chan; 850 struct mt76_channel_state *state; 851 int ret = 0; 852 853 mutex_lock(&dev->mutex); 854 if (idx == 0 && dev->drv->update_survey) 855 mt76_update_survey(phy); 856 857 if (idx >= phy->sband_2g.sband.n_channels + 858 phy->sband_5g.sband.n_channels) { 859 idx -= (phy->sband_2g.sband.n_channels + 860 phy->sband_5g.sband.n_channels); 861 sband = &phy->sband_6g; 862 } else if (idx >= phy->sband_2g.sband.n_channels) { 863 idx -= phy->sband_2g.sband.n_channels; 864 sband = &phy->sband_5g; 865 } else { 866 sband = &phy->sband_2g; 867 } 868 869 if (idx >= sband->sband.n_channels) { 870 ret = -ENOENT; 871 goto out; 872 } 873 874 chan = &sband->sband.channels[idx]; 875 state = mt76_channel_state(phy, chan); 876 877 memset(survey, 0, sizeof(*survey)); 878 survey->channel = chan; 879 survey->filled = SURVEY_INFO_TIME | SURVEY_INFO_TIME_BUSY; 880 survey->filled |= dev->drv->survey_flags; 881 if (state->noise) 882 survey->filled |= SURVEY_INFO_NOISE_DBM; 883 884 if (chan == phy->main_chan) { 885 survey->filled |= SURVEY_INFO_IN_USE; 886 887 if (dev->drv->drv_flags & MT_DRV_SW_RX_AIRTIME) 888 survey->filled |= SURVEY_INFO_TIME_BSS_RX; 889 } 890 891 survey->time_busy = div_u64(state->cc_busy, 1000); 892 survey->time_rx = div_u64(state->cc_rx, 1000); 893 survey->time = div_u64(state->cc_active, 1000); 894 survey->noise = state->noise; 895 896 spin_lock_bh(&dev->cc_lock); 897 survey->time_bss_rx = div_u64(state->cc_bss_rx, 1000); 898 survey->time_tx = div_u64(state->cc_tx, 1000); 899 spin_unlock_bh(&dev->cc_lock); 900 901out: 902 mutex_unlock(&dev->mutex); 903 904 return ret; 905} 906EXPORT_SYMBOL_GPL(mt76_get_survey); 907 908void mt76_wcid_key_setup(struct mt76_dev *dev, struct mt76_wcid *wcid, 909 struct ieee80211_key_conf *key) 910{ 911 struct ieee80211_key_seq seq; 912 int i; 913 914 wcid->rx_check_pn = false; 915 916 if (!key) 917 return; 918 919 if (key->cipher != WLAN_CIPHER_SUITE_CCMP) 920 return; 921 922 wcid->rx_check_pn = true; 923 924 /* data frame */ 925 for (i = 0; i < IEEE80211_NUM_TIDS; i++) { 926 ieee80211_get_key_rx_seq(key, i, &seq); 927 memcpy(wcid->rx_key_pn[i], seq.ccmp.pn, sizeof(seq.ccmp.pn)); 928 } 929 930 /* robust management frame */ 931 ieee80211_get_key_rx_seq(key, -1, &seq); 932 memcpy(wcid->rx_key_pn[i], seq.ccmp.pn, sizeof(seq.ccmp.pn)); 933 934} 935EXPORT_SYMBOL(mt76_wcid_key_setup); 936 937static int 938mt76_rx_signal(struct mt76_rx_status *status) 939{ 940 s8 *chain_signal = status->chain_signal; 941 int signal = -128; 942 u8 chains; 943 944 for (chains = status->chains; chains; chains >>= 1, chain_signal++) { 945 int cur, diff; 946 947 cur = *chain_signal; 948 if (!(chains & BIT(0)) || 949 cur > 0) 950 continue; 951 952 if (cur > signal) 953 swap(cur, signal); 954 955 diff = signal - cur; 956 if (diff == 0) 957 signal += 3; 958 else if (diff <= 2) 959 signal += 2; 960 else if (diff <= 6) 961 signal += 1; 962 } 963 964 return signal; 965} 966 967static void 968mt76_rx_convert(struct mt76_dev *dev, struct sk_buff *skb, 969 struct ieee80211_hw **hw, 970 struct ieee80211_sta **sta) 971{ 972 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); 973 struct ieee80211_hdr *hdr = mt76_skb_get_hdr(skb); 974 struct mt76_rx_status mstat; 975 976 mstat = *((struct mt76_rx_status *)skb->cb); 977 memset(status, 0, sizeof(*status)); 978 979 status->flag = mstat.flag; 980 status->freq = mstat.freq; 981 status->enc_flags = mstat.enc_flags; 982 status->encoding = mstat.encoding; 983 status->bw = mstat.bw; 984 status->he_ru = mstat.he_ru; 985 status->he_gi = mstat.he_gi; 986 status->he_dcm = mstat.he_dcm; 987 status->rate_idx = mstat.rate_idx; 988 status->nss = mstat.nss; 989 status->band = mstat.band; 990 status->signal = mstat.signal; 991 status->chains = mstat.chains; 992 status->ampdu_reference = mstat.ampdu_ref; 993 status->device_timestamp = mstat.timestamp; 994 status->mactime = mstat.timestamp; 995 status->signal = mt76_rx_signal(&mstat); 996 if (status->signal <= -128) 997 status->flag |= RX_FLAG_NO_SIGNAL_VAL; 998 999 if (ieee80211_is_beacon(hdr->frame_control) || 1000 ieee80211_is_probe_resp(hdr->frame_control)) 1001 status->boottime_ns = ktime_get_boottime_ns(); 1002 1003 BUILD_BUG_ON(sizeof(mstat) > sizeof(skb->cb)); 1004 BUILD_BUG_ON(sizeof(status->chain_signal) != 1005 sizeof(mstat.chain_signal)); 1006 memcpy(status->chain_signal, mstat.chain_signal, 1007 sizeof(mstat.chain_signal)); 1008 1009 *sta = wcid_to_sta(mstat.wcid); 1010 *hw = mt76_phy_hw(dev, mstat.ext_phy); 1011} 1012 1013static int 1014mt76_check_ccmp_pn(struct sk_buff *skb) 1015{ 1016 struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb; 1017 struct mt76_wcid *wcid = status->wcid; 1018 struct ieee80211_hdr *hdr; 1019 int security_idx; 1020 int ret; 1021 1022 if (!(status->flag & RX_FLAG_DECRYPTED)) 1023 return 0; 1024 1025 if (!wcid || !wcid->rx_check_pn) 1026 return 0; 1027 1028 security_idx = status->qos_ctl & IEEE80211_QOS_CTL_TID_MASK; 1029 if (status->flag & RX_FLAG_8023) 1030 goto skip_hdr_check; 1031 1032 hdr = mt76_skb_get_hdr(skb); 1033 if (!(status->flag & RX_FLAG_IV_STRIPPED)) { 1034 /* 1035 * Validate the first fragment both here and in mac80211 1036 * All further fragments will be validated by mac80211 only. 1037 */ 1038 if (ieee80211_is_frag(hdr) && 1039 !ieee80211_is_first_frag(hdr->frame_control)) 1040 return 0; 1041 } 1042 1043 /* IEEE 802.11-2020, 12.5.3.4.4 "PN and replay detection" c): 1044 * 1045 * the recipient shall maintain a single replay counter for received 1046 * individually addressed robust Management frames that are received 1047 * with the To DS subfield equal to 0, [...] 1048 */ 1049 if (ieee80211_is_mgmt(hdr->frame_control) && 1050 !ieee80211_has_tods(hdr->frame_control)) 1051 security_idx = IEEE80211_NUM_TIDS; 1052 1053skip_hdr_check: 1054 BUILD_BUG_ON(sizeof(status->iv) != sizeof(wcid->rx_key_pn[0])); 1055 ret = memcmp(status->iv, wcid->rx_key_pn[security_idx], 1056 sizeof(status->iv)); 1057 if (ret <= 0) 1058 return -EINVAL; /* replay */ 1059 1060 memcpy(wcid->rx_key_pn[security_idx], status->iv, sizeof(status->iv)); 1061 1062 if (status->flag & RX_FLAG_IV_STRIPPED) 1063 status->flag |= RX_FLAG_PN_VALIDATED; 1064 1065 return 0; 1066} 1067 1068static void 1069mt76_airtime_report(struct mt76_dev *dev, struct mt76_rx_status *status, 1070 int len) 1071{ 1072 struct mt76_wcid *wcid = status->wcid; 1073 struct ieee80211_rx_status info = { 1074 .enc_flags = status->enc_flags, 1075 .rate_idx = status->rate_idx, 1076 .encoding = status->encoding, 1077 .band = status->band, 1078 .nss = status->nss, 1079 .bw = status->bw, 1080 }; 1081 struct ieee80211_sta *sta; 1082 u32 airtime; 1083 u8 tidno = status->qos_ctl & IEEE80211_QOS_CTL_TID_MASK; 1084 1085 airtime = ieee80211_calc_rx_airtime(dev->hw, &info, len); 1086 spin_lock(&dev->cc_lock); 1087 dev->cur_cc_bss_rx += airtime; 1088 spin_unlock(&dev->cc_lock); 1089 1090 if (!wcid || !wcid->sta) 1091 return; 1092 1093 sta = container_of((void *)wcid, struct ieee80211_sta, drv_priv); 1094 ieee80211_sta_register_airtime(sta, tidno, 0, airtime); 1095} 1096 1097static void 1098mt76_airtime_flush_ampdu(struct mt76_dev *dev) 1099{ 1100 struct mt76_wcid *wcid; 1101 int wcid_idx; 1102 1103 if (!dev->rx_ampdu_len) 1104 return; 1105 1106 wcid_idx = dev->rx_ampdu_status.wcid_idx; 1107 if (wcid_idx < ARRAY_SIZE(dev->wcid)) 1108 wcid = rcu_dereference(dev->wcid[wcid_idx]); 1109 else 1110 wcid = NULL; 1111 dev->rx_ampdu_status.wcid = wcid; 1112 1113 mt76_airtime_report(dev, &dev->rx_ampdu_status, dev->rx_ampdu_len); 1114 1115 dev->rx_ampdu_len = 0; 1116 dev->rx_ampdu_ref = 0; 1117} 1118 1119static void 1120mt76_airtime_check(struct mt76_dev *dev, struct sk_buff *skb) 1121{ 1122 struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb; 1123 struct mt76_wcid *wcid = status->wcid; 1124 1125 if (!(dev->drv->drv_flags & MT_DRV_SW_RX_AIRTIME)) 1126 return; 1127 1128 if (!wcid || !wcid->sta) { 1129 struct ieee80211_hdr *hdr = mt76_skb_get_hdr(skb); 1130 1131 if (status->flag & RX_FLAG_8023) 1132 return; 1133 1134 if (!ether_addr_equal(hdr->addr1, dev->phy.macaddr)) 1135 return; 1136 1137 wcid = NULL; 1138 } 1139 1140 if (!(status->flag & RX_FLAG_AMPDU_DETAILS) || 1141 status->ampdu_ref != dev->rx_ampdu_ref) 1142 mt76_airtime_flush_ampdu(dev); 1143 1144 if (status->flag & RX_FLAG_AMPDU_DETAILS) { 1145 if (!dev->rx_ampdu_len || 1146 status->ampdu_ref != dev->rx_ampdu_ref) { 1147 dev->rx_ampdu_status = *status; 1148 dev->rx_ampdu_status.wcid_idx = wcid ? wcid->idx : 0xff; 1149 dev->rx_ampdu_ref = status->ampdu_ref; 1150 } 1151 1152 dev->rx_ampdu_len += skb->len; 1153 return; 1154 } 1155 1156 mt76_airtime_report(dev, status, skb->len); 1157} 1158 1159static void 1160mt76_check_sta(struct mt76_dev *dev, struct sk_buff *skb) 1161{ 1162 struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb; 1163 struct ieee80211_hdr *hdr = mt76_skb_get_hdr(skb); 1164 struct ieee80211_sta *sta; 1165 struct ieee80211_hw *hw; 1166 struct mt76_wcid *wcid = status->wcid; 1167 u8 tidno = status->qos_ctl & IEEE80211_QOS_CTL_TID_MASK; 1168 bool ps; 1169 1170 hw = mt76_phy_hw(dev, status->ext_phy); 1171 if (ieee80211_is_pspoll(hdr->frame_control) && !wcid && 1172 !(status->flag & RX_FLAG_8023)) { 1173 sta = ieee80211_find_sta_by_ifaddr(hw, hdr->addr2, NULL); 1174 if (sta) 1175 wcid = status->wcid = (struct mt76_wcid *)sta->drv_priv; 1176 } 1177 1178 mt76_airtime_check(dev, skb); 1179 1180 if (!wcid || !wcid->sta) 1181 return; 1182 1183 sta = container_of((void *)wcid, struct ieee80211_sta, drv_priv); 1184 1185 if (status->signal <= 0) 1186 ewma_signal_add(&wcid->rssi, -status->signal); 1187 1188 wcid->inactive_count = 0; 1189 1190 if (status->flag & RX_FLAG_8023) 1191 return; 1192 1193 if (!test_bit(MT_WCID_FLAG_CHECK_PS, &wcid->flags)) 1194 return; 1195 1196 if (ieee80211_is_pspoll(hdr->frame_control)) { 1197 ieee80211_sta_pspoll(sta); 1198 return; 1199 } 1200 1201 if (ieee80211_has_morefrags(hdr->frame_control) || 1202 !(ieee80211_is_mgmt(hdr->frame_control) || 1203 ieee80211_is_data(hdr->frame_control))) 1204 return; 1205 1206 ps = ieee80211_has_pm(hdr->frame_control); 1207 1208 if (ps && (ieee80211_is_data_qos(hdr->frame_control) || 1209 ieee80211_is_qos_nullfunc(hdr->frame_control))) 1210 ieee80211_sta_uapsd_trigger(sta, tidno); 1211 1212 if (!!test_bit(MT_WCID_FLAG_PS, &wcid->flags) == ps) 1213 return; 1214 1215 if (ps) 1216 set_bit(MT_WCID_FLAG_PS, &wcid->flags); 1217 1218 dev->drv->sta_ps(dev, sta, ps); 1219 1220 if (!ps) 1221 clear_bit(MT_WCID_FLAG_PS, &wcid->flags); 1222 1223 ieee80211_sta_ps_transition(sta, ps); 1224} 1225 1226void mt76_rx_complete(struct mt76_dev *dev, struct sk_buff_head *frames, 1227 struct napi_struct *napi) 1228{ 1229 struct ieee80211_sta *sta; 1230 struct ieee80211_hw *hw; 1231 struct sk_buff *skb, *tmp; 1232 LIST_HEAD(list); 1233 1234 spin_lock(&dev->rx_lock); 1235 while ((skb = __skb_dequeue(frames)) != NULL) { 1236 struct sk_buff *nskb = skb_shinfo(skb)->frag_list; 1237 1238 if (mt76_check_ccmp_pn(skb)) { 1239 dev_kfree_skb(skb); 1240 continue; 1241 } 1242 1243 skb_shinfo(skb)->frag_list = NULL; 1244 mt76_rx_convert(dev, skb, &hw, &sta); 1245 ieee80211_rx_list(hw, sta, skb, &list); 1246 1247 /* subsequent amsdu frames */ 1248 while (nskb) { 1249 skb = nskb; 1250 nskb = nskb->next; 1251 skb->next = NULL; 1252 1253 mt76_rx_convert(dev, skb, &hw, &sta); 1254 ieee80211_rx_list(hw, sta, skb, &list); 1255 } 1256 } 1257 spin_unlock(&dev->rx_lock); 1258 1259 if (!napi) { 1260 netif_receive_skb_list(&list); 1261 return; 1262 } 1263 1264 list_for_each_entry_safe(skb, tmp, &list, list) { 1265 skb_list_del_init(skb); 1266 napi_gro_receive(napi, skb); 1267 } 1268} 1269 1270void mt76_rx_poll_complete(struct mt76_dev *dev, enum mt76_rxq_id q, 1271 struct napi_struct *napi) 1272{ 1273 struct sk_buff_head frames; 1274 struct sk_buff *skb; 1275 1276 __skb_queue_head_init(&frames); 1277 1278 while ((skb = __skb_dequeue(&dev->rx_skb[q])) != NULL) { 1279 mt76_check_sta(dev, skb); 1280 mt76_rx_aggr_reorder(skb, &frames); 1281 } 1282 1283 mt76_rx_complete(dev, &frames, napi); 1284} 1285EXPORT_SYMBOL_GPL(mt76_rx_poll_complete); 1286 1287static int 1288mt76_sta_add(struct mt76_dev *dev, struct ieee80211_vif *vif, 1289 struct ieee80211_sta *sta, bool ext_phy) 1290{ 1291 struct mt76_wcid *wcid = (struct mt76_wcid *)sta->drv_priv; 1292 int ret; 1293 int i; 1294 1295 mutex_lock(&dev->mutex); 1296 1297 ret = dev->drv->sta_add(dev, vif, sta); 1298 if (ret) 1299 goto out; 1300 1301 for (i = 0; i < ARRAY_SIZE(sta->txq); i++) { 1302 struct mt76_txq *mtxq; 1303 1304 if (!sta->txq[i]) 1305 continue; 1306 1307 mtxq = (struct mt76_txq *)sta->txq[i]->drv_priv; 1308 mtxq->wcid = wcid->idx; 1309 } 1310 1311 ewma_signal_init(&wcid->rssi); 1312 if (ext_phy) 1313 mt76_wcid_mask_set(dev->wcid_phy_mask, wcid->idx); 1314 wcid->ext_phy = ext_phy; 1315 rcu_assign_pointer(dev->wcid[wcid->idx], wcid); 1316 1317 mt76_packet_id_init(wcid); 1318out: 1319 mutex_unlock(&dev->mutex); 1320 1321 return ret; 1322} 1323 1324void __mt76_sta_remove(struct mt76_dev *dev, struct ieee80211_vif *vif, 1325 struct ieee80211_sta *sta) 1326{ 1327 struct mt76_wcid *wcid = (struct mt76_wcid *)sta->drv_priv; 1328 int i, idx = wcid->idx; 1329 1330 for (i = 0; i < ARRAY_SIZE(wcid->aggr); i++) 1331 mt76_rx_aggr_stop(dev, wcid, i); 1332 1333 if (dev->drv->sta_remove) 1334 dev->drv->sta_remove(dev, vif, sta); 1335 1336 mt76_packet_id_flush(dev, wcid); 1337 1338 mt76_wcid_mask_clear(dev->wcid_mask, idx); 1339 mt76_wcid_mask_clear(dev->wcid_phy_mask, idx); 1340} 1341EXPORT_SYMBOL_GPL(__mt76_sta_remove); 1342 1343static void 1344mt76_sta_remove(struct mt76_dev *dev, struct ieee80211_vif *vif, 1345 struct ieee80211_sta *sta) 1346{ 1347 mutex_lock(&dev->mutex); 1348 __mt76_sta_remove(dev, vif, sta); 1349 mutex_unlock(&dev->mutex); 1350} 1351 1352int mt76_sta_state(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 1353 struct ieee80211_sta *sta, 1354 enum ieee80211_sta_state old_state, 1355 enum ieee80211_sta_state new_state) 1356{ 1357 struct mt76_phy *phy = hw->priv; 1358 struct mt76_dev *dev = phy->dev; 1359 bool ext_phy = phy != &dev->phy; 1360 1361 if (old_state == IEEE80211_STA_NOTEXIST && 1362 new_state == IEEE80211_STA_NONE) 1363 return mt76_sta_add(dev, vif, sta, ext_phy); 1364 1365 if (old_state == IEEE80211_STA_AUTH && 1366 new_state == IEEE80211_STA_ASSOC && 1367 dev->drv->sta_assoc) 1368 dev->drv->sta_assoc(dev, vif, sta); 1369 1370 if (old_state == IEEE80211_STA_NONE && 1371 new_state == IEEE80211_STA_NOTEXIST) 1372 mt76_sta_remove(dev, vif, sta); 1373 1374 return 0; 1375} 1376EXPORT_SYMBOL_GPL(mt76_sta_state); 1377 1378void mt76_sta_pre_rcu_remove(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 1379 struct ieee80211_sta *sta) 1380{ 1381 struct mt76_phy *phy = hw->priv; 1382 struct mt76_dev *dev = phy->dev; 1383 struct mt76_wcid *wcid = (struct mt76_wcid *)sta->drv_priv; 1384 1385 mutex_lock(&dev->mutex); 1386 spin_lock_bh(&dev->status_lock); 1387 rcu_assign_pointer(dev->wcid[wcid->idx], NULL); 1388 spin_unlock_bh(&dev->status_lock); 1389 mutex_unlock(&dev->mutex); 1390} 1391EXPORT_SYMBOL_GPL(mt76_sta_pre_rcu_remove); 1392 1393int mt76_get_txpower(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 1394 int *dbm) 1395{ 1396 struct mt76_phy *phy = hw->priv; 1397 int n_chains = hweight8(phy->antenna_mask); 1398 int delta = mt76_tx_power_nss_delta(n_chains); 1399 1400 *dbm = DIV_ROUND_UP(phy->txpower_cur + delta, 2); 1401 1402 return 0; 1403} 1404EXPORT_SYMBOL_GPL(mt76_get_txpower); 1405 1406int mt76_init_sar_power(struct ieee80211_hw *hw, 1407 const struct cfg80211_sar_specs *sar) 1408{ 1409 struct mt76_phy *phy = hw->priv; 1410 const struct cfg80211_sar_capa *capa = hw->wiphy->sar_capa; 1411 int i; 1412 1413 if (sar->type != NL80211_SAR_TYPE_POWER || !sar->num_sub_specs) 1414 return -EINVAL; 1415 1416 for (i = 0; i < sar->num_sub_specs; i++) { 1417 u32 index = sar->sub_specs[i].freq_range_index; 1418 /* SAR specifies power limitaton in 0.25dbm */ 1419 s32 power = sar->sub_specs[i].power >> 1; 1420 1421 if (power > 127 || power < -127) 1422 power = 127; 1423 1424 phy->frp[index].range = &capa->freq_ranges[index]; 1425 phy->frp[index].power = power; 1426 } 1427 1428 return 0; 1429} 1430EXPORT_SYMBOL_GPL(mt76_init_sar_power); 1431 1432int mt76_get_sar_power(struct mt76_phy *phy, 1433 struct ieee80211_channel *chan, 1434 int power) 1435{ 1436 const struct cfg80211_sar_capa *capa = phy->hw->wiphy->sar_capa; 1437 int freq, i; 1438 1439 if (!capa || !phy->frp) 1440 return power; 1441 1442 if (power > 127 || power < -127) 1443 power = 127; 1444 1445 freq = ieee80211_channel_to_frequency(chan->hw_value, chan->band); 1446 for (i = 0 ; i < capa->num_freq_ranges; i++) { 1447 if (phy->frp[i].range && 1448 freq >= phy->frp[i].range->start_freq && 1449 freq < phy->frp[i].range->end_freq) { 1450 power = min_t(int, phy->frp[i].power, power); 1451 break; 1452 } 1453 } 1454 1455 return power; 1456} 1457EXPORT_SYMBOL_GPL(mt76_get_sar_power); 1458 1459static void 1460__mt76_csa_finish(void *priv, u8 *mac, struct ieee80211_vif *vif) 1461{ 1462 if (vif->csa_active && ieee80211_beacon_cntdwn_is_complete(vif)) 1463 ieee80211_csa_finish(vif); 1464} 1465 1466void mt76_csa_finish(struct mt76_dev *dev) 1467{ 1468 if (!dev->csa_complete) 1469 return; 1470 1471 ieee80211_iterate_active_interfaces_atomic(dev->hw, 1472 IEEE80211_IFACE_ITER_RESUME_ALL, 1473 __mt76_csa_finish, dev); 1474 1475 dev->csa_complete = 0; 1476} 1477EXPORT_SYMBOL_GPL(mt76_csa_finish); 1478 1479static void 1480__mt76_csa_check(void *priv, u8 *mac, struct ieee80211_vif *vif) 1481{ 1482 struct mt76_dev *dev = priv; 1483 1484 if (!vif->csa_active) 1485 return; 1486 1487 dev->csa_complete |= ieee80211_beacon_cntdwn_is_complete(vif); 1488} 1489 1490void mt76_csa_check(struct mt76_dev *dev) 1491{ 1492 ieee80211_iterate_active_interfaces_atomic(dev->hw, 1493 IEEE80211_IFACE_ITER_RESUME_ALL, 1494 __mt76_csa_check, dev); 1495} 1496EXPORT_SYMBOL_GPL(mt76_csa_check); 1497 1498int 1499mt76_set_tim(struct ieee80211_hw *hw, struct ieee80211_sta *sta, bool set) 1500{ 1501 return 0; 1502} 1503EXPORT_SYMBOL_GPL(mt76_set_tim); 1504 1505void mt76_insert_ccmp_hdr(struct sk_buff *skb, u8 key_id) 1506{ 1507 struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb; 1508 int hdr_len = ieee80211_get_hdrlen_from_skb(skb); 1509 u8 *hdr, *pn = status->iv; 1510 1511 __skb_push(skb, 8); 1512 memmove(skb->data, skb->data + 8, hdr_len); 1513 hdr = skb->data + hdr_len; 1514 1515 hdr[0] = pn[5]; 1516 hdr[1] = pn[4]; 1517 hdr[2] = 0; 1518 hdr[3] = 0x20 | (key_id << 6); 1519 hdr[4] = pn[3]; 1520 hdr[5] = pn[2]; 1521 hdr[6] = pn[1]; 1522 hdr[7] = pn[0]; 1523 1524 status->flag &= ~RX_FLAG_IV_STRIPPED; 1525} 1526EXPORT_SYMBOL_GPL(mt76_insert_ccmp_hdr); 1527 1528int mt76_get_rate(struct mt76_dev *dev, 1529 struct ieee80211_supported_band *sband, 1530 int idx, bool cck) 1531{ 1532 int i, offset = 0, len = sband->n_bitrates; 1533 1534 if (cck) { 1535 if (sband != &dev->phy.sband_2g.sband) 1536 return 0; 1537 1538 idx &= ~BIT(2); /* short preamble */ 1539 } else if (sband == &dev->phy.sband_2g.sband) { 1540 offset = 4; 1541 } 1542 1543 for (i = offset; i < len; i++) { 1544 if ((sband->bitrates[i].hw_value & GENMASK(7, 0)) == idx) 1545 return i; 1546 } 1547 1548 return 0; 1549} 1550EXPORT_SYMBOL_GPL(mt76_get_rate); 1551 1552void mt76_sw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 1553 const u8 *mac) 1554{ 1555 struct mt76_phy *phy = hw->priv; 1556 1557 set_bit(MT76_SCANNING, &phy->state); 1558} 1559EXPORT_SYMBOL_GPL(mt76_sw_scan); 1560 1561void mt76_sw_scan_complete(struct ieee80211_hw *hw, struct ieee80211_vif *vif) 1562{ 1563 struct mt76_phy *phy = hw->priv; 1564 1565 clear_bit(MT76_SCANNING, &phy->state); 1566} 1567EXPORT_SYMBOL_GPL(mt76_sw_scan_complete); 1568 1569int mt76_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant) 1570{ 1571 struct mt76_phy *phy = hw->priv; 1572 struct mt76_dev *dev = phy->dev; 1573 1574 mutex_lock(&dev->mutex); 1575 *tx_ant = phy->antenna_mask; 1576 *rx_ant = phy->antenna_mask; 1577 mutex_unlock(&dev->mutex); 1578 1579 return 0; 1580} 1581EXPORT_SYMBOL_GPL(mt76_get_antenna); 1582 1583struct mt76_queue * 1584mt76_init_queue(struct mt76_dev *dev, int qid, int idx, int n_desc, 1585 int ring_base, u32 flags) 1586{ 1587 struct mt76_queue *hwq; 1588 int err; 1589 1590 hwq = devm_kzalloc(dev->dev, sizeof(*hwq), GFP_KERNEL); 1591 if (!hwq) 1592 return ERR_PTR(-ENOMEM); 1593 1594 hwq->flags = flags; 1595 1596 err = dev->queue_ops->alloc(dev, hwq, idx, n_desc, 0, ring_base); 1597 if (err < 0) 1598 return ERR_PTR(err); 1599 1600 return hwq; 1601} 1602EXPORT_SYMBOL_GPL(mt76_init_queue); 1603 1604u16 mt76_calculate_default_rate(struct mt76_phy *phy, int rateidx) 1605{ 1606 int offset = 0; 1607 1608 if (phy->chandef.chan->band != NL80211_BAND_2GHZ) 1609 offset = 4; 1610 1611 /* pick the lowest rate for hidden nodes */ 1612 if (rateidx < 0) 1613 rateidx = 0; 1614 1615 rateidx += offset; 1616 if (rateidx >= ARRAY_SIZE(mt76_rates)) 1617 rateidx = offset; 1618 1619 return mt76_rates[rateidx].hw_value; 1620} 1621EXPORT_SYMBOL_GPL(mt76_calculate_default_rate); 1622 1623void mt76_ethtool_worker(struct mt76_ethtool_worker_info *wi, 1624 struct mt76_sta_stats *stats) 1625{ 1626 int i, ei = wi->initial_stat_idx; 1627 u64 *data = wi->data; 1628 1629 wi->sta_count++; 1630 1631 data[ei++] += stats->tx_mode[MT_PHY_TYPE_CCK]; 1632 data[ei++] += stats->tx_mode[MT_PHY_TYPE_OFDM]; 1633 data[ei++] += stats->tx_mode[MT_PHY_TYPE_HT]; 1634 data[ei++] += stats->tx_mode[MT_PHY_TYPE_HT_GF]; 1635 data[ei++] += stats->tx_mode[MT_PHY_TYPE_VHT]; 1636 data[ei++] += stats->tx_mode[MT_PHY_TYPE_HE_SU]; 1637 data[ei++] += stats->tx_mode[MT_PHY_TYPE_HE_EXT_SU]; 1638 data[ei++] += stats->tx_mode[MT_PHY_TYPE_HE_TB]; 1639 data[ei++] += stats->tx_mode[MT_PHY_TYPE_HE_MU]; 1640 1641 for (i = 0; i < ARRAY_SIZE(stats->tx_bw); i++) 1642 data[ei++] += stats->tx_bw[i]; 1643 1644 for (i = 0; i < 12; i++) 1645 data[ei++] += stats->tx_mcs[i]; 1646 1647 wi->worker_stat_count = ei - wi->initial_stat_idx; 1648} 1649EXPORT_SYMBOL_GPL(mt76_ethtool_worker); 1650 1651enum mt76_dfs_state mt76_phy_dfs_state(struct mt76_phy *phy) 1652{ 1653 struct ieee80211_hw *hw = phy->hw; 1654 struct mt76_dev *dev = phy->dev; 1655 1656 if (dev->region == NL80211_DFS_UNSET || 1657 test_bit(MT76_SCANNING, &phy->state)) 1658 return MT_DFS_STATE_DISABLED; 1659 1660 if (!hw->conf.radar_enabled) { 1661 if ((hw->conf.flags & IEEE80211_CONF_MONITOR) && 1662 (phy->chandef.chan->flags & IEEE80211_CHAN_RADAR)) 1663 return MT_DFS_STATE_ACTIVE; 1664 1665 return MT_DFS_STATE_DISABLED; 1666 } 1667 1668 if (!cfg80211_reg_can_beacon(hw->wiphy, &phy->chandef, NL80211_IFTYPE_AP)) 1669 return MT_DFS_STATE_CAC; 1670 1671 return MT_DFS_STATE_ACTIVE; 1672} 1673EXPORT_SYMBOL_GPL(mt76_phy_dfs_state);