xref: /freebsd/sys/dev/wpi/if_wpireg.h (revision 71625ec9ad2a9bc8c09784fbd23b759830e0ee5f)
16607310bSBenjamin Close 
26607310bSBenjamin Close /*-
36607310bSBenjamin Close  * Copyright (c) 2006,2007
46607310bSBenjamin Close  *	Damien Bergamini <damien.bergamini@free.fr>
56607310bSBenjamin Close  *
66607310bSBenjamin Close  * Permission to use, copy, modify, and distribute this software for any
76607310bSBenjamin Close  * purpose with or without fee is hereby granted, provided that the above
86607310bSBenjamin Close  * copyright notice and this permission notice appear in all copies.
96607310bSBenjamin Close  *
106607310bSBenjamin Close  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
116607310bSBenjamin Close  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
126607310bSBenjamin Close  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
136607310bSBenjamin Close  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
146607310bSBenjamin Close  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
156607310bSBenjamin Close  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
166607310bSBenjamin Close  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
176607310bSBenjamin Close  */
186607310bSBenjamin Close 
196607310bSBenjamin Close #define WPI_TX_RING_COUNT	256
20692ad7caSAdrian Chadd #define WPI_TX_RING_LOMARK	192
21692ad7caSAdrian Chadd #define WPI_TX_RING_HIMARK	224
22a5403e31SAdrian Chadd 
23a5403e31SAdrian Chadd #ifdef DIAGNOSTIC
24a5403e31SAdrian Chadd #define WPI_RX_RING_COUNT_LOG	8
25a5403e31SAdrian Chadd #else
26692ad7caSAdrian Chadd #define WPI_RX_RING_COUNT_LOG	6
27a5403e31SAdrian Chadd #endif
28a5403e31SAdrian Chadd 
29692ad7caSAdrian Chadd #define WPI_RX_RING_COUNT	(1 << WPI_RX_RING_COUNT_LOG)
30692ad7caSAdrian Chadd 
31692ad7caSAdrian Chadd #define WPI_NTXQUEUES		8
32ebf62e08SAdrian Chadd #define WPI_DRV_NTXQUEUES	5
338e4cf38aSAdrian Chadd #define WPI_CMD_QUEUE_NUM	4
348e4cf38aSAdrian Chadd 
35692ad7caSAdrian Chadd #define WPI_NDMACHNLS		6
36692ad7caSAdrian Chadd 
37692ad7caSAdrian Chadd /* Maximum scatter/gather. */
38692ad7caSAdrian Chadd #define WPI_MAX_SCATTER		4
396607310bSBenjamin Close 
406607310bSBenjamin Close /*
416607310bSBenjamin Close  * Rings must be aligned on a 16K boundary.
426607310bSBenjamin Close  */
436607310bSBenjamin Close #define WPI_RING_DMA_ALIGN	0x4000
446607310bSBenjamin Close 
45692ad7caSAdrian Chadd /* Maximum Rx buffer size. */
466607310bSBenjamin Close #define WPI_RBUF_SIZE ( 3 * 1024 ) /* XXX 3000 but must be aligned */
476607310bSBenjamin Close 
486607310bSBenjamin Close /*
496607310bSBenjamin Close  * Control and status registers.
506607310bSBenjamin Close  */
51692ad7caSAdrian Chadd #define WPI_HW_IF_CONFIG	0x000
52692ad7caSAdrian Chadd #define WPI_INT			0x008
53692ad7caSAdrian Chadd #define WPI_INT_MASK		0x00c
54692ad7caSAdrian Chadd #define WPI_FH_INT		0x010
55692ad7caSAdrian Chadd #define WPI_GPIO_IN		0x018
566607310bSBenjamin Close #define WPI_RESET		0x020
57692ad7caSAdrian Chadd #define WPI_GP_CNTRL		0x024
58692ad7caSAdrian Chadd #define WPI_EEPROM		0x02c
59692ad7caSAdrian Chadd #define WPI_EEPROM_GP		0x030
60692ad7caSAdrian Chadd #define WPI_GIO			0x03c
61692ad7caSAdrian Chadd #define WPI_UCODE_GP1		0x054
62692ad7caSAdrian Chadd #define WPI_UCODE_GP1_SET	0x058
63692ad7caSAdrian Chadd #define WPI_UCODE_GP1_CLR	0x05c
64692ad7caSAdrian Chadd #define WPI_UCODE_GP2		0x060
65692ad7caSAdrian Chadd #define WPI_GIO_CHICKEN		0x100
66692ad7caSAdrian Chadd #define WPI_ANA_PLL		0x20c
67692ad7caSAdrian Chadd #define WPI_DBG_HPET_MEM	0x240
68692ad7caSAdrian Chadd #define WPI_MEM_RADDR		0x40c
69692ad7caSAdrian Chadd #define WPI_MEM_WADDR		0x410
70692ad7caSAdrian Chadd #define WPI_MEM_WDATA		0x418
71692ad7caSAdrian Chadd #define WPI_MEM_RDATA		0x41c
72692ad7caSAdrian Chadd #define WPI_PRPH_WADDR		0x444
73692ad7caSAdrian Chadd #define WPI_PRPH_RADDR		0x448
74692ad7caSAdrian Chadd #define WPI_PRPH_WDATA		0x44c
75692ad7caSAdrian Chadd #define WPI_PRPH_RDATA		0x450
76692ad7caSAdrian Chadd #define WPI_HBUS_TARG_WRPTR	0x460
77692ad7caSAdrian Chadd 
78692ad7caSAdrian Chadd /*
79692ad7caSAdrian Chadd  * Flow-Handler registers.
80692ad7caSAdrian Chadd  */
81692ad7caSAdrian Chadd #define WPI_FH_CBBC_CTRL(qid)	(0x940 + (qid) * 8)
82692ad7caSAdrian Chadd #define WPI_FH_CBBC_BASE(qid)	(0x944 + (qid) * 8)
83692ad7caSAdrian Chadd #define WPI_FH_RX_CONFIG	0xc00
84692ad7caSAdrian Chadd #define WPI_FH_RX_BASE		0xc04
85692ad7caSAdrian Chadd #define WPI_FH_RX_WPTR		0xc20
86692ad7caSAdrian Chadd #define WPI_FH_RX_RPTR_ADDR	0xc24
87692ad7caSAdrian Chadd #define WPI_FH_RSSR_TBL		0xcc0
88692ad7caSAdrian Chadd #define WPI_FH_RX_STATUS	0xcc4
89692ad7caSAdrian Chadd #define WPI_FH_TX_CONFIG(qid)	(0xd00 + (qid) * 32)
90692ad7caSAdrian Chadd #define WPI_FH_TX_BASE		0xe80
91692ad7caSAdrian Chadd #define WPI_FH_MSG_CONFIG	0xe88
92692ad7caSAdrian Chadd #define WPI_FH_TX_STATUS	0xe90
936607310bSBenjamin Close 
946607310bSBenjamin Close /*
956607310bSBenjamin Close  * NIC internal memory offsets.
966607310bSBenjamin Close  */
97692ad7caSAdrian Chadd #define WPI_ALM_SCHED_MODE		0x2e00
98692ad7caSAdrian Chadd #define WPI_ALM_SCHED_ARASTAT		0x2e04
99692ad7caSAdrian Chadd #define WPI_ALM_SCHED_TXFACT		0x2e10
100692ad7caSAdrian Chadd #define WPI_ALM_SCHED_TXF4MF		0x2e14
101692ad7caSAdrian Chadd #define WPI_ALM_SCHED_TXF5MF		0x2e20
102692ad7caSAdrian Chadd #define WPI_ALM_SCHED_SBYPASS_MODE1	0x2e2c
103692ad7caSAdrian Chadd #define WPI_ALM_SCHED_SBYPASS_MODE2	0x2e30
104a6df6cfeSAdrian Chadd #define WPI_APMG_CLK_CTRL		0x3000
105692ad7caSAdrian Chadd #define WPI_APMG_CLK_EN			0x3004
106692ad7caSAdrian Chadd #define WPI_APMG_CLK_DIS		0x3008
107692ad7caSAdrian Chadd #define WPI_APMG_PS			0x300c
108692ad7caSAdrian Chadd #define WPI_APMG_PCI_STT		0x3010
109692ad7caSAdrian Chadd #define WPI_APMG_RFKILL			0x3014
110692ad7caSAdrian Chadd #define WPI_BSM_WR_CTRL			0x3400
111692ad7caSAdrian Chadd #define WPI_BSM_WR_MEM_SRC		0x3404
112692ad7caSAdrian Chadd #define WPI_BSM_WR_MEM_DST		0x3408
113692ad7caSAdrian Chadd #define WPI_BSM_WR_DWCOUNT		0x340c
114692ad7caSAdrian Chadd #define WPI_BSM_DRAM_TEXT_ADDR		0x3490
115692ad7caSAdrian Chadd #define WPI_BSM_DRAM_TEXT_SIZE		0x3494
116692ad7caSAdrian Chadd #define WPI_BSM_DRAM_DATA_ADDR		0x3498
117692ad7caSAdrian Chadd #define WPI_BSM_DRAM_DATA_SIZE		0x349c
118692ad7caSAdrian Chadd #define WPI_BSM_SRAM_BASE		0x3800
1196607310bSBenjamin Close 
120692ad7caSAdrian Chadd /* Possible flags for register WPI_HW_IF_CONFIG. */
121692ad7caSAdrian Chadd #define WPI_HW_IF_CONFIG_ALM_MB		(1 << 8)
122692ad7caSAdrian Chadd #define WPI_HW_IF_CONFIG_ALM_MM		(1 << 9)
123692ad7caSAdrian Chadd #define WPI_HW_IF_CONFIG_SKU_MRC	(1 << 10)
124692ad7caSAdrian Chadd #define WPI_HW_IF_CONFIG_REV_D		(1 << 11)
125692ad7caSAdrian Chadd #define WPI_HW_IF_CONFIG_TYPE_B		(1 << 12)
1266607310bSBenjamin Close 
127692ad7caSAdrian Chadd /* Possible flags for registers WPI_PRPH_RADDR/WPI_PRPH_WADDR. */
128692ad7caSAdrian Chadd #define WPI_PRPH_DWORD	((sizeof (uint32_t) - 1) << 24)
1296607310bSBenjamin Close 
130692ad7caSAdrian Chadd /* Possible values for WPI_BSM_WR_MEM_DST. */
131692ad7caSAdrian Chadd #define WPI_FW_TEXT_BASE	0x00000000
132692ad7caSAdrian Chadd #define WPI_FW_DATA_BASE	0x00800000
1336607310bSBenjamin Close 
134692ad7caSAdrian Chadd /* Possible flags for WPI_GPIO_IN. */
135692ad7caSAdrian Chadd #define WPI_GPIO_IN_VMAIN	(1 << 9)
1366607310bSBenjamin Close 
137692ad7caSAdrian Chadd /* Possible flags for register WPI_RESET. */
138692ad7caSAdrian Chadd #define WPI_RESET_NEVO			(1 << 0)
139692ad7caSAdrian Chadd #define WPI_RESET_SW			(1 << 7)
140692ad7caSAdrian Chadd #define WPI_RESET_MASTER_DISABLED	(1 << 8)
141692ad7caSAdrian Chadd #define WPI_RESET_STOP_MASTER		(1 << 9)
1426607310bSBenjamin Close 
143692ad7caSAdrian Chadd /* Possible flags for register WPI_GP_CNTRL. */
144692ad7caSAdrian Chadd #define WPI_GP_CNTRL_MAC_ACCESS_ENA	(1 <<  0)
145692ad7caSAdrian Chadd #define WPI_GP_CNTRL_MAC_CLOCK_READY	(1 <<  0)
146692ad7caSAdrian Chadd #define WPI_GP_CNTRL_INIT_DONE		(1 <<  2)
147692ad7caSAdrian Chadd #define WPI_GP_CNTRL_MAC_ACCESS_REQ	(1 <<  3)
148692ad7caSAdrian Chadd #define WPI_GP_CNTRL_SLEEP		(1 <<  4)
149692ad7caSAdrian Chadd #define WPI_GP_CNTRL_PS_MASK		(7 << 24)
150692ad7caSAdrian Chadd #define WPI_GP_CNTRL_MAC_PS		(4 << 24)
151692ad7caSAdrian Chadd #define WPI_GP_CNTRL_RFKILL		(1 << 27)
1526607310bSBenjamin Close 
153692ad7caSAdrian Chadd /* Possible flags for register WPI_GIO_CHICKEN. */
154692ad7caSAdrian Chadd #define WPI_GIO_CHICKEN_L1A_NO_L0S_RX	(1 << 23)
155692ad7caSAdrian Chadd #define WPI_GIO_CHICKEN_DIS_L0S_TIMER	(1 << 29)
1566607310bSBenjamin Close 
157692ad7caSAdrian Chadd /* Possible flags for register WPI_GIO. */
158692ad7caSAdrian Chadd #define WPI_GIO_L0S_ENA			(1 << 1)
1596607310bSBenjamin Close 
160692ad7caSAdrian Chadd /* Possible flags for register WPI_FH_RX_CONFIG. */
161692ad7caSAdrian Chadd #define WPI_FH_RX_CONFIG_DMA_ENA	(1U  << 31)
162692ad7caSAdrian Chadd #define WPI_FH_RX_CONFIG_RDRBD_ENA	(1   << 29)
163692ad7caSAdrian Chadd #define WPI_FH_RX_CONFIG_WRSTATUS_ENA	(1   << 27)
164692ad7caSAdrian Chadd #define WPI_FH_RX_CONFIG_MAXFRAG	(1   << 24)
165692ad7caSAdrian Chadd #define WPI_FH_RX_CONFIG_NRBD(x)	((x) << 20)
166692ad7caSAdrian Chadd #define WPI_FH_RX_CONFIG_IRQ_DST_HOST	(1   << 12)
167692ad7caSAdrian Chadd #define WPI_FH_RX_CONFIG_IRQ_TIMEOUT(x)	((x) <<  4)
1686607310bSBenjamin Close 
169692ad7caSAdrian Chadd /* Possible flags for register WPI_ANA_PLL. */
170692ad7caSAdrian Chadd #define WPI_ANA_PLL_INIT	(1 << 24)
1716607310bSBenjamin Close 
172692ad7caSAdrian Chadd /* Possible flags for register WPI_UCODE_GP1*. */
173692ad7caSAdrian Chadd #define WPI_UCODE_GP1_MAC_SLEEP		(1 << 0)
174692ad7caSAdrian Chadd #define WPI_UCODE_GP1_RFKILL		(1 << 1)
175692ad7caSAdrian Chadd #define WPI_UCODE_GP1_CMD_BLOCKED	(1 << 2)
1766607310bSBenjamin Close 
177692ad7caSAdrian Chadd /* Possible flags for register WPI_FH_RX_STATUS. */
178692ad7caSAdrian Chadd #define	WPI_FH_RX_STATUS_IDLE	(1 << 24)
1796607310bSBenjamin Close 
180692ad7caSAdrian Chadd /* Possible flags for register WPI_BSM_WR_CTRL. */
181692ad7caSAdrian Chadd #define WPI_BSM_WR_CTRL_START_EN	(1  << 30)
182692ad7caSAdrian Chadd #define WPI_BSM_WR_CTRL_START		(1U << 31)
1836607310bSBenjamin Close 
184692ad7caSAdrian Chadd /* Possible flags for register WPI_INT. */
185692ad7caSAdrian Chadd #define WPI_INT_ALIVE		(1  <<  0)
186692ad7caSAdrian Chadd #define WPI_INT_WAKEUP		(1  <<  1)
187692ad7caSAdrian Chadd #define WPI_INT_SW_RX		(1  <<  3)
188692ad7caSAdrian Chadd #define WPI_INT_SW_ERR		(1  << 25)
189692ad7caSAdrian Chadd #define WPI_INT_FH_TX		(1  << 27)
190692ad7caSAdrian Chadd #define WPI_INT_HW_ERR		(1  << 29)
191692ad7caSAdrian Chadd #define WPI_INT_FH_RX		(1U << 31)
1926607310bSBenjamin Close 
193692ad7caSAdrian Chadd /* Shortcut. */
194692ad7caSAdrian Chadd #define WPI_INT_MASK_DEF					\
195692ad7caSAdrian Chadd 	(WPI_INT_SW_ERR | WPI_INT_HW_ERR | WPI_INT_FH_TX  |	\
196692ad7caSAdrian Chadd 	 WPI_INT_FH_RX  | WPI_INT_ALIVE  | WPI_INT_WAKEUP |	\
197692ad7caSAdrian Chadd 	 WPI_INT_SW_RX)
1986607310bSBenjamin Close 
199692ad7caSAdrian Chadd /* Possible flags for register WPI_FH_INT. */
200692ad7caSAdrian Chadd #define WPI_FH_INT_RX_CHNL(x)	(1 << ((x) + 16))
201692ad7caSAdrian Chadd #define WPI_FH_INT_HI_PRIOR	(1 << 30)
202692ad7caSAdrian Chadd /* Shortcuts for the above. */
203692ad7caSAdrian Chadd #define WPI_FH_INT_RX			\
204692ad7caSAdrian Chadd 	(WPI_FH_INT_RX_CHNL(0) |	\
205692ad7caSAdrian Chadd 	 WPI_FH_INT_RX_CHNL(1) |	\
206692ad7caSAdrian Chadd 	 WPI_FH_INT_RX_CHNL(2) |	\
207692ad7caSAdrian Chadd 	 WPI_FH_INT_HI_PRIOR)
208692ad7caSAdrian Chadd 
209692ad7caSAdrian Chadd /* Possible flags for register WPI_FH_TX_STATUS. */
210692ad7caSAdrian Chadd #define WPI_FH_TX_STATUS_IDLE(qid)	\
211692ad7caSAdrian Chadd 	(1 << ((qid) + 24) | 1 << ((qid) + 16))
212692ad7caSAdrian Chadd 
213692ad7caSAdrian Chadd /* Possible flags for register WPI_EEPROM. */
214692ad7caSAdrian Chadd #define WPI_EEPROM_READ_VALID	(1 << 0)
215692ad7caSAdrian Chadd 
216692ad7caSAdrian Chadd /* Possible flags for register WPI_EEPROM_GP. */
2176607310bSBenjamin Close #define WPI_EEPROM_VERSION	0x00000007
218692ad7caSAdrian Chadd #define WPI_EEPROM_GP_IF_OWNER	0x00000180
2196607310bSBenjamin Close 
220692ad7caSAdrian Chadd /* Possible flags for register WPI_APMG_PS. */
221692ad7caSAdrian Chadd #define WPI_APMG_PS_PWR_SRC_MASK	(3 << 24)
222692ad7caSAdrian Chadd 
223692ad7caSAdrian Chadd /* Possible flags for registers WPI_APMG_CLK_*. */
224692ad7caSAdrian Chadd #define WPI_APMG_CLK_CTRL_DMA_CLK_RQT	(1 <<  9)
225692ad7caSAdrian Chadd #define WPI_APMG_CLK_CTRL_BSM_CLK_RQT	(1 << 11)
226692ad7caSAdrian Chadd 
227692ad7caSAdrian Chadd /* Possible flags for register WPI_APMG_PCI_STT. */
228692ad7caSAdrian Chadd #define WPI_APMG_PCI_STT_L1A_DIS	(1 << 11)
2296607310bSBenjamin Close 
2306607310bSBenjamin Close struct wpi_shared {
2318e4cf38aSAdrian Chadd 	uint32_t	txbase[WPI_NTXQUEUES];
2326607310bSBenjamin Close 	uint32_t	next;
2336607310bSBenjamin Close 	uint32_t	reserved[2];
2346607310bSBenjamin Close } __packed;
2356607310bSBenjamin Close 
2366607310bSBenjamin Close #define WPI_MAX_SEG_LEN	65520
2376607310bSBenjamin Close struct wpi_tx_desc {
238692ad7caSAdrian Chadd 	uint8_t		reserved1[3];
239692ad7caSAdrian Chadd 	uint8_t		nsegs;
2406607310bSBenjamin Close #define WPI_PAD32(x)	(roundup2(x, 4) - (x))
2416607310bSBenjamin Close 
2426607310bSBenjamin Close 	struct {
2436607310bSBenjamin Close 		uint32_t	addr;
2446607310bSBenjamin Close 		uint32_t	len;
245692ad7caSAdrian Chadd 	} __packed	segs[WPI_MAX_SCATTER];
246692ad7caSAdrian Chadd 	uint8_t		reserved2[28];
2476607310bSBenjamin Close } __packed;
2486607310bSBenjamin Close 
2496607310bSBenjamin Close struct wpi_tx_stat {
250692ad7caSAdrian Chadd 	uint8_t		rtsfailcnt;
251692ad7caSAdrian Chadd 	uint8_t		ackfailcnt;
252692ad7caSAdrian Chadd 	uint8_t		btkillcnt;
2536607310bSBenjamin Close 	uint8_t		rate;
2546607310bSBenjamin Close 	uint32_t	duration;
2556607310bSBenjamin Close 	uint32_t	status;
2563d9089a6SAdrian Chadd #define WPI_TX_STATUS_SUCCESS			0x01
2573d9089a6SAdrian Chadd #define WPI_TX_STATUS_DIRECT_DONE		0x02
2583d9089a6SAdrian Chadd #define WPI_TX_STATUS_FAIL			0x80
2593d9089a6SAdrian Chadd #define WPI_TX_STATUS_FAIL_SHORT_LIMIT		0x82
2603d9089a6SAdrian Chadd #define WPI_TX_STATUS_FAIL_LONG_LIMIT		0x83
2613d9089a6SAdrian Chadd #define WPI_TX_STATUS_FAIL_FIFO_UNDERRUN	0x84
2623d9089a6SAdrian Chadd #define WPI_TX_STATUS_FAIL_MGMNT_ABORT		0x85
2633d9089a6SAdrian Chadd #define WPI_TX_STATUS_FAIL_NEXT_FRAG		0x86
2643d9089a6SAdrian Chadd #define WPI_TX_STATUS_FAIL_LIFE_EXPIRE		0x87
2653d9089a6SAdrian Chadd #define WPI_TX_STATUS_FAIL_NODE_PS		0x88
2663d9089a6SAdrian Chadd #define WPI_TX_STATUS_FAIL_ABORTED		0x89
2673d9089a6SAdrian Chadd #define WPI_TX_STATUS_FAIL_BT_RETRY		0x8a
2683d9089a6SAdrian Chadd #define WPI_TX_STATUS_FAIL_NODE_INVALID		0x8b
2693d9089a6SAdrian Chadd #define WPI_TX_STATUS_FAIL_FRAG_DROPPED		0x8c
2703d9089a6SAdrian Chadd #define WPI_TX_STATUS_FAIL_TID_DISABLE		0x8d
2713d9089a6SAdrian Chadd #define WPI_TX_STATUS_FAIL_FRAME_FLUSHED	0x8e
2723d9089a6SAdrian Chadd #define WPI_TX_STATUS_FAIL_INSUFFICIENT_CF_POLL	0x8f
2733d9089a6SAdrian Chadd #define WPI_TX_STATUS_FAIL_TX_LOCKED		0x90
2743d9089a6SAdrian Chadd #define WPI_TX_STATUS_FAIL_NO_BEACON_ON_RADAR	0x91
2753d9089a6SAdrian Chadd 
2766607310bSBenjamin Close } __packed;
2776607310bSBenjamin Close 
2786607310bSBenjamin Close struct wpi_rx_desc {
2796607310bSBenjamin Close 	uint32_t	len;
2806607310bSBenjamin Close 	uint8_t		type;
2816607310bSBenjamin Close #define WPI_UC_READY		  1
2826607310bSBenjamin Close #define WPI_RX_DONE		 27
2836607310bSBenjamin Close #define WPI_TX_DONE		 28
2846607310bSBenjamin Close #define WPI_START_SCAN		130
28582f1b132SAndrew Thompson #define WPI_SCAN_RESULTS	131
2866607310bSBenjamin Close #define WPI_STOP_SCAN		132
287692ad7caSAdrian Chadd #define WPI_BEACON_SENT		144
288692ad7caSAdrian Chadd #define WPI_RX_STATISTICS	156
289692ad7caSAdrian Chadd #define WPI_BEACON_STATISTICS	157
2906607310bSBenjamin Close #define WPI_STATE_CHANGED	161
291692ad7caSAdrian Chadd #define WPI_BEACON_MISSED	162
2926607310bSBenjamin Close 
2936607310bSBenjamin Close 	uint8_t		flags;
2946607310bSBenjamin Close 	uint8_t		idx;
2956607310bSBenjamin Close 	uint8_t		qid;
2966607310bSBenjamin Close } __packed;
2976607310bSBenjamin Close 
2988e4cf38aSAdrian Chadd #define WPI_RX_DESC_QID_MSK		0x07
2998e4cf38aSAdrian Chadd #define WPI_UNSOLICITED_RX_NOTIF	0x80
3008e4cf38aSAdrian Chadd 
3016607310bSBenjamin Close struct wpi_rx_stat {
3026607310bSBenjamin Close 	uint8_t		len;
3036607310bSBenjamin Close #define WPI_STAT_MAXLEN	20
3046607310bSBenjamin Close 
3056607310bSBenjamin Close 	uint8_t		id;
3066607310bSBenjamin Close 	uint8_t		rssi;	/* received signal strength */
3078e4cf38aSAdrian Chadd #define WPI_RSSI_OFFSET	-95
3086607310bSBenjamin Close 
3096607310bSBenjamin Close 	uint8_t		agc;	/* access gain control */
3106607310bSBenjamin Close 	uint16_t	signal;
3116607310bSBenjamin Close 	uint16_t	noise;
3126607310bSBenjamin Close } __packed;
3136607310bSBenjamin Close 
3146607310bSBenjamin Close struct wpi_rx_head {
3156607310bSBenjamin Close 	uint16_t	chan;
3166607310bSBenjamin Close 	uint16_t	flags;
317692ad7caSAdrian Chadd #define WPI_STAT_FLAG_SHPREAMBLE	(1 << 2)
318692ad7caSAdrian Chadd 
3196607310bSBenjamin Close 	uint8_t		reserved;
320692ad7caSAdrian Chadd 	uint8_t		plcp;
3216607310bSBenjamin Close 	uint16_t	len;
3226607310bSBenjamin Close } __packed;
3236607310bSBenjamin Close 
3246607310bSBenjamin Close struct wpi_rx_tail {
3256607310bSBenjamin Close 	uint32_t	flags;
3266607310bSBenjamin Close #define WPI_RX_NO_CRC_ERR	(1 << 0)
3276607310bSBenjamin Close #define WPI_RX_NO_OVFL_ERR	(1 << 1)
3286607310bSBenjamin Close /* shortcut for the above */
3296607310bSBenjamin Close #define WPI_RX_NOERROR		(WPI_RX_NO_CRC_ERR | WPI_RX_NO_OVFL_ERR)
330692ad7caSAdrian Chadd #define WPI_RX_CIPHER_MASK	(7 <<  8)
331692ad7caSAdrian Chadd #define WPI_RX_CIPHER_CCMP	(2 <<  8)
332692ad7caSAdrian Chadd #define WPI_RX_DECRYPT_MASK	(3 << 11)
333692ad7caSAdrian Chadd #define WPI_RX_DECRYPT_OK	(3 << 11)
334692ad7caSAdrian Chadd 
3356607310bSBenjamin Close 	uint64_t	tstamp;
3366607310bSBenjamin Close 	uint32_t	tbeacon;
3376607310bSBenjamin Close } __packed;
3386607310bSBenjamin Close 
3396607310bSBenjamin Close struct wpi_tx_cmd {
3406607310bSBenjamin Close 	uint8_t	code;
341692ad7caSAdrian Chadd #define WPI_CMD_RXON		 16
342692ad7caSAdrian Chadd #define WPI_CMD_RXON_ASSOC	 17
343692ad7caSAdrian Chadd #define WPI_CMD_EDCA_PARAMS	 19
344692ad7caSAdrian Chadd #define WPI_CMD_TIMING		 20
3456607310bSBenjamin Close #define WPI_CMD_ADD_NODE	 24
346692ad7caSAdrian Chadd #define WPI_CMD_DEL_NODE	 25
3476607310bSBenjamin Close #define WPI_CMD_TX_DATA		 28
3486607310bSBenjamin Close #define WPI_CMD_MRR_SETUP	 71
3496607310bSBenjamin Close #define WPI_CMD_SET_LED		 72
3506607310bSBenjamin Close #define WPI_CMD_SET_POWER_MODE	119
3516607310bSBenjamin Close #define WPI_CMD_SCAN		128
3526f506674SAdrian Chadd #define WPI_CMD_SCAN_ABORT	129
3536607310bSBenjamin Close #define WPI_CMD_SET_BEACON	145
3546607310bSBenjamin Close #define WPI_CMD_TXPOWER		151
355692ad7caSAdrian Chadd #define WPI_CMD_BT_COEX		155
356692ad7caSAdrian Chadd #define WPI_CMD_GET_STATISTICS	156
3576607310bSBenjamin Close 
3586607310bSBenjamin Close 	uint8_t	flags;
3596607310bSBenjamin Close 	uint8_t	idx;
3606607310bSBenjamin Close 	uint8_t	qid;
361692ad7caSAdrian Chadd 	uint8_t	data[124];
3626607310bSBenjamin Close } __packed;
3636607310bSBenjamin Close 
364692ad7caSAdrian Chadd /* Structure for command WPI_CMD_RXON. */
365692ad7caSAdrian Chadd struct wpi_rxon {
3666607310bSBenjamin Close 	uint8_t		myaddr[IEEE80211_ADDR_LEN];
3676607310bSBenjamin Close 	uint16_t	reserved1;
3686607310bSBenjamin Close 	uint8_t		bssid[IEEE80211_ADDR_LEN];
3696607310bSBenjamin Close 	uint16_t	reserved2;
370692ad7caSAdrian Chadd 	uint8_t		wlap[IEEE80211_ADDR_LEN];
3716607310bSBenjamin Close 	uint16_t	reserved3;
3726607310bSBenjamin Close 	uint8_t		mode;
3736607310bSBenjamin Close #define WPI_MODE_HOSTAP		1
3746607310bSBenjamin Close #define WPI_MODE_STA		3
3756607310bSBenjamin Close #define WPI_MODE_IBSS		4
3766607310bSBenjamin Close #define WPI_MODE_MONITOR	6
3776607310bSBenjamin Close 
378692ad7caSAdrian Chadd 	uint8_t		air;
3796607310bSBenjamin Close 	uint16_t	reserved4;
3806607310bSBenjamin Close 	uint8_t		ofdm_mask;
3816607310bSBenjamin Close 	uint8_t		cck_mask;
3826607310bSBenjamin Close 	uint16_t	associd;
3836607310bSBenjamin Close 	uint32_t	flags;
384692ad7caSAdrian Chadd #define WPI_RXON_24GHZ		(1 <<  0)
385692ad7caSAdrian Chadd #define WPI_RXON_CCK		(1 <<  1)
386692ad7caSAdrian Chadd #define WPI_RXON_AUTO		(1 <<  2)
387692ad7caSAdrian Chadd #define WPI_RXON_SHSLOT		(1 <<  4)
388692ad7caSAdrian Chadd #define WPI_RXON_SHPREAMBLE	(1 <<  5)
389692ad7caSAdrian Chadd #define WPI_RXON_NODIVERSITY	(1 <<  7)
390692ad7caSAdrian Chadd #define WPI_RXON_ANTENNA_A	(1 <<  8)
391692ad7caSAdrian Chadd #define WPI_RXON_ANTENNA_B	(1 <<  9)
392692ad7caSAdrian Chadd #define WPI_RXON_TSF		(1 << 15)
393692ad7caSAdrian Chadd #define WPI_RXON_CTS_TO_SELF	(1 << 30)
3946607310bSBenjamin Close 
3956607310bSBenjamin Close 	uint32_t	filter;
3966607310bSBenjamin Close #define WPI_FILTER_PROMISC	(1 << 0)
3976607310bSBenjamin Close #define WPI_FILTER_CTL		(1 << 1)
3986607310bSBenjamin Close #define WPI_FILTER_MULTICAST	(1 << 2)
3996607310bSBenjamin Close #define WPI_FILTER_NODECRYPT	(1 << 3)
4006607310bSBenjamin Close #define WPI_FILTER_BSS		(1 << 5)
4016607310bSBenjamin Close #define WPI_FILTER_BEACON	(1 << 6)
402726ddc26SAdrian Chadd #define WPI_FILTER_ASSOC	(1 << 7)    /* Accept associaton requests. */
4036607310bSBenjamin Close 
4046607310bSBenjamin Close 	uint8_t		chan;
405692ad7caSAdrian Chadd 	uint16_t	reserved5;
4066607310bSBenjamin Close } __packed;
4076607310bSBenjamin Close 
408692ad7caSAdrian Chadd /* Structure for command WPI_CMD_RXON_ASSOC. */
4096607310bSBenjamin Close struct wpi_assoc {
4106607310bSBenjamin Close 	uint32_t	flags;
4116607310bSBenjamin Close 	uint32_t	filter;
4126607310bSBenjamin Close 	uint8_t		ofdm_mask;
4136607310bSBenjamin Close 	uint8_t		cck_mask;
4146607310bSBenjamin Close 	uint16_t	reserved;
4156607310bSBenjamin Close } __packed;
4166607310bSBenjamin Close 
417692ad7caSAdrian Chadd /* Structure for command WPI_CMD_EDCA_PARAMS. */
418692ad7caSAdrian Chadd struct wpi_edca_params {
4196607310bSBenjamin Close 	uint32_t	flags;
420692ad7caSAdrian Chadd #define WPI_EDCA_UPDATE	(1 << 0)
421692ad7caSAdrian Chadd 
4226607310bSBenjamin Close 	struct {
4236607310bSBenjamin Close 		uint16_t	cwmin;
4246607310bSBenjamin Close 		uint16_t	cwmax;
4256607310bSBenjamin Close 		uint8_t		aifsn;
4266607310bSBenjamin Close 		uint8_t		reserved;
427692ad7caSAdrian Chadd 		uint16_t	txoplimit;
4286607310bSBenjamin Close 	} __packed	ac[WME_NUM_AC];
4296607310bSBenjamin Close } __packed;
4306607310bSBenjamin Close 
431692ad7caSAdrian Chadd /* Structure for command WPI_CMD_TIMING. */
432692ad7caSAdrian Chadd struct wpi_cmd_timing {
4336607310bSBenjamin Close 	uint64_t	tstamp;
4346607310bSBenjamin Close 	uint16_t	bintval;
4356607310bSBenjamin Close 	uint16_t	atim;
4366607310bSBenjamin Close 	uint32_t	binitval;
4376607310bSBenjamin Close 	uint16_t	lintval;
4386607310bSBenjamin Close 	uint16_t	reserved;
4396607310bSBenjamin Close } __packed;
4406607310bSBenjamin Close 
441692ad7caSAdrian Chadd /* Structure for command WPI_CMD_ADD_NODE. */
4426607310bSBenjamin Close struct wpi_node_info {
4436607310bSBenjamin Close 	uint8_t		control;
4446607310bSBenjamin Close #define WPI_NODE_UPDATE		(1 << 0)
4456607310bSBenjamin Close 
4466607310bSBenjamin Close 	uint8_t		reserved1[3];
447692ad7caSAdrian Chadd 	uint8_t		macaddr[IEEE80211_ADDR_LEN];
4486607310bSBenjamin Close 	uint16_t	reserved2;
4496607310bSBenjamin Close 	uint8_t		id;
4506607310bSBenjamin Close #define WPI_ID_BSS		0
451692ad7caSAdrian Chadd #define WPI_ID_IBSS_MIN		2
452692ad7caSAdrian Chadd #define WPI_ID_IBSS_MAX		23
4536607310bSBenjamin Close #define WPI_ID_BROADCAST	24
454692ad7caSAdrian Chadd #define WPI_ID_UNDEFINED	(uint8_t)-1
4556607310bSBenjamin Close 
4566607310bSBenjamin Close 	uint8_t		flags;
457692ad7caSAdrian Chadd #define WPI_FLAG_KEY_SET	(1 << 0)
458692ad7caSAdrian Chadd 
4596607310bSBenjamin Close 	uint16_t	reserved3;
460692ad7caSAdrian Chadd 	uint16_t	kflags;
461692ad7caSAdrian Chadd #define WPI_KFLAG_CCMP		(1 <<  1)
462692ad7caSAdrian Chadd #define WPI_KFLAG_KID(kid)	((kid) << 8)
463692ad7caSAdrian Chadd #define WPI_KFLAG_MULTICAST	(1 << 14)
464692ad7caSAdrian Chadd 
465692ad7caSAdrian Chadd 	uint8_t		tsc2;
4666607310bSBenjamin Close 	uint8_t		reserved4;
4676607310bSBenjamin Close 	uint16_t	ttak[5];
4686607310bSBenjamin Close 	uint16_t	reserved5;
4696607310bSBenjamin Close 	uint8_t		key[IEEE80211_KEYBUF_SIZE];
4706607310bSBenjamin Close 	uint32_t	action;
471692ad7caSAdrian Chadd #define WPI_ACTION_SET_RATE	(1 << 2)
472692ad7caSAdrian Chadd 
4736607310bSBenjamin Close 	uint32_t	mask;
4746607310bSBenjamin Close 	uint16_t	tid;
475692ad7caSAdrian Chadd 	uint8_t		plcp;
4766607310bSBenjamin Close 	uint8_t		antenna;
4776607310bSBenjamin Close #define WPI_ANTENNA_A		(1 << 6)
4786607310bSBenjamin Close #define WPI_ANTENNA_B		(1 << 7)
4796607310bSBenjamin Close #define WPI_ANTENNA_BOTH	(WPI_ANTENNA_A | WPI_ANTENNA_B)
480692ad7caSAdrian Chadd 
4816607310bSBenjamin Close 	uint8_t		add_imm;
4826607310bSBenjamin Close 	uint8_t		del_imm;
4836607310bSBenjamin Close 	uint16_t	add_imm_start;
4846607310bSBenjamin Close } __packed;
4856607310bSBenjamin Close 
486692ad7caSAdrian Chadd /* Structure for command WPI_CMD_DEL_NODE. */
487692ad7caSAdrian Chadd struct wpi_cmd_del_node {
488692ad7caSAdrian Chadd 	uint8_t		count;
489692ad7caSAdrian Chadd 	uint8_t		reserved1[3];
490692ad7caSAdrian Chadd 	uint8_t		macaddr[IEEE80211_ADDR_LEN];
491692ad7caSAdrian Chadd 	uint16_t	reserved2;
492692ad7caSAdrian Chadd } __packed;
493692ad7caSAdrian Chadd 
494692ad7caSAdrian Chadd /* Structure for command WPI_CMD_TX_DATA. */
4956607310bSBenjamin Close struct wpi_cmd_data {
4966607310bSBenjamin Close 	uint16_t	len;
4976607310bSBenjamin Close 	uint16_t	lnext;
4986607310bSBenjamin Close 	uint32_t	flags;
4996607310bSBenjamin Close #define WPI_TX_NEED_RTS		(1 <<  1)
5006607310bSBenjamin Close #define WPI_TX_NEED_CTS		(1 <<  2)
5016607310bSBenjamin Close #define WPI_TX_NEED_ACK		(1 <<  3)
5026607310bSBenjamin Close #define WPI_TX_FULL_TXOP	(1 <<  7)
5036607310bSBenjamin Close #define WPI_TX_BT_DISABLE	(1 << 12) 	/* bluetooth coexistence */
5046607310bSBenjamin Close #define WPI_TX_AUTO_SEQ		(1 << 13)
505fae61c69SAdrian Chadd #define WPI_TX_MORE_FRAG	(1 << 14)
5066607310bSBenjamin Close #define WPI_TX_INSERT_TSTAMP	(1 << 16)
5076607310bSBenjamin Close 
508692ad7caSAdrian Chadd 	uint8_t		plcp;
5096607310bSBenjamin Close 	uint8_t		id;
5106607310bSBenjamin Close 	uint8_t		tid;
5116607310bSBenjamin Close 	uint8_t		security;
512692ad7caSAdrian Chadd #define WPI_CIPHER_WEP		1
513692ad7caSAdrian Chadd #define WPI_CIPHER_CCMP		2
514692ad7caSAdrian Chadd #define WPI_CIPHER_TKIP		3
515692ad7caSAdrian Chadd #define WPI_CIPHER_WEP104	9
516692ad7caSAdrian Chadd 
5176607310bSBenjamin Close 	uint8_t		key[IEEE80211_KEYBUF_SIZE];
5186607310bSBenjamin Close 	uint8_t		tkip[IEEE80211_WEP_MICLEN];
5196607310bSBenjamin Close 	uint32_t	fnext;
520*940aa808SAdrian Chadd #define WPI_NEXT_STA_ID(id)	((id) << 8)
521*940aa808SAdrian Chadd 
5226607310bSBenjamin Close 	uint32_t	lifetime;
5236607310bSBenjamin Close #define WPI_LIFETIME_INFINITE	0xffffffff
524692ad7caSAdrian Chadd 
5256607310bSBenjamin Close 	uint8_t		ofdm_mask;
5266607310bSBenjamin Close 	uint8_t		cck_mask;
5276607310bSBenjamin Close 	uint8_t		rts_ntries;
5286607310bSBenjamin Close 	uint8_t		data_ntries;
5296607310bSBenjamin Close 	uint16_t	timeout;
5306607310bSBenjamin Close 	uint16_t	txop;
5316607310bSBenjamin Close } __packed;
5326607310bSBenjamin Close 
533692ad7caSAdrian Chadd /* Structure for command WPI_CMD_SET_BEACON. */
5346607310bSBenjamin Close struct wpi_cmd_beacon {
5356607310bSBenjamin Close 	uint16_t	len;
5366607310bSBenjamin Close 	uint16_t	reserved1;
5376607310bSBenjamin Close 	uint32_t	flags;	/* same as wpi_cmd_data */
538692ad7caSAdrian Chadd 	uint8_t		plcp;
5396607310bSBenjamin Close 	uint8_t		id;
5406607310bSBenjamin Close 	uint8_t		reserved2[30];
5416607310bSBenjamin Close 	uint32_t	lifetime;
5426607310bSBenjamin Close 	uint8_t		ofdm_mask;
5436607310bSBenjamin Close 	uint8_t		cck_mask;
5446607310bSBenjamin Close 	uint16_t	reserved3[3];
5456607310bSBenjamin Close 	uint16_t	tim;
5466607310bSBenjamin Close 	uint8_t		timsz;
5476607310bSBenjamin Close 	uint8_t		reserved4;
5486607310bSBenjamin Close } __packed;
5496607310bSBenjamin Close 
550692ad7caSAdrian Chadd /* Structure for notification WPI_BEACON_MISSED. */
551692ad7caSAdrian Chadd struct wpi_beacon_missed {
552a7099588SBenjamin Close 	uint32_t consecutive;
553a7099588SBenjamin Close 	uint32_t total;
554a7099588SBenjamin Close 	uint32_t expected;
555a7099588SBenjamin Close 	uint32_t received;
556a7099588SBenjamin Close } __packed;
557a7099588SBenjamin Close 
558692ad7caSAdrian Chadd /* Structure for command WPI_CMD_MRR_SETUP. */
559692ad7caSAdrian Chadd #define WPI_RIDX_MAX	11
5606607310bSBenjamin Close struct wpi_mrr_setup {
561692ad7caSAdrian Chadd 	uint32_t	which;
5626607310bSBenjamin Close #define WPI_MRR_CTL	0
5636607310bSBenjamin Close #define WPI_MRR_DATA	1
5646607310bSBenjamin Close 
5656607310bSBenjamin Close 	struct {
566692ad7caSAdrian Chadd 		uint8_t	plcp;
5676607310bSBenjamin Close 		uint8_t	flags;
5686607310bSBenjamin Close 		uint8_t	ntries;
56930b60481SAdrian Chadd #define		WPI_NTRIES_DEFAULT	2
57030b60481SAdrian Chadd 
5716607310bSBenjamin Close 		uint8_t	next;
572692ad7caSAdrian Chadd 	} __packed	rates[WPI_RIDX_MAX + 1];
5736607310bSBenjamin Close } __packed;
5746607310bSBenjamin Close 
575692ad7caSAdrian Chadd /* Structure for command WPI_CMD_SET_LED. */
5766607310bSBenjamin Close struct wpi_cmd_led {
5776607310bSBenjamin Close 	uint32_t	unit;	/* multiplier (in usecs) */
5786607310bSBenjamin Close 	uint8_t		which;
5796607310bSBenjamin Close #define WPI_LED_ACTIVITY	1
5806607310bSBenjamin Close #define WPI_LED_LINK		2
5816607310bSBenjamin Close 
5826607310bSBenjamin Close 	uint8_t		off;
5836607310bSBenjamin Close 	uint8_t		on;
5846607310bSBenjamin Close 	uint8_t		reserved;
5856607310bSBenjamin Close } __packed;
5866607310bSBenjamin Close 
587692ad7caSAdrian Chadd /* Structure for command WPI_CMD_SET_POWER_MODE. */
588692ad7caSAdrian Chadd struct wpi_pmgt_cmd {
589692ad7caSAdrian Chadd 	uint16_t	flags;
590692ad7caSAdrian Chadd #define WPI_PS_ALLOW_SLEEP	(1 << 0)
591692ad7caSAdrian Chadd #define WPI_PS_NOTIFY		(1 << 1)
592692ad7caSAdrian Chadd #define WPI_PS_SLEEP_OVER_DTIM	(1 << 2)
593692ad7caSAdrian Chadd #define WPI_PS_PCI_PMGT		(1 << 3)
594692ad7caSAdrian Chadd 
595692ad7caSAdrian Chadd 	uint8_t		reserved[2];
596692ad7caSAdrian Chadd 	uint32_t	rxtimeout;
597692ad7caSAdrian Chadd 	uint32_t	txtimeout;
598692ad7caSAdrian Chadd 	uint32_t	intval[5];
5996607310bSBenjamin Close } __packed;
6006607310bSBenjamin Close 
601692ad7caSAdrian Chadd /* Structures for command WPI_CMD_SCAN. */
602692ad7caSAdrian Chadd #define WPI_SCAN_MAX_ESSIDS	4
603692ad7caSAdrian Chadd struct wpi_scan_essid {
604692ad7caSAdrian Chadd 	uint8_t	id;
605692ad7caSAdrian Chadd 	uint8_t	len;
606692ad7caSAdrian Chadd 	uint8_t	data[IEEE80211_NWID_LEN];
607692ad7caSAdrian Chadd } __packed;
608692ad7caSAdrian Chadd 
6096607310bSBenjamin Close struct wpi_scan_hdr {
6106607310bSBenjamin Close 	uint16_t	len;
6116607310bSBenjamin Close 	uint8_t		reserved1;
6126607310bSBenjamin Close 	uint8_t		nchan;
61342946b7dSAdrian Chadd 	uint16_t	quiet_time;	/* timeout in milliseconds */
61442946b7dSAdrian Chadd #define WPI_QUIET_TIME_DEFAULT		10
61542946b7dSAdrian Chadd 
61642946b7dSAdrian Chadd 	uint16_t	quiet_threshold; /* min # of packets */
617692ad7caSAdrian Chadd 	uint16_t	crc_threshold;
6186607310bSBenjamin Close 	uint16_t	reserved2;
619692ad7caSAdrian Chadd 	uint32_t	max_svc;	/* background scans */
620692ad7caSAdrian Chadd 	uint32_t	pause_svc;	/* background scans */
621efccc3c6SAdrian Chadd #define WPI_PAUSE_MAX_TIME		((1 << 20) - 1)
622efccc3c6SAdrian Chadd #define WPI_PAUSE_SCAN(nbeacons, time)	((nbeacons << 24) | time)
623efccc3c6SAdrian Chadd 
6246607310bSBenjamin Close 	uint32_t	flags;
6256607310bSBenjamin Close 	uint32_t	filter;
6266607310bSBenjamin Close 
627692ad7caSAdrian Chadd 	/* Followed by a struct wpi_cmd_data. */
628692ad7caSAdrian Chadd 	/* Followed by an array of 4 structs wpi_scan_essid. */
629692ad7caSAdrian Chadd 	/* Followed by probe request body. */
630692ad7caSAdrian Chadd 	/* Followed by an array of ``nchan'' structs wpi_scan_chan. */
6316607310bSBenjamin Close } __packed;
6326607310bSBenjamin Close 
6336607310bSBenjamin Close struct wpi_scan_chan {
6346607310bSBenjamin Close 	uint8_t		flags;
6356607310bSBenjamin Close #define WPI_CHAN_ACTIVE		(1 << 0)
636692ad7caSAdrian Chadd #define WPI_CHAN_NPBREQS(x)	(((1 << (x)) - 1) << 1)
637692ad7caSAdrian Chadd 
638692ad7caSAdrian Chadd 	uint8_t		chan;
639692ad7caSAdrian Chadd 	uint8_t		rf_gain;
640692ad7caSAdrian Chadd 	uint8_t		dsp_gain;
6416607310bSBenjamin Close 	uint16_t	active;		/* msecs */
6426607310bSBenjamin Close 	uint16_t	passive;	/* msecs */
6436607310bSBenjamin Close } __packed;
6446607310bSBenjamin Close 
645692ad7caSAdrian Chadd #define WPI_SCAN_CRC_TH_DEFAULT		htole16(1)
646692ad7caSAdrian Chadd #define WPI_SCAN_CRC_TH_NEVER		htole16(0xffff)
647692ad7caSAdrian Chadd 
648692ad7caSAdrian Chadd /* Maximum size of a scan command. */
649692ad7caSAdrian Chadd #define WPI_SCAN_MAXSZ	(MCLBYTES - 4)
650692ad7caSAdrian Chadd 
651692ad7caSAdrian Chadd #define WPI_ACTIVE_DWELL_TIME_2GHZ	(30)	/* all times in msec */
652692ad7caSAdrian Chadd #define WPI_ACTIVE_DWELL_TIME_5GHZ	(20)
653692ad7caSAdrian Chadd #define WPI_ACTIVE_DWELL_FACTOR_2GHZ	( 3)
654692ad7caSAdrian Chadd #define WPI_ACTIVE_DWELL_FACTOR_5GHZ	( 2)
655692ad7caSAdrian Chadd 
656692ad7caSAdrian Chadd #define WPI_PASSIVE_DWELL_TIME_2GHZ	( 20)
657692ad7caSAdrian Chadd #define WPI_PASSIVE_DWELL_TIME_5GHZ	( 10)
658692ad7caSAdrian Chadd #define WPI_PASSIVE_DWELL_BASE		(100)
65942946b7dSAdrian Chadd #define WPI_CHANNEL_TUNE_TIME		(  6)
660692ad7caSAdrian Chadd 
661692ad7caSAdrian Chadd /* Structure for command WPI_CMD_TXPOWER. */
662692ad7caSAdrian Chadd struct wpi_cmd_txpower {
663692ad7caSAdrian Chadd 	uint8_t		band;
664692ad7caSAdrian Chadd #define WPI_BAND_5GHZ	0
665692ad7caSAdrian Chadd #define WPI_BAND_2GHZ	1
666692ad7caSAdrian Chadd 
667692ad7caSAdrian Chadd 	uint8_t		reserved;
668692ad7caSAdrian Chadd 	uint16_t	chan;
669692ad7caSAdrian Chadd 
670692ad7caSAdrian Chadd 	struct {
671692ad7caSAdrian Chadd 		uint8_t	plcp;
672692ad7caSAdrian Chadd 		uint8_t	rf_gain;
673692ad7caSAdrian Chadd 		uint8_t	dsp_gain;
674692ad7caSAdrian Chadd 		uint8_t	reserved;
675692ad7caSAdrian Chadd 	} __packed	rates[WPI_RIDX_MAX + 1];
676692ad7caSAdrian Chadd 
677692ad7caSAdrian Chadd } __packed;
678692ad7caSAdrian Chadd 
679692ad7caSAdrian Chadd /* Structure for command WPI_CMD_BT_COEX. */
6806607310bSBenjamin Close struct wpi_bluetooth {
6816607310bSBenjamin Close 	uint8_t		flags;
682692ad7caSAdrian Chadd #define WPI_BT_COEX_DISABLE	0
683692ad7caSAdrian Chadd #define WPI_BT_COEX_MODE_2WIRE	1
684692ad7caSAdrian Chadd #define WPI_BT_COEX_MODE_3WIRE	2
685692ad7caSAdrian Chadd #define WPI_BT_COEX_MODE_4WIRE	3
686692ad7caSAdrian Chadd 
687692ad7caSAdrian Chadd 	uint8_t		lead_time;
688692ad7caSAdrian Chadd #define WPI_BT_LEAD_TIME_DEF	30
689692ad7caSAdrian Chadd 
690692ad7caSAdrian Chadd 	uint8_t		max_kill;
691692ad7caSAdrian Chadd #define WPI_BT_MAX_KILL_DEF	5
692692ad7caSAdrian Chadd 
6936607310bSBenjamin Close 	uint8_t		reserved;
694692ad7caSAdrian Chadd 	uint32_t	kill_ack;
695692ad7caSAdrian Chadd 	uint32_t	kill_cts;
6966607310bSBenjamin Close } __packed;
6976607310bSBenjamin Close 
698692ad7caSAdrian Chadd /* Structure for WPI_UC_READY notification. */
6996607310bSBenjamin Close struct wpi_ucode_info {
700692ad7caSAdrian Chadd 	uint8_t		minor;
701692ad7caSAdrian Chadd 	uint8_t		major;
702692ad7caSAdrian Chadd 	uint16_t	reserved1;
7036607310bSBenjamin Close 	uint8_t		revision[8];
7046607310bSBenjamin Close 	uint8_t		type;
7056607310bSBenjamin Close 	uint8_t		subtype;
706692ad7caSAdrian Chadd 	uint16_t	reserved2;
7076607310bSBenjamin Close 	uint32_t	logptr;
708692ad7caSAdrian Chadd 	uint32_t	errptr;
709692ad7caSAdrian Chadd 	uint32_t	tstamp;
7106607310bSBenjamin Close 	uint32_t	valid;
7116607310bSBenjamin Close } __packed;
7126607310bSBenjamin Close 
713692ad7caSAdrian Chadd /* Structure for WPI_START_SCAN notification. */
7146607310bSBenjamin Close struct wpi_start_scan {
7156607310bSBenjamin Close 	uint64_t	tstamp;
7166607310bSBenjamin Close 	uint32_t	tbeacon;
7176607310bSBenjamin Close 	uint8_t		chan;
7186607310bSBenjamin Close 	uint8_t		band;
7196607310bSBenjamin Close 	uint16_t	reserved;
7206607310bSBenjamin Close 	uint32_t	status;
7216607310bSBenjamin Close } __packed;
7226607310bSBenjamin Close 
723692ad7caSAdrian Chadd /* Structure for WPI_STOP_SCAN notification. */
7246607310bSBenjamin Close struct wpi_stop_scan {
7256607310bSBenjamin Close 	uint8_t		nchan;
7266607310bSBenjamin Close 	uint8_t		status;
7276f506674SAdrian Chadd #define WPI_SCAN_COMPLETED	1
7286f506674SAdrian Chadd #define WPI_SCAN_ABORTED	2
7296f506674SAdrian Chadd 
7306607310bSBenjamin Close 	uint8_t		reserved;
7316607310bSBenjamin Close 	uint8_t		chan;
7326607310bSBenjamin Close 	uint64_t	tsf;
7336607310bSBenjamin Close } __packed;
7346607310bSBenjamin Close 
735692ad7caSAdrian Chadd /* Structures for WPI_{RX,BEACON}_STATISTICS notification. */
736692ad7caSAdrian Chadd struct wpi_rx_phy_stats {
737692ad7caSAdrian Chadd 	uint32_t	ina;
738692ad7caSAdrian Chadd 	uint32_t	fina;
739692ad7caSAdrian Chadd 	uint32_t	bad_plcp;
740692ad7caSAdrian Chadd 	uint32_t	bad_crc32;
741692ad7caSAdrian Chadd 	uint32_t	overrun;
742692ad7caSAdrian Chadd 	uint32_t	eoverrun;
743692ad7caSAdrian Chadd 	uint32_t	good_crc32;
744692ad7caSAdrian Chadd 	uint32_t	fa;
745692ad7caSAdrian Chadd 	uint32_t	bad_fina_sync;
746692ad7caSAdrian Chadd 	uint32_t	sfd_timeout;
747692ad7caSAdrian Chadd 	uint32_t	fina_timeout;
748692ad7caSAdrian Chadd 	uint32_t	no_rts_ack;
749692ad7caSAdrian Chadd 	uint32_t	rxe_limit;
750692ad7caSAdrian Chadd 	uint32_t	ack;
751692ad7caSAdrian Chadd 	uint32_t	cts;
752692ad7caSAdrian Chadd } __packed;
753692ad7caSAdrian Chadd 
754692ad7caSAdrian Chadd struct wpi_rx_general_stats {
755692ad7caSAdrian Chadd 	uint32_t	bad_cts;
756692ad7caSAdrian Chadd 	uint32_t	bad_ack;
757692ad7caSAdrian Chadd 	uint32_t	not_bss;
758692ad7caSAdrian Chadd 	uint32_t	filtered;
759692ad7caSAdrian Chadd 	uint32_t	bad_chan;
760692ad7caSAdrian Chadd } __packed;
761692ad7caSAdrian Chadd 
762692ad7caSAdrian Chadd struct wpi_rx_stats {
763692ad7caSAdrian Chadd 	struct wpi_rx_phy_stats		ofdm;
764692ad7caSAdrian Chadd 	struct wpi_rx_phy_stats		cck;
765692ad7caSAdrian Chadd 	struct wpi_rx_general_stats	general;
766692ad7caSAdrian Chadd } __packed;
767692ad7caSAdrian Chadd 
768692ad7caSAdrian Chadd struct wpi_tx_stats {
769692ad7caSAdrian Chadd 	uint32_t	preamble;
770692ad7caSAdrian Chadd 	uint32_t	rx_detected;
771692ad7caSAdrian Chadd 	uint32_t	bt_defer;
772692ad7caSAdrian Chadd 	uint32_t	bt_kill;
773692ad7caSAdrian Chadd 	uint32_t	short_len;
774692ad7caSAdrian Chadd 	uint32_t	cts_timeout;
775692ad7caSAdrian Chadd 	uint32_t	ack_timeout;
776692ad7caSAdrian Chadd 	uint32_t	exp_ack;
777692ad7caSAdrian Chadd 	uint32_t	ack;
778692ad7caSAdrian Chadd } __packed;
779692ad7caSAdrian Chadd 
780692ad7caSAdrian Chadd struct wpi_general_stats {
781692ad7caSAdrian Chadd 	uint32_t	temp;
782692ad7caSAdrian Chadd 	uint32_t	burst_check;
783692ad7caSAdrian Chadd 	uint32_t	burst;
784692ad7caSAdrian Chadd 	uint32_t	reserved[4];
785692ad7caSAdrian Chadd 	uint32_t	sleep;
786692ad7caSAdrian Chadd 	uint32_t	slot_out;
787692ad7caSAdrian Chadd 	uint32_t	slot_idle;
788692ad7caSAdrian Chadd 	uint32_t	ttl_tstamp;
789692ad7caSAdrian Chadd 	uint32_t	tx_ant_a;
790692ad7caSAdrian Chadd 	uint32_t	tx_ant_b;
791692ad7caSAdrian Chadd 	uint32_t	exec;
792692ad7caSAdrian Chadd 	uint32_t	probe;
793692ad7caSAdrian Chadd } __packed;
794692ad7caSAdrian Chadd 
795692ad7caSAdrian Chadd struct wpi_stats {
796692ad7caSAdrian Chadd 	uint32_t			flags;
797692ad7caSAdrian Chadd 	struct wpi_rx_stats		rx;
798692ad7caSAdrian Chadd 	struct wpi_tx_stats		tx;
799692ad7caSAdrian Chadd 	struct wpi_general_stats	general;
800692ad7caSAdrian Chadd } __packed;
801692ad7caSAdrian Chadd 
802692ad7caSAdrian Chadd /* Possible flags for command WPI_CMD_GET_STATISTICS. */
803692ad7caSAdrian Chadd #define WPI_STATISTICS_BEACON_DISABLE	(1 << 1)
804692ad7caSAdrian Chadd 
805692ad7caSAdrian Chadd /* Firmware error dump entry. */
806692ad7caSAdrian Chadd struct wpi_fw_dump {
807692ad7caSAdrian Chadd 	uint32_t	desc;
808692ad7caSAdrian Chadd 	uint32_t	time;
809692ad7caSAdrian Chadd 	uint32_t	blink[2];
810692ad7caSAdrian Chadd 	uint32_t	ilink[2];
811692ad7caSAdrian Chadd 	uint32_t	data;
812692ad7caSAdrian Chadd } __packed;
813692ad7caSAdrian Chadd 
814692ad7caSAdrian Chadd /* Firmware image file header. */
815692ad7caSAdrian Chadd struct wpi_firmware_hdr {
816692ad7caSAdrian Chadd #define WPI_FW_MINVERSION 2144
817692ad7caSAdrian Chadd #define WPI_FW_NAME "wpifw"
818692ad7caSAdrian Chadd 
819692ad7caSAdrian Chadd 	uint16_t	driver;
820692ad7caSAdrian Chadd 	uint8_t		minor;
821692ad7caSAdrian Chadd 	uint8_t		major;
822692ad7caSAdrian Chadd 	uint32_t	rtextsz;
823692ad7caSAdrian Chadd 	uint32_t	rdatasz;
824692ad7caSAdrian Chadd 	uint32_t	itextsz;
825692ad7caSAdrian Chadd 	uint32_t	idatasz;
826692ad7caSAdrian Chadd 	uint32_t	btextsz;
827692ad7caSAdrian Chadd } __packed;
828692ad7caSAdrian Chadd 
829692ad7caSAdrian Chadd #define WPI_FW_TEXT_MAXSZ	 ( 80 * 1024 )
830692ad7caSAdrian Chadd #define WPI_FW_DATA_MAXSZ	 ( 32 * 1024 )
831692ad7caSAdrian Chadd #define WPI_FW_BOOT_TEXT_MAXSZ		1024
832692ad7caSAdrian Chadd 
833692ad7caSAdrian Chadd #define WPI_FW_UPDATED	(1U << 31 )
834692ad7caSAdrian Chadd 
835692ad7caSAdrian Chadd /*
836692ad7caSAdrian Chadd  * Offsets into EEPROM.
837692ad7caSAdrian Chadd  */
8386607310bSBenjamin Close #define WPI_EEPROM_MAC		0x015
8396607310bSBenjamin Close #define WPI_EEPROM_REVISION	0x035
840692ad7caSAdrian Chadd #define WPI_EEPROM_SKU_CAP	0x045
8416607310bSBenjamin Close #define WPI_EEPROM_TYPE		0x04a
8426607310bSBenjamin Close #define WPI_EEPROM_DOMAIN	0x060
8436607310bSBenjamin Close #define WPI_EEPROM_BAND1	0x063
8446607310bSBenjamin Close #define WPI_EEPROM_BAND2	0x072
8456607310bSBenjamin Close #define WPI_EEPROM_BAND3	0x080
8466607310bSBenjamin Close #define WPI_EEPROM_BAND4	0x08d
8476607310bSBenjamin Close #define WPI_EEPROM_BAND5	0x099
8486607310bSBenjamin Close #define WPI_EEPROM_POWER_GRP	0x100
8496607310bSBenjamin Close 
8506607310bSBenjamin Close struct wpi_eeprom_chan {
8516607310bSBenjamin Close 	uint8_t	flags;
8526607310bSBenjamin Close #define WPI_EEPROM_CHAN_VALID	(1 << 0)
8536607310bSBenjamin Close #define	WPI_EEPROM_CHAN_IBSS	(1 << 1)
8546607310bSBenjamin Close #define WPI_EEPROM_CHAN_ACTIVE	(1 << 3)
8556607310bSBenjamin Close #define WPI_EEPROM_CHAN_RADAR	(1 << 4)
8566607310bSBenjamin Close 
8576607310bSBenjamin Close 	int8_t	maxpwr;
8586607310bSBenjamin Close } __packed;
8596607310bSBenjamin Close 
8606607310bSBenjamin Close struct wpi_eeprom_sample {
8616607310bSBenjamin Close 	uint8_t		index;
8626607310bSBenjamin Close 	int8_t		power;
8636607310bSBenjamin Close 	uint16_t	volt;
864692ad7caSAdrian Chadd } __packed;
8656607310bSBenjamin Close 
8666607310bSBenjamin Close #define WPI_POWER_GROUPS_COUNT	5
8676607310bSBenjamin Close struct wpi_eeprom_group {
8686607310bSBenjamin Close 	struct		wpi_eeprom_sample samples[5];
8696607310bSBenjamin Close 	int32_t		coef[5];
8706607310bSBenjamin Close 	int32_t		corr[5];
8716607310bSBenjamin Close 	int8_t		maxpwr;
8726607310bSBenjamin Close 	uint8_t		chan;
8736607310bSBenjamin Close 	int16_t		temp;
8746607310bSBenjamin Close } __packed;
8756607310bSBenjamin Close 
8766607310bSBenjamin Close #define WPI_CHAN_BANDS_COUNT	 5
8776607310bSBenjamin Close #define WPI_MAX_CHAN_PER_BAND	14
8786607310bSBenjamin Close static const struct wpi_chan_band {
8796607310bSBenjamin Close 	uint32_t	addr;	/* offset in EEPROM */
8806607310bSBenjamin Close 	uint8_t		nchan;
8816607310bSBenjamin Close 	uint8_t		chan[WPI_MAX_CHAN_PER_BAND];
882692ad7caSAdrian Chadd } wpi_bands[] = {
883692ad7caSAdrian Chadd 	/* 20MHz channels, 2GHz band. */
8846607310bSBenjamin Close 	{ WPI_EEPROM_BAND1, 14,
8856607310bSBenjamin Close 	    { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 } },
886692ad7caSAdrian Chadd 	/* 20MHz channels, 5GHz band. */
8876607310bSBenjamin Close 	{ WPI_EEPROM_BAND2, 13,
8886607310bSBenjamin Close 	    { 183, 184, 185, 187, 188, 189, 192, 196, 7, 8, 11, 12, 16 } },
8896607310bSBenjamin Close 	{ WPI_EEPROM_BAND3, 12,
8906607310bSBenjamin Close 	    { 34, 36, 38, 40, 42, 44, 46, 48, 52, 56, 60, 64 } },
8916607310bSBenjamin Close 	{ WPI_EEPROM_BAND4, 11,
8926607310bSBenjamin Close 	    { 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140 } },
8936607310bSBenjamin Close 	{ WPI_EEPROM_BAND5, 6,
8946607310bSBenjamin Close 	    { 145, 149, 153, 157, 161, 165 } }
8956607310bSBenjamin Close };
8966607310bSBenjamin Close 
897692ad7caSAdrian Chadd /* HW rate indices. */
898692ad7caSAdrian Chadd #define WPI_RIDX_OFDM6	 0
899692ad7caSAdrian Chadd #define WPI_RIDX_OFDM36	 5
900692ad7caSAdrian Chadd #define WPI_RIDX_OFDM48	 6
901692ad7caSAdrian Chadd #define WPI_RIDX_OFDM54	 7
902692ad7caSAdrian Chadd #define WPI_RIDX_CCK1	 8
903692ad7caSAdrian Chadd #define WPI_RIDX_CCK2	 9
904692ad7caSAdrian Chadd #define WPI_RIDX_CCK11	11
905692ad7caSAdrian Chadd 
906692ad7caSAdrian Chadd static const uint8_t wpi_ridx_to_plcp[] = {
907692ad7caSAdrian Chadd 	/* OFDM: IEEE Std 802.11a-1999, pp. 14 Table 80 */
908692ad7caSAdrian Chadd 	/* R1-R4 (ral/ural is R4-R1) */
909692ad7caSAdrian Chadd 	0xd, 0xf, 0x5, 0x7, 0x9, 0xb, 0x1, 0x3,
910692ad7caSAdrian Chadd 	/* CCK: device-dependent */
911692ad7caSAdrian Chadd 	10, 20, 55, 110
912692ad7caSAdrian Chadd };
913692ad7caSAdrian Chadd 
9146607310bSBenjamin Close #define WPI_MAX_PWR_INDEX	77
9156607310bSBenjamin Close 
9166607310bSBenjamin Close /*
9176607310bSBenjamin Close  * RF Tx gain values from highest to lowest power (values obtained from
9186607310bSBenjamin Close  * the reference driver.)
9196607310bSBenjamin Close  */
9206607310bSBenjamin Close static const uint8_t wpi_rf_gain_2ghz[WPI_MAX_PWR_INDEX + 1] = {
9216607310bSBenjamin Close 	0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xbb, 0xbb, 0xbb,
9226607310bSBenjamin Close 	0xbb, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xd3, 0xd3, 0xb3, 0xb3, 0xb3,
9236607310bSBenjamin Close 	0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x73, 0xeb, 0xeb, 0xeb,
9246607310bSBenjamin Close 	0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xab, 0xab, 0xab, 0x8b,
9256607310bSBenjamin Close 	0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xc3, 0xc3, 0xc3, 0xc3, 0xa3,
9266607310bSBenjamin Close 	0xa3, 0xa3, 0xa3, 0x83, 0x83, 0x83, 0x83, 0x63, 0x63, 0x63, 0x63,
9276607310bSBenjamin Close 	0x43, 0x43, 0x43, 0x43, 0x23, 0x23, 0x23, 0x23, 0x03, 0x03, 0x03,
9286607310bSBenjamin Close 	0x03
9296607310bSBenjamin Close };
9306607310bSBenjamin Close 
9316607310bSBenjamin Close static const uint8_t wpi_rf_gain_5ghz[WPI_MAX_PWR_INDEX + 1] = {
9326607310bSBenjamin Close 	0xfb, 0xfb, 0xfb, 0xdb, 0xdb, 0xbb, 0xbb, 0x9b, 0x9b, 0x7b, 0x7b,
9336607310bSBenjamin Close 	0x7b, 0x7b, 0x5b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x1b, 0x1b,
9346607310bSBenjamin Close 	0x1b, 0x73, 0x73, 0x73, 0x53, 0x53, 0x53, 0x53, 0x53, 0x33, 0x33,
9356607310bSBenjamin Close 	0x33, 0x33, 0x13, 0x13, 0x13, 0x13, 0x13, 0xab, 0xab, 0xab, 0x8b,
9366607310bSBenjamin Close 	0x8b, 0x8b, 0x8b, 0x6b, 0x6b, 0x6b, 0x6b, 0x4b, 0x4b, 0x4b, 0x4b,
9376607310bSBenjamin Close 	0x2b, 0x2b, 0x2b, 0x2b, 0x0b, 0x0b, 0x0b, 0x0b, 0x83, 0x83, 0x63,
9386607310bSBenjamin Close 	0x63, 0x63, 0x63, 0x43, 0x43, 0x43, 0x43, 0x23, 0x23, 0x23, 0x23,
9396607310bSBenjamin Close 	0x03
9406607310bSBenjamin Close };
9416607310bSBenjamin Close 
9426607310bSBenjamin Close /*
9436607310bSBenjamin Close  * DSP pre-DAC gain values from highest to lowest power (values obtained
9446607310bSBenjamin Close  * from the reference driver.)
9456607310bSBenjamin Close  */
9466607310bSBenjamin Close static const uint8_t wpi_dsp_gain_2ghz[WPI_MAX_PWR_INDEX + 1] = {
9476607310bSBenjamin Close 	0x7f, 0x7f, 0x7f, 0x7f, 0x7d, 0x6e, 0x69, 0x62, 0x7d, 0x73, 0x6c,
9486607310bSBenjamin Close 	0x63, 0x77, 0x6f, 0x69, 0x61, 0x5c, 0x6a, 0x64, 0x78, 0x71, 0x6b,
9496607310bSBenjamin Close 	0x7d, 0x77, 0x70, 0x6a, 0x65, 0x61, 0x5b, 0x6b, 0x79, 0x73, 0x6d,
9506607310bSBenjamin Close 	0x7f, 0x79, 0x73, 0x6c, 0x66, 0x60, 0x5c, 0x6e, 0x68, 0x62, 0x74,
9516607310bSBenjamin Close 	0x7d, 0x77, 0x71, 0x6b, 0x65, 0x60, 0x71, 0x6a, 0x66, 0x5f, 0x71,
9526607310bSBenjamin Close 	0x6a, 0x66, 0x5f, 0x71, 0x6a, 0x66, 0x5f, 0x71, 0x6a, 0x66, 0x5f,
9536607310bSBenjamin Close 	0x71, 0x6a, 0x66, 0x5f, 0x71, 0x6a, 0x66, 0x5f, 0x71, 0x6a, 0x66,
9546607310bSBenjamin Close 	0x5f
9556607310bSBenjamin Close };
9566607310bSBenjamin Close 
9576607310bSBenjamin Close static const uint8_t wpi_dsp_gain_5ghz[WPI_MAX_PWR_INDEX + 1] = {
9586607310bSBenjamin Close 	0x7f, 0x78, 0x72, 0x77, 0x65, 0x71, 0x66, 0x72, 0x67, 0x75, 0x6b,
9596607310bSBenjamin Close 	0x63, 0x5c, 0x6c, 0x7d, 0x76, 0x6d, 0x66, 0x60, 0x5a, 0x68, 0x62,
9606607310bSBenjamin Close 	0x5c, 0x76, 0x6f, 0x68, 0x7e, 0x79, 0x71, 0x69, 0x63, 0x76, 0x6f,
9616607310bSBenjamin Close 	0x68, 0x62, 0x74, 0x6d, 0x66, 0x62, 0x5d, 0x71, 0x6b, 0x63, 0x78,
9626607310bSBenjamin Close 	0x71, 0x6b, 0x63, 0x78, 0x71, 0x6b, 0x63, 0x78, 0x71, 0x6b, 0x63,
9636607310bSBenjamin Close 	0x78, 0x71, 0x6b, 0x63, 0x78, 0x71, 0x6b, 0x63, 0x6b, 0x63, 0x78,
9646607310bSBenjamin Close 	0x71, 0x6b, 0x63, 0x78, 0x71, 0x6b, 0x63, 0x78, 0x71, 0x6b, 0x63,
9656607310bSBenjamin Close 	0x78
9666607310bSBenjamin Close };
9676607310bSBenjamin Close 
968692ad7caSAdrian Chadd /*
969692ad7caSAdrian Chadd  * Power saving settings (values obtained from the reference driver.)
970692ad7caSAdrian Chadd  */
971692ad7caSAdrian Chadd #define WPI_NDTIMRANGES		2
972692ad7caSAdrian Chadd #define WPI_NPOWERLEVELS	6
973692ad7caSAdrian Chadd static const struct wpi_pmgt {
974692ad7caSAdrian Chadd 	uint32_t	rxtimeout;
975692ad7caSAdrian Chadd 	uint32_t	txtimeout;
976692ad7caSAdrian Chadd 	uint32_t	intval[5];
977525a3d47SAdrian Chadd 	uint8_t		skip_dtim;
978692ad7caSAdrian Chadd } wpi_pmgt[WPI_NDTIMRANGES][WPI_NPOWERLEVELS] = {
979692ad7caSAdrian Chadd 	/* DTIM <= 10 */
980692ad7caSAdrian Chadd 	{
981692ad7caSAdrian Chadd 	{   0,   0, {  0,  0,  0,  0,  0 }, 0 },	/* CAM */
982692ad7caSAdrian Chadd 	{ 200, 500, {  1,  2,  3,  4,  4 }, 0 },	/* PS level 1 */
983692ad7caSAdrian Chadd 	{ 200, 300, {  2,  4,  6,  7,  7 }, 0 },	/* PS level 2 */
984692ad7caSAdrian Chadd 	{  50, 100, {  2,  6,  9,  9, 10 }, 0 },	/* PS level 3 */
985692ad7caSAdrian Chadd 	{  50,  25, {  2,  7,  9,  9, 10 }, 1 },	/* PS level 4 */
986692ad7caSAdrian Chadd 	{  25,  25, {  4,  7, 10, 10, 10 }, 1 }		/* PS level 5 */
987692ad7caSAdrian Chadd 	},
988692ad7caSAdrian Chadd 	/* DTIM >= 11 */
989692ad7caSAdrian Chadd 	{
990692ad7caSAdrian Chadd 	{   0,   0, {  0,  0,  0,  0,  0 }, 0 },	/* CAM */
991692ad7caSAdrian Chadd 	{ 200, 500, {  1,  2,  3,  4, -1 }, 0 },	/* PS level 1 */
992692ad7caSAdrian Chadd 	{ 200, 300, {  2,  4,  6,  7, -1 }, 0 },	/* PS level 2 */
993692ad7caSAdrian Chadd 	{  50, 100, {  2,  6,  9,  9, -1 }, 0 },	/* PS level 3 */
994692ad7caSAdrian Chadd 	{  50,  25, {  2,  7,  9,  9, -1 }, 0 },	/* PS level 4 */
995692ad7caSAdrian Chadd 	{  25,  25, {  4,  7, 10, 10, -1 }, 0 }		/* PS level 5 */
996692ad7caSAdrian Chadd 	}
997692ad7caSAdrian Chadd };
998692ad7caSAdrian Chadd 
999692ad7caSAdrian Chadd /* Firmware errors. */
1000692ad7caSAdrian Chadd static const char * const wpi_fw_errmsg[] = {
1001692ad7caSAdrian Chadd 	"OK",
1002692ad7caSAdrian Chadd 	"FAIL",
1003692ad7caSAdrian Chadd 	"BAD_PARAM",
1004692ad7caSAdrian Chadd 	"BAD_CHECKSUM",
1005692ad7caSAdrian Chadd 	"NMI_INTERRUPT",
1006692ad7caSAdrian Chadd 	"SYSASSERT",
1007692ad7caSAdrian Chadd 	"FATAL_ERROR"
1008692ad7caSAdrian Chadd };
1009692ad7caSAdrian Chadd 
10106607310bSBenjamin Close #define WPI_READ(sc, reg)						\
10116607310bSBenjamin Close 	bus_space_read_4((sc)->sc_st, (sc)->sc_sh, (reg))
10126607310bSBenjamin Close 
10136607310bSBenjamin Close #define WPI_WRITE(sc, reg, val)						\
10146607310bSBenjamin Close 	bus_space_write_4((sc)->sc_st, (sc)->sc_sh, (reg), (val))
10156607310bSBenjamin Close 
10166607310bSBenjamin Close #define WPI_WRITE_REGION_4(sc, offset, datap, count)			\
10176607310bSBenjamin Close 	bus_space_write_region_4((sc)->sc_st, (sc)->sc_sh, (offset),	\
10186607310bSBenjamin Close 	    (datap), (count))
1019692ad7caSAdrian Chadd 
1020692ad7caSAdrian Chadd #define WPI_SETBITS(sc, reg, mask)					\
1021692ad7caSAdrian Chadd 	WPI_WRITE(sc, reg, WPI_READ(sc, reg) | (mask))
1022692ad7caSAdrian Chadd 
1023692ad7caSAdrian Chadd #define WPI_CLRBITS(sc, reg, mask)					\
1024692ad7caSAdrian Chadd 	WPI_WRITE(sc, reg, WPI_READ(sc, reg) & ~(mask))
1025692ad7caSAdrian Chadd 
1026692ad7caSAdrian Chadd #define WPI_BARRIER_WRITE(sc)						\
1027692ad7caSAdrian Chadd 	bus_space_barrier((sc)->sc_st, (sc)->sc_sh, 0, (sc)->sc_sz,	\
1028692ad7caSAdrian Chadd 	    BUS_SPACE_BARRIER_WRITE)
1029692ad7caSAdrian Chadd 
1030692ad7caSAdrian Chadd #define WPI_BARRIER_READ_WRITE(sc)					\
1031692ad7caSAdrian Chadd 	bus_space_barrier((sc)->sc_st, (sc)->sc_sh, 0, (sc)->sc_sz,	\
1032692ad7caSAdrian Chadd 	    BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE)
1033