Lines Matching refs:mi
223 minstrel_ht_update_rates(struct minstrel_priv *mp, struct minstrel_ht_sta *mi);
285 minstrel_ht_get_stats(struct minstrel_priv *mp, struct minstrel_ht_sta *mi, in minstrel_ht_get_stats() argument
304 if (!(mi->groups[group].supported & BIT(idx))) in minstrel_ht_get_stats()
307 return &mi->groups[group].rates[idx]; in minstrel_ht_get_stats()
311 minstrel_get_ratestats(struct minstrel_ht_sta *mi, int index) in minstrel_get_ratestats() argument
313 return &mi->groups[index / MCS_GROUP_RATES].rates[index % MCS_GROUP_RATES]; in minstrel_get_ratestats()
321 minstrel_ht_get_tp_avg(struct minstrel_ht_sta *mi, int group, int rate, in minstrel_ht_get_tp_avg() argument
331 nsecs = 1000 * mi->overhead / MINSTREL_TRUNC(mi->avg_ampdu_len); in minstrel_ht_get_tp_avg()
355 minstrel_ht_sort_best_tp_rates(struct minstrel_ht_sta *mi, u16 index, in minstrel_ht_sort_best_tp_rates() argument
364 cur_prob = mi->groups[cur_group].rates[cur_idx].prob_ewma; in minstrel_ht_sort_best_tp_rates()
365 cur_tp_avg = minstrel_ht_get_tp_avg(mi, cur_group, cur_idx, cur_prob); in minstrel_ht_sort_best_tp_rates()
370 tmp_prob = mi->groups[tmp_group].rates[tmp_idx].prob_ewma; in minstrel_ht_sort_best_tp_rates()
371 tmp_tp_avg = minstrel_ht_get_tp_avg(mi, tmp_group, tmp_idx, in minstrel_ht_sort_best_tp_rates()
391 minstrel_ht_set_best_prob_rate(struct minstrel_ht_sta *mi, u16 index) in minstrel_ht_set_best_prob_rate() argument
402 mg = &mi->groups[index / MCS_GROUP_RATES]; in minstrel_ht_set_best_prob_rate()
405 tmp_group = mi->max_prob_rate / MCS_GROUP_RATES; in minstrel_ht_set_best_prob_rate()
406 tmp_idx = mi->max_prob_rate % MCS_GROUP_RATES; in minstrel_ht_set_best_prob_rate()
407 tmp_prob = mi->groups[tmp_group].rates[tmp_idx].prob_ewma; in minstrel_ht_set_best_prob_rate()
408 tmp_tp_avg = minstrel_ht_get_tp_avg(mi, tmp_group, tmp_idx, tmp_prob); in minstrel_ht_set_best_prob_rate()
412 max_tp_group = mi->max_tp_rate[0] / MCS_GROUP_RATES; in minstrel_ht_set_best_prob_rate()
418 cur_tp_avg = minstrel_ht_get_tp_avg(mi, cur_group, cur_idx, in minstrel_ht_set_best_prob_rate()
421 mi->max_prob_rate = index; in minstrel_ht_set_best_prob_rate()
425 max_gpr_prob = mi->groups[max_gpr_group].rates[max_gpr_idx].prob_ewma; in minstrel_ht_set_best_prob_rate()
426 max_gpr_tp_avg = minstrel_ht_get_tp_avg(mi, max_gpr_group, in minstrel_ht_set_best_prob_rate()
433 mi->max_prob_rate = index; in minstrel_ht_set_best_prob_rate()
447 minstrel_ht_assign_best_tp_rates(struct minstrel_ht_sta *mi, in minstrel_ht_assign_best_tp_rates() argument
456 tmp_prob = mi->groups[tmp_group].rates[tmp_idx].prob_ewma; in minstrel_ht_assign_best_tp_rates()
457 tmp_cck_tp = minstrel_ht_get_tp_avg(mi, tmp_group, tmp_idx, tmp_prob); in minstrel_ht_assign_best_tp_rates()
461 tmp_prob = mi->groups[tmp_group].rates[tmp_idx].prob_ewma; in minstrel_ht_assign_best_tp_rates()
462 tmp_mcs_tp = minstrel_ht_get_tp_avg(mi, tmp_group, tmp_idx, tmp_prob); in minstrel_ht_assign_best_tp_rates()
466 minstrel_ht_sort_best_tp_rates(mi, tmp_cck_tp_rate[i], in minstrel_ht_assign_best_tp_rates()
478 minstrel_ht_prob_rate_reduce_streams(struct minstrel_ht_sta *mi) in minstrel_ht_prob_rate_reduce_streams() argument
484 tmp_max_streams = minstrel_mcs_groups[mi->max_tp_rate[0] / in minstrel_ht_prob_rate_reduce_streams()
487 mg = &mi->groups[group]; in minstrel_ht_prob_rate_reduce_streams()
492 tmp_prob = mi->groups[group].rates[tmp_idx].prob_ewma; in minstrel_ht_prob_rate_reduce_streams()
494 if (tmp_tp < minstrel_ht_get_tp_avg(mi, group, tmp_idx, tmp_prob) && in minstrel_ht_prob_rate_reduce_streams()
496 mi->max_prob_rate = mg->max_group_prob_rate; in minstrel_ht_prob_rate_reduce_streams()
497 tmp_tp = minstrel_ht_get_tp_avg(mi, group, in minstrel_ht_prob_rate_reduce_streams()
514 minstrel_ht_update_stats(struct minstrel_priv *mp, struct minstrel_ht_sta *mi) in minstrel_ht_update_stats() argument
522 if (mi->ampdu_packets > 0) { in minstrel_ht_update_stats()
523 mi->avg_ampdu_len = minstrel_ewma(mi->avg_ampdu_len, in minstrel_ht_update_stats()
524 MINSTREL_FRAC(mi->ampdu_len, mi->ampdu_packets), EWMA_LEVEL); in minstrel_ht_update_stats()
525 mi->ampdu_len = 0; in minstrel_ht_update_stats()
526 mi->ampdu_packets = 0; in minstrel_ht_update_stats()
529 mi->sample_slow = 0; in minstrel_ht_update_stats()
530 mi->sample_count = 0; in minstrel_ht_update_stats()
541 mg = &mi->groups[group]; in minstrel_ht_update_stats()
545 mi->sample_count++; in minstrel_ht_update_stats()
562 if (minstrel_ht_get_tp_avg(mi, group, i, cur_prob) == 0) in minstrel_ht_update_stats()
567 minstrel_ht_sort_best_tp_rates(mi, index, in minstrel_ht_update_stats()
570 minstrel_ht_sort_best_tp_rates(mi, index, in minstrel_ht_update_stats()
575 minstrel_ht_sort_best_tp_rates(mi, index, in minstrel_ht_update_stats()
579 minstrel_ht_set_best_prob_rate(mi, index); in minstrel_ht_update_stats()
587 minstrel_ht_assign_best_tp_rates(mi, tmp_mcs_tp_rate, tmp_cck_tp_rate); in minstrel_ht_update_stats()
588 memcpy(mi->max_tp_rate, tmp_mcs_tp_rate, sizeof(mi->max_tp_rate)); in minstrel_ht_update_stats()
591 minstrel_ht_prob_rate_reduce_streams(mi); in minstrel_ht_update_stats()
594 mi->sample_count *= 8; in minstrel_ht_update_stats()
600 mi->max_tp_rate[i] = mp->fixed_rate_idx; in minstrel_ht_update_stats()
601 mi->max_prob_rate = mp->fixed_rate_idx; in minstrel_ht_update_stats()
606 mi->last_stats_update = jiffies; in minstrel_ht_update_stats()
629 minstrel_set_next_sample_idx(struct minstrel_ht_sta *mi) in minstrel_set_next_sample_idx() argument
634 mi->sample_group++; in minstrel_set_next_sample_idx()
635 mi->sample_group %= ARRAY_SIZE(minstrel_mcs_groups); in minstrel_set_next_sample_idx()
636 mg = &mi->groups[mi->sample_group]; in minstrel_set_next_sample_idx()
651 minstrel_downgrade_rate(struct minstrel_ht_sta *mi, u16 *idx, bool primary) in minstrel_downgrade_rate() argument
659 if (!mi->groups[group].supported) in minstrel_downgrade_rate()
667 *idx = mi->groups[group].max_group_tp_rate[0]; in minstrel_downgrade_rate()
669 *idx = mi->groups[group].max_group_tp_rate[1]; in minstrel_downgrade_rate()
703 struct minstrel_ht_sta *mi = &msp->ht; in minstrel_ht_tx_status() local
725 mi->ampdu_packets++; in minstrel_ht_tx_status()
726 mi->ampdu_len += info->status.ampdu_len; in minstrel_ht_tx_status()
728 if (!mi->sample_wait && !mi->sample_tries && mi->sample_count > 0) { in minstrel_ht_tx_status()
729 mi->sample_wait = 16 + 2 * MINSTREL_TRUNC(mi->avg_ampdu_len); in minstrel_ht_tx_status()
730 mi->sample_tries = 1; in minstrel_ht_tx_status()
731 mi->sample_count--; in minstrel_ht_tx_status()
735 mi->sample_packets += info->status.ampdu_len; in minstrel_ht_tx_status()
742 rate = minstrel_ht_get_stats(mp, mi, &ar[i]); in minstrel_ht_tx_status()
754 rate = minstrel_get_ratestats(mi, mi->max_tp_rate[0]); in minstrel_ht_tx_status()
758 minstrel_downgrade_rate(mi, &mi->max_tp_rate[0], true); in minstrel_ht_tx_status()
762 rate2 = minstrel_get_ratestats(mi, mi->max_tp_rate[1]); in minstrel_ht_tx_status()
766 minstrel_downgrade_rate(mi, &mi->max_tp_rate[1], false); in minstrel_ht_tx_status()
770 if (time_after(jiffies, mi->last_stats_update + in minstrel_ht_tx_status()
773 minstrel_ht_update_stats(mp, mi); in minstrel_ht_tx_status()
777 minstrel_ht_update_rates(mp, mi); in minstrel_ht_tx_status()
781 minstrel_calc_retransmit(struct minstrel_priv *mp, struct minstrel_ht_sta *mi, in minstrel_calc_retransmit() argument
790 unsigned int ampdu_len = MINSTREL_TRUNC(mi->avg_ampdu_len); in minstrel_calc_retransmit()
793 mrs = minstrel_get_ratestats(mi, index); in minstrel_calc_retransmit()
814 overhead = mi->overhead; in minstrel_calc_retransmit()
815 overhead_rtscts = mi->overhead_rtscts; in minstrel_calc_retransmit()
840 minstrel_ht_set_rate(struct minstrel_priv *mp, struct minstrel_ht_sta *mi, in minstrel_ht_set_rate() argument
848 mrs = minstrel_get_ratestats(mi, index); in minstrel_ht_set_rate()
850 minstrel_calc_retransmit(mp, mi, index); in minstrel_ht_set_rate()
875 (mi->sta->smps_mode == IEEE80211_SMPS_DYNAMIC && in minstrel_ht_set_rate()
886 minstrel_ht_update_rates(struct minstrel_priv *mp, struct minstrel_ht_sta *mi) in minstrel_ht_update_rates() argument
896 minstrel_ht_set_rate(mp, mi, rates, i++, mi->max_tp_rate[0]); in minstrel_ht_update_rates()
900 minstrel_ht_set_rate(mp, mi, rates, i++, mi->max_tp_rate[1]); in minstrel_ht_update_rates()
906 minstrel_ht_set_rate(mp, mi, rates, i++, mi->max_prob_rate); in minstrel_ht_update_rates()
910 rate_control_set_rates(mp->hw, mi->sta, rates); in minstrel_ht_update_rates()
921 minstrel_get_sample_rate(struct minstrel_priv *mp, struct minstrel_ht_sta *mi) in minstrel_get_sample_rate() argument
928 if (mi->sample_wait > 0) { in minstrel_get_sample_rate()
929 mi->sample_wait--; in minstrel_get_sample_rate()
933 if (!mi->sample_tries) in minstrel_get_sample_rate()
936 sample_group = mi->sample_group; in minstrel_get_sample_rate()
937 mg = &mi->groups[sample_group]; in minstrel_get_sample_rate()
939 minstrel_set_next_sample_idx(mi); in minstrel_get_sample_rate()
952 if (sample_idx == mi->max_tp_rate[0] || in minstrel_get_sample_rate()
953 sample_idx == mi->max_tp_rate[1] || in minstrel_get_sample_rate()
954 sample_idx == mi->max_prob_rate) in minstrel_get_sample_rate()
969 cur_max_tp_streams = minstrel_mcs_groups[mi->max_tp_rate[0] / in minstrel_get_sample_rate()
972 if (sample_dur >= minstrel_get_duration(mi->max_tp_rate[1]) && in minstrel_get_sample_rate()
975 sample_dur >= minstrel_get_duration(mi->max_prob_rate))) { in minstrel_get_sample_rate()
979 if (mi->sample_slow++ > 2) in minstrel_get_sample_rate()
982 mi->sample_tries--; in minstrel_get_sample_rate()
989 struct minstrel_ht_sta *mi, bool val) in minstrel_ht_check_cck_shortpreamble() argument
991 u8 supported = mi->groups[MINSTREL_CCK_GROUP].supported; in minstrel_ht_check_cck_shortpreamble()
993 if (!supported || !mi->cck_supported_short) in minstrel_ht_check_cck_shortpreamble()
996 if (supported & (mi->cck_supported_short << (val * 4))) in minstrel_ht_check_cck_shortpreamble()
999 supported ^= mi->cck_supported_short | (mi->cck_supported_short << 4); in minstrel_ht_check_cck_shortpreamble()
1000 mi->groups[MINSTREL_CCK_GROUP].supported = supported; in minstrel_ht_check_cck_shortpreamble()
1011 struct minstrel_ht_sta *mi = &msp->ht; in minstrel_ht_get_rate() local
1022 mi->max_prob_rate / MCS_GROUP_RATES != MINSTREL_CCK_GROUP) in minstrel_ht_get_rate()
1025 info->flags |= mi->tx_flags; in minstrel_ht_get_rate()
1026 minstrel_ht_check_cck_shortpreamble(mp, mi, txrc->short_preamble); in minstrel_ht_get_rate()
1038 sample_idx = minstrel_get_sample_rate(mp, mi); in minstrel_ht_get_rate()
1040 mi->total_packets++; in minstrel_ht_get_rate()
1043 if (mi->total_packets == ~0) { in minstrel_ht_get_rate()
1044 mi->total_packets = 0; in minstrel_ht_get_rate()
1045 mi->sample_packets = 0; in minstrel_ht_get_rate()
1070 minstrel_ht_update_cck(struct minstrel_priv *mp, struct minstrel_ht_sta *mi, in minstrel_ht_update_cck() argument
1082 mi->cck_supported = 0; in minstrel_ht_update_cck()
1083 mi->cck_supported_short = 0; in minstrel_ht_update_cck()
1088 mi->cck_supported |= BIT(i); in minstrel_ht_update_cck()
1090 mi->cck_supported_short |= BIT(i); in minstrel_ht_update_cck()
1093 mi->groups[MINSTREL_CCK_GROUP].supported = mi->cck_supported; in minstrel_ht_update_cck()
1103 struct minstrel_ht_sta *mi = &msp->ht; in minstrel_ht_update_caps() local
1127 memset(mi, 0, sizeof(*mi)); in minstrel_ht_update_caps()
1129 mi->sta = sta; in minstrel_ht_update_caps()
1130 mi->last_stats_update = jiffies; in minstrel_ht_update_caps()
1133 mi->overhead = ieee80211_frame_duration(sband->band, 0, 60, 1, 1, 0); in minstrel_ht_update_caps()
1134 mi->overhead += ack_dur; in minstrel_ht_update_caps()
1135 mi->overhead_rtscts = mi->overhead + 2 * ack_dur; in minstrel_ht_update_caps()
1137 mi->avg_ampdu_len = MINSTREL_FRAC(1, 1); in minstrel_ht_update_caps()
1141 mi->sample_count = 16; in minstrel_ht_update_caps()
1142 mi->sample_wait = 0; in minstrel_ht_update_caps()
1144 mi->sample_count = 8; in minstrel_ht_update_caps()
1145 mi->sample_wait = 8; in minstrel_ht_update_caps()
1147 mi->sample_tries = 4; in minstrel_ht_update_caps()
1153 mi->tx_flags |= stbc << IEEE80211_TX_CTL_STBC_SHIFT; in minstrel_ht_update_caps()
1156 mi->tx_flags |= IEEE80211_TX_CTL_LDPC; in minstrel_ht_update_caps()
1159 for (i = 0; i < ARRAY_SIZE(mi->groups); i++) { in minstrel_ht_update_caps()
1163 mi->groups[i].supported = 0; in minstrel_ht_update_caps()
1165 minstrel_ht_update_cck(mp, mi, sband, sta); in minstrel_ht_update_caps()
1195 mi->groups[i].supported = mcs->rx_mask[nss - 1]; in minstrel_ht_update_caps()
1196 if (mi->groups[i].supported) in minstrel_ht_update_caps()
1222 mi->groups[i].supported = minstrel_get_valid_vht_rates(bw, nss, in minstrel_ht_update_caps()
1225 if (mi->groups[i].supported) in minstrel_ht_update_caps()
1233 minstrel_ht_update_stats(mp, mi); in minstrel_ht_update_caps()
1234 minstrel_ht_update_rates(mp, mi); in minstrel_ht_update_caps()
1326 struct minstrel_ht_sta *mi = &msp->ht; in minstrel_ht_get_expected_throughput() local
1332 i = mi->max_tp_rate[0] / MCS_GROUP_RATES; in minstrel_ht_get_expected_throughput()
1333 j = mi->max_tp_rate[0] % MCS_GROUP_RATES; in minstrel_ht_get_expected_throughput()
1334 prob = mi->groups[i].rates[j].prob_ewma; in minstrel_ht_get_expected_throughput()
1337 tp_avg = minstrel_ht_get_tp_avg(mi, i, j, prob) * 10; in minstrel_ht_get_expected_throughput()