xref: /illumos-gate/usr/src/uts/common/io/iwn/if_iwnreg.h (revision fd43cf6e)
1*fd43cf6eSHans Rosenfeld /*	$NetBSD: if_iwnreg.h,v 1.15 2014/11/09 14:40:54 nonaka Exp $	*/
2*fd43cf6eSHans Rosenfeld /*	$OpenBSD: if_iwnreg.h,v 1.49 2014/09/09 18:56:24 sthen Exp $	*/
3*fd43cf6eSHans Rosenfeld 
4*fd43cf6eSHans Rosenfeld /*-
5*fd43cf6eSHans Rosenfeld  * Copyright (c) 2007, 2008
6*fd43cf6eSHans Rosenfeld  *	Damien Bergamini <damien.bergamini@free.fr>
7*fd43cf6eSHans Rosenfeld  *
8*fd43cf6eSHans Rosenfeld  * Permission to use, copy, modify, and distribute this software for any
9*fd43cf6eSHans Rosenfeld  * purpose with or without fee is hereby granted, provided that the above
10*fd43cf6eSHans Rosenfeld  * copyright notice and this permission notice appear in all copies.
11*fd43cf6eSHans Rosenfeld  *
12*fd43cf6eSHans Rosenfeld  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13*fd43cf6eSHans Rosenfeld  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14*fd43cf6eSHans Rosenfeld  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15*fd43cf6eSHans Rosenfeld  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16*fd43cf6eSHans Rosenfeld  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17*fd43cf6eSHans Rosenfeld  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18*fd43cf6eSHans Rosenfeld  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19*fd43cf6eSHans Rosenfeld  */
20*fd43cf6eSHans Rosenfeld 
21*fd43cf6eSHans Rosenfeld /*
22*fd43cf6eSHans Rosenfeld  * Copyright 2016 Hans Rosenfeld <rosenfeld@grumpf.hope-2000.org>
23*fd43cf6eSHans Rosenfeld  */
24*fd43cf6eSHans Rosenfeld 
25*fd43cf6eSHans Rosenfeld #ifndef _IF_IWNREG_H
26*fd43cf6eSHans Rosenfeld #define _IF_IWNREG_H
27*fd43cf6eSHans Rosenfeld 
28*fd43cf6eSHans Rosenfeld /* XXX Added for NetBSD */
29*fd43cf6eSHans Rosenfeld #define IEEE80211_TKIP_MICLEN	8
30*fd43cf6eSHans Rosenfeld 
31*fd43cf6eSHans Rosenfeld #define IWN_TX_RING_COUNT	256
32*fd43cf6eSHans Rosenfeld #define IWN_TX_RING_LOMARK	192
33*fd43cf6eSHans Rosenfeld #define IWN_TX_RING_HIMARK	224
34*fd43cf6eSHans Rosenfeld #define IWN_RX_RING_COUNT_LOG	6
35*fd43cf6eSHans Rosenfeld #define IWN_RX_RING_COUNT	(1 << IWN_RX_RING_COUNT_LOG)
36*fd43cf6eSHans Rosenfeld 
37*fd43cf6eSHans Rosenfeld #define IWN4965_NTXQUEUES	16
38*fd43cf6eSHans Rosenfeld #define IWN5000_NTXQUEUES	20
39*fd43cf6eSHans Rosenfeld 
40*fd43cf6eSHans Rosenfeld #define IWN_CMD_QUEUE_NUM	4
41*fd43cf6eSHans Rosenfeld 
42*fd43cf6eSHans Rosenfeld #define IWN4965_NDMACHNLS	7
43*fd43cf6eSHans Rosenfeld #define IWN5000_NDMACHNLS	8
44*fd43cf6eSHans Rosenfeld 
45*fd43cf6eSHans Rosenfeld #define IWN_SRVC_DMACHNL	9
46*fd43cf6eSHans Rosenfeld 
47*fd43cf6eSHans Rosenfeld #define IWN_KW_SIZE		4096
48*fd43cf6eSHans Rosenfeld 
49*fd43cf6eSHans Rosenfeld #define IWN_ICT_SIZE		4096
50*fd43cf6eSHans Rosenfeld #define IWN_ICT_COUNT		(IWN_ICT_SIZE / sizeof (uint32_t))
51*fd43cf6eSHans Rosenfeld 
52*fd43cf6eSHans Rosenfeld /* Maximum number of DMA segments for TX. */
53*fd43cf6eSHans Rosenfeld #define IWN_MAX_SCATTER	20
54*fd43cf6eSHans Rosenfeld 
55*fd43cf6eSHans Rosenfeld /* RX buffers must be large enough to hold a full 4K A-MPDU. */
56*fd43cf6eSHans Rosenfeld #define IWN_RBUF_SIZE	(4 * 1024)
57*fd43cf6eSHans Rosenfeld 
58*fd43cf6eSHans Rosenfeld #define IWN_TBUF_SIZE	(4 * 1024)
59*fd43cf6eSHans Rosenfeld 
60*fd43cf6eSHans Rosenfeld 
61*fd43cf6eSHans Rosenfeld #if defined(_LP64)
62*fd43cf6eSHans Rosenfeld /* HW supports 36-bit DMA addresses. */
63*fd43cf6eSHans Rosenfeld #define IWN_LOADDR(paddr)	((uint32_t)(paddr))
64*fd43cf6eSHans Rosenfeld #define IWN_HIADDR(paddr)	(((paddr) >> 32) & 0xf)
65*fd43cf6eSHans Rosenfeld #else
66*fd43cf6eSHans Rosenfeld #define IWN_LOADDR(paddr)	(paddr)
67*fd43cf6eSHans Rosenfeld #define IWN_HIADDR(paddr)	(0)
68*fd43cf6eSHans Rosenfeld #endif
69*fd43cf6eSHans Rosenfeld 
70*fd43cf6eSHans Rosenfeld /* Base Address Register. */
71*fd43cf6eSHans Rosenfeld #define IWN_PCI_BAR0	PCI_MAPREG_START
72*fd43cf6eSHans Rosenfeld 
73*fd43cf6eSHans Rosenfeld /*
74*fd43cf6eSHans Rosenfeld  * Control and status registers.
75*fd43cf6eSHans Rosenfeld  */
76*fd43cf6eSHans Rosenfeld #define IWN_HW_IF_CONFIG	0x000
77*fd43cf6eSHans Rosenfeld #define IWN_INT_COALESCING	0x004
78*fd43cf6eSHans Rosenfeld #define IWN_INT_PERIODIC	0x005	/* use IWN_WRITE_1 */
79*fd43cf6eSHans Rosenfeld #define IWN_INT			0x008
80*fd43cf6eSHans Rosenfeld #define IWN_INT_MASK		0x00c
81*fd43cf6eSHans Rosenfeld #define IWN_FH_INT		0x010
82*fd43cf6eSHans Rosenfeld #define IWN_RESET		0x020
83*fd43cf6eSHans Rosenfeld #define IWN_GP_CNTRL		0x024
84*fd43cf6eSHans Rosenfeld #define IWN_HW_REV		0x028
85*fd43cf6eSHans Rosenfeld #define IWN_EEPROM		0x02c
86*fd43cf6eSHans Rosenfeld #define IWN_EEPROM_GP		0x030
87*fd43cf6eSHans Rosenfeld #define IWN_OTP_GP		0x034
88*fd43cf6eSHans Rosenfeld #define IWN_GIO			0x03c
89*fd43cf6eSHans Rosenfeld #define IWN_GP_DRIVER		0x050
90*fd43cf6eSHans Rosenfeld #define IWN_UCODE_GP1_CLR	0x05c
91*fd43cf6eSHans Rosenfeld #define IWN_LED			0x094
92*fd43cf6eSHans Rosenfeld #define IWN_DRAM_INT_TBL	0x0a0
93*fd43cf6eSHans Rosenfeld #define IWN_SHADOW_REG_CTRL	0x0a8
94*fd43cf6eSHans Rosenfeld #define IWN_GIO_CHICKEN		0x100
95*fd43cf6eSHans Rosenfeld #define IWN_ANA_PLL		0x20c
96*fd43cf6eSHans Rosenfeld #define IWN_HW_REV_WA		0x22c
97*fd43cf6eSHans Rosenfeld #define IWN_DBG_HPET_MEM	0x240
98*fd43cf6eSHans Rosenfeld #define IWN_DBG_LINK_PWR_MGMT	0x250
99*fd43cf6eSHans Rosenfeld #define IWN_MEM_RADDR		0x40c
100*fd43cf6eSHans Rosenfeld #define IWN_MEM_WADDR		0x410
101*fd43cf6eSHans Rosenfeld #define IWN_MEM_WDATA		0x418
102*fd43cf6eSHans Rosenfeld #define IWN_MEM_RDATA		0x41c
103*fd43cf6eSHans Rosenfeld #define IWN_PRPH_WADDR  	0x444
104*fd43cf6eSHans Rosenfeld #define IWN_PRPH_RADDR   	0x448
105*fd43cf6eSHans Rosenfeld #define IWN_PRPH_WDATA  	0x44c
106*fd43cf6eSHans Rosenfeld #define IWN_PRPH_RDATA   	0x450
107*fd43cf6eSHans Rosenfeld #define IWN_HBUS_TARG_WRPTR	0x460
108*fd43cf6eSHans Rosenfeld 
109*fd43cf6eSHans Rosenfeld /*
110*fd43cf6eSHans Rosenfeld  * Flow-Handler registers.
111*fd43cf6eSHans Rosenfeld  */
112*fd43cf6eSHans Rosenfeld #define IWN_FH_TFBD_CTRL0(qid)		(0x1900 + (qid) * 8)
113*fd43cf6eSHans Rosenfeld #define IWN_FH_TFBD_CTRL1(qid)		(0x1904 + (qid) * 8)
114*fd43cf6eSHans Rosenfeld #define IWN_FH_KW_ADDR			0x197c
115*fd43cf6eSHans Rosenfeld #define IWN_FH_SRAM_ADDR(qid)		(0x19a4 + (qid) * 4)
116*fd43cf6eSHans Rosenfeld #define IWN_FH_CBBC_QUEUE(qid)		(0x19d0 + (qid) * 4)
117*fd43cf6eSHans Rosenfeld #define IWN_FH_STATUS_WPTR		0x1bc0
118*fd43cf6eSHans Rosenfeld #define IWN_FH_RX_BASE			0x1bc4
119*fd43cf6eSHans Rosenfeld #define IWN_FH_RX_WPTR			0x1bc8
120*fd43cf6eSHans Rosenfeld #define IWN_FH_RX_CONFIG		0x1c00
121*fd43cf6eSHans Rosenfeld #define IWN_FH_RX_STATUS		0x1c44
122*fd43cf6eSHans Rosenfeld #define IWN_FH_TX_CONFIG(qid)		(0x1d00 + (qid) * 32)
123*fd43cf6eSHans Rosenfeld #define IWN_FH_TXBUF_STATUS(qid)	(0x1d08 + (qid) * 32)
124*fd43cf6eSHans Rosenfeld #define IWN_FH_TX_CHICKEN		0x1e98
125*fd43cf6eSHans Rosenfeld #define IWN_FH_TX_STATUS		0x1eb0
126*fd43cf6eSHans Rosenfeld 
127*fd43cf6eSHans Rosenfeld /*
128*fd43cf6eSHans Rosenfeld  * TX scheduler registers.
129*fd43cf6eSHans Rosenfeld  */
130*fd43cf6eSHans Rosenfeld #define IWN_SCHED_BASE			0xa02c00
131*fd43cf6eSHans Rosenfeld #define IWN_SCHED_SRAM_ADDR		(IWN_SCHED_BASE + 0x000)
132*fd43cf6eSHans Rosenfeld #define IWN5000_SCHED_DRAM_ADDR		(IWN_SCHED_BASE + 0x008)
133*fd43cf6eSHans Rosenfeld #define IWN4965_SCHED_DRAM_ADDR		(IWN_SCHED_BASE + 0x010)
134*fd43cf6eSHans Rosenfeld #define IWN5000_SCHED_TXFACT		(IWN_SCHED_BASE + 0x010)
135*fd43cf6eSHans Rosenfeld #define IWN4965_SCHED_TXFACT		(IWN_SCHED_BASE + 0x01c)
136*fd43cf6eSHans Rosenfeld #define IWN4965_SCHED_QUEUE_RDPTR(qid)	(IWN_SCHED_BASE + 0x064 + (qid) * 4)
137*fd43cf6eSHans Rosenfeld #define IWN5000_SCHED_QUEUE_RDPTR(qid)	(IWN_SCHED_BASE + 0x068 + (qid) * 4)
138*fd43cf6eSHans Rosenfeld #define IWN4965_SCHED_QCHAIN_SEL	(IWN_SCHED_BASE + 0x0d0)
139*fd43cf6eSHans Rosenfeld #define IWN4965_SCHED_INTR_MASK		(IWN_SCHED_BASE + 0x0e4)
140*fd43cf6eSHans Rosenfeld #define IWN5000_SCHED_QCHAIN_SEL	(IWN_SCHED_BASE + 0x0e8)
141*fd43cf6eSHans Rosenfeld #define IWN4965_SCHED_QUEUE_STATUS(qid)	(IWN_SCHED_BASE + 0x104 + (qid) * 4)
142*fd43cf6eSHans Rosenfeld #define IWN5000_SCHED_INTR_MASK		(IWN_SCHED_BASE + 0x108)
143*fd43cf6eSHans Rosenfeld #define IWN5000_SCHED_QUEUE_STATUS(qid)	(IWN_SCHED_BASE + 0x10c + (qid) * 4)
144*fd43cf6eSHans Rosenfeld #define IWN5000_SCHED_AGGR_SEL		(IWN_SCHED_BASE + 0x248)
145*fd43cf6eSHans Rosenfeld 
146*fd43cf6eSHans Rosenfeld /*
147*fd43cf6eSHans Rosenfeld  * Offsets in TX scheduler's SRAM.
148*fd43cf6eSHans Rosenfeld  */
149*fd43cf6eSHans Rosenfeld #define IWN4965_SCHED_CTX_OFF		0x380
150*fd43cf6eSHans Rosenfeld #define IWN4965_SCHED_CTX_LEN		416
151*fd43cf6eSHans Rosenfeld #define IWN4965_SCHED_QUEUE_OFFSET(qid)	(0x380 + (qid) * 8)
152*fd43cf6eSHans Rosenfeld #define IWN4965_SCHED_TRANS_TBL(qid)	(0x500 + (qid) * 2)
153*fd43cf6eSHans Rosenfeld #define IWN5000_SCHED_CTX_OFF		0x600
154*fd43cf6eSHans Rosenfeld #define IWN5000_SCHED_CTX_LEN		520
155*fd43cf6eSHans Rosenfeld #define IWN5000_SCHED_QUEUE_OFFSET(qid)	(0x600 + (qid) * 8)
156*fd43cf6eSHans Rosenfeld #define IWN5000_SCHED_TRANS_TBL(qid)	(0x7e0 + (qid) * 2)
157*fd43cf6eSHans Rosenfeld 
158*fd43cf6eSHans Rosenfeld /*
159*fd43cf6eSHans Rosenfeld  * NIC internal memory offsets.
160*fd43cf6eSHans Rosenfeld  */
161*fd43cf6eSHans Rosenfeld #define IWN_APMG_CLK_CTRL	0x3000
162*fd43cf6eSHans Rosenfeld #define IWN_APMG_CLK_EN		0x3004
163*fd43cf6eSHans Rosenfeld #define IWN_APMG_CLK_DIS	0x3008
164*fd43cf6eSHans Rosenfeld #define IWN_APMG_PS		0x300c
165*fd43cf6eSHans Rosenfeld #define IWN_APMG_DIGITAL_SVR	0x3058
166*fd43cf6eSHans Rosenfeld #define IWN_APMG_ANALOG_SVR	0x306c
167*fd43cf6eSHans Rosenfeld #define IWN_APMG_PCI_STT	0x3010
168*fd43cf6eSHans Rosenfeld #define IWN_BSM_WR_CTRL		0x3400
169*fd43cf6eSHans Rosenfeld #define IWN_BSM_WR_MEM_SRC	0x3404
170*fd43cf6eSHans Rosenfeld #define IWN_BSM_WR_MEM_DST	0x3408
171*fd43cf6eSHans Rosenfeld #define IWN_BSM_WR_DWCOUNT	0x340c
172*fd43cf6eSHans Rosenfeld #define IWN_BSM_DRAM_TEXT_ADDR	0x3490
173*fd43cf6eSHans Rosenfeld #define IWN_BSM_DRAM_TEXT_SIZE	0x3494
174*fd43cf6eSHans Rosenfeld #define IWN_BSM_DRAM_DATA_ADDR	0x3498
175*fd43cf6eSHans Rosenfeld #define IWN_BSM_DRAM_DATA_SIZE	0x349c
176*fd43cf6eSHans Rosenfeld #define IWN_BSM_SRAM_BASE	0x3800
177*fd43cf6eSHans Rosenfeld 
178*fd43cf6eSHans Rosenfeld /* Possible flags for register IWN_HW_IF_CONFIG. */
179*fd43cf6eSHans Rosenfeld #define IWN_HW_IF_CONFIG_4965_R		(1 <<  4)
180*fd43cf6eSHans Rosenfeld #define IWN_HW_IF_CONFIG_MAC_SI		(1 <<  8)
181*fd43cf6eSHans Rosenfeld #define IWN_HW_IF_CONFIG_RADIO_SI	(1 <<  9)
182*fd43cf6eSHans Rosenfeld #define IWN_HW_IF_CONFIG_EEPROM_LOCKED	(1 << 21)
183*fd43cf6eSHans Rosenfeld #define IWN_HW_IF_CONFIG_NIC_READY	(1 << 22)
184*fd43cf6eSHans Rosenfeld #define IWN_HW_IF_CONFIG_HAP_WAKE_L1A	(1 << 23)
185*fd43cf6eSHans Rosenfeld #define IWN_HW_IF_CONFIG_PREPARE_DONE	(1 << 25)
186*fd43cf6eSHans Rosenfeld #define IWN_HW_IF_CONFIG_PREPARE	(1 << 27)
187*fd43cf6eSHans Rosenfeld 
188*fd43cf6eSHans Rosenfeld /* Possible values for register IWN_INT_PERIODIC. */
189*fd43cf6eSHans Rosenfeld #define IWN_INT_PERIODIC_DIS	0x00
190*fd43cf6eSHans Rosenfeld #define IWN_INT_PERIODIC_ENA	0xff
191*fd43cf6eSHans Rosenfeld 
192*fd43cf6eSHans Rosenfeld /* Possible flags for registers IWN_PRPH_RADDR/IWN_PRPH_WADDR. */
193*fd43cf6eSHans Rosenfeld #define IWN_PRPH_DWORD	((sizeof (uint32_t) - 1) << 24)
194*fd43cf6eSHans Rosenfeld 
195*fd43cf6eSHans Rosenfeld /* Possible values for IWN_BSM_WR_MEM_DST. */
196*fd43cf6eSHans Rosenfeld #define IWN_FW_TEXT_BASE	0x00000000
197*fd43cf6eSHans Rosenfeld #define IWN_FW_DATA_BASE	0x00800000
198*fd43cf6eSHans Rosenfeld 
199*fd43cf6eSHans Rosenfeld /* Possible flags for register IWN_RESET. */
200*fd43cf6eSHans Rosenfeld #define IWN_RESET_NEVO			(1U << 0)
201*fd43cf6eSHans Rosenfeld #define IWN_RESET_SW			(1U << 7)
202*fd43cf6eSHans Rosenfeld #define IWN_RESET_MASTER_DISABLED	(1U << 8)
203*fd43cf6eSHans Rosenfeld #define IWN_RESET_STOP_MASTER		(1U << 9)
204*fd43cf6eSHans Rosenfeld #define IWN_RESET_LINK_PWR_MGMT_DIS	(1U << 31)
205*fd43cf6eSHans Rosenfeld 
206*fd43cf6eSHans Rosenfeld /* Possible flags for register IWN_GP_CNTRL. */
207*fd43cf6eSHans Rosenfeld #define IWN_GP_CNTRL_MAC_ACCESS_ENA	(1 << 0)
208*fd43cf6eSHans Rosenfeld #define IWN_GP_CNTRL_MAC_CLOCK_READY	(1 << 0)
209*fd43cf6eSHans Rosenfeld #define IWN_GP_CNTRL_INIT_DONE		(1 << 2)
210*fd43cf6eSHans Rosenfeld #define IWN_GP_CNTRL_MAC_ACCESS_REQ	(1 << 3)
211*fd43cf6eSHans Rosenfeld #define IWN_GP_CNTRL_SLEEP		(1 << 4)
212*fd43cf6eSHans Rosenfeld #define IWN_GP_CNTRL_RFKILL		(1 << 27)
213*fd43cf6eSHans Rosenfeld 
214*fd43cf6eSHans Rosenfeld /* Possible flags for register IWN_HW_REV. */
215*fd43cf6eSHans Rosenfeld #define IWN_HW_REV_TYPE_SHIFT	4
216*fd43cf6eSHans Rosenfeld #define IWN_HW_REV_TYPE_MASK	0x000001f0
217*fd43cf6eSHans Rosenfeld #define IWN_HW_REV_TYPE_4965	0
218*fd43cf6eSHans Rosenfeld #define IWN_HW_REV_TYPE_5300	2
219*fd43cf6eSHans Rosenfeld #define IWN_HW_REV_TYPE_5350	3
220*fd43cf6eSHans Rosenfeld #define IWN_HW_REV_TYPE_5150	4
221*fd43cf6eSHans Rosenfeld #define IWN_HW_REV_TYPE_5100	5
222*fd43cf6eSHans Rosenfeld #define IWN_HW_REV_TYPE_1000	6
223*fd43cf6eSHans Rosenfeld #define IWN_HW_REV_TYPE_6000	7
224*fd43cf6eSHans Rosenfeld #define IWN_HW_REV_TYPE_6050	8
225*fd43cf6eSHans Rosenfeld #define IWN_HW_REV_TYPE_6005	11
226*fd43cf6eSHans Rosenfeld /* Types 6030 and 6035 also return 11 */
227*fd43cf6eSHans Rosenfeld #define IWN_HW_REV_TYPE_2030	12
228*fd43cf6eSHans Rosenfeld #define IWN_HW_REV_TYPE_2000	16
229*fd43cf6eSHans Rosenfeld #define IWN_HW_REV_TYPE_105	17
230*fd43cf6eSHans Rosenfeld #define IWN_HW_REV_TYPE_135	18
231*fd43cf6eSHans Rosenfeld 
232*fd43cf6eSHans Rosenfeld /* Possible flags for register IWN_GIO_CHICKEN. */
233*fd43cf6eSHans Rosenfeld #define IWN_GIO_CHICKEN_L1A_NO_L0S_RX	(1 << 23)
234*fd43cf6eSHans Rosenfeld #define IWN_GIO_CHICKEN_DIS_L0S_TIMER	(1 << 29)
235*fd43cf6eSHans Rosenfeld 
236*fd43cf6eSHans Rosenfeld /* Possible flags for register IWN_GIO. */
237*fd43cf6eSHans Rosenfeld #define IWN_GIO_L0S_ENA		(1 << 1)
238*fd43cf6eSHans Rosenfeld 
239*fd43cf6eSHans Rosenfeld /* Possible flags for register IWN_GP_DRIVER. */
240*fd43cf6eSHans Rosenfeld #define IWN_GP_DRIVER_RADIO_3X3_HYB	(0 << 0)
241*fd43cf6eSHans Rosenfeld #define IWN_GP_DRIVER_RADIO_2X2_HYB	(1 << 0)
242*fd43cf6eSHans Rosenfeld #define IWN_GP_DRIVER_RADIO_2X2_IPA	(2 << 0)
243*fd43cf6eSHans Rosenfeld #define IWN_GP_DRIVER_CALIB_VER6	(1 << 2)
244*fd43cf6eSHans Rosenfeld #define IWN_GP_DRIVER_6050_1X2		(1 << 3)
245*fd43cf6eSHans Rosenfeld #define IWN_GP_DRIVER_RADIO_IQ_INVERT	(1 << 7)
246*fd43cf6eSHans Rosenfeld 
247*fd43cf6eSHans Rosenfeld /* Possible flags for register IWN_UCODE_GP1_CLR. */
248*fd43cf6eSHans Rosenfeld #define IWN_UCODE_GP1_RFKILL		(1 << 1)
249*fd43cf6eSHans Rosenfeld #define IWN_UCODE_GP1_CMD_BLOCKED	(1 << 2)
250*fd43cf6eSHans Rosenfeld #define IWN_UCODE_GP1_CTEMP_STOP_RF	(1 << 3)
251*fd43cf6eSHans Rosenfeld 
252*fd43cf6eSHans Rosenfeld /* Possible flags/values for register IWN_LED. */
253*fd43cf6eSHans Rosenfeld #define IWN_LED_BSM_CTRL	(1 << 5)
254*fd43cf6eSHans Rosenfeld #define IWN_LED_OFF		0x00000038
255*fd43cf6eSHans Rosenfeld #define IWN_LED_ON		0x00000078
256*fd43cf6eSHans Rosenfeld 
257*fd43cf6eSHans Rosenfeld /* Possible flags for register IWN_DRAM_INT_TBL. */
258*fd43cf6eSHans Rosenfeld #define IWN_DRAM_INT_TBL_WRAP_CHECK	(1 << 27)
259*fd43cf6eSHans Rosenfeld #define IWN_DRAM_INT_TBL_ENABLE		(1 << 31)
260*fd43cf6eSHans Rosenfeld 
261*fd43cf6eSHans Rosenfeld /* Possible values for register IWN_ANA_PLL. */
262*fd43cf6eSHans Rosenfeld #define IWN_ANA_PLL_INIT	0x00880300
263*fd43cf6eSHans Rosenfeld 
264*fd43cf6eSHans Rosenfeld /* Possible flags for register IWN_FH_RX_STATUS. */
265*fd43cf6eSHans Rosenfeld #define	IWN_FH_RX_STATUS_IDLE	(1 << 24)
266*fd43cf6eSHans Rosenfeld 
267*fd43cf6eSHans Rosenfeld /* Possible flags for register IWN_BSM_WR_CTRL. */
268*fd43cf6eSHans Rosenfeld #define IWN_BSM_WR_CTRL_START_EN	(1 << 30)
269*fd43cf6eSHans Rosenfeld #define IWN_BSM_WR_CTRL_START		(1 << 31)
270*fd43cf6eSHans Rosenfeld 
271*fd43cf6eSHans Rosenfeld /* Possible flags for register IWN_INT. */
272*fd43cf6eSHans Rosenfeld #define IWN_INT_ALIVE		(1 <<  0)
273*fd43cf6eSHans Rosenfeld #define IWN_INT_WAKEUP		(1 <<  1)
274*fd43cf6eSHans Rosenfeld #define IWN_INT_SW_RX		(1 <<  3)
275*fd43cf6eSHans Rosenfeld #define IWN_INT_CT_REACHED	(1 <<  6)
276*fd43cf6eSHans Rosenfeld #define IWN_INT_RF_TOGGLED	(1 <<  7)
277*fd43cf6eSHans Rosenfeld #define IWN_INT_SW_ERR		(1 << 25)
278*fd43cf6eSHans Rosenfeld #define IWN_INT_SCHED		(1 << 26)
279*fd43cf6eSHans Rosenfeld #define IWN_INT_FH_TX		(1 << 27)
280*fd43cf6eSHans Rosenfeld #define IWN_INT_RX_PERIODIC	(1 << 28)
281*fd43cf6eSHans Rosenfeld #define IWN_INT_HW_ERR		(1 << 29)
282*fd43cf6eSHans Rosenfeld #define IWN_INT_FH_RX		(1U << 31)
283*fd43cf6eSHans Rosenfeld 
284*fd43cf6eSHans Rosenfeld /* Shortcut. */
285*fd43cf6eSHans Rosenfeld #define IWN_INT_MASK_DEF						\
286*fd43cf6eSHans Rosenfeld 	(IWN_INT_SW_ERR | IWN_INT_HW_ERR | IWN_INT_FH_TX |		\
287*fd43cf6eSHans Rosenfeld 	 IWN_INT_FH_RX | IWN_INT_ALIVE | IWN_INT_WAKEUP |		\
288*fd43cf6eSHans Rosenfeld 	 IWN_INT_SW_RX | IWN_INT_CT_REACHED | IWN_INT_RF_TOGGLED)
289*fd43cf6eSHans Rosenfeld 
290*fd43cf6eSHans Rosenfeld /* Possible flags for register IWN_FH_INT. */
291*fd43cf6eSHans Rosenfeld #define IWN_FH_INT_TX_CHNL(x)	(1 << (x))
292*fd43cf6eSHans Rosenfeld #define IWN_FH_INT_RX_CHNL(x)	(1 << ((x) + 16))
293*fd43cf6eSHans Rosenfeld #define IWN_FH_INT_HI_PRIOR	(1 << 30)
294*fd43cf6eSHans Rosenfeld /* Shortcuts for the above. */
295*fd43cf6eSHans Rosenfeld #define IWN_FH_INT_TX							\
296*fd43cf6eSHans Rosenfeld 	(IWN_FH_INT_TX_CHNL(0) | IWN_FH_INT_TX_CHNL(1))
297*fd43cf6eSHans Rosenfeld #define IWN_FH_INT_RX							\
298*fd43cf6eSHans Rosenfeld 	(IWN_FH_INT_RX_CHNL(0) | IWN_FH_INT_RX_CHNL(1) | IWN_FH_INT_HI_PRIOR)
299*fd43cf6eSHans Rosenfeld 
300*fd43cf6eSHans Rosenfeld /* Possible flags/values for register IWN_FH_TX_CONFIG. */
301*fd43cf6eSHans Rosenfeld #define IWN_FH_TX_CONFIG_DMA_PAUSE		0
302*fd43cf6eSHans Rosenfeld #define IWN_FH_TX_CONFIG_DMA_ENA		(1U << 31)
303*fd43cf6eSHans Rosenfeld #define IWN_FH_TX_CONFIG_CIRQ_HOST_ENDTFD	(1U << 20)
304*fd43cf6eSHans Rosenfeld 
305*fd43cf6eSHans Rosenfeld /* Possible flags/values for register IWN_FH_TXBUF_STATUS. */
306*fd43cf6eSHans Rosenfeld #define IWN_FH_TXBUF_STATUS_TBNUM(x)	((x) << 20)
307*fd43cf6eSHans Rosenfeld #define IWN_FH_TXBUF_STATUS_TBIDX(x)	((x) << 12)
308*fd43cf6eSHans Rosenfeld #define IWN_FH_TXBUF_STATUS_TFBD_VALID	3
309*fd43cf6eSHans Rosenfeld 
310*fd43cf6eSHans Rosenfeld /* Possible flags for register IWN_FH_TX_CHICKEN. */
311*fd43cf6eSHans Rosenfeld #define IWN_FH_TX_CHICKEN_SCHED_RETRY	(1 << 1)
312*fd43cf6eSHans Rosenfeld 
313*fd43cf6eSHans Rosenfeld /* Possible flags for register IWN_FH_TX_STATUS. */
314*fd43cf6eSHans Rosenfeld #define IWN_FH_TX_STATUS_IDLE(chnl)	(1 << ((chnl) + 16))
315*fd43cf6eSHans Rosenfeld 
316*fd43cf6eSHans Rosenfeld /* Possible flags for register IWN_FH_RX_CONFIG. */
317*fd43cf6eSHans Rosenfeld #define IWN_FH_RX_CONFIG_ENA		(1U << 31)
318*fd43cf6eSHans Rosenfeld #define IWN_FH_RX_CONFIG_NRBD(x)	((x) << 20)
319*fd43cf6eSHans Rosenfeld #define IWN_FH_RX_CONFIG_RB_SIZE_8K	(1U << 16)
320*fd43cf6eSHans Rosenfeld #define IWN_FH_RX_CONFIG_SINGLE_FRAME	(1U << 15)
321*fd43cf6eSHans Rosenfeld #define IWN_FH_RX_CONFIG_IRQ_DST_HOST	(1U << 12)
322*fd43cf6eSHans Rosenfeld #define IWN_FH_RX_CONFIG_RB_TIMEOUT(x)	((x) << 4)
323*fd43cf6eSHans Rosenfeld #define IWN_FH_RX_CONFIG_IGN_RXF_EMPTY	(1U <<  2)
324*fd43cf6eSHans Rosenfeld 
325*fd43cf6eSHans Rosenfeld /* Possible flags for register IWN_FH_TX_CONFIG. */
326*fd43cf6eSHans Rosenfeld #define IWN_FH_TX_CONFIG_DMA_ENA	(1U << 31)
327*fd43cf6eSHans Rosenfeld #define IWN_FH_TX_CONFIG_DMA_CREDIT_ENA	(1U <<  3)
328*fd43cf6eSHans Rosenfeld 
329*fd43cf6eSHans Rosenfeld /* Possible flags for register IWN_EEPROM. */
330*fd43cf6eSHans Rosenfeld #define IWN_EEPROM_READ_VALID	(1 << 0)
331*fd43cf6eSHans Rosenfeld #define IWN_EEPROM_CMD		(1 << 1)
332*fd43cf6eSHans Rosenfeld 
333*fd43cf6eSHans Rosenfeld /* Possible flags for register IWN_EEPROM_GP. */
334*fd43cf6eSHans Rosenfeld #define IWN_EEPROM_GP_IF_OWNER	0x00000180
335*fd43cf6eSHans Rosenfeld 
336*fd43cf6eSHans Rosenfeld /* Possible flags for register IWN_OTP_GP. */
337*fd43cf6eSHans Rosenfeld #define IWN_OTP_GP_DEV_SEL_OTP		(1 << 16)
338*fd43cf6eSHans Rosenfeld #define IWN_OTP_GP_RELATIVE_ACCESS	(1 << 17)
339*fd43cf6eSHans Rosenfeld #define IWN_OTP_GP_ECC_CORR_STTS	(1 << 20)
340*fd43cf6eSHans Rosenfeld #define IWN_OTP_GP_ECC_UNCORR_STTS	(1 << 21)
341*fd43cf6eSHans Rosenfeld 
342*fd43cf6eSHans Rosenfeld /* Possible flags for register IWN_SCHED_QUEUE_STATUS. */
343*fd43cf6eSHans Rosenfeld #define IWN4965_TXQ_STATUS_ACTIVE	0x0007fc01
344*fd43cf6eSHans Rosenfeld #define IWN4965_TXQ_STATUS_INACTIVE	0x0007fc00
345*fd43cf6eSHans Rosenfeld #define IWN4965_TXQ_STATUS_AGGR_ENA	(1 << 5 | 1 << 8)
346*fd43cf6eSHans Rosenfeld #define IWN4965_TXQ_STATUS_CHGACT	(1 << 10)
347*fd43cf6eSHans Rosenfeld #define IWN5000_TXQ_STATUS_ACTIVE	0x00ff0018
348*fd43cf6eSHans Rosenfeld #define IWN5000_TXQ_STATUS_INACTIVE	0x00ff0010
349*fd43cf6eSHans Rosenfeld #define IWN5000_TXQ_STATUS_CHGACT	(1 << 19)
350*fd43cf6eSHans Rosenfeld 
351*fd43cf6eSHans Rosenfeld /* Possible flags for registers IWN_APMG_CLK_*. */
352*fd43cf6eSHans Rosenfeld #define IWN_APMG_CLK_CTRL_DMA_CLK_RQT	(1 <<  9)
353*fd43cf6eSHans Rosenfeld #define IWN_APMG_CLK_CTRL_BSM_CLK_RQT	(1 << 11)
354*fd43cf6eSHans Rosenfeld 
355*fd43cf6eSHans Rosenfeld /* Possible flags for register IWN_APMG_PS. */
356*fd43cf6eSHans Rosenfeld #define IWN_APMG_PS_EARLY_PWROFF_DIS	(1 << 22)
357*fd43cf6eSHans Rosenfeld #define IWN_APMG_PS_PWR_SRC(x)		((x) << 24)
358*fd43cf6eSHans Rosenfeld #define IWN_APMG_PS_PWR_SRC_VMAIN	0
359*fd43cf6eSHans Rosenfeld #define IWN_APMG_PS_PWR_SRC_VAUX	2
360*fd43cf6eSHans Rosenfeld #define IWN_APMG_PS_PWR_SRC_MASK	IWN_APMG_PS_PWR_SRC(3)
361*fd43cf6eSHans Rosenfeld #define IWN_APMG_PS_RESET_REQ		(1 << 26)
362*fd43cf6eSHans Rosenfeld 
363*fd43cf6eSHans Rosenfeld /* Possible flags for register IWN_APMG_DIGITAL_SVR. */
364*fd43cf6eSHans Rosenfeld #define IWN_APMG_DIGITAL_SVR_VOLTAGE(x)		(((x) & 0xf) << 5)
365*fd43cf6eSHans Rosenfeld #define IWN_APMG_DIGITAL_SVR_VOLTAGE_MASK	\
366*fd43cf6eSHans Rosenfeld 	IWN_APMG_DIGITAL_SVR_VOLTAGE(0xf)
367*fd43cf6eSHans Rosenfeld #define IWN_APMG_DIGITAL_SVR_VOLTAGE_1_32	\
368*fd43cf6eSHans Rosenfeld 	IWN_APMG_DIGITAL_SVR_VOLTAGE(3)
369*fd43cf6eSHans Rosenfeld 
370*fd43cf6eSHans Rosenfeld /* Possible flags for IWN_APMG_PCI_STT. */
371*fd43cf6eSHans Rosenfeld #define IWN_APMG_PCI_STT_L1A_DIS	(1 << 11)
372*fd43cf6eSHans Rosenfeld 
373*fd43cf6eSHans Rosenfeld /* Possible flags for register IWN_BSM_DRAM_TEXT_SIZE. */
374*fd43cf6eSHans Rosenfeld #define IWN_FW_UPDATED	(1U << 31)
375*fd43cf6eSHans Rosenfeld 
376*fd43cf6eSHans Rosenfeld #define IWN_SCHED_WINSZ		64
377*fd43cf6eSHans Rosenfeld #define IWN_SCHED_LIMIT		64
378*fd43cf6eSHans Rosenfeld #define IWN4965_SCHED_COUNT	512
379*fd43cf6eSHans Rosenfeld #define IWN5000_SCHED_COUNT	(IWN_TX_RING_COUNT + IWN_SCHED_WINSZ)
380*fd43cf6eSHans Rosenfeld #define IWN4965_SCHEDSZ		(IWN4965_NTXQUEUES * IWN4965_SCHED_COUNT * 2)
381*fd43cf6eSHans Rosenfeld #define IWN5000_SCHEDSZ		(IWN5000_NTXQUEUES * IWN5000_SCHED_COUNT * 2)
382*fd43cf6eSHans Rosenfeld 
383*fd43cf6eSHans Rosenfeld struct iwn_tx_desc {
384*fd43cf6eSHans Rosenfeld 	uint8_t		reserved1[3];
385*fd43cf6eSHans Rosenfeld 	uint8_t		nsegs;
386*fd43cf6eSHans Rosenfeld 	struct {
387*fd43cf6eSHans Rosenfeld 		uint32_t	addr;
388*fd43cf6eSHans Rosenfeld 		uint16_t	len;
389*fd43cf6eSHans Rosenfeld 	} __packed	segs[IWN_MAX_SCATTER];
390*fd43cf6eSHans Rosenfeld 	/* Pad to 128 bytes. */
391*fd43cf6eSHans Rosenfeld 	uint32_t	reserved2;
392*fd43cf6eSHans Rosenfeld } __packed;
393*fd43cf6eSHans Rosenfeld 
394*fd43cf6eSHans Rosenfeld struct iwn_rx_status {
395*fd43cf6eSHans Rosenfeld 	uint16_t	closed_count;
396*fd43cf6eSHans Rosenfeld 	uint16_t	closed_rx_count;
397*fd43cf6eSHans Rosenfeld 	uint16_t	finished_count;
398*fd43cf6eSHans Rosenfeld 	uint16_t	finished_rx_count;
399*fd43cf6eSHans Rosenfeld 	uint32_t	reserved[2];
400*fd43cf6eSHans Rosenfeld } __packed;
401*fd43cf6eSHans Rosenfeld 
402*fd43cf6eSHans Rosenfeld struct iwn_rx_desc {
403*fd43cf6eSHans Rosenfeld 	uint32_t	len;
404*fd43cf6eSHans Rosenfeld 	uint8_t		type;
405*fd43cf6eSHans Rosenfeld #define IWN_UC_READY			  1
406*fd43cf6eSHans Rosenfeld #define IWN_ADD_NODE_DONE		 24
407*fd43cf6eSHans Rosenfeld #define IWN_TX_DONE			 28
408*fd43cf6eSHans Rosenfeld #define IWN5000_CALIBRATION_RESULT	102
409*fd43cf6eSHans Rosenfeld #define IWN5000_CALIBRATION_DONE	103
410*fd43cf6eSHans Rosenfeld #define IWN_START_SCAN			130
411*fd43cf6eSHans Rosenfeld #define IWN_STOP_SCAN			132
412*fd43cf6eSHans Rosenfeld #define IWN_RX_STATISTICS		156
413*fd43cf6eSHans Rosenfeld #define IWN_BEACON_STATISTICS		157
414*fd43cf6eSHans Rosenfeld #define IWN_STATE_CHANGED		161
415*fd43cf6eSHans Rosenfeld #define IWN_BEACON_MISSED		162
416*fd43cf6eSHans Rosenfeld #define IWN_RX_PHY			192
417*fd43cf6eSHans Rosenfeld #define IWN_MPDU_RX_DONE		193
418*fd43cf6eSHans Rosenfeld #define IWN_RX_DONE			195
419*fd43cf6eSHans Rosenfeld #define IWN_RX_COMPRESSED_BA		197
420*fd43cf6eSHans Rosenfeld 
421*fd43cf6eSHans Rosenfeld 	uint8_t		flags;
422*fd43cf6eSHans Rosenfeld 	uint8_t		idx;
423*fd43cf6eSHans Rosenfeld 	uint8_t		qid;
424*fd43cf6eSHans Rosenfeld } __packed;
425*fd43cf6eSHans Rosenfeld 
426*fd43cf6eSHans Rosenfeld /* Possible RX status flags. */
427*fd43cf6eSHans Rosenfeld #define IWN_RX_NO_CRC_ERR	(1 <<  0)
428*fd43cf6eSHans Rosenfeld #define IWN_RX_NO_OVFL_ERR	(1 <<  1)
429*fd43cf6eSHans Rosenfeld /* Shortcut for the above. */
430*fd43cf6eSHans Rosenfeld #define IWN_RX_NOERROR	(IWN_RX_NO_CRC_ERR | IWN_RX_NO_OVFL_ERR)
431*fd43cf6eSHans Rosenfeld #define IWN_RX_MPDU_MIC_OK	(1 <<  6)
432*fd43cf6eSHans Rosenfeld #define IWN_RX_CIPHER_MASK	(7 <<  8)
433*fd43cf6eSHans Rosenfeld #define IWN_RX_CIPHER_CCMP	(2 <<  8)
434*fd43cf6eSHans Rosenfeld #define IWN_RX_MPDU_DEC		(1 << 11)
435*fd43cf6eSHans Rosenfeld #define IWN_RX_DECRYPT_MASK	(3 << 11)
436*fd43cf6eSHans Rosenfeld #define IWN_RX_DECRYPT_OK	(3 << 11)
437*fd43cf6eSHans Rosenfeld 
438*fd43cf6eSHans Rosenfeld struct iwn_tx_cmd {
439*fd43cf6eSHans Rosenfeld 	uint8_t	code;
440*fd43cf6eSHans Rosenfeld #define IWN_CMD_RXON			 16
441*fd43cf6eSHans Rosenfeld #define IWN_CMD_RXON_ASSOC		 17
442*fd43cf6eSHans Rosenfeld #define IWN_CMD_EDCA_PARAMS		 19
443*fd43cf6eSHans Rosenfeld #define IWN_CMD_TIMING			 20
444*fd43cf6eSHans Rosenfeld #define IWN_CMD_ADD_NODE		 24
445*fd43cf6eSHans Rosenfeld #define IWN_CMD_TX_DATA			 28
446*fd43cf6eSHans Rosenfeld #define IWN_CMD_SET_LED			 72
447*fd43cf6eSHans Rosenfeld #define IWN_CMD_LINK_QUALITY		 78
448*fd43cf6eSHans Rosenfeld #define IWN5000_CMD_WIMAX_COEX		 90
449*fd43cf6eSHans Rosenfeld #define IWN5000_CMD_CALIB_CONFIG	101
450*fd43cf6eSHans Rosenfeld #define IWN_CMD_SET_POWER_MODE		119
451*fd43cf6eSHans Rosenfeld #define IWN_CMD_SCAN			128
452*fd43cf6eSHans Rosenfeld #define IWN_CMD_TXPOWER_DBM		149
453*fd43cf6eSHans Rosenfeld #define IWN_CMD_TXPOWER			151
454*fd43cf6eSHans Rosenfeld #define IWN5000_CMD_TX_ANT_CONFIG	152
455*fd43cf6eSHans Rosenfeld #define IWN_CMD_BT_COEX			155
456*fd43cf6eSHans Rosenfeld #define IWN_CMD_GET_STATISTICS		156
457*fd43cf6eSHans Rosenfeld #define IWN_CMD_SET_CRITICAL_TEMP	164
458*fd43cf6eSHans Rosenfeld #define IWN_CMD_SET_SENSITIVITY		168
459*fd43cf6eSHans Rosenfeld #define IWN_CMD_PHY_CALIB		176
460*fd43cf6eSHans Rosenfeld #define IWN_CMD_BT_COEX_PRIO_TABLE	204
461*fd43cf6eSHans Rosenfeld #define IWN_CMD_BT_COEX_PROT		205
462*fd43cf6eSHans Rosenfeld 
463*fd43cf6eSHans Rosenfeld 	uint8_t	flags;
464*fd43cf6eSHans Rosenfeld 	uint8_t	idx;
465*fd43cf6eSHans Rosenfeld 	uint8_t	qid;
466*fd43cf6eSHans Rosenfeld 	uint8_t	data[136];
467*fd43cf6eSHans Rosenfeld } __packed;
468*fd43cf6eSHans Rosenfeld 
469*fd43cf6eSHans Rosenfeld /* Antenna flags, used in various commands. */
470*fd43cf6eSHans Rosenfeld #define IWN_ANT_A	(1 << 0)
471*fd43cf6eSHans Rosenfeld #define IWN_ANT_B	(1 << 1)
472*fd43cf6eSHans Rosenfeld #define IWN_ANT_C	(1 << 2)
473*fd43cf6eSHans Rosenfeld /* Shortcuts. */
474*fd43cf6eSHans Rosenfeld #define IWN_ANT_AB	(IWN_ANT_A | IWN_ANT_B)
475*fd43cf6eSHans Rosenfeld #define IWN_ANT_BC	(IWN_ANT_B | IWN_ANT_C)
476*fd43cf6eSHans Rosenfeld #define IWN_ANT_ABC	(IWN_ANT_A | IWN_ANT_B | IWN_ANT_C)
477*fd43cf6eSHans Rosenfeld 
478*fd43cf6eSHans Rosenfeld /* Structure for command IWN_CMD_RXON. */
479*fd43cf6eSHans Rosenfeld struct iwn_rxon {
480*fd43cf6eSHans Rosenfeld 	uint8_t		myaddr[IEEE80211_ADDR_LEN];
481*fd43cf6eSHans Rosenfeld 	uint16_t	reserved1;
482*fd43cf6eSHans Rosenfeld 	uint8_t		bssid[IEEE80211_ADDR_LEN];
483*fd43cf6eSHans Rosenfeld 	uint16_t	reserved2;
484*fd43cf6eSHans Rosenfeld 	uint8_t		wlap[IEEE80211_ADDR_LEN];
485*fd43cf6eSHans Rosenfeld 	uint16_t	reserved3;
486*fd43cf6eSHans Rosenfeld 	uint8_t		mode;
487*fd43cf6eSHans Rosenfeld #define IWN_MODE_HOSTAP		1
488*fd43cf6eSHans Rosenfeld #define IWN_MODE_STA		3
489*fd43cf6eSHans Rosenfeld #define IWN_MODE_IBSS		4
490*fd43cf6eSHans Rosenfeld #define IWN_MODE_MONITOR	6
491*fd43cf6eSHans Rosenfeld 
492*fd43cf6eSHans Rosenfeld 	uint8_t		air;
493*fd43cf6eSHans Rosenfeld 	uint16_t	rxchain;
494*fd43cf6eSHans Rosenfeld #define IWN_RXCHAIN_DRIVER_FORCE	(1 << 0)
495*fd43cf6eSHans Rosenfeld #define IWN_RXCHAIN_VALID(x)		(((x) & IWN_ANT_ABC) << 1)
496*fd43cf6eSHans Rosenfeld #define IWN_RXCHAIN_FORCE_SEL(x)	(((x) & IWN_ANT_ABC) << 4)
497*fd43cf6eSHans Rosenfeld #define IWN_RXCHAIN_FORCE_MIMO_SEL(x)	(((x) & IWN_ANT_ABC) << 7)
498*fd43cf6eSHans Rosenfeld #define IWN_RXCHAIN_IDLE_COUNT(x)	((x) << 10)
499*fd43cf6eSHans Rosenfeld #define IWN_RXCHAIN_MIMO_COUNT(x)	((x) << 12)
500*fd43cf6eSHans Rosenfeld #define IWN_RXCHAIN_MIMO_FORCE		(1 << 14)
501*fd43cf6eSHans Rosenfeld 
502*fd43cf6eSHans Rosenfeld 	uint8_t		ofdm_mask;
503*fd43cf6eSHans Rosenfeld 	uint8_t		cck_mask;
504*fd43cf6eSHans Rosenfeld 	uint16_t	associd;
505*fd43cf6eSHans Rosenfeld 	uint32_t	flags;
506*fd43cf6eSHans Rosenfeld #define IWN_RXON_24GHZ		(1 <<  0)
507*fd43cf6eSHans Rosenfeld #define IWN_RXON_CCK		(1 <<  1)
508*fd43cf6eSHans Rosenfeld #define IWN_RXON_AUTO		(1 <<  2)
509*fd43cf6eSHans Rosenfeld #define IWN_RXON_SHSLOT		(1 <<  4)
510*fd43cf6eSHans Rosenfeld #define IWN_RXON_SHPREAMBLE	(1 <<  5)
511*fd43cf6eSHans Rosenfeld #define IWN_RXON_NODIVERSITY	(1 <<  7)
512*fd43cf6eSHans Rosenfeld #define IWN_RXON_ANTENNA_A	(1 <<  8)
513*fd43cf6eSHans Rosenfeld #define IWN_RXON_ANTENNA_B	(1 <<  9)
514*fd43cf6eSHans Rosenfeld #define IWN_RXON_TSF		(1 << 15)
515*fd43cf6eSHans Rosenfeld #define IWN_RXON_CTS_TO_SELF	(1 << 30)
516*fd43cf6eSHans Rosenfeld 
517*fd43cf6eSHans Rosenfeld 	uint32_t	filter;
518*fd43cf6eSHans Rosenfeld #define IWN_FILTER_PROMISC	(1 << 0)
519*fd43cf6eSHans Rosenfeld #define IWN_FILTER_CTL		(1 << 1)
520*fd43cf6eSHans Rosenfeld #define IWN_FILTER_MULTICAST	(1 << 2)
521*fd43cf6eSHans Rosenfeld #define IWN_FILTER_NODECRYPT	(1 << 3)
522*fd43cf6eSHans Rosenfeld #define IWN_FILTER_MC_NODECRYPT	(1 << 4)
523*fd43cf6eSHans Rosenfeld #define IWN_FILTER_BSS		(1 << 5)
524*fd43cf6eSHans Rosenfeld #define IWN_FILTER_BEACON	(1 << 6)
525*fd43cf6eSHans Rosenfeld 
526*fd43cf6eSHans Rosenfeld 	uint8_t		chan;
527*fd43cf6eSHans Rosenfeld 	uint8_t		reserved4;
528*fd43cf6eSHans Rosenfeld 	uint8_t		ht_single_mask;
529*fd43cf6eSHans Rosenfeld 	uint8_t		ht_dual_mask;
530*fd43cf6eSHans Rosenfeld 	/* The following fields are for >=5000 Series only. */
531*fd43cf6eSHans Rosenfeld 	uint8_t		ht_triple_mask;
532*fd43cf6eSHans Rosenfeld 	uint8_t		reserved5;
533*fd43cf6eSHans Rosenfeld 	uint16_t	acquisition;
534*fd43cf6eSHans Rosenfeld 	uint16_t	reserved6;
535*fd43cf6eSHans Rosenfeld } __packed;
536*fd43cf6eSHans Rosenfeld 
537*fd43cf6eSHans Rosenfeld #define IWN4965_RXONSZ	(sizeof (struct iwn_rxon) - 6)
538*fd43cf6eSHans Rosenfeld #define IWN5000_RXONSZ	(sizeof (struct iwn_rxon))
539*fd43cf6eSHans Rosenfeld 
540*fd43cf6eSHans Rosenfeld /* Structure for command IWN_CMD_ASSOCIATE. */
541*fd43cf6eSHans Rosenfeld struct iwn_assoc {
542*fd43cf6eSHans Rosenfeld 	uint32_t	flags;
543*fd43cf6eSHans Rosenfeld 	uint32_t	filter;
544*fd43cf6eSHans Rosenfeld 	uint8_t		ofdm_mask;
545*fd43cf6eSHans Rosenfeld 	uint8_t		cck_mask;
546*fd43cf6eSHans Rosenfeld 	uint16_t	reserved;
547*fd43cf6eSHans Rosenfeld } __packed;
548*fd43cf6eSHans Rosenfeld 
549*fd43cf6eSHans Rosenfeld /* Structure for command IWN_CMD_EDCA_PARAMS. */
550*fd43cf6eSHans Rosenfeld struct iwn_edca_params {
551*fd43cf6eSHans Rosenfeld 	uint32_t	flags;
552*fd43cf6eSHans Rosenfeld #define IWN_EDCA_UPDATE	(1 << 0)
553*fd43cf6eSHans Rosenfeld #define IWN_EDCA_TXOP	(1 << 4)
554*fd43cf6eSHans Rosenfeld 
555*fd43cf6eSHans Rosenfeld 	struct {
556*fd43cf6eSHans Rosenfeld 		uint16_t	cwmin;
557*fd43cf6eSHans Rosenfeld 		uint16_t	cwmax;
558*fd43cf6eSHans Rosenfeld 		uint8_t		aifsn;
559*fd43cf6eSHans Rosenfeld 		uint8_t		reserved;
560*fd43cf6eSHans Rosenfeld 		uint16_t	txoplimit;
561*fd43cf6eSHans Rosenfeld 	} __packed	ac[WME_NUM_AC];
562*fd43cf6eSHans Rosenfeld } __packed;
563*fd43cf6eSHans Rosenfeld 
564*fd43cf6eSHans Rosenfeld /* Structure for command IWN_CMD_TIMING. */
565*fd43cf6eSHans Rosenfeld struct iwn_cmd_timing {
566*fd43cf6eSHans Rosenfeld 	uint64_t	tstamp;
567*fd43cf6eSHans Rosenfeld 	uint16_t	bintval;
568*fd43cf6eSHans Rosenfeld 	uint16_t	atim;
569*fd43cf6eSHans Rosenfeld 	uint32_t	binitval;
570*fd43cf6eSHans Rosenfeld 	uint16_t	lintval;
571*fd43cf6eSHans Rosenfeld 	uint16_t	reserved;
572*fd43cf6eSHans Rosenfeld } __packed;
573*fd43cf6eSHans Rosenfeld 
574*fd43cf6eSHans Rosenfeld /* Structure for command IWN_CMD_ADD_NODE. */
575*fd43cf6eSHans Rosenfeld struct iwn_node_info {
576*fd43cf6eSHans Rosenfeld 	uint8_t		control;
577*fd43cf6eSHans Rosenfeld #define IWN_NODE_UPDATE		(1 << 0)
578*fd43cf6eSHans Rosenfeld 
579*fd43cf6eSHans Rosenfeld 	uint8_t		reserved1[3];
580*fd43cf6eSHans Rosenfeld 
581*fd43cf6eSHans Rosenfeld 	uint8_t		macaddr[IEEE80211_ADDR_LEN];
582*fd43cf6eSHans Rosenfeld 	uint16_t	reserved2;
583*fd43cf6eSHans Rosenfeld 	uint8_t		id;
584*fd43cf6eSHans Rosenfeld #define IWN_ID_BSS		 0
585*fd43cf6eSHans Rosenfeld #define IWN5000_ID_BROADCAST	15
586*fd43cf6eSHans Rosenfeld #define IWN4965_ID_BROADCAST	31
587*fd43cf6eSHans Rosenfeld 
588*fd43cf6eSHans Rosenfeld 	uint8_t		flags;
589*fd43cf6eSHans Rosenfeld #define IWN_FLAG_SET_KEY		(1 << 0)
590*fd43cf6eSHans Rosenfeld #define IWN_FLAG_SET_DISABLE_TID	(1 << 1)
591*fd43cf6eSHans Rosenfeld #define IWN_FLAG_SET_TXRATE		(1 << 2)
592*fd43cf6eSHans Rosenfeld #define IWN_FLAG_SET_ADDBA		(1 << 3)
593*fd43cf6eSHans Rosenfeld #define IWN_FLAG_SET_DELBA		(1 << 4)
594*fd43cf6eSHans Rosenfeld 
595*fd43cf6eSHans Rosenfeld 	uint16_t	reserved3;
596*fd43cf6eSHans Rosenfeld 	uint16_t	kflags;
597*fd43cf6eSHans Rosenfeld #define IWN_KFLAG_CCMP		(1 <<  1)
598*fd43cf6eSHans Rosenfeld #define IWN_KFLAG_MAP		(1 <<  3)
599*fd43cf6eSHans Rosenfeld #define IWN_KFLAG_KID(kid)	((kid) << 8)
600*fd43cf6eSHans Rosenfeld #define IWN_KFLAG_INVALID	(1 << 11)
601*fd43cf6eSHans Rosenfeld #define IWN_KFLAG_GROUP		(1 << 14)
602*fd43cf6eSHans Rosenfeld 
603*fd43cf6eSHans Rosenfeld 	uint8_t		tsc2;	/* TKIP TSC2 */
604*fd43cf6eSHans Rosenfeld 	uint8_t		reserved4;
605*fd43cf6eSHans Rosenfeld 	uint16_t	ttak[5];
606*fd43cf6eSHans Rosenfeld 	uint8_t		kid;
607*fd43cf6eSHans Rosenfeld 	uint8_t		reserved5;
608*fd43cf6eSHans Rosenfeld 	uint8_t		key[16];
609*fd43cf6eSHans Rosenfeld 	/* The following 3 fields are for 5000 Series only. */
610*fd43cf6eSHans Rosenfeld 	uint64_t	tsc;
611*fd43cf6eSHans Rosenfeld 	uint8_t		rxmic[IEEE80211_TKIP_MICLEN];
612*fd43cf6eSHans Rosenfeld 	uint8_t		txmic[IEEE80211_TKIP_MICLEN];
613*fd43cf6eSHans Rosenfeld 
614*fd43cf6eSHans Rosenfeld 	uint32_t	htflags;
615*fd43cf6eSHans Rosenfeld #define IWN_AMDPU_SIZE_FACTOR(x)	((x) << 19)
616*fd43cf6eSHans Rosenfeld #define IWN_AMDPU_DENSITY(x)		((x) << 23)
617*fd43cf6eSHans Rosenfeld 
618*fd43cf6eSHans Rosenfeld 	uint32_t	mask;
619*fd43cf6eSHans Rosenfeld 	uint16_t	disable_tid;
620*fd43cf6eSHans Rosenfeld 	uint16_t	reserved6;
621*fd43cf6eSHans Rosenfeld 	uint8_t		addba_tid;
622*fd43cf6eSHans Rosenfeld 	uint8_t		delba_tid;
623*fd43cf6eSHans Rosenfeld 	uint16_t	addba_ssn;
624*fd43cf6eSHans Rosenfeld 	uint32_t	reserved7;
625*fd43cf6eSHans Rosenfeld } __packed;
626*fd43cf6eSHans Rosenfeld 
627*fd43cf6eSHans Rosenfeld struct iwn4965_node_info {
628*fd43cf6eSHans Rosenfeld 	uint8_t		control;
629*fd43cf6eSHans Rosenfeld 	uint8_t		reserved1[3];
630*fd43cf6eSHans Rosenfeld 	uint8_t		macaddr[IEEE80211_ADDR_LEN];
631*fd43cf6eSHans Rosenfeld 	uint16_t	reserved2;
632*fd43cf6eSHans Rosenfeld 	uint8_t		id;
633*fd43cf6eSHans Rosenfeld 	uint8_t		flags;
634*fd43cf6eSHans Rosenfeld 	uint16_t	reserved3;
635*fd43cf6eSHans Rosenfeld 	uint16_t	kflags;
636*fd43cf6eSHans Rosenfeld 	uint8_t		tsc2;	/* TKIP TSC2 */
637*fd43cf6eSHans Rosenfeld 	uint8_t		reserved4;
638*fd43cf6eSHans Rosenfeld 	uint16_t	ttak[5];
639*fd43cf6eSHans Rosenfeld 	uint8_t		kid;
640*fd43cf6eSHans Rosenfeld 	uint8_t		reserved5;
641*fd43cf6eSHans Rosenfeld 	uint8_t		key[16];
642*fd43cf6eSHans Rosenfeld 	uint32_t	htflags;
643*fd43cf6eSHans Rosenfeld 	uint32_t	mask;
644*fd43cf6eSHans Rosenfeld 	uint16_t	disable_tid;
645*fd43cf6eSHans Rosenfeld 	uint16_t	reserved6;
646*fd43cf6eSHans Rosenfeld 	uint8_t		addba_tid;
647*fd43cf6eSHans Rosenfeld 	uint8_t		delba_tid;
648*fd43cf6eSHans Rosenfeld 	uint16_t	addba_ssn;
649*fd43cf6eSHans Rosenfeld 	uint32_t	reserved7;
650*fd43cf6eSHans Rosenfeld } __packed;
651*fd43cf6eSHans Rosenfeld 
652*fd43cf6eSHans Rosenfeld #define IWN_RFLAG_CCK		(1 << 1)
653*fd43cf6eSHans Rosenfeld #define IWN_RFLAG_ANT(x)	((x) << 6)
654*fd43cf6eSHans Rosenfeld 
655*fd43cf6eSHans Rosenfeld /* Structure for command IWN_CMD_TX_DATA. */
656*fd43cf6eSHans Rosenfeld struct iwn_cmd_data {
657*fd43cf6eSHans Rosenfeld 	uint16_t	len;
658*fd43cf6eSHans Rosenfeld 	uint16_t	lnext;
659*fd43cf6eSHans Rosenfeld 	uint32_t	flags;
660*fd43cf6eSHans Rosenfeld #define IWN_TX_NEED_PROTECTION	(1 <<  0)	/* 5000 only */
661*fd43cf6eSHans Rosenfeld #define IWN_TX_NEED_RTS		(1 <<  1)
662*fd43cf6eSHans Rosenfeld #define IWN_TX_NEED_CTS		(1 <<  2)
663*fd43cf6eSHans Rosenfeld #define IWN_TX_NEED_ACK		(1 <<  3)
664*fd43cf6eSHans Rosenfeld #define IWN_TX_LINKQ		(1 <<  4)
665*fd43cf6eSHans Rosenfeld #define IWN_TX_IMM_BA		(1 <<  6)
666*fd43cf6eSHans Rosenfeld #define IWN_TX_FULL_TXOP	(1 <<  7)
667*fd43cf6eSHans Rosenfeld #define IWN_TX_BT_DISABLE	(1 << 12)	/* bluetooth coexistence */
668*fd43cf6eSHans Rosenfeld #define IWN_TX_AUTO_SEQ		(1 << 13)
669*fd43cf6eSHans Rosenfeld #define IWN_TX_MORE_FRAG	(1 << 14)
670*fd43cf6eSHans Rosenfeld #define IWN_TX_INSERT_TSTAMP	(1 << 16)
671*fd43cf6eSHans Rosenfeld #define IWN_TX_NEED_PADDING	(1 << 20)
672*fd43cf6eSHans Rosenfeld 
673*fd43cf6eSHans Rosenfeld 	uint32_t	scratch;
674*fd43cf6eSHans Rosenfeld 	uint8_t		plcp;
675*fd43cf6eSHans Rosenfeld 	uint8_t		rflags;
676*fd43cf6eSHans Rosenfeld 	uint16_t	xrflags;
677*fd43cf6eSHans Rosenfeld 
678*fd43cf6eSHans Rosenfeld 	uint8_t		id;
679*fd43cf6eSHans Rosenfeld 	uint8_t		security;
680*fd43cf6eSHans Rosenfeld #define IWN_CIPHER_WEP40	1
681*fd43cf6eSHans Rosenfeld #define IWN_CIPHER_CCMP		2
682*fd43cf6eSHans Rosenfeld #define IWN_CIPHER_TKIP		3
683*fd43cf6eSHans Rosenfeld #define IWN_CIPHER_WEP104	9
684*fd43cf6eSHans Rosenfeld 
685*fd43cf6eSHans Rosenfeld 	uint8_t		linkq;
686*fd43cf6eSHans Rosenfeld 	uint8_t		reserved2;
687*fd43cf6eSHans Rosenfeld 	uint8_t		key[16];
688*fd43cf6eSHans Rosenfeld 	uint16_t	fnext;
689*fd43cf6eSHans Rosenfeld 	uint16_t	reserved3;
690*fd43cf6eSHans Rosenfeld 	uint32_t	lifetime;
691*fd43cf6eSHans Rosenfeld #define IWN_LIFETIME_INFINITE	0xffffffff
692*fd43cf6eSHans Rosenfeld 
693*fd43cf6eSHans Rosenfeld 	uint32_t	loaddr;
694*fd43cf6eSHans Rosenfeld 	uint8_t		hiaddr;
695*fd43cf6eSHans Rosenfeld 	uint8_t		rts_ntries;
696*fd43cf6eSHans Rosenfeld 	uint8_t		data_ntries;
697*fd43cf6eSHans Rosenfeld 	uint8_t		tid;
698*fd43cf6eSHans Rosenfeld 	uint16_t	timeout;
699*fd43cf6eSHans Rosenfeld 	uint16_t	txop;
700*fd43cf6eSHans Rosenfeld } __packed;
701*fd43cf6eSHans Rosenfeld 
702*fd43cf6eSHans Rosenfeld /* Structure for command IWN_CMD_LINK_QUALITY. */
703*fd43cf6eSHans Rosenfeld #define IWN_MAX_TX_RETRIES	16
704*fd43cf6eSHans Rosenfeld struct iwn_cmd_link_quality {
705*fd43cf6eSHans Rosenfeld 	uint8_t		id;
706*fd43cf6eSHans Rosenfeld 	uint8_t		reserved1;
707*fd43cf6eSHans Rosenfeld 	uint16_t	ctl;
708*fd43cf6eSHans Rosenfeld 	uint8_t		flags;
709*fd43cf6eSHans Rosenfeld 	uint8_t		mimo;
710*fd43cf6eSHans Rosenfeld 	uint8_t		antmsk_1stream;
711*fd43cf6eSHans Rosenfeld 	uint8_t		antmsk_2stream;
712*fd43cf6eSHans Rosenfeld 	uint8_t		ridx[WME_NUM_AC];
713*fd43cf6eSHans Rosenfeld 	uint16_t	ampdu_limit;
714*fd43cf6eSHans Rosenfeld 	uint8_t		ampdu_threshold;
715*fd43cf6eSHans Rosenfeld 	uint8_t		ampdu_max;
716*fd43cf6eSHans Rosenfeld 	uint32_t	reserved2;
717*fd43cf6eSHans Rosenfeld 	struct {
718*fd43cf6eSHans Rosenfeld 		uint8_t		plcp;
719*fd43cf6eSHans Rosenfeld 		uint8_t		rflags;
720*fd43cf6eSHans Rosenfeld 		uint16_t	xrflags;
721*fd43cf6eSHans Rosenfeld 	} __packed	retry[IWN_MAX_TX_RETRIES];
722*fd43cf6eSHans Rosenfeld 	uint32_t	reserved3;
723*fd43cf6eSHans Rosenfeld } __packed;
724*fd43cf6eSHans Rosenfeld 
725*fd43cf6eSHans Rosenfeld /* Structure for command IWN_CMD_SET_LED. */
726*fd43cf6eSHans Rosenfeld struct iwn_cmd_led {
727*fd43cf6eSHans Rosenfeld 	uint32_t	unit;	/* multiplier (in usecs) */
728*fd43cf6eSHans Rosenfeld 	uint8_t		which;
729*fd43cf6eSHans Rosenfeld #define IWN_LED_ACTIVITY	1
730*fd43cf6eSHans Rosenfeld #define IWN_LED_LINK		2
731*fd43cf6eSHans Rosenfeld 
732*fd43cf6eSHans Rosenfeld 	uint8_t		off;
733*fd43cf6eSHans Rosenfeld 	uint8_t		on;
734*fd43cf6eSHans Rosenfeld 	uint8_t		reserved;
735*fd43cf6eSHans Rosenfeld } __packed;
736*fd43cf6eSHans Rosenfeld 
737*fd43cf6eSHans Rosenfeld /* Structure for command IWN5000_CMD_WIMAX_COEX. */
738*fd43cf6eSHans Rosenfeld struct iwn5000_wimax_coex {
739*fd43cf6eSHans Rosenfeld 	uint32_t	flags;
740*fd43cf6eSHans Rosenfeld #define IWN_WIMAX_COEX_STA_TABLE_VALID		(1 << 0)
741*fd43cf6eSHans Rosenfeld #define IWN_WIMAX_COEX_UNASSOC_WA_UNMASK	(1 << 2)
742*fd43cf6eSHans Rosenfeld #define IWN_WIMAX_COEX_ASSOC_WA_UNMASK		(1 << 3)
743*fd43cf6eSHans Rosenfeld #define IWN_WIMAX_COEX_ENABLE			(1 << 7)
744*fd43cf6eSHans Rosenfeld 
745*fd43cf6eSHans Rosenfeld 	struct iwn5000_wimax_event {
746*fd43cf6eSHans Rosenfeld 		uint8_t	request;
747*fd43cf6eSHans Rosenfeld 		uint8_t	window;
748*fd43cf6eSHans Rosenfeld 		uint8_t	reserved;
749*fd43cf6eSHans Rosenfeld 		uint8_t	flags;
750*fd43cf6eSHans Rosenfeld 	} __packed	events[16];
751*fd43cf6eSHans Rosenfeld } __packed;
752*fd43cf6eSHans Rosenfeld 
753*fd43cf6eSHans Rosenfeld /* Structures for command IWN5000_CMD_CALIB_CONFIG. */
754*fd43cf6eSHans Rosenfeld struct iwn5000_calib_elem {
755*fd43cf6eSHans Rosenfeld 	uint32_t	enable;
756*fd43cf6eSHans Rosenfeld 	uint32_t	start;
757*fd43cf6eSHans Rosenfeld #define IWN5000_CALIB_DC	(1 << 1)
758*fd43cf6eSHans Rosenfeld 	uint32_t	send;
759*fd43cf6eSHans Rosenfeld 	uint32_t	apply;
760*fd43cf6eSHans Rosenfeld 	uint32_t	reserved;
761*fd43cf6eSHans Rosenfeld } __packed;
762*fd43cf6eSHans Rosenfeld 
763*fd43cf6eSHans Rosenfeld struct iwn5000_calib_status {
764*fd43cf6eSHans Rosenfeld 	struct iwn5000_calib_elem	once;
765*fd43cf6eSHans Rosenfeld 	struct iwn5000_calib_elem	perd;
766*fd43cf6eSHans Rosenfeld 	uint32_t			flags;
767*fd43cf6eSHans Rosenfeld } __packed;
768*fd43cf6eSHans Rosenfeld 
769*fd43cf6eSHans Rosenfeld struct iwn5000_calib_config {
770*fd43cf6eSHans Rosenfeld 	struct iwn5000_calib_status	ucode;
771*fd43cf6eSHans Rosenfeld 	struct iwn5000_calib_status	driver;
772*fd43cf6eSHans Rosenfeld 	uint32_t			reserved;
773*fd43cf6eSHans Rosenfeld } __packed;
774*fd43cf6eSHans Rosenfeld 
775*fd43cf6eSHans Rosenfeld /* Structure for command IWN_CMD_SET_POWER_MODE. */
776*fd43cf6eSHans Rosenfeld struct iwn_pmgt_cmd {
777*fd43cf6eSHans Rosenfeld 	uint16_t	flags;
778*fd43cf6eSHans Rosenfeld #define IWN_PS_ALLOW_SLEEP	(1 << 0)
779*fd43cf6eSHans Rosenfeld #define IWN_PS_NOTIFY		(1 << 1)
780*fd43cf6eSHans Rosenfeld #define IWN_PS_SLEEP_OVER_DTIM	(1 << 2)
781*fd43cf6eSHans Rosenfeld #define IWN_PS_PCI_PMGT		(1 << 3)
782*fd43cf6eSHans Rosenfeld #define IWN_PS_FAST_PD		(1 << 4)
783*fd43cf6eSHans Rosenfeld 
784*fd43cf6eSHans Rosenfeld 	uint8_t		keepalive;
785*fd43cf6eSHans Rosenfeld 	uint8_t		debug;
786*fd43cf6eSHans Rosenfeld 	uint32_t	rxtimeout;
787*fd43cf6eSHans Rosenfeld 	uint32_t	txtimeout;
788*fd43cf6eSHans Rosenfeld 	uint32_t	intval[5];
789*fd43cf6eSHans Rosenfeld 	uint32_t	beacons;
790*fd43cf6eSHans Rosenfeld } __packed;
791*fd43cf6eSHans Rosenfeld 
792*fd43cf6eSHans Rosenfeld /* Structures for command IWN_CMD_SCAN. */
793*fd43cf6eSHans Rosenfeld struct iwn_scan_essid {
794*fd43cf6eSHans Rosenfeld 	uint8_t	id;
795*fd43cf6eSHans Rosenfeld 	uint8_t	len;
796*fd43cf6eSHans Rosenfeld 	uint8_t	data[IEEE80211_NWID_LEN];
797*fd43cf6eSHans Rosenfeld } __packed;
798*fd43cf6eSHans Rosenfeld 
799*fd43cf6eSHans Rosenfeld struct iwn_scan_hdr {
800*fd43cf6eSHans Rosenfeld 	uint16_t	len;
801*fd43cf6eSHans Rosenfeld 	uint8_t		scan_flags;
802*fd43cf6eSHans Rosenfeld #define	IWN_SCAN_PASSIVE2ACTIVE	(1<<5)
803*fd43cf6eSHans Rosenfeld 
804*fd43cf6eSHans Rosenfeld 	uint8_t		nchan;
805*fd43cf6eSHans Rosenfeld 	uint16_t	quiet_time;
806*fd43cf6eSHans Rosenfeld 	uint16_t	quiet_threshold;
807*fd43cf6eSHans Rosenfeld 	uint16_t	crc_threshold;
808*fd43cf6eSHans Rosenfeld 	uint16_t	rxchain;
809*fd43cf6eSHans Rosenfeld 	uint32_t	max_svc;	/* background scans */
810*fd43cf6eSHans Rosenfeld 	uint32_t	pause_svc;	/* background scans */
811*fd43cf6eSHans Rosenfeld 	uint32_t	flags;
812*fd43cf6eSHans Rosenfeld 	uint32_t	filter;
813*fd43cf6eSHans Rosenfeld 
814*fd43cf6eSHans Rosenfeld 	/* Followed by a struct iwn_cmd_data. */
815*fd43cf6eSHans Rosenfeld 	/* Followed by an array of 20 structs iwn_scan_essid. */
816*fd43cf6eSHans Rosenfeld 	/* Followed by probe request body. */
817*fd43cf6eSHans Rosenfeld 	/* Followed by an array of ``nchan'' structs iwn_scan_chan. */
818*fd43cf6eSHans Rosenfeld } __packed;
819*fd43cf6eSHans Rosenfeld 
820*fd43cf6eSHans Rosenfeld struct iwn_scan_chan {
821*fd43cf6eSHans Rosenfeld 	uint32_t	flags;
822*fd43cf6eSHans Rosenfeld #define IWN_CHAN_ACTIVE		(1 << 0)
823*fd43cf6eSHans Rosenfeld #define IWN_CHAN_NPBREQS(x)	(((1 << (x)) - 1) << 1)
824*fd43cf6eSHans Rosenfeld 
825*fd43cf6eSHans Rosenfeld 	uint16_t	chan;
826*fd43cf6eSHans Rosenfeld 	uint8_t		rf_gain;
827*fd43cf6eSHans Rosenfeld 	uint8_t		dsp_gain;
828*fd43cf6eSHans Rosenfeld 	uint16_t	active;		/* msecs */
829*fd43cf6eSHans Rosenfeld 	uint16_t	passive;	/* msecs */
830*fd43cf6eSHans Rosenfeld } __packed;
831*fd43cf6eSHans Rosenfeld 
832*fd43cf6eSHans Rosenfeld /* Maximum size of a scan command. */
833*fd43cf6eSHans Rosenfeld #define IWN_SCAN_MAXSZ	4092
834*fd43cf6eSHans Rosenfeld 
835*fd43cf6eSHans Rosenfeld /*
836*fd43cf6eSHans Rosenfeld  * For active scan, listen ACTIVE_DWELL_TIME (msec) on each channel after
837*fd43cf6eSHans Rosenfeld  * sending probe req.  This should be set long enough to hear probe responses
838*fd43cf6eSHans Rosenfeld  * from more than one AP.
839*fd43cf6eSHans Rosenfeld  */
840*fd43cf6eSHans Rosenfeld #define IWN_ACTIVE_DWELL_TIME_2GHZ	(30)	/* all times in msec */
841*fd43cf6eSHans Rosenfeld #define IWN_ACTIVE_DWELL_TIME_5GHZ	(20)
842*fd43cf6eSHans Rosenfeld #define IWN_ACTIVE_DWELL_FACTOR_2GHZ	(3)
843*fd43cf6eSHans Rosenfeld #define IWN_ACTIVE_DWELL_FACTOR_5GHZ	(2)
844*fd43cf6eSHans Rosenfeld 
845*fd43cf6eSHans Rosenfeld /*
846*fd43cf6eSHans Rosenfeld  * For passive scan, listen PASSIVE_DWELL_TIME (msec) on each channel.
847*fd43cf6eSHans Rosenfeld  * Must be set longer than active dwell time.
848*fd43cf6eSHans Rosenfeld  * For the most reliable scan, set > AP beacon interval (typically 100msec).
849*fd43cf6eSHans Rosenfeld  */
850*fd43cf6eSHans Rosenfeld #define IWN_PASSIVE_DWELL_TIME_2GHZ	(20)	/* all times in msec */
851*fd43cf6eSHans Rosenfeld #define IWN_PASSIVE_DWELL_TIME_5GHZ	(10)
852*fd43cf6eSHans Rosenfeld #define IWN_PASSIVE_DWELL_BASE		(100)
853*fd43cf6eSHans Rosenfeld #define IWN_CHANNEL_TUNE_TIME		(5)
854*fd43cf6eSHans Rosenfeld 
855*fd43cf6eSHans Rosenfeld /*
856*fd43cf6eSHans Rosenfeld  * If active scanning is requested but a certain channel is
857*fd43cf6eSHans Rosenfeld  * marked passive, we can do active scanning if we detect
858*fd43cf6eSHans Rosenfeld  * transmissions.
859*fd43cf6eSHans Rosenfeld  *
860*fd43cf6eSHans Rosenfeld  * There is an issue with some firmware versions that triggers
861*fd43cf6eSHans Rosenfeld  * a sysassert on a "good CRC threshold" of zero (== disabled),
862*fd43cf6eSHans Rosenfeld  * on a radar channel even though this means that we should NOT
863*fd43cf6eSHans Rosenfeld  * send probes.
864*fd43cf6eSHans Rosenfeld  *
865*fd43cf6eSHans Rosenfeld  * The "good CRC threshold" is the number of frames that we
866*fd43cf6eSHans Rosenfeld  * need to receive during our dwell time on a channel before
867*fd43cf6eSHans Rosenfeld  * sending out probes -- setting this to a huge value will
868*fd43cf6eSHans Rosenfeld  * mean we never reach it, but at the same time work around
869*fd43cf6eSHans Rosenfeld  * the aforementioned issue. Thus use IWN_GOOD_CRC_TH_NEVER
870*fd43cf6eSHans Rosenfeld  * here instead of IWN_GOOD_CRC_TH_DISABLED.
871*fd43cf6eSHans Rosenfeld  *
872*fd43cf6eSHans Rosenfeld  * This was fixed in later versions along with some other
873*fd43cf6eSHans Rosenfeld  * scan changes, and the threshold behaves as a flag in those
874*fd43cf6eSHans Rosenfeld  * versions.
875*fd43cf6eSHans Rosenfeld  */
876*fd43cf6eSHans Rosenfeld #define IWN_GOOD_CRC_TH_DISABLED	0
877*fd43cf6eSHans Rosenfeld #define IWN_GOOD_CRC_TH_DEFAULT		htole16(1)
878*fd43cf6eSHans Rosenfeld #define IWN_GOOD_CRC_TH_NEVER		htole16(0xffff)
879*fd43cf6eSHans Rosenfeld 
880*fd43cf6eSHans Rosenfeld /* Structure for command IWN_CMD_TXPOWER (4965AGN only.) */
881*fd43cf6eSHans Rosenfeld #define IWN_RIDX_MAX	32
882*fd43cf6eSHans Rosenfeld struct iwn4965_cmd_txpower {
883*fd43cf6eSHans Rosenfeld 	uint8_t		band;
884*fd43cf6eSHans Rosenfeld 	uint8_t		reserved1;
885*fd43cf6eSHans Rosenfeld 	uint8_t		chan;
886*fd43cf6eSHans Rosenfeld 	uint8_t		reserved2;
887*fd43cf6eSHans Rosenfeld 	struct {
888*fd43cf6eSHans Rosenfeld 		uint8_t	rf_gain[2];
889*fd43cf6eSHans Rosenfeld 		uint8_t	dsp_gain[2];
890*fd43cf6eSHans Rosenfeld 	} __packed	power[IWN_RIDX_MAX + 1];
891*fd43cf6eSHans Rosenfeld } __packed;
892*fd43cf6eSHans Rosenfeld 
893*fd43cf6eSHans Rosenfeld /* Structure for command IWN_CMD_TXPOWER_DBM (5000 Series only.) */
894*fd43cf6eSHans Rosenfeld struct iwn5000_cmd_txpower {
895*fd43cf6eSHans Rosenfeld 	int8_t	global_limit;	/* in half-dBm */
896*fd43cf6eSHans Rosenfeld #define IWN5000_TXPOWER_AUTO		0x7f
897*fd43cf6eSHans Rosenfeld #define IWN5000_TXPOWER_MAX_DBM		16
898*fd43cf6eSHans Rosenfeld 
899*fd43cf6eSHans Rosenfeld 	uint8_t	flags;
900*fd43cf6eSHans Rosenfeld #define IWN5000_TXPOWER_NO_CLOSED	(1 << 6)
901*fd43cf6eSHans Rosenfeld 
902*fd43cf6eSHans Rosenfeld 	int8_t	srv_limit;	/* in half-dBm */
903*fd43cf6eSHans Rosenfeld 	uint8_t	reserved;
904*fd43cf6eSHans Rosenfeld } __packed;
905*fd43cf6eSHans Rosenfeld 
906*fd43cf6eSHans Rosenfeld /* Structure for command IWN_CMD_BT_COEX. */
907*fd43cf6eSHans Rosenfeld struct iwn_bluetooth {
908*fd43cf6eSHans Rosenfeld 	uint8_t		flags;
909*fd43cf6eSHans Rosenfeld #define IWN_BT_COEX_CHAN_ANN	(1 << 0)
910*fd43cf6eSHans Rosenfeld #define IWN_BT_COEX_BT_PRIO	(1 << 1)
911*fd43cf6eSHans Rosenfeld #define IWN_BT_COEX_2_WIRE	(1 << 2)
912*fd43cf6eSHans Rosenfeld #define IWN_BT_COEX_ENABLE	(IWN_BT_COEX_CHAN_ANN | IWN_BT_COEX_BT_PRIO)
913*fd43cf6eSHans Rosenfeld 	uint8_t		lead_time;
914*fd43cf6eSHans Rosenfeld #define IWN_BT_LEAD_TIME_DEF	30
915*fd43cf6eSHans Rosenfeld 	uint8_t		max_kill;
916*fd43cf6eSHans Rosenfeld #define IWN_BT_MAX_KILL_DEF	5
917*fd43cf6eSHans Rosenfeld 	uint8_t		bt3_timer_t7_value;
918*fd43cf6eSHans Rosenfeld #define IWN_BT_BT3_T7_DEF	1
919*fd43cf6eSHans Rosenfeld 	uint32_t	kill_ack_mask;
920*fd43cf6eSHans Rosenfeld #define IWN_BT_KILL_ACK_MASK_DEF	htole32(0xffff0000)
921*fd43cf6eSHans Rosenfeld 	uint32_t	kill_cts_mask;
922*fd43cf6eSHans Rosenfeld #define IWN_BT_KILL_CTS_MASK_DEF	htole32(0xffff0000)
923*fd43cf6eSHans Rosenfeld } __packed;
924*fd43cf6eSHans Rosenfeld 
925*fd43cf6eSHans Rosenfeld struct iwn_bt_basic {
926*fd43cf6eSHans Rosenfeld 	struct iwn_bluetooth bt;
927*fd43cf6eSHans Rosenfeld #define IWN_BT_BASIC_CHAN_INHIBITION	1
928*fd43cf6eSHans Rosenfeld #define IWN_BT_BASIC_MODE_MASK	((1 << 3) | (1 << 4) | (1 << 5))
929*fd43cf6eSHans Rosenfeld #define IWN_BT_BASIC_MODE_SHIFT	3
930*fd43cf6eSHans Rosenfeld #define IWN_BT_BASIC_MODE_DISABLED	0
931*fd43cf6eSHans Rosenfeld #define IWN_BT_BASIC_MODE_LEGACY_2W	1
932*fd43cf6eSHans Rosenfeld #define IWN_BT_BASIC_MODE_3W		2
933*fd43cf6eSHans Rosenfeld #define IWN_BT_BASIC_MODE_4W		3
934*fd43cf6eSHans Rosenfeld #define IWN_BT_UCODE_DEFAULT		(1 << 6)
935*fd43cf6eSHans Rosenfeld #define IWN_BT_SYNC_2_BT_DISABLE	(1 << 7)
936*fd43cf6eSHans Rosenfeld 	uint8_t		bt3_prio_sample_time;
937*fd43cf6eSHans Rosenfeld #define IWN_BT_BT3_PRIO_SAMPLE_DEF	2
938*fd43cf6eSHans Rosenfeld 	uint8_t		bt3_timer_t2_value;
939*fd43cf6eSHans Rosenfeld #define IWN_BT_BT3_T2_DEF	12
940*fd43cf6eSHans Rosenfeld 	uint16_t	bt4_reaction_time; /* unused */
941*fd43cf6eSHans Rosenfeld 	uint32_t	bt3_lookup_table[12];
942*fd43cf6eSHans Rosenfeld 
943*fd43cf6eSHans Rosenfeld 	uint16_t	reduce_txpower; /* bit 0 */
944*fd43cf6eSHans Rosenfeld #if 0
945*fd43cf6eSHans Rosenfeld 	/*
946*fd43cf6eSHans Rosenfeld 	 * The original code causes problems with lint. These declarations
947*fd43cf6eSHans Rosenfeld 	 * could be fixed with lint tags, but the assignment to
948*fd43cf6eSHans Rosenfeld 	 * reduce_txpower in iwn_config_bt_coex_adv_config() cannot.
949*fd43cf6eSHans Rosenfeld 	 * For reference it remains here but is ifdef'ed out.
950*fd43cf6eSHans Rosenfeld 	 */
951*fd43cf6eSHans Rosenfeld 	union {
952*fd43cf6eSHans Rosenfeld 		struct {
953*fd43cf6eSHans Rosenfeld 			uint8_t		reduce_txpower; /* bit 0 */
954*fd43cf6eSHans Rosenfeld 			uint8_t		reserved;
955*fd43cf6eSHans Rosenfeld 		};
956*fd43cf6eSHans Rosenfeld 		uint16_t bt4_decision;
957*fd43cf6eSHans Rosenfeld 	};
958*fd43cf6eSHans Rosenfeld #endif
959*fd43cf6eSHans Rosenfeld 	uint16_t	valid;
960*fd43cf6eSHans Rosenfeld #define IWN_BT_VALID_ENABLE_FLAGS	htole16(1 << 0)
961*fd43cf6eSHans Rosenfeld #define IWN_BT_VALID_BOOST		htole16(1 << 1)
962*fd43cf6eSHans Rosenfeld #define IWN_BT_VALID_MAX_KILL		htole16(1 << 2)
963*fd43cf6eSHans Rosenfeld #define IWN_BT_VALID_3W_TIMERS		htole16(1 << 3)
964*fd43cf6eSHans Rosenfeld #define IWN_BT_VALID_KILL_ACK_MASK	htole16(1 << 4)
965*fd43cf6eSHans Rosenfeld #define IWN_BT_VALID_KILL_CTS_MASK	htole16(1 << 5)
966*fd43cf6eSHans Rosenfeld #define IWN_BT_VALID_REDUCED_TX_PWR	htole16(1 << 6)
967*fd43cf6eSHans Rosenfeld #define IWN_BT_VALID_3W_LUT		htole16(1 << 7)
968*fd43cf6eSHans Rosenfeld #define IWN_BT_ALL_VALID_MASK		(IWN_BT_VALID_ENABLE_FLAGS | \
969*fd43cf6eSHans Rosenfeld 					 IWN_BT_VALID_BOOST | \
970*fd43cf6eSHans Rosenfeld 					 IWN_BT_VALID_MAX_KILL | \
971*fd43cf6eSHans Rosenfeld 					 IWN_BT_VALID_3W_TIMERS | \
972*fd43cf6eSHans Rosenfeld 					 IWN_BT_VALID_KILL_ACK_MASK | \
973*fd43cf6eSHans Rosenfeld 					 IWN_BT_VALID_KILL_CTS_MASK | \
974*fd43cf6eSHans Rosenfeld 					 IWN_BT_VALID_REDUCED_TX_PWR | \
975*fd43cf6eSHans Rosenfeld 					 IWN_BT_VALID_3W_LUT)
976*fd43cf6eSHans Rosenfeld } __packed;
977*fd43cf6eSHans Rosenfeld 
978*fd43cf6eSHans Rosenfeld struct iwn_bt_adv1 {
979*fd43cf6eSHans Rosenfeld 	struct iwn_bt_basic basic;
980*fd43cf6eSHans Rosenfeld 	uint8_t		prio_boost;
981*fd43cf6eSHans Rosenfeld #define IWN_BT_PRIO_BOOST_DEF	0xf0
982*fd43cf6eSHans Rosenfeld 	/* set IWLAGN_BT_VALID_BOOST to "1" in "valid" bitmask for */
983*fd43cf6eSHans Rosenfeld 	uint8_t		tx_prio_boost;
984*fd43cf6eSHans Rosenfeld 	uint16_t	rx_prio_boost;
985*fd43cf6eSHans Rosenfeld } __packed;
986*fd43cf6eSHans Rosenfeld 
987*fd43cf6eSHans Rosenfeld struct iwn_bt_adv2 {
988*fd43cf6eSHans Rosenfeld 	struct iwn_bt_basic basic;
989*fd43cf6eSHans Rosenfeld 	uint32_t	prio_boost;
990*fd43cf6eSHans Rosenfeld #define IWN_BT_PRIO_BOOST_DEF32	0xf0f0f0
991*fd43cf6eSHans Rosenfeld 	uint8_t		reserved;
992*fd43cf6eSHans Rosenfeld 	/* set IWLAGN_BT_VALID_BOOST to "1" in "valid" bitmask for */
993*fd43cf6eSHans Rosenfeld 	uint8_t		tx_prio_boost;
994*fd43cf6eSHans Rosenfeld 	uint16_t	rx_prio_boost;
995*fd43cf6eSHans Rosenfeld } __packed;
996*fd43cf6eSHans Rosenfeld 
997*fd43cf6eSHans Rosenfeld /* Structure for command IWN_CMD_BT_COEX_PRIOTABLE */
998*fd43cf6eSHans Rosenfeld struct iwn_btcoex_priotable {
999*fd43cf6eSHans Rosenfeld 	uint8_t		calib_init1;
1000*fd43cf6eSHans Rosenfeld 	uint8_t		calib_init2;
1001*fd43cf6eSHans Rosenfeld 	uint8_t		calib_periodic_low1;
1002*fd43cf6eSHans Rosenfeld 	uint8_t		calib_periodic_low2;
1003*fd43cf6eSHans Rosenfeld 	uint8_t		calib_periodic_high1;
1004*fd43cf6eSHans Rosenfeld 	uint8_t		calib_periodic_high2;
1005*fd43cf6eSHans Rosenfeld 	uint8_t		dtim;
1006*fd43cf6eSHans Rosenfeld 	uint8_t		scan52;
1007*fd43cf6eSHans Rosenfeld 	uint8_t		scan24;
1008*fd43cf6eSHans Rosenfeld 	uint8_t		reserved[7];
1009*fd43cf6eSHans Rosenfeld } __packed;
1010*fd43cf6eSHans Rosenfeld 
1011*fd43cf6eSHans Rosenfeld /* Structure for command IWN_CMD_BT_COEX_PROT */
1012*fd43cf6eSHans Rosenfeld struct iwn_btcoex_prot {
1013*fd43cf6eSHans Rosenfeld 	uint8_t		open;
1014*fd43cf6eSHans Rosenfeld 	uint8_t		type;
1015*fd43cf6eSHans Rosenfeld 	uint8_t		reserved[2];
1016*fd43cf6eSHans Rosenfeld } __packed;
1017*fd43cf6eSHans Rosenfeld 
1018*fd43cf6eSHans Rosenfeld /* Structure for command IWN_CMD_SET_CRITICAL_TEMP. */
1019*fd43cf6eSHans Rosenfeld struct iwn_critical_temp {
1020*fd43cf6eSHans Rosenfeld 	uint32_t	reserved;
1021*fd43cf6eSHans Rosenfeld 	uint32_t	tempM;
1022*fd43cf6eSHans Rosenfeld 	uint32_t	tempR;
1023*fd43cf6eSHans Rosenfeld /* degK <-> degC conversion macros. */
1024*fd43cf6eSHans Rosenfeld #define IWN_CTOK(c)	((c) + 273)
1025*fd43cf6eSHans Rosenfeld #define IWN_KTOC(k)	((k) - 273)
1026*fd43cf6eSHans Rosenfeld #define IWN_CTOMUK(c)	(((c) * 1000000) + 273150000)
1027*fd43cf6eSHans Rosenfeld } __packed;
1028*fd43cf6eSHans Rosenfeld 
1029*fd43cf6eSHans Rosenfeld /* Structures for command IWN_CMD_SET_SENSITIVITY. */
1030*fd43cf6eSHans Rosenfeld struct iwn_sensitivity_cmd {
1031*fd43cf6eSHans Rosenfeld 	uint16_t	which;
1032*fd43cf6eSHans Rosenfeld #define IWN_SENSITIVITY_DEFAULTTBL	0
1033*fd43cf6eSHans Rosenfeld #define IWN_SENSITIVITY_WORKTBL		1
1034*fd43cf6eSHans Rosenfeld 
1035*fd43cf6eSHans Rosenfeld 	uint16_t	energy_cck;
1036*fd43cf6eSHans Rosenfeld 	uint16_t	energy_ofdm;
1037*fd43cf6eSHans Rosenfeld 	uint16_t	corr_ofdm_x1;
1038*fd43cf6eSHans Rosenfeld 	uint16_t	corr_ofdm_mrc_x1;
1039*fd43cf6eSHans Rosenfeld 	uint16_t	corr_cck_mrc_x4;
1040*fd43cf6eSHans Rosenfeld 	uint16_t	corr_ofdm_x4;
1041*fd43cf6eSHans Rosenfeld 	uint16_t	corr_ofdm_mrc_x4;
1042*fd43cf6eSHans Rosenfeld 	uint16_t	corr_barker;
1043*fd43cf6eSHans Rosenfeld 	uint16_t	corr_barker_mrc;
1044*fd43cf6eSHans Rosenfeld 	uint16_t	corr_cck_x4;
1045*fd43cf6eSHans Rosenfeld 	uint16_t	energy_ofdm_th;
1046*fd43cf6eSHans Rosenfeld } __packed;
1047*fd43cf6eSHans Rosenfeld 
1048*fd43cf6eSHans Rosenfeld struct iwn_enhanced_sensitivity_cmd {
1049*fd43cf6eSHans Rosenfeld 	uint16_t	which;
1050*fd43cf6eSHans Rosenfeld 	uint16_t	energy_cck;
1051*fd43cf6eSHans Rosenfeld 	uint16_t	energy_ofdm;
1052*fd43cf6eSHans Rosenfeld 	uint16_t	corr_ofdm_x1;
1053*fd43cf6eSHans Rosenfeld 	uint16_t	corr_ofdm_mrc_x1;
1054*fd43cf6eSHans Rosenfeld 	uint16_t	corr_cck_mrc_x4;
1055*fd43cf6eSHans Rosenfeld 	uint16_t	corr_ofdm_x4;
1056*fd43cf6eSHans Rosenfeld 	uint16_t	corr_ofdm_mrc_x4;
1057*fd43cf6eSHans Rosenfeld 	uint16_t	corr_barker;
1058*fd43cf6eSHans Rosenfeld 	uint16_t	corr_barker_mrc;
1059*fd43cf6eSHans Rosenfeld 	uint16_t	corr_cck_x4;
1060*fd43cf6eSHans Rosenfeld 	uint16_t	energy_ofdm_th;
1061*fd43cf6eSHans Rosenfeld 	/* "Enhanced" part. */
1062*fd43cf6eSHans Rosenfeld 	uint16_t	ina_det_ofdm;
1063*fd43cf6eSHans Rosenfeld 	uint16_t	ina_det_cck;
1064*fd43cf6eSHans Rosenfeld 	uint16_t	corr_11_9_en;
1065*fd43cf6eSHans Rosenfeld 	uint16_t	ofdm_det_slope_mrc;
1066*fd43cf6eSHans Rosenfeld 	uint16_t	ofdm_det_icept_mrc;
1067*fd43cf6eSHans Rosenfeld 	uint16_t	ofdm_det_slope;
1068*fd43cf6eSHans Rosenfeld 	uint16_t	ofdm_det_icept;
1069*fd43cf6eSHans Rosenfeld 	uint16_t	cck_det_slope_mrc;
1070*fd43cf6eSHans Rosenfeld 	uint16_t	cck_det_icept_mrc;
1071*fd43cf6eSHans Rosenfeld 	uint16_t	cck_det_slope;
1072*fd43cf6eSHans Rosenfeld 	uint16_t	cck_det_icept;
1073*fd43cf6eSHans Rosenfeld 	uint16_t	reserved;
1074*fd43cf6eSHans Rosenfeld } __packed;
1075*fd43cf6eSHans Rosenfeld 
1076*fd43cf6eSHans Rosenfeld /* Structures for command IWN_CMD_PHY_CALIB. */
1077*fd43cf6eSHans Rosenfeld struct iwn_phy_calib {
1078*fd43cf6eSHans Rosenfeld 	uint8_t	code;
1079*fd43cf6eSHans Rosenfeld #define IWN4965_PHY_CALIB_DIFF_GAIN		 7
1080*fd43cf6eSHans Rosenfeld #define IWN5000_PHY_CALIB_DC			 8
1081*fd43cf6eSHans Rosenfeld #define IWN5000_PHY_CALIB_LO			 9
1082*fd43cf6eSHans Rosenfeld #define IWN5000_PHY_CALIB_TX_IQ			11
1083*fd43cf6eSHans Rosenfeld #define IWN5000_PHY_CALIB_CRYSTAL		15
1084*fd43cf6eSHans Rosenfeld #define IWN5000_PHY_CALIB_BASE_BAND		16
1085*fd43cf6eSHans Rosenfeld #define IWN5000_PHY_CALIB_TX_IQ_PERIODIC	17
1086*fd43cf6eSHans Rosenfeld #define IWN5000_PHY_CALIB_RESET_NOISE_GAIN	18
1087*fd43cf6eSHans Rosenfeld #define IWN5000_PHY_CALIB_NOISE_GAIN		19
1088*fd43cf6eSHans Rosenfeld 
1089*fd43cf6eSHans Rosenfeld #define IWN6000_PHY_CALIB_TEMP_OFFSET		18
1090*fd43cf6eSHans Rosenfeld #define IWN2000_PHY_CALIB_TEMP_OFFSET		18
1091*fd43cf6eSHans Rosenfeld 
1092*fd43cf6eSHans Rosenfeld #define IWN5000_PHY_CALIB_MAX			253
1093*fd43cf6eSHans Rosenfeld 
1094*fd43cf6eSHans Rosenfeld 	uint8_t	group;
1095*fd43cf6eSHans Rosenfeld 	uint8_t	ngroups;
1096*fd43cf6eSHans Rosenfeld 	uint8_t	isvalid;
1097*fd43cf6eSHans Rosenfeld } __packed;
1098*fd43cf6eSHans Rosenfeld 
1099*fd43cf6eSHans Rosenfeld struct iwn5000_phy_calib_crystal {
1100*fd43cf6eSHans Rosenfeld 	uint8_t	code;
1101*fd43cf6eSHans Rosenfeld 	uint8_t	group;
1102*fd43cf6eSHans Rosenfeld 	uint8_t	ngroups;
1103*fd43cf6eSHans Rosenfeld 	uint8_t	isvalid;
1104*fd43cf6eSHans Rosenfeld 
1105*fd43cf6eSHans Rosenfeld 	uint8_t	cap_pin[2];
1106*fd43cf6eSHans Rosenfeld 	uint8_t	reserved[2];
1107*fd43cf6eSHans Rosenfeld } __packed;
1108*fd43cf6eSHans Rosenfeld 
1109*fd43cf6eSHans Rosenfeld struct iwn6000_phy_calib_temp_offset {
1110*fd43cf6eSHans Rosenfeld 	uint8_t		code;
1111*fd43cf6eSHans Rosenfeld 	uint8_t		group;
1112*fd43cf6eSHans Rosenfeld 	uint8_t		ngroups;
1113*fd43cf6eSHans Rosenfeld 	uint8_t		isvalid;
1114*fd43cf6eSHans Rosenfeld 	int16_t		offset;
1115*fd43cf6eSHans Rosenfeld #define IWN_DEFAULT_TEMP_OFFSET	2700
1116*fd43cf6eSHans Rosenfeld 
1117*fd43cf6eSHans Rosenfeld 	uint16_t	reserved;
1118*fd43cf6eSHans Rosenfeld } __packed;
1119*fd43cf6eSHans Rosenfeld 
1120*fd43cf6eSHans Rosenfeld struct iwn2000_phy_calib_temp_offset {
1121*fd43cf6eSHans Rosenfeld 	uint8_t		code;
1122*fd43cf6eSHans Rosenfeld 	uint8_t		group;
1123*fd43cf6eSHans Rosenfeld 	uint8_t		ngroups;
1124*fd43cf6eSHans Rosenfeld 	uint8_t		isvalid;
1125*fd43cf6eSHans Rosenfeld 	int16_t		offset_high;
1126*fd43cf6eSHans Rosenfeld 	int16_t		offset_low;
1127*fd43cf6eSHans Rosenfeld 	int16_t		burnt_voltage_ref;
1128*fd43cf6eSHans Rosenfeld 	int16_t		reserved;
1129*fd43cf6eSHans Rosenfeld } __packed;
1130*fd43cf6eSHans Rosenfeld 
1131*fd43cf6eSHans Rosenfeld struct iwn_phy_calib_gain {
1132*fd43cf6eSHans Rosenfeld 	uint8_t	code;
1133*fd43cf6eSHans Rosenfeld 	uint8_t	group;
1134*fd43cf6eSHans Rosenfeld 	uint8_t	ngroups;
1135*fd43cf6eSHans Rosenfeld 	uint8_t	isvalid;
1136*fd43cf6eSHans Rosenfeld 
1137*fd43cf6eSHans Rosenfeld 	int8_t	gain[3];
1138*fd43cf6eSHans Rosenfeld 	uint8_t	reserved;
1139*fd43cf6eSHans Rosenfeld } __packed;
1140*fd43cf6eSHans Rosenfeld 
1141*fd43cf6eSHans Rosenfeld /* Structure for command IWN_CMD_SPECTRUM_MEASUREMENT. */
1142*fd43cf6eSHans Rosenfeld struct iwn_spectrum_cmd {
1143*fd43cf6eSHans Rosenfeld 	uint16_t	len;
1144*fd43cf6eSHans Rosenfeld 	uint8_t		token;
1145*fd43cf6eSHans Rosenfeld 	uint8_t		id;
1146*fd43cf6eSHans Rosenfeld 	uint8_t		origin;
1147*fd43cf6eSHans Rosenfeld 	uint8_t		periodic;
1148*fd43cf6eSHans Rosenfeld 	uint16_t	timeout;
1149*fd43cf6eSHans Rosenfeld 	uint32_t	start;
1150*fd43cf6eSHans Rosenfeld 	uint32_t	reserved1;
1151*fd43cf6eSHans Rosenfeld 	uint32_t	flags;
1152*fd43cf6eSHans Rosenfeld 	uint32_t	filter;
1153*fd43cf6eSHans Rosenfeld 	uint16_t	nchan;
1154*fd43cf6eSHans Rosenfeld 	uint16_t	reserved2;
1155*fd43cf6eSHans Rosenfeld 	struct {
1156*fd43cf6eSHans Rosenfeld 		uint32_t	duration;
1157*fd43cf6eSHans Rosenfeld 		uint8_t		chan;
1158*fd43cf6eSHans Rosenfeld 		uint8_t		type;
1159*fd43cf6eSHans Rosenfeld #define IWN_MEASUREMENT_BASIC		(1 << 0)
1160*fd43cf6eSHans Rosenfeld #define IWN_MEASUREMENT_CCA		(1 << 1)
1161*fd43cf6eSHans Rosenfeld #define IWN_MEASUREMENT_RPI_HISTOGRAM	(1 << 2)
1162*fd43cf6eSHans Rosenfeld #define IWN_MEASUREMENT_NOISE_HISTOGRAM	(1 << 3)
1163*fd43cf6eSHans Rosenfeld #define IWN_MEASUREMENT_FRAME		(1 << 4)
1164*fd43cf6eSHans Rosenfeld #define IWN_MEASUREMENT_IDLE		(1 << 7)
1165*fd43cf6eSHans Rosenfeld 
1166*fd43cf6eSHans Rosenfeld 		uint16_t	reserved;
1167*fd43cf6eSHans Rosenfeld 	} __packed	chan[10];
1168*fd43cf6eSHans Rosenfeld } __packed;
1169*fd43cf6eSHans Rosenfeld 
1170*fd43cf6eSHans Rosenfeld /* Structure for IWN_UC_READY notification. */
1171*fd43cf6eSHans Rosenfeld #define IWN_NATTEN_GROUPS	5
1172*fd43cf6eSHans Rosenfeld struct iwn_ucode_info {
1173*fd43cf6eSHans Rosenfeld 	uint8_t		minor;
1174*fd43cf6eSHans Rosenfeld 	uint8_t		major;
1175*fd43cf6eSHans Rosenfeld 	uint16_t	reserved1;
1176*fd43cf6eSHans Rosenfeld 	uint8_t		revision[8];
1177*fd43cf6eSHans Rosenfeld 	uint8_t		type;
1178*fd43cf6eSHans Rosenfeld 	uint8_t		subtype;
1179*fd43cf6eSHans Rosenfeld #define IWN_UCODE_RUNTIME	0
1180*fd43cf6eSHans Rosenfeld #define IWN_UCODE_INIT		9
1181*fd43cf6eSHans Rosenfeld 
1182*fd43cf6eSHans Rosenfeld 	uint16_t	reserved2;
1183*fd43cf6eSHans Rosenfeld 	uint32_t	logptr;
1184*fd43cf6eSHans Rosenfeld 	uint32_t	errptr;
1185*fd43cf6eSHans Rosenfeld 	uint32_t	tstamp;
1186*fd43cf6eSHans Rosenfeld 	uint32_t	valid;
1187*fd43cf6eSHans Rosenfeld 
1188*fd43cf6eSHans Rosenfeld 	/* The following fields are for UCODE_INIT only. */
1189*fd43cf6eSHans Rosenfeld 	int32_t		volt;
1190*fd43cf6eSHans Rosenfeld 	struct {
1191*fd43cf6eSHans Rosenfeld 		int32_t	chan20MHz;
1192*fd43cf6eSHans Rosenfeld 		int32_t	chan40MHz;
1193*fd43cf6eSHans Rosenfeld 	} __packed	temp[4];
1194*fd43cf6eSHans Rosenfeld 	int32_t		atten[IWN_NATTEN_GROUPS][2];
1195*fd43cf6eSHans Rosenfeld } __packed;
1196*fd43cf6eSHans Rosenfeld 
1197*fd43cf6eSHans Rosenfeld /* Structures for IWN_TX_DONE notification. */
1198*fd43cf6eSHans Rosenfeld struct iwn4965_tx_stat {
1199*fd43cf6eSHans Rosenfeld 	uint8_t		nframes;
1200*fd43cf6eSHans Rosenfeld 	uint8_t		btkillcnt;
1201*fd43cf6eSHans Rosenfeld 	uint8_t		rtsfailcnt;
1202*fd43cf6eSHans Rosenfeld 	uint8_t		ackfailcnt;
1203*fd43cf6eSHans Rosenfeld 	uint8_t		rate;
1204*fd43cf6eSHans Rosenfeld 	uint8_t		rflags;
1205*fd43cf6eSHans Rosenfeld 	uint16_t	xrflags;
1206*fd43cf6eSHans Rosenfeld 	uint16_t	duration;
1207*fd43cf6eSHans Rosenfeld 	uint16_t	reserved;
1208*fd43cf6eSHans Rosenfeld 	uint32_t	power[2];
1209*fd43cf6eSHans Rosenfeld 	uint32_t	status;
1210*fd43cf6eSHans Rosenfeld } __packed;
1211*fd43cf6eSHans Rosenfeld 
1212*fd43cf6eSHans Rosenfeld struct iwn5000_tx_stat {
1213*fd43cf6eSHans Rosenfeld 	uint8_t		nframes;
1214*fd43cf6eSHans Rosenfeld 	uint8_t		btkillcnt;
1215*fd43cf6eSHans Rosenfeld 	uint8_t		rtsfailcnt;
1216*fd43cf6eSHans Rosenfeld 	uint8_t		ackfailcnt;
1217*fd43cf6eSHans Rosenfeld 	uint8_t		rate;
1218*fd43cf6eSHans Rosenfeld 	uint8_t		rflags;
1219*fd43cf6eSHans Rosenfeld 	uint16_t	xrflags;
1220*fd43cf6eSHans Rosenfeld 	uint16_t	duration;
1221*fd43cf6eSHans Rosenfeld 	uint16_t	reserved;
1222*fd43cf6eSHans Rosenfeld 	uint32_t	power[2];
1223*fd43cf6eSHans Rosenfeld 	uint32_t	info;
1224*fd43cf6eSHans Rosenfeld 	uint16_t	seq;
1225*fd43cf6eSHans Rosenfeld 	uint16_t	len;
1226*fd43cf6eSHans Rosenfeld 	uint8_t		tlc;
1227*fd43cf6eSHans Rosenfeld 	uint8_t		ratid;
1228*fd43cf6eSHans Rosenfeld 	uint8_t		fc[2];
1229*fd43cf6eSHans Rosenfeld 	uint16_t	status;
1230*fd43cf6eSHans Rosenfeld 	uint16_t	sequence;
1231*fd43cf6eSHans Rosenfeld } __packed;
1232*fd43cf6eSHans Rosenfeld 
1233*fd43cf6eSHans Rosenfeld /* Structure for IWN_BEACON_MISSED notification. */
1234*fd43cf6eSHans Rosenfeld struct iwn_beacon_missed {
1235*fd43cf6eSHans Rosenfeld 	uint32_t	consecutive;
1236*fd43cf6eSHans Rosenfeld 	uint32_t	total;
1237*fd43cf6eSHans Rosenfeld 	uint32_t	expected;
1238*fd43cf6eSHans Rosenfeld 	uint32_t	received;
1239*fd43cf6eSHans Rosenfeld } __packed;
1240*fd43cf6eSHans Rosenfeld 
1241*fd43cf6eSHans Rosenfeld /* Structure for IWN_MPDU_RX_DONE notification. */
1242*fd43cf6eSHans Rosenfeld struct iwn_rx_mpdu {
1243*fd43cf6eSHans Rosenfeld 	uint16_t	len;
1244*fd43cf6eSHans Rosenfeld 	uint16_t	reserved;
1245*fd43cf6eSHans Rosenfeld } __packed;
1246*fd43cf6eSHans Rosenfeld 
1247*fd43cf6eSHans Rosenfeld /* Structures for IWN_RX_DONE and IWN_MPDU_RX_DONE notifications. */
1248*fd43cf6eSHans Rosenfeld struct iwn4965_rx_phystat {
1249*fd43cf6eSHans Rosenfeld 	uint16_t	antenna;
1250*fd43cf6eSHans Rosenfeld 	uint16_t	agc;
1251*fd43cf6eSHans Rosenfeld 	uint8_t		rssi[6];
1252*fd43cf6eSHans Rosenfeld } __packed;
1253*fd43cf6eSHans Rosenfeld 
1254*fd43cf6eSHans Rosenfeld struct iwn5000_rx_phystat {
1255*fd43cf6eSHans Rosenfeld 	uint32_t	reserved1;
1256*fd43cf6eSHans Rosenfeld 	uint32_t	agc;
1257*fd43cf6eSHans Rosenfeld 	uint16_t	rssi[3];
1258*fd43cf6eSHans Rosenfeld } __packed;
1259*fd43cf6eSHans Rosenfeld 
1260*fd43cf6eSHans Rosenfeld struct iwn_rx_stat {
1261*fd43cf6eSHans Rosenfeld 	uint8_t		phy_len;
1262*fd43cf6eSHans Rosenfeld 	uint8_t		cfg_phy_len;
1263*fd43cf6eSHans Rosenfeld #define IWN_STAT_MAXLEN	20
1264*fd43cf6eSHans Rosenfeld 
1265*fd43cf6eSHans Rosenfeld 	uint8_t		id;
1266*fd43cf6eSHans Rosenfeld 	uint8_t		reserved1;
1267*fd43cf6eSHans Rosenfeld 	uint64_t	tstamp;
1268*fd43cf6eSHans Rosenfeld 	uint32_t	beacon;
1269*fd43cf6eSHans Rosenfeld 	uint16_t	flags;
1270*fd43cf6eSHans Rosenfeld #define IWN_STAT_FLAG_SHPREAMBLE	(1 << 2)
1271*fd43cf6eSHans Rosenfeld 
1272*fd43cf6eSHans Rosenfeld 	uint16_t	chan;
1273*fd43cf6eSHans Rosenfeld 	uint8_t		phybuf[32];
1274*fd43cf6eSHans Rosenfeld 	uint8_t		rate;
1275*fd43cf6eSHans Rosenfeld 	uint8_t		rflags;
1276*fd43cf6eSHans Rosenfeld 	uint16_t	xrflags;
1277*fd43cf6eSHans Rosenfeld 	uint16_t	len;
1278*fd43cf6eSHans Rosenfeld 	uint16_t	reserve3;
1279*fd43cf6eSHans Rosenfeld } __packed;
1280*fd43cf6eSHans Rosenfeld 
1281*fd43cf6eSHans Rosenfeld #define IWN_RSSI_TO_DBM	44
1282*fd43cf6eSHans Rosenfeld 
1283*fd43cf6eSHans Rosenfeld /* Structure for IWN_RX_COMPRESSED_BA notification. */
1284*fd43cf6eSHans Rosenfeld struct iwn_compressed_ba {
1285*fd43cf6eSHans Rosenfeld 	uint8_t		macaddr[IEEE80211_ADDR_LEN];
1286*fd43cf6eSHans Rosenfeld 	uint16_t	reserved;
1287*fd43cf6eSHans Rosenfeld 	uint8_t		id;
1288*fd43cf6eSHans Rosenfeld 	uint8_t		tid;
1289*fd43cf6eSHans Rosenfeld 	uint16_t	seq;
1290*fd43cf6eSHans Rosenfeld 	uint64_t	bitmap;
1291*fd43cf6eSHans Rosenfeld 	uint16_t	qid;
1292*fd43cf6eSHans Rosenfeld 	uint16_t	ssn;
1293*fd43cf6eSHans Rosenfeld } __packed;
1294*fd43cf6eSHans Rosenfeld 
1295*fd43cf6eSHans Rosenfeld /* Structure for IWN_START_SCAN notification. */
1296*fd43cf6eSHans Rosenfeld struct iwn_start_scan {
1297*fd43cf6eSHans Rosenfeld 	uint64_t	tstamp;
1298*fd43cf6eSHans Rosenfeld 	uint32_t	tbeacon;
1299*fd43cf6eSHans Rosenfeld 	uint8_t		chan;
1300*fd43cf6eSHans Rosenfeld 	uint8_t		band;
1301*fd43cf6eSHans Rosenfeld 	uint16_t	reserved;
1302*fd43cf6eSHans Rosenfeld 	uint32_t	status;
1303*fd43cf6eSHans Rosenfeld } __packed;
1304*fd43cf6eSHans Rosenfeld 
1305*fd43cf6eSHans Rosenfeld /* Structure for IWN_STOP_SCAN notification. */
1306*fd43cf6eSHans Rosenfeld struct iwn_stop_scan {
1307*fd43cf6eSHans Rosenfeld 	uint8_t		nchan;
1308*fd43cf6eSHans Rosenfeld 	uint8_t		status;
1309*fd43cf6eSHans Rosenfeld 	uint8_t		reserved;
1310*fd43cf6eSHans Rosenfeld 	uint8_t		chan;
1311*fd43cf6eSHans Rosenfeld 	uint64_t	tsf;
1312*fd43cf6eSHans Rosenfeld } __packed;
1313*fd43cf6eSHans Rosenfeld 
1314*fd43cf6eSHans Rosenfeld /* Structure for IWN_SPECTRUM_MEASUREMENT notification. */
1315*fd43cf6eSHans Rosenfeld struct iwn_spectrum_notif {
1316*fd43cf6eSHans Rosenfeld 	uint8_t		id;
1317*fd43cf6eSHans Rosenfeld 	uint8_t		token;
1318*fd43cf6eSHans Rosenfeld 	uint8_t		idx;
1319*fd43cf6eSHans Rosenfeld 	uint8_t		state;
1320*fd43cf6eSHans Rosenfeld #define IWN_MEASUREMENT_START	0
1321*fd43cf6eSHans Rosenfeld #define IWN_MEASUREMENT_STOP	1
1322*fd43cf6eSHans Rosenfeld 
1323*fd43cf6eSHans Rosenfeld 	uint32_t	start;
1324*fd43cf6eSHans Rosenfeld 	uint8_t		band;
1325*fd43cf6eSHans Rosenfeld 	uint8_t		chan;
1326*fd43cf6eSHans Rosenfeld 	uint8_t		type;
1327*fd43cf6eSHans Rosenfeld 	uint8_t		reserved1;
1328*fd43cf6eSHans Rosenfeld 	uint32_t	cca_ofdm;
1329*fd43cf6eSHans Rosenfeld 	uint32_t	cca_cck;
1330*fd43cf6eSHans Rosenfeld 	uint32_t	cca_time;
1331*fd43cf6eSHans Rosenfeld 	uint8_t		basic;
1332*fd43cf6eSHans Rosenfeld 	uint8_t		reserved2[3];
1333*fd43cf6eSHans Rosenfeld 	uint32_t	ofdm[8];
1334*fd43cf6eSHans Rosenfeld 	uint32_t	cck[8];
1335*fd43cf6eSHans Rosenfeld 	uint32_t	stop;
1336*fd43cf6eSHans Rosenfeld 	uint32_t	status;
1337*fd43cf6eSHans Rosenfeld #define IWN_MEASUREMENT_OK		0
1338*fd43cf6eSHans Rosenfeld #define IWN_MEASUREMENT_CONCURRENT	1
1339*fd43cf6eSHans Rosenfeld #define IWN_MEASUREMENT_CSA_CONFLICT	2
1340*fd43cf6eSHans Rosenfeld #define IWN_MEASUREMENT_TGH_CONFLICT	3
1341*fd43cf6eSHans Rosenfeld #define IWN_MEASUREMENT_STOPPED		6
1342*fd43cf6eSHans Rosenfeld #define IWN_MEASUREMENT_TIMEOUT		7
1343*fd43cf6eSHans Rosenfeld #define IWN_MEASUREMENT_FAILED		8
1344*fd43cf6eSHans Rosenfeld } __packed;
1345*fd43cf6eSHans Rosenfeld 
1346*fd43cf6eSHans Rosenfeld /* Structures for IWN_{RX,BEACON}_STATISTICS notification. */
1347*fd43cf6eSHans Rosenfeld struct iwn_rx_phy_stats {
1348*fd43cf6eSHans Rosenfeld 	uint32_t	ina;
1349*fd43cf6eSHans Rosenfeld 	uint32_t	fina;
1350*fd43cf6eSHans Rosenfeld 	uint32_t	bad_plcp;
1351*fd43cf6eSHans Rosenfeld 	uint32_t	bad_crc32;
1352*fd43cf6eSHans Rosenfeld 	uint32_t	overrun;
1353*fd43cf6eSHans Rosenfeld 	uint32_t	eoverrun;
1354*fd43cf6eSHans Rosenfeld 	uint32_t	good_crc32;
1355*fd43cf6eSHans Rosenfeld 	uint32_t	fa;
1356*fd43cf6eSHans Rosenfeld 	uint32_t	bad_fina_sync;
1357*fd43cf6eSHans Rosenfeld 	uint32_t	sfd_timeout;
1358*fd43cf6eSHans Rosenfeld 	uint32_t	fina_timeout;
1359*fd43cf6eSHans Rosenfeld 	uint32_t	no_rts_ack;
1360*fd43cf6eSHans Rosenfeld 	uint32_t	rxe_limit;
1361*fd43cf6eSHans Rosenfeld 	uint32_t	ack;
1362*fd43cf6eSHans Rosenfeld 	uint32_t	cts;
1363*fd43cf6eSHans Rosenfeld 	uint32_t	ba_resp;
1364*fd43cf6eSHans Rosenfeld 	uint32_t	dsp_kill;
1365*fd43cf6eSHans Rosenfeld 	uint32_t	bad_mh;
1366*fd43cf6eSHans Rosenfeld 	uint32_t	rssi_sum;
1367*fd43cf6eSHans Rosenfeld 	uint32_t	reserved;
1368*fd43cf6eSHans Rosenfeld } __packed;
1369*fd43cf6eSHans Rosenfeld 
1370*fd43cf6eSHans Rosenfeld struct iwn_rx_general_stats {
1371*fd43cf6eSHans Rosenfeld 	uint32_t	bad_cts;
1372*fd43cf6eSHans Rosenfeld 	uint32_t	bad_ack;
1373*fd43cf6eSHans Rosenfeld 	uint32_t	not_bss;
1374*fd43cf6eSHans Rosenfeld 	uint32_t	filtered;
1375*fd43cf6eSHans Rosenfeld 	uint32_t	bad_chan;
1376*fd43cf6eSHans Rosenfeld 	uint32_t	beacons;
1377*fd43cf6eSHans Rosenfeld 	uint32_t	missed_beacons;
1378*fd43cf6eSHans Rosenfeld 	uint32_t	adc_saturated;	/* time in 0.8us */
1379*fd43cf6eSHans Rosenfeld 	uint32_t	ina_searched;	/* time in 0.8us */
1380*fd43cf6eSHans Rosenfeld 	int32_t		noise[3];
1381*fd43cf6eSHans Rosenfeld 	uint32_t	flags;
1382*fd43cf6eSHans Rosenfeld 	uint32_t	load;
1383*fd43cf6eSHans Rosenfeld 	uint32_t	fa;
1384*fd43cf6eSHans Rosenfeld 	uint32_t	rssi[3];
1385*fd43cf6eSHans Rosenfeld 	uint32_t	energy[3];
1386*fd43cf6eSHans Rosenfeld } __packed;
1387*fd43cf6eSHans Rosenfeld 
1388*fd43cf6eSHans Rosenfeld struct iwn_rx_ht_phy_stats {
1389*fd43cf6eSHans Rosenfeld 	uint32_t	bad_plcp;
1390*fd43cf6eSHans Rosenfeld 	uint32_t	overrun;
1391*fd43cf6eSHans Rosenfeld 	uint32_t	eoverrun;
1392*fd43cf6eSHans Rosenfeld 	uint32_t	good_crc32;
1393*fd43cf6eSHans Rosenfeld 	uint32_t	bad_crc32;
1394*fd43cf6eSHans Rosenfeld 	uint32_t	bad_mh;
1395*fd43cf6eSHans Rosenfeld 	uint32_t	good_ampdu_crc32;
1396*fd43cf6eSHans Rosenfeld 	uint32_t	ampdu;
1397*fd43cf6eSHans Rosenfeld 	uint32_t	fragment;
1398*fd43cf6eSHans Rosenfeld 	uint32_t	reserved;
1399*fd43cf6eSHans Rosenfeld } __packed;
1400*fd43cf6eSHans Rosenfeld 
1401*fd43cf6eSHans Rosenfeld struct iwn_rx_stats {
1402*fd43cf6eSHans Rosenfeld 	struct iwn_rx_phy_stats		ofdm;
1403*fd43cf6eSHans Rosenfeld 	struct iwn_rx_phy_stats		cck;
1404*fd43cf6eSHans Rosenfeld 	struct iwn_rx_general_stats	general;
1405*fd43cf6eSHans Rosenfeld 	struct iwn_rx_ht_phy_stats	ht;
1406*fd43cf6eSHans Rosenfeld } __packed;
1407*fd43cf6eSHans Rosenfeld 
1408*fd43cf6eSHans Rosenfeld struct iwn_tx_stats {
1409*fd43cf6eSHans Rosenfeld 	uint32_t	preamble;
1410*fd43cf6eSHans Rosenfeld 	uint32_t	rx_detected;
1411*fd43cf6eSHans Rosenfeld 	uint32_t	bt_defer;
1412*fd43cf6eSHans Rosenfeld 	uint32_t	bt_kill;
1413*fd43cf6eSHans Rosenfeld 	uint32_t	short_len;
1414*fd43cf6eSHans Rosenfeld 	uint32_t	cts_timeout;
1415*fd43cf6eSHans Rosenfeld 	uint32_t	ack_timeout;
1416*fd43cf6eSHans Rosenfeld 	uint32_t	exp_ack;
1417*fd43cf6eSHans Rosenfeld 	uint32_t	ack;
1418*fd43cf6eSHans Rosenfeld 	uint32_t	msdu;
1419*fd43cf6eSHans Rosenfeld 	uint32_t	busrt_err1;
1420*fd43cf6eSHans Rosenfeld 	uint32_t	burst_err2;
1421*fd43cf6eSHans Rosenfeld 	uint32_t	cts_collision;
1422*fd43cf6eSHans Rosenfeld 	uint32_t	ack_collision;
1423*fd43cf6eSHans Rosenfeld 	uint32_t	ba_timeout;
1424*fd43cf6eSHans Rosenfeld 	uint32_t	ba_resched;
1425*fd43cf6eSHans Rosenfeld 	uint32_t	query_ampdu;
1426*fd43cf6eSHans Rosenfeld 	uint32_t	query;
1427*fd43cf6eSHans Rosenfeld 	uint32_t	query_ampdu_frag;
1428*fd43cf6eSHans Rosenfeld 	uint32_t	query_mismatch;
1429*fd43cf6eSHans Rosenfeld 	uint32_t	not_ready;
1430*fd43cf6eSHans Rosenfeld 	uint32_t	underrun;
1431*fd43cf6eSHans Rosenfeld 	uint32_t	bt_ht_kill;
1432*fd43cf6eSHans Rosenfeld 	uint32_t	rx_ba_resp;
1433*fd43cf6eSHans Rosenfeld 	uint32_t	reserved[2];
1434*fd43cf6eSHans Rosenfeld } __packed;
1435*fd43cf6eSHans Rosenfeld 
1436*fd43cf6eSHans Rosenfeld struct iwn_general_stats {
1437*fd43cf6eSHans Rosenfeld 	uint32_t	temp;
1438*fd43cf6eSHans Rosenfeld 	uint32_t	temp_m;
1439*fd43cf6eSHans Rosenfeld 	uint32_t	burst_check;
1440*fd43cf6eSHans Rosenfeld 	uint32_t	burst;
1441*fd43cf6eSHans Rosenfeld 	uint32_t	reserved1[4];
1442*fd43cf6eSHans Rosenfeld 	uint32_t	sleep;
1443*fd43cf6eSHans Rosenfeld 	uint32_t	slot_out;
1444*fd43cf6eSHans Rosenfeld 	uint32_t	slot_idle;
1445*fd43cf6eSHans Rosenfeld 	uint32_t	ttl_tstamp;
1446*fd43cf6eSHans Rosenfeld 	uint32_t	tx_ant_a;
1447*fd43cf6eSHans Rosenfeld 	uint32_t	tx_ant_b;
1448*fd43cf6eSHans Rosenfeld 	uint32_t	exec;
1449*fd43cf6eSHans Rosenfeld 	uint32_t	probe;
1450*fd43cf6eSHans Rosenfeld 	uint32_t	reserved2[2];
1451*fd43cf6eSHans Rosenfeld 	uint32_t	rx_enabled;
1452*fd43cf6eSHans Rosenfeld 	uint32_t	reserved3[3];
1453*fd43cf6eSHans Rosenfeld } __packed;
1454*fd43cf6eSHans Rosenfeld 
1455*fd43cf6eSHans Rosenfeld struct iwn_stats {
1456*fd43cf6eSHans Rosenfeld 	uint32_t			flags;
1457*fd43cf6eSHans Rosenfeld 	struct iwn_rx_stats		rx;
1458*fd43cf6eSHans Rosenfeld 	struct iwn_tx_stats		tx;
1459*fd43cf6eSHans Rosenfeld 	struct iwn_general_stats	general;
1460*fd43cf6eSHans Rosenfeld } __packed;
1461*fd43cf6eSHans Rosenfeld 
1462*fd43cf6eSHans Rosenfeld 
1463*fd43cf6eSHans Rosenfeld /* Firmware error dump. */
1464*fd43cf6eSHans Rosenfeld struct iwn_fw_dump {
1465*fd43cf6eSHans Rosenfeld 	uint32_t	valid;
1466*fd43cf6eSHans Rosenfeld 	uint32_t	id;
1467*fd43cf6eSHans Rosenfeld 	uint32_t	pc;
1468*fd43cf6eSHans Rosenfeld 	uint32_t	branch_link[2];
1469*fd43cf6eSHans Rosenfeld 	uint32_t	interrupt_link[2];
1470*fd43cf6eSHans Rosenfeld 	uint32_t	error_data[2];
1471*fd43cf6eSHans Rosenfeld 	uint32_t	src_line;
1472*fd43cf6eSHans Rosenfeld 	uint32_t	tsf;
1473*fd43cf6eSHans Rosenfeld 	uint32_t	time[2];
1474*fd43cf6eSHans Rosenfeld } __packed;
1475*fd43cf6eSHans Rosenfeld 
1476*fd43cf6eSHans Rosenfeld /* TLV firmware header. */
1477*fd43cf6eSHans Rosenfeld struct iwn_fw_tlv_hdr {
1478*fd43cf6eSHans Rosenfeld 	uint32_t	zero;	/* Always 0, to differentiate from legacy. */
1479*fd43cf6eSHans Rosenfeld 	uint32_t	signature;
1480*fd43cf6eSHans Rosenfeld #define IWN_FW_SIGNATURE	0x0a4c5749	/* "IWL\n" */
1481*fd43cf6eSHans Rosenfeld 
1482*fd43cf6eSHans Rosenfeld 	uint8_t		descr[64];
1483*fd43cf6eSHans Rosenfeld 	uint32_t	rev;
1484*fd43cf6eSHans Rosenfeld #define IWN_FW_API(x)	(((x) >> 8) & 0xff)
1485*fd43cf6eSHans Rosenfeld 
1486*fd43cf6eSHans Rosenfeld 	uint32_t	build;
1487*fd43cf6eSHans Rosenfeld 	uint64_t	altmask;
1488*fd43cf6eSHans Rosenfeld } __packed;
1489*fd43cf6eSHans Rosenfeld 
1490*fd43cf6eSHans Rosenfeld /* TLV header. */
1491*fd43cf6eSHans Rosenfeld struct iwn_fw_tlv {
1492*fd43cf6eSHans Rosenfeld 	uint16_t	type;
1493*fd43cf6eSHans Rosenfeld #define IWN_FW_TLV_MAIN_TEXT		1
1494*fd43cf6eSHans Rosenfeld #define IWN_FW_TLV_MAIN_DATA		2
1495*fd43cf6eSHans Rosenfeld #define IWN_FW_TLV_INIT_TEXT		3
1496*fd43cf6eSHans Rosenfeld #define IWN_FW_TLV_INIT_DATA		4
1497*fd43cf6eSHans Rosenfeld #define IWN_FW_TLV_BOOT_TEXT		5
1498*fd43cf6eSHans Rosenfeld #define IWN_FW_TLV_PBREQ_MAXLEN		6
1499*fd43cf6eSHans Rosenfeld #define IWN_FW_TLV_ENH_SENS		14
1500*fd43cf6eSHans Rosenfeld #define IWN_FW_TLV_PHY_CALIB		15
1501*fd43cf6eSHans Rosenfeld #define IWN_FW_TLV_FLAGS		18
1502*fd43cf6eSHans Rosenfeld 
1503*fd43cf6eSHans Rosenfeld 	uint16_t	alt;
1504*fd43cf6eSHans Rosenfeld 	uint32_t	len;
1505*fd43cf6eSHans Rosenfeld } __packed;
1506*fd43cf6eSHans Rosenfeld 
1507*fd43cf6eSHans Rosenfeld #define IWN4965_FW_TEXT_MAXSZ	( 96 * 1024)
1508*fd43cf6eSHans Rosenfeld #define IWN4965_FW_DATA_MAXSZ	( 40 * 1024)
1509*fd43cf6eSHans Rosenfeld #define IWN5000_FW_TEXT_MAXSZ	(256 * 1024)
1510*fd43cf6eSHans Rosenfeld #define IWN5000_FW_DATA_MAXSZ	( 80 * 1024)
1511*fd43cf6eSHans Rosenfeld #define IWN_FW_BOOT_TEXT_MAXSZ	1024
1512*fd43cf6eSHans Rosenfeld #define IWN4965_FWSZ		(IWN4965_FW_TEXT_MAXSZ + IWN4965_FW_DATA_MAXSZ)
1513*fd43cf6eSHans Rosenfeld #define IWN5000_FWSZ		IWN5000_FW_TEXT_MAXSZ
1514*fd43cf6eSHans Rosenfeld 
1515*fd43cf6eSHans Rosenfeld /**
1516*fd43cf6eSHans Rosenfeld  * enum iwn_ucode_tlv_flag - ucode API flags
1517*fd43cf6eSHans Rosenfeld  * @IWN_UCODE_TLV_FLAGS_PAN: This is PAN capable microcode; this previously
1518*fd43cf6eSHans Rosenfeld  *      was a separate TLV but moved here to save space.
1519*fd43cf6eSHans Rosenfeld  * @IWN_UCODE_TLV_FLAGS_NEWSCAN: new uCode scan behaviour on hidden SSID,
1520*fd43cf6eSHans Rosenfeld  *      treats good CRC threshold as a boolean
1521*fd43cf6eSHans Rosenfeld  * @IWN_UCODE_TLV_FLAGS_MFP: This uCode image supports MFP (802.11w).
1522*fd43cf6eSHans Rosenfeld  * @IWN_UCODE_TLV_FLAGS_P2P: This uCode image supports P2P.
1523*fd43cf6eSHans Rosenfeld  * @IWN_UCODE_TLV_FLAGS_DW_BC_TABLE: The SCD byte count table is in DWORDS
1524*fd43cf6eSHans Rosenfeld  * @IWN_UCODE_TLV_FLAGS_UAPSD: This uCode image supports uAPSD
1525*fd43cf6eSHans Rosenfeld  * @IWN_UCODE_TLV_FLAGS_SHORT_BL: 16 entries of black list instead of 64 in scan
1526*fd43cf6eSHans Rosenfeld  *      offload profile config command.
1527*fd43cf6eSHans Rosenfeld  * @IWN_UCODE_TLV_FLAGS_RX_ENERGY_API: supports rx signal strength api
1528*fd43cf6eSHans Rosenfeld  * @IWN_UCODE_TLV_FLAGS_TIME_EVENT_API_V2: using the new time event API.
1529*fd43cf6eSHans Rosenfeld  * @IWN_UCODE_TLV_FLAGS_D3_6_IPV6_ADDRS: D3 image supports up to six
1530*fd43cf6eSHans Rosenfeld  *      (rather than two) IPv6 addresses
1531*fd43cf6eSHans Rosenfeld  * @IWN_UCODE_TLV_FLAGS_BF_UPDATED: new beacon filtering API
1532*fd43cf6eSHans Rosenfeld  * @IWN_UCODE_TLV_FLAGS_NO_BASIC_SSID: not sending a probe with the SSID element
1533*fd43cf6eSHans Rosenfeld  *      from the probe request template.
1534*fd43cf6eSHans Rosenfeld  * @IWN_UCODE_TLV_FLAGS_D3_CONTINUITY_API: modified D3 API to allow keeping
1535*fd43cf6eSHans Rosenfeld  *      connection when going back to D0
1536*fd43cf6eSHans Rosenfeld  * @IWN_UCODE_TLV_FLAGS_NEW_NSOFFL_SMALL: new NS offload (small version)
1537*fd43cf6eSHans Rosenfeld  * @IWN_UCODE_TLV_FLAGS_NEW_NSOFFL_LARGE: new NS offload (large version)
1538*fd43cf6eSHans Rosenfeld  * @IWN_UCODE_TLV_FLAGS_SCHED_SCAN: this uCode image supports scheduled scan.
1539*fd43cf6eSHans Rosenfeld  * @IWN_UCODE_TLV_FLAGS_STA_KEY_CMD: new ADD_STA and ADD_STA_KEY command API
1540*fd43cf6eSHans Rosenfeld  * @IWN_UCODE_TLV_FLAGS_DEVICE_PS_CMD: support device wide power command
1541*fd43cf6eSHans Rosenfeld  *      containing CAM (Continuous Active Mode) indication.
1542*fd43cf6eSHans Rosenfeld  */
1543*fd43cf6eSHans Rosenfeld enum iwn_ucode_tlv_flag {
1544*fd43cf6eSHans Rosenfeld 	IWN_UCODE_TLV_FLAGS_PAN			= (1 << 0),
1545*fd43cf6eSHans Rosenfeld 	IWN_UCODE_TLV_FLAGS_NEWSCAN		= (1 << 1),
1546*fd43cf6eSHans Rosenfeld 	IWN_UCODE_TLV_FLAGS_MFP			= (1 << 2),
1547*fd43cf6eSHans Rosenfeld 	IWN_UCODE_TLV_FLAGS_P2P			= (1 << 3),
1548*fd43cf6eSHans Rosenfeld 	IWN_UCODE_TLV_FLAGS_DW_BC_TABLE		= (1 << 4),
1549*fd43cf6eSHans Rosenfeld 	IWN_UCODE_TLV_FLAGS_NEWBT_COEX		= (1 << 5),
1550*fd43cf6eSHans Rosenfeld 	IWN_UCODE_TLV_FLAGS_UAPSD		= (1 << 6),
1551*fd43cf6eSHans Rosenfeld 	IWN_UCODE_TLV_FLAGS_SHORT_BL		= (1 << 7),
1552*fd43cf6eSHans Rosenfeld 	IWN_UCODE_TLV_FLAGS_RX_ENERGY_API	= (1 << 8),
1553*fd43cf6eSHans Rosenfeld 	IWN_UCODE_TLV_FLAGS_TIME_EVENT_API_V2	= (1 << 9),
1554*fd43cf6eSHans Rosenfeld 	IWN_UCODE_TLV_FLAGS_D3_6_IPV6_ADDRS	= (1 << 10),
1555*fd43cf6eSHans Rosenfeld 	IWN_UCODE_TLV_FLAGS_BF_UPDATED		= (1 << 11),
1556*fd43cf6eSHans Rosenfeld 	IWN_UCODE_TLV_FLAGS_NO_BASIC_SSID	= (1 << 12),
1557*fd43cf6eSHans Rosenfeld 	IWN_UCODE_TLV_FLAGS_D3_CONTINUITY_API	= (1 << 14),
1558*fd43cf6eSHans Rosenfeld 	IWN_UCODE_TLV_FLAGS_NEW_NSOFFL_SMALL	= (1 << 15),
1559*fd43cf6eSHans Rosenfeld 	IWN_UCODE_TLV_FLAGS_NEW_NSOFFL_LARGE	= (1 << 16),
1560*fd43cf6eSHans Rosenfeld 	IWN_UCODE_TLV_FLAGS_SCHED_SCAN		= (1 << 17),
1561*fd43cf6eSHans Rosenfeld 	IWN_UCODE_TLV_FLAGS_STA_KEY_CMD		= (1 << 19),
1562*fd43cf6eSHans Rosenfeld 	IWN_UCODE_TLV_FLAGS_DEVICE_PS_CMD	= (1 << 20),
1563*fd43cf6eSHans Rosenfeld };
1564*fd43cf6eSHans Rosenfeld 
1565*fd43cf6eSHans Rosenfeld /*
1566*fd43cf6eSHans Rosenfeld  * Offsets into EEPROM.
1567*fd43cf6eSHans Rosenfeld  */
1568*fd43cf6eSHans Rosenfeld #define IWN_EEPROM_MAC		0x015
1569*fd43cf6eSHans Rosenfeld #define IWN_EEPROM_SKU_CAP	0x045
1570*fd43cf6eSHans Rosenfeld #define IWN_EEPROM_RFCFG	0x048
1571*fd43cf6eSHans Rosenfeld #define IWN4965_EEPROM_DOMAIN	0x060
1572*fd43cf6eSHans Rosenfeld #define IWN4965_EEPROM_BAND1	0x063
1573*fd43cf6eSHans Rosenfeld #define IWN5000_EEPROM_REG	0x066
1574*fd43cf6eSHans Rosenfeld #define IWN5000_EEPROM_CAL	0x067
1575*fd43cf6eSHans Rosenfeld #define IWN4965_EEPROM_BAND2	0x072
1576*fd43cf6eSHans Rosenfeld #define IWN4965_EEPROM_BAND3	0x080
1577*fd43cf6eSHans Rosenfeld #define IWN4965_EEPROM_BAND4	0x08d
1578*fd43cf6eSHans Rosenfeld #define IWN4965_EEPROM_BAND5	0x099
1579*fd43cf6eSHans Rosenfeld #define IWN4965_EEPROM_BAND6	0x0a0
1580*fd43cf6eSHans Rosenfeld #define IWN4965_EEPROM_BAND7	0x0a8
1581*fd43cf6eSHans Rosenfeld #define IWN4965_EEPROM_MAXPOW	0x0e8
1582*fd43cf6eSHans Rosenfeld #define IWN4965_EEPROM_VOLTAGE	0x0e9
1583*fd43cf6eSHans Rosenfeld #define IWN4965_EEPROM_BANDS	0x0ea
1584*fd43cf6eSHans Rosenfeld /* Indirect offsets. */
1585*fd43cf6eSHans Rosenfeld #define IWN5000_EEPROM_DOMAIN	0x001
1586*fd43cf6eSHans Rosenfeld #define IWN5000_EEPROM_BAND1	0x004
1587*fd43cf6eSHans Rosenfeld #define IWN5000_EEPROM_BAND2	0x013
1588*fd43cf6eSHans Rosenfeld #define IWN5000_EEPROM_BAND3	0x021
1589*fd43cf6eSHans Rosenfeld #define IWN5000_EEPROM_BAND4	0x02e
1590*fd43cf6eSHans Rosenfeld #define IWN5000_EEPROM_BAND5	0x03a
1591*fd43cf6eSHans Rosenfeld #define IWN5000_EEPROM_BAND6	0x041
1592*fd43cf6eSHans Rosenfeld #define IWN5000_EEPROM_BAND7	0x049
1593*fd43cf6eSHans Rosenfeld #define IWN6000_EEPROM_ENHINFO	0x054
1594*fd43cf6eSHans Rosenfeld #define IWN5000_EEPROM_CRYSTAL	0x128
1595*fd43cf6eSHans Rosenfeld #define IWN5000_EEPROM_TEMP	0x12a
1596*fd43cf6eSHans Rosenfeld #define IWN5000_EEPROM_VOLT	0x12b
1597*fd43cf6eSHans Rosenfeld #define IWN2000_EEPROM_RAWTEMP	0x12b
1598*fd43cf6eSHans Rosenfeld 
1599*fd43cf6eSHans Rosenfeld /* Possible flags for IWN_EEPROM_SKU_CAP. */
1600*fd43cf6eSHans Rosenfeld #define IWN_EEPROM_SKU_CAP_11N	(1 << 6)
1601*fd43cf6eSHans Rosenfeld #define IWN_EEPROM_SKU_CAP_AMT	(1 << 7)
1602*fd43cf6eSHans Rosenfeld #define IWN_EEPROM_SKU_CAP_IPAN	(1 << 8)
1603*fd43cf6eSHans Rosenfeld 
1604*fd43cf6eSHans Rosenfeld /* Possible flags for IWN_EEPROM_RFCFG. */
1605*fd43cf6eSHans Rosenfeld #define IWN_RFCFG_TYPE(x)	(((x) >>  0) & 0x3)
1606*fd43cf6eSHans Rosenfeld #define IWN_RFCFG_STEP(x)	(((x) >>  2) & 0x3)
1607*fd43cf6eSHans Rosenfeld #define IWN_RFCFG_DASH(x)	(((x) >>  4) & 0x3)
1608*fd43cf6eSHans Rosenfeld #define IWN_RFCFG_TXANTMSK(x)	(((x) >>  8) & 0xf)
1609*fd43cf6eSHans Rosenfeld #define IWN_RFCFG_RXANTMSK(x)	(((x) >> 12) & 0xf)
1610*fd43cf6eSHans Rosenfeld 
1611*fd43cf6eSHans Rosenfeld struct iwn_eeprom_chan {
1612*fd43cf6eSHans Rosenfeld 	uint8_t	flags;
1613*fd43cf6eSHans Rosenfeld #define IWN_EEPROM_CHAN_VALID	(1 << 0)
1614*fd43cf6eSHans Rosenfeld #define IWN_EEPROM_CHAN_IBSS	(1 << 1)
1615*fd43cf6eSHans Rosenfeld #define IWN_EEPROM_CHAN_ACTIVE	(1 << 3)
1616*fd43cf6eSHans Rosenfeld #define IWN_EEPROM_CHAN_RADAR	(1 << 4)
1617*fd43cf6eSHans Rosenfeld #define	IWN_EEPROM_CHAN_WIDE	(1 << 5)
1618*fd43cf6eSHans Rosenfeld #define	IWN_EEPROM_CHAN_DFS	(1 << 7)
1619*fd43cf6eSHans Rosenfeld 
1620*fd43cf6eSHans Rosenfeld 	int8_t	maxpwr;
1621*fd43cf6eSHans Rosenfeld } __packed;
1622*fd43cf6eSHans Rosenfeld 
1623*fd43cf6eSHans Rosenfeld struct iwn_eeprom_enhinfo {
1624*fd43cf6eSHans Rosenfeld 	uint16_t	chan;
1625*fd43cf6eSHans Rosenfeld 	int8_t		chain[3];	/* max power in half-dBm */
1626*fd43cf6eSHans Rosenfeld 	uint8_t		reserved;
1627*fd43cf6eSHans Rosenfeld 	int8_t		mimo2;		/* max power in half-dBm */
1628*fd43cf6eSHans Rosenfeld 	int8_t		mimo3;		/* max power in half-dBm */
1629*fd43cf6eSHans Rosenfeld } __packed;
1630*fd43cf6eSHans Rosenfeld 
1631*fd43cf6eSHans Rosenfeld struct iwn5000_eeprom_calib_hdr {
1632*fd43cf6eSHans Rosenfeld 	uint8_t		version;
1633*fd43cf6eSHans Rosenfeld 	uint8_t		pa_type;
1634*fd43cf6eSHans Rosenfeld 	uint16_t	volt;
1635*fd43cf6eSHans Rosenfeld } __packed;
1636*fd43cf6eSHans Rosenfeld 
1637*fd43cf6eSHans Rosenfeld #define IWN_NSAMPLES	3
1638*fd43cf6eSHans Rosenfeld struct iwn4965_eeprom_chan_samples {
1639*fd43cf6eSHans Rosenfeld 	uint8_t	num;
1640*fd43cf6eSHans Rosenfeld 	struct {
1641*fd43cf6eSHans Rosenfeld 		uint8_t temp;
1642*fd43cf6eSHans Rosenfeld 		uint8_t	gain;
1643*fd43cf6eSHans Rosenfeld 		uint8_t	power;
1644*fd43cf6eSHans Rosenfeld 		int8_t	pa_det;
1645*fd43cf6eSHans Rosenfeld 	}	samples[2][IWN_NSAMPLES];
1646*fd43cf6eSHans Rosenfeld } __packed;
1647*fd43cf6eSHans Rosenfeld 
1648*fd43cf6eSHans Rosenfeld #define IWN_NBANDS	8
1649*fd43cf6eSHans Rosenfeld struct iwn4965_eeprom_band {
1650*fd43cf6eSHans Rosenfeld 	uint8_t	lo;	/* low channel number */
1651*fd43cf6eSHans Rosenfeld 	uint8_t	hi;	/* high channel number */
1652*fd43cf6eSHans Rosenfeld 	struct	iwn4965_eeprom_chan_samples chans[2];
1653*fd43cf6eSHans Rosenfeld } __packed;
1654*fd43cf6eSHans Rosenfeld 
1655*fd43cf6eSHans Rosenfeld /*
1656*fd43cf6eSHans Rosenfeld  * Offsets of channels descriptions in EEPROM.
1657*fd43cf6eSHans Rosenfeld  */
1658*fd43cf6eSHans Rosenfeld static const uint32_t iwn4965_regulatory_bands[IWN_NBANDS] = {
1659*fd43cf6eSHans Rosenfeld 	IWN4965_EEPROM_BAND1,
1660*fd43cf6eSHans Rosenfeld 	IWN4965_EEPROM_BAND2,
1661*fd43cf6eSHans Rosenfeld 	IWN4965_EEPROM_BAND3,
1662*fd43cf6eSHans Rosenfeld 	IWN4965_EEPROM_BAND4,
1663*fd43cf6eSHans Rosenfeld 	IWN4965_EEPROM_BAND5,
1664*fd43cf6eSHans Rosenfeld 	IWN4965_EEPROM_BAND6,
1665*fd43cf6eSHans Rosenfeld 	IWN4965_EEPROM_BAND7
1666*fd43cf6eSHans Rosenfeld };
1667*fd43cf6eSHans Rosenfeld 
1668*fd43cf6eSHans Rosenfeld static const uint32_t iwn5000_regulatory_bands[IWN_NBANDS] = {
1669*fd43cf6eSHans Rosenfeld 	IWN5000_EEPROM_BAND1,
1670*fd43cf6eSHans Rosenfeld 	IWN5000_EEPROM_BAND2,
1671*fd43cf6eSHans Rosenfeld 	IWN5000_EEPROM_BAND3,
1672*fd43cf6eSHans Rosenfeld 	IWN5000_EEPROM_BAND4,
1673*fd43cf6eSHans Rosenfeld 	IWN5000_EEPROM_BAND5,
1674*fd43cf6eSHans Rosenfeld 	IWN5000_EEPROM_BAND6,
1675*fd43cf6eSHans Rosenfeld 	IWN5000_EEPROM_BAND7
1676*fd43cf6eSHans Rosenfeld };
1677*fd43cf6eSHans Rosenfeld 
1678*fd43cf6eSHans Rosenfeld #define IWN_CHAN_BANDS_COUNT	 7
1679*fd43cf6eSHans Rosenfeld #define IWN_MAX_CHAN_PER_BAND	14
1680*fd43cf6eSHans Rosenfeld static const struct iwn_chan_band {
1681*fd43cf6eSHans Rosenfeld 	uint8_t	nchan;
1682*fd43cf6eSHans Rosenfeld 	uint8_t	chan[IWN_MAX_CHAN_PER_BAND];
1683*fd43cf6eSHans Rosenfeld } iwn_bands[] = {
1684*fd43cf6eSHans Rosenfeld 	/* 20MHz channels, 2GHz band. */
1685*fd43cf6eSHans Rosenfeld 	{ 14, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 } },
1686*fd43cf6eSHans Rosenfeld 	/* 20MHz channels, 5GHz band. */
1687*fd43cf6eSHans Rosenfeld 	{ 13, { 183, 184, 185, 187, 188, 189, 192, 196, 7, 8, 11, 12, 16 } },
1688*fd43cf6eSHans Rosenfeld 	{ 12, { 34, 36, 38, 40, 42, 44, 46, 48, 52, 56, 60, 64 } },
1689*fd43cf6eSHans Rosenfeld 	{ 11, { 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140 } },
1690*fd43cf6eSHans Rosenfeld 	{  6, { 145, 149, 153, 157, 161, 165 } },
1691*fd43cf6eSHans Rosenfeld 	/* 40MHz channels (primary channels), 2GHz band. */
1692*fd43cf6eSHans Rosenfeld 	{  7, { 1, 2, 3, 4, 5, 6, 7 } },
1693*fd43cf6eSHans Rosenfeld 	/* 40MHz channels (primary channels), 5GHz band. */
1694*fd43cf6eSHans Rosenfeld 	{ 11, { 36, 44, 52, 60, 100, 108, 116, 124, 132, 149, 157 } }
1695*fd43cf6eSHans Rosenfeld };
1696*fd43cf6eSHans Rosenfeld 
1697*fd43cf6eSHans Rosenfeld #define IWN1000_OTP_NBLOCKS	3
1698*fd43cf6eSHans Rosenfeld #define IWN6000_OTP_NBLOCKS	4
1699*fd43cf6eSHans Rosenfeld #define IWN6050_OTP_NBLOCKS	7
1700*fd43cf6eSHans Rosenfeld 
1701*fd43cf6eSHans Rosenfeld /* HW rate indices. */
1702*fd43cf6eSHans Rosenfeld #define IWN_RIDX_CCK1	0
1703*fd43cf6eSHans Rosenfeld #define IWN_RIDX_OFDM6	4
1704*fd43cf6eSHans Rosenfeld 
1705*fd43cf6eSHans Rosenfeld static const struct iwn_rate {
1706*fd43cf6eSHans Rosenfeld 	uint8_t	rate;
1707*fd43cf6eSHans Rosenfeld 	uint8_t	plcp;
1708*fd43cf6eSHans Rosenfeld 	uint8_t	flags;
1709*fd43cf6eSHans Rosenfeld } iwn_rates[IWN_RIDX_MAX + 1] = {
1710*fd43cf6eSHans Rosenfeld 	{   2,  10, IWN_RFLAG_CCK },
1711*fd43cf6eSHans Rosenfeld 	{   4,  20, IWN_RFLAG_CCK },
1712*fd43cf6eSHans Rosenfeld 	{  11,  55, IWN_RFLAG_CCK },
1713*fd43cf6eSHans Rosenfeld 	{  22, 110, IWN_RFLAG_CCK },
1714*fd43cf6eSHans Rosenfeld 	{  12, 0xd, 0 },
1715*fd43cf6eSHans Rosenfeld 	{  18, 0xf, 0 },
1716*fd43cf6eSHans Rosenfeld 	{  24, 0x5, 0 },
1717*fd43cf6eSHans Rosenfeld 	{  36, 0x7, 0 },
1718*fd43cf6eSHans Rosenfeld 	{  48, 0x9, 0 },
1719*fd43cf6eSHans Rosenfeld 	{  72, 0xb, 0 },
1720*fd43cf6eSHans Rosenfeld 	{  96, 0x1, 0 },
1721*fd43cf6eSHans Rosenfeld 	{ 108, 0x3, 0 },
1722*fd43cf6eSHans Rosenfeld 	{ 120, 0x3, 0 }
1723*fd43cf6eSHans Rosenfeld };
1724*fd43cf6eSHans Rosenfeld 
1725*fd43cf6eSHans Rosenfeld #define IWN4965_MAX_PWR_INDEX	107
1726*fd43cf6eSHans Rosenfeld 
1727*fd43cf6eSHans Rosenfeld /*
1728*fd43cf6eSHans Rosenfeld  * RF Tx gain values from highest to lowest power (values obtained from
1729*fd43cf6eSHans Rosenfeld  * the reference driver.)
1730*fd43cf6eSHans Rosenfeld  */
1731*fd43cf6eSHans Rosenfeld static const uint8_t iwn4965_rf_gain_2ghz[IWN4965_MAX_PWR_INDEX + 1] = {
1732*fd43cf6eSHans Rosenfeld 	0x3f, 0x3f, 0x3f, 0x3e, 0x3e, 0x3e, 0x3d, 0x3d, 0x3d, 0x3c, 0x3c,
1733*fd43cf6eSHans Rosenfeld 	0x3c, 0x3b, 0x3b, 0x3b, 0x3a, 0x3a, 0x3a, 0x39, 0x39, 0x39, 0x38,
1734*fd43cf6eSHans Rosenfeld 	0x38, 0x38, 0x37, 0x37, 0x37, 0x36, 0x36, 0x36, 0x35, 0x35, 0x35,
1735*fd43cf6eSHans Rosenfeld 	0x34, 0x34, 0x34, 0x33, 0x33, 0x33, 0x32, 0x32, 0x32, 0x31, 0x31,
1736*fd43cf6eSHans Rosenfeld 	0x31, 0x30, 0x30, 0x30, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x04,
1737*fd43cf6eSHans Rosenfeld 	0x04, 0x04, 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01,
1738*fd43cf6eSHans Rosenfeld 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1739*fd43cf6eSHans Rosenfeld 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1740*fd43cf6eSHans Rosenfeld 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1741*fd43cf6eSHans Rosenfeld 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
1742*fd43cf6eSHans Rosenfeld };
1743*fd43cf6eSHans Rosenfeld 
1744*fd43cf6eSHans Rosenfeld static const uint8_t iwn4965_rf_gain_5ghz[IWN4965_MAX_PWR_INDEX + 1] = {
1745*fd43cf6eSHans Rosenfeld 	0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3e, 0x3e, 0x3e, 0x3d, 0x3d, 0x3d,
1746*fd43cf6eSHans Rosenfeld 	0x3c, 0x3c, 0x3c, 0x3b, 0x3b, 0x3b, 0x3a, 0x3a, 0x3a, 0x39, 0x39,
1747*fd43cf6eSHans Rosenfeld 	0x39, 0x38, 0x38, 0x38, 0x37, 0x37, 0x37, 0x36, 0x36, 0x36, 0x35,
1748*fd43cf6eSHans Rosenfeld 	0x35, 0x35, 0x34, 0x34, 0x34, 0x33, 0x33, 0x33, 0x32, 0x32, 0x32,
1749*fd43cf6eSHans Rosenfeld 	0x31, 0x31, 0x31, 0x30, 0x30, 0x30, 0x25, 0x25, 0x25, 0x24, 0x24,
1750*fd43cf6eSHans Rosenfeld 	0x24, 0x23, 0x23, 0x23, 0x22, 0x18, 0x18, 0x17, 0x17, 0x17, 0x16,
1751*fd43cf6eSHans Rosenfeld 	0x16, 0x16, 0x15, 0x15, 0x15, 0x14, 0x14, 0x14, 0x13, 0x13, 0x13,
1752*fd43cf6eSHans Rosenfeld 	0x12, 0x08, 0x08, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x05, 0x05,
1753*fd43cf6eSHans Rosenfeld 	0x05, 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x01,
1754*fd43cf6eSHans Rosenfeld 	0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
1755*fd43cf6eSHans Rosenfeld };
1756*fd43cf6eSHans Rosenfeld 
1757*fd43cf6eSHans Rosenfeld /*
1758*fd43cf6eSHans Rosenfeld  * DSP pre-DAC gain values from highest to lowest power (values obtained
1759*fd43cf6eSHans Rosenfeld  * from the reference driver.)
1760*fd43cf6eSHans Rosenfeld  */
1761*fd43cf6eSHans Rosenfeld static const uint8_t iwn4965_dsp_gain_2ghz[IWN4965_MAX_PWR_INDEX + 1] = {
1762*fd43cf6eSHans Rosenfeld 	0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68,
1763*fd43cf6eSHans Rosenfeld 	0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e,
1764*fd43cf6eSHans Rosenfeld 	0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62,
1765*fd43cf6eSHans Rosenfeld 	0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68,
1766*fd43cf6eSHans Rosenfeld 	0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e,
1767*fd43cf6eSHans Rosenfeld 	0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62,
1768*fd43cf6eSHans Rosenfeld 	0x6e, 0x68, 0x62, 0x61, 0x60, 0x5f, 0x5e, 0x5d, 0x5c, 0x5b, 0x5a,
1769*fd43cf6eSHans Rosenfeld 	0x59, 0x58, 0x57, 0x56, 0x55, 0x54, 0x53, 0x52, 0x51, 0x50, 0x4f,
1770*fd43cf6eSHans Rosenfeld 	0x4e, 0x4d, 0x4c, 0x4b, 0x4a, 0x49, 0x48, 0x47, 0x46, 0x45, 0x44,
1771*fd43cf6eSHans Rosenfeld 	0x43, 0x42, 0x41, 0x40, 0x3f, 0x3e, 0x3d, 0x3c, 0x3b
1772*fd43cf6eSHans Rosenfeld };
1773*fd43cf6eSHans Rosenfeld 
1774*fd43cf6eSHans Rosenfeld static const uint8_t iwn4965_dsp_gain_5ghz[IWN4965_MAX_PWR_INDEX + 1] = {
1775*fd43cf6eSHans Rosenfeld 	0x7b, 0x75, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62,
1776*fd43cf6eSHans Rosenfeld 	0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68,
1777*fd43cf6eSHans Rosenfeld 	0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e,
1778*fd43cf6eSHans Rosenfeld 	0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62,
1779*fd43cf6eSHans Rosenfeld 	0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68,
1780*fd43cf6eSHans Rosenfeld 	0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e,
1781*fd43cf6eSHans Rosenfeld 	0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62,
1782*fd43cf6eSHans Rosenfeld 	0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68,
1783*fd43cf6eSHans Rosenfeld 	0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e,
1784*fd43cf6eSHans Rosenfeld 	0x68, 0x62, 0x6e, 0x68, 0x62, 0x5d, 0x58, 0x53, 0x4e
1785*fd43cf6eSHans Rosenfeld };
1786*fd43cf6eSHans Rosenfeld 
1787*fd43cf6eSHans Rosenfeld /*
1788*fd43cf6eSHans Rosenfeld  * Power saving settings (values obtained from the reference driver.)
1789*fd43cf6eSHans Rosenfeld  */
1790*fd43cf6eSHans Rosenfeld #define IWN_NDTIMRANGES		3
1791*fd43cf6eSHans Rosenfeld #define IWN_NPOWERLEVELS	6
1792*fd43cf6eSHans Rosenfeld static const struct iwn_pmgt {
1793*fd43cf6eSHans Rosenfeld 	uint32_t	rxtimeout;
1794*fd43cf6eSHans Rosenfeld 	uint32_t	txtimeout;
1795*fd43cf6eSHans Rosenfeld 	int32_t		intval[5];
1796*fd43cf6eSHans Rosenfeld 	int		skip_dtim;
1797*fd43cf6eSHans Rosenfeld } iwn_pmgt[IWN_NDTIMRANGES][IWN_NPOWERLEVELS] = {
1798*fd43cf6eSHans Rosenfeld 	/* DTIM <= 2 */
1799*fd43cf6eSHans Rosenfeld 	{
1800*fd43cf6eSHans Rosenfeld 	{   0,   0, {  0,  0,  0,  0,  0 }, 0 },	/* CAM */
1801*fd43cf6eSHans Rosenfeld 	{ 200, 500, {  1,  2,  2,  2, -1 }, 0 },	/* PS level 1 */
1802*fd43cf6eSHans Rosenfeld 	{ 200, 300, {  1,  2,  2,  2, -1 }, 0 },	/* PS level 2 */
1803*fd43cf6eSHans Rosenfeld 	{  50, 100, {  2,  2,  2,  2, -1 }, 0 },	/* PS level 3 */
1804*fd43cf6eSHans Rosenfeld 	{  50,  25, {  2,  2,  4,  4, -1 }, 1 },	/* PS level 4 */
1805*fd43cf6eSHans Rosenfeld 	{  25,  25, {  2,  2,  4,  6, -1 }, 2 }		/* PS level 5 */
1806*fd43cf6eSHans Rosenfeld 	},
1807*fd43cf6eSHans Rosenfeld 	/* 3 <= DTIM <= 10 */
1808*fd43cf6eSHans Rosenfeld 	{
1809*fd43cf6eSHans Rosenfeld 	{   0,   0, {  0,  0,  0,  0,  0 }, 0 },	/* CAM */
1810*fd43cf6eSHans Rosenfeld 	{ 200, 500, {  1,  2,  3,  4,  4 }, 0 },	/* PS level 1 */
1811*fd43cf6eSHans Rosenfeld 	{ 200, 300, {  1,  2,  3,  4,  7 }, 0 },	/* PS level 2 */
1812*fd43cf6eSHans Rosenfeld 	{  50, 100, {  2,  4,  6,  7,  9 }, 0 },	/* PS level 3 */
1813*fd43cf6eSHans Rosenfeld 	{  50,  25, {  2,  4,  6,  9, 10 }, 1 },	/* PS level 4 */
1814*fd43cf6eSHans Rosenfeld 	{  25,  25, {  2,  4,  7, 10, 10 }, 2 }		/* PS level 5 */
1815*fd43cf6eSHans Rosenfeld 	},
1816*fd43cf6eSHans Rosenfeld 	/* DTIM >= 11 */
1817*fd43cf6eSHans Rosenfeld 	{
1818*fd43cf6eSHans Rosenfeld 	{   0,   0, {  0,  0,  0,  0,  0 }, 0 },	/* CAM */
1819*fd43cf6eSHans Rosenfeld 	{ 200, 500, {  1,  2,  3,  4, -1 }, 0 },	/* PS level 1 */
1820*fd43cf6eSHans Rosenfeld 	{ 200, 300, {  2,  4,  6,  7, -1 }, 0 },	/* PS level 2 */
1821*fd43cf6eSHans Rosenfeld 	{  50, 100, {  2,  7,  9,  9, -1 }, 0 },	/* PS level 3 */
1822*fd43cf6eSHans Rosenfeld 	{  50,  25, {  2,  7,  9,  9, -1 }, 0 },	/* PS level 4 */
1823*fd43cf6eSHans Rosenfeld 	{  25,  25, {  4,  7, 10, 10, -1 }, 0 }		/* PS level 5 */
1824*fd43cf6eSHans Rosenfeld 	}
1825*fd43cf6eSHans Rosenfeld };
1826*fd43cf6eSHans Rosenfeld 
1827*fd43cf6eSHans Rosenfeld struct iwn_sensitivity_limits {
1828*fd43cf6eSHans Rosenfeld 	uint32_t	min_ofdm_x1;
1829*fd43cf6eSHans Rosenfeld 	uint32_t	max_ofdm_x1;
1830*fd43cf6eSHans Rosenfeld 	uint32_t	min_ofdm_mrc_x1;
1831*fd43cf6eSHans Rosenfeld 	uint32_t	max_ofdm_mrc_x1;
1832*fd43cf6eSHans Rosenfeld 	uint32_t	min_ofdm_x4;
1833*fd43cf6eSHans Rosenfeld 	uint32_t	max_ofdm_x4;
1834*fd43cf6eSHans Rosenfeld 	uint32_t	min_ofdm_mrc_x4;
1835*fd43cf6eSHans Rosenfeld 	uint32_t	max_ofdm_mrc_x4;
1836*fd43cf6eSHans Rosenfeld 	uint32_t	min_cck_x4;
1837*fd43cf6eSHans Rosenfeld 	uint32_t	max_cck_x4;
1838*fd43cf6eSHans Rosenfeld 	uint32_t	min_cck_mrc_x4;
1839*fd43cf6eSHans Rosenfeld 	uint32_t	max_cck_mrc_x4;
1840*fd43cf6eSHans Rosenfeld 	uint32_t	min_energy_cck;
1841*fd43cf6eSHans Rosenfeld 	uint32_t	energy_cck;
1842*fd43cf6eSHans Rosenfeld 	uint32_t	energy_ofdm;
1843*fd43cf6eSHans Rosenfeld };
1844*fd43cf6eSHans Rosenfeld 
1845*fd43cf6eSHans Rosenfeld /*
1846*fd43cf6eSHans Rosenfeld  * RX sensitivity limits (values obtained from the reference driver.)
1847*fd43cf6eSHans Rosenfeld  */
1848*fd43cf6eSHans Rosenfeld static const struct iwn_sensitivity_limits iwn4965_sensitivity_limits = {
1849*fd43cf6eSHans Rosenfeld 	105, 140,
1850*fd43cf6eSHans Rosenfeld 	220, 270,
1851*fd43cf6eSHans Rosenfeld 	 85, 120,
1852*fd43cf6eSHans Rosenfeld 	170, 210,
1853*fd43cf6eSHans Rosenfeld 	125, 200,
1854*fd43cf6eSHans Rosenfeld 	200, 400,
1855*fd43cf6eSHans Rosenfeld 	 97,
1856*fd43cf6eSHans Rosenfeld 	100,
1857*fd43cf6eSHans Rosenfeld 	100
1858*fd43cf6eSHans Rosenfeld };
1859*fd43cf6eSHans Rosenfeld 
1860*fd43cf6eSHans Rosenfeld static const struct iwn_sensitivity_limits iwn5000_sensitivity_limits = {
1861*fd43cf6eSHans Rosenfeld 	120, 120,	/* min = max for performance bug in DSP. */
1862*fd43cf6eSHans Rosenfeld 	240, 240,	/* min = max for performance bug in DSP. */
1863*fd43cf6eSHans Rosenfeld 	 90, 120,
1864*fd43cf6eSHans Rosenfeld 	170, 210,
1865*fd43cf6eSHans Rosenfeld 	125, 200,
1866*fd43cf6eSHans Rosenfeld 	170, 400,
1867*fd43cf6eSHans Rosenfeld 	 95,
1868*fd43cf6eSHans Rosenfeld 	 95,
1869*fd43cf6eSHans Rosenfeld 	 95
1870*fd43cf6eSHans Rosenfeld };
1871*fd43cf6eSHans Rosenfeld 
1872*fd43cf6eSHans Rosenfeld static const struct iwn_sensitivity_limits iwn5150_sensitivity_limits = {
1873*fd43cf6eSHans Rosenfeld 	105, 105,	/* min = max for performance bug in DSP. */
1874*fd43cf6eSHans Rosenfeld 	220, 220,	/* min = max for performance bug in DSP. */
1875*fd43cf6eSHans Rosenfeld 	 90, 120,
1876*fd43cf6eSHans Rosenfeld 	170, 210,
1877*fd43cf6eSHans Rosenfeld 	125, 200,
1878*fd43cf6eSHans Rosenfeld 	170, 400,
1879*fd43cf6eSHans Rosenfeld 	 95,
1880*fd43cf6eSHans Rosenfeld 	 95,
1881*fd43cf6eSHans Rosenfeld 	 95
1882*fd43cf6eSHans Rosenfeld };
1883*fd43cf6eSHans Rosenfeld 
1884*fd43cf6eSHans Rosenfeld static const struct iwn_sensitivity_limits iwn1000_sensitivity_limits = {
1885*fd43cf6eSHans Rosenfeld 	120, 155,
1886*fd43cf6eSHans Rosenfeld 	240, 290,
1887*fd43cf6eSHans Rosenfeld 	 90, 120,
1888*fd43cf6eSHans Rosenfeld 	170, 210,
1889*fd43cf6eSHans Rosenfeld 	125, 200,
1890*fd43cf6eSHans Rosenfeld 	170, 400,
1891*fd43cf6eSHans Rosenfeld 	 95,
1892*fd43cf6eSHans Rosenfeld 	 95,
1893*fd43cf6eSHans Rosenfeld 	 95
1894*fd43cf6eSHans Rosenfeld };
1895*fd43cf6eSHans Rosenfeld 
1896*fd43cf6eSHans Rosenfeld static const struct iwn_sensitivity_limits iwn6000_sensitivity_limits = {
1897*fd43cf6eSHans Rosenfeld 	105, 110,
1898*fd43cf6eSHans Rosenfeld 	192, 232,
1899*fd43cf6eSHans Rosenfeld 	 80, 145,
1900*fd43cf6eSHans Rosenfeld 	128, 232,
1901*fd43cf6eSHans Rosenfeld 	125, 175,
1902*fd43cf6eSHans Rosenfeld 	160, 310,
1903*fd43cf6eSHans Rosenfeld 	 97,
1904*fd43cf6eSHans Rosenfeld 	 97,
1905*fd43cf6eSHans Rosenfeld 	100
1906*fd43cf6eSHans Rosenfeld };
1907*fd43cf6eSHans Rosenfeld 
1908*fd43cf6eSHans Rosenfeld static const struct iwn_sensitivity_limits iwn2000_sensitivity_limits = {
1909*fd43cf6eSHans Rosenfeld 	105, 110,
1910*fd43cf6eSHans Rosenfeld 	192, 232,
1911*fd43cf6eSHans Rosenfeld 	 80, 145,
1912*fd43cf6eSHans Rosenfeld 	128, 232,
1913*fd43cf6eSHans Rosenfeld 	125, 175,
1914*fd43cf6eSHans Rosenfeld 	160, 310,
1915*fd43cf6eSHans Rosenfeld 	 97,
1916*fd43cf6eSHans Rosenfeld 	 97,
1917*fd43cf6eSHans Rosenfeld 	100
1918*fd43cf6eSHans Rosenfeld };
1919*fd43cf6eSHans Rosenfeld 
1920*fd43cf6eSHans Rosenfeld #ifndef IEEE80211_NO_HT
1921*fd43cf6eSHans Rosenfeld /* Map TID to TX scheduler's FIFO. */
1922*fd43cf6eSHans Rosenfeld static const uint8_t iwn_tid2fifo[] = {
1923*fd43cf6eSHans Rosenfeld 	1, 0, 0, 1, 2, 2, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 3
1924*fd43cf6eSHans Rosenfeld };
1925*fd43cf6eSHans Rosenfeld #endif
1926*fd43cf6eSHans Rosenfeld 
1927*fd43cf6eSHans Rosenfeld #ifdef notyet
1928*fd43cf6eSHans Rosenfeld /* WiFi/WiMAX coexist event priority table for 6050. */
1929*fd43cf6eSHans Rosenfeld static const struct iwn5000_wimax_event iwn6050_wimax_events[] = {
1930*fd43cf6eSHans Rosenfeld 	{ 0x04, 0x03, 0x00, 0x00 },
1931*fd43cf6eSHans Rosenfeld 	{ 0x04, 0x03, 0x00, 0x03 },
1932*fd43cf6eSHans Rosenfeld 	{ 0x04, 0x03, 0x00, 0x03 },
1933*fd43cf6eSHans Rosenfeld 	{ 0x04, 0x03, 0x00, 0x03 },
1934*fd43cf6eSHans Rosenfeld 	{ 0x04, 0x03, 0x00, 0x00 },
1935*fd43cf6eSHans Rosenfeld 	{ 0x04, 0x03, 0x00, 0x07 },
1936*fd43cf6eSHans Rosenfeld 	{ 0x04, 0x03, 0x00, 0x00 },
1937*fd43cf6eSHans Rosenfeld 	{ 0x04, 0x03, 0x00, 0x03 },
1938*fd43cf6eSHans Rosenfeld 	{ 0x04, 0x03, 0x00, 0x03 },
1939*fd43cf6eSHans Rosenfeld 	{ 0x04, 0x03, 0x00, 0x00 },
1940*fd43cf6eSHans Rosenfeld 	{ 0x06, 0x03, 0x00, 0x07 },
1941*fd43cf6eSHans Rosenfeld 	{ 0x04, 0x03, 0x00, 0x00 },
1942*fd43cf6eSHans Rosenfeld 	{ 0x06, 0x06, 0x00, 0x03 },
1943*fd43cf6eSHans Rosenfeld 	{ 0x04, 0x03, 0x00, 0x07 },
1944*fd43cf6eSHans Rosenfeld 	{ 0x04, 0x03, 0x00, 0x00 },
1945*fd43cf6eSHans Rosenfeld 	{ 0x04, 0x03, 0x00, 0x00 }
1946*fd43cf6eSHans Rosenfeld };
1947*fd43cf6eSHans Rosenfeld #endif
1948*fd43cf6eSHans Rosenfeld 
1949*fd43cf6eSHans Rosenfeld /* Firmware errors. */
1950*fd43cf6eSHans Rosenfeld static const char * const iwn_fw_errmsg[] = {
1951*fd43cf6eSHans Rosenfeld 	"OK",
1952*fd43cf6eSHans Rosenfeld 	"FAIL",
1953*fd43cf6eSHans Rosenfeld 	"BAD_PARAM",
1954*fd43cf6eSHans Rosenfeld 	"BAD_CHECKSUM",
1955*fd43cf6eSHans Rosenfeld 	"NMI_INTERRUPT_WDG",
1956*fd43cf6eSHans Rosenfeld 	"SYSASSERT",
1957*fd43cf6eSHans Rosenfeld 	"FATAL_ERROR",
1958*fd43cf6eSHans Rosenfeld 	"BAD_COMMAND",
1959*fd43cf6eSHans Rosenfeld 	"HW_ERROR_TUNE_LOCK",
1960*fd43cf6eSHans Rosenfeld 	"HW_ERROR_TEMPERATURE",
1961*fd43cf6eSHans Rosenfeld 	"ILLEGAL_CHAN_FREQ",
1962*fd43cf6eSHans Rosenfeld 	"VCC_NOT_STABLE",
1963*fd43cf6eSHans Rosenfeld 	"FH_ERROR",
1964*fd43cf6eSHans Rosenfeld 	"NMI_INTERRUPT_HOST",
1965*fd43cf6eSHans Rosenfeld 	"NMI_INTERRUPT_ACTION_PT",
1966*fd43cf6eSHans Rosenfeld 	"NMI_INTERRUPT_UNKNOWN",
1967*fd43cf6eSHans Rosenfeld 	"UCODE_VERSION_MISMATCH",
1968*fd43cf6eSHans Rosenfeld 	"HW_ERROR_ABS_LOCK",
1969*fd43cf6eSHans Rosenfeld 	"HW_ERROR_CAL_LOCK_FAIL",
1970*fd43cf6eSHans Rosenfeld 	"NMI_INTERRUPT_INST_ACTION_PT",
1971*fd43cf6eSHans Rosenfeld 	"NMI_INTERRUPT_DATA_ACTION_PT",
1972*fd43cf6eSHans Rosenfeld 	"NMI_TRM_HW_ER",
1973*fd43cf6eSHans Rosenfeld 	"NMI_INTERRUPT_TRM",
1974*fd43cf6eSHans Rosenfeld 	"NMI_INTERRUPT_BREAKPOINT"
1975*fd43cf6eSHans Rosenfeld 	"DEBUG_0",
1976*fd43cf6eSHans Rosenfeld 	"DEBUG_1",
1977*fd43cf6eSHans Rosenfeld 	"DEBUG_2",
1978*fd43cf6eSHans Rosenfeld 	"DEBUG_3",
1979*fd43cf6eSHans Rosenfeld 	"ADVANCED_SYSASSERT"
1980*fd43cf6eSHans Rosenfeld };
1981*fd43cf6eSHans Rosenfeld 
1982*fd43cf6eSHans Rosenfeld /* Find least significant bit that is set. */
1983*fd43cf6eSHans Rosenfeld #define IWN_LSB(x)	((((x) - 1) & (x)) ^ (x))
1984*fd43cf6eSHans Rosenfeld 
1985*fd43cf6eSHans Rosenfeld #define IWN_READ(sc, reg)						\
1986*fd43cf6eSHans Rosenfeld 	iwn_read(sc, reg)
1987*fd43cf6eSHans Rosenfeld 
1988*fd43cf6eSHans Rosenfeld #define IWN_WRITE(sc, reg, val)						\
1989*fd43cf6eSHans Rosenfeld 	iwn_write(sc, reg, val)
1990*fd43cf6eSHans Rosenfeld 
1991*fd43cf6eSHans Rosenfeld #define IWN_WRITE_1(sc, reg, val)					\
1992*fd43cf6eSHans Rosenfeld 	iwn_write_1(sc, reg, val)
1993*fd43cf6eSHans Rosenfeld 
1994*fd43cf6eSHans Rosenfeld #define IWN_SETBITS(sc, reg, mask)					\
1995*fd43cf6eSHans Rosenfeld 	IWN_WRITE(sc, reg, IWN_READ(sc, reg) | (mask))
1996*fd43cf6eSHans Rosenfeld 
1997*fd43cf6eSHans Rosenfeld #define IWN_CLRBITS(sc, reg, mask)					\
1998*fd43cf6eSHans Rosenfeld 	IWN_WRITE(sc, reg, IWN_READ(sc, reg) & ~(mask))
1999*fd43cf6eSHans Rosenfeld 
2000*fd43cf6eSHans Rosenfeld #define IWN_BARRIER_WRITE(sc)						\
2001*fd43cf6eSHans Rosenfeld 	membar_producer()
2002*fd43cf6eSHans Rosenfeld 
2003*fd43cf6eSHans Rosenfeld #define IWN_BARRIER_READ_WRITE(sc)					\
2004*fd43cf6eSHans Rosenfeld 	(membar_producer(), membar_consumer())
2005*fd43cf6eSHans Rosenfeld 
2006*fd43cf6eSHans Rosenfeld #endif	/* _IF_IWNREG_H */
2007