Lines Matching full:phy
206 static int mt76_led_init(struct mt76_phy *phy) in mt76_led_init() argument
208 struct mt76_dev *dev = phy->dev; in mt76_led_init()
209 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()
214 snprintf(phy->leds.name, sizeof(phy->leds.name), "mt76-%s", in mt76_led_init()
217 phy->leds.cdev.name = phy->leds.name; in mt76_led_init()
218 phy->leds.cdev.default_trigger = in mt76_led_init()
225 if (phy == &dev->phy) { in mt76_led_init()
233 phy->leds.pin = led_pin; in mt76_led_init()
234 phy->leds.al = of_property_read_bool(np, in mt76_led_init()
241 return led_classdev_register(dev->dev, &phy->leds.cdev); in mt76_led_init()
244 static void mt76_led_cleanup(struct mt76_phy *phy) in mt76_led_cleanup() argument
246 if (!phy->leds.cdev.brightness_set && !phy->leds.cdev.blink_set) in mt76_led_cleanup()
249 led_classdev_unregister(&phy->leds.cdev); in mt76_led_cleanup()
253 static void mt76_init_stream_cap(struct mt76_phy *phy, in mt76_init_stream_cap() argument
258 int i, nstream = hweight8(phy->antenna_mask); in mt76_init_stream_cap()
290 if (ieee80211_hw_check(phy->hw, SUPPORTS_VHT_EXT_NSS_BW)) in mt76_init_stream_cap()
295 void mt76_set_stream_caps(struct mt76_phy *phy, bool vht) in mt76_set_stream_caps() argument
297 if (phy->cap.has_2ghz) in mt76_set_stream_caps()
298 mt76_init_stream_cap(phy, &phy->sband_2g.sband, false); in mt76_set_stream_caps()
299 if (phy->cap.has_5ghz) in mt76_set_stream_caps()
300 mt76_init_stream_cap(phy, &phy->sband_5g.sband, vht); in mt76_set_stream_caps()
301 if (phy->cap.has_6ghz) in mt76_set_stream_caps()
302 mt76_init_stream_cap(phy, &phy->sband_6g.sband, vht); in mt76_set_stream_caps()
307 mt76_init_sband(struct mt76_phy *phy, struct mt76_sband *msband, in mt76_init_sband() argument
315 struct mt76_dev *dev = phy->dev; in mt76_init_sband()
348 mt76_init_stream_cap(phy, sband, vht); in mt76_init_sband()
364 mt76_init_sband_2g(struct mt76_phy *phy, struct ieee80211_rate *rates, in mt76_init_sband_2g() argument
367 phy->hw->wiphy->bands[NL80211_BAND_2GHZ] = &phy->sband_2g.sband; in mt76_init_sband_2g()
369 return mt76_init_sband(phy, &phy->sband_2g, mt76_channels_2ghz, in mt76_init_sband_2g()
375 mt76_init_sband_5g(struct mt76_phy *phy, struct ieee80211_rate *rates, in mt76_init_sband_5g() argument
378 phy->hw->wiphy->bands[NL80211_BAND_5GHZ] = &phy->sband_5g.sband; in mt76_init_sband_5g()
380 return mt76_init_sband(phy, &phy->sband_5g, mt76_channels_5ghz, in mt76_init_sband_5g()
386 mt76_init_sband_6g(struct mt76_phy *phy, struct ieee80211_rate *rates, in mt76_init_sband_6g() argument
389 phy->hw->wiphy->bands[NL80211_BAND_6GHZ] = &phy->sband_6g.sband; in mt76_init_sband_6g()
391 return mt76_init_sband(phy, &phy->sband_6g, mt76_channels_6ghz, in mt76_init_sband_6g()
397 mt76_check_sband(struct mt76_phy *phy, struct mt76_sband *msband, in mt76_check_sband() argument
416 phy->chandef.chan = &sband->channels[0]; in mt76_check_sband()
417 phy->chan_state = &msband->chan[0]; in mt76_check_sband()
422 phy->hw->wiphy->bands[band] = NULL; in mt76_check_sband()
426 mt76_phy_init(struct mt76_phy *phy, struct ieee80211_hw *hw) in mt76_phy_init() argument
428 struct mt76_dev *dev = phy->dev; in mt76_phy_init()
432 SET_IEEE80211_PERM_ADDR(hw, phy->macaddr); in mt76_phy_init()
444 wiphy->available_antennas_tx = phy->antenna_mask; in mt76_phy_init()
445 wiphy->available_antennas_rx = phy->antenna_mask; in mt76_phy_init()
448 phy->frp = devm_kcalloc(dev->dev, wiphy->sar_capa->num_freq_ranges, in mt76_phy_init()
451 if (!phy->frp) in mt76_phy_init()
486 struct mt76_phy *phy; in mt76_alloc_phy() local
488 phy_size = ALIGN(sizeof(*phy), 8); in mt76_alloc_phy()
493 phy = hw->priv; in mt76_alloc_phy()
494 phy->dev = dev; in mt76_alloc_phy()
495 phy->hw = hw; in mt76_alloc_phy()
497 phy->priv = hw->priv + phy_size; in mt76_alloc_phy()
499 phy->priv = (u8 *)hw->priv + phy_size; in mt76_alloc_phy()
501 phy->band_idx = band_idx; in mt76_alloc_phy()
514 return phy; in mt76_alloc_phy()
518 int mt76_register_phy(struct mt76_phy *phy, bool vht, in mt76_register_phy() argument
523 ret = mt76_phy_init(phy, phy->hw); in mt76_register_phy()
527 if (phy->cap.has_2ghz) { in mt76_register_phy()
528 ret = mt76_init_sband_2g(phy, rates, n_rates); in mt76_register_phy()
533 if (phy->cap.has_5ghz) { in mt76_register_phy()
534 ret = mt76_init_sband_5g(phy, rates + 4, n_rates - 4, vht); in mt76_register_phy()
539 if (phy->cap.has_6ghz) { in mt76_register_phy()
540 ret = mt76_init_sband_6g(phy, rates + 4, n_rates - 4); in mt76_register_phy()
547 ret = mt76_led_init(phy); in mt76_register_phy()
553 wiphy_read_of_freq_limits(phy->hw->wiphy); in mt76_register_phy()
554 mt76_check_sband(phy, &phy->sband_2g, NL80211_BAND_2GHZ); in mt76_register_phy()
555 mt76_check_sband(phy, &phy->sband_5g, NL80211_BAND_5GHZ); in mt76_register_phy()
556 mt76_check_sband(phy, &phy->sband_6g, NL80211_BAND_6GHZ); in mt76_register_phy()
558 ret = ieee80211_register_hw(phy->hw); in mt76_register_phy()
562 set_bit(MT76_STATE_REGISTERED, &phy->state); in mt76_register_phy()
563 phy->dev->phys[phy->band_idx] = phy; in mt76_register_phy()
569 void mt76_unregister_phy(struct mt76_phy *phy) in mt76_unregister_phy() argument
571 struct mt76_dev *dev = phy->dev; in mt76_unregister_phy()
573 if (!test_bit(MT76_STATE_REGISTERED, &phy->state)) in mt76_unregister_phy()
578 mt76_led_cleanup(phy); in mt76_unregister_phy()
581 ieee80211_unregister_hw(phy->hw); in mt76_unregister_phy()
582 dev->phys[phy->band_idx] = NULL; in mt76_unregister_phy()
633 struct mt76_phy *phy; in mt76_alloc_device() local
647 phy = &dev->phy; in mt76_alloc_device()
648 phy->dev = dev; in mt76_alloc_device()
649 phy->hw = hw; in mt76_alloc_device()
650 phy->band_idx = MT_BAND0; in mt76_alloc_device()
651 dev->phys[phy->band_idx] = phy; in mt76_alloc_device()
708 struct mt76_phy *phy = &dev->phy; in mt76_register_device() local
712 ret = mt76_phy_init(phy, hw); in mt76_register_device()
716 if (phy->cap.has_2ghz) { in mt76_register_device()
717 ret = mt76_init_sband_2g(phy, rates, n_rates); in mt76_register_device()
722 if (phy->cap.has_5ghz) { in mt76_register_device()
723 ret = mt76_init_sband_5g(phy, rates + 4, n_rates - 4, vht); in mt76_register_device()
728 if (phy->cap.has_6ghz) { in mt76_register_device()
729 ret = mt76_init_sband_6g(phy, rates + 4, n_rates - 4); in mt76_register_device()
735 mt76_check_sband(&dev->phy, &phy->sband_2g, NL80211_BAND_2GHZ); in mt76_register_device()
736 mt76_check_sband(&dev->phy, &phy->sband_5g, NL80211_BAND_5GHZ); in mt76_register_device()
737 mt76_check_sband(&dev->phy, &phy->sband_6g, NL80211_BAND_6GHZ); in mt76_register_device()
741 ret = mt76_led_init(phy); in mt76_register_device()
752 set_bit(MT76_STATE_REGISTERED, &phy->state); in mt76_register_device()
765 if (!test_bit(MT76_STATE_REGISTERED, &dev->phy.state)) in mt76_unregister_device()
770 mt76_led_cleanup(&dev->phy); in mt76_unregister_device()
792 static void mt76_rx_release_amsdu(struct mt76_phy *phy, enum mt76_rxq_id q) in mt76_rx_release_amsdu() argument
794 struct sk_buff *skb = phy->rx_amsdu[q].head; in mt76_rx_release_amsdu()
796 struct mt76_dev *dev = phy->dev; in mt76_rx_release_amsdu()
798 phy->rx_amsdu[q].head = NULL; in mt76_rx_release_amsdu()
799 phy->rx_amsdu[q].tail = NULL; in mt76_rx_release_amsdu()
828 static void mt76_rx_release_burst(struct mt76_phy *phy, enum mt76_rxq_id q, in mt76_rx_release_burst() argument
833 if (phy->rx_amsdu[q].head && in mt76_rx_release_burst()
835 status->seqno != phy->rx_amsdu[q].seqno)) in mt76_rx_release_burst()
836 mt76_rx_release_amsdu(phy, q); in mt76_rx_release_burst()
838 if (!phy->rx_amsdu[q].head) { in mt76_rx_release_burst()
839 phy->rx_amsdu[q].tail = &skb_shinfo(skb)->frag_list; in mt76_rx_release_burst()
840 phy->rx_amsdu[q].seqno = status->seqno; in mt76_rx_release_burst()
841 phy->rx_amsdu[q].head = skb; in mt76_rx_release_burst()
843 *phy->rx_amsdu[q].tail = skb; in mt76_rx_release_burst()
844 phy->rx_amsdu[q].tail = &skb->next; in mt76_rx_release_burst()
848 mt76_rx_release_amsdu(phy, q); in mt76_rx_release_burst()
854 struct mt76_phy *phy = mt76_dev_phy(dev, status->phy_idx); in mt76_rx() local
856 if (!test_bit(MT76_STATE_RUNNING, &phy->state)) { in mt76_rx()
862 if (phy->test.state == MT76_TM_STATE_RX_FRAMES) { in mt76_rx()
863 phy->test.rx_stats.packets[q]++; in mt76_rx()
865 phy->test.rx_stats.fcs_error[q]++; in mt76_rx()
869 mt76_rx_release_burst(phy, q, skb); in mt76_rx()
873 bool mt76_has_tx_pending(struct mt76_phy *phy) in mt76_has_tx_pending() argument
879 q = phy->q_tx[i]; in mt76_has_tx_pending()
889 mt76_channel_state(struct mt76_phy *phy, struct ieee80211_channel *c) in mt76_channel_state() argument
895 msband = &phy->sband_2g; in mt76_channel_state()
897 msband = &phy->sband_6g; in mt76_channel_state()
899 msband = &phy->sband_5g; in mt76_channel_state()
905 void mt76_update_survey_active_time(struct mt76_phy *phy, ktime_t time) in mt76_update_survey_active_time() argument
907 struct mt76_channel_state *state = phy->chan_state; in mt76_update_survey_active_time()
910 phy->survey_time)); in mt76_update_survey_active_time()
911 phy->survey_time = time; in mt76_update_survey_active_time()
915 void mt76_update_survey(struct mt76_phy *phy) in mt76_update_survey() argument
917 struct mt76_dev *dev = phy->dev; in mt76_update_survey()
921 dev->drv->update_survey(phy); in mt76_update_survey()
924 mt76_update_survey_active_time(phy, cur_time); in mt76_update_survey()
927 struct mt76_channel_state *state = phy->chan_state; in mt76_update_survey()
937 void mt76_set_channel(struct mt76_phy *phy) in mt76_set_channel() argument
939 struct mt76_dev *dev = phy->dev; in mt76_set_channel()
940 struct ieee80211_hw *hw = phy->hw; in mt76_set_channel()
945 wait_event_timeout(dev->tx_wait, !mt76_has_tx_pending(phy), timeout); in mt76_set_channel()
946 mt76_update_survey(phy); in mt76_set_channel()
948 if (phy->chandef.chan->center_freq != chandef->chan->center_freq || in mt76_set_channel()
949 phy->chandef.width != chandef->width) in mt76_set_channel()
950 phy->dfs_state = MT_DFS_STATE_UNKNOWN; in mt76_set_channel()
952 phy->chandef = *chandef; in mt76_set_channel()
953 phy->chan_state = mt76_channel_state(phy, chandef->chan); in mt76_set_channel()
956 phy->main_chan = chandef->chan; in mt76_set_channel()
958 if (chandef->chan != phy->main_chan) in mt76_set_channel()
959 memset(phy->chan_state, 0, sizeof(*phy->chan_state)); in mt76_set_channel()
966 struct mt76_phy *phy = hw->priv; in mt76_get_survey() local
967 struct mt76_dev *dev = phy->dev; in mt76_get_survey()
975 mt76_update_survey(phy); in mt76_get_survey()
977 if (idx >= phy->sband_2g.sband.n_channels + in mt76_get_survey()
978 phy->sband_5g.sband.n_channels) { in mt76_get_survey()
979 idx -= (phy->sband_2g.sband.n_channels + in mt76_get_survey()
980 phy->sband_5g.sband.n_channels); in mt76_get_survey()
981 sband = &phy->sband_6g; in mt76_get_survey()
982 } else if (idx >= phy->sband_2g.sband.n_channels) { in mt76_get_survey()
983 idx -= phy->sband_2g.sband.n_channels; in mt76_get_survey()
984 sband = &phy->sband_5g; in mt76_get_survey()
986 sband = &phy->sband_2g; in mt76_get_survey()
995 state = mt76_channel_state(phy, chan); in mt76_get_survey()
1004 if (chan == phy->main_chan) { in mt76_get_survey()
1261 if (!ether_addr_equal(hdr->addr1, dev->phy.macaddr)) in mt76_airtime_check()
1419 mt76_sta_add(struct mt76_phy *phy, struct ieee80211_vif *vif, in mt76_sta_add() argument
1423 struct mt76_dev *dev = phy->dev; in mt76_sta_add()
1444 if (phy->band_idx == MT_BAND1) in mt76_sta_add()
1446 wcid->phy_idx = phy->band_idx; in mt76_sta_add()
1489 struct mt76_phy *phy = hw->priv; in mt76_sta_state() local
1490 struct mt76_dev *dev = phy->dev; in mt76_sta_state()
1494 return mt76_sta_add(phy, vif, sta); in mt76_sta_state()
1512 struct mt76_phy *phy = hw->priv; in mt76_sta_pre_rcu_remove() local
1513 struct mt76_dev *dev = phy->dev; in mt76_sta_pre_rcu_remove()
1527 struct mt76_phy *phy = hw->priv; in mt76_get_txpower() local
1528 int n_chains = hweight8(phy->antenna_mask); in mt76_get_txpower()
1531 *dbm = DIV_ROUND_UP(phy->txpower_cur + delta, 2); in mt76_get_txpower()
1540 struct mt76_phy *phy = hw->priv; in mt76_init_sar_power() local
1555 phy->frp[index].range = &capa->freq_ranges[index]; in mt76_init_sar_power()
1556 phy->frp[index].power = power; in mt76_init_sar_power()
1563 int mt76_get_sar_power(struct mt76_phy *phy, in mt76_get_sar_power() argument
1567 const struct cfg80211_sar_capa *capa = phy->hw->wiphy->sar_capa; in mt76_get_sar_power()
1570 if (!capa || !phy->frp) in mt76_get_sar_power()
1578 if (phy->frp[i].range && in mt76_get_sar_power()
1579 freq >= phy->frp[i].range->start_freq && in mt76_get_sar_power()
1580 freq < phy->frp[i].range->end_freq) { in mt76_get_sar_power()
1581 power = min_t(int, phy->frp[i].power, power); in mt76_get_sar_power()
1666 if (sband != &dev->phy.sband_2g.sband) in mt76_get_rate()
1670 } else if (sband == &dev->phy.sband_2g.sband) { in mt76_get_rate()
1686 struct mt76_phy *phy = hw->priv; in mt76_sw_scan() local
1688 set_bit(MT76_SCANNING, &phy->state); in mt76_sw_scan()
1694 struct mt76_phy *phy = hw->priv; in mt76_sw_scan_complete() local
1696 clear_bit(MT76_SCANNING, &phy->state); in mt76_sw_scan_complete()
1702 struct mt76_phy *phy = hw->priv; in mt76_get_antenna() local
1703 struct mt76_dev *dev = phy->dev; in mt76_get_antenna()
1706 *tx_ant = phy->antenna_mask; in mt76_get_antenna()
1707 *rx_ant = phy->antenna_mask; in mt76_get_antenna()
1735 u16 mt76_calculate_default_rate(struct mt76_phy *phy, int rateidx) in mt76_calculate_default_rate() argument
1739 if (phy->chandef.chan->band != NL80211_BAND_2GHZ) in mt76_calculate_default_rate()
1805 enum mt76_dfs_state mt76_phy_dfs_state(struct mt76_phy *phy) in mt76_phy_dfs_state() argument
1807 struct ieee80211_hw *hw = phy->hw; in mt76_phy_dfs_state()
1808 struct mt76_dev *dev = phy->dev; in mt76_phy_dfs_state()
1811 test_bit(MT76_SCANNING, &phy->state)) in mt76_phy_dfs_state()
1816 (phy->chandef.chan->flags & IEEE80211_CHAN_RADAR)) in mt76_phy_dfs_state()
1822 if (!cfg80211_reg_can_beacon(hw->wiphy, &phy->chandef, NL80211_IFTYPE_AP)) in mt76_phy_dfs_state()