aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi/iwl-agn-rs.c
diff options
context:
space:
mode:
authorAbbas, Mohamed <mohamed.abbas@intel.com>2009-01-21 00:33:52 -0500
committerJohn W. Linville <linville@tuxdriver.com>2009-01-29 16:01:04 -0500
commitc6ec7a9b17875e3a5a9cdd23f7914d74069316c8 (patch)
treef4be861847da62edad456939f6ce0b7ddb3f773c /drivers/net/wireless/iwlwifi/iwl-agn-rs.c
parent3cbb5dd73697b3f1c677daffe29f00ace22b71e9 (diff)
iwlwifi: allow user to set max rate
allow user to set max rate through #iwconfig <inteface> rate XXX. mac80211 will try to force this if user set it, but driver is not in sync which cause mac80211 to report wrong current rate. This patch will check if max rate is set and force it in rate scaling Signed-off-by: mohamed abbas <mohamed.abbas@intel.com> Signed-off-by: Reinette Chatre <reinette.chatre@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-agn-rs.c')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn-rs.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c
index a82cce5fbff8..12c5e5d6e910 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c
@@ -148,6 +148,7 @@ struct iwl_lq_sta {
148 u16 active_mimo2_rate; 148 u16 active_mimo2_rate;
149 u16 active_mimo3_rate; 149 u16 active_mimo3_rate;
150 u16 active_rate_basic; 150 u16 active_rate_basic;
151 s8 max_rate_idx; /* Max rate set by user */
151 152
152 struct iwl_link_quality_cmd lq; 153 struct iwl_link_quality_cmd lq;
153 struct iwl_scale_tbl_info lq_info[LQ_SIZE]; /* "active", "search" */ 154 struct iwl_scale_tbl_info lq_info[LQ_SIZE]; /* "active", "search" */
@@ -1759,6 +1760,15 @@ static void rs_rate_scale_perform(struct iwl_priv *priv,
1759 return; 1760 return;
1760 } 1761 }
1761 1762
1763 /* force user max rate if set by user */
1764 if ((lq_sta->max_rate_idx != -1) &&
1765 (lq_sta->max_rate_idx < index)) {
1766 index = lq_sta->max_rate_idx;
1767 update_lq = 1;
1768 window = &(tbl->win[index]);
1769 goto lq_update;
1770 }
1771
1762 window = &(tbl->win[index]); 1772 window = &(tbl->win[index]);
1763 1773
1764 /* 1774 /*
@@ -1850,6 +1860,11 @@ static void rs_rate_scale_perform(struct iwl_priv *priv,
1850 low = high_low & 0xff; 1860 low = high_low & 0xff;
1851 high = (high_low >> 8) & 0xff; 1861 high = (high_low >> 8) & 0xff;
1852 1862
1863 /* If user set max rate, dont allow higher than user constrain */
1864 if ((lq_sta->max_rate_idx != -1) &&
1865 (lq_sta->max_rate_idx < high))
1866 high = IWL_RATE_INVALID;
1867
1853 sr = window->success_ratio; 1868 sr = window->success_ratio;
1854 1869
1855 /* Collect measured throughputs for current and adjacent rates */ 1870 /* Collect measured throughputs for current and adjacent rates */
@@ -2110,6 +2125,17 @@ static void rs_get_rate(void *priv_r, struct ieee80211_sta *sta, void *priv_sta,
2110 2125
2111 IWL_DEBUG_RATE_LIMIT("rate scale calculate new rate for skb\n"); 2126 IWL_DEBUG_RATE_LIMIT("rate scale calculate new rate for skb\n");
2112 2127
2128 /* Get max rate if user set max rate */
2129 if (lq_sta) {
2130 lq_sta->max_rate_idx = txrc->max_rate_idx;
2131 if ((sband->band == IEEE80211_BAND_5GHZ) &&
2132 (lq_sta->max_rate_idx != -1))
2133 lq_sta->max_rate_idx += IWL_FIRST_OFDM_RATE;
2134 if ((lq_sta->max_rate_idx < 0) ||
2135 (lq_sta->max_rate_idx >= IWL_RATE_COUNT))
2136 lq_sta->max_rate_idx = -1;
2137 }
2138
2113 if (sta) 2139 if (sta)
2114 mask_bit = sta->supp_rates[sband->band]; 2140 mask_bit = sta->supp_rates[sband->band];
2115 2141
@@ -2220,6 +2246,7 @@ static void rs_rate_init(void *priv_r, struct ieee80211_supported_band *sband,
2220 } 2246 }
2221 2247
2222 lq_sta->is_dup = 0; 2248 lq_sta->is_dup = 0;
2249 lq_sta->max_rate_idx = -1;
2223 lq_sta->is_green = rs_use_green(priv, conf); 2250 lq_sta->is_green = rs_use_green(priv, conf);
2224 lq_sta->active_legacy_rate = priv->active_rate & ~(0x1000); 2251 lq_sta->active_legacy_rate = priv->active_rate & ~(0x1000);
2225 lq_sta->active_rate_basic = priv->active_rate_basic; 2252 lq_sta->active_rate_basic = priv->active_rate_basic;