Lines Matching +full:assoc +full:- +full:select
1 // SPDX-License-Identifier: GPL-2.0-only
4 * Copyright(c) 2005 - 2014, 2018 - 2023 Intel Corporation. All rights reserved.
5 * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
6 * Copyright(c) 2016 - 2017 Intel Deutschland GmbH
19 #include "fw-api.h"
21 #include "iwl-op-mode.h"
98 RS_ACTION_DOWNSCALE = -1,
131 return iwl_mvm_bt_coex_is_ant_avail(mvm, next_col->ant); in rs_ant_allow()
138 if (!sta->deflink.ht_cap.ht_supported) in rs_mimo_allow()
141 if (sta->deflink.smps_mode == IEEE80211_SMPS_STATIC) in rs_mimo_allow()
150 if (mvm->nvm_data->sku_cap_mimo_disabled) in rs_mimo_allow()
160 if (!sta->deflink.ht_cap.ht_supported) in rs_siso_allow()
170 struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap; in rs_sgi_allow()
171 struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap; in rs_sgi_allow()
173 if (is_ht20(rate) && (ht_cap->cap & in rs_sgi_allow()
176 if (is_ht40(rate) && (ht_cap->cap & in rs_sgi_allow()
179 if (is_ht80(rate) && (vht_cap->cap & in rs_sgi_allow()
182 if (is_ht160(rate) && (vht_cap->cap & in rs_sgi_allow()
399 * 0 - NGI, 1 - SGI, 2 - AGG+NGI, 3 - AGG+SGI
508 if (is_type_legacy(rate->type) && (rate->index <= IWL_RATE_54M_INDEX)) in rs_pretty_rate()
509 rate_str = legacy_rates[rate->index]; in rs_pretty_rate()
510 else if ((is_type_ht(rate->type) || is_type_vht(rate->type)) && in rs_pretty_rate()
511 (rate->index >= IWL_RATE_MCS_0_INDEX) && in rs_pretty_rate()
512 (rate->index <= IWL_RATE_MCS_9_INDEX)) in rs_pretty_rate()
513 rate_str = ht_vht_rates[rate->index]; in rs_pretty_rate()
517 sprintf(buf, "(%s|%s|%s)", rs_pretty_lq_type(rate->type), in rs_pretty_rate()
518 iwl_rs_pretty_ant(rate->ant), rate_str ?: "BAD_RATE"); in rs_pretty_rate()
527 prefix, rs_pretty_rate(rate), rate->bw, in rs_dump_rate()
528 rate->sgi, rate->ldpc, rate->stbc); in rs_dump_rate()
533 window->data = 0; in rs_rate_scale_clear_window()
534 window->success_counter = 0; in rs_rate_scale_clear_window()
535 window->success_ratio = IWL_INVALID_VALUE; in rs_rate_scale_clear_window()
536 window->counter = 0; in rs_rate_scale_clear_window()
537 window->average_tpt = IWL_INVALID_VALUE; in rs_rate_scale_clear_window()
547 rs_rate_scale_clear_window(&tbl->win[i]); in rs_rate_scale_clear_tbl_windows()
549 for (i = 0; i < ARRAY_SIZE(tbl->tpc_win); i++) in rs_rate_scale_clear_tbl_windows()
550 rs_rate_scale_clear_window(&tbl->tpc_win[i]); in rs_rate_scale_clear_tbl_windows()
565 sta->addr, tid); in rs_tl_turn_on_agg_for_tid()
569 if (ret == -EAGAIN) { in rs_tl_turn_on_agg_for_tid()
600 tid_data = &mvmsta->tid_data[tid]; in rs_tl_turn_on_agg()
601 if (mvmsta->sta_state >= IEEE80211_STA_AUTHORIZED && in rs_tl_turn_on_agg()
602 tid_data->state == IWL_AGG_OFF && in rs_tl_turn_on_agg()
603 (lq_sta->tx_agg_tid_en & BIT(tid)) && in rs_tl_turn_on_agg()
604 tid_data->tx_count_last >= IWL_MVM_RS_AGG_START_THRESHOLD) { in rs_tl_turn_on_agg()
607 tid_data->state = IWL_AGG_QUEUED; in rs_tl_turn_on_agg()
623 if (tbl->expected_tpt) in get_expected_tpt()
624 return tbl->expected_tpt[rs_index]; in get_expected_tpt()
629 * rs_collect_tx_data - Update the success/failure sliding window
632 * at this rate. window->data contains the bitmask of successful
640 static const u64 mask = (((u64)1) << (IWL_RATE_MAX_WINDOW - 1)); in _rs_collect_tx_data()
655 if (window->counter >= IWL_RATE_MAX_WINDOW) { in _rs_collect_tx_data()
657 window->counter = IWL_RATE_MAX_WINDOW - 1; in _rs_collect_tx_data()
659 if (window->data & mask) { in _rs_collect_tx_data()
660 window->data &= ~mask; in _rs_collect_tx_data()
661 window->success_counter--; in _rs_collect_tx_data()
665 /* Increment frames-attempted counter */ in _rs_collect_tx_data()
666 window->counter++; in _rs_collect_tx_data()
669 window->data <<= 1; in _rs_collect_tx_data()
673 window->success_counter++; in _rs_collect_tx_data()
674 window->data |= 0x1; in _rs_collect_tx_data()
675 successes--; in _rs_collect_tx_data()
678 attempts--; in _rs_collect_tx_data()
681 /* Calculate current success ratio, avoid divide-by-0! */ in _rs_collect_tx_data()
682 if (window->counter > 0) in _rs_collect_tx_data()
683 window->success_ratio = 128 * (100 * window->success_counter) in _rs_collect_tx_data()
684 / window->counter; in _rs_collect_tx_data()
686 window->success_ratio = IWL_INVALID_VALUE; in _rs_collect_tx_data()
688 fail_count = window->counter - window->success_counter; in _rs_collect_tx_data()
692 (window->success_counter >= IWL_MVM_RS_RATE_MIN_SUCCESS_TH)) in _rs_collect_tx_data()
693 window->average_tpt = (window->success_ratio * tpt + 64) / 128; in _rs_collect_tx_data()
695 window->average_tpt = IWL_INVALID_VALUE; in _rs_collect_tx_data()
709 return -EINVAL; in rs_collect_tpc_data()
711 window = &tbl->tpc_win[reduced_txp]; in rs_collect_tpc_data()
725 tid_data = &mvmsta->tid_data[tid]; in rs_update_tid_tpt_stats()
730 * BA session, so it should be updated only when A-MPDU is in rs_update_tid_tpt_stats()
733 if (tid_data->state != IWL_AGG_OFF) in rs_update_tid_tpt_stats()
736 if (time_is_before_jiffies(tid_data->tpt_meas_start + HZ) || in rs_update_tid_tpt_stats()
737 (tid_data->tx_count >= IWL_MVM_RS_AGG_START_THRESHOLD)) { in rs_update_tid_tpt_stats()
738 tid_data->tx_count_last = tid_data->tx_count; in rs_update_tid_tpt_stats()
739 tid_data->tx_count = 0; in rs_update_tid_tpt_stats()
740 tid_data->tpt_meas_start = jiffies; in rs_update_tid_tpt_stats()
742 tid_data->tx_count += successes; in rs_update_tid_tpt_stats()
754 return -EINVAL; in rs_collect_tlc_data()
756 if (tbl->column != RS_COLUMN_INVALID) { in rs_collect_tlc_data()
757 struct lq_sta_pers *pers = &mvmsta->deflink.lq_sta.rs_drv.pers; in rs_collect_tlc_data()
759 pers->tx_stats[tbl->column][scale_index].total += attempts; in rs_collect_tlc_data()
760 pers->tx_stats[tbl->column][scale_index].success += successes; in rs_collect_tlc_data()
765 /* Select window for current tx bit rate */ in rs_collect_tlc_data()
766 window = &(tbl->win[scale_index]); in rs_collect_tlc_data()
776 int index = rate->index; in ucode_rate_from_rs_rate()
778 ucode_rate |= ((rate->ant << RATE_MCS_ANT_POS) & in ucode_rate_from_rs_rate()
821 IWL_ERR(mvm, "Invalid rate->type %d\n", rate->type); in ucode_rate_from_rs_rate()
824 if (is_siso(rate) && rate->stbc) { in ucode_rate_from_rs_rate()
830 ucode_rate |= rate->bw; in ucode_rate_from_rs_rate()
831 if (rate->sgi) in ucode_rate_from_rs_rate()
833 if (rate->ldpc) in ucode_rate_from_rs_rate()
849 rate->index = iwl_hwrate_to_plcp_idx(ucode_rate); in rs_rate_from_ucode_rate()
851 if (rate->index == IWL_RATE_INVALID) in rs_rate_from_ucode_rate()
852 return -EINVAL; in rs_rate_from_ucode_rate()
854 rate->ant = (ant_msk >> RATE_MCS_ANT_POS); in rs_rate_from_ucode_rate()
862 rate->type = LQ_LEGACY_A; in rs_rate_from_ucode_rate()
864 rate->type = LQ_LEGACY_G; in rs_rate_from_ucode_rate()
872 rate->sgi = true; in rs_rate_from_ucode_rate()
874 rate->ldpc = true; in rs_rate_from_ucode_rate()
876 rate->stbc = true; in rs_rate_from_ucode_rate()
878 rate->bfer = true; in rs_rate_from_ucode_rate()
880 rate->bw = ucode_rate & RATE_MCS_CHAN_WIDTH_MSK_V1; in rs_rate_from_ucode_rate()
887 rate->type = LQ_HT_SISO; in rs_rate_from_ucode_rate()
888 WARN_ONCE(!rate->stbc && !rate->bfer && num_of_ant != 1, in rs_rate_from_ucode_rate()
890 rate->stbc, rate->bfer); in rs_rate_from_ucode_rate()
892 rate->type = LQ_HT_MIMO2; in rs_rate_from_ucode_rate()
901 rate->type = LQ_VHT_SISO; in rs_rate_from_ucode_rate()
902 WARN_ONCE(!rate->stbc && !rate->bfer && num_of_ant != 1, in rs_rate_from_ucode_rate()
904 rate->stbc, rate->bfer); in rs_rate_from_ucode_rate()
906 rate->type = LQ_VHT_MIMO2; in rs_rate_from_ucode_rate()
915 rate->type = LQ_HE_SISO; in rs_rate_from_ucode_rate()
916 WARN_ONCE(!rate->stbc && !rate->bfer && num_of_ant != 1, in rs_rate_from_ucode_rate()
917 "stbc %d bfer %d", rate->stbc, rate->bfer); in rs_rate_from_ucode_rate()
919 rate->type = LQ_HE_MIMO2; in rs_rate_from_ucode_rate()
926 WARN_ON_ONCE(rate->bw == RATE_MCS_CHAN_WIDTH_80 && in rs_rate_from_ucode_rate()
938 if (!rs_is_valid_ant(valid_ant, rate->ant)) in rs_toggle_antenna()
941 new_ant_type = ant_toggle_lookup[rate->ant]; in rs_toggle_antenna()
943 while ((new_ant_type != rate->ant) && in rs_toggle_antenna()
947 if (new_ant_type == rate->ant) in rs_toggle_antenna()
950 rate->ant = new_ant_type; in rs_toggle_antenna()
959 return lq_sta->active_legacy_rate; in rs_get_supported_rates()
961 return lq_sta->active_siso_rate; in rs_get_supported_rates()
963 return lq_sta->active_mimo2_rate; in rs_get_supported_rates()
982 i = index - 1; in rs_get_adjacent_rate()
985 for (; i >= 0; i--, mask >>= 1) { in rs_get_adjacent_rate()
1028 return BIT(rate->index) & rs_get_supported_rates(lq_sta, rate); in rs_rate_supported()
1040 struct iwl_mvm *mvm = lq_sta->pers.drv; in rs_get_lower_rate_in_column()
1043 high_low = rs_get_adjacent_rate(mvm, rate->index, rate_mask, in rs_get_lower_rate_in_column()
1044 rate->type); in rs_get_lower_rate_in_column()
1051 rate->index = low; in rs_get_lower_rate_in_column()
1059 struct iwl_mvm *mvm = lq_sta->pers.drv; in rs_get_lower_rate_down_column()
1066 if (lq_sta->band == NL80211_BAND_5GHZ) in rs_get_lower_rate_down_column()
1067 rate->type = LQ_LEGACY_A; in rs_get_lower_rate_down_column()
1069 rate->type = LQ_LEGACY_G; in rs_get_lower_rate_down_column()
1071 rate->bw = RATE_MCS_CHAN_WIDTH_20; in rs_get_lower_rate_down_column()
1073 if (WARN_ON_ONCE(rate->index < IWL_RATE_MCS_0_INDEX)) in rs_get_lower_rate_down_column()
1074 rate->index = rs_ht_to_legacy[IWL_RATE_MCS_0_INDEX]; in rs_get_lower_rate_down_column()
1075 else if (WARN_ON_ONCE(rate->index > IWL_RATE_MCS_9_INDEX)) in rs_get_lower_rate_down_column()
1076 rate->index = rs_ht_to_legacy[IWL_RATE_MCS_9_INDEX]; in rs_get_lower_rate_down_column()
1078 rate->index = rs_ht_to_legacy[rate->index]; in rs_get_lower_rate_down_column()
1080 rate->ldpc = false; in rs_get_lower_rate_down_column()
1083 rate->type = is_vht_mimo2(rate) ? in rs_get_lower_rate_down_column()
1087 if (num_of_ant(rate->ant) > 1) in rs_get_lower_rate_down_column()
1088 rate->ant = first_antenna(iwl_mvm_get_valid_tx_ant(mvm)); in rs_get_lower_rate_down_column()
1091 rate->sgi = false; in rs_get_lower_rate_down_column()
1103 if (a->stbc || a->bfer) in rs_rate_column_match()
1104 ant_match = (b->ant == ANT_A || b->ant == ANT_B); in rs_rate_column_match()
1106 ant_match = (a->ant == b->ant); in rs_rate_column_match()
1108 return (a->type == b->type) && (a->bw == b->bw) && (a->sgi == b->sgi) in rs_rate_column_match()
1115 if (rate->ant == ANT_A) in rs_get_column_from_rate()
1118 if (rate->ant == ANT_B) in rs_get_column_from_rate()
1125 if (rate->ant == ANT_A || rate->stbc || rate->bfer) in rs_get_column_from_rate()
1126 return rate->sgi ? RS_COLUMN_SISO_ANT_A_SGI : in rs_get_column_from_rate()
1129 if (rate->ant == ANT_B) in rs_get_column_from_rate()
1130 return rate->sgi ? RS_COLUMN_SISO_ANT_B_SGI : in rs_get_column_from_rate()
1137 return rate->sgi ? RS_COLUMN_MIMO2_SGI : RS_COLUMN_MIMO2; in rs_get_column_from_rate()
1147 if (ieee80211_is_data_qos(hdr->frame_control)) { in rs_get_tid()
1166 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in rs_drv_mac80211_tx_status()
1172 if (!mvmsta->vif) in rs_drv_mac80211_tx_status()
1175 if (!ieee80211_is_data(hdr->frame_control) || in rs_drv_mac80211_tx_status()
1176 info->flags & IEEE80211_TX_CTL_NO_ACK) in rs_drv_mac80211_tx_status()
1180 ieee80211_is_qos_nullfunc(hdr->frame_control)); in rs_drv_mac80211_tx_status()
1186 * Set frame tx success limits according to legacy vs. high-throughput,
1195 lq_sta->rs_state = RS_STATE_STAY_IN_COLUMN; in rs_set_stay_in_table()
1197 lq_sta->table_count_limit = IWL_MVM_RS_LEGACY_TABLE_COUNT; in rs_set_stay_in_table()
1198 lq_sta->max_failure_limit = IWL_MVM_RS_LEGACY_FAILURE_LIMIT; in rs_set_stay_in_table()
1199 lq_sta->max_success_limit = IWL_MVM_RS_LEGACY_SUCCESS_LIMIT; in rs_set_stay_in_table()
1201 lq_sta->table_count_limit = IWL_MVM_RS_NON_LEGACY_TABLE_COUNT; in rs_set_stay_in_table()
1202 lq_sta->max_failure_limit = IWL_MVM_RS_NON_LEGACY_FAILURE_LIMIT; in rs_set_stay_in_table()
1203 lq_sta->max_success_limit = IWL_MVM_RS_NON_LEGACY_SUCCESS_LIMIT; in rs_set_stay_in_table()
1205 lq_sta->table_count = 0; in rs_set_stay_in_table()
1206 lq_sta->total_failed = 0; in rs_set_stay_in_table()
1207 lq_sta->total_success = 0; in rs_set_stay_in_table()
1208 lq_sta->flush_timer = jiffies; in rs_set_stay_in_table()
1209 lq_sta->visited_columns = 0; in rs_set_stay_in_table()
1222 switch (column->mode) { in rs_get_max_allowed_rate()
1224 return lq_sta->max_legacy_rate_idx; in rs_get_max_allowed_rate()
1226 return lq_sta->max_siso_rate_idx; in rs_get_max_allowed_rate()
1228 return lq_sta->max_mimo2_rate_idx; in rs_get_max_allowed_rate()
1233 return lq_sta->max_legacy_rate_idx; in rs_get_max_allowed_rate()
1243 if (WARN_ON_ONCE(column->mode != RS_LEGACY && in rs_get_expected_tpt_table()
1244 column->mode != RS_SISO && in rs_get_expected_tpt_table()
1245 column->mode != RS_MIMO2)) in rs_get_expected_tpt_table()
1249 if (column->mode == RS_LEGACY) in rs_get_expected_tpt_table()
1256 if (column->mode == RS_SISO) { in rs_get_expected_tpt_table()
1273 } else if (column->mode == RS_MIMO2) { in rs_get_expected_tpt_table()
1294 if (!column->sgi && !lq_sta->is_agg) /* Normal */ in rs_get_expected_tpt_table()
1296 else if (column->sgi && !lq_sta->is_agg) /* SGI */ in rs_get_expected_tpt_table()
1298 else if (!column->sgi && lq_sta->is_agg) /* AGG */ in rs_get_expected_tpt_table()
1307 struct rs_rate *rate = &tbl->rate; in rs_set_expected_tpt_table()
1308 const struct rs_tx_column *column = &rs_tx_columns[tbl->column]; in rs_set_expected_tpt_table()
1310 tbl->expected_tpt = rs_get_expected_tpt_table(lq_sta, column, rate->bw); in rs_set_expected_tpt_table()
1331 &(lq_sta->lq_info[lq_sta->active_tbl]); in rs_get_best_rate()
1332 s32 success_ratio = active_tbl->win[index].success_ratio; in rs_get_best_rate()
1333 u16 expected_current_tpt = active_tbl->expected_tpt[index]; in rs_get_best_rate()
1334 const u16 *tpt_tbl = tbl->expected_tpt; in rs_get_best_rate()
1345 target_tpt = lq_sta->last_tpt; in rs_get_best_rate()
1358 tbl->rate.type); in rs_get_best_rate()
1373 struct ieee80211_sta_vht_cap *sta_vht_cap = &sta->deflink.vht_cap; in rs_bw_from_sta_bw()
1375 .vht_cap_info = cpu_to_le32(sta_vht_cap->cap), in rs_bw_from_sta_bw()
1376 .supp_mcs = sta_vht_cap->vht_mcs, in rs_bw_from_sta_bw()
1379 switch (sta->deflink.bandwidth) { in rs_bw_from_sta_bw()
1385 * We only check MCS 0 - they will support that if in rs_bw_from_sta_bw()
1392 sta->deflink.rx_nss) < sta->deflink.rx_nss) in rs_bw_from_sta_bw()
1419 mvm = lq_sta->pers.drv; in rs_stay_in_table()
1420 active_tbl = lq_sta->active_tbl; in rs_stay_in_table()
1422 tbl = &(lq_sta->lq_info[active_tbl]); in rs_stay_in_table()
1425 if (lq_sta->rs_state == RS_STATE_STAY_IN_COLUMN) { in rs_stay_in_table()
1427 if (lq_sta->flush_timer) in rs_stay_in_table()
1430 (unsigned long)(lq_sta->flush_timer + in rs_stay_in_table()
1442 (lq_sta->total_failed > lq_sta->max_failure_limit) || in rs_stay_in_table()
1443 (lq_sta->total_success > lq_sta->max_success_limit) || in rs_stay_in_table()
1444 ((!lq_sta->search_better_tbl) && in rs_stay_in_table()
1445 (lq_sta->flush_timer) && (flush_interval_passed))) { in rs_stay_in_table()
1448 lq_sta->total_failed, in rs_stay_in_table()
1449 lq_sta->total_success, in rs_stay_in_table()
1453 lq_sta->rs_state = RS_STATE_SEARCH_CYCLE_STARTED; in rs_stay_in_table()
1456 lq_sta->total_failed = 0; in rs_stay_in_table()
1457 lq_sta->total_success = 0; in rs_stay_in_table()
1458 lq_sta->flush_timer = 0; in rs_stay_in_table()
1460 lq_sta->visited_columns = BIT(tbl->column); in rs_stay_in_table()
1464 * history bitmaps and rate-specific stats for all rates in in rs_stay_in_table()
1468 lq_sta->table_count++; in rs_stay_in_table()
1469 if (lq_sta->table_count >= in rs_stay_in_table()
1470 lq_sta->table_count_limit) { in rs_stay_in_table()
1471 lq_sta->table_count = 0; in rs_stay_in_table()
1482 if (lq_sta->rs_state == RS_STATE_SEARCH_CYCLE_STARTED) { in rs_stay_in_table()
1493 struct ieee80211_bss_conf *bss_conf = &mvmsta->vif->bss_conf; in rs_set_amsdu_len()
1496 sta->deflink.agg.max_amsdu_len = in rs_set_amsdu_len()
1497 rs_fw_get_max_amsdu_len(sta, bss_conf, &sta->deflink); in rs_set_amsdu_len()
1501 * or 0, since there is no per-TID alg. in rs_set_amsdu_len()
1503 if ((!is_vht(&tbl->rate) && !is_ht(&tbl->rate)) || in rs_set_amsdu_len()
1504 tbl->rate.index < IWL_RATE_MCS_5_INDEX || in rs_set_amsdu_len()
1506 mvmsta->amsdu_enabled = 0; in rs_set_amsdu_len()
1508 mvmsta->amsdu_enabled = 0xFFFF; in rs_set_amsdu_len()
1510 if (bss_conf->he_support && in rs_set_amsdu_len()
1512 mvmsta->max_amsdu_len = sta->deflink.agg.max_amsdu_len; in rs_set_amsdu_len()
1514 mvmsta->max_amsdu_len = in rs_set_amsdu_len()
1515 min_t(int, sta->deflink.agg.max_amsdu_len, 8500); in rs_set_amsdu_len()
1517 sta->deflink.agg.max_rc_amsdu_len = mvmsta->max_amsdu_len; in rs_set_amsdu_len()
1520 if (mvmsta->amsdu_enabled) in rs_set_amsdu_len()
1521 sta->deflink.agg.max_tid_amsdu_len[i] = in rs_set_amsdu_len()
1528 sta->deflink.agg.max_tid_amsdu_len[i] = 1; in rs_set_amsdu_len()
1540 rs_fill_lq_cmd(mvm, sta, lq_sta, &tbl->rate); in rs_update_rate_tbl()
1541 iwl_mvm_send_lq_cmd(mvm, &lq_sta->lq); in rs_update_rate_tbl()
1553 if (!is_vht_siso(&tbl->rate)) in rs_tweak_rate_tbl()
1556 if ((tbl->rate.bw == RATE_MCS_CHAN_WIDTH_80) && in rs_tweak_rate_tbl()
1557 (tbl->rate.index == IWL_RATE_MCS_0_INDEX) && in rs_tweak_rate_tbl()
1559 tbl->rate.bw = RATE_MCS_CHAN_WIDTH_20; in rs_tweak_rate_tbl()
1560 tbl->rate.index = IWL_RATE_MCS_4_INDEX; in rs_tweak_rate_tbl()
1561 IWL_DEBUG_RATE(mvm, "Switch 80Mhz SISO MCS0 -> 20Mhz MCS4\n"); in rs_tweak_rate_tbl()
1570 if ((tbl->rate.bw == RATE_MCS_CHAN_WIDTH_20) && in rs_tweak_rate_tbl()
1571 (((tbl->rate.index == IWL_RATE_MCS_5_INDEX) && in rs_tweak_rate_tbl()
1573 ((tbl->rate.index > IWL_RATE_MCS_5_INDEX) && in rs_tweak_rate_tbl()
1575 tbl->rate.bw = RATE_MCS_CHAN_WIDTH_80; in rs_tweak_rate_tbl()
1576 tbl->rate.index = IWL_RATE_MCS_1_INDEX; in rs_tweak_rate_tbl()
1577 IWL_DEBUG_RATE(mvm, "Switch 20Mhz SISO MCS5 -> 80Mhz MCS1\n"); in rs_tweak_rate_tbl()
1596 const struct rs_tx_column *curr_col = &rs_tx_columns[tbl->column]; in rs_get_next_column()
1604 next_col_id = curr_col->next_columns[i]; in rs_get_next_column()
1609 if (lq_sta->visited_columns & BIT(next_col_id)) { in rs_get_next_column()
1617 if (!rs_is_valid_ant(valid_ants, next_col->ant)) { in rs_get_next_column()
1620 next_col_id, valid_ants, next_col->ant); in rs_get_next_column()
1625 allow_func = next_col->checks[j]; in rs_get_next_column()
1626 if (allow_func && !allow_func(mvm, sta, &tbl->rate, in rs_get_next_column()
1639 tpt = lq_sta->last_tpt / 100; in rs_get_next_column()
1678 struct iwl_scale_tbl_info *tbl = &lq_sta->lq_info[lq_sta->active_tbl]; in rs_switch_to_column()
1680 &lq_sta->lq_info[rs_search_tbl(lq_sta->active_tbl)]; in rs_switch_to_column()
1681 struct rs_rate *rate = &search_tbl->rate; in rs_switch_to_column()
1683 const struct rs_tx_column *curr_column = &rs_tx_columns[tbl->column]; in rs_switch_to_column()
1689 rate->sgi = column->sgi; in rs_switch_to_column()
1690 rate->ant = column->ant; in rs_switch_to_column()
1692 if (column->mode == RS_LEGACY) { in rs_switch_to_column()
1693 if (lq_sta->band == NL80211_BAND_5GHZ) in rs_switch_to_column()
1694 rate->type = LQ_LEGACY_A; in rs_switch_to_column()
1696 rate->type = LQ_LEGACY_G; in rs_switch_to_column()
1698 rate->bw = RATE_MCS_CHAN_WIDTH_20; in rs_switch_to_column()
1699 rate->ldpc = false; in rs_switch_to_column()
1700 rate_mask = lq_sta->active_legacy_rate; in rs_switch_to_column()
1701 } else if (column->mode == RS_SISO) { in rs_switch_to_column()
1702 rate->type = lq_sta->is_vht ? LQ_VHT_SISO : LQ_HT_SISO; in rs_switch_to_column()
1703 rate_mask = lq_sta->active_siso_rate; in rs_switch_to_column()
1704 } else if (column->mode == RS_MIMO2) { in rs_switch_to_column()
1705 rate->type = lq_sta->is_vht ? LQ_VHT_MIMO2 : LQ_HT_MIMO2; in rs_switch_to_column()
1706 rate_mask = lq_sta->active_mimo2_rate; in rs_switch_to_column()
1711 if (column->mode != RS_LEGACY) { in rs_switch_to_column()
1712 rate->bw = rs_bw_from_sta_bw(sta); in rs_switch_to_column()
1713 rate->ldpc = lq_sta->ldpc; in rs_switch_to_column()
1716 search_tbl->column = col_id; in rs_switch_to_column()
1719 lq_sta->visited_columns |= BIT(col_id); in rs_switch_to_column()
1722 * SISO->MIMO, LEGACY->SISO, MIMO->SISO in rs_switch_to_column()
1724 if (curr_column->mode != column->mode) { in rs_switch_to_column()
1726 rate_mask, rate->index); in rs_switch_to_column()
1738 rate->index = rate_idx; in rs_switch_to_column()
1742 col_id, rate->index); in rs_switch_to_column()
1747 rate->type = LQ_NONE; in rs_switch_to_column()
1748 return -1; in rs_switch_to_column()
1823 } else if (current_tpt > (100 * tbl->expected_tpt[low])) { in rs_get_rate_action()
1841 if (!lq_sta->stbc_capable) in rs_stbc_allow()
1857 *stronger = index - IWL_MVM_RS_TPC_TX_POWER_STEP; in rs_get_adjacent_txp()
1865 int index = rate->index; in rs_tpc_allowed()
1867 bool sta_ps_disabled = (vif->type == NL80211_IFTYPE_STATION && in rs_tpc_allowed()
1868 !vif->cfg.ps); in rs_tpc_allowed()
1880 IWL_DEBUG_RATE(mvm, "check rate, table type: %d\n", rate->type); in rs_tpc_allowed()
1955 IWL_DEBUG_RATE(mvm, "no need to increase or decrease txp - stay\n"); in rs_get_tpc_action()
1965 struct ieee80211_vif *vif = mvm_sta->vif; in rs_tpc_perform()
1969 struct rs_rate *rate = &tbl->rate; in rs_tpc_perform()
1972 u8 cur = lq_sta->lq.reduced_tpc; in rs_tpc_perform()
1978 if (lq_sta->pers.dbg_fixed_txp_reduction <= TPC_MAX_REDUCTION) { in rs_tpc_perform()
1980 lq_sta->pers.dbg_fixed_txp_reduction); in rs_tpc_perform()
1981 lq_sta->lq.reduced_tpc = lq_sta->pers.dbg_fixed_txp_reduction; in rs_tpc_perform()
1982 return cur != lq_sta->pers.dbg_fixed_txp_reduction; in rs_tpc_perform()
1987 chanctx_conf = rcu_dereference(vif->bss_conf.chanctx_conf); in rs_tpc_perform()
1991 band = chanctx_conf->def.chan->band; in rs_tpc_perform()
1997 lq_sta->lq.reduced_tpc = TPC_NO_REDUCTION; in rs_tpc_perform()
2004 window = tbl->tpc_win; in rs_tpc_perform()
2033 lq_sta->lq.reduced_tpc = weak; in rs_tpc_perform()
2036 lq_sta->lq.reduced_tpc = strong; in rs_tpc_perform()
2039 lq_sta->lq.reduced_tpc = TPC_NO_REDUCTION; in rs_tpc_perform()
2072 u8 prev_agg = lq_sta->is_agg; in rs_rate_scale_perform()
2076 lq_sta->is_agg = !!mvmsta->agg_tids; in rs_rate_scale_perform()
2079 * Select rate-scale / modulation-mode table to work with in in rs_rate_scale_perform()
2083 if (!lq_sta->search_better_tbl) in rs_rate_scale_perform()
2084 active_tbl = lq_sta->active_tbl; in rs_rate_scale_perform()
2086 active_tbl = rs_search_tbl(lq_sta->active_tbl); in rs_rate_scale_perform()
2088 tbl = &(lq_sta->lq_info[active_tbl]); in rs_rate_scale_perform()
2089 rate = &tbl->rate; in rs_rate_scale_perform()
2091 if (prev_agg != lq_sta->is_agg) { in rs_rate_scale_perform()
2094 prev_agg, lq_sta->is_agg); in rs_rate_scale_perform()
2100 index = rate->index; in rs_rate_scale_perform()
2107 if (lq_sta->search_better_tbl) { in rs_rate_scale_perform()
2109 rate->type = LQ_NONE; in rs_rate_scale_perform()
2110 lq_sta->search_better_tbl = 0; in rs_rate_scale_perform()
2111 tbl = &(lq_sta->lq_info[lq_sta->active_tbl]); in rs_rate_scale_perform()
2118 if (!tbl->expected_tpt) { in rs_rate_scale_perform()
2119 IWL_ERR(mvm, "tbl->expected_tpt is NULL\n"); in rs_rate_scale_perform()
2124 window = &(tbl->win[index]); in rs_rate_scale_perform()
2133 fail_count = window->counter - window->success_counter; in rs_rate_scale_perform()
2135 (window->success_counter < IWL_MVM_RS_RATE_MIN_SUCCESS_TH)) { in rs_rate_scale_perform()
2139 window->success_counter, window->counter); in rs_rate_scale_perform()
2142 window->average_tpt = IWL_INVALID_VALUE; in rs_rate_scale_perform()
2152 if (lq_sta->search_better_tbl) { in rs_rate_scale_perform()
2156 if (window->average_tpt > lq_sta->last_tpt) { in rs_rate_scale_perform()
2159 "cur-tpt %d old-tpt %d\n", in rs_rate_scale_perform()
2160 window->success_ratio, in rs_rate_scale_perform()
2161 window->average_tpt, in rs_rate_scale_perform()
2162 lq_sta->last_tpt); in rs_rate_scale_perform()
2165 lq_sta->active_tbl = active_tbl; in rs_rate_scale_perform()
2166 current_tpt = window->average_tpt; in rs_rate_scale_perform()
2171 "cur-tpt %d old-tpt %d\n", in rs_rate_scale_perform()
2172 window->success_ratio, in rs_rate_scale_perform()
2173 window->average_tpt, in rs_rate_scale_perform()
2174 lq_sta->last_tpt); in rs_rate_scale_perform()
2177 rate->type = LQ_NONE; in rs_rate_scale_perform()
2180 active_tbl = lq_sta->active_tbl; in rs_rate_scale_perform()
2181 tbl = &(lq_sta->lq_info[active_tbl]); in rs_rate_scale_perform()
2184 index = tbl->rate.index; in rs_rate_scale_perform()
2185 current_tpt = lq_sta->last_tpt; in rs_rate_scale_perform()
2193 lq_sta->search_better_tbl = 0; in rs_rate_scale_perform()
2200 high_low = rs_get_adjacent_rate(mvm, index, rate_mask, rate->type); in rs_rate_scale_perform()
2206 sr = window->success_ratio; in rs_rate_scale_perform()
2209 current_tpt = window->average_tpt; in rs_rate_scale_perform()
2211 low_tpt = tbl->win[low].average_tpt; in rs_rate_scale_perform()
2213 high_tpt = tbl->win[high].average_tpt; in rs_rate_scale_perform()
2257 if (lq_sta->rs_state == RS_STATE_STAY_IN_COLUMN) in rs_rate_scale_perform()
2267 tbl->rate.index = index; in rs_rate_scale_perform()
2283 lq_sta->rs_state == RS_STATE_SEARCH_CYCLE_STARTED in rs_rate_scale_perform()
2284 && window->counter) { in rs_rate_scale_perform()
2288 lq_sta->last_tpt = current_tpt; in rs_rate_scale_perform()
2291 "Start Search: update_lq %d done_search %d rs_state %d win->counter %d\n", in rs_rate_scale_perform()
2292 update_lq, done_search, lq_sta->rs_state, in rs_rate_scale_perform()
2293 window->counter); in rs_rate_scale_perform()
2300 lq_sta->search_better_tbl = 1; in rs_rate_scale_perform()
2304 lq_sta->rs_state = RS_STATE_SEARCH_CYCLE_ENDED; in rs_rate_scale_perform()
2308 if (lq_sta->search_better_tbl) { in rs_rate_scale_perform()
2310 tbl = &lq_sta->lq_info[rs_search_tbl(lq_sta->active_tbl)]; in rs_rate_scale_perform()
2314 index = tbl->rate.index; in rs_rate_scale_perform()
2316 rs_dump_rate(mvm, &tbl->rate, in rs_rate_scale_perform()
2327 if (done_search && lq_sta->rs_state == RS_STATE_SEARCH_CYCLE_ENDED) { in rs_rate_scale_perform()
2328 tbl1 = &(lq_sta->lq_info[lq_sta->active_tbl]); in rs_rate_scale_perform()
2329 rs_set_stay_in_table(mvm, is_legacy(&tbl1->rate), lq_sta); in rs_rate_scale_perform()
2339 { -60, IWL_RATE_54M_INDEX },
2340 { -64, IWL_RATE_48M_INDEX },
2341 { -68, IWL_RATE_36M_INDEX },
2342 { -80, IWL_RATE_24M_INDEX },
2343 { -84, IWL_RATE_18M_INDEX },
2344 { -85, IWL_RATE_12M_INDEX },
2345 { -86, IWL_RATE_11M_INDEX },
2346 { -88, IWL_RATE_5M_INDEX },
2347 { -90, IWL_RATE_2M_INDEX },
2352 { -60, IWL_RATE_54M_INDEX },
2353 { -64, IWL_RATE_48M_INDEX },
2354 { -72, IWL_RATE_36M_INDEX },
2355 { -80, IWL_RATE_24M_INDEX },
2356 { -84, IWL_RATE_18M_INDEX },
2357 { -85, IWL_RATE_12M_INDEX },
2358 { -87, IWL_RATE_9M_INDEX },
2363 { -60, IWL_RATE_MCS_7_INDEX },
2364 { -64, IWL_RATE_MCS_6_INDEX },
2365 { -68, IWL_RATE_MCS_5_INDEX },
2366 { -72, IWL_RATE_MCS_4_INDEX },
2367 { -80, IWL_RATE_MCS_3_INDEX },
2368 { -84, IWL_RATE_MCS_2_INDEX },
2369 { -85, IWL_RATE_MCS_1_INDEX },
2377 { -60, IWL_RATE_MCS_8_INDEX },
2378 { -64, IWL_RATE_MCS_7_INDEX },
2379 { -68, IWL_RATE_MCS_6_INDEX },
2380 { -72, IWL_RATE_MCS_5_INDEX },
2381 { -80, IWL_RATE_MCS_4_INDEX },
2382 { -84, IWL_RATE_MCS_3_INDEX },
2383 { -85, IWL_RATE_MCS_2_INDEX },
2384 { -87, IWL_RATE_MCS_1_INDEX },
2389 { -60, IWL_RATE_MCS_9_INDEX },
2390 { -64, IWL_RATE_MCS_8_INDEX },
2391 { -68, IWL_RATE_MCS_7_INDEX },
2392 { -72, IWL_RATE_MCS_6_INDEX },
2393 { -80, IWL_RATE_MCS_5_INDEX },
2394 { -84, IWL_RATE_MCS_4_INDEX },
2395 { -85, IWL_RATE_MCS_3_INDEX },
2396 { -87, IWL_RATE_MCS_2_INDEX },
2397 { -88, IWL_RATE_MCS_1_INDEX },
2401 #define IWL_RS_LOW_RSSI_THRESHOLD (-76) /* dBm */
2411 struct rs_rate *rate = &lq_sta->optimal_rate; in rs_init_optimal_rate()
2413 if (lq_sta->max_mimo2_rate_idx != IWL_RATE_INVALID) in rs_init_optimal_rate()
2414 rate->type = lq_sta->is_vht ? LQ_VHT_MIMO2 : LQ_HT_MIMO2; in rs_init_optimal_rate()
2415 else if (lq_sta->max_siso_rate_idx != IWL_RATE_INVALID) in rs_init_optimal_rate()
2416 rate->type = lq_sta->is_vht ? LQ_VHT_SISO : LQ_HT_SISO; in rs_init_optimal_rate()
2417 else if (lq_sta->band == NL80211_BAND_5GHZ) in rs_init_optimal_rate()
2418 rate->type = LQ_LEGACY_A; in rs_init_optimal_rate()
2420 rate->type = LQ_LEGACY_G; in rs_init_optimal_rate()
2422 rate->bw = rs_bw_from_sta_bw(sta); in rs_init_optimal_rate()
2423 rate->sgi = rs_sgi_allow(mvm, sta, rate, NULL); in rs_init_optimal_rate()
2428 lq_sta->optimal_rate_mask = lq_sta->active_mimo2_rate; in rs_init_optimal_rate()
2430 lq_sta->optimal_rate_mask = lq_sta->active_siso_rate; in rs_init_optimal_rate()
2432 lq_sta->optimal_rate_mask = lq_sta->active_legacy_rate; in rs_init_optimal_rate()
2434 if (lq_sta->band == NL80211_BAND_5GHZ) { in rs_init_optimal_rate()
2435 lq_sta->optimal_rates = rs_optimal_rates_5ghz_legacy; in rs_init_optimal_rate()
2436 lq_sta->optimal_nentries = in rs_init_optimal_rate()
2439 lq_sta->optimal_rates = rs_optimal_rates_24ghz_legacy; in rs_init_optimal_rate()
2440 lq_sta->optimal_nentries = in rs_init_optimal_rate()
2446 if (rate->bw == RATE_MCS_CHAN_WIDTH_20) { in rs_init_optimal_rate()
2447 lq_sta->optimal_rates = rs_optimal_rates_vht_20mhz; in rs_init_optimal_rate()
2448 lq_sta->optimal_nentries = in rs_init_optimal_rate()
2451 lq_sta->optimal_rates = rs_optimal_rates_vht; in rs_init_optimal_rate()
2452 lq_sta->optimal_nentries = in rs_init_optimal_rate()
2456 lq_sta->optimal_rates = rs_optimal_rates_ht; in rs_init_optimal_rate()
2457 lq_sta->optimal_nentries = ARRAY_SIZE(rs_optimal_rates_ht); in rs_init_optimal_rate()
2465 struct rs_rate *rate = &lq_sta->optimal_rate; in rs_get_optimal_rate()
2468 rate->index = find_first_bit(&lq_sta->optimal_rate_mask, in rs_get_optimal_rate()
2471 for (i = 0; i < lq_sta->optimal_nentries; i++) { in rs_get_optimal_rate()
2472 int rate_idx = lq_sta->optimal_rates[i].rate_idx; in rs_get_optimal_rate()
2474 if ((lq_sta->pers.last_rssi >= lq_sta->optimal_rates[i].rssi) && in rs_get_optimal_rate()
2475 (BIT(rate_idx) & lq_sta->optimal_rate_mask)) { in rs_get_optimal_rate()
2476 rate->index = rate_idx; in rs_get_optimal_rate()
2501 for (i = 0; i < ARRAY_SIZE(lq_sta->pers.chain_signal); i++) { in rs_get_initial_rate()
2502 if (!(lq_sta->pers.chains & BIT(i))) in rs_get_initial_rate()
2505 if (lq_sta->pers.chain_signal[i] > best_rssi) { in rs_get_initial_rate()
2506 best_rssi = lq_sta->pers.chain_signal[i]; in rs_get_initial_rate()
2515 rate->ant = first_antenna(valid_tx_ant); in rs_get_initial_rate()
2517 rate->ant = best_ant; in rs_get_initial_rate()
2519 rate->sgi = false; in rs_get_initial_rate()
2520 rate->ldpc = false; in rs_get_initial_rate()
2521 rate->bw = RATE_MCS_CHAN_WIDTH_20; in rs_get_initial_rate()
2523 rate->index = find_first_bit(&lq_sta->active_legacy_rate, in rs_get_initial_rate()
2527 rate->type = LQ_LEGACY_A; in rs_get_initial_rate()
2531 rate->type = LQ_LEGACY_G; in rs_get_initial_rate()
2544 if (sta->deflink.vht_cap.vht_supported && in rs_get_initial_rate()
2553 * is already up-to-date, re-init rs with the correct bw. in rs_get_initial_rate()
2555 u32 bw = mvmsta->sta_state < IEEE80211_STA_AUTHORIZED ? in rs_get_initial_rate()
2571 sta->deflink.bandwidth); in rs_get_initial_rate()
2575 active_rate = lq_sta->active_siso_rate; in rs_get_initial_rate()
2576 rate->type = LQ_VHT_SISO; in rs_get_initial_rate()
2577 rate->bw = bw; in rs_get_initial_rate()
2578 } else if (sta->deflink.ht_cap.ht_supported && in rs_get_initial_rate()
2582 active_rate = lq_sta->active_siso_rate; in rs_get_initial_rate()
2583 rate->type = LQ_HT_SISO; in rs_get_initial_rate()
2585 active_rate = lq_sta->active_legacy_rate; in rs_get_initial_rate()
2593 rate->index = rate_idx; in rs_get_initial_rate()
2607 struct iwl_lq_sta *lq_sta = &mvmsta->deflink.lq_sta.rs_drv; in rs_update_last_rssi()
2610 lq_sta->pers.chains = rx_status->chains; in rs_update_last_rssi()
2611 lq_sta->pers.chain_signal[0] = rx_status->chain_signal[0]; in rs_update_last_rssi()
2612 lq_sta->pers.chain_signal[1] = rx_status->chain_signal[1]; in rs_update_last_rssi()
2613 lq_sta->pers.last_rssi = S8_MIN; in rs_update_last_rssi()
2615 for (i = 0; i < ARRAY_SIZE(lq_sta->pers.chain_signal); i++) { in rs_update_last_rssi()
2616 if (!(lq_sta->pers.chains & BIT(i))) in rs_update_last_rssi()
2619 if (lq_sta->pers.chain_signal[i] > lq_sta->pers.last_rssi) in rs_update_last_rssi()
2620 lq_sta->pers.last_rssi = lq_sta->pers.chain_signal[i]; in rs_update_last_rssi()
2625 * rs_initialize_lq - Initialize a station's hardware rate table
2631 * if the driver's iwl-agn-rs rate scaling algorithm is used, instead of
2650 if (!lq_sta->search_better_tbl) in rs_initialize_lq()
2651 active_tbl = lq_sta->active_tbl; in rs_initialize_lq()
2653 active_tbl = rs_search_tbl(lq_sta->active_tbl); in rs_initialize_lq()
2655 tbl = &(lq_sta->lq_info[active_tbl]); in rs_initialize_lq()
2656 rate = &tbl->rate; in rs_initialize_lq()
2661 WARN_ONCE(rate->ant != ANT_A && rate->ant != ANT_B, in rs_initialize_lq()
2663 rate->ant, lq_sta->pers.chains, mvm->fw->valid_tx_ant, in rs_initialize_lq()
2664 mvm->nvm_data ? mvm->nvm_data->valid_tx_ant : ANT_INVALID); in rs_initialize_lq()
2666 tbl->column = rs_get_column_from_rate(rate); in rs_initialize_lq()
2671 iwl_mvm_send_lq_cmd(mvm, &lq_sta->lq); in rs_initialize_lq()
2680 struct sk_buff *skb = txrc->skb; in rs_drv_get_rate()
2686 if (sta && !iwl_mvm_sta_from_mac80211(sta)->vif) { in rs_drv_get_rate()
2698 spin_lock_bh(&lq_sta->pers.lock); in rs_drv_get_rate()
2699 iwl_mvm_hwrate_to_tx_rate_v1(lq_sta->last_rate_n_flags, in rs_drv_get_rate()
2700 info->band, &info->control.rates[0]); in rs_drv_get_rate()
2701 info->control.rates[0].count = 1; in rs_drv_get_rate()
2706 if (lq_sta->rs_state != RS_STATE_STAY_IN_COLUMN) { in rs_drv_get_rate()
2710 iwl_mvm_hwrate_to_tx_rate_v1(last_ucode_rate, info->band, in rs_drv_get_rate()
2711 &txrc->reported_rate); in rs_drv_get_rate()
2713 spin_unlock_bh(&lq_sta->pers.lock); in rs_drv_get_rate()
2722 struct iwl_lq_sta *lq_sta = &mvmsta->deflink.lq_sta.rs_drv; in rs_drv_alloc_sta()
2726 lq_sta->pers.drv = mvm; in rs_drv_alloc_sta()
2728 lq_sta->pers.dbg_fixed_rate = 0; in rs_drv_alloc_sta()
2729 lq_sta->pers.dbg_fixed_txp_reduction = TPC_INVALID; in rs_drv_alloc_sta()
2730 lq_sta->pers.ss_force = RS_SS_FORCE_NONE; in rs_drv_alloc_sta()
2732 lq_sta->pers.chains = 0; in rs_drv_alloc_sta()
2733 memset(lq_sta->pers.chain_signal, 0, sizeof(lq_sta->pers.chain_signal)); in rs_drv_alloc_sta()
2734 lq_sta->pers.last_rssi = S8_MIN; in rs_drv_alloc_sta()
2742 u16 rx_mcs = le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map) & in rs_vht_highest_rx_mcs_index()
2743 (0x3 << (2 * (nss - 1))); in rs_vht_highest_rx_mcs_index()
2744 rx_mcs >>= (2 * (nss - 1)); in rs_vht_highest_rx_mcs_index()
2754 return -1; in rs_vht_highest_rx_mcs_index()
2771 sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20) in rs_vht_set_enabled_rates()
2774 lq_sta->active_siso_rate |= BIT(i); in rs_vht_set_enabled_rates()
2778 if (sta->deflink.rx_nss < 2) in rs_vht_set_enabled_rates()
2789 sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20) in rs_vht_set_enabled_rates()
2792 lq_sta->active_mimo2_rate |= BIT(i); in rs_vht_set_enabled_rates()
2803 * and CCK (bits 0-3), supp_rates[] does not; in rs_ht_init()
2806 lq_sta->active_siso_rate = ht_cap->mcs.rx_mask[0] << 1; in rs_ht_init()
2807 lq_sta->active_siso_rate |= ht_cap->mcs.rx_mask[0] & 0x1; in rs_ht_init()
2808 lq_sta->active_siso_rate &= ~((u16)0x2); in rs_ht_init()
2809 lq_sta->active_siso_rate <<= IWL_FIRST_OFDM_RATE; in rs_ht_init()
2811 lq_sta->active_mimo2_rate = ht_cap->mcs.rx_mask[1] << 1; in rs_ht_init()
2812 lq_sta->active_mimo2_rate |= ht_cap->mcs.rx_mask[1] & 0x1; in rs_ht_init()
2813 lq_sta->active_mimo2_rate &= ~((u16)0x2); in rs_ht_init()
2814 lq_sta->active_mimo2_rate <<= IWL_FIRST_OFDM_RATE; in rs_ht_init()
2816 if (mvm->cfg->ht_params->ldpc && in rs_ht_init()
2817 (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)) in rs_ht_init()
2818 lq_sta->ldpc = true; in rs_ht_init()
2820 if (mvm->cfg->ht_params->stbc && in rs_ht_init()
2822 (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC)) in rs_ht_init()
2823 lq_sta->stbc_capable = true; in rs_ht_init()
2825 lq_sta->is_vht = false; in rs_ht_init()
2835 if (mvm->cfg->ht_params->ldpc && in rs_vht_init()
2836 (vht_cap->cap & IEEE80211_VHT_CAP_RXLDPC)) in rs_vht_init()
2837 lq_sta->ldpc = true; in rs_vht_init()
2839 if (mvm->cfg->ht_params->stbc && in rs_vht_init()
2841 (vht_cap->cap & IEEE80211_VHT_CAP_RXSTBC_MASK)) in rs_vht_init()
2842 lq_sta->stbc_capable = true; in rs_vht_init()
2844 if (fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_BEAMFORMER) && in rs_vht_init()
2846 (vht_cap->cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)) in rs_vht_init()
2847 lq_sta->bfer_capable = true; in rs_vht_init()
2849 lq_sta->is_vht = true; in rs_vht_init()
2855 spin_lock_bh(&mvm->drv_stats_lock); in iwl_mvm_reset_frame_stats()
2856 memset(&mvm->drv_rx_stats, 0, sizeof(mvm->drv_rx_stats)); in iwl_mvm_reset_frame_stats()
2857 spin_unlock_bh(&mvm->drv_stats_lock); in iwl_mvm_reset_frame_stats()
2864 spin_lock(&mvm->drv_stats_lock); in iwl_mvm_update_frame_stats()
2867 mvm->drv_rx_stats.agg_frames++; in iwl_mvm_update_frame_stats()
2869 mvm->drv_rx_stats.success_frames++; in iwl_mvm_update_frame_stats()
2873 mvm->drv_rx_stats.bw_20_frames++; in iwl_mvm_update_frame_stats()
2876 mvm->drv_rx_stats.bw_40_frames++; in iwl_mvm_update_frame_stats()
2879 mvm->drv_rx_stats.bw_80_frames++; in iwl_mvm_update_frame_stats()
2882 mvm->drv_rx_stats.bw_160_frames++; in iwl_mvm_update_frame_stats()
2889 mvm->drv_rx_stats.ht_frames++; in iwl_mvm_update_frame_stats()
2892 mvm->drv_rx_stats.vht_frames++; in iwl_mvm_update_frame_stats()
2895 mvm->drv_rx_stats.legacy_frames++; in iwl_mvm_update_frame_stats()
2899 mvm->drv_rx_stats.siso_frames++; in iwl_mvm_update_frame_stats()
2901 mvm->drv_rx_stats.mimo2_frames++; in iwl_mvm_update_frame_stats()
2904 mvm->drv_rx_stats.sgi_frames++; in iwl_mvm_update_frame_stats()
2906 mvm->drv_rx_stats.ngi_frames++; in iwl_mvm_update_frame_stats()
2908 mvm->drv_rx_stats.last_rates[mvm->drv_rx_stats.last_frame_idx] = rate; in iwl_mvm_update_frame_stats()
2909 mvm->drv_rx_stats.last_frame_idx = in iwl_mvm_update_frame_stats()
2910 (mvm->drv_rx_stats.last_frame_idx + 1) % in iwl_mvm_update_frame_stats()
2911 ARRAY_SIZE(mvm->drv_rx_stats.last_rates); in iwl_mvm_update_frame_stats()
2913 spin_unlock(&mvm->drv_stats_lock); in iwl_mvm_update_frame_stats()
2924 struct ieee80211_hw *hw = mvm->hw; in rs_drv_rate_init()
2925 struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap; in rs_drv_rate_init()
2926 struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap; in rs_drv_rate_init()
2928 struct iwl_lq_sta *lq_sta = &mvmsta->deflink.lq_sta.rs_drv; in rs_drv_rate_init()
2932 lockdep_assert_held(&mvmsta->deflink.lq_sta.rs_drv.pers.lock); in rs_drv_rate_init()
2934 /* clear all non-persistent lq data */ in rs_drv_rate_init()
2937 sband = hw->wiphy->bands[band]; in rs_drv_rate_init()
2939 lq_sta->lq.sta_id = mvmsta->deflink.sta_id; in rs_drv_rate_init()
2940 mvmsta->amsdu_enabled = 0; in rs_drv_rate_init()
2941 mvmsta->max_amsdu_len = sta->cur->max_amsdu_len; in rs_drv_rate_init()
2944 rs_rate_scale_clear_tbl_windows(mvm, &lq_sta->lq_info[j]); in rs_drv_rate_init()
2946 lq_sta->flush_timer = 0; in rs_drv_rate_init()
2947 lq_sta->last_tx = jiffies; in rs_drv_rate_init()
2951 mvmsta->deflink.sta_id); in rs_drv_rate_init()
2955 * after assoc.. */ in rs_drv_rate_init()
2957 lq_sta->missed_rate_counter = IWL_MVM_RS_MISSED_RATE_MAX; in rs_drv_rate_init()
2958 lq_sta->band = sband->band; in rs_drv_rate_init()
2962 supp = sta->deflink.supp_rates[sband->band]; in rs_drv_rate_init()
2963 lq_sta->active_legacy_rate = 0; in rs_drv_rate_init()
2965 lq_sta->active_legacy_rate |= BIT(sband->bitrates[i].hw_value); in rs_drv_rate_init()
2968 if (!vht_cap || !vht_cap->vht_supported) in rs_drv_rate_init()
2973 lq_sta->max_legacy_rate_idx = in rs_drv_rate_init()
2974 rs_get_max_rate_from_mask(lq_sta->active_legacy_rate); in rs_drv_rate_init()
2975 lq_sta->max_siso_rate_idx = in rs_drv_rate_init()
2976 rs_get_max_rate_from_mask(lq_sta->active_siso_rate); in rs_drv_rate_init()
2977 lq_sta->max_mimo2_rate_idx = in rs_drv_rate_init()
2978 rs_get_max_rate_from_mask(lq_sta->active_mimo2_rate); in rs_drv_rate_init()
2982 lq_sta->active_legacy_rate, in rs_drv_rate_init()
2983 lq_sta->active_siso_rate, in rs_drv_rate_init()
2984 lq_sta->active_mimo2_rate, in rs_drv_rate_init()
2985 lq_sta->is_vht, lq_sta->ldpc, lq_sta->stbc_capable, in rs_drv_rate_init()
2986 lq_sta->bfer_capable); in rs_drv_rate_init()
2988 lq_sta->max_legacy_rate_idx, in rs_drv_rate_init()
2989 lq_sta->max_siso_rate_idx, in rs_drv_rate_init()
2990 lq_sta->max_mimo2_rate_idx); in rs_drv_rate_init()
2993 lq_sta->lq.single_stream_ant_msk = in rs_drv_rate_init()
2995 lq_sta->lq.dual_stream_ant_msk = ANT_AB; in rs_drv_rate_init()
2998 lq_sta->tx_agg_tid_en = IWL_AGG_ALL_TID; in rs_drv_rate_init()
2999 lq_sta->is_agg = 0; in rs_drv_rate_init()
3017 if (!mvmsta->vif) in rs_drv_rate_update()
3024 iwl_mvm_rs_rate_init(mvm, mvmsta->vif, sta, in rs_drv_rate_update()
3025 &mvmsta->vif->bss_conf, &sta->deflink, in rs_drv_rate_update()
3026 sband->band); in rs_drv_rate_update()
3041 u32 tlc_info = (uintptr_t)info->status.status_driver_data[0]; in __iwl_mvm_rs_tx_status()
3044 u32 tx_resp_hwrate = (uintptr_t)info->status.status_driver_data[1]; in __iwl_mvm_rs_tx_status()
3046 struct iwl_lq_sta *lq_sta = &mvmsta->deflink.lq_sta.rs_drv; in __iwl_mvm_rs_tx_status()
3048 if (!lq_sta->pers.drv) { in __iwl_mvm_rs_tx_status()
3054 if ((info->flags & IEEE80211_TX_CTL_AMPDU) && in __iwl_mvm_rs_tx_status()
3055 !(info->flags & IEEE80211_TX_STAT_AMPDU)) in __iwl_mvm_rs_tx_status()
3058 if (rs_rate_from_ucode_rate(tx_resp_hwrate, info->band, in __iwl_mvm_rs_tx_status()
3068 if (lq_sta->pers.dbg_fixed_rate) { in __iwl_mvm_rs_tx_status()
3079 if (info->flags & IEEE80211_TX_STAT_AMPDU) { in __iwl_mvm_rs_tx_status()
3080 attempts = info->status.ampdu_len; in __iwl_mvm_rs_tx_status()
3081 success = info->status.ampdu_ack_len; in __iwl_mvm_rs_tx_status()
3083 attempts = info->status.rates[0].count; in __iwl_mvm_rs_tx_status()
3084 success = !!(info->flags & IEEE80211_TX_STAT_ACK); in __iwl_mvm_rs_tx_status()
3087 lq_sta->pers.tx_stats[column][index].total += attempts; in __iwl_mvm_rs_tx_status()
3088 lq_sta->pers.tx_stats[column][index].success += success; in __iwl_mvm_rs_tx_status()
3097 (unsigned long)(lq_sta->last_tx + in __iwl_mvm_rs_tx_status()
3103 rs_drv_rate_init(mvm, sta, info->band); in __iwl_mvm_rs_tx_status()
3106 lq_sta->last_tx = jiffies; in __iwl_mvm_rs_tx_status()
3115 table = &lq_sta->lq; in __iwl_mvm_rs_tx_status()
3116 lq_hwrate = le32_to_cpu(table->rs_table[0]); in __iwl_mvm_rs_tx_status()
3117 if (rs_rate_from_ucode_rate(lq_hwrate, info->band, &lq_rate)) { in __iwl_mvm_rs_tx_status()
3123 if (lq_color != LQ_FLAG_COLOR_GET(table->flags)) { in __iwl_mvm_rs_tx_status()
3126 lq_color, LQ_FLAG_COLOR_GET(table->flags)); in __iwl_mvm_rs_tx_status()
3128 /* Since rates mis-match, the last LQ command may have failed. in __iwl_mvm_rs_tx_status()
3129 * After IWL_MISSED_RATE_MAX mis-matches, resync the uCode with in __iwl_mvm_rs_tx_status()
3132 lq_sta->missed_rate_counter++; in __iwl_mvm_rs_tx_status()
3133 if (lq_sta->missed_rate_counter > IWL_MVM_RS_MISSED_RATE_MAX) { in __iwl_mvm_rs_tx_status()
3134 lq_sta->missed_rate_counter = 0; in __iwl_mvm_rs_tx_status()
3137 lq_sta->rs_state); in __iwl_mvm_rs_tx_status()
3138 iwl_mvm_send_lq_cmd(mvm, &lq_sta->lq); in __iwl_mvm_rs_tx_status()
3145 lq_sta->missed_rate_counter = 0; in __iwl_mvm_rs_tx_status()
3147 if (!lq_sta->search_better_tbl) { in __iwl_mvm_rs_tx_status()
3148 curr_tbl = &lq_sta->lq_info[lq_sta->active_tbl]; in __iwl_mvm_rs_tx_status()
3149 other_tbl = &lq_sta->lq_info[rs_search_tbl(lq_sta->active_tbl)]; in __iwl_mvm_rs_tx_status()
3151 curr_tbl = &lq_sta->lq_info[rs_search_tbl(lq_sta->active_tbl)]; in __iwl_mvm_rs_tx_status()
3152 other_tbl = &lq_sta->lq_info[lq_sta->active_tbl]; in __iwl_mvm_rs_tx_status()
3155 if (WARN_ON_ONCE(!rs_rate_column_match(&lq_rate, &curr_tbl->rate))) { in __iwl_mvm_rs_tx_status()
3158 tmp_tbl = &lq_sta->lq_info[lq_sta->active_tbl]; in __iwl_mvm_rs_tx_status()
3159 rs_dump_rate(mvm, &tmp_tbl->rate, "ACTIVE"); in __iwl_mvm_rs_tx_status()
3160 tmp_tbl = &lq_sta->lq_info[rs_search_tbl(lq_sta->active_tbl)]; in __iwl_mvm_rs_tx_status()
3161 rs_dump_rate(mvm, &tmp_tbl->rate, "SEARCH"); in __iwl_mvm_rs_tx_status()
3164 /* no matching table found, let's by-pass the data collection in __iwl_mvm_rs_tx_status()
3177 if (info->flags & IEEE80211_TX_STAT_AMPDU) { in __iwl_mvm_rs_tx_status()
3179 info->status.ampdu_len, in __iwl_mvm_rs_tx_status()
3180 info->status.ampdu_ack_len, in __iwl_mvm_rs_tx_status()
3196 if (info->status.ampdu_ack_len == 0) in __iwl_mvm_rs_tx_status()
3197 info->status.ampdu_len = 1; in __iwl_mvm_rs_tx_status()
3201 info->status.ampdu_len, in __iwl_mvm_rs_tx_status()
3202 info->status.ampdu_ack_len); in __iwl_mvm_rs_tx_status()
3205 if (lq_sta->rs_state == RS_STATE_STAY_IN_COLUMN) { in __iwl_mvm_rs_tx_status()
3206 lq_sta->total_success += info->status.ampdu_ack_len; in __iwl_mvm_rs_tx_status()
3207 lq_sta->total_failed += (info->status.ampdu_len - in __iwl_mvm_rs_tx_status()
3208 info->status.ampdu_ack_len); in __iwl_mvm_rs_tx_status()
3212 retries = info->status.rates[0].count - 1; in __iwl_mvm_rs_tx_status()
3217 legacy_success = !!(info->flags & IEEE80211_TX_STAT_ACK); in __iwl_mvm_rs_tx_status()
3220 lq_hwrate = le32_to_cpu(table->rs_table[i]); in __iwl_mvm_rs_tx_status()
3221 if (rs_rate_from_ucode_rate(lq_hwrate, info->band, in __iwl_mvm_rs_tx_status()
3230 if (rs_rate_column_match(&lq_rate, &curr_tbl->rate)) in __iwl_mvm_rs_tx_status()
3233 &other_tbl->rate)) in __iwl_mvm_rs_tx_status()
3248 if (lq_sta->rs_state == RS_STATE_STAY_IN_COLUMN) { in __iwl_mvm_rs_tx_status()
3249 lq_sta->total_success += legacy_success; in __iwl_mvm_rs_tx_status()
3250 lq_sta->total_failed += retries + (1 - legacy_success); in __iwl_mvm_rs_tx_status()
3254 lq_sta->last_rate_n_flags = lq_hwrate; in __iwl_mvm_rs_tx_status()
3258 if (sta->deflink.supp_rates[info->band]) in __iwl_mvm_rs_tx_status()
3270 if (!spin_trylock_bh(&mvmsta->deflink.lq_sta.rs_drv.pers.lock)) in iwl_mvm_rs_tx_status()
3274 spin_unlock_bh(&mvmsta->deflink.lq_sta.rs_drv.pers.lock); in iwl_mvm_rs_tx_status()
3285 int num_rates = ARRAY_SIZE(lq_cmd->rs_table); in rs_build_rates_table_from_fixed()
3290 lq_cmd->rs_table[i] = ucode_rate_le32; in rs_build_rates_table_from_fixed()
3298 lq_cmd->mimo_delim = num_rates - 1; in rs_build_rates_table_from_fixed()
3300 lq_cmd->mimo_delim = 0; in rs_build_rates_table_from_fixed()
3302 lq_cmd->reduced_tpc = 0; in rs_build_rates_table_from_fixed()
3305 lq_cmd->single_stream_ant_msk = ant; in rs_build_rates_table_from_fixed()
3307 if (!mvm->trans->trans_cfg->gen2) in rs_build_rates_table_from_fixed()
3308 lq_cmd->agg_frame_cnt_limit = LINK_QUAL_AGG_FRAME_LIMIT_DEF; in rs_build_rates_table_from_fixed()
3310 lq_cmd->agg_frame_cnt_limit = in rs_build_rates_table_from_fixed()
3325 int prev_rate_idx = rate->index; in rs_fill_rates_for_column()
3338 prev_rate_idx = rate->index; in rs_fill_rates_for_column()
3345 rate->index = prev_rate_idx; in rs_fill_rates_for_column()
3378 struct iwl_lq_cmd *lq_cmd = &lq_sta->lq; in rs_build_rates_table()
3387 if (!fw_has_api(&mvm->fw->ucode_capa, IWL_UCODE_TLV_API_LQ_SS_PARAMS) && in rs_build_rates_table()
3403 rs_fill_rates_for_column(mvm, lq_sta, &rate, lq_cmd->rs_table, &index, in rs_build_rates_table()
3412 lq_cmd->mimo_delim = index; in rs_build_rates_table()
3422 rs_fill_rates_for_column(mvm, lq_sta, &rate, lq_cmd->rs_table, &index, in rs_build_rates_table()
3431 rs_fill_rates_for_column(mvm, lq_sta, &rate, lq_cmd->rs_table, &index, in rs_build_rates_table()
3435 /* update the color of the LQ command (as a counter at bits 1-3) */ in rs_build_rates_table()
3436 color = LQ_FLAGS_COLOR_INC(LQ_FLAG_COLOR_GET(lq_cmd->flags)); in rs_build_rates_table()
3437 lq_cmd->flags = LQ_FLAG_COLOR_SET(lq_cmd->flags, color); in rs_build_rates_table()
3450 struct iwl_lq_cmd *lq_cmd = &mvmsta->deflink.lq_sta.rs_drv.lq; in rs_bfer_active_iter()
3451 u32 ss_params = le32_to_cpu(lq_cmd->ss_params); in rs_bfer_active_iter()
3453 if (sta == data->exclude_sta) in rs_bfer_active_iter()
3458 WARN_ON_ONCE(data->bfer_mvmsta != NULL); in rs_bfer_active_iter()
3460 data->bfer_mvmsta = mvmsta; in rs_bfer_active_iter()
3466 int prio = -1; in rs_bfer_priority()
3467 enum nl80211_iftype viftype = ieee80211_vif_type_p2p(sta->vif); in rs_bfer_priority()
3482 sta->deflink.sta_id); in rs_bfer_priority()
3483 prio = -1; in rs_bfer_priority()
3499 return -1; in rs_bfer_priority_cmp()
3508 struct iwl_lq_cmd *lq_cmd = &lq_sta->lq; in rs_set_lq_ss_params()
3524 if (lq_sta->pers.ss_force == RS_SS_FORCE_STBC) in rs_set_lq_ss_params()
3526 else if (lq_sta->pers.ss_force == RS_SS_FORCE_BFER) in rs_set_lq_ss_params()
3529 if (lq_sta->pers.ss_force != RS_SS_FORCE_NONE) { in rs_set_lq_ss_params()
3531 lq_sta->pers.ss_force); in rs_set_lq_ss_params()
3536 if (lq_sta->stbc_capable) in rs_set_lq_ss_params()
3539 if (!lq_sta->bfer_capable) in rs_set_lq_ss_params()
3542 ieee80211_iterate_stations_atomic(mvm->hw, in rs_set_lq_ss_params()
3559 bfer_mvmsta->deflink.sta_id); in rs_set_lq_ss_params()
3564 &bfer_mvmsta->deflink.lq_sta.rs_drv.lq; in rs_set_lq_ss_params()
3565 u32 bfersta_ss_params = le32_to_cpu(bfersta_lq_cmd->ss_params); in rs_set_lq_ss_params()
3568 bfersta_lq_cmd->ss_params = cpu_to_le32(bfersta_ss_params); in rs_set_lq_ss_params()
3574 bfer_mvmsta->deflink.sta_id); in rs_set_lq_ss_params()
3577 lq_cmd->ss_params = cpu_to_le32(ss_params); in rs_set_lq_ss_params()
3585 struct iwl_lq_cmd *lq_cmd = &lq_sta->lq; in rs_fill_lq_cmd()
3589 lq_cmd->agg_disable_start_th = IWL_MVM_RS_AGG_DISABLE_START; in rs_fill_lq_cmd()
3590 lq_cmd->agg_time_limit = in rs_fill_lq_cmd()
3594 if (lq_sta->pers.dbg_fixed_rate) { in rs_fill_lq_cmd()
3596 lq_sta->band, in rs_fill_lq_cmd()
3597 lq_sta->pers.dbg_fixed_rate); in rs_fill_lq_cmd()
3606 if (fw_has_api(&mvm->fw->ucode_capa, IWL_UCODE_TLV_API_LQ_SS_PARAMS)) in rs_fill_lq_cmd()
3610 mvmvif = iwl_mvm_vif_from_mac80211(mvmsta->vif); in rs_fill_lq_cmd()
3612 if (!fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_COEX_SCHEMA_2) && in rs_fill_lq_cmd()
3613 num_of_ant(initial_rate->ant) == 1) in rs_fill_lq_cmd()
3614 lq_cmd->single_stream_ant_msk = initial_rate->ant; in rs_fill_lq_cmd()
3616 lq_cmd->agg_frame_cnt_limit = lq_sta->pers.max_agg_bufsize; in rs_fill_lq_cmd()
3624 lq_cmd->agg_frame_cnt_limit--; in rs_fill_lq_cmd()
3626 if (mvmsta->vif->p2p) in rs_fill_lq_cmd()
3627 lq_cmd->flags |= LQ_FLAG_USE_RTS_MSK; in rs_fill_lq_cmd()
3629 lq_cmd->agg_time_limit = in rs_fill_lq_cmd()
3635 return hw->priv; in rs_alloc()
3670 iwl_rate_mcs(index)->mbps); in rs_pretty_print_rate_v1()
3710 lq_sta->active_legacy_rate = 0x0FFF; /* 1 - 54 MBits, includes CCK */ in rs_program_fix_rate()
3711 lq_sta->active_siso_rate = 0x1FD0; /* 6 - 60 MBits, no 9, no CCK */ in rs_program_fix_rate()
3712 lq_sta->active_mimo2_rate = 0x1FD0; /* 6 - 60 MBits, no 9, no CCK */ in rs_program_fix_rate()
3715 lq_sta->lq.sta_id, lq_sta->pers.dbg_fixed_rate); in rs_program_fix_rate()
3717 if (lq_sta->pers.dbg_fixed_rate) { in rs_program_fix_rate()
3719 iwl_mvm_send_lq_cmd(lq_sta->pers.drv, &lq_sta->lq); in rs_program_fix_rate()
3726 struct iwl_lq_sta *lq_sta = file->private_data; in rs_sta_dbgfs_scale_table_write()
3732 mvm = lq_sta->pers.drv; in rs_sta_dbgfs_scale_table_write()
3734 buf_size = min(count, sizeof(buf) - 1); in rs_sta_dbgfs_scale_table_write()
3736 return -EFAULT; in rs_sta_dbgfs_scale_table_write()
3739 lq_sta->pers.dbg_fixed_rate = parsed_rate; in rs_sta_dbgfs_scale_table_write()
3741 lq_sta->pers.dbg_fixed_rate = 0; in rs_sta_dbgfs_scale_table_write()
3757 struct iwl_lq_sta *lq_sta = file->private_data; in rs_sta_dbgfs_scale_table_read()
3761 struct iwl_scale_tbl_info *tbl = &(lq_sta->lq_info[lq_sta->active_tbl]); in rs_sta_dbgfs_scale_table_read()
3762 struct rs_rate *rate = &tbl->rate; in rs_sta_dbgfs_scale_table_read()
3765 mvm = lq_sta->pers.drv; in rs_sta_dbgfs_scale_table_read()
3768 return -ENOMEM; in rs_sta_dbgfs_scale_table_read()
3770 desc += scnprintf(buff + desc, bufsz - desc, in rs_sta_dbgfs_scale_table_read()
3771 "sta_id %d\n", lq_sta->lq.sta_id); in rs_sta_dbgfs_scale_table_read()
3772 desc += scnprintf(buff + desc, bufsz - desc, in rs_sta_dbgfs_scale_table_read()
3774 lq_sta->total_failed, lq_sta->total_success, in rs_sta_dbgfs_scale_table_read()
3775 lq_sta->active_legacy_rate); in rs_sta_dbgfs_scale_table_read()
3776 desc += scnprintf(buff + desc, bufsz - desc, "fixed rate 0x%X\n", in rs_sta_dbgfs_scale_table_read()
3777 lq_sta->pers.dbg_fixed_rate); in rs_sta_dbgfs_scale_table_read()
3778 desc += scnprintf(buff + desc, bufsz - desc, "valid_tx_ant %s%s\n", in rs_sta_dbgfs_scale_table_read()
3781 desc += scnprintf(buff + desc, bufsz - desc, "lq type %s\n", in rs_sta_dbgfs_scale_table_read()
3785 desc += scnprintf(buff + desc, bufsz - desc, " %s", in rs_sta_dbgfs_scale_table_read()
3787 desc += scnprintf(buff + desc, bufsz - desc, " %s", in rs_sta_dbgfs_scale_table_read()
3792 desc += scnprintf(buff + desc, bufsz - desc, " %s %s %s %s\n", in rs_sta_dbgfs_scale_table_read()
3793 (rate->sgi) ? "SGI" : "NGI", in rs_sta_dbgfs_scale_table_read()
3794 (rate->ldpc) ? "LDPC" : "BCC", in rs_sta_dbgfs_scale_table_read()
3795 (lq_sta->is_agg) ? "AGG on" : "", in rs_sta_dbgfs_scale_table_read()
3796 (mvmsta->amsdu_enabled) ? "AMSDU on" : ""); in rs_sta_dbgfs_scale_table_read()
3798 desc += scnprintf(buff + desc, bufsz - desc, "last tx rate=0x%X\n", in rs_sta_dbgfs_scale_table_read()
3799 lq_sta->last_rate_n_flags); in rs_sta_dbgfs_scale_table_read()
3800 desc += scnprintf(buff + desc, bufsz - desc, in rs_sta_dbgfs_scale_table_read()
3801 "general: flags=0x%X mimo-d=%d s-ant=0x%x d-ant=0x%x\n", in rs_sta_dbgfs_scale_table_read()
3802 lq_sta->lq.flags, in rs_sta_dbgfs_scale_table_read()
3803 lq_sta->lq.mimo_delim, in rs_sta_dbgfs_scale_table_read()
3804 lq_sta->lq.single_stream_ant_msk, in rs_sta_dbgfs_scale_table_read()
3805 lq_sta->lq.dual_stream_ant_msk); in rs_sta_dbgfs_scale_table_read()
3807 desc += scnprintf(buff + desc, bufsz - desc, in rs_sta_dbgfs_scale_table_read()
3809 le16_to_cpu(lq_sta->lq.agg_time_limit), in rs_sta_dbgfs_scale_table_read()
3810 lq_sta->lq.agg_disable_start_th, in rs_sta_dbgfs_scale_table_read()
3811 lq_sta->lq.agg_frame_cnt_limit); in rs_sta_dbgfs_scale_table_read()
3813 desc += scnprintf(buff + desc, bufsz - desc, "reduced tpc=%d\n", in rs_sta_dbgfs_scale_table_read()
3814 lq_sta->lq.reduced_tpc); in rs_sta_dbgfs_scale_table_read()
3815 ss_params = le32_to_cpu(lq_sta->lq.ss_params); in rs_sta_dbgfs_scale_table_read()
3816 desc += scnprintf(buff + desc, bufsz - desc, in rs_sta_dbgfs_scale_table_read()
3826 desc += scnprintf(buff + desc, bufsz - desc, in rs_sta_dbgfs_scale_table_read()
3828 lq_sta->lq.initial_rate_index[0], in rs_sta_dbgfs_scale_table_read()
3829 lq_sta->lq.initial_rate_index[1], in rs_sta_dbgfs_scale_table_read()
3830 lq_sta->lq.initial_rate_index[2], in rs_sta_dbgfs_scale_table_read()
3831 lq_sta->lq.initial_rate_index[3]); in rs_sta_dbgfs_scale_table_read()
3834 u32 r = le32_to_cpu(lq_sta->lq.rs_table[i]); in rs_sta_dbgfs_scale_table_read()
3836 desc += scnprintf(buff + desc, bufsz - desc, in rs_sta_dbgfs_scale_table_read()
3838 desc += rs_pretty_print_rate_v1(buff + desc, bufsz - desc, r); in rs_sta_dbgfs_scale_table_read()
3839 if (desc < bufsz - 1) in rs_sta_dbgfs_scale_table_read()
3863 struct iwl_lq_sta *lq_sta = file->private_data; in rs_sta_dbgfs_stats_table_read()
3867 return -ENOMEM; in rs_sta_dbgfs_stats_table_read()
3870 tbl = &(lq_sta->lq_info[i]); in rs_sta_dbgfs_stats_table_read()
3871 rate = &tbl->rate; in rs_sta_dbgfs_stats_table_read()
3875 lq_sta->active_tbl == i ? "*" : "x", in rs_sta_dbgfs_stats_table_read()
3876 rate->type, in rs_sta_dbgfs_stats_table_read()
3877 rate->sgi, in rs_sta_dbgfs_stats_table_read()
3882 rate->index); in rs_sta_dbgfs_stats_table_read()
3886 tbl->win[j].counter, in rs_sta_dbgfs_stats_table_read()
3887 tbl->win[j].success_counter, in rs_sta_dbgfs_stats_table_read()
3888 tbl->win[j].success_ratio); in rs_sta_dbgfs_stats_table_read()
3940 struct iwl_lq_sta *lq_sta = file->private_data; in rs_sta_dbgfs_drv_tx_stats_read()
3946 return -ENOMEM; in rs_sta_dbgfs_drv_tx_stats_read()
3951 pos += scnprintf(pos, endpos - pos, "COLUMN,"); in rs_sta_dbgfs_drv_tx_stats_read()
3953 pos += scnprintf(pos, endpos - pos, "%s,", rate_name[rate]); in rs_sta_dbgfs_drv_tx_stats_read()
3954 pos += scnprintf(pos, endpos - pos, "\n"); in rs_sta_dbgfs_drv_tx_stats_read()
3957 pos += scnprintf(pos, endpos - pos, in rs_sta_dbgfs_drv_tx_stats_read()
3961 stats = &(lq_sta->pers.tx_stats[col][rate]); in rs_sta_dbgfs_drv_tx_stats_read()
3962 pos += scnprintf(pos, endpos - pos, in rs_sta_dbgfs_drv_tx_stats_read()
3964 stats->success, in rs_sta_dbgfs_drv_tx_stats_read()
3965 stats->total); in rs_sta_dbgfs_drv_tx_stats_read()
3967 pos += scnprintf(pos, endpos - pos, "\n"); in rs_sta_dbgfs_drv_tx_stats_read()
3970 ret = simple_read_from_buffer(user_buf, count, ppos, buff, pos - buff); in rs_sta_dbgfs_drv_tx_stats_read()
3979 struct iwl_lq_sta *lq_sta = file->private_data; in rs_sta_dbgfs_drv_tx_stats_write()
3980 memset(lq_sta->pers.tx_stats, 0, sizeof(lq_sta->pers.tx_stats)); in rs_sta_dbgfs_drv_tx_stats_write()
3996 struct iwl_lq_sta *lq_sta = file->private_data; in iwl_dbgfs_ss_force_read()
4007 pos += scnprintf(buf+pos, bufsz-pos, "%s\n", in iwl_dbgfs_ss_force_read()
4008 ss_force_name[lq_sta->pers.ss_force]); in iwl_dbgfs_ss_force_read()
4015 struct iwl_mvm *mvm = lq_sta->pers.drv; in iwl_dbgfs_ss_force_write()
4019 lq_sta->pers.ss_force = RS_SS_FORCE_NONE; in iwl_dbgfs_ss_force_write()
4021 lq_sta->pers.ss_force = RS_SS_FORCE_SISO; in iwl_dbgfs_ss_force_write()
4023 if (lq_sta->stbc_capable) { in iwl_dbgfs_ss_force_write()
4024 lq_sta->pers.ss_force = RS_SS_FORCE_STBC; in iwl_dbgfs_ss_force_write()
4028 ret = -EINVAL; in iwl_dbgfs_ss_force_write()
4031 if (lq_sta->bfer_capable) { in iwl_dbgfs_ss_force_write()
4032 lq_sta->pers.ss_force = RS_SS_FORCE_BFER; in iwl_dbgfs_ss_force_write()
4036 ret = -EINVAL; in iwl_dbgfs_ss_force_write()
4040 ret = -EINVAL; in iwl_dbgfs_ss_force_write()
4063 if (!mvmsta->vif) in rs_drv_add_sta_debugfs()
4073 &lq_sta->tx_agg_tid_en); in rs_drv_add_sta_debugfs()
4075 &lq_sta->pers.dbg_fixed_txp_reduction); in rs_drv_add_sta_debugfs()
4123 spin_lock_bh(&mvmsta->deflink.lq_sta.rs_drv.pers.lock); in iwl_mvm_rs_rate_init()
4125 spin_unlock_bh(&mvmsta->deflink.lq_sta.rs_drv.pers.lock); in iwl_mvm_rs_rate_init()
4142 struct iwl_lq_cmd *lq = &mvmsta->deflink.lq_sta.rs_drv.lq; in rs_drv_tx_protection()
4144 lockdep_assert_held(&mvm->mutex); in rs_drv_tx_protection()
4147 if (mvmsta->tx_protection == 0) in rs_drv_tx_protection()
4148 lq->flags |= LQ_FLAG_USE_RTS_MSK; in rs_drv_tx_protection()
4149 mvmsta->tx_protection++; in rs_drv_tx_protection()
4151 mvmsta->tx_protection--; in rs_drv_tx_protection()
4152 if (mvmsta->tx_protection == 0) in rs_drv_tx_protection()
4153 lq->flags &= ~LQ_FLAG_USE_RTS_MSK; in rs_drv_tx_protection()
4160 * iwl_mvm_tx_protection - ask FW to enable RTS/CTS protection