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