Lines Matching +full:assoc +full:- +full:select
1 // SPDX-License-Identifier: GPL-2.0-only
4 * Copyright(c) 2005 - 2011 Intel Corporation. All rights reserved.
8 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
25 #define IL4965_RS_NAME "iwl-4965-rs"
51 /*ANT_NONE -> */ ANT_NONE,
52 /*ANT_A -> */ ANT_B,
53 /*ANT_B -> */ ANT_C,
54 /*ANT_AB -> */ ANT_BC,
55 /*ANT_C -> */ ANT_A,
56 /*ANT_AC -> */ ANT_AB,
57 /*ANT_BC -> */ ANT_AC,
58 /*ANT_ABC -> */ ANT_ABC,
107 idx = idx - RATE_MIMO2_6M_PLCP; in il4965_hwrate_to_plcp_idx()
123 return -1; in il4965_hwrate_to_plcp_idx()
216 win->data = 0; in il4965_rs_rate_scale_clear_win()
217 win->success_counter = 0; in il4965_rs_rate_scale_clear_win()
218 win->success_ratio = IL_INVALID_VALUE; in il4965_rs_rate_scale_clear_win()
219 win->counter = 0; in il4965_rs_rate_scale_clear_win()
220 win->average_tpt = IL_INVALID_VALUE; in il4965_rs_rate_scale_clear_win()
221 win->stamp = 0; in il4965_rs_rate_scale_clear_win()
238 u32 oldest_time = curr_time - TID_MAX_TIME_DIFF; in il4965_rs_tl_rm_old_stats()
240 while (tl->queue_count && tl->time_stamp < oldest_time) { in il4965_rs_tl_rm_old_stats()
241 tl->total -= tl->packet_count[tl->head]; in il4965_rs_tl_rm_old_stats()
242 tl->packet_count[tl->head] = 0; in il4965_rs_tl_rm_old_stats()
243 tl->time_stamp += TID_QUEUE_CELL_SPACING; in il4965_rs_tl_rm_old_stats()
244 tl->queue_count--; in il4965_rs_tl_rm_old_stats()
245 tl->head++; in il4965_rs_tl_rm_old_stats()
246 if (tl->head >= TID_QUEUE_MAX_SIZE) in il4965_rs_tl_rm_old_stats()
247 tl->head = 0; in il4965_rs_tl_rm_old_stats()
264 if (ieee80211_is_data_qos(hdr->frame_control)) { in il4965_rs_tl_add_packet()
273 tl = &lq_data->load[tid]; in il4965_rs_tl_add_packet()
275 curr_time -= curr_time % TID_ROUND_VALUE; in il4965_rs_tl_add_packet()
278 if (!(tl->queue_count)) { in il4965_rs_tl_add_packet()
279 tl->total = 1; in il4965_rs_tl_add_packet()
280 tl->time_stamp = curr_time; in il4965_rs_tl_add_packet()
281 tl->queue_count = 1; in il4965_rs_tl_add_packet()
282 tl->head = 0; in il4965_rs_tl_add_packet()
283 tl->packet_count[0] = 1; in il4965_rs_tl_add_packet()
287 time_diff = TIME_WRAP_AROUND(tl->time_stamp, curr_time); in il4965_rs_tl_add_packet()
295 idx = (tl->head + idx) % TID_QUEUE_MAX_SIZE; in il4965_rs_tl_add_packet()
296 tl->packet_count[idx] = tl->packet_count[idx] + 1; in il4965_rs_tl_add_packet()
297 tl->total = tl->total + 1; in il4965_rs_tl_add_packet()
299 if ((idx + 1) > tl->queue_count) in il4965_rs_tl_add_packet()
300 tl->queue_count = idx + 1; in il4965_rs_tl_add_packet()
319 tl = &(lq_data->load[tid]); in il4965_rs_tl_get_load()
321 curr_time -= curr_time % TID_ROUND_VALUE; in il4965_rs_tl_get_load()
323 if (!(tl->queue_count)) in il4965_rs_tl_get_load()
326 time_diff = TIME_WRAP_AROUND(tl->time_stamp, curr_time); in il4965_rs_tl_get_load()
334 return tl->total; in il4965_rs_tl_get_load()
341 int ret = -EAGAIN; in il4965_rs_tl_turn_on_agg_for_tid()
347 D_HT("Starting Tx agg: STA: %pM tid: %d\n", sta->addr, tid); in il4965_rs_tl_turn_on_agg_for_tid()
349 if (ret == -EAGAIN) { in il4965_rs_tl_turn_on_agg_for_tid()
391 if (tbl->expected_tpt) in il4965_get_expected_tpt()
392 return tbl->expected_tpt[rs_idx]; in il4965_get_expected_tpt()
397 * il4965_rs_collect_tx_data - Update the success/failure sliding win
400 * at this rate. win->data contains the bitmask of successful
408 static const u64 mask = (((u64) 1) << (RATE_MAX_WINDOW - 1)); in il4965_rs_collect_tx_data()
412 return -EINVAL; in il4965_rs_collect_tx_data()
414 /* Select win for current tx bit rate */ in il4965_rs_collect_tx_data()
415 win = &(tbl->win[scale_idx]); in il4965_rs_collect_tx_data()
429 if (win->counter >= RATE_MAX_WINDOW) { in il4965_rs_collect_tx_data()
432 win->counter = RATE_MAX_WINDOW - 1; in il4965_rs_collect_tx_data()
434 if (win->data & mask) { in il4965_rs_collect_tx_data()
435 win->data &= ~mask; in il4965_rs_collect_tx_data()
436 win->success_counter--; in il4965_rs_collect_tx_data()
440 /* Increment frames-attempted counter */ in il4965_rs_collect_tx_data()
441 win->counter++; in il4965_rs_collect_tx_data()
444 win->data <<= 1; in il4965_rs_collect_tx_data()
448 win->success_counter++; in il4965_rs_collect_tx_data()
449 win->data |= 0x1; in il4965_rs_collect_tx_data()
450 successes--; in il4965_rs_collect_tx_data()
453 attempts--; in il4965_rs_collect_tx_data()
456 /* Calculate current success ratio, avoid divide-by-0! */ in il4965_rs_collect_tx_data()
457 if (win->counter > 0) in il4965_rs_collect_tx_data()
458 win->success_ratio = in il4965_rs_collect_tx_data()
459 128 * (100 * win->success_counter) / win->counter; in il4965_rs_collect_tx_data()
461 win->success_ratio = IL_INVALID_VALUE; in il4965_rs_collect_tx_data()
463 fail_count = win->counter - win->success_counter; in il4965_rs_collect_tx_data()
467 win->success_counter >= RATE_MIN_SUCCESS_TH) in il4965_rs_collect_tx_data()
468 win->average_tpt = (win->success_ratio * tpt + 64) / 128; in il4965_rs_collect_tx_data()
470 win->average_tpt = IL_INVALID_VALUE; in il4965_rs_collect_tx_data()
473 win->stamp = jiffies; in il4965_rs_collect_tx_data()
487 if (is_legacy(tbl->lq_type)) { in il4965_rate_n_flags_from_tbl()
492 } else if (is_Ht(tbl->lq_type)) { in il4965_rate_n_flags_from_tbl()
499 if (is_siso(tbl->lq_type)) in il4965_rate_n_flags_from_tbl()
504 IL_ERR("Invalid tbl->lq_type %d\n", tbl->lq_type); in il4965_rate_n_flags_from_tbl()
508 ((tbl->ant_type << RATE_MCS_ANT_POS) & RATE_MCS_ANT_ABC_MSK); in il4965_rate_n_flags_from_tbl()
510 if (is_Ht(tbl->lq_type)) { in il4965_rate_n_flags_from_tbl()
511 if (tbl->is_ht40) { in il4965_rate_n_flags_from_tbl()
512 if (tbl->is_dup) in il4965_rate_n_flags_from_tbl()
517 if (tbl->is_SGI) in il4965_rate_n_flags_from_tbl()
522 if (is_siso(tbl->lq_type) && tbl->is_SGI) { in il4965_rate_n_flags_from_tbl()
549 *rate_idx = -1; in il4965_rs_get_tbl_info_from_mcs()
550 return -EINVAL; in il4965_rs_get_tbl_info_from_mcs()
552 tbl->is_SGI = 0; /* default legacy setup */ in il4965_rs_get_tbl_info_from_mcs()
553 tbl->is_ht40 = 0; in il4965_rs_get_tbl_info_from_mcs()
554 tbl->is_dup = 0; in il4965_rs_get_tbl_info_from_mcs()
555 tbl->ant_type = (ant_msk >> RATE_MCS_ANT_POS); in il4965_rs_get_tbl_info_from_mcs()
556 tbl->lq_type = LQ_NONE; in il4965_rs_get_tbl_info_from_mcs()
557 tbl->max_search = IL_MAX_SEARCH; in il4965_rs_get_tbl_info_from_mcs()
563 tbl->lq_type = LQ_A; in il4965_rs_get_tbl_info_from_mcs()
565 tbl->lq_type = LQ_G; in il4965_rs_get_tbl_info_from_mcs()
570 tbl->is_SGI = 1; in il4965_rs_get_tbl_info_from_mcs()
574 tbl->is_ht40 = 1; in il4965_rs_get_tbl_info_from_mcs()
577 tbl->is_dup = 1; in il4965_rs_get_tbl_info_from_mcs()
584 tbl->lq_type = LQ_SISO; /*else NONE */ in il4965_rs_get_tbl_info_from_mcs()
588 tbl->lq_type = LQ_MIMO2; in il4965_rs_get_tbl_info_from_mcs()
602 if (!tbl->ant_type || tbl->ant_type > ANT_ABC) in il4965_rs_toggle_antenna()
605 if (!il4965_rs_is_valid_ant(valid_ant, tbl->ant_type)) in il4965_rs_toggle_antenna()
608 new_ant_type = ant_toggle_lookup[tbl->ant_type]; in il4965_rs_toggle_antenna()
610 while (new_ant_type != tbl->ant_type && in il4965_rs_toggle_antenna()
614 if (new_ant_type == tbl->ant_type) in il4965_rs_toggle_antenna()
617 tbl->ant_type = new_ant_type; in il4965_rs_toggle_antenna()
624 * Green-field mode is valid if the station supports it and
625 * there are no non-GF stations present in the BSS.
630 return (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_GRN_FLD) && in il4965_rs_use_green()
631 !il->ht.non_gf_sta_present; in il4965_rs_use_green()
635 * il4965_rs_get_supported_rates - get the available rates
647 return lq_sta->active_legacy_rate; in il4965_rs_get_supported_rates()
650 return lq_sta->active_siso_rate; in il4965_rs_get_supported_rates()
652 return lq_sta->active_mimo2_rate; in il4965_rs_get_supported_rates()
670 i = idx - 1; in il4965_rs_get_adjacent_rate()
671 for (mask = (1 << i); i >= 0; i--, mask >>= 1) { in il4965_rs_get_adjacent_rate()
722 u8 is_green = lq_sta->is_green; in il4965_rs_get_lower_rate()
723 struct il_priv *il = lq_sta->drv; in il4965_rs_get_lower_rate()
728 if (!is_legacy(tbl->lq_type) && (!ht_possible || !scale_idx)) { in il4965_rs_get_lower_rate()
731 if (lq_sta->band == NL80211_BAND_5GHZ) in il4965_rs_get_lower_rate()
732 tbl->lq_type = LQ_A; in il4965_rs_get_lower_rate()
734 tbl->lq_type = LQ_G; in il4965_rs_get_lower_rate()
736 if (il4965_num_of_ant(tbl->ant_type) > 1) in il4965_rs_get_lower_rate()
737 tbl->ant_type = in il4965_rs_get_lower_rate()
738 il4965_first_antenna(il->hw_params.valid_tx_ant); in il4965_rs_get_lower_rate()
740 tbl->is_ht40 = 0; in il4965_rs_get_lower_rate()
741 tbl->is_SGI = 0; in il4965_rs_get_lower_rate()
742 tbl->max_search = IL_MAX_SEARCH; in il4965_rs_get_lower_rate()
745 rate_mask = il4965_rs_get_supported_rates(lq_sta, NULL, tbl->lq_type); in il4965_rs_get_lower_rate()
748 if (is_legacy(tbl->lq_type)) { in il4965_rs_get_lower_rate()
750 if (lq_sta->band == NL80211_BAND_5GHZ) in il4965_rs_get_lower_rate()
753 (lq_sta->supp_rates << IL_FIRST_OFDM_RATE)); in il4965_rs_get_lower_rate()
755 rate_mask = (u16) (rate_mask & lq_sta->supp_rates); in il4965_rs_get_lower_rate()
765 il4965_rs_get_adjacent_rate(lq_sta->drv, scale_idx, rate_mask, in il4965_rs_get_lower_rate()
766 tbl->lq_type); in il4965_rs_get_lower_rate()
773 return il4965_rate_n_flags_from_tbl(lq_sta->drv, tbl, low, is_green); in il4965_rs_get_lower_rate()
783 return (a->lq_type == b->lq_type && a->ant_type == b->ant_type && in il4965_table_type_matches()
784 a->is_SGI == b->is_SGI); in il4965_table_type_matches()
800 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in il4965_rs_tx_status()
810 /* Treat uninitialized rate scaling data same as non-existing. */ in il4965_rs_tx_status()
814 } else if (!lq_sta->drv) { in il4965_rs_tx_status()
819 if (!ieee80211_is_data(hdr->frame_control) || in il4965_rs_tx_status()
820 (info->flags & IEEE80211_TX_CTL_NO_ACK)) in il4965_rs_tx_status()
824 if ((info->flags & IEEE80211_TX_CTL_AMPDU) && in il4965_rs_tx_status()
825 !(info->flags & IEEE80211_TX_STAT_AMPDU)) in il4965_rs_tx_status()
836 table = &lq_sta->lq; in il4965_rs_tx_status()
837 tx_rate = le32_to_cpu(table->rs_table[0].rate_n_flags); in il4965_rs_tx_status()
838 il4965_rs_get_tbl_info_from_mcs(tx_rate, il->band, &tbl_type, &rs_idx); in il4965_rs_tx_status()
839 if (il->band == NL80211_BAND_5GHZ) in il4965_rs_tx_status()
840 rs_idx -= IL_FIRST_OFDM_RATE; in il4965_rs_tx_status()
841 mac_flags = info->status.rates[0].flags; in il4965_rs_tx_status()
842 mac_idx = info->status.rates[0].idx; in il4965_rs_tx_status()
846 if (mac_idx >= (RATE_9M_IDX - IL_FIRST_OFDM_RATE)) in il4965_rs_tx_status()
849 * mac80211 HT idx is always zero-idxed; we need to move in il4965_rs_tx_status()
852 if (il->band == NL80211_BAND_2GHZ) in il4965_rs_tx_status()
860 tbl_type.ant_type != info->status.antenna || in il4965_rs_tx_status()
867 * Since rates mis-match, the last LQ command may have failed. in il4965_rs_tx_status()
868 * After IL_MISSED_RATE_MAX mis-matches, resync the uCode with in il4965_rs_tx_status()
871 lq_sta->missed_rate_counter++; in il4965_rs_tx_status()
872 if (lq_sta->missed_rate_counter > IL_MISSED_RATE_MAX) { in il4965_rs_tx_status()
873 lq_sta->missed_rate_counter = 0; in il4965_rs_tx_status()
874 il_send_lq_cmd(il, &lq_sta->lq, CMD_ASYNC, false); in il4965_rs_tx_status()
880 lq_sta->missed_rate_counter = 0; in il4965_rs_tx_status()
884 (&tbl_type, &(lq_sta->lq_info[lq_sta->active_tbl]))) { in il4965_rs_tx_status()
885 curr_tbl = &(lq_sta->lq_info[lq_sta->active_tbl]); in il4965_rs_tx_status()
886 other_tbl = &(lq_sta->lq_info[1 - lq_sta->active_tbl]); in il4965_rs_tx_status()
889 (&tbl_type, &lq_sta->lq_info[1 - lq_sta->active_tbl])) { in il4965_rs_tx_status()
890 curr_tbl = &(lq_sta->lq_info[1 - lq_sta->active_tbl]); in il4965_rs_tx_status()
891 other_tbl = &(lq_sta->lq_info[lq_sta->active_tbl]); in il4965_rs_tx_status()
894 tmp_tbl = &(lq_sta->lq_info[lq_sta->active_tbl]); in il4965_rs_tx_status()
895 D_RATE("active- lq:%x, ant:%x, SGI:%d\n", tmp_tbl->lq_type, in il4965_rs_tx_status()
896 tmp_tbl->ant_type, tmp_tbl->is_SGI); in il4965_rs_tx_status()
897 tmp_tbl = &(lq_sta->lq_info[1 - lq_sta->active_tbl]); in il4965_rs_tx_status()
898 D_RATE("search- lq:%x, ant:%x, SGI:%d\n", tmp_tbl->lq_type, in il4965_rs_tx_status()
899 tmp_tbl->ant_type, tmp_tbl->is_SGI); in il4965_rs_tx_status()
900 D_RATE("actual- lq:%x, ant:%x, SGI:%d\n", tbl_type.lq_type, in il4965_rs_tx_status()
903 * no matching table found, let's by-pass the data collection in il4965_rs_tx_status()
917 if (info->flags & IEEE80211_TX_STAT_AMPDU) { in il4965_rs_tx_status()
918 tx_rate = le32_to_cpu(table->rs_table[0].rate_n_flags); in il4965_rs_tx_status()
919 il4965_rs_get_tbl_info_from_mcs(tx_rate, il->band, &tbl_type, in il4965_rs_tx_status()
922 info->status.ampdu_len, in il4965_rs_tx_status()
923 info->status.ampdu_ack_len); in il4965_rs_tx_status()
926 if (lq_sta->stay_in_tbl) { in il4965_rs_tx_status()
927 lq_sta->total_success += info->status.ampdu_ack_len; in il4965_rs_tx_status()
928 lq_sta->total_failed += in il4965_rs_tx_status()
929 (info->status.ampdu_len - in il4965_rs_tx_status()
930 info->status.ampdu_ack_len); in il4965_rs_tx_status()
936 retries = info->status.rates[0].count - 1; in il4965_rs_tx_status()
941 legacy_success = !!(info->flags & IEEE80211_TX_STAT_ACK); in il4965_rs_tx_status()
944 tx_rate = le32_to_cpu(table->rs_table[i].rate_n_flags); in il4965_rs_tx_status()
945 il4965_rs_get_tbl_info_from_mcs(tx_rate, il->band, in il4965_rs_tx_status()
964 if (lq_sta->stay_in_tbl) { in il4965_rs_tx_status()
965 lq_sta->total_success += legacy_success; in il4965_rs_tx_status()
966 lq_sta->total_failed += retries + (1 - legacy_success); in il4965_rs_tx_status()
970 lq_sta->last_rate_n_flags = tx_rate; in il4965_rs_tx_status()
973 if (sta->deflink.supp_rates[sband->band]) in il4965_rs_tx_status()
980 * Set frame tx success limits according to legacy vs. high-throughput,
990 lq_sta->stay_in_tbl = 1; /* only place this gets set */ in il4965_rs_set_stay_in_table()
992 lq_sta->table_count_limit = IL_LEGACY_TBL_COUNT; in il4965_rs_set_stay_in_table()
993 lq_sta->max_failure_limit = IL_LEGACY_FAILURE_LIMIT; in il4965_rs_set_stay_in_table()
994 lq_sta->max_success_limit = IL_LEGACY_SUCCESS_LIMIT; in il4965_rs_set_stay_in_table()
996 lq_sta->table_count_limit = IL_NONE_LEGACY_TBL_COUNT; in il4965_rs_set_stay_in_table()
997 lq_sta->max_failure_limit = IL_NONE_LEGACY_FAILURE_LIMIT; in il4965_rs_set_stay_in_table()
998 lq_sta->max_success_limit = IL_NONE_LEGACY_SUCCESS_LIMIT; in il4965_rs_set_stay_in_table()
1000 lq_sta->table_count = 0; in il4965_rs_set_stay_in_table()
1001 lq_sta->total_failed = 0; in il4965_rs_set_stay_in_table()
1002 lq_sta->total_success = 0; in il4965_rs_set_stay_in_table()
1003 lq_sta->flush_timer = jiffies; in il4965_rs_set_stay_in_table()
1004 lq_sta->action_counter = 0; in il4965_rs_set_stay_in_table()
1018 if (WARN_ON_ONCE(!is_legacy(tbl->lq_type) && !is_Ht(tbl->lq_type))) { in il4965_rs_set_expected_tpt_table()
1019 tbl->expected_tpt = expected_tpt_legacy; in il4965_rs_set_expected_tpt_table()
1024 if (is_legacy(tbl->lq_type)) { in il4965_rs_set_expected_tpt_table()
1025 tbl->expected_tpt = expected_tpt_legacy; in il4965_rs_set_expected_tpt_table()
1032 if (is_siso(tbl->lq_type) && (!tbl->is_ht40 || lq_sta->is_dup)) in il4965_rs_set_expected_tpt_table()
1034 else if (is_siso(tbl->lq_type)) in il4965_rs_set_expected_tpt_table()
1036 else if (is_mimo2(tbl->lq_type) && (!tbl->is_ht40 || lq_sta->is_dup)) in il4965_rs_set_expected_tpt_table()
1038 else /* if (is_mimo2(tbl->lq_type)) <-- must be true */ in il4965_rs_set_expected_tpt_table()
1041 if (!tbl->is_SGI && !lq_sta->is_agg) /* Normal */ in il4965_rs_set_expected_tpt_table()
1042 tbl->expected_tpt = ht_tbl_pointer[0]; in il4965_rs_set_expected_tpt_table()
1043 else if (tbl->is_SGI && !lq_sta->is_agg) /* SGI */ in il4965_rs_set_expected_tpt_table()
1044 tbl->expected_tpt = ht_tbl_pointer[1]; in il4965_rs_set_expected_tpt_table()
1045 else if (!tbl->is_SGI && lq_sta->is_agg) /* AGG */ in il4965_rs_set_expected_tpt_table()
1046 tbl->expected_tpt = ht_tbl_pointer[2]; in il4965_rs_set_expected_tpt_table()
1048 tbl->expected_tpt = ht_tbl_pointer[3]; in il4965_rs_set_expected_tpt_table()
1052 * Find starting rate for new "search" high-throughput mode of modulation.
1070 &(lq_sta->lq_info[lq_sta->active_tbl]); in il4965_rs_get_best_rate()
1071 s32 active_sr = active_tbl->win[idx].success_ratio; in il4965_rs_get_best_rate()
1072 s32 active_tpt = active_tbl->expected_tpt[idx]; in il4965_rs_get_best_rate()
1075 s32 *tpt_tbl = tbl->expected_tpt; in il4965_rs_get_best_rate()
1086 tbl->lq_type); in il4965_rs_get_best_rate()
1106 if ((100 * tpt_tbl[rate] > lq_sta->last_tpt && in il4965_rs_get_best_rate()
1165 s8 is_green = lq_sta->is_green; in il4965_rs_switch_to_mimo2()
1167 if (!conf_is_ht(conf) || !sta->deflink.ht_cap.ht_supported) in il4965_rs_switch_to_mimo2()
1168 return -1; in il4965_rs_switch_to_mimo2()
1170 if (sta->deflink.smps_mode == IEEE80211_SMPS_STATIC) in il4965_rs_switch_to_mimo2()
1171 return -1; in il4965_rs_switch_to_mimo2()
1174 if (il->hw_params.tx_chains_num < 2) in il4965_rs_switch_to_mimo2()
1175 return -1; in il4965_rs_switch_to_mimo2()
1179 tbl->lq_type = LQ_MIMO2; in il4965_rs_switch_to_mimo2()
1180 tbl->is_dup = lq_sta->is_dup; in il4965_rs_switch_to_mimo2()
1181 tbl->action = 0; in il4965_rs_switch_to_mimo2()
1182 tbl->max_search = IL_MAX_SEARCH; in il4965_rs_switch_to_mimo2()
1183 rate_mask = lq_sta->active_mimo2_rate; in il4965_rs_switch_to_mimo2()
1185 if (il_is_ht40_tx_allowed(il, &sta->deflink.ht_cap)) in il4965_rs_switch_to_mimo2()
1186 tbl->is_ht40 = 1; in il4965_rs_switch_to_mimo2()
1188 tbl->is_ht40 = 0; in il4965_rs_switch_to_mimo2()
1198 return -1; in il4965_rs_switch_to_mimo2()
1200 tbl->current_rate = in il4965_rs_switch_to_mimo2()
1203 D_RATE("LQ: Switch to new mcs %X idx is green %X\n", tbl->current_rate, in il4965_rs_switch_to_mimo2()
1217 u8 is_green = lq_sta->is_green; in il4965_rs_switch_to_siso()
1220 if (!conf_is_ht(conf) || !sta->deflink.ht_cap.ht_supported) in il4965_rs_switch_to_siso()
1221 return -1; in il4965_rs_switch_to_siso()
1225 tbl->is_dup = lq_sta->is_dup; in il4965_rs_switch_to_siso()
1226 tbl->lq_type = LQ_SISO; in il4965_rs_switch_to_siso()
1227 tbl->action = 0; in il4965_rs_switch_to_siso()
1228 tbl->max_search = IL_MAX_SEARCH; in il4965_rs_switch_to_siso()
1229 rate_mask = lq_sta->active_siso_rate; in il4965_rs_switch_to_siso()
1231 if (il_is_ht40_tx_allowed(il, &sta->deflink.ht_cap)) in il4965_rs_switch_to_siso()
1232 tbl->is_ht40 = 1; in il4965_rs_switch_to_siso()
1234 tbl->is_ht40 = 0; in il4965_rs_switch_to_siso()
1237 tbl->is_SGI = 0; /*11n spec: no SGI in SISO+Greenfield */ in il4965_rs_switch_to_siso()
1246 return -1; in il4965_rs_switch_to_siso()
1248 tbl->current_rate = in il4965_rs_switch_to_siso()
1250 D_RATE("LQ: Switch to new mcs %X idx is green %X\n", tbl->current_rate, in il4965_rs_switch_to_siso()
1263 struct il_scale_tbl_info *tbl = &(lq_sta->lq_info[lq_sta->active_tbl]); in il4965_rs_move_legacy_other()
1265 &(lq_sta->lq_info[(1 - lq_sta->active_tbl)]); in il4965_rs_move_legacy_other()
1266 struct il_rate_scale_data *win = &(tbl->win[idx]); in il4965_rs_move_legacy_other()
1268 (sizeof(struct il_scale_tbl_info) - in il4965_rs_move_legacy_other()
1271 u8 valid_tx_ant = il->hw_params.valid_tx_ant; in il4965_rs_move_legacy_other()
1272 u8 tx_chains_num = il->hw_params.tx_chains_num; in il4965_rs_move_legacy_other()
1276 tbl->action = IL_LEGACY_SWITCH_SISO; in il4965_rs_move_legacy_other()
1278 start_action = tbl->action; in il4965_rs_move_legacy_other()
1280 lq_sta->action_counter++; in il4965_rs_move_legacy_other()
1281 switch (tbl->action) { in il4965_rs_move_legacy_other()
1286 if ((tbl->action == IL_LEGACY_SWITCH_ANTENNA1 && in il4965_rs_move_legacy_other()
1288 (tbl->action == IL_LEGACY_SWITCH_ANTENNA2 && in il4965_rs_move_legacy_other()
1293 if (win->success_ratio >= IL_RS_GOOD_RATIO) in il4965_rs_move_legacy_other()
1300 (valid_tx_ant, &search_tbl->current_rate, in il4965_rs_move_legacy_other()
1313 search_tbl->is_SGI = 0; in il4965_rs_move_legacy_other()
1318 lq_sta->action_counter = 0; in il4965_rs_move_legacy_other()
1330 search_tbl->is_SGI = 0; in il4965_rs_move_legacy_other()
1332 if (tbl->action == IL_LEGACY_SWITCH_MIMO2_AB) in il4965_rs_move_legacy_other()
1333 search_tbl->ant_type = ANT_AB; in il4965_rs_move_legacy_other()
1334 else if (tbl->action == IL_LEGACY_SWITCH_MIMO2_AC) in il4965_rs_move_legacy_other()
1335 search_tbl->ant_type = ANT_AC; in il4965_rs_move_legacy_other()
1337 search_tbl->ant_type = ANT_BC; in il4965_rs_move_legacy_other()
1340 (valid_tx_ant, search_tbl->ant_type)) in il4965_rs_move_legacy_other()
1347 lq_sta->action_counter = 0; in il4965_rs_move_legacy_other()
1352 tbl->action++; in il4965_rs_move_legacy_other()
1353 if (tbl->action > IL_LEGACY_SWITCH_MIMO2_BC) in il4965_rs_move_legacy_other()
1354 tbl->action = IL_LEGACY_SWITCH_ANTENNA1; in il4965_rs_move_legacy_other()
1356 if (tbl->action == start_action) in il4965_rs_move_legacy_other()
1360 search_tbl->lq_type = LQ_NONE; in il4965_rs_move_legacy_other()
1364 lq_sta->search_better_tbl = 1; in il4965_rs_move_legacy_other()
1365 tbl->action++; in il4965_rs_move_legacy_other()
1366 if (tbl->action > IL_LEGACY_SWITCH_MIMO2_BC) in il4965_rs_move_legacy_other()
1367 tbl->action = IL_LEGACY_SWITCH_ANTENNA1; in il4965_rs_move_legacy_other()
1369 search_tbl->action = tbl->action; in il4965_rs_move_legacy_other()
1382 u8 is_green = lq_sta->is_green; in il4965_rs_move_siso_to_other()
1383 struct il_scale_tbl_info *tbl = &(lq_sta->lq_info[lq_sta->active_tbl]); in il4965_rs_move_siso_to_other()
1385 &(lq_sta->lq_info[(1 - lq_sta->active_tbl)]); in il4965_rs_move_siso_to_other()
1386 struct il_rate_scale_data *win = &(tbl->win[idx]); in il4965_rs_move_siso_to_other()
1387 struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap; in il4965_rs_move_siso_to_other()
1389 (sizeof(struct il_scale_tbl_info) - in il4965_rs_move_siso_to_other()
1392 u8 valid_tx_ant = il->hw_params.valid_tx_ant; in il4965_rs_move_siso_to_other()
1393 u8 tx_chains_num = il->hw_params.tx_chains_num; in il4965_rs_move_siso_to_other()
1397 start_action = tbl->action; in il4965_rs_move_siso_to_other()
1400 lq_sta->action_counter++; in il4965_rs_move_siso_to_other()
1401 switch (tbl->action) { in il4965_rs_move_siso_to_other()
1405 if ((tbl->action == IL_SISO_SWITCH_ANTENNA1 && in il4965_rs_move_siso_to_other()
1407 (tbl->action == IL_SISO_SWITCH_ANTENNA2 && in il4965_rs_move_siso_to_other()
1411 if (win->success_ratio >= IL_RS_GOOD_RATIO) in il4965_rs_move_siso_to_other()
1416 (valid_tx_ant, &search_tbl->current_rate, in il4965_rs_move_siso_to_other()
1427 search_tbl->is_SGI = 0; in il4965_rs_move_siso_to_other()
1429 if (tbl->action == IL_SISO_SWITCH_MIMO2_AB) in il4965_rs_move_siso_to_other()
1430 search_tbl->ant_type = ANT_AB; in il4965_rs_move_siso_to_other()
1431 else if (tbl->action == IL_SISO_SWITCH_MIMO2_AC) in il4965_rs_move_siso_to_other()
1432 search_tbl->ant_type = ANT_AC; in il4965_rs_move_siso_to_other()
1434 search_tbl->ant_type = ANT_BC; in il4965_rs_move_siso_to_other()
1437 (valid_tx_ant, search_tbl->ant_type)) in il4965_rs_move_siso_to_other()
1447 if (!tbl->is_ht40 && in il4965_rs_move_siso_to_other()
1448 !(ht_cap->cap & IEEE80211_HT_CAP_SGI_20)) in il4965_rs_move_siso_to_other()
1450 if (tbl->is_ht40 && in il4965_rs_move_siso_to_other()
1451 !(ht_cap->cap & IEEE80211_HT_CAP_SGI_40)) in il4965_rs_move_siso_to_other()
1458 if (!tbl->is_SGI) in il4965_rs_move_siso_to_other()
1463 search_tbl->is_SGI = !tbl->is_SGI; in il4965_rs_move_siso_to_other()
1465 if (tbl->is_SGI) { in il4965_rs_move_siso_to_other()
1466 s32 tpt = lq_sta->last_tpt / 100; in il4965_rs_move_siso_to_other()
1467 if (tpt >= search_tbl->expected_tpt[idx]) in il4965_rs_move_siso_to_other()
1470 search_tbl->current_rate = in il4965_rs_move_siso_to_other()
1476 tbl->action++; in il4965_rs_move_siso_to_other()
1477 if (tbl->action > IL_SISO_SWITCH_GI) in il4965_rs_move_siso_to_other()
1478 tbl->action = IL_SISO_SWITCH_ANTENNA1; in il4965_rs_move_siso_to_other()
1480 if (tbl->action == start_action) in il4965_rs_move_siso_to_other()
1483 search_tbl->lq_type = LQ_NONE; in il4965_rs_move_siso_to_other()
1487 lq_sta->search_better_tbl = 1; in il4965_rs_move_siso_to_other()
1488 tbl->action++; in il4965_rs_move_siso_to_other()
1489 if (tbl->action > IL_SISO_SWITCH_GI) in il4965_rs_move_siso_to_other()
1490 tbl->action = IL_SISO_SWITCH_ANTENNA1; in il4965_rs_move_siso_to_other()
1492 search_tbl->action = tbl->action; in il4965_rs_move_siso_to_other()
1505 s8 is_green = lq_sta->is_green; in il4965_rs_move_mimo2_to_other()
1506 struct il_scale_tbl_info *tbl = &(lq_sta->lq_info[lq_sta->active_tbl]); in il4965_rs_move_mimo2_to_other()
1508 &(lq_sta->lq_info[(1 - lq_sta->active_tbl)]); in il4965_rs_move_mimo2_to_other()
1509 struct il_rate_scale_data *win = &(tbl->win[idx]); in il4965_rs_move_mimo2_to_other()
1510 struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap; in il4965_rs_move_mimo2_to_other()
1512 (sizeof(struct il_scale_tbl_info) - in il4965_rs_move_mimo2_to_other()
1515 u8 valid_tx_ant = il->hw_params.valid_tx_ant; in il4965_rs_move_mimo2_to_other()
1516 u8 tx_chains_num = il->hw_params.tx_chains_num; in il4965_rs_move_mimo2_to_other()
1520 start_action = tbl->action; in il4965_rs_move_mimo2_to_other()
1522 lq_sta->action_counter++; in il4965_rs_move_mimo2_to_other()
1523 switch (tbl->action) { in il4965_rs_move_mimo2_to_other()
1531 if (win->success_ratio >= IL_RS_GOOD_RATIO) in il4965_rs_move_mimo2_to_other()
1536 (valid_tx_ant, &search_tbl->current_rate, in il4965_rs_move_mimo2_to_other()
1550 if (tbl->action == IL_MIMO2_SWITCH_SISO_A) in il4965_rs_move_mimo2_to_other()
1551 search_tbl->ant_type = ANT_A; in il4965_rs_move_mimo2_to_other()
1552 else if (tbl->action == IL_MIMO2_SWITCH_SISO_B) in il4965_rs_move_mimo2_to_other()
1553 search_tbl->ant_type = ANT_B; in il4965_rs_move_mimo2_to_other()
1555 search_tbl->ant_type = ANT_C; in il4965_rs_move_mimo2_to_other()
1558 (valid_tx_ant, search_tbl->ant_type)) in il4965_rs_move_mimo2_to_other()
1570 if (!tbl->is_ht40 && in il4965_rs_move_mimo2_to_other()
1571 !(ht_cap->cap & IEEE80211_HT_CAP_SGI_20)) in il4965_rs_move_mimo2_to_other()
1573 if (tbl->is_ht40 && in il4965_rs_move_mimo2_to_other()
1574 !(ht_cap->cap & IEEE80211_HT_CAP_SGI_40)) in il4965_rs_move_mimo2_to_other()
1581 search_tbl->is_SGI = !tbl->is_SGI; in il4965_rs_move_mimo2_to_other()
1589 if (tbl->is_SGI) { in il4965_rs_move_mimo2_to_other()
1590 s32 tpt = lq_sta->last_tpt / 100; in il4965_rs_move_mimo2_to_other()
1591 if (tpt >= search_tbl->expected_tpt[idx]) in il4965_rs_move_mimo2_to_other()
1594 search_tbl->current_rate = in il4965_rs_move_mimo2_to_other()
1601 tbl->action++; in il4965_rs_move_mimo2_to_other()
1602 if (tbl->action > IL_MIMO2_SWITCH_GI) in il4965_rs_move_mimo2_to_other()
1603 tbl->action = IL_MIMO2_SWITCH_ANTENNA1; in il4965_rs_move_mimo2_to_other()
1605 if (tbl->action == start_action) in il4965_rs_move_mimo2_to_other()
1608 search_tbl->lq_type = LQ_NONE; in il4965_rs_move_mimo2_to_other()
1611 lq_sta->search_better_tbl = 1; in il4965_rs_move_mimo2_to_other()
1612 tbl->action++; in il4965_rs_move_mimo2_to_other()
1613 if (tbl->action > IL_MIMO2_SWITCH_GI) in il4965_rs_move_mimo2_to_other()
1614 tbl->action = IL_MIMO2_SWITCH_ANTENNA1; in il4965_rs_move_mimo2_to_other()
1616 search_tbl->action = tbl->action; in il4965_rs_move_mimo2_to_other()
1638 il = lq_sta->drv; in il4965_rs_stay_in_table()
1639 active_tbl = lq_sta->active_tbl; in il4965_rs_stay_in_table()
1641 tbl = &(lq_sta->lq_info[active_tbl]); in il4965_rs_stay_in_table()
1644 if (lq_sta->stay_in_tbl) { in il4965_rs_stay_in_table()
1647 if (lq_sta->flush_timer) in il4965_rs_stay_in_table()
1650 (unsigned long)(lq_sta->flush_timer + in il4965_rs_stay_in_table()
1662 lq_sta->total_failed > lq_sta->max_failure_limit || in il4965_rs_stay_in_table()
1663 lq_sta->total_success > lq_sta->max_success_limit || in il4965_rs_stay_in_table()
1664 (!lq_sta->search_better_tbl && lq_sta->flush_timer && in il4965_rs_stay_in_table()
1667 lq_sta->total_failed, lq_sta->total_success, in il4965_rs_stay_in_table()
1671 lq_sta->stay_in_tbl = 0; /* only place reset */ in il4965_rs_stay_in_table()
1672 lq_sta->total_failed = 0; in il4965_rs_stay_in_table()
1673 lq_sta->total_success = 0; in il4965_rs_stay_in_table()
1674 lq_sta->flush_timer = 0; in il4965_rs_stay_in_table()
1679 * history bitmaps and rate-specific stats for all rates in in il4965_rs_stay_in_table()
1683 lq_sta->table_count++; in il4965_rs_stay_in_table()
1684 if (lq_sta->table_count >= lq_sta->table_count_limit) { in il4965_rs_stay_in_table()
1685 lq_sta->table_count = 0; in il4965_rs_stay_in_table()
1690 (tbl-> in il4965_rs_stay_in_table()
1699 if (!lq_sta->stay_in_tbl) { in il4965_rs_stay_in_table()
1701 il4965_rs_rate_scale_clear_win(&(tbl->win[i])); in il4965_rs_stay_in_table()
1718 il_send_lq_cmd(il, &lq_sta->lq, CMD_ASYNC, false); in il4965_rs_update_rate_tbl()
1729 struct ieee80211_hw *hw = il->hw; in il4965_rs_rate_scale_perform()
1730 struct ieee80211_conf *conf = &hw->conf; in il4965_rs_rate_scale_perform()
1732 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in il4965_rs_rate_scale_perform()
1759 if (!ieee80211_is_data(hdr->frame_control) || in il4965_rs_rate_scale_perform()
1760 (info->flags & IEEE80211_TX_CTL_NO_ACK)) in il4965_rs_rate_scale_perform()
1763 lq_sta->supp_rates = sta->deflink.supp_rates[lq_sta->band]; in il4965_rs_rate_scale_perform()
1766 if (tid != MAX_TID_COUNT && (lq_sta->tx_agg_tid_en & (1 << tid))) { in il4965_rs_rate_scale_perform()
1767 tid_data = &il->stations[lq_sta->lq.sta_id].tid[tid]; in il4965_rs_rate_scale_perform()
1768 if (tid_data->agg.state == IL_AGG_OFF) in il4965_rs_rate_scale_perform()
1769 lq_sta->is_agg = 0; in il4965_rs_rate_scale_perform()
1771 lq_sta->is_agg = 1; in il4965_rs_rate_scale_perform()
1773 lq_sta->is_agg = 0; in il4965_rs_rate_scale_perform()
1776 * Select rate-scale / modulation-mode table to work with in in il4965_rs_rate_scale_perform()
1780 if (!lq_sta->search_better_tbl) in il4965_rs_rate_scale_perform()
1781 active_tbl = lq_sta->active_tbl; in il4965_rs_rate_scale_perform()
1783 active_tbl = 1 - lq_sta->active_tbl; in il4965_rs_rate_scale_perform()
1785 tbl = &(lq_sta->lq_info[active_tbl]); in il4965_rs_rate_scale_perform()
1786 if (is_legacy(tbl->lq_type)) in il4965_rs_rate_scale_perform()
1787 lq_sta->is_green = 0; in il4965_rs_rate_scale_perform()
1789 lq_sta->is_green = il4965_rs_use_green(il, sta); in il4965_rs_rate_scale_perform()
1790 is_green = lq_sta->is_green; in il4965_rs_rate_scale_perform()
1793 idx = lq_sta->last_txrate_idx; in il4965_rs_rate_scale_perform()
1795 D_RATE("Rate scale idx %d for type %d\n", idx, tbl->lq_type); in il4965_rs_rate_scale_perform()
1798 rate_mask = il4965_rs_get_supported_rates(lq_sta, hdr, tbl->lq_type); in il4965_rs_rate_scale_perform()
1803 if (is_legacy(tbl->lq_type)) { in il4965_rs_rate_scale_perform()
1804 if (lq_sta->band == NL80211_BAND_5GHZ) in il4965_rs_rate_scale_perform()
1808 (lq_sta->supp_rates << IL_FIRST_OFDM_RATE)); in il4965_rs_rate_scale_perform()
1811 (u16) (rate_mask & lq_sta->supp_rates); in il4965_rs_rate_scale_perform()
1821 if (lq_sta->search_better_tbl) { in il4965_rs_rate_scale_perform()
1823 tbl->lq_type = LQ_NONE; in il4965_rs_rate_scale_perform()
1824 lq_sta->search_better_tbl = 0; in il4965_rs_rate_scale_perform()
1825 tbl = &(lq_sta->lq_info[lq_sta->active_tbl]); in il4965_rs_rate_scale_perform()
1827 idx = il4965_hwrate_to_plcp_idx(tbl->current_rate); in il4965_rs_rate_scale_perform()
1835 if (!tbl->expected_tpt) { in il4965_rs_rate_scale_perform()
1836 IL_ERR("tbl->expected_tpt is NULL\n"); in il4965_rs_rate_scale_perform()
1841 if (lq_sta->max_rate_idx != -1 && lq_sta->max_rate_idx < idx) { in il4965_rs_rate_scale_perform()
1842 idx = lq_sta->max_rate_idx; in il4965_rs_rate_scale_perform()
1844 win = &(tbl->win[idx]); in il4965_rs_rate_scale_perform()
1848 win = &(tbl->win[idx]); in il4965_rs_rate_scale_perform()
1857 fail_count = win->counter - win->success_counter; in il4965_rs_rate_scale_perform()
1859 win->success_counter < RATE_MIN_SUCCESS_TH) { in il4965_rs_rate_scale_perform()
1861 win->success_counter, win->counter, idx); in il4965_rs_rate_scale_perform()
1864 win->average_tpt = IL_INVALID_VALUE; in il4965_rs_rate_scale_perform()
1874 if (win->average_tpt != in il4965_rs_rate_scale_perform()
1875 ((win->success_ratio * tbl->expected_tpt[idx] + 64) / 128)) { in il4965_rs_rate_scale_perform()
1877 win->average_tpt = in il4965_rs_rate_scale_perform()
1878 ((win->success_ratio * tbl->expected_tpt[idx] + 64) / 128); in il4965_rs_rate_scale_perform()
1882 if (lq_sta->search_better_tbl) { in il4965_rs_rate_scale_perform()
1886 if (win->average_tpt > lq_sta->last_tpt) { in il4965_rs_rate_scale_perform()
1889 "suc=%d cur-tpt=%d old-tpt=%d\n", in il4965_rs_rate_scale_perform()
1890 win->success_ratio, win->average_tpt, in il4965_rs_rate_scale_perform()
1891 lq_sta->last_tpt); in il4965_rs_rate_scale_perform()
1893 if (!is_legacy(tbl->lq_type)) in il4965_rs_rate_scale_perform()
1894 lq_sta->enable_counter = 1; in il4965_rs_rate_scale_perform()
1897 lq_sta->active_tbl = active_tbl; in il4965_rs_rate_scale_perform()
1898 current_tpt = win->average_tpt; in il4965_rs_rate_scale_perform()
1904 "suc=%d cur-tpt=%d old-tpt=%d\n", in il4965_rs_rate_scale_perform()
1905 win->success_ratio, win->average_tpt, in il4965_rs_rate_scale_perform()
1906 lq_sta->last_tpt); in il4965_rs_rate_scale_perform()
1909 tbl->lq_type = LQ_NONE; in il4965_rs_rate_scale_perform()
1912 active_tbl = lq_sta->active_tbl; in il4965_rs_rate_scale_perform()
1913 tbl = &(lq_sta->lq_info[active_tbl]); in il4965_rs_rate_scale_perform()
1916 idx = il4965_hwrate_to_plcp_idx(tbl->current_rate); in il4965_rs_rate_scale_perform()
1917 current_tpt = lq_sta->last_tpt; in il4965_rs_rate_scale_perform()
1925 lq_sta->search_better_tbl = 0; in il4965_rs_rate_scale_perform()
1934 tbl->lq_type); in il4965_rs_rate_scale_perform()
1939 if (lq_sta->max_rate_idx != -1 && lq_sta->max_rate_idx < high) in il4965_rs_rate_scale_perform()
1942 sr = win->success_ratio; in il4965_rs_rate_scale_perform()
1945 current_tpt = win->average_tpt; in il4965_rs_rate_scale_perform()
1947 low_tpt = tbl->win[low].average_tpt; in il4965_rs_rate_scale_perform()
1949 high_tpt = tbl->win[high].average_tpt; in il4965_rs_rate_scale_perform()
1956 scale_action = -1; in il4965_rs_rate_scale_perform()
1989 scale_action = -1; in il4965_rs_rate_scale_perform()
1998 if (scale_action == -1 && low != RATE_INVALID && in il4965_rs_rate_scale_perform()
1999 (sr > RATE_HIGH_TH || current_tpt > 100 * tbl->expected_tpt[low])) in il4965_rs_rate_scale_perform()
2003 case -1: in il4965_rs_rate_scale_perform()
2026 idx, scale_action, low, high, tbl->lq_type); in il4965_rs_rate_scale_perform()
2043 if (!update_lq && !done_search && !lq_sta->stay_in_tbl && win->counter) { in il4965_rs_rate_scale_perform()
2045 lq_sta->last_tpt = current_tpt; in il4965_rs_rate_scale_perform()
2047 /* Select a new "search" modulation mode to try. in il4965_rs_rate_scale_perform()
2049 if (is_legacy(tbl->lq_type)) in il4965_rs_rate_scale_perform()
2051 else if (is_siso(tbl->lq_type)) in il4965_rs_rate_scale_perform()
2054 else /* (is_mimo2(tbl->lq_type)) */ in il4965_rs_rate_scale_perform()
2059 if (lq_sta->search_better_tbl) { in il4965_rs_rate_scale_perform()
2061 tbl = &(lq_sta->lq_info[(1 - lq_sta->active_tbl)]); in il4965_rs_rate_scale_perform()
2063 il4965_rs_rate_scale_clear_win(&(tbl->win[i])); in il4965_rs_rate_scale_perform()
2066 idx = il4965_hwrate_to_plcp_idx(tbl->current_rate); in il4965_rs_rate_scale_perform()
2069 tbl->current_rate, idx); in il4965_rs_rate_scale_perform()
2070 il4965_rs_fill_link_cmd(il, lq_sta, tbl->current_rate); in il4965_rs_rate_scale_perform()
2071 il_send_lq_cmd(il, &lq_sta->lq, CMD_ASYNC, false); in il4965_rs_rate_scale_perform()
2076 if (done_search && !lq_sta->stay_in_tbl) { in il4965_rs_rate_scale_perform()
2077 /* If the "active" (non-search) mode was legacy, in il4965_rs_rate_scale_perform()
2082 tbl1 = &(lq_sta->lq_info[lq_sta->active_tbl]); in il4965_rs_rate_scale_perform()
2083 if (is_legacy(tbl1->lq_type) && !conf_is_ht(conf) && in il4965_rs_rate_scale_perform()
2084 lq_sta->action_counter > tbl1->max_search) { in il4965_rs_rate_scale_perform()
2092 if (lq_sta->enable_counter && in il4965_rs_rate_scale_perform()
2093 lq_sta->action_counter >= tbl1->max_search) { in il4965_rs_rate_scale_perform()
2094 if (lq_sta->last_tpt > IL_AGG_TPT_THREHOLD && in il4965_rs_rate_scale_perform()
2095 (lq_sta->tx_agg_tid_en & (1 << tid)) && in il4965_rs_rate_scale_perform()
2098 &il->stations[lq_sta->lq.sta_id].tid[tid]; in il4965_rs_rate_scale_perform()
2099 if (tid_data->agg.state == IL_AGG_OFF) { in il4965_rs_rate_scale_perform()
2111 tbl->current_rate = in il4965_rs_rate_scale_perform()
2114 lq_sta->last_txrate_idx = i; in il4965_rs_rate_scale_perform()
2118 * il4965_rs_initialize_lq - Initialize a station's hardware rate table
2124 * if the driver's iwl-4965-rs rate scaling algorithm is used, instead of
2148 i = lq_sta->last_txrate_idx; in il4965_rs_initialize_lq()
2150 valid_tx_ant = il->hw_params.valid_tx_ant; in il4965_rs_initialize_lq()
2152 if (!lq_sta->search_better_tbl) in il4965_rs_initialize_lq()
2153 active_tbl = lq_sta->active_tbl; in il4965_rs_initialize_lq()
2155 active_tbl = 1 - lq_sta->active_tbl; in il4965_rs_initialize_lq()
2157 tbl = &(lq_sta->lq_info[active_tbl]); in il4965_rs_initialize_lq()
2163 tbl->ant_type = il4965_first_antenna(valid_tx_ant); in il4965_rs_initialize_lq()
2164 rate |= tbl->ant_type << RATE_MCS_ANT_POS; in il4965_rs_initialize_lq()
2169 il4965_rs_get_tbl_info_from_mcs(rate, il->band, tbl, &rate_idx); in il4965_rs_initialize_lq()
2170 if (!il4965_rs_is_valid_ant(valid_tx_ant, tbl->ant_type)) in il4965_rs_initialize_lq()
2174 tbl->current_rate = rate; in il4965_rs_initialize_lq()
2177 il->stations[lq_sta->lq.sta_id].lq = &lq_sta->lq; in il4965_rs_initialize_lq()
2178 il_send_lq_cmd(il, &lq_sta->lq, CMD_SYNC, true); in il4965_rs_initialize_lq()
2186 struct sk_buff *skb = txrc->skb; in il4965_rs_get_rate()
2187 struct ieee80211_supported_band *sband = txrc->sband; in il4965_rs_get_rate()
2197 lq_sta->max_rate_idx = fls(txrc->rate_idx_mask) - 1; in il4965_rs_get_rate()
2198 if (sband->band == NL80211_BAND_5GHZ && in il4965_rs_get_rate()
2199 lq_sta->max_rate_idx != -1) in il4965_rs_get_rate()
2200 lq_sta->max_rate_idx += IL_FIRST_OFDM_RATE; in il4965_rs_get_rate()
2201 if (lq_sta->max_rate_idx < 0 || in il4965_rs_get_rate()
2202 lq_sta->max_rate_idx >= RATE_COUNT) in il4965_rs_get_rate()
2203 lq_sta->max_rate_idx = -1; in il4965_rs_get_rate()
2206 /* Treat uninitialized rate scaling data same as non-existing. */ in il4965_rs_get_rate()
2207 if (lq_sta && !lq_sta->drv) { in il4965_rs_get_rate()
2215 rate_idx = lq_sta->last_txrate_idx; in il4965_rs_get_rate()
2217 if (lq_sta->last_rate_n_flags & RATE_MCS_HT_MSK) { in il4965_rs_get_rate()
2218 rate_idx -= IL_FIRST_OFDM_RATE; in il4965_rs_get_rate()
2220 rate_idx = (rate_idx > 0) ? (rate_idx - 1) : 0; in il4965_rs_get_rate()
2221 if (il4965_rs_extract_rate(lq_sta->last_rate_n_flags) >= in il4965_rs_get_rate()
2224 info->control.rates[0].flags = IEEE80211_TX_RC_MCS; in il4965_rs_get_rate()
2225 if (lq_sta->last_rate_n_flags & RATE_MCS_SGI_MSK) in il4965_rs_get_rate()
2226 info->control.rates[0].flags |= in il4965_rs_get_rate()
2228 if (lq_sta->last_rate_n_flags & RATE_MCS_DUP_MSK) in il4965_rs_get_rate()
2229 info->control.rates[0].flags |= in il4965_rs_get_rate()
2231 if (lq_sta->last_rate_n_flags & RATE_MCS_HT40_MSK) in il4965_rs_get_rate()
2232 info->control.rates[0].flags |= in il4965_rs_get_rate()
2234 if (lq_sta->last_rate_n_flags & RATE_MCS_GF_MSK) in il4965_rs_get_rate()
2235 info->control.rates[0].flags |= in il4965_rs_get_rate()
2240 (sband->band == NL80211_BAND_5GHZ && in il4965_rs_get_rate()
2244 else if (sband->band == NL80211_BAND_5GHZ) in il4965_rs_get_rate()
2245 rate_idx -= IL_FIRST_OFDM_RATE; in il4965_rs_get_rate()
2246 info->control.rates[0].flags = 0; in il4965_rs_get_rate()
2248 info->control.rates[0].idx = rate_idx; in il4965_rs_get_rate()
2249 info->control.rates[0].count = 1; in il4965_rs_get_rate()
2256 (struct il_station_priv *)sta->drv_priv; in il4965_rs_alloc_sta()
2262 return &sta_priv->lq_sta; in il4965_rs_alloc_sta()
2272 struct ieee80211_hw *hw = il->hw; in il4965_rs_rate_init()
2273 struct ieee80211_conf *conf = &il->hw->conf; in il4965_rs_rate_init()
2274 struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap; in il4965_rs_rate_init()
2279 sta_priv = (struct il_station_priv *)sta->drv_priv; in il4965_rs_rate_init()
2280 lq_sta = &sta_priv->lq_sta; in il4965_rs_rate_init()
2281 sband = hw->wiphy->bands[conf->chandef.chan->band]; in il4965_rs_rate_init()
2283 lq_sta->lq.sta_id = sta_id; in il4965_rs_rate_init()
2287 il4965_rs_rate_scale_clear_win(&lq_sta->lq_info[j]. in il4965_rs_rate_init()
2290 lq_sta->flush_timer = 0; in il4965_rs_rate_init()
2291 lq_sta->supp_rates = sta->deflink.supp_rates[sband->band]; in il4965_rs_rate_init()
2294 il4965_rs_rate_scale_clear_win(&lq_sta->lq_info[j]. in il4965_rs_rate_init()
2302 * after assoc.. */ in il4965_rs_rate_init()
2304 lq_sta->is_dup = 0; in il4965_rs_rate_init()
2305 lq_sta->max_rate_idx = -1; in il4965_rs_rate_init()
2306 lq_sta->missed_rate_counter = IL_MISSED_RATE_MAX; in il4965_rs_rate_init()
2307 lq_sta->is_green = il4965_rs_use_green(il, sta); in il4965_rs_rate_init()
2308 lq_sta->active_legacy_rate = il->active_rate & ~(0x1000); in il4965_rs_rate_init()
2309 lq_sta->band = il->band; in il4965_rs_rate_init()
2311 * active_siso_rate mask includes 9 MBits (bit 5), and CCK (bits 0-3), in il4965_rs_rate_init()
2314 lq_sta->active_siso_rate = ht_cap->mcs.rx_mask[0] << 1; in il4965_rs_rate_init()
2315 lq_sta->active_siso_rate |= ht_cap->mcs.rx_mask[0] & 0x1; in il4965_rs_rate_init()
2316 lq_sta->active_siso_rate &= ~((u16) 0x2); in il4965_rs_rate_init()
2317 lq_sta->active_siso_rate <<= IL_FIRST_OFDM_RATE; in il4965_rs_rate_init()
2320 lq_sta->active_mimo2_rate = ht_cap->mcs.rx_mask[1] << 1; in il4965_rs_rate_init()
2321 lq_sta->active_mimo2_rate |= ht_cap->mcs.rx_mask[1] & 0x1; in il4965_rs_rate_init()
2322 lq_sta->active_mimo2_rate &= ~((u16) 0x2); in il4965_rs_rate_init()
2323 lq_sta->active_mimo2_rate <<= IL_FIRST_OFDM_RATE; in il4965_rs_rate_init()
2326 lq_sta->lq.general_params.single_stream_ant_msk = in il4965_rs_rate_init()
2327 il4965_first_antenna(il->hw_params.valid_tx_ant); in il4965_rs_rate_init()
2328 lq_sta->lq.general_params.dual_stream_ant_msk = in il4965_rs_rate_init()
2329 il->hw_params.valid_tx_ant & ~il4965_first_antenna(il->hw_params. in il4965_rs_rate_init()
2331 if (!lq_sta->lq.general_params.dual_stream_ant_msk) { in il4965_rs_rate_init()
2332 lq_sta->lq.general_params.dual_stream_ant_msk = ANT_AB; in il4965_rs_rate_init()
2333 } else if (il4965_num_of_ant(il->hw_params.valid_tx_ant) == 2) { in il4965_rs_rate_init()
2334 lq_sta->lq.general_params.dual_stream_ant_msk = in il4965_rs_rate_init()
2335 il->hw_params.valid_tx_ant; in il4965_rs_rate_init()
2339 lq_sta->tx_agg_tid_en = IL_AGG_ALL_TID; in il4965_rs_rate_init()
2340 lq_sta->drv = il; in il4965_rs_rate_init()
2343 lq_sta->last_txrate_idx = rate_lowest_index(sband, sta); in il4965_rs_rate_init()
2344 if (sband->band == NL80211_BAND_5GHZ) in il4965_rs_rate_init()
2345 lq_sta->last_txrate_idx += IL_FIRST_OFDM_RATE; in il4965_rs_rate_init()
2346 lq_sta->is_agg = 0; in il4965_rs_rate_init()
2349 lq_sta->dbg_fixed_rate = 0; in il4965_rs_rate_init()
2366 struct il_link_quality_cmd *lq_cmd = &lq_sta->lq; in il4965_rs_fill_link_cmd()
2372 il4965_rs_get_tbl_info_from_mcs(new_rate, lq_sta->band, &tbl_type, in il4965_rs_fill_link_cmd()
2383 lq_cmd->general_params.mimo_delimiter = in il4965_rs_fill_link_cmd()
2387 lq_cmd->rs_table[idx].rate_n_flags = cpu_to_le32(new_rate); in il4965_rs_fill_link_cmd()
2390 lq_cmd->general_params.single_stream_ant_msk = in il4965_rs_fill_link_cmd()
2393 lq_cmd->general_params.dual_stream_ant_msk = tbl_type.ant_type; in il4965_rs_fill_link_cmd()
2397 repeat_rate--; in il4965_rs_fill_link_cmd()
2399 valid_tx_ant = il->hw_params.valid_tx_ant; in il4965_rs_fill_link_cmd()
2406 while (repeat_rate > 0 && idx < (LINK_QUAL_MAX_RETRY_NUM - 1)) { in il4965_rs_fill_link_cmd()
2421 lq_cmd->rs_table[idx].rate_n_flags = in il4965_rs_fill_link_cmd()
2423 repeat_rate--; in il4965_rs_fill_link_cmd()
2427 il4965_rs_get_tbl_info_from_mcs(new_rate, lq_sta->band, in il4965_rs_fill_link_cmd()
2434 lq_cmd->general_params.mimo_delimiter = idx; in il4965_rs_fill_link_cmd()
2463 lq_cmd->rs_table[idx].rate_n_flags = cpu_to_le32(new_rate); in il4965_rs_fill_link_cmd()
2466 repeat_rate--; in il4965_rs_fill_link_cmd()
2469 lq_cmd->agg_params.agg_frame_cnt_limit = LINK_QUAL_AGG_FRAME_LIMIT_DEF; in il4965_rs_fill_link_cmd()
2470 lq_cmd->agg_params.agg_dis_start_th = LINK_QUAL_AGG_DISABLE_START_DEF; in il4965_rs_fill_link_cmd()
2472 lq_cmd->agg_params.agg_time_limit = in il4965_rs_fill_link_cmd()
2479 return hw->priv; in il4965_rs_alloc()
2507 il = lq_sta->drv; in il4965_rs_dbgfs_set_mcs()
2508 valid_tx_ant = il->hw_params.valid_tx_ant; in il4965_rs_dbgfs_set_mcs()
2509 if (lq_sta->dbg_fixed_rate) { in il4965_rs_dbgfs_set_mcs()
2511 ((lq_sta-> in il4965_rs_dbgfs_set_mcs()
2515 *rate_n_flags = lq_sta->dbg_fixed_rate; in il4965_rs_dbgfs_set_mcs()
2518 lq_sta->dbg_fixed_rate = 0; in il4965_rs_dbgfs_set_mcs()
2534 struct il_lq_sta *lq_sta = file->private_data; in il4965_rs_sta_dbgfs_scale_table_write()
2540 il = lq_sta->drv; in il4965_rs_sta_dbgfs_scale_table_write()
2542 buf_size = min(count, sizeof(buf) - 1); in il4965_rs_sta_dbgfs_scale_table_write()
2544 return -EFAULT; in il4965_rs_sta_dbgfs_scale_table_write()
2547 lq_sta->dbg_fixed_rate = parsed_rate; in il4965_rs_sta_dbgfs_scale_table_write()
2549 lq_sta->dbg_fixed_rate = 0; in il4965_rs_sta_dbgfs_scale_table_write()
2551 lq_sta->active_legacy_rate = 0x0FFF; /* 1 - 54 MBits, includes CCK */ in il4965_rs_sta_dbgfs_scale_table_write()
2552 lq_sta->active_siso_rate = 0x1FD0; /* 6 - 60 MBits, no 9, no CCK */ in il4965_rs_sta_dbgfs_scale_table_write()
2553 lq_sta->active_mimo2_rate = 0x1FD0; /* 6 - 60 MBits, no 9, no CCK */ in il4965_rs_sta_dbgfs_scale_table_write()
2555 D_RATE("sta_id %d rate 0x%X\n", lq_sta->lq.sta_id, in il4965_rs_sta_dbgfs_scale_table_write()
2556 lq_sta->dbg_fixed_rate); in il4965_rs_sta_dbgfs_scale_table_write()
2558 if (lq_sta->dbg_fixed_rate) { in il4965_rs_sta_dbgfs_scale_table_write()
2559 il4965_rs_fill_link_cmd(NULL, lq_sta, lq_sta->dbg_fixed_rate); in il4965_rs_sta_dbgfs_scale_table_write()
2560 il_send_lq_cmd(lq_sta->drv, &lq_sta->lq, CMD_ASYNC, false); in il4965_rs_sta_dbgfs_scale_table_write()
2576 struct il_lq_sta *lq_sta = file->private_data; in il4965_rs_sta_dbgfs_scale_table_read()
2578 struct il_scale_tbl_info *tbl = &(lq_sta->lq_info[lq_sta->active_tbl]); in il4965_rs_sta_dbgfs_scale_table_read()
2580 il = lq_sta->drv; in il4965_rs_sta_dbgfs_scale_table_read()
2583 return -ENOMEM; in il4965_rs_sta_dbgfs_scale_table_read()
2585 desc += sprintf(buff + desc, "sta_id %d\n", lq_sta->lq.sta_id); in il4965_rs_sta_dbgfs_scale_table_read()
2588 lq_sta->total_failed, lq_sta->total_success, in il4965_rs_sta_dbgfs_scale_table_read()
2589 lq_sta->active_legacy_rate); in il4965_rs_sta_dbgfs_scale_table_read()
2591 sprintf(buff + desc, "fixed rate 0x%X\n", lq_sta->dbg_fixed_rate); in il4965_rs_sta_dbgfs_scale_table_read()
2594 (il->hw_params.valid_tx_ant & ANT_A) ? "ANT_A," : "", in il4965_rs_sta_dbgfs_scale_table_read()
2595 (il->hw_params.valid_tx_ant & ANT_B) ? "ANT_B," : "", in il4965_rs_sta_dbgfs_scale_table_read()
2596 (il->hw_params.valid_tx_ant & ANT_C) ? "ANT_C" : ""); in il4965_rs_sta_dbgfs_scale_table_read()
2599 (is_legacy(tbl->lq_type)) ? "legacy" : "HT"); in il4965_rs_sta_dbgfs_scale_table_read()
2600 if (is_Ht(tbl->lq_type)) { in il4965_rs_sta_dbgfs_scale_table_read()
2603 (is_siso(tbl->lq_type)) ? "SISO" : "MIMO2"); in il4965_rs_sta_dbgfs_scale_table_read()
2606 (tbl->is_ht40) ? "40MHz" : "20MHz"); in il4965_rs_sta_dbgfs_scale_table_read()
2609 (tbl->is_SGI) ? "SGI" : "", in il4965_rs_sta_dbgfs_scale_table_read()
2610 (lq_sta->is_green) ? "GF enabled" : "", in il4965_rs_sta_dbgfs_scale_table_read()
2611 (lq_sta->is_agg) ? "AGG on" : ""); in il4965_rs_sta_dbgfs_scale_table_read()
2615 lq_sta->last_rate_n_flags); in il4965_rs_sta_dbgfs_scale_table_read()
2618 "general:" "flags=0x%X mimo-d=%d s-ant0x%x d-ant=0x%x\n", in il4965_rs_sta_dbgfs_scale_table_read()
2619 lq_sta->lq.general_params.flags, in il4965_rs_sta_dbgfs_scale_table_read()
2620 lq_sta->lq.general_params.mimo_delimiter, in il4965_rs_sta_dbgfs_scale_table_read()
2621 lq_sta->lq.general_params.single_stream_ant_msk, in il4965_rs_sta_dbgfs_scale_table_read()
2622 lq_sta->lq.general_params.dual_stream_ant_msk); in il4965_rs_sta_dbgfs_scale_table_read()
2628 le16_to_cpu(lq_sta->lq.agg_params.agg_time_limit), in il4965_rs_sta_dbgfs_scale_table_read()
2629 lq_sta->lq.agg_params.agg_dis_start_th, in il4965_rs_sta_dbgfs_scale_table_read()
2630 lq_sta->lq.agg_params.agg_frame_cnt_limit); in il4965_rs_sta_dbgfs_scale_table_read()
2635 lq_sta->lq.general_params.start_rate_idx[0], in il4965_rs_sta_dbgfs_scale_table_read()
2636 lq_sta->lq.general_params.start_rate_idx[1], in il4965_rs_sta_dbgfs_scale_table_read()
2637 lq_sta->lq.general_params.start_rate_idx[2], in il4965_rs_sta_dbgfs_scale_table_read()
2638 lq_sta->lq.general_params.start_rate_idx[3]); in il4965_rs_sta_dbgfs_scale_table_read()
2643 (lq_sta->lq.rs_table[i]. in il4965_rs_sta_dbgfs_scale_table_read()
2645 if (is_legacy(tbl->lq_type)) { in il4965_rs_sta_dbgfs_scale_table_read()
2648 le32_to_cpu(lq_sta->lq.rs_table[i]. in il4965_rs_sta_dbgfs_scale_table_read()
2655 le32_to_cpu(lq_sta->lq.rs_table[i]. in il4965_rs_sta_dbgfs_scale_table_read()
2683 struct il_lq_sta *lq_sta = file->private_data; in il4965_rs_sta_dbgfs_stats_table_read()
2687 return -ENOMEM; in il4965_rs_sta_dbgfs_stats_table_read()
2693 "rate=0x%X\n", lq_sta->active_tbl == i ? "*" : "x", in il4965_rs_sta_dbgfs_stats_table_read()
2694 lq_sta->lq_info[i].lq_type, in il4965_rs_sta_dbgfs_stats_table_read()
2695 lq_sta->lq_info[i].is_SGI, in il4965_rs_sta_dbgfs_stats_table_read()
2696 lq_sta->lq_info[i].is_ht40, in il4965_rs_sta_dbgfs_stats_table_read()
2697 lq_sta->lq_info[i].is_dup, lq_sta->is_green, in il4965_rs_sta_dbgfs_stats_table_read()
2698 lq_sta->lq_info[i].current_rate); in il4965_rs_sta_dbgfs_stats_table_read()
2703 lq_sta->lq_info[i].win[j].counter, in il4965_rs_sta_dbgfs_stats_table_read()
2704 lq_sta->lq_info[i].win[j].success_counter, in il4965_rs_sta_dbgfs_stats_table_read()
2705 lq_sta->lq_info[i].win[j].success_ratio); in il4965_rs_sta_dbgfs_stats_table_read()
2726 struct il_lq_sta *lq_sta = file->private_data; in il4965_rs_sta_dbgfs_rate_scale_data_read()
2727 struct il_scale_tbl_info *tbl = &lq_sta->lq_info[lq_sta->active_tbl]; in il4965_rs_sta_dbgfs_rate_scale_data_read()
2729 if (is_Ht(tbl->lq_type)) in il4965_rs_sta_dbgfs_rate_scale_data_read()
2732 tbl->expected_tpt[lq_sta->last_txrate_idx]); in il4965_rs_sta_dbgfs_rate_scale_data_read()
2736 il_rates[lq_sta->last_txrate_idx].ieee >> 1); in il4965_rs_sta_dbgfs_rate_scale_data_read()
2759 &lq_sta->tx_agg_tid_en); in il4965_rs_add_debugfs()