Lines Matching +full:disable +full:- +full:radar +full:- +full:background
1 // SPDX-License-Identifier: ISC
9 #include <linux/hwmon-sysfs.h>
54 int i = to_sensor_dev_attr(attr)->index; in mt7996_thermal_temp_show()
67 phy->throttle_temp[i - 1] * 1000); in mt7996_thermal_temp_show()
69 return sprintf(buf, "%hhu\n", phy->throttle_state); in mt7996_thermal_temp_show()
71 return -EINVAL; in mt7996_thermal_temp_show()
80 int ret, i = to_sensor_dev_attr(attr)->index; in mt7996_thermal_temp_store()
87 mutex_lock(&phy->dev->mt76.mutex); in mt7996_thermal_temp_store()
91 if ((i - 1 == MT7996_CRIT_TEMP_IDX && in mt7996_thermal_temp_store()
92 val > phy->throttle_temp[MT7996_MAX_TEMP_IDX] - 10) || in mt7996_thermal_temp_store()
93 (i - 1 == MT7996_MAX_TEMP_IDX && in mt7996_thermal_temp_store()
94 val - 10 < phy->throttle_temp[MT7996_CRIT_TEMP_IDX])) { in mt7996_thermal_temp_store()
95 dev_err(phy->dev->mt76.dev, in mt7996_thermal_temp_store()
97 mutex_unlock(&phy->dev->mt76.mutex); in mt7996_thermal_temp_store()
98 return -EINVAL; in mt7996_thermal_temp_store()
101 phy->throttle_temp[i - 1] = val; in mt7996_thermal_temp_store()
102 mutex_unlock(&phy->dev->mt76.mutex); in mt7996_thermal_temp_store()
138 struct mt7996_phy *phy = cdev->devdata; in mt7996_thermal_get_cur_throttle_state()
140 *state = phy->cdev_state; in mt7996_thermal_get_cur_throttle_state()
149 struct mt7996_phy *phy = cdev->devdata; in mt7996_thermal_set_cur_throttle_state()
150 u8 throttling = MT7996_THERMAL_THROTTLE_MAX - state; in mt7996_thermal_set_cur_throttle_state()
154 dev_err(phy->dev->mt76.dev, in mt7996_thermal_set_cur_throttle_state()
156 return -EINVAL; in mt7996_thermal_set_cur_throttle_state()
159 if (state == phy->cdev_state) in mt7996_thermal_set_cur_throttle_state()
169 phy->cdev_state = state; in mt7996_thermal_set_cur_throttle_state()
182 struct wiphy *wiphy = phy->mt76->hw->wiphy; in mt7996_unregister_thermal()
184 if (!phy->cdev) in mt7996_unregister_thermal()
187 sysfs_remove_link(&wiphy->dev.kobj, "cooling_device"); in mt7996_unregister_thermal()
188 thermal_cooling_device_unregister(phy->cdev); in mt7996_unregister_thermal()
193 struct wiphy *wiphy = phy->mt76->hw->wiphy; in mt7996_thermal_init()
198 name = devm_kasprintf(&wiphy->dev, GFP_KERNEL, "mt7996_%s", in mt7996_thermal_init()
203 if (sysfs_create_link(&wiphy->dev.kobj, &cdev->device.kobj, in mt7996_thermal_init()
207 phy->cdev = cdev; in mt7996_thermal_init()
211 phy->throttle_temp[MT7996_CRIT_TEMP_IDX] = MT7996_CRIT_TEMP; in mt7996_thermal_init()
212 phy->throttle_temp[MT7996_MAX_TEMP_IDX] = MT7996_MAX_TEMP; in mt7996_thermal_init()
217 hwmon = devm_hwmon_device_register_with_groups(&wiphy->dev, name, phy, in mt7996_thermal_init()
234 dev = container_of(mphy->dev, struct mt7996_dev, mt76); in mt7996_led_set_config()
237 mt76_rmw_field(dev, MT_TMAC_TCR0(mphy->band_idx), MT_TMAC_TCR0_TX_BLINK, 2); in mt7996_led_set_config()
240 mt76_wr(dev, MT_LED_EN(mphy->band_idx), 1); in mt7996_led_set_config()
245 mt76_wr(dev, MT_LED_TX_BLINK(mphy->band_idx), val); in mt7996_led_set_config()
253 if (mphy->band_idx == MT_BAND1) in mt7996_led_set_config()
257 if (mphy->leds.al) in mt7996_led_set_config()
260 mt76_wr(dev, MT_LED_CTRL(mphy->band_idx), val); in mt7996_led_set_config()
261 mt76_clear(dev, MT_LED_CTRL(mphy->band_idx), MT_LED_CTRL_KICK); in mt7996_led_set_config()
295 struct mt7996_dev *dev = phy->dev; in __mt7996_init_txpower()
296 int i, nss = hweight16(phy->mt76->chainmask); in __mt7996_init_txpower()
298 int pwr_delta = mt7996_eeprom_get_power_delta(dev, sband->band); in __mt7996_init_txpower()
301 for (i = 0; i < sband->n_channels; i++) { in __mt7996_init_txpower()
302 struct ieee80211_channel *chan = &sband->channels[i]; in __mt7996_init_txpower()
306 target_power = mt76_get_rate_power_limits(phy->mt76, chan, in __mt7996_init_txpower()
311 chan->max_power = min_t(int, chan->max_reg_power, in __mt7996_init_txpower()
313 chan->orig_mpwr = target_power; in __mt7996_init_txpower()
322 if (phy->mt76->cap.has_2ghz) in mt7996_init_txpower()
323 __mt7996_init_txpower(phy, &phy->mt76->sband_2g.sband); in mt7996_init_txpower()
324 if (phy->mt76->cap.has_5ghz) in mt7996_init_txpower()
325 __mt7996_init_txpower(phy, &phy->mt76->sband_5g.sband); in mt7996_init_txpower()
326 if (phy->mt76->cap.has_6ghz) in mt7996_init_txpower()
327 __mt7996_init_txpower(phy, &phy->mt76->sband_6g.sband); in mt7996_init_txpower()
338 memcpy(dev->mt76.alpha2, request->alpha2, sizeof(dev->mt76.alpha2)); in mt7996_regd_notifier()
339 dev->mt76.region = request->dfs_region; in mt7996_regd_notifier()
341 if (dev->mt76.region == NL80211_DFS_UNSET) in mt7996_regd_notifier()
346 phy->mt76->dfs_state = MT_DFS_STATE_UNKNOWN; in mt7996_regd_notifier()
354 struct mt76_dev *mdev = &phy->dev->mt76; in mt7996_init_wiphy()
355 struct wiphy *wiphy = hw->wiphy; in mt7996_init_wiphy()
356 u16 max_subframes = phy->dev->has_eht ? IEEE80211_MAX_AMPDU_BUF_EHT : in mt7996_init_wiphy()
359 hw->queues = 4; in mt7996_init_wiphy()
360 hw->max_rx_aggregation_subframes = max_subframes; in mt7996_init_wiphy()
361 hw->max_tx_aggregation_subframes = max_subframes; in mt7996_init_wiphy()
362 hw->netdev_features = NETIF_F_RXCSUM; in mt7996_init_wiphy()
364 hw->netdev_features |= NETIF_F_HW_TC; in mt7996_init_wiphy()
366 hw->radiotap_timestamp.units_pos = in mt7996_init_wiphy()
369 phy->slottime = 9; in mt7996_init_wiphy()
370 phy->beacon_rate = -1; in mt7996_init_wiphy()
372 hw->sta_data_size = sizeof(struct mt7996_sta); in mt7996_init_wiphy()
373 hw->vif_data_size = sizeof(struct mt7996_vif); in mt7996_init_wiphy()
375 wiphy->iface_combinations = if_comb; in mt7996_init_wiphy()
376 wiphy->n_iface_combinations = ARRAY_SIZE(if_comb); in mt7996_init_wiphy()
377 wiphy->reg_notifier = mt7996_regd_notifier; in mt7996_init_wiphy()
378 wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH; in mt7996_init_wiphy()
379 wiphy->mbssid_max_interfaces = 16; in mt7996_init_wiphy()
393 if (!mdev->dev->of_node || in mt7996_init_wiphy()
394 !of_property_read_bool(mdev->dev->of_node, in mt7996_init_wiphy()
395 "mediatek,disable-radar-background")) in mt7996_init_wiphy()
405 hw->max_tx_fragments = 4; in mt7996_init_wiphy()
407 if (phy->mt76->cap.has_2ghz) { in mt7996_init_wiphy()
408 phy->mt76->sband_2g.sband.ht_cap.cap |= in mt7996_init_wiphy()
411 phy->mt76->sband_2g.sband.ht_cap.ampdu_density = in mt7996_init_wiphy()
415 if (phy->mt76->cap.has_5ghz) { in mt7996_init_wiphy()
416 phy->mt76->sband_5g.sband.ht_cap.cap |= in mt7996_init_wiphy()
420 phy->mt76->sband_5g.sband.vht_cap.cap |= in mt7996_init_wiphy()
425 phy->mt76->sband_5g.sband.ht_cap.ampdu_density = in mt7996_init_wiphy()
433 phy->mt76->leds.cdev.brightness_set = mt7996_led_set_brightness; in mt7996_init_wiphy()
434 phy->mt76->leds.cdev.blink_set = mt7996_led_set_blink; in mt7996_init_wiphy()
437 mt76_set_stream_caps(phy->mt76, true); in mt7996_init_wiphy()
442 wiphy->available_antennas_rx = phy->mt76->antenna_mask; in mt7996_init_wiphy()
443 wiphy->available_antennas_tx = phy->mt76->antenna_mask; in mt7996_init_wiphy()
468 /* filter out non-resp frames and get instanstaeous signal reporting */ in mt7996_mac_init_band()
491 mt7996_mcu_set_fixed_rate_table(&dev->phy, idx, rate, false); in mt7996_mac_init_basic_rates()
507 i = dev->mphy.leds.pin ? MT_LED_GPIO_MUX3 : MT_LED_GPIO_MUX2; in mt7996_mac_init()
512 if (is_mt7996(&dev->mt76)) in mt7996_mac_init()
516 dev->hif2 ? 7 : 0); in mt7996_mac_init()
518 if (dev->has_rro) { in mt7996_mac_init()
566 struct mtk_wed_device *wed = &dev->mt76.mmio.wed; in mt7996_register_phy()
574 if (is_mt7996(&dev->mt76) && band == MT_BAND2 && dev->hif2) { in mt7996_register_phy()
575 hif1_ofs = MT_WFDMA0_PCIE1(0) - MT_WFDMA0(0); in mt7996_register_phy()
576 wed = &dev->mt76.mmio.wed_hif2; in mt7996_register_phy()
579 mphy = mt76_alloc_phy(&dev->mt76, sizeof(*phy), &mt7996_ops, band); in mt7996_register_phy()
581 return -ENOMEM; in mt7996_register_phy()
583 phy = mphy->priv; in mt7996_register_phy()
584 phy->dev = dev; in mt7996_register_phy()
585 phy->mt76 = mphy; in mt7996_register_phy()
586 mphy->dev->phys[band] = mphy; in mt7996_register_phy()
588 INIT_DELAYED_WORK(&mphy->mac_work, mt7996_mac_work); in mt7996_register_phy()
595 memcpy(mphy->macaddr, dev->mt76.eeprom.data + mac_ofs, ETH_ALEN); in mt7996_register_phy()
599 if (!is_valid_ether_addr(mphy->macaddr)) { in mt7996_register_phy()
600 memcpy(mphy->macaddr, dev->mt76.eeprom.data + MT_EE_MAC_ADDR, in mt7996_register_phy()
602 mphy->macaddr[0] |= 2; in mt7996_register_phy()
603 mphy->macaddr[0] ^= BIT(7); in mt7996_register_phy()
605 mphy->macaddr[0] ^= BIT(6); in mt7996_register_phy()
610 mt7996_init_wiphy(mphy->hw, wed); in mt7996_register_phy()
611 ret = mt7996_init_tx_queues(mphy->priv, in mt7996_register_phy()
632 if (wed == &dev->mt76.mmio.wed_hif2 && mtk_wed_device_active(wed)) { in mt7996_register_phy()
633 u32 irq_mask = dev->mt76.mmio.irqmask | MT_INT_TX_DONE_BAND2; in mt7996_register_phy()
636 mtk_wed_device_start(&dev->mt76.mmio.wed_hif2, irq_mask); in mt7996_register_phy()
642 mphy->dev->phys[band] = NULL; in mt7996_register_phy()
643 ieee80211_free_hw(mphy->hw); in mt7996_register_phy()
657 mphy = phy->dev->mt76.phys[band]; in mt7996_unregister_phy()
659 ieee80211_free_hw(mphy->hw); in mt7996_unregister_phy()
660 phy->dev->mt76.phys[band] = NULL; in mt7996_unregister_phy()
685 struct mtk_wed_device *wed = &dev->mt76.mmio.wed; in mt7996_wed_rro_init()
691 if (!dev->has_rro) in mt7996_wed_rro_init()
697 for (i = 0; i < ARRAY_SIZE(dev->wed_rro.ba_bitmap); i++) { in mt7996_wed_rro_init()
698 ptr = dmam_alloc_coherent(dev->mt76.dma_dev, in mt7996_wed_rro_init()
700 &dev->wed_rro.ba_bitmap[i].phy_addr, in mt7996_wed_rro_init()
703 return -ENOMEM; in mt7996_wed_rro_init()
705 dev->wed_rro.ba_bitmap[i].ptr = ptr; in mt7996_wed_rro_init()
708 for (i = 0; i < ARRAY_SIZE(dev->wed_rro.addr_elem); i++) { in mt7996_wed_rro_init()
711 ptr = dmam_alloc_coherent(dev->mt76.dma_dev, in mt7996_wed_rro_init()
713 &dev->wed_rro.addr_elem[i].phy_addr, in mt7996_wed_rro_init()
716 return -ENOMEM; in mt7996_wed_rro_init()
718 dev->wed_rro.addr_elem[i].ptr = ptr; in mt7996_wed_rro_init()
719 memset(dev->wed_rro.addr_elem[i].ptr, 0, in mt7996_wed_rro_init()
722 addr = dev->wed_rro.addr_elem[i].ptr; in mt7996_wed_rro_init()
724 addr->signature = 0xff; in mt7996_wed_rro_init()
728 wed->wlan.ind_cmd.addr_elem_phys[i] = in mt7996_wed_rro_init()
729 dev->wed_rro.addr_elem[i].phy_addr; in mt7996_wed_rro_init()
732 ptr = dmam_alloc_coherent(dev->mt76.dma_dev, in mt7996_wed_rro_init()
734 &dev->wed_rro.session.phy_addr, in mt7996_wed_rro_init()
737 return -ENOMEM; in mt7996_wed_rro_init()
739 dev->wed_rro.session.ptr = ptr; in mt7996_wed_rro_init()
740 addr = dev->wed_rro.session.ptr; in mt7996_wed_rro_init()
742 addr->signature = 0xff; in mt7996_wed_rro_init()
752 dev->wed_rro.ba_bitmap[0].phy_addr); in mt7996_wed_rro_init()
755 dev->wed_rro.ba_bitmap[1].phy_addr); in mt7996_wed_rro_init()
759 for (i = 0; i < ARRAY_SIZE(dev->wed_rro.addr_elem); i++) { in mt7996_wed_rro_init()
760 mt76_wr(dev, reg, dev->wed_rro.addr_elem[i].phy_addr >> 4); in mt7996_wed_rro_init()
764 /* setup Address element address - separate address segment mode */ in mt7996_wed_rro_init()
768 wed->wlan.ind_cmd.win_size = ffs(MT7996_RRO_WINDOW_MAX_LEN) - 6; in mt7996_wed_rro_init()
769 wed->wlan.ind_cmd.particular_sid = MT7996_RRO_MAX_SESSION; in mt7996_wed_rro_init()
770 wed->wlan.ind_cmd.particular_se_phys = dev->wed_rro.session.phy_addr; in mt7996_wed_rro_init()
771 wed->wlan.ind_cmd.se_group_nums = MT7996_RRO_ADDR_ELEM_LEN; in mt7996_wed_rro_init()
772 wed->wlan.ind_cmd.ack_sn_addr = MT_RRO_ACK_SN_CTRL; in mt7996_wed_rro_init()
780 mt76_wr(dev, MT_RRO_PARTICULAR_CFG0, dev->wed_rro.session.phy_addr); in mt7996_wed_rro_init()
801 if (!dev->has_rro) in mt7996_wed_rro_free()
804 if (!mtk_wed_device_active(&dev->mt76.mmio.wed)) in mt7996_wed_rro_free()
807 for (i = 0; i < ARRAY_SIZE(dev->wed_rro.ba_bitmap); i++) { in mt7996_wed_rro_free()
808 if (!dev->wed_rro.ba_bitmap[i].ptr) in mt7996_wed_rro_free()
811 dmam_free_coherent(dev->mt76.dma_dev, in mt7996_wed_rro_free()
813 dev->wed_rro.ba_bitmap[i].ptr, in mt7996_wed_rro_free()
814 dev->wed_rro.ba_bitmap[i].phy_addr); in mt7996_wed_rro_free()
817 for (i = 0; i < ARRAY_SIZE(dev->wed_rro.addr_elem); i++) { in mt7996_wed_rro_free()
818 if (!dev->wed_rro.addr_elem[i].ptr) in mt7996_wed_rro_free()
821 dmam_free_coherent(dev->mt76.dma_dev, in mt7996_wed_rro_free()
824 dev->wed_rro.addr_elem[i].ptr, in mt7996_wed_rro_free()
825 dev->wed_rro.addr_elem[i].phy_addr); in mt7996_wed_rro_free()
828 if (!dev->wed_rro.session.ptr) in mt7996_wed_rro_free()
831 dmam_free_coherent(dev->mt76.dma_dev, in mt7996_wed_rro_free()
834 dev->wed_rro.session.ptr, in mt7996_wed_rro_free()
835 dev->wed_rro.session.phy_addr); in mt7996_wed_rro_free()
848 spin_lock_bh(&dev->wed_rro.lock); in mt7996_wed_rro_work()
849 list_splice_init(&dev->wed_rro.poll_list, &list); in mt7996_wed_rro_work()
850 spin_unlock_bh(&dev->wed_rro.lock); in mt7996_wed_rro_work()
858 list_del_init(&e->list); in mt7996_wed_rro_work()
861 void *ptr = dev->wed_rro.session.ptr; in mt7996_wed_rro_work()
865 if (e->id == MT7996_RRO_MAX_SESSION) in mt7996_wed_rro_work()
868 idx = e->id / MT7996_RRO_BA_BITMAP_SESSION_SIZE; in mt7996_wed_rro_work()
869 if (idx >= ARRAY_SIZE(dev->wed_rro.addr_elem)) in mt7996_wed_rro_work()
872 ptr = dev->wed_rro.addr_elem[idx].ptr; in mt7996_wed_rro_work()
874 (e->id % MT7996_RRO_BA_BITMAP_SESSION_SIZE) * in mt7996_wed_rro_work()
878 elem->signature = 0xff; in mt7996_wed_rro_work()
880 mt7996_mcu_wed_rro_reset_sessions(dev, e->id); in mt7996_wed_rro_work()
892 if (is_mt7992(&dev->mt76)) { in mt7996_init_hardware()
897 INIT_WORK(&dev->init_work, mt7996_init_work); in mt7996_init_hardware()
898 INIT_WORK(&dev->wed_rro.work, mt7996_wed_rro_work); in mt7996_init_hardware()
899 INIT_LIST_HEAD(&dev->wed_rro.poll_list); in mt7996_init_hardware()
900 spin_lock_init(&dev->wed_rro.lock); in mt7996_init_hardware()
906 set_bit(MT76_STATE_INITIALIZED, &dev->mphy.state); in mt7996_init_hardware()
921 idx = mt76_wcid_alloc(dev->mt76.wcid_mask, MT7996_WTBL_STA); in mt7996_init_hardware()
923 return -ENOSPC; in mt7996_init_hardware()
925 dev->mt76.global_wcid.idx = idx; in mt7996_init_hardware()
926 dev->mt76.global_wcid.hw_key_idx = -1; in mt7996_init_hardware()
927 dev->mt76.global_wcid.tx_info |= MT_WCID_TX_INFO_SET; in mt7996_init_hardware()
928 rcu_assign_pointer(dev->mt76.wcid[idx], &dev->mt76.global_wcid); in mt7996_init_hardware()
938 if (!phy->mt76->cap.has_5ghz) in mt7996_set_stream_vht_txbf_caps()
941 sts = hweight16(phy->mt76->chainmask); in mt7996_set_stream_vht_txbf_caps()
942 cap = &phy->mt76->sband_5g.sband.vht_cap.cap; in mt7996_set_stream_vht_txbf_caps()
947 if (is_mt7996(phy->mt76->dev)) in mt7996_set_stream_vht_txbf_caps()
961 FIELD_PREP(IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK, sts - 1); in mt7996_set_stream_vht_txbf_caps()
968 struct ieee80211_he_cap_elem *elem = &he_cap->he_cap_elem; in mt7996_set_stream_he_txbf_caps()
969 int sts = hweight16(phy->mt76->chainmask); in mt7996_set_stream_he_txbf_caps()
977 elem->phy_cap_info[3] &= ~IEEE80211_HE_PHY_CAP3_SU_BEAMFORMER; in mt7996_set_stream_he_txbf_caps()
978 elem->phy_cap_info[4] &= ~IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER; in mt7996_set_stream_he_txbf_caps()
982 elem->phy_cap_info[5] &= ~c; in mt7996_set_stream_he_txbf_caps()
986 elem->phy_cap_info[6] &= ~c; in mt7996_set_stream_he_txbf_caps()
988 elem->phy_cap_info[7] &= ~IEEE80211_HE_PHY_CAP7_MAX_NC_MASK; in mt7996_set_stream_he_txbf_caps()
993 elem->phy_cap_info[2] |= c; in mt7996_set_stream_he_txbf_caps()
997 if (is_mt7996(phy->mt76->dev)) in mt7996_set_stream_he_txbf_caps()
1004 elem->phy_cap_info[4] |= c; in mt7996_set_stream_he_txbf_caps()
1013 elem->phy_cap_info[6] |= c; in mt7996_set_stream_he_txbf_caps()
1019 elem->phy_cap_info[7] |= min_t(int, sts - 1, 2) << 3; in mt7996_set_stream_he_txbf_caps()
1024 elem->phy_cap_info[3] |= IEEE80211_HE_PHY_CAP3_SU_BEAMFORMER; in mt7996_set_stream_he_txbf_caps()
1027 sts - 1) | in mt7996_set_stream_he_txbf_caps()
1029 sts - 1); in mt7996_set_stream_he_txbf_caps()
1030 elem->phy_cap_info[5] |= c; in mt7996_set_stream_he_txbf_caps()
1035 elem->phy_cap_info[4] |= IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER; in mt7996_set_stream_he_txbf_caps()
1039 elem->phy_cap_info[6] |= c; in mt7996_set_stream_he_txbf_caps()
1043 elem->phy_cap_info[7] |= c; in mt7996_set_stream_he_txbf_caps()
1051 struct ieee80211_sta_he_cap *he_cap = &data->he_cap; in mt7996_init_he_caps()
1052 struct ieee80211_he_cap_elem *he_cap_elem = &he_cap->he_cap_elem; in mt7996_init_he_caps()
1053 struct ieee80211_he_mcs_nss_supp *he_mcs = &he_cap->he_mcs_nss_supp; in mt7996_init_he_caps()
1054 int i, nss = hweight8(phy->mt76->antenna_mask); in mt7996_init_he_caps()
1064 he_cap->has_he = true; in mt7996_init_he_caps()
1066 he_cap_elem->mac_cap_info[0] = IEEE80211_HE_MAC_CAP0_HTC_HE; in mt7996_init_he_caps()
1067 he_cap_elem->mac_cap_info[3] = IEEE80211_HE_MAC_CAP3_OMI_CONTROL | in mt7996_init_he_caps()
1069 he_cap_elem->mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU; in mt7996_init_he_caps()
1072 he_cap_elem->phy_cap_info[0] = in mt7996_init_he_caps()
1075 he_cap_elem->phy_cap_info[0] = in mt7996_init_he_caps()
1079 he_cap_elem->phy_cap_info[1] = IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD; in mt7996_init_he_caps()
1080 he_cap_elem->phy_cap_info[2] = IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ | in mt7996_init_he_caps()
1085 he_cap_elem->mac_cap_info[0] |= IEEE80211_HE_MAC_CAP0_TWT_RES; in mt7996_init_he_caps()
1086 he_cap_elem->mac_cap_info[2] |= IEEE80211_HE_MAC_CAP2_BSR; in mt7996_init_he_caps()
1087 he_cap_elem->mac_cap_info[4] |= IEEE80211_HE_MAC_CAP4_BQR; in mt7996_init_he_caps()
1088 he_cap_elem->mac_cap_info[5] |= in mt7996_init_he_caps()
1090 he_cap_elem->phy_cap_info[3] |= in mt7996_init_he_caps()
1093 he_cap_elem->phy_cap_info[6] |= in mt7996_init_he_caps()
1096 he_cap_elem->phy_cap_info[9] |= in mt7996_init_he_caps()
1101 he_cap_elem->mac_cap_info[1] |= in mt7996_init_he_caps()
1105 he_cap_elem->phy_cap_info[0] |= in mt7996_init_he_caps()
1108 he_cap_elem->phy_cap_info[0] |= in mt7996_init_he_caps()
1111 he_cap_elem->phy_cap_info[1] |= in mt7996_init_he_caps()
1114 he_cap_elem->phy_cap_info[3] |= in mt7996_init_he_caps()
1117 he_cap_elem->phy_cap_info[6] |= in mt7996_init_he_caps()
1121 he_cap_elem->phy_cap_info[7] |= in mt7996_init_he_caps()
1124 he_cap_elem->phy_cap_info[8] |= in mt7996_init_he_caps()
1129 he_cap_elem->phy_cap_info[9] |= in mt7996_init_he_caps()
1141 he_mcs->rx_mcs_80 = cpu_to_le16(mcs_map); in mt7996_init_he_caps()
1142 he_mcs->tx_mcs_80 = cpu_to_le16(mcs_map); in mt7996_init_he_caps()
1143 he_mcs->rx_mcs_160 = cpu_to_le16(mcs_map); in mt7996_init_he_caps()
1144 he_mcs->tx_mcs_160 = cpu_to_le16(mcs_map); in mt7996_init_he_caps()
1148 memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres)); in mt7996_init_he_caps()
1149 if (he_cap_elem->phy_cap_info[6] & in mt7996_init_he_caps()
1151 mt76_connac_gen_ppe_thresh(he_cap->ppe_thres, nss); in mt7996_init_he_caps()
1153 he_cap_elem->phy_cap_info[9] |= in mt7996_init_he_caps()
1169 data->he_6ghz_capa.capa = cpu_to_le16(cap); in mt7996_init_he_caps()
1178 struct ieee80211_sta_eht_cap *eht_cap = &data->eht_cap; in mt7996_init_eht_caps()
1179 struct ieee80211_eht_cap_elem_fixed *eht_cap_elem = &eht_cap->eht_cap_elem; in mt7996_init_eht_caps()
1180 struct ieee80211_eht_mcs_nss_supp *eht_nss = &eht_cap->eht_mcs_nss_supp; in mt7996_init_eht_caps()
1181 enum nl80211_chan_width width = phy->mt76->chandef.width; in mt7996_init_eht_caps()
1182 int nss = hweight8(phy->mt76->antenna_mask); in mt7996_init_eht_caps()
1183 int sts = hweight16(phy->mt76->chainmask); in mt7996_init_eht_caps()
1186 if (!phy->dev->has_eht) in mt7996_init_eht_caps()
1189 eht_cap->has_eht = true; in mt7996_init_eht_caps()
1191 eht_cap_elem->mac_cap_info[0] = in mt7996_init_eht_caps()
1195 eht_cap_elem->phy_cap_info[0] = in mt7996_init_eht_caps()
1201 val = is_mt7992(phy->mt76->dev) ? 4 : 3; in mt7996_init_eht_caps()
1202 eht_cap_elem->phy_cap_info[0] |= in mt7996_init_eht_caps()
1206 eht_cap_elem->phy_cap_info[1] = in mt7996_init_eht_caps()
1212 eht_cap_elem->phy_cap_info[2] = in mt7996_init_eht_caps()
1213 u8_encode_bits(sts - 1, IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_80MHZ_MASK) | in mt7996_init_eht_caps()
1214 u8_encode_bits(sts - 1, IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_160MHZ_MASK); in mt7996_init_eht_caps()
1217 eht_cap_elem->phy_cap_info[0] |= in mt7996_init_eht_caps()
1220 eht_cap_elem->phy_cap_info[1] |= in mt7996_init_eht_caps()
1224 eht_cap_elem->phy_cap_info[2] |= in mt7996_init_eht_caps()
1225 u8_encode_bits(sts - 1, in mt7996_init_eht_caps()
1229 eht_cap_elem->phy_cap_info[3] = in mt7996_init_eht_caps()
1235 eht_cap_elem->phy_cap_info[4] = in mt7996_init_eht_caps()
1236 u8_encode_bits(min_t(int, sts - 1, 2), in mt7996_init_eht_caps()
1239 eht_cap_elem->phy_cap_info[5] = in mt7996_init_eht_caps()
1248 eht_cap_elem->phy_cap_info[6] = in mt7996_init_eht_caps()
1256 eht_nss->bw._##_bw.rx_tx_mcs9_max_nss = _val; \ in mt7996_init_eht_caps()
1257 eht_nss->bw._##_bw.rx_tx_mcs11_max_nss = _val; \ in mt7996_init_eht_caps()
1258 eht_nss->bw._##_bw.rx_tx_mcs13_max_nss = _val; \ in mt7996_init_eht_caps()
1270 eht_cap_elem->phy_cap_info[3] |= in mt7996_init_eht_caps()
1274 eht_cap_elem->phy_cap_info[7] = in mt7996_init_eht_caps()
1283 eht_cap_elem->phy_cap_info[7] |= in mt7996_init_eht_caps()
1293 struct ieee80211_sband_iftype_data *data = phy->iftype[band]; in __mt7996_set_stream_he_eht_caps()
1320 if (phy->mt76->cap.has_2ghz) in mt7996_set_stream_he_eht_caps()
1321 __mt7996_set_stream_he_eht_caps(phy, &phy->mt76->sband_2g.sband, in mt7996_set_stream_he_eht_caps()
1324 if (phy->mt76->cap.has_5ghz) in mt7996_set_stream_he_eht_caps()
1325 __mt7996_set_stream_he_eht_caps(phy, &phy->mt76->sband_5g.sband, in mt7996_set_stream_he_eht_caps()
1328 if (phy->mt76->cap.has_6ghz) in mt7996_set_stream_he_eht_caps()
1329 __mt7996_set_stream_he_eht_caps(phy, &phy->mt76->sband_6g.sband, in mt7996_set_stream_he_eht_caps()
1338 dev->phy.dev = dev; in mt7996_register_device()
1339 dev->phy.mt76 = &dev->mt76.phy; in mt7996_register_device()
1340 dev->mt76.phy.priv = &dev->phy; in mt7996_register_device()
1341 INIT_WORK(&dev->rc_work, mt7996_mac_sta_rc_work); in mt7996_register_device()
1342 INIT_DELAYED_WORK(&dev->mphy.mac_work, mt7996_mac_work); in mt7996_register_device()
1343 INIT_LIST_HEAD(&dev->sta_rc_list); in mt7996_register_device()
1344 INIT_LIST_HEAD(&dev->twt_list); in mt7996_register_device()
1346 init_waitqueue_head(&dev->reset_wait); in mt7996_register_device()
1347 INIT_WORK(&dev->reset_work, mt7996_mac_reset_work); in mt7996_register_device()
1348 INIT_WORK(&dev->dump_work, mt7996_mac_dump_work); in mt7996_register_device()
1349 mutex_init(&dev->dump_mutex); in mt7996_register_device()
1355 mt7996_init_wiphy(hw, &dev->mt76.mmio.wed); in mt7996_register_device()
1357 ret = mt76_register_device(&dev->mt76, true, mt76_rates, in mt7996_register_device()
1362 ret = mt7996_thermal_init(&dev->phy); in mt7996_register_device()
1374 ieee80211_queue_work(mt76_hw(dev), &dev->init_work); in mt7996_register_device()
1376 dev->recovery.hw_init_done = true; in mt7996_register_device()
1378 ret = mt7996_init_debugfs(&dev->phy); in mt7996_register_device()
1389 cancel_work_sync(&dev->init_work); in mt7996_register_device()
1396 cancel_work_sync(&dev->wed_rro.work); in mt7996_unregister_device()
1399 mt7996_unregister_thermal(&dev->phy); in mt7996_unregister_device()
1401 mt76_unregister_device(&dev->mt76); in mt7996_unregister_device()
1406 tasklet_disable(&dev->mt76.irq_tasklet); in mt7996_unregister_device()
1408 mt76_free_device(&dev->mt76); in mt7996_unregister_device()