Lines Matching full:phy
205 static int mt76_led_init(struct mt76_phy *phy) in mt76_led_init() argument
207 struct mt76_dev *dev = phy->dev; in mt76_led_init()
208 struct ieee80211_hw *hw = phy->hw; in mt76_led_init()
211 if (!phy->leds.cdev.brightness_set && !phy->leds.cdev.blink_set) in mt76_led_init()
223 if (phy == &dev->phy) { in mt76_led_init()
227 phy->leds.pin = led_pin; in mt76_led_init()
229 phy->leds.al = in mt76_led_init()
236 snprintf(phy->leds.name, sizeof(phy->leds.name), "mt76-%s", in mt76_led_init()
239 phy->leds.cdev.name = phy->leds.name; in mt76_led_init()
240 phy->leds.cdev.default_trigger = in mt76_led_init()
247 "registering led '%s'\n", phy->leds.name); in mt76_led_init()
249 return led_classdev_register(dev->dev, &phy->leds.cdev); in mt76_led_init()
252 static void mt76_led_cleanup(struct mt76_phy *phy) in mt76_led_cleanup() argument
254 if (!phy->leds.cdev.brightness_set && !phy->leds.cdev.blink_set) in mt76_led_cleanup()
257 led_classdev_unregister(&phy->leds.cdev); in mt76_led_cleanup()
261 static void mt76_init_stream_cap(struct mt76_phy *phy, in mt76_init_stream_cap() argument
266 int i, nstream = hweight8(phy->antenna_mask); in mt76_init_stream_cap()
298 if (ieee80211_hw_check(phy->hw, SUPPORTS_VHT_EXT_NSS_BW)) in mt76_init_stream_cap()
303 void mt76_set_stream_caps(struct mt76_phy *phy, bool vht) in mt76_set_stream_caps() argument
305 if (phy->cap.has_2ghz) in mt76_set_stream_caps()
306 mt76_init_stream_cap(phy, &phy->sband_2g.sband, false); in mt76_set_stream_caps()
307 if (phy->cap.has_5ghz) in mt76_set_stream_caps()
308 mt76_init_stream_cap(phy, &phy->sband_5g.sband, vht); in mt76_set_stream_caps()
309 if (phy->cap.has_6ghz) in mt76_set_stream_caps()
310 mt76_init_stream_cap(phy, &phy->sband_6g.sband, vht); in mt76_set_stream_caps()
315 mt76_init_sband(struct mt76_phy *phy, struct mt76_sband *msband, in mt76_init_sband() argument
323 struct mt76_dev *dev = phy->dev; in mt76_init_sband()
356 mt76_init_stream_cap(phy, sband, vht); in mt76_init_sband()
372 mt76_init_sband_2g(struct mt76_phy *phy, struct ieee80211_rate *rates, in mt76_init_sband_2g() argument
375 phy->hw->wiphy->bands[NL80211_BAND_2GHZ] = &phy->sband_2g.sband; in mt76_init_sband_2g()
377 return mt76_init_sband(phy, &phy->sband_2g, mt76_channels_2ghz, in mt76_init_sband_2g()
383 mt76_init_sband_5g(struct mt76_phy *phy, struct ieee80211_rate *rates, in mt76_init_sband_5g() argument
386 phy->hw->wiphy->bands[NL80211_BAND_5GHZ] = &phy->sband_5g.sband; in mt76_init_sband_5g()
388 return mt76_init_sband(phy, &phy->sband_5g, mt76_channels_5ghz, in mt76_init_sband_5g()
394 mt76_init_sband_6g(struct mt76_phy *phy, struct ieee80211_rate *rates, in mt76_init_sband_6g() argument
397 phy->hw->wiphy->bands[NL80211_BAND_6GHZ] = &phy->sband_6g.sband; in mt76_init_sband_6g()
399 return mt76_init_sband(phy, &phy->sband_6g, mt76_channels_6ghz, in mt76_init_sband_6g()
405 mt76_check_sband(struct mt76_phy *phy, struct mt76_sband *msband, in mt76_check_sband() argument
424 cfg80211_chandef_create(&phy->chandef, &sband->channels[0], in mt76_check_sband()
426 phy->chan_state = &msband->chan[0]; in mt76_check_sband()
427 phy->dev->band_phys[band] = phy; in mt76_check_sband()
432 if (phy->hw->wiphy->bands[band] == sband) in mt76_check_sband()
433 phy->hw->wiphy->bands[band] = NULL; in mt76_check_sband()
437 mt76_phy_init(struct mt76_phy *phy, struct ieee80211_hw *hw) in mt76_phy_init() argument
439 struct mt76_dev *dev = phy->dev; in mt76_phy_init()
442 INIT_LIST_HEAD(&phy->tx_list); in mt76_phy_init()
443 spin_lock_init(&phy->tx_lock); in mt76_phy_init()
444 INIT_DELAYED_WORK(&phy->roc_work, mt76_roc_complete_work); in mt76_phy_init()
446 if ((void *)phy != hw->priv) in mt76_phy_init()
450 SET_IEEE80211_PERM_ADDR(hw, phy->macaddr); in mt76_phy_init()
463 wiphy->available_antennas_tx = phy->antenna_mask; in mt76_phy_init()
465 wiphy->available_antennas_rx = phy->antenna_mask; in mt76_phy_init()
468 phy->frp = devm_kcalloc(dev->dev, wiphy->sar_capa->num_freq_ranges, in mt76_phy_init()
471 if (!phy->frp) in mt76_phy_init()
506 struct ieee80211_hw *hw = dev->phy.hw; in mt76_alloc_radio_phy()
508 struct mt76_phy *phy; in mt76_alloc_radio_phy() local
510 phy_size = ALIGN(sizeof(*phy), 8); in mt76_alloc_radio_phy()
511 phy = devm_kzalloc(dev->dev, size + phy_size, GFP_KERNEL); in mt76_alloc_radio_phy()
512 if (!phy) in mt76_alloc_radio_phy()
515 phy->dev = dev; in mt76_alloc_radio_phy()
516 phy->hw = hw; in mt76_alloc_radio_phy()
518 phy->priv = (void *)phy + phy_size; in mt76_alloc_radio_phy()
520 phy->priv = (u8 *)phy + phy_size; in mt76_alloc_radio_phy()
522 phy->band_idx = band_idx; in mt76_alloc_radio_phy()
524 return phy; in mt76_alloc_radio_phy()
534 struct mt76_phy *phy; in mt76_alloc_phy() local
536 phy_size = ALIGN(sizeof(*phy), 8); in mt76_alloc_phy()
541 phy = hw->priv; in mt76_alloc_phy()
542 phy->dev = dev; in mt76_alloc_phy()
543 phy->hw = hw; in mt76_alloc_phy()
545 phy->priv = hw->priv + phy_size; in mt76_alloc_phy()
547 phy->priv = (u8 *)hw->priv + phy_size; in mt76_alloc_phy()
549 phy->band_idx = band_idx; in mt76_alloc_phy()
562 return phy; in mt76_alloc_phy()
566 int mt76_register_phy(struct mt76_phy *phy, bool vht, in mt76_register_phy() argument
571 ret = mt76_phy_init(phy, phy->hw); in mt76_register_phy()
575 if (phy->cap.has_2ghz) { in mt76_register_phy()
576 ret = mt76_init_sband_2g(phy, rates, n_rates); in mt76_register_phy()
581 if (phy->cap.has_5ghz) { in mt76_register_phy()
582 ret = mt76_init_sband_5g(phy, rates + 4, n_rates - 4, vht); in mt76_register_phy()
587 if (phy->cap.has_6ghz) { in mt76_register_phy()
588 ret = mt76_init_sband_6g(phy, rates + 4, n_rates - 4); in mt76_register_phy()
595 ret = mt76_led_init(phy); in mt76_register_phy()
601 wiphy_read_of_freq_limits(phy->hw->wiphy); in mt76_register_phy()
602 mt76_check_sband(phy, &phy->sband_2g, NL80211_BAND_2GHZ); in mt76_register_phy()
603 mt76_check_sband(phy, &phy->sband_5g, NL80211_BAND_5GHZ); in mt76_register_phy()
604 mt76_check_sband(phy, &phy->sband_6g, NL80211_BAND_6GHZ); in mt76_register_phy()
606 if ((void *)phy == phy->hw->priv) { in mt76_register_phy()
607 ret = ieee80211_register_hw(phy->hw); in mt76_register_phy()
612 set_bit(MT76_STATE_REGISTERED, &phy->state); in mt76_register_phy()
613 phy->dev->phys[phy->band_idx] = phy; in mt76_register_phy()
619 void mt76_unregister_phy(struct mt76_phy *phy) in mt76_unregister_phy() argument
621 struct mt76_dev *dev = phy->dev; in mt76_unregister_phy()
623 if (!test_bit(MT76_STATE_REGISTERED, &phy->state)) in mt76_unregister_phy()
628 mt76_led_cleanup(phy); in mt76_unregister_phy()
631 ieee80211_unregister_hw(phy->hw); in mt76_unregister_phy()
632 dev->phys[phy->band_idx] = NULL; in mt76_unregister_phy()
691 struct mt76_phy *phy; in mt76_alloc_device() local
705 phy = &dev->phy; in mt76_alloc_device()
706 phy->dev = dev; in mt76_alloc_device()
707 phy->hw = hw; in mt76_alloc_device()
708 phy->band_idx = MT_BAND0; in mt76_alloc_device()
709 dev->phys[phy->band_idx] = phy; in mt76_alloc_device()
767 struct mt76_phy *phy = &dev->phy; in mt76_register_device() local
771 mt76_wcid_init(&dev->global_wcid, phy->band_idx); in mt76_register_device()
772 ret = mt76_phy_init(phy, hw); in mt76_register_device()
776 if (phy->cap.has_2ghz) { in mt76_register_device()
777 ret = mt76_init_sband_2g(phy, rates, n_rates); in mt76_register_device()
782 if (phy->cap.has_5ghz) { in mt76_register_device()
783 ret = mt76_init_sband_5g(phy, rates + 4, n_rates - 4, vht); in mt76_register_device()
788 if (phy->cap.has_6ghz) { in mt76_register_device()
789 ret = mt76_init_sband_6g(phy, rates + 4, n_rates - 4); in mt76_register_device()
795 mt76_check_sband(&dev->phy, &phy->sband_2g, NL80211_BAND_2GHZ); in mt76_register_device()
796 mt76_check_sband(&dev->phy, &phy->sband_5g, NL80211_BAND_5GHZ); in mt76_register_device()
797 mt76_check_sband(&dev->phy, &phy->sband_6g, NL80211_BAND_6GHZ); in mt76_register_device()
801 ret = mt76_led_init(phy); in mt76_register_device()
812 set_bit(MT76_STATE_REGISTERED, &phy->state); in mt76_register_device()
825 if (!test_bit(MT76_STATE_REGISTERED, &dev->phy.state)) in mt76_unregister_device()
830 mt76_led_cleanup(&dev->phy); in mt76_unregister_device()
853 static void mt76_reset_phy(struct mt76_phy *phy) in mt76_reset_phy() argument
855 if (!phy) in mt76_reset_phy()
858 INIT_LIST_HEAD(&phy->tx_list); in mt76_reset_phy()
884 mt76_reset_phy(&dev->phy); in mt76_reset_device()
903 return ctx->phy; in mt76_vif_phy()
907 static void mt76_rx_release_amsdu(struct mt76_phy *phy, enum mt76_rxq_id q) in mt76_rx_release_amsdu() argument
909 struct sk_buff *skb = phy->rx_amsdu[q].head; in mt76_rx_release_amsdu()
911 struct mt76_dev *dev = phy->dev; in mt76_rx_release_amsdu()
913 phy->rx_amsdu[q].head = NULL; in mt76_rx_release_amsdu()
914 phy->rx_amsdu[q].tail = NULL; in mt76_rx_release_amsdu()
943 static void mt76_rx_release_burst(struct mt76_phy *phy, enum mt76_rxq_id q, in mt76_rx_release_burst() argument
948 if (phy->rx_amsdu[q].head && in mt76_rx_release_burst()
950 status->seqno != phy->rx_amsdu[q].seqno)) in mt76_rx_release_burst()
951 mt76_rx_release_amsdu(phy, q); in mt76_rx_release_burst()
953 if (!phy->rx_amsdu[q].head) { in mt76_rx_release_burst()
954 phy->rx_amsdu[q].tail = &skb_shinfo(skb)->frag_list; in mt76_rx_release_burst()
955 phy->rx_amsdu[q].seqno = status->seqno; in mt76_rx_release_burst()
956 phy->rx_amsdu[q].head = skb; in mt76_rx_release_burst()
958 *phy->rx_amsdu[q].tail = skb; in mt76_rx_release_burst()
959 phy->rx_amsdu[q].tail = &skb->next; in mt76_rx_release_burst()
963 mt76_rx_release_amsdu(phy, q); in mt76_rx_release_burst()
969 struct mt76_phy *phy = mt76_dev_phy(dev, status->phy_idx); in mt76_rx() local
971 if (!test_bit(MT76_STATE_RUNNING, &phy->state)) { in mt76_rx()
977 if (phy->test.state == MT76_TM_STATE_RX_FRAMES) { in mt76_rx()
978 phy->test.rx_stats.packets[q]++; in mt76_rx()
980 phy->test.rx_stats.fcs_error[q]++; in mt76_rx()
984 mt76_rx_release_burst(phy, q, skb); in mt76_rx()
988 bool mt76_has_tx_pending(struct mt76_phy *phy) in mt76_has_tx_pending() argument
994 q = phy->q_tx[i]; in mt76_has_tx_pending()
1004 mt76_channel_state(struct mt76_phy *phy, struct ieee80211_channel *c) in mt76_channel_state() argument
1010 msband = &phy->sband_2g; in mt76_channel_state()
1012 msband = &phy->sband_6g; in mt76_channel_state()
1014 msband = &phy->sband_5g; in mt76_channel_state()
1020 void mt76_update_survey_active_time(struct mt76_phy *phy, ktime_t time) in mt76_update_survey_active_time() argument
1022 struct mt76_channel_state *state = phy->chan_state; in mt76_update_survey_active_time()
1025 phy->survey_time)); in mt76_update_survey_active_time()
1026 phy->survey_time = time; in mt76_update_survey_active_time()
1030 void mt76_update_survey(struct mt76_phy *phy) in mt76_update_survey() argument
1032 struct mt76_dev *dev = phy->dev; in mt76_update_survey()
1036 dev->drv->update_survey(phy); in mt76_update_survey()
1039 mt76_update_survey_active_time(phy, cur_time); in mt76_update_survey()
1042 struct mt76_channel_state *state = phy->chan_state; in mt76_update_survey()
1052 int __mt76_set_channel(struct mt76_phy *phy, struct cfg80211_chan_def *chandef, in __mt76_set_channel() argument
1055 struct mt76_dev *dev = phy->dev; in __mt76_set_channel()
1059 set_bit(MT76_RESET, &phy->state); in __mt76_set_channel()
1062 wait_event_timeout(dev->tx_wait, !mt76_has_tx_pending(phy), timeout); in __mt76_set_channel()
1063 mt76_update_survey(phy); in __mt76_set_channel()
1065 if (phy->chandef.chan->center_freq != chandef->chan->center_freq || in __mt76_set_channel()
1066 phy->chandef.width != chandef->width) in __mt76_set_channel()
1067 phy->dfs_state = MT_DFS_STATE_UNKNOWN; in __mt76_set_channel()
1069 phy->chandef = *chandef; in __mt76_set_channel()
1070 phy->chan_state = mt76_channel_state(phy, chandef->chan); in __mt76_set_channel()
1071 phy->offchannel = offchannel; in __mt76_set_channel()
1074 phy->main_chandef = *chandef; in __mt76_set_channel()
1076 if (chandef->chan != phy->main_chandef.chan) in __mt76_set_channel()
1077 memset(phy->chan_state, 0, sizeof(*phy->chan_state)); in __mt76_set_channel()
1079 ret = dev->drv->set_channel(phy); in __mt76_set_channel()
1081 clear_bit(MT76_RESET, &phy->state); in __mt76_set_channel()
1088 int mt76_set_channel(struct mt76_phy *phy, struct cfg80211_chan_def *chandef, in mt76_set_channel() argument
1091 struct mt76_dev *dev = phy->dev; in mt76_set_channel()
1094 cancel_delayed_work_sync(&phy->mac_work); in mt76_set_channel()
1097 ret = __mt76_set_channel(phy, chandef, offchannel); in mt76_set_channel()
1103 int mt76_update_channel(struct mt76_phy *phy) in mt76_update_channel() argument
1105 struct ieee80211_hw *hw = phy->hw; in mt76_update_channel()
1109 phy->radar_enabled = hw->conf.radar_enabled; in mt76_update_channel()
1111 return mt76_set_channel(phy, chandef, offchannel); in mt76_update_channel()
1116 mt76_get_survey_sband(struct mt76_phy *phy, int *idx) in mt76_get_survey_sband() argument
1118 if (*idx < phy->sband_2g.sband.n_channels) in mt76_get_survey_sband()
1119 return &phy->sband_2g; in mt76_get_survey_sband()
1121 *idx -= phy->sband_2g.sband.n_channels; in mt76_get_survey_sband()
1122 if (*idx < phy->sband_5g.sband.n_channels) in mt76_get_survey_sband()
1123 return &phy->sband_5g; in mt76_get_survey_sband()
1125 *idx -= phy->sband_5g.sband.n_channels; in mt76_get_survey_sband()
1126 if (*idx < phy->sband_6g.sband.n_channels) in mt76_get_survey_sband()
1127 return &phy->sband_6g; in mt76_get_survey_sband()
1129 *idx -= phy->sband_6g.sband.n_channels; in mt76_get_survey_sband()
1136 struct mt76_phy *phy = hw->priv; in mt76_get_survey() local
1137 struct mt76_dev *dev = phy->dev; in mt76_get_survey()
1148 phy = dev->phys[phy_idx]; in mt76_get_survey()
1149 if (!phy || phy->hw != hw) in mt76_get_survey()
1152 sband = mt76_get_survey_sband(phy, &idx); in mt76_get_survey()
1154 if (idx == 0 && phy->dev->drv->update_survey) in mt76_get_survey()
1155 mt76_update_survey(phy); in mt76_get_survey()
1167 state = mt76_channel_state(phy, chan); in mt76_get_survey()
1176 if (chan == phy->main_chandef.chan) { in mt76_get_survey()
1438 if (!ether_addr_equal(hdr->addr1, dev->phy.macaddr)) in mt76_airtime_check()
1596 mt76_sta_add(struct mt76_phy *phy, struct ieee80211_vif *vif, in mt76_sta_add() argument
1600 struct mt76_dev *dev = phy->dev; in mt76_sta_add()
1622 phy->num_sta++; in mt76_sta_add()
1624 mt76_wcid_init(wcid, phy->band_idx); in mt76_sta_add()
1631 void __mt76_sta_remove(struct mt76_phy *phy, struct ieee80211_vif *vif, in __mt76_sta_remove() argument
1634 struct mt76_dev *dev = phy->dev; in __mt76_sta_remove()
1647 phy->num_sta--; in __mt76_sta_remove()
1652 mt76_sta_remove(struct mt76_phy *phy, struct ieee80211_vif *vif, in mt76_sta_remove() argument
1655 struct mt76_dev *dev = phy->dev; in mt76_sta_remove()
1658 __mt76_sta_remove(phy, vif, sta); in mt76_sta_remove()
1667 struct mt76_phy *phy = hw->priv; in mt76_sta_state() local
1668 struct mt76_dev *dev = phy->dev; in mt76_sta_state()
1671 phy = mt76_vif_phy(hw, vif); in mt76_sta_state()
1672 if (!phy) in mt76_sta_state()
1677 return mt76_sta_add(phy, vif, sta); in mt76_sta_state()
1681 mt76_sta_remove(phy, vif, sta); in mt76_sta_state()
1705 struct mt76_phy *phy = hw->priv; in mt76_sta_pre_rcu_remove() local
1706 struct mt76_dev *dev = phy->dev; in mt76_sta_pre_rcu_remove()
1735 struct mt76_phy *phy = mt76_dev_phy(dev, wcid->phy_idx); in mt76_wcid_cleanup() local
1746 spin_lock_bh(&phy->tx_lock); in mt76_wcid_cleanup()
1759 spin_unlock_bh(&phy->tx_lock); in mt76_wcid_cleanup()
1770 if (test_bit(MT76_MCU_RESET, &dev->phy.state) || !wcid->sta) in mt76_wcid_add_poll()
1780 s8 mt76_get_power_bound(struct mt76_phy *phy, s8 txpower) in mt76_get_power_bound() argument
1782 int n_chains = hweight16(phy->chainmask); in mt76_get_power_bound()
1784 txpower = mt76_get_sar_power(phy, phy->chandef.chan, txpower * 2); in mt76_get_power_bound()
1794 struct mt76_phy *phy = mt76_vif_phy(hw, vif); in mt76_get_txpower() local
1797 if (!phy) in mt76_get_txpower()
1800 n_chains = hweight16(phy->chainmask); in mt76_get_txpower()
1802 *dbm = DIV_ROUND_UP(phy->txpower_cur + delta, 2); in mt76_get_txpower()
1811 struct mt76_phy *phy = hw->priv; in mt76_init_sar_power() local
1826 phy->frp[index].range = &capa->freq_ranges[index]; in mt76_init_sar_power()
1827 phy->frp[index].power = power; in mt76_init_sar_power()
1834 int mt76_get_sar_power(struct mt76_phy *phy, in mt76_get_sar_power() argument
1838 const struct cfg80211_sar_capa *capa = phy->hw->wiphy->sar_capa; in mt76_get_sar_power()
1841 if (!capa || !phy->frp) in mt76_get_sar_power()
1849 if (phy->frp[i].range && in mt76_get_sar_power()
1850 freq >= phy->frp[i].range->start_freq && in mt76_get_sar_power()
1851 freq < phy->frp[i].range->end_freq) { in mt76_get_sar_power()
1852 power = min_t(int, phy->frp[i].power, power); in mt76_get_sar_power()
1958 struct mt76_phy *phy = hw->priv; in mt76_sw_scan() local
1960 set_bit(MT76_SCANNING, &phy->state); in mt76_sw_scan()
1966 struct mt76_phy *phy = hw->priv; in mt76_sw_scan_complete() local
1968 clear_bit(MT76_SCANNING, &phy->state); in mt76_sw_scan_complete()
1975 struct mt76_phy *phy = hw->priv; in mt76_get_antenna() local
1976 struct mt76_dev *dev = phy->dev; in mt76_get_antenna()
2064 enum mt76_dfs_state mt76_phy_dfs_state(struct mt76_phy *phy) in mt76_phy_dfs_state() argument
2066 struct ieee80211_hw *hw = phy->hw; in mt76_phy_dfs_state()
2067 struct mt76_dev *dev = phy->dev; in mt76_phy_dfs_state()
2070 test_bit(MT76_SCANNING, &phy->state)) in mt76_phy_dfs_state()
2073 if (!phy->radar_enabled) { in mt76_phy_dfs_state()
2075 (phy->chandef.chan->flags & IEEE80211_CHAN_RADAR)) in mt76_phy_dfs_state()
2081 if (!cfg80211_reg_can_beacon(hw->wiphy, &phy->chandef, NL80211_IFTYPE_AP)) in mt76_phy_dfs_state()