aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi
diff options
context:
space:
mode:
authorEyal Shapira <eyal@wizery.com>2013-08-04 16:58:37 -0400
committerJohannes Berg <johannes.berg@intel.com>2013-10-02 12:00:38 -0400
commit4e82dd3a132cd71a7164d01095562aa564e0d739 (patch)
treefa553a7444a7db49bfcd58834e33f2e9d38dcf6f /drivers/net/wireless/iwlwifi
parent22f6642c52e9e02732f620f9cde952cbfa87dfc8 (diff)
iwlwifi: mvm: update expected tpt tables for VHT
VHT introduces MCS8 and MCS9. Update the expected tpt tables to include these. Previous expected values for 20/40 MHz are incorrect in certain cases so fix these as well. Signed-off-by: Eyal Shapira <eyal@wizery.com> Tested-by: Efi Tubul <efi.tubul@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi')
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/fw-api-rs.h17
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/rs.c51
2 files changed, 42 insertions, 26 deletions
diff --git a/drivers/net/wireless/iwlwifi/mvm/fw-api-rs.h b/drivers/net/wireless/iwlwifi/mvm/fw-api-rs.h
index fdd33bc0a594..ada130524ef8 100644
--- a/drivers/net/wireless/iwlwifi/mvm/fw-api-rs.h
+++ b/drivers/net/wireless/iwlwifi/mvm/fw-api-rs.h
@@ -78,18 +78,31 @@ enum {
78 IWL_LAST_CCK_RATE = IWL_RATE_11M_INDEX, 78 IWL_LAST_CCK_RATE = IWL_RATE_11M_INDEX,
79 IWL_RATE_6M_INDEX, 79 IWL_RATE_6M_INDEX,
80 IWL_FIRST_OFDM_RATE = IWL_RATE_6M_INDEX, 80 IWL_FIRST_OFDM_RATE = IWL_RATE_6M_INDEX,
81 IWL_RATE_MCS_0_INDEX = IWL_RATE_6M_INDEX,
82 IWL_FIRST_HT_RATE = IWL_RATE_MCS_0_INDEX,
83 IWL_FIRST_VHT_RATE = IWL_RATE_MCS_0_INDEX,
81 IWL_RATE_9M_INDEX, 84 IWL_RATE_9M_INDEX,
82 IWL_RATE_12M_INDEX, 85 IWL_RATE_12M_INDEX,
86 IWL_RATE_MCS_1_INDEX = IWL_RATE_12M_INDEX,
83 IWL_RATE_18M_INDEX, 87 IWL_RATE_18M_INDEX,
88 IWL_RATE_MCS_2_INDEX = IWL_RATE_18M_INDEX,
84 IWL_RATE_24M_INDEX, 89 IWL_RATE_24M_INDEX,
90 IWL_RATE_MCS_3_INDEX = IWL_RATE_24M_INDEX,
85 IWL_RATE_36M_INDEX, 91 IWL_RATE_36M_INDEX,
92 IWL_RATE_MCS_4_INDEX = IWL_RATE_36M_INDEX,
86 IWL_RATE_48M_INDEX, 93 IWL_RATE_48M_INDEX,
94 IWL_RATE_MCS_5_INDEX = IWL_RATE_48M_INDEX,
87 IWL_RATE_54M_INDEX, 95 IWL_RATE_54M_INDEX,
96 IWL_RATE_MCS_6_INDEX = IWL_RATE_54M_INDEX,
88 IWL_LAST_NON_HT_RATE = IWL_RATE_54M_INDEX, 97 IWL_LAST_NON_HT_RATE = IWL_RATE_54M_INDEX,
89 IWL_RATE_60M_INDEX, 98 IWL_RATE_60M_INDEX,
90 IWL_LAST_OFDM_RATE = IWL_RATE_60M_INDEX, 99 IWL_RATE_MCS_7_INDEX = IWL_RATE_60M_INDEX,
100 IWL_LAST_HT_RATE = IWL_RATE_MCS_7_INDEX,
101 IWL_RATE_MCS_8_INDEX,
102 IWL_RATE_MCS_9_INDEX,
103 IWL_LAST_VHT_RATE = IWL_RATE_MCS_9_INDEX,
91 IWL_RATE_COUNT_LEGACY = IWL_LAST_NON_HT_RATE + 1, 104 IWL_RATE_COUNT_LEGACY = IWL_LAST_NON_HT_RATE + 1,
92 IWL_RATE_COUNT, 105 IWL_RATE_COUNT = IWL_LAST_VHT_RATE + 1,
93}; 106};
94 107
95#define IWL_RATE_BIT_MSK(r) BIT(IWL_RATE_##r##M_INDEX) 108#define IWL_RATE_BIT_MSK(r) BIT(IWL_RATE_##r##M_INDEX)
diff --git a/drivers/net/wireless/iwlwifi/mvm/rs.c b/drivers/net/wireless/iwlwifi/mvm/rs.c
index ffcc63539c3a..6880ef3d064d 100644
--- a/drivers/net/wireless/iwlwifi/mvm/rs.c
+++ b/drivers/net/wireless/iwlwifi/mvm/rs.c
@@ -136,7 +136,7 @@ static int iwl_hwrate_to_plcp_idx(u32 rate_n_flags)
136 /* skip 9M not supported in ht*/ 136 /* skip 9M not supported in ht*/
137 if (idx >= IWL_RATE_9M_INDEX) 137 if (idx >= IWL_RATE_9M_INDEX)
138 idx += 1; 138 idx += 1;
139 if ((idx >= IWL_FIRST_OFDM_RATE) && (idx <= IWL_LAST_OFDM_RATE)) 139 if ((idx >= IWL_FIRST_HT_RATE) && (idx <= IWL_LAST_HT_RATE))
140 return idx; 140 return idx;
141 141
142 /* legacy rate format, search for match in table */ 142 /* legacy rate format, search for match in table */
@@ -180,35 +180,38 @@ static void rs_dbgfs_set_mcs(struct iwl_lq_sta *lq_sta,
180 */ 180 */
181 181
182static s32 expected_tpt_legacy[IWL_RATE_COUNT] = { 182static s32 expected_tpt_legacy[IWL_RATE_COUNT] = {
183 7, 13, 35, 58, 40, 57, 72, 98, 121, 154, 177, 186, 0 183 7, 13, 35, 58, 40, 57, 72, 98, 121, 154, 177, 186, 0, 0, 0
184}; 184};
185 185
186static s32 expected_tpt_siso20MHz[4][IWL_RATE_COUNT] = { 186/* Expected TpT tables. 4 indexes:
187 {0, 0, 0, 0, 42, 0, 76, 102, 124, 159, 183, 193, 202}, /* Norm */ 187 * 0 - NGI, 1 - SGI, 2 - AGG+NGI, 3 - AGG+SGI
188 {0, 0, 0, 0, 46, 0, 82, 110, 132, 168, 192, 202, 210}, /* SGI */ 188 */
189 {0, 0, 0, 0, 47, 0, 91, 133, 171, 242, 305, 334, 362}, /* AGG */ 189static s32 expected_tpt_siso_20MHz[4][IWL_RATE_COUNT] = {
190 {0, 0, 0, 0, 52, 0, 101, 145, 187, 264, 330, 361, 390}, /* AGG+SGI */ 190 {0, 0, 0, 0, 42, 0, 76, 102, 124, 159, 183, 193, 202, 216, 0},
191 {0, 0, 0, 0, 46, 0, 82, 110, 132, 168, 192, 202, 210, 225, 0},
192 {0, 0, 0, 0, 49, 0, 97, 145, 192, 285, 375, 420, 464, 551, 0},
193 {0, 0, 0, 0, 54, 0, 108, 160, 213, 315, 415, 465, 513, 608, 0},
191}; 194};
192 195
193static s32 expected_tpt_siso40MHz[4][IWL_RATE_COUNT] = { 196static s32 expected_tpt_siso_40MHz[4][IWL_RATE_COUNT] = {
194 {0, 0, 0, 0, 77, 0, 127, 160, 184, 220, 242, 250, 257}, /* Norm */ 197 {0, 0, 0, 0, 77, 0, 127, 160, 184, 220, 242, 250, 257, 269, 275},
195 {0, 0, 0, 0, 83, 0, 135, 169, 193, 229, 250, 257, 264}, /* SGI */ 198 {0, 0, 0, 0, 83, 0, 135, 169, 193, 229, 250, 257, 264, 275, 280},
196 {0, 0, 0, 0, 94, 0, 177, 249, 313, 423, 512, 550, 586}, /* AGG */ 199 {0, 0, 0, 0, 101, 0, 199, 295, 389, 570, 744, 828, 911, 1070, 1173},
197 {0, 0, 0, 0, 104, 0, 193, 270, 338, 454, 545, 584, 620}, /* AGG+SGI */ 200 {0, 0, 0, 0, 112, 0, 220, 326, 429, 629, 819, 912, 1000, 1173, 1284},
198}; 201};
199 202
200static s32 expected_tpt_mimo2_20MHz[4][IWL_RATE_COUNT] = { 203static s32 expected_tpt_mimo2_20MHz[4][IWL_RATE_COUNT] = {
201 {0, 0, 0, 0, 74, 0, 123, 155, 179, 214, 236, 244, 251}, /* Norm */ 204 {0, 0, 0, 0, 74, 0, 123, 155, 179, 213, 235, 243, 250, 261, 0},
202 {0, 0, 0, 0, 81, 0, 131, 164, 188, 223, 243, 251, 257}, /* SGI */ 205 {0, 0, 0, 0, 81, 0, 131, 164, 187, 221, 242, 250, 256, 267, 0},
203 {0, 0, 0, 0, 89, 0, 167, 235, 296, 402, 488, 526, 560}, /* AGG */ 206 {0, 0, 0, 0, 98, 0, 193, 286, 375, 550, 718, 799, 878, 1032, 0},
204 {0, 0, 0, 0, 97, 0, 182, 255, 320, 431, 520, 558, 593}, /* AGG+SGI*/ 207 {0, 0, 0, 0, 109, 0, 214, 316, 414, 607, 790, 879, 965, 1132, 0},
205}; 208};
206 209
207static s32 expected_tpt_mimo2_40MHz[4][IWL_RATE_COUNT] = { 210static s32 expected_tpt_mimo2_40MHz[4][IWL_RATE_COUNT] = {
208 {0, 0, 0, 0, 123, 0, 182, 214, 235, 264, 279, 285, 289}, /* Norm */ 211 {0, 0, 0, 0, 123, 0, 182, 214, 235, 264, 279, 285, 289, 296, 300},
209 {0, 0, 0, 0, 131, 0, 191, 222, 242, 270, 284, 289, 293}, /* SGI */ 212 {0, 0, 0, 0, 131, 0, 191, 222, 242, 270, 284, 289, 293, 300, 303},
210 {0, 0, 0, 0, 171, 0, 305, 410, 496, 634, 731, 771, 805}, /* AGG */ 213 {0, 0, 0, 0, 200, 0, 390, 571, 741, 1067, 1365, 1505, 1640, 1894, 2053},
211 {0, 0, 0, 0, 186, 0, 329, 439, 527, 667, 764, 803, 838}, /* AGG+SGI */ 214 {0, 0, 0, 0, 221, 0, 430, 630, 816, 1169, 1490, 1641, 1784, 2053, 2221},
212}; 215};
213 216
214/* mbps, mcs */ 217/* mbps, mcs */
@@ -426,9 +429,9 @@ static u32 rate_n_flags_from_tbl(struct iwl_mvm *mvm,
426 if (index >= IWL_FIRST_CCK_RATE && index <= IWL_LAST_CCK_RATE) 429 if (index >= IWL_FIRST_CCK_RATE && index <= IWL_LAST_CCK_RATE)
427 rate_n_flags |= RATE_MCS_CCK_MSK; 430 rate_n_flags |= RATE_MCS_CCK_MSK;
428 } else if (is_Ht(tbl->lq_type)) { 431 } else if (is_Ht(tbl->lq_type)) {
429 if (index > IWL_LAST_OFDM_RATE) { 432 if (index > IWL_LAST_HT_RATE) {
430 IWL_ERR(mvm, "Invalid HT rate index %d\n", index); 433 IWL_ERR(mvm, "Invalid HT rate index %d\n", index);
431 index = IWL_LAST_OFDM_RATE; 434 index = IWL_LAST_HT_RATE;
432 } 435 }
433 rate_n_flags = RATE_MCS_HT_MSK; 436 rate_n_flags = RATE_MCS_HT_MSK;
434 437
@@ -962,9 +965,9 @@ static void rs_set_expected_tpt_table(struct iwl_lq_sta *lq_sta,
962 * (SISO/MIMO2), channel width (20/40), SGI, and aggregation 965 * (SISO/MIMO2), channel width (20/40), SGI, and aggregation
963 * status */ 966 * status */
964 if (is_siso(tbl->lq_type) && !tbl->is_ht40) 967 if (is_siso(tbl->lq_type) && !tbl->is_ht40)
965 ht_tbl_pointer = expected_tpt_siso20MHz; 968 ht_tbl_pointer = expected_tpt_siso_20MHz;
966 else if (is_siso(tbl->lq_type)) 969 else if (is_siso(tbl->lq_type))
967 ht_tbl_pointer = expected_tpt_siso40MHz; 970 ht_tbl_pointer = expected_tpt_siso_40MHz;
968 else if (is_mimo2(tbl->lq_type) && !tbl->is_ht40) 971 else if (is_mimo2(tbl->lq_type) && !tbl->is_ht40)
969 ht_tbl_pointer = expected_tpt_mimo2_20MHz; 972 ht_tbl_pointer = expected_tpt_mimo2_20MHz;
970 else { 973 else {