Lines Matching refs:mvm

114 typedef bool (*allow_column_func_t) (struct iwl_mvm *mvm,
127 static bool rs_ant_allow(struct iwl_mvm *mvm, struct ieee80211_sta *sta, in rs_ant_allow() argument
131 return iwl_mvm_bt_coex_is_ant_avail(mvm, next_col->ant); in rs_ant_allow()
134 static bool rs_mimo_allow(struct iwl_mvm *mvm, struct ieee80211_sta *sta, in rs_mimo_allow() argument
144 if (num_of_ant(iwl_mvm_get_valid_tx_ant(mvm)) < 2) in rs_mimo_allow()
147 if (!iwl_mvm_bt_coex_is_mimo_allowed(mvm, sta)) in rs_mimo_allow()
150 if (mvm->nvm_data->sku_cap_mimo_disabled) in rs_mimo_allow()
156 static bool rs_siso_allow(struct iwl_mvm *mvm, struct ieee80211_sta *sta, in rs_siso_allow() argument
166 static bool rs_sgi_allow(struct iwl_mvm *mvm, struct ieee80211_sta *sta, in rs_sgi_allow() argument
374 static void rs_rate_scale_perform(struct iwl_mvm *mvm,
378 static void rs_fill_lq_cmd(struct iwl_mvm *mvm,
522 static inline void rs_dump_rate(struct iwl_mvm *mvm, const struct rs_rate *rate, in rs_dump_rate() argument
525 IWL_DEBUG_RATE(mvm, in rs_dump_rate()
540 static void rs_rate_scale_clear_tbl_windows(struct iwl_mvm *mvm, in rs_rate_scale_clear_tbl_windows() argument
545 IWL_DEBUG_RATE(mvm, "Clearing up window stats\n"); in rs_rate_scale_clear_tbl_windows()
558 static int rs_tl_turn_on_agg_for_tid(struct iwl_mvm *mvm, in rs_tl_turn_on_agg_for_tid() argument
564 IWL_DEBUG_HT(mvm, "Starting Tx agg: STA: %pM tid: %d\n", in rs_tl_turn_on_agg_for_tid()
575 IWL_ERR(mvm, "Fail start Tx agg on tid: %d\n", in rs_tl_turn_on_agg_for_tid()
582 static void rs_tl_turn_on_agg(struct iwl_mvm *mvm, struct iwl_mvm_sta *mvmsta, in rs_tl_turn_on_agg() argument
593 IWL_ERR(mvm, "tid exceeds max TID count: %d/%d\n", in rs_tl_turn_on_agg()
605 IWL_DEBUG_RATE(mvm, "try to aggregate tid %d\n", tid); in rs_tl_turn_on_agg()
606 if (rs_tl_turn_on_agg_for_tid(mvm, lq_sta, tid, sta) == 0) in rs_tl_turn_on_agg()
635 static int _rs_collect_tx_data(struct iwl_mvm *mvm, in _rs_collect_tx_data() argument
700 static int rs_collect_tpc_data(struct iwl_mvm *mvm, in rs_collect_tpc_data() argument
712 return _rs_collect_tx_data(mvm, tbl, scale_index, attempts, successes, in rs_collect_tpc_data()
716 static void rs_update_tid_tpt_stats(struct iwl_mvm *mvm, in rs_update_tid_tpt_stats() argument
746 static int rs_collect_tlc_data(struct iwl_mvm *mvm, in rs_collect_tlc_data() argument
763 rs_update_tid_tpt_stats(mvm, mvmsta, tid, successes); in rs_collect_tlc_data()
767 return _rs_collect_tx_data(mvm, tbl, scale_index, attempts, successes, in rs_collect_tlc_data()
772 static u32 ucode_rate_from_rs_rate(struct iwl_mvm *mvm, in ucode_rate_from_rs_rate() argument
796 IWL_ERR(mvm, "Invalid HT rate index %d\n", index); in ucode_rate_from_rs_rate()
809 IWL_ERR(mvm, "Invalid VHT rate index %d\n", index); in ucode_rate_from_rs_rate()
821 IWL_ERR(mvm, "Invalid rate->type %d\n", rate->type); in ucode_rate_from_rs_rate()
971 static u16 rs_get_adjacent_rate(struct iwl_mvm *mvm, u8 index, u16 rate_mask, in rs_get_adjacent_rate() argument
1042 struct iwl_mvm *mvm = lq_sta->pers.drv; in rs_get_lower_rate_in_column() local
1045 high_low = rs_get_adjacent_rate(mvm, rate->index, rate_mask, in rs_get_lower_rate_in_column()
1061 struct iwl_mvm *mvm = lq_sta->pers.drv; in rs_get_lower_rate_down_column() local
1087 rate->ant = first_antenna(iwl_mvm_get_valid_tx_ant(mvm)); in rs_get_lower_rate_down_column()
1167 struct iwl_mvm *mvm = IWL_OP_MODE_GET_MVM(op_mode); in rs_drv_mac80211_tx_status() local
1178 iwl_mvm_rs_tx_status(mvm, sta, rs_get_tid(hdr), info, in rs_drv_mac80211_tx_status()
1190 static void rs_set_stay_in_table(struct iwl_mvm *mvm, u8 is_legacy, in rs_set_stay_in_table() argument
1193 IWL_DEBUG_RATE(mvm, "Moving to RS_STATE_STAY_IN_COLUMN\n"); in rs_set_stay_in_table()
1324 static s32 rs_get_best_rate(struct iwl_mvm *mvm, in rs_get_best_rate() argument
1340 IWL_DEBUG_RATE(mvm, in rs_get_best_rate()
1345 IWL_DEBUG_RATE(mvm, in rs_get_best_rate()
1356 high_low = rs_get_adjacent_rate(mvm, rate_idx, rate_mask, in rs_get_best_rate()
1362 IWL_DEBUG_RATE(mvm, "Best rate found %d target_tp %d expected_new %d\n", in rs_get_best_rate()
1416 struct iwl_mvm *mvm; in rs_stay_in_table() local
1418 mvm = lq_sta->pers.drv; in rs_stay_in_table()
1445 IWL_DEBUG_RATE(mvm, in rs_stay_in_table()
1453 IWL_DEBUG_RATE(mvm, in rs_stay_in_table()
1472 IWL_DEBUG_RATE(mvm, in rs_stay_in_table()
1474 rs_rate_scale_clear_tbl_windows(mvm, tbl); in rs_stay_in_table()
1482 rs_rate_scale_clear_tbl_windows(mvm, tbl); in rs_stay_in_table()
1487 static void rs_set_amsdu_len(struct iwl_mvm *mvm, struct ieee80211_sta *sta, in rs_set_amsdu_len() argument
1519 iwl_mvm_max_amsdu_size(mvm, sta, i); in rs_set_amsdu_len()
1532 static void rs_update_rate_tbl(struct iwl_mvm *mvm, in rs_update_rate_tbl() argument
1537 rs_fill_lq_cmd(mvm, sta, lq_sta, &tbl->rate); in rs_update_rate_tbl()
1538 iwl_mvm_send_lq_cmd(mvm, &lq_sta->lq); in rs_update_rate_tbl()
1541 static bool rs_tweak_rate_tbl(struct iwl_mvm *mvm, in rs_tweak_rate_tbl() argument
1558 IWL_DEBUG_RATE(mvm, "Switch 80Mhz SISO MCS0 -> 20Mhz MCS4\n"); in rs_tweak_rate_tbl()
1574 IWL_DEBUG_RATE(mvm, "Switch 20Mhz SISO MCS5 -> 80Mhz MCS1\n"); in rs_tweak_rate_tbl()
1582 rs_rate_scale_clear_tbl_windows(mvm, tbl); in rs_tweak_rate_tbl()
1586 static enum rs_column rs_get_next_column(struct iwl_mvm *mvm, in rs_get_next_column() argument
1596 u8 valid_ants = iwl_mvm_get_valid_tx_ant(mvm); in rs_get_next_column()
1607 IWL_DEBUG_RATE(mvm, "Skip already visited column %d\n", in rs_get_next_column()
1615 IWL_DEBUG_RATE(mvm, in rs_get_next_column()
1623 if (allow_func && !allow_func(mvm, sta, &tbl->rate, in rs_get_next_column()
1629 IWL_DEBUG_RATE(mvm, in rs_get_next_column()
1644 IWL_DEBUG_RATE(mvm, in rs_get_next_column()
1652 IWL_DEBUG_RATE(mvm, in rs_get_next_column()
1658 IWL_DEBUG_RATE(mvm, in rs_get_next_column()
1670 static int rs_switch_to_column(struct iwl_mvm *mvm, in rs_switch_to_column() argument
1722 rate_idx = rs_get_best_rate(mvm, lq_sta, search_tbl, in rs_switch_to_column()
1727 IWL_DEBUG_RATE(mvm, in rs_switch_to_column()
1738 IWL_DEBUG_RATE(mvm, "Switched to column %d: Index %d\n", in rs_switch_to_column()
1748 static enum rs_action rs_get_rate_action(struct iwl_mvm *mvm, in rs_get_rate_action() argument
1758 IWL_DEBUG_RATE(mvm, in rs_get_rate_action()
1766 IWL_DEBUG_RATE(mvm, in rs_get_rate_action()
1775 IWL_DEBUG_RATE(mvm, in rs_get_rate_action()
1782 IWL_DEBUG_RATE(mvm, in rs_get_rate_action()
1791 IWL_DEBUG_RATE(mvm, in rs_get_rate_action()
1798 IWL_DEBUG_RATE(mvm, in rs_get_rate_action()
1806 IWL_DEBUG_RATE(mvm, in rs_get_rate_action()
1812 IWL_DEBUG_RATE(mvm, "Maintain rate\n"); in rs_get_rate_action()
1817 IWL_DEBUG_RATE(mvm, in rs_get_rate_action()
1821 IWL_DEBUG_RATE(mvm, in rs_get_rate_action()
1825 IWL_DEBUG_RATE(mvm, "Decrease rate\n"); in rs_get_rate_action()
1832 static bool rs_stbc_allow(struct iwl_mvm *mvm, struct ieee80211_sta *sta, in rs_stbc_allow() argument
1841 if (!iwl_mvm_bt_coex_is_mimo_allowed(mvm, sta)) in rs_stbc_allow()
1847 static void rs_get_adjacent_txp(struct iwl_mvm *mvm, int index, in rs_get_adjacent_txp() argument
1859 static bool rs_tpc_allowed(struct iwl_mvm *mvm, struct ieee80211_vif *vif, in rs_tpc_allowed() argument
1867 IWL_DEBUG_RATE(mvm, "cam: %d sta_ps_disabled %d\n", in rs_tpc_allowed()
1874 !iwl_mvm_bt_coex_is_tpc_allowed(mvm, band)) in rs_tpc_allowed()
1877 IWL_DEBUG_RATE(mvm, "check rate, table type: %d\n", rate->type); in rs_tpc_allowed()
1896 static enum tpc_action rs_get_tpc_action(struct iwl_mvm *mvm, in rs_get_tpc_action() argument
1903 IWL_DEBUG_RATE(mvm, "no current tpt. stay.\n"); in rs_get_tpc_action()
1910 IWL_DEBUG_RATE(mvm, "increase txp because of weak SR\n"); in rs_get_tpc_action()
1920 IWL_DEBUG_RATE(mvm, in rs_get_tpc_action()
1926 IWL_DEBUG_RATE(mvm, in rs_get_tpc_action()
1938 IWL_DEBUG_RATE(mvm, in rs_get_tpc_action()
1946 IWL_DEBUG_RATE(mvm, in rs_get_tpc_action()
1952 IWL_DEBUG_RATE(mvm, "no need to increase or decrease txp - stay\n"); in rs_get_tpc_action()
1956 static bool rs_tpc_perform(struct iwl_mvm *mvm, in rs_tpc_perform() argument
1976 IWL_DEBUG_RATE(mvm, "fixed tpc: %d\n", in rs_tpc_perform()
1991 if (!rs_tpc_allowed(mvm, vif, rate, band)) { in rs_tpc_perform()
1992 IWL_DEBUG_RATE(mvm, in rs_tpc_perform()
1998 rs_get_adjacent_txp(mvm, cur, &weak, &strong); in rs_tpc_perform()
2009 IWL_DEBUG_RATE(mvm, in rs_tpc_perform()
2014 action = rs_get_tpc_action(mvm, sr, weak, strong, in rs_tpc_perform()
2019 IWL_DEBUG_RATE(mvm, "already in lowest txp, stay\n"); in rs_tpc_perform()
2024 IWL_DEBUG_RATE(mvm, "already in highest txp, stay\n"); in rs_tpc_perform()
2048 static void rs_rate_scale_perform(struct iwl_mvm *mvm, in rs_rate_scale_perform() argument
2089 IWL_DEBUG_RATE(mvm, in rs_rate_scale_perform()
2093 rs_rate_scale_clear_tbl_windows(mvm, tbl); in rs_rate_scale_perform()
2103 IWL_ERR(mvm, "Current Rate is not valid\n"); in rs_rate_scale_perform()
2109 rs_update_rate_tbl(mvm, sta, lq_sta, tbl); in rs_rate_scale_perform()
2116 IWL_ERR(mvm, "tbl->expected_tpt is NULL\n"); in rs_rate_scale_perform()
2133 IWL_DEBUG_RATE(mvm, in rs_rate_scale_perform()
2154 IWL_DEBUG_RATE(mvm, in rs_rate_scale_perform()
2166 IWL_DEBUG_RATE(mvm, in rs_rate_scale_perform()
2197 high_low = rs_get_adjacent_rate(mvm, index, rate_mask, rate->type); in rs_rate_scale_perform()
2212 IWL_DEBUG_RATE(mvm, in rs_rate_scale_perform()
2217 scale_action = rs_get_rate_action(mvm, tbl, sr, low, high, in rs_rate_scale_perform()
2222 !iwl_mvm_bt_coex_is_mimo_allowed(mvm, sta)) { in rs_rate_scale_perform()
2223 IWL_DEBUG_RATE(mvm, in rs_rate_scale_perform()
2236 IWL_DEBUG_RATE(mvm, in rs_rate_scale_perform()
2247 IWL_DEBUG_RATE(mvm, in rs_rate_scale_perform()
2255 update_lq = rs_tpc_perform(mvm, sta, lq_sta, tbl); in rs_rate_scale_perform()
2266 rs_tweak_rate_tbl(mvm, sta, lq_sta, tbl, scale_action); in rs_rate_scale_perform()
2267 rs_set_amsdu_len(mvm, sta, tbl, scale_action); in rs_rate_scale_perform()
2268 rs_update_rate_tbl(mvm, sta, lq_sta, tbl); in rs_rate_scale_perform()
2287 IWL_DEBUG_RATE(mvm, in rs_rate_scale_perform()
2292 next_column = rs_get_next_column(mvm, lq_sta, sta, tbl); in rs_rate_scale_perform()
2294 int ret = rs_switch_to_column(mvm, lq_sta, sta, in rs_rate_scale_perform()
2299 IWL_DEBUG_RATE(mvm, in rs_rate_scale_perform()
2308 rs_rate_scale_clear_tbl_windows(mvm, tbl); in rs_rate_scale_perform()
2313 rs_dump_rate(mvm, &tbl->rate, in rs_rate_scale_perform()
2315 rs_update_rate_tbl(mvm, sta, lq_sta, tbl); in rs_rate_scale_perform()
2322 rs_tl_turn_on_agg(mvm, mvmsta, tid, lq_sta, sta); in rs_rate_scale_perform()
2326 rs_set_stay_in_table(mvm, is_legacy(&tbl1->rate), lq_sta); in rs_rate_scale_perform()
2404 static void rs_init_optimal_rate(struct iwl_mvm *mvm, in rs_init_optimal_rate() argument
2420 rate->sgi = rs_sgi_allow(mvm, sta, rate, NULL); in rs_init_optimal_rate()
2459 static struct rs_rate *rs_get_optimal_rate(struct iwl_mvm *mvm, in rs_get_optimal_rate() argument
2484 static void rs_get_initial_rate(struct iwl_mvm *mvm, in rs_get_initial_rate() argument
2495 u8 valid_tx_ant = iwl_mvm_get_valid_tx_ant(mvm); in rs_get_initial_rate()
2508 IWL_DEBUG_RATE(mvm, "Best ANT: %s Best RSSI: %d\n", in rs_get_initial_rate()
2567 IWL_ERR(mvm, "Invalid BW %d\n", in rs_get_initial_rate()
2596 rs_dump_rate(mvm, rate, "INITIAL"); in rs_get_initial_rate()
2600 void rs_update_last_rssi(struct iwl_mvm *mvm, in rs_update_last_rssi() argument
2635 static void rs_initialize_lq(struct iwl_mvm *mvm, in rs_initialize_lq() argument
2655 rs_get_initial_rate(mvm, sta, lq_sta, band, rate); in rs_initialize_lq()
2656 rs_init_optimal_rate(mvm, sta, lq_sta); in rs_initialize_lq()
2660 rate->ant, lq_sta->pers.chains, mvm->fw->valid_tx_ant, in rs_initialize_lq()
2661 mvm->nvm_data ? mvm->nvm_data->valid_tx_ant : ANT_INVALID); in rs_initialize_lq()
2666 rs_fill_lq_cmd(mvm, sta, lq_sta, rate); in rs_initialize_lq()
2668 iwl_mvm_send_lq_cmd(mvm, &lq_sta->lq); in rs_initialize_lq()
2676 struct iwl_mvm *mvm __maybe_unused = IWL_OP_MODE_GET_MVM(op_mode); in rs_drv_get_rate()
2703 optimal_rate = rs_get_optimal_rate(mvm, lq_sta); in rs_drv_get_rate()
2704 last_ucode_rate = ucode_rate_from_rs_rate(mvm, in rs_drv_get_rate()
2716 struct iwl_mvm *mvm = IWL_OP_MODE_GET_MVM(op_mode); in rs_drv_alloc_sta() local
2719 IWL_DEBUG_RATE(mvm, "create station rate scale window\n"); in rs_drv_alloc_sta()
2721 lq_sta->pers.drv = mvm; in rs_drv_alloc_sta()
2792 static void rs_ht_init(struct iwl_mvm *mvm, in rs_ht_init() argument
2811 if (mvm->cfg->ht_params->ldpc && in rs_ht_init()
2815 if (mvm->cfg->ht_params->stbc && in rs_ht_init()
2816 (num_of_ant(iwl_mvm_get_valid_tx_ant(mvm)) > 1) && in rs_ht_init()
2823 static void rs_vht_init(struct iwl_mvm *mvm, in rs_vht_init() argument
2830 if (mvm->cfg->ht_params->ldpc && in rs_vht_init()
2834 if (mvm->cfg->ht_params->stbc && in rs_vht_init()
2835 (num_of_ant(iwl_mvm_get_valid_tx_ant(mvm)) > 1) && in rs_vht_init()
2839 if (fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_BEAMFORMER) && in rs_vht_init()
2840 (num_of_ant(iwl_mvm_get_valid_tx_ant(mvm)) > 1) && in rs_vht_init()
2848 void iwl_mvm_reset_frame_stats(struct iwl_mvm *mvm) in iwl_mvm_reset_frame_stats() argument
2850 spin_lock_bh(&mvm->drv_stats_lock); in iwl_mvm_reset_frame_stats()
2851 memset(&mvm->drv_rx_stats, 0, sizeof(mvm->drv_rx_stats)); in iwl_mvm_reset_frame_stats()
2852 spin_unlock_bh(&mvm->drv_stats_lock); in iwl_mvm_reset_frame_stats()
2855 void iwl_mvm_update_frame_stats(struct iwl_mvm *mvm, u32 rate, bool agg) in iwl_mvm_update_frame_stats() argument
2859 spin_lock(&mvm->drv_stats_lock); in iwl_mvm_update_frame_stats()
2862 mvm->drv_rx_stats.agg_frames++; in iwl_mvm_update_frame_stats()
2864 mvm->drv_rx_stats.success_frames++; in iwl_mvm_update_frame_stats()
2868 mvm->drv_rx_stats.bw_20_frames++; in iwl_mvm_update_frame_stats()
2871 mvm->drv_rx_stats.bw_40_frames++; in iwl_mvm_update_frame_stats()
2874 mvm->drv_rx_stats.bw_80_frames++; in iwl_mvm_update_frame_stats()
2877 mvm->drv_rx_stats.bw_160_frames++; in iwl_mvm_update_frame_stats()
2884 mvm->drv_rx_stats.ht_frames++; in iwl_mvm_update_frame_stats()
2887 mvm->drv_rx_stats.vht_frames++; in iwl_mvm_update_frame_stats()
2891 mvm->drv_rx_stats.legacy_frames++; in iwl_mvm_update_frame_stats()
2895 mvm->drv_rx_stats.siso_frames++; in iwl_mvm_update_frame_stats()
2897 mvm->drv_rx_stats.mimo2_frames++; in iwl_mvm_update_frame_stats()
2900 mvm->drv_rx_stats.sgi_frames++; in iwl_mvm_update_frame_stats()
2902 mvm->drv_rx_stats.ngi_frames++; in iwl_mvm_update_frame_stats()
2904 mvm->drv_rx_stats.last_rates[mvm->drv_rx_stats.last_frame_idx] = rate; in iwl_mvm_update_frame_stats()
2905 mvm->drv_rx_stats.last_frame_idx = in iwl_mvm_update_frame_stats()
2906 (mvm->drv_rx_stats.last_frame_idx + 1) % in iwl_mvm_update_frame_stats()
2907 ARRAY_SIZE(mvm->drv_rx_stats.last_rates); in iwl_mvm_update_frame_stats()
2909 spin_unlock(&mvm->drv_stats_lock); in iwl_mvm_update_frame_stats()
2916 static void rs_drv_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta, in rs_drv_rate_init() argument
2920 struct ieee80211_hw *hw = mvm->hw; in rs_drv_rate_init()
2940 rs_rate_scale_clear_tbl_windows(mvm, &lq_sta->lq_info[j]); in rs_drv_rate_init()
2945 IWL_DEBUG_RATE(mvm, in rs_drv_rate_init()
2965 rs_ht_init(mvm, sta, lq_sta, ht_cap); in rs_drv_rate_init()
2967 rs_vht_init(mvm, sta, lq_sta, vht_cap); in rs_drv_rate_init()
2976 IWL_DEBUG_RATE(mvm, in rs_drv_rate_init()
2983 IWL_DEBUG_RATE(mvm, "MAX RATE: LEGACY=%d SISO=%d MIMO2=%d\n", in rs_drv_rate_init()
2990 iwl_mvm_bt_coex_get_single_ant_msk(mvm, iwl_mvm_get_valid_tx_ant(mvm)); in rs_drv_rate_init()
2997 iwl_mvm_reset_frame_stats(mvm); in rs_drv_rate_init()
2999 rs_initialize_lq(mvm, sta, lq_sta, band); in rs_drv_rate_init()
3009 struct iwl_mvm *mvm __maybe_unused = IWL_OP_MODE_GET_MVM(op_mode); in rs_drv_rate_update()
3019 iwl_mvm_rs_rate_init(mvm, sta, sband->band, true); in rs_drv_rate_update()
3022 static void __iwl_mvm_rs_tx_status(struct iwl_mvm *mvm, in __iwl_mvm_rs_tx_status() argument
3042 IWL_DEBUG_RATE(mvm, "Rate scaling not initialized yet.\n"); in __iwl_mvm_rs_tx_status()
3083 IWL_DEBUG_RATE(mvm, "Fixed rate 0x%x success %d attempts %d\n", in __iwl_mvm_rs_tx_status()
3092 IWL_DEBUG_RATE(mvm, "Tx idle for too long. reinit rs\n"); in __iwl_mvm_rs_tx_status()
3096 rs_drv_rate_init(mvm, sta, info->band); in __iwl_mvm_rs_tx_status()
3117 IWL_DEBUG_RATE(mvm, in __iwl_mvm_rs_tx_status()
3128 IWL_DEBUG_RATE(mvm, in __iwl_mvm_rs_tx_status()
3131 iwl_mvm_send_lq_cmd(mvm, &lq_sta->lq); in __iwl_mvm_rs_tx_status()
3149 IWL_DEBUG_RATE(mvm, in __iwl_mvm_rs_tx_status()
3152 rs_dump_rate(mvm, &tmp_tbl->rate, "ACTIVE"); in __iwl_mvm_rs_tx_status()
3154 rs_dump_rate(mvm, &tmp_tbl->rate, "SEARCH"); in __iwl_mvm_rs_tx_status()
3155 rs_dump_rate(mvm, &lq_rate, "ACTUAL"); in __iwl_mvm_rs_tx_status()
3171 rs_collect_tpc_data(mvm, lq_sta, curr_tbl, tx_resp_rate.index, in __iwl_mvm_rs_tx_status()
3192 rs_collect_tlc_data(mvm, mvmsta, tid, curr_tbl, in __iwl_mvm_rs_tx_status()
3231 rs_collect_tpc_data(mvm, lq_sta, tmp_tbl, in __iwl_mvm_rs_tx_status()
3235 rs_collect_tlc_data(mvm, mvmsta, tid, tmp_tbl, in __iwl_mvm_rs_tx_status()
3248 IWL_DEBUG_RATE(mvm, "reduced txpower: %d\n", reduced_txp); in __iwl_mvm_rs_tx_status()
3252 rs_rate_scale_perform(mvm, sta, lq_sta, tid, ndp); in __iwl_mvm_rs_tx_status()
3255 void iwl_mvm_rs_tx_status(struct iwl_mvm *mvm, struct ieee80211_sta *sta, in iwl_mvm_rs_tx_status() argument
3266 __iwl_mvm_rs_tx_status(mvm, sta, tid, info, ndp); in iwl_mvm_rs_tx_status()
3271 static void rs_build_rates_table_from_fixed(struct iwl_mvm *mvm, in rs_build_rates_table_from_fixed() argument
3300 if (!mvm->trans->trans_cfg->gen2) in rs_build_rates_table_from_fixed()
3308 static void rs_fill_rates_for_column(struct iwl_mvm *mvm, in rs_fill_rates_for_column() argument
3324 ucode_rate = cpu_to_le32(ucode_rate_from_rs_rate(mvm, in rs_fill_rates_for_column()
3363 static void rs_build_rates_table(struct iwl_mvm *mvm, in rs_build_rates_table() argument
3377 valid_tx_ant = iwl_mvm_get_valid_tx_ant(mvm); in rs_build_rates_table()
3380 if (!fw_has_api(&mvm->fw->ucode_capa, IWL_UCODE_TLV_API_LQ_SS_PARAMS) && in rs_build_rates_table()
3381 rs_stbc_allow(mvm, sta, lq_sta)) in rs_build_rates_table()
3396 rs_fill_rates_for_column(mvm, lq_sta, &rate, lq_cmd->rs_table, &index, in rs_build_rates_table()
3415 rs_fill_rates_for_column(mvm, lq_sta, &rate, lq_cmd->rs_table, &index, in rs_build_rates_table()
3424 rs_fill_rates_for_column(mvm, lq_sta, &rate, lq_cmd->rs_table, &index, in rs_build_rates_table()
3495 static void rs_set_lq_ss_params(struct iwl_mvm *mvm, in rs_set_lq_ss_params() argument
3509 if (!iwl_mvm_bt_coex_is_mimo_allowed(mvm, sta)) in rs_set_lq_ss_params()
3522 IWL_DEBUG_RATE(mvm, "Forcing single stream Tx decision %d\n", in rs_set_lq_ss_params()
3534 ieee80211_iterate_stations_atomic(mvm->hw, in rs_set_lq_ss_params()
3544 IWL_DEBUG_RATE(mvm, "No sta with BFER allowed found. Allow\n"); in rs_set_lq_ss_params()
3550 IWL_DEBUG_RATE(mvm, "Found existing sta %d with BFER activated\n", in rs_set_lq_ss_params()
3561 iwl_mvm_send_lq_cmd(mvm, bfersta_lq_cmd); in rs_set_lq_ss_params()
3564 IWL_DEBUG_RATE(mvm, in rs_set_lq_ss_params()
3572 static void rs_fill_lq_cmd(struct iwl_mvm *mvm, in rs_fill_lq_cmd() argument
3587 rs_build_rates_table_from_fixed(mvm, lq_cmd, in rs_fill_lq_cmd()
3596 rs_build_rates_table(mvm, sta, lq_sta, initial_rate); in rs_fill_lq_cmd()
3598 if (fw_has_api(&mvm->fw->ucode_capa, IWL_UCODE_TLV_API_LQ_SS_PARAMS)) in rs_fill_lq_cmd()
3599 rs_set_lq_ss_params(mvm, sta, lq_sta, initial_rate); in rs_fill_lq_cmd()
3604 if (!fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_COEX_SCHEMA_2) && in rs_fill_lq_cmd()
3622 cpu_to_le16(iwl_mvm_coex_agg_time_limit(mvm, sta)); in rs_fill_lq_cmd()
3639 struct iwl_mvm *mvm __maybe_unused = IWL_OP_MODE_GET_MVM(op_mode); in rs_free_sta()
3641 IWL_DEBUG_RATE(mvm, "enter\n"); in rs_free_sta()
3642 IWL_DEBUG_RATE(mvm, "leave\n"); in rs_free_sta()
3701 static void rs_program_fix_rate(struct iwl_mvm *mvm, in rs_program_fix_rate() argument
3708 IWL_DEBUG_RATE(mvm, "sta_id %d rate 0x%X\n", in rs_program_fix_rate()
3712 rs_fill_lq_cmd(mvm, NULL, lq_sta, NULL); in rs_program_fix_rate()
3721 struct iwl_mvm *mvm; in rs_sta_dbgfs_scale_table_write() local
3726 mvm = lq_sta->pers.drv; in rs_sta_dbgfs_scale_table_write()
3737 rs_program_fix_rate(mvm, lq_sta); in rs_sta_dbgfs_scale_table_write()
3754 struct iwl_mvm *mvm; in rs_sta_dbgfs_scale_table_read() local
3759 mvm = lq_sta->pers.drv; in rs_sta_dbgfs_scale_table_read()
3773 (iwl_mvm_get_valid_tx_ant(mvm) & ANT_A) ? "ANT_A," : "", in rs_sta_dbgfs_scale_table_read()
3774 (iwl_mvm_get_valid_tx_ant(mvm) & ANT_B) ? "ANT_B," : ""); in rs_sta_dbgfs_scale_table_read()
4009 struct iwl_mvm *mvm = lq_sta->pers.drv; in iwl_dbgfs_ss_force_write() local
4020 IWL_ERR(mvm, in iwl_dbgfs_ss_force_write()
4028 IWL_ERR(mvm, in iwl_dbgfs_ss_force_write()
4033 IWL_ERR(mvm, "valid values none|siso|stbc|bfer\n"); in iwl_dbgfs_ss_force_write()
4048 static void rs_drv_add_sta_debugfs(void *mvm, void *priv_sta, in rs_drv_add_sta_debugfs() argument
4103 void iwl_mvm_rs_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta, in iwl_mvm_rs_rate_init() argument
4106 if (iwl_mvm_has_tlc_offload(mvm)) { in iwl_mvm_rs_rate_init()
4107 rs_fw_rate_init(mvm, sta, band, update); in iwl_mvm_rs_rate_init()
4112 rs_drv_rate_init(mvm, sta, band); in iwl_mvm_rs_rate_init()
4127 static int rs_drv_tx_protection(struct iwl_mvm *mvm, struct iwl_mvm_sta *mvmsta, in rs_drv_tx_protection() argument
4132 lockdep_assert_held(&mvm->mutex); in rs_drv_tx_protection()
4144 return iwl_mvm_send_lq_cmd(mvm, lq); in rs_drv_tx_protection()
4153 int iwl_mvm_tx_protection(struct iwl_mvm *mvm, struct iwl_mvm_sta *mvmsta, in iwl_mvm_tx_protection() argument
4156 if (iwl_mvm_has_tlc_offload(mvm)) in iwl_mvm_tx_protection()
4157 return rs_fw_tx_protection(mvm, mvmsta, enable); in iwl_mvm_tx_protection()
4159 return rs_drv_tx_protection(mvm, mvmsta, enable); in iwl_mvm_tx_protection()