Lines Matching refs: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()
462 wiphy->available_antennas_tx = phy->antenna_mask; in mt76_phy_init()
463 wiphy->available_antennas_rx = phy->antenna_mask; in mt76_phy_init()
466 phy->frp = devm_kcalloc(dev->dev, wiphy->sar_capa->num_freq_ranges, in mt76_phy_init()
469 if (!phy->frp) in mt76_phy_init()
504 struct ieee80211_hw *hw = dev->phy.hw; in mt76_alloc_radio_phy()
506 struct mt76_phy *phy; in mt76_alloc_radio_phy() local
508 phy_size = ALIGN(sizeof(*phy), 8); in mt76_alloc_radio_phy()
509 phy = devm_kzalloc(dev->dev, size + phy_size, GFP_KERNEL); in mt76_alloc_radio_phy()
510 if (!phy) in mt76_alloc_radio_phy()
513 phy->dev = dev; in mt76_alloc_radio_phy()
514 phy->hw = hw; in mt76_alloc_radio_phy()
516 phy->priv = (void *)phy + phy_size; in mt76_alloc_radio_phy()
518 phy->priv = (u8 *)phy + phy_size; in mt76_alloc_radio_phy()
520 phy->band_idx = band_idx; in mt76_alloc_radio_phy()
522 return phy; in mt76_alloc_radio_phy()
532 struct mt76_phy *phy; in mt76_alloc_phy() local
534 phy_size = ALIGN(sizeof(*phy), 8); in mt76_alloc_phy()
539 phy = hw->priv; in mt76_alloc_phy()
540 phy->dev = dev; in mt76_alloc_phy()
541 phy->hw = hw; in mt76_alloc_phy()
543 phy->priv = hw->priv + phy_size; in mt76_alloc_phy()
545 phy->priv = (u8 *)hw->priv + phy_size; in mt76_alloc_phy()
547 phy->band_idx = band_idx; in mt76_alloc_phy()
560 return phy; in mt76_alloc_phy()
564 int mt76_register_phy(struct mt76_phy *phy, bool vht, in mt76_register_phy() argument
569 ret = mt76_phy_init(phy, phy->hw); in mt76_register_phy()
573 if (phy->cap.has_2ghz) { in mt76_register_phy()
574 ret = mt76_init_sband_2g(phy, rates, n_rates); in mt76_register_phy()
579 if (phy->cap.has_5ghz) { in mt76_register_phy()
580 ret = mt76_init_sband_5g(phy, rates + 4, n_rates - 4, vht); in mt76_register_phy()
585 if (phy->cap.has_6ghz) { in mt76_register_phy()
586 ret = mt76_init_sband_6g(phy, rates + 4, n_rates - 4); in mt76_register_phy()
593 ret = mt76_led_init(phy); in mt76_register_phy()
599 wiphy_read_of_freq_limits(phy->hw->wiphy); in mt76_register_phy()
600 mt76_check_sband(phy, &phy->sband_2g, NL80211_BAND_2GHZ); in mt76_register_phy()
601 mt76_check_sband(phy, &phy->sband_5g, NL80211_BAND_5GHZ); in mt76_register_phy()
602 mt76_check_sband(phy, &phy->sband_6g, NL80211_BAND_6GHZ); in mt76_register_phy()
604 if ((void *)phy == phy->hw->priv) { in mt76_register_phy()
605 ret = ieee80211_register_hw(phy->hw); in mt76_register_phy()
610 set_bit(MT76_STATE_REGISTERED, &phy->state); in mt76_register_phy()
611 phy->dev->phys[phy->band_idx] = phy; in mt76_register_phy()
617 void mt76_unregister_phy(struct mt76_phy *phy) in mt76_unregister_phy() argument
619 struct mt76_dev *dev = phy->dev; in mt76_unregister_phy()
621 if (!test_bit(MT76_STATE_REGISTERED, &phy->state)) in mt76_unregister_phy()
626 mt76_led_cleanup(phy); in mt76_unregister_phy()
629 ieee80211_unregister_hw(phy->hw); in mt76_unregister_phy()
630 dev->phys[phy->band_idx] = NULL; in mt76_unregister_phy()
689 struct mt76_phy *phy; in mt76_alloc_device() local
703 phy = &dev->phy; in mt76_alloc_device()
704 phy->dev = dev; in mt76_alloc_device()
705 phy->hw = hw; in mt76_alloc_device()
706 phy->band_idx = MT_BAND0; in mt76_alloc_device()
707 dev->phys[phy->band_idx] = phy; in mt76_alloc_device()
765 struct mt76_phy *phy = &dev->phy; in mt76_register_device() local
769 mt76_wcid_init(&dev->global_wcid, phy->band_idx); in mt76_register_device()
770 ret = mt76_phy_init(phy, hw); in mt76_register_device()
774 if (phy->cap.has_2ghz) { in mt76_register_device()
775 ret = mt76_init_sband_2g(phy, rates, n_rates); in mt76_register_device()
780 if (phy->cap.has_5ghz) { in mt76_register_device()
781 ret = mt76_init_sband_5g(phy, rates + 4, n_rates - 4, vht); in mt76_register_device()
786 if (phy->cap.has_6ghz) { in mt76_register_device()
787 ret = mt76_init_sband_6g(phy, rates + 4, n_rates - 4); in mt76_register_device()
793 mt76_check_sband(&dev->phy, &phy->sband_2g, NL80211_BAND_2GHZ); in mt76_register_device()
794 mt76_check_sband(&dev->phy, &phy->sband_5g, NL80211_BAND_5GHZ); in mt76_register_device()
795 mt76_check_sband(&dev->phy, &phy->sband_6g, NL80211_BAND_6GHZ); in mt76_register_device()
799 ret = mt76_led_init(phy); in mt76_register_device()
810 set_bit(MT76_STATE_REGISTERED, &phy->state); in mt76_register_device()
823 if (!test_bit(MT76_STATE_REGISTERED, &dev->phy.state)) in mt76_unregister_device()
828 mt76_led_cleanup(&dev->phy); in mt76_unregister_device()
864 return ctx->phy; in mt76_vif_phy()
867 static void mt76_rx_release_amsdu(struct mt76_phy *phy, enum mt76_rxq_id q) in mt76_rx_release_amsdu() argument
869 struct sk_buff *skb = phy->rx_amsdu[q].head; in mt76_rx_release_amsdu()
871 struct mt76_dev *dev = phy->dev; in mt76_rx_release_amsdu()
873 phy->rx_amsdu[q].head = NULL; in mt76_rx_release_amsdu()
874 phy->rx_amsdu[q].tail = NULL; in mt76_rx_release_amsdu()
903 static void mt76_rx_release_burst(struct mt76_phy *phy, enum mt76_rxq_id q, in mt76_rx_release_burst() argument
908 if (phy->rx_amsdu[q].head && in mt76_rx_release_burst()
910 status->seqno != phy->rx_amsdu[q].seqno)) in mt76_rx_release_burst()
911 mt76_rx_release_amsdu(phy, q); in mt76_rx_release_burst()
913 if (!phy->rx_amsdu[q].head) { in mt76_rx_release_burst()
914 phy->rx_amsdu[q].tail = &skb_shinfo(skb)->frag_list; in mt76_rx_release_burst()
915 phy->rx_amsdu[q].seqno = status->seqno; in mt76_rx_release_burst()
916 phy->rx_amsdu[q].head = skb; in mt76_rx_release_burst()
918 *phy->rx_amsdu[q].tail = skb; in mt76_rx_release_burst()
919 phy->rx_amsdu[q].tail = &skb->next; in mt76_rx_release_burst()
923 mt76_rx_release_amsdu(phy, q); in mt76_rx_release_burst()
929 struct mt76_phy *phy = mt76_dev_phy(dev, status->phy_idx); in mt76_rx() local
931 if (!test_bit(MT76_STATE_RUNNING, &phy->state)) { in mt76_rx()
937 if (phy->test.state == MT76_TM_STATE_RX_FRAMES) { in mt76_rx()
938 phy->test.rx_stats.packets[q]++; in mt76_rx()
940 phy->test.rx_stats.fcs_error[q]++; in mt76_rx()
944 mt76_rx_release_burst(phy, q, skb); in mt76_rx()
948 bool mt76_has_tx_pending(struct mt76_phy *phy) in mt76_has_tx_pending() argument
954 q = phy->q_tx[i]; in mt76_has_tx_pending()
964 mt76_channel_state(struct mt76_phy *phy, struct ieee80211_channel *c) in mt76_channel_state() argument
970 msband = &phy->sband_2g; in mt76_channel_state()
972 msband = &phy->sband_6g; in mt76_channel_state()
974 msband = &phy->sband_5g; in mt76_channel_state()
980 void mt76_update_survey_active_time(struct mt76_phy *phy, ktime_t time) in mt76_update_survey_active_time() argument
982 struct mt76_channel_state *state = phy->chan_state; in mt76_update_survey_active_time()
985 phy->survey_time)); in mt76_update_survey_active_time()
986 phy->survey_time = time; in mt76_update_survey_active_time()
990 void mt76_update_survey(struct mt76_phy *phy) in mt76_update_survey() argument
992 struct mt76_dev *dev = phy->dev; in mt76_update_survey()
996 dev->drv->update_survey(phy); in mt76_update_survey()
999 mt76_update_survey_active_time(phy, cur_time); in mt76_update_survey()
1002 struct mt76_channel_state *state = phy->chan_state; in mt76_update_survey()
1012 int __mt76_set_channel(struct mt76_phy *phy, struct cfg80211_chan_def *chandef, in __mt76_set_channel() argument
1015 struct mt76_dev *dev = phy->dev; in __mt76_set_channel()
1019 set_bit(MT76_RESET, &phy->state); in __mt76_set_channel()
1022 wait_event_timeout(dev->tx_wait, !mt76_has_tx_pending(phy), timeout); in __mt76_set_channel()
1023 mt76_update_survey(phy); in __mt76_set_channel()
1025 if (phy->chandef.chan->center_freq != chandef->chan->center_freq || in __mt76_set_channel()
1026 phy->chandef.width != chandef->width) in __mt76_set_channel()
1027 phy->dfs_state = MT_DFS_STATE_UNKNOWN; in __mt76_set_channel()
1029 phy->chandef = *chandef; in __mt76_set_channel()
1030 phy->chan_state = mt76_channel_state(phy, chandef->chan); in __mt76_set_channel()
1031 phy->offchannel = offchannel; in __mt76_set_channel()
1034 phy->main_chandef = *chandef; in __mt76_set_channel()
1036 if (chandef->chan != phy->main_chandef.chan) in __mt76_set_channel()
1037 memset(phy->chan_state, 0, sizeof(*phy->chan_state)); in __mt76_set_channel()
1039 ret = dev->drv->set_channel(phy); in __mt76_set_channel()
1041 clear_bit(MT76_RESET, &phy->state); in __mt76_set_channel()
1048 int mt76_set_channel(struct mt76_phy *phy, struct cfg80211_chan_def *chandef, in mt76_set_channel() argument
1051 struct mt76_dev *dev = phy->dev; in mt76_set_channel()
1054 cancel_delayed_work_sync(&phy->mac_work); in mt76_set_channel()
1057 ret = __mt76_set_channel(phy, chandef, offchannel); in mt76_set_channel()
1063 int mt76_update_channel(struct mt76_phy *phy) in mt76_update_channel() argument
1065 struct ieee80211_hw *hw = phy->hw; in mt76_update_channel()
1069 phy->radar_enabled = hw->conf.radar_enabled; in mt76_update_channel()
1071 return mt76_set_channel(phy, chandef, offchannel); in mt76_update_channel()
1076 mt76_get_survey_sband(struct mt76_phy *phy, int *idx) in mt76_get_survey_sband() argument
1078 if (*idx < phy->sband_2g.sband.n_channels) in mt76_get_survey_sband()
1079 return &phy->sband_2g; in mt76_get_survey_sband()
1081 *idx -= phy->sband_2g.sband.n_channels; in mt76_get_survey_sband()
1082 if (*idx < phy->sband_5g.sband.n_channels) in mt76_get_survey_sband()
1083 return &phy->sband_5g; in mt76_get_survey_sband()
1085 *idx -= phy->sband_5g.sband.n_channels; in mt76_get_survey_sband()
1086 if (*idx < phy->sband_6g.sband.n_channels) in mt76_get_survey_sband()
1087 return &phy->sband_6g; in mt76_get_survey_sband()
1089 *idx -= phy->sband_6g.sband.n_channels; in mt76_get_survey_sband()
1096 struct mt76_phy *phy = hw->priv; in mt76_get_survey() local
1097 struct mt76_dev *dev = phy->dev; in mt76_get_survey()
1108 phy = dev->phys[phy_idx]; in mt76_get_survey()
1109 if (!phy || phy->hw != hw) in mt76_get_survey()
1112 sband = mt76_get_survey_sband(phy, &idx); in mt76_get_survey()
1114 if (idx == 0 && phy->dev->drv->update_survey) in mt76_get_survey()
1115 mt76_update_survey(phy); in mt76_get_survey()
1127 state = mt76_channel_state(phy, chan); in mt76_get_survey()
1136 if (chan == phy->main_chandef.chan) { in mt76_get_survey()
1398 if (!ether_addr_equal(hdr->addr1, dev->phy.macaddr)) in mt76_airtime_check()
1556 mt76_sta_add(struct mt76_phy *phy, struct ieee80211_vif *vif, in mt76_sta_add() argument
1560 struct mt76_dev *dev = phy->dev; in mt76_sta_add()
1582 phy->num_sta++; in mt76_sta_add()
1584 mt76_wcid_init(wcid, phy->band_idx); in mt76_sta_add()
1591 void __mt76_sta_remove(struct mt76_phy *phy, struct ieee80211_vif *vif, in __mt76_sta_remove() argument
1594 struct mt76_dev *dev = phy->dev; in __mt76_sta_remove()
1607 phy->num_sta--; in __mt76_sta_remove()
1612 mt76_sta_remove(struct mt76_phy *phy, struct ieee80211_vif *vif, in mt76_sta_remove() argument
1615 struct mt76_dev *dev = phy->dev; in mt76_sta_remove()
1618 __mt76_sta_remove(phy, vif, sta); in mt76_sta_remove()
1627 struct mt76_phy *phy = hw->priv; in mt76_sta_state() local
1628 struct mt76_dev *dev = phy->dev; in mt76_sta_state()
1631 phy = mt76_vif_phy(hw, vif); in mt76_sta_state()
1632 if (!phy) in mt76_sta_state()
1637 return mt76_sta_add(phy, vif, sta); in mt76_sta_state()
1641 mt76_sta_remove(phy, vif, sta); in mt76_sta_state()
1665 struct mt76_phy *phy = hw->priv; in mt76_sta_pre_rcu_remove() local
1666 struct mt76_dev *dev = phy->dev; in mt76_sta_pre_rcu_remove()
1695 struct mt76_phy *phy = mt76_dev_phy(dev, wcid->phy_idx); in mt76_wcid_cleanup() local
1706 spin_lock_bh(&phy->tx_lock); in mt76_wcid_cleanup()
1715 spin_unlock_bh(&phy->tx_lock); in mt76_wcid_cleanup()
1726 if (test_bit(MT76_MCU_RESET, &dev->phy.state)) in mt76_wcid_add_poll()
1739 struct mt76_phy *phy = mt76_vif_phy(hw, vif); in mt76_get_txpower() local
1742 if (!phy) in mt76_get_txpower()
1745 n_chains = hweight16(phy->chainmask); in mt76_get_txpower()
1747 *dbm = DIV_ROUND_UP(phy->txpower_cur + delta, 2); in mt76_get_txpower()
1756 struct mt76_phy *phy = hw->priv; in mt76_init_sar_power() local
1771 phy->frp[index].range = &capa->freq_ranges[index]; in mt76_init_sar_power()
1772 phy->frp[index].power = power; in mt76_init_sar_power()
1779 int mt76_get_sar_power(struct mt76_phy *phy, in mt76_get_sar_power() argument
1783 const struct cfg80211_sar_capa *capa = phy->hw->wiphy->sar_capa; in mt76_get_sar_power()
1786 if (!capa || !phy->frp) in mt76_get_sar_power()
1794 if (phy->frp[i].range && in mt76_get_sar_power()
1795 freq >= phy->frp[i].range->start_freq && in mt76_get_sar_power()
1796 freq < phy->frp[i].range->end_freq) { in mt76_get_sar_power()
1797 power = min_t(int, phy->frp[i].power, power); in mt76_get_sar_power()
1903 struct mt76_phy *phy = hw->priv; in mt76_sw_scan() local
1905 set_bit(MT76_SCANNING, &phy->state); in mt76_sw_scan()
1911 struct mt76_phy *phy = hw->priv; in mt76_sw_scan_complete() local
1913 clear_bit(MT76_SCANNING, &phy->state); in mt76_sw_scan_complete()
1919 struct mt76_phy *phy = hw->priv; in mt76_get_antenna() local
1920 struct mt76_dev *dev = phy->dev; in mt76_get_antenna()
2008 enum mt76_dfs_state mt76_phy_dfs_state(struct mt76_phy *phy) in mt76_phy_dfs_state() argument
2010 struct ieee80211_hw *hw = phy->hw; in mt76_phy_dfs_state()
2011 struct mt76_dev *dev = phy->dev; in mt76_phy_dfs_state()
2014 test_bit(MT76_SCANNING, &phy->state)) in mt76_phy_dfs_state()
2017 if (!phy->radar_enabled) { in mt76_phy_dfs_state()
2019 (phy->chandef.chan->flags & IEEE80211_CHAN_RADAR)) in mt76_phy_dfs_state()
2025 if (!cfg80211_reg_can_beacon(hw->wiphy, &phy->chandef, NL80211_IFTYPE_AP)) in mt76_phy_dfs_state()