aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi/iwl-3945-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-3945-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-3945-rs.c')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-3945-rs.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945-rs.c b/drivers/net/wireless/iwlwifi/iwl-3945-rs.c
index 25b4356fcc1c..044abf734eb6 100644
--- a/drivers/net/wireless/iwlwifi/iwl-3945-rs.c
+++ b/drivers/net/wireless/iwlwifi/iwl-3945-rs.c
@@ -651,6 +651,7 @@ static void rs_get_rate(void *priv_r, struct ieee80211_sta *sta,
651 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 651 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
652 u16 fc; 652 u16 fc;
653 u16 rate_mask = 0; 653 u16 rate_mask = 0;
654 s8 max_rate_idx = -1;
654 struct iwl_priv *priv = (struct iwl_priv *)priv_r; 655 struct iwl_priv *priv = (struct iwl_priv *)priv_r;
655 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 656 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
656 657
@@ -675,6 +676,13 @@ static void rs_get_rate(void *priv_r, struct ieee80211_sta *sta,
675 return; 676 return;
676 } 677 }
677 678
679 /* get user max rate if set */
680 max_rate_idx = txrc->max_rate_idx;
681 if ((sband->band == IEEE80211_BAND_5GHZ) && (max_rate_idx != -1))
682 max_rate_idx += IWL_FIRST_OFDM_RATE;
683 if ((max_rate_idx < 0) || (max_rate_idx >= IWL_RATE_COUNT))
684 max_rate_idx = -1;
685
678 index = min(rs_sta->last_txrate_idx & 0xffff, IWL_RATE_COUNT_3945 - 1); 686 index = min(rs_sta->last_txrate_idx & 0xffff, IWL_RATE_COUNT_3945 - 1);
679 687
680 if (sband->band == IEEE80211_BAND_5GHZ) 688 if (sband->band == IEEE80211_BAND_5GHZ)
@@ -706,6 +714,12 @@ static void rs_get_rate(void *priv_r, struct ieee80211_sta *sta,
706 rs_sta->start_rate = IWL_RATE_INVALID; 714 rs_sta->start_rate = IWL_RATE_INVALID;
707 } 715 }
708 716
717 /* force user max rate if set by user */
718 if ((max_rate_idx != -1) && (max_rate_idx < index)) {
719 if (rate_mask & (1 << max_rate_idx))
720 index = max_rate_idx;
721 }
722
709 window = &(rs_sta->win[index]); 723 window = &(rs_sta->win[index]);
710 724
711 fail_count = window->counter - window->success_counter; 725 fail_count = window->counter - window->success_counter;
@@ -732,6 +746,10 @@ static void rs_get_rate(void *priv_r, struct ieee80211_sta *sta,
732 low = high_low & 0xff; 746 low = high_low & 0xff;
733 high = (high_low >> 8) & 0xff; 747 high = (high_low >> 8) & 0xff;
734 748
749 /* If user set max rate, dont allow higher than user constrain */
750 if ((max_rate_idx != -1) && (max_rate_idx < high))
751 high = IWL_RATE_INVALID;
752
735 if (low != IWL_RATE_INVALID) 753 if (low != IWL_RATE_INVALID)
736 low_tpt = rs_sta->win[low].average_tpt; 754 low_tpt = rs_sta->win[low].average_tpt;
737 755