cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

4965-rs.c (80430B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/******************************************************************************
      3 *
      4 * Copyright(c) 2005 - 2011 Intel Corporation. All rights reserved.
      5 *
      6 * Contact Information:
      7 *  Intel Linux Wireless <ilw@linux.intel.com>
      8 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
      9 *
     10 *****************************************************************************/
     11#include <linux/kernel.h>
     12#include <linux/skbuff.h>
     13#include <linux/slab.h>
     14#include <net/mac80211.h>
     15
     16#include <linux/netdevice.h>
     17#include <linux/etherdevice.h>
     18#include <linux/delay.h>
     19
     20#include <linux/workqueue.h>
     21
     22#include "common.h"
     23#include "4965.h"
     24
     25#define IL4965_RS_NAME "iwl-4965-rs"
     26
     27#define NUM_TRY_BEFORE_ANT_TOGGLE 1
     28#define IL_NUMBER_TRY      1
     29#define IL_HT_NUMBER_TRY   3
     30
     31#define RATE_MAX_WINDOW		62	/* # tx in history win */
     32#define RATE_MIN_FAILURE_TH		6	/* min failures to calc tpt */
     33#define RATE_MIN_SUCCESS_TH		8	/* min successes to calc tpt */
     34
     35/* max allowed rate miss before sync LQ cmd */
     36#define IL_MISSED_RATE_MAX		15
     37/* max time to accum history 2 seconds */
     38#define RATE_SCALE_FLUSH_INTVL   (3*HZ)
     39
     40static u8 rs_ht_to_legacy[] = {
     41	RATE_6M_IDX, RATE_6M_IDX,
     42	RATE_6M_IDX, RATE_6M_IDX,
     43	RATE_6M_IDX,
     44	RATE_6M_IDX, RATE_9M_IDX,
     45	RATE_12M_IDX, RATE_18M_IDX,
     46	RATE_24M_IDX, RATE_36M_IDX,
     47	RATE_48M_IDX, RATE_54M_IDX
     48};
     49
     50static const u8 ant_toggle_lookup[] = {
     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,
     59};
     60
     61#define IL_DECLARE_RATE_INFO(r, s, ip, in, rp, rn, pp, np)    \
     62	[RATE_##r##M_IDX] = { RATE_##r##M_PLCP,      \
     63				    RATE_SISO_##s##M_PLCP, \
     64				    RATE_MIMO2_##s##M_PLCP,\
     65				    RATE_##r##M_IEEE,      \
     66				    RATE_##ip##M_IDX,    \
     67				    RATE_##in##M_IDX,    \
     68				    RATE_##rp##M_IDX,    \
     69				    RATE_##rn##M_IDX,    \
     70				    RATE_##pp##M_IDX,    \
     71				    RATE_##np##M_IDX }
     72
     73/*
     74 * Parameter order:
     75 *   rate, ht rate, prev rate, next rate, prev tgg rate, next tgg rate
     76 *
     77 * If there isn't a valid next or previous rate then INV is used which
     78 * maps to RATE_INVALID
     79 *
     80 */
     81const struct il_rate_info il_rates[RATE_COUNT] = {
     82	IL_DECLARE_RATE_INFO(1, INV, INV, 2, INV, 2, INV, 2),	/*  1mbps */
     83	IL_DECLARE_RATE_INFO(2, INV, 1, 5, 1, 5, 1, 5),		/*  2mbps */
     84	IL_DECLARE_RATE_INFO(5, INV, 2, 6, 2, 11, 2, 11),	/*5.5mbps */
     85	IL_DECLARE_RATE_INFO(11, INV, 9, 12, 9, 12, 5, 18),	/* 11mbps */
     86	IL_DECLARE_RATE_INFO(6, 6, 5, 9, 5, 11, 5, 11),		/*  6mbps */
     87	IL_DECLARE_RATE_INFO(9, 6, 6, 11, 6, 11, 5, 11),	/*  9mbps */
     88	IL_DECLARE_RATE_INFO(12, 12, 11, 18, 11, 18, 11, 18),	/* 12mbps */
     89	IL_DECLARE_RATE_INFO(18, 18, 12, 24, 12, 24, 11, 24),	/* 18mbps */
     90	IL_DECLARE_RATE_INFO(24, 24, 18, 36, 18, 36, 18, 36),	/* 24mbps */
     91	IL_DECLARE_RATE_INFO(36, 36, 24, 48, 24, 48, 24, 48),	/* 36mbps */
     92	IL_DECLARE_RATE_INFO(48, 48, 36, 54, 36, 54, 36, 54),	/* 48mbps */
     93	IL_DECLARE_RATE_INFO(54, 54, 48, INV, 48, INV, 48, INV),/* 54mbps */
     94	IL_DECLARE_RATE_INFO(60, 60, 48, INV, 48, INV, 48, INV),/* 60mbps */
     95};
     96
     97static int
     98il4965_hwrate_to_plcp_idx(u32 rate_n_flags)
     99{
    100	int idx = 0;
    101
    102	/* HT rate format */
    103	if (rate_n_flags & RATE_MCS_HT_MSK) {
    104		idx = (rate_n_flags & 0xff);
    105
    106		if (idx >= RATE_MIMO2_6M_PLCP)
    107			idx = idx - RATE_MIMO2_6M_PLCP;
    108
    109		idx += IL_FIRST_OFDM_RATE;
    110		/* skip 9M not supported in ht */
    111		if (idx >= RATE_9M_IDX)
    112			idx += 1;
    113		if (idx >= IL_FIRST_OFDM_RATE && idx <= IL_LAST_OFDM_RATE)
    114			return idx;
    115
    116		/* legacy rate format, search for match in table */
    117	} else {
    118		for (idx = 0; idx < ARRAY_SIZE(il_rates); idx++)
    119			if (il_rates[idx].plcp == (rate_n_flags & 0xFF))
    120				return idx;
    121	}
    122
    123	return -1;
    124}
    125
    126static void il4965_rs_rate_scale_perform(struct il_priv *il,
    127					 struct sk_buff *skb,
    128					 struct ieee80211_sta *sta,
    129					 struct il_lq_sta *lq_sta);
    130static void il4965_rs_fill_link_cmd(struct il_priv *il,
    131				    struct il_lq_sta *lq_sta, u32 rate_n_flags);
    132static void il4965_rs_stay_in_table(struct il_lq_sta *lq_sta,
    133				    bool force_search);
    134
    135#ifdef CONFIG_MAC80211_DEBUGFS
    136static void il4965_rs_dbgfs_set_mcs(struct il_lq_sta *lq_sta,
    137				    u32 *rate_n_flags, int idx);
    138#else
    139static void
    140il4965_rs_dbgfs_set_mcs(struct il_lq_sta *lq_sta, u32 * rate_n_flags, int idx)
    141{
    142}
    143#endif
    144
    145/*
    146 * The following tables contain the expected throughput metrics for all rates
    147 *
    148 *	1, 2, 5.5, 11, 6, 9, 12, 18, 24, 36, 48, 54, 60 MBits
    149 *
    150 * where invalid entries are zeros.
    151 *
    152 * CCK rates are only valid in legacy table and will only be used in G
    153 * (2.4 GHz) band.
    154 */
    155
    156static s32 expected_tpt_legacy[RATE_COUNT] = {
    157	7, 13, 35, 58, 40, 57, 72, 98, 121, 154, 177, 186, 0
    158};
    159
    160static s32 expected_tpt_siso20MHz[4][RATE_COUNT] = {
    161	{0, 0, 0, 0, 42, 0, 76, 102, 124, 158, 183, 193, 202},	/* Norm */
    162	{0, 0, 0, 0, 46, 0, 82, 110, 132, 167, 192, 202, 210},	/* SGI */
    163	{0, 0, 0, 0, 48, 0, 93, 135, 176, 251, 319, 351, 381},	/* AGG */
    164	{0, 0, 0, 0, 53, 0, 102, 149, 193, 275, 348, 381, 413},	/* AGG+SGI */
    165};
    166
    167static s32 expected_tpt_siso40MHz[4][RATE_COUNT] = {
    168	{0, 0, 0, 0, 77, 0, 127, 160, 184, 220, 242, 250, 257},	/* Norm */
    169	{0, 0, 0, 0, 83, 0, 135, 169, 193, 229, 250, 257, 264},	/* SGI */
    170	{0, 0, 0, 0, 96, 0, 182, 259, 328, 451, 553, 598, 640},	/* AGG */
    171	{0, 0, 0, 0, 106, 0, 199, 282, 357, 487, 593, 640, 683},	/* AGG+SGI */
    172};
    173
    174static s32 expected_tpt_mimo2_20MHz[4][RATE_COUNT] = {
    175	{0, 0, 0, 0, 74, 0, 123, 155, 179, 213, 235, 243, 250},	/* Norm */
    176	{0, 0, 0, 0, 81, 0, 131, 164, 187, 221, 242, 250, 256},	/* SGI */
    177	{0, 0, 0, 0, 92, 0, 175, 250, 317, 436, 534, 578, 619},	/* AGG */
    178	{0, 0, 0, 0, 102, 0, 192, 273, 344, 470, 573, 619, 660},	/* AGG+SGI */
    179};
    180
    181static s32 expected_tpt_mimo2_40MHz[4][RATE_COUNT] = {
    182	{0, 0, 0, 0, 123, 0, 182, 214, 235, 264, 279, 285, 289},	/* Norm */
    183	{0, 0, 0, 0, 131, 0, 191, 222, 242, 270, 284, 289, 293},	/* SGI */
    184	{0, 0, 0, 0, 180, 0, 327, 446, 545, 708, 828, 878, 922},	/* AGG */
    185	{0, 0, 0, 0, 197, 0, 355, 481, 584, 752, 872, 922, 966},	/* AGG+SGI */
    186};
    187
    188/* mbps, mcs */
    189static const struct il_rate_mcs_info il_rate_mcs[RATE_COUNT] = {
    190	{"1", "BPSK DSSS"},
    191	{"2", "QPSK DSSS"},
    192	{"5.5", "BPSK CCK"},
    193	{"11", "QPSK CCK"},
    194	{"6", "BPSK 1/2"},
    195	{"9", "BPSK 1/2"},
    196	{"12", "QPSK 1/2"},
    197	{"18", "QPSK 3/4"},
    198	{"24", "16QAM 1/2"},
    199	{"36", "16QAM 3/4"},
    200	{"48", "64QAM 2/3"},
    201	{"54", "64QAM 3/4"},
    202	{"60", "64QAM 5/6"},
    203};
    204
    205#define MCS_IDX_PER_STREAM	(8)
    206
    207static inline u8
    208il4965_rs_extract_rate(u32 rate_n_flags)
    209{
    210	return (u8) (rate_n_flags & 0xFF);
    211}
    212
    213static void
    214il4965_rs_rate_scale_clear_win(struct il_rate_scale_data *win)
    215{
    216	win->data = 0;
    217	win->success_counter = 0;
    218	win->success_ratio = IL_INVALID_VALUE;
    219	win->counter = 0;
    220	win->average_tpt = IL_INVALID_VALUE;
    221	win->stamp = 0;
    222}
    223
    224static inline u8
    225il4965_rs_is_valid_ant(u8 valid_antenna, u8 ant_type)
    226{
    227	return (ant_type & valid_antenna) == ant_type;
    228}
    229
    230/*
    231 *	removes the old data from the stats. All data that is older than
    232 *	TID_MAX_TIME_DIFF, will be deleted.
    233 */
    234static void
    235il4965_rs_tl_rm_old_stats(struct il_traffic_load *tl, u32 curr_time)
    236{
    237	/* The oldest age we want to keep */
    238	u32 oldest_time = curr_time - TID_MAX_TIME_DIFF;
    239
    240	while (tl->queue_count && tl->time_stamp < oldest_time) {
    241		tl->total -= tl->packet_count[tl->head];
    242		tl->packet_count[tl->head] = 0;
    243		tl->time_stamp += TID_QUEUE_CELL_SPACING;
    244		tl->queue_count--;
    245		tl->head++;
    246		if (tl->head >= TID_QUEUE_MAX_SIZE)
    247			tl->head = 0;
    248	}
    249}
    250
    251/*
    252 *	increment traffic load value for tid and also remove
    253 *	any old values if passed the certain time period
    254 */
    255static u8
    256il4965_rs_tl_add_packet(struct il_lq_sta *lq_data, struct ieee80211_hdr *hdr)
    257{
    258	u32 curr_time = jiffies_to_msecs(jiffies);
    259	u32 time_diff;
    260	s32 idx;
    261	struct il_traffic_load *tl = NULL;
    262	u8 tid;
    263
    264	if (ieee80211_is_data_qos(hdr->frame_control)) {
    265		u8 *qc = ieee80211_get_qos_ctl(hdr);
    266		tid = qc[0] & 0xf;
    267	} else
    268		return MAX_TID_COUNT;
    269
    270	if (unlikely(tid >= TID_MAX_LOAD_COUNT))
    271		return MAX_TID_COUNT;
    272
    273	tl = &lq_data->load[tid];
    274
    275	curr_time -= curr_time % TID_ROUND_VALUE;
    276
    277	/* Happens only for the first packet. Initialize the data */
    278	if (!(tl->queue_count)) {
    279		tl->total = 1;
    280		tl->time_stamp = curr_time;
    281		tl->queue_count = 1;
    282		tl->head = 0;
    283		tl->packet_count[0] = 1;
    284		return MAX_TID_COUNT;
    285	}
    286
    287	time_diff = TIME_WRAP_AROUND(tl->time_stamp, curr_time);
    288	idx = time_diff / TID_QUEUE_CELL_SPACING;
    289
    290	/* The history is too long: remove data that is older than */
    291	/* TID_MAX_TIME_DIFF */
    292	if (idx >= TID_QUEUE_MAX_SIZE)
    293		il4965_rs_tl_rm_old_stats(tl, curr_time);
    294
    295	idx = (tl->head + idx) % TID_QUEUE_MAX_SIZE;
    296	tl->packet_count[idx] = tl->packet_count[idx] + 1;
    297	tl->total = tl->total + 1;
    298
    299	if ((idx + 1) > tl->queue_count)
    300		tl->queue_count = idx + 1;
    301
    302	return tid;
    303}
    304
    305/*
    306	get the traffic load value for tid
    307*/
    308static u32
    309il4965_rs_tl_get_load(struct il_lq_sta *lq_data, u8 tid)
    310{
    311	u32 curr_time = jiffies_to_msecs(jiffies);
    312	u32 time_diff;
    313	s32 idx;
    314	struct il_traffic_load *tl = NULL;
    315
    316	if (tid >= TID_MAX_LOAD_COUNT)
    317		return 0;
    318
    319	tl = &(lq_data->load[tid]);
    320
    321	curr_time -= curr_time % TID_ROUND_VALUE;
    322
    323	if (!(tl->queue_count))
    324		return 0;
    325
    326	time_diff = TIME_WRAP_AROUND(tl->time_stamp, curr_time);
    327	idx = time_diff / TID_QUEUE_CELL_SPACING;
    328
    329	/* The history is too long: remove data that is older than */
    330	/* TID_MAX_TIME_DIFF */
    331	if (idx >= TID_QUEUE_MAX_SIZE)
    332		il4965_rs_tl_rm_old_stats(tl, curr_time);
    333
    334	return tl->total;
    335}
    336
    337static int
    338il4965_rs_tl_turn_on_agg_for_tid(struct il_priv *il, struct il_lq_sta *lq_data,
    339				 u8 tid, struct ieee80211_sta *sta)
    340{
    341	int ret = -EAGAIN;
    342	u32 load;
    343
    344	load = il4965_rs_tl_get_load(lq_data, tid);
    345
    346	if (load > IL_AGG_LOAD_THRESHOLD) {
    347		D_HT("Starting Tx agg: STA: %pM tid: %d\n", sta->addr, tid);
    348		ret = ieee80211_start_tx_ba_session(sta, tid, 5000);
    349		if (ret == -EAGAIN) {
    350			/*
    351			 * driver and mac80211 is out of sync
    352			 * this might be cause by reloading firmware
    353			 * stop the tx ba session here
    354			 */
    355			IL_ERR("Fail start Tx agg on tid: %d\n", tid);
    356			ieee80211_stop_tx_ba_session(sta, tid);
    357		}
    358	} else
    359		D_HT("Aggregation not enabled for tid %d because load = %u\n",
    360		     tid, load);
    361
    362	return ret;
    363}
    364
    365static void
    366il4965_rs_tl_turn_on_agg(struct il_priv *il, u8 tid, struct il_lq_sta *lq_data,
    367			 struct ieee80211_sta *sta)
    368{
    369	if (tid < TID_MAX_LOAD_COUNT)
    370		il4965_rs_tl_turn_on_agg_for_tid(il, lq_data, tid, sta);
    371	else
    372		IL_ERR("tid exceeds max load count: %d/%d\n", tid,
    373		       TID_MAX_LOAD_COUNT);
    374}
    375
    376static inline int
    377il4965_get_il4965_num_of_ant_from_rate(u32 rate_n_flags)
    378{
    379	return !!(rate_n_flags & RATE_MCS_ANT_A_MSK) +
    380	    !!(rate_n_flags & RATE_MCS_ANT_B_MSK) +
    381	    !!(rate_n_flags & RATE_MCS_ANT_C_MSK);
    382}
    383
    384/*
    385 * Static function to get the expected throughput from an il_scale_tbl_info
    386 * that wraps a NULL pointer check
    387 */
    388static s32
    389il4965_get_expected_tpt(struct il_scale_tbl_info *tbl, int rs_idx)
    390{
    391	if (tbl->expected_tpt)
    392		return tbl->expected_tpt[rs_idx];
    393	return 0;
    394}
    395
    396/*
    397 * il4965_rs_collect_tx_data - Update the success/failure sliding win
    398 *
    399 * We keep a sliding win of the last 62 packets transmitted
    400 * at this rate.  win->data contains the bitmask of successful
    401 * packets.
    402 */
    403static int
    404il4965_rs_collect_tx_data(struct il_scale_tbl_info *tbl, int scale_idx,
    405			  int attempts, int successes)
    406{
    407	struct il_rate_scale_data *win = NULL;
    408	static const u64 mask = (((u64) 1) << (RATE_MAX_WINDOW - 1));
    409	s32 fail_count, tpt;
    410
    411	if (scale_idx < 0 || scale_idx >= RATE_COUNT)
    412		return -EINVAL;
    413
    414	/* Select win for current tx bit rate */
    415	win = &(tbl->win[scale_idx]);
    416
    417	/* Get expected throughput */
    418	tpt = il4965_get_expected_tpt(tbl, scale_idx);
    419
    420	/*
    421	 * Keep track of only the latest 62 tx frame attempts in this rate's
    422	 * history win; anything older isn't really relevant any more.
    423	 * If we have filled up the sliding win, drop the oldest attempt;
    424	 * if the oldest attempt (highest bit in bitmap) shows "success",
    425	 * subtract "1" from the success counter (this is the main reason
    426	 * we keep these bitmaps!).
    427	 */
    428	while (attempts > 0) {
    429		if (win->counter >= RATE_MAX_WINDOW) {
    430
    431			/* remove earliest */
    432			win->counter = RATE_MAX_WINDOW - 1;
    433
    434			if (win->data & mask) {
    435				win->data &= ~mask;
    436				win->success_counter--;
    437			}
    438		}
    439
    440		/* Increment frames-attempted counter */
    441		win->counter++;
    442
    443		/* Shift bitmap by one frame to throw away oldest history */
    444		win->data <<= 1;
    445
    446		/* Mark the most recent #successes attempts as successful */
    447		if (successes > 0) {
    448			win->success_counter++;
    449			win->data |= 0x1;
    450			successes--;
    451		}
    452
    453		attempts--;
    454	}
    455
    456	/* Calculate current success ratio, avoid divide-by-0! */
    457	if (win->counter > 0)
    458		win->success_ratio =
    459		    128 * (100 * win->success_counter) / win->counter;
    460	else
    461		win->success_ratio = IL_INVALID_VALUE;
    462
    463	fail_count = win->counter - win->success_counter;
    464
    465	/* Calculate average throughput, if we have enough history. */
    466	if (fail_count >= RATE_MIN_FAILURE_TH ||
    467	    win->success_counter >= RATE_MIN_SUCCESS_TH)
    468		win->average_tpt = (win->success_ratio * tpt + 64) / 128;
    469	else
    470		win->average_tpt = IL_INVALID_VALUE;
    471
    472	/* Tag this win as having been updated */
    473	win->stamp = jiffies;
    474
    475	return 0;
    476}
    477
    478/*
    479 * Fill uCode API rate_n_flags field, based on "search" or "active" table.
    480 */
    481static u32
    482il4965_rate_n_flags_from_tbl(struct il_priv *il, struct il_scale_tbl_info *tbl,
    483			     int idx, u8 use_green)
    484{
    485	u32 rate_n_flags = 0;
    486
    487	if (is_legacy(tbl->lq_type)) {
    488		rate_n_flags = il_rates[idx].plcp;
    489		if (idx >= IL_FIRST_CCK_RATE && idx <= IL_LAST_CCK_RATE)
    490			rate_n_flags |= RATE_MCS_CCK_MSK;
    491
    492	} else if (is_Ht(tbl->lq_type)) {
    493		if (idx > IL_LAST_OFDM_RATE) {
    494			IL_ERR("Invalid HT rate idx %d\n", idx);
    495			idx = IL_LAST_OFDM_RATE;
    496		}
    497		rate_n_flags = RATE_MCS_HT_MSK;
    498
    499		if (is_siso(tbl->lq_type))
    500			rate_n_flags |= il_rates[idx].plcp_siso;
    501		else
    502			rate_n_flags |= il_rates[idx].plcp_mimo2;
    503	} else {
    504		IL_ERR("Invalid tbl->lq_type %d\n", tbl->lq_type);
    505	}
    506
    507	rate_n_flags |=
    508	    ((tbl->ant_type << RATE_MCS_ANT_POS) & RATE_MCS_ANT_ABC_MSK);
    509
    510	if (is_Ht(tbl->lq_type)) {
    511		if (tbl->is_ht40) {
    512			if (tbl->is_dup)
    513				rate_n_flags |= RATE_MCS_DUP_MSK;
    514			else
    515				rate_n_flags |= RATE_MCS_HT40_MSK;
    516		}
    517		if (tbl->is_SGI)
    518			rate_n_flags |= RATE_MCS_SGI_MSK;
    519
    520		if (use_green) {
    521			rate_n_flags |= RATE_MCS_GF_MSK;
    522			if (is_siso(tbl->lq_type) && tbl->is_SGI) {
    523				rate_n_flags &= ~RATE_MCS_SGI_MSK;
    524				IL_ERR("GF was set with SGI:SISO\n");
    525			}
    526		}
    527	}
    528	return rate_n_flags;
    529}
    530
    531/*
    532 * Interpret uCode API's rate_n_flags format,
    533 * fill "search" or "active" tx mode table.
    534 */
    535static int
    536il4965_rs_get_tbl_info_from_mcs(const u32 rate_n_flags,
    537				enum nl80211_band band,
    538				struct il_scale_tbl_info *tbl, int *rate_idx)
    539{
    540	u32 ant_msk = (rate_n_flags & RATE_MCS_ANT_ABC_MSK);
    541	u8 il4965_num_of_ant =
    542	    il4965_get_il4965_num_of_ant_from_rate(rate_n_flags);
    543	u8 mcs;
    544
    545	memset(tbl, 0, sizeof(struct il_scale_tbl_info));
    546	*rate_idx = il4965_hwrate_to_plcp_idx(rate_n_flags);
    547
    548	if (*rate_idx == RATE_INVALID) {
    549		*rate_idx = -1;
    550		return -EINVAL;
    551	}
    552	tbl->is_SGI = 0;	/* default legacy setup */
    553	tbl->is_ht40 = 0;
    554	tbl->is_dup = 0;
    555	tbl->ant_type = (ant_msk >> RATE_MCS_ANT_POS);
    556	tbl->lq_type = LQ_NONE;
    557	tbl->max_search = IL_MAX_SEARCH;
    558
    559	/* legacy rate format */
    560	if (!(rate_n_flags & RATE_MCS_HT_MSK)) {
    561		if (il4965_num_of_ant == 1) {
    562			if (band == NL80211_BAND_5GHZ)
    563				tbl->lq_type = LQ_A;
    564			else
    565				tbl->lq_type = LQ_G;
    566		}
    567		/* HT rate format */
    568	} else {
    569		if (rate_n_flags & RATE_MCS_SGI_MSK)
    570			tbl->is_SGI = 1;
    571
    572		if ((rate_n_flags & RATE_MCS_HT40_MSK) ||
    573		    (rate_n_flags & RATE_MCS_DUP_MSK))
    574			tbl->is_ht40 = 1;
    575
    576		if (rate_n_flags & RATE_MCS_DUP_MSK)
    577			tbl->is_dup = 1;
    578
    579		mcs = il4965_rs_extract_rate(rate_n_flags);
    580
    581		/* SISO */
    582		if (mcs <= RATE_SISO_60M_PLCP) {
    583			if (il4965_num_of_ant == 1)
    584				tbl->lq_type = LQ_SISO;	/*else NONE */
    585			/* MIMO2 */
    586		} else {
    587			if (il4965_num_of_ant == 2)
    588				tbl->lq_type = LQ_MIMO2;
    589		}
    590	}
    591	return 0;
    592}
    593
    594/* switch to another antenna/antennas and return 1 */
    595/* if no other valid antenna found, return 0 */
    596static int
    597il4965_rs_toggle_antenna(u32 valid_ant, u32 *rate_n_flags,
    598			 struct il_scale_tbl_info *tbl)
    599{
    600	u8 new_ant_type;
    601
    602	if (!tbl->ant_type || tbl->ant_type > ANT_ABC)
    603		return 0;
    604
    605	if (!il4965_rs_is_valid_ant(valid_ant, tbl->ant_type))
    606		return 0;
    607
    608	new_ant_type = ant_toggle_lookup[tbl->ant_type];
    609
    610	while (new_ant_type != tbl->ant_type &&
    611	       !il4965_rs_is_valid_ant(valid_ant, new_ant_type))
    612		new_ant_type = ant_toggle_lookup[new_ant_type];
    613
    614	if (new_ant_type == tbl->ant_type)
    615		return 0;
    616
    617	tbl->ant_type = new_ant_type;
    618	*rate_n_flags &= ~RATE_MCS_ANT_ABC_MSK;
    619	*rate_n_flags |= new_ant_type << RATE_MCS_ANT_POS;
    620	return 1;
    621}
    622
    623/*
    624 * Green-field mode is valid if the station supports it and
    625 * there are no non-GF stations present in the BSS.
    626 */
    627static bool
    628il4965_rs_use_green(struct il_priv *il, struct ieee80211_sta *sta)
    629{
    630	return (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_GRN_FLD) &&
    631	       !il->ht.non_gf_sta_present;
    632}
    633
    634/*
    635 * il4965_rs_get_supported_rates - get the available rates
    636 *
    637 * if management frame or broadcast frame only return
    638 * basic available rates.
    639 *
    640 */
    641static u16
    642il4965_rs_get_supported_rates(struct il_lq_sta *lq_sta,
    643			      struct ieee80211_hdr *hdr,
    644			      enum il_table_type rate_type)
    645{
    646	if (is_legacy(rate_type)) {
    647		return lq_sta->active_legacy_rate;
    648	} else {
    649		if (is_siso(rate_type))
    650			return lq_sta->active_siso_rate;
    651		else
    652			return lq_sta->active_mimo2_rate;
    653	}
    654}
    655
    656static u16
    657il4965_rs_get_adjacent_rate(struct il_priv *il, u8 idx, u16 rate_mask,
    658			    int rate_type)
    659{
    660	u8 high = RATE_INVALID;
    661	u8 low = RATE_INVALID;
    662
    663	/* 802.11A or ht walks to the next literal adjacent rate in
    664	 * the rate table */
    665	if (is_a_band(rate_type) || !is_legacy(rate_type)) {
    666		int i;
    667		u32 mask;
    668
    669		/* Find the previous rate that is in the rate mask */
    670		i = idx - 1;
    671		for (mask = (1 << i); i >= 0; i--, mask >>= 1) {
    672			if (rate_mask & mask) {
    673				low = i;
    674				break;
    675			}
    676		}
    677
    678		/* Find the next rate that is in the rate mask */
    679		i = idx + 1;
    680		for (mask = (1 << i); i < RATE_COUNT; i++, mask <<= 1) {
    681			if (rate_mask & mask) {
    682				high = i;
    683				break;
    684			}
    685		}
    686
    687		return (high << 8) | low;
    688	}
    689
    690	low = idx;
    691	while (low != RATE_INVALID) {
    692		low = il_rates[low].prev_rs;
    693		if (low == RATE_INVALID)
    694			break;
    695		if (rate_mask & (1 << low))
    696			break;
    697		D_RATE("Skipping masked lower rate: %d\n", low);
    698	}
    699
    700	high = idx;
    701	while (high != RATE_INVALID) {
    702		high = il_rates[high].next_rs;
    703		if (high == RATE_INVALID)
    704			break;
    705		if (rate_mask & (1 << high))
    706			break;
    707		D_RATE("Skipping masked higher rate: %d\n", high);
    708	}
    709
    710	return (high << 8) | low;
    711}
    712
    713static u32
    714il4965_rs_get_lower_rate(struct il_lq_sta *lq_sta,
    715			 struct il_scale_tbl_info *tbl, u8 scale_idx,
    716			 u8 ht_possible)
    717{
    718	s32 low;
    719	u16 rate_mask;
    720	u16 high_low;
    721	u8 switch_to_legacy = 0;
    722	u8 is_green = lq_sta->is_green;
    723	struct il_priv *il = lq_sta->drv;
    724
    725	/* check if we need to switch from HT to legacy rates.
    726	 * assumption is that mandatory rates (1Mbps or 6Mbps)
    727	 * are always supported (spec demand) */
    728	if (!is_legacy(tbl->lq_type) && (!ht_possible || !scale_idx)) {
    729		switch_to_legacy = 1;
    730		scale_idx = rs_ht_to_legacy[scale_idx];
    731		if (lq_sta->band == NL80211_BAND_5GHZ)
    732			tbl->lq_type = LQ_A;
    733		else
    734			tbl->lq_type = LQ_G;
    735
    736		if (il4965_num_of_ant(tbl->ant_type) > 1)
    737			tbl->ant_type =
    738			    il4965_first_antenna(il->hw_params.valid_tx_ant);
    739
    740		tbl->is_ht40 = 0;
    741		tbl->is_SGI = 0;
    742		tbl->max_search = IL_MAX_SEARCH;
    743	}
    744
    745	rate_mask = il4965_rs_get_supported_rates(lq_sta, NULL, tbl->lq_type);
    746
    747	/* Mask with station rate restriction */
    748	if (is_legacy(tbl->lq_type)) {
    749		/* supp_rates has no CCK bits in A mode */
    750		if (lq_sta->band == NL80211_BAND_5GHZ)
    751			rate_mask =
    752			    (u16) (rate_mask &
    753				   (lq_sta->supp_rates << IL_FIRST_OFDM_RATE));
    754		else
    755			rate_mask = (u16) (rate_mask & lq_sta->supp_rates);
    756	}
    757
    758	/* If we switched from HT to legacy, check current rate */
    759	if (switch_to_legacy && (rate_mask & (1 << scale_idx))) {
    760		low = scale_idx;
    761		goto out;
    762	}
    763
    764	high_low =
    765	    il4965_rs_get_adjacent_rate(lq_sta->drv, scale_idx, rate_mask,
    766					tbl->lq_type);
    767	low = high_low & 0xff;
    768
    769	if (low == RATE_INVALID)
    770		low = scale_idx;
    771
    772out:
    773	return il4965_rate_n_flags_from_tbl(lq_sta->drv, tbl, low, is_green);
    774}
    775
    776/*
    777 * Simple function to compare two rate scale table types
    778 */
    779static bool
    780il4965_table_type_matches(struct il_scale_tbl_info *a,
    781			  struct il_scale_tbl_info *b)
    782{
    783	return (a->lq_type == b->lq_type && a->ant_type == b->ant_type &&
    784		a->is_SGI == b->is_SGI);
    785}
    786
    787/*
    788 * mac80211 sends us Tx status
    789 */
    790static void
    791il4965_rs_tx_status(void *il_r, struct ieee80211_supported_band *sband,
    792		    struct ieee80211_sta *sta, void *il_sta,
    793		    struct sk_buff *skb)
    794{
    795	int legacy_success;
    796	int retries;
    797	int rs_idx, mac_idx, i;
    798	struct il_lq_sta *lq_sta = il_sta;
    799	struct il_link_quality_cmd *table;
    800	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
    801	struct il_priv *il = (struct il_priv *)il_r;
    802	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
    803	enum mac80211_rate_control_flags mac_flags;
    804	u32 tx_rate;
    805	struct il_scale_tbl_info tbl_type;
    806	struct il_scale_tbl_info *curr_tbl, *other_tbl, *tmp_tbl;
    807
    808	D_RATE("get frame ack response, update rate scale win\n");
    809
    810	/* Treat uninitialized rate scaling data same as non-existing. */
    811	if (!lq_sta) {
    812		D_RATE("Station rate scaling not created yet.\n");
    813		return;
    814	} else if (!lq_sta->drv) {
    815		D_RATE("Rate scaling not initialized yet.\n");
    816		return;
    817	}
    818
    819	if (!ieee80211_is_data(hdr->frame_control) ||
    820	    (info->flags & IEEE80211_TX_CTL_NO_ACK))
    821		return;
    822
    823	/* This packet was aggregated but doesn't carry status info */
    824	if ((info->flags & IEEE80211_TX_CTL_AMPDU) &&
    825	    !(info->flags & IEEE80211_TX_STAT_AMPDU))
    826		return;
    827
    828	/*
    829	 * Ignore this Tx frame response if its initial rate doesn't match
    830	 * that of latest Link Quality command.  There may be stragglers
    831	 * from a previous Link Quality command, but we're no longer interested
    832	 * in those; they're either from the "active" mode while we're trying
    833	 * to check "search" mode, or a prior "search" mode after we've moved
    834	 * to a new "search" mode (which might become the new "active" mode).
    835	 */
    836	table = &lq_sta->lq;
    837	tx_rate = le32_to_cpu(table->rs_table[0].rate_n_flags);
    838	il4965_rs_get_tbl_info_from_mcs(tx_rate, il->band, &tbl_type, &rs_idx);
    839	if (il->band == NL80211_BAND_5GHZ)
    840		rs_idx -= IL_FIRST_OFDM_RATE;
    841	mac_flags = info->status.rates[0].flags;
    842	mac_idx = info->status.rates[0].idx;
    843	/* For HT packets, map MCS to PLCP */
    844	if (mac_flags & IEEE80211_TX_RC_MCS) {
    845		mac_idx &= RATE_MCS_CODE_MSK;	/* Remove # of streams */
    846		if (mac_idx >= (RATE_9M_IDX - IL_FIRST_OFDM_RATE))
    847			mac_idx++;
    848		/*
    849		 * mac80211 HT idx is always zero-idxed; we need to move
    850		 * HT OFDM rates after CCK rates in 2.4 GHz band
    851		 */
    852		if (il->band == NL80211_BAND_2GHZ)
    853			mac_idx += IL_FIRST_OFDM_RATE;
    854	}
    855	/* Here we actually compare this rate to the latest LQ command */
    856	if (mac_idx < 0 ||
    857	    tbl_type.is_SGI != !!(mac_flags & IEEE80211_TX_RC_SHORT_GI) ||
    858	    tbl_type.is_ht40 != !!(mac_flags & IEEE80211_TX_RC_40_MHZ_WIDTH) ||
    859	    tbl_type.is_dup != !!(mac_flags & IEEE80211_TX_RC_DUP_DATA) ||
    860	    tbl_type.ant_type != info->status.antenna ||
    861	    !!(tx_rate & RATE_MCS_HT_MSK) != !!(mac_flags & IEEE80211_TX_RC_MCS)
    862	    || !!(tx_rate & RATE_MCS_GF_MSK) !=
    863	    !!(mac_flags & IEEE80211_TX_RC_GREEN_FIELD) || rs_idx != mac_idx) {
    864		D_RATE("initial rate %d does not match %d (0x%x)\n", mac_idx,
    865		       rs_idx, tx_rate);
    866		/*
    867		 * Since rates mis-match, the last LQ command may have failed.
    868		 * After IL_MISSED_RATE_MAX mis-matches, resync the uCode with
    869		 * ... driver.
    870		 */
    871		lq_sta->missed_rate_counter++;
    872		if (lq_sta->missed_rate_counter > IL_MISSED_RATE_MAX) {
    873			lq_sta->missed_rate_counter = 0;
    874			il_send_lq_cmd(il, &lq_sta->lq, CMD_ASYNC, false);
    875		}
    876		/* Regardless, ignore this status info for outdated rate */
    877		return;
    878	} else
    879		/* Rate did match, so reset the missed_rate_counter */
    880		lq_sta->missed_rate_counter = 0;
    881
    882	/* Figure out if rate scale algorithm is in active or search table */
    883	if (il4965_table_type_matches
    884	    (&tbl_type, &(lq_sta->lq_info[lq_sta->active_tbl]))) {
    885		curr_tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
    886		other_tbl = &(lq_sta->lq_info[1 - lq_sta->active_tbl]);
    887	} else
    888	    if (il4965_table_type_matches
    889		(&tbl_type, &lq_sta->lq_info[1 - lq_sta->active_tbl])) {
    890		curr_tbl = &(lq_sta->lq_info[1 - lq_sta->active_tbl]);
    891		other_tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
    892	} else {
    893		D_RATE("Neither active nor search matches tx rate\n");
    894		tmp_tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
    895		D_RATE("active- lq:%x, ant:%x, SGI:%d\n", tmp_tbl->lq_type,
    896		       tmp_tbl->ant_type, tmp_tbl->is_SGI);
    897		tmp_tbl = &(lq_sta->lq_info[1 - lq_sta->active_tbl]);
    898		D_RATE("search- lq:%x, ant:%x, SGI:%d\n", tmp_tbl->lq_type,
    899		       tmp_tbl->ant_type, tmp_tbl->is_SGI);
    900		D_RATE("actual- lq:%x, ant:%x, SGI:%d\n", tbl_type.lq_type,
    901		       tbl_type.ant_type, tbl_type.is_SGI);
    902		/*
    903		 * no matching table found, let's by-pass the data collection
    904		 * and continue to perform rate scale to find the rate table
    905		 */
    906		il4965_rs_stay_in_table(lq_sta, true);
    907		goto done;
    908	}
    909
    910	/*
    911	 * Updating the frame history depends on whether packets were
    912	 * aggregated.
    913	 *
    914	 * For aggregation, all packets were transmitted at the same rate, the
    915	 * first idx into rate scale table.
    916	 */
    917	if (info->flags & IEEE80211_TX_STAT_AMPDU) {
    918		tx_rate = le32_to_cpu(table->rs_table[0].rate_n_flags);
    919		il4965_rs_get_tbl_info_from_mcs(tx_rate, il->band, &tbl_type,
    920						&rs_idx);
    921		il4965_rs_collect_tx_data(curr_tbl, rs_idx,
    922					  info->status.ampdu_len,
    923					  info->status.ampdu_ack_len);
    924
    925		/* Update success/fail counts if not searching for new mode */
    926		if (lq_sta->stay_in_tbl) {
    927			lq_sta->total_success += info->status.ampdu_ack_len;
    928			lq_sta->total_failed +=
    929			    (info->status.ampdu_len -
    930			     info->status.ampdu_ack_len);
    931		}
    932	} else {
    933		/*
    934		 * For legacy, update frame history with for each Tx retry.
    935		 */
    936		retries = info->status.rates[0].count - 1;
    937		/* HW doesn't send more than 15 retries */
    938		retries = min(retries, 15);
    939
    940		/* The last transmission may have been successful */
    941		legacy_success = !!(info->flags & IEEE80211_TX_STAT_ACK);
    942		/* Collect data for each rate used during failed TX attempts */
    943		for (i = 0; i <= retries; ++i) {
    944			tx_rate = le32_to_cpu(table->rs_table[i].rate_n_flags);
    945			il4965_rs_get_tbl_info_from_mcs(tx_rate, il->band,
    946							&tbl_type, &rs_idx);
    947			/*
    948			 * Only collect stats if retried rate is in the same RS
    949			 * table as active/search.
    950			 */
    951			if (il4965_table_type_matches(&tbl_type, curr_tbl))
    952				tmp_tbl = curr_tbl;
    953			else if (il4965_table_type_matches
    954				 (&tbl_type, other_tbl))
    955				tmp_tbl = other_tbl;
    956			else
    957				continue;
    958			il4965_rs_collect_tx_data(tmp_tbl, rs_idx, 1,
    959						  i <
    960						  retries ? 0 : legacy_success);
    961		}
    962
    963		/* Update success/fail counts if not searching for new mode */
    964		if (lq_sta->stay_in_tbl) {
    965			lq_sta->total_success += legacy_success;
    966			lq_sta->total_failed += retries + (1 - legacy_success);
    967		}
    968	}
    969	/* The last TX rate is cached in lq_sta; it's set in if/else above */
    970	lq_sta->last_rate_n_flags = tx_rate;
    971done:
    972	/* See if there's a better rate or modulation mode to try. */
    973	if (sta->deflink.supp_rates[sband->band])
    974		il4965_rs_rate_scale_perform(il, skb, sta, lq_sta);
    975}
    976
    977/*
    978 * Begin a period of staying with a selected modulation mode.
    979 * Set "stay_in_tbl" flag to prevent any mode switches.
    980 * Set frame tx success limits according to legacy vs. high-throughput,
    981 * and reset overall (spanning all rates) tx success history stats.
    982 * These control how long we stay using same modulation mode before
    983 * searching for a new mode.
    984 */
    985static void
    986il4965_rs_set_stay_in_table(struct il_priv *il, u8 is_legacy,
    987			    struct il_lq_sta *lq_sta)
    988{
    989	D_RATE("we are staying in the same table\n");
    990	lq_sta->stay_in_tbl = 1;	/* only place this gets set */
    991	if (is_legacy) {
    992		lq_sta->table_count_limit = IL_LEGACY_TBL_COUNT;
    993		lq_sta->max_failure_limit = IL_LEGACY_FAILURE_LIMIT;
    994		lq_sta->max_success_limit = IL_LEGACY_SUCCESS_LIMIT;
    995	} else {
    996		lq_sta->table_count_limit = IL_NONE_LEGACY_TBL_COUNT;
    997		lq_sta->max_failure_limit = IL_NONE_LEGACY_FAILURE_LIMIT;
    998		lq_sta->max_success_limit = IL_NONE_LEGACY_SUCCESS_LIMIT;
    999	}
   1000	lq_sta->table_count = 0;
   1001	lq_sta->total_failed = 0;
   1002	lq_sta->total_success = 0;
   1003	lq_sta->flush_timer = jiffies;
   1004	lq_sta->action_counter = 0;
   1005}
   1006
   1007/*
   1008 * Find correct throughput table for given mode of modulation
   1009 */
   1010static void
   1011il4965_rs_set_expected_tpt_table(struct il_lq_sta *lq_sta,
   1012				 struct il_scale_tbl_info *tbl)
   1013{
   1014	/* Used to choose among HT tables */
   1015	s32(*ht_tbl_pointer)[RATE_COUNT];
   1016
   1017	/* Check for invalid LQ type */
   1018	if (WARN_ON_ONCE(!is_legacy(tbl->lq_type) && !is_Ht(tbl->lq_type))) {
   1019		tbl->expected_tpt = expected_tpt_legacy;
   1020		return;
   1021	}
   1022
   1023	/* Legacy rates have only one table */
   1024	if (is_legacy(tbl->lq_type)) {
   1025		tbl->expected_tpt = expected_tpt_legacy;
   1026		return;
   1027	}
   1028
   1029	/* Choose among many HT tables depending on number of streams
   1030	 * (SISO/MIMO2), channel width (20/40), SGI, and aggregation
   1031	 * status */
   1032	if (is_siso(tbl->lq_type) && (!tbl->is_ht40 || lq_sta->is_dup))
   1033		ht_tbl_pointer = expected_tpt_siso20MHz;
   1034	else if (is_siso(tbl->lq_type))
   1035		ht_tbl_pointer = expected_tpt_siso40MHz;
   1036	else if (is_mimo2(tbl->lq_type) && (!tbl->is_ht40 || lq_sta->is_dup))
   1037		ht_tbl_pointer = expected_tpt_mimo2_20MHz;
   1038	else			/* if (is_mimo2(tbl->lq_type)) <-- must be true */
   1039		ht_tbl_pointer = expected_tpt_mimo2_40MHz;
   1040
   1041	if (!tbl->is_SGI && !lq_sta->is_agg)	/* Normal */
   1042		tbl->expected_tpt = ht_tbl_pointer[0];
   1043	else if (tbl->is_SGI && !lq_sta->is_agg)	/* SGI */
   1044		tbl->expected_tpt = ht_tbl_pointer[1];
   1045	else if (!tbl->is_SGI && lq_sta->is_agg)	/* AGG */
   1046		tbl->expected_tpt = ht_tbl_pointer[2];
   1047	else			/* AGG+SGI */
   1048		tbl->expected_tpt = ht_tbl_pointer[3];
   1049}
   1050
   1051/*
   1052 * Find starting rate for new "search" high-throughput mode of modulation.
   1053 * Goal is to find lowest expected rate (under perfect conditions) that is
   1054 * above the current measured throughput of "active" mode, to give new mode
   1055 * a fair chance to prove itself without too many challenges.
   1056 *
   1057 * This gets called when transitioning to more aggressive modulation
   1058 * (i.e. legacy to SISO or MIMO, or SISO to MIMO), as well as less aggressive
   1059 * (i.e. MIMO to SISO).  When moving to MIMO, bit rate will typically need
   1060 * to decrease to match "active" throughput.  When moving from MIMO to SISO,
   1061 * bit rate will typically need to increase, but not if performance was bad.
   1062 */
   1063static s32
   1064il4965_rs_get_best_rate(struct il_priv *il, struct il_lq_sta *lq_sta,
   1065			struct il_scale_tbl_info *tbl,	/* "search" */
   1066			u16 rate_mask, s8 idx)
   1067{
   1068	/* "active" values */
   1069	struct il_scale_tbl_info *active_tbl =
   1070	    &(lq_sta->lq_info[lq_sta->active_tbl]);
   1071	s32 active_sr = active_tbl->win[idx].success_ratio;
   1072	s32 active_tpt = active_tbl->expected_tpt[idx];
   1073
   1074	/* expected "search" throughput */
   1075	s32 *tpt_tbl = tbl->expected_tpt;
   1076
   1077	s32 new_rate, high, low, start_hi;
   1078	u16 high_low;
   1079	s8 rate = idx;
   1080
   1081	new_rate = high = low = start_hi = RATE_INVALID;
   1082
   1083	for (;;) {
   1084		high_low =
   1085		    il4965_rs_get_adjacent_rate(il, rate, rate_mask,
   1086						tbl->lq_type);
   1087
   1088		low = high_low & 0xff;
   1089		high = (high_low >> 8) & 0xff;
   1090
   1091		/*
   1092		 * Lower the "search" bit rate, to give new "search" mode
   1093		 * approximately the same throughput as "active" if:
   1094		 *
   1095		 * 1) "Active" mode has been working modestly well (but not
   1096		 *    great), and expected "search" throughput (under perfect
   1097		 *    conditions) at candidate rate is above the actual
   1098		 *    measured "active" throughput (but less than expected
   1099		 *    "active" throughput under perfect conditions).
   1100		 * OR
   1101		 * 2) "Active" mode has been working perfectly or very well
   1102		 *    and expected "search" throughput (under perfect
   1103		 *    conditions) at candidate rate is above expected
   1104		 *    "active" throughput (under perfect conditions).
   1105		 */
   1106		if ((100 * tpt_tbl[rate] > lq_sta->last_tpt &&
   1107		     (active_sr > RATE_DECREASE_TH && active_sr <= RATE_HIGH_TH
   1108		      && tpt_tbl[rate] <= active_tpt)) ||
   1109		    (active_sr >= RATE_SCALE_SWITCH &&
   1110		     tpt_tbl[rate] > active_tpt)) {
   1111
   1112			/* (2nd or later pass)
   1113			 * If we've already tried to raise the rate, and are
   1114			 * now trying to lower it, use the higher rate. */
   1115			if (start_hi != RATE_INVALID) {
   1116				new_rate = start_hi;
   1117				break;
   1118			}
   1119
   1120			new_rate = rate;
   1121
   1122			/* Loop again with lower rate */
   1123			if (low != RATE_INVALID)
   1124				rate = low;
   1125
   1126			/* Lower rate not available, use the original */
   1127			else
   1128				break;
   1129
   1130			/* Else try to raise the "search" rate to match "active" */
   1131		} else {
   1132			/* (2nd or later pass)
   1133			 * If we've already tried to lower the rate, and are
   1134			 * now trying to raise it, use the lower rate. */
   1135			if (new_rate != RATE_INVALID)
   1136				break;
   1137
   1138			/* Loop again with higher rate */
   1139			else if (high != RATE_INVALID) {
   1140				start_hi = high;
   1141				rate = high;
   1142
   1143				/* Higher rate not available, use the original */
   1144			} else {
   1145				new_rate = rate;
   1146				break;
   1147			}
   1148		}
   1149	}
   1150
   1151	return new_rate;
   1152}
   1153
   1154/*
   1155 * Set up search table for MIMO2
   1156 */
   1157static int
   1158il4965_rs_switch_to_mimo2(struct il_priv *il, struct il_lq_sta *lq_sta,
   1159			  struct ieee80211_conf *conf,
   1160			  struct ieee80211_sta *sta,
   1161			  struct il_scale_tbl_info *tbl, int idx)
   1162{
   1163	u16 rate_mask;
   1164	s32 rate;
   1165	s8 is_green = lq_sta->is_green;
   1166
   1167	if (!conf_is_ht(conf) || !sta->deflink.ht_cap.ht_supported)
   1168		return -1;
   1169
   1170	if (sta->smps_mode == IEEE80211_SMPS_STATIC)
   1171		return -1;
   1172
   1173	/* Need both Tx chains/antennas to support MIMO */
   1174	if (il->hw_params.tx_chains_num < 2)
   1175		return -1;
   1176
   1177	D_RATE("LQ: try to switch to MIMO2\n");
   1178
   1179	tbl->lq_type = LQ_MIMO2;
   1180	tbl->is_dup = lq_sta->is_dup;
   1181	tbl->action = 0;
   1182	tbl->max_search = IL_MAX_SEARCH;
   1183	rate_mask = lq_sta->active_mimo2_rate;
   1184
   1185	if (il_is_ht40_tx_allowed(il, &sta->deflink.ht_cap))
   1186		tbl->is_ht40 = 1;
   1187	else
   1188		tbl->is_ht40 = 0;
   1189
   1190	il4965_rs_set_expected_tpt_table(lq_sta, tbl);
   1191
   1192	rate = il4965_rs_get_best_rate(il, lq_sta, tbl, rate_mask, idx);
   1193
   1194	D_RATE("LQ: MIMO2 best rate %d mask %X\n", rate, rate_mask);
   1195	if (rate == RATE_INVALID || !((1 << rate) & rate_mask)) {
   1196		D_RATE("Can't switch with idx %d rate mask %x\n", rate,
   1197		       rate_mask);
   1198		return -1;
   1199	}
   1200	tbl->current_rate =
   1201	    il4965_rate_n_flags_from_tbl(il, tbl, rate, is_green);
   1202
   1203	D_RATE("LQ: Switch to new mcs %X idx is green %X\n", tbl->current_rate,
   1204	       is_green);
   1205	return 0;
   1206}
   1207
   1208/*
   1209 * Set up search table for SISO
   1210 */
   1211static int
   1212il4965_rs_switch_to_siso(struct il_priv *il, struct il_lq_sta *lq_sta,
   1213			 struct ieee80211_conf *conf, struct ieee80211_sta *sta,
   1214			 struct il_scale_tbl_info *tbl, int idx)
   1215{
   1216	u16 rate_mask;
   1217	u8 is_green = lq_sta->is_green;
   1218	s32 rate;
   1219
   1220	if (!conf_is_ht(conf) || !sta->deflink.ht_cap.ht_supported)
   1221		return -1;
   1222
   1223	D_RATE("LQ: try to switch to SISO\n");
   1224
   1225	tbl->is_dup = lq_sta->is_dup;
   1226	tbl->lq_type = LQ_SISO;
   1227	tbl->action = 0;
   1228	tbl->max_search = IL_MAX_SEARCH;
   1229	rate_mask = lq_sta->active_siso_rate;
   1230
   1231	if (il_is_ht40_tx_allowed(il, &sta->deflink.ht_cap))
   1232		tbl->is_ht40 = 1;
   1233	else
   1234		tbl->is_ht40 = 0;
   1235
   1236	if (is_green)
   1237		tbl->is_SGI = 0;	/*11n spec: no SGI in SISO+Greenfield */
   1238
   1239	il4965_rs_set_expected_tpt_table(lq_sta, tbl);
   1240	rate = il4965_rs_get_best_rate(il, lq_sta, tbl, rate_mask, idx);
   1241
   1242	D_RATE("LQ: get best rate %d mask %X\n", rate, rate_mask);
   1243	if (rate == RATE_INVALID || !((1 << rate) & rate_mask)) {
   1244		D_RATE("can not switch with idx %d rate mask %x\n", rate,
   1245		       rate_mask);
   1246		return -1;
   1247	}
   1248	tbl->current_rate =
   1249	    il4965_rate_n_flags_from_tbl(il, tbl, rate, is_green);
   1250	D_RATE("LQ: Switch to new mcs %X idx is green %X\n", tbl->current_rate,
   1251	       is_green);
   1252	return 0;
   1253}
   1254
   1255/*
   1256 * Try to switch to new modulation mode from legacy
   1257 */
   1258static int
   1259il4965_rs_move_legacy_other(struct il_priv *il, struct il_lq_sta *lq_sta,
   1260			    struct ieee80211_conf *conf,
   1261			    struct ieee80211_sta *sta, int idx)
   1262{
   1263	struct il_scale_tbl_info *tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
   1264	struct il_scale_tbl_info *search_tbl =
   1265	    &(lq_sta->lq_info[(1 - lq_sta->active_tbl)]);
   1266	struct il_rate_scale_data *win = &(tbl->win[idx]);
   1267	u32 sz =
   1268	    (sizeof(struct il_scale_tbl_info) -
   1269	     (sizeof(struct il_rate_scale_data) * RATE_COUNT));
   1270	u8 start_action;
   1271	u8 valid_tx_ant = il->hw_params.valid_tx_ant;
   1272	u8 tx_chains_num = il->hw_params.tx_chains_num;
   1273	int ret = 0;
   1274	u8 update_search_tbl_counter = 0;
   1275
   1276	tbl->action = IL_LEGACY_SWITCH_SISO;
   1277
   1278	start_action = tbl->action;
   1279	for (;;) {
   1280		lq_sta->action_counter++;
   1281		switch (tbl->action) {
   1282		case IL_LEGACY_SWITCH_ANTENNA1:
   1283		case IL_LEGACY_SWITCH_ANTENNA2:
   1284			D_RATE("LQ: Legacy toggle Antenna\n");
   1285
   1286			if ((tbl->action == IL_LEGACY_SWITCH_ANTENNA1 &&
   1287			     tx_chains_num <= 1) ||
   1288			    (tbl->action == IL_LEGACY_SWITCH_ANTENNA2 &&
   1289			     tx_chains_num <= 2))
   1290				break;
   1291
   1292			/* Don't change antenna if success has been great */
   1293			if (win->success_ratio >= IL_RS_GOOD_RATIO)
   1294				break;
   1295
   1296			/* Set up search table to try other antenna */
   1297			memcpy(search_tbl, tbl, sz);
   1298
   1299			if (il4965_rs_toggle_antenna
   1300			    (valid_tx_ant, &search_tbl->current_rate,
   1301			     search_tbl)) {
   1302				update_search_tbl_counter = 1;
   1303				il4965_rs_set_expected_tpt_table(lq_sta,
   1304								 search_tbl);
   1305				goto out;
   1306			}
   1307			break;
   1308		case IL_LEGACY_SWITCH_SISO:
   1309			D_RATE("LQ: Legacy switch to SISO\n");
   1310
   1311			/* Set up search table to try SISO */
   1312			memcpy(search_tbl, tbl, sz);
   1313			search_tbl->is_SGI = 0;
   1314			ret =
   1315			    il4965_rs_switch_to_siso(il, lq_sta, conf, sta,
   1316						     search_tbl, idx);
   1317			if (!ret) {
   1318				lq_sta->action_counter = 0;
   1319				goto out;
   1320			}
   1321
   1322			break;
   1323		case IL_LEGACY_SWITCH_MIMO2_AB:
   1324		case IL_LEGACY_SWITCH_MIMO2_AC:
   1325		case IL_LEGACY_SWITCH_MIMO2_BC:
   1326			D_RATE("LQ: Legacy switch to MIMO2\n");
   1327
   1328			/* Set up search table to try MIMO */
   1329			memcpy(search_tbl, tbl, sz);
   1330			search_tbl->is_SGI = 0;
   1331
   1332			if (tbl->action == IL_LEGACY_SWITCH_MIMO2_AB)
   1333				search_tbl->ant_type = ANT_AB;
   1334			else if (tbl->action == IL_LEGACY_SWITCH_MIMO2_AC)
   1335				search_tbl->ant_type = ANT_AC;
   1336			else
   1337				search_tbl->ant_type = ANT_BC;
   1338
   1339			if (!il4965_rs_is_valid_ant
   1340			    (valid_tx_ant, search_tbl->ant_type))
   1341				break;
   1342
   1343			ret =
   1344			    il4965_rs_switch_to_mimo2(il, lq_sta, conf, sta,
   1345						      search_tbl, idx);
   1346			if (!ret) {
   1347				lq_sta->action_counter = 0;
   1348				goto out;
   1349			}
   1350			break;
   1351		}
   1352		tbl->action++;
   1353		if (tbl->action > IL_LEGACY_SWITCH_MIMO2_BC)
   1354			tbl->action = IL_LEGACY_SWITCH_ANTENNA1;
   1355
   1356		if (tbl->action == start_action)
   1357			break;
   1358
   1359	}
   1360	search_tbl->lq_type = LQ_NONE;
   1361	return 0;
   1362
   1363out:
   1364	lq_sta->search_better_tbl = 1;
   1365	tbl->action++;
   1366	if (tbl->action > IL_LEGACY_SWITCH_MIMO2_BC)
   1367		tbl->action = IL_LEGACY_SWITCH_ANTENNA1;
   1368	if (update_search_tbl_counter)
   1369		search_tbl->action = tbl->action;
   1370	return 0;
   1371
   1372}
   1373
   1374/*
   1375 * Try to switch to new modulation mode from SISO
   1376 */
   1377static int
   1378il4965_rs_move_siso_to_other(struct il_priv *il, struct il_lq_sta *lq_sta,
   1379			     struct ieee80211_conf *conf,
   1380			     struct ieee80211_sta *sta, int idx)
   1381{
   1382	u8 is_green = lq_sta->is_green;
   1383	struct il_scale_tbl_info *tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
   1384	struct il_scale_tbl_info *search_tbl =
   1385	    &(lq_sta->lq_info[(1 - lq_sta->active_tbl)]);
   1386	struct il_rate_scale_data *win = &(tbl->win[idx]);
   1387	struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
   1388	u32 sz =
   1389	    (sizeof(struct il_scale_tbl_info) -
   1390	     (sizeof(struct il_rate_scale_data) * RATE_COUNT));
   1391	u8 start_action;
   1392	u8 valid_tx_ant = il->hw_params.valid_tx_ant;
   1393	u8 tx_chains_num = il->hw_params.tx_chains_num;
   1394	u8 update_search_tbl_counter = 0;
   1395	int ret;
   1396
   1397	start_action = tbl->action;
   1398
   1399	for (;;) {
   1400		lq_sta->action_counter++;
   1401		switch (tbl->action) {
   1402		case IL_SISO_SWITCH_ANTENNA1:
   1403		case IL_SISO_SWITCH_ANTENNA2:
   1404			D_RATE("LQ: SISO toggle Antenna\n");
   1405			if ((tbl->action == IL_SISO_SWITCH_ANTENNA1 &&
   1406			     tx_chains_num <= 1) ||
   1407			    (tbl->action == IL_SISO_SWITCH_ANTENNA2 &&
   1408			     tx_chains_num <= 2))
   1409				break;
   1410
   1411			if (win->success_ratio >= IL_RS_GOOD_RATIO)
   1412				break;
   1413
   1414			memcpy(search_tbl, tbl, sz);
   1415			if (il4965_rs_toggle_antenna
   1416			    (valid_tx_ant, &search_tbl->current_rate,
   1417			     search_tbl)) {
   1418				update_search_tbl_counter = 1;
   1419				goto out;
   1420			}
   1421			break;
   1422		case IL_SISO_SWITCH_MIMO2_AB:
   1423		case IL_SISO_SWITCH_MIMO2_AC:
   1424		case IL_SISO_SWITCH_MIMO2_BC:
   1425			D_RATE("LQ: SISO switch to MIMO2\n");
   1426			memcpy(search_tbl, tbl, sz);
   1427			search_tbl->is_SGI = 0;
   1428
   1429			if (tbl->action == IL_SISO_SWITCH_MIMO2_AB)
   1430				search_tbl->ant_type = ANT_AB;
   1431			else if (tbl->action == IL_SISO_SWITCH_MIMO2_AC)
   1432				search_tbl->ant_type = ANT_AC;
   1433			else
   1434				search_tbl->ant_type = ANT_BC;
   1435
   1436			if (!il4965_rs_is_valid_ant
   1437			    (valid_tx_ant, search_tbl->ant_type))
   1438				break;
   1439
   1440			ret =
   1441			    il4965_rs_switch_to_mimo2(il, lq_sta, conf, sta,
   1442						      search_tbl, idx);
   1443			if (!ret)
   1444				goto out;
   1445			break;
   1446		case IL_SISO_SWITCH_GI:
   1447			if (!tbl->is_ht40 &&
   1448			    !(ht_cap->cap & IEEE80211_HT_CAP_SGI_20))
   1449				break;
   1450			if (tbl->is_ht40 &&
   1451			    !(ht_cap->cap & IEEE80211_HT_CAP_SGI_40))
   1452				break;
   1453
   1454			D_RATE("LQ: SISO toggle SGI/NGI\n");
   1455
   1456			memcpy(search_tbl, tbl, sz);
   1457			if (is_green) {
   1458				if (!tbl->is_SGI)
   1459					break;
   1460				else
   1461					IL_ERR("SGI was set in GF+SISO\n");
   1462			}
   1463			search_tbl->is_SGI = !tbl->is_SGI;
   1464			il4965_rs_set_expected_tpt_table(lq_sta, search_tbl);
   1465			if (tbl->is_SGI) {
   1466				s32 tpt = lq_sta->last_tpt / 100;
   1467				if (tpt >= search_tbl->expected_tpt[idx])
   1468					break;
   1469			}
   1470			search_tbl->current_rate =
   1471			    il4965_rate_n_flags_from_tbl(il, search_tbl, idx,
   1472							 is_green);
   1473			update_search_tbl_counter = 1;
   1474			goto out;
   1475		}
   1476		tbl->action++;
   1477		if (tbl->action > IL_SISO_SWITCH_GI)
   1478			tbl->action = IL_SISO_SWITCH_ANTENNA1;
   1479
   1480		if (tbl->action == start_action)
   1481			break;
   1482	}
   1483	search_tbl->lq_type = LQ_NONE;
   1484	return 0;
   1485
   1486out:
   1487	lq_sta->search_better_tbl = 1;
   1488	tbl->action++;
   1489	if (tbl->action > IL_SISO_SWITCH_GI)
   1490		tbl->action = IL_SISO_SWITCH_ANTENNA1;
   1491	if (update_search_tbl_counter)
   1492		search_tbl->action = tbl->action;
   1493
   1494	return 0;
   1495}
   1496
   1497/*
   1498 * Try to switch to new modulation mode from MIMO2
   1499 */
   1500static int
   1501il4965_rs_move_mimo2_to_other(struct il_priv *il, struct il_lq_sta *lq_sta,
   1502			      struct ieee80211_conf *conf,
   1503			      struct ieee80211_sta *sta, int idx)
   1504{
   1505	s8 is_green = lq_sta->is_green;
   1506	struct il_scale_tbl_info *tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
   1507	struct il_scale_tbl_info *search_tbl =
   1508	    &(lq_sta->lq_info[(1 - lq_sta->active_tbl)]);
   1509	struct il_rate_scale_data *win = &(tbl->win[idx]);
   1510	struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
   1511	u32 sz =
   1512	    (sizeof(struct il_scale_tbl_info) -
   1513	     (sizeof(struct il_rate_scale_data) * RATE_COUNT));
   1514	u8 start_action;
   1515	u8 valid_tx_ant = il->hw_params.valid_tx_ant;
   1516	u8 tx_chains_num = il->hw_params.tx_chains_num;
   1517	u8 update_search_tbl_counter = 0;
   1518	int ret;
   1519
   1520	start_action = tbl->action;
   1521	for (;;) {
   1522		lq_sta->action_counter++;
   1523		switch (tbl->action) {
   1524		case IL_MIMO2_SWITCH_ANTENNA1:
   1525		case IL_MIMO2_SWITCH_ANTENNA2:
   1526			D_RATE("LQ: MIMO2 toggle Antennas\n");
   1527
   1528			if (tx_chains_num <= 2)
   1529				break;
   1530
   1531			if (win->success_ratio >= IL_RS_GOOD_RATIO)
   1532				break;
   1533
   1534			memcpy(search_tbl, tbl, sz);
   1535			if (il4965_rs_toggle_antenna
   1536			    (valid_tx_ant, &search_tbl->current_rate,
   1537			     search_tbl)) {
   1538				update_search_tbl_counter = 1;
   1539				goto out;
   1540			}
   1541			break;
   1542		case IL_MIMO2_SWITCH_SISO_A:
   1543		case IL_MIMO2_SWITCH_SISO_B:
   1544		case IL_MIMO2_SWITCH_SISO_C:
   1545			D_RATE("LQ: MIMO2 switch to SISO\n");
   1546
   1547			/* Set up new search table for SISO */
   1548			memcpy(search_tbl, tbl, sz);
   1549
   1550			if (tbl->action == IL_MIMO2_SWITCH_SISO_A)
   1551				search_tbl->ant_type = ANT_A;
   1552			else if (tbl->action == IL_MIMO2_SWITCH_SISO_B)
   1553				search_tbl->ant_type = ANT_B;
   1554			else
   1555				search_tbl->ant_type = ANT_C;
   1556
   1557			if (!il4965_rs_is_valid_ant
   1558			    (valid_tx_ant, search_tbl->ant_type))
   1559				break;
   1560
   1561			ret =
   1562			    il4965_rs_switch_to_siso(il, lq_sta, conf, sta,
   1563						     search_tbl, idx);
   1564			if (!ret)
   1565				goto out;
   1566
   1567			break;
   1568
   1569		case IL_MIMO2_SWITCH_GI:
   1570			if (!tbl->is_ht40 &&
   1571			    !(ht_cap->cap & IEEE80211_HT_CAP_SGI_20))
   1572				break;
   1573			if (tbl->is_ht40 &&
   1574			    !(ht_cap->cap & IEEE80211_HT_CAP_SGI_40))
   1575				break;
   1576
   1577			D_RATE("LQ: MIMO2 toggle SGI/NGI\n");
   1578
   1579			/* Set up new search table for MIMO2 */
   1580			memcpy(search_tbl, tbl, sz);
   1581			search_tbl->is_SGI = !tbl->is_SGI;
   1582			il4965_rs_set_expected_tpt_table(lq_sta, search_tbl);
   1583			/*
   1584			 * If active table already uses the fastest possible
   1585			 * modulation (dual stream with short guard interval),
   1586			 * and it's working well, there's no need to look
   1587			 * for a better type of modulation!
   1588			 */
   1589			if (tbl->is_SGI) {
   1590				s32 tpt = lq_sta->last_tpt / 100;
   1591				if (tpt >= search_tbl->expected_tpt[idx])
   1592					break;
   1593			}
   1594			search_tbl->current_rate =
   1595			    il4965_rate_n_flags_from_tbl(il, search_tbl, idx,
   1596							 is_green);
   1597			update_search_tbl_counter = 1;
   1598			goto out;
   1599
   1600		}
   1601		tbl->action++;
   1602		if (tbl->action > IL_MIMO2_SWITCH_GI)
   1603			tbl->action = IL_MIMO2_SWITCH_ANTENNA1;
   1604
   1605		if (tbl->action == start_action)
   1606			break;
   1607	}
   1608	search_tbl->lq_type = LQ_NONE;
   1609	return 0;
   1610out:
   1611	lq_sta->search_better_tbl = 1;
   1612	tbl->action++;
   1613	if (tbl->action > IL_MIMO2_SWITCH_GI)
   1614		tbl->action = IL_MIMO2_SWITCH_ANTENNA1;
   1615	if (update_search_tbl_counter)
   1616		search_tbl->action = tbl->action;
   1617
   1618	return 0;
   1619
   1620}
   1621
   1622/*
   1623 * Check whether we should continue using same modulation mode, or
   1624 * begin search for a new mode, based on:
   1625 * 1) # tx successes or failures while using this mode
   1626 * 2) # times calling this function
   1627 * 3) elapsed time in this mode (not used, for now)
   1628 */
   1629static void
   1630il4965_rs_stay_in_table(struct il_lq_sta *lq_sta, bool force_search)
   1631{
   1632	struct il_scale_tbl_info *tbl;
   1633	int i;
   1634	int active_tbl;
   1635	int flush_interval_passed = 0;
   1636	struct il_priv *il;
   1637
   1638	il = lq_sta->drv;
   1639	active_tbl = lq_sta->active_tbl;
   1640
   1641	tbl = &(lq_sta->lq_info[active_tbl]);
   1642
   1643	/* If we've been disallowing search, see if we should now allow it */
   1644	if (lq_sta->stay_in_tbl) {
   1645
   1646		/* Elapsed time using current modulation mode */
   1647		if (lq_sta->flush_timer)
   1648			flush_interval_passed =
   1649			    time_after(jiffies,
   1650				       (unsigned long)(lq_sta->flush_timer +
   1651						       RATE_SCALE_FLUSH_INTVL));
   1652
   1653		/*
   1654		 * Check if we should allow search for new modulation mode.
   1655		 * If many frames have failed or succeeded, or we've used
   1656		 * this same modulation for a long time, allow search, and
   1657		 * reset history stats that keep track of whether we should
   1658		 * allow a new search.  Also (below) reset all bitmaps and
   1659		 * stats in active history.
   1660		 */
   1661		if (force_search ||
   1662		    lq_sta->total_failed > lq_sta->max_failure_limit ||
   1663		    lq_sta->total_success > lq_sta->max_success_limit ||
   1664		    (!lq_sta->search_better_tbl && lq_sta->flush_timer &&
   1665		     flush_interval_passed)) {
   1666			D_RATE("LQ: stay is expired %d %d %d\n",
   1667			       lq_sta->total_failed, lq_sta->total_success,
   1668			       flush_interval_passed);
   1669
   1670			/* Allow search for new mode */
   1671			lq_sta->stay_in_tbl = 0;	/* only place reset */
   1672			lq_sta->total_failed = 0;
   1673			lq_sta->total_success = 0;
   1674			lq_sta->flush_timer = 0;
   1675
   1676			/*
   1677			 * Else if we've used this modulation mode enough repetitions
   1678			 * (regardless of elapsed time or success/failure), reset
   1679			 * history bitmaps and rate-specific stats for all rates in
   1680			 * active table.
   1681			 */
   1682		} else {
   1683			lq_sta->table_count++;
   1684			if (lq_sta->table_count >= lq_sta->table_count_limit) {
   1685				lq_sta->table_count = 0;
   1686
   1687				D_RATE("LQ: stay in table clear win\n");
   1688				for (i = 0; i < RATE_COUNT; i++)
   1689					il4965_rs_rate_scale_clear_win(&
   1690								       (tbl->
   1691									win
   1692									[i]));
   1693			}
   1694		}
   1695
   1696		/* If transitioning to allow "search", reset all history
   1697		 * bitmaps and stats in active table (this will become the new
   1698		 * "search" table). */
   1699		if (!lq_sta->stay_in_tbl) {
   1700			for (i = 0; i < RATE_COUNT; i++)
   1701				il4965_rs_rate_scale_clear_win(&(tbl->win[i]));
   1702		}
   1703	}
   1704}
   1705
   1706/*
   1707 * setup rate table in uCode
   1708 */
   1709static void
   1710il4965_rs_update_rate_tbl(struct il_priv *il, struct il_lq_sta *lq_sta,
   1711			  struct il_scale_tbl_info *tbl, int idx, u8 is_green)
   1712{
   1713	u32 rate;
   1714
   1715	/* Update uCode's rate table. */
   1716	rate = il4965_rate_n_flags_from_tbl(il, tbl, idx, is_green);
   1717	il4965_rs_fill_link_cmd(il, lq_sta, rate);
   1718	il_send_lq_cmd(il, &lq_sta->lq, CMD_ASYNC, false);
   1719}
   1720
   1721/*
   1722 * Do rate scaling and search for new modulation mode.
   1723 */
   1724static void
   1725il4965_rs_rate_scale_perform(struct il_priv *il, struct sk_buff *skb,
   1726			     struct ieee80211_sta *sta,
   1727			     struct il_lq_sta *lq_sta)
   1728{
   1729	struct ieee80211_hw *hw = il->hw;
   1730	struct ieee80211_conf *conf = &hw->conf;
   1731	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
   1732	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
   1733	int low = RATE_INVALID;
   1734	int high = RATE_INVALID;
   1735	int idx;
   1736	int i;
   1737	struct il_rate_scale_data *win = NULL;
   1738	int current_tpt = IL_INVALID_VALUE;
   1739	int low_tpt = IL_INVALID_VALUE;
   1740	int high_tpt = IL_INVALID_VALUE;
   1741	u32 fail_count;
   1742	s8 scale_action = 0;
   1743	u16 rate_mask;
   1744	u8 update_lq = 0;
   1745	struct il_scale_tbl_info *tbl, *tbl1;
   1746	u16 rate_scale_idx_msk = 0;
   1747	u8 is_green = 0;
   1748	u8 active_tbl = 0;
   1749	u8 done_search = 0;
   1750	u16 high_low;
   1751	s32 sr;
   1752	u8 tid;
   1753	struct il_tid_data *tid_data;
   1754
   1755	D_RATE("rate scale calculate new rate for skb\n");
   1756
   1757	/* Send management frames and NO_ACK data using lowest rate. */
   1758	/* TODO: this could probably be improved.. */
   1759	if (!ieee80211_is_data(hdr->frame_control) ||
   1760	    (info->flags & IEEE80211_TX_CTL_NO_ACK))
   1761		return;
   1762
   1763	lq_sta->supp_rates = sta->deflink.supp_rates[lq_sta->band];
   1764
   1765	tid = il4965_rs_tl_add_packet(lq_sta, hdr);
   1766	if (tid != MAX_TID_COUNT && (lq_sta->tx_agg_tid_en & (1 << tid))) {
   1767		tid_data = &il->stations[lq_sta->lq.sta_id].tid[tid];
   1768		if (tid_data->agg.state == IL_AGG_OFF)
   1769			lq_sta->is_agg = 0;
   1770		else
   1771			lq_sta->is_agg = 1;
   1772	} else
   1773		lq_sta->is_agg = 0;
   1774
   1775	/*
   1776	 * Select rate-scale / modulation-mode table to work with in
   1777	 * the rest of this function:  "search" if searching for better
   1778	 * modulation mode, or "active" if doing rate scaling within a mode.
   1779	 */
   1780	if (!lq_sta->search_better_tbl)
   1781		active_tbl = lq_sta->active_tbl;
   1782	else
   1783		active_tbl = 1 - lq_sta->active_tbl;
   1784
   1785	tbl = &(lq_sta->lq_info[active_tbl]);
   1786	if (is_legacy(tbl->lq_type))
   1787		lq_sta->is_green = 0;
   1788	else
   1789		lq_sta->is_green = il4965_rs_use_green(il, sta);
   1790	is_green = lq_sta->is_green;
   1791
   1792	/* current tx rate */
   1793	idx = lq_sta->last_txrate_idx;
   1794
   1795	D_RATE("Rate scale idx %d for type %d\n", idx, tbl->lq_type);
   1796
   1797	/* rates available for this association, and for modulation mode */
   1798	rate_mask = il4965_rs_get_supported_rates(lq_sta, hdr, tbl->lq_type);
   1799
   1800	D_RATE("mask 0x%04X\n", rate_mask);
   1801
   1802	/* mask with station rate restriction */
   1803	if (is_legacy(tbl->lq_type)) {
   1804		if (lq_sta->band == NL80211_BAND_5GHZ)
   1805			/* supp_rates has no CCK bits in A mode */
   1806			rate_scale_idx_msk =
   1807			    (u16) (rate_mask &
   1808				   (lq_sta->supp_rates << IL_FIRST_OFDM_RATE));
   1809		else
   1810			rate_scale_idx_msk =
   1811			    (u16) (rate_mask & lq_sta->supp_rates);
   1812
   1813	} else
   1814		rate_scale_idx_msk = rate_mask;
   1815
   1816	if (!rate_scale_idx_msk)
   1817		rate_scale_idx_msk = rate_mask;
   1818
   1819	if (!((1 << idx) & rate_scale_idx_msk)) {
   1820		IL_ERR("Current Rate is not valid\n");
   1821		if (lq_sta->search_better_tbl) {
   1822			/* revert to active table if search table is not valid */
   1823			tbl->lq_type = LQ_NONE;
   1824			lq_sta->search_better_tbl = 0;
   1825			tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
   1826			/* get "active" rate info */
   1827			idx = il4965_hwrate_to_plcp_idx(tbl->current_rate);
   1828			il4965_rs_update_rate_tbl(il, lq_sta, tbl, idx,
   1829						      is_green);
   1830		}
   1831		return;
   1832	}
   1833
   1834	/* Get expected throughput table and history win for current rate */
   1835	if (!tbl->expected_tpt) {
   1836		IL_ERR("tbl->expected_tpt is NULL\n");
   1837		return;
   1838	}
   1839
   1840	/* force user max rate if set by user */
   1841	if (lq_sta->max_rate_idx != -1 && lq_sta->max_rate_idx < idx) {
   1842		idx = lq_sta->max_rate_idx;
   1843		update_lq = 1;
   1844		win = &(tbl->win[idx]);
   1845		goto lq_update;
   1846	}
   1847
   1848	win = &(tbl->win[idx]);
   1849
   1850	/*
   1851	 * If there is not enough history to calculate actual average
   1852	 * throughput, keep analyzing results of more tx frames, without
   1853	 * changing rate or mode (bypass most of the rest of this function).
   1854	 * Set up new rate table in uCode only if old rate is not supported
   1855	 * in current association (use new rate found above).
   1856	 */
   1857	fail_count = win->counter - win->success_counter;
   1858	if (fail_count < RATE_MIN_FAILURE_TH &&
   1859	    win->success_counter < RATE_MIN_SUCCESS_TH) {
   1860		D_RATE("LQ: still below TH. succ=%d total=%d " "for idx %d\n",
   1861		       win->success_counter, win->counter, idx);
   1862
   1863		/* Can't calculate this yet; not enough history */
   1864		win->average_tpt = IL_INVALID_VALUE;
   1865
   1866		/* Should we stay with this modulation mode,
   1867		 * or search for a new one? */
   1868		il4965_rs_stay_in_table(lq_sta, false);
   1869
   1870		goto out;
   1871	}
   1872	/* Else we have enough samples; calculate estimate of
   1873	 * actual average throughput */
   1874	if (win->average_tpt !=
   1875	    ((win->success_ratio * tbl->expected_tpt[idx] + 64) / 128)) {
   1876		IL_ERR("expected_tpt should have been calculated by now\n");
   1877		win->average_tpt =
   1878		    ((win->success_ratio * tbl->expected_tpt[idx] + 64) / 128);
   1879	}
   1880
   1881	/* If we are searching for better modulation mode, check success. */
   1882	if (lq_sta->search_better_tbl) {
   1883		/* If good success, continue using the "search" mode;
   1884		 * no need to send new link quality command, since we're
   1885		 * continuing to use the setup that we've been trying. */
   1886		if (win->average_tpt > lq_sta->last_tpt) {
   1887
   1888			D_RATE("LQ: SWITCHING TO NEW TBL "
   1889			       "suc=%d cur-tpt=%d old-tpt=%d\n",
   1890			       win->success_ratio, win->average_tpt,
   1891			       lq_sta->last_tpt);
   1892
   1893			if (!is_legacy(tbl->lq_type))
   1894				lq_sta->enable_counter = 1;
   1895
   1896			/* Swap tables; "search" becomes "active" */
   1897			lq_sta->active_tbl = active_tbl;
   1898			current_tpt = win->average_tpt;
   1899
   1900			/* Else poor success; go back to mode in "active" table */
   1901		} else {
   1902
   1903			D_RATE("LQ: GOING BACK TO THE OLD TBL "
   1904			       "suc=%d cur-tpt=%d old-tpt=%d\n",
   1905			       win->success_ratio, win->average_tpt,
   1906			       lq_sta->last_tpt);
   1907
   1908			/* Nullify "search" table */
   1909			tbl->lq_type = LQ_NONE;
   1910
   1911			/* Revert to "active" table */
   1912			active_tbl = lq_sta->active_tbl;
   1913			tbl = &(lq_sta->lq_info[active_tbl]);
   1914
   1915			/* Revert to "active" rate and throughput info */
   1916			idx = il4965_hwrate_to_plcp_idx(tbl->current_rate);
   1917			current_tpt = lq_sta->last_tpt;
   1918
   1919			/* Need to set up a new rate table in uCode */
   1920			update_lq = 1;
   1921		}
   1922
   1923		/* Either way, we've made a decision; modulation mode
   1924		 * search is done, allow rate adjustment next time. */
   1925		lq_sta->search_better_tbl = 0;
   1926		done_search = 1;	/* Don't switch modes below! */
   1927		goto lq_update;
   1928	}
   1929
   1930	/* (Else) not in search of better modulation mode, try for better
   1931	 * starting rate, while staying in this mode. */
   1932	high_low =
   1933	    il4965_rs_get_adjacent_rate(il, idx, rate_scale_idx_msk,
   1934					tbl->lq_type);
   1935	low = high_low & 0xff;
   1936	high = (high_low >> 8) & 0xff;
   1937
   1938	/* If user set max rate, dont allow higher than user constrain */
   1939	if (lq_sta->max_rate_idx != -1 && lq_sta->max_rate_idx < high)
   1940		high = RATE_INVALID;
   1941
   1942	sr = win->success_ratio;
   1943
   1944	/* Collect measured throughputs for current and adjacent rates */
   1945	current_tpt = win->average_tpt;
   1946	if (low != RATE_INVALID)
   1947		low_tpt = tbl->win[low].average_tpt;
   1948	if (high != RATE_INVALID)
   1949		high_tpt = tbl->win[high].average_tpt;
   1950
   1951	scale_action = 0;
   1952
   1953	/* Too many failures, decrease rate */
   1954	if (sr <= RATE_DECREASE_TH || current_tpt == 0) {
   1955		D_RATE("decrease rate because of low success_ratio\n");
   1956		scale_action = -1;
   1957
   1958		/* No throughput measured yet for adjacent rates; try increase. */
   1959	} else if (low_tpt == IL_INVALID_VALUE && high_tpt == IL_INVALID_VALUE) {
   1960
   1961		if (high != RATE_INVALID && sr >= RATE_INCREASE_TH)
   1962			scale_action = 1;
   1963		else if (low != RATE_INVALID)
   1964			scale_action = 0;
   1965	}
   1966
   1967	/* Both adjacent throughputs are measured, but neither one has better
   1968	 * throughput; we're using the best rate, don't change it! */
   1969	else if (low_tpt != IL_INVALID_VALUE && high_tpt != IL_INVALID_VALUE &&
   1970		 low_tpt < current_tpt && high_tpt < current_tpt)
   1971		scale_action = 0;
   1972
   1973	/* At least one adjacent rate's throughput is measured,
   1974	 * and may have better performance. */
   1975	else {
   1976		/* Higher adjacent rate's throughput is measured */
   1977		if (high_tpt != IL_INVALID_VALUE) {
   1978			/* Higher rate has better throughput */
   1979			if (high_tpt > current_tpt && sr >= RATE_INCREASE_TH)
   1980				scale_action = 1;
   1981			else
   1982				scale_action = 0;
   1983
   1984			/* Lower adjacent rate's throughput is measured */
   1985		} else if (low_tpt != IL_INVALID_VALUE) {
   1986			/* Lower rate has better throughput */
   1987			if (low_tpt > current_tpt) {
   1988				D_RATE("decrease rate because of low tpt\n");
   1989				scale_action = -1;
   1990			} else if (sr >= RATE_INCREASE_TH) {
   1991				scale_action = 1;
   1992			}
   1993		}
   1994	}
   1995
   1996	/* Sanity check; asked for decrease, but success rate or throughput
   1997	 * has been good at old rate.  Don't change it. */
   1998	if (scale_action == -1 && low != RATE_INVALID &&
   1999	    (sr > RATE_HIGH_TH || current_tpt > 100 * tbl->expected_tpt[low]))
   2000		scale_action = 0;
   2001
   2002	switch (scale_action) {
   2003	case -1:
   2004		/* Decrease starting rate, update uCode's rate table */
   2005		if (low != RATE_INVALID) {
   2006			update_lq = 1;
   2007			idx = low;
   2008		}
   2009
   2010		break;
   2011	case 1:
   2012		/* Increase starting rate, update uCode's rate table */
   2013		if (high != RATE_INVALID) {
   2014			update_lq = 1;
   2015			idx = high;
   2016		}
   2017
   2018		break;
   2019	case 0:
   2020		/* No change */
   2021	default:
   2022		break;
   2023	}
   2024
   2025	D_RATE("choose rate scale idx %d action %d low %d " "high %d type %d\n",
   2026	       idx, scale_action, low, high, tbl->lq_type);
   2027
   2028lq_update:
   2029	/* Replace uCode's rate table for the destination station. */
   2030	if (update_lq)
   2031		il4965_rs_update_rate_tbl(il, lq_sta, tbl, idx, is_green);
   2032
   2033	/* Should we stay with this modulation mode,
   2034	 * or search for a new one? */
   2035	il4965_rs_stay_in_table(lq_sta, false);
   2036
   2037	/*
   2038	 * Search for new modulation mode if we're:
   2039	 * 1)  Not changing rates right now
   2040	 * 2)  Not just finishing up a search
   2041	 * 3)  Allowing a new search
   2042	 */
   2043	if (!update_lq && !done_search && !lq_sta->stay_in_tbl && win->counter) {
   2044		/* Save current throughput to compare with "search" throughput */
   2045		lq_sta->last_tpt = current_tpt;
   2046
   2047		/* Select a new "search" modulation mode to try.
   2048		 * If one is found, set up the new "search" table. */
   2049		if (is_legacy(tbl->lq_type))
   2050			il4965_rs_move_legacy_other(il, lq_sta, conf, sta, idx);
   2051		else if (is_siso(tbl->lq_type))
   2052			il4965_rs_move_siso_to_other(il, lq_sta, conf, sta,
   2053						     idx);
   2054		else		/* (is_mimo2(tbl->lq_type)) */
   2055			il4965_rs_move_mimo2_to_other(il, lq_sta, conf, sta,
   2056						      idx);
   2057
   2058		/* If new "search" mode was selected, set up in uCode table */
   2059		if (lq_sta->search_better_tbl) {
   2060			/* Access the "search" table, clear its history. */
   2061			tbl = &(lq_sta->lq_info[(1 - lq_sta->active_tbl)]);
   2062			for (i = 0; i < RATE_COUNT; i++)
   2063				il4965_rs_rate_scale_clear_win(&(tbl->win[i]));
   2064
   2065			/* Use new "search" start rate */
   2066			idx = il4965_hwrate_to_plcp_idx(tbl->current_rate);
   2067
   2068			D_RATE("Switch current  mcs: %X idx: %d\n",
   2069			       tbl->current_rate, idx);
   2070			il4965_rs_fill_link_cmd(il, lq_sta, tbl->current_rate);
   2071			il_send_lq_cmd(il, &lq_sta->lq, CMD_ASYNC, false);
   2072		} else
   2073			done_search = 1;
   2074	}
   2075
   2076	if (done_search && !lq_sta->stay_in_tbl) {
   2077		/* If the "active" (non-search) mode was legacy,
   2078		 * and we've tried switching antennas,
   2079		 * but we haven't been able to try HT modes (not available),
   2080		 * stay with best antenna legacy modulation for a while
   2081		 * before next round of mode comparisons. */
   2082		tbl1 = &(lq_sta->lq_info[lq_sta->active_tbl]);
   2083		if (is_legacy(tbl1->lq_type) && !conf_is_ht(conf) &&
   2084		    lq_sta->action_counter > tbl1->max_search) {
   2085			D_RATE("LQ: STAY in legacy table\n");
   2086			il4965_rs_set_stay_in_table(il, 1, lq_sta);
   2087		}
   2088
   2089		/* If we're in an HT mode, and all 3 mode switch actions
   2090		 * have been tried and compared, stay in this best modulation
   2091		 * mode for a while before next round of mode comparisons. */
   2092		if (lq_sta->enable_counter &&
   2093		    lq_sta->action_counter >= tbl1->max_search) {
   2094			if (lq_sta->last_tpt > IL_AGG_TPT_THREHOLD &&
   2095			    (lq_sta->tx_agg_tid_en & (1 << tid)) &&
   2096			    tid != MAX_TID_COUNT) {
   2097				tid_data =
   2098				    &il->stations[lq_sta->lq.sta_id].tid[tid];
   2099				if (tid_data->agg.state == IL_AGG_OFF) {
   2100					D_RATE("try to aggregate tid %d\n",
   2101					       tid);
   2102					il4965_rs_tl_turn_on_agg(il, tid,
   2103								 lq_sta, sta);
   2104				}
   2105			}
   2106			il4965_rs_set_stay_in_table(il, 0, lq_sta);
   2107		}
   2108	}
   2109
   2110out:
   2111	tbl->current_rate =
   2112	    il4965_rate_n_flags_from_tbl(il, tbl, idx, is_green);
   2113	i = idx;
   2114	lq_sta->last_txrate_idx = i;
   2115}
   2116
   2117/*
   2118 * il4965_rs_initialize_lq - Initialize a station's hardware rate table
   2119 *
   2120 * The uCode's station table contains a table of fallback rates
   2121 * for automatic fallback during transmission.
   2122 *
   2123 * NOTE: This sets up a default set of values.  These will be replaced later
   2124 *       if the driver's iwl-4965-rs rate scaling algorithm is used, instead of
   2125 *       rc80211_simple.
   2126 *
   2127 * NOTE: Run C_ADD_STA command to set up station table entry, before
   2128 *       calling this function (which runs C_TX_LINK_QUALITY_CMD,
   2129 *       which requires station table entry to exist).
   2130 */
   2131static void
   2132il4965_rs_initialize_lq(struct il_priv *il, struct ieee80211_conf *conf,
   2133			struct ieee80211_sta *sta, struct il_lq_sta *lq_sta)
   2134{
   2135	struct il_scale_tbl_info *tbl;
   2136	int rate_idx;
   2137	int i;
   2138	u32 rate;
   2139	u8 use_green;
   2140	u8 active_tbl = 0;
   2141	u8 valid_tx_ant;
   2142
   2143	if (!sta || !lq_sta)
   2144		return;
   2145
   2146	use_green = il4965_rs_use_green(il, sta);
   2147
   2148	i = lq_sta->last_txrate_idx;
   2149
   2150	valid_tx_ant = il->hw_params.valid_tx_ant;
   2151
   2152	if (!lq_sta->search_better_tbl)
   2153		active_tbl = lq_sta->active_tbl;
   2154	else
   2155		active_tbl = 1 - lq_sta->active_tbl;
   2156
   2157	tbl = &(lq_sta->lq_info[active_tbl]);
   2158
   2159	if (i < 0 || i >= RATE_COUNT)
   2160		i = 0;
   2161
   2162	rate = il_rates[i].plcp;
   2163	tbl->ant_type = il4965_first_antenna(valid_tx_ant);
   2164	rate |= tbl->ant_type << RATE_MCS_ANT_POS;
   2165
   2166	if (i >= IL_FIRST_CCK_RATE && i <= IL_LAST_CCK_RATE)
   2167		rate |= RATE_MCS_CCK_MSK;
   2168
   2169	il4965_rs_get_tbl_info_from_mcs(rate, il->band, tbl, &rate_idx);
   2170	if (!il4965_rs_is_valid_ant(valid_tx_ant, tbl->ant_type))
   2171		il4965_rs_toggle_antenna(valid_tx_ant, &rate, tbl);
   2172
   2173	rate = il4965_rate_n_flags_from_tbl(il, tbl, rate_idx, use_green);
   2174	tbl->current_rate = rate;
   2175	il4965_rs_set_expected_tpt_table(lq_sta, tbl);
   2176	il4965_rs_fill_link_cmd(NULL, lq_sta, rate);
   2177	il->stations[lq_sta->lq.sta_id].lq = &lq_sta->lq;
   2178	il_send_lq_cmd(il, &lq_sta->lq, CMD_SYNC, true);
   2179}
   2180
   2181static void
   2182il4965_rs_get_rate(void *il_r, struct ieee80211_sta *sta, void *il_sta,
   2183		   struct ieee80211_tx_rate_control *txrc)
   2184{
   2185
   2186	struct sk_buff *skb = txrc->skb;
   2187	struct ieee80211_supported_band *sband = txrc->sband;
   2188	struct il_priv *il __maybe_unused = (struct il_priv *)il_r;
   2189	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
   2190	struct il_lq_sta *lq_sta = il_sta;
   2191	int rate_idx;
   2192
   2193	D_RATE("rate scale calculate new rate for skb\n");
   2194
   2195	/* Get max rate if user set max rate */
   2196	if (lq_sta) {
   2197		lq_sta->max_rate_idx = fls(txrc->rate_idx_mask) - 1;
   2198		if (sband->band == NL80211_BAND_5GHZ &&
   2199		    lq_sta->max_rate_idx != -1)
   2200			lq_sta->max_rate_idx += IL_FIRST_OFDM_RATE;
   2201		if (lq_sta->max_rate_idx < 0 ||
   2202		    lq_sta->max_rate_idx >= RATE_COUNT)
   2203			lq_sta->max_rate_idx = -1;
   2204	}
   2205
   2206	/* Treat uninitialized rate scaling data same as non-existing. */
   2207	if (lq_sta && !lq_sta->drv) {
   2208		D_RATE("Rate scaling not initialized yet.\n");
   2209		il_sta = NULL;
   2210	}
   2211
   2212	if (!lq_sta)
   2213		return;
   2214
   2215	rate_idx = lq_sta->last_txrate_idx;
   2216
   2217	if (lq_sta->last_rate_n_flags & RATE_MCS_HT_MSK) {
   2218		rate_idx -= IL_FIRST_OFDM_RATE;
   2219		/* 6M and 9M shared same MCS idx */
   2220		rate_idx = (rate_idx > 0) ? (rate_idx - 1) : 0;
   2221		if (il4965_rs_extract_rate(lq_sta->last_rate_n_flags) >=
   2222		    RATE_MIMO2_6M_PLCP)
   2223			rate_idx = rate_idx + MCS_IDX_PER_STREAM;
   2224		info->control.rates[0].flags = IEEE80211_TX_RC_MCS;
   2225		if (lq_sta->last_rate_n_flags & RATE_MCS_SGI_MSK)
   2226			info->control.rates[0].flags |=
   2227			    IEEE80211_TX_RC_SHORT_GI;
   2228		if (lq_sta->last_rate_n_flags & RATE_MCS_DUP_MSK)
   2229			info->control.rates[0].flags |=
   2230			    IEEE80211_TX_RC_DUP_DATA;
   2231		if (lq_sta->last_rate_n_flags & RATE_MCS_HT40_MSK)
   2232			info->control.rates[0].flags |=
   2233			    IEEE80211_TX_RC_40_MHZ_WIDTH;
   2234		if (lq_sta->last_rate_n_flags & RATE_MCS_GF_MSK)
   2235			info->control.rates[0].flags |=
   2236			    IEEE80211_TX_RC_GREEN_FIELD;
   2237	} else {
   2238		/* Check for invalid rates */
   2239		if (rate_idx < 0 || rate_idx >= RATE_COUNT_LEGACY ||
   2240		    (sband->band == NL80211_BAND_5GHZ &&
   2241		     rate_idx < IL_FIRST_OFDM_RATE))
   2242			rate_idx = rate_lowest_index(sband, sta);
   2243		/* On valid 5 GHz rate, adjust idx */
   2244		else if (sband->band == NL80211_BAND_5GHZ)
   2245			rate_idx -= IL_FIRST_OFDM_RATE;
   2246		info->control.rates[0].flags = 0;
   2247	}
   2248	info->control.rates[0].idx = rate_idx;
   2249	info->control.rates[0].count = 1;
   2250}
   2251
   2252static void *
   2253il4965_rs_alloc_sta(void *il_rate, struct ieee80211_sta *sta, gfp_t gfp)
   2254{
   2255	struct il_station_priv *sta_priv =
   2256	    (struct il_station_priv *)sta->drv_priv;
   2257	struct il_priv *il;
   2258
   2259	il = (struct il_priv *)il_rate;
   2260	D_RATE("create station rate scale win\n");
   2261
   2262	return &sta_priv->lq_sta;
   2263}
   2264
   2265/*
   2266 * Called after adding a new station to initialize rate scaling
   2267 */
   2268void
   2269il4965_rs_rate_init(struct il_priv *il, struct ieee80211_sta *sta, u8 sta_id)
   2270{
   2271	int i, j;
   2272	struct ieee80211_hw *hw = il->hw;
   2273	struct ieee80211_conf *conf = &il->hw->conf;
   2274	struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
   2275	struct il_station_priv *sta_priv;
   2276	struct il_lq_sta *lq_sta;
   2277	struct ieee80211_supported_band *sband;
   2278
   2279	sta_priv = (struct il_station_priv *)sta->drv_priv;
   2280	lq_sta = &sta_priv->lq_sta;
   2281	sband = hw->wiphy->bands[conf->chandef.chan->band];
   2282
   2283	lq_sta->lq.sta_id = sta_id;
   2284
   2285	for (j = 0; j < LQ_SIZE; j++)
   2286		for (i = 0; i < RATE_COUNT; i++)
   2287			il4965_rs_rate_scale_clear_win(&lq_sta->lq_info[j].
   2288						       win[i]);
   2289
   2290	lq_sta->flush_timer = 0;
   2291	lq_sta->supp_rates = sta->deflink.supp_rates[sband->band];
   2292	for (j = 0; j < LQ_SIZE; j++)
   2293		for (i = 0; i < RATE_COUNT; i++)
   2294			il4965_rs_rate_scale_clear_win(&lq_sta->lq_info[j].
   2295						       win[i]);
   2296
   2297	D_RATE("LQ:" "*** rate scale station global init for station %d ***\n",
   2298	       sta_id);
   2299	/* TODO: what is a good starting rate for STA? About middle? Maybe not
   2300	 * the lowest or the highest rate.. Could consider using RSSI from
   2301	 * previous packets? Need to have IEEE 802.1X auth succeed immediately
   2302	 * after assoc.. */
   2303
   2304	lq_sta->is_dup = 0;
   2305	lq_sta->max_rate_idx = -1;
   2306	lq_sta->missed_rate_counter = IL_MISSED_RATE_MAX;
   2307	lq_sta->is_green = il4965_rs_use_green(il, sta);
   2308	lq_sta->active_legacy_rate = il->active_rate & ~(0x1000);
   2309	lq_sta->band = il->band;
   2310	/*
   2311	 * active_siso_rate mask includes 9 MBits (bit 5), and CCK (bits 0-3),
   2312	 * supp_rates[] does not; shift to convert format, force 9 MBits off.
   2313	 */
   2314	lq_sta->active_siso_rate = ht_cap->mcs.rx_mask[0] << 1;
   2315	lq_sta->active_siso_rate |= ht_cap->mcs.rx_mask[0] & 0x1;
   2316	lq_sta->active_siso_rate &= ~((u16) 0x2);
   2317	lq_sta->active_siso_rate <<= IL_FIRST_OFDM_RATE;
   2318
   2319	/* Same here */
   2320	lq_sta->active_mimo2_rate = ht_cap->mcs.rx_mask[1] << 1;
   2321	lq_sta->active_mimo2_rate |= ht_cap->mcs.rx_mask[1] & 0x1;
   2322	lq_sta->active_mimo2_rate &= ~((u16) 0x2);
   2323	lq_sta->active_mimo2_rate <<= IL_FIRST_OFDM_RATE;
   2324
   2325	/* These values will be overridden later */
   2326	lq_sta->lq.general_params.single_stream_ant_msk =
   2327	    il4965_first_antenna(il->hw_params.valid_tx_ant);
   2328	lq_sta->lq.general_params.dual_stream_ant_msk =
   2329	    il->hw_params.valid_tx_ant & ~il4965_first_antenna(il->hw_params.
   2330							       valid_tx_ant);
   2331	if (!lq_sta->lq.general_params.dual_stream_ant_msk) {
   2332		lq_sta->lq.general_params.dual_stream_ant_msk = ANT_AB;
   2333	} else if (il4965_num_of_ant(il->hw_params.valid_tx_ant) == 2) {
   2334		lq_sta->lq.general_params.dual_stream_ant_msk =
   2335		    il->hw_params.valid_tx_ant;
   2336	}
   2337
   2338	/* as default allow aggregation for all tids */
   2339	lq_sta->tx_agg_tid_en = IL_AGG_ALL_TID;
   2340	lq_sta->drv = il;
   2341
   2342	/* Set last_txrate_idx to lowest rate */
   2343	lq_sta->last_txrate_idx = rate_lowest_index(sband, sta);
   2344	if (sband->band == NL80211_BAND_5GHZ)
   2345		lq_sta->last_txrate_idx += IL_FIRST_OFDM_RATE;
   2346	lq_sta->is_agg = 0;
   2347
   2348#ifdef CONFIG_MAC80211_DEBUGFS
   2349	lq_sta->dbg_fixed_rate = 0;
   2350#endif
   2351
   2352	il4965_rs_initialize_lq(il, conf, sta, lq_sta);
   2353}
   2354
   2355static void
   2356il4965_rs_fill_link_cmd(struct il_priv *il, struct il_lq_sta *lq_sta,
   2357			u32 new_rate)
   2358{
   2359	struct il_scale_tbl_info tbl_type;
   2360	int idx = 0;
   2361	int rate_idx;
   2362	int repeat_rate = 0;
   2363	u8 ant_toggle_cnt = 0;
   2364	u8 use_ht_possible = 1;
   2365	u8 valid_tx_ant = 0;
   2366	struct il_link_quality_cmd *lq_cmd = &lq_sta->lq;
   2367
   2368	/* Override starting rate (idx 0) if needed for debug purposes */
   2369	il4965_rs_dbgfs_set_mcs(lq_sta, &new_rate, idx);
   2370
   2371	/* Interpret new_rate (rate_n_flags) */
   2372	il4965_rs_get_tbl_info_from_mcs(new_rate, lq_sta->band, &tbl_type,
   2373					&rate_idx);
   2374
   2375	/* How many times should we repeat the initial rate? */
   2376	if (is_legacy(tbl_type.lq_type)) {
   2377		ant_toggle_cnt = 1;
   2378		repeat_rate = IL_NUMBER_TRY;
   2379	} else {
   2380		repeat_rate = IL_HT_NUMBER_TRY;
   2381	}
   2382
   2383	lq_cmd->general_params.mimo_delimiter =
   2384	    is_mimo(tbl_type.lq_type) ? 1 : 0;
   2385
   2386	/* Fill 1st table entry (idx 0) */
   2387	lq_cmd->rs_table[idx].rate_n_flags = cpu_to_le32(new_rate);
   2388
   2389	if (il4965_num_of_ant(tbl_type.ant_type) == 1) {
   2390		lq_cmd->general_params.single_stream_ant_msk =
   2391		    tbl_type.ant_type;
   2392	} else if (il4965_num_of_ant(tbl_type.ant_type) == 2) {
   2393		lq_cmd->general_params.dual_stream_ant_msk = tbl_type.ant_type;
   2394	}
   2395	/* otherwise we don't modify the existing value */
   2396	idx++;
   2397	repeat_rate--;
   2398	if (il)
   2399		valid_tx_ant = il->hw_params.valid_tx_ant;
   2400
   2401	/* Fill rest of rate table */
   2402	while (idx < LINK_QUAL_MAX_RETRY_NUM) {
   2403		/* Repeat initial/next rate.
   2404		 * For legacy IL_NUMBER_TRY == 1, this loop will not execute.
   2405		 * For HT IL_HT_NUMBER_TRY == 3, this executes twice. */
   2406		while (repeat_rate > 0 && idx < LINK_QUAL_MAX_RETRY_NUM) {
   2407			if (is_legacy(tbl_type.lq_type)) {
   2408				if (ant_toggle_cnt < NUM_TRY_BEFORE_ANT_TOGGLE)
   2409					ant_toggle_cnt++;
   2410				else if (il &&
   2411					 il4965_rs_toggle_antenna(valid_tx_ant,
   2412								  &new_rate,
   2413								  &tbl_type))
   2414					ant_toggle_cnt = 1;
   2415			}
   2416
   2417			/* Override next rate if needed for debug purposes */
   2418			il4965_rs_dbgfs_set_mcs(lq_sta, &new_rate, idx);
   2419
   2420			/* Fill next table entry */
   2421			lq_cmd->rs_table[idx].rate_n_flags =
   2422			    cpu_to_le32(new_rate);
   2423			repeat_rate--;
   2424			idx++;
   2425		}
   2426
   2427		il4965_rs_get_tbl_info_from_mcs(new_rate, lq_sta->band,
   2428						&tbl_type, &rate_idx);
   2429
   2430		/* Indicate to uCode which entries might be MIMO.
   2431		 * If initial rate was MIMO, this will finally end up
   2432		 * as (IL_HT_NUMBER_TRY * 2), after 2nd pass, otherwise 0. */
   2433		if (is_mimo(tbl_type.lq_type))
   2434			lq_cmd->general_params.mimo_delimiter = idx;
   2435
   2436		/* Get next rate */
   2437		new_rate =
   2438		    il4965_rs_get_lower_rate(lq_sta, &tbl_type, rate_idx,
   2439					     use_ht_possible);
   2440
   2441		/* How many times should we repeat the next rate? */
   2442		if (is_legacy(tbl_type.lq_type)) {
   2443			if (ant_toggle_cnt < NUM_TRY_BEFORE_ANT_TOGGLE)
   2444				ant_toggle_cnt++;
   2445			else if (il &&
   2446				 il4965_rs_toggle_antenna(valid_tx_ant,
   2447							  &new_rate, &tbl_type))
   2448				ant_toggle_cnt = 1;
   2449
   2450			repeat_rate = IL_NUMBER_TRY;
   2451		} else {
   2452			repeat_rate = IL_HT_NUMBER_TRY;
   2453		}
   2454
   2455		/* Don't allow HT rates after next pass.
   2456		 * il4965_rs_get_lower_rate() will change type to LQ_A or LQ_G. */
   2457		use_ht_possible = 0;
   2458
   2459		/* Override next rate if needed for debug purposes */
   2460		il4965_rs_dbgfs_set_mcs(lq_sta, &new_rate, idx);
   2461
   2462		/* Fill next table entry */
   2463		lq_cmd->rs_table[idx].rate_n_flags = cpu_to_le32(new_rate);
   2464
   2465		idx++;
   2466		repeat_rate--;
   2467	}
   2468
   2469	lq_cmd->agg_params.agg_frame_cnt_limit = LINK_QUAL_AGG_FRAME_LIMIT_DEF;
   2470	lq_cmd->agg_params.agg_dis_start_th = LINK_QUAL_AGG_DISABLE_START_DEF;
   2471
   2472	lq_cmd->agg_params.agg_time_limit =
   2473	    cpu_to_le16(LINK_QUAL_AGG_TIME_LIMIT_DEF);
   2474}
   2475
   2476static void *
   2477il4965_rs_alloc(struct ieee80211_hw *hw)
   2478{
   2479	return hw->priv;
   2480}
   2481
   2482/* rate scale requires free function to be implemented */
   2483static void
   2484il4965_rs_free(void *il_rate)
   2485{
   2486	return;
   2487}
   2488
   2489static void
   2490il4965_rs_free_sta(void *il_r, struct ieee80211_sta *sta, void *il_sta)
   2491{
   2492	struct il_priv *il __maybe_unused = il_r;
   2493
   2494	D_RATE("enter\n");
   2495	D_RATE("leave\n");
   2496}
   2497
   2498#ifdef CONFIG_MAC80211_DEBUGFS
   2499
   2500static void
   2501il4965_rs_dbgfs_set_mcs(struct il_lq_sta *lq_sta, u32 * rate_n_flags, int idx)
   2502{
   2503	struct il_priv *il;
   2504	u8 valid_tx_ant;
   2505	u8 ant_sel_tx;
   2506
   2507	il = lq_sta->drv;
   2508	valid_tx_ant = il->hw_params.valid_tx_ant;
   2509	if (lq_sta->dbg_fixed_rate) {
   2510		ant_sel_tx =
   2511		    ((lq_sta->
   2512		      dbg_fixed_rate & RATE_MCS_ANT_ABC_MSK) >>
   2513		     RATE_MCS_ANT_POS);
   2514		if ((valid_tx_ant & ant_sel_tx) == ant_sel_tx) {
   2515			*rate_n_flags = lq_sta->dbg_fixed_rate;
   2516			D_RATE("Fixed rate ON\n");
   2517		} else {
   2518			lq_sta->dbg_fixed_rate = 0;
   2519			IL_ERR
   2520			    ("Invalid antenna selection 0x%X, Valid is 0x%X\n",
   2521			     ant_sel_tx, valid_tx_ant);
   2522			D_RATE("Fixed rate OFF\n");
   2523		}
   2524	} else {
   2525		D_RATE("Fixed rate OFF\n");
   2526	}
   2527}
   2528
   2529static ssize_t
   2530il4965_rs_sta_dbgfs_scale_table_write(struct file *file,
   2531				      const char __user *user_buf,
   2532				      size_t count, loff_t *ppos)
   2533{
   2534	struct il_lq_sta *lq_sta = file->private_data;
   2535	struct il_priv *il;
   2536	char buf[64];
   2537	size_t buf_size;
   2538	u32 parsed_rate;
   2539
   2540	il = lq_sta->drv;
   2541	memset(buf, 0, sizeof(buf));
   2542	buf_size = min(count, sizeof(buf) - 1);
   2543	if (copy_from_user(buf, user_buf, buf_size))
   2544		return -EFAULT;
   2545
   2546	if (sscanf(buf, "%x", &parsed_rate) == 1)
   2547		lq_sta->dbg_fixed_rate = parsed_rate;
   2548	else
   2549		lq_sta->dbg_fixed_rate = 0;
   2550
   2551	lq_sta->active_legacy_rate = 0x0FFF;	/* 1 - 54 MBits, includes CCK */
   2552	lq_sta->active_siso_rate = 0x1FD0;	/* 6 - 60 MBits, no 9, no CCK */
   2553	lq_sta->active_mimo2_rate = 0x1FD0;	/* 6 - 60 MBits, no 9, no CCK */
   2554
   2555	D_RATE("sta_id %d rate 0x%X\n", lq_sta->lq.sta_id,
   2556	       lq_sta->dbg_fixed_rate);
   2557
   2558	if (lq_sta->dbg_fixed_rate) {
   2559		il4965_rs_fill_link_cmd(NULL, lq_sta, lq_sta->dbg_fixed_rate);
   2560		il_send_lq_cmd(lq_sta->drv, &lq_sta->lq, CMD_ASYNC, false);
   2561	}
   2562
   2563	return count;
   2564}
   2565
   2566static ssize_t
   2567il4965_rs_sta_dbgfs_scale_table_read(struct file *file, char __user *user_buf,
   2568				     size_t count, loff_t *ppos)
   2569{
   2570	char *buff;
   2571	int desc = 0;
   2572	int i = 0;
   2573	int idx = 0;
   2574	ssize_t ret;
   2575
   2576	struct il_lq_sta *lq_sta = file->private_data;
   2577	struct il_priv *il;
   2578	struct il_scale_tbl_info *tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
   2579
   2580	il = lq_sta->drv;
   2581	buff = kmalloc(1024, GFP_KERNEL);
   2582	if (!buff)
   2583		return -ENOMEM;
   2584
   2585	desc += sprintf(buff + desc, "sta_id %d\n", lq_sta->lq.sta_id);
   2586	desc +=
   2587	    sprintf(buff + desc, "failed=%d success=%d rate=0%X\n",
   2588		    lq_sta->total_failed, lq_sta->total_success,
   2589		    lq_sta->active_legacy_rate);
   2590	desc +=
   2591	    sprintf(buff + desc, "fixed rate 0x%X\n", lq_sta->dbg_fixed_rate);
   2592	desc +=
   2593	    sprintf(buff + desc, "valid_tx_ant %s%s%s\n",
   2594		    (il->hw_params.valid_tx_ant & ANT_A) ? "ANT_A," : "",
   2595		    (il->hw_params.valid_tx_ant & ANT_B) ? "ANT_B," : "",
   2596		    (il->hw_params.valid_tx_ant & ANT_C) ? "ANT_C" : "");
   2597	desc +=
   2598	    sprintf(buff + desc, "lq type %s\n",
   2599		    (is_legacy(tbl->lq_type)) ? "legacy" : "HT");
   2600	if (is_Ht(tbl->lq_type)) {
   2601		desc +=
   2602		    sprintf(buff + desc, " %s",
   2603			    (is_siso(tbl->lq_type)) ? "SISO" : "MIMO2");
   2604		desc +=
   2605		    sprintf(buff + desc, " %s",
   2606			    (tbl->is_ht40) ? "40MHz" : "20MHz");
   2607		desc +=
   2608		    sprintf(buff + desc, " %s %s %s\n",
   2609			    (tbl->is_SGI) ? "SGI" : "",
   2610			    (lq_sta->is_green) ? "GF enabled" : "",
   2611			    (lq_sta->is_agg) ? "AGG on" : "");
   2612	}
   2613	desc +=
   2614	    sprintf(buff + desc, "last tx rate=0x%X\n",
   2615		    lq_sta->last_rate_n_flags);
   2616	desc +=
   2617	    sprintf(buff + desc,
   2618		    "general:" "flags=0x%X mimo-d=%d s-ant0x%x d-ant=0x%x\n",
   2619		    lq_sta->lq.general_params.flags,
   2620		    lq_sta->lq.general_params.mimo_delimiter,
   2621		    lq_sta->lq.general_params.single_stream_ant_msk,
   2622		    lq_sta->lq.general_params.dual_stream_ant_msk);
   2623
   2624	desc +=
   2625	    sprintf(buff + desc,
   2626		    "agg:"
   2627		    "time_limit=%d dist_start_th=%d frame_cnt_limit=%d\n",
   2628		    le16_to_cpu(lq_sta->lq.agg_params.agg_time_limit),
   2629		    lq_sta->lq.agg_params.agg_dis_start_th,
   2630		    lq_sta->lq.agg_params.agg_frame_cnt_limit);
   2631
   2632	desc +=
   2633	    sprintf(buff + desc,
   2634		    "Start idx [0]=0x%x [1]=0x%x [2]=0x%x [3]=0x%x\n",
   2635		    lq_sta->lq.general_params.start_rate_idx[0],
   2636		    lq_sta->lq.general_params.start_rate_idx[1],
   2637		    lq_sta->lq.general_params.start_rate_idx[2],
   2638		    lq_sta->lq.general_params.start_rate_idx[3]);
   2639
   2640	for (i = 0; i < LINK_QUAL_MAX_RETRY_NUM; i++) {
   2641		idx =
   2642		    il4965_hwrate_to_plcp_idx(le32_to_cpu
   2643					      (lq_sta->lq.rs_table[i].
   2644					       rate_n_flags));
   2645		if (is_legacy(tbl->lq_type)) {
   2646			desc +=
   2647			    sprintf(buff + desc, " rate[%d] 0x%X %smbps\n", i,
   2648				    le32_to_cpu(lq_sta->lq.rs_table[i].
   2649						rate_n_flags),
   2650				    il_rate_mcs[idx].mbps);
   2651		} else {
   2652			desc +=
   2653			    sprintf(buff + desc, " rate[%d] 0x%X %smbps (%s)\n",
   2654				    i,
   2655				    le32_to_cpu(lq_sta->lq.rs_table[i].
   2656						rate_n_flags),
   2657				    il_rate_mcs[idx].mbps,
   2658				    il_rate_mcs[idx].mcs);
   2659		}
   2660	}
   2661
   2662	ret = simple_read_from_buffer(user_buf, count, ppos, buff, desc);
   2663	kfree(buff);
   2664	return ret;
   2665}
   2666
   2667static const struct file_operations rs_sta_dbgfs_scale_table_ops = {
   2668	.write = il4965_rs_sta_dbgfs_scale_table_write,
   2669	.read = il4965_rs_sta_dbgfs_scale_table_read,
   2670	.open = simple_open,
   2671	.llseek = default_llseek,
   2672};
   2673
   2674static ssize_t
   2675il4965_rs_sta_dbgfs_stats_table_read(struct file *file, char __user *user_buf,
   2676				     size_t count, loff_t *ppos)
   2677{
   2678	char *buff;
   2679	int desc = 0;
   2680	int i, j;
   2681	ssize_t ret;
   2682
   2683	struct il_lq_sta *lq_sta = file->private_data;
   2684
   2685	buff = kmalloc(1024, GFP_KERNEL);
   2686	if (!buff)
   2687		return -ENOMEM;
   2688
   2689	for (i = 0; i < LQ_SIZE; i++) {
   2690		desc +=
   2691		    sprintf(buff + desc,
   2692			    "%s type=%d SGI=%d HT40=%d DUP=%d GF=%d\n"
   2693			    "rate=0x%X\n", lq_sta->active_tbl == i ? "*" : "x",
   2694			    lq_sta->lq_info[i].lq_type,
   2695			    lq_sta->lq_info[i].is_SGI,
   2696			    lq_sta->lq_info[i].is_ht40,
   2697			    lq_sta->lq_info[i].is_dup, lq_sta->is_green,
   2698			    lq_sta->lq_info[i].current_rate);
   2699		for (j = 0; j < RATE_COUNT; j++) {
   2700			desc +=
   2701			    sprintf(buff + desc,
   2702				    "counter=%d success=%d %%=%d\n",
   2703				    lq_sta->lq_info[i].win[j].counter,
   2704				    lq_sta->lq_info[i].win[j].success_counter,
   2705				    lq_sta->lq_info[i].win[j].success_ratio);
   2706		}
   2707	}
   2708	ret = simple_read_from_buffer(user_buf, count, ppos, buff, desc);
   2709	kfree(buff);
   2710	return ret;
   2711}
   2712
   2713static const struct file_operations rs_sta_dbgfs_stats_table_ops = {
   2714	.read = il4965_rs_sta_dbgfs_stats_table_read,
   2715	.open = simple_open,
   2716	.llseek = default_llseek,
   2717};
   2718
   2719static ssize_t
   2720il4965_rs_sta_dbgfs_rate_scale_data_read(struct file *file,
   2721					 char __user *user_buf, size_t count,
   2722					 loff_t *ppos)
   2723{
   2724	char buff[120];
   2725	int desc = 0;
   2726	struct il_lq_sta *lq_sta = file->private_data;
   2727	struct il_scale_tbl_info *tbl = &lq_sta->lq_info[lq_sta->active_tbl];
   2728
   2729	if (is_Ht(tbl->lq_type))
   2730		desc +=
   2731		    sprintf(buff + desc, "Bit Rate= %d Mb/s\n",
   2732			    tbl->expected_tpt[lq_sta->last_txrate_idx]);
   2733	else
   2734		desc +=
   2735		    sprintf(buff + desc, "Bit Rate= %d Mb/s\n",
   2736			    il_rates[lq_sta->last_txrate_idx].ieee >> 1);
   2737
   2738	return simple_read_from_buffer(user_buf, count, ppos, buff, desc);
   2739}
   2740
   2741static const struct file_operations rs_sta_dbgfs_rate_scale_data_ops = {
   2742	.read = il4965_rs_sta_dbgfs_rate_scale_data_read,
   2743	.open = simple_open,
   2744	.llseek = default_llseek,
   2745};
   2746
   2747static void
   2748il4965_rs_add_debugfs(void *il, void *il_sta, struct dentry *dir)
   2749{
   2750	struct il_lq_sta *lq_sta = il_sta;
   2751
   2752	debugfs_create_file("rate_scale_table", 0600, dir, lq_sta,
   2753			    &rs_sta_dbgfs_scale_table_ops);
   2754	debugfs_create_file("rate_stats_table", 0400, dir, lq_sta,
   2755			    &rs_sta_dbgfs_stats_table_ops);
   2756	debugfs_create_file("rate_scale_data", 0400, dir, lq_sta,
   2757			    &rs_sta_dbgfs_rate_scale_data_ops);
   2758	debugfs_create_u8("tx_agg_tid_enable", 0600, dir,
   2759			  &lq_sta->tx_agg_tid_en);
   2760}
   2761#endif
   2762
   2763/*
   2764 * Initialization of rate scaling information is done by driver after
   2765 * the station is added. Since mac80211 calls this function before a
   2766 * station is added we ignore it.
   2767 */
   2768static void
   2769il4965_rs_rate_init_stub(void *il_r, struct ieee80211_supported_band *sband,
   2770			 struct cfg80211_chan_def *chandef,
   2771			 struct ieee80211_sta *sta, void *il_sta)
   2772{
   2773}
   2774
   2775static const struct rate_control_ops rs_4965_ops = {
   2776	.name = IL4965_RS_NAME,
   2777	.tx_status = il4965_rs_tx_status,
   2778	.get_rate = il4965_rs_get_rate,
   2779	.rate_init = il4965_rs_rate_init_stub,
   2780	.alloc = il4965_rs_alloc,
   2781	.free = il4965_rs_free,
   2782	.alloc_sta = il4965_rs_alloc_sta,
   2783	.free_sta = il4965_rs_free_sta,
   2784#ifdef CONFIG_MAC80211_DEBUGFS
   2785	.add_sta_debugfs = il4965_rs_add_debugfs,
   2786#endif
   2787};
   2788
   2789int
   2790il4965_rate_control_register(void)
   2791{
   2792	return ieee80211_rate_control_register(&rs_4965_ops);
   2793}
   2794
   2795void
   2796il4965_rate_control_unregister(void)
   2797{
   2798	ieee80211_rate_control_unregister(&rs_4965_ops);
   2799}