1b481de9ca074528fe8c429604e2777db8b89806aZhu Yi/******************************************************************************
2b481de9ca074528fe8c429604e2777db8b89806aZhu Yi *
3fb4961dbc27d40cdbed297aa9bd74fa4a0e2ba6cWey-Yi Guy * Copyright(c) 2003 - 2012 Intel Corporation. All rights reserved.
4b481de9ca074528fe8c429604e2777db8b89806aZhu Yi *
5b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * This program is free software; you can redistribute it and/or modify it
6b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * under the terms of version 2 of the GNU General Public License as
7b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * published by the Free Software Foundation.
8b481de9ca074528fe8c429604e2777db8b89806aZhu Yi *
9b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * This program is distributed in the hope that it will be useful, but WITHOUT
10b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
12b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * more details.
13b481de9ca074528fe8c429604e2777db8b89806aZhu Yi *
14b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * You should have received a copy of the GNU General Public License along with
15b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * this program; if not, write to the Free Software Foundation, Inc.,
16b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17b481de9ca074528fe8c429604e2777db8b89806aZhu Yi *
18b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * The full GNU General Public License is included in this distribution in the
19b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * file called LICENSE.
20b481de9ca074528fe8c429604e2777db8b89806aZhu Yi *
21b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * Contact Information:
22759ef89fb096c4a6ef078d3cfd5682ac037bd789Winkler, Tomas *  Intel Linux Wireless <ilw@linux.intel.com>
23b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
24b481de9ca074528fe8c429604e2777db8b89806aZhu Yi *
25b481de9ca074528fe8c429604e2777db8b89806aZhu Yi *****************************************************************************/
26b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
27e227ceac8429ecd775c213838f0415700727b7b4Tomas Winkler#ifndef __iwl_agn_rs_h__
28e227ceac8429ecd775c213838f0415700727b7b4Tomas Winkler#define __iwl_agn_rs_h__
29b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
307bd9897e1a07d97e6297f38f741e2d1851e243b8Emmanuel Grumbach#include <net/mac80211.h>
317bd9897e1a07d97e6297f38f741e2d1851e243b8Emmanuel Grumbach
327bd9897e1a07d97e6297f38f741e2d1851e243b8Emmanuel Grumbach#include "iwl-commands.h"
337bd9897e1a07d97e6297f38f741e2d1851e243b8Emmanuel Grumbach
341826dcc094466a39c82d4370ccfba694be0bc05bTomas Winklerstruct iwl_rate_info {
357762635547ad31ecb045e7073989e76ae13e6c54Ben M Cahill	u8 plcp;	/* uCode API:  IWL_RATE_6M_PLCP, etc. */
367762635547ad31ecb045e7073989e76ae13e6c54Ben M Cahill	u8 plcp_siso;	/* uCode API:  IWL_RATE_SISO_6M_PLCP, etc. */
37fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen	u8 plcp_mimo2;	/* uCode API:  IWL_RATE_MIMO2_6M_PLCP, etc. */
38fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen	u8 plcp_mimo3;  /* uCode API:  IWL_RATE_MIMO3_6M_PLCP, etc. */
397762635547ad31ecb045e7073989e76ae13e6c54Ben M Cahill	u8 ieee;	/* MAC header:  IWL_RATE_6M_IEEE, etc. */
40b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	u8 prev_ieee;    /* previous rate in IEEE speeds */
41b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	u8 next_ieee;    /* next rate in IEEE speeds */
42b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	u8 prev_rs;      /* previous rate used in rs algo */
43b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	u8 next_rs;      /* next rate used in rs algo */
44b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	u8 prev_rs_tgg;  /* previous rate used in TGG rs algo */
45b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	u8 next_rs_tgg;  /* next rate used in TGG rs algo */
46b481de9ca074528fe8c429604e2777db8b89806aZhu Yi};
47b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
489fbab5163aa8cb3a5aef845fbf67b0c1c85030b6Ben M Cahill/*
499fbab5163aa8cb3a5aef845fbf67b0c1c85030b6Ben M Cahill * These serve as indexes into
501826dcc094466a39c82d4370ccfba694be0bc05bTomas Winkler * struct iwl_rate_info iwl_rates[IWL_RATE_COUNT];
519fbab5163aa8cb3a5aef845fbf67b0c1c85030b6Ben M Cahill */
52b481de9ca074528fe8c429604e2777db8b89806aZhu Yienum {
53b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_1M_INDEX = 0,
54b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_2M_INDEX,
55b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_5M_INDEX,
56b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_11M_INDEX,
57b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_6M_INDEX,
58b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_9M_INDEX,
59b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_12M_INDEX,
60b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_18M_INDEX,
61b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_24M_INDEX,
62b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_36M_INDEX,
63b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_48M_INDEX,
64b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_54M_INDEX,
65b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_60M_INDEX,
66fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen	IWL_RATE_COUNT, /*FIXME:RS:change to IWL_RATE_INDEX_COUNT,*/
675027309b5581e9c251a46f0ecbf88996d5e0f1e0Daniel C Halperin	IWL_RATE_COUNT_LEGACY = IWL_RATE_COUNT - 1,	/* Excluding 60M */
68b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_INVM_INDEX = IWL_RATE_COUNT,
69fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen	IWL_RATE_INVALID = IWL_RATE_COUNT,
70b481de9ca074528fe8c429604e2777db8b89806aZhu Yi};
71b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
72b481de9ca074528fe8c429604e2777db8b89806aZhu Yienum {
73d9829a67f953379b5cab6b78ae8f7a879a591eb1Samuel Ortiz	IWL_RATE_6M_INDEX_TABLE = 0,
74d9829a67f953379b5cab6b78ae8f7a879a591eb1Samuel Ortiz	IWL_RATE_9M_INDEX_TABLE,
75d9829a67f953379b5cab6b78ae8f7a879a591eb1Samuel Ortiz	IWL_RATE_12M_INDEX_TABLE,
76d9829a67f953379b5cab6b78ae8f7a879a591eb1Samuel Ortiz	IWL_RATE_18M_INDEX_TABLE,
77d9829a67f953379b5cab6b78ae8f7a879a591eb1Samuel Ortiz	IWL_RATE_24M_INDEX_TABLE,
78d9829a67f953379b5cab6b78ae8f7a879a591eb1Samuel Ortiz	IWL_RATE_36M_INDEX_TABLE,
79d9829a67f953379b5cab6b78ae8f7a879a591eb1Samuel Ortiz	IWL_RATE_48M_INDEX_TABLE,
80d9829a67f953379b5cab6b78ae8f7a879a591eb1Samuel Ortiz	IWL_RATE_54M_INDEX_TABLE,
81d9829a67f953379b5cab6b78ae8f7a879a591eb1Samuel Ortiz	IWL_RATE_1M_INDEX_TABLE,
82d9829a67f953379b5cab6b78ae8f7a879a591eb1Samuel Ortiz	IWL_RATE_2M_INDEX_TABLE,
83d9829a67f953379b5cab6b78ae8f7a879a591eb1Samuel Ortiz	IWL_RATE_5M_INDEX_TABLE,
84d9829a67f953379b5cab6b78ae8f7a879a591eb1Samuel Ortiz	IWL_RATE_11M_INDEX_TABLE,
85d9829a67f953379b5cab6b78ae8f7a879a591eb1Samuel Ortiz	IWL_RATE_INVM_INDEX_TABLE = IWL_RATE_INVM_INDEX - 1,
86d9829a67f953379b5cab6b78ae8f7a879a591eb1Samuel Ortiz};
87d9829a67f953379b5cab6b78ae8f7a879a591eb1Samuel Ortiz
88d9829a67f953379b5cab6b78ae8f7a879a591eb1Samuel Ortizenum {
89b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_FIRST_OFDM_RATE = IWL_RATE_6M_INDEX,
90b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_LAST_OFDM_RATE = IWL_RATE_60M_INDEX,
91b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_FIRST_CCK_RATE = IWL_RATE_1M_INDEX,
92b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_LAST_CCK_RATE = IWL_RATE_11M_INDEX,
93b481de9ca074528fe8c429604e2777db8b89806aZhu Yi};
94b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
95b481de9ca074528fe8c429604e2777db8b89806aZhu Yi/* #define vs. enum to keep from defaulting to 'large integer' */
968a1b02452862dd30980ad0ef493eed687bc81474Reinette Chatre#define	IWL_RATE_6M_MASK   (1 << IWL_RATE_6M_INDEX)
978a1b02452862dd30980ad0ef493eed687bc81474Reinette Chatre#define	IWL_RATE_9M_MASK   (1 << IWL_RATE_9M_INDEX)
988a1b02452862dd30980ad0ef493eed687bc81474Reinette Chatre#define	IWL_RATE_12M_MASK  (1 << IWL_RATE_12M_INDEX)
998a1b02452862dd30980ad0ef493eed687bc81474Reinette Chatre#define	IWL_RATE_18M_MASK  (1 << IWL_RATE_18M_INDEX)
1008a1b02452862dd30980ad0ef493eed687bc81474Reinette Chatre#define	IWL_RATE_24M_MASK  (1 << IWL_RATE_24M_INDEX)
1018a1b02452862dd30980ad0ef493eed687bc81474Reinette Chatre#define	IWL_RATE_36M_MASK  (1 << IWL_RATE_36M_INDEX)
1028a1b02452862dd30980ad0ef493eed687bc81474Reinette Chatre#define	IWL_RATE_48M_MASK  (1 << IWL_RATE_48M_INDEX)
1038a1b02452862dd30980ad0ef493eed687bc81474Reinette Chatre#define	IWL_RATE_54M_MASK  (1 << IWL_RATE_54M_INDEX)
1048a1b02452862dd30980ad0ef493eed687bc81474Reinette Chatre#define IWL_RATE_60M_MASK  (1 << IWL_RATE_60M_INDEX)
1058a1b02452862dd30980ad0ef493eed687bc81474Reinette Chatre#define	IWL_RATE_1M_MASK   (1 << IWL_RATE_1M_INDEX)
1068a1b02452862dd30980ad0ef493eed687bc81474Reinette Chatre#define	IWL_RATE_2M_MASK   (1 << IWL_RATE_2M_INDEX)
1078a1b02452862dd30980ad0ef493eed687bc81474Reinette Chatre#define	IWL_RATE_5M_MASK   (1 << IWL_RATE_5M_INDEX)
1088a1b02452862dd30980ad0ef493eed687bc81474Reinette Chatre#define	IWL_RATE_11M_MASK  (1 << IWL_RATE_11M_INDEX)
109b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
110e227ceac8429ecd775c213838f0415700727b7b4Tomas Winkler/* uCode API values for legacy bit rates, both OFDM and CCK */
111b481de9ca074528fe8c429604e2777db8b89806aZhu Yienum {
112b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_6M_PLCP  = 13,
113b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_9M_PLCP  = 15,
114b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_12M_PLCP = 5,
115b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_18M_PLCP = 7,
116b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_24M_PLCP = 9,
117b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_36M_PLCP = 11,
118b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_48M_PLCP = 1,
119b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_54M_PLCP = 3,
120fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen	IWL_RATE_60M_PLCP = 3,/*FIXME:RS:should be removed*/
121b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_1M_PLCP  = 10,
122b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_2M_PLCP  = 20,
123b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_5M_PLCP  = 55,
124b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_11M_PLCP = 110,
125fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen	/*FIXME:RS:change to IWL_RATE_LEGACY_??M_PLCP */
126fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen	/*FIXME:RS:add IWL_RATE_LEGACY_INVM_PLCP = 0,*/
127b481de9ca074528fe8c429604e2777db8b89806aZhu Yi};
128b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
129e227ceac8429ecd775c213838f0415700727b7b4Tomas Winkler/* uCode API values for OFDM high-throughput (HT) bit rates */
130b481de9ca074528fe8c429604e2777db8b89806aZhu Yienum {
131b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_SISO_6M_PLCP = 0,
132b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_SISO_12M_PLCP = 1,
133b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_SISO_18M_PLCP = 2,
134b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_SISO_24M_PLCP = 3,
135b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_SISO_36M_PLCP = 4,
136b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_SISO_48M_PLCP = 5,
137b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_SISO_54M_PLCP = 6,
138b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_SISO_60M_PLCP = 7,
139fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen	IWL_RATE_MIMO2_6M_PLCP  = 0x8,
140fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen	IWL_RATE_MIMO2_12M_PLCP = 0x9,
141fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen	IWL_RATE_MIMO2_18M_PLCP = 0xa,
142fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen	IWL_RATE_MIMO2_24M_PLCP = 0xb,
143fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen	IWL_RATE_MIMO2_36M_PLCP = 0xc,
144fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen	IWL_RATE_MIMO2_48M_PLCP = 0xd,
145fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen	IWL_RATE_MIMO2_54M_PLCP = 0xe,
146fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen	IWL_RATE_MIMO2_60M_PLCP = 0xf,
147fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen	IWL_RATE_MIMO3_6M_PLCP  = 0x10,
148fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen	IWL_RATE_MIMO3_12M_PLCP = 0x11,
149fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen	IWL_RATE_MIMO3_18M_PLCP = 0x12,
150fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen	IWL_RATE_MIMO3_24M_PLCP = 0x13,
151fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen	IWL_RATE_MIMO3_36M_PLCP = 0x14,
152fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen	IWL_RATE_MIMO3_48M_PLCP = 0x15,
153fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen	IWL_RATE_MIMO3_54M_PLCP = 0x16,
154fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen	IWL_RATE_MIMO3_60M_PLCP = 0x17,
155b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_SISO_INVM_PLCP,
156fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen	IWL_RATE_MIMO2_INVM_PLCP = IWL_RATE_SISO_INVM_PLCP,
157fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen	IWL_RATE_MIMO3_INVM_PLCP = IWL_RATE_SISO_INVM_PLCP,
158b481de9ca074528fe8c429604e2777db8b89806aZhu Yi};
159b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
1607762635547ad31ecb045e7073989e76ae13e6c54Ben M Cahill/* MAC header values for bit rates */
161b481de9ca074528fe8c429604e2777db8b89806aZhu Yienum {
162b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_6M_IEEE  = 12,
163b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_9M_IEEE  = 18,
164b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_12M_IEEE = 24,
165b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_18M_IEEE = 36,
166b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_24M_IEEE = 48,
167b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_36M_IEEE = 72,
168b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_48M_IEEE = 96,
169b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_54M_IEEE = 108,
170b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_60M_IEEE = 120,
171b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_1M_IEEE  = 2,
172b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_2M_IEEE  = 4,
173b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_5M_IEEE  = 11,
174b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_11M_IEEE = 22,
175b481de9ca074528fe8c429604e2777db8b89806aZhu Yi};
176b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
177b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define IWL_CCK_BASIC_RATES_MASK    \
178b481de9ca074528fe8c429604e2777db8b89806aZhu Yi       (IWL_RATE_1M_MASK          | \
179b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_2M_MASK)
180b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
181b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define IWL_CCK_RATES_MASK          \
1827ae810776a51dc4dc6580013b0f6ba0f34d2b165Johannes Berg       (IWL_CCK_BASIC_RATES_MASK  | \
183b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_5M_MASK          | \
184b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_11M_MASK)
185b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
186b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define IWL_OFDM_BASIC_RATES_MASK   \
187b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	(IWL_RATE_6M_MASK         | \
188b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_12M_MASK         | \
189b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_24M_MASK)
190b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
191b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define IWL_OFDM_RATES_MASK         \
192b481de9ca074528fe8c429604e2777db8b89806aZhu Yi       (IWL_OFDM_BASIC_RATES_MASK | \
193b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_9M_MASK          | \
194b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_18M_MASK         | \
195b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_36M_MASK         | \
196b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_48M_MASK         | \
197b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	IWL_RATE_54M_MASK)
198b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
199b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define IWL_BASIC_RATES_MASK         \
200b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	(IWL_OFDM_BASIC_RATES_MASK | \
201b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	 IWL_CCK_BASIC_RATES_MASK)
202b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
2038a1b02452862dd30980ad0ef493eed687bc81474Reinette Chatre#define IWL_RATES_MASK ((1 << IWL_RATE_COUNT) - 1)
204b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
205b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define IWL_INVALID_VALUE    -1
206b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
207b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define IWL_MIN_RSSI_VAL                 -100
208b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define IWL_MAX_RSSI_VAL                    0
209b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
2107762635547ad31ecb045e7073989e76ae13e6c54Ben M Cahill/* These values specify how many Tx frame attempts before
2117762635547ad31ecb045e7073989e76ae13e6c54Ben M Cahill * searching for a new modulation mode */
212b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define IWL_LEGACY_FAILURE_LIMIT	160
213b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define IWL_LEGACY_SUCCESS_LIMIT	480
214b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define IWL_LEGACY_TABLE_COUNT		160
215b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
216b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define IWL_NONE_LEGACY_FAILURE_LIMIT	400
217b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define IWL_NONE_LEGACY_SUCCESS_LIMIT	4500
218b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define IWL_NONE_LEGACY_TABLE_COUNT	1500
219b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
2207762635547ad31ecb045e7073989e76ae13e6c54Ben M Cahill/* Success ratio (ACKed / attempted tx frames) values (perfect is 128 * 100) */
2217762635547ad31ecb045e7073989e76ae13e6c54Ben M Cahill#define IWL_RS_GOOD_RATIO		12800	/* 100% */
2227762635547ad31ecb045e7073989e76ae13e6c54Ben M Cahill#define IWL_RATE_SCALE_SWITCH		10880	/*  85% */
2237762635547ad31ecb045e7073989e76ae13e6c54Ben M Cahill#define IWL_RATE_HIGH_TH		10880	/*  85% */
2248fe723117a8ef543b6e68ba24e50e1c15250f6c5Wey-Yi Guy#define IWL_RATE_INCREASE_TH		6400	/*  50% */
2257762635547ad31ecb045e7073989e76ae13e6c54Ben M Cahill#define IWL_RATE_DECREASE_TH		1920	/*  15% */
226b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
2277762635547ad31ecb045e7073989e76ae13e6c54Ben M Cahill/* possible actions when in legacy mode */
2283110bef78cb4282c58245bc8fd6d95d9ccb19749Guy Cohen#define IWL_LEGACY_SWITCH_ANTENNA1      0
2293110bef78cb4282c58245bc8fd6d95d9ccb19749Guy Cohen#define IWL_LEGACY_SWITCH_ANTENNA2      1
2303110bef78cb4282c58245bc8fd6d95d9ccb19749Guy Cohen#define IWL_LEGACY_SWITCH_SISO          2
2313110bef78cb4282c58245bc8fd6d95d9ccb19749Guy Cohen#define IWL_LEGACY_SWITCH_MIMO2_AB      3
2323110bef78cb4282c58245bc8fd6d95d9ccb19749Guy Cohen#define IWL_LEGACY_SWITCH_MIMO2_AC      4
2333110bef78cb4282c58245bc8fd6d95d9ccb19749Guy Cohen#define IWL_LEGACY_SWITCH_MIMO2_BC      5
234584a0f00636d34f71a80f5b550a305f1a1620693Wey-Yi Guy#define IWL_LEGACY_SWITCH_MIMO3_ABC     6
2357762635547ad31ecb045e7073989e76ae13e6c54Ben M Cahill
2367762635547ad31ecb045e7073989e76ae13e6c54Ben M Cahill/* possible actions when in siso mode */
2373110bef78cb4282c58245bc8fd6d95d9ccb19749Guy Cohen#define IWL_SISO_SWITCH_ANTENNA1        0
2383110bef78cb4282c58245bc8fd6d95d9ccb19749Guy Cohen#define IWL_SISO_SWITCH_ANTENNA2        1
2393110bef78cb4282c58245bc8fd6d95d9ccb19749Guy Cohen#define IWL_SISO_SWITCH_MIMO2_AB        2
2403110bef78cb4282c58245bc8fd6d95d9ccb19749Guy Cohen#define IWL_SISO_SWITCH_MIMO2_AC        3
2413110bef78cb4282c58245bc8fd6d95d9ccb19749Guy Cohen#define IWL_SISO_SWITCH_MIMO2_BC        4
2423110bef78cb4282c58245bc8fd6d95d9ccb19749Guy Cohen#define IWL_SISO_SWITCH_GI              5
243584a0f00636d34f71a80f5b550a305f1a1620693Wey-Yi Guy#define IWL_SISO_SWITCH_MIMO3_ABC       6
244584a0f00636d34f71a80f5b550a305f1a1620693Wey-Yi Guy
245b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
2467762635547ad31ecb045e7073989e76ae13e6c54Ben M Cahill/* possible actions when in mimo mode */
2473110bef78cb4282c58245bc8fd6d95d9ccb19749Guy Cohen#define IWL_MIMO2_SWITCH_ANTENNA1       0
2483110bef78cb4282c58245bc8fd6d95d9ccb19749Guy Cohen#define IWL_MIMO2_SWITCH_ANTENNA2       1
2493110bef78cb4282c58245bc8fd6d95d9ccb19749Guy Cohen#define IWL_MIMO2_SWITCH_SISO_A         2
2503110bef78cb4282c58245bc8fd6d95d9ccb19749Guy Cohen#define IWL_MIMO2_SWITCH_SISO_B         3
2513110bef78cb4282c58245bc8fd6d95d9ccb19749Guy Cohen#define IWL_MIMO2_SWITCH_SISO_C         4
2523110bef78cb4282c58245bc8fd6d95d9ccb19749Guy Cohen#define IWL_MIMO2_SWITCH_GI             5
253584a0f00636d34f71a80f5b550a305f1a1620693Wey-Yi Guy#define IWL_MIMO2_SWITCH_MIMO3_ABC      6
254584a0f00636d34f71a80f5b550a305f1a1620693Wey-Yi Guy
255584a0f00636d34f71a80f5b550a305f1a1620693Wey-Yi Guy
256584a0f00636d34f71a80f5b550a305f1a1620693Wey-Yi Guy/* possible actions when in mimo3 mode */
257584a0f00636d34f71a80f5b550a305f1a1620693Wey-Yi Guy#define IWL_MIMO3_SWITCH_ANTENNA1       0
258584a0f00636d34f71a80f5b550a305f1a1620693Wey-Yi Guy#define IWL_MIMO3_SWITCH_ANTENNA2       1
259584a0f00636d34f71a80f5b550a305f1a1620693Wey-Yi Guy#define IWL_MIMO3_SWITCH_SISO_A         2
260584a0f00636d34f71a80f5b550a305f1a1620693Wey-Yi Guy#define IWL_MIMO3_SWITCH_SISO_B         3
261584a0f00636d34f71a80f5b550a305f1a1620693Wey-Yi Guy#define IWL_MIMO3_SWITCH_SISO_C         4
262584a0f00636d34f71a80f5b550a305f1a1620693Wey-Yi Guy#define IWL_MIMO3_SWITCH_MIMO2_AB       5
263584a0f00636d34f71a80f5b550a305f1a1620693Wey-Yi Guy#define IWL_MIMO3_SWITCH_MIMO2_AC       6
264584a0f00636d34f71a80f5b550a305f1a1620693Wey-Yi Guy#define IWL_MIMO3_SWITCH_MIMO2_BC       7
265584a0f00636d34f71a80f5b550a305f1a1620693Wey-Yi Guy#define IWL_MIMO3_SWITCH_GI             8
266584a0f00636d34f71a80f5b550a305f1a1620693Wey-Yi Guy
267584a0f00636d34f71a80f5b550a305f1a1620693Wey-Yi Guy
268d6e933993fdad4a270c557fa5317f668bef1d824Mohamed Abbas#define IWL_MAX_11N_MIMO3_SEARCH IWL_MIMO3_SWITCH_GI
269d6e933993fdad4a270c557fa5317f668bef1d824Mohamed Abbas#define IWL_MAX_SEARCH IWL_MIMO2_SWITCH_MIMO3_ABC
270fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen
271a96a27f97f2bbfc1fca54bc3c0b0d41484152740Tomas Winkler/*FIXME:RS:add possible actions for MIMO3*/
272fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen
2737762635547ad31ecb045e7073989e76ae13e6c54Ben M Cahill#define IWL_ACTION_LIMIT		3	/* # possible actions */
2747762635547ad31ecb045e7073989e76ae13e6c54Ben M Cahill
2757762635547ad31ecb045e7073989e76ae13e6c54Ben M Cahill#define LQ_SIZE		2	/* 2 mode tables:  "Active" and "Search" */
276b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
2770c11b4de5d81771ba0fdc8a5d13d59ed01d41252Ron Rindjunsky/* load per tid defines for A-MPDU activation */
2780c11b4de5d81771ba0fdc8a5d13d59ed01d41252Ron Rindjunsky#define IWL_AGG_TPT_THREHOLD	0
2790c11b4de5d81771ba0fdc8a5d13d59ed01d41252Ron Rindjunsky#define IWL_AGG_LOAD_THRESHOLD	10
2800c11b4de5d81771ba0fdc8a5d13d59ed01d41252Ron Rindjunsky#define IWL_AGG_ALL_TID		0xff
2810c11b4de5d81771ba0fdc8a5d13d59ed01d41252Ron Rindjunsky#define TID_QUEUE_CELL_SPACING	50	/*mS */
2820c11b4de5d81771ba0fdc8a5d13d59ed01d41252Ron Rindjunsky#define TID_QUEUE_MAX_SIZE	20
2830c11b4de5d81771ba0fdc8a5d13d59ed01d41252Ron Rindjunsky#define TID_ROUND_VALUE		5	/* mS */
2840c11b4de5d81771ba0fdc8a5d13d59ed01d41252Ron Rindjunsky
2850c11b4de5d81771ba0fdc8a5d13d59ed01d41252Ron Rindjunsky#define TID_MAX_TIME_DIFF ((TID_QUEUE_MAX_SIZE - 1) * TID_QUEUE_CELL_SPACING)
2860c11b4de5d81771ba0fdc8a5d13d59ed01d41252Ron Rindjunsky#define TIME_WRAP_AROUND(x, y) (((y) > (x)) ? (y) - (x) : (0-(x)) + (y))
2870c11b4de5d81771ba0fdc8a5d13d59ed01d41252Ron Rindjunsky
2881826dcc094466a39c82d4370ccfba694be0bc05bTomas Winklerextern const struct iwl_rate_info iwl_rates[IWL_RATE_COUNT];
289b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
290fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohenenum iwl_table_type {
291b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	LQ_NONE,
2927762635547ad31ecb045e7073989e76ae13e6c54Ben M Cahill	LQ_G,		/* legacy types */
293b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	LQ_A,
2947762635547ad31ecb045e7073989e76ae13e6c54Ben M Cahill	LQ_SISO,	/* high-throughput types */
295fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen	LQ_MIMO2,
296fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen	LQ_MIMO3,
297b481de9ca074528fe8c429604e2777db8b89806aZhu Yi	LQ_MAX,
298b481de9ca074528fe8c429604e2777db8b89806aZhu Yi};
299b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
30081cd110d818dd4649cbac17f95f698a24c7acc45Ben M Cahill#define is_legacy(tbl) (((tbl) == LQ_G) || ((tbl) == LQ_A))
301fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen#define is_siso(tbl) ((tbl) == LQ_SISO)
302fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen#define is_mimo2(tbl) ((tbl) == LQ_MIMO2)
303fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen#define is_mimo3(tbl) ((tbl) == LQ_MIMO3)
304fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen#define is_mimo(tbl) (is_mimo2(tbl) || is_mimo3(tbl))
30581cd110d818dd4649cbac17f95f698a24c7acc45Ben M Cahill#define is_Ht(tbl) (is_siso(tbl) || is_mimo(tbl))
306fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen#define is_a_band(tbl) ((tbl) == LQ_A)
307fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen#define is_g_and(tbl) ((tbl) == LQ_G)
308fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen
309fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen#define	ANT_NONE	0x0
310fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen#define	ANT_A		BIT(0)
311fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen#define	ANT_B		BIT(1)
312fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen#define	ANT_AB		(ANT_A | ANT_B)
313fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen#define ANT_C		BIT(2)
314fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen#define	ANT_AC		(ANT_A | ANT_C)
315fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen#define ANT_BC		(ANT_B | ANT_C)
316fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen#define ANT_ABC		(ANT_AB | ANT_C)
317fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen
31812b9681721adb34b7ec42aa973ab96692998153dWey-Yi Guy#define IWL_MAX_MCS_DISPLAY_SIZE	12
31912b9681721adb34b7ec42aa973ab96692998153dWey-Yi Guy
32012b9681721adb34b7ec42aa973ab96692998153dWey-Yi Guystruct iwl_rate_mcs_info {
32112b9681721adb34b7ec42aa973ab96692998153dWey-Yi Guy	char	mbps[IWL_MAX_MCS_DISPLAY_SIZE];
32212b9681721adb34b7ec42aa973ab96692998153dWey-Yi Guy	char	mcs[IWL_MAX_MCS_DISPLAY_SIZE];
32312b9681721adb34b7ec42aa973ab96692998153dWey-Yi Guy};
32412b9681721adb34b7ec42aa973ab96692998153dWey-Yi Guy
325cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre/**
326cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre * struct iwl_rate_scale_data -- tx success history for one rate
327cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre */
328cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatrestruct iwl_rate_scale_data {
329cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	u64 data;		/* bitmap of successful frames */
330cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	s32 success_counter;	/* number of frames successful */
331cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	s32 success_ratio;	/* per-cent * 128  */
332cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	s32 counter;		/* number of frames attempted */
333cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	s32 average_tpt;	/* success ratio * expected throughput */
334cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	unsigned long stamp;
335cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre};
336cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre
337cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre/**
338cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre * struct iwl_scale_tbl_info -- tx params and success history for all rates
339cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre *
340cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre * There are two of these in struct iwl_lq_sta,
341cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre * one for "active", and one for "search".
342cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre */
343cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatrestruct iwl_scale_tbl_info {
344cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	enum iwl_table_type lq_type;
345cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	u8 ant_type;
346cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	u8 is_SGI;	/* 1 = short guard interval */
347cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	u8 is_ht40;	/* 1 = 40 MHz channel width */
348cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	u8 is_dup;	/* 1 = duplicated data streams */
349cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	u8 action;	/* change modulation; IWL_[LEGACY/SISO/MIMO]_SWITCH_* */
350cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	u8 max_search;	/* maximun number of tables we can search */
351cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	s32 *expected_tpt;	/* throughput metrics; expected_tpt_G, etc. */
352cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	u32 current_rate;  /* rate_n_flags, uCode API format */
353cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	struct iwl_rate_scale_data win[IWL_RATE_COUNT]; /* rate histories */
354cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre};
355cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre
356cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatrestruct iwl_traffic_load {
357cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	unsigned long time_stamp;	/* age of the oldest statistics */
358cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	u32 packet_count[TID_QUEUE_MAX_SIZE];   /* packet count in this time
359cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre						 * slice */
360cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	u32 total;			/* total num of packets during the
361cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre					 * last TID_MAX_TIME_DIFF */
362cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	u8 queue_count;			/* number of queues that has
363cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre					 * been used since the last cleanup */
364cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	u8 head;			/* start of the circular buffer */
365cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre};
366cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre
367cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre/**
368cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre * struct iwl_lq_sta -- driver's rate scaling private structure
369cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre *
370cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre * Pointer to this gets passed back and forth between driver and mac80211.
371cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre */
372cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatrestruct iwl_lq_sta {
373cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	u8 active_tbl;		/* index of active table, range 0-1 */
374cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	u8 enable_counter;	/* indicates HT mode */
375cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	u8 stay_in_tbl;		/* 1: disallow, 0: allow search for new mode */
376cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	u8 search_better_tbl;	/* 1: currently trying alternate mode */
377cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	s32 last_tpt;
378cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre
379cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	/* The following determine when to search for a new mode */
380cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	u32 table_count_limit;
381cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	u32 max_failure_limit;	/* # failed frames before new search */
382cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	u32 max_success_limit;	/* # successful frames before new search */
383cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	u32 table_count;
384cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	u32 total_failed;	/* total failed frames, any/all rates */
385cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	u32 total_success;	/* total successful frames, any/all rates */
386cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	u64 flush_timer;	/* time staying in mode before new search */
387cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre
388cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	u8 action_counter;	/* # mode-switch actions tried */
389cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	u8 is_green;
390cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	u8 is_dup;
391cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	enum ieee80211_band band;
392cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre
393cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	/* The following are bitmaps of rates; IWL_RATE_6M_MASK, etc. */
394cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	u32 supp_rates;
395cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	u16 active_legacy_rate;
396cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	u16 active_siso_rate;
397cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	u16 active_mimo2_rate;
398cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	u16 active_mimo3_rate;
399cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	s8 max_rate_idx;     /* Max rate set by user */
400cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	u8 missed_rate_counter;
401cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre
402cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	struct iwl_link_quality_cmd lq;
403cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	struct iwl_scale_tbl_info lq_info[LQ_SIZE]; /* "active", "search" */
404a844855344b035338bfbcb1d2b7ed0aaca241a95Johannes Berg	struct iwl_traffic_load load[IWL_MAX_TID_COUNT];
405cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	u8 tx_agg_tid_en;
406cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre#ifdef CONFIG_MAC80211_DEBUGFS
407cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	struct dentry *rs_sta_dbgfs_scale_table_file;
408cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	struct dentry *rs_sta_dbgfs_stats_table_file;
409cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	struct dentry *rs_sta_dbgfs_rate_scale_data_file;
410cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	struct dentry *rs_sta_dbgfs_tx_agg_tid_en_file;
411cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	u32 dbg_fixed_rate;
412cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre#endif
413cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	struct iwl_priv *drv;
414cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre
415cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	/* used to be in sta_info */
416cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	int last_txrate_idx;
417cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	/* last tx rate_n_flags */
418cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	u32 last_rate_n_flags;
419cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	/* packets destined for this STA are aggregated */
420cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre	u8 is_agg;
421290f599cc6ee8c769355486b7d98fd1dc5115d76Johannes Berg	/* BT traffic this sta was last updated in */
422290f599cc6ee8c769355486b7d98fd1dc5115d76Johannes Berg	u8 last_bt_traffic;
423cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre};
424cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre
425fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohenstatic inline u8 num_of_ant(u8 mask)
426fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen{
427fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen	return  !!((mask) & ANT_A) +
428fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen		!!((mask) & ANT_B) +
429fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen		!!((mask) & ANT_C);
430fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen}
431b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
4325d664a41a0a8c612f66bcb3c2a6f395e9afa6bebTomas Winklerstatic inline u8 first_antenna(u8 mask)
4335d664a41a0a8c612f66bcb3c2a6f395e9afa6bebTomas Winkler{
4345d664a41a0a8c612f66bcb3c2a6f395e9afa6bebTomas Winkler	if (mask & ANT_A)
4355d664a41a0a8c612f66bcb3c2a6f395e9afa6bebTomas Winkler		return ANT_A;
4365d664a41a0a8c612f66bcb3c2a6f395e9afa6bebTomas Winkler	if (mask & ANT_B)
4375d664a41a0a8c612f66bcb3c2a6f395e9afa6bebTomas Winkler		return ANT_B;
4385d664a41a0a8c612f66bcb3c2a6f395e9afa6bebTomas Winkler	return ANT_C;
4395d664a41a0a8c612f66bcb3c2a6f395e9afa6bebTomas Winkler}
4405d664a41a0a8c612f66bcb3c2a6f395e9afa6bebTomas Winkler
4415d664a41a0a8c612f66bcb3c2a6f395e9afa6bebTomas Winkler
442fe6b23dd361199bfbc50b0cbce6bed37c5797c75Reinette Chatre/* Initialize station's rate scaling information after adding station */
443fe6b23dd361199bfbc50b0cbce6bed37c5797c75Reinette Chatreextern void iwl_rs_rate_init(struct iwl_priv *priv,
444fe6b23dd361199bfbc50b0cbce6bed37c5797c75Reinette Chatre			     struct ieee80211_sta *sta, u8 sta_id);
445fe6b23dd361199bfbc50b0cbce6bed37c5797c75Reinette Chatre
446b481de9ca074528fe8c429604e2777db8b89806aZhu Yi/**
447eb4779c40549f8e0dd45c9a30f279134c9a86131Winkler, Tomas * iwl_rate_control_register - Register the rate control algorithm callbacks
448b481de9ca074528fe8c429604e2777db8b89806aZhu Yi *
449b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * Since the rate control algorithm is hardware specific, there is no need
450b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * or reason to place it as a stand alone module.  The driver can call
451eb4779c40549f8e0dd45c9a30f279134c9a86131Winkler, Tomas * iwl_rate_control_register in order to register the rate control callbacks
452b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * with the mac80211 subsystem.  This should be performed prior to calling
453b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * ieee80211_register_hw
454b481de9ca074528fe8c429604e2777db8b89806aZhu Yi *
455b481de9ca074528fe8c429604e2777db8b89806aZhu Yi */
456e227ceac8429ecd775c213838f0415700727b7b4Tomas Winklerextern int iwlagn_rate_control_register(void);
457b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
458b481de9ca074528fe8c429604e2777db8b89806aZhu Yi/**
459eb4779c40549f8e0dd45c9a30f279134c9a86131Winkler, Tomas * iwl_rate_control_unregister - Unregister the rate control callbacks
460b481de9ca074528fe8c429604e2777db8b89806aZhu Yi *
461b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * This should be called after calling ieee80211_unregister_hw, but before
462b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * the driver is unloaded.
463b481de9ca074528fe8c429604e2777db8b89806aZhu Yi */
464e227ceac8429ecd775c213838f0415700727b7b4Tomas Winklerextern void iwlagn_rate_control_unregister(void);
465b481de9ca074528fe8c429604e2777db8b89806aZhu Yi
466e227ceac8429ecd775c213838f0415700727b7b4Tomas Winkler#endif /* __iwl_agn__rs__ */
467