diff options
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-3945-rs.c')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-3945-rs.c | 18 |
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 | ||