1 // SPDX-License-Identifier: ISC 2 /* 3 * Copyright (C) 2022 MediaTek Inc. 4 */ 5 6 #include "mt7996.h" 7 #include "mcu.h" 8 #include "mac.h" 9 10 static bool mt7996_dev_running(struct mt7996_dev *dev) 11 { 12 struct mt7996_phy *phy; 13 14 if (test_bit(MT76_STATE_RUNNING, &dev->mphy.state)) 15 return true; 16 17 phy = mt7996_phy2(dev); 18 if (phy && test_bit(MT76_STATE_RUNNING, &phy->mt76->state)) 19 return true; 20 21 phy = mt7996_phy3(dev); 22 23 return phy && test_bit(MT76_STATE_RUNNING, &phy->mt76->state); 24 } 25 26 int mt7996_run(struct ieee80211_hw *hw) 27 { 28 struct mt7996_dev *dev = mt7996_hw_dev(hw); 29 struct mt7996_phy *phy = mt7996_hw_phy(hw); 30 bool running; 31 int ret; 32 33 running = mt7996_dev_running(dev); 34 if (!running) { 35 ret = mt7996_mcu_set_hdr_trans(dev, true); 36 if (ret) 37 goto out; 38 39 if (is_mt7992(&dev->mt76)) { 40 u8 queue = mt76_connac_lmac_mapping(IEEE80211_AC_VI); 41 42 ret = mt7996_mcu_cp_support(dev, queue); 43 if (ret) 44 goto out; 45 } 46 } 47 48 mt7996_mac_enable_nf(dev, phy->mt76->band_idx); 49 50 ret = mt7996_mcu_set_rts_thresh(phy, 0x92b); 51 if (ret) 52 goto out; 53 54 ret = mt7996_mcu_set_radio_en(phy, true); 55 if (ret) 56 goto out; 57 58 ret = mt7996_mcu_set_chan_info(phy, UNI_CHANNEL_RX_PATH); 59 if (ret) 60 goto out; 61 62 ret = mt7996_mcu_set_thermal_throttling(phy, MT7996_THERMAL_THROTTLE_MAX); 63 if (ret) 64 goto out; 65 66 ret = mt7996_mcu_set_thermal_protect(phy, true); 67 if (ret) 68 goto out; 69 70 set_bit(MT76_STATE_RUNNING, &phy->mt76->state); 71 72 ieee80211_queue_delayed_work(hw, &phy->mt76->mac_work, 73 MT7996_WATCHDOG_TIME); 74 75 if (!running) 76 mt7996_mac_reset_counters(phy); 77 78 out: 79 return ret; 80 } 81 82 static int mt7996_start(struct ieee80211_hw *hw) 83 { 84 struct mt7996_dev *dev = mt7996_hw_dev(hw); 85 int ret; 86 87 flush_work(&dev->init_work); 88 89 mutex_lock(&dev->mt76.mutex); 90 ret = mt7996_run(hw); 91 mutex_unlock(&dev->mt76.mutex); 92 93 return ret; 94 } 95 96 static void mt7996_stop(struct ieee80211_hw *hw, bool suspend) 97 { 98 struct mt7996_dev *dev = mt7996_hw_dev(hw); 99 struct mt7996_phy *phy = mt7996_hw_phy(hw); 100 101 cancel_delayed_work_sync(&phy->mt76->mac_work); 102 103 mutex_lock(&dev->mt76.mutex); 104 105 mt7996_mcu_set_radio_en(phy, false); 106 107 clear_bit(MT76_STATE_RUNNING, &phy->mt76->state); 108 109 mutex_unlock(&dev->mt76.mutex); 110 } 111 112 static inline int get_free_idx(u32 mask, u8 start, u8 end) 113 { 114 return ffs(~mask & GENMASK(end, start)); 115 } 116 117 static int get_omac_idx(enum nl80211_iftype type, u64 mask) 118 { 119 int i; 120 121 switch (type) { 122 case NL80211_IFTYPE_MESH_POINT: 123 case NL80211_IFTYPE_ADHOC: 124 case NL80211_IFTYPE_STATION: 125 /* prefer hw bssid slot 1-3 */ 126 i = get_free_idx(mask, HW_BSSID_1, HW_BSSID_3); 127 if (i) 128 return i - 1; 129 130 if (type != NL80211_IFTYPE_STATION) 131 break; 132 133 i = get_free_idx(mask, EXT_BSSID_1, EXT_BSSID_MAX); 134 if (i) 135 return i - 1; 136 137 if (~mask & BIT(HW_BSSID_0)) 138 return HW_BSSID_0; 139 140 break; 141 case NL80211_IFTYPE_MONITOR: 142 case NL80211_IFTYPE_AP: 143 /* ap uses hw bssid 0 and ext bssid */ 144 if (~mask & BIT(HW_BSSID_0)) 145 return HW_BSSID_0; 146 147 i = get_free_idx(mask, EXT_BSSID_1, EXT_BSSID_MAX); 148 if (i) 149 return i - 1; 150 151 break; 152 default: 153 WARN_ON(1); 154 break; 155 } 156 157 return -1; 158 } 159 160 static void mt7996_init_bitrate_mask(struct ieee80211_vif *vif) 161 { 162 struct mt7996_vif *mvif = (struct mt7996_vif *)vif->drv_priv; 163 int i; 164 165 for (i = 0; i < ARRAY_SIZE(mvif->bitrate_mask.control); i++) { 166 mvif->bitrate_mask.control[i].gi = NL80211_TXRATE_DEFAULT_GI; 167 mvif->bitrate_mask.control[i].he_gi = 0xff; 168 mvif->bitrate_mask.control[i].he_ltf = 0xff; 169 mvif->bitrate_mask.control[i].legacy = GENMASK(31, 0); 170 memset(mvif->bitrate_mask.control[i].ht_mcs, 0xff, 171 sizeof(mvif->bitrate_mask.control[i].ht_mcs)); 172 memset(mvif->bitrate_mask.control[i].vht_mcs, 0xff, 173 sizeof(mvif->bitrate_mask.control[i].vht_mcs)); 174 memset(mvif->bitrate_mask.control[i].he_mcs, 0xff, 175 sizeof(mvif->bitrate_mask.control[i].he_mcs)); 176 } 177 } 178 179 static int mt7996_add_interface(struct ieee80211_hw *hw, 180 struct ieee80211_vif *vif) 181 { 182 struct mt7996_vif *mvif = (struct mt7996_vif *)vif->drv_priv; 183 struct mt7996_dev *dev = mt7996_hw_dev(hw); 184 struct mt7996_phy *phy = mt7996_hw_phy(hw); 185 struct mt76_txq *mtxq; 186 u8 band_idx = phy->mt76->band_idx; 187 int idx, ret = 0; 188 189 mutex_lock(&dev->mt76.mutex); 190 191 mvif->mt76.idx = __ffs64(~dev->mt76.vif_mask); 192 if (mvif->mt76.idx >= mt7996_max_interface_num(dev)) { 193 ret = -ENOSPC; 194 goto out; 195 } 196 197 idx = get_omac_idx(vif->type, phy->omac_mask); 198 if (idx < 0) { 199 ret = -ENOSPC; 200 goto out; 201 } 202 mvif->mt76.omac_idx = idx; 203 mvif->phy = phy; 204 mvif->mt76.band_idx = band_idx; 205 mvif->mt76.wmm_idx = vif->type == NL80211_IFTYPE_AP ? 0 : 3; 206 mvif->mt76.wcid = &mvif->sta.wcid; 207 208 ret = mt7996_mcu_add_dev_info(phy, vif, true); 209 if (ret) 210 goto out; 211 212 dev->mt76.vif_mask |= BIT_ULL(mvif->mt76.idx); 213 phy->omac_mask |= BIT_ULL(mvif->mt76.omac_idx); 214 215 idx = MT7996_WTBL_RESERVED - mvif->mt76.idx; 216 217 INIT_LIST_HEAD(&mvif->sta.rc_list); 218 INIT_LIST_HEAD(&mvif->sta.wcid.poll_list); 219 mvif->sta.wcid.idx = idx; 220 mvif->sta.wcid.phy_idx = band_idx; 221 mvif->sta.wcid.hw_key_idx = -1; 222 mvif->sta.wcid.tx_info |= MT_WCID_TX_INFO_SET; 223 mt76_wcid_init(&mvif->sta.wcid); 224 225 mt7996_mac_wtbl_update(dev, idx, 226 MT_WTBL_UPDATE_ADM_COUNT_CLEAR); 227 228 if (vif->txq) { 229 mtxq = (struct mt76_txq *)vif->txq->drv_priv; 230 mtxq->wcid = idx; 231 } 232 233 if (vif->type != NL80211_IFTYPE_AP && 234 (!mvif->mt76.omac_idx || mvif->mt76.omac_idx > 3)) 235 vif->offload_flags = 0; 236 vif->offload_flags |= IEEE80211_OFFLOAD_ENCAP_4ADDR; 237 238 if (phy->mt76->chandef.chan->band != NL80211_BAND_2GHZ) 239 mvif->mt76.basic_rates_idx = MT7996_BASIC_RATES_TBL + 4; 240 else 241 mvif->mt76.basic_rates_idx = MT7996_BASIC_RATES_TBL; 242 243 mt7996_init_bitrate_mask(vif); 244 245 mt7996_mcu_add_bss_info(phy, vif, true); 246 /* defer the first STA_REC of BMC entry to BSS_CHANGED_BSSID for STA 247 * interface, since firmware only records BSSID when the entry is new 248 */ 249 if (vif->type != NL80211_IFTYPE_STATION) 250 mt7996_mcu_add_sta(dev, vif, NULL, CONN_STATE_PORT_SECURE, true); 251 rcu_assign_pointer(dev->mt76.wcid[idx], &mvif->sta.wcid); 252 253 out: 254 mutex_unlock(&dev->mt76.mutex); 255 256 return ret; 257 } 258 259 static void mt7996_remove_interface(struct ieee80211_hw *hw, 260 struct ieee80211_vif *vif) 261 { 262 struct mt7996_vif *mvif = (struct mt7996_vif *)vif->drv_priv; 263 struct mt7996_sta *msta = &mvif->sta; 264 struct mt7996_dev *dev = mt7996_hw_dev(hw); 265 struct mt7996_phy *phy = mt7996_hw_phy(hw); 266 int idx = msta->wcid.idx; 267 268 mt7996_mcu_add_sta(dev, vif, NULL, CONN_STATE_DISCONNECT, false); 269 mt7996_mcu_add_bss_info(phy, vif, false); 270 mt7996_mcu_add_dev_info(phy, vif, false); 271 272 rcu_assign_pointer(dev->mt76.wcid[idx], NULL); 273 274 mutex_lock(&dev->mt76.mutex); 275 dev->mt76.vif_mask &= ~BIT_ULL(mvif->mt76.idx); 276 phy->omac_mask &= ~BIT_ULL(mvif->mt76.omac_idx); 277 mutex_unlock(&dev->mt76.mutex); 278 279 spin_lock_bh(&dev->mt76.sta_poll_lock); 280 if (!list_empty(&msta->wcid.poll_list)) 281 list_del_init(&msta->wcid.poll_list); 282 spin_unlock_bh(&dev->mt76.sta_poll_lock); 283 284 mt76_wcid_cleanup(&dev->mt76, &msta->wcid); 285 } 286 287 int mt7996_set_channel(struct mt76_phy *mphy) 288 { 289 struct mt7996_phy *phy = mphy->priv; 290 int ret; 291 292 ret = mt7996_mcu_set_chan_info(phy, UNI_CHANNEL_SWITCH); 293 if (ret) 294 goto out; 295 296 ret = mt7996_mcu_set_chan_info(phy, UNI_CHANNEL_RX_PATH); 297 if (ret) 298 goto out; 299 300 ret = mt7996_dfs_init_radar_detector(phy); 301 mt7996_mac_cca_stats_reset(phy); 302 303 mt7996_mac_reset_counters(phy); 304 phy->noise = 0; 305 306 out: 307 ieee80211_queue_delayed_work(mphy->hw, &mphy->mac_work, 308 MT7996_WATCHDOG_TIME); 309 310 return ret; 311 } 312 313 static int mt7996_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd, 314 struct ieee80211_vif *vif, struct ieee80211_sta *sta, 315 struct ieee80211_key_conf *key) 316 { 317 struct mt7996_dev *dev = mt7996_hw_dev(hw); 318 struct mt7996_phy *phy = mt7996_hw_phy(hw); 319 struct mt7996_vif *mvif = (struct mt7996_vif *)vif->drv_priv; 320 struct mt7996_sta *msta = sta ? (struct mt7996_sta *)sta->drv_priv : 321 &mvif->sta; 322 struct mt76_wcid *wcid = &msta->wcid; 323 u8 *wcid_keyidx = &wcid->hw_key_idx; 324 int idx = key->keyidx; 325 int err = 0; 326 327 /* The hardware does not support per-STA RX GTK, fallback 328 * to software mode for these. 329 */ 330 if ((vif->type == NL80211_IFTYPE_ADHOC || 331 vif->type == NL80211_IFTYPE_MESH_POINT) && 332 (key->cipher == WLAN_CIPHER_SUITE_TKIP || 333 key->cipher == WLAN_CIPHER_SUITE_CCMP) && 334 !(key->flags & IEEE80211_KEY_FLAG_PAIRWISE)) 335 return -EOPNOTSUPP; 336 337 if (sta && !wcid->sta) 338 return -EOPNOTSUPP; 339 340 /* fall back to sw encryption for unsupported ciphers */ 341 switch (key->cipher) { 342 case WLAN_CIPHER_SUITE_TKIP: 343 case WLAN_CIPHER_SUITE_CCMP: 344 case WLAN_CIPHER_SUITE_CCMP_256: 345 case WLAN_CIPHER_SUITE_GCMP: 346 case WLAN_CIPHER_SUITE_GCMP_256: 347 case WLAN_CIPHER_SUITE_SMS4: 348 break; 349 case WLAN_CIPHER_SUITE_AES_CMAC: 350 case WLAN_CIPHER_SUITE_BIP_CMAC_256: 351 case WLAN_CIPHER_SUITE_BIP_GMAC_128: 352 case WLAN_CIPHER_SUITE_BIP_GMAC_256: 353 if (key->keyidx == 6 || key->keyidx == 7) { 354 wcid_keyidx = &wcid->hw_key_idx2; 355 key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIE; 356 break; 357 } 358 fallthrough; 359 case WLAN_CIPHER_SUITE_WEP40: 360 case WLAN_CIPHER_SUITE_WEP104: 361 default: 362 return -EOPNOTSUPP; 363 } 364 365 mutex_lock(&dev->mt76.mutex); 366 367 if (cmd == SET_KEY && !sta && !mvif->mt76.cipher) { 368 mvif->mt76.cipher = mt76_connac_mcu_get_cipher(key->cipher); 369 mt7996_mcu_add_bss_info(phy, vif, true); 370 } 371 372 if (cmd == SET_KEY) { 373 *wcid_keyidx = idx; 374 } else { 375 if (idx == *wcid_keyidx) 376 *wcid_keyidx = -1; 377 goto out; 378 } 379 380 mt76_wcid_key_setup(&dev->mt76, wcid, key); 381 382 if (key->keyidx == 6 || key->keyidx == 7) 383 err = mt7996_mcu_bcn_prot_enable(dev, vif, key); 384 else 385 err = mt7996_mcu_add_key(&dev->mt76, vif, key, 386 MCU_WMWA_UNI_CMD(STA_REC_UPDATE), 387 &msta->wcid, cmd); 388 out: 389 mutex_unlock(&dev->mt76.mutex); 390 391 return err; 392 } 393 394 static int mt7996_config(struct ieee80211_hw *hw, u32 changed) 395 { 396 struct mt7996_dev *dev = mt7996_hw_dev(hw); 397 struct mt7996_phy *phy = mt7996_hw_phy(hw); 398 int ret; 399 400 if (changed & IEEE80211_CONF_CHANGE_CHANNEL) { 401 ret = mt76_update_channel(phy->mt76); 402 if (ret) 403 return ret; 404 } 405 406 if (changed & (IEEE80211_CONF_CHANGE_POWER | 407 IEEE80211_CONF_CHANGE_CHANNEL)) { 408 ret = mt7996_mcu_set_txpower_sku(phy); 409 if (ret) 410 return ret; 411 } 412 413 mutex_lock(&dev->mt76.mutex); 414 415 if (changed & IEEE80211_CONF_CHANGE_MONITOR) { 416 bool enabled = !!(hw->conf.flags & IEEE80211_CONF_MONITOR); 417 418 if (!enabled) 419 phy->rxfilter |= MT_WF_RFCR_DROP_OTHER_UC; 420 else 421 phy->rxfilter &= ~MT_WF_RFCR_DROP_OTHER_UC; 422 423 mt76_rmw_field(dev, MT_DMA_DCR0(phy->mt76->band_idx), 424 MT_DMA_DCR0_RXD_G5_EN, enabled); 425 mt76_wr(dev, MT_WF_RFCR(phy->mt76->band_idx), phy->rxfilter); 426 } 427 428 mutex_unlock(&dev->mt76.mutex); 429 430 return 0; 431 } 432 433 static int 434 mt7996_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 435 unsigned int link_id, u16 queue, 436 const struct ieee80211_tx_queue_params *params) 437 { 438 struct mt7996_vif *mvif = (struct mt7996_vif *)vif->drv_priv; 439 static const u8 mq_to_aci[] = { 440 [IEEE80211_AC_VO] = 3, 441 [IEEE80211_AC_VI] = 2, 442 [IEEE80211_AC_BE] = 0, 443 [IEEE80211_AC_BK] = 1, 444 }; 445 446 /* firmware uses access class index */ 447 mvif->queue_params[mq_to_aci[queue]] = *params; 448 /* no need to update right away, we'll get BSS_CHANGED_QOS */ 449 450 return 0; 451 } 452 453 static void mt7996_configure_filter(struct ieee80211_hw *hw, 454 unsigned int changed_flags, 455 unsigned int *total_flags, 456 u64 multicast) 457 { 458 struct mt7996_dev *dev = mt7996_hw_dev(hw); 459 struct mt7996_phy *phy = mt7996_hw_phy(hw); 460 u32 ctl_flags = MT_WF_RFCR1_DROP_ACK | 461 MT_WF_RFCR1_DROP_BF_POLL | 462 MT_WF_RFCR1_DROP_BA | 463 MT_WF_RFCR1_DROP_CFEND | 464 MT_WF_RFCR1_DROP_CFACK; 465 u32 flags = 0; 466 467 #define MT76_FILTER(_flag, _hw) do { \ 468 flags |= *total_flags & FIF_##_flag; \ 469 phy->rxfilter &= ~(_hw); \ 470 phy->rxfilter |= !(flags & FIF_##_flag) * (_hw); \ 471 } while (0) 472 473 mutex_lock(&dev->mt76.mutex); 474 475 phy->rxfilter &= ~(MT_WF_RFCR_DROP_OTHER_BSS | 476 MT_WF_RFCR_DROP_OTHER_BEACON | 477 MT_WF_RFCR_DROP_FRAME_REPORT | 478 MT_WF_RFCR_DROP_PROBEREQ | 479 MT_WF_RFCR_DROP_MCAST_FILTERED | 480 MT_WF_RFCR_DROP_MCAST | 481 MT_WF_RFCR_DROP_BCAST | 482 MT_WF_RFCR_DROP_DUPLICATE | 483 MT_WF_RFCR_DROP_A2_BSSID | 484 MT_WF_RFCR_DROP_UNWANTED_CTL | 485 MT_WF_RFCR_DROP_STBC_MULTI); 486 487 MT76_FILTER(OTHER_BSS, MT_WF_RFCR_DROP_OTHER_TIM | 488 MT_WF_RFCR_DROP_A3_MAC | 489 MT_WF_RFCR_DROP_A3_BSSID); 490 491 MT76_FILTER(FCSFAIL, MT_WF_RFCR_DROP_FCSFAIL); 492 493 MT76_FILTER(CONTROL, MT_WF_RFCR_DROP_CTS | 494 MT_WF_RFCR_DROP_RTS | 495 MT_WF_RFCR_DROP_CTL_RSV); 496 497 *total_flags = flags; 498 mt76_wr(dev, MT_WF_RFCR(phy->mt76->band_idx), phy->rxfilter); 499 500 if (*total_flags & FIF_CONTROL) 501 mt76_clear(dev, MT_WF_RFCR1(phy->mt76->band_idx), ctl_flags); 502 else 503 mt76_set(dev, MT_WF_RFCR1(phy->mt76->band_idx), ctl_flags); 504 505 mutex_unlock(&dev->mt76.mutex); 506 } 507 508 static void 509 mt7996_update_bss_color(struct ieee80211_hw *hw, 510 struct ieee80211_vif *vif, 511 struct cfg80211_he_bss_color *bss_color) 512 { 513 struct mt7996_dev *dev = mt7996_hw_dev(hw); 514 515 switch (vif->type) { 516 case NL80211_IFTYPE_AP: { 517 struct mt7996_vif *mvif = (struct mt7996_vif *)vif->drv_priv; 518 519 if (mvif->mt76.omac_idx > HW_BSSID_MAX) 520 return; 521 fallthrough; 522 } 523 case NL80211_IFTYPE_STATION: 524 mt7996_mcu_update_bss_color(dev, vif, bss_color); 525 break; 526 default: 527 break; 528 } 529 } 530 531 static u8 532 mt7996_get_rates_table(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 533 bool beacon, bool mcast) 534 { 535 struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv; 536 struct mt76_phy *mphy = hw->priv; 537 u16 rate; 538 u8 i, idx; 539 540 rate = mt76_connac2_mac_tx_rate_val(mphy, vif, beacon, mcast); 541 542 if (beacon) { 543 struct mt7996_phy *phy = mphy->priv; 544 545 /* odd index for driver, even index for firmware */ 546 idx = MT7996_BEACON_RATES_TBL + 2 * phy->mt76->band_idx; 547 if (phy->beacon_rate != rate) 548 mt7996_mcu_set_fixed_rate_table(phy, idx, rate, beacon); 549 550 return idx; 551 } 552 553 idx = FIELD_GET(MT_TX_RATE_IDX, rate); 554 for (i = 0; i < ARRAY_SIZE(mt76_rates); i++) 555 if ((mt76_rates[i].hw_value & GENMASK(7, 0)) == idx) 556 return MT7996_BASIC_RATES_TBL + 2 * i; 557 558 return mvif->basic_rates_idx; 559 } 560 561 static void 562 mt7996_update_mu_group(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 563 struct ieee80211_bss_conf *info) 564 { 565 struct mt7996_vif *mvif = (struct mt7996_vif *)vif->drv_priv; 566 struct mt7996_dev *dev = mt7996_hw_dev(hw); 567 u8 band = mvif->mt76.band_idx; 568 u32 *mu; 569 570 mu = (u32 *)info->mu_group.membership; 571 mt76_wr(dev, MT_WF_PHYRX_BAND_GID_TAB_VLD0(band), mu[0]); 572 mt76_wr(dev, MT_WF_PHYRX_BAND_GID_TAB_VLD1(band), mu[1]); 573 574 mu = (u32 *)info->mu_group.position; 575 mt76_wr(dev, MT_WF_PHYRX_BAND_GID_TAB_POS0(band), mu[0]); 576 mt76_wr(dev, MT_WF_PHYRX_BAND_GID_TAB_POS1(band), mu[1]); 577 mt76_wr(dev, MT_WF_PHYRX_BAND_GID_TAB_POS2(band), mu[2]); 578 mt76_wr(dev, MT_WF_PHYRX_BAND_GID_TAB_POS3(band), mu[3]); 579 } 580 581 static void mt7996_bss_info_changed(struct ieee80211_hw *hw, 582 struct ieee80211_vif *vif, 583 struct ieee80211_bss_conf *info, 584 u64 changed) 585 { 586 struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv; 587 struct mt7996_phy *phy = mt7996_hw_phy(hw); 588 struct mt7996_dev *dev = mt7996_hw_dev(hw); 589 590 mutex_lock(&dev->mt76.mutex); 591 592 /* station mode uses BSSID to map the wlan entry to a peer, 593 * and then peer references bss_info_rfch to set bandwidth cap. 594 */ 595 if ((changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid)) || 596 (changed & BSS_CHANGED_ASSOC && vif->cfg.assoc) || 597 (changed & BSS_CHANGED_BEACON_ENABLED && info->enable_beacon)) { 598 mt7996_mcu_add_bss_info(phy, vif, true); 599 mt7996_mcu_add_sta(dev, vif, NULL, CONN_STATE_PORT_SECURE, 600 !!(changed & BSS_CHANGED_BSSID)); 601 } 602 603 if (changed & BSS_CHANGED_ERP_CTS_PROT) 604 mt7996_mac_enable_rtscts(dev, vif, info->use_cts_prot); 605 606 if (changed & BSS_CHANGED_ERP_SLOT) { 607 int slottime = info->use_short_slot ? 9 : 20; 608 609 if (slottime != phy->slottime) { 610 phy->slottime = slottime; 611 mt7996_mcu_set_timing(phy, vif); 612 } 613 } 614 615 if (changed & BSS_CHANGED_MCAST_RATE) 616 mvif->mcast_rates_idx = 617 mt7996_get_rates_table(hw, vif, false, true); 618 619 if (changed & BSS_CHANGED_BASIC_RATES) 620 mvif->basic_rates_idx = 621 mt7996_get_rates_table(hw, vif, false, false); 622 623 /* ensure that enable txcmd_mode after bss_info */ 624 if (changed & (BSS_CHANGED_QOS | BSS_CHANGED_BEACON_ENABLED)) 625 mt7996_mcu_set_tx(dev, vif); 626 627 if (changed & BSS_CHANGED_HE_OBSS_PD) 628 mt7996_mcu_add_obss_spr(phy, vif, &info->he_obss_pd); 629 630 if (changed & BSS_CHANGED_HE_BSS_COLOR) 631 mt7996_update_bss_color(hw, vif, &info->he_bss_color); 632 633 if (changed & (BSS_CHANGED_BEACON | 634 BSS_CHANGED_BEACON_ENABLED)) { 635 mvif->beacon_rates_idx = 636 mt7996_get_rates_table(hw, vif, true, false); 637 638 mt7996_mcu_add_beacon(hw, vif, info->enable_beacon); 639 } 640 641 if (changed & (BSS_CHANGED_UNSOL_BCAST_PROBE_RESP | 642 BSS_CHANGED_FILS_DISCOVERY)) 643 mt7996_mcu_beacon_inband_discov(dev, vif, changed); 644 645 if (changed & BSS_CHANGED_MU_GROUPS) 646 mt7996_update_mu_group(hw, vif, info); 647 648 mutex_unlock(&dev->mt76.mutex); 649 } 650 651 static void 652 mt7996_channel_switch_beacon(struct ieee80211_hw *hw, 653 struct ieee80211_vif *vif, 654 struct cfg80211_chan_def *chandef) 655 { 656 struct mt7996_dev *dev = mt7996_hw_dev(hw); 657 658 mutex_lock(&dev->mt76.mutex); 659 mt7996_mcu_add_beacon(hw, vif, true); 660 mutex_unlock(&dev->mt76.mutex); 661 } 662 663 int mt7996_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif, 664 struct ieee80211_sta *sta) 665 { 666 struct mt7996_dev *dev = container_of(mdev, struct mt7996_dev, mt76); 667 struct mt7996_sta *msta = (struct mt7996_sta *)sta->drv_priv; 668 struct mt7996_vif *mvif = (struct mt7996_vif *)vif->drv_priv; 669 u8 band_idx = mvif->phy->mt76->band_idx; 670 int idx; 671 672 idx = mt76_wcid_alloc(dev->mt76.wcid_mask, MT7996_WTBL_STA); 673 if (idx < 0) 674 return -ENOSPC; 675 676 INIT_LIST_HEAD(&msta->rc_list); 677 INIT_LIST_HEAD(&msta->wcid.poll_list); 678 msta->vif = mvif; 679 msta->wcid.sta = 1; 680 msta->wcid.idx = idx; 681 msta->wcid.phy_idx = band_idx; 682 683 ewma_avg_signal_init(&msta->avg_ack_signal); 684 685 mt7996_mac_wtbl_update(dev, idx, 686 MT_WTBL_UPDATE_ADM_COUNT_CLEAR); 687 mt7996_mcu_add_sta(dev, vif, sta, CONN_STATE_DISCONNECT, true); 688 689 return 0; 690 } 691 692 int mt7996_mac_sta_event(struct mt76_dev *mdev, struct ieee80211_vif *vif, 693 struct ieee80211_sta *sta, enum mt76_sta_event ev) 694 { 695 struct mt7996_dev *dev = container_of(mdev, struct mt7996_dev, mt76); 696 struct mt7996_sta *msta = (struct mt7996_sta *)sta->drv_priv; 697 int i, ret; 698 699 switch (ev) { 700 case MT76_STA_EVENT_ASSOC: 701 ret = mt7996_mcu_add_sta(dev, vif, sta, CONN_STATE_CONNECT, true); 702 if (ret) 703 return ret; 704 705 ret = mt7996_mcu_add_rate_ctrl(dev, vif, sta, false); 706 if (ret) 707 return ret; 708 709 msta->wcid.tx_info |= MT_WCID_TX_INFO_SET; 710 msta->wcid.sta = 1; 711 712 return 0; 713 714 case MT76_STA_EVENT_AUTHORIZE: 715 return mt7996_mcu_add_sta(dev, vif, sta, CONN_STATE_PORT_SECURE, false); 716 717 case MT76_STA_EVENT_DISASSOC: 718 for (i = 0; i < ARRAY_SIZE(msta->twt.flow); i++) 719 mt7996_mac_twt_teardown_flow(dev, msta, i); 720 721 mt7996_mcu_add_sta(dev, vif, sta, CONN_STATE_DISCONNECT, false); 722 msta->wcid.sta_disabled = 1; 723 msta->wcid.sta = 0; 724 725 return 0; 726 } 727 728 return 0; 729 } 730 731 void mt7996_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif, 732 struct ieee80211_sta *sta) 733 { 734 struct mt7996_dev *dev = container_of(mdev, struct mt7996_dev, mt76); 735 struct mt7996_sta *msta = (struct mt7996_sta *)sta->drv_priv; 736 737 mt7996_mac_wtbl_update(dev, msta->wcid.idx, 738 MT_WTBL_UPDATE_ADM_COUNT_CLEAR); 739 740 spin_lock_bh(&mdev->sta_poll_lock); 741 if (!list_empty(&msta->wcid.poll_list)) 742 list_del_init(&msta->wcid.poll_list); 743 if (!list_empty(&msta->rc_list)) 744 list_del_init(&msta->rc_list); 745 spin_unlock_bh(&mdev->sta_poll_lock); 746 } 747 748 static void mt7996_tx(struct ieee80211_hw *hw, 749 struct ieee80211_tx_control *control, 750 struct sk_buff *skb) 751 { 752 struct mt7996_dev *dev = mt7996_hw_dev(hw); 753 struct mt76_phy *mphy = hw->priv; 754 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 755 struct ieee80211_vif *vif = info->control.vif; 756 struct mt76_wcid *wcid = &dev->mt76.global_wcid; 757 758 if (control->sta) { 759 struct mt7996_sta *sta; 760 761 sta = (struct mt7996_sta *)control->sta->drv_priv; 762 wcid = &sta->wcid; 763 } 764 765 if (vif && !control->sta) { 766 struct mt7996_vif *mvif; 767 768 mvif = (struct mt7996_vif *)vif->drv_priv; 769 wcid = &mvif->sta.wcid; 770 } 771 772 mt76_tx(mphy, control->sta, wcid, skb); 773 } 774 775 static int mt7996_set_rts_threshold(struct ieee80211_hw *hw, u32 val) 776 { 777 struct mt7996_phy *phy = mt7996_hw_phy(hw); 778 int ret; 779 780 mutex_lock(&phy->dev->mt76.mutex); 781 ret = mt7996_mcu_set_rts_thresh(phy, val); 782 mutex_unlock(&phy->dev->mt76.mutex); 783 784 return ret; 785 } 786 787 static int 788 mt7996_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 789 struct ieee80211_ampdu_params *params) 790 { 791 enum ieee80211_ampdu_mlme_action action = params->action; 792 struct mt7996_dev *dev = mt7996_hw_dev(hw); 793 struct ieee80211_sta *sta = params->sta; 794 struct ieee80211_txq *txq = sta->txq[params->tid]; 795 struct mt7996_sta *msta = (struct mt7996_sta *)sta->drv_priv; 796 u16 tid = params->tid; 797 u16 ssn = params->ssn; 798 struct mt76_txq *mtxq; 799 int ret = 0; 800 801 if (!txq) 802 return -EINVAL; 803 804 mtxq = (struct mt76_txq *)txq->drv_priv; 805 806 mutex_lock(&dev->mt76.mutex); 807 switch (action) { 808 case IEEE80211_AMPDU_RX_START: 809 mt76_rx_aggr_start(&dev->mt76, &msta->wcid, tid, ssn, 810 params->buf_size); 811 ret = mt7996_mcu_add_rx_ba(dev, params, true); 812 break; 813 case IEEE80211_AMPDU_RX_STOP: 814 mt76_rx_aggr_stop(&dev->mt76, &msta->wcid, tid); 815 ret = mt7996_mcu_add_rx_ba(dev, params, false); 816 break; 817 case IEEE80211_AMPDU_TX_OPERATIONAL: 818 mtxq->aggr = true; 819 mtxq->send_bar = false; 820 ret = mt7996_mcu_add_tx_ba(dev, params, true); 821 break; 822 case IEEE80211_AMPDU_TX_STOP_FLUSH: 823 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT: 824 mtxq->aggr = false; 825 clear_bit(tid, &msta->wcid.ampdu_state); 826 ret = mt7996_mcu_add_tx_ba(dev, params, false); 827 break; 828 case IEEE80211_AMPDU_TX_START: 829 set_bit(tid, &msta->wcid.ampdu_state); 830 ret = IEEE80211_AMPDU_TX_START_IMMEDIATE; 831 break; 832 case IEEE80211_AMPDU_TX_STOP_CONT: 833 mtxq->aggr = false; 834 clear_bit(tid, &msta->wcid.ampdu_state); 835 ret = mt7996_mcu_add_tx_ba(dev, params, false); 836 ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid); 837 break; 838 } 839 mutex_unlock(&dev->mt76.mutex); 840 841 return ret; 842 } 843 844 static int 845 mt7996_get_stats(struct ieee80211_hw *hw, 846 struct ieee80211_low_level_stats *stats) 847 { 848 struct mt7996_phy *phy = mt7996_hw_phy(hw); 849 struct mt7996_dev *dev = mt7996_hw_dev(hw); 850 struct mt76_mib_stats *mib = &phy->mib; 851 852 mutex_lock(&dev->mt76.mutex); 853 854 stats->dot11RTSSuccessCount = mib->rts_cnt; 855 stats->dot11RTSFailureCount = mib->rts_retries_cnt; 856 stats->dot11FCSErrorCount = mib->fcs_err_cnt; 857 stats->dot11ACKFailureCount = mib->ack_fail_cnt; 858 859 mutex_unlock(&dev->mt76.mutex); 860 861 return 0; 862 } 863 864 u64 __mt7996_get_tsf(struct ieee80211_hw *hw, struct mt7996_vif *mvif) 865 { 866 struct mt7996_dev *dev = mt7996_hw_dev(hw); 867 struct mt7996_phy *phy = mt7996_hw_phy(hw); 868 union { 869 u64 t64; 870 u32 t32[2]; 871 } tsf; 872 u16 n; 873 874 lockdep_assert_held(&dev->mt76.mutex); 875 876 n = mvif->mt76.omac_idx > HW_BSSID_MAX ? HW_BSSID_0 877 : mvif->mt76.omac_idx; 878 /* TSF software read */ 879 mt76_rmw(dev, MT_LPON_TCR(phy->mt76->band_idx, n), MT_LPON_TCR_SW_MODE, 880 MT_LPON_TCR_SW_READ); 881 tsf.t32[0] = mt76_rr(dev, MT_LPON_UTTR0(phy->mt76->band_idx)); 882 tsf.t32[1] = mt76_rr(dev, MT_LPON_UTTR1(phy->mt76->band_idx)); 883 884 return tsf.t64; 885 } 886 887 static u64 888 mt7996_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif) 889 { 890 struct mt7996_vif *mvif = (struct mt7996_vif *)vif->drv_priv; 891 struct mt7996_dev *dev = mt7996_hw_dev(hw); 892 u64 ret; 893 894 mutex_lock(&dev->mt76.mutex); 895 ret = __mt7996_get_tsf(hw, mvif); 896 mutex_unlock(&dev->mt76.mutex); 897 898 return ret; 899 } 900 901 static void 902 mt7996_set_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 903 u64 timestamp) 904 { 905 struct mt7996_vif *mvif = (struct mt7996_vif *)vif->drv_priv; 906 struct mt7996_dev *dev = mt7996_hw_dev(hw); 907 struct mt7996_phy *phy = mt7996_hw_phy(hw); 908 union { 909 u64 t64; 910 u32 t32[2]; 911 } tsf = { .t64 = timestamp, }; 912 u16 n; 913 914 mutex_lock(&dev->mt76.mutex); 915 916 n = mvif->mt76.omac_idx > HW_BSSID_MAX ? HW_BSSID_0 917 : mvif->mt76.omac_idx; 918 mt76_wr(dev, MT_LPON_UTTR0(phy->mt76->band_idx), tsf.t32[0]); 919 mt76_wr(dev, MT_LPON_UTTR1(phy->mt76->band_idx), tsf.t32[1]); 920 /* TSF software overwrite */ 921 mt76_rmw(dev, MT_LPON_TCR(phy->mt76->band_idx, n), MT_LPON_TCR_SW_MODE, 922 MT_LPON_TCR_SW_WRITE); 923 924 mutex_unlock(&dev->mt76.mutex); 925 } 926 927 static void 928 mt7996_offset_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 929 s64 timestamp) 930 { 931 struct mt7996_vif *mvif = (struct mt7996_vif *)vif->drv_priv; 932 struct mt7996_dev *dev = mt7996_hw_dev(hw); 933 struct mt7996_phy *phy = mt7996_hw_phy(hw); 934 union { 935 u64 t64; 936 u32 t32[2]; 937 } tsf = { .t64 = timestamp, }; 938 u16 n; 939 940 mutex_lock(&dev->mt76.mutex); 941 942 n = mvif->mt76.omac_idx > HW_BSSID_MAX ? HW_BSSID_0 943 : mvif->mt76.omac_idx; 944 mt76_wr(dev, MT_LPON_UTTR0(phy->mt76->band_idx), tsf.t32[0]); 945 mt76_wr(dev, MT_LPON_UTTR1(phy->mt76->band_idx), tsf.t32[1]); 946 /* TSF software adjust*/ 947 mt76_rmw(dev, MT_LPON_TCR(phy->mt76->band_idx, n), MT_LPON_TCR_SW_MODE, 948 MT_LPON_TCR_SW_ADJUST); 949 950 mutex_unlock(&dev->mt76.mutex); 951 } 952 953 static void 954 mt7996_set_coverage_class(struct ieee80211_hw *hw, s16 coverage_class) 955 { 956 struct mt7996_phy *phy = mt7996_hw_phy(hw); 957 struct mt7996_dev *dev = phy->dev; 958 959 mutex_lock(&dev->mt76.mutex); 960 phy->coverage_class = max_t(s16, coverage_class, 0); 961 mt7996_mac_set_coverage_class(phy); 962 mutex_unlock(&dev->mt76.mutex); 963 } 964 965 static int 966 mt7996_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant) 967 { 968 struct mt7996_dev *dev = mt7996_hw_dev(hw); 969 struct mt7996_phy *phy = mt7996_hw_phy(hw); 970 int max_nss = hweight8(hw->wiphy->available_antennas_tx); 971 u8 band_idx = phy->mt76->band_idx, shift = dev->chainshift[band_idx]; 972 973 if (!tx_ant || tx_ant != rx_ant || ffs(tx_ant) > max_nss) 974 return -EINVAL; 975 976 if ((BIT(hweight8(tx_ant)) - 1) != tx_ant) 977 tx_ant = BIT(ffs(tx_ant) - 1) - 1; 978 979 mutex_lock(&dev->mt76.mutex); 980 981 phy->mt76->antenna_mask = tx_ant; 982 983 /* restore to the origin chainmask which might have auxiliary path */ 984 if (hweight8(tx_ant) == max_nss && band_idx < MT_BAND2) 985 phy->mt76->chainmask = ((dev->chainmask >> shift) & 986 (BIT(dev->chainshift[band_idx + 1] - shift) - 1)) << shift; 987 else if (hweight8(tx_ant) == max_nss) 988 phy->mt76->chainmask = (dev->chainmask >> shift) << shift; 989 else 990 phy->mt76->chainmask = tx_ant << shift; 991 992 mt76_set_stream_caps(phy->mt76, true); 993 mt7996_set_stream_vht_txbf_caps(phy); 994 mt7996_set_stream_he_eht_caps(phy); 995 mt7996_mcu_set_txpower_sku(phy); 996 997 mutex_unlock(&dev->mt76.mutex); 998 999 return 0; 1000 } 1001 1002 static void mt7996_sta_statistics(struct ieee80211_hw *hw, 1003 struct ieee80211_vif *vif, 1004 struct ieee80211_sta *sta, 1005 struct station_info *sinfo) 1006 { 1007 struct mt7996_phy *phy = mt7996_hw_phy(hw); 1008 struct mt7996_sta *msta = (struct mt7996_sta *)sta->drv_priv; 1009 struct rate_info *txrate = &msta->wcid.rate; 1010 1011 if (txrate->legacy || txrate->flags) { 1012 if (txrate->legacy) { 1013 sinfo->txrate.legacy = txrate->legacy; 1014 } else { 1015 sinfo->txrate.mcs = txrate->mcs; 1016 sinfo->txrate.nss = txrate->nss; 1017 sinfo->txrate.bw = txrate->bw; 1018 sinfo->txrate.he_gi = txrate->he_gi; 1019 sinfo->txrate.he_dcm = txrate->he_dcm; 1020 sinfo->txrate.he_ru_alloc = txrate->he_ru_alloc; 1021 sinfo->txrate.eht_gi = txrate->eht_gi; 1022 } 1023 sinfo->txrate.flags = txrate->flags; 1024 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE); 1025 } 1026 sinfo->txrate.flags = txrate->flags; 1027 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE); 1028 1029 sinfo->tx_failed = msta->wcid.stats.tx_failed; 1030 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED); 1031 1032 sinfo->tx_retries = msta->wcid.stats.tx_retries; 1033 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES); 1034 1035 sinfo->ack_signal = (s8)msta->ack_signal; 1036 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_ACK_SIGNAL); 1037 1038 sinfo->avg_ack_signal = -(s8)ewma_avg_signal_read(&msta->avg_ack_signal); 1039 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_ACK_SIGNAL_AVG); 1040 1041 if (mtk_wed_device_active(&phy->dev->mt76.mmio.wed)) { 1042 sinfo->tx_bytes = msta->wcid.stats.tx_bytes; 1043 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BYTES64); 1044 1045 sinfo->rx_bytes = msta->wcid.stats.rx_bytes; 1046 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BYTES64); 1047 1048 sinfo->tx_packets = msta->wcid.stats.tx_packets; 1049 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_PACKETS); 1050 1051 sinfo->rx_packets = msta->wcid.stats.rx_packets; 1052 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_PACKETS); 1053 } 1054 } 1055 1056 static void mt7996_sta_rc_work(void *data, struct ieee80211_sta *sta) 1057 { 1058 struct mt7996_sta *msta = (struct mt7996_sta *)sta->drv_priv; 1059 struct mt7996_dev *dev = msta->vif->phy->dev; 1060 u32 *changed = data; 1061 1062 spin_lock_bh(&dev->mt76.sta_poll_lock); 1063 msta->changed |= *changed; 1064 if (list_empty(&msta->rc_list)) 1065 list_add_tail(&msta->rc_list, &dev->sta_rc_list); 1066 spin_unlock_bh(&dev->mt76.sta_poll_lock); 1067 } 1068 1069 static void mt7996_sta_rc_update(struct ieee80211_hw *hw, 1070 struct ieee80211_vif *vif, 1071 struct ieee80211_link_sta *link_sta, 1072 u32 changed) 1073 { 1074 struct ieee80211_sta *sta = link_sta->sta; 1075 struct mt7996_phy *phy = mt7996_hw_phy(hw); 1076 struct mt7996_dev *dev = phy->dev; 1077 1078 mt7996_sta_rc_work(&changed, sta); 1079 ieee80211_queue_work(hw, &dev->rc_work); 1080 } 1081 1082 static int 1083 mt7996_set_bitrate_mask(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 1084 const struct cfg80211_bitrate_mask *mask) 1085 { 1086 struct mt7996_vif *mvif = (struct mt7996_vif *)vif->drv_priv; 1087 struct mt7996_phy *phy = mt7996_hw_phy(hw); 1088 struct mt7996_dev *dev = phy->dev; 1089 u32 changed = IEEE80211_RC_SUPP_RATES_CHANGED; 1090 1091 mvif->bitrate_mask = *mask; 1092 1093 /* if multiple rates across different preambles are given we can 1094 * reconfigure this info with all peers using sta_rec command with 1095 * the below exception cases. 1096 * - single rate : if a rate is passed along with different preambles, 1097 * we select the highest one as fixed rate. i.e VHT MCS for VHT peers. 1098 * - multiple rates: if it's not in range format i.e 0-{7,8,9} for VHT 1099 * then multiple MCS setting (MCS 4,5,6) is not supported. 1100 */ 1101 ieee80211_iterate_stations_atomic(hw, mt7996_sta_rc_work, &changed); 1102 ieee80211_queue_work(hw, &dev->rc_work); 1103 1104 return 0; 1105 } 1106 1107 static void mt7996_sta_set_4addr(struct ieee80211_hw *hw, 1108 struct ieee80211_vif *vif, 1109 struct ieee80211_sta *sta, 1110 bool enabled) 1111 { 1112 struct mt7996_dev *dev = mt7996_hw_dev(hw); 1113 struct mt7996_sta *msta = (struct mt7996_sta *)sta->drv_priv; 1114 1115 if (enabled) 1116 set_bit(MT_WCID_FLAG_4ADDR, &msta->wcid.flags); 1117 else 1118 clear_bit(MT_WCID_FLAG_4ADDR, &msta->wcid.flags); 1119 1120 if (!msta->wcid.sta) 1121 return; 1122 1123 mt7996_mcu_wtbl_update_hdr_trans(dev, vif, sta); 1124 } 1125 1126 static void mt7996_sta_set_decap_offload(struct ieee80211_hw *hw, 1127 struct ieee80211_vif *vif, 1128 struct ieee80211_sta *sta, 1129 bool enabled) 1130 { 1131 struct mt7996_dev *dev = mt7996_hw_dev(hw); 1132 struct mt7996_sta *msta = (struct mt7996_sta *)sta->drv_priv; 1133 1134 if (enabled) 1135 set_bit(MT_WCID_FLAG_HDR_TRANS, &msta->wcid.flags); 1136 else 1137 clear_bit(MT_WCID_FLAG_HDR_TRANS, &msta->wcid.flags); 1138 1139 if (!msta->wcid.sta) 1140 return; 1141 1142 mt7996_mcu_wtbl_update_hdr_trans(dev, vif, sta); 1143 } 1144 1145 static const char mt7996_gstrings_stats[][ETH_GSTRING_LEN] = { 1146 "tx_ampdu_cnt", 1147 "tx_stop_q_empty_cnt", 1148 "tx_mpdu_attempts", 1149 "tx_mpdu_success", 1150 "tx_rwp_fail_cnt", 1151 "tx_rwp_need_cnt", 1152 "tx_pkt_ebf_cnt", 1153 "tx_pkt_ibf_cnt", 1154 "tx_ampdu_len:0-1", 1155 "tx_ampdu_len:2-10", 1156 "tx_ampdu_len:11-19", 1157 "tx_ampdu_len:20-28", 1158 "tx_ampdu_len:29-37", 1159 "tx_ampdu_len:38-46", 1160 "tx_ampdu_len:47-55", 1161 "tx_ampdu_len:56-79", 1162 "tx_ampdu_len:80-103", 1163 "tx_ampdu_len:104-127", 1164 "tx_ampdu_len:128-151", 1165 "tx_ampdu_len:152-175", 1166 "tx_ampdu_len:176-199", 1167 "tx_ampdu_len:200-223", 1168 "tx_ampdu_len:224-247", 1169 "ba_miss_count", 1170 "tx_beamformer_ppdu_iBF", 1171 "tx_beamformer_ppdu_eBF", 1172 "tx_beamformer_rx_feedback_all", 1173 "tx_beamformer_rx_feedback_he", 1174 "tx_beamformer_rx_feedback_vht", 1175 "tx_beamformer_rx_feedback_ht", 1176 "tx_beamformer_rx_feedback_bw", /* zero based idx: 20, 40, 80, 160 */ 1177 "tx_beamformer_rx_feedback_nc", 1178 "tx_beamformer_rx_feedback_nr", 1179 "tx_beamformee_ok_feedback_pkts", 1180 "tx_beamformee_feedback_trig", 1181 "tx_mu_beamforming", 1182 "tx_mu_mpdu", 1183 "tx_mu_successful_mpdu", 1184 "tx_su_successful_mpdu", 1185 "tx_msdu_pack_1", 1186 "tx_msdu_pack_2", 1187 "tx_msdu_pack_3", 1188 "tx_msdu_pack_4", 1189 "tx_msdu_pack_5", 1190 "tx_msdu_pack_6", 1191 "tx_msdu_pack_7", 1192 "tx_msdu_pack_8", 1193 1194 /* rx counters */ 1195 "rx_fifo_full_cnt", 1196 "rx_mpdu_cnt", 1197 "channel_idle_cnt", 1198 "rx_vector_mismatch_cnt", 1199 "rx_delimiter_fail_cnt", 1200 "rx_len_mismatch_cnt", 1201 "rx_ampdu_cnt", 1202 "rx_ampdu_bytes_cnt", 1203 "rx_ampdu_valid_subframe_cnt", 1204 "rx_ampdu_valid_subframe_b_cnt", 1205 "rx_pfdrop_cnt", 1206 "rx_vec_queue_overflow_drop_cnt", 1207 "rx_ba_cnt", 1208 1209 /* per vif counters */ 1210 "v_tx_mode_cck", 1211 "v_tx_mode_ofdm", 1212 "v_tx_mode_ht", 1213 "v_tx_mode_ht_gf", 1214 "v_tx_mode_vht", 1215 "v_tx_mode_he_su", 1216 "v_tx_mode_he_ext_su", 1217 "v_tx_mode_he_tb", 1218 "v_tx_mode_he_mu", 1219 "v_tx_mode_eht_su", 1220 "v_tx_mode_eht_trig", 1221 "v_tx_mode_eht_mu", 1222 "v_tx_bw_20", 1223 "v_tx_bw_40", 1224 "v_tx_bw_80", 1225 "v_tx_bw_160", 1226 "v_tx_bw_320", 1227 "v_tx_mcs_0", 1228 "v_tx_mcs_1", 1229 "v_tx_mcs_2", 1230 "v_tx_mcs_3", 1231 "v_tx_mcs_4", 1232 "v_tx_mcs_5", 1233 "v_tx_mcs_6", 1234 "v_tx_mcs_7", 1235 "v_tx_mcs_8", 1236 "v_tx_mcs_9", 1237 "v_tx_mcs_10", 1238 "v_tx_mcs_11", 1239 "v_tx_mcs_12", 1240 "v_tx_mcs_13", 1241 "v_tx_nss_1", 1242 "v_tx_nss_2", 1243 "v_tx_nss_3", 1244 "v_tx_nss_4", 1245 }; 1246 1247 #define MT7996_SSTATS_LEN ARRAY_SIZE(mt7996_gstrings_stats) 1248 1249 /* Ethtool related API */ 1250 static 1251 void mt7996_get_et_strings(struct ieee80211_hw *hw, 1252 struct ieee80211_vif *vif, 1253 u32 sset, u8 *data) 1254 { 1255 if (sset == ETH_SS_STATS) 1256 memcpy(data, mt7996_gstrings_stats, 1257 sizeof(mt7996_gstrings_stats)); 1258 } 1259 1260 static 1261 int mt7996_get_et_sset_count(struct ieee80211_hw *hw, 1262 struct ieee80211_vif *vif, int sset) 1263 { 1264 if (sset == ETH_SS_STATS) 1265 return MT7996_SSTATS_LEN; 1266 1267 return 0; 1268 } 1269 1270 static void mt7996_ethtool_worker(void *wi_data, struct ieee80211_sta *sta) 1271 { 1272 struct mt76_ethtool_worker_info *wi = wi_data; 1273 struct mt7996_sta *msta = (struct mt7996_sta *)sta->drv_priv; 1274 1275 if (msta->vif->mt76.idx != wi->idx) 1276 return; 1277 1278 mt76_ethtool_worker(wi, &msta->wcid.stats, true); 1279 } 1280 1281 static 1282 void mt7996_get_et_stats(struct ieee80211_hw *hw, 1283 struct ieee80211_vif *vif, 1284 struct ethtool_stats *stats, u64 *data) 1285 { 1286 struct mt7996_dev *dev = mt7996_hw_dev(hw); 1287 struct mt7996_phy *phy = mt7996_hw_phy(hw); 1288 struct mt7996_vif *mvif = (struct mt7996_vif *)vif->drv_priv; 1289 struct mt76_mib_stats *mib = &phy->mib; 1290 struct mt76_ethtool_worker_info wi = { 1291 .data = data, 1292 .idx = mvif->mt76.idx, 1293 }; 1294 /* See mt7996_ampdu_stat_read_phy, etc */ 1295 int i, ei = 0; 1296 1297 mutex_lock(&dev->mt76.mutex); 1298 1299 mt7996_mac_update_stats(phy); 1300 1301 data[ei++] = mib->tx_ampdu_cnt; 1302 data[ei++] = mib->tx_stop_q_empty_cnt; 1303 data[ei++] = mib->tx_mpdu_attempts_cnt; 1304 data[ei++] = mib->tx_mpdu_success_cnt; 1305 data[ei++] = mib->tx_rwp_fail_cnt; 1306 data[ei++] = mib->tx_rwp_need_cnt; 1307 data[ei++] = mib->tx_bf_ebf_ppdu_cnt; 1308 data[ei++] = mib->tx_bf_ibf_ppdu_cnt; 1309 1310 /* Tx ampdu stat */ 1311 for (i = 0; i < 15 /*ARRAY_SIZE(bound)*/; i++) 1312 data[ei++] = phy->mt76->aggr_stats[i]; 1313 data[ei++] = phy->mib.ba_miss_cnt; 1314 1315 /* Tx Beamformer monitor */ 1316 data[ei++] = mib->tx_bf_ibf_ppdu_cnt; 1317 data[ei++] = mib->tx_bf_ebf_ppdu_cnt; 1318 1319 /* Tx Beamformer Rx feedback monitor */ 1320 data[ei++] = mib->tx_bf_rx_fb_all_cnt; 1321 data[ei++] = mib->tx_bf_rx_fb_he_cnt; 1322 data[ei++] = mib->tx_bf_rx_fb_vht_cnt; 1323 data[ei++] = mib->tx_bf_rx_fb_ht_cnt; 1324 1325 data[ei++] = mib->tx_bf_rx_fb_bw; 1326 data[ei++] = mib->tx_bf_rx_fb_nc_cnt; 1327 data[ei++] = mib->tx_bf_rx_fb_nr_cnt; 1328 1329 /* Tx Beamformee Rx NDPA & Tx feedback report */ 1330 data[ei++] = mib->tx_bf_fb_cpl_cnt; 1331 data[ei++] = mib->tx_bf_fb_trig_cnt; 1332 1333 /* Tx SU & MU counters */ 1334 data[ei++] = mib->tx_mu_bf_cnt; 1335 data[ei++] = mib->tx_mu_mpdu_cnt; 1336 data[ei++] = mib->tx_mu_acked_mpdu_cnt; 1337 data[ei++] = mib->tx_su_acked_mpdu_cnt; 1338 1339 /* Tx amsdu info (pack-count histogram) */ 1340 for (i = 0; i < ARRAY_SIZE(mib->tx_amsdu); i++) 1341 data[ei++] = mib->tx_amsdu[i]; 1342 1343 /* rx counters */ 1344 data[ei++] = mib->rx_fifo_full_cnt; 1345 data[ei++] = mib->rx_mpdu_cnt; 1346 data[ei++] = mib->channel_idle_cnt; 1347 data[ei++] = mib->rx_vector_mismatch_cnt; 1348 data[ei++] = mib->rx_delimiter_fail_cnt; 1349 data[ei++] = mib->rx_len_mismatch_cnt; 1350 data[ei++] = mib->rx_ampdu_cnt; 1351 data[ei++] = mib->rx_ampdu_bytes_cnt; 1352 data[ei++] = mib->rx_ampdu_valid_subframe_cnt; 1353 data[ei++] = mib->rx_ampdu_valid_subframe_bytes_cnt; 1354 data[ei++] = mib->rx_pfdrop_cnt; 1355 data[ei++] = mib->rx_vec_queue_overflow_drop_cnt; 1356 data[ei++] = mib->rx_ba_cnt; 1357 1358 /* Add values for all stations owned by this vif */ 1359 wi.initial_stat_idx = ei; 1360 ieee80211_iterate_stations_atomic(hw, mt7996_ethtool_worker, &wi); 1361 1362 mutex_unlock(&dev->mt76.mutex); 1363 1364 if (wi.sta_count == 0) 1365 return; 1366 1367 ei += wi.worker_stat_count; 1368 if (ei != MT7996_SSTATS_LEN) 1369 dev_err(dev->mt76.dev, "ei: %d MT7996_SSTATS_LEN: %d", 1370 ei, (int)MT7996_SSTATS_LEN); 1371 } 1372 1373 static void 1374 mt7996_twt_teardown_request(struct ieee80211_hw *hw, 1375 struct ieee80211_sta *sta, 1376 u8 flowid) 1377 { 1378 struct mt7996_sta *msta = (struct mt7996_sta *)sta->drv_priv; 1379 struct mt7996_dev *dev = mt7996_hw_dev(hw); 1380 1381 mutex_lock(&dev->mt76.mutex); 1382 mt7996_mac_twt_teardown_flow(dev, msta, flowid); 1383 mutex_unlock(&dev->mt76.mutex); 1384 } 1385 1386 static int 1387 mt7996_set_radar_background(struct ieee80211_hw *hw, 1388 struct cfg80211_chan_def *chandef) 1389 { 1390 struct mt7996_phy *phy = mt7996_hw_phy(hw); 1391 struct mt7996_dev *dev = phy->dev; 1392 int ret = -EINVAL; 1393 bool running; 1394 1395 mutex_lock(&dev->mt76.mutex); 1396 1397 if (dev->mt76.region == NL80211_DFS_UNSET) 1398 goto out; 1399 1400 if (dev->rdd2_phy && dev->rdd2_phy != phy) { 1401 /* rdd2 is already locked */ 1402 ret = -EBUSY; 1403 goto out; 1404 } 1405 1406 /* rdd2 already configured on a radar channel */ 1407 running = dev->rdd2_phy && 1408 cfg80211_chandef_valid(&dev->rdd2_chandef) && 1409 !!(dev->rdd2_chandef.chan->flags & IEEE80211_CHAN_RADAR); 1410 1411 if (!chandef || running || 1412 !(chandef->chan->flags & IEEE80211_CHAN_RADAR)) { 1413 ret = mt7996_mcu_rdd_background_enable(phy, NULL); 1414 if (ret) 1415 goto out; 1416 1417 if (!running) 1418 goto update_phy; 1419 } 1420 1421 ret = mt7996_mcu_rdd_background_enable(phy, chandef); 1422 if (ret) 1423 goto out; 1424 1425 update_phy: 1426 dev->rdd2_phy = chandef ? phy : NULL; 1427 if (chandef) 1428 dev->rdd2_chandef = *chandef; 1429 out: 1430 mutex_unlock(&dev->mt76.mutex); 1431 1432 return ret; 1433 } 1434 1435 #ifdef CONFIG_NET_MEDIATEK_SOC_WED 1436 static int 1437 mt7996_net_fill_forward_path(struct ieee80211_hw *hw, 1438 struct ieee80211_vif *vif, 1439 struct ieee80211_sta *sta, 1440 struct net_device_path_ctx *ctx, 1441 struct net_device_path *path) 1442 { 1443 struct mt7996_vif *mvif = (struct mt7996_vif *)vif->drv_priv; 1444 struct mt7996_sta *msta = (struct mt7996_sta *)sta->drv_priv; 1445 struct mt7996_dev *dev = mt7996_hw_dev(hw); 1446 struct mt7996_phy *phy = mt7996_hw_phy(hw); 1447 struct mtk_wed_device *wed = &dev->mt76.mmio.wed; 1448 1449 if (phy != &dev->phy && phy->mt76->band_idx == MT_BAND2) 1450 wed = &dev->mt76.mmio.wed_hif2; 1451 1452 if (!mtk_wed_device_active(wed)) 1453 return -ENODEV; 1454 1455 if (!msta->wcid.sta || msta->wcid.idx > MT7996_WTBL_STA) 1456 return -EIO; 1457 1458 path->type = DEV_PATH_MTK_WDMA; 1459 path->dev = ctx->dev; 1460 path->mtk_wdma.wdma_idx = wed->wdma_idx; 1461 path->mtk_wdma.bss = mvif->mt76.idx; 1462 path->mtk_wdma.queue = 0; 1463 path->mtk_wdma.wcid = msta->wcid.idx; 1464 1465 path->mtk_wdma.amsdu = mtk_wed_is_amsdu_supported(wed); 1466 ctx->dev = NULL; 1467 1468 return 0; 1469 } 1470 1471 #endif 1472 1473 const struct ieee80211_ops mt7996_ops = { 1474 .add_chanctx = ieee80211_emulate_add_chanctx, 1475 .remove_chanctx = ieee80211_emulate_remove_chanctx, 1476 .change_chanctx = ieee80211_emulate_change_chanctx, 1477 .switch_vif_chanctx = ieee80211_emulate_switch_vif_chanctx, 1478 .tx = mt7996_tx, 1479 .start = mt7996_start, 1480 .stop = mt7996_stop, 1481 .add_interface = mt7996_add_interface, 1482 .remove_interface = mt7996_remove_interface, 1483 .config = mt7996_config, 1484 .conf_tx = mt7996_conf_tx, 1485 .configure_filter = mt7996_configure_filter, 1486 .bss_info_changed = mt7996_bss_info_changed, 1487 .sta_state = mt76_sta_state, 1488 .sta_pre_rcu_remove = mt76_sta_pre_rcu_remove, 1489 .link_sta_rc_update = mt7996_sta_rc_update, 1490 .set_key = mt7996_set_key, 1491 .ampdu_action = mt7996_ampdu_action, 1492 .set_rts_threshold = mt7996_set_rts_threshold, 1493 .wake_tx_queue = mt76_wake_tx_queue, 1494 .sw_scan_start = mt76_sw_scan, 1495 .sw_scan_complete = mt76_sw_scan_complete, 1496 .release_buffered_frames = mt76_release_buffered_frames, 1497 .get_txpower = mt76_get_txpower, 1498 .channel_switch_beacon = mt7996_channel_switch_beacon, 1499 .get_stats = mt7996_get_stats, 1500 .get_et_sset_count = mt7996_get_et_sset_count, 1501 .get_et_stats = mt7996_get_et_stats, 1502 .get_et_strings = mt7996_get_et_strings, 1503 .get_tsf = mt7996_get_tsf, 1504 .set_tsf = mt7996_set_tsf, 1505 .offset_tsf = mt7996_offset_tsf, 1506 .get_survey = mt76_get_survey, 1507 .get_antenna = mt76_get_antenna, 1508 .set_antenna = mt7996_set_antenna, 1509 .set_bitrate_mask = mt7996_set_bitrate_mask, 1510 .set_coverage_class = mt7996_set_coverage_class, 1511 .sta_statistics = mt7996_sta_statistics, 1512 .sta_set_4addr = mt7996_sta_set_4addr, 1513 .sta_set_decap_offload = mt7996_sta_set_decap_offload, 1514 .add_twt_setup = mt7996_mac_add_twt_setup, 1515 .twt_teardown_request = mt7996_twt_teardown_request, 1516 #ifdef CONFIG_MAC80211_DEBUGFS 1517 .sta_add_debugfs = mt7996_sta_add_debugfs, 1518 #endif 1519 .set_radar_background = mt7996_set_radar_background, 1520 #ifdef CONFIG_NET_MEDIATEK_SOC_WED 1521 .net_fill_forward_path = mt7996_net_fill_forward_path, 1522 .net_setup_tc = mt76_wed_net_setup_tc, 1523 #endif 1524 }; 1525