Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 300677
b: refs/heads/master
c: 64f68e5
h: refs/heads/master
i:
  300675: ab994bf
v: v3
  • Loading branch information
Johannes Berg authored and John W. Linville committed Apr 10, 2012
1 parent 89aedaa commit 81a489f
Show file tree
Hide file tree
Showing 11 changed files with 51 additions and 75 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 24398e39c8ee4a9d9123eed322b859ece4d16cac
refs/heads/master: 64f68e5d15bee47e0d6d0c57a1cf52cedd9b3527
5 changes: 2 additions & 3 deletions trunk/drivers/net/wireless/ath/ath9k/rc.c
Original file line number Diff line number Diff line change
Expand Up @@ -1436,7 +1436,7 @@ static void ath_rate_init(void *priv, struct ieee80211_supported_band *sband,

static void ath_rate_update(void *priv, struct ieee80211_supported_band *sband,
struct ieee80211_sta *sta, void *priv_sta,
u32 changed, enum nl80211_channel_type oper_chan_type)
u32 changed)
{
struct ath_softc *sc = priv;
struct ath_rate_priv *ath_rc_priv = priv_sta;
Expand All @@ -1451,8 +1451,7 @@ static void ath_rate_update(void *priv, struct ieee80211_supported_band *sband,
if (sc->sc_ah->opmode != NL80211_IFTYPE_STATION)
return;

if (oper_chan_type == NL80211_CHAN_HT40MINUS ||
oper_chan_type == NL80211_CHAN_HT40PLUS)
if (sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40)
oper_cw40 = true;

if (oper_cw40)
Expand Down
3 changes: 1 addition & 2 deletions trunk/drivers/net/wireless/rtlwifi/rc.c
Original file line number Diff line number Diff line change
Expand Up @@ -225,8 +225,7 @@ static void rtl_rate_init(void *ppriv,
static void rtl_rate_update(void *ppriv,
struct ieee80211_supported_band *sband,
struct ieee80211_sta *sta, void *priv_sta,
u32 changed,
enum nl80211_channel_type oper_chan_type)
u32 changed)
{
}

Expand Down
5 changes: 2 additions & 3 deletions trunk/include/net/mac80211.h
Original file line number Diff line number Diff line change
Expand Up @@ -3569,9 +3569,8 @@ struct rate_control_ops {
void (*rate_init)(void *priv, struct ieee80211_supported_band *sband,
struct ieee80211_sta *sta, void *priv_sta);
void (*rate_update)(void *priv, struct ieee80211_supported_band *sband,
struct ieee80211_sta *sta,
void *priv_sta, u32 changed,
enum nl80211_channel_type oper_chan_type);
struct ieee80211_sta *sta, void *priv_sta,
u32 changed);
void (*free_sta)(void *priv, struct ieee80211_sta *sta,
void *priv_sta);

Expand Down
26 changes: 0 additions & 26 deletions trunk/net/mac80211/chan.c
Original file line number Diff line number Diff line change
Expand Up @@ -135,29 +135,3 @@ bool ieee80211_set_channel_type(struct ieee80211_local *local,

return result;
}

/*
* ieee80211_get_tx_channel_type returns the channel type we should
* use for packet transmission, given the channel capability and
* whatever regulatory flags we have been given.
*/
enum nl80211_channel_type ieee80211_get_tx_channel_type(
struct ieee80211_local *local,
enum nl80211_channel_type channel_type)
{
switch (channel_type) {
case NL80211_CHAN_HT40PLUS:
if (local->hw.conf.channel->flags &
IEEE80211_CHAN_NO_HT40PLUS)
return NL80211_CHAN_HT20;
break;
case NL80211_CHAN_HT40MINUS:
if (local->hw.conf.channel->flags &
IEEE80211_CHAN_NO_HT40MINUS)
return NL80211_CHAN_HT20;
break;
default:
break;
}
return channel_type;
}
5 changes: 0 additions & 5 deletions trunk/net/mac80211/ieee80211_i.h
Original file line number Diff line number Diff line change
Expand Up @@ -512,8 +512,6 @@ struct ieee80211_if_managed {
int rssi_min_thold, rssi_max_thold;
int last_ave_beacon_signal;

enum nl80211_channel_type tx_chantype;

struct ieee80211_ht_cap ht_capa; /* configured ht-cap over-rides */
struct ieee80211_ht_cap ht_capa_mask; /* Valid parts of ht_capa */
};
Expand Down Expand Up @@ -1501,9 +1499,6 @@ bool ieee80211_set_channel_type(struct ieee80211_local *local,
enum nl80211_channel_type chantype);
enum nl80211_channel_type
ieee80211_ht_oper_to_channel_type(struct ieee80211_ht_operation *ht_oper);
enum nl80211_channel_type ieee80211_get_tx_channel_type(
struct ieee80211_local *local,
enum nl80211_channel_type channel_type);

#ifdef CONFIG_MAC80211_NOINLINE
#define debug_noinline noinline
Expand Down
51 changes: 35 additions & 16 deletions trunk/net/mac80211/mlme.c
Original file line number Diff line number Diff line change
Expand Up @@ -180,21 +180,38 @@ static u32 ieee80211_config_ht_tx(struct ieee80211_sub_if_data *sdata,
struct sta_info *sta;
u32 changed = 0;
u16 ht_opmode;
enum nl80211_channel_type channel_type;
bool disable_40 = false;

sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
channel_type = local->hw.conf.channel_type;

if (WARN_ON_ONCE(channel_type == NL80211_CHAN_NO_HT))
return 0;

channel_type = ieee80211_get_tx_channel_type(local, channel_type);
switch (sdata->vif.bss_conf.channel_type) {
case NL80211_CHAN_HT40PLUS:
if (local->hw.conf.channel->flags & IEEE80211_CHAN_NO_HT40PLUS)
disable_40 = true;
break;
case NL80211_CHAN_HT40MINUS:
if (local->hw.conf.channel->flags & IEEE80211_CHAN_NO_HT40MINUS)
disable_40 = true;
break;
default:
break;
}

/* This can change during the lifetime of the BSS */
if (!(ht_oper->ht_param & IEEE80211_HT_PARAM_CHAN_WIDTH_ANY))
channel_type = NL80211_CHAN_HT20;
disable_40 = true;

if (!reconfig || (sdata->u.mgd.tx_chantype != channel_type)) {
mutex_lock(&local->sta_mtx);
sta = sta_info_get(sdata, bssid);

WARN_ON_ONCE(!sta);

if (sta && !sta->supports_40mhz)
disable_40 = true;

if (sta && (!reconfig ||
(disable_40 != !!(sta->sta.ht_cap.cap &
IEEE80211_HT_CAP_SUP_WIDTH_20_40)))) {
if (reconfig) {
/*
* Whenever the AP announces the HT mode changed
Expand All @@ -211,20 +228,19 @@ static u32 ieee80211_config_ht_tx(struct ieee80211_sub_if_data *sdata,
drv_flush(local, false);
}

rcu_read_lock();
sta = sta_info_get(sdata, bssid);
if (sta)
rate_control_rate_update(local, sband, sta,
IEEE80211_RC_HT_CHANGED,
channel_type);
rcu_read_unlock();
if (disable_40)
sta->sta.ht_cap.cap &= ~IEEE80211_HT_CAP_SUP_WIDTH_20_40;
else
sta->sta.ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;

sdata->u.mgd.tx_chantype = channel_type;
rate_control_rate_update(local, sband, sta,
IEEE80211_RC_HT_CHANGED);

if (reconfig)
ieee80211_wake_queues_by_reason(&sdata->local->hw,
IEEE80211_QUEUE_STOP_REASON_CHTYPE_CHANGE);
}
mutex_unlock(&local->sta_mtx);

ht_opmode = le16_to_cpu(ht_oper->operation_mode);

Expand Down Expand Up @@ -2006,6 +2022,9 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata,
ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband,
elems.ht_cap_elem, &sta->sta.ht_cap);

sta->supports_40mhz =
sta->sta.ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40;

rate_control_rate_init(sta);

if (ifmgd->flags & IEEE80211_STA_MFP_ENABLED)
Expand Down
5 changes: 2 additions & 3 deletions trunk/net/mac80211/rate.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,16 +63,15 @@ static inline void rate_control_rate_init(struct sta_info *sta)

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);
priv_sta, changed);
}

static inline void *rate_control_alloc_sta(struct rate_control_ref *ref,
Expand Down
15 changes: 4 additions & 11 deletions trunk/net/mac80211/rc80211_minstrel_ht.c
Original file line number Diff line number Diff line change
Expand Up @@ -686,8 +686,7 @@ minstrel_ht_get_rate(void *priv, struct ieee80211_sta *sta, void *priv_sta,

static void
minstrel_ht_update_caps(void *priv, struct ieee80211_supported_band *sband,
struct ieee80211_sta *sta, void *priv_sta,
enum nl80211_channel_type oper_chan_type)
struct ieee80211_sta *sta, void *priv_sta)
{
struct minstrel_priv *mp = priv;
struct minstrel_ht_sta_priv *msp = priv_sta;
Expand Down Expand Up @@ -735,10 +734,6 @@ minstrel_ht_update_caps(void *priv, struct ieee80211_supported_band *sband,
if (sta_cap & IEEE80211_HT_CAP_LDPC_CODING)
mi->tx_flags |= IEEE80211_TX_CTL_LDPC;

if (oper_chan_type != NL80211_CHAN_HT40MINUS &&
oper_chan_type != NL80211_CHAN_HT40PLUS)
sta_cap &= ~IEEE80211_HT_CAP_SUP_WIDTH_20_40;

smps = (sta_cap & IEEE80211_HT_CAP_SM_PS) >>
IEEE80211_HT_CAP_SM_PS_SHIFT;

Expand Down Expand Up @@ -788,17 +783,15 @@ static void
minstrel_ht_rate_init(void *priv, struct ieee80211_supported_band *sband,
struct ieee80211_sta *sta, void *priv_sta)
{
struct minstrel_priv *mp = priv;

minstrel_ht_update_caps(priv, sband, sta, priv_sta, mp->hw->conf.channel_type);
minstrel_ht_update_caps(priv, sband, sta, priv_sta);
}

static void
minstrel_ht_rate_update(void *priv, struct ieee80211_supported_band *sband,
struct ieee80211_sta *sta, void *priv_sta,
u32 changed, enum nl80211_channel_type oper_chan_type)
u32 changed)
{
minstrel_ht_update_caps(priv, sband, sta, priv_sta, oper_chan_type);
minstrel_ht_update_caps(priv, sband, sta, priv_sta);
}

static void *
Expand Down
7 changes: 2 additions & 5 deletions trunk/net/mac80211/rx.c
Original file line number Diff line number Diff line change
Expand Up @@ -2268,11 +2268,8 @@ ieee80211_rx_h_action(struct ieee80211_rx_data *rx)

sband = rx->local->hw.wiphy->bands[status->band];

rate_control_rate_update(
local, sband, rx->sta,
IEEE80211_RC_SMPS_CHANGED,
ieee80211_get_tx_channel_type(
local, local->_oper_channel_type));
rate_control_rate_update(local, sband, rx->sta,
IEEE80211_RC_SMPS_CHANGED);
goto handled;
}
default:
Expand Down
2 changes: 2 additions & 0 deletions trunk/net/mac80211/sta_info.h
Original file line number Diff line number Diff line change
Expand Up @@ -369,6 +369,8 @@ struct sta_info {
unsigned int lost_packets;
unsigned int beacon_loss_count;

bool supports_40mhz;

/* keep last! */
struct ieee80211_sta sta;
};
Expand Down

0 comments on commit 81a489f

Please sign in to comment.