xref: /openbsd/sys/dev/usb/if_otusreg.h (revision 61e87b28)
1*61e87b28Sderaadt /*	$OpenBSD: if_otusreg.h,v 1.9 2013/11/26 20:33:18 deraadt Exp $	*/
268baf11cSdamien 
368baf11cSdamien /*-
468baf11cSdamien  * Copyright (c) 2009 Damien Bergamini <damien.bergamini@free.fr>
568baf11cSdamien  * Copyright (c) 2007-2008 Atheros Communications, Inc.
668baf11cSdamien  *
768baf11cSdamien  * Permission to use, copy, modify, and distribute this software for any
868baf11cSdamien  * purpose with or without fee is hereby granted, provided that the above
968baf11cSdamien  * copyright notice and this permission notice appear in all copies.
1068baf11cSdamien  *
1168baf11cSdamien  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1268baf11cSdamien  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1368baf11cSdamien  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1468baf11cSdamien  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1568baf11cSdamien  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1668baf11cSdamien  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1768baf11cSdamien  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1868baf11cSdamien  */
1968baf11cSdamien 
2068baf11cSdamien /* USB Endpoints addresses. */
2168baf11cSdamien #define AR_EPT_BULK_TX_NO	(UE_DIR_OUT | 1)
2268baf11cSdamien #define AR_EPT_BULK_RX_NO	(UE_DIR_IN  | 2)
2368baf11cSdamien #define AR_EPT_INTR_RX_NO	(UE_DIR_IN  | 3)
2468baf11cSdamien #define AR_EPT_INTR_TX_NO	(UE_DIR_OUT | 4)
2568baf11cSdamien 
2668baf11cSdamien /* USB Requests. */
2768baf11cSdamien #define AR_FW_DOWNLOAD			0x30
2868baf11cSdamien #define AR_FW_DOWNLOAD_COMPLETE		0x31
2968baf11cSdamien 
3068baf11cSdamien /* Maximum number of writes that can fit in a single FW command is 7. */
3168baf11cSdamien #define AR_MAX_WRITE_IDX	6	/* 56 bytes */
3268baf11cSdamien 
3368baf11cSdamien #define AR_FW_INIT_ADDR			0x102800
3468baf11cSdamien #define AR_FW_MAIN_ADDR			0x200000
3568baf11cSdamien #define AR_USB_MODE_CTRL		0x1e1108
3668baf11cSdamien 
3768baf11cSdamien /*
3868baf11cSdamien  * AR9170 MAC registers.
3968baf11cSdamien  */
4068baf11cSdamien #define AR_MAC_REG_BASE			0x1c3000
4168baf11cSdamien #define AR_MAC_REG_MAC_ADDR_L		(AR_MAC_REG_BASE + 0x610)
4268baf11cSdamien #define AR_MAC_REG_MAC_ADDR_H		(AR_MAC_REG_BASE + 0x614)
436e30e88dSdamien #define AR_MAC_REG_BSSID_L		(AR_MAC_REG_BASE + 0x618)
446e30e88dSdamien #define AR_MAC_REG_BSSID_H		(AR_MAC_REG_BASE + 0x61c)
4568baf11cSdamien #define AR_MAC_REG_GROUP_HASH_TBL_L	(AR_MAC_REG_BASE + 0x624)
4668baf11cSdamien #define AR_MAC_REG_GROUP_HASH_TBL_H	(AR_MAC_REG_BASE + 0x628)
4768baf11cSdamien #define AR_MAC_REG_BASIC_RATE		(AR_MAC_REG_BASE + 0x630)
4868baf11cSdamien #define AR_MAC_REG_MANDATORY_RATE	(AR_MAC_REG_BASE + 0x634)
4968baf11cSdamien #define AR_MAC_REG_RTS_CTS_RATE		(AR_MAC_REG_BASE + 0x638)
5068baf11cSdamien #define AR_MAC_REG_BACKOFF_PROTECT	(AR_MAC_REG_BASE + 0x63c)
5168baf11cSdamien #define AR_MAC_REG_RX_THRESHOLD		(AR_MAC_REG_BASE + 0x640)
5268baf11cSdamien #define AR_MAC_REG_RX_PE_DELAY		(AR_MAC_REG_BASE + 0x64c)
5368baf11cSdamien #define AR_MAC_REG_DYNAMIC_SIFS_ACK	(AR_MAC_REG_BASE + 0x658)
5468baf11cSdamien #define AR_MAC_REG_SNIFFER		(AR_MAC_REG_BASE + 0x674)
5568baf11cSdamien #define AR_MAC_REG_ACK_EXTENSION	(AR_MAC_REG_BASE + 0x690)
5668baf11cSdamien #define AR_MAC_REG_EIFS_AND_SIFS	(AR_MAC_REG_BASE + 0x698)
57803f2018Sdamien #define AR_MAC_REG_BUSY			(AR_MAC_REG_BASE + 0x6e8)
58803f2018Sdamien #define AR_MAC_REG_BUSY_EXT		(AR_MAC_REG_BASE + 0x6ec)
5968baf11cSdamien #define AR_MAC_REG_SLOT_TIME		(AR_MAC_REG_BASE + 0x6f0)
6068baf11cSdamien #define AR_MAC_REG_AC0_CW		(AR_MAC_REG_BASE + 0xb00)
6168baf11cSdamien #define AR_MAC_REG_AC1_CW		(AR_MAC_REG_BASE + 0xb04)
6268baf11cSdamien #define AR_MAC_REG_AC2_CW		(AR_MAC_REG_BASE + 0xb08)
6368baf11cSdamien #define AR_MAC_REG_AC3_CW		(AR_MAC_REG_BASE + 0xb0c)
6468baf11cSdamien #define AR_MAC_REG_AC4_CW		(AR_MAC_REG_BASE + 0xb10)
6568baf11cSdamien #define AR_MAC_REG_AC1_AC0_AIFS		(AR_MAC_REG_BASE + 0xb14)
6668baf11cSdamien #define AR_MAC_REG_AC3_AC2_AIFS		(AR_MAC_REG_BASE + 0xb18)
6768baf11cSdamien #define AR_MAC_REG_RETRY_MAX		(AR_MAC_REG_BASE + 0xb28)
6868baf11cSdamien #define AR_MAC_REG_TXOP_NOT_ENOUGH_INDICATION	\
6968baf11cSdamien 					(AR_MAC_REG_BASE + 0xb30)
7068baf11cSdamien #define AR_MAC_REG_AC1_AC0_TXOP		(AR_MAC_REG_BASE + 0xb44)
7168baf11cSdamien #define AR_MAC_REG_AC3_AC2_TXOP		(AR_MAC_REG_BASE + 0xb48)
72803f2018Sdamien #define AR_MAC_REG_OFDM_PHY_ERRORS	(AR_MAC_REG_BASE + 0xcb4)
73803f2018Sdamien #define AR_MAC_REG_CCK_PHY_ERRORS	(AR_MAC_REG_BASE + 0xcb8)
7468baf11cSdamien #define AR_MAC_REG_BCN_HT1		(AR_MAC_REG_BASE + 0xda0)
7568baf11cSdamien 
7668baf11cSdamien /* Possible values for register AR_USB_MODE_CTRL. */
7768baf11cSdamien #define AR_USB_DS_ENA		(1 << 0)
7868baf11cSdamien #define AR_USB_US_ENA		(1 << 1)
7968baf11cSdamien #define AR_USB_US_PACKET_MODE	(1 << 3)
8068baf11cSdamien #define AR_USB_RX_STREAM_4K	(0 << 4)
8168baf11cSdamien #define AR_USB_RX_STREAM_8K	(1 << 4)
8268baf11cSdamien #define AR_USB_RX_STREAM_16K	(2 << 4)
8368baf11cSdamien #define AR_USB_RX_STREAM_32K	(3 << 4)
8468baf11cSdamien #define AR_USB_TX_STREAM_MODE	(1 << 6)
8568baf11cSdamien 
8668baf11cSdamien #define AR_LED0_ON	(1 << 0)
8768baf11cSdamien #define AR_LED1_ON	(1 << 1)
8868baf11cSdamien 
8968baf11cSdamien /*
9068baf11cSdamien  * PHY registers.
9168baf11cSdamien  */
92803f2018Sdamien #define AR_PHY_BASE			0x1c5800
93803f2018Sdamien #define AR_PHY(reg)			(AR_PHY_BASE + (reg) * 4)
94803f2018Sdamien #define AR_PHY_TURBO			(AR_PHY_BASE + 0x0004)
95803f2018Sdamien #define AR_PHY_RF_CTL3			(AR_PHY_BASE + 0x0028)
96803f2018Sdamien #define AR_PHY_RF_CTL4			(AR_PHY_BASE + 0x0034)
97803f2018Sdamien #define AR_PHY_SETTLING			(AR_PHY_BASE + 0x0044)
98803f2018Sdamien #define AR_PHY_RXGAIN			(AR_PHY_BASE + 0x0048)
99803f2018Sdamien #define AR_PHY_DESIRED_SZ		(AR_PHY_BASE + 0x0050)
100803f2018Sdamien #define AR_PHY_FIND_SIG			(AR_PHY_BASE + 0x0058)
101803f2018Sdamien #define AR_PHY_AGC_CTL1			(AR_PHY_BASE + 0x005c)
102803f2018Sdamien #define AR_PHY_SFCORR			(AR_PHY_BASE + 0x0068)
103803f2018Sdamien #define AR_PHY_SFCORR_LOW		(AR_PHY_BASE + 0x006c)
104803f2018Sdamien #define AR_PHY_TIMING_CTRL4		(AR_PHY_BASE + 0x0120)
105803f2018Sdamien #define AR_PHY_TIMING5			(AR_PHY_BASE + 0x0124)
106803f2018Sdamien #define AR_PHY_POWER_TX_RATE1		(AR_PHY_BASE + 0x0134)
107803f2018Sdamien #define AR_PHY_POWER_TX_RATE2		(AR_PHY_BASE + 0x0138)
108803f2018Sdamien #define AR_PHY_POWER_TX_RATE_MAX	(AR_PHY_BASE + 0x013c)
109803f2018Sdamien #define AR_PHY_SWITCH_CHAIN_0		(AR_PHY_BASE + 0x0160)
110803f2018Sdamien #define AR_PHY_SWITCH_COM		(AR_PHY_BASE + 0x0164)
111803f2018Sdamien #define AR_PHY_HEAVY_CLIP_ENABLE	(AR_PHY_BASE + 0x01e0)
112803f2018Sdamien #define AR_PHY_CCK_DETECT		(AR_PHY_BASE + 0x0a08)
113803f2018Sdamien #define AR_PHY_GAIN_2GHZ		(AR_PHY_BASE + 0x0a0c)
114803f2018Sdamien #define AR_PHY_POWER_TX_RATE3		(AR_PHY_BASE + 0x0a34)
115803f2018Sdamien #define AR_PHY_POWER_TX_RATE4		(AR_PHY_BASE + 0x0a38)
116803f2018Sdamien #define AR_PHY_TPCRG1			(AR_PHY_BASE + 0x0a58)
117803f2018Sdamien #define AR_PHY_POWER_TX_RATE5		(AR_PHY_BASE + 0x0b8c)
118803f2018Sdamien #define AR_PHY_POWER_TX_RATE6		(AR_PHY_BASE + 0x0b90)
119803f2018Sdamien #define AR_PHY_POWER_TX_RATE7		(AR_PHY_BASE + 0x0bcc)
120803f2018Sdamien #define AR_PHY_POWER_TX_RATE8		(AR_PHY_BASE + 0x0bd0)
121803f2018Sdamien #define AR_PHY_POWER_TX_RATE9		(AR_PHY_BASE + 0x0bd4)
122803f2018Sdamien #define AR_PHY_CCA			(AR_PHY_BASE + 0x3064)
12368baf11cSdamien 
12468baf11cSdamien #define AR_SEEPROM_HW_TYPE_OFFSET	0x1374
125803f2018Sdamien #define AR_EEPROM_OFFSET		0x1600
12668baf11cSdamien 
12768baf11cSdamien #define AR_BANK4_CHUP			(1 << 0)
12868baf11cSdamien #define AR_BANK4_BMODE_LF_SYNTH_FREQ	(1 << 1)
12968baf11cSdamien #define AR_BANK4_AMODE_REFSEL(x)	((x) << 2)
13068baf11cSdamien #define AR_BANK4_ADDR(x)		((x) << 5)
13168baf11cSdamien 
13268baf11cSdamien /* Tx descriptor. */
13368baf11cSdamien struct ar_tx_head {
13468baf11cSdamien 	uint16_t	len;
13568baf11cSdamien 	uint16_t	macctl;
13668baf11cSdamien #define AR_TX_MAC_RTS		(1 <<  0)
13768baf11cSdamien #define AR_TX_MAC_CTS		(1 <<  1)
13868baf11cSdamien #define AR_TX_MAC_BACKOFF	(1 <<  3)
13968baf11cSdamien #define AR_TX_MAC_NOACK		(1 <<  2)
14068baf11cSdamien #define AR_TX_MAC_HW_DUR	(1 <<  9)
14188185ad4Sdamien #define AR_TX_MAC_QID(qid)	((qid) << 10)
14268baf11cSdamien #define AR_TX_MAC_RATE_PROBING	(1 << 15)
14368baf11cSdamien 
14468baf11cSdamien 	uint32_t	phyctl;
14568baf11cSdamien /* Modulation type. */
14668baf11cSdamien #define AR_TX_PHY_MT_CCK	0
14768baf11cSdamien #define AR_TX_PHY_MT_OFDM	1
14868baf11cSdamien #define AR_TX_PHY_MT_HT		2
14968baf11cSdamien #define AR_TX_PHY_GF		(1 << 2)
15068baf11cSdamien #define AR_TX_PHY_BW_SHIFT	3
15168baf11cSdamien #define AR_TX_PHY_TPC_SHIFT	9
15268baf11cSdamien #define AR_TX_PHY_ANTMSK(msk)	((msk) << 15)
15368baf11cSdamien #define AR_TX_PHY_MCS(mcs)	((mcs) << 18)
154*61e87b28Sderaadt #define AR_TX_PHY_SHGI		(1U << 31)
15568baf11cSdamien } __packed;
15668baf11cSdamien 
15768baf11cSdamien /* USB Rx stream mode header. */
15868baf11cSdamien struct ar_rx_head {
15968baf11cSdamien 	uint16_t	len;
16068baf11cSdamien 	uint16_t	tag;
16168baf11cSdamien #define AR_RX_HEAD_TAG	0x4e00
16268baf11cSdamien } __packed;
16368baf11cSdamien 
16468baf11cSdamien /* Rx descriptor. */
16568baf11cSdamien struct ar_rx_tail {
16668baf11cSdamien 	uint8_t	rssi_ant[3];
16768baf11cSdamien 	uint8_t	rssi_ant_ext[3];
16868baf11cSdamien 	uint8_t	rssi;		/* Combined RSSI. */
16968baf11cSdamien 	uint8_t	evm[2][6];	/* Error Vector Magnitude. */
17068baf11cSdamien 	uint8_t	phy_err;
17168baf11cSdamien 	uint8_t	sa_idx;
17268baf11cSdamien 	uint8_t	da_idx;
17368baf11cSdamien 	uint8_t	error;
174b86c5724Sdamien #define AR_RX_ERROR_TIMEOUT	(1 << 0)
175b86c5724Sdamien #define AR_RX_ERROR_OVERRUN	(1 << 1)
176b86c5724Sdamien #define AR_RX_ERROR_DECRYPT	(1 << 2)
17768baf11cSdamien #define AR_RX_ERROR_FCS		(1 << 3)
178b86c5724Sdamien #define AR_RX_ERROR_BAD_RA	(1 << 4)
179b86c5724Sdamien #define AR_RX_ERROR_PLCP	(1 << 5)
180b86c5724Sdamien #define AR_RX_ERROR_MMIC	(1 << 6)
18168baf11cSdamien 
18268baf11cSdamien 	uint8_t	status;
18368baf11cSdamien /* Modulation type (same as AR_TX_PHY_MT). */
18468baf11cSdamien #define AR_RX_STATUS_MT_MASK	0x3
18568baf11cSdamien #define AR_RX_STATUS_MT_CCK	0
18668baf11cSdamien #define AR_RX_STATUS_MT_OFDM	1
18768baf11cSdamien #define AR_RX_STATUS_MT_HT	2
18868baf11cSdamien #define AR_RX_STATUS_SHPREAMBLE	(1 << 3)
18968baf11cSdamien } __packed;
19068baf11cSdamien 
19168baf11cSdamien #define AR_PLCP_HDR_LEN	12
19268baf11cSdamien /* Magic PLCP header for firmware notifications through Rx bulk pipe. */
19368baf11cSdamien static uint8_t AR_PLCP_HDR_INTR[] = {
19468baf11cSdamien 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
19568baf11cSdamien 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff
19668baf11cSdamien };
19768baf11cSdamien 
19868baf11cSdamien /* Firmware command/reply header. */
19968baf11cSdamien struct ar_cmd_hdr {
20068baf11cSdamien 	uint8_t		len;
20168baf11cSdamien 	uint8_t		code;
20268baf11cSdamien #define AR_CMD_RREG		0x00
20368baf11cSdamien #define AR_CMD_WREG		0x01
20468baf11cSdamien #define AR_CMD_RMEM		0x02
20568baf11cSdamien #define AR_CMD_WMEM		0x03
20668baf11cSdamien #define AR_CMD_BITAND		0x04
20768baf11cSdamien #define AR_CMD_BITOR		0x05
20868baf11cSdamien #define AR_CMD_EKEY		0x28
20968baf11cSdamien #define AR_CMD_DKEY		0x29
21068baf11cSdamien #define AR_CMD_FREQUENCY	0x30
21168baf11cSdamien #define AR_CMD_RF_INIT		0x31
21268baf11cSdamien #define AR_CMD_SYNTH		0x32
21368baf11cSdamien #define AR_CMD_FREQ_STRAT	0x33
21468baf11cSdamien #define AR_CMD_ECHO		0x80
21568baf11cSdamien #define AR_CMD_TALLY		0x81
21668baf11cSdamien #define AR_CMD_TALLY_APD	0x82
21768baf11cSdamien #define AR_CMD_CONFIG		0x83
21868baf11cSdamien #define AR_CMD_RESET		0x90
21968baf11cSdamien #define AR_CMD_DKRESET		0x91
22068baf11cSdamien #define AR_CMD_DKTX_STATUS	0x92
22168baf11cSdamien #define AR_CMD_FDC		0xa0
22268baf11cSdamien #define AR_CMD_WREEPROM		0xb0
22368baf11cSdamien #define AR_CMD_WFLASH		AR_CMD_WREEPROM
22468baf11cSdamien #define AR_CMD_FLASH_ERASE	0xb1
22568baf11cSdamien #define AR_CMD_FLASH_PROG	0xb2
22668baf11cSdamien #define AR_CMD_FLASH_CHKSUM	0xb3
22768baf11cSdamien #define AR_CMD_FLASH_READ	0xb4
22868baf11cSdamien #define AR_CMD_FW_DL_INIT	0xb5
22968baf11cSdamien #define AR_CMD_MEM_WREEPROM	0xbb
23068baf11cSdamien /* Those have the 2 MSB set to 1. */
23168baf11cSdamien #define AR_EVT_BEACON		0x00
23268baf11cSdamien #define AR_EVT_TX_COMP		0x01
23368baf11cSdamien #define AR_EVT_TBTT		0x02
23468baf11cSdamien #define AR_EVT_ATIM		0x03
23568baf11cSdamien 
23668baf11cSdamien 	uint16_t	token;	/* Driver private data. */
23768baf11cSdamien } __packed;
23868baf11cSdamien 
23968baf11cSdamien /* Structure for command AR_CMD_RF_INIT/AR_CMD_FREQUENCY. */
24068baf11cSdamien struct ar_cmd_frequency {
24168baf11cSdamien 	uint32_t	freq;
24268baf11cSdamien 	uint32_t	dynht2040;
24368baf11cSdamien 	uint32_t	htena;
2446e30e88dSdamien 	uint32_t	dsc_exp;
2456e30e88dSdamien 	uint32_t	dsc_man;
2466e30e88dSdamien 	uint32_t	dsc_shgi_exp;
2476e30e88dSdamien 	uint32_t	dsc_shgi_man;
24868baf11cSdamien 	uint32_t	check_loop_count;
24968baf11cSdamien } __packed;
25068baf11cSdamien 
25168baf11cSdamien /* Firmware reply for command AR_CMD_FREQUENCY. */
25268baf11cSdamien struct ar_rsp_frequency {
25368baf11cSdamien 	uint32_t	status;
2546e30e88dSdamien #define AR_CAL_ERR_AGC		(1 << 0)	/* AGC cal unfinished. */
2556e30e88dSdamien #define AR_CAL_ERR_NF		(1 << 1)	/* Noise cal unfinished. */
2566e30e88dSdamien #define AR_CAL_ERR_NF_VAL	(1 << 2)	/* NF value unexpected. */
2576e30e88dSdamien 
2586e30e88dSdamien 	uint32_t	nf[3];		/* Noisefloor. */
2596e30e88dSdamien 	uint32_t	nf_ext[3];	/* Noisefloor ext. */
26068baf11cSdamien } __packed;
26168baf11cSdamien 
26268baf11cSdamien /* Structure for command AR_CMD_EKEY. */
26368baf11cSdamien struct ar_cmd_ekey {
26468baf11cSdamien 	uint16_t	uid;	/* user ID */
2654351e075Sdamien 	uint16_t	kix;
26668baf11cSdamien 	uint16_t	cipher;
26768baf11cSdamien #define AR_CIPHER_NONE		0
26868baf11cSdamien #define AR_CIPHER_WEP64		1
26968baf11cSdamien #define AR_CIPHER_TKIP		2
27068baf11cSdamien #define AR_CIPHER_AES		4
27168baf11cSdamien #define AR_CIPHER_WEP128	5
27268baf11cSdamien #define AR_CIPHER_WEP256	6
27368baf11cSdamien #define AR_CIPHER_CENC		7
27468baf11cSdamien 
27568baf11cSdamien 	uint8_t		macaddr[IEEE80211_ADDR_LEN];
27668baf11cSdamien 	uint8_t		key[16];
27768baf11cSdamien } __packed;
27868baf11cSdamien 
27968baf11cSdamien /* Structure for event AR_EVT_TX_COMP. */
28068baf11cSdamien struct ar_evt_tx_comp {
28168baf11cSdamien 	uint8_t		macaddr[IEEE80211_ADDR_LEN];
28268baf11cSdamien 	uint32_t	phy;
28368baf11cSdamien 	uint16_t	status;
28468baf11cSdamien #define AR_TX_STATUS_COMP	0
28568baf11cSdamien #define AR_TX_STATUS_RETRY_COMP	1
28668baf11cSdamien #define AR_TX_STATUS_FAILED	2
28768baf11cSdamien } __packed;
28868baf11cSdamien 
28968baf11cSdamien /* List of supported channels. */
29068baf11cSdamien static const uint8_t ar_chans[] = {
29168baf11cSdamien 	1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
29268baf11cSdamien 	36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124,
29368baf11cSdamien 	128, 132, 136, 140, 149, 153, 157, 161, 165, 34, 38, 42, 46
29468baf11cSdamien };
29568baf11cSdamien 
29668baf11cSdamien /*
29768baf11cSdamien  * This data is automatically generated from the "otus.ini" file.
29868baf11cSdamien  * It is stored in a different way though, to reduce kernel's .rodata
29968baf11cSdamien  * section overhead (5.1KB instead of 8.5KB).
30068baf11cSdamien  */
30168baf11cSdamien 
302803f2018Sdamien /* NB: apply AR_PHY(). */
30368baf11cSdamien static const uint16_t ar5416_phy_regs[] = {
30468baf11cSdamien 	0x000, 0x001, 0x002, 0x003, 0x004, 0x005, 0x006, 0x007, 0x008,
30568baf11cSdamien 	0x009, 0x00a, 0x00b, 0x00c, 0x00d, 0x00e, 0x00f, 0x010, 0x011,
30668baf11cSdamien 	0x012, 0x013, 0x014, 0x015, 0x016, 0x017, 0x018, 0x01a, 0x01b,
30768baf11cSdamien 	0x040, 0x041, 0x042, 0x043, 0x045, 0x046, 0x047, 0x048, 0x049,
30868baf11cSdamien 	0x04a, 0x04b, 0x04d, 0x04e, 0x04f, 0x051, 0x052, 0x053, 0x055,
30968baf11cSdamien 	0x056, 0x058, 0x059, 0x05c, 0x05d, 0x05e, 0x05f, 0x060, 0x061,
31068baf11cSdamien 	0x062, 0x063, 0x064, 0x065, 0x066, 0x067, 0x068, 0x069, 0x06a,
31168baf11cSdamien 	0x06b, 0x06c, 0x06d, 0x070, 0x071, 0x072, 0x073, 0x074, 0x075,
31268baf11cSdamien 	0x076, 0x077, 0x078, 0x079, 0x07a, 0x07b, 0x07c, 0x07f, 0x080,
31368baf11cSdamien 	0x081, 0x082, 0x083, 0x084, 0x085, 0x086, 0x087, 0x088, 0x089,
31468baf11cSdamien 	0x08a, 0x08b, 0x08c, 0x08d, 0x08e, 0x08f, 0x090, 0x091, 0x092,
31568baf11cSdamien 	0x093, 0x094, 0x095, 0x096, 0x097, 0x098, 0x099, 0x09a, 0x09b,
31668baf11cSdamien 	0x09c, 0x09d, 0x09e, 0x09f, 0x0a0, 0x0a1, 0x0a2, 0x0a3, 0x0a4,
31768baf11cSdamien 	0x0a5, 0x0a6, 0x0a7, 0x0a8, 0x0a9, 0x0aa, 0x0ab, 0x0ac, 0x0ad,
31868baf11cSdamien 	0x0ae, 0x0af, 0x0b0, 0x0b1, 0x0b2, 0x0b3, 0x0b4, 0x0b5, 0x0b6,
31968baf11cSdamien 	0x0b7, 0x0b8, 0x0b9, 0x0ba, 0x0bb, 0x0bc, 0x0bd, 0x0be, 0x0bf,
32068baf11cSdamien 	0x0c0, 0x0c1, 0x0c2, 0x0c3, 0x0c4, 0x0c5, 0x0c6, 0x0c7, 0x0c8,
32168baf11cSdamien 	0x0c9, 0x0ca, 0x0cb, 0x0cc, 0x0cd, 0x0ce, 0x0cf, 0x0d0, 0x0d1,
32268baf11cSdamien 	0x0d2, 0x0d3, 0x0d4, 0x0d5, 0x0d6, 0x0d7, 0x0d8, 0x0d9, 0x0da,
32368baf11cSdamien 	0x0db, 0x0dc, 0x0dd, 0x0de, 0x0df, 0x0e0, 0x0e1, 0x0e2, 0x0e3,
32468baf11cSdamien 	0x0e4, 0x0e5, 0x0e6, 0x0e7, 0x0e8, 0x0e9, 0x0ea, 0x0eb, 0x0ec,
32568baf11cSdamien 	0x0ed, 0x0ee, 0x0ef, 0x0f0, 0x0f1, 0x0f2, 0x0f3, 0x0f4, 0x0f5,
32668baf11cSdamien 	0x0f6, 0x0f7, 0x0f8, 0x0f9, 0x0fa, 0x0fb, 0x0fc, 0x0fd, 0x0fe,
32768baf11cSdamien 	0x0ff, 0x100, 0x103, 0x104, 0x105, 0x106, 0x107, 0x108, 0x109,
32868baf11cSdamien 	0x10a, 0x10b, 0x10c, 0x10d, 0x10e, 0x10f, 0x13c, 0x13d, 0x13e,
32968baf11cSdamien 	0x13f, 0x280, 0x281, 0x282, 0x283, 0x284, 0x285, 0x286, 0x287,
33068baf11cSdamien 	0x288, 0x289, 0x28a, 0x28b, 0x28c, 0x28d, 0x28e, 0x28f, 0x290,
33168baf11cSdamien 	0x291, 0x292, 0x293, 0x294, 0x295, 0x296, 0x297, 0x298, 0x299,
33268baf11cSdamien 	0x29a, 0x29b, 0x29d, 0x29e, 0x29f, 0x2c0, 0x2c1, 0x2c2, 0x2c3,
33368baf11cSdamien 	0x2c4, 0x2c5, 0x2c6, 0x2c7, 0x2c8, 0x2c9, 0x2ca, 0x2cb, 0x2cc,
33468baf11cSdamien 	0x2cd, 0x2ce, 0x2cf, 0x2d0, 0x2d1, 0x2d2, 0x2d3, 0x2d4, 0x2d5,
33568baf11cSdamien 	0x2d6, 0x2e2, 0x2e3, 0x2e4, 0x2e5, 0x2e6, 0x2e7, 0x2e8, 0x2e9,
33668baf11cSdamien 	0x2ea, 0x2eb, 0x2ec, 0x2ed, 0x2ee, 0x2ef, 0x2f0, 0x2f1, 0x2f2,
33768baf11cSdamien 	0x2f3, 0x2f4, 0x2f5, 0x2f6, 0x2f7, 0x2f8, 0x412, 0x448, 0x458,
33868baf11cSdamien 	0x683, 0x69b, 0x812, 0x848, 0x858, 0xa83, 0xa9b, 0xc19, 0xc57,
33968baf11cSdamien 	0xc5a, 0xc6f, 0xe9c, 0xed7, 0xed8, 0xed9, 0xeda, 0xedb, 0xedc,
34068baf11cSdamien 	0xedd, 0xede, 0xedf, 0xee0, 0xee1
34168baf11cSdamien };
34268baf11cSdamien 
34368baf11cSdamien static const uint32_t ar5416_phy_vals_5ghz_20mhz[] = {
34468baf11cSdamien 	0x00000007, 0x00000300, 0x00000000, 0xad848e19, 0x7d14e000,
34568baf11cSdamien 	0x9c0a9f6b, 0x00000090, 0x00000000, 0x02020200, 0x00000e0e,
34668baf11cSdamien 	0x0a020001, 0x0000a000, 0x00000000, 0x00000e0e, 0x00000007,
34768baf11cSdamien 	0x00200400, 0x206a002e, 0x1372161e, 0x001a6a65, 0x1284233c,
34868baf11cSdamien 	0x6c48b4e4, 0x00000859, 0x7ec80d2e, 0x31395c5e, 0x0004dd10,
34968baf11cSdamien 	0x409a4190, 0x050cb081, 0x00000000, 0x00000000, 0x00000000,
35068baf11cSdamien 	0x00000000, 0x000007d0, 0x00000118, 0x10000fff, 0x0510081c,
35168baf11cSdamien 	0xd0058a15, 0x00000001, 0x00000004, 0x3f3f3f3f, 0x3f3f3f3f,
35268baf11cSdamien 	0x0000007f, 0xdfb81020, 0x9280b212, 0x00020028, 0x5d50e188,
35368baf11cSdamien 	0x00081fff, 0x00009b40, 0x00001120, 0x190fb515, 0x00000000,
35468baf11cSdamien 	0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
35568baf11cSdamien 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
35668baf11cSdamien 	0x00000000, 0x00000007, 0x001fff00, 0x006f00c4, 0x03051000,
35768baf11cSdamien 	0x00000820, 0x038919be, 0x06336f77, 0x60f6532c, 0x08f186c8,
35868baf11cSdamien 	0x00046384, 0x00000000, 0x00000000, 0x00000000, 0x00000200,
35968baf11cSdamien 	0x64646464, 0x3c787878, 0x000000aa, 0x00000000, 0x00001042,
36068baf11cSdamien 	0x00000000, 0x00000040, 0x00000080, 0x000001a1, 0x000001e1,
36168baf11cSdamien 	0x00000021, 0x00000061, 0x00000168, 0x000001a8, 0x000001e8,
36268baf11cSdamien 	0x00000028, 0x00000068, 0x00000189, 0x000001c9, 0x00000009,
36368baf11cSdamien 	0x00000049, 0x00000089, 0x00000170, 0x000001b0, 0x000001f0,
36468baf11cSdamien 	0x00000030, 0x00000070, 0x00000191, 0x000001d1, 0x00000011,
36568baf11cSdamien 	0x00000051, 0x00000091, 0x000001b8, 0x000001f8, 0x00000038,
36668baf11cSdamien 	0x00000078, 0x00000199, 0x000001d9, 0x00000019, 0x00000059,
36768baf11cSdamien 	0x00000099, 0x000000d9, 0x000000f9, 0x000000f9, 0x000000f9,
36868baf11cSdamien 	0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
36968baf11cSdamien 	0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
37068baf11cSdamien 	0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
37168baf11cSdamien 	0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
37268baf11cSdamien 	0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x00000000,
37368baf11cSdamien 	0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005,
37468baf11cSdamien 	0x00000008, 0x00000009, 0x0000000a, 0x0000000b, 0x0000000c,
37568baf11cSdamien 	0x0000000d, 0x00000010, 0x00000011, 0x00000012, 0x00000013,
37668baf11cSdamien 	0x00000014, 0x00000015, 0x00000018, 0x00000019, 0x0000001a,
37768baf11cSdamien 	0x0000001b, 0x0000001c, 0x0000001d, 0x00000020, 0x00000021,
37868baf11cSdamien 	0x00000022, 0x00000023, 0x00000024, 0x00000025, 0x00000028,
37968baf11cSdamien 	0x00000029, 0x0000002a, 0x0000002b, 0x0000002c, 0x0000002d,
38068baf11cSdamien 	0x00000030, 0x00000031, 0x00000032, 0x00000033, 0x00000034,
38168baf11cSdamien 	0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
38268baf11cSdamien 	0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
38368baf11cSdamien 	0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
38468baf11cSdamien 	0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
38568baf11cSdamien 	0x00000035, 0x00000010, 0x0000001a, 0x00000000, 0x00000000,
38668baf11cSdamien 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
38768baf11cSdamien 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
38868baf11cSdamien 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
38968baf11cSdamien 	0x00000000, 0x00000008, 0x00000440, 0xd6be4788, 0x012e8160,
39068baf11cSdamien 	0x40806333, 0x00106c10, 0x009c4060, 0x1883800a, 0x018830c6,
39168baf11cSdamien 	0x00000400, 0x000009b5, 0x00000000, 0x00000108, 0x3f3f3f3f,
39268baf11cSdamien 	0x3f3f3f3f, 0x13c889af, 0x38490a20, 0x00007bb6, 0x0fff3ffc,
39368baf11cSdamien 	0x00000001, 0x0000a000, 0x00000000, 0x0cc75380, 0x0f0f0f01,
39468baf11cSdamien 	0xdfa91f01, 0x00418a11, 0x00000000, 0x09249126, 0x0a1a9caa,
39568baf11cSdamien 	0x1ce739ce, 0x051701ce, 0x18010000, 0x30032602, 0x48073e06,
39668baf11cSdamien 	0x560b4c0a, 0x641a600f, 0x7a4f6e1b, 0x8c5b7e5a, 0x9d0f96cf,
39768baf11cSdamien 	0xb51fa69f, 0xcb3fbd07, 0x0000d7bf, 0x00000000, 0x00000000,
39868baf11cSdamien 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
39968baf11cSdamien 	0x3fffffff, 0x3fffffff, 0x3fffffff, 0x0003ffff, 0x79a8aa1f,
40068baf11cSdamien 	0x08000000, 0x3f3f3f3f, 0x3f3f3f3f, 0x1ce739ce, 0x000001ce,
40168baf11cSdamien 	0x00000007, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
40268baf11cSdamien 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
40368baf11cSdamien 	0x00000000, 0x00000000, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f,
40468baf11cSdamien 	0x00000000, 0x1ce739ce, 0x000000c0, 0x00180a65, 0x0510001c,
40568baf11cSdamien 	0x00009b40, 0x012e8160, 0x09249126, 0x00180a65, 0x0510001c,
40668baf11cSdamien 	0x00009b40, 0x012e8160, 0x09249126, 0x0001c600, 0x004b6a8e,
40768baf11cSdamien 	0x000003ce, 0x00181400, 0x00820820, 0x066c420f, 0x0f282207,
40868baf11cSdamien 	0x17601685, 0x1f801104, 0x37a00c03, 0x3fc40883, 0x57c00803,
40968baf11cSdamien 	0x5fd80682, 0x7fe00482, 0x7f3c7bba, 0xf3307ff0
41068baf11cSdamien };
41168baf11cSdamien 
41268baf11cSdamien #ifdef notyet
41368baf11cSdamien static const uint32_t ar5416_phy_vals_5ghz_40mhz[] = {
41468baf11cSdamien 	0x00000007, 0x000003c4, 0x00000000, 0xad848e19, 0x7d14e000,
41568baf11cSdamien 	0x9c0a9f6b, 0x00000090, 0x00000000, 0x02020200, 0x00000e0e,
41668baf11cSdamien 	0x0a020001, 0x0000a000, 0x00000000, 0x00000e0e, 0x00000007,
41768baf11cSdamien 	0x00200400, 0x206a002e, 0x13721c1e, 0x001a6a65, 0x1284233c,
41868baf11cSdamien 	0x6c48b4e4, 0x00000859, 0x7ec80d2e, 0x31395c5e, 0x0004dd10,
41968baf11cSdamien 	0x409a4190, 0x050cb081, 0x00000000, 0x00000000, 0x00000000,
42068baf11cSdamien 	0x00000000, 0x000007d0, 0x00000230, 0x10000fff, 0x0510081c,
42168baf11cSdamien 	0xd0058a15, 0x00000001, 0x00000004, 0x3f3f3f3f, 0x3f3f3f3f,
42268baf11cSdamien 	0x0000007f, 0xdfb81020, 0x9280b212, 0x00020028, 0x5d50e188,
42368baf11cSdamien 	0x00081fff, 0x00009b40, 0x00001120, 0x190fb515, 0x00000000,
42468baf11cSdamien 	0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
42568baf11cSdamien 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
42668baf11cSdamien 	0x00000000, 0x00000007, 0x001fff00, 0x006f00c4, 0x03051000,
42768baf11cSdamien 	0x00000820, 0x038919be, 0x06336f77, 0x60f6532c, 0x08f186c8,
42868baf11cSdamien 	0x00046384, 0x00000000, 0x00000000, 0x00000000, 0x00000200,
42968baf11cSdamien 	0x64646464, 0x3c787878, 0x000000aa, 0x00000000, 0x00001042,
43068baf11cSdamien 	0x00000000, 0x00000040, 0x00000080, 0x000001a1, 0x000001e1,
43168baf11cSdamien 	0x00000021, 0x00000061, 0x00000168, 0x000001a8, 0x000001e8,
43268baf11cSdamien 	0x00000028, 0x00000068, 0x00000189, 0x000001c9, 0x00000009,
43368baf11cSdamien 	0x00000049, 0x00000089, 0x00000170, 0x000001b0, 0x000001f0,
43468baf11cSdamien 	0x00000030, 0x00000070, 0x00000191, 0x000001d1, 0x00000011,
43568baf11cSdamien 	0x00000051, 0x00000091, 0x000001b8, 0x000001f8, 0x00000038,
43668baf11cSdamien 	0x00000078, 0x00000199, 0x000001d9, 0x00000019, 0x00000059,
43768baf11cSdamien 	0x00000099, 0x000000d9, 0x000000f9, 0x000000f9, 0x000000f9,
43868baf11cSdamien 	0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
43968baf11cSdamien 	0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
44068baf11cSdamien 	0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
44168baf11cSdamien 	0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
44268baf11cSdamien 	0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x00000000,
44368baf11cSdamien 	0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005,
44468baf11cSdamien 	0x00000008, 0x00000009, 0x0000000a, 0x0000000b, 0x0000000c,
44568baf11cSdamien 	0x0000000d, 0x00000010, 0x00000011, 0x00000012, 0x00000013,
44668baf11cSdamien 	0x00000014, 0x00000015, 0x00000018, 0x00000019, 0x0000001a,
44768baf11cSdamien 	0x0000001b, 0x0000001c, 0x0000001d, 0x00000020, 0x00000021,
44868baf11cSdamien 	0x00000022, 0x00000023, 0x00000024, 0x00000025, 0x00000028,
44968baf11cSdamien 	0x00000029, 0x0000002a, 0x0000002b, 0x0000002c, 0x0000002d,
45068baf11cSdamien 	0x00000030, 0x00000031, 0x00000032, 0x00000033, 0x00000034,
45168baf11cSdamien 	0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
45268baf11cSdamien 	0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
45368baf11cSdamien 	0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
45468baf11cSdamien 	0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
45568baf11cSdamien 	0x00000035, 0x00000010, 0x0000001a, 0x00000000, 0x00000000,
45668baf11cSdamien 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
45768baf11cSdamien 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
45868baf11cSdamien 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
45968baf11cSdamien 	0x00000000, 0x00000008, 0x00000440, 0xd6be4788, 0x012e8160,
46068baf11cSdamien 	0x40806333, 0x00106c10, 0x009c4060, 0x1883800a, 0x018830c6,
46168baf11cSdamien 	0x00000400, 0x000009b5, 0x00000000, 0x00000210, 0x3f3f3f3f,
46268baf11cSdamien 	0x3f3f3f3f, 0x13c889af, 0x38490a20, 0x00007bb6, 0x0fff3ffc,
46368baf11cSdamien 	0x00000001, 0x0000a000, 0x00000000, 0x0cc75380, 0x0f0f0f01,
46468baf11cSdamien 	0xdfa91f01, 0x00418a11, 0x00000000, 0x09249126, 0x0a1a9caa,
46568baf11cSdamien 	0x1ce739ce, 0x051701ce, 0x18010000, 0x30032602, 0x48073e06,
46668baf11cSdamien 	0x560b4c0a, 0x641a600f, 0x7a4f6e1b, 0x8c5b7e5a, 0x9d0f96cf,
46768baf11cSdamien 	0xb51fa69f, 0xcb3fbcbf, 0x0000d7bf, 0x00000000, 0x00000000,
46868baf11cSdamien 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
46968baf11cSdamien 	0x3fffffff, 0x3fffffff, 0x3fffffff, 0x0003ffff, 0x79a8aa1f,
47068baf11cSdamien 	0x08000000, 0x3f3f3f3f, 0x3f3f3f3f, 0x1ce739ce, 0x000001ce,
47168baf11cSdamien 	0x00000007, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
47268baf11cSdamien 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
47368baf11cSdamien 	0x00000000, 0x00000000, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f,
47468baf11cSdamien 	0x00000000, 0x1ce739ce, 0x000000c0, 0x00180a65, 0x0510001c,
47568baf11cSdamien 	0x00009b40, 0x012e8160, 0x09249126, 0x00180a65, 0x0510001c,
47668baf11cSdamien 	0x00009b40, 0x012e8160, 0x09249126, 0x0001c600, 0x004b6a8e,
47768baf11cSdamien 	0x000003ce, 0x00181400, 0x00820820, 0x066c420f, 0x0f282207,
47868baf11cSdamien 	0x17601685, 0x1f801104, 0x37a00c03, 0x3fc40883, 0x57c00803,
47968baf11cSdamien 	0x5fd80682, 0x7fe00482, 0x7f3c7bba, 0xf3307ff0
48068baf11cSdamien };
48168baf11cSdamien #endif
48268baf11cSdamien 
48368baf11cSdamien #ifdef notyet
48468baf11cSdamien static const uint32_t ar5416_phy_vals_2ghz_40mhz[] = {
48568baf11cSdamien 	0x00000007, 0x000003c4, 0x00000000, 0xad848e19, 0x7d14e000,
48668baf11cSdamien 	0x9c0a9f6b, 0x00000090, 0x00000000, 0x02020200, 0x00000e0e,
48768baf11cSdamien 	0x0a020001, 0x0000a000, 0x00000000, 0x00000e0e, 0x00000007,
48868baf11cSdamien 	0x00200400, 0x206a002e, 0x13721c24, 0x00197a68, 0x1284233c,
48968baf11cSdamien 	0x6c48b0e4, 0x00000859, 0x7ec80d2e, 0x31395c5e, 0x0004dd20,
49068baf11cSdamien 	0x409a4190, 0x050cb081, 0x00000000, 0x00000000, 0x00000000,
49168baf11cSdamien 	0x00000000, 0x00000898, 0x00000268, 0x10000fff, 0x0510001c,
49268baf11cSdamien 	0xd0058a15, 0x00000001, 0x00000004, 0x3f3f3f3f, 0x3f3f3f3f,
49368baf11cSdamien 	0x0000007f, 0xdfb81020, 0x9280b212, 0x00020028, 0x5d50e188,
49468baf11cSdamien 	0x00081fff, 0x00009b40, 0x00001120, 0x190fb515, 0x00000000,
49568baf11cSdamien 	0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
49668baf11cSdamien 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
49768baf11cSdamien 	0x00000000, 0x00000007, 0x001fff00, 0x006f00c4, 0x03051000,
49868baf11cSdamien 	0x00000820, 0x038919be, 0x06336f77, 0x60f6532c, 0x08f186c8,
49968baf11cSdamien 	0x00046384, 0x00000000, 0x00000000, 0x00000000, 0x00000200,
50068baf11cSdamien 	0x64646464, 0x3c787878, 0x000000aa, 0x00000000, 0x00001042,
50168baf11cSdamien 	0x00000000, 0x00000040, 0x00000080, 0x00000141, 0x00000181,
50268baf11cSdamien 	0x000001c1, 0x00000001, 0x00000041, 0x000001a8, 0x000001e8,
50368baf11cSdamien 	0x00000028, 0x00000068, 0x000000a8, 0x00000169, 0x000001a9,
50468baf11cSdamien 	0x000001e9, 0x00000029, 0x00000069, 0x00000190, 0x000001d0,
50568baf11cSdamien 	0x00000010, 0x00000050, 0x00000090, 0x00000151, 0x00000191,
50668baf11cSdamien 	0x000001d1, 0x00000011, 0x00000051, 0x00000198, 0x000001d8,
50768baf11cSdamien 	0x00000018, 0x00000058, 0x00000098, 0x00000159, 0x00000199,
50868baf11cSdamien 	0x000001d9, 0x00000019, 0x00000059, 0x00000099, 0x000000d9,
50968baf11cSdamien 	0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
51068baf11cSdamien 	0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
51168baf11cSdamien 	0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
51268baf11cSdamien 	0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
51368baf11cSdamien 	0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x00000000,
51468baf11cSdamien 	0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005,
51568baf11cSdamien 	0x00000008, 0x00000009, 0x0000000a, 0x0000000b, 0x0000000c,
51668baf11cSdamien 	0x0000000d, 0x00000010, 0x00000011, 0x00000012, 0x00000013,
51768baf11cSdamien 	0x00000014, 0x00000015, 0x00000018, 0x00000019, 0x0000001a,
51868baf11cSdamien 	0x0000001b, 0x0000001c, 0x0000001d, 0x00000020, 0x00000021,
51968baf11cSdamien 	0x00000022, 0x00000023, 0x00000024, 0x00000025, 0x00000028,
52068baf11cSdamien 	0x00000029, 0x0000002a, 0x0000002b, 0x0000002c, 0x0000002d,
52168baf11cSdamien 	0x00000030, 0x00000031, 0x00000032, 0x00000033, 0x00000034,
52268baf11cSdamien 	0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
52368baf11cSdamien 	0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
52468baf11cSdamien 	0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
52568baf11cSdamien 	0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
52668baf11cSdamien 	0x00000035, 0x00000010, 0x0000001a, 0x00000000, 0x00000000,
52768baf11cSdamien 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
52868baf11cSdamien 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
52968baf11cSdamien 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
53068baf11cSdamien 	0x00000000, 0x0000000e, 0x00000440, 0xd03e4788, 0x012a8160,
53168baf11cSdamien 	0x40806333, 0x00106c10, 0x009c4060, 0x1883800a, 0x018830c6,
53268baf11cSdamien 	0x00000400, 0x000009b5, 0x00000000, 0x00000210, 0x3f3f3f3f,
53368baf11cSdamien 	0x3f3f3f3f, 0x13c889af, 0x38490a20, 0x00007bb6, 0x0fff3ffc,
53468baf11cSdamien 	0x00000001, 0x0000a000, 0x00000000, 0x0cc75380, 0x0f0f0f01,
53568baf11cSdamien 	0xdfa91f01, 0x00418a11, 0x00000000, 0x09249126, 0x0a1a7caa,
53668baf11cSdamien 	0x1ce739ce, 0x051701ce, 0x18010000, 0x2e032402, 0x4a0a3c06,
53768baf11cSdamien 	0x621a540b, 0x764f6c1b, 0x845b7a5a, 0x950f8ccf, 0xa5cf9b4f,
53868baf11cSdamien 	0xbddfaf1f, 0xd1ffc93f, 0x00000000, 0x00000000, 0x00000000,
53968baf11cSdamien 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
54068baf11cSdamien 	0x3fffffff, 0x3fffffff, 0x3fffffff, 0x0003ffff, 0x79a8aa1f,
54168baf11cSdamien 	0x08000000, 0x3f3f3f3f, 0x3f3f3f3f, 0x1ce739ce, 0x000001ce,
54268baf11cSdamien 	0x00000007, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
54368baf11cSdamien 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
54468baf11cSdamien 	0x00000000, 0x00000000, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f,
54568baf11cSdamien 	0x00000000, 0x1ce739ce, 0x000000c0, 0x00180a68, 0x0510001c,
54668baf11cSdamien 	0x00009b40, 0x012a8160, 0x09249126, 0x00180a68, 0x0510001c,
54768baf11cSdamien 	0x00009b40, 0x012a8160, 0x09249126, 0x0001c600, 0x004b6a8e,
54868baf11cSdamien 	0x000003ce, 0x00181400, 0x00820820, 0x066c420f, 0x0f282207,
54968baf11cSdamien 	0x17601685, 0x1f801104, 0x37a00c03, 0x3fc40883, 0x57c00803,
55068baf11cSdamien 	0x5fd80682, 0x7fe00482, 0x7f3c7bba, 0xf3307ff0
55168baf11cSdamien };
55268baf11cSdamien #endif
55368baf11cSdamien 
55468baf11cSdamien static const uint32_t ar5416_phy_vals_2ghz_20mhz[] = {
55568baf11cSdamien 	0x00000007, 0x00000300, 0x00000000, 0xad848e19, 0x7d14e000,
55668baf11cSdamien 	0x9c0a9f6b, 0x00000090, 0x00000000, 0x02020200, 0x00000e0e,
55768baf11cSdamien 	0x0a020001, 0x0000a000, 0x00000000, 0x00000e0e, 0x00000007,
55868baf11cSdamien 	0x00200400, 0x206a002e, 0x137216a4, 0x00197a68, 0x1284233c,
55968baf11cSdamien 	0x6c48b0e4, 0x00000859, 0x7ec80d2e, 0x31395c5e, 0x0004dd20,
56068baf11cSdamien 	0x409a4190, 0x050cb081, 0x00000000, 0x00000000, 0x00000000,
56168baf11cSdamien 	0x00000000, 0x00000898, 0x00000134, 0x10000fff, 0x0510001c,
56268baf11cSdamien 	0xd0058a15, 0x00000001, 0x00000004, 0x3f3f3f3f, 0x3f3f3f3f,
56368baf11cSdamien 	0x0000007f, 0xdfb81020, 0x9280b212, 0x00020028, 0x5d50e188,
56468baf11cSdamien 	0x00081fff, 0x00009b40, 0x00001120, 0x190fb515, 0x00000000,
56568baf11cSdamien 	0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
56668baf11cSdamien 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
56768baf11cSdamien 	0x00000000, 0x00000007, 0x001fff00, 0x006f00c4, 0x03051000,
56868baf11cSdamien 	0x00000820, 0x038919be, 0x06336f77, 0x60f6532c, 0x08f186c8,
56968baf11cSdamien 	0x00046384, 0x00000000, 0x00000000, 0x00000000, 0x00000200,
57068baf11cSdamien 	0x64646464, 0x3c787878, 0x000000aa, 0x00000000, 0x00001042,
57168baf11cSdamien 	0x00000000, 0x00000040, 0x00000080, 0x00000141, 0x00000181,
57268baf11cSdamien 	0x000001c1, 0x00000001, 0x00000041, 0x000001a8, 0x000001e8,
57368baf11cSdamien 	0x00000028, 0x00000068, 0x000000a8, 0x00000169, 0x000001a9,
57468baf11cSdamien 	0x000001e9, 0x00000029, 0x00000069, 0x00000190, 0x000001d0,
57568baf11cSdamien 	0x00000010, 0x00000050, 0x00000090, 0x00000151, 0x00000191,
57668baf11cSdamien 	0x000001d1, 0x00000011, 0x00000051, 0x00000198, 0x000001d8,
57768baf11cSdamien 	0x00000018, 0x00000058, 0x00000098, 0x00000159, 0x00000199,
57868baf11cSdamien 	0x000001d9, 0x00000019, 0x00000059, 0x00000099, 0x000000d9,
57968baf11cSdamien 	0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
58068baf11cSdamien 	0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
58168baf11cSdamien 	0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
58268baf11cSdamien 	0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
58368baf11cSdamien 	0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x00000000,
58468baf11cSdamien 	0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005,
58568baf11cSdamien 	0x00000008, 0x00000009, 0x0000000a, 0x0000000b, 0x0000000c,
58668baf11cSdamien 	0x0000000d, 0x00000010, 0x00000011, 0x00000012, 0x00000013,
58768baf11cSdamien 	0x00000014, 0x00000015, 0x00000018, 0x00000019, 0x0000001a,
58868baf11cSdamien 	0x0000001b, 0x0000001c, 0x0000001d, 0x00000020, 0x00000021,
58968baf11cSdamien 	0x00000022, 0x00000023, 0x00000024, 0x00000025, 0x00000028,
59068baf11cSdamien 	0x00000029, 0x0000002a, 0x0000002b, 0x0000002c, 0x0000002d,
59168baf11cSdamien 	0x00000030, 0x00000031, 0x00000032, 0x00000033, 0x00000034,
59268baf11cSdamien 	0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
59368baf11cSdamien 	0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
59468baf11cSdamien 	0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
59568baf11cSdamien 	0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
59668baf11cSdamien 	0x00000035, 0x00000010, 0x0000001a, 0x00000000, 0x00000000,
59768baf11cSdamien 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
59868baf11cSdamien 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
59968baf11cSdamien 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
60068baf11cSdamien 	0x00000000, 0x0000000e, 0x00000440, 0xd03e4788, 0x012a8160,
60168baf11cSdamien 	0x40806333, 0x00106c10, 0x009c4060, 0x1883800a, 0x018830c6,
60268baf11cSdamien 	0x00000400, 0x000009b5, 0x00000000, 0x00000108, 0x3f3f3f3f,
60368baf11cSdamien 	0x3f3f3f3f, 0x13c889af, 0x38490a20, 0x00007bb6, 0x0fff3ffc,
60468baf11cSdamien 	0x00000001, 0x0000a000, 0x00000000, 0x0cc75380, 0x0f0f0f01,
60568baf11cSdamien 	0xdfa91f01, 0x00418a11, 0x00000000, 0x09249126, 0x0a1a7caa,
60668baf11cSdamien 	0x1ce739ce, 0x051701ce, 0x18010000, 0x2e032402, 0x4a0a3c06,
60768baf11cSdamien 	0x621a540b, 0x764f6c1b, 0x845b7a5a, 0x950f8ccf, 0xa5cf9b4f,
60868baf11cSdamien 	0xbddfaf1f, 0xd1ffc93f, 0x00000000, 0x00000000, 0x00000000,
60968baf11cSdamien 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
61068baf11cSdamien 	0x3fffffff, 0x3fffffff, 0x3fffffff, 0x0003ffff, 0x79a8aa1f,
61168baf11cSdamien 	0x08000000, 0x3f3f3f3f, 0x3f3f3f3f, 0x1ce739ce, 0x000001ce,
61268baf11cSdamien 	0x00000007, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
61368baf11cSdamien 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
61468baf11cSdamien 	0x00000000, 0x00000000, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f,
61568baf11cSdamien 	0x00000000, 0x1ce739ce, 0x000000c0, 0x00180a68, 0x0510001c,
61668baf11cSdamien 	0x00009b40, 0x012a8160, 0x09249126, 0x00180a68, 0x0510001c,
61768baf11cSdamien 	0x00009b40, 0x012a8160, 0x09249126, 0x0001c600, 0x004b6a8e,
61868baf11cSdamien 	0x000003ce, 0x00181400, 0x00820820, 0x066c420f, 0x0f282207,
61968baf11cSdamien 	0x17601685, 0x1f801104, 0x37a00c03, 0x3fc40883, 0x57c00803,
62068baf11cSdamien 	0x5fd80682, 0x7fe00482, 0x7f3c7bba, 0xf3307ff0
62168baf11cSdamien };
62268baf11cSdamien 
623803f2018Sdamien /* NB: apply AR_PHY(). */
62468baf11cSdamien static const uint8_t ar5416_banks_regs[] = {
62568baf11cSdamien 	0x2c, 0x38, 0x2c, 0x3b, 0x2c, 0x38, 0x3c, 0x2c, 0x3a, 0x2c, 0x39,
62668baf11cSdamien 	0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c,
62768baf11cSdamien 	0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c,
62868baf11cSdamien 	0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c,
62968baf11cSdamien 	0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c,
63068baf11cSdamien 	0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x38, 0x2c, 0x2c,
63168baf11cSdamien 	0x2c, 0x3c
63268baf11cSdamien };
63368baf11cSdamien 
63468baf11cSdamien static const uint32_t ar5416_banks_vals_5ghz[] = {
63568baf11cSdamien 	0x1e5795e5, 0x02008020, 0x02108421, 0x00000008, 0x0e73ff17,
63668baf11cSdamien 	0x00000420, 0x01400018, 0x000001a1, 0x00000001, 0x00000013,
63768baf11cSdamien 	0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
63868baf11cSdamien 	0x00000000, 0x00004000, 0x00006c00, 0x00002c00, 0x00004800,
63968baf11cSdamien 	0x00004000, 0x00006000, 0x00001000, 0x00004000, 0x00007c00,
64068baf11cSdamien 	0x00007c00, 0x00007c00, 0x00007c00, 0x00007c00, 0x00087c00,
64168baf11cSdamien 	0x00007c00, 0x00005400, 0x00000c00, 0x00001800, 0x00007c00,
64268baf11cSdamien 	0x00006c00, 0x00006c00, 0x00007c00, 0x00002c00, 0x00003c00,
64368baf11cSdamien 	0x00003800, 0x00001c00, 0x00000800, 0x00000408, 0x00004c15,
64468baf11cSdamien 	0x00004188, 0x0000201e, 0x00010408, 0x00000801, 0x00000c08,
64568baf11cSdamien 	0x0000181e, 0x00001016, 0x00002800, 0x00004010, 0x0000081c,
64668baf11cSdamien 	0x00000115, 0x00000015, 0x00000066, 0x0000001c, 0x00000000,
64768baf11cSdamien 	0x00000004, 0x00000015, 0x0000001f, 0x00000000, 0x000000a0,
64868baf11cSdamien 	0x00000000, 0x00000040, 0x0000001c
64968baf11cSdamien };
65068baf11cSdamien 
65168baf11cSdamien static const uint32_t ar5416_banks_vals_2ghz[] = {
65268baf11cSdamien 	0x1e5795e5, 0x02008020, 0x02108421, 0x00000008, 0x0e73ff17,
65368baf11cSdamien 	0x00000420, 0x01c00018, 0x000001a1, 0x00000001, 0x00000013,
65468baf11cSdamien 	0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
65568baf11cSdamien 	0x00000000, 0x00004000, 0x00006c00, 0x00002c00, 0x00004800,
65668baf11cSdamien 	0x00004000, 0x00006000, 0x00001000, 0x00004000, 0x00007c00,
65768baf11cSdamien 	0x00007c00, 0x00007c00, 0x00007c00, 0x00007c00, 0x00087c00,
65868baf11cSdamien 	0x00007c00, 0x00005400, 0x00000c00, 0x00001800, 0x00007c00,
65968baf11cSdamien 	0x00006c00, 0x00006c00, 0x00007c00, 0x00002c00, 0x00003c00,
66068baf11cSdamien 	0x00003800, 0x00001c00, 0x00000800, 0x00000408, 0x00004c15,
66168baf11cSdamien 	0x00004188, 0x0000201e, 0x00010408, 0x00000801, 0x00000c08,
66268baf11cSdamien 	0x0000181e, 0x00001016, 0x00002800, 0x00004010, 0x0000081c,
66368baf11cSdamien 	0x00000115, 0x00000015, 0x00000066, 0x0000001c, 0x00000000,
66468baf11cSdamien 	0x00000004, 0x00000015, 0x0000001f, 0x00000400, 0x000000a0,
66568baf11cSdamien 	0x00000000, 0x00000040, 0x0000001c
66668baf11cSdamien };
66768baf11cSdamien 
66868baf11cSdamien /*
66968baf11cSdamien  * EEPROM.
67068baf11cSdamien  */
67168baf11cSdamien /* Possible flags for opCapFlags. */
67268baf11cSdamien #define AR5416_OPFLAGS_11A	0x01
67368baf11cSdamien #define AR5416_OPFLAGS_11G	0x02
67468baf11cSdamien #define AR5416_OPFLAGS_5G_HT40	0x04
67568baf11cSdamien #define AR5416_OPFLAGS_2G_HT40	0x08
67668baf11cSdamien #define AR5416_OPFLAGS_5G_HT20	0x10
67768baf11cSdamien #define AR5416_OPFLAGS_2G_HT20	0x20
67868baf11cSdamien 
67968baf11cSdamien #define AR5416_NUM_5G_CAL_PIERS		8
68068baf11cSdamien #define AR5416_NUM_2G_CAL_PIERS		4
68168baf11cSdamien #define AR5416_NUM_5G_20_TARGET_POWERS	8
68268baf11cSdamien #define AR5416_NUM_5G_40_TARGET_POWERS	8
68368baf11cSdamien #define AR5416_NUM_2G_CCK_TARGET_POWERS	3
68468baf11cSdamien #define AR5416_NUM_2G_20_TARGET_POWERS	4
68568baf11cSdamien #define AR5416_NUM_2G_40_TARGET_POWERS	4
68668baf11cSdamien #define AR5416_NUM_CTLS			24
68768baf11cSdamien #define AR5416_NUM_BAND_EDGES		8
68868baf11cSdamien #define AR5416_NUM_PD_GAINS		4
68968baf11cSdamien #define AR5416_PD_GAIN_ICEPTS		5
69068baf11cSdamien #define AR5416_EEPROM_MODAL_SPURS	5
69168baf11cSdamien #define AR5416_MAX_CHAINS		2
69268baf11cSdamien 
693ab0b1be7Smglocker struct BaseEepHeader {
69468baf11cSdamien 	uint16_t	length;
69568baf11cSdamien 	uint16_t	checksum;
69668baf11cSdamien 	uint16_t	version;
69768baf11cSdamien 	uint8_t		opCapFlags;
69868baf11cSdamien 	uint8_t		eepMisc;
69968baf11cSdamien 	uint16_t	regDmn[2];
70068baf11cSdamien 	uint8_t		macAddr[6];
70168baf11cSdamien 	uint8_t		rxMask;
70268baf11cSdamien 	uint8_t		txMask;
70368baf11cSdamien 	uint16_t	rfSilent;
70468baf11cSdamien 	uint16_t	blueToothOptions;
70568baf11cSdamien 	uint16_t	deviceCap;
70668baf11cSdamien 	uint32_t	binBuildNumber;
70768baf11cSdamien 	uint8_t		deviceType;
70868baf11cSdamien 	uint8_t		futureBase[33];
709ab0b1be7Smglocker } __packed;
71068baf11cSdamien 
711ab0b1be7Smglocker struct spurChanStruct {
71268baf11cSdamien 	uint16_t	spurChan;
71368baf11cSdamien 	uint8_t		spurRangeLow;
71468baf11cSdamien 	uint8_t		spurRangeHigh;
715ab0b1be7Smglocker } __packed;
71668baf11cSdamien 
717ab0b1be7Smglocker struct ModalEepHeader {
71868baf11cSdamien 	uint32_t	antCtrlChain[AR5416_MAX_CHAINS];
71968baf11cSdamien 	uint32_t	antCtrlCommon;
72068baf11cSdamien 	int8_t		antennaGainCh[AR5416_MAX_CHAINS];
72168baf11cSdamien 	uint8_t		switchSettling;
72268baf11cSdamien 	uint8_t		txRxAttenCh[AR5416_MAX_CHAINS];
72368baf11cSdamien 	uint8_t		rxTxMarginCh[AR5416_MAX_CHAINS];
72468baf11cSdamien 	uint8_t		adcDesiredSize;
72568baf11cSdamien 	int8_t		pgaDesiredSize;
72668baf11cSdamien 	uint8_t		xlnaGainCh[AR5416_MAX_CHAINS];
72768baf11cSdamien 	uint8_t		txEndToXpaOff;
72868baf11cSdamien 	uint8_t		txEndToRxOn;
72968baf11cSdamien 	uint8_t		txFrameToXpaOn;
73068baf11cSdamien 	uint8_t		thresh62;
73168baf11cSdamien 	uint8_t		noiseFloorThreshCh[AR5416_MAX_CHAINS];
73268baf11cSdamien 	uint8_t		xpdGain;
73368baf11cSdamien 	uint8_t		xpd;
73468baf11cSdamien 	int8_t		iqCalICh[AR5416_MAX_CHAINS];
73568baf11cSdamien 	int8_t		iqCalQCh[AR5416_MAX_CHAINS];
73668baf11cSdamien 	uint8_t		pdGainOverlap;
73768baf11cSdamien 	uint8_t		ob;
73868baf11cSdamien 	uint8_t		db;
73968baf11cSdamien 	uint8_t		xpaBiasLvl;
74068baf11cSdamien 	uint8_t		pwrDecreaseFor2Chain;
74168baf11cSdamien 	uint8_t		pwrDecreaseFor3Chain;
74268baf11cSdamien 	uint8_t		txFrameToDataStart;
74368baf11cSdamien 	uint8_t		txFrameToPaOn;
74468baf11cSdamien 	uint8_t		ht40PowerIncForPdadc;
74568baf11cSdamien 	uint8_t		bswAtten[AR5416_MAX_CHAINS];
74668baf11cSdamien 	uint8_t		bswMargin[AR5416_MAX_CHAINS];
74768baf11cSdamien 	uint8_t		swSettleHt40;
74868baf11cSdamien 	uint8_t		futureModal[22];
749ab0b1be7Smglocker 	struct spurChanStruct spurChans[AR5416_EEPROM_MODAL_SPURS];
750ab0b1be7Smglocker } __packed;
75168baf11cSdamien 
752ab0b1be7Smglocker struct calDataPerFreq {
75368baf11cSdamien 	uint8_t		pwrPdg[AR5416_NUM_PD_GAINS][AR5416_PD_GAIN_ICEPTS];
75468baf11cSdamien 	uint8_t		vpdPdg[AR5416_NUM_PD_GAINS][AR5416_PD_GAIN_ICEPTS];
755ab0b1be7Smglocker } __packed;
75668baf11cSdamien 
757ab0b1be7Smglocker struct CalTargetPowerLegacy {
75868baf11cSdamien 	uint8_t		bChannel;
75968baf11cSdamien 	uint8_t		tPow2x[4];
760ab0b1be7Smglocker } __packed;
76168baf11cSdamien 
762ab0b1be7Smglocker struct CalTargetPowerHt {
76368baf11cSdamien 	uint8_t		bChannel;
76468baf11cSdamien 	uint8_t		tPow2x[8];
765ab0b1be7Smglocker } __packed;
76668baf11cSdamien 
767ab0b1be7Smglocker struct CalCtlEdges {
76868baf11cSdamien 	uint8_t		bChannel;
76968baf11cSdamien 	uint8_t		tPowerFlag;
770ab0b1be7Smglocker } __packed;
77168baf11cSdamien 
772ab0b1be7Smglocker struct CalCtlData {
773ab0b1be7Smglocker 	struct CalCtlEdges ctlEdges[AR5416_MAX_CHAINS][AR5416_NUM_BAND_EDGES];
774ab0b1be7Smglocker } __packed;
77568baf11cSdamien 
776ab0b1be7Smglocker struct ar5416eeprom {
777ab0b1be7Smglocker 	struct BaseEepHeader	baseEepHeader;
77868baf11cSdamien 	uint8_t			custData[64];
779ab0b1be7Smglocker 	struct ModalEepHeader	modalHeader[2];
78068baf11cSdamien 	uint8_t			calFreqPier5G[AR5416_NUM_5G_CAL_PIERS];
78168baf11cSdamien 	uint8_t			calFreqPier2G[AR5416_NUM_2G_CAL_PIERS];
782ab0b1be7Smglocker 	struct calDataPerFreq	calPierData5G[AR5416_MAX_CHAINS]
78368baf11cSdamien 					     [AR5416_NUM_5G_CAL_PIERS];
784ab0b1be7Smglocker 	struct calDataPerFreq	calPierData2G[AR5416_MAX_CHAINS]
78568baf11cSdamien 					     [AR5416_NUM_2G_CAL_PIERS];
786ab0b1be7Smglocker 	struct CalTargetPowerLegacy calTPow5G[AR5416_NUM_5G_20_TARGET_POWERS];
787ab0b1be7Smglocker 	struct CalTargetPowerHt calTPow5GHT20[AR5416_NUM_5G_20_TARGET_POWERS];
788ab0b1be7Smglocker 	struct CalTargetPowerHt calTPow5GHT40[AR5416_NUM_5G_40_TARGET_POWERS];
789ab0b1be7Smglocker 	struct CalTargetPowerLegacy calTPowCck[AR5416_NUM_2G_CCK_TARGET_POWERS];
790ab0b1be7Smglocker 	struct CalTargetPowerLegacy calTPow2G[AR5416_NUM_2G_20_TARGET_POWERS];
791ab0b1be7Smglocker 	struct CalTargetPowerHt calTPow2GHT20[AR5416_NUM_2G_20_TARGET_POWERS];
792ab0b1be7Smglocker 	struct CalTargetPowerHt calTPow2GHT40[AR5416_NUM_2G_40_TARGET_POWERS];
79368baf11cSdamien 	uint8_t			ctlIndex[AR5416_NUM_CTLS];
794ab0b1be7Smglocker 	struct CalCtlData	ctlData[AR5416_NUM_CTLS];
79568baf11cSdamien 	uint8_t			padding;
796ab0b1be7Smglocker } __packed;
79768baf11cSdamien 
79868baf11cSdamien 
79968baf11cSdamien #define OTUS_TX_DATA_LIST_COUNT	8
80068baf11cSdamien #define OTUS_RX_DATA_LIST_COUNT	1
80168baf11cSdamien 
80268baf11cSdamien #define OTUS_CMD_TIMEOUT	1000
80368baf11cSdamien #define OTUS_TX_TIMEOUT		1000
80468baf11cSdamien 
80568baf11cSdamien #define OTUS_UID(aid)		(IEEE80211_AID(aid) + 4)
80668baf11cSdamien 
80768baf11cSdamien #define OTUS_MAX_TXCMDSZ	64
80868baf11cSdamien #define OTUS_RXBUFSZ		(8 * 1024)
80968baf11cSdamien #define OTUS_TXBUFSZ		(4 * 1024)
81068baf11cSdamien 
811d7d7f774Sdamien /* Default EDCA parameters for when QoS is disabled. */
812d7d7f774Sdamien static const struct ieee80211_edca_ac_params otus_edca_def[EDCA_NUM_AC] = {
813d7d7f774Sdamien 	{ 4, 10, 3,  0 },
814d7d7f774Sdamien 	{ 4, 10, 7,  0 },
815d7d7f774Sdamien 	{ 3,  4, 2, 94 },
816d7d7f774Sdamien 	{ 2,  3, 2, 47 }
817d7d7f774Sdamien };
818d7d7f774Sdamien 
81968baf11cSdamien #define OTUS_RIDX_CCK1		 0
82068baf11cSdamien #define OTUS_RIDX_OFDM6		 4
82168baf11cSdamien #define OTUS_RIDX_OFDM24	 8
82268baf11cSdamien #define OTUS_RIDX_MAX		11
82368baf11cSdamien static const struct otus_rate {
82468baf11cSdamien 	uint8_t	rate;
82568baf11cSdamien 	uint8_t	mcs;
82668baf11cSdamien } otus_rates[] = {
82768baf11cSdamien 	{   2, 0x0 },
82868baf11cSdamien 	{   4, 0x1 },
82968baf11cSdamien 	{  11, 0x2 },
83068baf11cSdamien 	{  22, 0x3 },
83168baf11cSdamien 	{  12, 0xb },
83268baf11cSdamien 	{  18, 0xf },
83368baf11cSdamien 	{  24, 0xa },
83468baf11cSdamien 	{  36, 0xe },
83568baf11cSdamien 	{  48, 0x9 },
83668baf11cSdamien 	{  72, 0xd },
83768baf11cSdamien 	{  96, 0x8 },
83868baf11cSdamien 	{ 108, 0xc }
83968baf11cSdamien };
84068baf11cSdamien 
84168baf11cSdamien struct otus_rx_radiotap_header {
84268baf11cSdamien 	struct ieee80211_radiotap_header wr_ihdr;
84368baf11cSdamien 	uint8_t		wr_flags;
84468baf11cSdamien 	uint8_t		wr_rate;
84568baf11cSdamien 	uint16_t	wr_chan_freq;
84668baf11cSdamien 	uint16_t	wr_chan_flags;
84768baf11cSdamien 	uint8_t		wr_antsignal;
84868baf11cSdamien } __packed;
84968baf11cSdamien 
85068baf11cSdamien #define OTUS_RX_RADIOTAP_PRESENT			\
85168baf11cSdamien 	(1 << IEEE80211_RADIOTAP_FLAGS |		\
85268baf11cSdamien 	 1 << IEEE80211_RADIOTAP_RATE |			\
85368baf11cSdamien 	 1 << IEEE80211_RADIOTAP_CHANNEL |		\
85468baf11cSdamien 	 1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL)
85568baf11cSdamien 
85668baf11cSdamien struct otus_tx_radiotap_header {
85768baf11cSdamien 	struct ieee80211_radiotap_header wt_ihdr;
85868baf11cSdamien 	uint8_t		wt_flags;
85968baf11cSdamien 	uint8_t		wt_rate;
86068baf11cSdamien 	uint16_t	wt_chan_freq;
86168baf11cSdamien 	uint16_t	wt_chan_flags;
86268baf11cSdamien } __packed;
86368baf11cSdamien 
86468baf11cSdamien #define OTUS_TX_RADIOTAP_PRESENT			\
86568baf11cSdamien 	(1 << IEEE80211_RADIOTAP_FLAGS |		\
86668baf11cSdamien 	 1 << IEEE80211_RADIOTAP_RATE |			\
86768baf11cSdamien 	 1 << IEEE80211_RADIOTAP_CHANNEL)
86868baf11cSdamien 
86968baf11cSdamien struct otus_softc;
87068baf11cSdamien 
87168baf11cSdamien struct otus_tx_cmd {
872ab0b1be7Smglocker 	struct usbd_xfer	*xfer;
87368baf11cSdamien 	uint8_t			*buf;
87468baf11cSdamien 	void			*odata;
87568baf11cSdamien 	uint16_t		token;
87668baf11cSdamien 	uint8_t			done;
87768baf11cSdamien };
87868baf11cSdamien 
87968baf11cSdamien struct otus_rx_data {
88068baf11cSdamien 	struct otus_softc	*sc;
881ab0b1be7Smglocker 	struct usbd_xfer	*xfer;
88268baf11cSdamien 	uint8_t			*buf;
88368baf11cSdamien };
88468baf11cSdamien 
88568baf11cSdamien struct otus_tx_data {
88668baf11cSdamien 	struct otus_softc	*sc;
887ab0b1be7Smglocker 	struct usbd_xfer	*xfer;
88868baf11cSdamien 	uint8_t			*buf;
88968baf11cSdamien };
89068baf11cSdamien 
89168baf11cSdamien struct otus_host_cmd {
89268baf11cSdamien 	void	(*cb)(struct otus_softc *, void *);
89368baf11cSdamien 	uint8_t	data[256];
89468baf11cSdamien };
89568baf11cSdamien 
89668baf11cSdamien #define OTUS_HOST_CMD_RING_COUNT	32
89768baf11cSdamien struct otus_host_cmd_ring {
89868baf11cSdamien 	struct otus_host_cmd	cmd[OTUS_HOST_CMD_RING_COUNT];
89968baf11cSdamien 	int			cur;
90068baf11cSdamien 	int			next;
90168baf11cSdamien 	int			queued;
90268baf11cSdamien };
90368baf11cSdamien 
90468baf11cSdamien struct otus_node {
90568baf11cSdamien 	struct ieee80211_node		ni;
90668baf11cSdamien 	struct ieee80211_amrr_node	amn;
90768baf11cSdamien 	uint8_t				ridx[IEEE80211_RATE_MAXSIZE];
90868baf11cSdamien };
90968baf11cSdamien 
91068baf11cSdamien struct otus_cmd_newstate {
91168baf11cSdamien 	enum ieee80211_state	state;
91268baf11cSdamien 	int			arg;
91368baf11cSdamien };
91468baf11cSdamien 
91568baf11cSdamien struct otus_cmd_key {
91668baf11cSdamien 	struct ieee80211_key	key;
91768baf11cSdamien 	uint16_t		associd;
91868baf11cSdamien };
91968baf11cSdamien 
92068baf11cSdamien struct otus_softc {
92168baf11cSdamien 	struct device			sc_dev;
92268baf11cSdamien 	struct ieee80211com		sc_ic;
92368baf11cSdamien 	int				(*sc_newstate)(struct ieee80211com *,
92468baf11cSdamien 					    enum ieee80211_state, int);
92568baf11cSdamien 	void				(*sc_led_newstate)(struct otus_softc *);
92668baf11cSdamien 
927ab0b1be7Smglocker 	struct usbd_device		*sc_udev;
928ab0b1be7Smglocker 	struct usbd_interface		*sc_iface;
92968baf11cSdamien 
93068baf11cSdamien 	struct ar5416eeprom		eeprom;
9316e30e88dSdamien 	uint8_t				capflags;
932803f2018Sdamien 	uint8_t				rxmask;
933803f2018Sdamien 	uint8_t				txmask;
93468baf11cSdamien 
935ab0b1be7Smglocker 	struct usbd_pipe		*data_tx_pipe;
936ab0b1be7Smglocker 	struct usbd_pipe		*data_rx_pipe;
937ab0b1be7Smglocker 	struct usbd_pipe		*cmd_tx_pipe;
938ab0b1be7Smglocker 	struct usbd_pipe		*cmd_rx_pipe;
93968baf11cSdamien 	uint8_t 			*ibuf;
94068baf11cSdamien 
94168baf11cSdamien 	int				sc_if_flags;
94268baf11cSdamien 	int				sc_tx_timer;
94368baf11cSdamien 	int				fixed_ridx;
9446e30e88dSdamien 	int				bb_reset;
94568baf11cSdamien 
94668baf11cSdamien 	struct ieee80211_channel	*sc_curchan;
94768baf11cSdamien 
94868baf11cSdamien 	struct usb_task			sc_task;
94968baf11cSdamien 	struct timeout			scan_to;
95068baf11cSdamien 	struct timeout			calib_to;
95168baf11cSdamien 	struct ieee80211_amrr		amrr;
95268baf11cSdamien 
95368baf11cSdamien 	int				write_idx;
95468baf11cSdamien 	int				tx_cur;
95568baf11cSdamien 	int				tx_queued;
95668baf11cSdamien 	uint32_t			led_state;
95768baf11cSdamien 
95868baf11cSdamien 	const uint32_t			*phy_vals;
95968baf11cSdamien 
96068baf11cSdamien 	struct {
96168baf11cSdamien 		uint32_t	reg;
96268baf11cSdamien 		uint32_t	val;
96368baf11cSdamien 	} __packed			write_buf[AR_MAX_WRITE_IDX + 1];
96468baf11cSdamien 
96568baf11cSdamien 	struct otus_host_cmd_ring	cmdq;
96668baf11cSdamien 	struct otus_tx_cmd		tx_cmd;
96768baf11cSdamien 	struct otus_tx_data		tx_data[OTUS_TX_DATA_LIST_COUNT];
96868baf11cSdamien 	struct otus_rx_data		rx_data[OTUS_RX_DATA_LIST_COUNT];
96968baf11cSdamien 
97068baf11cSdamien #if NBPFILTER > 0
97168baf11cSdamien 	caddr_t				sc_drvbpf;
97268baf11cSdamien 
97368baf11cSdamien 	union {
97468baf11cSdamien 		struct otus_rx_radiotap_header th;
97568baf11cSdamien 		uint8_t	pad[64];
97668baf11cSdamien 	}				sc_rxtapu;
97768baf11cSdamien #define sc_rxtap	sc_rxtapu.th
97868baf11cSdamien 	int				sc_rxtap_len;
97968baf11cSdamien 
98068baf11cSdamien 	union {
98168baf11cSdamien 		struct otus_tx_radiotap_header th;
98268baf11cSdamien 		uint8_t	pad[64];
98368baf11cSdamien 	}				sc_txtapu;
98468baf11cSdamien #define sc_txtap	sc_txtapu.th
98568baf11cSdamien 	int				sc_txtap_len;
98668baf11cSdamien #endif
98768baf11cSdamien };
988