xref: /dflybsd-src/sys/dev/netif/wpi/if_wpireg.h (revision d0c50e914fb6f2af41b6f9468dfc18983fc20d2c)
1*d0c50e91SJohannes Hofmann /*	$FreeBSD$	*/
24db7dd1bSJoe Talbott 
34db7dd1bSJoe Talbott /*-
44db7dd1bSJoe Talbott  * Copyright (c) 2006,2007
54db7dd1bSJoe Talbott  *	Damien Bergamini <damien.bergamini@free.fr>
64db7dd1bSJoe Talbott  *
74db7dd1bSJoe Talbott  * Permission to use, copy, modify, and distribute this software for any
84db7dd1bSJoe Talbott  * purpose with or without fee is hereby granted, provided that the above
94db7dd1bSJoe Talbott  * copyright notice and this permission notice appear in all copies.
104db7dd1bSJoe Talbott  *
114db7dd1bSJoe Talbott  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
124db7dd1bSJoe Talbott  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
134db7dd1bSJoe Talbott  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
144db7dd1bSJoe Talbott  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
154db7dd1bSJoe Talbott  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
164db7dd1bSJoe Talbott  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
174db7dd1bSJoe Talbott  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
184db7dd1bSJoe Talbott  */
194db7dd1bSJoe Talbott 
204db7dd1bSJoe Talbott #define WPI_TX_RING_COUNT	256
214db7dd1bSJoe Talbott #define WPI_CMD_RING_COUNT	256
224db7dd1bSJoe Talbott #define WPI_RX_RING_COUNT	64
234db7dd1bSJoe Talbott 
244db7dd1bSJoe Talbott /*
254db7dd1bSJoe Talbott  * Rings must be aligned on a 16K boundary.
264db7dd1bSJoe Talbott  */
274db7dd1bSJoe Talbott #define WPI_RING_DMA_ALIGN	0x4000
284db7dd1bSJoe Talbott 
294db7dd1bSJoe Talbott /* maximum scatter/gather */
304db7dd1bSJoe Talbott #define WPI_MAX_SCATTER	4
314db7dd1bSJoe Talbott 
324db7dd1bSJoe Talbott /* maximum Rx buffer size */
334db7dd1bSJoe Talbott #define WPI_RBUF_SIZE ( 3 * 1024 ) /* XXX 3000 but must be aligned */
344db7dd1bSJoe Talbott 
354db7dd1bSJoe Talbott /*
364db7dd1bSJoe Talbott  * Control and status registers.
374db7dd1bSJoe Talbott  */
384db7dd1bSJoe Talbott #define WPI_HWCONFIG		0x000
394db7dd1bSJoe Talbott #define WPI_INTR		0x008
404db7dd1bSJoe Talbott #define WPI_MASK		0x00c
414db7dd1bSJoe Talbott #define WPI_INTR_STATUS		0x010
424db7dd1bSJoe Talbott #define WPI_GPIO_STATUS		0x018
434db7dd1bSJoe Talbott #define WPI_RESET		0x020
444db7dd1bSJoe Talbott #define WPI_GPIO_CTL		0x024
454db7dd1bSJoe Talbott #define WPI_EEPROM_CTL		0x02c
464db7dd1bSJoe Talbott #define WPI_EEPROM_STATUS	0x030
474db7dd1bSJoe Talbott #define WPI_UCODE_SET		0x058
484db7dd1bSJoe Talbott #define WPI_UCODE_CLR		0x05c
494db7dd1bSJoe Talbott #define WPI_TEMPERATURE		0x060
504db7dd1bSJoe Talbott #define WPI_CHICKEN		0x100
514db7dd1bSJoe Talbott #define WPI_PLL_CTL		0x20c
524db7dd1bSJoe Talbott #define WPI_WRITE_MEM_ADDR	0x444
534db7dd1bSJoe Talbott #define WPI_READ_MEM_ADDR	0x448
544db7dd1bSJoe Talbott #define WPI_WRITE_MEM_DATA	0x44c
554db7dd1bSJoe Talbott #define WPI_READ_MEM_DATA	0x450
564db7dd1bSJoe Talbott #define WPI_TX_WIDX		0x460
574db7dd1bSJoe Talbott #define WPI_TX_CTL(qid)		(0x940 + (qid) * 8)
584db7dd1bSJoe Talbott #define WPI_TX_BASE(qid)	(0x944 + (qid) * 8)
594db7dd1bSJoe Talbott #define WPI_TX_DESC(qid)	(0x980 + (qid) * 80)
604db7dd1bSJoe Talbott #define WPI_RX_CONFIG		0xc00
614db7dd1bSJoe Talbott #define WPI_RX_BASE		0xc04
624db7dd1bSJoe Talbott #define WPI_RX_WIDX		0xc20
634db7dd1bSJoe Talbott #define WPI_RX_RIDX_PTR		0xc24
644db7dd1bSJoe Talbott #define WPI_RX_CTL		0xcc0
654db7dd1bSJoe Talbott #define WPI_RX_STATUS		0xcc4
664db7dd1bSJoe Talbott #define WPI_TX_CONFIG(qid)	(0xd00 + (qid) * 32)
674db7dd1bSJoe Talbott #define WPI_TX_CREDIT(qid)	(0xd04 + (qid) * 32)
684db7dd1bSJoe Talbott #define WPI_TX_STATE(qid)	(0xd08 + (qid) * 32)
694db7dd1bSJoe Talbott #define WPI_TX_BASE_PTR		0xe80
704db7dd1bSJoe Talbott #define WPI_MSG_CONFIG		0xe88
714db7dd1bSJoe Talbott #define WPI_TX_STATUS		0xe90
724db7dd1bSJoe Talbott 
734db7dd1bSJoe Talbott 
744db7dd1bSJoe Talbott /*
754db7dd1bSJoe Talbott  * NIC internal memory offsets.
764db7dd1bSJoe Talbott  */
774db7dd1bSJoe Talbott #define WPI_MEM_MODE		0x2e00
784db7dd1bSJoe Talbott #define WPI_MEM_RA		0x2e04
794db7dd1bSJoe Talbott #define WPI_MEM_TXCFG		0x2e10
804db7dd1bSJoe Talbott #define WPI_MEM_MAGIC4		0x2e14
814db7dd1bSJoe Talbott #define WPI_MEM_MAGIC5		0x2e20
824db7dd1bSJoe Talbott #define WPI_MEM_BYPASS1		0x2e2c
834db7dd1bSJoe Talbott #define WPI_MEM_BYPASS2		0x2e30
844db7dd1bSJoe Talbott #define WPI_MEM_CLOCK1		0x3004
854db7dd1bSJoe Talbott #define WPI_MEM_CLOCK2		0x3008
864db7dd1bSJoe Talbott #define WPI_MEM_POWER		0x300c
874db7dd1bSJoe Talbott #define WPI_MEM_PCIDEV		0x3010
884db7dd1bSJoe Talbott #define WPI_MEM_HW_RADIO_OFF	0x3014
894db7dd1bSJoe Talbott #define WPI_MEM_UCODE_CTL	0x3400
904db7dd1bSJoe Talbott #define WPI_MEM_UCODE_SRC	0x3404
914db7dd1bSJoe Talbott #define WPI_MEM_UCODE_DST	0x3408
924db7dd1bSJoe Talbott #define WPI_MEM_UCODE_SIZE	0x340c
934db7dd1bSJoe Talbott #define WPI_MEM_UCODE_BASE	0x3800
944db7dd1bSJoe Talbott 
954db7dd1bSJoe Talbott #define WPI_MEM_TEXT_BASE	0x3490
964db7dd1bSJoe Talbott #define WPI_MEM_TEXT_SIZE	0x3494
974db7dd1bSJoe Talbott #define WPI_MEM_DATA_BASE	0x3498
984db7dd1bSJoe Talbott #define WPI_MEM_DATA_SIZE	0x349c
994db7dd1bSJoe Talbott 
1004db7dd1bSJoe Talbott 
1014db7dd1bSJoe Talbott /* possible flags for register WPI_HWCONFIG */
1024db7dd1bSJoe Talbott #define WPI_HW_ALM_MB	(1 << 8)
1034db7dd1bSJoe Talbott #define WPI_HW_ALM_MM	(1 << 9)
1044db7dd1bSJoe Talbott #define WPI_HW_SKU_MRC	(1 << 10)
1054db7dd1bSJoe Talbott #define WPI_HW_REV_D	(1 << 11)
1064db7dd1bSJoe Talbott #define WPI_HW_TYPE_B	(1 << 12)
1074db7dd1bSJoe Talbott 
1084db7dd1bSJoe Talbott /* possible flags for registers WPI_READ_MEM_ADDR/WPI_WRITE_MEM_ADDR */
1094db7dd1bSJoe Talbott #define WPI_MEM_4	((sizeof (uint32_t) - 1) << 24)
1104db7dd1bSJoe Talbott 
1114db7dd1bSJoe Talbott /* possible values for WPI_MEM_UCODE_DST */
1124db7dd1bSJoe Talbott #define WPI_FW_TEXT	0x00000000
1134db7dd1bSJoe Talbott 
1144db7dd1bSJoe Talbott /* possible flags for WPI_GPIO_STATUS */
1154db7dd1bSJoe Talbott #define WPI_POWERED		(1 << 9)
1164db7dd1bSJoe Talbott 
1174db7dd1bSJoe Talbott /* possible flags for register WPI_RESET */
1184db7dd1bSJoe Talbott #define WPI_NEVO_RESET		(1 << 0)
1194db7dd1bSJoe Talbott #define WPI_SW_RESET		(1 << 7)
1204db7dd1bSJoe Talbott #define WPI_MASTER_DISABLED	(1 << 8)
1214db7dd1bSJoe Talbott #define WPI_STOP_MASTER		(1 << 9)
1224db7dd1bSJoe Talbott 
1234db7dd1bSJoe Talbott /* possible flags for register WPI_GPIO_CTL */
1244db7dd1bSJoe Talbott #define WPI_GPIO_CLOCK		(1 << 0)
1254db7dd1bSJoe Talbott #define WPI_GPIO_INIT		(1 << 2)
1264db7dd1bSJoe Talbott #define WPI_GPIO_MAC		(1 << 3)
1274db7dd1bSJoe Talbott #define WPI_GPIO_SLEEP		(1 << 4)
1284db7dd1bSJoe Talbott #define WPI_GPIO_PWR_STATUS	0x07000000
1294db7dd1bSJoe Talbott #define WPI_GPIO_PWR_SLEEP	(4 << 24)
1304db7dd1bSJoe Talbott 
1314db7dd1bSJoe Talbott /* possible flags for register WPI_CHICKEN */
1324db7dd1bSJoe Talbott #define WPI_CHICKEN_RXNOLOS	(1 << 23)
1334db7dd1bSJoe Talbott 
1344db7dd1bSJoe Talbott /* possible flags for register WPI_PLL_CTL */
1354db7dd1bSJoe Talbott #define WPI_PLL_INIT		(1 << 24)
1364db7dd1bSJoe Talbott 
1374db7dd1bSJoe Talbott /* possible flags for register WPI_UCODE_CLR */
1384db7dd1bSJoe Talbott #define WPI_RADIO_OFF		(1 << 1)
1394db7dd1bSJoe Talbott #define WPI_DISABLE_CMD		(1 << 2)
1404db7dd1bSJoe Talbott 
1414db7dd1bSJoe Talbott /* possible flags for WPI_RX_STATUS */
1424db7dd1bSJoe Talbott #define	WPI_RX_IDLE	(1 << 24)
1434db7dd1bSJoe Talbott 
1444db7dd1bSJoe Talbott /* possible flags for register WPI_UC_CTL */
1454db7dd1bSJoe Talbott #define WPI_UC_ENABLE	(1 << 30)
146*d0c50e91SJohannes Hofmann #define WPI_UC_RUN	(1U << 31)
1474db7dd1bSJoe Talbott 
1484db7dd1bSJoe Talbott /* possible flags for register WPI_INTR_CSR */
1494db7dd1bSJoe Talbott #define WPI_ALIVE_INTR	(1 << 0)
1504db7dd1bSJoe Talbott #define WPI_WAKEUP_INTR	(1 << 1)
1514db7dd1bSJoe Talbott #define WPI_SW_ERROR	(1 << 25)
1524db7dd1bSJoe Talbott #define WPI_TX_INTR	(1 << 27)
1534db7dd1bSJoe Talbott #define WPI_HW_ERROR	(1 << 29)
154*d0c50e91SJohannes Hofmann #define WPI_RX_INTR	(1U << 31)
1554db7dd1bSJoe Talbott 
1564db7dd1bSJoe Talbott #define WPI_INTR_MASK							\
1574db7dd1bSJoe Talbott 	(WPI_SW_ERROR | WPI_HW_ERROR | WPI_TX_INTR | WPI_RX_INTR |	\
1584db7dd1bSJoe Talbott 	 WPI_ALIVE_INTR | WPI_WAKEUP_INTR)
1594db7dd1bSJoe Talbott 
1604db7dd1bSJoe Talbott /* possible flags for register WPI_TX_STATUS */
1614db7dd1bSJoe Talbott #define WPI_TX_IDLE(qid)	(1 << ((qid) + 24) | 1 << ((qid) + 16))
1624db7dd1bSJoe Talbott 
1634db7dd1bSJoe Talbott /* possible flags for register WPI_EEPROM_CTL */
1644db7dd1bSJoe Talbott #define WPI_EEPROM_READY	(1 << 0)
1654db7dd1bSJoe Talbott 
1664db7dd1bSJoe Talbott /* possible flags for register WPI_EEPROM_STATUS */
1674db7dd1bSJoe Talbott #define WPI_EEPROM_VERSION	0x00000007
1684db7dd1bSJoe Talbott #define WPI_EEPROM_LOCKED	0x00000180
1694db7dd1bSJoe Talbott 
1704db7dd1bSJoe Talbott 
1714db7dd1bSJoe Talbott struct wpi_shared {
1724db7dd1bSJoe Talbott 	uint32_t	txbase[8];
1734db7dd1bSJoe Talbott 	uint32_t	next;
1744db7dd1bSJoe Talbott 	uint32_t	reserved[2];
1754db7dd1bSJoe Talbott } __packed;
1764db7dd1bSJoe Talbott 
1774db7dd1bSJoe Talbott #define WPI_MAX_SEG_LEN	65520
1784db7dd1bSJoe Talbott struct wpi_tx_desc {
1794db7dd1bSJoe Talbott 	uint32_t	flags;
1804db7dd1bSJoe Talbott #define WPI_PAD32(x)	(roundup2(x, 4) - (x))
1814db7dd1bSJoe Talbott 
1824db7dd1bSJoe Talbott 	struct {
1834db7dd1bSJoe Talbott 		uint32_t	addr;
1844db7dd1bSJoe Talbott 		uint32_t	len;
1854db7dd1bSJoe Talbott 	} __attribute__((__packed__))	segs[WPI_MAX_SCATTER];
1864db7dd1bSJoe Talbott 	uint8_t		reserved[28];
1874db7dd1bSJoe Talbott } __packed;
1884db7dd1bSJoe Talbott 
1894db7dd1bSJoe Talbott struct wpi_tx_stat {
1904db7dd1bSJoe Talbott 	uint8_t		nrts;
1914db7dd1bSJoe Talbott 	uint8_t		ntries;
1924db7dd1bSJoe Talbott 	uint8_t		nkill;
1934db7dd1bSJoe Talbott 	uint8_t		rate;
1944db7dd1bSJoe Talbott 	uint32_t	duration;
1954db7dd1bSJoe Talbott 	uint32_t	status;
1964db7dd1bSJoe Talbott } __packed;
1974db7dd1bSJoe Talbott 
1984db7dd1bSJoe Talbott struct wpi_rx_desc {
1994db7dd1bSJoe Talbott 	uint32_t	len;
2004db7dd1bSJoe Talbott 	uint8_t		type;
2014db7dd1bSJoe Talbott #define WPI_UC_READY		  1
2024db7dd1bSJoe Talbott #define WPI_RX_DONE		 27
2034db7dd1bSJoe Talbott #define WPI_TX_DONE		 28
2044db7dd1bSJoe Talbott #define WPI_START_SCAN		130
2054db7dd1bSJoe Talbott #define WPI_SCAN_RESULTS	131
2064db7dd1bSJoe Talbott #define WPI_STOP_SCAN		132
2074db7dd1bSJoe Talbott #define WPI_STATE_CHANGED	161
2084db7dd1bSJoe Talbott #define WPI_MISSED_BEACON	162
2094db7dd1bSJoe Talbott 
2104db7dd1bSJoe Talbott 	uint8_t		flags;
2114db7dd1bSJoe Talbott 	uint8_t		idx;
2124db7dd1bSJoe Talbott 	uint8_t		qid;
2134db7dd1bSJoe Talbott } __packed;
2144db7dd1bSJoe Talbott 
2154db7dd1bSJoe Talbott struct wpi_rx_stat {
2164db7dd1bSJoe Talbott 	uint8_t		len;
2174db7dd1bSJoe Talbott #define WPI_STAT_MAXLEN	20
2184db7dd1bSJoe Talbott 
2194db7dd1bSJoe Talbott 	uint8_t		id;
2204db7dd1bSJoe Talbott 	uint8_t		rssi;	/* received signal strength */
2214db7dd1bSJoe Talbott #define WPI_RSSI_OFFSET	95
2224db7dd1bSJoe Talbott 
2234db7dd1bSJoe Talbott 	uint8_t		agc;	/* access gain control */
2244db7dd1bSJoe Talbott 	uint16_t	signal;
2254db7dd1bSJoe Talbott 	uint16_t	noise;
2264db7dd1bSJoe Talbott } __packed;
2274db7dd1bSJoe Talbott 
2284db7dd1bSJoe Talbott struct wpi_rx_head {
2294db7dd1bSJoe Talbott 	uint16_t	chan;
2304db7dd1bSJoe Talbott 	uint16_t	flags;
2314db7dd1bSJoe Talbott 	uint8_t		reserved;
2324db7dd1bSJoe Talbott 	uint8_t		rate;
2334db7dd1bSJoe Talbott 	uint16_t	len;
2344db7dd1bSJoe Talbott } __packed;
2354db7dd1bSJoe Talbott 
2364db7dd1bSJoe Talbott struct wpi_rx_tail {
2374db7dd1bSJoe Talbott 	uint32_t	flags;
2384db7dd1bSJoe Talbott #define WPI_RX_NO_CRC_ERR	(1 << 0)
2394db7dd1bSJoe Talbott #define WPI_RX_NO_OVFL_ERR	(1 << 1)
2404db7dd1bSJoe Talbott /* shortcut for the above */
2414db7dd1bSJoe Talbott #define WPI_RX_NOERROR		(WPI_RX_NO_CRC_ERR | WPI_RX_NO_OVFL_ERR)
2424db7dd1bSJoe Talbott 	uint64_t	tstamp;
2434db7dd1bSJoe Talbott 	uint32_t	tbeacon;
2444db7dd1bSJoe Talbott } __packed;
2454db7dd1bSJoe Talbott 
2464db7dd1bSJoe Talbott struct wpi_tx_cmd {
2474db7dd1bSJoe Talbott 	uint8_t	code;
2484db7dd1bSJoe Talbott #define WPI_CMD_CONFIGURE	 16
2494db7dd1bSJoe Talbott #define WPI_CMD_ASSOCIATE	 17
2504db7dd1bSJoe Talbott #define WPI_CMD_SET_WME          19
2514db7dd1bSJoe Talbott #define WPI_CMD_TSF		 20
2524db7dd1bSJoe Talbott #define WPI_CMD_ADD_NODE	 24
2534db7dd1bSJoe Talbott #define WPI_CMD_TX_DATA		 28
2544db7dd1bSJoe Talbott #define WPI_CMD_MRR_SETUP	 71
2554db7dd1bSJoe Talbott #define WPI_CMD_SET_LED		 72
2564db7dd1bSJoe Talbott #define WPI_CMD_SET_POWER_MODE	119
2574db7dd1bSJoe Talbott #define WPI_CMD_SCAN		128
2584db7dd1bSJoe Talbott #define WPI_CMD_SET_BEACON	145
2594db7dd1bSJoe Talbott #define WPI_CMD_TXPOWER		151
2604db7dd1bSJoe Talbott #define WPI_CMD_BLUETOOTH	155
2614db7dd1bSJoe Talbott 
2624db7dd1bSJoe Talbott 	uint8_t	flags;
2634db7dd1bSJoe Talbott 	uint8_t	idx;
2644db7dd1bSJoe Talbott 	uint8_t	qid;
2654db7dd1bSJoe Talbott 	uint8_t	data[360];
2664db7dd1bSJoe Talbott } __packed;
2674db7dd1bSJoe Talbott 
2684db7dd1bSJoe Talbott /* structure for WPI_CMD_CONFIGURE */
2694db7dd1bSJoe Talbott struct wpi_config {
2704db7dd1bSJoe Talbott 	uint8_t		myaddr[IEEE80211_ADDR_LEN];
2714db7dd1bSJoe Talbott 	uint16_t	reserved1;
2724db7dd1bSJoe Talbott 	uint8_t		bssid[IEEE80211_ADDR_LEN];
2734db7dd1bSJoe Talbott 	uint16_t	reserved2;
2744db7dd1bSJoe Talbott 	uint8_t		wlap_bssid_addr[6];
2754db7dd1bSJoe Talbott 	uint16_t	reserved3;
2764db7dd1bSJoe Talbott 	uint8_t		mode;
2774db7dd1bSJoe Talbott #define WPI_MODE_HOSTAP		1
2784db7dd1bSJoe Talbott #define WPI_MODE_STA		3
2794db7dd1bSJoe Talbott #define WPI_MODE_IBSS		4
2804db7dd1bSJoe Talbott #define WPI_MODE_MONITOR	6
2814db7dd1bSJoe Talbott 
2824db7dd1bSJoe Talbott 	uint8_t		air_propogation;
2834db7dd1bSJoe Talbott 	uint16_t	reserved4;
2844db7dd1bSJoe Talbott 	uint8_t		ofdm_mask;
2854db7dd1bSJoe Talbott 	uint8_t		cck_mask;
2864db7dd1bSJoe Talbott 	uint16_t	associd;
2874db7dd1bSJoe Talbott 	uint32_t	flags;
2884db7dd1bSJoe Talbott #define WPI_CONFIG_24GHZ	(1 << 0)
2894db7dd1bSJoe Talbott #define WPI_CONFIG_CCK		(1 << 1)
2904db7dd1bSJoe Talbott #define WPI_CONFIG_AUTO		(1 << 2)
2914db7dd1bSJoe Talbott #define WPI_CONFIG_SHSLOT	(1 << 4)
2924db7dd1bSJoe Talbott #define WPI_CONFIG_SHPREAMBLE	(1 << 5)
2934db7dd1bSJoe Talbott #define WPI_CONFIG_NODIVERSITY	(1 << 7)
2944db7dd1bSJoe Talbott #define WPI_CONFIG_ANTENNA_A	(1 << 8)
2954db7dd1bSJoe Talbott #define WPI_CONFIG_ANTENNA_B	(1 << 9)
2964db7dd1bSJoe Talbott #define WPI_CONFIG_TSF		(1 << 15)
2974db7dd1bSJoe Talbott 
2984db7dd1bSJoe Talbott 	uint32_t	filter;
2994db7dd1bSJoe Talbott #define WPI_FILTER_PROMISC	(1 << 0)
3004db7dd1bSJoe Talbott #define WPI_FILTER_CTL		(1 << 1)
3014db7dd1bSJoe Talbott #define WPI_FILTER_MULTICAST	(1 << 2)
3024db7dd1bSJoe Talbott #define WPI_FILTER_NODECRYPT	(1 << 3)
3034db7dd1bSJoe Talbott #define WPI_FILTER_BSS		(1 << 5)
3044db7dd1bSJoe Talbott #define WPI_FILTER_BEACON	(1 << 6)
3054db7dd1bSJoe Talbott 
3064db7dd1bSJoe Talbott 	uint8_t		chan;
3074db7dd1bSJoe Talbott 	uint16_t	reserved6;
3084db7dd1bSJoe Talbott } __packed;
3094db7dd1bSJoe Talbott 
3104db7dd1bSJoe Talbott /* structure for command WPI_CMD_ASSOCIATE */
3114db7dd1bSJoe Talbott struct wpi_assoc {
3124db7dd1bSJoe Talbott 	uint32_t	flags;
3134db7dd1bSJoe Talbott 	uint32_t	filter;
3144db7dd1bSJoe Talbott 	uint8_t		ofdm_mask;
3154db7dd1bSJoe Talbott 	uint8_t		cck_mask;
3164db7dd1bSJoe Talbott 	uint16_t	reserved;
3174db7dd1bSJoe Talbott } __packed;
3184db7dd1bSJoe Talbott 
3194db7dd1bSJoe Talbott /* structure for command WPI_CMD_SET_WME */
3204db7dd1bSJoe Talbott struct wpi_wme_setup {
3214db7dd1bSJoe Talbott 	uint32_t	flags;
3224db7dd1bSJoe Talbott 	struct {
3234db7dd1bSJoe Talbott 		uint16_t	cwmin;
3244db7dd1bSJoe Talbott 		uint16_t	cwmax;
3254db7dd1bSJoe Talbott 		uint8_t		aifsn;
3264db7dd1bSJoe Talbott 		uint8_t		reserved;
3274db7dd1bSJoe Talbott 		uint16_t	txop;
3284db7dd1bSJoe Talbott 	} __packed	ac[WME_NUM_AC];
3294db7dd1bSJoe Talbott } __packed;
3304db7dd1bSJoe Talbott 
3314db7dd1bSJoe Talbott /* structure for command WPI_CMD_TSF */
3324db7dd1bSJoe Talbott struct wpi_cmd_tsf {
3334db7dd1bSJoe Talbott 	uint64_t	tstamp;
3344db7dd1bSJoe Talbott 	uint16_t	bintval;
3354db7dd1bSJoe Talbott 	uint16_t	atim;
3364db7dd1bSJoe Talbott 	uint32_t	binitval;
3374db7dd1bSJoe Talbott 	uint16_t	lintval;
3384db7dd1bSJoe Talbott 	uint16_t	reserved;
3394db7dd1bSJoe Talbott } __packed;
3404db7dd1bSJoe Talbott 
3414db7dd1bSJoe Talbott /* structure for WPI_CMD_ADD_NODE */
3424db7dd1bSJoe Talbott struct wpi_node_info {
3434db7dd1bSJoe Talbott 	uint8_t		control;
3444db7dd1bSJoe Talbott #define WPI_NODE_UPDATE	(1 << 0)
3454db7dd1bSJoe Talbott 
3464db7dd1bSJoe Talbott 	uint8_t		reserved1[3];
3474db7dd1bSJoe Talbott 	uint8_t		bssid[IEEE80211_ADDR_LEN];
3484db7dd1bSJoe Talbott 	uint16_t	reserved2;
3494db7dd1bSJoe Talbott 	uint8_t		id;
3504db7dd1bSJoe Talbott #define WPI_ID_BSS		0
3514db7dd1bSJoe Talbott #define WPI_ID_BROADCAST	24
3524db7dd1bSJoe Talbott 
3534db7dd1bSJoe Talbott 	uint8_t		flags;
3544db7dd1bSJoe Talbott 	uint16_t	reserved3;
3554db7dd1bSJoe Talbott 	uint16_t	key_flags;
3564db7dd1bSJoe Talbott 	uint8_t		tkip;
3574db7dd1bSJoe Talbott 	uint8_t		reserved4;
3584db7dd1bSJoe Talbott 	uint16_t	ttak[5];
3594db7dd1bSJoe Talbott 	uint16_t	reserved5;
3604db7dd1bSJoe Talbott 	uint8_t		key[IEEE80211_KEYBUF_SIZE];
3614db7dd1bSJoe Talbott 	uint32_t	action;
3624db7dd1bSJoe Talbott #define WPI_ACTION_SET_RATE	4
3634db7dd1bSJoe Talbott 	uint32_t	mask;
3644db7dd1bSJoe Talbott 	uint16_t	tid;
3654db7dd1bSJoe Talbott 	uint8_t		rate;
3664db7dd1bSJoe Talbott 	uint8_t		antenna;
3674db7dd1bSJoe Talbott #define WPI_ANTENNA_A	(1<<6)
3684db7dd1bSJoe Talbott #define WPI_ANTENNA_B	(1<<7)
3694db7dd1bSJoe Talbott #define WPI_ANTENNA_BOTH	(WPI_ANTENNA_A|WPI_ANTENNA_B)
3704db7dd1bSJoe Talbott 	uint8_t		add_imm;
3714db7dd1bSJoe Talbott 	uint8_t		del_imm;
3724db7dd1bSJoe Talbott 	uint16_t	add_imm_start;
3734db7dd1bSJoe Talbott } __packed;
3744db7dd1bSJoe Talbott 
3754db7dd1bSJoe Talbott /* structure for command WPI_CMD_TX_DATA */
3764db7dd1bSJoe Talbott struct wpi_cmd_data {
3774db7dd1bSJoe Talbott 	uint16_t	len;
3784db7dd1bSJoe Talbott 	uint16_t	lnext;
3794db7dd1bSJoe Talbott 	uint32_t	flags;
3804db7dd1bSJoe Talbott #define WPI_TX_NEED_RTS		(1 <<  1)
3814db7dd1bSJoe Talbott #define WPI_TX_NEED_CTS         (1 <<  2)
3824db7dd1bSJoe Talbott #define WPI_TX_NEED_ACK		(1 <<  3)
3834db7dd1bSJoe Talbott #define WPI_TX_FULL_TXOP	(1 <<  7)
3844db7dd1bSJoe Talbott #define WPI_TX_BT_DISABLE	(1 << 12) /* bluetooth coexistence */
3854db7dd1bSJoe Talbott #define WPI_TX_AUTO_SEQ		(1 << 13)
3864db7dd1bSJoe Talbott #define WPI_TX_INSERT_TSTAMP	(1 << 16)
3874db7dd1bSJoe Talbott 
3884db7dd1bSJoe Talbott 	uint8_t		rate;
3894db7dd1bSJoe Talbott 	uint8_t		id;
3904db7dd1bSJoe Talbott 	uint8_t		tid;
3914db7dd1bSJoe Talbott 	uint8_t		security;
3924db7dd1bSJoe Talbott 	uint8_t		key[IEEE80211_KEYBUF_SIZE];
3934db7dd1bSJoe Talbott 	uint8_t		tkip[IEEE80211_WEP_MICLEN];
3944db7dd1bSJoe Talbott 	uint32_t	fnext;
3954db7dd1bSJoe Talbott 	uint32_t	lifetime;
3964db7dd1bSJoe Talbott #define WPI_LIFETIME_INFINITE	0xffffffff
3974db7dd1bSJoe Talbott 	uint8_t		ofdm_mask;
3984db7dd1bSJoe Talbott 	uint8_t		cck_mask;
3994db7dd1bSJoe Talbott 	uint8_t		rts_ntries;
4004db7dd1bSJoe Talbott 	uint8_t		data_ntries;
4014db7dd1bSJoe Talbott 	uint16_t	timeout;
4024db7dd1bSJoe Talbott 	uint16_t	txop;
4034db7dd1bSJoe Talbott 	struct          ieee80211_frame wh;
4044db7dd1bSJoe Talbott } __packed;
4054db7dd1bSJoe Talbott 
4064db7dd1bSJoe Talbott /* structure for command WPI_CMD_SET_BEACON */
4074db7dd1bSJoe Talbott struct wpi_cmd_beacon {
4084db7dd1bSJoe Talbott 	uint16_t	len;
4094db7dd1bSJoe Talbott 	uint16_t	reserved1;
4104db7dd1bSJoe Talbott 	uint32_t	flags;	/* same as wpi_cmd_data */
4114db7dd1bSJoe Talbott 	uint8_t		rate;
4124db7dd1bSJoe Talbott 	uint8_t		id;
4134db7dd1bSJoe Talbott 	uint8_t		reserved2[30];
4144db7dd1bSJoe Talbott 	uint32_t	lifetime;
4154db7dd1bSJoe Talbott 	uint8_t		ofdm_mask;
4164db7dd1bSJoe Talbott 	uint8_t		cck_mask;
4174db7dd1bSJoe Talbott 	uint16_t	reserved3[3];
4184db7dd1bSJoe Talbott 	uint16_t	tim;
4194db7dd1bSJoe Talbott 	uint8_t		timsz;
4204db7dd1bSJoe Talbott 	uint8_t		reserved4;
4214db7dd1bSJoe Talbott 	struct		ieee80211_frame wh;
4224db7dd1bSJoe Talbott } __packed;
4234db7dd1bSJoe Talbott 
4244db7dd1bSJoe Talbott /* structure for notification WPI_MISSED_BEACON */
4254db7dd1bSJoe Talbott struct wpi_missed_beacon {
4264db7dd1bSJoe Talbott     uint32_t consecutive;
4274db7dd1bSJoe Talbott     uint32_t total;
4284db7dd1bSJoe Talbott     uint32_t expected;
4294db7dd1bSJoe Talbott     uint32_t received;
4304db7dd1bSJoe Talbott } __packed;
4314db7dd1bSJoe Talbott 
4324db7dd1bSJoe Talbott 
4334db7dd1bSJoe Talbott /* structure for WPI_CMD_MRR_SETUP */
4344db7dd1bSJoe Talbott struct wpi_mrr_setup {
4354db7dd1bSJoe Talbott 	uint8_t	which;
4364db7dd1bSJoe Talbott #define WPI_MRR_CTL	0
4374db7dd1bSJoe Talbott #define WPI_MRR_DATA	1
4384db7dd1bSJoe Talbott 
4394db7dd1bSJoe Talbott 	uint8_t		reserved[3];
4404db7dd1bSJoe Talbott 
4414db7dd1bSJoe Talbott 	struct {
4424db7dd1bSJoe Talbott 		uint8_t	signal;
4434db7dd1bSJoe Talbott 		uint8_t	flags;
4444db7dd1bSJoe Talbott 		uint8_t	ntries;
4454db7dd1bSJoe Talbott 		uint8_t	next;
4464db7dd1bSJoe Talbott #define WPI_OFDM6	0
4474db7dd1bSJoe Talbott #define WPI_OFDM54	7
4484db7dd1bSJoe Talbott #define WPI_CCK1	8
4494db7dd1bSJoe Talbott #define WPI_CCK2	9
4504db7dd1bSJoe Talbott #define WPI_CCK11	11
4514db7dd1bSJoe Talbott 
4524db7dd1bSJoe Talbott 	} __attribute__((__packed__))	rates[WPI_CCK11 + 1];
4534db7dd1bSJoe Talbott } __packed;
4544db7dd1bSJoe Talbott 
4554db7dd1bSJoe Talbott /* structure for WPI_CMD_SET_LED */
4564db7dd1bSJoe Talbott struct wpi_cmd_led {
4574db7dd1bSJoe Talbott 	uint32_t	unit;	/* multiplier (in usecs) */
4584db7dd1bSJoe Talbott 	uint8_t		which;
4594db7dd1bSJoe Talbott #define WPI_LED_ACTIVITY	1
4604db7dd1bSJoe Talbott #define WPI_LED_LINK		2
4614db7dd1bSJoe Talbott 
4624db7dd1bSJoe Talbott 	uint8_t		off;
4634db7dd1bSJoe Talbott 	uint8_t		on;
4644db7dd1bSJoe Talbott 	uint8_t		reserved;
4654db7dd1bSJoe Talbott } __packed;
4664db7dd1bSJoe Talbott 
4674db7dd1bSJoe Talbott /* structure for WPI_CMD_SET_POWER_MODE */
4684db7dd1bSJoe Talbott struct wpi_power {
4694db7dd1bSJoe Talbott 	uint32_t	flags;
4704db7dd1bSJoe Talbott #define WPI_POWER_CAM	0	/* constantly awake mode */
4714db7dd1bSJoe Talbott 	uint32_t	rx_timeout;
4724db7dd1bSJoe Talbott 	uint32_t	tx_timeout;
4734db7dd1bSJoe Talbott 	uint32_t	sleep[5];
4744db7dd1bSJoe Talbott } __packed;
4754db7dd1bSJoe Talbott 
4764db7dd1bSJoe Talbott /* structure for command WPI_CMD_SCAN */
4774db7dd1bSJoe Talbott struct wpi_scan_hdr {
4784db7dd1bSJoe Talbott 	uint16_t	len;
4794db7dd1bSJoe Talbott 	uint8_t		reserved1;
4804db7dd1bSJoe Talbott 	uint8_t		nchan;
4814db7dd1bSJoe Talbott 	uint16_t	quiet;
4824db7dd1bSJoe Talbott 	uint16_t	threshold;
4834db7dd1bSJoe Talbott 	uint16_t	promotion;
4844db7dd1bSJoe Talbott 	uint16_t	reserved2;
4854db7dd1bSJoe Talbott 	uint32_t	maxtimeout;
4864db7dd1bSJoe Talbott 	uint32_t	suspend;
4874db7dd1bSJoe Talbott 	uint32_t	flags;
4884db7dd1bSJoe Talbott 	uint32_t	filter;
4894db7dd1bSJoe Talbott 
4904db7dd1bSJoe Talbott struct {
4914db7dd1bSJoe Talbott 	uint16_t	len;
4924db7dd1bSJoe Talbott 	uint16_t	lnext;
4934db7dd1bSJoe Talbott 	uint32_t	flags;
4944db7dd1bSJoe Talbott 	uint8_t		rate;
4954db7dd1bSJoe Talbott 	uint8_t		id;
4964db7dd1bSJoe Talbott 	uint8_t		tid;
4974db7dd1bSJoe Talbott 	uint8_t		security;
4984db7dd1bSJoe Talbott 	uint8_t		key[IEEE80211_KEYBUF_SIZE];
4994db7dd1bSJoe Talbott 	uint8_t		tkip[IEEE80211_WEP_MICLEN];
5004db7dd1bSJoe Talbott 	uint32_t	fnext;
5014db7dd1bSJoe Talbott 	uint32_t	lifetime;
5024db7dd1bSJoe Talbott 	uint8_t		ofdm_mask;
5034db7dd1bSJoe Talbott 	uint8_t		cck_mask;
5044db7dd1bSJoe Talbott 	uint8_t		rts_ntries;
5054db7dd1bSJoe Talbott 	uint8_t		data_ntries;
5064db7dd1bSJoe Talbott 	uint16_t	timeout;
5074db7dd1bSJoe Talbott 	uint16_t	txop;
5084db7dd1bSJoe Talbott }	tx __attribute__((__packed__));
5094db7dd1bSJoe Talbott 
5104db7dd1bSJoe Talbott #define WPI_SCAN_MAX_ESSIDS	4
5114db7dd1bSJoe Talbott 	struct {
5124db7dd1bSJoe Talbott 	    uint8_t		id;
5134db7dd1bSJoe Talbott 	    uint8_t		esslen;
514*d0c50e91SJohannes Hofmann 	    uint8_t		essid[IEEE80211_NWID_LEN];
5154db7dd1bSJoe Talbott 	}scan_essids[WPI_SCAN_MAX_ESSIDS];
5164db7dd1bSJoe Talbott 	/* followed by probe request body */
5174db7dd1bSJoe Talbott 	/* followed by nchan x wpi_scan_chan */
5184db7dd1bSJoe Talbott } __packed;
5194db7dd1bSJoe Talbott 
5204db7dd1bSJoe Talbott struct wpi_scan_chan {
5214db7dd1bSJoe Talbott 	uint8_t		flags;
5224db7dd1bSJoe Talbott 	uint8_t		chan;
5234db7dd1bSJoe Talbott #define WPI_CHAN_ACTIVE	(1 << 0)
5244db7dd1bSJoe Talbott #define WPI_CHAN_DIRECT (1 << 1)
5254db7dd1bSJoe Talbott 	uint8_t		gain_radio;
5264db7dd1bSJoe Talbott 	uint8_t		gain_dsp;
5274db7dd1bSJoe Talbott 	uint16_t	active;		/* msecs */
5284db7dd1bSJoe Talbott 	uint16_t	passive;	/* msecs */
5294db7dd1bSJoe Talbott } __packed;
5304db7dd1bSJoe Talbott 
5314db7dd1bSJoe Talbott /* structure for WPI_CMD_BLUETOOTH */
5324db7dd1bSJoe Talbott struct wpi_bluetooth {
5334db7dd1bSJoe Talbott 	uint8_t		flags;
5344db7dd1bSJoe Talbott 	uint8_t		lead;
5354db7dd1bSJoe Talbott 	uint8_t		kill;
5364db7dd1bSJoe Talbott 	uint8_t		reserved;
5374db7dd1bSJoe Talbott 	uint32_t	ack;
5384db7dd1bSJoe Talbott 	uint32_t	cts;
5394db7dd1bSJoe Talbott } __packed;
5404db7dd1bSJoe Talbott 
5414db7dd1bSJoe Talbott /* structure for command WPI_CMD_TXPOWER */
5424db7dd1bSJoe Talbott struct wpi_cmd_txpower {
5434db7dd1bSJoe Talbott 
5444db7dd1bSJoe Talbott 	uint8_t		band;
5454db7dd1bSJoe Talbott #define WPI_RATE_5GHZ	0
5464db7dd1bSJoe Talbott #define WPI_RATE_2GHZ	1
5474db7dd1bSJoe Talbott 	uint8_t		reserved;
5484db7dd1bSJoe Talbott 	uint16_t	channel;
5494db7dd1bSJoe Talbott 
5504db7dd1bSJoe Talbott #define WPI_RATE_MAPPING_COUNT 12
5514db7dd1bSJoe Talbott 	struct {
5524db7dd1bSJoe Talbott 	    uint8_t	rate;
5534db7dd1bSJoe Talbott 	    uint8_t	gain_radio;
5544db7dd1bSJoe Talbott 	    uint8_t	gain_dsp;
5554db7dd1bSJoe Talbott 	    uint8_t	reserved;
5564db7dd1bSJoe Talbott 	} __packed rates [WPI_RATE_MAPPING_COUNT];
5574db7dd1bSJoe Talbott 
5584db7dd1bSJoe Talbott } __packed;
5594db7dd1bSJoe Talbott 
5604db7dd1bSJoe Talbott 
5614db7dd1bSJoe Talbott 
5624db7dd1bSJoe Talbott #define WPI_FW_MAIN_TEXT_MAXSZ (80 * 1024 )
5634db7dd1bSJoe Talbott #define WPI_FW_MAIN_DATA_MAXSZ (32 * 1024 )
5644db7dd1bSJoe Talbott #define WPI_FW_INIT_TEXT_MAXSZ (80 * 1024 )
5654db7dd1bSJoe Talbott #define WPI_FW_INIT_DATA_MAXSZ (32 * 1024 )
5664db7dd1bSJoe Talbott #define WPI_FW_BOOT_TEXT_MAXSZ 1024
5674db7dd1bSJoe Talbott 
5684db7dd1bSJoe Talbott #define WPI_FW_UPDATED	(1 << 31 )
5694db7dd1bSJoe Talbott 
5704db7dd1bSJoe Talbott /* firmware image header */
5714db7dd1bSJoe Talbott struct wpi_firmware_hdr {
5724db7dd1bSJoe Talbott 
5734db7dd1bSJoe Talbott #define WPI_FW_MINVERSION 2144
5744db7dd1bSJoe Talbott 
5754db7dd1bSJoe Talbott 	uint32_t	version;
5764db7dd1bSJoe Talbott 	uint32_t	rtextsz;
5774db7dd1bSJoe Talbott 	uint32_t	rdatasz;
5784db7dd1bSJoe Talbott 	uint32_t	itextsz;
5794db7dd1bSJoe Talbott 	uint32_t	idatasz;
5804db7dd1bSJoe Talbott 	uint32_t	btextsz;
5814db7dd1bSJoe Talbott } __packed;
5824db7dd1bSJoe Talbott 
5834db7dd1bSJoe Talbott /* structure for WPI_UC_READY notification */
5844db7dd1bSJoe Talbott struct wpi_ucode_info {
5854db7dd1bSJoe Talbott 	uint32_t	version;
5864db7dd1bSJoe Talbott 	uint8_t		revision[8];
5874db7dd1bSJoe Talbott 	uint8_t		type;
5884db7dd1bSJoe Talbott 	uint8_t		subtype;
5894db7dd1bSJoe Talbott 	uint16_t	reserved;
5904db7dd1bSJoe Talbott 	uint32_t	logptr;
5914db7dd1bSJoe Talbott 	uint32_t	errorptr;
5924db7dd1bSJoe Talbott 	uint32_t	timestamp;
5934db7dd1bSJoe Talbott 	uint32_t	valid;
5944db7dd1bSJoe Talbott } __packed;
5954db7dd1bSJoe Talbott 
5964db7dd1bSJoe Talbott /* structure for WPI_START_SCAN notification */
5974db7dd1bSJoe Talbott struct wpi_start_scan {
5984db7dd1bSJoe Talbott 	uint64_t	tstamp;
5994db7dd1bSJoe Talbott 	uint32_t	tbeacon;
6004db7dd1bSJoe Talbott 	uint8_t		chan;
6014db7dd1bSJoe Talbott 	uint8_t		band;
6024db7dd1bSJoe Talbott 	uint16_t	reserved;
6034db7dd1bSJoe Talbott 	uint32_t	status;
6044db7dd1bSJoe Talbott } __packed;
6054db7dd1bSJoe Talbott 
6064db7dd1bSJoe Talbott /* structure for WPI_STOP_SCAN notification */
6074db7dd1bSJoe Talbott struct wpi_stop_scan {
6084db7dd1bSJoe Talbott 	uint8_t		nchan;
6094db7dd1bSJoe Talbott 	uint8_t		status;
6104db7dd1bSJoe Talbott 	uint8_t		reserved;
6114db7dd1bSJoe Talbott 	uint8_t		chan;
6124db7dd1bSJoe Talbott 	uint64_t	tsf;
6134db7dd1bSJoe Talbott } __packed;
6144db7dd1bSJoe Talbott 
6154db7dd1bSJoe Talbott #define WPI_EEPROM_MAC		0x015
6164db7dd1bSJoe Talbott #define WPI_EEPROM_REVISION	0x035
6174db7dd1bSJoe Talbott #define WPI_EEPROM_CAPABILITIES	0x045
6184db7dd1bSJoe Talbott #define WPI_EEPROM_TYPE		0x04a
6194db7dd1bSJoe Talbott #define WPI_EEPROM_DOMAIN	0x060
6204db7dd1bSJoe Talbott #define WPI_EEPROM_BAND1	0x063
6214db7dd1bSJoe Talbott #define WPI_EEPROM_BAND2	0x072
6224db7dd1bSJoe Talbott #define WPI_EEPROM_BAND3	0x080
6234db7dd1bSJoe Talbott #define WPI_EEPROM_BAND4	0x08d
6244db7dd1bSJoe Talbott #define WPI_EEPROM_BAND5	0x099
6254db7dd1bSJoe Talbott #define WPI_EEPROM_POWER_GRP	0x100
6264db7dd1bSJoe Talbott 
6274db7dd1bSJoe Talbott struct wpi_eeprom_chan {
6284db7dd1bSJoe Talbott 	uint8_t	flags;
6294db7dd1bSJoe Talbott #define WPI_EEPROM_CHAN_VALID	(1<<0)
6304db7dd1bSJoe Talbott #define	WPI_EEPROM_CHAN_IBSS	(1<<1)
6314db7dd1bSJoe Talbott #define WPI_EEPROM_CHAN_ACTIVE	(1<<3)
6324db7dd1bSJoe Talbott #define WPI_EEPROM_CHAN_RADAR	(1<<4)
6334db7dd1bSJoe Talbott 
6344db7dd1bSJoe Talbott 	int8_t	maxpwr;
6354db7dd1bSJoe Talbott } __packed;
6364db7dd1bSJoe Talbott 
6374db7dd1bSJoe Talbott struct wpi_eeprom_sample {
6384db7dd1bSJoe Talbott     uint8_t	index;
6394db7dd1bSJoe Talbott     int8_t	power;
6404db7dd1bSJoe Talbott     uint16_t	volt;
6414db7dd1bSJoe Talbott };
6424db7dd1bSJoe Talbott 
6434db7dd1bSJoe Talbott #define WPI_POWER_GROUPS_COUNT	5
6444db7dd1bSJoe Talbott 
6454db7dd1bSJoe Talbott struct wpi_eeprom_group {
6464db7dd1bSJoe Talbott     struct	wpi_eeprom_sample samples[5];
6474db7dd1bSJoe Talbott     int32_t	coef[5];
6484db7dd1bSJoe Talbott     int32_t	corr[5];
6494db7dd1bSJoe Talbott     int8_t	maxpwr;
6504db7dd1bSJoe Talbott     uint8_t	chan;
6514db7dd1bSJoe Talbott     int16_t	temp;
6524db7dd1bSJoe Talbott } __packed;
6534db7dd1bSJoe Talbott 
6544db7dd1bSJoe Talbott #define WPI_CHAN_BANDS_COUNT	5
6554db7dd1bSJoe Talbott #define WPI_MAX_CHAN_PER_BAND	14
6564db7dd1bSJoe Talbott 
6574db7dd1bSJoe Talbott static const struct wpi_chan_band {
6584db7dd1bSJoe Talbott     uint32_t	addr;	/* offset in EEPROM */
6594db7dd1bSJoe Talbott     uint8_t	nchan;
6604db7dd1bSJoe Talbott     uint8_t	chan[WPI_MAX_CHAN_PER_BAND];
6614db7dd1bSJoe Talbott } wpi_bands[5] = {
6624db7dd1bSJoe Talbott     { WPI_EEPROM_BAND1, 14,
6634db7dd1bSJoe Talbott 	{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 }},
6644db7dd1bSJoe Talbott     { WPI_EEPROM_BAND2, 13,
6654db7dd1bSJoe Talbott 	{ 183, 184, 185, 187, 188, 189, 192, 196, 7, 8, 11, 12, 16 }},
6664db7dd1bSJoe Talbott     { WPI_EEPROM_BAND3, 12,
6674db7dd1bSJoe Talbott 	{ 34, 36, 38, 40, 42, 44, 46, 48, 52, 56, 60, 64 }},
6684db7dd1bSJoe Talbott     { WPI_EEPROM_BAND4, 11,
6694db7dd1bSJoe Talbott 	{ 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140 }},
6704db7dd1bSJoe Talbott     { WPI_EEPROM_BAND5, 6,
6714db7dd1bSJoe Talbott 	{ 145, 149, 153, 157, 161, 165 }}
6724db7dd1bSJoe Talbott };
6734db7dd1bSJoe Talbott 
6744db7dd1bSJoe Talbott #define WPI_MAX_PWR_INDEX	77
6754db7dd1bSJoe Talbott 
6764db7dd1bSJoe Talbott /*
6774db7dd1bSJoe Talbott  * RF Tx gain values from highest to lowest power (values obtained from
6784db7dd1bSJoe Talbott  * the reference driver.)
6794db7dd1bSJoe Talbott  */
6804db7dd1bSJoe Talbott static const uint8_t wpi_rf_gain_2ghz[WPI_MAX_PWR_INDEX + 1] = {
6814db7dd1bSJoe Talbott     0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xbb, 0xbb, 0xbb,
6824db7dd1bSJoe Talbott     0xbb, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xd3, 0xd3, 0xb3, 0xb3, 0xb3,
6834db7dd1bSJoe Talbott     0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x73, 0xeb, 0xeb, 0xeb,
6844db7dd1bSJoe Talbott     0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xab, 0xab, 0xab, 0x8b,
6854db7dd1bSJoe Talbott     0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xc3, 0xc3, 0xc3, 0xc3, 0xa3,
6864db7dd1bSJoe Talbott     0xa3, 0xa3, 0xa3, 0x83, 0x83, 0x83, 0x83, 0x63, 0x63, 0x63, 0x63,
6874db7dd1bSJoe Talbott     0x43, 0x43, 0x43, 0x43, 0x23, 0x23, 0x23, 0x23, 0x03, 0x03, 0x03,
6884db7dd1bSJoe Talbott     0x03
6894db7dd1bSJoe Talbott };
6904db7dd1bSJoe Talbott 
6914db7dd1bSJoe Talbott static const uint8_t wpi_rf_gain_5ghz[WPI_MAX_PWR_INDEX + 1] = {
6924db7dd1bSJoe Talbott     0xfb, 0xfb, 0xfb, 0xdb, 0xdb, 0xbb, 0xbb, 0x9b, 0x9b, 0x7b, 0x7b,
6934db7dd1bSJoe Talbott     0x7b, 0x7b, 0x5b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x1b, 0x1b,
6944db7dd1bSJoe Talbott     0x1b, 0x73, 0x73, 0x73, 0x53, 0x53, 0x53, 0x53, 0x53, 0x33, 0x33,
6954db7dd1bSJoe Talbott     0x33, 0x33, 0x13, 0x13, 0x13, 0x13, 0x13, 0xab, 0xab, 0xab, 0x8b,
6964db7dd1bSJoe Talbott     0x8b, 0x8b, 0x8b, 0x6b, 0x6b, 0x6b, 0x6b, 0x4b, 0x4b, 0x4b, 0x4b,
6974db7dd1bSJoe Talbott     0x2b, 0x2b, 0x2b, 0x2b, 0x0b, 0x0b, 0x0b, 0x0b, 0x83, 0x83, 0x63,
6984db7dd1bSJoe Talbott     0x63, 0x63, 0x63, 0x43, 0x43, 0x43, 0x43, 0x23, 0x23, 0x23, 0x23,
6994db7dd1bSJoe Talbott     0x03
7004db7dd1bSJoe Talbott };
7014db7dd1bSJoe Talbott 
7024db7dd1bSJoe Talbott /*
7034db7dd1bSJoe Talbott  * DSP pre-DAC gain values from highest to lowest power (values obtained
7044db7dd1bSJoe Talbott  * from the reference driver.)
7054db7dd1bSJoe Talbott  */
7064db7dd1bSJoe Talbott static const uint8_t wpi_dsp_gain_2ghz[WPI_MAX_PWR_INDEX + 1] = {
7074db7dd1bSJoe Talbott     0x7f, 0x7f, 0x7f, 0x7f, 0x7d, 0x6e, 0x69, 0x62, 0x7d, 0x73, 0x6c,
7084db7dd1bSJoe Talbott     0x63, 0x77, 0x6f, 0x69, 0x61, 0x5c, 0x6a, 0x64, 0x78, 0x71, 0x6b,
7094db7dd1bSJoe Talbott     0x7d, 0x77, 0x70, 0x6a, 0x65, 0x61, 0x5b, 0x6b, 0x79, 0x73, 0x6d,
7104db7dd1bSJoe Talbott     0x7f, 0x79, 0x73, 0x6c, 0x66, 0x60, 0x5c, 0x6e, 0x68, 0x62, 0x74,
7114db7dd1bSJoe Talbott     0x7d, 0x77, 0x71, 0x6b, 0x65, 0x60, 0x71, 0x6a, 0x66, 0x5f, 0x71,
7124db7dd1bSJoe Talbott     0x6a, 0x66, 0x5f, 0x71, 0x6a, 0x66, 0x5f, 0x71, 0x6a, 0x66, 0x5f,
7134db7dd1bSJoe Talbott     0x71, 0x6a, 0x66, 0x5f, 0x71, 0x6a, 0x66, 0x5f, 0x71, 0x6a, 0x66,
7144db7dd1bSJoe Talbott     0x5f
7154db7dd1bSJoe Talbott };
7164db7dd1bSJoe Talbott 
7174db7dd1bSJoe Talbott static const uint8_t wpi_dsp_gain_5ghz[WPI_MAX_PWR_INDEX + 1] = {
7184db7dd1bSJoe Talbott     0x7f, 0x78, 0x72, 0x77, 0x65, 0x71, 0x66, 0x72, 0x67, 0x75, 0x6b,
7194db7dd1bSJoe Talbott     0x63, 0x5c, 0x6c, 0x7d, 0x76, 0x6d, 0x66, 0x60, 0x5a, 0x68, 0x62,
7204db7dd1bSJoe Talbott     0x5c, 0x76, 0x6f, 0x68, 0x7e, 0x79, 0x71, 0x69, 0x63, 0x76, 0x6f,
7214db7dd1bSJoe Talbott     0x68, 0x62, 0x74, 0x6d, 0x66, 0x62, 0x5d, 0x71, 0x6b, 0x63, 0x78,
7224db7dd1bSJoe Talbott     0x71, 0x6b, 0x63, 0x78, 0x71, 0x6b, 0x63, 0x78, 0x71, 0x6b, 0x63,
7234db7dd1bSJoe Talbott     0x78, 0x71, 0x6b, 0x63, 0x78, 0x71, 0x6b, 0x63, 0x6b, 0x63, 0x78,
7244db7dd1bSJoe Talbott     0x71, 0x6b, 0x63, 0x78, 0x71, 0x6b, 0x63, 0x78, 0x71, 0x6b, 0x63,
7254db7dd1bSJoe Talbott     0x78
7264db7dd1bSJoe Talbott };
7274db7dd1bSJoe Talbott 
7284db7dd1bSJoe Talbott 
7294db7dd1bSJoe Talbott #define WPI_READ(sc, reg)						\
7304db7dd1bSJoe Talbott     bus_space_read_4((sc)->sc_st, (sc)->sc_sh, (reg))
7314db7dd1bSJoe Talbott 
7324db7dd1bSJoe Talbott #define WPI_WRITE(sc, reg, val)						\
7334db7dd1bSJoe Talbott     bus_space_write_4((sc)->sc_st, (sc)->sc_sh, (reg), (val))
7344db7dd1bSJoe Talbott 
7354db7dd1bSJoe Talbott #define WPI_WRITE_REGION_4(sc, offset, datap, count)			\
7364db7dd1bSJoe Talbott     bus_space_write_region_4((sc)->sc_st, (sc)->sc_sh, (offset),	\
7374db7dd1bSJoe Talbott 			     (datap), (count))
738