xref: /freebsd/sys/dev/otus/if_otusreg.h (revision a9fcb51fbb8d2c5b47a35bcae5b4d5fb771c5985)
1*a9fcb51fSAdrian Chadd /*	$OpenBSD: if_otusreg.h,v 1.9 2013/11/26 20:33:18 deraadt Exp $	*/
2*a9fcb51fSAdrian Chadd 
3*a9fcb51fSAdrian Chadd /*-
4*a9fcb51fSAdrian Chadd  * Copyright (c) 2009 Damien Bergamini <damien.bergamini@free.fr>
5*a9fcb51fSAdrian Chadd  * Copyright (c) 2007-2008 Atheros Communications, Inc.
6*a9fcb51fSAdrian Chadd  * Copyright (c) 2015 Adrian Chadd <adrian@FreeBSD.org>
7*a9fcb51fSAdrian Chadd  *
8*a9fcb51fSAdrian Chadd  * Permission to use, copy, modify, and distribute this software for any
9*a9fcb51fSAdrian Chadd  * purpose with or without fee is hereby granted, provided that the above
10*a9fcb51fSAdrian Chadd  * copyright notice and this permission notice appear in all copies.
11*a9fcb51fSAdrian Chadd  *
12*a9fcb51fSAdrian Chadd  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13*a9fcb51fSAdrian Chadd  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14*a9fcb51fSAdrian Chadd  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15*a9fcb51fSAdrian Chadd  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16*a9fcb51fSAdrian Chadd  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17*a9fcb51fSAdrian Chadd  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18*a9fcb51fSAdrian Chadd  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19*a9fcb51fSAdrian Chadd  *
20*a9fcb51fSAdrian Chadd  * $FreeBSD$
21*a9fcb51fSAdrian Chadd  */
22*a9fcb51fSAdrian Chadd #ifndef	__IF_OTUSREG_H__
23*a9fcb51fSAdrian Chadd #define	__IF_OTUSREG_H__
24*a9fcb51fSAdrian Chadd 
25*a9fcb51fSAdrian Chadd /* USB Endpoints addresses. */
26*a9fcb51fSAdrian Chadd #define AR_EPT_BULK_TX_NO	(UE_DIR_OUT | 1)
27*a9fcb51fSAdrian Chadd #define AR_EPT_BULK_RX_NO	(UE_DIR_IN  | 2)
28*a9fcb51fSAdrian Chadd #define AR_EPT_INTR_RX_NO	(UE_DIR_IN  | 3)
29*a9fcb51fSAdrian Chadd #define AR_EPT_INTR_TX_NO	(UE_DIR_OUT | 4)
30*a9fcb51fSAdrian Chadd 
31*a9fcb51fSAdrian Chadd /* USB Requests. */
32*a9fcb51fSAdrian Chadd #define AR_FW_DOWNLOAD			0x30
33*a9fcb51fSAdrian Chadd #define AR_FW_DOWNLOAD_COMPLETE		0x31
34*a9fcb51fSAdrian Chadd 
35*a9fcb51fSAdrian Chadd /* Maximum number of writes that can fit in a single FW command is 7. */
36*a9fcb51fSAdrian Chadd #define AR_MAX_WRITE_IDX	6	/* 56 bytes */
37*a9fcb51fSAdrian Chadd 
38*a9fcb51fSAdrian Chadd #define AR_FW_INIT_ADDR			0x102800
39*a9fcb51fSAdrian Chadd #define AR_FW_MAIN_ADDR			0x200000
40*a9fcb51fSAdrian Chadd #define AR_USB_MODE_CTRL		0x1e1108
41*a9fcb51fSAdrian Chadd 
42*a9fcb51fSAdrian Chadd /*
43*a9fcb51fSAdrian Chadd  * AR9170 MAC registers.
44*a9fcb51fSAdrian Chadd  */
45*a9fcb51fSAdrian Chadd #define AR_MAC_REG_BASE			0x1c3000
46*a9fcb51fSAdrian Chadd #define AR_MAC_REG_MAC_ADDR_L		(AR_MAC_REG_BASE + 0x610)
47*a9fcb51fSAdrian Chadd #define AR_MAC_REG_MAC_ADDR_H		(AR_MAC_REG_BASE + 0x614)
48*a9fcb51fSAdrian Chadd #define AR_MAC_REG_BSSID_L		(AR_MAC_REG_BASE + 0x618)
49*a9fcb51fSAdrian Chadd #define AR_MAC_REG_BSSID_H		(AR_MAC_REG_BASE + 0x61c)
50*a9fcb51fSAdrian Chadd #define AR_MAC_REG_GROUP_HASH_TBL_L	(AR_MAC_REG_BASE + 0x624)
51*a9fcb51fSAdrian Chadd #define AR_MAC_REG_GROUP_HASH_TBL_H	(AR_MAC_REG_BASE + 0x628)
52*a9fcb51fSAdrian Chadd #define AR_MAC_REG_BASIC_RATE		(AR_MAC_REG_BASE + 0x630)
53*a9fcb51fSAdrian Chadd #define AR_MAC_REG_MANDATORY_RATE	(AR_MAC_REG_BASE + 0x634)
54*a9fcb51fSAdrian Chadd #define AR_MAC_REG_RTS_CTS_RATE		(AR_MAC_REG_BASE + 0x638)
55*a9fcb51fSAdrian Chadd #define AR_MAC_REG_BACKOFF_PROTECT	(AR_MAC_REG_BASE + 0x63c)
56*a9fcb51fSAdrian Chadd #define AR_MAC_REG_RX_THRESHOLD		(AR_MAC_REG_BASE + 0x640)
57*a9fcb51fSAdrian Chadd #define AR_MAC_REG_RX_PE_DELAY		(AR_MAC_REG_BASE + 0x64c)
58*a9fcb51fSAdrian Chadd #define AR_MAC_REG_DYNAMIC_SIFS_ACK	(AR_MAC_REG_BASE + 0x658)
59*a9fcb51fSAdrian Chadd #define AR_MAC_REG_SNIFFER		(AR_MAC_REG_BASE + 0x674)
60*a9fcb51fSAdrian Chadd #define AR_MAC_REG_ACK_EXTENSION	(AR_MAC_REG_BASE + 0x690)
61*a9fcb51fSAdrian Chadd #define AR_MAC_REG_EIFS_AND_SIFS	(AR_MAC_REG_BASE + 0x698)
62*a9fcb51fSAdrian Chadd #define AR_MAC_REG_BUSY			(AR_MAC_REG_BASE + 0x6e8)
63*a9fcb51fSAdrian Chadd #define AR_MAC_REG_BUSY_EXT		(AR_MAC_REG_BASE + 0x6ec)
64*a9fcb51fSAdrian Chadd #define AR_MAC_REG_SLOT_TIME		(AR_MAC_REG_BASE + 0x6f0)
65*a9fcb51fSAdrian Chadd #define AR_MAC_REG_AC0_CW		(AR_MAC_REG_BASE + 0xb00)
66*a9fcb51fSAdrian Chadd #define AR_MAC_REG_AC1_CW		(AR_MAC_REG_BASE + 0xb04)
67*a9fcb51fSAdrian Chadd #define AR_MAC_REG_AC2_CW		(AR_MAC_REG_BASE + 0xb08)
68*a9fcb51fSAdrian Chadd #define AR_MAC_REG_AC3_CW		(AR_MAC_REG_BASE + 0xb0c)
69*a9fcb51fSAdrian Chadd #define AR_MAC_REG_AC4_CW		(AR_MAC_REG_BASE + 0xb10)
70*a9fcb51fSAdrian Chadd #define AR_MAC_REG_AC1_AC0_AIFS		(AR_MAC_REG_BASE + 0xb14)
71*a9fcb51fSAdrian Chadd #define AR_MAC_REG_AC3_AC2_AIFS		(AR_MAC_REG_BASE + 0xb18)
72*a9fcb51fSAdrian Chadd #define AR_MAC_REG_RETRY_MAX		(AR_MAC_REG_BASE + 0xb28)
73*a9fcb51fSAdrian Chadd #define AR_MAC_REG_TXOP_NOT_ENOUGH_INDICATION	\
74*a9fcb51fSAdrian Chadd 					(AR_MAC_REG_BASE + 0xb30)
75*a9fcb51fSAdrian Chadd #define AR_MAC_REG_AC1_AC0_TXOP		(AR_MAC_REG_BASE + 0xb44)
76*a9fcb51fSAdrian Chadd #define AR_MAC_REG_AC3_AC2_TXOP		(AR_MAC_REG_BASE + 0xb48)
77*a9fcb51fSAdrian Chadd #define AR_MAC_REG_OFDM_PHY_ERRORS	(AR_MAC_REG_BASE + 0xcb4)
78*a9fcb51fSAdrian Chadd #define AR_MAC_REG_CCK_PHY_ERRORS	(AR_MAC_REG_BASE + 0xcb8)
79*a9fcb51fSAdrian Chadd #define AR_MAC_REG_BCN_HT1		(AR_MAC_REG_BASE + 0xda0)
80*a9fcb51fSAdrian Chadd 
81*a9fcb51fSAdrian Chadd /* Possible values for register AR_USB_MODE_CTRL. */
82*a9fcb51fSAdrian Chadd #define AR_USB_DS_ENA		(1 << 0)
83*a9fcb51fSAdrian Chadd #define AR_USB_US_ENA		(1 << 1)
84*a9fcb51fSAdrian Chadd #define AR_USB_US_PACKET_MODE	(1 << 3)
85*a9fcb51fSAdrian Chadd #define AR_USB_RX_STREAM_4K	(0 << 4)
86*a9fcb51fSAdrian Chadd #define AR_USB_RX_STREAM_8K	(1 << 4)
87*a9fcb51fSAdrian Chadd #define AR_USB_RX_STREAM_16K	(2 << 4)
88*a9fcb51fSAdrian Chadd #define AR_USB_RX_STREAM_32K	(3 << 4)
89*a9fcb51fSAdrian Chadd #define AR_USB_TX_STREAM_MODE	(1 << 6)
90*a9fcb51fSAdrian Chadd 
91*a9fcb51fSAdrian Chadd #define AR_LED0_ON	(1 << 0)
92*a9fcb51fSAdrian Chadd #define AR_LED1_ON	(1 << 1)
93*a9fcb51fSAdrian Chadd 
94*a9fcb51fSAdrian Chadd /*
95*a9fcb51fSAdrian Chadd  * PHY registers.
96*a9fcb51fSAdrian Chadd  */
97*a9fcb51fSAdrian Chadd #define AR_PHY_BASE			0x1c5800
98*a9fcb51fSAdrian Chadd #define AR_PHY(reg)			(AR_PHY_BASE + (reg) * 4)
99*a9fcb51fSAdrian Chadd #define AR_PHY_TURBO			(AR_PHY_BASE + 0x0004)
100*a9fcb51fSAdrian Chadd #define AR_PHY_RF_CTL3			(AR_PHY_BASE + 0x0028)
101*a9fcb51fSAdrian Chadd #define AR_PHY_RF_CTL4			(AR_PHY_BASE + 0x0034)
102*a9fcb51fSAdrian Chadd #define AR_PHY_SETTLING			(AR_PHY_BASE + 0x0044)
103*a9fcb51fSAdrian Chadd #define AR_PHY_RXGAIN			(AR_PHY_BASE + 0x0048)
104*a9fcb51fSAdrian Chadd #define AR_PHY_DESIRED_SZ		(AR_PHY_BASE + 0x0050)
105*a9fcb51fSAdrian Chadd #define AR_PHY_FIND_SIG			(AR_PHY_BASE + 0x0058)
106*a9fcb51fSAdrian Chadd #define AR_PHY_AGC_CTL1			(AR_PHY_BASE + 0x005c)
107*a9fcb51fSAdrian Chadd #define AR_PHY_SFCORR			(AR_PHY_BASE + 0x0068)
108*a9fcb51fSAdrian Chadd #define AR_PHY_SFCORR_LOW		(AR_PHY_BASE + 0x006c)
109*a9fcb51fSAdrian Chadd #define AR_PHY_TIMING_CTRL4		(AR_PHY_BASE + 0x0120)
110*a9fcb51fSAdrian Chadd #define AR_PHY_TIMING5			(AR_PHY_BASE + 0x0124)
111*a9fcb51fSAdrian Chadd #define AR_PHY_POWER_TX_RATE1		(AR_PHY_BASE + 0x0134)
112*a9fcb51fSAdrian Chadd #define AR_PHY_POWER_TX_RATE2		(AR_PHY_BASE + 0x0138)
113*a9fcb51fSAdrian Chadd #define AR_PHY_POWER_TX_RATE_MAX	(AR_PHY_BASE + 0x013c)
114*a9fcb51fSAdrian Chadd #define AR_PHY_SWITCH_CHAIN_0		(AR_PHY_BASE + 0x0160)
115*a9fcb51fSAdrian Chadd #define AR_PHY_SWITCH_COM		(AR_PHY_BASE + 0x0164)
116*a9fcb51fSAdrian Chadd #define AR_PHY_HEAVY_CLIP_ENABLE	(AR_PHY_BASE + 0x01e0)
117*a9fcb51fSAdrian Chadd #define AR_PHY_CCK_DETECT		(AR_PHY_BASE + 0x0a08)
118*a9fcb51fSAdrian Chadd #define AR_PHY_GAIN_2GHZ		(AR_PHY_BASE + 0x0a0c)
119*a9fcb51fSAdrian Chadd #define AR_PHY_POWER_TX_RATE3		(AR_PHY_BASE + 0x0a34)
120*a9fcb51fSAdrian Chadd #define AR_PHY_POWER_TX_RATE4		(AR_PHY_BASE + 0x0a38)
121*a9fcb51fSAdrian Chadd #define AR_PHY_TPCRG1			(AR_PHY_BASE + 0x0a58)
122*a9fcb51fSAdrian Chadd #define AR_PHY_POWER_TX_RATE5		(AR_PHY_BASE + 0x0b8c)
123*a9fcb51fSAdrian Chadd #define AR_PHY_POWER_TX_RATE6		(AR_PHY_BASE + 0x0b90)
124*a9fcb51fSAdrian Chadd #define AR_PHY_POWER_TX_RATE7		(AR_PHY_BASE + 0x0bcc)
125*a9fcb51fSAdrian Chadd #define AR_PHY_POWER_TX_RATE8		(AR_PHY_BASE + 0x0bd0)
126*a9fcb51fSAdrian Chadd #define AR_PHY_POWER_TX_RATE9		(AR_PHY_BASE + 0x0bd4)
127*a9fcb51fSAdrian Chadd #define AR_PHY_CCA			(AR_PHY_BASE + 0x3064)
128*a9fcb51fSAdrian Chadd 
129*a9fcb51fSAdrian Chadd #define AR_SEEPROM_HW_TYPE_OFFSET	0x1374
130*a9fcb51fSAdrian Chadd #define AR_EEPROM_OFFSET		0x1600
131*a9fcb51fSAdrian Chadd 
132*a9fcb51fSAdrian Chadd #define AR_BANK4_CHUP			(1 << 0)
133*a9fcb51fSAdrian Chadd #define AR_BANK4_BMODE_LF_SYNTH_FREQ	(1 << 1)
134*a9fcb51fSAdrian Chadd #define AR_BANK4_AMODE_REFSEL(x)	((x) << 2)
135*a9fcb51fSAdrian Chadd #define AR_BANK4_ADDR(x)		((x) << 5)
136*a9fcb51fSAdrian Chadd 
137*a9fcb51fSAdrian Chadd /* Tx descriptor. */
138*a9fcb51fSAdrian Chadd struct ar_tx_head {
139*a9fcb51fSAdrian Chadd 	uint16_t	len;
140*a9fcb51fSAdrian Chadd 	uint16_t	macctl;
141*a9fcb51fSAdrian Chadd #define AR_TX_MAC_RTS		(1 <<  0)
142*a9fcb51fSAdrian Chadd #define AR_TX_MAC_CTS		(1 <<  1)
143*a9fcb51fSAdrian Chadd #define AR_TX_MAC_BACKOFF	(1 <<  3)
144*a9fcb51fSAdrian Chadd #define AR_TX_MAC_NOACK		(1 <<  2)
145*a9fcb51fSAdrian Chadd #define AR_TX_MAC_HW_DUR	(1 <<  9)
146*a9fcb51fSAdrian Chadd #define AR_TX_MAC_QID(qid)	((qid) << 10)
147*a9fcb51fSAdrian Chadd #define AR_TX_MAC_RATE_PROBING	(1 << 15)
148*a9fcb51fSAdrian Chadd 
149*a9fcb51fSAdrian Chadd 	uint32_t	phyctl;
150*a9fcb51fSAdrian Chadd /* Modulation type. */
151*a9fcb51fSAdrian Chadd #define AR_TX_PHY_MT_CCK	0
152*a9fcb51fSAdrian Chadd #define AR_TX_PHY_MT_OFDM	1
153*a9fcb51fSAdrian Chadd #define AR_TX_PHY_MT_HT		2
154*a9fcb51fSAdrian Chadd #define AR_TX_PHY_GF		(1 << 2)
155*a9fcb51fSAdrian Chadd #define AR_TX_PHY_BW_SHIFT	3
156*a9fcb51fSAdrian Chadd #define AR_TX_PHY_TPC_SHIFT	9
157*a9fcb51fSAdrian Chadd #define AR_TX_PHY_ANTMSK(msk)	((msk) << 15)
158*a9fcb51fSAdrian Chadd #define AR_TX_PHY_MCS(mcs)	((mcs) << 18)
159*a9fcb51fSAdrian Chadd #define AR_TX_PHY_SHGI		(1U << 31)
160*a9fcb51fSAdrian Chadd } __packed;
161*a9fcb51fSAdrian Chadd 
162*a9fcb51fSAdrian Chadd /* USB Rx stream mode header. */
163*a9fcb51fSAdrian Chadd struct ar_rx_head {
164*a9fcb51fSAdrian Chadd 	uint16_t	len;
165*a9fcb51fSAdrian Chadd 	uint16_t	tag;
166*a9fcb51fSAdrian Chadd #define AR_RX_HEAD_TAG	0x4e00
167*a9fcb51fSAdrian Chadd } __packed;
168*a9fcb51fSAdrian Chadd 
169*a9fcb51fSAdrian Chadd /* Rx descriptor. */
170*a9fcb51fSAdrian Chadd struct ar_rx_tail {
171*a9fcb51fSAdrian Chadd 	uint8_t	rssi_ant[3];
172*a9fcb51fSAdrian Chadd 	uint8_t	rssi_ant_ext[3];
173*a9fcb51fSAdrian Chadd 	uint8_t	rssi;		/* Combined RSSI. */
174*a9fcb51fSAdrian Chadd 	uint8_t	evm[2][6];	/* Error Vector Magnitude. */
175*a9fcb51fSAdrian Chadd 	uint8_t	phy_err;
176*a9fcb51fSAdrian Chadd 	uint8_t	sa_idx;
177*a9fcb51fSAdrian Chadd 	uint8_t	da_idx;
178*a9fcb51fSAdrian Chadd 	uint8_t	error;
179*a9fcb51fSAdrian Chadd #define AR_RX_ERROR_TIMEOUT	(1 << 0)
180*a9fcb51fSAdrian Chadd #define AR_RX_ERROR_OVERRUN	(1 << 1)
181*a9fcb51fSAdrian Chadd #define AR_RX_ERROR_DECRYPT	(1 << 2)
182*a9fcb51fSAdrian Chadd #define AR_RX_ERROR_FCS		(1 << 3)
183*a9fcb51fSAdrian Chadd #define AR_RX_ERROR_BAD_RA	(1 << 4)
184*a9fcb51fSAdrian Chadd #define AR_RX_ERROR_PLCP	(1 << 5)
185*a9fcb51fSAdrian Chadd #define AR_RX_ERROR_MMIC	(1 << 6)
186*a9fcb51fSAdrian Chadd 
187*a9fcb51fSAdrian Chadd 	uint8_t	status;
188*a9fcb51fSAdrian Chadd /* Modulation type (same as AR_TX_PHY_MT). */
189*a9fcb51fSAdrian Chadd #define AR_RX_STATUS_MT_MASK	0x3
190*a9fcb51fSAdrian Chadd #define AR_RX_STATUS_MT_CCK	0
191*a9fcb51fSAdrian Chadd #define AR_RX_STATUS_MT_OFDM	1
192*a9fcb51fSAdrian Chadd #define AR_RX_STATUS_MT_HT	2
193*a9fcb51fSAdrian Chadd #define AR_RX_STATUS_SHPREAMBLE	(1 << 3)
194*a9fcb51fSAdrian Chadd } __packed;
195*a9fcb51fSAdrian Chadd 
196*a9fcb51fSAdrian Chadd #define AR_PLCP_HDR_LEN	12
197*a9fcb51fSAdrian Chadd /* Magic PLCP header for firmware notifications through Rx bulk pipe. */
198*a9fcb51fSAdrian Chadd static uint8_t AR_PLCP_HDR_INTR[] = {
199*a9fcb51fSAdrian Chadd 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
200*a9fcb51fSAdrian Chadd 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff
201*a9fcb51fSAdrian Chadd };
202*a9fcb51fSAdrian Chadd 
203*a9fcb51fSAdrian Chadd /* Firmware command/reply header. */
204*a9fcb51fSAdrian Chadd struct ar_cmd_hdr {
205*a9fcb51fSAdrian Chadd 	uint8_t		len;
206*a9fcb51fSAdrian Chadd 	uint8_t		code;
207*a9fcb51fSAdrian Chadd #define AR_CMD_RREG		0x00
208*a9fcb51fSAdrian Chadd #define AR_CMD_WREG		0x01
209*a9fcb51fSAdrian Chadd #define AR_CMD_RMEM		0x02
210*a9fcb51fSAdrian Chadd #define AR_CMD_WMEM		0x03
211*a9fcb51fSAdrian Chadd #define AR_CMD_BITAND		0x04
212*a9fcb51fSAdrian Chadd #define AR_CMD_BITOR		0x05
213*a9fcb51fSAdrian Chadd #define AR_CMD_EKEY		0x28
214*a9fcb51fSAdrian Chadd #define AR_CMD_DKEY		0x29
215*a9fcb51fSAdrian Chadd #define AR_CMD_FREQUENCY	0x30
216*a9fcb51fSAdrian Chadd #define AR_CMD_RF_INIT		0x31
217*a9fcb51fSAdrian Chadd #define AR_CMD_SYNTH		0x32
218*a9fcb51fSAdrian Chadd #define AR_CMD_FREQ_STRAT	0x33
219*a9fcb51fSAdrian Chadd #define AR_CMD_ECHO		0x80
220*a9fcb51fSAdrian Chadd #define AR_CMD_TALLY		0x81
221*a9fcb51fSAdrian Chadd #define AR_CMD_TALLY_APD	0x82
222*a9fcb51fSAdrian Chadd #define AR_CMD_CONFIG		0x83
223*a9fcb51fSAdrian Chadd #define AR_CMD_RESET		0x90
224*a9fcb51fSAdrian Chadd #define AR_CMD_DKRESET		0x91
225*a9fcb51fSAdrian Chadd #define AR_CMD_DKTX_STATUS	0x92
226*a9fcb51fSAdrian Chadd #define AR_CMD_FDC		0xa0
227*a9fcb51fSAdrian Chadd #define AR_CMD_WREEPROM		0xb0
228*a9fcb51fSAdrian Chadd #define AR_CMD_WFLASH		AR_CMD_WREEPROM
229*a9fcb51fSAdrian Chadd #define AR_CMD_FLASH_ERASE	0xb1
230*a9fcb51fSAdrian Chadd #define AR_CMD_FLASH_PROG	0xb2
231*a9fcb51fSAdrian Chadd #define AR_CMD_FLASH_CHKSUM	0xb3
232*a9fcb51fSAdrian Chadd #define AR_CMD_FLASH_READ	0xb4
233*a9fcb51fSAdrian Chadd #define AR_CMD_FW_DL_INIT	0xb5
234*a9fcb51fSAdrian Chadd #define AR_CMD_MEM_WREEPROM	0xbb
235*a9fcb51fSAdrian Chadd /* Those have the 2 MSB set to 1. */
236*a9fcb51fSAdrian Chadd #define AR_EVT_BEACON		0x00
237*a9fcb51fSAdrian Chadd #define AR_EVT_TX_COMP		0x01
238*a9fcb51fSAdrian Chadd #define AR_EVT_TBTT		0x02
239*a9fcb51fSAdrian Chadd #define AR_EVT_ATIM		0x03
240*a9fcb51fSAdrian Chadd #define AR_EVT_DO_BB_RESET	0x09
241*a9fcb51fSAdrian Chadd 
242*a9fcb51fSAdrian Chadd 	uint16_t	token;	/* Driver private data. */
243*a9fcb51fSAdrian Chadd } __packed;
244*a9fcb51fSAdrian Chadd 
245*a9fcb51fSAdrian Chadd /* Structure for command AR_CMD_RF_INIT/AR_CMD_FREQUENCY. */
246*a9fcb51fSAdrian Chadd struct ar_cmd_frequency {
247*a9fcb51fSAdrian Chadd 	uint32_t	freq;
248*a9fcb51fSAdrian Chadd 	uint32_t	dynht2040;
249*a9fcb51fSAdrian Chadd 	uint32_t	htena;
250*a9fcb51fSAdrian Chadd 	uint32_t	dsc_exp;
251*a9fcb51fSAdrian Chadd 	uint32_t	dsc_man;
252*a9fcb51fSAdrian Chadd 	uint32_t	dsc_shgi_exp;
253*a9fcb51fSAdrian Chadd 	uint32_t	dsc_shgi_man;
254*a9fcb51fSAdrian Chadd 	uint32_t	check_loop_count;
255*a9fcb51fSAdrian Chadd } __packed;
256*a9fcb51fSAdrian Chadd 
257*a9fcb51fSAdrian Chadd /* Firmware reply for command AR_CMD_FREQUENCY. */
258*a9fcb51fSAdrian Chadd struct ar_rsp_frequency {
259*a9fcb51fSAdrian Chadd 	uint32_t	status;
260*a9fcb51fSAdrian Chadd #define AR_CAL_ERR_AGC		(1 << 0)	/* AGC cal unfinished. */
261*a9fcb51fSAdrian Chadd #define AR_CAL_ERR_NF		(1 << 1)	/* Noise cal unfinished. */
262*a9fcb51fSAdrian Chadd #define AR_CAL_ERR_NF_VAL	(1 << 2)	/* NF value unexpected. */
263*a9fcb51fSAdrian Chadd 
264*a9fcb51fSAdrian Chadd 	uint32_t	nf[3];		/* Noisefloor. */
265*a9fcb51fSAdrian Chadd 	uint32_t	nf_ext[3];	/* Noisefloor ext. */
266*a9fcb51fSAdrian Chadd } __packed;
267*a9fcb51fSAdrian Chadd 
268*a9fcb51fSAdrian Chadd /* Structure for command AR_CMD_EKEY. */
269*a9fcb51fSAdrian Chadd struct ar_cmd_ekey {
270*a9fcb51fSAdrian Chadd 	uint16_t	uid;	/* user ID */
271*a9fcb51fSAdrian Chadd 	uint16_t	kix;
272*a9fcb51fSAdrian Chadd 	uint16_t	cipher;
273*a9fcb51fSAdrian Chadd #define AR_CIPHER_NONE		0
274*a9fcb51fSAdrian Chadd #define AR_CIPHER_WEP64		1
275*a9fcb51fSAdrian Chadd #define AR_CIPHER_TKIP		2
276*a9fcb51fSAdrian Chadd #define AR_CIPHER_AES		4
277*a9fcb51fSAdrian Chadd #define AR_CIPHER_WEP128	5
278*a9fcb51fSAdrian Chadd #define AR_CIPHER_WEP256	6
279*a9fcb51fSAdrian Chadd #define AR_CIPHER_CENC		7
280*a9fcb51fSAdrian Chadd 
281*a9fcb51fSAdrian Chadd 	uint8_t		macaddr[IEEE80211_ADDR_LEN];
282*a9fcb51fSAdrian Chadd 	uint8_t		key[16];
283*a9fcb51fSAdrian Chadd } __packed;
284*a9fcb51fSAdrian Chadd 
285*a9fcb51fSAdrian Chadd /* Structure for event AR_EVT_TX_COMP. */
286*a9fcb51fSAdrian Chadd struct ar_evt_tx_comp {
287*a9fcb51fSAdrian Chadd 	uint8_t		macaddr[IEEE80211_ADDR_LEN];
288*a9fcb51fSAdrian Chadd 	uint32_t	phy;
289*a9fcb51fSAdrian Chadd 	uint16_t	status;
290*a9fcb51fSAdrian Chadd #define AR_TX_STATUS_COMP	0
291*a9fcb51fSAdrian Chadd #define AR_TX_STATUS_RETRY_COMP	1
292*a9fcb51fSAdrian Chadd #define AR_TX_STATUS_FAILED	2
293*a9fcb51fSAdrian Chadd } __packed;
294*a9fcb51fSAdrian Chadd 
295*a9fcb51fSAdrian Chadd /* List of supported channels. */
296*a9fcb51fSAdrian Chadd static const uint8_t ar_chans[] = {
297*a9fcb51fSAdrian Chadd 	1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
298*a9fcb51fSAdrian Chadd 	36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124,
299*a9fcb51fSAdrian Chadd 	128, 132, 136, 140, 149, 153, 157, 161, 165, 34, 38, 42, 46
300*a9fcb51fSAdrian Chadd };
301*a9fcb51fSAdrian Chadd 
302*a9fcb51fSAdrian Chadd /*
303*a9fcb51fSAdrian Chadd  * This data is automatically generated from the "otus.ini" file.
304*a9fcb51fSAdrian Chadd  * It is stored in a different way though, to reduce kernel's .rodata
305*a9fcb51fSAdrian Chadd  * section overhead (5.1KB instead of 8.5KB).
306*a9fcb51fSAdrian Chadd  */
307*a9fcb51fSAdrian Chadd 
308*a9fcb51fSAdrian Chadd /* NB: apply AR_PHY(). */
309*a9fcb51fSAdrian Chadd static const uint16_t ar5416_phy_regs[] = {
310*a9fcb51fSAdrian Chadd 	0x000, 0x001, 0x002, 0x003, 0x004, 0x005, 0x006, 0x007, 0x008,
311*a9fcb51fSAdrian Chadd 	0x009, 0x00a, 0x00b, 0x00c, 0x00d, 0x00e, 0x00f, 0x010, 0x011,
312*a9fcb51fSAdrian Chadd 	0x012, 0x013, 0x014, 0x015, 0x016, 0x017, 0x018, 0x01a, 0x01b,
313*a9fcb51fSAdrian Chadd 	0x040, 0x041, 0x042, 0x043, 0x045, 0x046, 0x047, 0x048, 0x049,
314*a9fcb51fSAdrian Chadd 	0x04a, 0x04b, 0x04d, 0x04e, 0x04f, 0x051, 0x052, 0x053, 0x055,
315*a9fcb51fSAdrian Chadd 	0x056, 0x058, 0x059, 0x05c, 0x05d, 0x05e, 0x05f, 0x060, 0x061,
316*a9fcb51fSAdrian Chadd 	0x062, 0x063, 0x064, 0x065, 0x066, 0x067, 0x068, 0x069, 0x06a,
317*a9fcb51fSAdrian Chadd 	0x06b, 0x06c, 0x06d, 0x070, 0x071, 0x072, 0x073, 0x074, 0x075,
318*a9fcb51fSAdrian Chadd 	0x076, 0x077, 0x078, 0x079, 0x07a, 0x07b, 0x07c, 0x07f, 0x080,
319*a9fcb51fSAdrian Chadd 	0x081, 0x082, 0x083, 0x084, 0x085, 0x086, 0x087, 0x088, 0x089,
320*a9fcb51fSAdrian Chadd 	0x08a, 0x08b, 0x08c, 0x08d, 0x08e, 0x08f, 0x090, 0x091, 0x092,
321*a9fcb51fSAdrian Chadd 	0x093, 0x094, 0x095, 0x096, 0x097, 0x098, 0x099, 0x09a, 0x09b,
322*a9fcb51fSAdrian Chadd 	0x09c, 0x09d, 0x09e, 0x09f, 0x0a0, 0x0a1, 0x0a2, 0x0a3, 0x0a4,
323*a9fcb51fSAdrian Chadd 	0x0a5, 0x0a6, 0x0a7, 0x0a8, 0x0a9, 0x0aa, 0x0ab, 0x0ac, 0x0ad,
324*a9fcb51fSAdrian Chadd 	0x0ae, 0x0af, 0x0b0, 0x0b1, 0x0b2, 0x0b3, 0x0b4, 0x0b5, 0x0b6,
325*a9fcb51fSAdrian Chadd 	0x0b7, 0x0b8, 0x0b9, 0x0ba, 0x0bb, 0x0bc, 0x0bd, 0x0be, 0x0bf,
326*a9fcb51fSAdrian Chadd 	0x0c0, 0x0c1, 0x0c2, 0x0c3, 0x0c4, 0x0c5, 0x0c6, 0x0c7, 0x0c8,
327*a9fcb51fSAdrian Chadd 	0x0c9, 0x0ca, 0x0cb, 0x0cc, 0x0cd, 0x0ce, 0x0cf, 0x0d0, 0x0d1,
328*a9fcb51fSAdrian Chadd 	0x0d2, 0x0d3, 0x0d4, 0x0d5, 0x0d6, 0x0d7, 0x0d8, 0x0d9, 0x0da,
329*a9fcb51fSAdrian Chadd 	0x0db, 0x0dc, 0x0dd, 0x0de, 0x0df, 0x0e0, 0x0e1, 0x0e2, 0x0e3,
330*a9fcb51fSAdrian Chadd 	0x0e4, 0x0e5, 0x0e6, 0x0e7, 0x0e8, 0x0e9, 0x0ea, 0x0eb, 0x0ec,
331*a9fcb51fSAdrian Chadd 	0x0ed, 0x0ee, 0x0ef, 0x0f0, 0x0f1, 0x0f2, 0x0f3, 0x0f4, 0x0f5,
332*a9fcb51fSAdrian Chadd 	0x0f6, 0x0f7, 0x0f8, 0x0f9, 0x0fa, 0x0fb, 0x0fc, 0x0fd, 0x0fe,
333*a9fcb51fSAdrian Chadd 	0x0ff, 0x100, 0x103, 0x104, 0x105, 0x106, 0x107, 0x108, 0x109,
334*a9fcb51fSAdrian Chadd 	0x10a, 0x10b, 0x10c, 0x10d, 0x10e, 0x10f, 0x13c, 0x13d, 0x13e,
335*a9fcb51fSAdrian Chadd 	0x13f, 0x280, 0x281, 0x282, 0x283, 0x284, 0x285, 0x286, 0x287,
336*a9fcb51fSAdrian Chadd 	0x288, 0x289, 0x28a, 0x28b, 0x28c, 0x28d, 0x28e, 0x28f, 0x290,
337*a9fcb51fSAdrian Chadd 	0x291, 0x292, 0x293, 0x294, 0x295, 0x296, 0x297, 0x298, 0x299,
338*a9fcb51fSAdrian Chadd 	0x29a, 0x29b, 0x29d, 0x29e, 0x29f, 0x2c0, 0x2c1, 0x2c2, 0x2c3,
339*a9fcb51fSAdrian Chadd 	0x2c4, 0x2c5, 0x2c6, 0x2c7, 0x2c8, 0x2c9, 0x2ca, 0x2cb, 0x2cc,
340*a9fcb51fSAdrian Chadd 	0x2cd, 0x2ce, 0x2cf, 0x2d0, 0x2d1, 0x2d2, 0x2d3, 0x2d4, 0x2d5,
341*a9fcb51fSAdrian Chadd 	0x2d6, 0x2e2, 0x2e3, 0x2e4, 0x2e5, 0x2e6, 0x2e7, 0x2e8, 0x2e9,
342*a9fcb51fSAdrian Chadd 	0x2ea, 0x2eb, 0x2ec, 0x2ed, 0x2ee, 0x2ef, 0x2f0, 0x2f1, 0x2f2,
343*a9fcb51fSAdrian Chadd 	0x2f3, 0x2f4, 0x2f5, 0x2f6, 0x2f7, 0x2f8, 0x412, 0x448, 0x458,
344*a9fcb51fSAdrian Chadd 	0x683, 0x69b, 0x812, 0x848, 0x858, 0xa83, 0xa9b, 0xc19, 0xc57,
345*a9fcb51fSAdrian Chadd 	0xc5a, 0xc6f, 0xe9c, 0xed7, 0xed8, 0xed9, 0xeda, 0xedb, 0xedc,
346*a9fcb51fSAdrian Chadd 	0xedd, 0xede, 0xedf, 0xee0, 0xee1
347*a9fcb51fSAdrian Chadd };
348*a9fcb51fSAdrian Chadd 
349*a9fcb51fSAdrian Chadd static const uint32_t ar5416_phy_vals_5ghz_20mhz[] = {
350*a9fcb51fSAdrian Chadd 	0x00000007, 0x00000300, 0x00000000, 0xad848e19, 0x7d14e000,
351*a9fcb51fSAdrian Chadd 	0x9c0a9f6b, 0x00000090, 0x00000000, 0x02020200, 0x00000e0e,
352*a9fcb51fSAdrian Chadd 	0x0a020001, 0x0000a000, 0x00000000, 0x00000e0e, 0x00000007,
353*a9fcb51fSAdrian Chadd 	0x00200400, 0x206a002e, 0x1372161e, 0x001a6a65, 0x1284233c,
354*a9fcb51fSAdrian Chadd 	0x6c48b4e4, 0x00000859, 0x7ec80d2e, 0x31395c5e, 0x0004dd10,
355*a9fcb51fSAdrian Chadd 	0x409a4190, 0x050cb081, 0x00000000, 0x00000000, 0x00000000,
356*a9fcb51fSAdrian Chadd 	0x00000000, 0x000007d0, 0x00000118, 0x10000fff, 0x0510081c,
357*a9fcb51fSAdrian Chadd 	0xd0058a15, 0x00000001, 0x00000004, 0x3f3f3f3f, 0x3f3f3f3f,
358*a9fcb51fSAdrian Chadd 	0x0000007f, 0xdfb81020, 0x9280b212, 0x00020028, 0x5d50e188,
359*a9fcb51fSAdrian Chadd 	0x00081fff, 0x00009b40, 0x00001120, 0x190fb515, 0x00000000,
360*a9fcb51fSAdrian Chadd 	0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
361*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
362*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000007, 0x001fff00, 0x006f00c4, 0x03051000,
363*a9fcb51fSAdrian Chadd 	0x00000820, 0x038919be, 0x06336f77, 0x60f6532c, 0x08f186c8,
364*a9fcb51fSAdrian Chadd 	0x00046384, 0x00000000, 0x00000000, 0x00000000, 0x00000200,
365*a9fcb51fSAdrian Chadd 	0x64646464, 0x3c787878, 0x000000aa, 0x00000000, 0x00001042,
366*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000040, 0x00000080, 0x000001a1, 0x000001e1,
367*a9fcb51fSAdrian Chadd 	0x00000021, 0x00000061, 0x00000168, 0x000001a8, 0x000001e8,
368*a9fcb51fSAdrian Chadd 	0x00000028, 0x00000068, 0x00000189, 0x000001c9, 0x00000009,
369*a9fcb51fSAdrian Chadd 	0x00000049, 0x00000089, 0x00000170, 0x000001b0, 0x000001f0,
370*a9fcb51fSAdrian Chadd 	0x00000030, 0x00000070, 0x00000191, 0x000001d1, 0x00000011,
371*a9fcb51fSAdrian Chadd 	0x00000051, 0x00000091, 0x000001b8, 0x000001f8, 0x00000038,
372*a9fcb51fSAdrian Chadd 	0x00000078, 0x00000199, 0x000001d9, 0x00000019, 0x00000059,
373*a9fcb51fSAdrian Chadd 	0x00000099, 0x000000d9, 0x000000f9, 0x000000f9, 0x000000f9,
374*a9fcb51fSAdrian Chadd 	0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
375*a9fcb51fSAdrian Chadd 	0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
376*a9fcb51fSAdrian Chadd 	0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
377*a9fcb51fSAdrian Chadd 	0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
378*a9fcb51fSAdrian Chadd 	0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x00000000,
379*a9fcb51fSAdrian Chadd 	0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005,
380*a9fcb51fSAdrian Chadd 	0x00000008, 0x00000009, 0x0000000a, 0x0000000b, 0x0000000c,
381*a9fcb51fSAdrian Chadd 	0x0000000d, 0x00000010, 0x00000011, 0x00000012, 0x00000013,
382*a9fcb51fSAdrian Chadd 	0x00000014, 0x00000015, 0x00000018, 0x00000019, 0x0000001a,
383*a9fcb51fSAdrian Chadd 	0x0000001b, 0x0000001c, 0x0000001d, 0x00000020, 0x00000021,
384*a9fcb51fSAdrian Chadd 	0x00000022, 0x00000023, 0x00000024, 0x00000025, 0x00000028,
385*a9fcb51fSAdrian Chadd 	0x00000029, 0x0000002a, 0x0000002b, 0x0000002c, 0x0000002d,
386*a9fcb51fSAdrian Chadd 	0x00000030, 0x00000031, 0x00000032, 0x00000033, 0x00000034,
387*a9fcb51fSAdrian Chadd 	0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
388*a9fcb51fSAdrian Chadd 	0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
389*a9fcb51fSAdrian Chadd 	0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
390*a9fcb51fSAdrian Chadd 	0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
391*a9fcb51fSAdrian Chadd 	0x00000035, 0x00000010, 0x0000001a, 0x00000000, 0x00000000,
392*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
393*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
394*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
395*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000008, 0x00000440, 0xd6be4788, 0x012e8160,
396*a9fcb51fSAdrian Chadd 	0x40806333, 0x00106c10, 0x009c4060, 0x1883800a, 0x018830c6,
397*a9fcb51fSAdrian Chadd 	0x00000400, 0x000009b5, 0x00000000, 0x00000108, 0x3f3f3f3f,
398*a9fcb51fSAdrian Chadd 	0x3f3f3f3f, 0x13c889af, 0x38490a20, 0x00007bb6, 0x0fff3ffc,
399*a9fcb51fSAdrian Chadd 	0x00000001, 0x0000a000, 0x00000000, 0x0cc75380, 0x0f0f0f01,
400*a9fcb51fSAdrian Chadd 	0xdfa91f01, 0x00418a11, 0x00000000, 0x09249126, 0x0a1a9caa,
401*a9fcb51fSAdrian Chadd 	0x1ce739ce, 0x051701ce, 0x18010000, 0x30032602, 0x48073e06,
402*a9fcb51fSAdrian Chadd 	0x560b4c0a, 0x641a600f, 0x7a4f6e1b, 0x8c5b7e5a, 0x9d0f96cf,
403*a9fcb51fSAdrian Chadd 	0xb51fa69f, 0xcb3fbd07, 0x0000d7bf, 0x00000000, 0x00000000,
404*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
405*a9fcb51fSAdrian Chadd 	0x3fffffff, 0x3fffffff, 0x3fffffff, 0x0003ffff, 0x79a8aa1f,
406*a9fcb51fSAdrian Chadd 	0x08000000, 0x3f3f3f3f, 0x3f3f3f3f, 0x1ce739ce, 0x000001ce,
407*a9fcb51fSAdrian Chadd 	0x00000007, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
408*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
409*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000000, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f,
410*a9fcb51fSAdrian Chadd 	0x00000000, 0x1ce739ce, 0x000000c0, 0x00180a65, 0x0510001c,
411*a9fcb51fSAdrian Chadd 	0x00009b40, 0x012e8160, 0x09249126, 0x00180a65, 0x0510001c,
412*a9fcb51fSAdrian Chadd 	0x00009b40, 0x012e8160, 0x09249126, 0x0001c600, 0x004b6a8e,
413*a9fcb51fSAdrian Chadd 	0x000003ce, 0x00181400, 0x00820820, 0x066c420f, 0x0f282207,
414*a9fcb51fSAdrian Chadd 	0x17601685, 0x1f801104, 0x37a00c03, 0x3fc40883, 0x57c00803,
415*a9fcb51fSAdrian Chadd 	0x5fd80682, 0x7fe00482, 0x7f3c7bba, 0xf3307ff0
416*a9fcb51fSAdrian Chadd };
417*a9fcb51fSAdrian Chadd 
418*a9fcb51fSAdrian Chadd #ifdef notyet
419*a9fcb51fSAdrian Chadd static const uint32_t ar5416_phy_vals_5ghz_40mhz[] = {
420*a9fcb51fSAdrian Chadd 	0x00000007, 0x000003c4, 0x00000000, 0xad848e19, 0x7d14e000,
421*a9fcb51fSAdrian Chadd 	0x9c0a9f6b, 0x00000090, 0x00000000, 0x02020200, 0x00000e0e,
422*a9fcb51fSAdrian Chadd 	0x0a020001, 0x0000a000, 0x00000000, 0x00000e0e, 0x00000007,
423*a9fcb51fSAdrian Chadd 	0x00200400, 0x206a002e, 0x13721c1e, 0x001a6a65, 0x1284233c,
424*a9fcb51fSAdrian Chadd 	0x6c48b4e4, 0x00000859, 0x7ec80d2e, 0x31395c5e, 0x0004dd10,
425*a9fcb51fSAdrian Chadd 	0x409a4190, 0x050cb081, 0x00000000, 0x00000000, 0x00000000,
426*a9fcb51fSAdrian Chadd 	0x00000000, 0x000007d0, 0x00000230, 0x10000fff, 0x0510081c,
427*a9fcb51fSAdrian Chadd 	0xd0058a15, 0x00000001, 0x00000004, 0x3f3f3f3f, 0x3f3f3f3f,
428*a9fcb51fSAdrian Chadd 	0x0000007f, 0xdfb81020, 0x9280b212, 0x00020028, 0x5d50e188,
429*a9fcb51fSAdrian Chadd 	0x00081fff, 0x00009b40, 0x00001120, 0x190fb515, 0x00000000,
430*a9fcb51fSAdrian Chadd 	0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
431*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
432*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000007, 0x001fff00, 0x006f00c4, 0x03051000,
433*a9fcb51fSAdrian Chadd 	0x00000820, 0x038919be, 0x06336f77, 0x60f6532c, 0x08f186c8,
434*a9fcb51fSAdrian Chadd 	0x00046384, 0x00000000, 0x00000000, 0x00000000, 0x00000200,
435*a9fcb51fSAdrian Chadd 	0x64646464, 0x3c787878, 0x000000aa, 0x00000000, 0x00001042,
436*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000040, 0x00000080, 0x000001a1, 0x000001e1,
437*a9fcb51fSAdrian Chadd 	0x00000021, 0x00000061, 0x00000168, 0x000001a8, 0x000001e8,
438*a9fcb51fSAdrian Chadd 	0x00000028, 0x00000068, 0x00000189, 0x000001c9, 0x00000009,
439*a9fcb51fSAdrian Chadd 	0x00000049, 0x00000089, 0x00000170, 0x000001b0, 0x000001f0,
440*a9fcb51fSAdrian Chadd 	0x00000030, 0x00000070, 0x00000191, 0x000001d1, 0x00000011,
441*a9fcb51fSAdrian Chadd 	0x00000051, 0x00000091, 0x000001b8, 0x000001f8, 0x00000038,
442*a9fcb51fSAdrian Chadd 	0x00000078, 0x00000199, 0x000001d9, 0x00000019, 0x00000059,
443*a9fcb51fSAdrian Chadd 	0x00000099, 0x000000d9, 0x000000f9, 0x000000f9, 0x000000f9,
444*a9fcb51fSAdrian Chadd 	0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
445*a9fcb51fSAdrian Chadd 	0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
446*a9fcb51fSAdrian Chadd 	0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
447*a9fcb51fSAdrian Chadd 	0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
448*a9fcb51fSAdrian Chadd 	0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x00000000,
449*a9fcb51fSAdrian Chadd 	0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005,
450*a9fcb51fSAdrian Chadd 	0x00000008, 0x00000009, 0x0000000a, 0x0000000b, 0x0000000c,
451*a9fcb51fSAdrian Chadd 	0x0000000d, 0x00000010, 0x00000011, 0x00000012, 0x00000013,
452*a9fcb51fSAdrian Chadd 	0x00000014, 0x00000015, 0x00000018, 0x00000019, 0x0000001a,
453*a9fcb51fSAdrian Chadd 	0x0000001b, 0x0000001c, 0x0000001d, 0x00000020, 0x00000021,
454*a9fcb51fSAdrian Chadd 	0x00000022, 0x00000023, 0x00000024, 0x00000025, 0x00000028,
455*a9fcb51fSAdrian Chadd 	0x00000029, 0x0000002a, 0x0000002b, 0x0000002c, 0x0000002d,
456*a9fcb51fSAdrian Chadd 	0x00000030, 0x00000031, 0x00000032, 0x00000033, 0x00000034,
457*a9fcb51fSAdrian Chadd 	0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
458*a9fcb51fSAdrian Chadd 	0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
459*a9fcb51fSAdrian Chadd 	0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
460*a9fcb51fSAdrian Chadd 	0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
461*a9fcb51fSAdrian Chadd 	0x00000035, 0x00000010, 0x0000001a, 0x00000000, 0x00000000,
462*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
463*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
464*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
465*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000008, 0x00000440, 0xd6be4788, 0x012e8160,
466*a9fcb51fSAdrian Chadd 	0x40806333, 0x00106c10, 0x009c4060, 0x1883800a, 0x018830c6,
467*a9fcb51fSAdrian Chadd 	0x00000400, 0x000009b5, 0x00000000, 0x00000210, 0x3f3f3f3f,
468*a9fcb51fSAdrian Chadd 	0x3f3f3f3f, 0x13c889af, 0x38490a20, 0x00007bb6, 0x0fff3ffc,
469*a9fcb51fSAdrian Chadd 	0x00000001, 0x0000a000, 0x00000000, 0x0cc75380, 0x0f0f0f01,
470*a9fcb51fSAdrian Chadd 	0xdfa91f01, 0x00418a11, 0x00000000, 0x09249126, 0x0a1a9caa,
471*a9fcb51fSAdrian Chadd 	0x1ce739ce, 0x051701ce, 0x18010000, 0x30032602, 0x48073e06,
472*a9fcb51fSAdrian Chadd 	0x560b4c0a, 0x641a600f, 0x7a4f6e1b, 0x8c5b7e5a, 0x9d0f96cf,
473*a9fcb51fSAdrian Chadd 	0xb51fa69f, 0xcb3fbcbf, 0x0000d7bf, 0x00000000, 0x00000000,
474*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
475*a9fcb51fSAdrian Chadd 	0x3fffffff, 0x3fffffff, 0x3fffffff, 0x0003ffff, 0x79a8aa1f,
476*a9fcb51fSAdrian Chadd 	0x08000000, 0x3f3f3f3f, 0x3f3f3f3f, 0x1ce739ce, 0x000001ce,
477*a9fcb51fSAdrian Chadd 	0x00000007, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
478*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
479*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000000, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f,
480*a9fcb51fSAdrian Chadd 	0x00000000, 0x1ce739ce, 0x000000c0, 0x00180a65, 0x0510001c,
481*a9fcb51fSAdrian Chadd 	0x00009b40, 0x012e8160, 0x09249126, 0x00180a65, 0x0510001c,
482*a9fcb51fSAdrian Chadd 	0x00009b40, 0x012e8160, 0x09249126, 0x0001c600, 0x004b6a8e,
483*a9fcb51fSAdrian Chadd 	0x000003ce, 0x00181400, 0x00820820, 0x066c420f, 0x0f282207,
484*a9fcb51fSAdrian Chadd 	0x17601685, 0x1f801104, 0x37a00c03, 0x3fc40883, 0x57c00803,
485*a9fcb51fSAdrian Chadd 	0x5fd80682, 0x7fe00482, 0x7f3c7bba, 0xf3307ff0
486*a9fcb51fSAdrian Chadd };
487*a9fcb51fSAdrian Chadd #endif
488*a9fcb51fSAdrian Chadd 
489*a9fcb51fSAdrian Chadd #ifdef notyet
490*a9fcb51fSAdrian Chadd static const uint32_t ar5416_phy_vals_2ghz_40mhz[] = {
491*a9fcb51fSAdrian Chadd 	0x00000007, 0x000003c4, 0x00000000, 0xad848e19, 0x7d14e000,
492*a9fcb51fSAdrian Chadd 	0x9c0a9f6b, 0x00000090, 0x00000000, 0x02020200, 0x00000e0e,
493*a9fcb51fSAdrian Chadd 	0x0a020001, 0x0000a000, 0x00000000, 0x00000e0e, 0x00000007,
494*a9fcb51fSAdrian Chadd 	0x00200400, 0x206a002e, 0x13721c24, 0x00197a68, 0x1284233c,
495*a9fcb51fSAdrian Chadd 	0x6c48b0e4, 0x00000859, 0x7ec80d2e, 0x31395c5e, 0x0004dd20,
496*a9fcb51fSAdrian Chadd 	0x409a4190, 0x050cb081, 0x00000000, 0x00000000, 0x00000000,
497*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000898, 0x00000268, 0x10000fff, 0x0510001c,
498*a9fcb51fSAdrian Chadd 	0xd0058a15, 0x00000001, 0x00000004, 0x3f3f3f3f, 0x3f3f3f3f,
499*a9fcb51fSAdrian Chadd 	0x0000007f, 0xdfb81020, 0x9280b212, 0x00020028, 0x5d50e188,
500*a9fcb51fSAdrian Chadd 	0x00081fff, 0x00009b40, 0x00001120, 0x190fb515, 0x00000000,
501*a9fcb51fSAdrian Chadd 	0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
502*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
503*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000007, 0x001fff00, 0x006f00c4, 0x03051000,
504*a9fcb51fSAdrian Chadd 	0x00000820, 0x038919be, 0x06336f77, 0x60f6532c, 0x08f186c8,
505*a9fcb51fSAdrian Chadd 	0x00046384, 0x00000000, 0x00000000, 0x00000000, 0x00000200,
506*a9fcb51fSAdrian Chadd 	0x64646464, 0x3c787878, 0x000000aa, 0x00000000, 0x00001042,
507*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000040, 0x00000080, 0x00000141, 0x00000181,
508*a9fcb51fSAdrian Chadd 	0x000001c1, 0x00000001, 0x00000041, 0x000001a8, 0x000001e8,
509*a9fcb51fSAdrian Chadd 	0x00000028, 0x00000068, 0x000000a8, 0x00000169, 0x000001a9,
510*a9fcb51fSAdrian Chadd 	0x000001e9, 0x00000029, 0x00000069, 0x00000190, 0x000001d0,
511*a9fcb51fSAdrian Chadd 	0x00000010, 0x00000050, 0x00000090, 0x00000151, 0x00000191,
512*a9fcb51fSAdrian Chadd 	0x000001d1, 0x00000011, 0x00000051, 0x00000198, 0x000001d8,
513*a9fcb51fSAdrian Chadd 	0x00000018, 0x00000058, 0x00000098, 0x00000159, 0x00000199,
514*a9fcb51fSAdrian Chadd 	0x000001d9, 0x00000019, 0x00000059, 0x00000099, 0x000000d9,
515*a9fcb51fSAdrian Chadd 	0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
516*a9fcb51fSAdrian Chadd 	0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
517*a9fcb51fSAdrian Chadd 	0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
518*a9fcb51fSAdrian Chadd 	0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
519*a9fcb51fSAdrian Chadd 	0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x00000000,
520*a9fcb51fSAdrian Chadd 	0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005,
521*a9fcb51fSAdrian Chadd 	0x00000008, 0x00000009, 0x0000000a, 0x0000000b, 0x0000000c,
522*a9fcb51fSAdrian Chadd 	0x0000000d, 0x00000010, 0x00000011, 0x00000012, 0x00000013,
523*a9fcb51fSAdrian Chadd 	0x00000014, 0x00000015, 0x00000018, 0x00000019, 0x0000001a,
524*a9fcb51fSAdrian Chadd 	0x0000001b, 0x0000001c, 0x0000001d, 0x00000020, 0x00000021,
525*a9fcb51fSAdrian Chadd 	0x00000022, 0x00000023, 0x00000024, 0x00000025, 0x00000028,
526*a9fcb51fSAdrian Chadd 	0x00000029, 0x0000002a, 0x0000002b, 0x0000002c, 0x0000002d,
527*a9fcb51fSAdrian Chadd 	0x00000030, 0x00000031, 0x00000032, 0x00000033, 0x00000034,
528*a9fcb51fSAdrian Chadd 	0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
529*a9fcb51fSAdrian Chadd 	0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
530*a9fcb51fSAdrian Chadd 	0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
531*a9fcb51fSAdrian Chadd 	0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
532*a9fcb51fSAdrian Chadd 	0x00000035, 0x00000010, 0x0000001a, 0x00000000, 0x00000000,
533*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
534*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
535*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
536*a9fcb51fSAdrian Chadd 	0x00000000, 0x0000000e, 0x00000440, 0xd03e4788, 0x012a8160,
537*a9fcb51fSAdrian Chadd 	0x40806333, 0x00106c10, 0x009c4060, 0x1883800a, 0x018830c6,
538*a9fcb51fSAdrian Chadd 	0x00000400, 0x000009b5, 0x00000000, 0x00000210, 0x3f3f3f3f,
539*a9fcb51fSAdrian Chadd 	0x3f3f3f3f, 0x13c889af, 0x38490a20, 0x00007bb6, 0x0fff3ffc,
540*a9fcb51fSAdrian Chadd 	0x00000001, 0x0000a000, 0x00000000, 0x0cc75380, 0x0f0f0f01,
541*a9fcb51fSAdrian Chadd 	0xdfa91f01, 0x00418a11, 0x00000000, 0x09249126, 0x0a1a7caa,
542*a9fcb51fSAdrian Chadd 	0x1ce739ce, 0x051701ce, 0x18010000, 0x2e032402, 0x4a0a3c06,
543*a9fcb51fSAdrian Chadd 	0x621a540b, 0x764f6c1b, 0x845b7a5a, 0x950f8ccf, 0xa5cf9b4f,
544*a9fcb51fSAdrian Chadd 	0xbddfaf1f, 0xd1ffc93f, 0x00000000, 0x00000000, 0x00000000,
545*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
546*a9fcb51fSAdrian Chadd 	0x3fffffff, 0x3fffffff, 0x3fffffff, 0x0003ffff, 0x79a8aa1f,
547*a9fcb51fSAdrian Chadd 	0x08000000, 0x3f3f3f3f, 0x3f3f3f3f, 0x1ce739ce, 0x000001ce,
548*a9fcb51fSAdrian Chadd 	0x00000007, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
549*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
550*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000000, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f,
551*a9fcb51fSAdrian Chadd 	0x00000000, 0x1ce739ce, 0x000000c0, 0x00180a68, 0x0510001c,
552*a9fcb51fSAdrian Chadd 	0x00009b40, 0x012a8160, 0x09249126, 0x00180a68, 0x0510001c,
553*a9fcb51fSAdrian Chadd 	0x00009b40, 0x012a8160, 0x09249126, 0x0001c600, 0x004b6a8e,
554*a9fcb51fSAdrian Chadd 	0x000003ce, 0x00181400, 0x00820820, 0x066c420f, 0x0f282207,
555*a9fcb51fSAdrian Chadd 	0x17601685, 0x1f801104, 0x37a00c03, 0x3fc40883, 0x57c00803,
556*a9fcb51fSAdrian Chadd 	0x5fd80682, 0x7fe00482, 0x7f3c7bba, 0xf3307ff0
557*a9fcb51fSAdrian Chadd };
558*a9fcb51fSAdrian Chadd #endif
559*a9fcb51fSAdrian Chadd 
560*a9fcb51fSAdrian Chadd static const uint32_t ar5416_phy_vals_2ghz_20mhz[] = {
561*a9fcb51fSAdrian Chadd 	0x00000007, 0x00000300, 0x00000000, 0xad848e19, 0x7d14e000,
562*a9fcb51fSAdrian Chadd 	0x9c0a9f6b, 0x00000090, 0x00000000, 0x02020200, 0x00000e0e,
563*a9fcb51fSAdrian Chadd 	0x0a020001, 0x0000a000, 0x00000000, 0x00000e0e, 0x00000007,
564*a9fcb51fSAdrian Chadd 	0x00200400, 0x206a002e, 0x137216a4, 0x00197a68, 0x1284233c,
565*a9fcb51fSAdrian Chadd 	0x6c48b0e4, 0x00000859, 0x7ec80d2e, 0x31395c5e, 0x0004dd20,
566*a9fcb51fSAdrian Chadd 	0x409a4190, 0x050cb081, 0x00000000, 0x00000000, 0x00000000,
567*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000898, 0x00000134, 0x10000fff, 0x0510001c,
568*a9fcb51fSAdrian Chadd 	0xd0058a15, 0x00000001, 0x00000004, 0x3f3f3f3f, 0x3f3f3f3f,
569*a9fcb51fSAdrian Chadd 	0x0000007f, 0xdfb81020, 0x9280b212, 0x00020028, 0x5d50e188,
570*a9fcb51fSAdrian Chadd 	0x00081fff, 0x00009b40, 0x00001120, 0x190fb515, 0x00000000,
571*a9fcb51fSAdrian Chadd 	0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
572*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
573*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000007, 0x001fff00, 0x006f00c4, 0x03051000,
574*a9fcb51fSAdrian Chadd 	0x00000820, 0x038919be, 0x06336f77, 0x60f6532c, 0x08f186c8,
575*a9fcb51fSAdrian Chadd 	0x00046384, 0x00000000, 0x00000000, 0x00000000, 0x00000200,
576*a9fcb51fSAdrian Chadd 	0x64646464, 0x3c787878, 0x000000aa, 0x00000000, 0x00001042,
577*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000040, 0x00000080, 0x00000141, 0x00000181,
578*a9fcb51fSAdrian Chadd 	0x000001c1, 0x00000001, 0x00000041, 0x000001a8, 0x000001e8,
579*a9fcb51fSAdrian Chadd 	0x00000028, 0x00000068, 0x000000a8, 0x00000169, 0x000001a9,
580*a9fcb51fSAdrian Chadd 	0x000001e9, 0x00000029, 0x00000069, 0x00000190, 0x000001d0,
581*a9fcb51fSAdrian Chadd 	0x00000010, 0x00000050, 0x00000090, 0x00000151, 0x00000191,
582*a9fcb51fSAdrian Chadd 	0x000001d1, 0x00000011, 0x00000051, 0x00000198, 0x000001d8,
583*a9fcb51fSAdrian Chadd 	0x00000018, 0x00000058, 0x00000098, 0x00000159, 0x00000199,
584*a9fcb51fSAdrian Chadd 	0x000001d9, 0x00000019, 0x00000059, 0x00000099, 0x000000d9,
585*a9fcb51fSAdrian Chadd 	0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
586*a9fcb51fSAdrian Chadd 	0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
587*a9fcb51fSAdrian Chadd 	0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
588*a9fcb51fSAdrian Chadd 	0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
589*a9fcb51fSAdrian Chadd 	0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x00000000,
590*a9fcb51fSAdrian Chadd 	0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005,
591*a9fcb51fSAdrian Chadd 	0x00000008, 0x00000009, 0x0000000a, 0x0000000b, 0x0000000c,
592*a9fcb51fSAdrian Chadd 	0x0000000d, 0x00000010, 0x00000011, 0x00000012, 0x00000013,
593*a9fcb51fSAdrian Chadd 	0x00000014, 0x00000015, 0x00000018, 0x00000019, 0x0000001a,
594*a9fcb51fSAdrian Chadd 	0x0000001b, 0x0000001c, 0x0000001d, 0x00000020, 0x00000021,
595*a9fcb51fSAdrian Chadd 	0x00000022, 0x00000023, 0x00000024, 0x00000025, 0x00000028,
596*a9fcb51fSAdrian Chadd 	0x00000029, 0x0000002a, 0x0000002b, 0x0000002c, 0x0000002d,
597*a9fcb51fSAdrian Chadd 	0x00000030, 0x00000031, 0x00000032, 0x00000033, 0x00000034,
598*a9fcb51fSAdrian Chadd 	0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
599*a9fcb51fSAdrian Chadd 	0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
600*a9fcb51fSAdrian Chadd 	0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
601*a9fcb51fSAdrian Chadd 	0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
602*a9fcb51fSAdrian Chadd 	0x00000035, 0x00000010, 0x0000001a, 0x00000000, 0x00000000,
603*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
604*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
605*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
606*a9fcb51fSAdrian Chadd 	0x00000000, 0x0000000e, 0x00000440, 0xd03e4788, 0x012a8160,
607*a9fcb51fSAdrian Chadd 	0x40806333, 0x00106c10, 0x009c4060, 0x1883800a, 0x018830c6,
608*a9fcb51fSAdrian Chadd 	0x00000400, 0x000009b5, 0x00000000, 0x00000108, 0x3f3f3f3f,
609*a9fcb51fSAdrian Chadd 	0x3f3f3f3f, 0x13c889af, 0x38490a20, 0x00007bb6, 0x0fff3ffc,
610*a9fcb51fSAdrian Chadd 	0x00000001, 0x0000a000, 0x00000000, 0x0cc75380, 0x0f0f0f01,
611*a9fcb51fSAdrian Chadd 	0xdfa91f01, 0x00418a11, 0x00000000, 0x09249126, 0x0a1a7caa,
612*a9fcb51fSAdrian Chadd 	0x1ce739ce, 0x051701ce, 0x18010000, 0x2e032402, 0x4a0a3c06,
613*a9fcb51fSAdrian Chadd 	0x621a540b, 0x764f6c1b, 0x845b7a5a, 0x950f8ccf, 0xa5cf9b4f,
614*a9fcb51fSAdrian Chadd 	0xbddfaf1f, 0xd1ffc93f, 0x00000000, 0x00000000, 0x00000000,
615*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
616*a9fcb51fSAdrian Chadd 	0x3fffffff, 0x3fffffff, 0x3fffffff, 0x0003ffff, 0x79a8aa1f,
617*a9fcb51fSAdrian Chadd 	0x08000000, 0x3f3f3f3f, 0x3f3f3f3f, 0x1ce739ce, 0x000001ce,
618*a9fcb51fSAdrian Chadd 	0x00000007, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
619*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
620*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000000, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f,
621*a9fcb51fSAdrian Chadd 	0x00000000, 0x1ce739ce, 0x000000c0, 0x00180a68, 0x0510001c,
622*a9fcb51fSAdrian Chadd 	0x00009b40, 0x012a8160, 0x09249126, 0x00180a68, 0x0510001c,
623*a9fcb51fSAdrian Chadd 	0x00009b40, 0x012a8160, 0x09249126, 0x0001c600, 0x004b6a8e,
624*a9fcb51fSAdrian Chadd 	0x000003ce, 0x00181400, 0x00820820, 0x066c420f, 0x0f282207,
625*a9fcb51fSAdrian Chadd 	0x17601685, 0x1f801104, 0x37a00c03, 0x3fc40883, 0x57c00803,
626*a9fcb51fSAdrian Chadd 	0x5fd80682, 0x7fe00482, 0x7f3c7bba, 0xf3307ff0
627*a9fcb51fSAdrian Chadd };
628*a9fcb51fSAdrian Chadd 
629*a9fcb51fSAdrian Chadd /* NB: apply AR_PHY(). */
630*a9fcb51fSAdrian Chadd static const uint8_t ar5416_banks_regs[] = {
631*a9fcb51fSAdrian Chadd 	0x2c, 0x38, 0x2c, 0x3b, 0x2c, 0x38, 0x3c, 0x2c, 0x3a, 0x2c, 0x39,
632*a9fcb51fSAdrian Chadd 	0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c,
633*a9fcb51fSAdrian Chadd 	0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c,
634*a9fcb51fSAdrian Chadd 	0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c,
635*a9fcb51fSAdrian Chadd 	0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c,
636*a9fcb51fSAdrian Chadd 	0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x38, 0x2c, 0x2c,
637*a9fcb51fSAdrian Chadd 	0x2c, 0x3c
638*a9fcb51fSAdrian Chadd };
639*a9fcb51fSAdrian Chadd 
640*a9fcb51fSAdrian Chadd static const uint32_t ar5416_banks_vals_5ghz[] = {
641*a9fcb51fSAdrian Chadd 	0x1e5795e5, 0x02008020, 0x02108421, 0x00000008, 0x0e73ff17,
642*a9fcb51fSAdrian Chadd 	0x00000420, 0x01400018, 0x000001a1, 0x00000001, 0x00000013,
643*a9fcb51fSAdrian Chadd 	0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
644*a9fcb51fSAdrian Chadd 	0x00000000, 0x00004000, 0x00006c00, 0x00002c00, 0x00004800,
645*a9fcb51fSAdrian Chadd 	0x00004000, 0x00006000, 0x00001000, 0x00004000, 0x00007c00,
646*a9fcb51fSAdrian Chadd 	0x00007c00, 0x00007c00, 0x00007c00, 0x00007c00, 0x00087c00,
647*a9fcb51fSAdrian Chadd 	0x00007c00, 0x00005400, 0x00000c00, 0x00001800, 0x00007c00,
648*a9fcb51fSAdrian Chadd 	0x00006c00, 0x00006c00, 0x00007c00, 0x00002c00, 0x00003c00,
649*a9fcb51fSAdrian Chadd 	0x00003800, 0x00001c00, 0x00000800, 0x00000408, 0x00004c15,
650*a9fcb51fSAdrian Chadd 	0x00004188, 0x0000201e, 0x00010408, 0x00000801, 0x00000c08,
651*a9fcb51fSAdrian Chadd 	0x0000181e, 0x00001016, 0x00002800, 0x00004010, 0x0000081c,
652*a9fcb51fSAdrian Chadd 	0x00000115, 0x00000015, 0x00000066, 0x0000001c, 0x00000000,
653*a9fcb51fSAdrian Chadd 	0x00000004, 0x00000015, 0x0000001f, 0x00000000, 0x000000a0,
654*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000040, 0x0000001c
655*a9fcb51fSAdrian Chadd };
656*a9fcb51fSAdrian Chadd 
657*a9fcb51fSAdrian Chadd static const uint32_t ar5416_banks_vals_2ghz[] = {
658*a9fcb51fSAdrian Chadd 	0x1e5795e5, 0x02008020, 0x02108421, 0x00000008, 0x0e73ff17,
659*a9fcb51fSAdrian Chadd 	0x00000420, 0x01c00018, 0x000001a1, 0x00000001, 0x00000013,
660*a9fcb51fSAdrian Chadd 	0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
661*a9fcb51fSAdrian Chadd 	0x00000000, 0x00004000, 0x00006c00, 0x00002c00, 0x00004800,
662*a9fcb51fSAdrian Chadd 	0x00004000, 0x00006000, 0x00001000, 0x00004000, 0x00007c00,
663*a9fcb51fSAdrian Chadd 	0x00007c00, 0x00007c00, 0x00007c00, 0x00007c00, 0x00087c00,
664*a9fcb51fSAdrian Chadd 	0x00007c00, 0x00005400, 0x00000c00, 0x00001800, 0x00007c00,
665*a9fcb51fSAdrian Chadd 	0x00006c00, 0x00006c00, 0x00007c00, 0x00002c00, 0x00003c00,
666*a9fcb51fSAdrian Chadd 	0x00003800, 0x00001c00, 0x00000800, 0x00000408, 0x00004c15,
667*a9fcb51fSAdrian Chadd 	0x00004188, 0x0000201e, 0x00010408, 0x00000801, 0x00000c08,
668*a9fcb51fSAdrian Chadd 	0x0000181e, 0x00001016, 0x00002800, 0x00004010, 0x0000081c,
669*a9fcb51fSAdrian Chadd 	0x00000115, 0x00000015, 0x00000066, 0x0000001c, 0x00000000,
670*a9fcb51fSAdrian Chadd 	0x00000004, 0x00000015, 0x0000001f, 0x00000400, 0x000000a0,
671*a9fcb51fSAdrian Chadd 	0x00000000, 0x00000040, 0x0000001c
672*a9fcb51fSAdrian Chadd };
673*a9fcb51fSAdrian Chadd 
674*a9fcb51fSAdrian Chadd /*
675*a9fcb51fSAdrian Chadd  * EEPROM.
676*a9fcb51fSAdrian Chadd  */
677*a9fcb51fSAdrian Chadd /* Possible flags for opCapFlags. */
678*a9fcb51fSAdrian Chadd #define AR5416_OPFLAGS_11A	0x01
679*a9fcb51fSAdrian Chadd #define AR5416_OPFLAGS_11G	0x02
680*a9fcb51fSAdrian Chadd #define AR5416_OPFLAGS_5G_HT40	0x04
681*a9fcb51fSAdrian Chadd #define AR5416_OPFLAGS_2G_HT40	0x08
682*a9fcb51fSAdrian Chadd #define AR5416_OPFLAGS_5G_HT20	0x10
683*a9fcb51fSAdrian Chadd #define AR5416_OPFLAGS_2G_HT20	0x20
684*a9fcb51fSAdrian Chadd 
685*a9fcb51fSAdrian Chadd #define AR5416_NUM_5G_CAL_PIERS		8
686*a9fcb51fSAdrian Chadd #define AR5416_NUM_2G_CAL_PIERS		4
687*a9fcb51fSAdrian Chadd #define AR5416_NUM_5G_20_TARGET_POWERS	8
688*a9fcb51fSAdrian Chadd #define AR5416_NUM_5G_40_TARGET_POWERS	8
689*a9fcb51fSAdrian Chadd #define AR5416_NUM_2G_CCK_TARGET_POWERS	3
690*a9fcb51fSAdrian Chadd #define AR5416_NUM_2G_20_TARGET_POWERS	4
691*a9fcb51fSAdrian Chadd #define AR5416_NUM_2G_40_TARGET_POWERS	4
692*a9fcb51fSAdrian Chadd #define AR5416_NUM_CTLS			24
693*a9fcb51fSAdrian Chadd #define AR5416_NUM_BAND_EDGES		8
694*a9fcb51fSAdrian Chadd #define AR5416_NUM_PD_GAINS		4
695*a9fcb51fSAdrian Chadd #define AR5416_PD_GAIN_ICEPTS		5
696*a9fcb51fSAdrian Chadd #define AR5416_EEPROM_MODAL_SPURS	5
697*a9fcb51fSAdrian Chadd #define AR5416_MAX_CHAINS		2
698*a9fcb51fSAdrian Chadd 
699*a9fcb51fSAdrian Chadd struct BaseEepHeader {
700*a9fcb51fSAdrian Chadd 	uint16_t	length;
701*a9fcb51fSAdrian Chadd 	uint16_t	checksum;
702*a9fcb51fSAdrian Chadd 	uint16_t	version;
703*a9fcb51fSAdrian Chadd 	uint8_t		opCapFlags;
704*a9fcb51fSAdrian Chadd 	uint8_t		eepMisc;
705*a9fcb51fSAdrian Chadd 	uint16_t	regDmn[2];
706*a9fcb51fSAdrian Chadd 	uint8_t		macAddr[6];
707*a9fcb51fSAdrian Chadd 	uint8_t		rxMask;
708*a9fcb51fSAdrian Chadd 	uint8_t		txMask;
709*a9fcb51fSAdrian Chadd 	uint16_t	rfSilent;
710*a9fcb51fSAdrian Chadd 	uint16_t	blueToothOptions;
711*a9fcb51fSAdrian Chadd 	uint16_t	deviceCap;
712*a9fcb51fSAdrian Chadd 	uint32_t	binBuildNumber;
713*a9fcb51fSAdrian Chadd 	uint8_t		deviceType;
714*a9fcb51fSAdrian Chadd 	uint8_t		futureBase[33];
715*a9fcb51fSAdrian Chadd } __packed;
716*a9fcb51fSAdrian Chadd 
717*a9fcb51fSAdrian Chadd struct spurChanStruct {
718*a9fcb51fSAdrian Chadd 	uint16_t	spurChan;
719*a9fcb51fSAdrian Chadd 	uint8_t		spurRangeLow;
720*a9fcb51fSAdrian Chadd 	uint8_t		spurRangeHigh;
721*a9fcb51fSAdrian Chadd } __packed;
722*a9fcb51fSAdrian Chadd 
723*a9fcb51fSAdrian Chadd struct ModalEepHeader {
724*a9fcb51fSAdrian Chadd 	uint32_t	antCtrlChain[AR5416_MAX_CHAINS];
725*a9fcb51fSAdrian Chadd 	uint32_t	antCtrlCommon;
726*a9fcb51fSAdrian Chadd 	int8_t		antennaGainCh[AR5416_MAX_CHAINS];
727*a9fcb51fSAdrian Chadd 	uint8_t		switchSettling;
728*a9fcb51fSAdrian Chadd 	uint8_t		txRxAttenCh[AR5416_MAX_CHAINS];
729*a9fcb51fSAdrian Chadd 	uint8_t		rxTxMarginCh[AR5416_MAX_CHAINS];
730*a9fcb51fSAdrian Chadd 	uint8_t		adcDesiredSize;
731*a9fcb51fSAdrian Chadd 	int8_t		pgaDesiredSize;
732*a9fcb51fSAdrian Chadd 	uint8_t		xlnaGainCh[AR5416_MAX_CHAINS];
733*a9fcb51fSAdrian Chadd 	uint8_t		txEndToXpaOff;
734*a9fcb51fSAdrian Chadd 	uint8_t		txEndToRxOn;
735*a9fcb51fSAdrian Chadd 	uint8_t		txFrameToXpaOn;
736*a9fcb51fSAdrian Chadd 	uint8_t		thresh62;
737*a9fcb51fSAdrian Chadd 	uint8_t		noiseFloorThreshCh[AR5416_MAX_CHAINS];
738*a9fcb51fSAdrian Chadd 	uint8_t		xpdGain;
739*a9fcb51fSAdrian Chadd 	uint8_t		xpd;
740*a9fcb51fSAdrian Chadd 	int8_t		iqCalICh[AR5416_MAX_CHAINS];
741*a9fcb51fSAdrian Chadd 	int8_t		iqCalQCh[AR5416_MAX_CHAINS];
742*a9fcb51fSAdrian Chadd 	uint8_t		pdGainOverlap;
743*a9fcb51fSAdrian Chadd 	uint8_t		ob;
744*a9fcb51fSAdrian Chadd 	uint8_t		db;
745*a9fcb51fSAdrian Chadd 	uint8_t		xpaBiasLvl;
746*a9fcb51fSAdrian Chadd 	uint8_t		pwrDecreaseFor2Chain;
747*a9fcb51fSAdrian Chadd 	uint8_t		pwrDecreaseFor3Chain;
748*a9fcb51fSAdrian Chadd 	uint8_t		txFrameToDataStart;
749*a9fcb51fSAdrian Chadd 	uint8_t		txFrameToPaOn;
750*a9fcb51fSAdrian Chadd 	uint8_t		ht40PowerIncForPdadc;
751*a9fcb51fSAdrian Chadd 	uint8_t		bswAtten[AR5416_MAX_CHAINS];
752*a9fcb51fSAdrian Chadd 	uint8_t		bswMargin[AR5416_MAX_CHAINS];
753*a9fcb51fSAdrian Chadd 	uint8_t		swSettleHt40;
754*a9fcb51fSAdrian Chadd 	uint8_t		futureModal[22];
755*a9fcb51fSAdrian Chadd 	struct spurChanStruct spurChans[AR5416_EEPROM_MODAL_SPURS];
756*a9fcb51fSAdrian Chadd } __packed;
757*a9fcb51fSAdrian Chadd 
758*a9fcb51fSAdrian Chadd struct calDataPerFreq {
759*a9fcb51fSAdrian Chadd 	uint8_t		pwrPdg[AR5416_NUM_PD_GAINS][AR5416_PD_GAIN_ICEPTS];
760*a9fcb51fSAdrian Chadd 	uint8_t		vpdPdg[AR5416_NUM_PD_GAINS][AR5416_PD_GAIN_ICEPTS];
761*a9fcb51fSAdrian Chadd } __packed;
762*a9fcb51fSAdrian Chadd 
763*a9fcb51fSAdrian Chadd struct CalTargetPowerLegacy {
764*a9fcb51fSAdrian Chadd 	uint8_t		bChannel;
765*a9fcb51fSAdrian Chadd 	uint8_t		tPow2x[4];
766*a9fcb51fSAdrian Chadd } __packed;
767*a9fcb51fSAdrian Chadd 
768*a9fcb51fSAdrian Chadd struct CalTargetPowerHt {
769*a9fcb51fSAdrian Chadd 	uint8_t		bChannel;
770*a9fcb51fSAdrian Chadd 	uint8_t		tPow2x[8];
771*a9fcb51fSAdrian Chadd } __packed;
772*a9fcb51fSAdrian Chadd 
773*a9fcb51fSAdrian Chadd struct CalCtlEdges {
774*a9fcb51fSAdrian Chadd 	uint8_t		bChannel;
775*a9fcb51fSAdrian Chadd 	uint8_t		tPowerFlag;
776*a9fcb51fSAdrian Chadd } __packed;
777*a9fcb51fSAdrian Chadd 
778*a9fcb51fSAdrian Chadd struct CalCtlData {
779*a9fcb51fSAdrian Chadd 	struct CalCtlEdges ctlEdges[AR5416_MAX_CHAINS][AR5416_NUM_BAND_EDGES];
780*a9fcb51fSAdrian Chadd } __packed;
781*a9fcb51fSAdrian Chadd 
782*a9fcb51fSAdrian Chadd struct ar5416eeprom {
783*a9fcb51fSAdrian Chadd 	struct BaseEepHeader	baseEepHeader;
784*a9fcb51fSAdrian Chadd 	uint8_t			custData[64];
785*a9fcb51fSAdrian Chadd 	struct ModalEepHeader	modalHeader[2];
786*a9fcb51fSAdrian Chadd 	uint8_t			calFreqPier5G[AR5416_NUM_5G_CAL_PIERS];
787*a9fcb51fSAdrian Chadd 	uint8_t			calFreqPier2G[AR5416_NUM_2G_CAL_PIERS];
788*a9fcb51fSAdrian Chadd 	struct calDataPerFreq	calPierData5G[AR5416_MAX_CHAINS]
789*a9fcb51fSAdrian Chadd 					     [AR5416_NUM_5G_CAL_PIERS];
790*a9fcb51fSAdrian Chadd 	struct calDataPerFreq	calPierData2G[AR5416_MAX_CHAINS]
791*a9fcb51fSAdrian Chadd 					     [AR5416_NUM_2G_CAL_PIERS];
792*a9fcb51fSAdrian Chadd 	struct CalTargetPowerLegacy calTPow5G[AR5416_NUM_5G_20_TARGET_POWERS];
793*a9fcb51fSAdrian Chadd 	struct CalTargetPowerHt calTPow5GHT20[AR5416_NUM_5G_20_TARGET_POWERS];
794*a9fcb51fSAdrian Chadd 	struct CalTargetPowerHt calTPow5GHT40[AR5416_NUM_5G_40_TARGET_POWERS];
795*a9fcb51fSAdrian Chadd 	struct CalTargetPowerLegacy calTPowCck[AR5416_NUM_2G_CCK_TARGET_POWERS];
796*a9fcb51fSAdrian Chadd 	struct CalTargetPowerLegacy calTPow2G[AR5416_NUM_2G_20_TARGET_POWERS];
797*a9fcb51fSAdrian Chadd 	struct CalTargetPowerHt calTPow2GHT20[AR5416_NUM_2G_20_TARGET_POWERS];
798*a9fcb51fSAdrian Chadd 	struct CalTargetPowerHt calTPow2GHT40[AR5416_NUM_2G_40_TARGET_POWERS];
799*a9fcb51fSAdrian Chadd 	uint8_t			ctlIndex[AR5416_NUM_CTLS];
800*a9fcb51fSAdrian Chadd 	struct CalCtlData	ctlData[AR5416_NUM_CTLS];
801*a9fcb51fSAdrian Chadd 	uint8_t			padding;
802*a9fcb51fSAdrian Chadd } __packed;
803*a9fcb51fSAdrian Chadd 
804*a9fcb51fSAdrian Chadd #define	OTUS_NUM_CHAINS			2
805*a9fcb51fSAdrian Chadd 
806*a9fcb51fSAdrian Chadd #define OTUS_UID(aid)		(IEEE80211_AID(aid) + 4)
807*a9fcb51fSAdrian Chadd 
808*a9fcb51fSAdrian Chadd #define OTUS_MAX_TXCMDSZ	64
809*a9fcb51fSAdrian Chadd #define OTUS_RXBUFSZ		(8 * 1024)
810*a9fcb51fSAdrian Chadd /* Bumped for later A-MSDU and legacy fast-frames TX support */
811*a9fcb51fSAdrian Chadd #define OTUS_TXBUFSZ		(8 * 1024)
812*a9fcb51fSAdrian Chadd 
813*a9fcb51fSAdrian Chadd /* Default EDCA parameters for when QoS is disabled. */
814*a9fcb51fSAdrian Chadd static const struct wmeParams otus_edca_def[WME_NUM_AC] = {
815*a9fcb51fSAdrian Chadd 	{ 4, 10, 3,  0 },
816*a9fcb51fSAdrian Chadd 	{ 4, 10, 7,  0 },
817*a9fcb51fSAdrian Chadd 	{ 3,  4, 2, 94 },
818*a9fcb51fSAdrian Chadd 	{ 2,  3, 2, 47 }
819*a9fcb51fSAdrian Chadd };
820*a9fcb51fSAdrian Chadd 
821*a9fcb51fSAdrian Chadd #define OTUS_RIDX_CCK1		 0
822*a9fcb51fSAdrian Chadd #define OTUS_RIDX_OFDM6		 4
823*a9fcb51fSAdrian Chadd #define OTUS_RIDX_OFDM24	 8
824*a9fcb51fSAdrian Chadd #define OTUS_RIDX_MAX		11
825*a9fcb51fSAdrian Chadd static const struct otus_rate {
826*a9fcb51fSAdrian Chadd 	uint8_t	rate;
827*a9fcb51fSAdrian Chadd 	uint8_t	mcs;
828*a9fcb51fSAdrian Chadd } otus_rates[] = {
829*a9fcb51fSAdrian Chadd 	{   2, 0x0 },
830*a9fcb51fSAdrian Chadd 	{   4, 0x1 },
831*a9fcb51fSAdrian Chadd 	{  11, 0x2 },
832*a9fcb51fSAdrian Chadd 	{  22, 0x3 },
833*a9fcb51fSAdrian Chadd 	{  12, 0xb },
834*a9fcb51fSAdrian Chadd 	{  18, 0xf },
835*a9fcb51fSAdrian Chadd 	{  24, 0xa },
836*a9fcb51fSAdrian Chadd 	{  36, 0xe },
837*a9fcb51fSAdrian Chadd 	{  48, 0x9 },
838*a9fcb51fSAdrian Chadd 	{  72, 0xd },
839*a9fcb51fSAdrian Chadd 	{  96, 0x8 },
840*a9fcb51fSAdrian Chadd 	{ 108, 0xc }
841*a9fcb51fSAdrian Chadd };
842*a9fcb51fSAdrian Chadd 
843*a9fcb51fSAdrian Chadd struct otus_rx_radiotap_header {
844*a9fcb51fSAdrian Chadd 	struct ieee80211_radiotap_header wr_ihdr;
845*a9fcb51fSAdrian Chadd 	uint8_t		wr_flags;
846*a9fcb51fSAdrian Chadd 	uint8_t		wr_rate;
847*a9fcb51fSAdrian Chadd 	uint16_t	wr_chan_freq;
848*a9fcb51fSAdrian Chadd 	uint16_t	wr_chan_flags;
849*a9fcb51fSAdrian Chadd 	uint8_t		wr_antsignal;
850*a9fcb51fSAdrian Chadd } __packed;
851*a9fcb51fSAdrian Chadd 
852*a9fcb51fSAdrian Chadd #define OTUS_RX_RADIOTAP_PRESENT			\
853*a9fcb51fSAdrian Chadd 	(1 << IEEE80211_RADIOTAP_FLAGS |		\
854*a9fcb51fSAdrian Chadd 	 1 << IEEE80211_RADIOTAP_RATE |			\
855*a9fcb51fSAdrian Chadd 	 1 << IEEE80211_RADIOTAP_CHANNEL |		\
856*a9fcb51fSAdrian Chadd 	 1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL)
857*a9fcb51fSAdrian Chadd 
858*a9fcb51fSAdrian Chadd struct otus_tx_radiotap_header {
859*a9fcb51fSAdrian Chadd 	struct ieee80211_radiotap_header wt_ihdr;
860*a9fcb51fSAdrian Chadd 	uint8_t		wt_flags;
861*a9fcb51fSAdrian Chadd 	uint8_t		wt_rate;
862*a9fcb51fSAdrian Chadd 	uint16_t	wt_chan_freq;
863*a9fcb51fSAdrian Chadd 	uint16_t	wt_chan_flags;
864*a9fcb51fSAdrian Chadd } __packed;
865*a9fcb51fSAdrian Chadd 
866*a9fcb51fSAdrian Chadd #define OTUS_TX_RADIOTAP_PRESENT			\
867*a9fcb51fSAdrian Chadd 	(1 << IEEE80211_RADIOTAP_FLAGS |		\
868*a9fcb51fSAdrian Chadd 	 1 << IEEE80211_RADIOTAP_RATE |			\
869*a9fcb51fSAdrian Chadd 	 1 << IEEE80211_RADIOTAP_CHANNEL)
870*a9fcb51fSAdrian Chadd 
871*a9fcb51fSAdrian Chadd struct otus_softc;
872*a9fcb51fSAdrian Chadd 
873*a9fcb51fSAdrian Chadd /* Firmware commands */
874*a9fcb51fSAdrian Chadd struct otus_tx_cmd {
875*a9fcb51fSAdrian Chadd 	uint8_t			*buf;
876*a9fcb51fSAdrian Chadd 	uint16_t		buflen;
877*a9fcb51fSAdrian Chadd 	void *			*odata;
878*a9fcb51fSAdrian Chadd 	uint16_t		token;
879*a9fcb51fSAdrian Chadd 	STAILQ_ENTRY(otus_tx_cmd)	next_cmd;
880*a9fcb51fSAdrian Chadd };
881*a9fcb51fSAdrian Chadd 
882*a9fcb51fSAdrian Chadd /* TX, RX buffers */
883*a9fcb51fSAdrian Chadd struct otus_data {
884*a9fcb51fSAdrian Chadd 	struct otus_softc	*sc;
885*a9fcb51fSAdrian Chadd 	uint8_t			*buf;
886*a9fcb51fSAdrian Chadd 	uint16_t		buflen;
887*a9fcb51fSAdrian Chadd 	struct mbuf		*m;
888*a9fcb51fSAdrian Chadd 	struct ieee80211_node	*ni;
889*a9fcb51fSAdrian Chadd 	STAILQ_ENTRY(otus_data)	next;
890*a9fcb51fSAdrian Chadd };
891*a9fcb51fSAdrian Chadd 
892*a9fcb51fSAdrian Chadd struct otus_node {
893*a9fcb51fSAdrian Chadd 	struct ieee80211_node		ni;
894*a9fcb51fSAdrian Chadd 	uint64_t			tx_done;
895*a9fcb51fSAdrian Chadd 	uint64_t			tx_err;
896*a9fcb51fSAdrian Chadd 	uint64_t			tx_retries;
897*a9fcb51fSAdrian Chadd };
898*a9fcb51fSAdrian Chadd 
899*a9fcb51fSAdrian Chadd #define OTUS_CONFIG_INDEX               0
900*a9fcb51fSAdrian Chadd #define OTUS_IFACE_INDEX                0
901*a9fcb51fSAdrian Chadd 
902*a9fcb51fSAdrian Chadd /*
903*a9fcb51fSAdrian Chadd  * The carl9170 firmware has the following specification:
904*a9fcb51fSAdrian Chadd  *
905*a9fcb51fSAdrian Chadd  * 0 - USB control
906*a9fcb51fSAdrian Chadd  * 1 - TX
907*a9fcb51fSAdrian Chadd  * 2 - RX
908*a9fcb51fSAdrian Chadd  * 3 - IRQ
909*a9fcb51fSAdrian Chadd  * 4 - CMD
910*a9fcb51fSAdrian Chadd  * ..
911*a9fcb51fSAdrian Chadd  * 10 - end
912*a9fcb51fSAdrian Chadd  */
913*a9fcb51fSAdrian Chadd enum {
914*a9fcb51fSAdrian Chadd 	OTUS_BULK_TX,
915*a9fcb51fSAdrian Chadd 	OTUS_BULK_RX,
916*a9fcb51fSAdrian Chadd 	OTUS_BULK_IRQ,
917*a9fcb51fSAdrian Chadd 	OTUS_BULK_CMD,
918*a9fcb51fSAdrian Chadd 	OTUS_N_XFER
919*a9fcb51fSAdrian Chadd };
920*a9fcb51fSAdrian Chadd 
921*a9fcb51fSAdrian Chadd struct otus_vap {
922*a9fcb51fSAdrian Chadd 	struct ieee80211vap	vap;
923*a9fcb51fSAdrian Chadd 	int			(*newstate)(struct ieee80211vap *,
924*a9fcb51fSAdrian Chadd 				    enum ieee80211_state, int);
925*a9fcb51fSAdrian Chadd };
926*a9fcb51fSAdrian Chadd #define	OTUS_VAP(vap)		((struct otus_vap *)(vap))
927*a9fcb51fSAdrian Chadd #define	OTUS_NODE(ni)		((struct otus_node *)(ni))
928*a9fcb51fSAdrian Chadd 
929*a9fcb51fSAdrian Chadd #define	OTUS_LOCK(sc)		mtx_lock(&(sc)->sc_mtx)
930*a9fcb51fSAdrian Chadd #define	OTUS_UNLOCK(sc)		mtx_unlock(&(sc)->sc_mtx)
931*a9fcb51fSAdrian Chadd #define	OTUS_LOCK_ASSERT(sc)	mtx_assert(&(sc)->sc_mtx, MA_OWNED)
932*a9fcb51fSAdrian Chadd #define	OTUS_UNLOCK_ASSERT(sc)	mtx_assert(&(sc)->sc_mtx, MA_NOTOWNED)
933*a9fcb51fSAdrian Chadd 
934*a9fcb51fSAdrian Chadd /* XXX the TX/RX endpoint dump says it's 0x200, (512)? */
935*a9fcb51fSAdrian Chadd #define	OTUS_MAX_TXSZ		512
936*a9fcb51fSAdrian Chadd #define	OTUS_MAX_RXSZ		512
937*a9fcb51fSAdrian Chadd /* intr/cmd endpoint dump says 0x40 */
938*a9fcb51fSAdrian Chadd #define	OTUS_MAX_CTRLSZ		64
939*a9fcb51fSAdrian Chadd 
940*a9fcb51fSAdrian Chadd #define	OTUS_CMD_LIST_COUNT	32
941*a9fcb51fSAdrian Chadd #define	OTUS_RX_LIST_COUNT	128
942*a9fcb51fSAdrian Chadd #define	OTUS_TX_LIST_COUNT	32
943*a9fcb51fSAdrian Chadd 
944*a9fcb51fSAdrian Chadd struct otus_softc {
945*a9fcb51fSAdrian Chadd 	struct ieee80211com		sc_ic;
946*a9fcb51fSAdrian Chadd 	struct mbufq			sc_snd;
947*a9fcb51fSAdrian Chadd 	device_t			sc_dev;
948*a9fcb51fSAdrian Chadd 	struct usb_device		*sc_udev;
949*a9fcb51fSAdrian Chadd 	int				(*sc_newstate)(struct ieee80211com *,
950*a9fcb51fSAdrian Chadd 					    enum ieee80211_state, int);
951*a9fcb51fSAdrian Chadd 	void				(*sc_led_newstate)(struct otus_softc *);
952*a9fcb51fSAdrian Chadd 	struct usbd_interface		*sc_iface;
953*a9fcb51fSAdrian Chadd 	struct mtx			sc_mtx;
954*a9fcb51fSAdrian Chadd 
955*a9fcb51fSAdrian Chadd 	struct ar5416eeprom		eeprom;
956*a9fcb51fSAdrian Chadd 	uint8_t				capflags;
957*a9fcb51fSAdrian Chadd 	uint8_t				rxmask;
958*a9fcb51fSAdrian Chadd 	uint8_t				txmask;
959*a9fcb51fSAdrian Chadd 	int				sc_running:1,
960*a9fcb51fSAdrian Chadd 					sc_calibrating:1,
961*a9fcb51fSAdrian Chadd 					sc_scanning:1;
962*a9fcb51fSAdrian Chadd 
963*a9fcb51fSAdrian Chadd 	int				sc_if_flags;
964*a9fcb51fSAdrian Chadd 	int				sc_tx_timer;
965*a9fcb51fSAdrian Chadd 	int				fixed_ridx;
966*a9fcb51fSAdrian Chadd 	int				bb_reset;
967*a9fcb51fSAdrian Chadd 
968*a9fcb51fSAdrian Chadd 	struct ieee80211_channel	*sc_curchan;
969*a9fcb51fSAdrian Chadd 
970*a9fcb51fSAdrian Chadd 	struct task			tx_task;
971*a9fcb51fSAdrian Chadd 	struct task			wme_update_task;
972*a9fcb51fSAdrian Chadd 	struct timeout_task		scan_to;
973*a9fcb51fSAdrian Chadd 	struct timeout_task		calib_to;
974*a9fcb51fSAdrian Chadd 
975*a9fcb51fSAdrian Chadd 	/* register batch writes */
976*a9fcb51fSAdrian Chadd 	int				write_idx;
977*a9fcb51fSAdrian Chadd 
978*a9fcb51fSAdrian Chadd 	uint32_t			led_state;
979*a9fcb51fSAdrian Chadd 
980*a9fcb51fSAdrian Chadd 	/* current firmware message serial / token number */
981*a9fcb51fSAdrian Chadd 	int				token;
982*a9fcb51fSAdrian Chadd 
983*a9fcb51fSAdrian Chadd 	/* current noisefloor, from SET_FREQUENCY */
984*a9fcb51fSAdrian Chadd 	int				sc_nf[OTUS_NUM_CHAINS];
985*a9fcb51fSAdrian Chadd 
986*a9fcb51fSAdrian Chadd 	const uint32_t			*phy_vals;
987*a9fcb51fSAdrian Chadd 
988*a9fcb51fSAdrian Chadd 	struct {
989*a9fcb51fSAdrian Chadd 		uint32_t	reg;
990*a9fcb51fSAdrian Chadd 		uint32_t	val;
991*a9fcb51fSAdrian Chadd 	} __packed			write_buf[AR_MAX_WRITE_IDX + 1];
992*a9fcb51fSAdrian Chadd 
993*a9fcb51fSAdrian Chadd 	struct otus_data		sc_rx[OTUS_RX_LIST_COUNT];
994*a9fcb51fSAdrian Chadd 	struct otus_data		sc_tx[OTUS_TX_LIST_COUNT];
995*a9fcb51fSAdrian Chadd 	struct otus_tx_cmd		sc_cmd[OTUS_CMD_LIST_COUNT];
996*a9fcb51fSAdrian Chadd 
997*a9fcb51fSAdrian Chadd 	struct usb_xfer			*sc_xfer[OTUS_N_XFER];
998*a9fcb51fSAdrian Chadd 
999*a9fcb51fSAdrian Chadd 	STAILQ_HEAD(, otus_data)	sc_rx_active;
1000*a9fcb51fSAdrian Chadd 	STAILQ_HEAD(, otus_data)	sc_rx_inactive;
1001*a9fcb51fSAdrian Chadd 	STAILQ_HEAD(, otus_data)	sc_tx_active[OTUS_N_XFER];
1002*a9fcb51fSAdrian Chadd 	STAILQ_HEAD(, otus_data)	sc_tx_inactive;
1003*a9fcb51fSAdrian Chadd 	STAILQ_HEAD(, otus_data)	sc_tx_pending[OTUS_N_XFER];
1004*a9fcb51fSAdrian Chadd 
1005*a9fcb51fSAdrian Chadd 	STAILQ_HEAD(, otus_tx_cmd)	sc_cmd_active;
1006*a9fcb51fSAdrian Chadd 	STAILQ_HEAD(, otus_tx_cmd)	sc_cmd_inactive;
1007*a9fcb51fSAdrian Chadd 	STAILQ_HEAD(, otus_tx_cmd)	sc_cmd_pending;
1008*a9fcb51fSAdrian Chadd 	STAILQ_HEAD(, otus_tx_cmd)	sc_cmd_waiting;
1009*a9fcb51fSAdrian Chadd 
1010*a9fcb51fSAdrian Chadd 	union {
1011*a9fcb51fSAdrian Chadd 		struct otus_rx_radiotap_header th;
1012*a9fcb51fSAdrian Chadd 		uint8_t	pad[64];
1013*a9fcb51fSAdrian Chadd 	}				sc_rxtapu;
1014*a9fcb51fSAdrian Chadd #define sc_rxtap	sc_rxtapu.th
1015*a9fcb51fSAdrian Chadd 	int				sc_rxtap_len;
1016*a9fcb51fSAdrian Chadd 
1017*a9fcb51fSAdrian Chadd 	union {
1018*a9fcb51fSAdrian Chadd 		struct otus_tx_radiotap_header th;
1019*a9fcb51fSAdrian Chadd 		uint8_t	pad[64];
1020*a9fcb51fSAdrian Chadd 	}				sc_txtapu;
1021*a9fcb51fSAdrian Chadd #define sc_txtap	sc_txtapu.th
1022*a9fcb51fSAdrian Chadd 	int				sc_txtap_len;
1023*a9fcb51fSAdrian Chadd };
1024*a9fcb51fSAdrian Chadd 
1025*a9fcb51fSAdrian Chadd #endif	/* __IF_OTUSREG_H__ */
1026