aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEyal Shapira <eyal@wizery.com>2013-11-28 05:27:03 -0500
committerEmmanuel Grumbach <emmanuel.grumbach@intel.com>2013-12-09 15:29:48 -0500
commitda87d7d5e787d35a85ab821888e2f0e115dc18cc (patch)
tree96c38753c40ca0b1d062225baaac6e7b1a6a3612
parent809bccfa313e4703b64572986fce6321fb0c039f (diff)
iwlwifi: mvm: rs: fix mapping from HT/VHT rates to legacy
The table rs_ht_to_legacy is used to get the next legacy rate following the last HT or VHT rate in the LQ rates table. The mapping wasn't correct as well as didn't include entries for MCS8/9 which led to out of bounds access. This didn't trigger a crash but led to legacy rate entries using 1Mbps rate. In 5Ghz this probably caused the Tx to fail completely given that Tx attempt would have reached the legacy entries and 1Mbps isn't valid. Signed-off-by: Eyal Shapira <eyal@wizery.com> Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/rs.c25
1 files changed, 12 insertions, 13 deletions
diff --git a/drivers/net/wireless/iwlwifi/mvm/rs.c b/drivers/net/wireless/iwlwifi/mvm/rs.c
index 5c98d462b7c1..ef7126ad5d80 100644
--- a/drivers/net/wireless/iwlwifi/mvm/rs.c
+++ b/drivers/net/wireless/iwlwifi/mvm/rs.c
@@ -56,19 +56,16 @@
56 56
57 57
58static u8 rs_ht_to_legacy[] = { 58static u8 rs_ht_to_legacy[] = {
59 [IWL_RATE_1M_INDEX] = IWL_RATE_6M_INDEX, 59 [IWL_RATE_MCS_0_INDEX] = IWL_RATE_6M_INDEX,
60 [IWL_RATE_2M_INDEX] = IWL_RATE_6M_INDEX, 60 [IWL_RATE_MCS_1_INDEX] = IWL_RATE_9M_INDEX,
61 [IWL_RATE_5M_INDEX] = IWL_RATE_6M_INDEX, 61 [IWL_RATE_MCS_2_INDEX] = IWL_RATE_12M_INDEX,
62 [IWL_RATE_11M_INDEX] = IWL_RATE_6M_INDEX, 62 [IWL_RATE_MCS_3_INDEX] = IWL_RATE_18M_INDEX,
63 [IWL_RATE_6M_INDEX] = IWL_RATE_6M_INDEX, 63 [IWL_RATE_MCS_4_INDEX] = IWL_RATE_24M_INDEX,
64 [IWL_RATE_9M_INDEX] = IWL_RATE_6M_INDEX, 64 [IWL_RATE_MCS_5_INDEX] = IWL_RATE_36M_INDEX,
65 [IWL_RATE_12M_INDEX] = IWL_RATE_9M_INDEX, 65 [IWL_RATE_MCS_6_INDEX] = IWL_RATE_48M_INDEX,
66 [IWL_RATE_18M_INDEX] = IWL_RATE_12M_INDEX, 66 [IWL_RATE_MCS_7_INDEX] = IWL_RATE_54M_INDEX,
67 [IWL_RATE_24M_INDEX] = IWL_RATE_18M_INDEX, 67 [IWL_RATE_MCS_8_INDEX] = IWL_RATE_54M_INDEX,
68 [IWL_RATE_36M_INDEX] = IWL_RATE_24M_INDEX, 68 [IWL_RATE_MCS_9_INDEX] = IWL_RATE_54M_INDEX,
69 [IWL_RATE_48M_INDEX] = IWL_RATE_36M_INDEX,
70 [IWL_RATE_54M_INDEX] = IWL_RATE_48M_INDEX,
71 [IWL_RATE_60M_INDEX] = IWL_RATE_54M_INDEX,
72}; 69};
73 70
74static const u8 ant_toggle_lookup[] = { 71static const u8 ant_toggle_lookup[] = {
@@ -682,6 +679,8 @@ static u32 rs_get_lower_rate(struct iwl_lq_sta *lq_sta,
682 * are always supported (spec demand) */ 679 * are always supported (spec demand) */
683 if (!is_legacy(rate) && (!ht_possible || !scale_index)) { 680 if (!is_legacy(rate) && (!ht_possible || !scale_index)) {
684 switch_to_legacy = 1; 681 switch_to_legacy = 1;
682 WARN_ON_ONCE(scale_index < IWL_RATE_MCS_0_INDEX &&
683 scale_index > IWL_RATE_MCS_9_INDEX);
685 scale_index = rs_ht_to_legacy[scale_index]; 684 scale_index = rs_ht_to_legacy[scale_index];
686 if (lq_sta->band == IEEE80211_BAND_5GHZ) 685 if (lq_sta->band == IEEE80211_BAND_5GHZ)
687 rate->type = LQ_LEGACY_A; 686 rate->type = LQ_LEGACY_A;