summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2012-03-08 03:18:04 -0500
committerWey-Yi Guy <wey-yi.w.guy@intel.com>2012-04-12 17:18:19 -0400
commit3ac40edadcb7799391452ffaa1745084c3e4c747 (patch)
treea59ead3848833c3b811352078a6236457cd3a943
parent4dcba6d3c5f6e9a32db85f6554c8cd81b38f1a42 (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.c12
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn.c2
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-core.c19
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-dev.h2
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
288void iwl_set_rate(struct iwl_priv *priv) 288void 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;