Lines Matching full:mi
241 minstrel_ht_update_rates(struct minstrel_priv *mp, struct minstrel_ht_sta *mi);
303 minstrel_ht_get_stats(struct minstrel_priv *mp, struct minstrel_ht_sta *mi, in minstrel_ht_get_stats() argument
322 if ((mi->supported[group] & BIT(idx + 4)) && in minstrel_ht_get_stats()
326 return &mi->groups[group].rates[idx]; in minstrel_ht_get_stats()
330 minstrel_get_ratestats(struct minstrel_ht_sta *mi, int index) in minstrel_get_ratestats() argument
332 return &mi->groups[index / MCS_GROUP_RATES].rates[index % MCS_GROUP_RATES]; in minstrel_get_ratestats()
336 minstrel_ht_avg_ampdu_len(struct minstrel_ht_sta *mi) in minstrel_ht_avg_ampdu_len() argument
338 if (!mi->avg_ampdu_len) in minstrel_ht_avg_ampdu_len()
341 return MINSTREL_TRUNC(mi->avg_ampdu_len); in minstrel_ht_avg_ampdu_len()
349 minstrel_ht_get_tp_avg(struct minstrel_ht_sta *mi, int group, int rate, in minstrel_ht_get_tp_avg() argument
359 nsecs = 1000 * mi->overhead / minstrel_ht_avg_ampdu_len(mi); in minstrel_ht_get_tp_avg()
384 minstrel_ht_sort_best_tp_rates(struct minstrel_ht_sta *mi, u16 index, in minstrel_ht_sort_best_tp_rates() argument
393 cur_prob = mi->groups[cur_group].rates[cur_idx].prob_avg; in minstrel_ht_sort_best_tp_rates()
394 cur_tp_avg = minstrel_ht_get_tp_avg(mi, cur_group, cur_idx, cur_prob); in minstrel_ht_sort_best_tp_rates()
399 tmp_prob = mi->groups[tmp_group].rates[tmp_idx].prob_avg; in minstrel_ht_sort_best_tp_rates()
400 tmp_tp_avg = minstrel_ht_get_tp_avg(mi, tmp_group, tmp_idx, in minstrel_ht_sort_best_tp_rates()
420 minstrel_ht_set_best_prob_rate(struct minstrel_ht_sta *mi, u16 index) in minstrel_ht_set_best_prob_rate() argument
431 mg = &mi->groups[index / MCS_GROUP_RATES]; in minstrel_ht_set_best_prob_rate()
434 tmp_group = mi->max_prob_rate / MCS_GROUP_RATES; in minstrel_ht_set_best_prob_rate()
435 tmp_idx = mi->max_prob_rate % MCS_GROUP_RATES; in minstrel_ht_set_best_prob_rate()
436 tmp_prob = mi->groups[tmp_group].rates[tmp_idx].prob_avg; in minstrel_ht_set_best_prob_rate()
437 tmp_tp_avg = minstrel_ht_get_tp_avg(mi, tmp_group, tmp_idx, tmp_prob); in minstrel_ht_set_best_prob_rate()
441 max_tp_group = mi->max_tp_rate[0] / MCS_GROUP_RATES; in minstrel_ht_set_best_prob_rate()
448 max_gpr_prob = mi->groups[max_gpr_group].rates[max_gpr_idx].prob_avg; in minstrel_ht_set_best_prob_rate()
451 cur_tp_avg = minstrel_ht_get_tp_avg(mi, cur_group, cur_idx, in minstrel_ht_set_best_prob_rate()
454 mi->max_prob_rate = index; in minstrel_ht_set_best_prob_rate()
456 max_gpr_tp_avg = minstrel_ht_get_tp_avg(mi, max_gpr_group, in minstrel_ht_set_best_prob_rate()
463 mi->max_prob_rate = index; in minstrel_ht_set_best_prob_rate()
477 minstrel_ht_assign_best_tp_rates(struct minstrel_ht_sta *mi, in minstrel_ht_assign_best_tp_rates() argument
486 tmp_prob = mi->groups[tmp_group].rates[tmp_idx].prob_avg; in minstrel_ht_assign_best_tp_rates()
487 tmp_cck_tp = minstrel_ht_get_tp_avg(mi, tmp_group, tmp_idx, tmp_prob); in minstrel_ht_assign_best_tp_rates()
491 tmp_prob = mi->groups[tmp_group].rates[tmp_idx].prob_avg; in minstrel_ht_assign_best_tp_rates()
492 tmp_mcs_tp = minstrel_ht_get_tp_avg(mi, tmp_group, tmp_idx, tmp_prob); in minstrel_ht_assign_best_tp_rates()
496 minstrel_ht_sort_best_tp_rates(mi, tmp_cck_tp_rate[i], in minstrel_ht_assign_best_tp_rates()
508 minstrel_ht_prob_rate_reduce_streams(struct minstrel_ht_sta *mi) in minstrel_ht_prob_rate_reduce_streams() argument
514 tmp_max_streams = minstrel_mcs_groups[mi->max_tp_rate[0] / in minstrel_ht_prob_rate_reduce_streams()
517 mg = &mi->groups[group]; in minstrel_ht_prob_rate_reduce_streams()
518 if (!mi->supported[group] || group == MINSTREL_CCK_GROUP) in minstrel_ht_prob_rate_reduce_streams()
522 tmp_prob = mi->groups[group].rates[tmp_idx].prob_avg; in minstrel_ht_prob_rate_reduce_streams()
524 if (tmp_tp < minstrel_ht_get_tp_avg(mi, group, tmp_idx, tmp_prob) && in minstrel_ht_prob_rate_reduce_streams()
526 mi->max_prob_rate = mg->max_group_prob_rate; in minstrel_ht_prob_rate_reduce_streams()
527 tmp_tp = minstrel_ht_get_tp_avg(mi, group, in minstrel_ht_prob_rate_reduce_streams()
543 minstrel_ht_probe_group(struct minstrel_ht_sta *mi, const struct mcs_group *tp_group, in minstrel_ht_probe_group() argument
559 minstrel_ht_find_probe_rates(struct minstrel_ht_sta *mi, u16 *rates, int *n_rates, in minstrel_ht_find_probe_rates() argument
566 tp_group = &minstrel_mcs_groups[mi->max_tp_rate[0] / MCS_GROUP_RATES]; in minstrel_ht_find_probe_rates()
567 tp_idx = mi->max_tp_rate[0] % MCS_GROUP_RATES; in minstrel_ht_find_probe_rates()
569 max_dur = minstrel_get_duration(mi->max_tp_rate[0]); in minstrel_ht_find_probe_rates()
574 u16 supported = mi->supported[g]; in minstrel_ht_find_probe_rates()
580 if (!minstrel_ht_probe_group(mi, tp_group, tp_idx, group)) in minstrel_ht_find_probe_rates()
593 if (idx == mi->max_tp_rate[0]) in minstrel_ht_find_probe_rates()
604 struct minstrel_ht_sta *mi) in minstrel_ht_rate_sample_switch() argument
626 mrs = minstrel_get_ratestats(mi, mi->max_tp_rate[0]); in minstrel_ht_rate_sample_switch()
628 minstrel_ht_find_probe_rates(mi, rates, &n_rates, faster_rate); in minstrel_ht_rate_sample_switch()
630 minstrel_ht_find_probe_rates(mi, rates, &n_rates, false); in minstrel_ht_rate_sample_switch()
634 int g_idx = mi->max_tp_rate[0] / MCS_GROUP_RATES; in minstrel_ht_rate_sample_switch()
635 u16 supported = mi->supported[g_idx]; in minstrel_ht_rate_sample_switch()
637 supported >>= mi->max_tp_rate[0] % MCS_GROUP_RATES; in minstrel_ht_rate_sample_switch()
642 probe_rate = mi->max_tp_rate[0] + i; in minstrel_ht_rate_sample_switch()
657 mi->sample_rate = probe_rate; in minstrel_ht_rate_sample_switch()
658 mi->sample_mode = MINSTREL_SAMPLE_ACTIVE; in minstrel_ht_rate_sample_switch()
671 minstrel_ht_update_stats(struct minstrel_priv *mp, struct minstrel_ht_sta *mi, in minstrel_ht_update_stats() argument
680 mi->sample_mode = MINSTREL_SAMPLE_IDLE; in minstrel_ht_update_stats()
683 mi->total_packets_cur = mi->total_packets - in minstrel_ht_update_stats()
684 mi->total_packets_last; in minstrel_ht_update_stats()
685 mi->total_packets_last = mi->total_packets; in minstrel_ht_update_stats()
689 if (mi->total_packets_cur < SAMPLE_SWITCH_THR && mp->sample_switch != 1) in minstrel_ht_update_stats()
692 if (mi->ampdu_packets > 0) { in minstrel_ht_update_stats()
694 mi->avg_ampdu_len = minstrel_ewma(mi->avg_ampdu_len, in minstrel_ht_update_stats()
695 MINSTREL_FRAC(mi->ampdu_len, mi->ampdu_packets), in minstrel_ht_update_stats()
698 mi->avg_ampdu_len = 0; in minstrel_ht_update_stats()
699 mi->ampdu_len = 0; in minstrel_ht_update_stats()
700 mi->ampdu_packets = 0; in minstrel_ht_update_stats()
703 mi->sample_slow = 0; in minstrel_ht_update_stats()
704 mi->sample_count = 0; in minstrel_ht_update_stats()
708 if (mi->supported[MINSTREL_CCK_GROUP]) in minstrel_ht_update_stats()
712 if (mi->supported[MINSTREL_VHT_GROUP_0]) in minstrel_ht_update_stats()
723 mg = &mi->groups[group]; in minstrel_ht_update_stats()
724 if (!mi->supported[group]) in minstrel_ht_update_stats()
727 mi->sample_count++; in minstrel_ht_update_stats()
734 if (!(mi->supported[group] & BIT(i))) in minstrel_ht_update_stats()
744 if (minstrel_ht_get_tp_avg(mi, group, i, cur_prob) == 0) in minstrel_ht_update_stats()
749 minstrel_ht_sort_best_tp_rates(mi, index, in minstrel_ht_update_stats()
752 minstrel_ht_sort_best_tp_rates(mi, index, in minstrel_ht_update_stats()
757 minstrel_ht_sort_best_tp_rates(mi, index, in minstrel_ht_update_stats()
761 minstrel_ht_set_best_prob_rate(mi, index); in minstrel_ht_update_stats()
769 minstrel_ht_assign_best_tp_rates(mi, tmp_mcs_tp_rate, tmp_cck_tp_rate); in minstrel_ht_update_stats()
770 memcpy(mi->max_tp_rate, tmp_mcs_tp_rate, sizeof(mi->max_tp_rate)); in minstrel_ht_update_stats()
773 minstrel_ht_prob_rate_reduce_streams(mi); in minstrel_ht_update_stats()
776 mi->sample_count *= 8; in minstrel_ht_update_stats()
778 mi->sample_count /= 2; in minstrel_ht_update_stats()
781 minstrel_ht_rate_sample_switch(mp, mi); in minstrel_ht_update_stats()
787 mi->max_tp_rate[i] = mp->fixed_rate_idx; in minstrel_ht_update_stats()
788 mi->max_prob_rate = mp->fixed_rate_idx; in minstrel_ht_update_stats()
789 mi->sample_mode = MINSTREL_SAMPLE_IDLE; in minstrel_ht_update_stats()
794 mi->last_stats_update = jiffies; in minstrel_ht_update_stats()
817 minstrel_set_next_sample_idx(struct minstrel_ht_sta *mi) in minstrel_set_next_sample_idx() argument
822 mi->sample_group++; in minstrel_set_next_sample_idx()
823 mi->sample_group %= ARRAY_SIZE(minstrel_mcs_groups); in minstrel_set_next_sample_idx()
824 mg = &mi->groups[mi->sample_group]; in minstrel_set_next_sample_idx()
826 if (!mi->supported[mi->sample_group]) in minstrel_set_next_sample_idx()
839 minstrel_downgrade_rate(struct minstrel_ht_sta *mi, u16 *idx, bool primary) in minstrel_downgrade_rate() argument
847 if (!mi->supported[group]) in minstrel_downgrade_rate()
855 *idx = mi->groups[group].max_group_tp_rate[0]; in minstrel_downgrade_rate()
857 *idx = mi->groups[group].max_group_tp_rate[1]; in minstrel_downgrade_rate()
891 struct minstrel_ht_sta *mi = &msp->ht; in minstrel_ht_tx_status() local
916 mi->ampdu_packets++; in minstrel_ht_tx_status()
917 mi->ampdu_len += info->status.ampdu_len; in minstrel_ht_tx_status()
919 if (!mi->sample_wait && !mi->sample_tries && mi->sample_count > 0) { in minstrel_ht_tx_status()
920 int avg_ampdu_len = minstrel_ht_avg_ampdu_len(mi); in minstrel_ht_tx_status()
922 mi->sample_wait = 16 + 2 * avg_ampdu_len; in minstrel_ht_tx_status()
923 mi->sample_tries = 1; in minstrel_ht_tx_status()
924 mi->sample_count--; in minstrel_ht_tx_status()
928 mi->sample_packets += info->status.ampdu_len; in minstrel_ht_tx_status()
930 if (mi->sample_mode != MINSTREL_SAMPLE_IDLE) in minstrel_ht_tx_status()
931 rate_sample = minstrel_get_ratestats(mi, mi->sample_rate); in minstrel_ht_tx_status()
938 rate = minstrel_ht_get_stats(mp, mi, &ar[i]); in minstrel_ht_tx_status()
948 switch (mi->sample_mode) { in minstrel_ht_tx_status()
952 mi->total_packets_cur < SAMPLE_SWITCH_THR)) in minstrel_ht_tx_status()
960 mi->sample_mode = MINSTREL_SAMPLE_PENDING; in minstrel_ht_tx_status()
969 minstrel_ht_update_stats(mp, mi, false); in minstrel_ht_tx_status()
979 rate = minstrel_get_ratestats(mi, mi->max_tp_rate[0]); in minstrel_ht_tx_status()
982 minstrel_downgrade_rate(mi, &mi->max_tp_rate[0], true); in minstrel_ht_tx_status()
986 rate2 = minstrel_get_ratestats(mi, mi->max_tp_rate[1]); in minstrel_ht_tx_status()
989 minstrel_downgrade_rate(mi, &mi->max_tp_rate[1], false); in minstrel_ht_tx_status()
994 if (time_after(jiffies, mi->last_stats_update + update_interval)) { in minstrel_ht_tx_status()
996 minstrel_ht_update_stats(mp, mi, true); in minstrel_ht_tx_status()
1000 minstrel_ht_update_rates(mp, mi); in minstrel_ht_tx_status()
1004 minstrel_calc_retransmit(struct minstrel_priv *mp, struct minstrel_ht_sta *mi, in minstrel_calc_retransmit() argument
1012 unsigned int ampdu_len = minstrel_ht_avg_ampdu_len(mi); in minstrel_calc_retransmit()
1015 mrs = minstrel_get_ratestats(mi, index); in minstrel_calc_retransmit()
1035 overhead = mi->overhead; in minstrel_calc_retransmit()
1036 overhead_rtscts = mi->overhead_rtscts; in minstrel_calc_retransmit()
1061 minstrel_ht_set_rate(struct minstrel_priv *mp, struct minstrel_ht_sta *mi, in minstrel_ht_set_rate() argument
1069 mrs = minstrel_get_ratestats(mi, index); in minstrel_ht_set_rate()
1071 minstrel_calc_retransmit(mp, mi, index); in minstrel_ht_set_rate()
1096 (mi->sta->smps_mode == IEEE80211_SMPS_DYNAMIC && in minstrel_ht_set_rate()
1107 minstrel_ht_get_prob_avg(struct minstrel_ht_sta *mi, int rate) in minstrel_ht_get_prob_avg() argument
1111 return mi->groups[group].rates[rate].prob_avg; in minstrel_ht_get_prob_avg()
1115 minstrel_ht_get_max_amsdu_len(struct minstrel_ht_sta *mi) in minstrel_ht_get_max_amsdu_len() argument
1117 int group = mi->max_prob_rate / MCS_GROUP_RATES; in minstrel_ht_get_max_amsdu_len()
1119 int rate = mi->max_prob_rate % MCS_GROUP_RATES; in minstrel_ht_get_max_amsdu_len()
1123 if (mi->groups[group].rates[rate].prob_avg < MINSTREL_FRAC(50, 100)) in minstrel_ht_get_max_amsdu_len()
1146 (minstrel_ht_get_prob_avg(mi, mi->max_tp_rate[0]) < in minstrel_ht_get_max_amsdu_len()
1156 if (!mi->sta->vht_cap.vht_supported) in minstrel_ht_get_max_amsdu_len()
1164 minstrel_ht_update_rates(struct minstrel_priv *mp, struct minstrel_ht_sta *mi) in minstrel_ht_update_rates() argument
1167 u16 first_rate = mi->max_tp_rate[0]; in minstrel_ht_update_rates()
1170 if (mi->sample_mode == MINSTREL_SAMPLE_ACTIVE) in minstrel_ht_update_rates()
1171 first_rate = mi->sample_rate; in minstrel_ht_update_rates()
1178 minstrel_ht_set_rate(mp, mi, rates, i++, first_rate); in minstrel_ht_update_rates()
1182 minstrel_ht_set_rate(mp, mi, rates, i++, mi->max_tp_rate[1]); in minstrel_ht_update_rates()
1186 minstrel_ht_set_rate(mp, mi, rates, i++, mi->max_prob_rate); in minstrel_ht_update_rates()
1189 mi->sta->max_rc_amsdu_len = minstrel_ht_get_max_amsdu_len(mi); in minstrel_ht_update_rates()
1191 rate_control_set_rates(mp->hw, mi->sta, rates); in minstrel_ht_update_rates()
1195 minstrel_get_sample_rate(struct minstrel_priv *mp, struct minstrel_ht_sta *mi) in minstrel_get_sample_rate() argument
1204 (mi->total_packets_cur >= SAMPLE_SWITCH_THR || in minstrel_get_sample_rate()
1208 if (mi->sample_wait > 0) { in minstrel_get_sample_rate()
1209 mi->sample_wait--; in minstrel_get_sample_rate()
1213 if (!mi->sample_tries) in minstrel_get_sample_rate()
1216 sample_group = mi->sample_group; in minstrel_get_sample_rate()
1217 mg = &mi->groups[sample_group]; in minstrel_get_sample_rate()
1219 minstrel_set_next_sample_idx(mi); in minstrel_get_sample_rate()
1221 if (!(mi->supported[sample_group] & BIT(sample_idx))) in minstrel_get_sample_rate()
1228 if (minstrel_get_duration(mi->max_tp_rate[0]) > in minstrel_get_sample_rate()
1229 minstrel_get_duration(mi->max_tp_rate[1])) { in minstrel_get_sample_rate()
1230 tp_rate1 = mi->max_tp_rate[1]; in minstrel_get_sample_rate()
1231 tp_rate2 = mi->max_tp_rate[0]; in minstrel_get_sample_rate()
1233 tp_rate1 = mi->max_tp_rate[0]; in minstrel_get_sample_rate()
1234 tp_rate2 = mi->max_tp_rate[1]; in minstrel_get_sample_rate()
1242 if (sample_idx == mi->max_tp_rate[0] || sample_idx == mi->max_prob_rate) in minstrel_get_sample_rate()
1252 minstrel_get_duration(mi->max_prob_rate) * 3 < sample_dur) in minstrel_get_sample_rate()
1280 sample_dur >= minstrel_get_duration(mi->max_prob_rate))) { in minstrel_get_sample_rate()
1284 if (mi->sample_slow++ > 2) in minstrel_get_sample_rate()
1287 mi->sample_tries--; in minstrel_get_sample_rate()
1300 struct minstrel_ht_sta *mi = &msp->ht; in minstrel_ht_get_rate() local
1308 mi->max_prob_rate / MCS_GROUP_RATES != MINSTREL_CCK_GROUP) in minstrel_ht_get_rate()
1311 info->flags |= mi->tx_flags; in minstrel_ht_get_rate()
1323 sample_idx = minstrel_get_sample_rate(mp, mi); in minstrel_ht_get_rate()
1325 mi->total_packets++; in minstrel_ht_get_rate()
1328 if (mi->total_packets == ~0) { in minstrel_ht_get_rate()
1329 mi->total_packets = 0; in minstrel_ht_get_rate()
1330 mi->sample_packets = 0; in minstrel_ht_get_rate()
1360 minstrel_ht_update_cck(struct minstrel_priv *mp, struct minstrel_ht_sta *mi, in minstrel_ht_update_cck() argument
1372 mi->cck_supported = 0; in minstrel_ht_update_cck()
1373 mi->cck_supported_short = 0; in minstrel_ht_update_cck()
1378 mi->cck_supported |= BIT(i); in minstrel_ht_update_cck()
1380 mi->cck_supported_short |= BIT(i); in minstrel_ht_update_cck()
1383 mi->supported[MINSTREL_CCK_GROUP] = mi->cck_supported; in minstrel_ht_update_cck()
1393 struct minstrel_ht_sta *mi = &msp->ht; in minstrel_ht_update_caps() local
1416 memset(mi, 0, sizeof(*mi)); in minstrel_ht_update_caps()
1418 mi->sta = sta; in minstrel_ht_update_caps()
1419 mi->last_stats_update = jiffies; in minstrel_ht_update_caps()
1422 mi->overhead = ieee80211_frame_duration(sband->band, 0, 60, 1, 1, 0); in minstrel_ht_update_caps()
1423 mi->overhead += ack_dur; in minstrel_ht_update_caps()
1424 mi->overhead_rtscts = mi->overhead + 2 * ack_dur; in minstrel_ht_update_caps()
1426 mi->avg_ampdu_len = MINSTREL_FRAC(1, 1); in minstrel_ht_update_caps()
1430 mi->sample_count = 16; in minstrel_ht_update_caps()
1431 mi->sample_wait = 0; in minstrel_ht_update_caps()
1433 mi->sample_count = 8; in minstrel_ht_update_caps()
1434 mi->sample_wait = 8; in minstrel_ht_update_caps()
1436 mi->sample_tries = 4; in minstrel_ht_update_caps()
1450 mi->tx_flags |= stbc << IEEE80211_TX_CTL_STBC_SHIFT; in minstrel_ht_update_caps()
1452 mi->tx_flags |= IEEE80211_TX_CTL_LDPC; in minstrel_ht_update_caps()
1454 for (i = 0; i < ARRAY_SIZE(mi->groups); i++) { in minstrel_ht_update_caps()
1458 mi->supported[i] = 0; in minstrel_ht_update_caps()
1460 minstrel_ht_update_cck(mp, mi, sband, sta); in minstrel_ht_update_caps()
1489 mi->supported[i] = mcs->rx_mask[nss - 1]; in minstrel_ht_update_caps()
1490 if (mi->supported[i]) in minstrel_ht_update_caps()
1516 mi->supported[i] = minstrel_get_valid_vht_rates(bw, nss, in minstrel_ht_update_caps()
1519 if (mi->supported[i]) in minstrel_ht_update_caps()
1526 mi->supported[MINSTREL_CCK_GROUP] |= mi->cck_supported_short << 4; in minstrel_ht_update_caps()
1529 minstrel_ht_update_stats(mp, mi, true); in minstrel_ht_update_caps()
1530 minstrel_ht_update_rates(mp, mi); in minstrel_ht_update_caps()
1707 struct minstrel_ht_sta *mi = &msp->ht; in minstrel_ht_get_expected_throughput() local
1713 i = mi->max_tp_rate[0] / MCS_GROUP_RATES; in minstrel_ht_get_expected_throughput()
1714 j = mi->max_tp_rate[0] % MCS_GROUP_RATES; in minstrel_ht_get_expected_throughput()
1715 prob = mi->groups[i].rates[j].prob_avg; in minstrel_ht_get_expected_throughput()
1718 tp_avg = minstrel_ht_get_tp_avg(mi, i, j, prob) * 10; in minstrel_ht_get_expected_throughput()