diff options
Diffstat (limited to 'net/mac80211/rate.h')
| -rw-r--r-- | net/mac80211/rate.h | 62 | 
1 files changed, 42 insertions, 20 deletions
diff --git a/net/mac80211/rate.h b/net/mac80211/rate.h index 168427b0ffd..9aa2a1190a8 100644 --- a/net/mac80211/rate.h +++ b/net/mac80211/rate.h @@ -14,23 +14,20 @@  #include <linux/netdevice.h>  #include <linux/skbuff.h>  #include <linux/types.h> -#include <linux/kref.h>  #include <net/mac80211.h>  #include "ieee80211_i.h"  #include "sta_info.h" +#include "driver-ops.h"  struct rate_control_ref {  	struct ieee80211_local *local; -	struct rate_control_ops *ops; +	const struct rate_control_ops *ops;  	void *priv; -	struct kref kref;  };  void rate_control_get_rate(struct ieee80211_sub_if_data *sdata,  			   struct sta_info *sta,  			   struct ieee80211_tx_rate_control *txrc); -struct rate_control_ref *rate_control_get(struct rate_control_ref *ref); -void rate_control_put(struct rate_control_ref *ref);  static inline void rate_control_tx_status(struct ieee80211_local *local,  					  struct ieee80211_supported_band *sband, @@ -41,7 +38,7 @@ static inline void rate_control_tx_status(struct ieee80211_local *local,  	struct ieee80211_sta *ista = &sta->sta;  	void *priv_sta = sta->rate_ctrl_priv; -	if (!ref) +	if (!ref || !test_sta_flag(sta, WLAN_STA_RATE_CONTROL))  		return;  	ref->ops->tx_status(ref->priv, sband, ista, priv_sta, skb); @@ -55,27 +52,52 @@ static inline void rate_control_rate_init(struct sta_info *sta)  	struct ieee80211_sta *ista = &sta->sta;  	void *priv_sta = sta->rate_ctrl_priv;  	struct ieee80211_supported_band *sband; +	struct ieee80211_chanctx_conf *chanctx_conf; + +	ieee80211_sta_set_rx_nss(sta);  	if (!ref)  		return; -	sband = local->hw.wiphy->bands[local->hw.conf.channel->band]; +	rcu_read_lock(); + +	chanctx_conf = rcu_dereference(sta->sdata->vif.chanctx_conf); +	if (WARN_ON(!chanctx_conf)) { +		rcu_read_unlock(); +		return; +	} + +	sband = local->hw.wiphy->bands[chanctx_conf->def.chan->band]; -	ref->ops->rate_init(ref->priv, sband, ista, priv_sta); +	ref->ops->rate_init(ref->priv, sband, &chanctx_conf->def, ista, +			    priv_sta); +	rcu_read_unlock(); +	set_sta_flag(sta, WLAN_STA_RATE_CONTROL);  }  static inline void rate_control_rate_update(struct ieee80211_local *local,  				    struct ieee80211_supported_band *sband, -				    struct sta_info *sta, u32 changed, -				    enum nl80211_channel_type oper_chan_type) +				    struct sta_info *sta, u32 changed)  {  	struct rate_control_ref *ref = local->rate_ctrl;  	struct ieee80211_sta *ista = &sta->sta;  	void *priv_sta = sta->rate_ctrl_priv; - -	if (ref && ref->ops->rate_update) -		ref->ops->rate_update(ref->priv, sband, ista, -				      priv_sta, changed, oper_chan_type); +	struct ieee80211_chanctx_conf *chanctx_conf; + +	if (ref && ref->ops->rate_update) { +		rcu_read_lock(); + +		chanctx_conf = rcu_dereference(sta->sdata->vif.chanctx_conf); +		if (WARN_ON(!chanctx_conf)) { +			rcu_read_unlock(); +			return; +		} + +		ref->ops->rate_update(ref->priv, sband, &chanctx_conf->def, +				      ista, priv_sta, changed); +		rcu_read_unlock(); +	} +	drv_sta_rc_update(local, sta->sdata, &sta->sta, changed);  }  static inline void *rate_control_alloc_sta(struct rate_control_ref *ref, @@ -122,8 +144,8 @@ void rate_control_deinitialize(struct ieee80211_local *local);  /* Rate control algorithms */  #ifdef CONFIG_MAC80211_RC_PID -extern int rc80211_pid_init(void); -extern void rc80211_pid_exit(void); +int rc80211_pid_init(void); +void rc80211_pid_exit(void);  #else  static inline int rc80211_pid_init(void)  { @@ -135,8 +157,8 @@ static inline void rc80211_pid_exit(void)  #endif  #ifdef CONFIG_MAC80211_RC_MINSTREL -extern int rc80211_minstrel_init(void); -extern void rc80211_minstrel_exit(void); +int rc80211_minstrel_init(void); +void rc80211_minstrel_exit(void);  #else  static inline int rc80211_minstrel_init(void)  { @@ -148,8 +170,8 @@ static inline void rc80211_minstrel_exit(void)  #endif  #ifdef CONFIG_MAC80211_RC_MINSTREL_HT -extern int rc80211_minstrel_ht_init(void); -extern void rc80211_minstrel_ht_exit(void); +int rc80211_minstrel_ht_init(void); +void rc80211_minstrel_ht_exit(void);  #else  static inline int rc80211_minstrel_ht_init(void)  {  | 
