diff options
Diffstat (limited to 'sys/contrib/dev/mediatek/mt76/mac80211.c')
| -rw-r--r-- | sys/contrib/dev/mediatek/mt76/mac80211.c | 70 | 
1 files changed, 63 insertions, 7 deletions
| diff --git a/sys/contrib/dev/mediatek/mt76/mac80211.c b/sys/contrib/dev/mediatek/mt76/mac80211.c index f4a714c57f82..927d8519104f 100644 --- a/sys/contrib/dev/mediatek/mt76/mac80211.c +++ b/sys/contrib/dev/mediatek/mt76/mac80211.c @@ -459,8 +459,10 @@ mt76_phy_init(struct mt76_phy *phy, struct ieee80211_hw *hw)  	wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_AIRTIME_FAIRNESS);  	wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_AQL); -	wiphy->available_antennas_tx = phy->antenna_mask; -	wiphy->available_antennas_rx = phy->antenna_mask; +	if (!wiphy->available_antennas_tx) +		wiphy->available_antennas_tx = phy->antenna_mask; +	if (!wiphy->available_antennas_rx) +		wiphy->available_antennas_rx = phy->antenna_mask;  	wiphy->sar_capa = &mt76_sar_capa;  	phy->frp = devm_kcalloc(dev->dev, wiphy->sar_capa->num_freq_ranges, @@ -848,8 +850,45 @@ void mt76_free_device(struct mt76_dev *dev)  }  EXPORT_SYMBOL_GPL(mt76_free_device); -static struct mt76_phy * -mt76_vif_phy(struct ieee80211_hw *hw, struct ieee80211_vif *vif) +static void mt76_reset_phy(struct mt76_phy *phy) +{ +	if (!phy) +		return; + +	INIT_LIST_HEAD(&phy->tx_list); +} + +void mt76_reset_device(struct mt76_dev *dev) +{ +	int i; + +	rcu_read_lock(); +	for (i = 0; i < ARRAY_SIZE(dev->wcid); i++) { +		struct mt76_wcid *wcid; + +		wcid = rcu_dereference(dev->wcid[i]); +		if (!wcid) +			continue; + +		wcid->sta = 0; +		mt76_wcid_cleanup(dev, wcid); +		rcu_assign_pointer(dev->wcid[i], NULL); +	} +	rcu_read_unlock(); + +	INIT_LIST_HEAD(&dev->wcid_list); +	INIT_LIST_HEAD(&dev->sta_poll_list); +	dev->vif_mask = 0; +	memset(dev->wcid_mask, 0, sizeof(dev->wcid_mask)); + +	mt76_reset_phy(&dev->phy); +	for (i = 0; i < ARRAY_SIZE(dev->phys); i++) +		mt76_reset_phy(dev->phys[i]); +} +EXPORT_SYMBOL_GPL(mt76_reset_device); + +struct mt76_phy *mt76_vif_phy(struct ieee80211_hw *hw, +			      struct ieee80211_vif *vif)  {  	struct mt76_vif_link *mlink = (struct mt76_vif_link *)vif->drv_priv;  	struct mt76_chanctx *ctx; @@ -863,6 +902,7 @@ mt76_vif_phy(struct ieee80211_hw *hw, struct ieee80211_vif *vif)  	ctx = (struct mt76_chanctx *)mlink->ctx->drv_priv;  	return ctx->phy;  } +EXPORT_SYMBOL_GPL(mt76_vif_phy);  static void mt76_rx_release_amsdu(struct mt76_phy *phy, enum mt76_rxq_id q)  { @@ -1712,6 +1752,10 @@ void mt76_wcid_cleanup(struct mt76_dev *dev, struct mt76_wcid *wcid)  	skb_queue_splice_tail_init(&wcid->tx_pending, &list);  	spin_unlock(&wcid->tx_pending.lock); +	spin_lock(&wcid->tx_offchannel.lock); +	skb_queue_splice_tail_init(&wcid->tx_offchannel, &list); +	spin_unlock(&wcid->tx_offchannel.lock); +  	spin_unlock_bh(&phy->tx_lock);  	while ((skb = __skb_dequeue(&list)) != NULL) { @@ -1723,7 +1767,7 @@ EXPORT_SYMBOL_GPL(mt76_wcid_cleanup);  void mt76_wcid_add_poll(struct mt76_dev *dev, struct mt76_wcid *wcid)  { -	if (test_bit(MT76_MCU_RESET, &dev->phy.state)) +	if (test_bit(MT76_MCU_RESET, &dev->phy.state) || !wcid->sta)  		return;  	spin_lock_bh(&dev->sta_poll_lock); @@ -1733,6 +1777,17 @@ void mt76_wcid_add_poll(struct mt76_dev *dev, struct mt76_wcid *wcid)  }  EXPORT_SYMBOL_GPL(mt76_wcid_add_poll); +s8 mt76_get_power_bound(struct mt76_phy *phy, s8 txpower) +{ +	int n_chains = hweight16(phy->chainmask); + +	txpower = mt76_get_sar_power(phy, phy->chandef.chan, txpower * 2); +	txpower -= mt76_tx_power_path_delta(n_chains); + +	return txpower; +} +EXPORT_SYMBOL_GPL(mt76_get_power_bound); +  int mt76_get_txpower(struct ieee80211_hw *hw, struct ieee80211_vif *vif,  		     unsigned int link_id, int *dbm)  { @@ -1743,7 +1798,7 @@ int mt76_get_txpower(struct ieee80211_hw *hw, struct ieee80211_vif *vif,  		return -EINVAL;  	n_chains = hweight16(phy->chainmask); -	delta = mt76_tx_power_nss_delta(n_chains); +	delta = mt76_tx_power_path_delta(n_chains);  	*dbm = DIV_ROUND_UP(phy->txpower_cur + delta, 2);  	return 0; @@ -1914,7 +1969,8 @@ void mt76_sw_scan_complete(struct ieee80211_hw *hw, struct ieee80211_vif *vif)  }  EXPORT_SYMBOL_GPL(mt76_sw_scan_complete); -int mt76_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant) +int mt76_get_antenna(struct ieee80211_hw *hw, int radio_idx, u32 *tx_ant, +		     u32 *rx_ant)  {  	struct mt76_phy *phy = hw->priv;  	struct mt76_dev *dev = phy->dev; | 
