26 #include <linux/kernel.h>
29 #include <linux/slab.h>
32 #include <linux/netdevice.h>
41 #define IL4965_RS_NAME "iwl-4965-rs"
43 #define NUM_TRY_BEFORE_ANT_TOGGLE 1
44 #define IL_NUMBER_TRY 1
45 #define IL_HT_NUMBER_TRY 3
47 #define RATE_MAX_WINDOW 62
48 #define RATE_MIN_FAILURE_TH 6
49 #define RATE_MIN_SUCCESS_TH 8
52 #define IL_MISSED_RATE_MAX 15
54 #define RATE_SCALE_FLUSH_INTVL (3*HZ)
56 static u8 rs_ht_to_legacy[] = {
66 static const u8 ant_toggle_lookup[] = {
77 #define IL_DECLARE_RATE_INFO(r, s, ip, in, rp, rn, pp, np) \
78 [RATE_##r##M_IDX] = { RATE_##r##M_PLCP, \
79 RATE_SISO_##s##M_PLCP, \
80 RATE_MIMO2_##s##M_PLCP,\
114 il4965_hwrate_to_plcp_idx(
u32 rate_n_flags)
120 idx = (rate_n_flags & 0xff);
134 for (idx = 0; idx <
ARRAY_SIZE(il_rates); idx++)
135 if (il_rates[idx].
plcp == (rate_n_flags & 0xFF))
142 static void il4965_rs_rate_scale_perform(
struct il_priv *il,
146 static void il4965_rs_fill_link_cmd(
struct il_priv *il,
148 static void il4965_rs_stay_in_table(
struct il_lq_sta *lq_sta,
151 #ifdef CONFIG_MAC80211_DEBUGFS
152 static void il4965_rs_dbgfs_set_mcs(
struct il_lq_sta *lq_sta,
153 u32 *rate_n_flags,
int idx);
156 il4965_rs_dbgfs_set_mcs(
struct il_lq_sta *lq_sta,
u32 * rate_n_flags,
int idx)
173 7, 13, 35, 58, 40, 57, 72, 98, 121, 154, 177, 186, 0
177 {0, 0, 0, 0, 42, 0, 76, 102, 124, 158, 183, 193, 202},
178 {0, 0, 0, 0, 46, 0, 82, 110, 132, 167, 192, 202, 210},
179 {0, 0, 0, 0, 48, 0, 93, 135, 176, 251, 319, 351, 381},
180 {0, 0, 0, 0, 53, 0, 102, 149, 193, 275, 348, 381, 413},
184 {0, 0, 0, 0, 77, 0, 127, 160, 184, 220, 242, 250, 257},
185 {0, 0, 0, 0, 83, 0, 135, 169, 193, 229, 250, 257, 264},
186 {0, 0, 0, 0, 96, 0, 182, 259, 328, 451, 553, 598, 640},
187 {0, 0, 0, 0, 106, 0, 199, 282, 357, 487, 593, 640, 683},
191 {0, 0, 0, 0, 74, 0, 123, 155, 179, 213, 235, 243, 250},
192 {0, 0, 0, 0, 81, 0, 131, 164, 187, 221, 242, 250, 256},
193 {0, 0, 0, 0, 92, 0, 175, 250, 317, 436, 534, 578, 619},
194 {0, 0, 0, 0, 102, 0, 192, 273, 344, 470, 573, 619, 660},
198 {0, 0, 0, 0, 123, 0, 182, 214, 235, 264, 279, 285, 289},
199 {0, 0, 0, 0, 131, 0, 191, 222, 242, 270, 284, 289, 293},
200 {0, 0, 0, 0, 180, 0, 327, 446, 545, 708, 828, 878, 922},
201 {0, 0, 0, 0, 197, 0, 355, 481, 584, 752, 872, 922, 966},
221 #define MCS_IDX_PER_STREAM (8)
224 il4965_rs_extract_rate(
u32 rate_n_flags)
226 return (
u8) (rate_n_flags & 0xFF);
241 il4965_rs_is_valid_ant(
u8 valid_antenna,
u8 ant_type)
243 return (ant_type & valid_antenna) == ant_type;
281 u8 *qc = ieee80211_get_qos_ctl(hdr);
289 tl = &lq_data->
load[tid];
309 il4965_rs_tl_rm_old_stats(tl, curr_time);
325 il4965_rs_tl_get_load(
struct il_lq_sta *lq_data,
u8 tid)
335 tl = &(lq_data->
load[tid]);
348 il4965_rs_tl_rm_old_stats(tl, curr_time);
354 il4965_rs_tl_turn_on_agg_for_tid(
struct il_priv *il,
struct il_lq_sta *lq_data,
360 load = il4965_rs_tl_get_load(lq_data, tid);
363 D_HT(
"Starting Tx agg: STA: %pM tid: %d\n", sta->
addr, tid);
371 IL_ERR(
"Fail start Tx agg on tid: %d\n", tid);
375 D_HT(
"Aggregation not enabled for tid %d because load = %u\n",
386 il4965_rs_tl_turn_on_agg_for_tid(il, lq_data, tid, sta);
388 IL_ERR(
"tid exceeds max load count: %d/%d\n", tid,
393 il4965_get_il4965_num_of_ant_from_rate(
u32 rate_n_flags)
421 int attempts,
int successes)
431 win = &(tbl->
win[scale_idx]);
434 tpt = il4965_get_expected_tpt(tbl, scale_idx);
444 while (attempts > 0) {
450 if (win->
data & mask) {
499 int idx,
u8 use_green)
501 u32 rate_n_flags = 0;
504 rate_n_flags = il_rates[
idx].
plcp;
510 IL_ERR(
"Invalid HT rate idx %d\n", idx);
540 IL_ERR(
"GF was set with SGI:SISO\n");
552 il4965_rs_get_tbl_info_from_mcs(
const u32 rate_n_flags,
557 u8 il4965_num_of_ant =
558 il4965_get_il4965_num_of_ant_from_rate(rate_n_flags);
562 *rate_idx = il4965_hwrate_to_plcp_idx(rate_n_flags);
576 if (!(rate_n_flags & RATE_MCS_HT_MSK)) {
577 if (il4965_num_of_ant == 1) {
595 mcs = il4965_rs_extract_rate(rate_n_flags);
599 if (il4965_num_of_ant == 1)
603 if (il4965_num_of_ant == 2)
613 il4965_rs_toggle_antenna(
u32 valid_ant,
u32 *rate_n_flags,
621 if (!il4965_rs_is_valid_ant(valid_ant, tbl->
ant_type))
624 new_ant_type = ant_toggle_lookup[tbl->
ant_type];
626 while (new_ant_type != tbl->
ant_type &&
627 !il4965_rs_is_valid_ant(valid_ant, new_ant_type))
628 new_ant_type = ant_toggle_lookup[new_ant_type];
647 !il->
ht.non_gf_sta_present;
658 il4965_rs_get_supported_rates(
struct il_lq_sta *lq_sta,
673 il4965_rs_get_adjacent_rate(
struct il_priv *il,
u8 idx,
u16 rate_mask,
687 for (mask = (1 << i); i >= 0; i--, mask >>= 1) {
688 if (rate_mask & mask) {
696 for (mask = (1 << i); i <
RATE_COUNT; i++, mask <<= 1) {
697 if (rate_mask & mask) {
703 return (high << 8) |
low;
711 if (rate_mask & (1 << low))
713 D_RATE(
"Skipping masked lower rate: %d\n", low);
721 if (rate_mask & (1 << high))
723 D_RATE(
"Skipping masked higher rate: %d\n", high);
726 return (high << 8) |
low;
730 il4965_rs_get_lower_rate(
struct il_lq_sta *lq_sta,
737 u8 switch_to_legacy = 0;
745 switch_to_legacy = 1;
746 scale_idx = rs_ht_to_legacy[scale_idx];
752 if (il4965_num_of_ant(tbl->
ant_type) > 1)
754 il4965_first_antenna(il->
hw_params.valid_tx_ant);
761 rate_mask = il4965_rs_get_supported_rates(lq_sta,
NULL, tbl->
lq_type);
775 if (switch_to_legacy && (rate_mask & (1 << scale_idx))) {
781 il4965_rs_get_adjacent_rate(lq_sta->
drv, scale_idx, rate_mask,
783 low = high_low & 0xff;
789 return il4965_rate_n_flags_from_tbl(lq_sta->
drv, tbl, low, is_green);
813 int rs_idx, mac_idx,
i;
824 D_RATE(
"get frame ack response, update rate scale win\n");
828 D_RATE(
"Station rate scaling not created yet.\n");
830 }
else if (!lq_sta->
drv) {
831 D_RATE(
"Rate scaling not initialized yet.\n");
854 il4965_rs_get_tbl_info_from_mcs(tx_rate, il->
band, &tbl_type, &rs_idx);
857 mac_flags = info->
status.rates[0].flags;
858 mac_idx = info->
status.rates[0].idx;
876 tbl_type.ant_type != info->
status.antenna ||
877 !!(tx_rate & RATE_MCS_HT_MSK) != !!(mac_flags & IEEE80211_TX_RC_MCS)
880 D_RATE(
"initial rate %d does not match %d (0x%x)\n", mac_idx,
899 if (il4965_table_type_matches
904 if (il4965_table_type_matches
909 D_RATE(
"Neither active nor search matches tx rate\n");
916 D_RATE(
"actual- lq:%x, ant:%x, SGI:%d\n", tbl_type.lq_type,
917 tbl_type.ant_type, tbl_type.is_SGI);
922 il4965_rs_stay_in_table(lq_sta,
true);
935 il4965_rs_get_tbl_info_from_mcs(tx_rate, il->
band, &tbl_type,
937 il4965_rs_collect_tx_data(curr_tbl, rs_idx,
939 info->
status.ampdu_ack_len);
946 info->
status.ampdu_ack_len);
952 retries = info->
status.rates[0].count - 1;
954 retries =
min(retries, 15);
961 il4965_rs_get_tbl_info_from_mcs(tx_rate, il->
band,
967 if (il4965_table_type_matches(&tbl_type, curr_tbl))
969 else if (il4965_table_type_matches
970 (&tbl_type, other_tbl))
974 il4965_rs_collect_tx_data(tmp_tbl, rs_idx, 1,
976 retries ? 0 : legacy_success);
990 il4965_rs_rate_scale_perform(il, skb, sta, lq_sta);
1005 D_RATE(
"we are staying in the same table\n");
1027 il4965_rs_set_expected_tpt_table(
struct il_lq_sta *lq_sta,
1049 ht_tbl_pointer = expected_tpt_siso20MHz;
1051 ht_tbl_pointer = expected_tpt_siso40MHz;
1053 ht_tbl_pointer = expected_tpt_mimo2_20MHz;
1055 ht_tbl_pointer = expected_tpt_mimo2_40MHz;
1082 u16 rate_mask,
s8 idx)
1087 s32 active_sr = active_tbl->
win[
idx].success_ratio;
1101 il4965_rs_get_adjacent_rate(il, rate, rate_mask,
1104 low = high_low & 0xff;
1105 high = (high_low >> 8) & 0xff;
1122 if ((100 * tpt_tbl[rate] > lq_sta->
last_tpt &&
1124 && tpt_tbl[rate] <= active_tpt)) ||
1126 tpt_tbl[
rate] > active_tpt)) {
1132 new_rate = start_hi;
1183 if (!conf_is_ht(conf) || !sta->
ht_cap.ht_supported)
1194 D_RATE(
"LQ: try to switch to MIMO2\n");
1207 il4965_rs_set_expected_tpt_table(lq_sta, tbl);
1209 rate = il4965_rs_get_best_rate(il, lq_sta, tbl, rate_mask, idx);
1211 D_RATE(
"LQ: MIMO2 best rate %d mask %X\n", rate, rate_mask);
1212 if (rate ==
RATE_INVALID || !((1 << rate) & rate_mask)) {
1213 D_RATE(
"Can't switch with idx %d rate mask %x\n", rate,
1218 il4965_rate_n_flags_from_tbl(il, tbl, rate, is_green);
1237 if (!conf_is_ht(conf) || !sta->
ht_cap.ht_supported)
1240 D_RATE(
"LQ: try to switch to SISO\n");
1256 il4965_rs_set_expected_tpt_table(lq_sta, tbl);
1257 rate = il4965_rs_get_best_rate(il, lq_sta, tbl, rate_mask, idx);
1259 D_RATE(
"LQ: get best rate %d mask %X\n", rate, rate_mask);
1260 if (rate ==
RATE_INVALID || !((1 << rate) & rate_mask)) {
1261 D_RATE(
"can not switch with idx %d rate mask %x\n", rate,
1266 il4965_rate_n_flags_from_tbl(il, tbl, rate, is_green);
1291 u8 update_search_tbl_counter = 0;
1295 start_action = tbl->
action;
1301 D_RATE(
"LQ: Legacy toggle Antenna\n");
1304 tx_chains_num <= 1) ||
1306 tx_chains_num <= 2))
1314 memcpy(search_tbl, tbl, sz);
1316 if (il4965_rs_toggle_antenna
1319 update_search_tbl_counter = 1;
1320 il4965_rs_set_expected_tpt_table(lq_sta,
1326 D_RATE(
"LQ: Legacy switch to SISO\n");
1329 memcpy(search_tbl, tbl, sz);
1332 il4965_rs_switch_to_siso(il, lq_sta, conf, sta,
1343 D_RATE(
"LQ: Legacy switch to MIMO2\n");
1346 memcpy(search_tbl, tbl, sz);
1356 if (!il4965_rs_is_valid_ant
1357 (valid_tx_ant, search_tbl->
ant_type))
1361 il4965_rs_switch_to_mimo2(il, lq_sta, conf, sta,
1373 if (tbl->
action == start_action)
1385 if (update_search_tbl_counter)
1411 u8 update_search_tbl_counter = 0;
1414 start_action = tbl->
action;
1421 D_RATE(
"LQ: SISO toggle Antenna\n");
1423 tx_chains_num <= 1) ||
1425 tx_chains_num <= 2))
1431 memcpy(search_tbl, tbl, sz);
1432 if (il4965_rs_toggle_antenna
1435 update_search_tbl_counter = 1;
1442 D_RATE(
"LQ: SISO switch to MIMO2\n");
1443 memcpy(search_tbl, tbl, sz);
1453 if (!il4965_rs_is_valid_ant
1454 (valid_tx_ant, search_tbl->
ant_type))
1458 il4965_rs_switch_to_mimo2(il, lq_sta, conf, sta,
1471 D_RATE(
"LQ: SISO toggle SGI/NGI\n");
1473 memcpy(search_tbl, tbl, sz);
1478 IL_ERR(
"SGI was set in GF+SISO\n");
1481 il4965_rs_set_expected_tpt_table(lq_sta, search_tbl);
1488 il4965_rate_n_flags_from_tbl(il, search_tbl, idx,
1490 update_search_tbl_counter = 1;
1497 if (tbl->
action == start_action)
1508 if (update_search_tbl_counter)
1518 il4965_rs_move_mimo2_to_other(
struct il_priv *il,
struct il_lq_sta *lq_sta,
1534 u8 update_search_tbl_counter = 0;
1537 start_action = tbl->
action;
1543 D_RATE(
"LQ: MIMO2 toggle Antennas\n");
1545 if (tx_chains_num <= 2)
1551 memcpy(search_tbl, tbl, sz);
1552 if (il4965_rs_toggle_antenna
1555 update_search_tbl_counter = 1;
1562 D_RATE(
"LQ: MIMO2 switch to SISO\n");
1565 memcpy(search_tbl, tbl, sz);
1574 if (!il4965_rs_is_valid_ant
1575 (valid_tx_ant, search_tbl->
ant_type))
1579 il4965_rs_switch_to_siso(il, lq_sta, conf, sta,
1594 D_RATE(
"LQ: MIMO2 toggle SGI/NGI\n");
1597 memcpy(search_tbl, tbl, sz);
1599 il4965_rs_set_expected_tpt_table(lq_sta, search_tbl);
1612 il4965_rate_n_flags_from_tbl(il, search_tbl, idx,
1614 update_search_tbl_counter = 1;
1622 if (tbl->
action == start_action)
1632 if (update_search_tbl_counter)
1647 il4965_rs_stay_in_table(
struct il_lq_sta *lq_sta,
bool force_search)
1652 int flush_interval_passed = 0;
1658 tbl = &(lq_sta->
lq_info[active_tbl]);
1665 flush_interval_passed =
1682 flush_interval_passed)) {
1683 D_RATE(
"LQ: stay is expired %d %d %d\n:",
1685 flush_interval_passed);
1704 D_RATE(
"LQ: stay in table clear win\n");
1706 il4965_rs_rate_scale_clear_win(&
1718 il4965_rs_rate_scale_clear_win(&(tbl->
win[i]));
1733 rate = il4965_rate_n_flags_from_tbl(il, tbl, idx, is_green);
1734 il4965_rs_fill_link_cmd(il, lq_sta, rate);
1742 il4965_rs_rate_scale_perform(
struct il_priv *il,
struct sk_buff *skb,
1759 s8 scale_action = 0;
1763 u16 rate_scale_idx_msk = 0;
1772 D_RATE(
"rate scale calculate new rate for skb\n");
1782 tid = il4965_rs_tl_add_packet(lq_sta, hdr);
1784 tid_data = &il->
stations[lq_sta->
lq.sta_id].tid[tid];
1802 tbl = &(lq_sta->
lq_info[active_tbl]);
1806 lq_sta->
is_green = il4965_rs_use_green(il, sta);
1812 D_RATE(
"Rate scale idx %d for type %d\n", idx, tbl->
lq_type);
1815 rate_mask = il4965_rs_get_supported_rates(lq_sta, hdr, tbl->
lq_type);
1817 D_RATE(
"mask 0x%04X\n", rate_mask);
1823 rate_scale_idx_msk =
1827 rate_scale_idx_msk =
1831 rate_scale_idx_msk = rate_mask;
1833 if (!rate_scale_idx_msk)
1834 rate_scale_idx_msk = rate_mask;
1836 if (!((1 << idx) & rate_scale_idx_msk)) {
1837 IL_ERR(
"Current Rate is not valid\n");
1845 il4965_rs_update_rate_tbl(il, lq_sta, tbl, idx,
1853 IL_ERR(
"tbl->expected_tpt is NULL\n");
1877 D_RATE(
"LQ: still below TH. succ=%d total=%d " "for idx %d\n",
1885 il4965_rs_stay_in_table(lq_sta,
false);
1893 IL_ERR(
"expected_tpt should have been calculated by now\n");
1905 D_RATE(
"LQ: SWITCHING TO NEW TBL "
1906 "suc=%d cur-tpt=%d old-tpt=%d\n",
1920 D_RATE(
"LQ: GOING BACK TO THE OLD TBL "
1921 "suc=%d cur-tpt=%d old-tpt=%d\n",
1930 tbl = &(lq_sta->
lq_info[active_tbl]);
1950 il4965_rs_get_adjacent_rate(il, idx, rate_scale_idx_msk,
1952 low = high_low & 0xff;
1953 high = (high_low >> 8) & 0xff;
1964 low_tpt = tbl->
win[
low].average_tpt;
1966 high_tpt = tbl->
win[
high].average_tpt;
1972 D_RATE(
"decrease rate because of low success_ratio\n");
1987 low_tpt < current_tpt && high_tpt < current_tpt)
2004 if (low_tpt > current_tpt) {
2005 D_RATE(
"decrease rate because of low tpt\n");
2019 switch (scale_action) {
2042 D_RATE(
"choose rate scale idx %d action %d low %d " "high %d type %d\n",
2043 idx, scale_action, low, high, tbl->
lq_type);
2048 il4965_rs_update_rate_tbl(il, lq_sta, tbl, idx, is_green);
2052 il4965_rs_stay_in_table(lq_sta,
false);
2067 il4965_rs_move_legacy_other(il, lq_sta, conf, sta, idx);
2069 il4965_rs_move_siso_to_other(il, lq_sta, conf, sta,
2072 il4965_rs_move_mimo2_to_other(il, lq_sta, conf, sta,
2080 il4965_rs_rate_scale_clear_win(&(tbl->
win[i]));
2085 D_RATE(
"Switch current mcs: %X idx: %d\n",
2087 il4965_rs_fill_link_cmd(il, lq_sta, tbl->
current_rate);
2100 if (
is_legacy(tbl1->lq_type) && !conf_is_ht(conf) &&
2102 D_RATE(
"LQ: STAY in legacy table\n");
2103 il4965_rs_set_stay_in_table(il, 1, lq_sta);
2117 D_RATE(
"try to aggregate tid %d\n",
2119 il4965_rs_tl_turn_on_agg(il, tid,
2123 il4965_rs_set_stay_in_table(il, 0, lq_sta);
2129 il4965_rate_n_flags_from_tbl(il, tbl, idx, is_green);
2156 u8 use_green = il4965_rs_use_green(il, sta);
2161 if (!sta || !lq_sta)
2164 sta_priv = (
void *)sta->drv_priv;
2168 valid_tx_ant = il->
hw_params.valid_tx_ant;
2175 tbl = &(lq_sta->
lq_info[active_tbl]);
2177 if (i < 0 || i >= RATE_COUNT)
2180 rate = il_rates[
i].
plcp;
2181 tbl->
ant_type = il4965_first_antenna(valid_tx_ant);
2187 il4965_rs_get_tbl_info_from_mcs(rate, il->
band, tbl, &rate_idx);
2188 if (!il4965_rs_is_valid_ant(valid_tx_ant, tbl->
ant_type))
2189 il4965_rs_toggle_antenna(valid_tx_ant, &rate, tbl);
2191 rate = il4965_rate_n_flags_from_tbl(il, tbl, rate_idx, use_green);
2193 il4965_rs_set_expected_tpt_table(lq_sta, tbl);
2194 il4965_rs_fill_link_cmd(
NULL, lq_sta, rate);
2200 il4965_rs_get_rate(
void *il_r,
struct ieee80211_sta *sta,
void *il_sta,
2211 D_RATE(
"rate scale calculate new rate for skb\n");
2225 if (lq_sta && !lq_sta->
drv) {
2226 D_RATE(
"Rate scaling not initialized yet.\n");
2242 rate_idx = (rate_idx > 0) ? (rate_idx - 1) : 0;
2248 info->
control.rates[0].flags |=
2251 info->
control.rates[0].flags |=
2254 info->
control.rates[0].flags |=
2257 info->
control.rates[0].flags |=
2264 rate_idx = rate_lowest_index(sband, sta);
2268 info->
control.rates[0].flags = 0;
2270 info->
control.rates[0].idx = rate_idx;
2281 il = (
struct il_priv *)il_rate;
2282 D_RATE(
"create station rate scale win\n");
2284 return &sta_priv->
lq_sta;
2302 lq_sta = &sta_priv->
lq_sta;
2305 lq_sta->
lq.sta_id = sta_id;
2309 il4965_rs_rate_scale_clear_win(&lq_sta->
lq_info[j].
2316 il4965_rs_rate_scale_clear_win(&lq_sta->
lq_info[j].
2319 D_RATE(
"LQ:" "*** rate scale station global init for station %d ***\n",
2329 lq_sta->
is_green = il4965_rs_use_green(il, sta);
2348 lq_sta->
lq.general_params.single_stream_ant_msk =
2349 il4965_first_antenna(il->
hw_params.valid_tx_ant);
2350 lq_sta->
lq.general_params.dual_stream_ant_msk =
2353 if (!lq_sta->
lq.general_params.dual_stream_ant_msk) {
2354 lq_sta->
lq.general_params.dual_stream_ant_msk =
ANT_AB;
2355 }
else if (il4965_num_of_ant(il->
hw_params.valid_tx_ant) == 2) {
2356 lq_sta->
lq.general_params.dual_stream_ant_msk =
2370 #ifdef CONFIG_MAC80211_DEBUGFS
2371 lq_sta->dbg_fixed_rate = 0;
2374 il4965_rs_initialize_lq(il, conf, sta, lq_sta);
2384 int repeat_rate = 0;
2385 u8 ant_toggle_cnt = 0;
2386 u8 use_ht_possible = 1;
2387 u8 valid_tx_ant = 0;
2391 il4965_rs_dbgfs_set_mcs(lq_sta, &new_rate, idx);
2394 il4965_rs_get_tbl_info_from_mcs(new_rate, lq_sta->
band, &tbl_type,
2406 is_mimo(tbl_type.lq_type) ? 1 : 0;
2411 if (il4965_num_of_ant(tbl_type.ant_type) == 1) {
2414 }
else if (il4965_num_of_ant(tbl_type.ant_type) == 2) {
2421 valid_tx_ant = il->
hw_params.valid_tx_ant;
2433 il4965_rs_toggle_antenna(valid_tx_ant,
2440 il4965_rs_dbgfs_set_mcs(lq_sta, &new_rate, idx);
2449 il4965_rs_get_tbl_info_from_mcs(new_rate, lq_sta->
band,
2450 &tbl_type, &rate_idx);
2455 if (
is_mimo(tbl_type.lq_type))
2460 il4965_rs_get_lower_rate(lq_sta, &tbl_type, rate_idx,
2468 il4965_rs_toggle_antenna(valid_tx_ant,
2469 &new_rate, &tbl_type))
2479 use_ht_possible = 0;
2482 il4965_rs_dbgfs_set_mcs(lq_sta, &new_rate, idx);
2506 il4965_rs_free(
void *il_rate)
2512 il4965_rs_free_sta(
void *il_r,
struct ieee80211_sta *sta,
void *il_sta)
2514 struct il_priv *il __maybe_unused = il_r;
2520 #ifdef CONFIG_MAC80211_DEBUGFS
2523 il4965_rs_dbgfs_set_mcs(
struct il_lq_sta *lq_sta,
u32 * rate_n_flags,
int idx)
2530 valid_tx_ant = il->
hw_params.valid_tx_ant;
2531 if (lq_sta->dbg_fixed_rate) {
2536 if ((valid_tx_ant & ant_sel_tx) == ant_sel_tx) {
2537 *rate_n_flags = lq_sta->dbg_fixed_rate;
2538 D_RATE(
"Fixed rate ON\n");
2540 lq_sta->dbg_fixed_rate = 0;
2542 (
"Invalid antenna selection 0x%X, Valid is 0x%X\n",
2543 ant_sel_tx, valid_tx_ant);
2544 D_RATE(
"Fixed rate OFF\n");
2547 D_RATE(
"Fixed rate OFF\n");
2552 il4965_rs_sta_dbgfs_scale_table_write(
struct file *
file,
2553 const char __user *user_buf,
2554 size_t count, loff_t *ppos)
2563 memset(buf, 0,
sizeof(buf));
2564 buf_size =
min(count,
sizeof(buf) - 1);
2568 if (
sscanf(buf,
"%x", &parsed_rate) == 1)
2569 lq_sta->dbg_fixed_rate = parsed_rate;
2571 lq_sta->dbg_fixed_rate = 0;
2577 D_RATE(
"sta_id %d rate 0x%X\n", lq_sta->
lq.sta_id,
2578 lq_sta->dbg_fixed_rate);
2580 if (lq_sta->dbg_fixed_rate) {
2581 il4965_rs_fill_link_cmd(
NULL, lq_sta, lq_sta->dbg_fixed_rate);
2589 il4965_rs_sta_dbgfs_scale_table_read(
struct file *file,
char __user *user_buf,
2590 size_t count, loff_t *ppos)
2607 desc +=
sprintf(buff + desc,
"sta_id %d\n", lq_sta->
lq.sta_id);
2609 sprintf(buff + desc,
"failed=%d success=%d rate=0%X\n",
2613 sprintf(buff + desc,
"fixed rate 0x%X\n", lq_sta->dbg_fixed_rate);
2615 sprintf(buff + desc,
"valid_tx_ant %s%s%s\n",
2620 sprintf(buff + desc,
"lq type %s\n",
2628 (tbl->
is_ht40) ?
"40MHz" :
"20MHz");
2630 sprintf(buff + desc,
" %s %s %s\n",
2631 (tbl->
is_SGI) ?
"SGI" :
"",
2632 (lq_sta->
is_green) ?
"GF enabled" :
"",
2633 (lq_sta->
is_agg) ?
"AGG on" :
"");
2636 sprintf(buff + desc,
"last tx rate=0x%X\n",
2640 "general:" "flags=0x%X mimo-d=%d s-ant0x%x d-ant=0x%x\n",
2641 lq_sta->
lq.general_params.flags,
2642 lq_sta->
lq.general_params.mimo_delimiter,
2643 lq_sta->
lq.general_params.single_stream_ant_msk,
2644 lq_sta->
lq.general_params.dual_stream_ant_msk);
2649 "time_limit=%d dist_start_th=%d frame_cnt_limit=%d\n",
2651 lq_sta->
lq.agg_params.agg_dis_start_th,
2652 lq_sta->
lq.agg_params.agg_frame_cnt_limit);
2656 "Start idx [0]=0x%x [1]=0x%x [2]=0x%x [3]=0x%x\n",
2657 lq_sta->
lq.general_params.start_rate_idx[0],
2658 lq_sta->
lq.general_params.start_rate_idx[1],
2659 lq_sta->
lq.general_params.start_rate_idx[2],
2660 lq_sta->
lq.general_params.start_rate_idx[3]);
2665 (lq_sta->
lq.rs_table[i].
2669 sprintf(buff + desc,
" rate[%d] 0x%X %smbps\n", i,
2672 il_rate_mcs[idx].
mbps);
2675 sprintf(buff + desc,
" rate[%d] 0x%X %smbps (%s)\n",
2679 il_rate_mcs[idx].
mbps,
2680 il_rate_mcs[idx].
mcs);
2690 .
write = il4965_rs_sta_dbgfs_scale_table_write,
2691 .read = il4965_rs_sta_dbgfs_scale_table_read,
2697 il4965_rs_sta_dbgfs_stats_table_read(
struct file *file,
char __user *user_buf,
2698 size_t count, loff_t *ppos)
2711 for (i = 0; i <
LQ_SIZE; i++) {
2714 "%s type=%d SGI=%d HT40=%d DUP=%d GF=%d\n"
2715 "rate=0x%X\n", lq_sta->
active_tbl == i ?
"*" :
"x",
2720 lq_sta->
lq_info[i].current_rate);
2724 "counter=%d success=%d %%=%d\n",
2725 lq_sta->
lq_info[i].win[j].counter,
2726 lq_sta->
lq_info[i].win[j].success_counter,
2727 lq_sta->
lq_info[i].win[j].success_ratio);
2736 .
read = il4965_rs_sta_dbgfs_stats_table_read,
2742 il4965_rs_sta_dbgfs_rate_scale_data_read(
struct file *file,
2743 char __user *user_buf,
size_t count,
2753 sprintf(buff + desc,
"Bit Rate= %d Mb/s\n",
2757 sprintf(buff + desc,
"Bit Rate= %d Mb/s\n",
2763 static const struct file_operations rs_sta_dbgfs_rate_scale_data_ops = {
2764 .
read = il4965_rs_sta_dbgfs_rate_scale_data_read,
2770 il4965_rs_add_debugfs(
void *il,
void *il_sta,
struct dentry *dir)
2773 lq_sta->rs_sta_dbgfs_scale_table_file =
2775 lq_sta, &rs_sta_dbgfs_scale_table_ops);
2776 lq_sta->rs_sta_dbgfs_stats_table_file =
2778 &rs_sta_dbgfs_stats_table_ops);
2779 lq_sta->rs_sta_dbgfs_rate_scale_data_file =
2781 &rs_sta_dbgfs_rate_scale_data_ops);
2782 lq_sta->rs_sta_dbgfs_tx_agg_tid_en_file =
2789 il4965_rs_remove_debugfs(
void *il,
void *il_sta)
2813 .tx_status = il4965_rs_tx_status,
2814 .get_rate = il4965_rs_get_rate,
2815 .rate_init = il4965_rs_rate_init_stub,
2816 .alloc = il4965_rs_alloc,
2817 .free = il4965_rs_free,
2818 .alloc_sta = il4965_rs_alloc_sta,
2819 .free_sta = il4965_rs_free_sta,
2820 #ifdef CONFIG_MAC80211_DEBUGFS
2821 .add_sta_debugfs = il4965_rs_add_debugfs,
2822 .remove_sta_debugfs = il4965_rs_remove_debugfs,