Lines Matching +full:c +full:- +full:phy
1 // SPDX-License-Identifier: ISC
3 * Copyright (C) 2022 MediaTek Inc.
9 #include <linux/hwmon-sysfs.h>
70 struct mt7996_phy *phy = dev_get_drvdata(dev); in mt7996_thermal_temp_show() local
71 int i = to_sensor_dev_attr(attr)->index; in mt7996_thermal_temp_show()
76 temperature = mt7996_mcu_get_temperature(phy); in mt7996_thermal_temp_show()
84 phy->throttle_temp[i - 1] * 1000); in mt7996_thermal_temp_show()
86 return sprintf(buf, "%hhu\n", phy->throttle_state); in mt7996_thermal_temp_show()
88 return -EINVAL; in mt7996_thermal_temp_show()
96 struct mt7996_phy *phy = dev_get_drvdata(dev); in mt7996_thermal_temp_store() local
97 int ret, i = to_sensor_dev_attr(attr)->index; in mt7996_thermal_temp_store()
104 mutex_lock(&phy->dev->mt76.mutex); in mt7996_thermal_temp_store()
108 if ((i - 1 == MT7996_CRIT_TEMP_IDX && in mt7996_thermal_temp_store()
109 val > phy->throttle_temp[MT7996_MAX_TEMP_IDX] - 10) || in mt7996_thermal_temp_store()
110 (i - 1 == MT7996_MAX_TEMP_IDX && in mt7996_thermal_temp_store()
111 val - 10 < phy->throttle_temp[MT7996_CRIT_TEMP_IDX])) { in mt7996_thermal_temp_store()
112 dev_err(phy->dev->mt76.dev, in mt7996_thermal_temp_store()
114 mutex_unlock(&phy->dev->mt76.mutex); in mt7996_thermal_temp_store()
115 return -EINVAL; in mt7996_thermal_temp_store()
118 phy->throttle_temp[i - 1] = val; in mt7996_thermal_temp_store()
119 mutex_unlock(&phy->dev->mt76.mutex); in mt7996_thermal_temp_store()
121 ret = mt7996_mcu_set_thermal_protect(phy, true); in mt7996_thermal_temp_store()
155 struct mt7996_phy *phy = cdev->devdata; in mt7996_thermal_get_cur_throttle_state() local
157 *state = phy->cdev_state; in mt7996_thermal_get_cur_throttle_state()
166 struct mt7996_phy *phy = cdev->devdata; in mt7996_thermal_set_cur_throttle_state() local
167 u8 throttling = MT7996_THERMAL_THROTTLE_MAX - state; in mt7996_thermal_set_cur_throttle_state()
171 dev_err(phy->dev->mt76.dev, in mt7996_thermal_set_cur_throttle_state()
173 return -EINVAL; in mt7996_thermal_set_cur_throttle_state()
176 if (state == phy->cdev_state) in mt7996_thermal_set_cur_throttle_state()
182 ret = mt7996_mcu_set_thermal_throttling(phy, throttling); in mt7996_thermal_set_cur_throttle_state()
186 phy->cdev_state = state; in mt7996_thermal_set_cur_throttle_state()
197 static void mt7996_unregister_thermal(struct mt7996_phy *phy) in mt7996_unregister_thermal() argument
199 struct wiphy *wiphy = phy->mt76->hw->wiphy; in mt7996_unregister_thermal()
202 if (!phy->cdev) in mt7996_unregister_thermal()
205 snprintf(name, sizeof(name), "cooling_device%d", phy->mt76->band_idx); in mt7996_unregister_thermal()
206 sysfs_remove_link(&wiphy->dev.kobj, name); in mt7996_unregister_thermal()
207 thermal_cooling_device_unregister(phy->cdev); in mt7996_unregister_thermal()
210 static int mt7996_thermal_init(struct mt7996_phy *phy) in mt7996_thermal_init() argument
212 struct wiphy *wiphy = phy->mt76->hw->wiphy; in mt7996_thermal_init()
218 name = devm_kasprintf(&wiphy->dev, GFP_KERNEL, "mt7996_%s.%d", in mt7996_thermal_init()
219 wiphy_name(wiphy), phy->mt76->band_idx); in mt7996_thermal_init()
220 snprintf(cname, sizeof(cname), "cooling_device%d", phy->mt76->band_idx); in mt7996_thermal_init()
222 cdev = thermal_cooling_device_register(name, phy, &mt7996_thermal_ops); in mt7996_thermal_init()
224 if (sysfs_create_link(&wiphy->dev.kobj, &cdev->device.kobj, in mt7996_thermal_init()
228 phy->cdev = cdev; in mt7996_thermal_init()
232 phy->throttle_temp[MT7996_CRIT_TEMP_IDX] = MT7996_CRIT_TEMP; in mt7996_thermal_init()
233 phy->throttle_temp[MT7996_MAX_TEMP_IDX] = MT7996_MAX_TEMP; in mt7996_thermal_init()
238 hwmon = devm_hwmon_device_register_with_groups(&wiphy->dev, name, phy, in mt7996_thermal_init()
255 dev = container_of(mphy->dev, struct mt7996_dev, mt76); in mt7996_led_set_config()
258 mt76_rmw_field(dev, MT_TMAC_TCR0(mphy->band_idx), MT_TMAC_TCR0_TX_BLINK, 2); in mt7996_led_set_config()
261 mt76_wr(dev, MT_LED_EN(mphy->band_idx), 1); in mt7996_led_set_config()
266 mt76_wr(dev, MT_LED_TX_BLINK(mphy->band_idx), val); in mt7996_led_set_config()
274 if (mphy->band_idx == MT_BAND1) in mt7996_led_set_config()
278 if (mphy->leds.al) in mt7996_led_set_config()
281 mt76_wr(dev, MT_LED_CTRL(mphy->band_idx), val); in mt7996_led_set_config()
282 mt76_clear(dev, MT_LED_CTRL(mphy->band_idx), MT_LED_CTRL_KICK); in mt7996_led_set_config()
313 static void __mt7996_init_txpower(struct mt7996_phy *phy, in __mt7996_init_txpower() argument
316 struct mt7996_dev *dev = phy->dev; in __mt7996_init_txpower()
317 int i, nss = hweight16(phy->mt76->chainmask); in __mt7996_init_txpower()
319 int pwr_delta = mt7996_eeprom_get_power_delta(dev, sband->band); in __mt7996_init_txpower()
322 for (i = 0; i < sband->n_channels; i++) { in __mt7996_init_txpower()
323 struct ieee80211_channel *chan = &sband->channels[i]; in __mt7996_init_txpower()
327 target_power = mt76_get_rate_power_limits(phy->mt76, chan, in __mt7996_init_txpower()
332 chan->max_power = min_t(int, chan->max_reg_power, in __mt7996_init_txpower()
334 chan->orig_mpwr = target_power; in __mt7996_init_txpower()
338 void mt7996_init_txpower(struct mt7996_phy *phy) in mt7996_init_txpower() argument
340 if (!phy) in mt7996_init_txpower()
343 if (phy->mt76->cap.has_2ghz) in mt7996_init_txpower()
344 __mt7996_init_txpower(phy, &phy->mt76->sband_2g.sband); in mt7996_init_txpower()
345 if (phy->mt76->cap.has_5ghz) in mt7996_init_txpower()
346 __mt7996_init_txpower(phy, &phy->mt76->sband_5g.sband); in mt7996_init_txpower()
347 if (phy->mt76->cap.has_6ghz) in mt7996_init_txpower()
348 __mt7996_init_txpower(phy, &phy->mt76->sband_6g.sband); in mt7996_init_txpower()
357 struct mt7996_phy *phy; in mt7996_regd_notifier() local
359 memcpy(dev->mt76.alpha2, request->alpha2, sizeof(dev->mt76.alpha2)); in mt7996_regd_notifier()
360 dev->mt76.region = request->dfs_region; in mt7996_regd_notifier()
362 mt7996_for_each_phy(dev, phy) { in mt7996_regd_notifier()
363 if (dev->mt76.region == NL80211_DFS_UNSET) in mt7996_regd_notifier()
364 mt7996_mcu_rdd_background_enable(phy, NULL); in mt7996_regd_notifier()
366 mt7996_init_txpower(phy); in mt7996_regd_notifier()
367 phy->mt76->dfs_state = MT_DFS_STATE_UNKNOWN; in mt7996_regd_notifier()
368 mt7996_dfs_init_radar_detector(phy); in mt7996_regd_notifier()
373 mt7996_init_wiphy_band(struct ieee80211_hw *hw, struct mt7996_phy *phy) in mt7996_init_wiphy_band() argument
375 struct mt7996_dev *dev = phy->dev; in mt7996_init_wiphy_band()
376 struct wiphy *wiphy = hw->wiphy; in mt7996_init_wiphy_band()
377 int n_radios = hw->wiphy->n_radio; in mt7996_init_wiphy_band()
378 struct wiphy_radio_freq_range *freq = &dev->radio_freqs[n_radios]; in mt7996_init_wiphy_band()
379 struct wiphy_radio *radio = &dev->radios[n_radios]; in mt7996_init_wiphy_band()
381 phy->slottime = 9; in mt7996_init_wiphy_band()
382 phy->beacon_rate = -1; in mt7996_init_wiphy_band()
384 if (phy->mt76->cap.has_2ghz) { in mt7996_init_wiphy_band()
385 phy->mt76->sband_2g.sband.ht_cap.cap |= in mt7996_init_wiphy_band()
388 phy->mt76->sband_2g.sband.ht_cap.ampdu_density = in mt7996_init_wiphy_band()
390 freq->start_freq = 2400000; in mt7996_init_wiphy_band()
391 freq->end_freq = 2500000; in mt7996_init_wiphy_band()
392 } else if (phy->mt76->cap.has_5ghz) { in mt7996_init_wiphy_band()
393 phy->mt76->sband_5g.sband.ht_cap.cap |= in mt7996_init_wiphy_band()
397 phy->mt76->sband_5g.sband.vht_cap.cap |= in mt7996_init_wiphy_band()
402 phy->mt76->sband_5g.sband.ht_cap.ampdu_density = in mt7996_init_wiphy_band()
406 freq->start_freq = 5000000; in mt7996_init_wiphy_band()
407 freq->end_freq = 5900000; in mt7996_init_wiphy_band()
408 } else if (phy->mt76->cap.has_6ghz) { in mt7996_init_wiphy_band()
409 freq->start_freq = 5900000; in mt7996_init_wiphy_band()
410 freq->end_freq = 7200000; in mt7996_init_wiphy_band()
415 dev->radio_phy[n_radios] = phy; in mt7996_init_wiphy_band()
416 radio->freq_range = freq; in mt7996_init_wiphy_band()
417 radio->n_freq_range = 1; in mt7996_init_wiphy_band()
418 radio->iface_combinations = &if_comb; in mt7996_init_wiphy_band()
419 radio->n_iface_combinations = 1; in mt7996_init_wiphy_band()
420 hw->wiphy->n_radio++; in mt7996_init_wiphy_band()
422 wiphy->available_antennas_rx |= phy->mt76->chainmask; in mt7996_init_wiphy_band()
423 wiphy->available_antennas_tx |= phy->mt76->chainmask; in mt7996_init_wiphy_band()
425 mt76_set_stream_caps(phy->mt76, true); in mt7996_init_wiphy_band()
426 mt7996_set_stream_vht_txbf_caps(phy); in mt7996_init_wiphy_band()
427 mt7996_set_stream_he_eht_caps(phy); in mt7996_init_wiphy_band()
428 mt7996_init_txpower(phy); in mt7996_init_wiphy_band()
435 struct mt76_dev *mdev = &dev->mt76; in mt7996_init_wiphy()
436 struct wiphy *wiphy = hw->wiphy; in mt7996_init_wiphy()
437 u16 max_subframes = dev->has_eht ? IEEE80211_MAX_AMPDU_BUF_EHT : in mt7996_init_wiphy()
440 hw->queues = 4; in mt7996_init_wiphy()
441 hw->max_rx_aggregation_subframes = max_subframes; in mt7996_init_wiphy()
442 hw->max_tx_aggregation_subframes = max_subframes; in mt7996_init_wiphy()
443 hw->netdev_features = NETIF_F_RXCSUM; in mt7996_init_wiphy()
445 hw->netdev_features |= NETIF_F_HW_TC; in mt7996_init_wiphy()
447 hw->radiotap_timestamp.units_pos = in mt7996_init_wiphy()
450 hw->sta_data_size = sizeof(struct mt7996_sta); in mt7996_init_wiphy()
451 hw->vif_data_size = sizeof(struct mt7996_vif); in mt7996_init_wiphy()
452 hw->chanctx_data_size = sizeof(struct mt76_chanctx); in mt7996_init_wiphy()
454 wiphy->iface_combinations = &if_comb_global; in mt7996_init_wiphy()
455 wiphy->n_iface_combinations = 1; in mt7996_init_wiphy()
457 wiphy->radio = dev->radios; in mt7996_init_wiphy()
459 wiphy->reg_notifier = mt7996_regd_notifier; in mt7996_init_wiphy()
460 wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH; in mt7996_init_wiphy()
461 wiphy->mbssid_max_interfaces = 16; in mt7996_init_wiphy()
476 (!mdev->dev->of_node || in mt7996_init_wiphy()
477 !of_property_read_bool(mdev->dev->of_node, in mt7996_init_wiphy()
478 "mediatek,disable-radar-background"))) in mt7996_init_wiphy()
488 hw->max_tx_fragments = 4; in mt7996_init_wiphy()
492 dev->mphy.leds.cdev.brightness_set = mt7996_led_set_brightness; in mt7996_init_wiphy()
493 dev->mphy.leds.cdev.blink_set = mt7996_led_set_blink; in mt7996_init_wiphy()
496 wiphy->max_scan_ssids = 4; in mt7996_init_wiphy()
497 wiphy->max_scan_ie_len = IEEE80211_MAX_DATA_LEN; in mt7996_init_wiphy()
499 mt7996_init_wiphy_band(hw, &dev->phy); in mt7996_init_wiphy()
528 /* filter out non-resp frames and get instanstaeous signal reporting */ in mt7996_mac_init_band()
551 mt7996_mcu_set_fixed_rate_table(&dev->phy, idx, rate, false); in mt7996_mac_init_basic_rates()
567 i = dev->mphy.leds.pin ? MT_LED_GPIO_MUX3 : MT_LED_GPIO_MUX2; in mt7996_mac_init()
572 if (is_mt7996(&dev->mt76)) in mt7996_mac_init()
576 dev->hif2 ? 7 : 0); in mt7996_mac_init()
578 if (dev->has_rro) { in mt7996_mac_init()
622 struct mt7996_phy *phy; in mt7996_register_phy() local
626 struct mtk_wed_device *wed = &dev->mt76.mmio.wed; in mt7996_register_phy()
631 if (is_mt7996(&dev->mt76) && band == MT_BAND2 && dev->hif2) { in mt7996_register_phy()
632 hif1_ofs = MT_WFDMA0_PCIE1(0) - MT_WFDMA0(0); in mt7996_register_phy()
633 wed = &dev->mt76.mmio.wed_hif2; in mt7996_register_phy()
636 mphy = mt76_alloc_radio_phy(&dev->mt76, sizeof(*phy), band); in mt7996_register_phy()
638 return -ENOMEM; in mt7996_register_phy()
640 phy = mphy->priv; in mt7996_register_phy()
641 phy->dev = dev; in mt7996_register_phy()
642 phy->mt76 = mphy; in mt7996_register_phy()
643 mphy->dev->phys[band] = mphy; in mt7996_register_phy()
645 INIT_DELAYED_WORK(&mphy->mac_work, mt7996_mac_work); in mt7996_register_phy()
647 ret = mt7996_eeprom_parse_hw_cap(dev, phy); in mt7996_register_phy()
652 memcpy(mphy->macaddr, dev->mt76.eeprom.data + mac_ofs, ETH_ALEN); in mt7996_register_phy()
653 /* Make the extra PHY MAC address local without overlapping with in mt7996_register_phy()
656 if (!is_valid_ether_addr(mphy->macaddr)) { in mt7996_register_phy()
657 memcpy(mphy->macaddr, dev->mt76.eeprom.data + MT_EE_MAC_ADDR, in mt7996_register_phy()
659 mphy->macaddr[0] |= 2; in mt7996_register_phy()
660 mphy->macaddr[0] ^= BIT(7); in mt7996_register_phy()
662 mphy->macaddr[0] ^= BIT(6); in mt7996_register_phy()
666 /* init wiphy according to mphy and phy */ in mt7996_register_phy()
667 mt7996_init_wiphy_band(mphy->hw, phy); in mt7996_register_phy()
668 ret = mt7996_init_tx_queues(mphy->priv, in mt7996_register_phy()
681 if (wed == &dev->mt76.mmio.wed_hif2 && mtk_wed_device_active(wed)) { in mt7996_register_phy()
682 u32 irq_mask = dev->mt76.mmio.irqmask | MT_INT_TX_DONE_BAND2; in mt7996_register_phy()
685 mtk_wed_device_start(&dev->mt76.mmio.wed_hif2, irq_mask); in mt7996_register_phy()
691 mphy->dev->phys[band] = NULL; in mt7996_register_phy()
696 mt7996_unregister_phy(struct mt7996_phy *phy) in mt7996_unregister_phy() argument
698 if (phy) in mt7996_unregister_phy()
699 mt7996_unregister_thermal(phy); in mt7996_unregister_phy()
724 struct mtk_wed_device *wed = &dev->mt76.mmio.wed; in mt7996_wed_rro_init()
730 if (!dev->has_rro) in mt7996_wed_rro_init()
736 for (i = 0; i < ARRAY_SIZE(dev->wed_rro.ba_bitmap); i++) { in mt7996_wed_rro_init()
737 ptr = dmam_alloc_coherent(dev->mt76.dma_dev, in mt7996_wed_rro_init()
739 &dev->wed_rro.ba_bitmap[i].phy_addr, in mt7996_wed_rro_init()
742 return -ENOMEM; in mt7996_wed_rro_init()
744 dev->wed_rro.ba_bitmap[i].ptr = ptr; in mt7996_wed_rro_init()
747 for (i = 0; i < ARRAY_SIZE(dev->wed_rro.addr_elem); i++) { in mt7996_wed_rro_init()
750 ptr = dmam_alloc_coherent(dev->mt76.dma_dev, in mt7996_wed_rro_init()
752 &dev->wed_rro.addr_elem[i].phy_addr, in mt7996_wed_rro_init()
755 return -ENOMEM; in mt7996_wed_rro_init()
757 dev->wed_rro.addr_elem[i].ptr = ptr; in mt7996_wed_rro_init()
758 memset(dev->wed_rro.addr_elem[i].ptr, 0, in mt7996_wed_rro_init()
761 addr = dev->wed_rro.addr_elem[i].ptr; in mt7996_wed_rro_init()
763 addr->signature = 0xff; in mt7996_wed_rro_init()
767 wed->wlan.ind_cmd.addr_elem_phys[i] = in mt7996_wed_rro_init()
768 dev->wed_rro.addr_elem[i].phy_addr; in mt7996_wed_rro_init()
771 ptr = dmam_alloc_coherent(dev->mt76.dma_dev, in mt7996_wed_rro_init()
773 &dev->wed_rro.session.phy_addr, in mt7996_wed_rro_init()
776 return -ENOMEM; in mt7996_wed_rro_init()
778 dev->wed_rro.session.ptr = ptr; in mt7996_wed_rro_init()
779 addr = dev->wed_rro.session.ptr; in mt7996_wed_rro_init()
781 addr->signature = 0xff; in mt7996_wed_rro_init()
791 dev->wed_rro.ba_bitmap[0].phy_addr); in mt7996_wed_rro_init()
794 dev->wed_rro.ba_bitmap[1].phy_addr); in mt7996_wed_rro_init()
798 for (i = 0; i < ARRAY_SIZE(dev->wed_rro.addr_elem); i++) { in mt7996_wed_rro_init()
799 mt76_wr(dev, reg, dev->wed_rro.addr_elem[i].phy_addr >> 4); in mt7996_wed_rro_init()
803 /* setup Address element address - separate address segment mode */ in mt7996_wed_rro_init()
807 wed->wlan.ind_cmd.win_size = ffs(MT7996_RRO_WINDOW_MAX_LEN) - 6; in mt7996_wed_rro_init()
808 wed->wlan.ind_cmd.particular_sid = MT7996_RRO_MAX_SESSION; in mt7996_wed_rro_init()
809 wed->wlan.ind_cmd.particular_se_phys = dev->wed_rro.session.phy_addr; in mt7996_wed_rro_init()
810 wed->wlan.ind_cmd.se_group_nums = MT7996_RRO_ADDR_ELEM_LEN; in mt7996_wed_rro_init()
811 wed->wlan.ind_cmd.ack_sn_addr = MT_RRO_ACK_SN_CTRL; in mt7996_wed_rro_init()
819 mt76_wr(dev, MT_RRO_PARTICULAR_CFG0, dev->wed_rro.session.phy_addr); in mt7996_wed_rro_init()
840 if (!dev->has_rro) in mt7996_wed_rro_free()
843 if (!mtk_wed_device_active(&dev->mt76.mmio.wed)) in mt7996_wed_rro_free()
846 for (i = 0; i < ARRAY_SIZE(dev->wed_rro.ba_bitmap); i++) { in mt7996_wed_rro_free()
847 if (!dev->wed_rro.ba_bitmap[i].ptr) in mt7996_wed_rro_free()
850 dmam_free_coherent(dev->mt76.dma_dev, in mt7996_wed_rro_free()
852 dev->wed_rro.ba_bitmap[i].ptr, in mt7996_wed_rro_free()
853 dev->wed_rro.ba_bitmap[i].phy_addr); in mt7996_wed_rro_free()
856 for (i = 0; i < ARRAY_SIZE(dev->wed_rro.addr_elem); i++) { in mt7996_wed_rro_free()
857 if (!dev->wed_rro.addr_elem[i].ptr) in mt7996_wed_rro_free()
860 dmam_free_coherent(dev->mt76.dma_dev, in mt7996_wed_rro_free()
863 dev->wed_rro.addr_elem[i].ptr, in mt7996_wed_rro_free()
864 dev->wed_rro.addr_elem[i].phy_addr); in mt7996_wed_rro_free()
867 if (!dev->wed_rro.session.ptr) in mt7996_wed_rro_free()
870 dmam_free_coherent(dev->mt76.dma_dev, in mt7996_wed_rro_free()
873 dev->wed_rro.session.ptr, in mt7996_wed_rro_free()
874 dev->wed_rro.session.phy_addr); in mt7996_wed_rro_free()
887 spin_lock_bh(&dev->wed_rro.lock); in mt7996_wed_rro_work()
888 list_splice_init(&dev->wed_rro.poll_list, &list); in mt7996_wed_rro_work()
889 spin_unlock_bh(&dev->wed_rro.lock); in mt7996_wed_rro_work()
897 list_del_init(&e->list); in mt7996_wed_rro_work()
900 void *ptr = dev->wed_rro.session.ptr; in mt7996_wed_rro_work()
904 if (e->id == MT7996_RRO_MAX_SESSION) in mt7996_wed_rro_work()
907 idx = e->id / MT7996_RRO_BA_BITMAP_SESSION_SIZE; in mt7996_wed_rro_work()
908 if (idx >= ARRAY_SIZE(dev->wed_rro.addr_elem)) in mt7996_wed_rro_work()
911 ptr = dev->wed_rro.addr_elem[idx].ptr; in mt7996_wed_rro_work()
913 (e->id % MT7996_RRO_BA_BITMAP_SESSION_SIZE) * in mt7996_wed_rro_work()
917 elem->signature = 0xff; in mt7996_wed_rro_work()
919 mt7996_mcu_wed_rro_reset_sessions(dev, e->id); in mt7996_wed_rro_work()
931 switch (mt76_chip(&dev->mt76)) { in mt7996_variant_type_init()
944 return -EINVAL; in mt7996_variant_type_init()
947 return -EINVAL; in mt7996_variant_type_init()
950 dev->var.type = var_type; in mt7996_variant_type_init()
963 if (is_mt7992(&dev->mt76)) { in mt7996_variant_fem_init()
976 if (ret && ret != -EINVAL) in mt7996_variant_fem_init()
987 dev->var.fem = MT7996_FEM_INT; in mt7996_variant_fem_init()
989 dev->var.fem = MT7996_FEM_MIX; in mt7996_variant_fem_init()
991 dev->var.fem = MT7996_FEM_EXT; in mt7996_variant_fem_init()
1001 if (is_mt7992(&dev->mt76)) { in mt7996_init_hardware()
1006 INIT_WORK(&dev->init_work, mt7996_init_work); in mt7996_init_hardware()
1007 INIT_WORK(&dev->wed_rro.work, mt7996_wed_rro_work); in mt7996_init_hardware()
1008 INIT_LIST_HEAD(&dev->wed_rro.poll_list); in mt7996_init_hardware()
1009 spin_lock_init(&dev->wed_rro.lock); in mt7996_init_hardware()
1019 set_bit(MT76_STATE_INITIALIZED, &dev->mphy.state); in mt7996_init_hardware()
1038 idx = mt76_wcid_alloc(dev->mt76.wcid_mask, MT7996_WTBL_STA); in mt7996_init_hardware()
1040 return -ENOSPC; in mt7996_init_hardware()
1042 dev->mt76.global_wcid.idx = idx; in mt7996_init_hardware()
1043 dev->mt76.global_wcid.hw_key_idx = -1; in mt7996_init_hardware()
1044 dev->mt76.global_wcid.tx_info |= MT_WCID_TX_INFO_SET; in mt7996_init_hardware()
1045 rcu_assign_pointer(dev->mt76.wcid[idx], &dev->mt76.global_wcid); in mt7996_init_hardware()
1050 void mt7996_set_stream_vht_txbf_caps(struct mt7996_phy *phy) in mt7996_set_stream_vht_txbf_caps() argument
1055 if (!phy->mt76->cap.has_5ghz) in mt7996_set_stream_vht_txbf_caps()
1058 sts = hweight16(phy->mt76->chainmask); in mt7996_set_stream_vht_txbf_caps()
1059 cap = &phy->mt76->sband_5g.sband.vht_cap.cap; in mt7996_set_stream_vht_txbf_caps()
1064 if (is_mt7996(phy->mt76->dev)) in mt7996_set_stream_vht_txbf_caps()
1078 FIELD_PREP(IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK, sts - 1); in mt7996_set_stream_vht_txbf_caps()
1082 mt7996_set_stream_he_txbf_caps(struct mt7996_phy *phy, in mt7996_set_stream_he_txbf_caps() argument
1086 struct ieee80211_he_cap_elem *elem = &he_cap->he_cap_elem; in mt7996_set_stream_he_txbf_caps()
1087 int sts = hweight16(phy->mt76->chainmask); in mt7996_set_stream_he_txbf_caps()
1089 u8 c; in mt7996_set_stream_he_txbf_caps() local
1096 elem->phy_cap_info[3] &= ~IEEE80211_HE_PHY_CAP3_SU_BEAMFORMER; in mt7996_set_stream_he_txbf_caps()
1097 elem->phy_cap_info[4] &= ~IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER; in mt7996_set_stream_he_txbf_caps()
1099 c = IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK | in mt7996_set_stream_he_txbf_caps()
1101 elem->phy_cap_info[5] &= ~c; in mt7996_set_stream_he_txbf_caps()
1103 c = IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMING_FB | in mt7996_set_stream_he_txbf_caps()
1105 elem->phy_cap_info[6] &= ~c; in mt7996_set_stream_he_txbf_caps()
1107 elem->phy_cap_info[7] &= ~IEEE80211_HE_PHY_CAP7_MAX_NC_MASK; in mt7996_set_stream_he_txbf_caps()
1109 c = IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US | in mt7996_set_stream_he_txbf_caps()
1112 elem->phy_cap_info[2] |= c; in mt7996_set_stream_he_txbf_caps()
1114 c = IEEE80211_HE_PHY_CAP4_SU_BEAMFORMEE; in mt7996_set_stream_he_txbf_caps()
1116 if (is_mt7996(phy->mt76->dev)) in mt7996_set_stream_he_txbf_caps()
1117 c |= IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_4 | in mt7996_set_stream_he_txbf_caps()
1120 c |= IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_5 | in mt7996_set_stream_he_txbf_caps()
1123 elem->phy_cap_info[4] |= c; in mt7996_set_stream_he_txbf_caps()
1126 c = IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_42_SU | in mt7996_set_stream_he_txbf_caps()
1130 c |= IEEE80211_HE_PHY_CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO; in mt7996_set_stream_he_txbf_caps()
1132 elem->phy_cap_info[6] |= c; in mt7996_set_stream_he_txbf_caps()
1138 elem->phy_cap_info[7] |= min_t(int, sts - 1, 2) << 3; in mt7996_set_stream_he_txbf_caps()
1143 elem->phy_cap_info[3] |= IEEE80211_HE_PHY_CAP3_SU_BEAMFORMER; in mt7996_set_stream_he_txbf_caps()
1145 c = FIELD_PREP(IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK, in mt7996_set_stream_he_txbf_caps()
1146 sts - 1) | in mt7996_set_stream_he_txbf_caps()
1148 sts - 1) * non_2g); in mt7996_set_stream_he_txbf_caps()
1150 elem->phy_cap_info[5] |= c; in mt7996_set_stream_he_txbf_caps()
1155 elem->phy_cap_info[4] |= IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER; in mt7996_set_stream_he_txbf_caps()
1157 c = IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMING_FB | in mt7996_set_stream_he_txbf_caps()
1159 elem->phy_cap_info[6] |= c; in mt7996_set_stream_he_txbf_caps()
1161 c = 0; in mt7996_set_stream_he_txbf_caps()
1163 c |= IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ | in mt7996_set_stream_he_txbf_caps()
1165 elem->phy_cap_info[7] |= c; in mt7996_set_stream_he_txbf_caps()
1169 mt7996_init_he_caps(struct mt7996_phy *phy, enum nl80211_band band, in mt7996_init_he_caps() argument
1173 struct ieee80211_sta_he_cap *he_cap = &data->he_cap; in mt7996_init_he_caps()
1174 struct ieee80211_he_cap_elem *he_cap_elem = &he_cap->he_cap_elem; in mt7996_init_he_caps()
1175 struct ieee80211_he_mcs_nss_supp *he_mcs = &he_cap->he_mcs_nss_supp; in mt7996_init_he_caps()
1176 int i, nss = hweight8(phy->mt76->antenna_mask); in mt7996_init_he_caps()
1186 he_cap->has_he = true; in mt7996_init_he_caps()
1188 he_cap_elem->mac_cap_info[0] = IEEE80211_HE_MAC_CAP0_HTC_HE; in mt7996_init_he_caps()
1189 he_cap_elem->mac_cap_info[3] = IEEE80211_HE_MAC_CAP3_OMI_CONTROL | in mt7996_init_he_caps()
1191 he_cap_elem->mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU; in mt7996_init_he_caps()
1194 he_cap_elem->phy_cap_info[0] = in mt7996_init_he_caps()
1197 he_cap_elem->phy_cap_info[0] = in mt7996_init_he_caps()
1201 he_cap_elem->phy_cap_info[1] = IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD; in mt7996_init_he_caps()
1202 he_cap_elem->phy_cap_info[2] = IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ | in mt7996_init_he_caps()
1205 he_cap_elem->phy_cap_info[7] = in mt7996_init_he_caps()
1210 he_cap_elem->mac_cap_info[0] |= IEEE80211_HE_MAC_CAP0_TWT_RES; in mt7996_init_he_caps()
1211 he_cap_elem->mac_cap_info[2] |= IEEE80211_HE_MAC_CAP2_BSR; in mt7996_init_he_caps()
1212 he_cap_elem->mac_cap_info[4] |= IEEE80211_HE_MAC_CAP4_BQR; in mt7996_init_he_caps()
1213 he_cap_elem->mac_cap_info[5] |= in mt7996_init_he_caps()
1215 he_cap_elem->phy_cap_info[3] |= in mt7996_init_he_caps()
1218 he_cap_elem->phy_cap_info[6] |= in mt7996_init_he_caps()
1221 he_cap_elem->phy_cap_info[9] |= in mt7996_init_he_caps()
1226 he_cap_elem->mac_cap_info[1] |= in mt7996_init_he_caps()
1230 he_cap_elem->phy_cap_info[0] |= in mt7996_init_he_caps()
1233 he_cap_elem->phy_cap_info[0] |= in mt7996_init_he_caps()
1236 he_cap_elem->phy_cap_info[1] |= in mt7996_init_he_caps()
1239 he_cap_elem->phy_cap_info[3] |= in mt7996_init_he_caps()
1242 he_cap_elem->phy_cap_info[6] |= in mt7996_init_he_caps()
1246 he_cap_elem->phy_cap_info[7] |= in mt7996_init_he_caps()
1248 he_cap_elem->phy_cap_info[8] |= in mt7996_init_he_caps()
1253 he_cap_elem->phy_cap_info[9] |= in mt7996_init_he_caps()
1265 he_mcs->rx_mcs_80 = cpu_to_le16(mcs_map); in mt7996_init_he_caps()
1266 he_mcs->tx_mcs_80 = cpu_to_le16(mcs_map); in mt7996_init_he_caps()
1267 he_mcs->rx_mcs_160 = cpu_to_le16(mcs_map); in mt7996_init_he_caps()
1268 he_mcs->tx_mcs_160 = cpu_to_le16(mcs_map); in mt7996_init_he_caps()
1270 mt7996_set_stream_he_txbf_caps(phy, he_cap, iftype, band); in mt7996_init_he_caps()
1272 memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres)); in mt7996_init_he_caps()
1273 if (he_cap_elem->phy_cap_info[6] & in mt7996_init_he_caps()
1275 mt76_connac_gen_ppe_thresh(he_cap->ppe_thres, nss, band); in mt7996_init_he_caps()
1277 he_cap_elem->phy_cap_info[9] |= in mt7996_init_he_caps()
1293 data->he_6ghz_capa.capa = cpu_to_le16(cap); in mt7996_init_he_caps()
1298 mt7996_init_eht_caps(struct mt7996_phy *phy, enum nl80211_band band, in mt7996_init_eht_caps() argument
1302 struct ieee80211_sta_eht_cap *eht_cap = &data->eht_cap; in mt7996_init_eht_caps()
1303 struct ieee80211_eht_cap_elem_fixed *eht_cap_elem = &eht_cap->eht_cap_elem; in mt7996_init_eht_caps()
1304 struct ieee80211_eht_mcs_nss_supp *eht_nss = &eht_cap->eht_mcs_nss_supp; in mt7996_init_eht_caps()
1305 enum nl80211_chan_width width = phy->mt76->chandef.width; in mt7996_init_eht_caps()
1306 int nss = hweight8(phy->mt76->antenna_mask); in mt7996_init_eht_caps()
1307 int sts = hweight16(phy->mt76->chainmask); in mt7996_init_eht_caps()
1310 if (!phy->dev->has_eht) in mt7996_init_eht_caps()
1313 eht_cap->has_eht = true; in mt7996_init_eht_caps()
1315 eht_cap_elem->mac_cap_info[0] = in mt7996_init_eht_caps()
1321 eht_cap_elem->phy_cap_info[0] = in mt7996_init_eht_caps()
1327 val = is_mt7992(phy->mt76->dev) ? 4 : 3; in mt7996_init_eht_caps()
1328 eht_cap_elem->phy_cap_info[0] |= in mt7996_init_eht_caps()
1332 eht_cap_elem->phy_cap_info[1] = in mt7996_init_eht_caps()
1336 eht_cap_elem->phy_cap_info[2] = in mt7996_init_eht_caps()
1337 u8_encode_bits(sts - 1, IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_80MHZ_MASK); in mt7996_init_eht_caps()
1340 eht_cap_elem->phy_cap_info[1] |= in mt7996_init_eht_caps()
1344 eht_cap_elem->phy_cap_info[2] |= in mt7996_init_eht_caps()
1345 u8_encode_bits(sts - 1, in mt7996_init_eht_caps()
1350 eht_cap_elem->phy_cap_info[0] |= in mt7996_init_eht_caps()
1353 eht_cap_elem->phy_cap_info[1] |= in mt7996_init_eht_caps()
1357 eht_cap_elem->phy_cap_info[2] |= in mt7996_init_eht_caps()
1358 u8_encode_bits(sts - 1, in mt7996_init_eht_caps()
1362 eht_cap_elem->phy_cap_info[3] = in mt7996_init_eht_caps()
1368 eht_cap_elem->phy_cap_info[4] = in mt7996_init_eht_caps()
1370 u8_encode_bits(min_t(int, sts - 1, 2), in mt7996_init_eht_caps()
1373 eht_cap_elem->phy_cap_info[5] = in mt7996_init_eht_caps()
1382 eht_cap_elem->phy_cap_info[6] = in mt7996_init_eht_caps()
1388 eht_nss->bw._##_bw.rx_tx_mcs9_max_nss = _val; \ in mt7996_init_eht_caps()
1389 eht_nss->bw._##_bw.rx_tx_mcs11_max_nss = _val; \ in mt7996_init_eht_caps()
1390 eht_nss->bw._##_bw.rx_tx_mcs13_max_nss = _val; \ in mt7996_init_eht_caps()
1402 eht_cap_elem->phy_cap_info[3] |= in mt7996_init_eht_caps()
1406 eht_cap_elem->phy_cap_info[7] = in mt7996_init_eht_caps()
1413 eht_cap_elem->phy_cap_info[7] |= in mt7996_init_eht_caps()
1420 eht_cap_elem->phy_cap_info[7] |= in mt7996_init_eht_caps()
1426 __mt7996_set_stream_he_eht_caps(struct mt7996_phy *phy, in __mt7996_set_stream_he_eht_caps() argument
1430 struct ieee80211_sband_iftype_data *data = phy->iftype[band]; in __mt7996_set_stream_he_eht_caps()
1446 mt7996_init_he_caps(phy, band, &data[n], i); in __mt7996_set_stream_he_eht_caps()
1447 mt7996_init_eht_caps(phy, band, &data[n], i); in __mt7996_set_stream_he_eht_caps()
1455 void mt7996_set_stream_he_eht_caps(struct mt7996_phy *phy) in mt7996_set_stream_he_eht_caps() argument
1457 if (phy->mt76->cap.has_2ghz) in mt7996_set_stream_he_eht_caps()
1458 __mt7996_set_stream_he_eht_caps(phy, &phy->mt76->sband_2g.sband, in mt7996_set_stream_he_eht_caps()
1461 if (phy->mt76->cap.has_5ghz) in mt7996_set_stream_he_eht_caps()
1462 __mt7996_set_stream_he_eht_caps(phy, &phy->mt76->sband_5g.sband, in mt7996_set_stream_he_eht_caps()
1465 if (phy->mt76->cap.has_6ghz) in mt7996_set_stream_he_eht_caps()
1466 __mt7996_set_stream_he_eht_caps(phy, &phy->mt76->sband_6g.sband, in mt7996_set_stream_he_eht_caps()
1473 struct mt7996_phy *phy; in mt7996_register_device() local
1476 dev->phy.dev = dev; in mt7996_register_device()
1477 dev->phy.mt76 = &dev->mt76.phy; in mt7996_register_device()
1478 dev->mt76.phy.priv = &dev->phy; in mt7996_register_device()
1479 INIT_WORK(&dev->rc_work, mt7996_mac_sta_rc_work); in mt7996_register_device()
1480 INIT_DELAYED_WORK(&dev->mphy.mac_work, mt7996_mac_work); in mt7996_register_device()
1481 INIT_LIST_HEAD(&dev->sta_rc_list); in mt7996_register_device()
1482 INIT_LIST_HEAD(&dev->twt_list); in mt7996_register_device()
1484 init_waitqueue_head(&dev->reset_wait); in mt7996_register_device()
1485 INIT_WORK(&dev->reset_work, mt7996_mac_reset_work); in mt7996_register_device()
1486 INIT_WORK(&dev->dump_work, mt7996_mac_dump_work); in mt7996_register_device()
1487 mutex_init(&dev->dump_mutex); in mt7996_register_device()
1493 mt7996_init_wiphy(hw, &dev->mt76.mmio.wed); in mt7996_register_device()
1503 ret = mt76_register_device(&dev->mt76, true, mt76_rates, in mt7996_register_device()
1508 mt7996_for_each_phy(dev, phy) in mt7996_register_device()
1509 mt7996_thermal_init(phy); in mt7996_register_device()
1511 ieee80211_queue_work(mt76_hw(dev), &dev->init_work); in mt7996_register_device()
1513 dev->recovery.hw_init_done = true; in mt7996_register_device()
1526 cancel_work_sync(&dev->init_work); in mt7996_register_device()
1533 cancel_work_sync(&dev->wed_rro.work); in mt7996_unregister_device()
1536 mt7996_unregister_thermal(&dev->phy); in mt7996_unregister_device()
1538 mt76_unregister_device(&dev->mt76); in mt7996_unregister_device()
1543 tasklet_disable(&dev->mt76.irq_tasklet); in mt7996_unregister_device()
1545 mt76_free_device(&dev->mt76); in mt7996_unregister_device()