aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEyal Shapira <eyal@wizery.com>2013-07-28 19:02:45 -0400
committerJohannes Berg <johannes.berg@intel.com>2013-08-12 09:23:54 -0400
commitd972ab31b90cf1c61f6f77a1968244280930c000 (patch)
tree3b6d7095158448187ddc49784f8bd6c6837872f6
parente3c588ec0d9ef4e52caf0704a007440fb381d97f (diff)
iwlwifi: mvm: remove MIMO3 from rate scale code
Current and future chips supported by mvm will only have a maximum of 2 antennas so all the MIMO3 related code and states can be dropped. Signed-off-by: Eyal Shapira <eyal@wizery.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/rs.c393
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/rs.h41
2 files changed, 45 insertions, 389 deletions
diff --git a/drivers/net/wireless/iwlwifi/mvm/rs.c b/drivers/net/wireless/iwlwifi/mvm/rs.c
index a587b21e1fe1..5cb3132b8b37 100644
--- a/drivers/net/wireless/iwlwifi/mvm/rs.c
+++ b/drivers/net/wireless/iwlwifi/mvm/rs.c
@@ -86,7 +86,6 @@ static const u8 ant_toggle_lookup[] = {
86 [IWL_RATE_##r##M_INDEX] = { IWL_RATE_##r##M_PLCP, \ 86 [IWL_RATE_##r##M_INDEX] = { IWL_RATE_##r##M_PLCP, \
87 IWL_RATE_SISO_##s##M_PLCP, \ 87 IWL_RATE_SISO_##s##M_PLCP, \
88 IWL_RATE_MIMO2_##s##M_PLCP,\ 88 IWL_RATE_MIMO2_##s##M_PLCP,\
89 IWL_RATE_MIMO3_##s##M_PLCP,\
90 IWL_RATE_##rp##M_INDEX, \ 89 IWL_RATE_##rp##M_INDEX, \
91 IWL_RATE_##rn##M_INDEX } 90 IWL_RATE_##rn##M_INDEX }
92 91
@@ -129,9 +128,8 @@ static int iwl_hwrate_to_plcp_idx(u32 rate_n_flags)
129 if (rate_n_flags & RATE_MCS_HT_MSK) { 128 if (rate_n_flags & RATE_MCS_HT_MSK) {
130 idx = rs_extract_rate(rate_n_flags); 129 idx = rs_extract_rate(rate_n_flags);
131 130
132 if (idx >= IWL_RATE_MIMO3_6M_PLCP) 131 WARN_ON_ONCE(idx >= IWL_RATE_MIMO3_6M_PLCP);
133 idx = idx - IWL_RATE_MIMO3_6M_PLCP; 132 if (idx >= IWL_RATE_MIMO2_6M_PLCP)
134 else if (idx >= IWL_RATE_MIMO2_6M_PLCP)
135 idx = idx - IWL_RATE_MIMO2_6M_PLCP; 133 idx = idx - IWL_RATE_MIMO2_6M_PLCP;
136 134
137 idx += IWL_FIRST_OFDM_RATE; 135 idx += IWL_FIRST_OFDM_RATE;
@@ -213,20 +211,6 @@ static s32 expected_tpt_mimo2_40MHz[4][IWL_RATE_COUNT] = {
213 {0, 0, 0, 0, 186, 0, 329, 439, 527, 667, 764, 803, 838}, /* AGG+SGI */ 211 {0, 0, 0, 0, 186, 0, 329, 439, 527, 667, 764, 803, 838}, /* AGG+SGI */
214}; 212};
215 213
216static s32 expected_tpt_mimo3_20MHz[4][IWL_RATE_COUNT] = {
217 {0, 0, 0, 0, 99, 0, 153, 186, 208, 239, 256, 263, 268}, /* Norm */
218 {0, 0, 0, 0, 106, 0, 162, 194, 215, 246, 262, 268, 273}, /* SGI */
219 {0, 0, 0, 0, 134, 0, 249, 346, 431, 574, 685, 732, 775}, /* AGG */
220 {0, 0, 0, 0, 148, 0, 272, 376, 465, 614, 727, 775, 818}, /* AGG+SGI */
221};
222
223static s32 expected_tpt_mimo3_40MHz[4][IWL_RATE_COUNT] = {
224 {0, 0, 0, 0, 152, 0, 211, 239, 255, 279, 290, 294, 297}, /* Norm */
225 {0, 0, 0, 0, 160, 0, 219, 245, 261, 284, 294, 297, 300}, /* SGI */
226 {0, 0, 0, 0, 254, 0, 443, 584, 695, 868, 984, 1030, 1070}, /* AGG */
227 {0, 0, 0, 0, 277, 0, 478, 624, 737, 911, 1026, 1070, 1109}, /* AGG+SGI */
228};
229
230/* mbps, mcs */ 214/* mbps, mcs */
231static const struct iwl_rate_mcs_info iwl_rate_mcs[IWL_RATE_COUNT] = { 215static const struct iwl_rate_mcs_info iwl_rate_mcs[IWL_RATE_COUNT] = {
232 { "1", "BPSK DSSS"}, 216 { "1", "BPSK DSSS"},
@@ -274,7 +258,6 @@ static void rs_program_fix_rate(struct iwl_mvm *mvm,
274 lq_sta->active_legacy_rate = 0x0FFF; /* 1 - 54 MBits, includes CCK */ 258 lq_sta->active_legacy_rate = 0x0FFF; /* 1 - 54 MBits, includes CCK */
275 lq_sta->active_siso_rate = 0x1FD0; /* 6 - 60 MBits, no 9, no CCK */ 259 lq_sta->active_siso_rate = 0x1FD0; /* 6 - 60 MBits, no 9, no CCK */
276 lq_sta->active_mimo2_rate = 0x1FD0; /* 6 - 60 MBits, no 9, no CCK */ 260 lq_sta->active_mimo2_rate = 0x1FD0; /* 6 - 60 MBits, no 9, no CCK */
277 lq_sta->active_mimo3_rate = 0x1FD0; /* 6 - 60 MBits, no 9, no CCK */
278 261
279 IWL_DEBUG_RATE(mvm, "sta_id %d rate 0x%X\n", 262 IWL_DEBUG_RATE(mvm, "sta_id %d rate 0x%X\n",
280 lq_sta->lq.sta_id, lq_sta->dbg_fixed_rate); 263 lq_sta->lq.sta_id, lq_sta->dbg_fixed_rate);
@@ -454,7 +437,7 @@ static u32 rate_n_flags_from_tbl(struct iwl_mvm *mvm,
454 else if (is_mimo2(tbl->lq_type)) 437 else if (is_mimo2(tbl->lq_type))
455 rate_n_flags |= iwl_rates[index].plcp_mimo2; 438 rate_n_flags |= iwl_rates[index].plcp_mimo2;
456 else 439 else
457 rate_n_flags |= iwl_rates[index].plcp_mimo3; 440 WARN_ON_ONCE(1);
458 } else { 441 } else {
459 IWL_ERR(mvm, "Invalid tbl->lq_type %d\n", tbl->lq_type); 442 IWL_ERR(mvm, "Invalid tbl->lq_type %d\n", tbl->lq_type);
460 } 443 }
@@ -531,12 +514,8 @@ static int rs_get_tbl_info_from_mcs(const u32 rate_n_flags,
531 } else if (mcs <= IWL_RATE_MIMO2_60M_PLCP) { 514 } else if (mcs <= IWL_RATE_MIMO2_60M_PLCP) {
532 if (num_of_ant == 2) 515 if (num_of_ant == 2)
533 tbl->lq_type = LQ_MIMO2; 516 tbl->lq_type = LQ_MIMO2;
534 /* MIMO3 */
535 } else { 517 } else {
536 if (num_of_ant == 3) { 518 WARN_ON_ONCE(num_of_ant == 3);
537 tbl->max_search = IWL_MAX_11N_MIMO3_SEARCH;
538 tbl->lq_type = LQ_MIMO3;
539 }
540 } 519 }
541 } 520 }
542 return 0; 521 return 0;
@@ -602,10 +581,10 @@ static u16 rs_get_supported_rates(struct iwl_lq_sta *lq_sta,
602 } else { 581 } else {
603 if (is_siso(rate_type)) 582 if (is_siso(rate_type))
604 return lq_sta->active_siso_rate; 583 return lq_sta->active_siso_rate;
605 else if (is_mimo2(rate_type)) 584 else {
585 WARN_ON_ONCE(!is_mimo2(rate_type));
606 return lq_sta->active_mimo2_rate; 586 return lq_sta->active_mimo2_rate;
607 else 587 }
608 return lq_sta->active_mimo3_rate;
609 } 588 }
610} 589}
611 590
@@ -980,7 +959,7 @@ static void rs_set_expected_tpt_table(struct iwl_lq_sta *lq_sta,
980 } 959 }
981 960
982 /* Choose among many HT tables depending on number of streams 961 /* Choose among many HT tables depending on number of streams
983 * (SISO/MIMO2/MIMO3), channel width (20/40), SGI, and aggregation 962 * (SISO/MIMO2), channel width (20/40), SGI, and aggregation
984 * status */ 963 * status */
985 if (is_siso(tbl->lq_type) && !tbl->is_ht40) 964 if (is_siso(tbl->lq_type) && !tbl->is_ht40)
986 ht_tbl_pointer = expected_tpt_siso20MHz; 965 ht_tbl_pointer = expected_tpt_siso20MHz;
@@ -988,12 +967,10 @@ static void rs_set_expected_tpt_table(struct iwl_lq_sta *lq_sta,
988 ht_tbl_pointer = expected_tpt_siso40MHz; 967 ht_tbl_pointer = expected_tpt_siso40MHz;
989 else if (is_mimo2(tbl->lq_type) && !tbl->is_ht40) 968 else if (is_mimo2(tbl->lq_type) && !tbl->is_ht40)
990 ht_tbl_pointer = expected_tpt_mimo2_20MHz; 969 ht_tbl_pointer = expected_tpt_mimo2_20MHz;
991 else if (is_mimo2(tbl->lq_type)) 970 else {
971 WARN_ON_ONCE(!is_mimo2(tbl->lq_type));
992 ht_tbl_pointer = expected_tpt_mimo2_40MHz; 972 ht_tbl_pointer = expected_tpt_mimo2_40MHz;
993 else if (is_mimo3(tbl->lq_type) && !tbl->is_ht40) 973 }
994 ht_tbl_pointer = expected_tpt_mimo3_20MHz;
995 else /* if (is_mimo3(tbl->lq_type)) <-- must be true */
996 ht_tbl_pointer = expected_tpt_mimo3_40MHz;
997 974
998 if (!tbl->is_SGI && !lq_sta->is_agg) /* Normal */ 975 if (!tbl->is_SGI && !lq_sta->is_agg) /* Normal */
999 tbl->expected_tpt = ht_tbl_pointer[0]; 976 tbl->expected_tpt = ht_tbl_pointer[0];
@@ -1165,58 +1142,6 @@ static int rs_switch_to_mimo2(struct iwl_mvm *mvm,
1165} 1142}
1166 1143
1167/* 1144/*
1168 * Set up search table for MIMO3
1169 */
1170static int rs_switch_to_mimo3(struct iwl_mvm *mvm,
1171 struct iwl_lq_sta *lq_sta,
1172 struct ieee80211_sta *sta,
1173 struct iwl_scale_tbl_info *tbl, int index)
1174{
1175 u16 rate_mask;
1176 s32 rate;
1177 s8 is_green = lq_sta->is_green;
1178
1179 if (!sta->ht_cap.ht_supported)
1180 return -1;
1181
1182 if (sta->smps_mode == IEEE80211_SMPS_STATIC)
1183 return -1;
1184
1185 /* Need both Tx chains/antennas to support MIMO */
1186 if (num_of_ant(iwl_fw_valid_tx_ant(mvm->fw)) < 3)
1187 return -1;
1188
1189 IWL_DEBUG_RATE(mvm, "LQ: try to switch to MIMO3\n");
1190
1191 tbl->lq_type = LQ_MIMO3;
1192 tbl->action = 0;
1193 tbl->max_search = IWL_MAX_11N_MIMO3_SEARCH;
1194 rate_mask = lq_sta->active_mimo3_rate;
1195
1196 if (iwl_is_ht40_tx_allowed(sta))
1197 tbl->is_ht40 = 1;
1198 else
1199 tbl->is_ht40 = 0;
1200
1201 rs_set_expected_tpt_table(lq_sta, tbl);
1202
1203 rate = rs_get_best_rate(mvm, lq_sta, tbl, rate_mask, index);
1204
1205 IWL_DEBUG_RATE(mvm, "LQ: MIMO3 best rate %d mask %X\n",
1206 rate, rate_mask);
1207 if ((rate == IWL_RATE_INVALID) || !((1 << rate) & rate_mask)) {
1208 IWL_DEBUG_RATE(mvm, "Can't switch with index %d rate mask %x\n",
1209 rate, rate_mask);
1210 return -1;
1211 }
1212 tbl->current_rate = rate_n_flags_from_tbl(mvm, tbl, rate, is_green);
1213
1214 IWL_DEBUG_RATE(mvm, "LQ: Switch to new mcs %X index is green %X\n",
1215 tbl->current_rate, is_green);
1216 return 0;
1217}
1218
1219/*
1220 * Set up search table for SISO 1145 * Set up search table for SISO
1221 */ 1146 */
1222static int rs_switch_to_siso(struct iwl_mvm *mvm, 1147static int rs_switch_to_siso(struct iwl_mvm *mvm,
@@ -1325,21 +1250,14 @@ static int rs_move_legacy_other(struct iwl_mvm *mvm,
1325 } 1250 }
1326 1251
1327 break; 1252 break;
1328 case IWL_LEGACY_SWITCH_MIMO2_AB: 1253 case IWL_LEGACY_SWITCH_MIMO2:
1329 case IWL_LEGACY_SWITCH_MIMO2_AC:
1330 case IWL_LEGACY_SWITCH_MIMO2_BC:
1331 IWL_DEBUG_RATE(mvm, "LQ: Legacy switch to MIMO2\n"); 1254 IWL_DEBUG_RATE(mvm, "LQ: Legacy switch to MIMO2\n");
1332 1255
1333 /* Set up search table to try MIMO */ 1256 /* Set up search table to try MIMO */
1334 memcpy(search_tbl, tbl, sz); 1257 memcpy(search_tbl, tbl, sz);
1335 search_tbl->is_SGI = 0; 1258 search_tbl->is_SGI = 0;
1336 1259
1337 if (tbl->action == IWL_LEGACY_SWITCH_MIMO2_AB) 1260 search_tbl->ant_type = ANT_AB;
1338 search_tbl->ant_type = ANT_AB;
1339 else if (tbl->action == IWL_LEGACY_SWITCH_MIMO2_AC)
1340 search_tbl->ant_type = ANT_AC;
1341 else
1342 search_tbl->ant_type = ANT_BC;
1343 1261
1344 if (!rs_is_valid_ant(valid_tx_ant, 1262 if (!rs_is_valid_ant(valid_tx_ant,
1345 search_tbl->ant_type)) 1263 search_tbl->ant_type))
@@ -1352,30 +1270,11 @@ static int rs_move_legacy_other(struct iwl_mvm *mvm,
1352 goto out; 1270 goto out;
1353 } 1271 }
1354 break; 1272 break;
1355 1273 default:
1356 case IWL_LEGACY_SWITCH_MIMO3_ABC: 1274 WARN_ON_ONCE(1);
1357 IWL_DEBUG_RATE(mvm, "LQ: Legacy switch to MIMO3\n");
1358
1359 /* Set up search table to try MIMO3 */
1360 memcpy(search_tbl, tbl, sz);
1361 search_tbl->is_SGI = 0;
1362
1363 search_tbl->ant_type = ANT_ABC;
1364
1365 if (!rs_is_valid_ant(valid_tx_ant,
1366 search_tbl->ant_type))
1367 break;
1368
1369 ret = rs_switch_to_mimo3(mvm, lq_sta, sta,
1370 search_tbl, index);
1371 if (!ret) {
1372 lq_sta->action_counter = 0;
1373 goto out;
1374 }
1375 break;
1376 } 1275 }
1377 tbl->action++; 1276 tbl->action++;
1378 if (tbl->action > IWL_LEGACY_SWITCH_MIMO3_ABC) 1277 if (tbl->action > IWL_LEGACY_SWITCH_MIMO2)
1379 tbl->action = IWL_LEGACY_SWITCH_ANTENNA1; 1278 tbl->action = IWL_LEGACY_SWITCH_ANTENNA1;
1380 1279
1381 if (tbl->action == start_action) 1280 if (tbl->action == start_action)
@@ -1387,7 +1286,7 @@ static int rs_move_legacy_other(struct iwl_mvm *mvm,
1387out: 1286out:
1388 lq_sta->search_better_tbl = 1; 1287 lq_sta->search_better_tbl = 1;
1389 tbl->action++; 1288 tbl->action++;
1390 if (tbl->action > IWL_LEGACY_SWITCH_MIMO3_ABC) 1289 if (tbl->action > IWL_LEGACY_SWITCH_MIMO2)
1391 tbl->action = IWL_LEGACY_SWITCH_ANTENNA1; 1290 tbl->action = IWL_LEGACY_SWITCH_ANTENNA1;
1392 if (update_search_tbl_counter) 1291 if (update_search_tbl_counter)
1393 search_tbl->action = tbl->action; 1292 search_tbl->action = tbl->action;
@@ -1422,7 +1321,7 @@ static int rs_move_siso_to_other(struct iwl_mvm *mvm,
1422 case IWL_BT_COEX_TRAFFIC_LOAD_LOW: 1321 case IWL_BT_COEX_TRAFFIC_LOAD_LOW:
1423 /* avoid antenna B unless MIMO */ 1322 /* avoid antenna B unless MIMO */
1424 if (tbl->action == IWL_SISO_SWITCH_ANTENNA2) 1323 if (tbl->action == IWL_SISO_SWITCH_ANTENNA2)
1425 tbl->action = IWL_SISO_SWITCH_MIMO2_AB; 1324 tbl->action = IWL_SISO_SWITCH_MIMO2;
1426 break; 1325 break;
1427 case IWL_BT_COEX_TRAFFIC_LOAD_HIGH: 1326 case IWL_BT_COEX_TRAFFIC_LOAD_HIGH:
1428 case IWL_BT_COEX_TRAFFIC_LOAD_CONTINUOUS: 1327 case IWL_BT_COEX_TRAFFIC_LOAD_CONTINUOUS:
@@ -1464,19 +1363,12 @@ static int rs_move_siso_to_other(struct iwl_mvm *mvm,
1464 goto out; 1363 goto out;
1465 } 1364 }
1466 break; 1365 break;
1467 case IWL_SISO_SWITCH_MIMO2_AB: 1366 case IWL_SISO_SWITCH_MIMO2:
1468 case IWL_SISO_SWITCH_MIMO2_AC:
1469 case IWL_SISO_SWITCH_MIMO2_BC:
1470 IWL_DEBUG_RATE(mvm, "LQ: SISO switch to MIMO2\n"); 1367 IWL_DEBUG_RATE(mvm, "LQ: SISO switch to MIMO2\n");
1471 memcpy(search_tbl, tbl, sz); 1368 memcpy(search_tbl, tbl, sz);
1472 search_tbl->is_SGI = 0; 1369 search_tbl->is_SGI = 0;
1473 1370
1474 if (tbl->action == IWL_SISO_SWITCH_MIMO2_AB) 1371 search_tbl->ant_type = ANT_AB;
1475 search_tbl->ant_type = ANT_AB;
1476 else if (tbl->action == IWL_SISO_SWITCH_MIMO2_AC)
1477 search_tbl->ant_type = ANT_AC;
1478 else
1479 search_tbl->ant_type = ANT_BC;
1480 1372
1481 if (!rs_is_valid_ant(valid_tx_ant, 1373 if (!rs_is_valid_ant(valid_tx_ant,
1482 search_tbl->ant_type)) 1374 search_tbl->ant_type))
@@ -1517,24 +1409,11 @@ static int rs_move_siso_to_other(struct iwl_mvm *mvm,
1517 index, is_green); 1409 index, is_green);
1518 update_search_tbl_counter = 1; 1410 update_search_tbl_counter = 1;
1519 goto out; 1411 goto out;
1520 case IWL_SISO_SWITCH_MIMO3_ABC: 1412 default:
1521 IWL_DEBUG_RATE(mvm, "LQ: SISO switch to MIMO3\n"); 1413 WARN_ON_ONCE(1);
1522 memcpy(search_tbl, tbl, sz);
1523 search_tbl->is_SGI = 0;
1524 search_tbl->ant_type = ANT_ABC;
1525
1526 if (!rs_is_valid_ant(valid_tx_ant,
1527 search_tbl->ant_type))
1528 break;
1529
1530 ret = rs_switch_to_mimo3(mvm, lq_sta, sta,
1531 search_tbl, index);
1532 if (!ret)
1533 goto out;
1534 break;
1535 } 1414 }
1536 tbl->action++; 1415 tbl->action++;
1537 if (tbl->action > IWL_LEGACY_SWITCH_MIMO3_ABC) 1416 if (tbl->action > IWL_SISO_SWITCH_GI)
1538 tbl->action = IWL_SISO_SWITCH_ANTENNA1; 1417 tbl->action = IWL_SISO_SWITCH_ANTENNA1;
1539 1418
1540 if (tbl->action == start_action) 1419 if (tbl->action == start_action)
@@ -1546,7 +1425,7 @@ static int rs_move_siso_to_other(struct iwl_mvm *mvm,
1546 out: 1425 out:
1547 lq_sta->search_better_tbl = 1; 1426 lq_sta->search_better_tbl = 1;
1548 tbl->action++; 1427 tbl->action++;
1549 if (tbl->action > IWL_SISO_SWITCH_MIMO3_ABC) 1428 if (tbl->action > IWL_SISO_SWITCH_GI)
1550 tbl->action = IWL_SISO_SWITCH_ANTENNA1; 1429 tbl->action = IWL_SISO_SWITCH_ANTENNA1;
1551 if (update_search_tbl_counter) 1430 if (update_search_tbl_counter)
1552 search_tbl->action = tbl->action; 1431 search_tbl->action = tbl->action;
@@ -1587,8 +1466,7 @@ static int rs_move_mimo2_to_other(struct iwl_mvm *mvm,
1587 break; 1466 break;
1588 case IWL_BT_COEX_TRAFFIC_LOAD_LOW: 1467 case IWL_BT_COEX_TRAFFIC_LOAD_LOW:
1589 /* avoid antenna B unless MIMO */ 1468 /* avoid antenna B unless MIMO */
1590 if (tbl->action == IWL_MIMO2_SWITCH_SISO_B || 1469 if (tbl->action == IWL_MIMO2_SWITCH_SISO_B)
1591 tbl->action == IWL_MIMO2_SWITCH_SISO_C)
1592 tbl->action = IWL_MIMO2_SWITCH_SISO_A; 1470 tbl->action = IWL_MIMO2_SWITCH_SISO_A;
1593 break; 1471 break;
1594 default: 1472 default:
@@ -1621,7 +1499,6 @@ static int rs_move_mimo2_to_other(struct iwl_mvm *mvm,
1621 break; 1499 break;
1622 case IWL_MIMO2_SWITCH_SISO_A: 1500 case IWL_MIMO2_SWITCH_SISO_A:
1623 case IWL_MIMO2_SWITCH_SISO_B: 1501 case IWL_MIMO2_SWITCH_SISO_B:
1624 case IWL_MIMO2_SWITCH_SISO_C:
1625 IWL_DEBUG_RATE(mvm, "LQ: MIMO2 switch to SISO\n"); 1502 IWL_DEBUG_RATE(mvm, "LQ: MIMO2 switch to SISO\n");
1626 1503
1627 /* Set up new search table for SISO */ 1504 /* Set up new search table for SISO */
@@ -1629,10 +1506,8 @@ static int rs_move_mimo2_to_other(struct iwl_mvm *mvm,
1629 1506
1630 if (tbl->action == IWL_MIMO2_SWITCH_SISO_A) 1507 if (tbl->action == IWL_MIMO2_SWITCH_SISO_A)
1631 search_tbl->ant_type = ANT_A; 1508 search_tbl->ant_type = ANT_A;
1632 else if (tbl->action == IWL_MIMO2_SWITCH_SISO_B) 1509 else /* tbl->action == IWL_MIMO2_SWITCH_SISO_B */
1633 search_tbl->ant_type = ANT_B; 1510 search_tbl->ant_type = ANT_B;
1634 else
1635 search_tbl->ant_type = ANT_C;
1636 1511
1637 if (!rs_is_valid_ant(valid_tx_ant, 1512 if (!rs_is_valid_ant(valid_tx_ant,
1638 search_tbl->ant_type)) 1513 search_tbl->ant_type))
@@ -1675,26 +1550,11 @@ static int rs_move_mimo2_to_other(struct iwl_mvm *mvm,
1675 index, is_green); 1550 index, is_green);
1676 update_search_tbl_counter = 1; 1551 update_search_tbl_counter = 1;
1677 goto out; 1552 goto out;
1678 1553 default:
1679 case IWL_MIMO2_SWITCH_MIMO3_ABC: 1554 WARN_ON_ONCE(1);
1680 IWL_DEBUG_RATE(mvm, "LQ: MIMO2 switch to MIMO3\n");
1681 memcpy(search_tbl, tbl, sz);
1682 search_tbl->is_SGI = 0;
1683 search_tbl->ant_type = ANT_ABC;
1684
1685 if (!rs_is_valid_ant(valid_tx_ant,
1686 search_tbl->ant_type))
1687 break;
1688
1689 ret = rs_switch_to_mimo3(mvm, lq_sta, sta,
1690 search_tbl, index);
1691 if (!ret)
1692 goto out;
1693
1694 break;
1695 } 1555 }
1696 tbl->action++; 1556 tbl->action++;
1697 if (tbl->action > IWL_MIMO2_SWITCH_MIMO3_ABC) 1557 if (tbl->action > IWL_MIMO2_SWITCH_GI)
1698 tbl->action = IWL_MIMO2_SWITCH_ANTENNA1; 1558 tbl->action = IWL_MIMO2_SWITCH_ANTENNA1;
1699 1559
1700 if (tbl->action == start_action) 1560 if (tbl->action == start_action)
@@ -1705,7 +1565,7 @@ static int rs_move_mimo2_to_other(struct iwl_mvm *mvm,
1705 out: 1565 out:
1706 lq_sta->search_better_tbl = 1; 1566 lq_sta->search_better_tbl = 1;
1707 tbl->action++; 1567 tbl->action++;
1708 if (tbl->action > IWL_MIMO2_SWITCH_MIMO3_ABC) 1568 if (tbl->action > IWL_MIMO2_SWITCH_GI)
1709 tbl->action = IWL_MIMO2_SWITCH_ANTENNA1; 1569 tbl->action = IWL_MIMO2_SWITCH_ANTENNA1;
1710 if (update_search_tbl_counter) 1570 if (update_search_tbl_counter)
1711 search_tbl->action = tbl->action; 1571 search_tbl->action = tbl->action;
@@ -1714,171 +1574,6 @@ static int rs_move_mimo2_to_other(struct iwl_mvm *mvm,
1714} 1574}
1715 1575
1716/* 1576/*
1717 * Try to switch to new modulation mode from MIMO3
1718 */
1719static int rs_move_mimo3_to_other(struct iwl_mvm *mvm,
1720 struct iwl_lq_sta *lq_sta,
1721 struct ieee80211_sta *sta, int index)
1722{
1723 s8 is_green = lq_sta->is_green;
1724 struct iwl_scale_tbl_info *tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
1725 struct iwl_scale_tbl_info *search_tbl =
1726 &(lq_sta->lq_info[(1 - lq_sta->active_tbl)]);
1727 struct iwl_rate_scale_data *window = &(tbl->win[index]);
1728 struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
1729 u32 sz = (sizeof(struct iwl_scale_tbl_info) -
1730 (sizeof(struct iwl_rate_scale_data) * IWL_RATE_COUNT));
1731 u8 start_action;
1732 u8 valid_tx_ant = iwl_fw_valid_tx_ant(mvm->fw);
1733 u8 tx_chains_num = num_of_ant(valid_tx_ant);
1734 int ret;
1735 u8 update_search_tbl_counter = 0;
1736
1737 switch (BT_MBOX_MSG(&mvm->last_bt_notif, 3, TRAFFIC_LOAD)) {
1738 case IWL_BT_COEX_TRAFFIC_LOAD_NONE:
1739 /* nothing */
1740 break;
1741 case IWL_BT_COEX_TRAFFIC_LOAD_HIGH:
1742 case IWL_BT_COEX_TRAFFIC_LOAD_CONTINUOUS:
1743 /* avoid antenna B and MIMO */
1744 if (tbl->action != IWL_MIMO3_SWITCH_SISO_A)
1745 tbl->action = IWL_MIMO3_SWITCH_SISO_A;
1746 break;
1747 case IWL_BT_COEX_TRAFFIC_LOAD_LOW:
1748 /* avoid antenna B unless MIMO */
1749 if (tbl->action == IWL_MIMO3_SWITCH_SISO_B ||
1750 tbl->action == IWL_MIMO3_SWITCH_SISO_C)
1751 tbl->action = IWL_MIMO3_SWITCH_SISO_A;
1752 break;
1753 default:
1754 IWL_ERR(mvm, "Invalid BT load %d",
1755 BT_MBOX_MSG(&mvm->last_bt_notif, 3, TRAFFIC_LOAD));
1756 break;
1757 }
1758
1759 start_action = tbl->action;
1760 while (1) {
1761 lq_sta->action_counter++;
1762 switch (tbl->action) {
1763 case IWL_MIMO3_SWITCH_ANTENNA1:
1764 case IWL_MIMO3_SWITCH_ANTENNA2:
1765 IWL_DEBUG_RATE(mvm, "LQ: MIMO3 toggle Antennas\n");
1766
1767 if (tx_chains_num <= 3)
1768 break;
1769
1770 if (window->success_ratio >= IWL_RS_GOOD_RATIO)
1771 break;
1772
1773 memcpy(search_tbl, tbl, sz);
1774 if (rs_toggle_antenna(valid_tx_ant,
1775 &search_tbl->current_rate,
1776 search_tbl))
1777 goto out;
1778 break;
1779 case IWL_MIMO3_SWITCH_SISO_A:
1780 case IWL_MIMO3_SWITCH_SISO_B:
1781 case IWL_MIMO3_SWITCH_SISO_C:
1782 IWL_DEBUG_RATE(mvm, "LQ: MIMO3 switch to SISO\n");
1783
1784 /* Set up new search table for SISO */
1785 memcpy(search_tbl, tbl, sz);
1786
1787 if (tbl->action == IWL_MIMO3_SWITCH_SISO_A)
1788 search_tbl->ant_type = ANT_A;
1789 else if (tbl->action == IWL_MIMO3_SWITCH_SISO_B)
1790 search_tbl->ant_type = ANT_B;
1791 else
1792 search_tbl->ant_type = ANT_C;
1793
1794 if (!rs_is_valid_ant(valid_tx_ant,
1795 search_tbl->ant_type))
1796 break;
1797
1798 ret = rs_switch_to_siso(mvm, lq_sta, sta,
1799 search_tbl, index);
1800 if (!ret)
1801 goto out;
1802
1803 break;
1804
1805 case IWL_MIMO3_SWITCH_MIMO2_AB:
1806 case IWL_MIMO3_SWITCH_MIMO2_AC:
1807 case IWL_MIMO3_SWITCH_MIMO2_BC:
1808 IWL_DEBUG_RATE(mvm, "LQ: MIMO3 switch to MIMO2\n");
1809
1810 memcpy(search_tbl, tbl, sz);
1811 search_tbl->is_SGI = 0;
1812 if (tbl->action == IWL_MIMO3_SWITCH_MIMO2_AB)
1813 search_tbl->ant_type = ANT_AB;
1814 else if (tbl->action == IWL_MIMO3_SWITCH_MIMO2_AC)
1815 search_tbl->ant_type = ANT_AC;
1816 else
1817 search_tbl->ant_type = ANT_BC;
1818
1819 if (!rs_is_valid_ant(valid_tx_ant,
1820 search_tbl->ant_type))
1821 break;
1822
1823 ret = rs_switch_to_mimo2(mvm, lq_sta, sta,
1824 search_tbl, index);
1825 if (!ret)
1826 goto out;
1827
1828 break;
1829
1830 case IWL_MIMO3_SWITCH_GI:
1831 if (!tbl->is_ht40 && !(ht_cap->cap &
1832 IEEE80211_HT_CAP_SGI_20))
1833 break;
1834 if (tbl->is_ht40 && !(ht_cap->cap &
1835 IEEE80211_HT_CAP_SGI_40))
1836 break;
1837
1838 IWL_DEBUG_RATE(mvm, "LQ: MIMO3 toggle SGI/NGI\n");
1839
1840 /* Set up new search table for MIMO */
1841 memcpy(search_tbl, tbl, sz);
1842 search_tbl->is_SGI = !tbl->is_SGI;
1843 rs_set_expected_tpt_table(lq_sta, search_tbl);
1844 /*
1845 * If active table already uses the fastest possible
1846 * modulation (dual stream with short guard interval),
1847 * and it's working well, there's no need to look
1848 * for a better type of modulation!
1849 */
1850 if (tbl->is_SGI) {
1851 s32 tpt = lq_sta->last_tpt / 100;
1852 if (tpt >= search_tbl->expected_tpt[index])
1853 break;
1854 }
1855 search_tbl->current_rate =
1856 rate_n_flags_from_tbl(mvm, search_tbl,
1857 index, is_green);
1858 update_search_tbl_counter = 1;
1859 goto out;
1860 }
1861 tbl->action++;
1862 if (tbl->action > IWL_MIMO3_SWITCH_GI)
1863 tbl->action = IWL_MIMO3_SWITCH_ANTENNA1;
1864
1865 if (tbl->action == start_action)
1866 break;
1867 }
1868 search_tbl->lq_type = LQ_NONE;
1869 return 0;
1870 out:
1871 lq_sta->search_better_tbl = 1;
1872 tbl->action++;
1873 if (tbl->action > IWL_MIMO3_SWITCH_GI)
1874 tbl->action = IWL_MIMO3_SWITCH_ANTENNA1;
1875 if (update_search_tbl_counter)
1876 search_tbl->action = tbl->action;
1877
1878 return 0;
1879}
1880
1881/*
1882 * Check whether we should continue using same modulation mode, or 1577 * Check whether we should continue using same modulation mode, or
1883 * begin search for a new mode, based on: 1578 * begin search for a new mode, based on:
1884 * 1) # tx successes or failures while using this mode 1579 * 1) # tx successes or failures while using this mode
@@ -2284,8 +1979,7 @@ static void rs_rate_scale_perform(struct iwl_mvm *mvm,
2284 scale_action = 0; 1979 scale_action = 0;
2285 1980
2286 if ((BT_MBOX_MSG(&mvm->last_bt_notif, 3, TRAFFIC_LOAD) >= 1981 if ((BT_MBOX_MSG(&mvm->last_bt_notif, 3, TRAFFIC_LOAD) >=
2287 IWL_BT_COEX_TRAFFIC_LOAD_HIGH) && 1982 IWL_BT_COEX_TRAFFIC_LOAD_HIGH) && (is_mimo(tbl->lq_type))) {
2288 (is_mimo2(tbl->lq_type) || is_mimo3(tbl->lq_type))) {
2289 if (lq_sta->last_bt_traffic > 1983 if (lq_sta->last_bt_traffic >
2290 BT_MBOX_MSG(&mvm->last_bt_notif, 3, TRAFFIC_LOAD)) { 1984 BT_MBOX_MSG(&mvm->last_bt_notif, 3, TRAFFIC_LOAD)) {
2291 /* 1985 /*
@@ -2302,8 +1996,7 @@ static void rs_rate_scale_perform(struct iwl_mvm *mvm,
2302 BT_MBOX_MSG(&mvm->last_bt_notif, 3, TRAFFIC_LOAD); 1996 BT_MBOX_MSG(&mvm->last_bt_notif, 3, TRAFFIC_LOAD);
2303 1997
2304 if ((BT_MBOX_MSG(&mvm->last_bt_notif, 3, TRAFFIC_LOAD) >= 1998 if ((BT_MBOX_MSG(&mvm->last_bt_notif, 3, TRAFFIC_LOAD) >=
2305 IWL_BT_COEX_TRAFFIC_LOAD_HIGH) && 1999 IWL_BT_COEX_TRAFFIC_LOAD_HIGH) && is_mimo(tbl->lq_type)) {
2306 (is_mimo2(tbl->lq_type) || is_mimo3(tbl->lq_type))) {
2307 /* search for a new modulation */ 2000 /* search for a new modulation */
2308 rs_stay_in_table(lq_sta, true); 2001 rs_stay_in_table(lq_sta, true);
2309 goto lq_update; 2002 goto lq_update;
@@ -2363,7 +2056,7 @@ lq_update:
2363 else if (is_mimo2(tbl->lq_type)) 2056 else if (is_mimo2(tbl->lq_type))
2364 rs_move_mimo2_to_other(mvm, lq_sta, sta, index); 2057 rs_move_mimo2_to_other(mvm, lq_sta, sta, index);
2365 else 2058 else
2366 rs_move_mimo3_to_other(mvm, lq_sta, sta, index); 2059 WARN_ON_ONCE(1);
2367 2060
2368 /* If new "search" mode was selected, set up in uCode table */ 2061 /* If new "search" mode was selected, set up in uCode table */
2369 if (lq_sta->search_better_tbl) { 2062 if (lq_sta->search_better_tbl) {
@@ -2528,11 +2221,10 @@ static void rs_get_rate(void *mvm_r, struct ieee80211_sta *sta, void *mvm_sta,
2528 rate_idx -= IWL_FIRST_OFDM_RATE; 2221 rate_idx -= IWL_FIRST_OFDM_RATE;
2529 /* 6M and 9M shared same MCS index */ 2222 /* 6M and 9M shared same MCS index */
2530 rate_idx = (rate_idx > 0) ? (rate_idx - 1) : 0; 2223 rate_idx = (rate_idx > 0) ? (rate_idx - 1) : 0;
2224 WARN_ON_ONCE(rs_extract_rate(lq_sta->last_rate_n_flags) >=
2225 IWL_RATE_MIMO3_6M_PLCP);
2531 if (rs_extract_rate(lq_sta->last_rate_n_flags) >= 2226 if (rs_extract_rate(lq_sta->last_rate_n_flags) >=
2532 IWL_RATE_MIMO3_6M_PLCP) 2227 IWL_RATE_MIMO2_6M_PLCP)
2533 rate_idx = rate_idx + (2 * MCS_INDEX_PER_STREAM);
2534 else if (rs_extract_rate(lq_sta->last_rate_n_flags) >=
2535 IWL_RATE_MIMO2_6M_PLCP)
2536 rate_idx = rate_idx + MCS_INDEX_PER_STREAM; 2228 rate_idx = rate_idx + MCS_INDEX_PER_STREAM;
2537 info->control.rates[0].flags = IEEE80211_TX_RC_MCS; 2229 info->control.rates[0].flags = IEEE80211_TX_RC_MCS;
2538 if (lq_sta->last_rate_n_flags & RATE_MCS_SGI_MSK) 2230 if (lq_sta->last_rate_n_flags & RATE_MCS_SGI_MSK)
@@ -2631,16 +2323,10 @@ void iwl_mvm_rs_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
2631 lq_sta->active_mimo2_rate &= ~((u16)0x2); 2323 lq_sta->active_mimo2_rate &= ~((u16)0x2);
2632 lq_sta->active_mimo2_rate <<= IWL_FIRST_OFDM_RATE; 2324 lq_sta->active_mimo2_rate <<= IWL_FIRST_OFDM_RATE;
2633 2325
2634 lq_sta->active_mimo3_rate = ht_cap->mcs.rx_mask[2] << 1;
2635 lq_sta->active_mimo3_rate |= ht_cap->mcs.rx_mask[2] & 0x1;
2636 lq_sta->active_mimo3_rate &= ~((u16)0x2);
2637 lq_sta->active_mimo3_rate <<= IWL_FIRST_OFDM_RATE;
2638
2639 IWL_DEBUG_RATE(mvm, 2326 IWL_DEBUG_RATE(mvm,
2640 "SISO-RATE=%X MIMO2-RATE=%X MIMO3-RATE=%X\n", 2327 "SISO-RATE=%X MIMO2-RATE=%X\n",
2641 lq_sta->active_siso_rate, 2328 lq_sta->active_siso_rate,
2642 lq_sta->active_mimo2_rate, 2329 lq_sta->active_mimo2_rate);
2643 lq_sta->active_mimo3_rate);
2644 2330
2645 /* These values will be overridden later */ 2331 /* These values will be overridden later */
2646 lq_sta->lq.single_stream_ant_msk = 2332 lq_sta->lq.single_stream_ant_msk =
@@ -2903,8 +2589,7 @@ static ssize_t rs_sta_dbgfs_scale_table_read(struct file *file,
2903 (is_legacy(tbl->lq_type)) ? "legacy" : "HT"); 2589 (is_legacy(tbl->lq_type)) ? "legacy" : "HT");
2904 if (is_Ht(tbl->lq_type)) { 2590 if (is_Ht(tbl->lq_type)) {
2905 desc += sprintf(buff+desc, " %s", 2591 desc += sprintf(buff+desc, " %s",
2906 (is_siso(tbl->lq_type)) ? "SISO" : 2592 (is_siso(tbl->lq_type)) ? "SISO" : "MIMO2");
2907 ((is_mimo2(tbl->lq_type)) ? "MIMO2" : "MIMO3"));
2908 desc += sprintf(buff+desc, " %s", 2593 desc += sprintf(buff+desc, " %s",
2909 (tbl->is_ht40) ? "40MHz" : "20MHz"); 2594 (tbl->is_ht40) ? "40MHz" : "20MHz");
2910 desc += sprintf(buff+desc, " %s %s %s\n", 2595 desc += sprintf(buff+desc, " %s %s %s\n",
diff --git a/drivers/net/wireless/iwlwifi/mvm/rs.h b/drivers/net/wireless/iwlwifi/mvm/rs.h
index 9ac7c0b4e306..335cf1682902 100644
--- a/drivers/net/wireless/iwlwifi/mvm/rs.h
+++ b/drivers/net/wireless/iwlwifi/mvm/rs.h
@@ -38,7 +38,6 @@ struct iwl_rs_rate_info {
38 u8 plcp; /* uCode API: IWL_RATE_6M_PLCP, etc. */ 38 u8 plcp; /* uCode API: IWL_RATE_6M_PLCP, etc. */
39 u8 plcp_siso; /* uCode API: IWL_RATE_SISO_6M_PLCP, etc. */ 39 u8 plcp_siso; /* uCode API: IWL_RATE_SISO_6M_PLCP, etc. */
40 u8 plcp_mimo2; /* uCode API: IWL_RATE_MIMO2_6M_PLCP, etc. */ 40 u8 plcp_mimo2; /* uCode API: IWL_RATE_MIMO2_6M_PLCP, etc. */
41 u8 plcp_mimo3; /* uCode API: IWL_RATE_MIMO3_6M_PLCP, etc. */
42 u8 prev_rs; /* previous rate used in rs algo */ 41 u8 prev_rs; /* previous rate used in rs algo */
43 u8 next_rs; /* next rate used in rs algo */ 42 u8 next_rs; /* next rate used in rs algo */
44}; 43};
@@ -143,47 +142,22 @@ enum {
143#define IWL_LEGACY_SWITCH_ANTENNA1 0 142#define IWL_LEGACY_SWITCH_ANTENNA1 0
144#define IWL_LEGACY_SWITCH_ANTENNA2 1 143#define IWL_LEGACY_SWITCH_ANTENNA2 1
145#define IWL_LEGACY_SWITCH_SISO 2 144#define IWL_LEGACY_SWITCH_SISO 2
146#define IWL_LEGACY_SWITCH_MIMO2_AB 3 145#define IWL_LEGACY_SWITCH_MIMO2 3
147#define IWL_LEGACY_SWITCH_MIMO2_AC 4
148#define IWL_LEGACY_SWITCH_MIMO2_BC 5
149#define IWL_LEGACY_SWITCH_MIMO3_ABC 6
150 146
151/* possible actions when in siso mode */ 147/* possible actions when in siso mode */
152#define IWL_SISO_SWITCH_ANTENNA1 0 148#define IWL_SISO_SWITCH_ANTENNA1 0
153#define IWL_SISO_SWITCH_ANTENNA2 1 149#define IWL_SISO_SWITCH_ANTENNA2 1
154#define IWL_SISO_SWITCH_MIMO2_AB 2 150#define IWL_SISO_SWITCH_MIMO2 2
155#define IWL_SISO_SWITCH_MIMO2_AC 3 151#define IWL_SISO_SWITCH_GI 3
156#define IWL_SISO_SWITCH_MIMO2_BC 4
157#define IWL_SISO_SWITCH_GI 5
158#define IWL_SISO_SWITCH_MIMO3_ABC 6
159
160 152
161/* possible actions when in mimo mode */ 153/* possible actions when in mimo mode */
162#define IWL_MIMO2_SWITCH_ANTENNA1 0 154#define IWL_MIMO2_SWITCH_ANTENNA1 0
163#define IWL_MIMO2_SWITCH_ANTENNA2 1 155#define IWL_MIMO2_SWITCH_ANTENNA2 1
164#define IWL_MIMO2_SWITCH_SISO_A 2 156#define IWL_MIMO2_SWITCH_SISO_A 2
165#define IWL_MIMO2_SWITCH_SISO_B 3 157#define IWL_MIMO2_SWITCH_SISO_B 3
166#define IWL_MIMO2_SWITCH_SISO_C 4 158#define IWL_MIMO2_SWITCH_GI 4
167#define IWL_MIMO2_SWITCH_GI 5
168#define IWL_MIMO2_SWITCH_MIMO3_ABC 6
169
170
171/* possible actions when in mimo3 mode */
172#define IWL_MIMO3_SWITCH_ANTENNA1 0
173#define IWL_MIMO3_SWITCH_ANTENNA2 1
174#define IWL_MIMO3_SWITCH_SISO_A 2
175#define IWL_MIMO3_SWITCH_SISO_B 3
176#define IWL_MIMO3_SWITCH_SISO_C 4
177#define IWL_MIMO3_SWITCH_MIMO2_AB 5
178#define IWL_MIMO3_SWITCH_MIMO2_AC 6
179#define IWL_MIMO3_SWITCH_MIMO2_BC 7
180#define IWL_MIMO3_SWITCH_GI 8
181
182
183#define IWL_MAX_11N_MIMO3_SEARCH IWL_MIMO3_SWITCH_GI
184#define IWL_MAX_SEARCH IWL_MIMO2_SWITCH_MIMO3_ABC
185 159
186/*FIXME:RS:add possible actions for MIMO3*/ 160#define IWL_MAX_SEARCH IWL_MIMO2_SWITCH_GI
187 161
188#define IWL_ACTION_LIMIT 3 /* # possible actions */ 162#define IWL_ACTION_LIMIT 3 /* # possible actions */
189 163
@@ -218,15 +192,13 @@ enum iwl_table_type {
218 LQ_A, 192 LQ_A,
219 LQ_SISO, /* high-throughput types */ 193 LQ_SISO, /* high-throughput types */
220 LQ_MIMO2, 194 LQ_MIMO2,
221 LQ_MIMO3,
222 LQ_MAX, 195 LQ_MAX,
223}; 196};
224 197
225#define is_legacy(tbl) (((tbl) == LQ_G) || ((tbl) == LQ_A)) 198#define is_legacy(tbl) (((tbl) == LQ_G) || ((tbl) == LQ_A))
226#define is_siso(tbl) ((tbl) == LQ_SISO) 199#define is_siso(tbl) ((tbl) == LQ_SISO)
227#define is_mimo2(tbl) ((tbl) == LQ_MIMO2) 200#define is_mimo2(tbl) ((tbl) == LQ_MIMO2)
228#define is_mimo3(tbl) ((tbl) == LQ_MIMO3) 201#define is_mimo(tbl) is_mimo2(tbl)
229#define is_mimo(tbl) (is_mimo2(tbl) || is_mimo3(tbl))
230#define is_Ht(tbl) (is_siso(tbl) || is_mimo(tbl)) 202#define is_Ht(tbl) (is_siso(tbl) || is_mimo(tbl))
231#define is_a_band(tbl) ((tbl) == LQ_A) 203#define is_a_band(tbl) ((tbl) == LQ_A)
232#define is_g_and(tbl) ((tbl) == LQ_G) 204#define is_g_and(tbl) ((tbl) == LQ_G)
@@ -298,7 +270,6 @@ struct iwl_lq_sta {
298 u16 active_legacy_rate; 270 u16 active_legacy_rate;
299 u16 active_siso_rate; 271 u16 active_siso_rate;
300 u16 active_mimo2_rate; 272 u16 active_mimo2_rate;
301 u16 active_mimo3_rate;
302 s8 max_rate_idx; /* Max rate set by user */ 273 s8 max_rate_idx; /* Max rate set by user */
303 u8 missed_rate_counter; 274 u8 missed_rate_counter;
304 275