diff options
author | Eyal Shapira <eyal@wizery.com> | 2013-07-28 19:02:45 -0400 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2013-08-12 09:23:54 -0400 |
commit | d972ab31b90cf1c61f6f77a1968244280930c000 (patch) | |
tree | 3b6d7095158448187ddc49784f8bd6c6837872f6 /drivers/net/wireless/iwlwifi | |
parent | e3c588ec0d9ef4e52caf0704a007440fb381d97f (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>
Diffstat (limited to 'drivers/net/wireless/iwlwifi')
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/rs.c | 393 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/rs.h | 41 |
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 | ||
216 | static 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 | |||
223 | static 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 */ |
231 | static const struct iwl_rate_mcs_info iwl_rate_mcs[IWL_RATE_COUNT] = { | 215 | static 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 | */ | ||
1170 | static 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 | */ |
1222 | static int rs_switch_to_siso(struct iwl_mvm *mvm, | 1147 | static 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, | |||
1387 | out: | 1286 | out: |
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 | */ | ||
1719 | static 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 | ||