diff options
author | Johannes Berg <johannes.berg@intel.com> | 2012-03-08 03:18:04 -0500 |
---|---|---|
committer | Wey-Yi Guy <wey-yi.w.guy@intel.com> | 2012-04-12 17:18:19 -0400 |
commit | 3ac40edadcb7799391452ffaa1745084c3e4c747 (patch) | |
tree | a59ead3848833c3b811352078a6236457cd3a943 | |
parent | 4dcba6d3c5f6e9a32db85f6554c8cd81b38f1a42 (diff) |
iwlwifi: calculate active legacy rates per station
Not all stations are guaranteed to have the same
active (available) legacy rates, so calculate them
on rate control init instead of hard-coding them
based on our own available rates. I have no idea
why that was done here before.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn-rs.c | 12 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-core.c | 19 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-dev.h | 2 |
4 files changed, 10 insertions, 25 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c index 08419e833c4d..8b13b6cf940a 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c | |||
@@ -2826,6 +2826,7 @@ void iwl_rs_rate_init(struct iwl_priv *priv, struct ieee80211_sta *sta, u8 sta_i | |||
2826 | struct iwl_station_priv *sta_priv; | 2826 | struct iwl_station_priv *sta_priv; |
2827 | struct iwl_lq_sta *lq_sta; | 2827 | struct iwl_lq_sta *lq_sta; |
2828 | struct ieee80211_supported_band *sband; | 2828 | struct ieee80211_supported_band *sband; |
2829 | unsigned long supp; /* must be unsigned long for for_each_set_bit */ | ||
2829 | 2830 | ||
2830 | sta_priv = (struct iwl_station_priv *) sta->drv_priv; | 2831 | sta_priv = (struct iwl_station_priv *) sta->drv_priv; |
2831 | lq_sta = &sta_priv->lq_sta; | 2832 | lq_sta = &sta_priv->lq_sta; |
@@ -2855,8 +2856,15 @@ void iwl_rs_rate_init(struct iwl_priv *priv, struct ieee80211_sta *sta, u8 sta_i | |||
2855 | lq_sta->max_rate_idx = -1; | 2856 | lq_sta->max_rate_idx = -1; |
2856 | lq_sta->missed_rate_counter = IWL_MISSED_RATE_MAX; | 2857 | lq_sta->missed_rate_counter = IWL_MISSED_RATE_MAX; |
2857 | lq_sta->is_green = rs_use_green(sta); | 2858 | lq_sta->is_green = rs_use_green(sta); |
2858 | lq_sta->active_legacy_rate = priv->active_rate & ~(0x1000); | 2859 | lq_sta->band = sband->band; |
2859 | lq_sta->band = priv->band; | 2860 | /* |
2861 | * active legacy rates as per supported rates bitmap | ||
2862 | */ | ||
2863 | supp = sta->supp_rates[sband->band]; | ||
2864 | lq_sta->active_legacy_rate = 0; | ||
2865 | for_each_set_bit(i, &supp, BITS_PER_LONG) | ||
2866 | lq_sta->active_legacy_rate |= BIT(sband->bitrates[i].hw_value); | ||
2867 | |||
2860 | /* | 2868 | /* |
2861 | * active_siso_rate mask includes 9 MBits (bit 5), and CCK (bits 0-3), | 2869 | * active_siso_rate mask includes 9 MBits (bit 5), and CCK (bits 0-3), |
2862 | * supp_rates[] does not; shift to convert format, force 9 MBits off. | 2870 | * supp_rates[] does not; shift to convert format, force 9 MBits off. |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index b507ee69b3bb..208b827ce9f9 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c | |||
@@ -790,8 +790,6 @@ int iwl_alive_start(struct iwl_priv *priv) | |||
790 | 790 | ||
791 | ieee80211_wake_queues(priv->hw); | 791 | ieee80211_wake_queues(priv->hw); |
792 | 792 | ||
793 | priv->active_rate = IWL_RATES_MASK; | ||
794 | |||
795 | /* Configure Tx antenna selection based on H/W config */ | 793 | /* Configure Tx antenna selection based on H/W config */ |
796 | iwlagn_send_tx_ant_config(priv, priv->hw_params.valid_tx_ant); | 794 | iwlagn_send_tx_ant_config(priv, priv->hw_params.valid_tx_ant); |
797 | 795 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c index 6a02ade07a24..0f86f1c323aa 100644 --- a/drivers/net/wireless/iwlwifi/iwl-core.c +++ b/drivers/net/wireless/iwlwifi/iwl-core.c | |||
@@ -287,26 +287,7 @@ void iwl_connection_init_rx_config(struct iwl_priv *priv, | |||
287 | 287 | ||
288 | void iwl_set_rate(struct iwl_priv *priv) | 288 | void iwl_set_rate(struct iwl_priv *priv) |
289 | { | 289 | { |
290 | const struct ieee80211_supported_band *hw = NULL; | ||
291 | struct ieee80211_rate *rate; | ||
292 | struct iwl_rxon_context *ctx; | 290 | struct iwl_rxon_context *ctx; |
293 | int i; | ||
294 | |||
295 | hw = iwl_get_hw_mode(priv, priv->band); | ||
296 | if (!hw) { | ||
297 | IWL_ERR(priv, "Failed to set rate: unable to get hw mode\n"); | ||
298 | return; | ||
299 | } | ||
300 | |||
301 | priv->active_rate = 0; | ||
302 | |||
303 | for (i = 0; i < hw->n_bitrates; i++) { | ||
304 | rate = &(hw->bitrates[i]); | ||
305 | if (rate->hw_value < IWL_RATE_COUNT_LEGACY) | ||
306 | priv->active_rate |= (1 << rate->hw_value); | ||
307 | } | ||
308 | |||
309 | IWL_DEBUG_RATE(priv, "Set active_rate = %0x\n", priv->active_rate); | ||
310 | 291 | ||
311 | for_each_context(priv, ctx) { | 292 | for_each_context(priv, ctx) { |
312 | ctx->staging.cck_basic_rates = | 293 | ctx->staging.cck_basic_rates = |
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h index 2c41423a5e43..d8dd9ac79629 100644 --- a/drivers/net/wireless/iwlwifi/iwl-dev.h +++ b/drivers/net/wireless/iwlwifi/iwl-dev.h | |||
@@ -861,8 +861,6 @@ struct iwl_priv { | |||
861 | 861 | ||
862 | __le16 switch_channel; | 862 | __le16 switch_channel; |
863 | 863 | ||
864 | u16 active_rate; | ||
865 | |||
866 | u8 start_calib; | 864 | u8 start_calib; |
867 | struct iwl_sensitivity_data sensitivity_data; | 865 | struct iwl_sensitivity_data sensitivity_data; |
868 | struct iwl_chain_noise_data chain_noise_data; | 866 | struct iwl_chain_noise_data chain_noise_data; |