Lines Matching refs:lq_sta
153 struct iwl_lq_sta *lq_sta);
155 struct iwl_lq_sta *lq_sta, u32 rate_n_flags);
156 static void rs_stay_in_table(struct iwl_lq_sta *lq_sta, bool force_search);
160 static void rs_dbgfs_set_mcs(struct iwl_lq_sta *lq_sta,
163 static void rs_dbgfs_set_mcs(struct iwl_lq_sta *lq_sta, in rs_dbgfs_set_mcs() argument
342 struct iwl_lq_sta *lq_sta) in rs_program_fix_rate() argument
345 container_of(lq_sta, struct iwl_station_priv, lq_sta); in rs_program_fix_rate()
348 lq_sta->active_legacy_rate = 0x0FFF; /* 1 - 54 MBits, includes CCK */ in rs_program_fix_rate()
349 lq_sta->active_siso_rate = 0x1FD0; /* 6 - 60 MBits, no 9, no CCK */ in rs_program_fix_rate()
350 lq_sta->active_mimo2_rate = 0x1FD0; /* 6 - 60 MBits, no 9, no CCK */ in rs_program_fix_rate()
351 lq_sta->active_mimo3_rate = 0x1FD0; /* 6 - 60 MBits, no 9, no CCK */ in rs_program_fix_rate()
354 lq_sta->lq.sta_id, lq_sta->dbg_fixed_rate); in rs_program_fix_rate()
356 if (lq_sta->dbg_fixed_rate) { in rs_program_fix_rate()
357 rs_fill_link_cmd(NULL, lq_sta, lq_sta->dbg_fixed_rate); in rs_program_fix_rate()
358 iwl_send_lq_cmd(lq_sta->drv, ctx, &lq_sta->lq, CMD_ASYNC, in rs_program_fix_rate()
716 static u16 rs_get_supported_rates(struct iwl_lq_sta *lq_sta, in rs_get_supported_rates() argument
721 return lq_sta->active_legacy_rate; in rs_get_supported_rates()
724 return lq_sta->active_siso_rate; in rs_get_supported_rates()
726 return lq_sta->active_mimo2_rate; in rs_get_supported_rates()
728 return lq_sta->active_mimo3_rate; in rs_get_supported_rates()
788 static u32 rs_get_lower_rate(struct iwl_lq_sta *lq_sta, in rs_get_lower_rate() argument
796 u8 is_green = lq_sta->is_green; in rs_get_lower_rate()
797 struct iwl_priv *priv = lq_sta->drv; in rs_get_lower_rate()
805 if (lq_sta->band == IEEE80211_BAND_5GHZ) in rs_get_lower_rate()
819 rate_mask = rs_get_supported_rates(lq_sta, NULL, tbl->lq_type); in rs_get_lower_rate()
824 if (lq_sta->band == IEEE80211_BAND_5GHZ) in rs_get_lower_rate()
826 (lq_sta->supp_rates << IWL_FIRST_OFDM_RATE)); in rs_get_lower_rate()
828 rate_mask = (u16)(rate_mask & lq_sta->supp_rates); in rs_get_lower_rate()
837 high_low = rs_get_adjacent_rate(lq_sta->drv, scale_index, rate_mask, in rs_get_lower_rate()
845 return rate_n_flags_from_tbl(lq_sta->drv, tbl, low, is_green); in rs_get_lower_rate()
859 struct iwl_lq_sta *lq_sta) in rs_bt_update_lq() argument
880 tbl = &(lq_sta->lq_info[lq_sta->active_tbl]); in rs_bt_update_lq()
881 rs_fill_link_cmd(priv, lq_sta, tbl->current_rate); in rs_bt_update_lq()
882 iwl_send_lq_cmd(priv, ctx, &lq_sta->lq, CMD_ASYNC, false); in rs_bt_update_lq()
898 struct iwl_lq_sta *lq_sta = priv_sta; in rs_tx_status() local
914 if (!lq_sta) { in rs_tx_status()
917 } else if (!lq_sta->drv) { in rs_tx_status()
939 table = &lq_sta->lq; in rs_tx_status()
973 lq_sta->missed_rate_counter++; in rs_tx_status()
974 if (lq_sta->missed_rate_counter > IWL_MISSED_RATE_MAX) { in rs_tx_status()
975 lq_sta->missed_rate_counter = 0; in rs_tx_status()
976 iwl_send_lq_cmd(priv, ctx, &lq_sta->lq, CMD_ASYNC, false); in rs_tx_status()
982 lq_sta->missed_rate_counter = 0; in rs_tx_status()
986 &(lq_sta->lq_info[lq_sta->active_tbl]))) { in rs_tx_status()
987 curr_tbl = &(lq_sta->lq_info[lq_sta->active_tbl]); in rs_tx_status()
988 other_tbl = &(lq_sta->lq_info[1 - lq_sta->active_tbl]); in rs_tx_status()
990 &lq_sta->lq_info[1 - lq_sta->active_tbl])) { in rs_tx_status()
991 curr_tbl = &(lq_sta->lq_info[1 - lq_sta->active_tbl]); in rs_tx_status()
992 other_tbl = &(lq_sta->lq_info[lq_sta->active_tbl]); in rs_tx_status()
995 tmp_tbl = &(lq_sta->lq_info[lq_sta->active_tbl]); in rs_tx_status()
998 tmp_tbl = &(lq_sta->lq_info[1 - lq_sta->active_tbl]); in rs_tx_status()
1007 rs_stay_in_table(lq_sta, true); in rs_tx_status()
1027 if (lq_sta->stay_in_tbl) { in rs_tx_status()
1028 lq_sta->total_success += info->status.ampdu_ack_len; in rs_tx_status()
1029 lq_sta->total_failed += (info->status.ampdu_len - in rs_tx_status()
1062 if (lq_sta->stay_in_tbl) { in rs_tx_status()
1063 lq_sta->total_success += legacy_success; in rs_tx_status()
1064 lq_sta->total_failed += retries + (1 - legacy_success); in rs_tx_status()
1068 lq_sta->last_rate_n_flags = tx_rate; in rs_tx_status()
1072 rs_rate_scale_perform(priv, skb, sta, lq_sta); in rs_tx_status()
1075 rs_bt_update_lq(priv, ctx, lq_sta); in rs_tx_status()
1087 struct iwl_lq_sta *lq_sta) in rs_set_stay_in_table() argument
1090 lq_sta->stay_in_tbl = 1; /* only place this gets set */ in rs_set_stay_in_table()
1092 lq_sta->table_count_limit = IWL_LEGACY_TABLE_COUNT; in rs_set_stay_in_table()
1093 lq_sta->max_failure_limit = IWL_LEGACY_FAILURE_LIMIT; in rs_set_stay_in_table()
1094 lq_sta->max_success_limit = IWL_LEGACY_SUCCESS_LIMIT; in rs_set_stay_in_table()
1096 lq_sta->table_count_limit = IWL_NONE_LEGACY_TABLE_COUNT; in rs_set_stay_in_table()
1097 lq_sta->max_failure_limit = IWL_NONE_LEGACY_FAILURE_LIMIT; in rs_set_stay_in_table()
1098 lq_sta->max_success_limit = IWL_NONE_LEGACY_SUCCESS_LIMIT; in rs_set_stay_in_table()
1100 lq_sta->table_count = 0; in rs_set_stay_in_table()
1101 lq_sta->total_failed = 0; in rs_set_stay_in_table()
1102 lq_sta->total_success = 0; in rs_set_stay_in_table()
1103 lq_sta->flush_timer = jiffies; in rs_set_stay_in_table()
1104 lq_sta->action_counter = 0; in rs_set_stay_in_table()
1110 static void rs_set_expected_tpt_table(struct iwl_lq_sta *lq_sta, in rs_set_expected_tpt_table() argument
1131 if (is_siso(tbl->lq_type) && (!tbl->is_ht40 || lq_sta->is_dup)) in rs_set_expected_tpt_table()
1135 else if (is_mimo2(tbl->lq_type) && (!tbl->is_ht40 || lq_sta->is_dup)) in rs_set_expected_tpt_table()
1139 else if (is_mimo3(tbl->lq_type) && (!tbl->is_ht40 || lq_sta->is_dup)) in rs_set_expected_tpt_table()
1144 if (!tbl->is_SGI && !lq_sta->is_agg) /* Normal */ in rs_set_expected_tpt_table()
1146 else if (tbl->is_SGI && !lq_sta->is_agg) /* SGI */ in rs_set_expected_tpt_table()
1148 else if (!tbl->is_SGI && lq_sta->is_agg) /* AGG */ in rs_set_expected_tpt_table()
1167 struct iwl_lq_sta *lq_sta, in rs_get_best_rate() argument
1173 &(lq_sta->lq_info[lq_sta->active_tbl]); in rs_get_best_rate()
1207 if ((((100 * tpt_tbl[rate]) > lq_sta->last_tpt) && in rs_get_best_rate()
1260 struct iwl_lq_sta *lq_sta, in rs_switch_to_mimo2() argument
1267 s8 is_green = lq_sta->is_green; in rs_switch_to_mimo2()
1284 tbl->is_dup = lq_sta->is_dup; in rs_switch_to_mimo2()
1287 rate_mask = lq_sta->active_mimo2_rate; in rs_switch_to_mimo2()
1294 rs_set_expected_tpt_table(lq_sta, tbl); in rs_switch_to_mimo2()
1296 rate = rs_get_best_rate(priv, lq_sta, tbl, rate_mask, index); in rs_switch_to_mimo2()
1315 struct iwl_lq_sta *lq_sta, in rs_switch_to_mimo3() argument
1322 s8 is_green = lq_sta->is_green; in rs_switch_to_mimo3()
1339 tbl->is_dup = lq_sta->is_dup; in rs_switch_to_mimo3()
1342 rate_mask = lq_sta->active_mimo3_rate; in rs_switch_to_mimo3()
1349 rs_set_expected_tpt_table(lq_sta, tbl); in rs_switch_to_mimo3()
1351 rate = rs_get_best_rate(priv, lq_sta, tbl, rate_mask, index); in rs_switch_to_mimo3()
1371 struct iwl_lq_sta *lq_sta, in rs_switch_to_siso() argument
1377 u8 is_green = lq_sta->is_green; in rs_switch_to_siso()
1387 tbl->is_dup = lq_sta->is_dup; in rs_switch_to_siso()
1391 rate_mask = lq_sta->active_siso_rate; in rs_switch_to_siso()
1401 rs_set_expected_tpt_table(lq_sta, tbl); in rs_switch_to_siso()
1402 rate = rs_get_best_rate(priv, lq_sta, tbl, rate_mask, index); in rs_switch_to_siso()
1420 struct iwl_lq_sta *lq_sta, in rs_move_legacy_other() argument
1425 struct iwl_scale_tbl_info *tbl = &(lq_sta->lq_info[lq_sta->active_tbl]); in rs_move_legacy_other()
1427 &(lq_sta->lq_info[(1 - lq_sta->active_tbl)]); in rs_move_legacy_other()
1479 lq_sta->action_counter++; in rs_move_legacy_other()
1504 rs_set_expected_tpt_table(lq_sta, search_tbl); in rs_move_legacy_other()
1514 ret = rs_switch_to_siso(priv, lq_sta, conf, sta, in rs_move_legacy_other()
1517 lq_sta->action_counter = 0; in rs_move_legacy_other()
1541 ret = rs_switch_to_mimo2(priv, lq_sta, conf, sta, in rs_move_legacy_other()
1544 lq_sta->action_counter = 0; in rs_move_legacy_other()
1561 ret = rs_switch_to_mimo3(priv, lq_sta, conf, sta, in rs_move_legacy_other()
1564 lq_sta->action_counter = 0; in rs_move_legacy_other()
1581 lq_sta->search_better_tbl = 1; in rs_move_legacy_other()
1595 struct iwl_lq_sta *lq_sta, in rs_move_siso_to_other() argument
1599 u8 is_green = lq_sta->is_green; in rs_move_siso_to_other()
1600 struct iwl_scale_tbl_info *tbl = &(lq_sta->lq_info[lq_sta->active_tbl]); in rs_move_siso_to_other()
1602 &(lq_sta->lq_info[(1 - lq_sta->active_tbl)]); in rs_move_siso_to_other()
1651 lq_sta->action_counter++; in rs_move_siso_to_other()
1692 ret = rs_switch_to_mimo2(priv, lq_sta, conf, sta, in rs_move_siso_to_other()
1716 rs_set_expected_tpt_table(lq_sta, search_tbl); in rs_move_siso_to_other()
1718 s32 tpt = lq_sta->last_tpt / 100; in rs_move_siso_to_other()
1736 ret = rs_switch_to_mimo3(priv, lq_sta, conf, sta, in rs_move_siso_to_other()
1753 lq_sta->search_better_tbl = 1; in rs_move_siso_to_other()
1767 struct iwl_lq_sta *lq_sta, in rs_move_mimo2_to_other() argument
1771 s8 is_green = lq_sta->is_green; in rs_move_mimo2_to_other()
1772 struct iwl_scale_tbl_info *tbl = &(lq_sta->lq_info[lq_sta->active_tbl]); in rs_move_mimo2_to_other()
1774 &(lq_sta->lq_info[(1 - lq_sta->active_tbl)]); in rs_move_mimo2_to_other()
1821 lq_sta->action_counter++; in rs_move_mimo2_to_other()
1858 ret = rs_switch_to_siso(priv, lq_sta, conf, sta, in rs_move_mimo2_to_other()
1878 rs_set_expected_tpt_table(lq_sta, search_tbl); in rs_move_mimo2_to_other()
1886 s32 tpt = lq_sta->last_tpt / 100; in rs_move_mimo2_to_other()
1905 ret = rs_switch_to_mimo3(priv, lq_sta, conf, sta, in rs_move_mimo2_to_other()
1922 lq_sta->search_better_tbl = 1; in rs_move_mimo2_to_other()
1937 struct iwl_lq_sta *lq_sta, in rs_move_mimo3_to_other() argument
1941 s8 is_green = lq_sta->is_green; in rs_move_mimo3_to_other()
1942 struct iwl_scale_tbl_info *tbl = &(lq_sta->lq_info[lq_sta->active_tbl]); in rs_move_mimo3_to_other()
1944 &(lq_sta->lq_info[(1 - lq_sta->active_tbl)]); in rs_move_mimo3_to_other()
1991 lq_sta->action_counter++; in rs_move_mimo3_to_other()
2026 ret = rs_switch_to_siso(priv, lq_sta, conf, sta, in rs_move_mimo3_to_other()
2050 ret = rs_switch_to_mimo2(priv, lq_sta, conf, sta, in rs_move_mimo3_to_other()
2070 rs_set_expected_tpt_table(lq_sta, search_tbl); in rs_move_mimo3_to_other()
2078 s32 tpt = lq_sta->last_tpt / 100; in rs_move_mimo3_to_other()
2098 lq_sta->search_better_tbl = 1; in rs_move_mimo3_to_other()
2116 static void rs_stay_in_table(struct iwl_lq_sta *lq_sta, bool force_search) in rs_stay_in_table() argument
2124 priv = lq_sta->drv; in rs_stay_in_table()
2125 active_tbl = lq_sta->active_tbl; in rs_stay_in_table()
2127 tbl = &(lq_sta->lq_info[active_tbl]); in rs_stay_in_table()
2130 if (lq_sta->stay_in_tbl) { in rs_stay_in_table()
2133 if (lq_sta->flush_timer) in rs_stay_in_table()
2136 (unsigned long)(lq_sta->flush_timer + in rs_stay_in_table()
2148 (lq_sta->total_failed > lq_sta->max_failure_limit) || in rs_stay_in_table()
2149 (lq_sta->total_success > lq_sta->max_success_limit) || in rs_stay_in_table()
2150 ((!lq_sta->search_better_tbl) && (lq_sta->flush_timer) in rs_stay_in_table()
2153 lq_sta->total_failed, in rs_stay_in_table()
2154 lq_sta->total_success, in rs_stay_in_table()
2158 lq_sta->stay_in_tbl = 0; /* only place reset */ in rs_stay_in_table()
2159 lq_sta->total_failed = 0; in rs_stay_in_table()
2160 lq_sta->total_success = 0; in rs_stay_in_table()
2161 lq_sta->flush_timer = 0; in rs_stay_in_table()
2170 lq_sta->table_count++; in rs_stay_in_table()
2171 if (lq_sta->table_count >= in rs_stay_in_table()
2172 lq_sta->table_count_limit) { in rs_stay_in_table()
2173 lq_sta->table_count = 0; in rs_stay_in_table()
2185 if (!lq_sta->stay_in_tbl) { in rs_stay_in_table()
2197 struct iwl_lq_sta *lq_sta, in rs_update_rate_tbl() argument
2205 rs_fill_link_cmd(priv, lq_sta, rate); in rs_update_rate_tbl()
2206 iwl_send_lq_cmd(priv, ctx, &lq_sta->lq, CMD_ASYNC, false); in rs_update_rate_tbl()
2215 struct iwl_lq_sta *lq_sta) in rs_rate_scale_perform() argument
2253 lq_sta->supp_rates = sta->supp_rates[lq_sta->band]; in rs_rate_scale_perform()
2255 tid = rs_tl_add_packet(lq_sta, hdr); in rs_rate_scale_perform()
2257 (lq_sta->tx_agg_tid_en & (1 << tid))) { in rs_rate_scale_perform()
2258 tid_data = &priv->tid_data[lq_sta->lq.sta_id][tid]; in rs_rate_scale_perform()
2260 lq_sta->is_agg = 0; in rs_rate_scale_perform()
2262 lq_sta->is_agg = 1; in rs_rate_scale_perform()
2264 lq_sta->is_agg = 0; in rs_rate_scale_perform()
2271 if (!lq_sta->search_better_tbl) in rs_rate_scale_perform()
2272 active_tbl = lq_sta->active_tbl; in rs_rate_scale_perform()
2274 active_tbl = 1 - lq_sta->active_tbl; in rs_rate_scale_perform()
2276 tbl = &(lq_sta->lq_info[active_tbl]); in rs_rate_scale_perform()
2278 lq_sta->is_green = 0; in rs_rate_scale_perform()
2280 lq_sta->is_green = rs_use_green(sta); in rs_rate_scale_perform()
2281 is_green = lq_sta->is_green; in rs_rate_scale_perform()
2284 index = lq_sta->last_txrate_idx; in rs_rate_scale_perform()
2290 rate_mask = rs_get_supported_rates(lq_sta, hdr, tbl->lq_type); in rs_rate_scale_perform()
2296 if (lq_sta->band == IEEE80211_BAND_5GHZ) in rs_rate_scale_perform()
2299 (lq_sta->supp_rates << IWL_FIRST_OFDM_RATE)); in rs_rate_scale_perform()
2302 lq_sta->supp_rates); in rs_rate_scale_perform()
2312 if (lq_sta->search_better_tbl) { in rs_rate_scale_perform()
2315 lq_sta->search_better_tbl = 0; in rs_rate_scale_perform()
2316 tbl = &(lq_sta->lq_info[lq_sta->active_tbl]); in rs_rate_scale_perform()
2319 rs_update_rate_tbl(priv, ctx, lq_sta, tbl, in rs_rate_scale_perform()
2332 if ((lq_sta->max_rate_idx != -1) && in rs_rate_scale_perform()
2333 (lq_sta->max_rate_idx < index)) { in rs_rate_scale_perform()
2334 index = lq_sta->max_rate_idx; in rs_rate_scale_perform()
2361 rs_stay_in_table(lq_sta, false); in rs_rate_scale_perform()
2375 if (lq_sta->search_better_tbl && in rs_rate_scale_perform()
2380 if (window->average_tpt > lq_sta->last_tpt) { in rs_rate_scale_perform()
2386 lq_sta->last_tpt); in rs_rate_scale_perform()
2389 lq_sta->enable_counter = 1; in rs_rate_scale_perform()
2392 lq_sta->active_tbl = active_tbl; in rs_rate_scale_perform()
2402 lq_sta->last_tpt); in rs_rate_scale_perform()
2408 active_tbl = lq_sta->active_tbl; in rs_rate_scale_perform()
2409 tbl = &(lq_sta->lq_info[active_tbl]); in rs_rate_scale_perform()
2413 current_tpt = lq_sta->last_tpt; in rs_rate_scale_perform()
2421 lq_sta->search_better_tbl = 0; in rs_rate_scale_perform()
2434 if ((lq_sta->max_rate_idx != -1) && in rs_rate_scale_perform()
2435 (lq_sta->max_rate_idx < high)) in rs_rate_scale_perform()
2512 if (lq_sta->last_bt_traffic > priv->bt_traffic_load) { in rs_rate_scale_perform()
2518 } else if (lq_sta->last_bt_traffic <= priv->bt_traffic_load) { in rs_rate_scale_perform()
2522 lq_sta->last_bt_traffic = priv->bt_traffic_load; in rs_rate_scale_perform()
2527 rs_stay_in_table(lq_sta, true); in rs_rate_scale_perform()
2561 rs_update_rate_tbl(priv, ctx, lq_sta, tbl, index, is_green); in rs_rate_scale_perform()
2566 rs_stay_in_table(lq_sta, false); in rs_rate_scale_perform()
2574 if (!update_lq && !done_search && !lq_sta->stay_in_tbl && window->counter) { in rs_rate_scale_perform()
2576 lq_sta->last_tpt = current_tpt; in rs_rate_scale_perform()
2581 rs_move_legacy_other(priv, lq_sta, conf, sta, index); in rs_rate_scale_perform()
2583 rs_move_siso_to_other(priv, lq_sta, conf, sta, index); in rs_rate_scale_perform()
2585 rs_move_mimo2_to_other(priv, lq_sta, conf, sta, index); in rs_rate_scale_perform()
2587 rs_move_mimo3_to_other(priv, lq_sta, conf, sta, index); in rs_rate_scale_perform()
2590 if (lq_sta->search_better_tbl) { in rs_rate_scale_perform()
2592 tbl = &(lq_sta->lq_info[(1 - lq_sta->active_tbl)]); in rs_rate_scale_perform()
2601 rs_fill_link_cmd(priv, lq_sta, tbl->current_rate); in rs_rate_scale_perform()
2602 iwl_send_lq_cmd(priv, ctx, &lq_sta->lq, CMD_ASYNC, false); in rs_rate_scale_perform()
2607 if (done_search && !lq_sta->stay_in_tbl) { in rs_rate_scale_perform()
2613 tbl1 = &(lq_sta->lq_info[lq_sta->active_tbl]); in rs_rate_scale_perform()
2615 lq_sta->action_counter > tbl1->max_search) { in rs_rate_scale_perform()
2617 rs_set_stay_in_table(priv, 1, lq_sta); in rs_rate_scale_perform()
2623 if (lq_sta->enable_counter && in rs_rate_scale_perform()
2624 (lq_sta->action_counter >= tbl1->max_search) && in rs_rate_scale_perform()
2626 if ((lq_sta->last_tpt > IWL_AGG_TPT_THREHOLD) && in rs_rate_scale_perform()
2627 (lq_sta->tx_agg_tid_en & (1 << tid)) && in rs_rate_scale_perform()
2629 u8 sta_id = lq_sta->lq.sta_id; in rs_rate_scale_perform()
2636 lq_sta, sta); in rs_rate_scale_perform()
2639 rs_set_stay_in_table(priv, 0, lq_sta); in rs_rate_scale_perform()
2645 lq_sta->last_txrate_idx = index; in rs_rate_scale_perform()
2664 struct iwl_lq_sta *lq_sta) in rs_initialize_lq() argument
2676 if (!sta || !lq_sta) in rs_initialize_lq()
2682 i = lq_sta->last_txrate_idx; in rs_initialize_lq()
2686 if (!lq_sta->search_better_tbl) in rs_initialize_lq()
2687 active_tbl = lq_sta->active_tbl; in rs_initialize_lq()
2689 active_tbl = 1 - lq_sta->active_tbl; in rs_initialize_lq()
2691 tbl = &(lq_sta->lq_info[active_tbl]); in rs_initialize_lq()
2709 rs_set_expected_tpt_table(lq_sta, tbl); in rs_initialize_lq()
2710 rs_fill_link_cmd(NULL, lq_sta, rate); in rs_initialize_lq()
2711 priv->stations[lq_sta->lq.sta_id].lq = &lq_sta->lq; in rs_initialize_lq()
2712 iwl_send_lq_cmd(priv, ctx, &lq_sta->lq, 0, true); in rs_initialize_lq()
2725 struct iwl_lq_sta *lq_sta = priv_sta; in rs_get_rate() local
2731 if (lq_sta) { in rs_get_rate()
2732 lq_sta->max_rate_idx = txrc->max_rate_idx; in rs_get_rate()
2734 (lq_sta->max_rate_idx != -1)) in rs_get_rate()
2735 lq_sta->max_rate_idx += IWL_FIRST_OFDM_RATE; in rs_get_rate()
2736 if ((lq_sta->max_rate_idx < 0) || in rs_get_rate()
2737 (lq_sta->max_rate_idx >= IWL_RATE_COUNT)) in rs_get_rate()
2738 lq_sta->max_rate_idx = -1; in rs_get_rate()
2742 if (lq_sta && !lq_sta->drv) { in rs_get_rate()
2751 rate_idx = lq_sta->last_txrate_idx; in rs_get_rate()
2753 if (lq_sta->last_rate_n_flags & RATE_MCS_HT_MSK) { in rs_get_rate()
2757 if (rs_extract_rate(lq_sta->last_rate_n_flags) >= in rs_get_rate()
2760 else if (rs_extract_rate(lq_sta->last_rate_n_flags) >= in rs_get_rate()
2764 if (lq_sta->last_rate_n_flags & RATE_MCS_SGI_MSK) in rs_get_rate()
2766 if (lq_sta->last_rate_n_flags & RATE_MCS_DUP_MSK) in rs_get_rate()
2768 if (lq_sta->last_rate_n_flags & RATE_MCS_HT40_MSK) in rs_get_rate()
2770 if (lq_sta->last_rate_n_flags & RATE_MCS_GF_MSK) in rs_get_rate()
2797 return &sta_priv->lq_sta; in rs_alloc_sta()
2810 struct iwl_lq_sta *lq_sta; in iwl_rs_rate_init() local
2815 lq_sta = &sta_priv->lq_sta; in iwl_rs_rate_init()
2819 lq_sta->lq.sta_id = sta_id; in iwl_rs_rate_init()
2823 rs_rate_scale_clear_window(&lq_sta->lq_info[j].win[i]); in iwl_rs_rate_init()
2825 lq_sta->flush_timer = 0; in iwl_rs_rate_init()
2826 lq_sta->supp_rates = sta->supp_rates[sband->band]; in iwl_rs_rate_init()
2835 lq_sta->is_dup = 0; in iwl_rs_rate_init()
2836 lq_sta->max_rate_idx = -1; in iwl_rs_rate_init()
2837 lq_sta->missed_rate_counter = IWL_MISSED_RATE_MAX; in iwl_rs_rate_init()
2838 lq_sta->is_green = rs_use_green(sta); in iwl_rs_rate_init()
2839 lq_sta->band = sband->band; in iwl_rs_rate_init()
2844 lq_sta->active_legacy_rate = 0; in iwl_rs_rate_init()
2846 lq_sta->active_legacy_rate |= BIT(sband->bitrates[i].hw_value); in iwl_rs_rate_init()
2852 lq_sta->active_siso_rate = ht_cap->mcs.rx_mask[0] << 1; in iwl_rs_rate_init()
2853 lq_sta->active_siso_rate |= ht_cap->mcs.rx_mask[0] & 0x1; in iwl_rs_rate_init()
2854 lq_sta->active_siso_rate &= ~((u16)0x2); in iwl_rs_rate_init()
2855 lq_sta->active_siso_rate <<= IWL_FIRST_OFDM_RATE; in iwl_rs_rate_init()
2858 lq_sta->active_mimo2_rate = ht_cap->mcs.rx_mask[1] << 1; in iwl_rs_rate_init()
2859 lq_sta->active_mimo2_rate |= ht_cap->mcs.rx_mask[1] & 0x1; in iwl_rs_rate_init()
2860 lq_sta->active_mimo2_rate &= ~((u16)0x2); in iwl_rs_rate_init()
2861 lq_sta->active_mimo2_rate <<= IWL_FIRST_OFDM_RATE; in iwl_rs_rate_init()
2863 lq_sta->active_mimo3_rate = ht_cap->mcs.rx_mask[2] << 1; in iwl_rs_rate_init()
2864 lq_sta->active_mimo3_rate |= ht_cap->mcs.rx_mask[2] & 0x1; in iwl_rs_rate_init()
2865 lq_sta->active_mimo3_rate &= ~((u16)0x2); in iwl_rs_rate_init()
2866 lq_sta->active_mimo3_rate <<= IWL_FIRST_OFDM_RATE; in iwl_rs_rate_init()
2869 lq_sta->active_siso_rate, in iwl_rs_rate_init()
2870 lq_sta->active_mimo2_rate, in iwl_rs_rate_init()
2871 lq_sta->active_mimo3_rate); in iwl_rs_rate_init()
2874 lq_sta->lq.general_params.single_stream_ant_msk = in iwl_rs_rate_init()
2876 lq_sta->lq.general_params.dual_stream_ant_msk = in iwl_rs_rate_init()
2879 if (!lq_sta->lq.general_params.dual_stream_ant_msk) { in iwl_rs_rate_init()
2880 lq_sta->lq.general_params.dual_stream_ant_msk = ANT_AB; in iwl_rs_rate_init()
2882 lq_sta->lq.general_params.dual_stream_ant_msk = in iwl_rs_rate_init()
2887 lq_sta->tx_agg_tid_en = IWL_AGG_ALL_TID; in iwl_rs_rate_init()
2888 lq_sta->drv = priv; in iwl_rs_rate_init()
2891 lq_sta->last_txrate_idx = rate_lowest_index(sband, sta); in iwl_rs_rate_init()
2893 lq_sta->last_txrate_idx += IWL_FIRST_OFDM_RATE; in iwl_rs_rate_init()
2894 lq_sta->is_agg = 0; in iwl_rs_rate_init()
2896 lq_sta->dbg_fixed_rate = 0; in iwl_rs_rate_init()
2899 rs_initialize_lq(priv, sta, lq_sta); in iwl_rs_rate_init()
2903 struct iwl_lq_sta *lq_sta, u32 new_rate) in rs_fill_link_cmd() argument
2913 container_of(lq_sta, struct iwl_station_priv, lq_sta); in rs_fill_link_cmd()
2914 struct iwl_link_quality_cmd *lq_cmd = &lq_sta->lq; in rs_fill_link_cmd()
2917 rs_dbgfs_set_mcs(lq_sta, &new_rate, index); in rs_fill_link_cmd()
2920 rs_get_tbl_info_from_mcs(new_rate, lq_sta->band, in rs_fill_link_cmd()
2977 rs_dbgfs_set_mcs(lq_sta, &new_rate, index); in rs_fill_link_cmd()
2986 rs_get_tbl_info_from_mcs(new_rate, lq_sta->band, &tbl_type, in rs_fill_link_cmd()
3002 new_rate = rs_get_lower_rate(lq_sta, &tbl_type, rate_idx, in rs_fill_link_cmd()
3024 rs_dbgfs_set_mcs(lq_sta, &new_rate, index); in rs_fill_link_cmd()
3071 static void rs_dbgfs_set_mcs(struct iwl_lq_sta *lq_sta, in rs_dbgfs_set_mcs() argument
3078 priv = lq_sta->drv; in rs_dbgfs_set_mcs()
3080 if (lq_sta->dbg_fixed_rate) { in rs_dbgfs_set_mcs()
3082 ((lq_sta->dbg_fixed_rate & RATE_MCS_ANT_ABC_MSK) in rs_dbgfs_set_mcs()
3085 *rate_n_flags = lq_sta->dbg_fixed_rate; in rs_dbgfs_set_mcs()
3088 lq_sta->dbg_fixed_rate = 0; in rs_dbgfs_set_mcs()
3102 struct iwl_lq_sta *lq_sta = file->private_data; in rs_sta_dbgfs_scale_table_write() local
3109 priv = lq_sta->drv; in rs_sta_dbgfs_scale_table_write()
3116 lq_sta->dbg_fixed_rate = parsed_rate; in rs_sta_dbgfs_scale_table_write()
3118 lq_sta->dbg_fixed_rate = 0; in rs_sta_dbgfs_scale_table_write()
3120 rs_program_fix_rate(priv, lq_sta); in rs_sta_dbgfs_scale_table_write()
3134 struct iwl_lq_sta *lq_sta = file->private_data; in rs_sta_dbgfs_scale_table_read() local
3136 struct iwl_scale_tbl_info *tbl = &(lq_sta->lq_info[lq_sta->active_tbl]); in rs_sta_dbgfs_scale_table_read()
3138 priv = lq_sta->drv; in rs_sta_dbgfs_scale_table_read()
3143 desc += sprintf(buff+desc, "sta_id %d\n", lq_sta->lq.sta_id); in rs_sta_dbgfs_scale_table_read()
3145 lq_sta->total_failed, lq_sta->total_success, in rs_sta_dbgfs_scale_table_read()
3146 lq_sta->active_legacy_rate); in rs_sta_dbgfs_scale_table_read()
3148 lq_sta->dbg_fixed_rate); in rs_sta_dbgfs_scale_table_read()
3163 (lq_sta->is_green) ? "GF enabled" : "", in rs_sta_dbgfs_scale_table_read()
3164 (lq_sta->is_agg) ? "AGG on" : ""); in rs_sta_dbgfs_scale_table_read()
3167 lq_sta->last_rate_n_flags); in rs_sta_dbgfs_scale_table_read()
3170 lq_sta->lq.general_params.flags, in rs_sta_dbgfs_scale_table_read()
3171 lq_sta->lq.general_params.mimo_delimiter, in rs_sta_dbgfs_scale_table_read()
3172 lq_sta->lq.general_params.single_stream_ant_msk, in rs_sta_dbgfs_scale_table_read()
3173 lq_sta->lq.general_params.dual_stream_ant_msk); in rs_sta_dbgfs_scale_table_read()
3177 le16_to_cpu(lq_sta->lq.agg_params.agg_time_limit), in rs_sta_dbgfs_scale_table_read()
3178 lq_sta->lq.agg_params.agg_dis_start_th, in rs_sta_dbgfs_scale_table_read()
3179 lq_sta->lq.agg_params.agg_frame_cnt_limit); in rs_sta_dbgfs_scale_table_read()
3183 lq_sta->lq.general_params.start_rate_index[0], in rs_sta_dbgfs_scale_table_read()
3184 lq_sta->lq.general_params.start_rate_index[1], in rs_sta_dbgfs_scale_table_read()
3185 lq_sta->lq.general_params.start_rate_index[2], in rs_sta_dbgfs_scale_table_read()
3186 lq_sta->lq.general_params.start_rate_index[3]); in rs_sta_dbgfs_scale_table_read()
3190 le32_to_cpu(lq_sta->lq.rs_table[i].rate_n_flags)); in rs_sta_dbgfs_scale_table_read()
3193 i, le32_to_cpu(lq_sta->lq.rs_table[i].rate_n_flags), in rs_sta_dbgfs_scale_table_read()
3197 i, le32_to_cpu(lq_sta->lq.rs_table[i].rate_n_flags), in rs_sta_dbgfs_scale_table_read()
3221 struct iwl_lq_sta *lq_sta = file->private_data; in rs_sta_dbgfs_stats_table_read() local
3231 lq_sta->active_tbl == i ? "*" : "x", in rs_sta_dbgfs_stats_table_read()
3232 lq_sta->lq_info[i].lq_type, in rs_sta_dbgfs_stats_table_read()
3233 lq_sta->lq_info[i].is_SGI, in rs_sta_dbgfs_stats_table_read()
3234 lq_sta->lq_info[i].is_ht40, in rs_sta_dbgfs_stats_table_read()
3235 lq_sta->lq_info[i].is_dup, in rs_sta_dbgfs_stats_table_read()
3236 lq_sta->is_green, in rs_sta_dbgfs_stats_table_read()
3237 lq_sta->lq_info[i].current_rate); in rs_sta_dbgfs_stats_table_read()
3241 lq_sta->lq_info[i].win[j].counter, in rs_sta_dbgfs_stats_table_read()
3242 lq_sta->lq_info[i].win[j].success_counter, in rs_sta_dbgfs_stats_table_read()
3243 lq_sta->lq_info[i].win[j].success_ratio); in rs_sta_dbgfs_stats_table_read()
3260 struct iwl_lq_sta *lq_sta = file->private_data; in rs_sta_dbgfs_rate_scale_data_read() local
3261 struct iwl_scale_tbl_info *tbl = &lq_sta->lq_info[lq_sta->active_tbl]; in rs_sta_dbgfs_rate_scale_data_read()
3268 tbl->expected_tpt[lq_sta->last_txrate_idx]); in rs_sta_dbgfs_rate_scale_data_read()
3272 iwl_rates[lq_sta->last_txrate_idx].ieee >> 1); in rs_sta_dbgfs_rate_scale_data_read()
3286 struct iwl_lq_sta *lq_sta = priv_sta; in rs_add_debugfs() local
3287 lq_sta->rs_sta_dbgfs_scale_table_file = in rs_add_debugfs()
3289 lq_sta, &rs_sta_dbgfs_scale_table_ops); in rs_add_debugfs()
3290 lq_sta->rs_sta_dbgfs_stats_table_file = in rs_add_debugfs()
3292 lq_sta, &rs_sta_dbgfs_stats_table_ops); in rs_add_debugfs()
3293 lq_sta->rs_sta_dbgfs_rate_scale_data_file = in rs_add_debugfs()
3295 lq_sta, &rs_sta_dbgfs_rate_scale_data_ops); in rs_add_debugfs()
3296 lq_sta->rs_sta_dbgfs_tx_agg_tid_en_file = in rs_add_debugfs()
3298 &lq_sta->tx_agg_tid_en); in rs_add_debugfs()
3304 struct iwl_lq_sta *lq_sta = priv_sta; in rs_remove_debugfs() local
3305 debugfs_remove(lq_sta->rs_sta_dbgfs_scale_table_file); in rs_remove_debugfs()
3306 debugfs_remove(lq_sta->rs_sta_dbgfs_stats_table_file); in rs_remove_debugfs()
3307 debugfs_remove(lq_sta->rs_sta_dbgfs_rate_scale_data_file); in rs_remove_debugfs()
3308 debugfs_remove(lq_sta->rs_sta_dbgfs_tx_agg_tid_en_file); in rs_remove_debugfs()