Linux Audio

Check our new training course

Linux debugging, profiling, tracing and performance analysis training

Mar 24-27, 2025, special US time zones
Register
Loading...
Note: File does not exist in v6.8.
   1/******************************************************************************
   2 *
   3 * Copyright(c) 2005 - 2012 Intel Corporation. All rights reserved.
   4 *
   5 * This program is free software; you can redistribute it and/or modify it
   6 * under the terms of version 2 of the GNU General Public License as
   7 * published by the Free Software Foundation.
   8 *
   9 * This program is distributed in the hope that it will be useful, but WITHOUT
  10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  12 * more details.
  13 *
  14 * You should have received a copy of the GNU General Public License along with
  15 * this program; if not, write to the Free Software Foundation, Inc.,
  16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  17 *
  18 * The full GNU General Public License is included in this distribution in the
  19 * file called LICENSE.
  20 *
  21 * Contact Information:
  22 *  Intel Linux Wireless <ilw@linux.intel.com>
  23 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
  24 *
  25 *****************************************************************************/
  26#include <linux/kernel.h>
  27#include <linux/init.h>
  28#include <linux/skbuff.h>
  29#include <linux/slab.h>
  30#include <net/mac80211.h>
  31
  32#include <linux/netdevice.h>
  33#include <linux/etherdevice.h>
  34#include <linux/delay.h>
  35
  36#include <linux/workqueue.h>
  37
  38#include "iwl-dev.h"
  39#include "iwl-agn.h"
  40#include "iwl-op-mode.h"
  41#include "iwl-modparams.h"
  42
  43#define RS_NAME "iwl-agn-rs"
  44
  45#define NUM_TRY_BEFORE_ANT_TOGGLE 1
  46#define IWL_NUMBER_TRY      1
  47#define IWL_HT_NUMBER_TRY   3
  48
  49#define IWL_RATE_MAX_WINDOW		62	/* # tx in history window */
  50#define IWL_RATE_MIN_FAILURE_TH		6	/* min failures to calc tpt */
  51#define IWL_RATE_MIN_SUCCESS_TH		8	/* min successes to calc tpt */
  52
  53/* max allowed rate miss before sync LQ cmd */
  54#define IWL_MISSED_RATE_MAX		15
  55/* max time to accum history 2 seconds */
  56#define IWL_RATE_SCALE_FLUSH_INTVL   (3*HZ)
  57
  58static u8 rs_ht_to_legacy[] = {
  59	IWL_RATE_6M_INDEX, IWL_RATE_6M_INDEX,
  60	IWL_RATE_6M_INDEX, IWL_RATE_6M_INDEX,
  61	IWL_RATE_6M_INDEX,
  62	IWL_RATE_6M_INDEX, IWL_RATE_9M_INDEX,
  63	IWL_RATE_12M_INDEX, IWL_RATE_18M_INDEX,
  64	IWL_RATE_24M_INDEX, IWL_RATE_36M_INDEX,
  65	IWL_RATE_48M_INDEX, IWL_RATE_54M_INDEX
  66};
  67
  68static const u8 ant_toggle_lookup[] = {
  69	/*ANT_NONE -> */ ANT_NONE,
  70	/*ANT_A    -> */ ANT_B,
  71	/*ANT_B    -> */ ANT_C,
  72	/*ANT_AB   -> */ ANT_BC,
  73	/*ANT_C    -> */ ANT_A,
  74	/*ANT_AC   -> */ ANT_AB,
  75	/*ANT_BC   -> */ ANT_AC,
  76	/*ANT_ABC  -> */ ANT_ABC,
  77};
  78
  79#define IWL_DECLARE_RATE_INFO(r, s, ip, in, rp, rn, pp, np)    \
  80	[IWL_RATE_##r##M_INDEX] = { IWL_RATE_##r##M_PLCP,      \
  81				    IWL_RATE_SISO_##s##M_PLCP, \
  82				    IWL_RATE_MIMO2_##s##M_PLCP,\
  83				    IWL_RATE_MIMO3_##s##M_PLCP,\
  84				    IWL_RATE_##r##M_IEEE,      \
  85				    IWL_RATE_##ip##M_INDEX,    \
  86				    IWL_RATE_##in##M_INDEX,    \
  87				    IWL_RATE_##rp##M_INDEX,    \
  88				    IWL_RATE_##rn##M_INDEX,    \
  89				    IWL_RATE_##pp##M_INDEX,    \
  90				    IWL_RATE_##np##M_INDEX }
  91
  92/*
  93 * Parameter order:
  94 *   rate, ht rate, prev rate, next rate, prev tgg rate, next tgg rate
  95 *
  96 * If there isn't a valid next or previous rate then INV is used which
  97 * maps to IWL_RATE_INVALID
  98 *
  99 */
 100const struct iwl_rate_info iwl_rates[IWL_RATE_COUNT] = {
 101	IWL_DECLARE_RATE_INFO(1, INV, INV, 2, INV, 2, INV, 2),    /*  1mbps */
 102	IWL_DECLARE_RATE_INFO(2, INV, 1, 5, 1, 5, 1, 5),          /*  2mbps */
 103	IWL_DECLARE_RATE_INFO(5, INV, 2, 6, 2, 11, 2, 11),        /*5.5mbps */
 104	IWL_DECLARE_RATE_INFO(11, INV, 9, 12, 9, 12, 5, 18),      /* 11mbps */
 105	IWL_DECLARE_RATE_INFO(6, 6, 5, 9, 5, 11, 5, 11),        /*  6mbps */
 106	IWL_DECLARE_RATE_INFO(9, 6, 6, 11, 6, 11, 5, 11),       /*  9mbps */
 107	IWL_DECLARE_RATE_INFO(12, 12, 11, 18, 11, 18, 11, 18),   /* 12mbps */
 108	IWL_DECLARE_RATE_INFO(18, 18, 12, 24, 12, 24, 11, 24),   /* 18mbps */
 109	IWL_DECLARE_RATE_INFO(24, 24, 18, 36, 18, 36, 18, 36),   /* 24mbps */
 110	IWL_DECLARE_RATE_INFO(36, 36, 24, 48, 24, 48, 24, 48),   /* 36mbps */
 111	IWL_DECLARE_RATE_INFO(48, 48, 36, 54, 36, 54, 36, 54),   /* 48mbps */
 112	IWL_DECLARE_RATE_INFO(54, 54, 48, INV, 48, INV, 48, INV),/* 54mbps */
 113	IWL_DECLARE_RATE_INFO(60, 60, 48, INV, 48, INV, 48, INV),/* 60mbps */
 114	/* FIXME:RS:          ^^    should be INV (legacy) */
 115};
 116
 117static inline u8 rs_extract_rate(u32 rate_n_flags)
 118{
 119	return (u8)(rate_n_flags & RATE_MCS_RATE_MSK);
 120}
 121
 122static int iwl_hwrate_to_plcp_idx(u32 rate_n_flags)
 123{
 124	int idx = 0;
 125
 126	/* HT rate format */
 127	if (rate_n_flags & RATE_MCS_HT_MSK) {
 128		idx = rs_extract_rate(rate_n_flags);
 129
 130		if (idx >= IWL_RATE_MIMO3_6M_PLCP)
 131			idx = idx - IWL_RATE_MIMO3_6M_PLCP;
 132		else if (idx >= IWL_RATE_MIMO2_6M_PLCP)
 133			idx = idx - IWL_RATE_MIMO2_6M_PLCP;
 134
 135		idx += IWL_FIRST_OFDM_RATE;
 136		/* skip 9M not supported in ht*/
 137		if (idx >= IWL_RATE_9M_INDEX)
 138			idx += 1;
 139		if ((idx >= IWL_FIRST_OFDM_RATE) && (idx <= IWL_LAST_OFDM_RATE))
 140			return idx;
 141
 142	/* legacy rate format, search for match in table */
 143	} else {
 144		for (idx = 0; idx < ARRAY_SIZE(iwl_rates); idx++)
 145			if (iwl_rates[idx].plcp ==
 146					rs_extract_rate(rate_n_flags))
 147				return idx;
 148	}
 149
 150	return -1;
 151}
 152
 153static void rs_rate_scale_perform(struct iwl_priv *priv,
 154				   struct sk_buff *skb,
 155				   struct ieee80211_sta *sta,
 156				   struct iwl_lq_sta *lq_sta);
 157static void rs_fill_link_cmd(struct iwl_priv *priv,
 158			     struct iwl_lq_sta *lq_sta, u32 rate_n_flags);
 159static void rs_stay_in_table(struct iwl_lq_sta *lq_sta, bool force_search);
 160
 161
 162#ifdef CONFIG_MAC80211_DEBUGFS
 163static void rs_dbgfs_set_mcs(struct iwl_lq_sta *lq_sta,
 164			     u32 *rate_n_flags, int index);
 165#else
 166static void rs_dbgfs_set_mcs(struct iwl_lq_sta *lq_sta,
 167			     u32 *rate_n_flags, int index)
 168{}
 169#endif
 170
 171/**
 172 * The following tables contain the expected throughput metrics for all rates
 173 *
 174 *	1, 2, 5.5, 11, 6, 9, 12, 18, 24, 36, 48, 54, 60 MBits
 175 *
 176 * where invalid entries are zeros.
 177 *
 178 * CCK rates are only valid in legacy table and will only be used in G
 179 * (2.4 GHz) band.
 180 */
 181
 182static s32 expected_tpt_legacy[IWL_RATE_COUNT] = {
 183	7, 13, 35, 58, 40, 57, 72, 98, 121, 154, 177, 186, 0
 184};
 185
 186static s32 expected_tpt_siso20MHz[4][IWL_RATE_COUNT] = {
 187	{0, 0, 0, 0, 42, 0,  76, 102, 124, 159, 183, 193, 202}, /* Norm */
 188	{0, 0, 0, 0, 46, 0,  82, 110, 132, 168, 192, 202, 210}, /* SGI */
 189	{0, 0, 0, 0, 47, 0,  91, 133, 171, 242, 305, 334, 362}, /* AGG */
 190	{0, 0, 0, 0, 52, 0, 101, 145, 187, 264, 330, 361, 390}, /* AGG+SGI */
 191};
 192
 193static s32 expected_tpt_siso40MHz[4][IWL_RATE_COUNT] = {
 194	{0, 0, 0, 0,  77, 0, 127, 160, 184, 220, 242, 250, 257}, /* Norm */
 195	{0, 0, 0, 0,  83, 0, 135, 169, 193, 229, 250, 257, 264}, /* SGI */
 196	{0, 0, 0, 0,  94, 0, 177, 249, 313, 423, 512, 550, 586}, /* AGG */
 197	{0, 0, 0, 0, 104, 0, 193, 270, 338, 454, 545, 584, 620}, /* AGG+SGI */
 198};
 199
 200static s32 expected_tpt_mimo2_20MHz[4][IWL_RATE_COUNT] = {
 201	{0, 0, 0, 0,  74, 0, 123, 155, 179, 214, 236, 244, 251}, /* Norm */
 202	{0, 0, 0, 0,  81, 0, 131, 164, 188, 223, 243, 251, 257}, /* SGI */
 203	{0, 0, 0, 0,  89, 0, 167, 235, 296, 402, 488, 526, 560}, /* AGG */
 204	{0, 0, 0, 0,  97, 0, 182, 255, 320, 431, 520, 558, 593}, /* AGG+SGI*/
 205};
 206
 207static s32 expected_tpt_mimo2_40MHz[4][IWL_RATE_COUNT] = {
 208	{0, 0, 0, 0, 123, 0, 182, 214, 235, 264, 279, 285, 289}, /* Norm */
 209	{0, 0, 0, 0, 131, 0, 191, 222, 242, 270, 284, 289, 293}, /* SGI */
 210	{0, 0, 0, 0, 171, 0, 305, 410, 496, 634, 731, 771, 805}, /* AGG */
 211	{0, 0, 0, 0, 186, 0, 329, 439, 527, 667, 764, 803, 838}, /* AGG+SGI */
 212};
 213
 214static s32 expected_tpt_mimo3_20MHz[4][IWL_RATE_COUNT] = {
 215	{0, 0, 0, 0,  99, 0, 153, 186, 208, 239, 256, 263, 268}, /* Norm */
 216	{0, 0, 0, 0, 106, 0, 162, 194, 215, 246, 262, 268, 273}, /* SGI */
 217	{0, 0, 0, 0, 134, 0, 249, 346, 431, 574, 685, 732, 775}, /* AGG */
 218	{0, 0, 0, 0, 148, 0, 272, 376, 465, 614, 727, 775, 818}, /* AGG+SGI */
 219};
 220
 221static s32 expected_tpt_mimo3_40MHz[4][IWL_RATE_COUNT] = {
 222	{0, 0, 0, 0, 152, 0, 211, 239, 255, 279,  290,  294,  297}, /* Norm */
 223	{0, 0, 0, 0, 160, 0, 219, 245, 261, 284,  294,  297,  300}, /* SGI */
 224	{0, 0, 0, 0, 254, 0, 443, 584, 695, 868,  984, 1030, 1070}, /* AGG */
 225	{0, 0, 0, 0, 277, 0, 478, 624, 737, 911, 1026, 1070, 1109}, /* AGG+SGI */
 226};
 227
 228/* mbps, mcs */
 229static const struct iwl_rate_mcs_info iwl_rate_mcs[IWL_RATE_COUNT] = {
 230	{  "1", "BPSK DSSS"},
 231	{  "2", "QPSK DSSS"},
 232	{"5.5", "BPSK CCK"},
 233	{ "11", "QPSK CCK"},
 234	{  "6", "BPSK 1/2"},
 235	{  "9", "BPSK 1/2"},
 236	{ "12", "QPSK 1/2"},
 237	{ "18", "QPSK 3/4"},
 238	{ "24", "16QAM 1/2"},
 239	{ "36", "16QAM 3/4"},
 240	{ "48", "64QAM 2/3"},
 241	{ "54", "64QAM 3/4"},
 242	{ "60", "64QAM 5/6"},
 243};
 244
 245#define MCS_INDEX_PER_STREAM	(8)
 246
 247static void rs_rate_scale_clear_window(struct iwl_rate_scale_data *window)
 248{
 249	window->data = 0;
 250	window->success_counter = 0;
 251	window->success_ratio = IWL_INVALID_VALUE;
 252	window->counter = 0;
 253	window->average_tpt = IWL_INVALID_VALUE;
 254	window->stamp = 0;
 255}
 256
 257static inline u8 rs_is_valid_ant(u8 valid_antenna, u8 ant_type)
 258{
 259	return (ant_type & valid_antenna) == ant_type;
 260}
 261
 262/*
 263 *	removes the old data from the statistics. All data that is older than
 264 *	TID_MAX_TIME_DIFF, will be deleted.
 265 */
 266static void rs_tl_rm_old_stats(struct iwl_traffic_load *tl, u32 curr_time)
 267{
 268	/* The oldest age we want to keep */
 269	u32 oldest_time = curr_time - TID_MAX_TIME_DIFF;
 270
 271	while (tl->queue_count &&
 272	       (tl->time_stamp < oldest_time)) {
 273		tl->total -= tl->packet_count[tl->head];
 274		tl->packet_count[tl->head] = 0;
 275		tl->time_stamp += TID_QUEUE_CELL_SPACING;
 276		tl->queue_count--;
 277		tl->head++;
 278		if (tl->head >= TID_QUEUE_MAX_SIZE)
 279			tl->head = 0;
 280	}
 281}
 282
 283/*
 284 *	increment traffic load value for tid and also remove
 285 *	any old values if passed the certain time period
 286 */
 287static u8 rs_tl_add_packet(struct iwl_lq_sta *lq_data,
 288			   struct ieee80211_hdr *hdr)
 289{
 290	u32 curr_time = jiffies_to_msecs(jiffies);
 291	u32 time_diff;
 292	s32 index;
 293	struct iwl_traffic_load *tl = NULL;
 294	u8 tid;
 295
 296	if (ieee80211_is_data_qos(hdr->frame_control)) {
 297		u8 *qc = ieee80211_get_qos_ctl(hdr);
 298		tid = qc[0] & 0xf;
 299	} else
 300		return IWL_MAX_TID_COUNT;
 301
 302	if (unlikely(tid >= IWL_MAX_TID_COUNT))
 303		return IWL_MAX_TID_COUNT;
 304
 305	tl = &lq_data->load[tid];
 306
 307	curr_time -= curr_time % TID_ROUND_VALUE;
 308
 309	/* Happens only for the first packet. Initialize the data */
 310	if (!(tl->queue_count)) {
 311		tl->total = 1;
 312		tl->time_stamp = curr_time;
 313		tl->queue_count = 1;
 314		tl->head = 0;
 315		tl->packet_count[0] = 1;
 316		return IWL_MAX_TID_COUNT;
 317	}
 318
 319	time_diff = TIME_WRAP_AROUND(tl->time_stamp, curr_time);
 320	index = time_diff / TID_QUEUE_CELL_SPACING;
 321
 322	/* The history is too long: remove data that is older than */
 323	/* TID_MAX_TIME_DIFF */
 324	if (index >= TID_QUEUE_MAX_SIZE)
 325		rs_tl_rm_old_stats(tl, curr_time);
 326
 327	index = (tl->head + index) % TID_QUEUE_MAX_SIZE;
 328	tl->packet_count[index] = tl->packet_count[index] + 1;
 329	tl->total = tl->total + 1;
 330
 331	if ((index + 1) > tl->queue_count)
 332		tl->queue_count = index + 1;
 333
 334	return tid;
 335}
 336
 337#ifdef CONFIG_MAC80211_DEBUGFS
 338/**
 339 * Program the device to use fixed rate for frame transmit
 340 * This is for debugging/testing only
 341 * once the device start use fixed rate, we need to reload the module
 342 * to being back the normal operation.
 343 */
 344static void rs_program_fix_rate(struct iwl_priv *priv,
 345				struct iwl_lq_sta *lq_sta)
 346{
 347	struct iwl_station_priv *sta_priv =
 348		container_of(lq_sta, struct iwl_station_priv, lq_sta);
 349	struct iwl_rxon_context *ctx = sta_priv->ctx;
 350
 351	lq_sta->active_legacy_rate = 0x0FFF;	/* 1 - 54 MBits, includes CCK */
 352	lq_sta->active_siso_rate   = 0x1FD0;	/* 6 - 60 MBits, no 9, no CCK */
 353	lq_sta->active_mimo2_rate  = 0x1FD0;	/* 6 - 60 MBits, no 9, no CCK */
 354	lq_sta->active_mimo3_rate  = 0x1FD0;	/* 6 - 60 MBits, no 9, no CCK */
 355
 356#ifdef CONFIG_IWLWIFI_DEVICE_TESTMODE
 357	/* testmode has higher priority to overwirte the fixed rate */
 358	if (priv->tm_fixed_rate)
 359		lq_sta->dbg_fixed_rate = priv->tm_fixed_rate;
 360#endif
 361
 362	IWL_DEBUG_RATE(priv, "sta_id %d rate 0x%X\n",
 363		lq_sta->lq.sta_id, lq_sta->dbg_fixed_rate);
 364
 365	if (lq_sta->dbg_fixed_rate) {
 366		rs_fill_link_cmd(NULL, lq_sta, lq_sta->dbg_fixed_rate);
 367		iwl_send_lq_cmd(lq_sta->drv, ctx, &lq_sta->lq, CMD_ASYNC,
 368				false);
 369	}
 370}
 371#endif
 372
 373/*
 374	get the traffic load value for tid
 375*/
 376static u32 rs_tl_get_load(struct iwl_lq_sta *lq_data, u8 tid)
 377{
 378	u32 curr_time = jiffies_to_msecs(jiffies);
 379	u32 time_diff;
 380	s32 index;
 381	struct iwl_traffic_load *tl = NULL;
 382
 383	if (tid >= IWL_MAX_TID_COUNT)
 384		return 0;
 385
 386	tl = &(lq_data->load[tid]);
 387
 388	curr_time -= curr_time % TID_ROUND_VALUE;
 389
 390	if (!(tl->queue_count))
 391		return 0;
 392
 393	time_diff = TIME_WRAP_AROUND(tl->time_stamp, curr_time);
 394	index = time_diff / TID_QUEUE_CELL_SPACING;
 395
 396	/* The history is too long: remove data that is older than */
 397	/* TID_MAX_TIME_DIFF */
 398	if (index >= TID_QUEUE_MAX_SIZE)
 399		rs_tl_rm_old_stats(tl, curr_time);
 400
 401	return tl->total;
 402}
 403
 404static int rs_tl_turn_on_agg_for_tid(struct iwl_priv *priv,
 405				      struct iwl_lq_sta *lq_data, u8 tid,
 406				      struct ieee80211_sta *sta)
 407{
 408	int ret = -EAGAIN;
 409	u32 load;
 410
 411	/*
 412	 * Don't create TX aggregation sessions when in high
 413	 * BT traffic, as they would just be disrupted by BT.
 414	 */
 415	if (priv->bt_traffic_load >= IWL_BT_COEX_TRAFFIC_LOAD_HIGH) {
 416		IWL_ERR(priv, "BT traffic (%d), no aggregation allowed\n",
 417			priv->bt_traffic_load);
 418		return ret;
 419	}
 420
 421	load = rs_tl_get_load(lq_data, tid);
 422
 423	if ((iwlwifi_mod_params.auto_agg) || (load > IWL_AGG_LOAD_THRESHOLD)) {
 424		IWL_DEBUG_HT(priv, "Starting Tx agg: STA: %pM tid: %d\n",
 425				sta->addr, tid);
 426		ret = ieee80211_start_tx_ba_session(sta, tid, 5000);
 427		if (ret == -EAGAIN) {
 428			/*
 429			 * driver and mac80211 is out of sync
 430			 * this might be cause by reloading firmware
 431			 * stop the tx ba session here
 432			 */
 433			IWL_ERR(priv, "Fail start Tx agg on tid: %d\n",
 434				tid);
 435			ieee80211_stop_tx_ba_session(sta, tid);
 436		}
 437	} else {
 438		IWL_DEBUG_HT(priv, "Aggregation not enabled for tid %d "
 439			"because load = %u\n", tid, load);
 440	}
 441	return ret;
 442}
 443
 444static void rs_tl_turn_on_agg(struct iwl_priv *priv, u8 tid,
 445			      struct iwl_lq_sta *lq_data,
 446			      struct ieee80211_sta *sta)
 447{
 448	if (tid < IWL_MAX_TID_COUNT)
 449		rs_tl_turn_on_agg_for_tid(priv, lq_data, tid, sta);
 450	else
 451		IWL_ERR(priv, "tid exceeds max TID count: %d/%d\n",
 452			tid, IWL_MAX_TID_COUNT);
 453}
 454
 455static inline int get_num_of_ant_from_rate(u32 rate_n_flags)
 456{
 457	return !!(rate_n_flags & RATE_MCS_ANT_A_MSK) +
 458	       !!(rate_n_flags & RATE_MCS_ANT_B_MSK) +
 459	       !!(rate_n_flags & RATE_MCS_ANT_C_MSK);
 460}
 461
 462/*
 463 * Static function to get the expected throughput from an iwl_scale_tbl_info
 464 * that wraps a NULL pointer check
 465 */
 466static s32 get_expected_tpt(struct iwl_scale_tbl_info *tbl, int rs_index)
 467{
 468	if (tbl->expected_tpt)
 469		return tbl->expected_tpt[rs_index];
 470	return 0;
 471}
 472
 473/**
 474 * rs_collect_tx_data - Update the success/failure sliding window
 475 *
 476 * We keep a sliding window of the last 62 packets transmitted
 477 * at this rate.  window->data contains the bitmask of successful
 478 * packets.
 479 */
 480static int rs_collect_tx_data(struct iwl_scale_tbl_info *tbl,
 481			      int scale_index, int attempts, int successes)
 482{
 483	struct iwl_rate_scale_data *window = NULL;
 484	static const u64 mask = (((u64)1) << (IWL_RATE_MAX_WINDOW - 1));
 485	s32 fail_count, tpt;
 486
 487	if (scale_index < 0 || scale_index >= IWL_RATE_COUNT)
 488		return -EINVAL;
 489
 490	/* Select window for current tx bit rate */
 491	window = &(tbl->win[scale_index]);
 492
 493	/* Get expected throughput */
 494	tpt = get_expected_tpt(tbl, scale_index);
 495
 496	/*
 497	 * Keep track of only the latest 62 tx frame attempts in this rate's
 498	 * history window; anything older isn't really relevant any more.
 499	 * If we have filled up the sliding window, drop the oldest attempt;
 500	 * if the oldest attempt (highest bit in bitmap) shows "success",
 501	 * subtract "1" from the success counter (this is the main reason
 502	 * we keep these bitmaps!).
 503	 */
 504	while (attempts > 0) {
 505		if (window->counter >= IWL_RATE_MAX_WINDOW) {
 506
 507			/* remove earliest */
 508			window->counter = IWL_RATE_MAX_WINDOW - 1;
 509
 510			if (window->data & mask) {
 511				window->data &= ~mask;
 512				window->success_counter--;
 513			}
 514		}
 515
 516		/* Increment frames-attempted counter */
 517		window->counter++;
 518
 519		/* Shift bitmap by one frame to throw away oldest history */
 520		window->data <<= 1;
 521
 522		/* Mark the most recent #successes attempts as successful */
 523		if (successes > 0) {
 524			window->success_counter++;
 525			window->data |= 0x1;
 526			successes--;
 527		}
 528
 529		attempts--;
 530	}
 531
 532	/* Calculate current success ratio, avoid divide-by-0! */
 533	if (window->counter > 0)
 534		window->success_ratio = 128 * (100 * window->success_counter)
 535					/ window->counter;
 536	else
 537		window->success_ratio = IWL_INVALID_VALUE;
 538
 539	fail_count = window->counter - window->success_counter;
 540
 541	/* Calculate average throughput, if we have enough history. */
 542	if ((fail_count >= IWL_RATE_MIN_FAILURE_TH) ||
 543	    (window->success_counter >= IWL_RATE_MIN_SUCCESS_TH))
 544		window->average_tpt = (window->success_ratio * tpt + 64) / 128;
 545	else
 546		window->average_tpt = IWL_INVALID_VALUE;
 547
 548	/* Tag this window as having been updated */
 549	window->stamp = jiffies;
 550
 551	return 0;
 552}
 553
 554/*
 555 * Fill uCode API rate_n_flags field, based on "search" or "active" table.
 556 */
 557/* FIXME:RS:remove this function and put the flags statically in the table */
 558static u32 rate_n_flags_from_tbl(struct iwl_priv *priv,
 559				 struct iwl_scale_tbl_info *tbl,
 560				 int index, u8 use_green)
 561{
 562	u32 rate_n_flags = 0;
 563
 564	if (is_legacy(tbl->lq_type)) {
 565		rate_n_flags = iwl_rates[index].plcp;
 566		if (index >= IWL_FIRST_CCK_RATE && index <= IWL_LAST_CCK_RATE)
 567			rate_n_flags |= RATE_MCS_CCK_MSK;
 568
 569	} else if (is_Ht(tbl->lq_type)) {
 570		if (index > IWL_LAST_OFDM_RATE) {
 571			IWL_ERR(priv, "Invalid HT rate index %d\n", index);
 572			index = IWL_LAST_OFDM_RATE;
 573		}
 574		rate_n_flags = RATE_MCS_HT_MSK;
 575
 576		if (is_siso(tbl->lq_type))
 577			rate_n_flags |=	iwl_rates[index].plcp_siso;
 578		else if (is_mimo2(tbl->lq_type))
 579			rate_n_flags |=	iwl_rates[index].plcp_mimo2;
 580		else
 581			rate_n_flags |=	iwl_rates[index].plcp_mimo3;
 582	} else {
 583		IWL_ERR(priv, "Invalid tbl->lq_type %d\n", tbl->lq_type);
 584	}
 585
 586	rate_n_flags |= ((tbl->ant_type << RATE_MCS_ANT_POS) &
 587						     RATE_MCS_ANT_ABC_MSK);
 588
 589	if (is_Ht(tbl->lq_type)) {
 590		if (tbl->is_ht40) {
 591			if (tbl->is_dup)
 592				rate_n_flags |= RATE_MCS_DUP_MSK;
 593			else
 594				rate_n_flags |= RATE_MCS_HT40_MSK;
 595		}
 596		if (tbl->is_SGI)
 597			rate_n_flags |= RATE_MCS_SGI_MSK;
 598
 599		if (use_green) {
 600			rate_n_flags |= RATE_MCS_GF_MSK;
 601			if (is_siso(tbl->lq_type) && tbl->is_SGI) {
 602				rate_n_flags &= ~RATE_MCS_SGI_MSK;
 603				IWL_ERR(priv, "GF was set with SGI:SISO\n");
 604			}
 605		}
 606	}
 607	return rate_n_flags;
 608}
 609
 610/*
 611 * Interpret uCode API's rate_n_flags format,
 612 * fill "search" or "active" tx mode table.
 613 */
 614static int rs_get_tbl_info_from_mcs(const u32 rate_n_flags,
 615				    enum ieee80211_band band,
 616				    struct iwl_scale_tbl_info *tbl,
 617				    int *rate_idx)
 618{
 619	u32 ant_msk = (rate_n_flags & RATE_MCS_ANT_ABC_MSK);
 620	u8 num_of_ant = get_num_of_ant_from_rate(rate_n_flags);
 621	u8 mcs;
 622
 623	memset(tbl, 0, sizeof(struct iwl_scale_tbl_info));
 624	*rate_idx = iwl_hwrate_to_plcp_idx(rate_n_flags);
 625
 626	if (*rate_idx  == IWL_RATE_INVALID) {
 627		*rate_idx = -1;
 628		return -EINVAL;
 629	}
 630	tbl->is_SGI = 0;	/* default legacy setup */
 631	tbl->is_ht40 = 0;
 632	tbl->is_dup = 0;
 633	tbl->ant_type = (ant_msk >> RATE_MCS_ANT_POS);
 634	tbl->lq_type = LQ_NONE;
 635	tbl->max_search = IWL_MAX_SEARCH;
 636
 637	/* legacy rate format */
 638	if (!(rate_n_flags & RATE_MCS_HT_MSK)) {
 639		if (num_of_ant == 1) {
 640			if (band == IEEE80211_BAND_5GHZ)
 641				tbl->lq_type = LQ_A;
 642			else
 643				tbl->lq_type = LQ_G;
 644		}
 645	/* HT rate format */
 646	} else {
 647		if (rate_n_flags & RATE_MCS_SGI_MSK)
 648			tbl->is_SGI = 1;
 649
 650		if ((rate_n_flags & RATE_MCS_HT40_MSK) ||
 651		    (rate_n_flags & RATE_MCS_DUP_MSK))
 652			tbl->is_ht40 = 1;
 653
 654		if (rate_n_flags & RATE_MCS_DUP_MSK)
 655			tbl->is_dup = 1;
 656
 657		mcs = rs_extract_rate(rate_n_flags);
 658
 659		/* SISO */
 660		if (mcs <= IWL_RATE_SISO_60M_PLCP) {
 661			if (num_of_ant == 1)
 662				tbl->lq_type = LQ_SISO; /*else NONE*/
 663		/* MIMO2 */
 664		} else if (mcs <= IWL_RATE_MIMO2_60M_PLCP) {
 665			if (num_of_ant == 2)
 666				tbl->lq_type = LQ_MIMO2;
 667		/* MIMO3 */
 668		} else {
 669			if (num_of_ant == 3) {
 670				tbl->max_search = IWL_MAX_11N_MIMO3_SEARCH;
 671				tbl->lq_type = LQ_MIMO3;
 672			}
 673		}
 674	}
 675	return 0;
 676}
 677
 678/* switch to another antenna/antennas and return 1 */
 679/* if no other valid antenna found, return 0 */
 680static int rs_toggle_antenna(u32 valid_ant, u32 *rate_n_flags,
 681			     struct iwl_scale_tbl_info *tbl)
 682{
 683	u8 new_ant_type;
 684
 685	if (!tbl->ant_type || tbl->ant_type > ANT_ABC)
 686		return 0;
 687
 688	if (!rs_is_valid_ant(valid_ant, tbl->ant_type))
 689		return 0;
 690
 691	new_ant_type = ant_toggle_lookup[tbl->ant_type];
 692
 693	while ((new_ant_type != tbl->ant_type) &&
 694	       !rs_is_valid_ant(valid_ant, new_ant_type))
 695		new_ant_type = ant_toggle_lookup[new_ant_type];
 696
 697	if (new_ant_type == tbl->ant_type)
 698		return 0;
 699
 700	tbl->ant_type = new_ant_type;
 701	*rate_n_flags &= ~RATE_MCS_ANT_ABC_MSK;
 702	*rate_n_flags |= new_ant_type << RATE_MCS_ANT_POS;
 703	return 1;
 704}
 705
 706/**
 707 * Green-field mode is valid if the station supports it and
 708 * there are no non-GF stations present in the BSS.
 709 */
 710static bool rs_use_green(struct ieee80211_sta *sta)
 711{
 712	/*
 713	 * There's a bug somewhere in this code that causes the
 714	 * scaling to get stuck because GF+SGI can't be combined
 715	 * in SISO rates. Until we find that bug, disable GF, it
 716	 * has only limited benefit and we still interoperate with
 717	 * GF APs since we can always receive GF transmissions.
 718	 */
 719	return false;
 720}
 721
 722/**
 723 * rs_get_supported_rates - get the available rates
 724 *
 725 * if management frame or broadcast frame only return
 726 * basic available rates.
 727 *
 728 */
 729static u16 rs_get_supported_rates(struct iwl_lq_sta *lq_sta,
 730				  struct ieee80211_hdr *hdr,
 731				  enum iwl_table_type rate_type)
 732{
 733	if (is_legacy(rate_type)) {
 734		return lq_sta->active_legacy_rate;
 735	} else {
 736		if (is_siso(rate_type))
 737			return lq_sta->active_siso_rate;
 738		else if (is_mimo2(rate_type))
 739			return lq_sta->active_mimo2_rate;
 740		else
 741			return lq_sta->active_mimo3_rate;
 742	}
 743}
 744
 745static u16 rs_get_adjacent_rate(struct iwl_priv *priv, u8 index, u16 rate_mask,
 746				int rate_type)
 747{
 748	u8 high = IWL_RATE_INVALID;
 749	u8 low = IWL_RATE_INVALID;
 750
 751	/* 802.11A or ht walks to the next literal adjacent rate in
 752	 * the rate table */
 753	if (is_a_band(rate_type) || !is_legacy(rate_type)) {
 754		int i;
 755		u32 mask;
 756
 757		/* Find the previous rate that is in the rate mask */
 758		i = index - 1;
 759		for (mask = (1 << i); i >= 0; i--, mask >>= 1) {
 760			if (rate_mask & mask) {
 761				low = i;
 762				break;
 763			}
 764		}
 765
 766		/* Find the next rate that is in the rate mask */
 767		i = index + 1;
 768		for (mask = (1 << i); i < IWL_RATE_COUNT; i++, mask <<= 1) {
 769			if (rate_mask & mask) {
 770				high = i;
 771				break;
 772			}
 773		}
 774
 775		return (high << 8) | low;
 776	}
 777
 778	low = index;
 779	while (low != IWL_RATE_INVALID) {
 780		low = iwl_rates[low].prev_rs;
 781		if (low == IWL_RATE_INVALID)
 782			break;
 783		if (rate_mask & (1 << low))
 784			break;
 785		IWL_DEBUG_RATE(priv, "Skipping masked lower rate: %d\n", low);
 786	}
 787
 788	high = index;
 789	while (high != IWL_RATE_INVALID) {
 790		high = iwl_rates[high].next_rs;
 791		if (high == IWL_RATE_INVALID)
 792			break;
 793		if (rate_mask & (1 << high))
 794			break;
 795		IWL_DEBUG_RATE(priv, "Skipping masked higher rate: %d\n", high);
 796	}
 797
 798	return (high << 8) | low;
 799}
 800
 801static u32 rs_get_lower_rate(struct iwl_lq_sta *lq_sta,
 802			     struct iwl_scale_tbl_info *tbl,
 803			     u8 scale_index, u8 ht_possible)
 804{
 805	s32 low;
 806	u16 rate_mask;
 807	u16 high_low;
 808	u8 switch_to_legacy = 0;
 809	u8 is_green = lq_sta->is_green;
 810	struct iwl_priv *priv = lq_sta->drv;
 811
 812	/* check if we need to switch from HT to legacy rates.
 813	 * assumption is that mandatory rates (1Mbps or 6Mbps)
 814	 * are always supported (spec demand) */
 815	if (!is_legacy(tbl->lq_type) && (!ht_possible || !scale_index)) {
 816		switch_to_legacy = 1;
 817		scale_index = rs_ht_to_legacy[scale_index];
 818		if (lq_sta->band == IEEE80211_BAND_5GHZ)
 819			tbl->lq_type = LQ_A;
 820		else
 821			tbl->lq_type = LQ_G;
 822
 823		if (num_of_ant(tbl->ant_type) > 1)
 824			tbl->ant_type =
 825			    first_antenna(priv->hw_params.valid_tx_ant);
 826
 827		tbl->is_ht40 = 0;
 828		tbl->is_SGI = 0;
 829		tbl->max_search = IWL_MAX_SEARCH;
 830	}
 831
 832	rate_mask = rs_get_supported_rates(lq_sta, NULL, tbl->lq_type);
 833
 834	/* Mask with station rate restriction */
 835	if (is_legacy(tbl->lq_type)) {
 836		/* supp_rates has no CCK bits in A mode */
 837		if (lq_sta->band == IEEE80211_BAND_5GHZ)
 838			rate_mask  = (u16)(rate_mask &
 839			   (lq_sta->supp_rates << IWL_FIRST_OFDM_RATE));
 840		else
 841			rate_mask = (u16)(rate_mask & lq_sta->supp_rates);
 842	}
 843
 844	/* If we switched from HT to legacy, check current rate */
 845	if (switch_to_legacy && (rate_mask & (1 << scale_index))) {
 846		low = scale_index;
 847		goto out;
 848	}
 849
 850	high_low = rs_get_adjacent_rate(lq_sta->drv, scale_index, rate_mask,
 851					tbl->lq_type);
 852	low = high_low & 0xff;
 853
 854	if (low == IWL_RATE_INVALID)
 855		low = scale_index;
 856
 857out:
 858	return rate_n_flags_from_tbl(lq_sta->drv, tbl, low, is_green);
 859}
 860
 861/*
 862 * Simple function to compare two rate scale table types
 863 */
 864static bool table_type_matches(struct iwl_scale_tbl_info *a,
 865			       struct iwl_scale_tbl_info *b)
 866{
 867	return (a->lq_type == b->lq_type) && (a->ant_type == b->ant_type) &&
 868		(a->is_SGI == b->is_SGI);
 869}
 870
 871static void rs_bt_update_lq(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
 872			    struct iwl_lq_sta *lq_sta)
 873{
 874	struct iwl_scale_tbl_info *tbl;
 875	bool full_concurrent = priv->bt_full_concurrent;
 876
 877	if (priv->bt_ant_couple_ok) {
 878		/*
 879		 * Is there a need to switch between
 880		 * full concurrency and 3-wire?
 881		 */
 882		if (priv->bt_ci_compliance && priv->bt_ant_couple_ok)
 883			full_concurrent = true;
 884		else
 885			full_concurrent = false;
 886	}
 887	if ((priv->bt_traffic_load != priv->last_bt_traffic_load) ||
 888	    (priv->bt_full_concurrent != full_concurrent)) {
 889		priv->bt_full_concurrent = full_concurrent;
 890		priv->last_bt_traffic_load = priv->bt_traffic_load;
 891
 892		/* Update uCode's rate table. */
 893		tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
 894		rs_fill_link_cmd(priv, lq_sta, tbl->current_rate);
 895		iwl_send_lq_cmd(priv, ctx, &lq_sta->lq, CMD_ASYNC, false);
 896
 897		queue_work(priv->workqueue, &priv->bt_full_concurrency);
 898	}
 899}
 900
 901/*
 902 * mac80211 sends us Tx status
 903 */
 904static void rs_tx_status(void *priv_r, struct ieee80211_supported_band *sband,
 905			 struct ieee80211_sta *sta, void *priv_sta,
 906			 struct sk_buff *skb)
 907{
 908	int legacy_success;
 909	int retries;
 910	int rs_index, mac_index, i;
 911	struct iwl_lq_sta *lq_sta = priv_sta;
 912	struct iwl_link_quality_cmd *table;
 913	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
 914	struct iwl_op_mode *op_mode = (struct iwl_op_mode *)priv_r;
 915	struct iwl_priv *priv = IWL_OP_MODE_GET_DVM(op_mode);
 916	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
 917	enum mac80211_rate_control_flags mac_flags;
 918	u32 tx_rate;
 919	struct iwl_scale_tbl_info tbl_type;
 920	struct iwl_scale_tbl_info *curr_tbl, *other_tbl, *tmp_tbl;
 921	struct iwl_station_priv *sta_priv = (void *)sta->drv_priv;
 922	struct iwl_rxon_context *ctx = sta_priv->ctx;
 923
 924	IWL_DEBUG_RATE_LIMIT(priv, "get frame ack response, update rate scale window\n");
 925
 926	/* Treat uninitialized rate scaling data same as non-existing. */
 927	if (!lq_sta) {
 928		IWL_DEBUG_RATE(priv, "Station rate scaling not created yet.\n");
 929		return;
 930	} else if (!lq_sta->drv) {
 931		IWL_DEBUG_RATE(priv, "Rate scaling not initialized yet.\n");
 932		return;
 933	}
 934
 935	if (!ieee80211_is_data(hdr->frame_control) ||
 936	    info->flags & IEEE80211_TX_CTL_NO_ACK)
 937		return;
 938
 939	/* This packet was aggregated but doesn't carry status info */
 940	if ((info->flags & IEEE80211_TX_CTL_AMPDU) &&
 941	    !(info->flags & IEEE80211_TX_STAT_AMPDU))
 942		return;
 943
 944	/*
 945	 * Ignore this Tx frame response if its initial rate doesn't match
 946	 * that of latest Link Quality command.  There may be stragglers
 947	 * from a previous Link Quality command, but we're no longer interested
 948	 * in those; they're either from the "active" mode while we're trying
 949	 * to check "search" mode, or a prior "search" mode after we've moved
 950	 * to a new "search" mode (which might become the new "active" mode).
 951	 */
 952	table = &lq_sta->lq;
 953	tx_rate = le32_to_cpu(table->rs_table[0].rate_n_flags);
 954	rs_get_tbl_info_from_mcs(tx_rate, priv->band, &tbl_type, &rs_index);
 955	if (priv->band == IEEE80211_BAND_5GHZ)
 956		rs_index -= IWL_FIRST_OFDM_RATE;
 957	mac_flags = info->status.rates[0].flags;
 958	mac_index = info->status.rates[0].idx;
 959	/* For HT packets, map MCS to PLCP */
 960	if (mac_flags & IEEE80211_TX_RC_MCS) {
 961		mac_index &= RATE_MCS_CODE_MSK;	/* Remove # of streams */
 962		if (mac_index >= (IWL_RATE_9M_INDEX - IWL_FIRST_OFDM_RATE))
 963			mac_index++;
 964		/*
 965		 * mac80211 HT index is always zero-indexed; we need to move
 966		 * HT OFDM rates after CCK rates in 2.4 GHz band
 967		 */
 968		if (priv->band == IEEE80211_BAND_2GHZ)
 969			mac_index += IWL_FIRST_OFDM_RATE;
 970	}
 971	/* Here we actually compare this rate to the latest LQ command */
 972	if ((mac_index < 0) ||
 973	    (tbl_type.is_SGI != !!(mac_flags & IEEE80211_TX_RC_SHORT_GI)) ||
 974	    (tbl_type.is_ht40 != !!(mac_flags & IEEE80211_TX_RC_40_MHZ_WIDTH)) ||
 975	    (tbl_type.is_dup != !!(mac_flags & IEEE80211_TX_RC_DUP_DATA)) ||
 976	    (tbl_type.ant_type != info->status.antenna) ||
 977	    (!!(tx_rate & RATE_MCS_HT_MSK) != !!(mac_flags & IEEE80211_TX_RC_MCS)) ||
 978	    (!!(tx_rate & RATE_MCS_GF_MSK) != !!(mac_flags & IEEE80211_TX_RC_GREEN_FIELD)) ||
 979	    (rs_index != mac_index)) {
 980		IWL_DEBUG_RATE(priv, "initial rate %d does not match %d (0x%x)\n", mac_index, rs_index, tx_rate);
 981		/*
 982		 * Since rates mis-match, the last LQ command may have failed.
 983		 * After IWL_MISSED_RATE_MAX mis-matches, resync the uCode with
 984		 * ... driver.
 985		 */
 986		lq_sta->missed_rate_counter++;
 987		if (lq_sta->missed_rate_counter > IWL_MISSED_RATE_MAX) {
 988			lq_sta->missed_rate_counter = 0;
 989			iwl_send_lq_cmd(priv, ctx, &lq_sta->lq, CMD_ASYNC, false);
 990		}
 991		/* Regardless, ignore this status info for outdated rate */
 992		return;
 993	} else
 994		/* Rate did match, so reset the missed_rate_counter */
 995		lq_sta->missed_rate_counter = 0;
 996
 997	/* Figure out if rate scale algorithm is in active or search table */
 998	if (table_type_matches(&tbl_type,
 999				&(lq_sta->lq_info[lq_sta->active_tbl]))) {
1000		curr_tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
1001		other_tbl = &(lq_sta->lq_info[1 - lq_sta->active_tbl]);
1002	} else if (table_type_matches(&tbl_type,
1003				&lq_sta->lq_info[1 - lq_sta->active_tbl])) {
1004		curr_tbl = &(lq_sta->lq_info[1 - lq_sta->active_tbl]);
1005		other_tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
1006	} else {
1007		IWL_DEBUG_RATE(priv, "Neither active nor search matches tx rate\n");
1008		tmp_tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
1009		IWL_DEBUG_RATE(priv, "active- lq:%x, ant:%x, SGI:%d\n",
1010			tmp_tbl->lq_type, tmp_tbl->ant_type, tmp_tbl->is_SGI);
1011		tmp_tbl = &(lq_sta->lq_info[1 - lq_sta->active_tbl]);
1012		IWL_DEBUG_RATE(priv, "search- lq:%x, ant:%x, SGI:%d\n",
1013			tmp_tbl->lq_type, tmp_tbl->ant_type, tmp_tbl->is_SGI);
1014		IWL_DEBUG_RATE(priv, "actual- lq:%x, ant:%x, SGI:%d\n",
1015			tbl_type.lq_type, tbl_type.ant_type, tbl_type.is_SGI);
1016		/*
1017		 * no matching table found, let's by-pass the data collection
1018		 * and continue to perform rate scale to find the rate table
1019		 */
1020		rs_stay_in_table(lq_sta, true);
1021		goto done;
1022	}
1023
1024	/*
1025	 * Updating the frame history depends on whether packets were
1026	 * aggregated.
1027	 *
1028	 * For aggregation, all packets were transmitted at the same rate, the
1029	 * first index into rate scale table.
1030	 */
1031	if (info->flags & IEEE80211_TX_STAT_AMPDU) {
1032		tx_rate = le32_to_cpu(table->rs_table[0].rate_n_flags);
1033		rs_get_tbl_info_from_mcs(tx_rate, priv->band, &tbl_type,
1034				&rs_index);
1035		rs_collect_tx_data(curr_tbl, rs_index,
1036				   info->status.ampdu_len,
1037				   info->status.ampdu_ack_len);
1038
1039		/* Update success/fail counts if not searching for new mode */
1040		if (lq_sta->stay_in_tbl) {
1041			lq_sta->total_success += info->status.ampdu_ack_len;
1042			lq_sta->total_failed += (info->status.ampdu_len -
1043					info->status.ampdu_ack_len);
1044		}
1045	} else {
1046	/*
1047	 * For legacy, update frame history with for each Tx retry.
1048	 */
1049		retries = info->status.rates[0].count - 1;
1050		/* HW doesn't send more than 15 retries */
1051		retries = min(retries, 15);
1052
1053		/* The last transmission may have been successful */
1054		legacy_success = !!(info->flags & IEEE80211_TX_STAT_ACK);
1055		/* Collect data for each rate used during failed TX attempts */
1056		for (i = 0; i <= retries; ++i) {
1057			tx_rate = le32_to_cpu(table->rs_table[i].rate_n_flags);
1058			rs_get_tbl_info_from_mcs(tx_rate, priv->band,
1059					&tbl_type, &rs_index);
1060			/*
1061			 * Only collect stats if retried rate is in the same RS
1062			 * table as active/search.
1063			 */
1064			if (table_type_matches(&tbl_type, curr_tbl))
1065				tmp_tbl = curr_tbl;
1066			else if (table_type_matches(&tbl_type, other_tbl))
1067				tmp_tbl = other_tbl;
1068			else
1069				continue;
1070			rs_collect_tx_data(tmp_tbl, rs_index, 1,
1071					   i < retries ? 0 : legacy_success);
1072		}
1073
1074		/* Update success/fail counts if not searching for new mode */
1075		if (lq_sta->stay_in_tbl) {
1076			lq_sta->total_success += legacy_success;
1077			lq_sta->total_failed += retries + (1 - legacy_success);
1078		}
1079	}
1080	/* The last TX rate is cached in lq_sta; it's set in if/else above */
1081	lq_sta->last_rate_n_flags = tx_rate;
1082done:
1083	/* See if there's a better rate or modulation mode to try. */
1084	if (sta && sta->supp_rates[sband->band])
1085		rs_rate_scale_perform(priv, skb, sta, lq_sta);
1086
1087#if defined(CONFIG_MAC80211_DEBUGFS) && defined(CONFIG_IWLWIFI_DEVICE_TESTMODE)
1088	if ((priv->tm_fixed_rate) &&
1089	    (priv->tm_fixed_rate != lq_sta->dbg_fixed_rate))
1090		rs_program_fix_rate(priv, lq_sta);
1091#endif
1092	if (priv->cfg->bt_params && priv->cfg->bt_params->advanced_bt_coexist)
1093		rs_bt_update_lq(priv, ctx, lq_sta);
1094}
1095
1096/*
1097 * Begin a period of staying with a selected modulation mode.
1098 * Set "stay_in_tbl" flag to prevent any mode switches.
1099 * Set frame tx success limits according to legacy vs. high-throughput,
1100 * and reset overall (spanning all rates) tx success history statistics.
1101 * These control how long we stay using same modulation mode before
1102 * searching for a new mode.
1103 */
1104static void rs_set_stay_in_table(struct iwl_priv *priv, u8 is_legacy,
1105				 struct iwl_lq_sta *lq_sta)
1106{
1107	IWL_DEBUG_RATE(priv, "we are staying in the same table\n");
1108	lq_sta->stay_in_tbl = 1;	/* only place this gets set */
1109	if (is_legacy) {
1110		lq_sta->table_count_limit = IWL_LEGACY_TABLE_COUNT;
1111		lq_sta->max_failure_limit = IWL_LEGACY_FAILURE_LIMIT;
1112		lq_sta->max_success_limit = IWL_LEGACY_SUCCESS_LIMIT;
1113	} else {
1114		lq_sta->table_count_limit = IWL_NONE_LEGACY_TABLE_COUNT;
1115		lq_sta->max_failure_limit = IWL_NONE_LEGACY_FAILURE_LIMIT;
1116		lq_sta->max_success_limit = IWL_NONE_LEGACY_SUCCESS_LIMIT;
1117	}
1118	lq_sta->table_count = 0;
1119	lq_sta->total_failed = 0;
1120	lq_sta->total_success = 0;
1121	lq_sta->flush_timer = jiffies;
1122	lq_sta->action_counter = 0;
1123}
1124
1125/*
1126 * Find correct throughput table for given mode of modulation
1127 */
1128static void rs_set_expected_tpt_table(struct iwl_lq_sta *lq_sta,
1129				      struct iwl_scale_tbl_info *tbl)
1130{
1131	/* Used to choose among HT tables */
1132	s32 (*ht_tbl_pointer)[IWL_RATE_COUNT];
1133
1134	/* Check for invalid LQ type */
1135	if (WARN_ON_ONCE(!is_legacy(tbl->lq_type) && !is_Ht(tbl->lq_type))) {
1136		tbl->expected_tpt = expected_tpt_legacy;
1137		return;
1138	}
1139
1140	/* Legacy rates have only one table */
1141	if (is_legacy(tbl->lq_type)) {
1142		tbl->expected_tpt = expected_tpt_legacy;
1143		return;
1144	}
1145
1146	/* Choose among many HT tables depending on number of streams
1147	 * (SISO/MIMO2/MIMO3), channel width (20/40), SGI, and aggregation
1148	 * status */
1149	if (is_siso(tbl->lq_type) && (!tbl->is_ht40 || lq_sta->is_dup))
1150		ht_tbl_pointer = expected_tpt_siso20MHz;
1151	else if (is_siso(tbl->lq_type))
1152		ht_tbl_pointer = expected_tpt_siso40MHz;
1153	else if (is_mimo2(tbl->lq_type) && (!tbl->is_ht40 || lq_sta->is_dup))
1154		ht_tbl_pointer = expected_tpt_mimo2_20MHz;
1155	else if (is_mimo2(tbl->lq_type))
1156		ht_tbl_pointer = expected_tpt_mimo2_40MHz;
1157	else if (is_mimo3(tbl->lq_type) && (!tbl->is_ht40 || lq_sta->is_dup))
1158		ht_tbl_pointer = expected_tpt_mimo3_20MHz;
1159	else /* if (is_mimo3(tbl->lq_type)) <-- must be true */
1160		ht_tbl_pointer = expected_tpt_mimo3_40MHz;
1161
1162	if (!tbl->is_SGI && !lq_sta->is_agg)		/* Normal */
1163		tbl->expected_tpt = ht_tbl_pointer[0];
1164	else if (tbl->is_SGI && !lq_sta->is_agg)	/* SGI */
1165		tbl->expected_tpt = ht_tbl_pointer[1];
1166	else if (!tbl->is_SGI && lq_sta->is_agg)	/* AGG */
1167		tbl->expected_tpt = ht_tbl_pointer[2];
1168	else						/* AGG+SGI */
1169		tbl->expected_tpt = ht_tbl_pointer[3];
1170}
1171
1172/*
1173 * Find starting rate for new "search" high-throughput mode of modulation.
1174 * Goal is to find lowest expected rate (under perfect conditions) that is
1175 * above the current measured throughput of "active" mode, to give new mode
1176 * a fair chance to prove itself without too many challenges.
1177 *
1178 * This gets called when transitioning to more aggressive modulation
1179 * (i.e. legacy to SISO or MIMO, or SISO to MIMO), as well as less aggressive
1180 * (i.e. MIMO to SISO).  When moving to MIMO, bit rate will typically need
1181 * to decrease to match "active" throughput.  When moving from MIMO to SISO,
1182 * bit rate will typically need to increase, but not if performance was bad.
1183 */
1184static s32 rs_get_best_rate(struct iwl_priv *priv,
1185			    struct iwl_lq_sta *lq_sta,
1186			    struct iwl_scale_tbl_info *tbl,	/* "search" */
1187			    u16 rate_mask, s8 index)
1188{
1189	/* "active" values */
1190	struct iwl_scale_tbl_info *active_tbl =
1191	    &(lq_sta->lq_info[lq_sta->active_tbl]);
1192	s32 active_sr = active_tbl->win[index].success_ratio;
1193	s32 active_tpt = active_tbl->expected_tpt[index];
1194
1195	/* expected "search" throughput */
1196	s32 *tpt_tbl = tbl->expected_tpt;
1197
1198	s32 new_rate, high, low, start_hi;
1199	u16 high_low;
1200	s8 rate = index;
1201
1202	new_rate = high = low = start_hi = IWL_RATE_INVALID;
1203
1204	for (; ;) {
1205		high_low = rs_get_adjacent_rate(priv, rate, rate_mask,
1206						tbl->lq_type);
1207
1208		low = high_low & 0xff;
1209		high = (high_low >> 8) & 0xff;
1210
1211		/*
1212		 * Lower the "search" bit rate, to give new "search" mode
1213		 * approximately the same throughput as "active" if:
1214		 *
1215		 * 1) "Active" mode has been working modestly well (but not
1216		 *    great), and expected "search" throughput (under perfect
1217		 *    conditions) at candidate rate is above the actual
1218		 *    measured "active" throughput (but less than expected
1219		 *    "active" throughput under perfect conditions).
1220		 * OR
1221		 * 2) "Active" mode has been working perfectly or very well
1222		 *    and expected "search" throughput (under perfect
1223		 *    conditions) at candidate rate is above expected
1224		 *    "active" throughput (under perfect conditions).
1225		 */
1226		if ((((100 * tpt_tbl[rate]) > lq_sta->last_tpt) &&
1227		     ((active_sr > IWL_RATE_DECREASE_TH) &&
1228		      (active_sr <= IWL_RATE_HIGH_TH) &&
1229		      (tpt_tbl[rate] <= active_tpt))) ||
1230		    ((active_sr >= IWL_RATE_SCALE_SWITCH) &&
1231		     (tpt_tbl[rate] > active_tpt))) {
1232
1233			/* (2nd or later pass)
1234			 * If we've already tried to raise the rate, and are
1235			 * now trying to lower it, use the higher rate. */
1236			if (start_hi != IWL_RATE_INVALID) {
1237				new_rate = start_hi;
1238				break;
1239			}
1240
1241			new_rate = rate;
1242
1243			/* Loop again with lower rate */
1244			if (low != IWL_RATE_INVALID)
1245				rate = low;
1246
1247			/* Lower rate not available, use the original */
1248			else
1249				break;
1250
1251		/* Else try to raise the "search" rate to match "active" */
1252		} else {
1253			/* (2nd or later pass)
1254			 * If we've already tried to lower the rate, and are
1255			 * now trying to raise it, use the lower rate. */
1256			if (new_rate != IWL_RATE_INVALID)
1257				break;
1258
1259			/* Loop again with higher rate */
1260			else if (high != IWL_RATE_INVALID) {
1261				start_hi = high;
1262				rate = high;
1263
1264			/* Higher rate not available, use the original */
1265			} else {
1266				new_rate = rate;
1267				break;
1268			}
1269		}
1270	}
1271
1272	return new_rate;
1273}
1274
1275/*
1276 * Set up search table for MIMO2
1277 */
1278static int rs_switch_to_mimo2(struct iwl_priv *priv,
1279			     struct iwl_lq_sta *lq_sta,
1280			     struct ieee80211_conf *conf,
1281			     struct ieee80211_sta *sta,
1282			     struct iwl_scale_tbl_info *tbl, int index)
1283{
1284	u16 rate_mask;
1285	s32 rate;
1286	s8 is_green = lq_sta->is_green;
1287	struct iwl_station_priv *sta_priv = (void *)sta->drv_priv;
1288	struct iwl_rxon_context *ctx = sta_priv->ctx;
1289
1290	if (!conf_is_ht(conf) || !sta->ht_cap.ht_supported)
1291		return -1;
1292
1293	if (((sta->ht_cap.cap & IEEE80211_HT_CAP_SM_PS) >> 2)
1294						== WLAN_HT_CAP_SM_PS_STATIC)
1295		return -1;
1296
1297	/* Need both Tx chains/antennas to support MIMO */
1298	if (priv->hw_params.tx_chains_num < 2)
1299		return -1;
1300
1301	IWL_DEBUG_RATE(priv, "LQ: try to switch to MIMO2\n");
1302
1303	tbl->lq_type = LQ_MIMO2;
1304	tbl->is_dup = lq_sta->is_dup;
1305	tbl->action = 0;
1306	tbl->max_search = IWL_MAX_SEARCH;
1307	rate_mask = lq_sta->active_mimo2_rate;
1308
1309	if (iwl_is_ht40_tx_allowed(priv, ctx, &sta->ht_cap))
1310		tbl->is_ht40 = 1;
1311	else
1312		tbl->is_ht40 = 0;
1313
1314	rs_set_expected_tpt_table(lq_sta, tbl);
1315
1316	rate = rs_get_best_rate(priv, lq_sta, tbl, rate_mask, index);
1317
1318	IWL_DEBUG_RATE(priv, "LQ: MIMO2 best rate %d mask %X\n", rate, rate_mask);
1319	if ((rate == IWL_RATE_INVALID) || !((1 << rate) & rate_mask)) {
1320		IWL_DEBUG_RATE(priv, "Can't switch with index %d rate mask %x\n",
1321						rate, rate_mask);
1322		return -1;
1323	}
1324	tbl->current_rate = rate_n_flags_from_tbl(priv, tbl, rate, is_green);
1325
1326	IWL_DEBUG_RATE(priv, "LQ: Switch to new mcs %X index is green %X\n",
1327		     tbl->current_rate, is_green);
1328	return 0;
1329}
1330
1331/*
1332 * Set up search table for MIMO3
1333 */
1334static int rs_switch_to_mimo3(struct iwl_priv *priv,
1335			     struct iwl_lq_sta *lq_sta,
1336			     struct ieee80211_conf *conf,
1337			     struct ieee80211_sta *sta,
1338			     struct iwl_scale_tbl_info *tbl, int index)
1339{
1340	u16 rate_mask;
1341	s32 rate;
1342	s8 is_green = lq_sta->is_green;
1343	struct iwl_station_priv *sta_priv = (void *)sta->drv_priv;
1344	struct iwl_rxon_context *ctx = sta_priv->ctx;
1345
1346	if (!conf_is_ht(conf) || !sta->ht_cap.ht_supported)
1347		return -1;
1348
1349	if (((sta->ht_cap.cap & IEEE80211_HT_CAP_SM_PS) >> 2)
1350						== WLAN_HT_CAP_SM_PS_STATIC)
1351		return -1;
1352
1353	/* Need both Tx chains/antennas to support MIMO */
1354	if (priv->hw_params.tx_chains_num < 3)
1355		return -1;
1356
1357	IWL_DEBUG_RATE(priv, "LQ: try to switch to MIMO3\n");
1358
1359	tbl->lq_type = LQ_MIMO3;
1360	tbl->is_dup = lq_sta->is_dup;
1361	tbl->action = 0;
1362	tbl->max_search = IWL_MAX_11N_MIMO3_SEARCH;
1363	rate_mask = lq_sta->active_mimo3_rate;
1364
1365	if (iwl_is_ht40_tx_allowed(priv, ctx, &sta->ht_cap))
1366		tbl->is_ht40 = 1;
1367	else
1368		tbl->is_ht40 = 0;
1369
1370	rs_set_expected_tpt_table(lq_sta, tbl);
1371
1372	rate = rs_get_best_rate(priv, lq_sta, tbl, rate_mask, index);
1373
1374	IWL_DEBUG_RATE(priv, "LQ: MIMO3 best rate %d mask %X\n",
1375		rate, rate_mask);
1376	if ((rate == IWL_RATE_INVALID) || !((1 << rate) & rate_mask)) {
1377		IWL_DEBUG_RATE(priv, "Can't switch with index %d rate mask %x\n",
1378						rate, rate_mask);
1379		return -1;
1380	}
1381	tbl->current_rate = rate_n_flags_from_tbl(priv, tbl, rate, is_green);
1382
1383	IWL_DEBUG_RATE(priv, "LQ: Switch to new mcs %X index is green %X\n",
1384		     tbl->current_rate, is_green);
1385	return 0;
1386}
1387
1388/*
1389 * Set up search table for SISO
1390 */
1391static int rs_switch_to_siso(struct iwl_priv *priv,
1392			     struct iwl_lq_sta *lq_sta,
1393			     struct ieee80211_conf *conf,
1394			     struct ieee80211_sta *sta,
1395			     struct iwl_scale_tbl_info *tbl, int index)
1396{
1397	u16 rate_mask;
1398	u8 is_green = lq_sta->is_green;
1399	s32 rate;
1400	struct iwl_station_priv *sta_priv = (void *)sta->drv_priv;
1401	struct iwl_rxon_context *ctx = sta_priv->ctx;
1402
1403	if (!conf_is_ht(conf) || !sta->ht_cap.ht_supported)
1404		return -1;
1405
1406	IWL_DEBUG_RATE(priv, "LQ: try to switch to SISO\n");
1407
1408	tbl->is_dup = lq_sta->is_dup;
1409	tbl->lq_type = LQ_SISO;
1410	tbl->action = 0;
1411	tbl->max_search = IWL_MAX_SEARCH;
1412	rate_mask = lq_sta->active_siso_rate;
1413
1414	if (iwl_is_ht40_tx_allowed(priv, ctx, &sta->ht_cap))
1415		tbl->is_ht40 = 1;
1416	else
1417		tbl->is_ht40 = 0;
1418
1419	if (is_green)
1420		tbl->is_SGI = 0; /*11n spec: no SGI in SISO+Greenfield*/
1421
1422	rs_set_expected_tpt_table(lq_sta, tbl);
1423	rate = rs_get_best_rate(priv, lq_sta, tbl, rate_mask, index);
1424
1425	IWL_DEBUG_RATE(priv, "LQ: get best rate %d mask %X\n", rate, rate_mask);
1426	if ((rate == IWL_RATE_INVALID) || !((1 << rate) & rate_mask)) {
1427		IWL_DEBUG_RATE(priv, "can not switch with index %d rate mask %x\n",
1428			     rate, rate_mask);
1429		return -1;
1430	}
1431	tbl->current_rate = rate_n_flags_from_tbl(priv, tbl, rate, is_green);
1432	IWL_DEBUG_RATE(priv, "LQ: Switch to new mcs %X index is green %X\n",
1433		     tbl->current_rate, is_green);
1434	return 0;
1435}
1436
1437/*
1438 * Try to switch to new modulation mode from legacy
1439 */
1440static int rs_move_legacy_other(struct iwl_priv *priv,
1441				struct iwl_lq_sta *lq_sta,
1442				struct ieee80211_conf *conf,
1443				struct ieee80211_sta *sta,
1444				int index)
1445{
1446	struct iwl_scale_tbl_info *tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
1447	struct iwl_scale_tbl_info *search_tbl =
1448				&(lq_sta->lq_info[(1 - lq_sta->active_tbl)]);
1449	struct iwl_rate_scale_data *window = &(tbl->win[index]);
1450	u32 sz = (sizeof(struct iwl_scale_tbl_info) -
1451		  (sizeof(struct iwl_rate_scale_data) * IWL_RATE_COUNT));
1452	u8 start_action;
1453	u8 valid_tx_ant = priv->hw_params.valid_tx_ant;
1454	u8 tx_chains_num = priv->hw_params.tx_chains_num;
1455	int ret = 0;
1456	u8 update_search_tbl_counter = 0;
1457
1458	switch (priv->bt_traffic_load) {
1459	case IWL_BT_COEX_TRAFFIC_LOAD_NONE:
1460		/* nothing */
1461		break;
1462	case IWL_BT_COEX_TRAFFIC_LOAD_LOW:
1463		/* avoid antenna B unless MIMO */
1464		if (tbl->action == IWL_LEGACY_SWITCH_ANTENNA2)
1465			tbl->action = IWL_LEGACY_SWITCH_SISO;
1466		break;
1467	case IWL_BT_COEX_TRAFFIC_LOAD_HIGH:
1468	case IWL_BT_COEX_TRAFFIC_LOAD_CONTINUOUS:
1469		/* avoid antenna B and MIMO */
1470		valid_tx_ant =
1471			first_antenna(priv->hw_params.valid_tx_ant);
1472		if (tbl->action >= IWL_LEGACY_SWITCH_ANTENNA2 &&
1473		    tbl->action != IWL_LEGACY_SWITCH_SISO)
1474			tbl->action = IWL_LEGACY_SWITCH_SISO;
1475		break;
1476	default:
1477		IWL_ERR(priv, "Invalid BT load %d", priv->bt_traffic_load);
1478		break;
1479	}
1480
1481	if (!iwl_ht_enabled(priv))
1482		/* stay in Legacy */
1483		tbl->action = IWL_LEGACY_SWITCH_ANTENNA1;
1484	else if (iwl_tx_ant_restriction(priv) == IWL_ANT_OK_SINGLE &&
1485		   tbl->action > IWL_LEGACY_SWITCH_SISO)
1486		tbl->action = IWL_LEGACY_SWITCH_SISO;
1487
1488	/* configure as 1x1 if bt full concurrency */
1489	if (priv->bt_full_concurrent) {
1490		if (!iwl_ht_enabled(priv))
1491			tbl->action = IWL_LEGACY_SWITCH_ANTENNA1;
1492		else if (tbl->action >= IWL_LEGACY_SWITCH_ANTENNA2)
1493			tbl->action = IWL_LEGACY_SWITCH_SISO;
1494		valid_tx_ant =
1495			first_antenna(priv->hw_params.valid_tx_ant);
1496	}
1497
1498	start_action = tbl->action;
1499	for (; ;) {
1500		lq_sta->action_counter++;
1501		switch (tbl->action) {
1502		case IWL_LEGACY_SWITCH_ANTENNA1:
1503		case IWL_LEGACY_SWITCH_ANTENNA2:
1504			IWL_DEBUG_RATE(priv, "LQ: Legacy toggle Antenna\n");
1505
1506			if ((tbl->action == IWL_LEGACY_SWITCH_ANTENNA1 &&
1507							tx_chains_num <= 1) ||
1508			    (tbl->action == IWL_LEGACY_SWITCH_ANTENNA2 &&
1509							tx_chains_num <= 2))
1510				break;
1511
1512			/* Don't change antenna if success has been great */
1513			if (window->success_ratio >= IWL_RS_GOOD_RATIO &&
1514			    !priv->bt_full_concurrent &&
1515			    priv->bt_traffic_load ==
1516					IWL_BT_COEX_TRAFFIC_LOAD_NONE)
1517				break;
1518
1519			/* Set up search table to try other antenna */
1520			memcpy(search_tbl, tbl, sz);
1521
1522			if (rs_toggle_antenna(valid_tx_ant,
1523				&search_tbl->current_rate, search_tbl)) {
1524				update_search_tbl_counter = 1;
1525				rs_set_expected_tpt_table(lq_sta, search_tbl);
1526				goto out;
1527			}
1528			break;
1529		case IWL_LEGACY_SWITCH_SISO:
1530			IWL_DEBUG_RATE(priv, "LQ: Legacy switch to SISO\n");
1531
1532			/* Set up search table to try SISO */
1533			memcpy(search_tbl, tbl, sz);
1534			search_tbl->is_SGI = 0;
1535			ret = rs_switch_to_siso(priv, lq_sta, conf, sta,
1536						 search_tbl, index);
1537			if (!ret) {
1538				lq_sta->action_counter = 0;
1539				goto out;
1540			}
1541
1542			break;
1543		case IWL_LEGACY_SWITCH_MIMO2_AB:
1544		case IWL_LEGACY_SWITCH_MIMO2_AC:
1545		case IWL_LEGACY_SWITCH_MIMO2_BC:
1546			IWL_DEBUG_RATE(priv, "LQ: Legacy switch to MIMO2\n");
1547
1548			/* Set up search table to try MIMO */
1549			memcpy(search_tbl, tbl, sz);
1550			search_tbl->is_SGI = 0;
1551
1552			if (tbl->action == IWL_LEGACY_SWITCH_MIMO2_AB)
1553				search_tbl->ant_type = ANT_AB;
1554			else if (tbl->action == IWL_LEGACY_SWITCH_MIMO2_AC)
1555				search_tbl->ant_type = ANT_AC;
1556			else
1557				search_tbl->ant_type = ANT_BC;
1558
1559			if (!rs_is_valid_ant(valid_tx_ant, search_tbl->ant_type))
1560				break;
1561
1562			ret = rs_switch_to_mimo2(priv, lq_sta, conf, sta,
1563						 search_tbl, index);
1564			if (!ret) {
1565				lq_sta->action_counter = 0;
1566				goto out;
1567			}
1568			break;
1569
1570		case IWL_LEGACY_SWITCH_MIMO3_ABC:
1571			IWL_DEBUG_RATE(priv, "LQ: Legacy switch to MIMO3\n");
1572
1573			/* Set up search table to try MIMO3 */
1574			memcpy(search_tbl, tbl, sz);
1575			search_tbl->is_SGI = 0;
1576
1577			search_tbl->ant_type = ANT_ABC;
1578
1579			if (!rs_is_valid_ant(valid_tx_ant, search_tbl->ant_type))
1580				break;
1581
1582			ret = rs_switch_to_mimo3(priv, lq_sta, conf, sta,
1583						 search_tbl, index);
1584			if (!ret) {
1585				lq_sta->action_counter = 0;
1586				goto out;
1587			}
1588			break;
1589		}
1590		tbl->action++;
1591		if (tbl->action > IWL_LEGACY_SWITCH_MIMO3_ABC)
1592			tbl->action = IWL_LEGACY_SWITCH_ANTENNA1;
1593
1594		if (tbl->action == start_action)
1595			break;
1596
1597	}
1598	search_tbl->lq_type = LQ_NONE;
1599	return 0;
1600
1601out:
1602	lq_sta->search_better_tbl = 1;
1603	tbl->action++;
1604	if (tbl->action > IWL_LEGACY_SWITCH_MIMO3_ABC)
1605		tbl->action = IWL_LEGACY_SWITCH_ANTENNA1;
1606	if (update_search_tbl_counter)
1607		search_tbl->action = tbl->action;
1608	return 0;
1609
1610}
1611
1612/*
1613 * Try to switch to new modulation mode from SISO
1614 */
1615static int rs_move_siso_to_other(struct iwl_priv *priv,
1616				 struct iwl_lq_sta *lq_sta,
1617				 struct ieee80211_conf *conf,
1618				 struct ieee80211_sta *sta, int index)
1619{
1620	u8 is_green = lq_sta->is_green;
1621	struct iwl_scale_tbl_info *tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
1622	struct iwl_scale_tbl_info *search_tbl =
1623				&(lq_sta->lq_info[(1 - lq_sta->active_tbl)]);
1624	struct iwl_rate_scale_data *window = &(tbl->win[index]);
1625	struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
1626	u32 sz = (sizeof(struct iwl_scale_tbl_info) -
1627		  (sizeof(struct iwl_rate_scale_data) * IWL_RATE_COUNT));
1628	u8 start_action;
1629	u8 valid_tx_ant = priv->hw_params.valid_tx_ant;
1630	u8 tx_chains_num = priv->hw_params.tx_chains_num;
1631	u8 update_search_tbl_counter = 0;
1632	int ret;
1633
1634	switch (priv->bt_traffic_load) {
1635	case IWL_BT_COEX_TRAFFIC_LOAD_NONE:
1636		/* nothing */
1637		break;
1638	case IWL_BT_COEX_TRAFFIC_LOAD_LOW:
1639		/* avoid antenna B unless MIMO */
1640		if (tbl->action == IWL_SISO_SWITCH_ANTENNA2)
1641			tbl->action = IWL_SISO_SWITCH_MIMO2_AB;
1642		break;
1643	case IWL_BT_COEX_TRAFFIC_LOAD_HIGH:
1644	case IWL_BT_COEX_TRAFFIC_LOAD_CONTINUOUS:
1645		/* avoid antenna B and MIMO */
1646		valid_tx_ant =
1647			first_antenna(priv->hw_params.valid_tx_ant);
1648		if (tbl->action != IWL_SISO_SWITCH_ANTENNA1)
1649			tbl->action = IWL_SISO_SWITCH_ANTENNA1;
1650		break;
1651	default:
1652		IWL_ERR(priv, "Invalid BT load %d", priv->bt_traffic_load);
1653		break;
1654	}
1655
1656	if (iwl_tx_ant_restriction(priv) == IWL_ANT_OK_SINGLE &&
1657	    tbl->action > IWL_SISO_SWITCH_ANTENNA2) {
1658		/* stay in SISO */
1659		tbl->action = IWL_SISO_SWITCH_ANTENNA1;
1660	}
1661
1662	/* configure as 1x1 if bt full concurrency */
1663	if (priv->bt_full_concurrent) {
1664		valid_tx_ant =
1665			first_antenna(priv->hw_params.valid_tx_ant);
1666		if (tbl->action >= IWL_LEGACY_SWITCH_ANTENNA2)
1667			tbl->action = IWL_SISO_SWITCH_ANTENNA1;
1668	}
1669
1670	start_action = tbl->action;
1671	for (;;) {
1672		lq_sta->action_counter++;
1673		switch (tbl->action) {
1674		case IWL_SISO_SWITCH_ANTENNA1:
1675		case IWL_SISO_SWITCH_ANTENNA2:
1676			IWL_DEBUG_RATE(priv, "LQ: SISO toggle Antenna\n");
1677			if ((tbl->action == IWL_SISO_SWITCH_ANTENNA1 &&
1678						tx_chains_num <= 1) ||
1679			    (tbl->action == IWL_SISO_SWITCH_ANTENNA2 &&
1680						tx_chains_num <= 2))
1681				break;
1682
1683			if (window->success_ratio >= IWL_RS_GOOD_RATIO &&
1684			    !priv->bt_full_concurrent &&
1685			    priv->bt_traffic_load ==
1686					IWL_BT_COEX_TRAFFIC_LOAD_NONE)
1687				break;
1688
1689			memcpy(search_tbl, tbl, sz);
1690			if (rs_toggle_antenna(valid_tx_ant,
1691				       &search_tbl->current_rate, search_tbl)) {
1692				update_search_tbl_counter = 1;
1693				goto out;
1694			}
1695			break;
1696		case IWL_SISO_SWITCH_MIMO2_AB:
1697		case IWL_SISO_SWITCH_MIMO2_AC:
1698		case IWL_SISO_SWITCH_MIMO2_BC:
1699			IWL_DEBUG_RATE(priv, "LQ: SISO switch to MIMO2\n");
1700			memcpy(search_tbl, tbl, sz);
1701			search_tbl->is_SGI = 0;
1702
1703			if (tbl->action == IWL_SISO_SWITCH_MIMO2_AB)
1704				search_tbl->ant_type = ANT_AB;
1705			else if (tbl->action == IWL_SISO_SWITCH_MIMO2_AC)
1706				search_tbl->ant_type = ANT_AC;
1707			else
1708				search_tbl->ant_type = ANT_BC;
1709
1710			if (!rs_is_valid_ant(valid_tx_ant, search_tbl->ant_type))
1711				break;
1712
1713			ret = rs_switch_to_mimo2(priv, lq_sta, conf, sta,
1714						 search_tbl, index);
1715			if (!ret)
1716				goto out;
1717			break;
1718		case IWL_SISO_SWITCH_GI:
1719			if (!tbl->is_ht40 && !(ht_cap->cap &
1720						IEEE80211_HT_CAP_SGI_20))
1721				break;
1722			if (tbl->is_ht40 && !(ht_cap->cap &
1723						IEEE80211_HT_CAP_SGI_40))
1724				break;
1725
1726			IWL_DEBUG_RATE(priv, "LQ: SISO toggle SGI/NGI\n");
1727
1728			memcpy(search_tbl, tbl, sz);
1729			if (is_green) {
1730				if (!tbl->is_SGI)
1731					break;
1732				else
1733					IWL_ERR(priv,
1734						"SGI was set in GF+SISO\n");
1735			}
1736			search_tbl->is_SGI = !tbl->is_SGI;
1737			rs_set_expected_tpt_table(lq_sta, search_tbl);
1738			if (tbl->is_SGI) {
1739				s32 tpt = lq_sta->last_tpt / 100;
1740				if (tpt >= search_tbl->expected_tpt[index])
1741					break;
1742			}
1743			search_tbl->current_rate =
1744				rate_n_flags_from_tbl(priv, search_tbl,
1745						      index, is_green);
1746			update_search_tbl_counter = 1;
1747			goto out;
1748		case IWL_SISO_SWITCH_MIMO3_ABC:
1749			IWL_DEBUG_RATE(priv, "LQ: SISO switch to MIMO3\n");
1750			memcpy(search_tbl, tbl, sz);
1751			search_tbl->is_SGI = 0;
1752			search_tbl->ant_type = ANT_ABC;
1753
1754			if (!rs_is_valid_ant(valid_tx_ant, search_tbl->ant_type))
1755				break;
1756
1757			ret = rs_switch_to_mimo3(priv, lq_sta, conf, sta,
1758						 search_tbl, index);
1759			if (!ret)
1760				goto out;
1761			break;
1762		}
1763		tbl->action++;
1764		if (tbl->action > IWL_LEGACY_SWITCH_MIMO3_ABC)
1765			tbl->action = IWL_SISO_SWITCH_ANTENNA1;
1766
1767		if (tbl->action == start_action)
1768			break;
1769	}
1770	search_tbl->lq_type = LQ_NONE;
1771	return 0;
1772
1773 out:
1774	lq_sta->search_better_tbl = 1;
1775	tbl->action++;
1776	if (tbl->action > IWL_SISO_SWITCH_MIMO3_ABC)
1777		tbl->action = IWL_SISO_SWITCH_ANTENNA1;
1778	if (update_search_tbl_counter)
1779		search_tbl->action = tbl->action;
1780
1781	return 0;
1782}
1783
1784/*
1785 * Try to switch to new modulation mode from MIMO2
1786 */
1787static int rs_move_mimo2_to_other(struct iwl_priv *priv,
1788				 struct iwl_lq_sta *lq_sta,
1789				 struct ieee80211_conf *conf,
1790				 struct ieee80211_sta *sta, int index)
1791{
1792	s8 is_green = lq_sta->is_green;
1793	struct iwl_scale_tbl_info *tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
1794	struct iwl_scale_tbl_info *search_tbl =
1795				&(lq_sta->lq_info[(1 - lq_sta->active_tbl)]);
1796	struct iwl_rate_scale_data *window = &(tbl->win[index]);
1797	struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
1798	u32 sz = (sizeof(struct iwl_scale_tbl_info) -
1799		  (sizeof(struct iwl_rate_scale_data) * IWL_RATE_COUNT));
1800	u8 start_action;
1801	u8 valid_tx_ant = priv->hw_params.valid_tx_ant;
1802	u8 tx_chains_num = priv->hw_params.tx_chains_num;
1803	u8 update_search_tbl_counter = 0;
1804	int ret;
1805
1806	switch (priv->bt_traffic_load) {
1807	case IWL_BT_COEX_TRAFFIC_LOAD_NONE:
1808		/* nothing */
1809		break;
1810	case IWL_BT_COEX_TRAFFIC_LOAD_HIGH:
1811	case IWL_BT_COEX_TRAFFIC_LOAD_CONTINUOUS:
1812		/* avoid antenna B and MIMO */
1813		if (tbl->action != IWL_MIMO2_SWITCH_SISO_A)
1814			tbl->action = IWL_MIMO2_SWITCH_SISO_A;
1815		break;
1816	case IWL_BT_COEX_TRAFFIC_LOAD_LOW:
1817		/* avoid antenna B unless MIMO */
1818		if (tbl->action == IWL_MIMO2_SWITCH_SISO_B ||
1819		    tbl->action == IWL_MIMO2_SWITCH_SISO_C)
1820			tbl->action = IWL_MIMO2_SWITCH_SISO_A;
1821		break;
1822	default:
1823		IWL_ERR(priv, "Invalid BT load %d", priv->bt_traffic_load);
1824		break;
1825	}
1826
1827	if ((iwl_tx_ant_restriction(priv) == IWL_ANT_OK_SINGLE) &&
1828	    (tbl->action < IWL_MIMO2_SWITCH_SISO_A ||
1829	     tbl->action > IWL_MIMO2_SWITCH_SISO_C)) {
1830		/* switch in SISO */
1831		tbl->action = IWL_MIMO2_SWITCH_SISO_A;
1832	}
1833
1834	/* configure as 1x1 if bt full concurrency */
1835	if (priv->bt_full_concurrent &&
1836	    (tbl->action < IWL_MIMO2_SWITCH_SISO_A ||
1837	     tbl->action > IWL_MIMO2_SWITCH_SISO_C))
1838		tbl->action = IWL_MIMO2_SWITCH_SISO_A;
1839
1840	start_action = tbl->action;
1841	for (;;) {
1842		lq_sta->action_counter++;
1843		switch (tbl->action) {
1844		case IWL_MIMO2_SWITCH_ANTENNA1:
1845		case IWL_MIMO2_SWITCH_ANTENNA2:
1846			IWL_DEBUG_RATE(priv, "LQ: MIMO2 toggle Antennas\n");
1847
1848			if (tx_chains_num <= 2)
1849				break;
1850
1851			if (window->success_ratio >= IWL_RS_GOOD_RATIO)
1852				break;
1853
1854			memcpy(search_tbl, tbl, sz);
1855			if (rs_toggle_antenna(valid_tx_ant,
1856				       &search_tbl->current_rate, search_tbl)) {
1857				update_search_tbl_counter = 1;
1858				goto out;
1859			}
1860			break;
1861		case IWL_MIMO2_SWITCH_SISO_A:
1862		case IWL_MIMO2_SWITCH_SISO_B:
1863		case IWL_MIMO2_SWITCH_SISO_C:
1864			IWL_DEBUG_RATE(priv, "LQ: MIMO2 switch to SISO\n");
1865
1866			/* Set up new search table for SISO */
1867			memcpy(search_tbl, tbl, sz);
1868
1869			if (tbl->action == IWL_MIMO2_SWITCH_SISO_A)
1870				search_tbl->ant_type = ANT_A;
1871			else if (tbl->action == IWL_MIMO2_SWITCH_SISO_B)
1872				search_tbl->ant_type = ANT_B;
1873			else
1874				search_tbl->ant_type = ANT_C;
1875
1876			if (!rs_is_valid_ant(valid_tx_ant, search_tbl->ant_type))
1877				break;
1878
1879			ret = rs_switch_to_siso(priv, lq_sta, conf, sta,
1880						 search_tbl, index);
1881			if (!ret)
1882				goto out;
1883
1884			break;
1885
1886		case IWL_MIMO2_SWITCH_GI:
1887			if (!tbl->is_ht40 && !(ht_cap->cap &
1888						IEEE80211_HT_CAP_SGI_20))
1889				break;
1890			if (tbl->is_ht40 && !(ht_cap->cap &
1891						IEEE80211_HT_CAP_SGI_40))
1892				break;
1893
1894			IWL_DEBUG_RATE(priv, "LQ: MIMO2 toggle SGI/NGI\n");
1895
1896			/* Set up new search table for MIMO2 */
1897			memcpy(search_tbl, tbl, sz);
1898			search_tbl->is_SGI = !tbl->is_SGI;
1899			rs_set_expected_tpt_table(lq_sta, search_tbl);
1900			/*
1901			 * If active table already uses the fastest possible
1902			 * modulation (dual stream with short guard interval),
1903			 * and it's working well, there's no need to look
1904			 * for a better type of modulation!
1905			 */
1906			if (tbl->is_SGI) {
1907				s32 tpt = lq_sta->last_tpt / 100;
1908				if (tpt >= search_tbl->expected_tpt[index])
1909					break;
1910			}
1911			search_tbl->current_rate =
1912				rate_n_flags_from_tbl(priv, search_tbl,
1913						      index, is_green);
1914			update_search_tbl_counter = 1;
1915			goto out;
1916
1917		case IWL_MIMO2_SWITCH_MIMO3_ABC:
1918			IWL_DEBUG_RATE(priv, "LQ: MIMO2 switch to MIMO3\n");
1919			memcpy(search_tbl, tbl, sz);
1920			search_tbl->is_SGI = 0;
1921			search_tbl->ant_type = ANT_ABC;
1922
1923			if (!rs_is_valid_ant(valid_tx_ant, search_tbl->ant_type))
1924				break;
1925
1926			ret = rs_switch_to_mimo3(priv, lq_sta, conf, sta,
1927						 search_tbl, index);
1928			if (!ret)
1929				goto out;
1930
1931			break;
1932		}
1933		tbl->action++;
1934		if (tbl->action > IWL_MIMO2_SWITCH_MIMO3_ABC)
1935			tbl->action = IWL_MIMO2_SWITCH_ANTENNA1;
1936
1937		if (tbl->action == start_action)
1938			break;
1939	}
1940	search_tbl->lq_type = LQ_NONE;
1941	return 0;
1942 out:
1943	lq_sta->search_better_tbl = 1;
1944	tbl->action++;
1945	if (tbl->action > IWL_MIMO2_SWITCH_MIMO3_ABC)
1946		tbl->action = IWL_MIMO2_SWITCH_ANTENNA1;
1947	if (update_search_tbl_counter)
1948		search_tbl->action = tbl->action;
1949
1950	return 0;
1951
1952}
1953
1954/*
1955 * Try to switch to new modulation mode from MIMO3
1956 */
1957static int rs_move_mimo3_to_other(struct iwl_priv *priv,
1958				 struct iwl_lq_sta *lq_sta,
1959				 struct ieee80211_conf *conf,
1960				 struct ieee80211_sta *sta, int index)
1961{
1962	s8 is_green = lq_sta->is_green;
1963	struct iwl_scale_tbl_info *tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
1964	struct iwl_scale_tbl_info *search_tbl =
1965				&(lq_sta->lq_info[(1 - lq_sta->active_tbl)]);
1966	struct iwl_rate_scale_data *window = &(tbl->win[index]);
1967	struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
1968	u32 sz = (sizeof(struct iwl_scale_tbl_info) -
1969		  (sizeof(struct iwl_rate_scale_data) * IWL_RATE_COUNT));
1970	u8 start_action;
1971	u8 valid_tx_ant = priv->hw_params.valid_tx_ant;
1972	u8 tx_chains_num = priv->hw_params.tx_chains_num;
1973	int ret;
1974	u8 update_search_tbl_counter = 0;
1975
1976	switch (priv->bt_traffic_load) {
1977	case IWL_BT_COEX_TRAFFIC_LOAD_NONE:
1978		/* nothing */
1979		break;
1980	case IWL_BT_COEX_TRAFFIC_LOAD_HIGH:
1981	case IWL_BT_COEX_TRAFFIC_LOAD_CONTINUOUS:
1982		/* avoid antenna B and MIMO */
1983		if (tbl->action != IWL_MIMO3_SWITCH_SISO_A)
1984			tbl->action = IWL_MIMO3_SWITCH_SISO_A;
1985		break;
1986	case IWL_BT_COEX_TRAFFIC_LOAD_LOW:
1987		/* avoid antenna B unless MIMO */
1988		if (tbl->action == IWL_MIMO3_SWITCH_SISO_B ||
1989		    tbl->action == IWL_MIMO3_SWITCH_SISO_C)
1990			tbl->action = IWL_MIMO3_SWITCH_SISO_A;
1991		break;
1992	default:
1993		IWL_ERR(priv, "Invalid BT load %d", priv->bt_traffic_load);
1994		break;
1995	}
1996
1997	if ((iwl_tx_ant_restriction(priv) == IWL_ANT_OK_SINGLE) &&
1998	    (tbl->action < IWL_MIMO3_SWITCH_SISO_A ||
1999	     tbl->action > IWL_MIMO3_SWITCH_SISO_C)) {
2000		/* switch in SISO */
2001		tbl->action = IWL_MIMO3_SWITCH_SISO_A;
2002	}
2003
2004	/* configure as 1x1 if bt full concurrency */
2005	if (priv->bt_full_concurrent &&
2006	    (tbl->action < IWL_MIMO3_SWITCH_SISO_A ||
2007	     tbl->action > IWL_MIMO3_SWITCH_SISO_C))
2008		tbl->action = IWL_MIMO3_SWITCH_SISO_A;
2009
2010	start_action = tbl->action;
2011	for (;;) {
2012		lq_sta->action_counter++;
2013		switch (tbl->action) {
2014		case IWL_MIMO3_SWITCH_ANTENNA1:
2015		case IWL_MIMO3_SWITCH_ANTENNA2:
2016			IWL_DEBUG_RATE(priv, "LQ: MIMO3 toggle Antennas\n");
2017
2018			if (tx_chains_num <= 3)
2019				break;
2020
2021			if (window->success_ratio >= IWL_RS_GOOD_RATIO)
2022				break;
2023
2024			memcpy(search_tbl, tbl, sz);
2025			if (rs_toggle_antenna(valid_tx_ant,
2026				       &search_tbl->current_rate, search_tbl))
2027				goto out;
2028			break;
2029		case IWL_MIMO3_SWITCH_SISO_A:
2030		case IWL_MIMO3_SWITCH_SISO_B:
2031		case IWL_MIMO3_SWITCH_SISO_C:
2032			IWL_DEBUG_RATE(priv, "LQ: MIMO3 switch to SISO\n");
2033
2034			/* Set up new search table for SISO */
2035			memcpy(search_tbl, tbl, sz);
2036
2037			if (tbl->action == IWL_MIMO3_SWITCH_SISO_A)
2038				search_tbl->ant_type = ANT_A;
2039			else if (tbl->action == IWL_MIMO3_SWITCH_SISO_B)
2040				search_tbl->ant_type = ANT_B;
2041			else
2042				search_tbl->ant_type = ANT_C;
2043
2044			if (!rs_is_valid_ant(valid_tx_ant, search_tbl->ant_type))
2045				break;
2046
2047			ret = rs_switch_to_siso(priv, lq_sta, conf, sta,
2048						 search_tbl, index);
2049			if (!ret)
2050				goto out;
2051
2052			break;
2053
2054		case IWL_MIMO3_SWITCH_MIMO2_AB:
2055		case IWL_MIMO3_SWITCH_MIMO2_AC:
2056		case IWL_MIMO3_SWITCH_MIMO2_BC:
2057			IWL_DEBUG_RATE(priv, "LQ: MIMO3 switch to MIMO2\n");
2058
2059			memcpy(search_tbl, tbl, sz);
2060			search_tbl->is_SGI = 0;
2061			if (tbl->action == IWL_MIMO3_SWITCH_MIMO2_AB)
2062				search_tbl->ant_type = ANT_AB;
2063			else if (tbl->action == IWL_MIMO3_SWITCH_MIMO2_AC)
2064				search_tbl->ant_type = ANT_AC;
2065			else
2066				search_tbl->ant_type = ANT_BC;
2067
2068			if (!rs_is_valid_ant(valid_tx_ant, search_tbl->ant_type))
2069				break;
2070
2071			ret = rs_switch_to_mimo2(priv, lq_sta, conf, sta,
2072						 search_tbl, index);
2073			if (!ret)
2074				goto out;
2075
2076			break;
2077
2078		case IWL_MIMO3_SWITCH_GI:
2079			if (!tbl->is_ht40 && !(ht_cap->cap &
2080						IEEE80211_HT_CAP_SGI_20))
2081				break;
2082			if (tbl->is_ht40 && !(ht_cap->cap &
2083						IEEE80211_HT_CAP_SGI_40))
2084				break;
2085
2086			IWL_DEBUG_RATE(priv, "LQ: MIMO3 toggle SGI/NGI\n");
2087
2088			/* Set up new search table for MIMO */
2089			memcpy(search_tbl, tbl, sz);
2090			search_tbl->is_SGI = !tbl->is_SGI;
2091			rs_set_expected_tpt_table(lq_sta, search_tbl);
2092			/*
2093			 * If active table already uses the fastest possible
2094			 * modulation (dual stream with short guard interval),
2095			 * and it's working well, there's no need to look
2096			 * for a better type of modulation!
2097			 */
2098			if (tbl->is_SGI) {
2099				s32 tpt = lq_sta->last_tpt / 100;
2100				if (tpt >= search_tbl->expected_tpt[index])
2101					break;
2102			}
2103			search_tbl->current_rate =
2104				rate_n_flags_from_tbl(priv, search_tbl,
2105						      index, is_green);
2106			update_search_tbl_counter = 1;
2107			goto out;
2108		}
2109		tbl->action++;
2110		if (tbl->action > IWL_MIMO3_SWITCH_GI)
2111			tbl->action = IWL_MIMO3_SWITCH_ANTENNA1;
2112
2113		if (tbl->action == start_action)
2114			break;
2115	}
2116	search_tbl->lq_type = LQ_NONE;
2117	return 0;
2118 out:
2119	lq_sta->search_better_tbl = 1;
2120	tbl->action++;
2121	if (tbl->action > IWL_MIMO3_SWITCH_GI)
2122		tbl->action = IWL_MIMO3_SWITCH_ANTENNA1;
2123	if (update_search_tbl_counter)
2124		search_tbl->action = tbl->action;
2125
2126	return 0;
2127
2128}
2129
2130/*
2131 * Check whether we should continue using same modulation mode, or
2132 * begin search for a new mode, based on:
2133 * 1) # tx successes or failures while using this mode
2134 * 2) # times calling this function
2135 * 3) elapsed time in this mode (not used, for now)
2136 */
2137static void rs_stay_in_table(struct iwl_lq_sta *lq_sta, bool force_search)
2138{
2139	struct iwl_scale_tbl_info *tbl;
2140	int i;
2141	int active_tbl;
2142	int flush_interval_passed = 0;
2143	struct iwl_priv *priv;
2144
2145	priv = lq_sta->drv;
2146	active_tbl = lq_sta->active_tbl;
2147
2148	tbl = &(lq_sta->lq_info[active_tbl]);
2149
2150	/* If we've been disallowing search, see if we should now allow it */
2151	if (lq_sta->stay_in_tbl) {
2152
2153		/* Elapsed time using current modulation mode */
2154		if (lq_sta->flush_timer)
2155			flush_interval_passed =
2156			time_after(jiffies,
2157					(unsigned long)(lq_sta->flush_timer +
2158					IWL_RATE_SCALE_FLUSH_INTVL));
2159
2160		/*
2161		 * Check if we should allow search for new modulation mode.
2162		 * If many frames have failed or succeeded, or we've used
2163		 * this same modulation for a long time, allow search, and
2164		 * reset history stats that keep track of whether we should
2165		 * allow a new search.  Also (below) reset all bitmaps and
2166		 * stats in active history.
2167		 */
2168		if (force_search ||
2169		    (lq_sta->total_failed > lq_sta->max_failure_limit) ||
2170		    (lq_sta->total_success > lq_sta->max_success_limit) ||
2171		    ((!lq_sta->search_better_tbl) && (lq_sta->flush_timer)
2172		     && (flush_interval_passed))) {
2173			IWL_DEBUG_RATE(priv, "LQ: stay is expired %d %d %d\n",
2174				     lq_sta->total_failed,
2175				     lq_sta->total_success,
2176				     flush_interval_passed);
2177
2178			/* Allow search for new mode */
2179			lq_sta->stay_in_tbl = 0;	/* only place reset */
2180			lq_sta->total_failed = 0;
2181			lq_sta->total_success = 0;
2182			lq_sta->flush_timer = 0;
2183
2184		/*
2185		 * Else if we've used this modulation mode enough repetitions
2186		 * (regardless of elapsed time or success/failure), reset
2187		 * history bitmaps and rate-specific stats for all rates in
2188		 * active table.
2189		 */
2190		} else {
2191			lq_sta->table_count++;
2192			if (lq_sta->table_count >=
2193			    lq_sta->table_count_limit) {
2194				lq_sta->table_count = 0;
2195
2196				IWL_DEBUG_RATE(priv, "LQ: stay in table clear win\n");
2197				for (i = 0; i < IWL_RATE_COUNT; i++)
2198					rs_rate_scale_clear_window(
2199						&(tbl->win[i]));
2200			}
2201		}
2202
2203		/* If transitioning to allow "search", reset all history
2204		 * bitmaps and stats in active table (this will become the new
2205		 * "search" table). */
2206		if (!lq_sta->stay_in_tbl) {
2207			for (i = 0; i < IWL_RATE_COUNT; i++)
2208				rs_rate_scale_clear_window(&(tbl->win[i]));
2209		}
2210	}
2211}
2212
2213/*
2214 * setup rate table in uCode
2215 */
2216static void rs_update_rate_tbl(struct iwl_priv *priv,
2217			       struct iwl_rxon_context *ctx,
2218			       struct iwl_lq_sta *lq_sta,
2219			       struct iwl_scale_tbl_info *tbl,
2220			       int index, u8 is_green)
2221{
2222	u32 rate;
2223
2224	/* Update uCode's rate table. */
2225	rate = rate_n_flags_from_tbl(priv, tbl, index, is_green);
2226	rs_fill_link_cmd(priv, lq_sta, rate);
2227	iwl_send_lq_cmd(priv, ctx, &lq_sta->lq, CMD_ASYNC, false);
2228}
2229
2230/*
2231 * Do rate scaling and search for new modulation mode.
2232 */
2233static void rs_rate_scale_perform(struct iwl_priv *priv,
2234				  struct sk_buff *skb,
2235				  struct ieee80211_sta *sta,
2236				  struct iwl_lq_sta *lq_sta)
2237{
2238	struct ieee80211_hw *hw = priv->hw;
2239	struct ieee80211_conf *conf = &hw->conf;
2240	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
2241	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
2242	int low = IWL_RATE_INVALID;
2243	int high = IWL_RATE_INVALID;
2244	int index;
2245	int i;
2246	struct iwl_rate_scale_data *window = NULL;
2247	int current_tpt = IWL_INVALID_VALUE;
2248	int low_tpt = IWL_INVALID_VALUE;
2249	int high_tpt = IWL_INVALID_VALUE;
2250	u32 fail_count;
2251	s8 scale_action = 0;
2252	u16 rate_mask;
2253	u8 update_lq = 0;
2254	struct iwl_scale_tbl_info *tbl, *tbl1;
2255	u16 rate_scale_index_msk = 0;
2256	u8 is_green = 0;
2257	u8 active_tbl = 0;
2258	u8 done_search = 0;
2259	u16 high_low;
2260	s32 sr;
2261	u8 tid = IWL_MAX_TID_COUNT;
2262	struct iwl_tid_data *tid_data;
2263	struct iwl_station_priv *sta_priv = (void *)sta->drv_priv;
2264	struct iwl_rxon_context *ctx = sta_priv->ctx;
2265
2266	IWL_DEBUG_RATE(priv, "rate scale calculate new rate for skb\n");
2267
2268	/* Send management frames and NO_ACK data using lowest rate. */
2269	/* TODO: this could probably be improved.. */
2270	if (!ieee80211_is_data(hdr->frame_control) ||
2271	    info->flags & IEEE80211_TX_CTL_NO_ACK)
2272		return;
2273
2274	lq_sta->supp_rates = sta->supp_rates[lq_sta->band];
2275
2276	tid = rs_tl_add_packet(lq_sta, hdr);
2277	if ((tid != IWL_MAX_TID_COUNT) &&
2278	    (lq_sta->tx_agg_tid_en & (1 << tid))) {
2279		tid_data = &priv->tid_data[lq_sta->lq.sta_id][tid];
2280		if (tid_data->agg.state == IWL_AGG_OFF)
2281			lq_sta->is_agg = 0;
2282		else
2283			lq_sta->is_agg = 1;
2284	} else
2285		lq_sta->is_agg = 0;
2286
2287	/*
2288	 * Select rate-scale / modulation-mode table to work with in
2289	 * the rest of this function:  "search" if searching for better
2290	 * modulation mode, or "active" if doing rate scaling within a mode.
2291	 */
2292	if (!lq_sta->search_better_tbl)
2293		active_tbl = lq_sta->active_tbl;
2294	else
2295		active_tbl = 1 - lq_sta->active_tbl;
2296
2297	tbl = &(lq_sta->lq_info[active_tbl]);
2298	if (is_legacy(tbl->lq_type))
2299		lq_sta->is_green = 0;
2300	else
2301		lq_sta->is_green = rs_use_green(sta);
2302	is_green = lq_sta->is_green;
2303
2304	/* current tx rate */
2305	index = lq_sta->last_txrate_idx;
2306
2307	IWL_DEBUG_RATE(priv, "Rate scale index %d for type %d\n", index,
2308		       tbl->lq_type);
2309
2310	/* rates available for this association, and for modulation mode */
2311	rate_mask = rs_get_supported_rates(lq_sta, hdr, tbl->lq_type);
2312
2313	IWL_DEBUG_RATE(priv, "mask 0x%04X\n", rate_mask);
2314
2315	/* mask with station rate restriction */
2316	if (is_legacy(tbl->lq_type)) {
2317		if (lq_sta->band == IEEE80211_BAND_5GHZ)
2318			/* supp_rates has no CCK bits in A mode */
2319			rate_scale_index_msk = (u16) (rate_mask &
2320				(lq_sta->supp_rates << IWL_FIRST_OFDM_RATE));
2321		else
2322			rate_scale_index_msk = (u16) (rate_mask &
2323						      lq_sta->supp_rates);
2324
2325	} else
2326		rate_scale_index_msk = rate_mask;
2327
2328	if (!rate_scale_index_msk)
2329		rate_scale_index_msk = rate_mask;
2330
2331	if (!((1 << index) & rate_scale_index_msk)) {
2332		IWL_ERR(priv, "Current Rate is not valid\n");
2333		if (lq_sta->search_better_tbl) {
2334			/* revert to active table if search table is not valid*/
2335			tbl->lq_type = LQ_NONE;
2336			lq_sta->search_better_tbl = 0;
2337			tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
2338			/* get "active" rate info */
2339			index = iwl_hwrate_to_plcp_idx(tbl->current_rate);
2340			rs_update_rate_tbl(priv, ctx, lq_sta, tbl,
2341					   index, is_green);
2342		}
2343		return;
2344	}
2345
2346	/* Get expected throughput table and history window for current rate */
2347	if (!tbl->expected_tpt) {
2348		IWL_ERR(priv, "tbl->expected_tpt is NULL\n");
2349		return;
2350	}
2351
2352	/* force user max rate if set by user */
2353	if ((lq_sta->max_rate_idx != -1) &&
2354	    (lq_sta->max_rate_idx < index)) {
2355		index = lq_sta->max_rate_idx;
2356		update_lq = 1;
2357		window = &(tbl->win[index]);
2358		goto lq_update;
2359	}
2360
2361	window = &(tbl->win[index]);
2362
2363	/*
2364	 * If there is not enough history to calculate actual average
2365	 * throughput, keep analyzing results of more tx frames, without
2366	 * changing rate or mode (bypass most of the rest of this function).
2367	 * Set up new rate table in uCode only if old rate is not supported
2368	 * in current association (use new rate found above).
2369	 */
2370	fail_count = window->counter - window->success_counter;
2371	if ((fail_count < IWL_RATE_MIN_FAILURE_TH) &&
2372			(window->success_counter < IWL_RATE_MIN_SUCCESS_TH)) {
2373		IWL_DEBUG_RATE(priv, "LQ: still below TH. succ=%d total=%d "
2374			       "for index %d\n",
2375			       window->success_counter, window->counter, index);
2376
2377		/* Can't calculate this yet; not enough history */
2378		window->average_tpt = IWL_INVALID_VALUE;
2379
2380		/* Should we stay with this modulation mode,
2381		 * or search for a new one? */
2382		rs_stay_in_table(lq_sta, false);
2383
2384		goto out;
2385	}
2386	/* Else we have enough samples; calculate estimate of
2387	 * actual average throughput */
2388	if (window->average_tpt != ((window->success_ratio *
2389			tbl->expected_tpt[index] + 64) / 128)) {
2390		IWL_ERR(priv, "expected_tpt should have been calculated by now\n");
2391		window->average_tpt = ((window->success_ratio *
2392					tbl->expected_tpt[index] + 64) / 128);
2393	}
2394
2395	/* If we are searching for better modulation mode, check success. */
2396	if (lq_sta->search_better_tbl &&
2397	    (iwl_tx_ant_restriction(priv) == IWL_ANT_OK_MULTI)) {
2398		/* If good success, continue using the "search" mode;
2399		 * no need to send new link quality command, since we're
2400		 * continuing to use the setup that we've been trying. */
2401		if (window->average_tpt > lq_sta->last_tpt) {
2402
2403			IWL_DEBUG_RATE(priv, "LQ: SWITCHING TO NEW TABLE "
2404					"suc=%d cur-tpt=%d old-tpt=%d\n",
2405					window->success_ratio,
2406					window->average_tpt,
2407					lq_sta->last_tpt);
2408
2409			if (!is_legacy(tbl->lq_type))
2410				lq_sta->enable_counter = 1;
2411
2412			/* Swap tables; "search" becomes "active" */
2413			lq_sta->active_tbl = active_tbl;
2414			current_tpt = window->average_tpt;
2415
2416		/* Else poor success; go back to mode in "active" table */
2417		} else {
2418
2419			IWL_DEBUG_RATE(priv, "LQ: GOING BACK TO THE OLD TABLE "
2420					"suc=%d cur-tpt=%d old-tpt=%d\n",
2421					window->success_ratio,
2422					window->average_tpt,
2423					lq_sta->last_tpt);
2424
2425			/* Nullify "search" table */
2426			tbl->lq_type = LQ_NONE;
2427
2428			/* Revert to "active" table */
2429			active_tbl = lq_sta->active_tbl;
2430			tbl = &(lq_sta->lq_info[active_tbl]);
2431
2432			/* Revert to "active" rate and throughput info */
2433			index = iwl_hwrate_to_plcp_idx(tbl->current_rate);
2434			current_tpt = lq_sta->last_tpt;
2435
2436			/* Need to set up a new rate table in uCode */
2437			update_lq = 1;
2438		}
2439
2440		/* Either way, we've made a decision; modulation mode
2441		 * search is done, allow rate adjustment next time. */
2442		lq_sta->search_better_tbl = 0;
2443		done_search = 1;	/* Don't switch modes below! */
2444		goto lq_update;
2445	}
2446
2447	/* (Else) not in search of better modulation mode, try for better
2448	 * starting rate, while staying in this mode. */
2449	high_low = rs_get_adjacent_rate(priv, index, rate_scale_index_msk,
2450					tbl->lq_type);
2451	low = high_low & 0xff;
2452	high = (high_low >> 8) & 0xff;
2453
2454	/* If user set max rate, dont allow higher than user constrain */
2455	if ((lq_sta->max_rate_idx != -1) &&
2456	    (lq_sta->max_rate_idx < high))
2457		high = IWL_RATE_INVALID;
2458
2459	sr = window->success_ratio;
2460
2461	/* Collect measured throughputs for current and adjacent rates */
2462	current_tpt = window->average_tpt;
2463	if (low != IWL_RATE_INVALID)
2464		low_tpt = tbl->win[low].average_tpt;
2465	if (high != IWL_RATE_INVALID)
2466		high_tpt = tbl->win[high].average_tpt;
2467
2468	scale_action = 0;
2469
2470	/* Too many failures, decrease rate */
2471	if ((sr <= IWL_RATE_DECREASE_TH) || (current_tpt == 0)) {
2472		IWL_DEBUG_RATE(priv, "decrease rate because of low success_ratio\n");
2473		scale_action = -1;
2474
2475	/* No throughput measured yet for adjacent rates; try increase. */
2476	} else if ((low_tpt == IWL_INVALID_VALUE) &&
2477		   (high_tpt == IWL_INVALID_VALUE)) {
2478
2479		if (high != IWL_RATE_INVALID && sr >= IWL_RATE_INCREASE_TH)
2480			scale_action = 1;
2481		else if (low != IWL_RATE_INVALID)
2482			scale_action = 0;
2483	}
2484
2485	/* Both adjacent throughputs are measured, but neither one has better
2486	 * throughput; we're using the best rate, don't change it! */
2487	else if ((low_tpt != IWL_INVALID_VALUE) &&
2488		 (high_tpt != IWL_INVALID_VALUE) &&
2489		 (low_tpt < current_tpt) &&
2490		 (high_tpt < current_tpt))
2491		scale_action = 0;
2492
2493	/* At least one adjacent rate's throughput is measured,
2494	 * and may have better performance. */
2495	else {
2496		/* Higher adjacent rate's throughput is measured */
2497		if (high_tpt != IWL_INVALID_VALUE) {
2498			/* Higher rate has better throughput */
2499			if (high_tpt > current_tpt &&
2500					sr >= IWL_RATE_INCREASE_TH) {
2501				scale_action = 1;
2502			} else {
2503				scale_action = 0;
2504			}
2505
2506		/* Lower adjacent rate's throughput is measured */
2507		} else if (low_tpt != IWL_INVALID_VALUE) {
2508			/* Lower rate has better throughput */
2509			if (low_tpt > current_tpt) {
2510				IWL_DEBUG_RATE(priv,
2511				    "decrease rate because of low tpt\n");
2512				scale_action = -1;
2513			} else if (sr >= IWL_RATE_INCREASE_TH) {
2514				scale_action = 1;
2515			}
2516		}
2517	}
2518
2519	/* Sanity check; asked for decrease, but success rate or throughput
2520	 * has been good at old rate.  Don't change it. */
2521	if ((scale_action == -1) && (low != IWL_RATE_INVALID) &&
2522		    ((sr > IWL_RATE_HIGH_TH) ||
2523		     (current_tpt > (100 * tbl->expected_tpt[low]))))
2524		scale_action = 0;
2525	if (!iwl_ht_enabled(priv) && !is_legacy(tbl->lq_type))
2526		scale_action = -1;
2527	if (iwl_tx_ant_restriction(priv) != IWL_ANT_OK_MULTI &&
2528		(is_mimo2(tbl->lq_type) || is_mimo3(tbl->lq_type)))
2529		scale_action = -1;
2530
2531	if ((priv->bt_traffic_load >= IWL_BT_COEX_TRAFFIC_LOAD_HIGH) &&
2532	     (is_mimo2(tbl->lq_type) || is_mimo3(tbl->lq_type))) {
2533		if (lq_sta->last_bt_traffic > priv->bt_traffic_load) {
2534			/*
2535			 * don't set scale_action, don't want to scale up if
2536			 * the rate scale doesn't otherwise think that is a
2537			 * good idea.
2538			 */
2539		} else if (lq_sta->last_bt_traffic <= priv->bt_traffic_load) {
2540			scale_action = -1;
2541		}
2542	}
2543	lq_sta->last_bt_traffic = priv->bt_traffic_load;
2544
2545	if ((priv->bt_traffic_load >= IWL_BT_COEX_TRAFFIC_LOAD_HIGH) &&
2546	     (is_mimo2(tbl->lq_type) || is_mimo3(tbl->lq_type))) {
2547		/* search for a new modulation */
2548		rs_stay_in_table(lq_sta, true);
2549		goto lq_update;
2550	}
2551
2552	switch (scale_action) {
2553	case -1:
2554		/* Decrease starting rate, update uCode's rate table */
2555		if (low != IWL_RATE_INVALID) {
2556			update_lq = 1;
2557			index = low;
2558		}
2559
2560		break;
2561	case 1:
2562		/* Increase starting rate, update uCode's rate table */
2563		if (high != IWL_RATE_INVALID) {
2564			update_lq = 1;
2565			index = high;
2566		}
2567
2568		break;
2569	case 0:
2570		/* No change */
2571	default:
2572		break;
2573	}
2574
2575	IWL_DEBUG_RATE(priv, "choose rate scale index %d action %d low %d "
2576		    "high %d type %d\n",
2577		     index, scale_action, low, high, tbl->lq_type);
2578
2579lq_update:
2580	/* Replace uCode's rate table for the destination station. */
2581	if (update_lq)
2582		rs_update_rate_tbl(priv, ctx, lq_sta, tbl, index, is_green);
2583
2584	if (iwl_tx_ant_restriction(priv) == IWL_ANT_OK_MULTI) {
2585		/* Should we stay with this modulation mode,
2586		 * or search for a new one? */
2587	  rs_stay_in_table(lq_sta, false);
2588	}
2589	/*
2590	 * Search for new modulation mode if we're:
2591	 * 1)  Not changing rates right now
2592	 * 2)  Not just finishing up a search
2593	 * 3)  Allowing a new search
2594	 */
2595	if (!update_lq && !done_search && !lq_sta->stay_in_tbl && window->counter) {
2596		/* Save current throughput to compare with "search" throughput*/
2597		lq_sta->last_tpt = current_tpt;
2598
2599		/* Select a new "search" modulation mode to try.
2600		 * If one is found, set up the new "search" table. */
2601		if (is_legacy(tbl->lq_type))
2602			rs_move_legacy_other(priv, lq_sta, conf, sta, index);
2603		else if (is_siso(tbl->lq_type))
2604			rs_move_siso_to_other(priv, lq_sta, conf, sta, index);
2605		else if (is_mimo2(tbl->lq_type))
2606			rs_move_mimo2_to_other(priv, lq_sta, conf, sta, index);
2607		else
2608			rs_move_mimo3_to_other(priv, lq_sta, conf, sta, index);
2609
2610		/* If new "search" mode was selected, set up in uCode table */
2611		if (lq_sta->search_better_tbl) {
2612			/* Access the "search" table, clear its history. */
2613			tbl = &(lq_sta->lq_info[(1 - lq_sta->active_tbl)]);
2614			for (i = 0; i < IWL_RATE_COUNT; i++)
2615				rs_rate_scale_clear_window(&(tbl->win[i]));
2616
2617			/* Use new "search" start rate */
2618			index = iwl_hwrate_to_plcp_idx(tbl->current_rate);
2619
2620			IWL_DEBUG_RATE(priv, "Switch current  mcs: %X index: %d\n",
2621				     tbl->current_rate, index);
2622			rs_fill_link_cmd(priv, lq_sta, tbl->current_rate);
2623			iwl_send_lq_cmd(priv, ctx, &lq_sta->lq, CMD_ASYNC, false);
2624		} else
2625			done_search = 1;
2626	}
2627
2628	if (done_search && !lq_sta->stay_in_tbl) {
2629		/* If the "active" (non-search) mode was legacy,
2630		 * and we've tried switching antennas,
2631		 * but we haven't been able to try HT modes (not available),
2632		 * stay with best antenna legacy modulation for a while
2633		 * before next round of mode comparisons. */
2634		tbl1 = &(lq_sta->lq_info[lq_sta->active_tbl]);
2635		if (is_legacy(tbl1->lq_type) && !conf_is_ht(conf) &&
2636		    lq_sta->action_counter > tbl1->max_search) {
2637			IWL_DEBUG_RATE(priv, "LQ: STAY in legacy table\n");
2638			rs_set_stay_in_table(priv, 1, lq_sta);
2639		}
2640
2641		/* If we're in an HT mode, and all 3 mode switch actions
2642		 * have been tried and compared, stay in this best modulation
2643		 * mode for a while before next round of mode comparisons. */
2644		if (lq_sta->enable_counter &&
2645		    (lq_sta->action_counter >= tbl1->max_search) &&
2646		    iwl_ht_enabled(priv)) {
2647			if ((lq_sta->last_tpt > IWL_AGG_TPT_THREHOLD) &&
2648			    (lq_sta->tx_agg_tid_en & (1 << tid)) &&
2649			    (tid != IWL_MAX_TID_COUNT)) {
2650				u8 sta_id = lq_sta->lq.sta_id;
2651				tid_data = &priv->tid_data[sta_id][tid];
2652				if (tid_data->agg.state == IWL_AGG_OFF) {
2653					IWL_DEBUG_RATE(priv,
2654						       "try to aggregate tid %d\n",
2655						       tid);
2656					rs_tl_turn_on_agg(priv, tid,
2657							  lq_sta, sta);
2658				}
2659			}
2660			rs_set_stay_in_table(priv, 0, lq_sta);
2661		}
2662	}
2663
2664out:
2665	tbl->current_rate = rate_n_flags_from_tbl(priv, tbl, index, is_green);
2666	lq_sta->last_txrate_idx = index;
2667}
2668
2669/**
2670 * rs_initialize_lq - Initialize a station's hardware rate table
2671 *
2672 * The uCode's station table contains a table of fallback rates
2673 * for automatic fallback during transmission.
2674 *
2675 * NOTE: This sets up a default set of values.  These will be replaced later
2676 *       if the driver's iwl-agn-rs rate scaling algorithm is used, instead of
2677 *       rc80211_simple.
2678 *
2679 * NOTE: Run REPLY_ADD_STA command to set up station table entry, before
2680 *       calling this function (which runs REPLY_TX_LINK_QUALITY_CMD,
2681 *       which requires station table entry to exist).
2682 */
2683static void rs_initialize_lq(struct iwl_priv *priv,
2684			     struct ieee80211_sta *sta,
2685			     struct iwl_lq_sta *lq_sta)
2686{
2687	struct iwl_scale_tbl_info *tbl;
2688	int rate_idx;
2689	int i;
2690	u32 rate;
2691	u8 use_green = rs_use_green(sta);
2692	u8 active_tbl = 0;
2693	u8 valid_tx_ant;
2694	struct iwl_station_priv *sta_priv;
2695	struct iwl_rxon_context *ctx;
2696
2697	if (!sta || !lq_sta)
2698		return;
2699
2700	sta_priv = (void *)sta->drv_priv;
2701	ctx = sta_priv->ctx;
2702
2703	i = lq_sta->last_txrate_idx;
2704
2705	valid_tx_ant = priv->hw_params.valid_tx_ant;
2706
2707	if (!lq_sta->search_better_tbl)
2708		active_tbl = lq_sta->active_tbl;
2709	else
2710		active_tbl = 1 - lq_sta->active_tbl;
2711
2712	tbl = &(lq_sta->lq_info[active_tbl]);
2713
2714	if ((i < 0) || (i >= IWL_RATE_COUNT))
2715		i = 0;
2716
2717	rate = iwl_rates[i].plcp;
2718	tbl->ant_type = first_antenna(valid_tx_ant);
2719	rate |= tbl->ant_type << RATE_MCS_ANT_POS;
2720
2721	if (i >= IWL_FIRST_CCK_RATE && i <= IWL_LAST_CCK_RATE)
2722		rate |= RATE_MCS_CCK_MSK;
2723
2724	rs_get_tbl_info_from_mcs(rate, priv->band, tbl, &rate_idx);
2725	if (!rs_is_valid_ant(valid_tx_ant, tbl->ant_type))
2726	    rs_toggle_antenna(valid_tx_ant, &rate, tbl);
2727
2728	rate = rate_n_flags_from_tbl(priv, tbl, rate_idx, use_green);
2729	tbl->current_rate = rate;
2730	rs_set_expected_tpt_table(lq_sta, tbl);
2731	rs_fill_link_cmd(NULL, lq_sta, rate);
2732	priv->stations[lq_sta->lq.sta_id].lq = &lq_sta->lq;
2733	iwl_send_lq_cmd(priv, ctx, &lq_sta->lq, CMD_SYNC, true);
2734}
2735
2736static void rs_get_rate(void *priv_r, struct ieee80211_sta *sta, void *priv_sta,
2737			struct ieee80211_tx_rate_control *txrc)
2738{
2739
2740	struct sk_buff *skb = txrc->skb;
2741	struct ieee80211_supported_band *sband = txrc->sband;
2742	struct iwl_op_mode *op_mode __maybe_unused =
2743			(struct iwl_op_mode *)priv_r;
2744	struct iwl_priv *priv __maybe_unused = IWL_OP_MODE_GET_DVM(op_mode);
2745	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
2746	struct iwl_lq_sta *lq_sta = priv_sta;
2747	int rate_idx;
2748
2749	IWL_DEBUG_RATE_LIMIT(priv, "rate scale calculate new rate for skb\n");
2750
2751	/* Get max rate if user set max rate */
2752	if (lq_sta) {
2753		lq_sta->max_rate_idx = txrc->max_rate_idx;
2754		if ((sband->band == IEEE80211_BAND_5GHZ) &&
2755		    (lq_sta->max_rate_idx != -1))
2756			lq_sta->max_rate_idx += IWL_FIRST_OFDM_RATE;
2757		if ((lq_sta->max_rate_idx < 0) ||
2758		    (lq_sta->max_rate_idx >= IWL_RATE_COUNT))
2759			lq_sta->max_rate_idx = -1;
2760	}
2761
2762	/* Treat uninitialized rate scaling data same as non-existing. */
2763	if (lq_sta && !lq_sta->drv) {
2764		IWL_DEBUG_RATE(priv, "Rate scaling not initialized yet.\n");
2765		priv_sta = NULL;
2766	}
2767
2768	/* Send management frames and NO_ACK data using lowest rate. */
2769	if (rate_control_send_low(sta, priv_sta, txrc))
2770		return;
2771
2772	rate_idx  = lq_sta->last_txrate_idx;
2773
2774	if (lq_sta->last_rate_n_flags & RATE_MCS_HT_MSK) {
2775		rate_idx -= IWL_FIRST_OFDM_RATE;
2776		/* 6M and 9M shared same MCS index */
2777		rate_idx = (rate_idx > 0) ? (rate_idx - 1) : 0;
2778		if (rs_extract_rate(lq_sta->last_rate_n_flags) >=
2779		    IWL_RATE_MIMO3_6M_PLCP)
2780			rate_idx = rate_idx + (2 * MCS_INDEX_PER_STREAM);
2781		else if (rs_extract_rate(lq_sta->last_rate_n_flags) >=
2782			 IWL_RATE_MIMO2_6M_PLCP)
2783			rate_idx = rate_idx + MCS_INDEX_PER_STREAM;
2784		info->control.rates[0].flags = IEEE80211_TX_RC_MCS;
2785		if (lq_sta->last_rate_n_flags & RATE_MCS_SGI_MSK)
2786			info->control.rates[0].flags |= IEEE80211_TX_RC_SHORT_GI;
2787		if (lq_sta->last_rate_n_flags & RATE_MCS_DUP_MSK)
2788			info->control.rates[0].flags |= IEEE80211_TX_RC_DUP_DATA;
2789		if (lq_sta->last_rate_n_flags & RATE_MCS_HT40_MSK)
2790			info->control.rates[0].flags |= IEEE80211_TX_RC_40_MHZ_WIDTH;
2791		if (lq_sta->last_rate_n_flags & RATE_MCS_GF_MSK)
2792			info->control.rates[0].flags |= IEEE80211_TX_RC_GREEN_FIELD;
2793	} else {
2794		/* Check for invalid rates */
2795		if ((rate_idx < 0) || (rate_idx >= IWL_RATE_COUNT_LEGACY) ||
2796				((sband->band == IEEE80211_BAND_5GHZ) &&
2797				 (rate_idx < IWL_FIRST_OFDM_RATE)))
2798			rate_idx = rate_lowest_index(sband, sta);
2799		/* On valid 5 GHz rate, adjust index */
2800		else if (sband->band == IEEE80211_BAND_5GHZ)
2801			rate_idx -= IWL_FIRST_OFDM_RATE;
2802		info->control.rates[0].flags = 0;
2803	}
2804	info->control.rates[0].idx = rate_idx;
2805
2806}
2807
2808static void *rs_alloc_sta(void *priv_rate, struct ieee80211_sta *sta,
2809			  gfp_t gfp)
2810{
2811	struct iwl_station_priv *sta_priv = (struct iwl_station_priv *) sta->drv_priv;
2812	struct iwl_op_mode *op_mode __maybe_unused =
2813			(struct iwl_op_mode *)priv_rate;
2814	struct iwl_priv *priv __maybe_unused = IWL_OP_MODE_GET_DVM(op_mode);
2815
2816	IWL_DEBUG_RATE(priv, "create station rate scale window\n");
2817
2818	return &sta_priv->lq_sta;
2819}
2820
2821/*
2822 * Called after adding a new station to initialize rate scaling
2823 */
2824void iwl_rs_rate_init(struct iwl_priv *priv, struct ieee80211_sta *sta, u8 sta_id)
2825{
2826	int i, j;
2827	struct ieee80211_hw *hw = priv->hw;
2828	struct ieee80211_conf *conf = &priv->hw->conf;
2829	struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
2830	struct iwl_station_priv *sta_priv;
2831	struct iwl_lq_sta *lq_sta;
2832	struct ieee80211_supported_band *sband;
2833	unsigned long supp; /* must be unsigned long for for_each_set_bit */
2834
2835	sta_priv = (struct iwl_station_priv *) sta->drv_priv;
2836	lq_sta = &sta_priv->lq_sta;
2837	sband = hw->wiphy->bands[conf->channel->band];
2838
2839
2840	lq_sta->lq.sta_id = sta_id;
2841
2842	for (j = 0; j < LQ_SIZE; j++)
2843		for (i = 0; i < IWL_RATE_COUNT; i++)
2844			rs_rate_scale_clear_window(&lq_sta->lq_info[j].win[i]);
2845
2846	lq_sta->flush_timer = 0;
2847	lq_sta->supp_rates = sta->supp_rates[sband->band];
2848	for (j = 0; j < LQ_SIZE; j++)
2849		for (i = 0; i < IWL_RATE_COUNT; i++)
2850			rs_rate_scale_clear_window(&lq_sta->lq_info[j].win[i]);
2851
2852	IWL_DEBUG_RATE(priv, "LQ: *** rate scale station global init for station %d ***\n",
2853		       sta_id);
2854	/* TODO: what is a good starting rate for STA? About middle? Maybe not
2855	 * the lowest or the highest rate.. Could consider using RSSI from
2856	 * previous packets? Need to have IEEE 802.1X auth succeed immediately
2857	 * after assoc.. */
2858
2859	lq_sta->is_dup = 0;
2860	lq_sta->max_rate_idx = -1;
2861	lq_sta->missed_rate_counter = IWL_MISSED_RATE_MAX;
2862	lq_sta->is_green = rs_use_green(sta);
2863	lq_sta->band = sband->band;
2864	/*
2865	 * active legacy rates as per supported rates bitmap
2866	 */
2867	supp = sta->supp_rates[sband->band];
2868	lq_sta->active_legacy_rate = 0;
2869	for_each_set_bit(i, &supp, BITS_PER_LONG)
2870		lq_sta->active_legacy_rate |= BIT(sband->bitrates[i].hw_value);
2871
2872	/*
2873	 * active_siso_rate mask includes 9 MBits (bit 5), and CCK (bits 0-3),
2874	 * supp_rates[] does not; shift to convert format, force 9 MBits off.
2875	 */
2876	lq_sta->active_siso_rate = ht_cap->mcs.rx_mask[0] << 1;
2877	lq_sta->active_siso_rate |= ht_cap->mcs.rx_mask[0] & 0x1;
2878	lq_sta->active_siso_rate &= ~((u16)0x2);
2879	lq_sta->active_siso_rate <<= IWL_FIRST_OFDM_RATE;
2880
2881	/* Same here */
2882	lq_sta->active_mimo2_rate = ht_cap->mcs.rx_mask[1] << 1;
2883	lq_sta->active_mimo2_rate |= ht_cap->mcs.rx_mask[1] & 0x1;
2884	lq_sta->active_mimo2_rate &= ~((u16)0x2);
2885	lq_sta->active_mimo2_rate <<= IWL_FIRST_OFDM_RATE;
2886
2887	lq_sta->active_mimo3_rate = ht_cap->mcs.rx_mask[2] << 1;
2888	lq_sta->active_mimo3_rate |= ht_cap->mcs.rx_mask[2] & 0x1;
2889	lq_sta->active_mimo3_rate &= ~((u16)0x2);
2890	lq_sta->active_mimo3_rate <<= IWL_FIRST_OFDM_RATE;
2891
2892	IWL_DEBUG_RATE(priv, "SISO-RATE=%X MIMO2-RATE=%X MIMO3-RATE=%X\n",
2893		     lq_sta->active_siso_rate,
2894		     lq_sta->active_mimo2_rate,
2895		     lq_sta->active_mimo3_rate);
2896
2897	/* These values will be overridden later */
2898	lq_sta->lq.general_params.single_stream_ant_msk =
2899		first_antenna(priv->hw_params.valid_tx_ant);
2900	lq_sta->lq.general_params.dual_stream_ant_msk =
2901		priv->hw_params.valid_tx_ant &
2902		~first_antenna(priv->hw_params.valid_tx_ant);
2903	if (!lq_sta->lq.general_params.dual_stream_ant_msk) {
2904		lq_sta->lq.general_params.dual_stream_ant_msk = ANT_AB;
2905	} else if (num_of_ant(priv->hw_params.valid_tx_ant) == 2) {
2906		lq_sta->lq.general_params.dual_stream_ant_msk =
2907			priv->hw_params.valid_tx_ant;
2908	}
2909
2910	/* as default allow aggregation for all tids */
2911	lq_sta->tx_agg_tid_en = IWL_AGG_ALL_TID;
2912	lq_sta->drv = priv;
2913
2914	/* Set last_txrate_idx to lowest rate */
2915	lq_sta->last_txrate_idx = rate_lowest_index(sband, sta);
2916	if (sband->band == IEEE80211_BAND_5GHZ)
2917		lq_sta->last_txrate_idx += IWL_FIRST_OFDM_RATE;
2918	lq_sta->is_agg = 0;
2919#ifdef CONFIG_IWLWIFI_DEVICE_TESTMODE
2920	priv->tm_fixed_rate = 0;
2921#endif
2922#ifdef CONFIG_MAC80211_DEBUGFS
2923	lq_sta->dbg_fixed_rate = 0;
2924#endif
2925
2926	rs_initialize_lq(priv, sta, lq_sta);
2927}
2928
2929static void rs_fill_link_cmd(struct iwl_priv *priv,
2930			     struct iwl_lq_sta *lq_sta, u32 new_rate)
2931{
2932	struct iwl_scale_tbl_info tbl_type;
2933	int index = 0;
2934	int rate_idx;
2935	int repeat_rate = 0;
2936	u8 ant_toggle_cnt = 0;
2937	u8 use_ht_possible = 1;
2938	u8 valid_tx_ant = 0;
2939	struct iwl_station_priv *sta_priv =
2940		container_of(lq_sta, struct iwl_station_priv, lq_sta);
2941	struct iwl_link_quality_cmd *lq_cmd = &lq_sta->lq;
2942
2943	/* Override starting rate (index 0) if needed for debug purposes */
2944	rs_dbgfs_set_mcs(lq_sta, &new_rate, index);
2945
2946	/* Interpret new_rate (rate_n_flags) */
2947	rs_get_tbl_info_from_mcs(new_rate, lq_sta->band,
2948				  &tbl_type, &rate_idx);
2949
2950	if (priv && priv->bt_full_concurrent) {
2951		/* 1x1 only */
2952		tbl_type.ant_type =
2953			first_antenna(priv->hw_params.valid_tx_ant);
2954	}
2955
2956	/* How many times should we repeat the initial rate? */
2957	if (is_legacy(tbl_type.lq_type)) {
2958		ant_toggle_cnt = 1;
2959		repeat_rate = IWL_NUMBER_TRY;
2960	} else {
2961		repeat_rate = min(IWL_HT_NUMBER_TRY,
2962				  LINK_QUAL_AGG_DISABLE_START_DEF - 1);
2963	}
2964
2965	lq_cmd->general_params.mimo_delimiter =
2966			is_mimo(tbl_type.lq_type) ? 1 : 0;
2967
2968	/* Fill 1st table entry (index 0) */
2969	lq_cmd->rs_table[index].rate_n_flags = cpu_to_le32(new_rate);
2970
2971	if (num_of_ant(tbl_type.ant_type) == 1) {
2972		lq_cmd->general_params.single_stream_ant_msk =
2973						tbl_type.ant_type;
2974	} else if (num_of_ant(tbl_type.ant_type) == 2) {
2975		lq_cmd->general_params.dual_stream_ant_msk =
2976						tbl_type.ant_type;
2977	} /* otherwise we don't modify the existing value */
2978
2979	index++;
2980	repeat_rate--;
2981	if (priv) {
2982		if (priv->bt_full_concurrent)
2983			valid_tx_ant = ANT_A;
2984		else
2985			valid_tx_ant = priv->hw_params.valid_tx_ant;
2986	}
2987
2988	/* Fill rest of rate table */
2989	while (index < LINK_QUAL_MAX_RETRY_NUM) {
2990		/* Repeat initial/next rate.
2991		 * For legacy IWL_NUMBER_TRY == 1, this loop will not execute.
2992		 * For HT IWL_HT_NUMBER_TRY == 3, this executes twice. */
2993		while (repeat_rate > 0 && (index < LINK_QUAL_MAX_RETRY_NUM)) {
2994			if (is_legacy(tbl_type.lq_type)) {
2995				if (ant_toggle_cnt < NUM_TRY_BEFORE_ANT_TOGGLE)
2996					ant_toggle_cnt++;
2997				else if (priv &&
2998					 rs_toggle_antenna(valid_tx_ant,
2999							&new_rate, &tbl_type))
3000					ant_toggle_cnt = 1;
3001			}
3002
3003			/* Override next rate if needed for debug purposes */
3004			rs_dbgfs_set_mcs(lq_sta, &new_rate, index);
3005
3006			/* Fill next table entry */
3007			lq_cmd->rs_table[index].rate_n_flags =
3008					cpu_to_le32(new_rate);
3009			repeat_rate--;
3010			index++;
3011		}
3012
3013		rs_get_tbl_info_from_mcs(new_rate, lq_sta->band, &tbl_type,
3014						&rate_idx);
3015
3016		if (priv && priv->bt_full_concurrent) {
3017			/* 1x1 only */
3018			tbl_type.ant_type =
3019			    first_antenna(priv->hw_params.valid_tx_ant);
3020		}
3021
3022		/* Indicate to uCode which entries might be MIMO.
3023		 * If initial rate was MIMO, this will finally end up
3024		 * as (IWL_HT_NUMBER_TRY * 2), after 2nd pass, otherwise 0. */
3025		if (is_mimo(tbl_type.lq_type))
3026			lq_cmd->general_params.mimo_delimiter = index;
3027
3028		/* Get next rate */
3029		new_rate = rs_get_lower_rate(lq_sta, &tbl_type, rate_idx,
3030					     use_ht_possible);
3031
3032		/* How many times should we repeat the next rate? */
3033		if (is_legacy(tbl_type.lq_type)) {
3034			if (ant_toggle_cnt < NUM_TRY_BEFORE_ANT_TOGGLE)
3035				ant_toggle_cnt++;
3036			else if (priv &&
3037				 rs_toggle_antenna(valid_tx_ant,
3038						   &new_rate, &tbl_type))
3039				ant_toggle_cnt = 1;
3040
3041			repeat_rate = IWL_NUMBER_TRY;
3042		} else {
3043			repeat_rate = IWL_HT_NUMBER_TRY;
3044		}
3045
3046		/* Don't allow HT rates after next pass.
3047		 * rs_get_lower_rate() will change type to LQ_A or LQ_G. */
3048		use_ht_possible = 0;
3049
3050		/* Override next rate if needed for debug purposes */
3051		rs_dbgfs_set_mcs(lq_sta, &new_rate, index);
3052
3053		/* Fill next table entry */
3054		lq_cmd->rs_table[index].rate_n_flags = cpu_to_le32(new_rate);
3055
3056		index++;
3057		repeat_rate--;
3058	}
3059
3060	lq_cmd->agg_params.agg_frame_cnt_limit =
3061		sta_priv->max_agg_bufsize ?: LINK_QUAL_AGG_FRAME_LIMIT_DEF;
3062	lq_cmd->agg_params.agg_dis_start_th = LINK_QUAL_AGG_DISABLE_START_DEF;
3063
3064	lq_cmd->agg_params.agg_time_limit =
3065		cpu_to_le16(LINK_QUAL_AGG_TIME_LIMIT_DEF);
3066	/*
3067	 * overwrite if needed, pass aggregation time limit
3068	 * to uCode in uSec
3069	 */
3070	if (priv && priv->cfg->bt_params &&
3071	    priv->cfg->bt_params->agg_time_limit &&
3072	    priv->bt_traffic_load >= IWL_BT_COEX_TRAFFIC_LOAD_HIGH)
3073		lq_cmd->agg_params.agg_time_limit =
3074			cpu_to_le16(priv->cfg->bt_params->agg_time_limit);
3075}
3076
3077static void *rs_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir)
3078{
3079	return hw->priv;
3080}
3081/* rate scale requires free function to be implemented */
3082static void rs_free(void *priv_rate)
3083{
3084	return;
3085}
3086
3087static void rs_free_sta(void *priv_r, struct ieee80211_sta *sta,
3088			void *priv_sta)
3089{
3090	struct iwl_op_mode *op_mode __maybe_unused = priv_r;
3091	struct iwl_priv *priv __maybe_unused = IWL_OP_MODE_GET_DVM(op_mode);
3092
3093	IWL_DEBUG_RATE(priv, "enter\n");
3094	IWL_DEBUG_RATE(priv, "leave\n");
3095}
3096
3097#ifdef CONFIG_MAC80211_DEBUGFS
3098static void rs_dbgfs_set_mcs(struct iwl_lq_sta *lq_sta,
3099			     u32 *rate_n_flags, int index)
3100{
3101	struct iwl_priv *priv;
3102	u8 valid_tx_ant;
3103	u8 ant_sel_tx;
3104
3105	priv = lq_sta->drv;
3106	valid_tx_ant = priv->hw_params.valid_tx_ant;
3107	if (lq_sta->dbg_fixed_rate) {
3108		ant_sel_tx =
3109		  ((lq_sta->dbg_fixed_rate & RATE_MCS_ANT_ABC_MSK)
3110		  >> RATE_MCS_ANT_POS);
3111		if ((valid_tx_ant & ant_sel_tx) == ant_sel_tx) {
3112			*rate_n_flags = lq_sta->dbg_fixed_rate;
3113			IWL_DEBUG_RATE(priv, "Fixed rate ON\n");
3114		} else {
3115			lq_sta->dbg_fixed_rate = 0;
3116			IWL_ERR(priv,
3117			    "Invalid antenna selection 0x%X, Valid is 0x%X\n",
3118			    ant_sel_tx, valid_tx_ant);
3119			IWL_DEBUG_RATE(priv, "Fixed rate OFF\n");
3120		}
3121	} else {
3122		IWL_DEBUG_RATE(priv, "Fixed rate OFF\n");
3123	}
3124}
3125
3126static ssize_t rs_sta_dbgfs_scale_table_write(struct file *file,
3127			const char __user *user_buf, size_t count, loff_t *ppos)
3128{
3129	struct iwl_lq_sta *lq_sta = file->private_data;
3130	struct iwl_priv *priv;
3131	char buf[64];
3132	size_t buf_size;
3133	u32 parsed_rate;
3134
3135
3136	priv = lq_sta->drv;
3137	memset(buf, 0, sizeof(buf));
3138	buf_size = min(count, sizeof(buf) -  1);
3139	if (copy_from_user(buf, user_buf, buf_size))
3140		return -EFAULT;
3141
3142	if (sscanf(buf, "%x", &parsed_rate) == 1)
3143		lq_sta->dbg_fixed_rate = parsed_rate;
3144	else
3145		lq_sta->dbg_fixed_rate = 0;
3146
3147	rs_program_fix_rate(priv, lq_sta);
3148
3149	return count;
3150}
3151
3152static ssize_t rs_sta_dbgfs_scale_table_read(struct file *file,
3153			char __user *user_buf, size_t count, loff_t *ppos)
3154{
3155	char *buff;
3156	int desc = 0;
3157	int i = 0;
3158	int index = 0;
3159	ssize_t ret;
3160
3161	struct iwl_lq_sta *lq_sta = file->private_data;
3162	struct iwl_priv *priv;
3163	struct iwl_scale_tbl_info *tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
3164
3165	priv = lq_sta->drv;
3166	buff = kmalloc(1024, GFP_KERNEL);
3167	if (!buff)
3168		return -ENOMEM;
3169
3170	desc += sprintf(buff+desc, "sta_id %d\n", lq_sta->lq.sta_id);
3171	desc += sprintf(buff+desc, "failed=%d success=%d rate=0%X\n",
3172			lq_sta->total_failed, lq_sta->total_success,
3173			lq_sta->active_legacy_rate);
3174	desc += sprintf(buff+desc, "fixed rate 0x%X\n",
3175			lq_sta->dbg_fixed_rate);
3176	desc += sprintf(buff+desc, "valid_tx_ant %s%s%s\n",
3177	    (priv->hw_params.valid_tx_ant & ANT_A) ? "ANT_A," : "",
3178	    (priv->hw_params.valid_tx_ant & ANT_B) ? "ANT_B," : "",
3179	    (priv->hw_params.valid_tx_ant & ANT_C) ? "ANT_C" : "");
3180	desc += sprintf(buff+desc, "lq type %s\n",
3181	   (is_legacy(tbl->lq_type)) ? "legacy" : "HT");
3182	if (is_Ht(tbl->lq_type)) {
3183		desc += sprintf(buff+desc, " %s",
3184		   (is_siso(tbl->lq_type)) ? "SISO" :
3185		   ((is_mimo2(tbl->lq_type)) ? "MIMO2" : "MIMO3"));
3186		   desc += sprintf(buff+desc, " %s",
3187		   (tbl->is_ht40) ? "40MHz" : "20MHz");
3188		   desc += sprintf(buff+desc, " %s %s %s\n", (tbl->is_SGI) ? "SGI" : "",
3189		   (lq_sta->is_green) ? "GF enabled" : "",
3190		   (lq_sta->is_agg) ? "AGG on" : "");
3191	}
3192	desc += sprintf(buff+desc, "last tx rate=0x%X\n",
3193		lq_sta->last_rate_n_flags);
3194	desc += sprintf(buff+desc, "general:"
3195		"flags=0x%X mimo-d=%d s-ant0x%x d-ant=0x%x\n",
3196		lq_sta->lq.general_params.flags,
3197		lq_sta->lq.general_params.mimo_delimiter,
3198		lq_sta->lq.general_params.single_stream_ant_msk,
3199		lq_sta->lq.general_params.dual_stream_ant_msk);
3200
3201	desc += sprintf(buff+desc, "agg:"
3202			"time_limit=%d dist_start_th=%d frame_cnt_limit=%d\n",
3203			le16_to_cpu(lq_sta->lq.agg_params.agg_time_limit),
3204			lq_sta->lq.agg_params.agg_dis_start_th,
3205			lq_sta->lq.agg_params.agg_frame_cnt_limit);
3206
3207	desc += sprintf(buff+desc,
3208			"Start idx [0]=0x%x [1]=0x%x [2]=0x%x [3]=0x%x\n",
3209			lq_sta->lq.general_params.start_rate_index[0],
3210			lq_sta->lq.general_params.start_rate_index[1],
3211			lq_sta->lq.general_params.start_rate_index[2],
3212			lq_sta->lq.general_params.start_rate_index[3]);
3213
3214	for (i = 0; i < LINK_QUAL_MAX_RETRY_NUM; i++) {
3215		index = iwl_hwrate_to_plcp_idx(
3216			le32_to_cpu(lq_sta->lq.rs_table[i].rate_n_flags));
3217		if (is_legacy(tbl->lq_type)) {
3218			desc += sprintf(buff+desc, " rate[%d] 0x%X %smbps\n",
3219				i, le32_to_cpu(lq_sta->lq.rs_table[i].rate_n_flags),
3220				iwl_rate_mcs[index].mbps);
3221		} else {
3222			desc += sprintf(buff+desc, " rate[%d] 0x%X %smbps (%s)\n",
3223				i, le32_to_cpu(lq_sta->lq.rs_table[i].rate_n_flags),
3224				iwl_rate_mcs[index].mbps, iwl_rate_mcs[index].mcs);
3225		}
3226	}
3227
3228	ret = simple_read_from_buffer(user_buf, count, ppos, buff, desc);
3229	kfree(buff);
3230	return ret;
3231}
3232
3233static const struct file_operations rs_sta_dbgfs_scale_table_ops = {
3234	.write = rs_sta_dbgfs_scale_table_write,
3235	.read = rs_sta_dbgfs_scale_table_read,
3236	.open = simple_open,
3237	.llseek = default_llseek,
3238};
3239static ssize_t rs_sta_dbgfs_stats_table_read(struct file *file,
3240			char __user *user_buf, size_t count, loff_t *ppos)
3241{
3242	char *buff;
3243	int desc = 0;
3244	int i, j;
3245	ssize_t ret;
3246
3247	struct iwl_lq_sta *lq_sta = file->private_data;
3248
3249	buff = kmalloc(1024, GFP_KERNEL);
3250	if (!buff)
3251		return -ENOMEM;
3252
3253	for (i = 0; i < LQ_SIZE; i++) {
3254		desc += sprintf(buff+desc,
3255				"%s type=%d SGI=%d HT40=%d DUP=%d GF=%d\n"
3256				"rate=0x%X\n",
3257				lq_sta->active_tbl == i ? "*" : "x",
3258				lq_sta->lq_info[i].lq_type,
3259				lq_sta->lq_info[i].is_SGI,
3260				lq_sta->lq_info[i].is_ht40,
3261				lq_sta->lq_info[i].is_dup,
3262				lq_sta->is_green,
3263				lq_sta->lq_info[i].current_rate);
3264		for (j = 0; j < IWL_RATE_COUNT; j++) {
3265			desc += sprintf(buff+desc,
3266				"counter=%d success=%d %%=%d\n",
3267				lq_sta->lq_info[i].win[j].counter,
3268				lq_sta->lq_info[i].win[j].success_counter,
3269				lq_sta->lq_info[i].win[j].success_ratio);
3270		}
3271	}
3272	ret = simple_read_from_buffer(user_buf, count, ppos, buff, desc);
3273	kfree(buff);
3274	return ret;
3275}
3276
3277static const struct file_operations rs_sta_dbgfs_stats_table_ops = {
3278	.read = rs_sta_dbgfs_stats_table_read,
3279	.open = simple_open,
3280	.llseek = default_llseek,
3281};
3282
3283static ssize_t rs_sta_dbgfs_rate_scale_data_read(struct file *file,
3284			char __user *user_buf, size_t count, loff_t *ppos)
3285{
3286	struct iwl_lq_sta *lq_sta = file->private_data;
3287	struct iwl_scale_tbl_info *tbl = &lq_sta->lq_info[lq_sta->active_tbl];
3288	char buff[120];
3289	int desc = 0;
3290
3291	if (is_Ht(tbl->lq_type))
3292		desc += sprintf(buff+desc,
3293				"Bit Rate= %d Mb/s\n",
3294				tbl->expected_tpt[lq_sta->last_txrate_idx]);
3295	else
3296		desc += sprintf(buff+desc,
3297				"Bit Rate= %d Mb/s\n",
3298				iwl_rates[lq_sta->last_txrate_idx].ieee >> 1);
3299
3300	return simple_read_from_buffer(user_buf, count, ppos, buff, desc);
3301}
3302
3303static const struct file_operations rs_sta_dbgfs_rate_scale_data_ops = {
3304	.read = rs_sta_dbgfs_rate_scale_data_read,
3305	.open = simple_open,
3306	.llseek = default_llseek,
3307};
3308
3309static void rs_add_debugfs(void *priv, void *priv_sta,
3310					struct dentry *dir)
3311{
3312	struct iwl_lq_sta *lq_sta = priv_sta;
3313	lq_sta->rs_sta_dbgfs_scale_table_file =
3314		debugfs_create_file("rate_scale_table", S_IRUSR | S_IWUSR, dir,
3315				lq_sta, &rs_sta_dbgfs_scale_table_ops);
3316	lq_sta->rs_sta_dbgfs_stats_table_file =
3317		debugfs_create_file("rate_stats_table", S_IRUSR, dir,
3318			lq_sta, &rs_sta_dbgfs_stats_table_ops);
3319	lq_sta->rs_sta_dbgfs_rate_scale_data_file =
3320		debugfs_create_file("rate_scale_data", S_IRUSR, dir,
3321			lq_sta, &rs_sta_dbgfs_rate_scale_data_ops);
3322	lq_sta->rs_sta_dbgfs_tx_agg_tid_en_file =
3323		debugfs_create_u8("tx_agg_tid_enable", S_IRUSR | S_IWUSR, dir,
3324		&lq_sta->tx_agg_tid_en);
3325
3326}
3327
3328static void rs_remove_debugfs(void *priv, void *priv_sta)
3329{
3330	struct iwl_lq_sta *lq_sta = priv_sta;
3331	debugfs_remove(lq_sta->rs_sta_dbgfs_scale_table_file);
3332	debugfs_remove(lq_sta->rs_sta_dbgfs_stats_table_file);
3333	debugfs_remove(lq_sta->rs_sta_dbgfs_rate_scale_data_file);
3334	debugfs_remove(lq_sta->rs_sta_dbgfs_tx_agg_tid_en_file);
3335}
3336#endif
3337
3338/*
3339 * Initialization of rate scaling information is done by driver after
3340 * the station is added. Since mac80211 calls this function before a
3341 * station is added we ignore it.
3342 */
3343static void rs_rate_init_stub(void *priv_r, struct ieee80211_supported_band *sband,
3344			 struct ieee80211_sta *sta, void *priv_sta)
3345{
3346}
3347static struct rate_control_ops rs_ops = {
3348	.module = NULL,
3349	.name = RS_NAME,
3350	.tx_status = rs_tx_status,
3351	.get_rate = rs_get_rate,
3352	.rate_init = rs_rate_init_stub,
3353	.alloc = rs_alloc,
3354	.free = rs_free,
3355	.alloc_sta = rs_alloc_sta,
3356	.free_sta = rs_free_sta,
3357#ifdef CONFIG_MAC80211_DEBUGFS
3358	.add_sta_debugfs = rs_add_debugfs,
3359	.remove_sta_debugfs = rs_remove_debugfs,
3360#endif
3361};
3362
3363int iwlagn_rate_control_register(void)
3364{
3365	return ieee80211_rate_control_register(&rs_ops);
3366}
3367
3368void iwlagn_rate_control_unregister(void)
3369{
3370	ieee80211_rate_control_unregister(&rs_ops);
3371}
3372