xref: /openbmc/linux/drivers/net/wireless/ath/ath9k/hw.h (revision 203c4805e91786f9a010bc7945a0fde70c9da28e)
1*203c4805SLuis R. Rodriguez /*
2*203c4805SLuis R. Rodriguez  * Copyright (c) 2008-2009 Atheros Communications Inc.
3*203c4805SLuis R. Rodriguez  *
4*203c4805SLuis R. Rodriguez  * Permission to use, copy, modify, and/or distribute this software for any
5*203c4805SLuis R. Rodriguez  * purpose with or without fee is hereby granted, provided that the above
6*203c4805SLuis R. Rodriguez  * copyright notice and this permission notice appear in all copies.
7*203c4805SLuis R. Rodriguez  *
8*203c4805SLuis R. Rodriguez  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9*203c4805SLuis R. Rodriguez  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10*203c4805SLuis R. Rodriguez  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11*203c4805SLuis R. Rodriguez  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12*203c4805SLuis R. Rodriguez  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13*203c4805SLuis R. Rodriguez  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14*203c4805SLuis R. Rodriguez  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15*203c4805SLuis R. Rodriguez  */
16*203c4805SLuis R. Rodriguez 
17*203c4805SLuis R. Rodriguez #ifndef HW_H
18*203c4805SLuis R. Rodriguez #define HW_H
19*203c4805SLuis R. Rodriguez 
20*203c4805SLuis R. Rodriguez #include <linux/if_ether.h>
21*203c4805SLuis R. Rodriguez #include <linux/delay.h>
22*203c4805SLuis R. Rodriguez #include <linux/io.h>
23*203c4805SLuis R. Rodriguez 
24*203c4805SLuis R. Rodriguez #include "mac.h"
25*203c4805SLuis R. Rodriguez #include "ani.h"
26*203c4805SLuis R. Rodriguez #include "eeprom.h"
27*203c4805SLuis R. Rodriguez #include "calib.h"
28*203c4805SLuis R. Rodriguez #include "reg.h"
29*203c4805SLuis R. Rodriguez #include "phy.h"
30*203c4805SLuis R. Rodriguez 
31*203c4805SLuis R. Rodriguez #include "../regd.h"
32*203c4805SLuis R. Rodriguez 
33*203c4805SLuis R. Rodriguez #define ATHEROS_VENDOR_ID	0x168c
34*203c4805SLuis R. Rodriguez #define AR5416_DEVID_PCI	0x0023
35*203c4805SLuis R. Rodriguez #define AR5416_DEVID_PCIE	0x0024
36*203c4805SLuis R. Rodriguez #define AR9160_DEVID_PCI	0x0027
37*203c4805SLuis R. Rodriguez #define AR9280_DEVID_PCI	0x0029
38*203c4805SLuis R. Rodriguez #define AR9280_DEVID_PCIE	0x002a
39*203c4805SLuis R. Rodriguez #define AR9285_DEVID_PCIE	0x002b
40*203c4805SLuis R. Rodriguez #define AR5416_AR9100_DEVID	0x000b
41*203c4805SLuis R. Rodriguez #define	AR_SUBVENDOR_ID_NOG	0x0e11
42*203c4805SLuis R. Rodriguez #define AR_SUBVENDOR_ID_NEW_A	0x7065
43*203c4805SLuis R. Rodriguez #define AR5416_MAGIC		0x19641014
44*203c4805SLuis R. Rodriguez 
45*203c4805SLuis R. Rodriguez /* Register read/write primitives */
46*203c4805SLuis R. Rodriguez #define REG_WRITE(_ah, _reg, _val) ath9k_iowrite32((_ah), (_reg), (_val))
47*203c4805SLuis R. Rodriguez #define REG_READ(_ah, _reg) ath9k_ioread32((_ah), (_reg))
48*203c4805SLuis R. Rodriguez 
49*203c4805SLuis R. Rodriguez #define SM(_v, _f)  (((_v) << _f##_S) & _f)
50*203c4805SLuis R. Rodriguez #define MS(_v, _f)  (((_v) & _f) >> _f##_S)
51*203c4805SLuis R. Rodriguez #define REG_RMW(_a, _r, _set, _clr)    \
52*203c4805SLuis R. Rodriguez 	REG_WRITE(_a, _r, (REG_READ(_a, _r) & ~(_clr)) | (_set))
53*203c4805SLuis R. Rodriguez #define REG_RMW_FIELD(_a, _r, _f, _v) \
54*203c4805SLuis R. Rodriguez 	REG_WRITE(_a, _r, \
55*203c4805SLuis R. Rodriguez 	(REG_READ(_a, _r) & ~_f) | (((_v) << _f##_S) & _f))
56*203c4805SLuis R. Rodriguez #define REG_SET_BIT(_a, _r, _f) \
57*203c4805SLuis R. Rodriguez 	REG_WRITE(_a, _r, REG_READ(_a, _r) | _f)
58*203c4805SLuis R. Rodriguez #define REG_CLR_BIT(_a, _r, _f) \
59*203c4805SLuis R. Rodriguez 	REG_WRITE(_a, _r, REG_READ(_a, _r) & ~_f)
60*203c4805SLuis R. Rodriguez 
61*203c4805SLuis R. Rodriguez #define DO_DELAY(x) do {			\
62*203c4805SLuis R. Rodriguez 		if ((++(x) % 64) == 0)          \
63*203c4805SLuis R. Rodriguez 			udelay(1);		\
64*203c4805SLuis R. Rodriguez 	} while (0)
65*203c4805SLuis R. Rodriguez 
66*203c4805SLuis R. Rodriguez #define REG_WRITE_ARRAY(iniarray, column, regWr) do {                   \
67*203c4805SLuis R. Rodriguez 		int r;							\
68*203c4805SLuis R. Rodriguez 		for (r = 0; r < ((iniarray)->ia_rows); r++) {		\
69*203c4805SLuis R. Rodriguez 			REG_WRITE(ah, INI_RA((iniarray), (r), 0),	\
70*203c4805SLuis R. Rodriguez 				  INI_RA((iniarray), r, (column)));	\
71*203c4805SLuis R. Rodriguez 			DO_DELAY(regWr);				\
72*203c4805SLuis R. Rodriguez 		}							\
73*203c4805SLuis R. Rodriguez 	} while (0)
74*203c4805SLuis R. Rodriguez 
75*203c4805SLuis R. Rodriguez #define AR_GPIO_OUTPUT_MUX_AS_OUTPUT             0
76*203c4805SLuis R. Rodriguez #define AR_GPIO_OUTPUT_MUX_AS_PCIE_ATTENTION_LED 1
77*203c4805SLuis R. Rodriguez #define AR_GPIO_OUTPUT_MUX_AS_PCIE_POWER_LED     2
78*203c4805SLuis R. Rodriguez #define AR_GPIO_OUTPUT_MUX_AS_TX_FRAME           3
79*203c4805SLuis R. Rodriguez #define AR_GPIO_OUTPUT_MUX_AS_MAC_NETWORK_LED    5
80*203c4805SLuis R. Rodriguez #define AR_GPIO_OUTPUT_MUX_AS_MAC_POWER_LED      6
81*203c4805SLuis R. Rodriguez 
82*203c4805SLuis R. Rodriguez #define AR_GPIOD_MASK               0x00001FFF
83*203c4805SLuis R. Rodriguez #define AR_GPIO_BIT(_gpio)          (1 << (_gpio))
84*203c4805SLuis R. Rodriguez 
85*203c4805SLuis R. Rodriguez #define BASE_ACTIVATE_DELAY         100
86*203c4805SLuis R. Rodriguez #define RTC_PLL_SETTLE_DELAY        1000
87*203c4805SLuis R. Rodriguez #define COEF_SCALE_S                24
88*203c4805SLuis R. Rodriguez #define HT40_CHANNEL_CENTER_SHIFT   10
89*203c4805SLuis R. Rodriguez 
90*203c4805SLuis R. Rodriguez #define ATH9K_ANTENNA0_CHAINMASK    0x1
91*203c4805SLuis R. Rodriguez #define ATH9K_ANTENNA1_CHAINMASK    0x2
92*203c4805SLuis R. Rodriguez 
93*203c4805SLuis R. Rodriguez #define ATH9K_NUM_DMA_DEBUG_REGS    8
94*203c4805SLuis R. Rodriguez #define ATH9K_NUM_QUEUES            10
95*203c4805SLuis R. Rodriguez 
96*203c4805SLuis R. Rodriguez #define MAX_RATE_POWER              63
97*203c4805SLuis R. Rodriguez #define AH_WAIT_TIMEOUT             100000 /* (us) */
98*203c4805SLuis R. Rodriguez #define AH_TIME_QUANTUM             10
99*203c4805SLuis R. Rodriguez #define AR_KEYTABLE_SIZE            128
100*203c4805SLuis R. Rodriguez #define POWER_UP_TIME               200000
101*203c4805SLuis R. Rodriguez #define SPUR_RSSI_THRESH            40
102*203c4805SLuis R. Rodriguez 
103*203c4805SLuis R. Rodriguez #define CAB_TIMEOUT_VAL             10
104*203c4805SLuis R. Rodriguez #define BEACON_TIMEOUT_VAL          10
105*203c4805SLuis R. Rodriguez #define MIN_BEACON_TIMEOUT_VAL      1
106*203c4805SLuis R. Rodriguez #define SLEEP_SLOP                  3
107*203c4805SLuis R. Rodriguez 
108*203c4805SLuis R. Rodriguez #define INIT_CONFIG_STATUS          0x00000000
109*203c4805SLuis R. Rodriguez #define INIT_RSSI_THR               0x00000700
110*203c4805SLuis R. Rodriguez #define INIT_BCON_CNTRL_REG         0x00000000
111*203c4805SLuis R. Rodriguez 
112*203c4805SLuis R. Rodriguez #define TU_TO_USEC(_tu)             ((_tu) << 10)
113*203c4805SLuis R. Rodriguez 
114*203c4805SLuis R. Rodriguez enum wireless_mode {
115*203c4805SLuis R. Rodriguez 	ATH9K_MODE_11A = 0,
116*203c4805SLuis R. Rodriguez 	ATH9K_MODE_11B = 2,
117*203c4805SLuis R. Rodriguez 	ATH9K_MODE_11G = 3,
118*203c4805SLuis R. Rodriguez 	ATH9K_MODE_11NA_HT20 = 6,
119*203c4805SLuis R. Rodriguez 	ATH9K_MODE_11NG_HT20 = 7,
120*203c4805SLuis R. Rodriguez 	ATH9K_MODE_11NA_HT40PLUS = 8,
121*203c4805SLuis R. Rodriguez 	ATH9K_MODE_11NA_HT40MINUS = 9,
122*203c4805SLuis R. Rodriguez 	ATH9K_MODE_11NG_HT40PLUS = 10,
123*203c4805SLuis R. Rodriguez 	ATH9K_MODE_11NG_HT40MINUS = 11,
124*203c4805SLuis R. Rodriguez 	ATH9K_MODE_MAX
125*203c4805SLuis R. Rodriguez };
126*203c4805SLuis R. Rodriguez 
127*203c4805SLuis R. Rodriguez enum ath9k_hw_caps {
128*203c4805SLuis R. Rodriguez 	ATH9K_HW_CAP_MIC_AESCCM                 = BIT(0),
129*203c4805SLuis R. Rodriguez 	ATH9K_HW_CAP_MIC_CKIP                   = BIT(1),
130*203c4805SLuis R. Rodriguez 	ATH9K_HW_CAP_MIC_TKIP                   = BIT(2),
131*203c4805SLuis R. Rodriguez 	ATH9K_HW_CAP_CIPHER_AESCCM              = BIT(3),
132*203c4805SLuis R. Rodriguez 	ATH9K_HW_CAP_CIPHER_CKIP                = BIT(4),
133*203c4805SLuis R. Rodriguez 	ATH9K_HW_CAP_CIPHER_TKIP                = BIT(5),
134*203c4805SLuis R. Rodriguez 	ATH9K_HW_CAP_VEOL                       = BIT(6),
135*203c4805SLuis R. Rodriguez 	ATH9K_HW_CAP_BSSIDMASK                  = BIT(7),
136*203c4805SLuis R. Rodriguez 	ATH9K_HW_CAP_MCAST_KEYSEARCH            = BIT(8),
137*203c4805SLuis R. Rodriguez 	ATH9K_HW_CAP_HT                         = BIT(9),
138*203c4805SLuis R. Rodriguez 	ATH9K_HW_CAP_GTT                        = BIT(10),
139*203c4805SLuis R. Rodriguez 	ATH9K_HW_CAP_FASTCC                     = BIT(11),
140*203c4805SLuis R. Rodriguez 	ATH9K_HW_CAP_RFSILENT                   = BIT(12),
141*203c4805SLuis R. Rodriguez 	ATH9K_HW_CAP_CST                        = BIT(13),
142*203c4805SLuis R. Rodriguez 	ATH9K_HW_CAP_ENHANCEDPM                 = BIT(14),
143*203c4805SLuis R. Rodriguez 	ATH9K_HW_CAP_AUTOSLEEP                  = BIT(15),
144*203c4805SLuis R. Rodriguez 	ATH9K_HW_CAP_4KB_SPLITTRANS             = BIT(16),
145*203c4805SLuis R. Rodriguez 	ATH9K_HW_CAP_BT_COEX			= BIT(17)
146*203c4805SLuis R. Rodriguez };
147*203c4805SLuis R. Rodriguez 
148*203c4805SLuis R. Rodriguez enum ath9k_capability_type {
149*203c4805SLuis R. Rodriguez 	ATH9K_CAP_CIPHER = 0,
150*203c4805SLuis R. Rodriguez 	ATH9K_CAP_TKIP_MIC,
151*203c4805SLuis R. Rodriguez 	ATH9K_CAP_TKIP_SPLIT,
152*203c4805SLuis R. Rodriguez 	ATH9K_CAP_DIVERSITY,
153*203c4805SLuis R. Rodriguez 	ATH9K_CAP_TXPOW,
154*203c4805SLuis R. Rodriguez 	ATH9K_CAP_MCAST_KEYSRCH,
155*203c4805SLuis R. Rodriguez 	ATH9K_CAP_DS
156*203c4805SLuis R. Rodriguez };
157*203c4805SLuis R. Rodriguez 
158*203c4805SLuis R. Rodriguez struct ath9k_hw_capabilities {
159*203c4805SLuis R. Rodriguez 	u32 hw_caps; /* ATH9K_HW_CAP_* from ath9k_hw_caps */
160*203c4805SLuis R. Rodriguez 	DECLARE_BITMAP(wireless_modes, ATH9K_MODE_MAX); /* ATH9K_MODE_* */
161*203c4805SLuis R. Rodriguez 	u16 total_queues;
162*203c4805SLuis R. Rodriguez 	u16 keycache_size;
163*203c4805SLuis R. Rodriguez 	u16 low_5ghz_chan, high_5ghz_chan;
164*203c4805SLuis R. Rodriguez 	u16 low_2ghz_chan, high_2ghz_chan;
165*203c4805SLuis R. Rodriguez 	u16 rts_aggr_limit;
166*203c4805SLuis R. Rodriguez 	u8 tx_chainmask;
167*203c4805SLuis R. Rodriguez 	u8 rx_chainmask;
168*203c4805SLuis R. Rodriguez 	u16 tx_triglevel_max;
169*203c4805SLuis R. Rodriguez 	u16 reg_cap;
170*203c4805SLuis R. Rodriguez 	u8 num_gpio_pins;
171*203c4805SLuis R. Rodriguez 	u8 num_antcfg_2ghz;
172*203c4805SLuis R. Rodriguez 	u8 num_antcfg_5ghz;
173*203c4805SLuis R. Rodriguez };
174*203c4805SLuis R. Rodriguez 
175*203c4805SLuis R. Rodriguez struct ath9k_ops_config {
176*203c4805SLuis R. Rodriguez 	int dma_beacon_response_time;
177*203c4805SLuis R. Rodriguez 	int sw_beacon_response_time;
178*203c4805SLuis R. Rodriguez 	int additional_swba_backoff;
179*203c4805SLuis R. Rodriguez 	int ack_6mb;
180*203c4805SLuis R. Rodriguez 	int cwm_ignore_extcca;
181*203c4805SLuis R. Rodriguez 	u8 pcie_powersave_enable;
182*203c4805SLuis R. Rodriguez 	u8 pcie_clock_req;
183*203c4805SLuis R. Rodriguez 	u32 pcie_waen;
184*203c4805SLuis R. Rodriguez 	u8 analog_shiftreg;
185*203c4805SLuis R. Rodriguez 	u8 ht_enable;
186*203c4805SLuis R. Rodriguez 	u32 ofdm_trig_low;
187*203c4805SLuis R. Rodriguez 	u32 ofdm_trig_high;
188*203c4805SLuis R. Rodriguez 	u32 cck_trig_high;
189*203c4805SLuis R. Rodriguez 	u32 cck_trig_low;
190*203c4805SLuis R. Rodriguez 	u32 enable_ani;
191*203c4805SLuis R. Rodriguez 	u16 diversity_control;
192*203c4805SLuis R. Rodriguez 	u16 antenna_switch_swap;
193*203c4805SLuis R. Rodriguez 	int serialize_regmode;
194*203c4805SLuis R. Rodriguez 	bool intr_mitigation;
195*203c4805SLuis R. Rodriguez #define SPUR_DISABLE        	0
196*203c4805SLuis R. Rodriguez #define SPUR_ENABLE_IOCTL   	1
197*203c4805SLuis R. Rodriguez #define SPUR_ENABLE_EEPROM  	2
198*203c4805SLuis R. Rodriguez #define AR_EEPROM_MODAL_SPURS   5
199*203c4805SLuis R. Rodriguez #define AR_SPUR_5413_1      	1640
200*203c4805SLuis R. Rodriguez #define AR_SPUR_5413_2      	1200
201*203c4805SLuis R. Rodriguez #define AR_NO_SPUR      	0x8000
202*203c4805SLuis R. Rodriguez #define AR_BASE_FREQ_2GHZ   	2300
203*203c4805SLuis R. Rodriguez #define AR_BASE_FREQ_5GHZ   	4900
204*203c4805SLuis R. Rodriguez #define AR_SPUR_FEEQ_BOUND_HT40 19
205*203c4805SLuis R. Rodriguez #define AR_SPUR_FEEQ_BOUND_HT20 10
206*203c4805SLuis R. Rodriguez 	int spurmode;
207*203c4805SLuis R. Rodriguez 	u16 spurchans[AR_EEPROM_MODAL_SPURS][2];
208*203c4805SLuis R. Rodriguez };
209*203c4805SLuis R. Rodriguez 
210*203c4805SLuis R. Rodriguez enum ath9k_int {
211*203c4805SLuis R. Rodriguez 	ATH9K_INT_RX = 0x00000001,
212*203c4805SLuis R. Rodriguez 	ATH9K_INT_RXDESC = 0x00000002,
213*203c4805SLuis R. Rodriguez 	ATH9K_INT_RXNOFRM = 0x00000008,
214*203c4805SLuis R. Rodriguez 	ATH9K_INT_RXEOL = 0x00000010,
215*203c4805SLuis R. Rodriguez 	ATH9K_INT_RXORN = 0x00000020,
216*203c4805SLuis R. Rodriguez 	ATH9K_INT_TX = 0x00000040,
217*203c4805SLuis R. Rodriguez 	ATH9K_INT_TXDESC = 0x00000080,
218*203c4805SLuis R. Rodriguez 	ATH9K_INT_TIM_TIMER = 0x00000100,
219*203c4805SLuis R. Rodriguez 	ATH9K_INT_TXURN = 0x00000800,
220*203c4805SLuis R. Rodriguez 	ATH9K_INT_MIB = 0x00001000,
221*203c4805SLuis R. Rodriguez 	ATH9K_INT_RXPHY = 0x00004000,
222*203c4805SLuis R. Rodriguez 	ATH9K_INT_RXKCM = 0x00008000,
223*203c4805SLuis R. Rodriguez 	ATH9K_INT_SWBA = 0x00010000,
224*203c4805SLuis R. Rodriguez 	ATH9K_INT_BMISS = 0x00040000,
225*203c4805SLuis R. Rodriguez 	ATH9K_INT_BNR = 0x00100000,
226*203c4805SLuis R. Rodriguez 	ATH9K_INT_TIM = 0x00200000,
227*203c4805SLuis R. Rodriguez 	ATH9K_INT_DTIM = 0x00400000,
228*203c4805SLuis R. Rodriguez 	ATH9K_INT_DTIMSYNC = 0x00800000,
229*203c4805SLuis R. Rodriguez 	ATH9K_INT_GPIO = 0x01000000,
230*203c4805SLuis R. Rodriguez 	ATH9K_INT_CABEND = 0x02000000,
231*203c4805SLuis R. Rodriguez 	ATH9K_INT_TSFOOR = 0x04000000,
232*203c4805SLuis R. Rodriguez 	ATH9K_INT_CST = 0x10000000,
233*203c4805SLuis R. Rodriguez 	ATH9K_INT_GTT = 0x20000000,
234*203c4805SLuis R. Rodriguez 	ATH9K_INT_FATAL = 0x40000000,
235*203c4805SLuis R. Rodriguez 	ATH9K_INT_GLOBAL = 0x80000000,
236*203c4805SLuis R. Rodriguez 	ATH9K_INT_BMISC = ATH9K_INT_TIM |
237*203c4805SLuis R. Rodriguez 		ATH9K_INT_DTIM |
238*203c4805SLuis R. Rodriguez 		ATH9K_INT_DTIMSYNC |
239*203c4805SLuis R. Rodriguez 		ATH9K_INT_TSFOOR |
240*203c4805SLuis R. Rodriguez 		ATH9K_INT_CABEND,
241*203c4805SLuis R. Rodriguez 	ATH9K_INT_COMMON = ATH9K_INT_RXNOFRM |
242*203c4805SLuis R. Rodriguez 		ATH9K_INT_RXDESC |
243*203c4805SLuis R. Rodriguez 		ATH9K_INT_RXEOL |
244*203c4805SLuis R. Rodriguez 		ATH9K_INT_RXORN |
245*203c4805SLuis R. Rodriguez 		ATH9K_INT_TXURN |
246*203c4805SLuis R. Rodriguez 		ATH9K_INT_TXDESC |
247*203c4805SLuis R. Rodriguez 		ATH9K_INT_MIB |
248*203c4805SLuis R. Rodriguez 		ATH9K_INT_RXPHY |
249*203c4805SLuis R. Rodriguez 		ATH9K_INT_RXKCM |
250*203c4805SLuis R. Rodriguez 		ATH9K_INT_SWBA |
251*203c4805SLuis R. Rodriguez 		ATH9K_INT_BMISS |
252*203c4805SLuis R. Rodriguez 		ATH9K_INT_GPIO,
253*203c4805SLuis R. Rodriguez 	ATH9K_INT_NOCARD = 0xffffffff
254*203c4805SLuis R. Rodriguez };
255*203c4805SLuis R. Rodriguez 
256*203c4805SLuis R. Rodriguez #define CHANNEL_CW_INT    0x00002
257*203c4805SLuis R. Rodriguez #define CHANNEL_CCK       0x00020
258*203c4805SLuis R. Rodriguez #define CHANNEL_OFDM      0x00040
259*203c4805SLuis R. Rodriguez #define CHANNEL_2GHZ      0x00080
260*203c4805SLuis R. Rodriguez #define CHANNEL_5GHZ      0x00100
261*203c4805SLuis R. Rodriguez #define CHANNEL_PASSIVE   0x00200
262*203c4805SLuis R. Rodriguez #define CHANNEL_DYN       0x00400
263*203c4805SLuis R. Rodriguez #define CHANNEL_HALF      0x04000
264*203c4805SLuis R. Rodriguez #define CHANNEL_QUARTER   0x08000
265*203c4805SLuis R. Rodriguez #define CHANNEL_HT20      0x10000
266*203c4805SLuis R. Rodriguez #define CHANNEL_HT40PLUS  0x20000
267*203c4805SLuis R. Rodriguez #define CHANNEL_HT40MINUS 0x40000
268*203c4805SLuis R. Rodriguez 
269*203c4805SLuis R. Rodriguez #define CHANNEL_INTERFERENCE    0x01
270*203c4805SLuis R. Rodriguez #define CHANNEL_DFS             0x02
271*203c4805SLuis R. Rodriguez #define CHANNEL_4MS_LIMIT       0x04
272*203c4805SLuis R. Rodriguez #define CHANNEL_DFS_CLEAR       0x08
273*203c4805SLuis R. Rodriguez #define CHANNEL_DISALLOW_ADHOC  0x10
274*203c4805SLuis R. Rodriguez #define CHANNEL_PER_11D_ADHOC   0x20
275*203c4805SLuis R. Rodriguez 
276*203c4805SLuis R. Rodriguez #define CHANNEL_A           (CHANNEL_5GHZ|CHANNEL_OFDM)
277*203c4805SLuis R. Rodriguez #define CHANNEL_B           (CHANNEL_2GHZ|CHANNEL_CCK)
278*203c4805SLuis R. Rodriguez #define CHANNEL_G           (CHANNEL_2GHZ|CHANNEL_OFDM)
279*203c4805SLuis R. Rodriguez #define CHANNEL_G_HT20      (CHANNEL_2GHZ|CHANNEL_HT20)
280*203c4805SLuis R. Rodriguez #define CHANNEL_A_HT20      (CHANNEL_5GHZ|CHANNEL_HT20)
281*203c4805SLuis R. Rodriguez #define CHANNEL_G_HT40PLUS  (CHANNEL_2GHZ|CHANNEL_HT40PLUS)
282*203c4805SLuis R. Rodriguez #define CHANNEL_G_HT40MINUS (CHANNEL_2GHZ|CHANNEL_HT40MINUS)
283*203c4805SLuis R. Rodriguez #define CHANNEL_A_HT40PLUS  (CHANNEL_5GHZ|CHANNEL_HT40PLUS)
284*203c4805SLuis R. Rodriguez #define CHANNEL_A_HT40MINUS (CHANNEL_5GHZ|CHANNEL_HT40MINUS)
285*203c4805SLuis R. Rodriguez #define CHANNEL_ALL				\
286*203c4805SLuis R. Rodriguez 	(CHANNEL_OFDM|				\
287*203c4805SLuis R. Rodriguez 	 CHANNEL_CCK|				\
288*203c4805SLuis R. Rodriguez 	 CHANNEL_2GHZ |				\
289*203c4805SLuis R. Rodriguez 	 CHANNEL_5GHZ |				\
290*203c4805SLuis R. Rodriguez 	 CHANNEL_HT20 |				\
291*203c4805SLuis R. Rodriguez 	 CHANNEL_HT40PLUS |			\
292*203c4805SLuis R. Rodriguez 	 CHANNEL_HT40MINUS)
293*203c4805SLuis R. Rodriguez 
294*203c4805SLuis R. Rodriguez struct ath9k_channel {
295*203c4805SLuis R. Rodriguez 	struct ieee80211_channel *chan;
296*203c4805SLuis R. Rodriguez 	u16 channel;
297*203c4805SLuis R. Rodriguez 	u32 channelFlags;
298*203c4805SLuis R. Rodriguez 	u32 chanmode;
299*203c4805SLuis R. Rodriguez 	int32_t CalValid;
300*203c4805SLuis R. Rodriguez 	bool oneTimeCalsDone;
301*203c4805SLuis R. Rodriguez 	int8_t iCoff;
302*203c4805SLuis R. Rodriguez 	int8_t qCoff;
303*203c4805SLuis R. Rodriguez 	int16_t rawNoiseFloor;
304*203c4805SLuis R. Rodriguez };
305*203c4805SLuis R. Rodriguez 
306*203c4805SLuis R. Rodriguez #define IS_CHAN_A(_c) ((((_c)->channelFlags & CHANNEL_A) == CHANNEL_A) || \
307*203c4805SLuis R. Rodriguez        (((_c)->channelFlags & CHANNEL_A_HT20) == CHANNEL_A_HT20) || \
308*203c4805SLuis R. Rodriguez        (((_c)->channelFlags & CHANNEL_A_HT40PLUS) == CHANNEL_A_HT40PLUS) || \
309*203c4805SLuis R. Rodriguez        (((_c)->channelFlags & CHANNEL_A_HT40MINUS) == CHANNEL_A_HT40MINUS))
310*203c4805SLuis R. Rodriguez #define IS_CHAN_G(_c) ((((_c)->channelFlags & (CHANNEL_G)) == CHANNEL_G) || \
311*203c4805SLuis R. Rodriguez        (((_c)->channelFlags & CHANNEL_G_HT20) == CHANNEL_G_HT20) || \
312*203c4805SLuis R. Rodriguez        (((_c)->channelFlags & CHANNEL_G_HT40PLUS) == CHANNEL_G_HT40PLUS) || \
313*203c4805SLuis R. Rodriguez        (((_c)->channelFlags & CHANNEL_G_HT40MINUS) == CHANNEL_G_HT40MINUS))
314*203c4805SLuis R. Rodriguez #define IS_CHAN_OFDM(_c) (((_c)->channelFlags & CHANNEL_OFDM) != 0)
315*203c4805SLuis R. Rodriguez #define IS_CHAN_5GHZ(_c) (((_c)->channelFlags & CHANNEL_5GHZ) != 0)
316*203c4805SLuis R. Rodriguez #define IS_CHAN_2GHZ(_c) (((_c)->channelFlags & CHANNEL_2GHZ) != 0)
317*203c4805SLuis R. Rodriguez #define IS_CHAN_PASSIVE(_c) (((_c)->channelFlags & CHANNEL_PASSIVE) != 0)
318*203c4805SLuis R. Rodriguez #define IS_CHAN_HALF_RATE(_c) (((_c)->channelFlags & CHANNEL_HALF) != 0)
319*203c4805SLuis R. Rodriguez #define IS_CHAN_QUARTER_RATE(_c) (((_c)->channelFlags & CHANNEL_QUARTER) != 0)
320*203c4805SLuis R. Rodriguez #define IS_CHAN_A_5MHZ_SPACED(_c)			\
321*203c4805SLuis R. Rodriguez 	((((_c)->channelFlags & CHANNEL_5GHZ) != 0) &&	\
322*203c4805SLuis R. Rodriguez 	 (((_c)->channel % 20) != 0) &&			\
323*203c4805SLuis R. Rodriguez 	 (((_c)->channel % 10) != 0))
324*203c4805SLuis R. Rodriguez 
325*203c4805SLuis R. Rodriguez /* These macros check chanmode and not channelFlags */
326*203c4805SLuis R. Rodriguez #define IS_CHAN_B(_c) ((_c)->chanmode == CHANNEL_B)
327*203c4805SLuis R. Rodriguez #define IS_CHAN_HT20(_c) (((_c)->chanmode == CHANNEL_A_HT20) ||	\
328*203c4805SLuis R. Rodriguez 			  ((_c)->chanmode == CHANNEL_G_HT20))
329*203c4805SLuis R. Rodriguez #define IS_CHAN_HT40(_c) (((_c)->chanmode == CHANNEL_A_HT40PLUS) ||	\
330*203c4805SLuis R. Rodriguez 			  ((_c)->chanmode == CHANNEL_A_HT40MINUS) ||	\
331*203c4805SLuis R. Rodriguez 			  ((_c)->chanmode == CHANNEL_G_HT40PLUS) ||	\
332*203c4805SLuis R. Rodriguez 			  ((_c)->chanmode == CHANNEL_G_HT40MINUS))
333*203c4805SLuis R. Rodriguez #define IS_CHAN_HT(_c) (IS_CHAN_HT20((_c)) || IS_CHAN_HT40((_c)))
334*203c4805SLuis R. Rodriguez 
335*203c4805SLuis R. Rodriguez enum ath9k_power_mode {
336*203c4805SLuis R. Rodriguez 	ATH9K_PM_AWAKE = 0,
337*203c4805SLuis R. Rodriguez 	ATH9K_PM_FULL_SLEEP,
338*203c4805SLuis R. Rodriguez 	ATH9K_PM_NETWORK_SLEEP,
339*203c4805SLuis R. Rodriguez 	ATH9K_PM_UNDEFINED
340*203c4805SLuis R. Rodriguez };
341*203c4805SLuis R. Rodriguez 
342*203c4805SLuis R. Rodriguez enum ath9k_ant_setting {
343*203c4805SLuis R. Rodriguez 	ATH9K_ANT_VARIABLE = 0,
344*203c4805SLuis R. Rodriguez 	ATH9K_ANT_FIXED_A,
345*203c4805SLuis R. Rodriguez 	ATH9K_ANT_FIXED_B
346*203c4805SLuis R. Rodriguez };
347*203c4805SLuis R. Rodriguez 
348*203c4805SLuis R. Rodriguez enum ath9k_tp_scale {
349*203c4805SLuis R. Rodriguez 	ATH9K_TP_SCALE_MAX = 0,
350*203c4805SLuis R. Rodriguez 	ATH9K_TP_SCALE_50,
351*203c4805SLuis R. Rodriguez 	ATH9K_TP_SCALE_25,
352*203c4805SLuis R. Rodriguez 	ATH9K_TP_SCALE_12,
353*203c4805SLuis R. Rodriguez 	ATH9K_TP_SCALE_MIN
354*203c4805SLuis R. Rodriguez };
355*203c4805SLuis R. Rodriguez 
356*203c4805SLuis R. Rodriguez enum ser_reg_mode {
357*203c4805SLuis R. Rodriguez 	SER_REG_MODE_OFF = 0,
358*203c4805SLuis R. Rodriguez 	SER_REG_MODE_ON = 1,
359*203c4805SLuis R. Rodriguez 	SER_REG_MODE_AUTO = 2,
360*203c4805SLuis R. Rodriguez };
361*203c4805SLuis R. Rodriguez 
362*203c4805SLuis R. Rodriguez struct ath9k_beacon_state {
363*203c4805SLuis R. Rodriguez 	u32 bs_nexttbtt;
364*203c4805SLuis R. Rodriguez 	u32 bs_nextdtim;
365*203c4805SLuis R. Rodriguez 	u32 bs_intval;
366*203c4805SLuis R. Rodriguez #define ATH9K_BEACON_PERIOD       0x0000ffff
367*203c4805SLuis R. Rodriguez #define ATH9K_BEACON_ENA          0x00800000
368*203c4805SLuis R. Rodriguez #define ATH9K_BEACON_RESET_TSF    0x01000000
369*203c4805SLuis R. Rodriguez #define ATH9K_TSFOOR_THRESHOLD    0x00004240 /* 16k us */
370*203c4805SLuis R. Rodriguez 	u32 bs_dtimperiod;
371*203c4805SLuis R. Rodriguez 	u16 bs_cfpperiod;
372*203c4805SLuis R. Rodriguez 	u16 bs_cfpmaxduration;
373*203c4805SLuis R. Rodriguez 	u32 bs_cfpnext;
374*203c4805SLuis R. Rodriguez 	u16 bs_timoffset;
375*203c4805SLuis R. Rodriguez 	u16 bs_bmissthreshold;
376*203c4805SLuis R. Rodriguez 	u32 bs_sleepduration;
377*203c4805SLuis R. Rodriguez 	u32 bs_tsfoor_threshold;
378*203c4805SLuis R. Rodriguez };
379*203c4805SLuis R. Rodriguez 
380*203c4805SLuis R. Rodriguez struct chan_centers {
381*203c4805SLuis R. Rodriguez 	u16 synth_center;
382*203c4805SLuis R. Rodriguez 	u16 ctl_center;
383*203c4805SLuis R. Rodriguez 	u16 ext_center;
384*203c4805SLuis R. Rodriguez };
385*203c4805SLuis R. Rodriguez 
386*203c4805SLuis R. Rodriguez enum {
387*203c4805SLuis R. Rodriguez 	ATH9K_RESET_POWER_ON,
388*203c4805SLuis R. Rodriguez 	ATH9K_RESET_WARM,
389*203c4805SLuis R. Rodriguez 	ATH9K_RESET_COLD,
390*203c4805SLuis R. Rodriguez };
391*203c4805SLuis R. Rodriguez 
392*203c4805SLuis R. Rodriguez struct ath9k_hw_version {
393*203c4805SLuis R. Rodriguez 	u32 magic;
394*203c4805SLuis R. Rodriguez 	u16 devid;
395*203c4805SLuis R. Rodriguez 	u16 subvendorid;
396*203c4805SLuis R. Rodriguez 	u32 macVersion;
397*203c4805SLuis R. Rodriguez 	u16 macRev;
398*203c4805SLuis R. Rodriguez 	u16 phyRev;
399*203c4805SLuis R. Rodriguez 	u16 analog5GhzRev;
400*203c4805SLuis R. Rodriguez 	u16 analog2GhzRev;
401*203c4805SLuis R. Rodriguez };
402*203c4805SLuis R. Rodriguez 
403*203c4805SLuis R. Rodriguez struct ath_hw {
404*203c4805SLuis R. Rodriguez 	struct ath_softc *ah_sc;
405*203c4805SLuis R. Rodriguez 	struct ath9k_hw_version hw_version;
406*203c4805SLuis R. Rodriguez 	struct ath9k_ops_config config;
407*203c4805SLuis R. Rodriguez 	struct ath9k_hw_capabilities caps;
408*203c4805SLuis R. Rodriguez 	struct ath_regulatory regulatory;
409*203c4805SLuis R. Rodriguez 	struct ath9k_channel channels[38];
410*203c4805SLuis R. Rodriguez 	struct ath9k_channel *curchan;
411*203c4805SLuis R. Rodriguez 
412*203c4805SLuis R. Rodriguez 	union {
413*203c4805SLuis R. Rodriguez 		struct ar5416_eeprom_def def;
414*203c4805SLuis R. Rodriguez 		struct ar5416_eeprom_4k map4k;
415*203c4805SLuis R. Rodriguez 	} eeprom;
416*203c4805SLuis R. Rodriguez 	const struct eeprom_ops *eep_ops;
417*203c4805SLuis R. Rodriguez 	enum ath9k_eep_map eep_map;
418*203c4805SLuis R. Rodriguez 
419*203c4805SLuis R. Rodriguez 	bool sw_mgmt_crypto;
420*203c4805SLuis R. Rodriguez 	bool is_pciexpress;
421*203c4805SLuis R. Rodriguez 	u8 macaddr[ETH_ALEN];
422*203c4805SLuis R. Rodriguez 	u16 tx_trig_level;
423*203c4805SLuis R. Rodriguez 	u16 rfsilent;
424*203c4805SLuis R. Rodriguez 	u32 rfkill_gpio;
425*203c4805SLuis R. Rodriguez 	u32 rfkill_polarity;
426*203c4805SLuis R. Rodriguez 	u32 btactive_gpio;
427*203c4805SLuis R. Rodriguez 	u32 wlanactive_gpio;
428*203c4805SLuis R. Rodriguez 	u32 ah_flags;
429*203c4805SLuis R. Rodriguez 
430*203c4805SLuis R. Rodriguez 	enum nl80211_iftype opmode;
431*203c4805SLuis R. Rodriguez 	enum ath9k_power_mode power_mode;
432*203c4805SLuis R. Rodriguez 	enum ath9k_power_mode restore_mode;
433*203c4805SLuis R. Rodriguez 
434*203c4805SLuis R. Rodriguez 	struct ath9k_nfcal_hist nfCalHist[NUM_NF_READINGS];
435*203c4805SLuis R. Rodriguez 	struct ar5416Stats stats;
436*203c4805SLuis R. Rodriguez 	struct ath9k_tx_queue_info txq[ATH9K_NUM_TX_QUEUES];
437*203c4805SLuis R. Rodriguez 
438*203c4805SLuis R. Rodriguez 	int16_t curchan_rad_index;
439*203c4805SLuis R. Rodriguez 	u32 mask_reg;
440*203c4805SLuis R. Rodriguez 	u32 txok_interrupt_mask;
441*203c4805SLuis R. Rodriguez 	u32 txerr_interrupt_mask;
442*203c4805SLuis R. Rodriguez 	u32 txdesc_interrupt_mask;
443*203c4805SLuis R. Rodriguez 	u32 txeol_interrupt_mask;
444*203c4805SLuis R. Rodriguez 	u32 txurn_interrupt_mask;
445*203c4805SLuis R. Rodriguez 	bool chip_fullsleep;
446*203c4805SLuis R. Rodriguez 	u32 atim_window;
447*203c4805SLuis R. Rodriguez 	u16 antenna_switch_swap;
448*203c4805SLuis R. Rodriguez 	enum ath9k_ant_setting diversity_control;
449*203c4805SLuis R. Rodriguez 
450*203c4805SLuis R. Rodriguez 	/* Calibration */
451*203c4805SLuis R. Rodriguez 	enum hal_cal_types supp_cals;
452*203c4805SLuis R. Rodriguez 	struct hal_cal_list iq_caldata;
453*203c4805SLuis R. Rodriguez 	struct hal_cal_list adcgain_caldata;
454*203c4805SLuis R. Rodriguez 	struct hal_cal_list adcdc_calinitdata;
455*203c4805SLuis R. Rodriguez 	struct hal_cal_list adcdc_caldata;
456*203c4805SLuis R. Rodriguez 	struct hal_cal_list *cal_list;
457*203c4805SLuis R. Rodriguez 	struct hal_cal_list *cal_list_last;
458*203c4805SLuis R. Rodriguez 	struct hal_cal_list *cal_list_curr;
459*203c4805SLuis R. Rodriguez #define totalPowerMeasI meas0.unsign
460*203c4805SLuis R. Rodriguez #define totalPowerMeasQ meas1.unsign
461*203c4805SLuis R. Rodriguez #define totalIqCorrMeas meas2.sign
462*203c4805SLuis R. Rodriguez #define totalAdcIOddPhase  meas0.unsign
463*203c4805SLuis R. Rodriguez #define totalAdcIEvenPhase meas1.unsign
464*203c4805SLuis R. Rodriguez #define totalAdcQOddPhase  meas2.unsign
465*203c4805SLuis R. Rodriguez #define totalAdcQEvenPhase meas3.unsign
466*203c4805SLuis R. Rodriguez #define totalAdcDcOffsetIOddPhase  meas0.sign
467*203c4805SLuis R. Rodriguez #define totalAdcDcOffsetIEvenPhase meas1.sign
468*203c4805SLuis R. Rodriguez #define totalAdcDcOffsetQOddPhase  meas2.sign
469*203c4805SLuis R. Rodriguez #define totalAdcDcOffsetQEvenPhase meas3.sign
470*203c4805SLuis R. Rodriguez 	union {
471*203c4805SLuis R. Rodriguez 		u32 unsign[AR5416_MAX_CHAINS];
472*203c4805SLuis R. Rodriguez 		int32_t sign[AR5416_MAX_CHAINS];
473*203c4805SLuis R. Rodriguez 	} meas0;
474*203c4805SLuis R. Rodriguez 	union {
475*203c4805SLuis R. Rodriguez 		u32 unsign[AR5416_MAX_CHAINS];
476*203c4805SLuis R. Rodriguez 		int32_t sign[AR5416_MAX_CHAINS];
477*203c4805SLuis R. Rodriguez 	} meas1;
478*203c4805SLuis R. Rodriguez 	union {
479*203c4805SLuis R. Rodriguez 		u32 unsign[AR5416_MAX_CHAINS];
480*203c4805SLuis R. Rodriguez 		int32_t sign[AR5416_MAX_CHAINS];
481*203c4805SLuis R. Rodriguez 	} meas2;
482*203c4805SLuis R. Rodriguez 	union {
483*203c4805SLuis R. Rodriguez 		u32 unsign[AR5416_MAX_CHAINS];
484*203c4805SLuis R. Rodriguez 		int32_t sign[AR5416_MAX_CHAINS];
485*203c4805SLuis R. Rodriguez 	} meas3;
486*203c4805SLuis R. Rodriguez 	u16 cal_samples;
487*203c4805SLuis R. Rodriguez 
488*203c4805SLuis R. Rodriguez 	u32 sta_id1_defaults;
489*203c4805SLuis R. Rodriguez 	u32 misc_mode;
490*203c4805SLuis R. Rodriguez 	enum {
491*203c4805SLuis R. Rodriguez 		AUTO_32KHZ,
492*203c4805SLuis R. Rodriguez 		USE_32KHZ,
493*203c4805SLuis R. Rodriguez 		DONT_USE_32KHZ,
494*203c4805SLuis R. Rodriguez 	} enable_32kHz_clock;
495*203c4805SLuis R. Rodriguez 
496*203c4805SLuis R. Rodriguez 	/* RF */
497*203c4805SLuis R. Rodriguez 	u32 *analogBank0Data;
498*203c4805SLuis R. Rodriguez 	u32 *analogBank1Data;
499*203c4805SLuis R. Rodriguez 	u32 *analogBank2Data;
500*203c4805SLuis R. Rodriguez 	u32 *analogBank3Data;
501*203c4805SLuis R. Rodriguez 	u32 *analogBank6Data;
502*203c4805SLuis R. Rodriguez 	u32 *analogBank6TPCData;
503*203c4805SLuis R. Rodriguez 	u32 *analogBank7Data;
504*203c4805SLuis R. Rodriguez 	u32 *addac5416_21;
505*203c4805SLuis R. Rodriguez 	u32 *bank6Temp;
506*203c4805SLuis R. Rodriguez 
507*203c4805SLuis R. Rodriguez 	int16_t txpower_indexoffset;
508*203c4805SLuis R. Rodriguez 	u32 beacon_interval;
509*203c4805SLuis R. Rodriguez 	u32 slottime;
510*203c4805SLuis R. Rodriguez 	u32 acktimeout;
511*203c4805SLuis R. Rodriguez 	u32 ctstimeout;
512*203c4805SLuis R. Rodriguez 	u32 globaltxtimeout;
513*203c4805SLuis R. Rodriguez 	u8 gbeacon_rate;
514*203c4805SLuis R. Rodriguez 
515*203c4805SLuis R. Rodriguez 	/* ANI */
516*203c4805SLuis R. Rodriguez 	u32 proc_phyerr;
517*203c4805SLuis R. Rodriguez 	bool has_hw_phycounters;
518*203c4805SLuis R. Rodriguez 	u32 aniperiod;
519*203c4805SLuis R. Rodriguez 	struct ar5416AniState *curani;
520*203c4805SLuis R. Rodriguez 	struct ar5416AniState ani[255];
521*203c4805SLuis R. Rodriguez 	int totalSizeDesired[5];
522*203c4805SLuis R. Rodriguez 	int coarse_high[5];
523*203c4805SLuis R. Rodriguez 	int coarse_low[5];
524*203c4805SLuis R. Rodriguez 	int firpwr[5];
525*203c4805SLuis R. Rodriguez 	enum ath9k_ani_cmd ani_function;
526*203c4805SLuis R. Rodriguez 
527*203c4805SLuis R. Rodriguez 	u32 intr_txqs;
528*203c4805SLuis R. Rodriguez 	enum ath9k_ht_extprotspacing extprotspacing;
529*203c4805SLuis R. Rodriguez 	u8 txchainmask;
530*203c4805SLuis R. Rodriguez 	u8 rxchainmask;
531*203c4805SLuis R. Rodriguez 
532*203c4805SLuis R. Rodriguez 	u32 originalGain[22];
533*203c4805SLuis R. Rodriguez 	int initPDADC;
534*203c4805SLuis R. Rodriguez 	int PDADCdelta;
535*203c4805SLuis R. Rodriguez 
536*203c4805SLuis R. Rodriguez 	struct ar5416IniArray iniModes;
537*203c4805SLuis R. Rodriguez 	struct ar5416IniArray iniCommon;
538*203c4805SLuis R. Rodriguez 	struct ar5416IniArray iniBank0;
539*203c4805SLuis R. Rodriguez 	struct ar5416IniArray iniBB_RfGain;
540*203c4805SLuis R. Rodriguez 	struct ar5416IniArray iniBank1;
541*203c4805SLuis R. Rodriguez 	struct ar5416IniArray iniBank2;
542*203c4805SLuis R. Rodriguez 	struct ar5416IniArray iniBank3;
543*203c4805SLuis R. Rodriguez 	struct ar5416IniArray iniBank6;
544*203c4805SLuis R. Rodriguez 	struct ar5416IniArray iniBank6TPC;
545*203c4805SLuis R. Rodriguez 	struct ar5416IniArray iniBank7;
546*203c4805SLuis R. Rodriguez 	struct ar5416IniArray iniAddac;
547*203c4805SLuis R. Rodriguez 	struct ar5416IniArray iniPcieSerdes;
548*203c4805SLuis R. Rodriguez 	struct ar5416IniArray iniModesAdditional;
549*203c4805SLuis R. Rodriguez 	struct ar5416IniArray iniModesRxGain;
550*203c4805SLuis R. Rodriguez 	struct ar5416IniArray iniModesTxGain;
551*203c4805SLuis R. Rodriguez };
552*203c4805SLuis R. Rodriguez 
553*203c4805SLuis R. Rodriguez /* Attach, Detach, Reset */
554*203c4805SLuis R. Rodriguez const char *ath9k_hw_probe(u16 vendorid, u16 devid);
555*203c4805SLuis R. Rodriguez void ath9k_hw_detach(struct ath_hw *ah);
556*203c4805SLuis R. Rodriguez struct ath_hw *ath9k_hw_attach(u16 devid, struct ath_softc *sc, int *error);
557*203c4805SLuis R. Rodriguez void ath9k_hw_rfdetach(struct ath_hw *ah);
558*203c4805SLuis R. Rodriguez int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
559*203c4805SLuis R. Rodriguez 		   bool bChannelChange);
560*203c4805SLuis R. Rodriguez void ath9k_hw_fill_cap_info(struct ath_hw *ah);
561*203c4805SLuis R. Rodriguez bool ath9k_hw_getcapability(struct ath_hw *ah, enum ath9k_capability_type type,
562*203c4805SLuis R. Rodriguez 			    u32 capability, u32 *result);
563*203c4805SLuis R. Rodriguez bool ath9k_hw_setcapability(struct ath_hw *ah, enum ath9k_capability_type type,
564*203c4805SLuis R. Rodriguez 			    u32 capability, u32 setting, int *status);
565*203c4805SLuis R. Rodriguez 
566*203c4805SLuis R. Rodriguez /* Key Cache Management */
567*203c4805SLuis R. Rodriguez bool ath9k_hw_keyreset(struct ath_hw *ah, u16 entry);
568*203c4805SLuis R. Rodriguez bool ath9k_hw_keysetmac(struct ath_hw *ah, u16 entry, const u8 *mac);
569*203c4805SLuis R. Rodriguez bool ath9k_hw_set_keycache_entry(struct ath_hw *ah, u16 entry,
570*203c4805SLuis R. Rodriguez 				 const struct ath9k_keyval *k,
571*203c4805SLuis R. Rodriguez 				 const u8 *mac);
572*203c4805SLuis R. Rodriguez bool ath9k_hw_keyisvalid(struct ath_hw *ah, u16 entry);
573*203c4805SLuis R. Rodriguez 
574*203c4805SLuis R. Rodriguez /* GPIO / RFKILL / Antennae */
575*203c4805SLuis R. Rodriguez void ath9k_hw_cfg_gpio_input(struct ath_hw *ah, u32 gpio);
576*203c4805SLuis R. Rodriguez u32 ath9k_hw_gpio_get(struct ath_hw *ah, u32 gpio);
577*203c4805SLuis R. Rodriguez void ath9k_hw_cfg_output(struct ath_hw *ah, u32 gpio,
578*203c4805SLuis R. Rodriguez 			 u32 ah_signal_type);
579*203c4805SLuis R. Rodriguez void ath9k_hw_set_gpio(struct ath_hw *ah, u32 gpio, u32 val);
580*203c4805SLuis R. Rodriguez #if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE)
581*203c4805SLuis R. Rodriguez void ath9k_enable_rfkill(struct ath_hw *ah);
582*203c4805SLuis R. Rodriguez #endif
583*203c4805SLuis R. Rodriguez u32 ath9k_hw_getdefantenna(struct ath_hw *ah);
584*203c4805SLuis R. Rodriguez void ath9k_hw_setantenna(struct ath_hw *ah, u32 antenna);
585*203c4805SLuis R. Rodriguez bool ath9k_hw_setantennaswitch(struct ath_hw *ah,
586*203c4805SLuis R. Rodriguez 			       enum ath9k_ant_setting settings,
587*203c4805SLuis R. Rodriguez 			       struct ath9k_channel *chan,
588*203c4805SLuis R. Rodriguez 			       u8 *tx_chainmask, u8 *rx_chainmask,
589*203c4805SLuis R. Rodriguez 			       u8 *antenna_cfgd);
590*203c4805SLuis R. Rodriguez 
591*203c4805SLuis R. Rodriguez /* General Operation */
592*203c4805SLuis R. Rodriguez bool ath9k_hw_wait(struct ath_hw *ah, u32 reg, u32 mask, u32 val, u32 timeout);
593*203c4805SLuis R. Rodriguez u32 ath9k_hw_reverse_bits(u32 val, u32 n);
594*203c4805SLuis R. Rodriguez bool ath9k_get_channel_edges(struct ath_hw *ah, u16 flags, u16 *low, u16 *high);
595*203c4805SLuis R. Rodriguez u16 ath9k_hw_computetxtime(struct ath_hw *ah, struct ath_rate_table *rates,
596*203c4805SLuis R. Rodriguez 			   u32 frameLen, u16 rateix, bool shortPreamble);
597*203c4805SLuis R. Rodriguez void ath9k_hw_get_channel_centers(struct ath_hw *ah,
598*203c4805SLuis R. Rodriguez 				  struct ath9k_channel *chan,
599*203c4805SLuis R. Rodriguez 				  struct chan_centers *centers);
600*203c4805SLuis R. Rodriguez u32 ath9k_hw_getrxfilter(struct ath_hw *ah);
601*203c4805SLuis R. Rodriguez void ath9k_hw_setrxfilter(struct ath_hw *ah, u32 bits);
602*203c4805SLuis R. Rodriguez bool ath9k_hw_phy_disable(struct ath_hw *ah);
603*203c4805SLuis R. Rodriguez bool ath9k_hw_disable(struct ath_hw *ah);
604*203c4805SLuis R. Rodriguez bool ath9k_hw_set_txpowerlimit(struct ath_hw *ah, u32 limit);
605*203c4805SLuis R. Rodriguez void ath9k_hw_setmac(struct ath_hw *ah, const u8 *mac);
606*203c4805SLuis R. Rodriguez void ath9k_hw_setopmode(struct ath_hw *ah);
607*203c4805SLuis R. Rodriguez void ath9k_hw_setmcastfilter(struct ath_hw *ah, u32 filter0, u32 filter1);
608*203c4805SLuis R. Rodriguez void ath9k_hw_setbssidmask(struct ath_softc *sc);
609*203c4805SLuis R. Rodriguez void ath9k_hw_write_associd(struct ath_softc *sc);
610*203c4805SLuis R. Rodriguez u64 ath9k_hw_gettsf64(struct ath_hw *ah);
611*203c4805SLuis R. Rodriguez void ath9k_hw_settsf64(struct ath_hw *ah, u64 tsf64);
612*203c4805SLuis R. Rodriguez void ath9k_hw_reset_tsf(struct ath_hw *ah);
613*203c4805SLuis R. Rodriguez bool ath9k_hw_set_tsfadjust(struct ath_hw *ah, u32 setting);
614*203c4805SLuis R. Rodriguez bool ath9k_hw_setslottime(struct ath_hw *ah, u32 us);
615*203c4805SLuis R. Rodriguez void ath9k_hw_set11nmac2040(struct ath_hw *ah, enum ath9k_ht_macmode mode);
616*203c4805SLuis R. Rodriguez void ath9k_hw_beaconinit(struct ath_hw *ah, u32 next_beacon, u32 beacon_period);
617*203c4805SLuis R. Rodriguez void ath9k_hw_set_sta_beacon_timers(struct ath_hw *ah,
618*203c4805SLuis R. Rodriguez 				    const struct ath9k_beacon_state *bs);
619*203c4805SLuis R. Rodriguez bool ath9k_hw_setpower(struct ath_hw *ah,
620*203c4805SLuis R. Rodriguez 		       enum ath9k_power_mode mode);
621*203c4805SLuis R. Rodriguez void ath9k_hw_configpcipowersave(struct ath_hw *ah, int restore);
622*203c4805SLuis R. Rodriguez 
623*203c4805SLuis R. Rodriguez /* Interrupt Handling */
624*203c4805SLuis R. Rodriguez bool ath9k_hw_intrpend(struct ath_hw *ah);
625*203c4805SLuis R. Rodriguez bool ath9k_hw_getisr(struct ath_hw *ah, enum ath9k_int *masked);
626*203c4805SLuis R. Rodriguez enum ath9k_int ath9k_hw_intrget(struct ath_hw *ah);
627*203c4805SLuis R. Rodriguez enum ath9k_int ath9k_hw_set_interrupts(struct ath_hw *ah, enum ath9k_int ints);
628*203c4805SLuis R. Rodriguez 
629*203c4805SLuis R. Rodriguez void ath9k_hw_btcoex_enable(struct ath_hw *ah);
630*203c4805SLuis R. Rodriguez 
631*203c4805SLuis R. Rodriguez #endif
632