xref: /freebsd/sys/dev/iwn/if_iwnreg.h (revision 71625ec9ad2a9bc8c09784fbd23b759830e0ee5f)
17832b1f6SBernhard Schmidt /*	$OpenBSD: if_iwnreg.h,v 1.40 2010/05/05 19:41:57 damien Exp $	*/
23971d07bSSam Leffler 
33971d07bSSam Leffler /*-
48f302007SRui Paulo  * Copyright (c) 2007, 2008
53971d07bSSam Leffler  *	Damien Bergamini <damien.bergamini@free.fr>
63971d07bSSam Leffler  *
73971d07bSSam Leffler  * Permission to use, copy, modify, and distribute this software for any
83971d07bSSam Leffler  * purpose with or without fee is hereby granted, provided that the above
93971d07bSSam Leffler  * copyright notice and this permission notice appear in all copies.
103971d07bSSam Leffler  *
113971d07bSSam Leffler  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
123971d07bSSam Leffler  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
133971d07bSSam Leffler  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
143971d07bSSam Leffler  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
153971d07bSSam Leffler  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
163971d07bSSam Leffler  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
173971d07bSSam Leffler  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
183971d07bSSam Leffler  */
19b876a4a3SAdrian Chadd #ifndef	__IF_IWNREG_H__
20b876a4a3SAdrian Chadd #define	__IF_IWNREG_H__
213971d07bSSam Leffler 
22f8639279SAdrian Chadd #define	IWN_CT_KILL_THRESHOLD		114	/* in Celsius */
23f8639279SAdrian Chadd #define	IWN_CT_KILL_EXIT_THRESHOLD	95	/* in Celsius */
24f8639279SAdrian Chadd 
253971d07bSSam Leffler #define IWN_TX_RING_COUNT	256
268f302007SRui Paulo #define IWN_TX_RING_LOMARK	192
278f302007SRui Paulo #define IWN_TX_RING_HIMARK	224
288f302007SRui Paulo #define IWN_RX_RING_COUNT_LOG	6
298f302007SRui Paulo #define IWN_RX_RING_COUNT	(1 << IWN_RX_RING_COUNT_LOG)
303971d07bSSam Leffler 
318f302007SRui Paulo #define IWN4965_NTXQUEUES	16
328f302007SRui Paulo #define IWN5000_NTXQUEUES	20
333971d07bSSam Leffler 
3497fadf57SBernhard Schmidt #define IWN4965_FIRSTAGGQUEUE	7
3597fadf57SBernhard Schmidt #define IWN5000_FIRSTAGGQUEUE	10
3697fadf57SBernhard Schmidt 
378f302007SRui Paulo #define IWN4965_NDMACHNLS	7
388f302007SRui Paulo #define IWN5000_NDMACHNLS	8
393971d07bSSam Leffler 
408f302007SRui Paulo #define IWN_SRVC_DMACHNL	9
418f302007SRui Paulo 
420f454b93SRui Paulo #define IWN_ICT_SIZE		4096
430f454b93SRui Paulo #define IWN_ICT_COUNT		(IWN_ICT_SIZE / sizeof (uint32_t))
440f454b93SRui Paulo 
45f8639279SAdrian Chadd /* For cards with PAN command, default is IWN_CMD_QUEUE_NUM */
46f8639279SAdrian Chadd #define	IWN_CMD_QUEUE_NUM		4
47f8639279SAdrian Chadd #define	IWN_PAN_CMD_QUEUE		9
48f8639279SAdrian Chadd 
498f302007SRui Paulo /* Maximum number of DMA segments for TX. */
503971d07bSSam Leffler #define IWN_MAX_SCATTER	20
513971d07bSSam Leffler 
528f302007SRui Paulo /* RX buffers must be large enough to hold a full 4K A-MPDU. */
533971d07bSSam Leffler #define IWN_RBUF_SIZE	(4 * 1024)
543971d07bSSam Leffler 
558f302007SRui Paulo #if defined(__LP64__)
568f302007SRui Paulo /* HW supports 36-bit DMA addresses. */
578f302007SRui Paulo #define IWN_LOADDR(paddr)	((uint32_t)(paddr))
588f302007SRui Paulo #define IWN_HIADDR(paddr)	(((paddr) >> 32) & 0xf)
598f302007SRui Paulo #else
608f302007SRui Paulo #define IWN_LOADDR(paddr)	(paddr)
618f302007SRui Paulo #define IWN_HIADDR(paddr)	(0)
628f302007SRui Paulo #endif
638f302007SRui Paulo 
643971d07bSSam Leffler /*
653971d07bSSam Leffler  * Control and status registers.
663971d07bSSam Leffler  */
678f302007SRui Paulo #define IWN_HW_IF_CONFIG	0x000
688f302007SRui Paulo #define IWN_INT_COALESCING	0x004
690f454b93SRui Paulo #define IWN_INT_PERIODIC	0x005	/* use IWN_WRITE_1 */
708f302007SRui Paulo #define IWN_INT			0x008
710f454b93SRui Paulo #define IWN_INT_MASK		0x00c
728f302007SRui Paulo #define IWN_FH_INT		0x010
7338b1a25dSAdrian Chadd #define IWN_GPIO_IN		0x018	/* read external chip pins */
743971d07bSSam Leffler #define IWN_RESET		0x020
758f302007SRui Paulo #define IWN_GP_CNTRL		0x024
768f302007SRui Paulo #define IWN_HW_REV		0x028
778f302007SRui Paulo #define IWN_EEPROM		0x02c
788f302007SRui Paulo #define IWN_EEPROM_GP		0x030
798f302007SRui Paulo #define IWN_OTP_GP		0x034
808f302007SRui Paulo #define IWN_GIO			0x03c
8138b1a25dSAdrian Chadd #define IWN_GP_UCODE		0x048
820f454b93SRui Paulo #define IWN_GP_DRIVER		0x050
8338b1a25dSAdrian Chadd #define IWN_UCODE_GP1		0x054
8438b1a25dSAdrian Chadd #define IWN_UCODE_GP1_SET	0x058
858f302007SRui Paulo #define IWN_UCODE_GP1_CLR	0x05c
8638b1a25dSAdrian Chadd #define IWN_UCODE_GP2		0x060
878f302007SRui Paulo #define IWN_LED			0x094
880f454b93SRui Paulo #define IWN_DRAM_INT_TBL	0x0a0
899dd0e40bSBernhard Schmidt #define IWN_SHADOW_REG_CTRL	0x0a8
908f302007SRui Paulo #define IWN_GIO_CHICKEN		0x100
918f302007SRui Paulo #define IWN_ANA_PLL		0x20c
920f454b93SRui Paulo #define IWN_HW_REV_WA		0x22c
938f302007SRui Paulo #define IWN_DBG_HPET_MEM	0x240
940f454b93SRui Paulo #define IWN_DBG_LINK_PWR_MGMT	0x250
9538b1a25dSAdrian Chadd /* Need nic_lock for use above */
968f302007SRui Paulo #define IWN_MEM_RADDR		0x40c
973971d07bSSam Leffler #define IWN_MEM_WADDR		0x410
983971d07bSSam Leffler #define IWN_MEM_WDATA		0x418
998f302007SRui Paulo #define IWN_MEM_RDATA		0x41c
100f8639279SAdrian Chadd #define	IWN_TARG_MBX_C		0x430
1018f302007SRui Paulo #define IWN_PRPH_WADDR  	0x444
1028f302007SRui Paulo #define IWN_PRPH_RADDR   	0x448
1038f302007SRui Paulo #define IWN_PRPH_WDATA  	0x44c
1048f302007SRui Paulo #define IWN_PRPH_RDATA   	0x450
1058f302007SRui Paulo #define IWN_HBUS_TARG_WRPTR	0x460
1063971d07bSSam Leffler 
1078f302007SRui Paulo /*
1088f302007SRui Paulo  * Flow-Handler registers.
1098f302007SRui Paulo  */
1108f302007SRui Paulo #define IWN_FH_TFBD_CTRL0(qid)		(0x1900 + (qid) * 8)
1118f302007SRui Paulo #define IWN_FH_TFBD_CTRL1(qid)		(0x1904 + (qid) * 8)
1128f302007SRui Paulo #define IWN_FH_KW_ADDR			0x197c
1138f302007SRui Paulo #define IWN_FH_SRAM_ADDR(qid)		(0x19a4 + (qid) * 4)
1148f302007SRui Paulo #define IWN_FH_CBBC_QUEUE(qid)		(0x19d0 + (qid) * 4)
1158f302007SRui Paulo #define IWN_FH_STATUS_WPTR		0x1bc0
1168f302007SRui Paulo #define IWN_FH_RX_BASE			0x1bc4
1178f302007SRui Paulo #define IWN_FH_RX_WPTR			0x1bc8
1188f302007SRui Paulo #define IWN_FH_RX_CONFIG		0x1c00
1198f302007SRui Paulo #define IWN_FH_RX_STATUS		0x1c44
1208f302007SRui Paulo #define IWN_FH_TX_CONFIG(qid)		(0x1d00 + (qid) * 32)
1218f302007SRui Paulo #define IWN_FH_TXBUF_STATUS(qid)	(0x1d08 + (qid) * 32)
1228f302007SRui Paulo #define IWN_FH_TX_CHICKEN		0x1e98
1238f302007SRui Paulo #define IWN_FH_TX_STATUS		0x1eb0
1243971d07bSSam Leffler 
1258f302007SRui Paulo /*
1268f302007SRui Paulo  * TX scheduler registers.
1278f302007SRui Paulo  */
1288f302007SRui Paulo #define IWN_SCHED_BASE			0xa02c00
1298f302007SRui Paulo #define IWN_SCHED_SRAM_ADDR		(IWN_SCHED_BASE + 0x000)
1308f302007SRui Paulo #define IWN5000_SCHED_DRAM_ADDR		(IWN_SCHED_BASE + 0x008)
1318f302007SRui Paulo #define IWN4965_SCHED_DRAM_ADDR		(IWN_SCHED_BASE + 0x010)
1328f302007SRui Paulo #define IWN5000_SCHED_TXFACT		(IWN_SCHED_BASE + 0x010)
1338f302007SRui Paulo #define IWN4965_SCHED_TXFACT		(IWN_SCHED_BASE + 0x01c)
1348f302007SRui Paulo #define IWN4965_SCHED_QUEUE_RDPTR(qid)	(IWN_SCHED_BASE + 0x064 + (qid) * 4)
1358f302007SRui Paulo #define IWN5000_SCHED_QUEUE_RDPTR(qid)	(IWN_SCHED_BASE + 0x068 + (qid) * 4)
1368f302007SRui Paulo #define IWN4965_SCHED_QCHAIN_SEL	(IWN_SCHED_BASE + 0x0d0)
1378f302007SRui Paulo #define IWN4965_SCHED_INTR_MASK		(IWN_SCHED_BASE + 0x0e4)
1388f302007SRui Paulo #define IWN5000_SCHED_QCHAIN_SEL	(IWN_SCHED_BASE + 0x0e8)
1398f302007SRui Paulo #define IWN4965_SCHED_QUEUE_STATUS(qid)	(IWN_SCHED_BASE + 0x104 + (qid) * 4)
1408f302007SRui Paulo #define IWN5000_SCHED_INTR_MASK		(IWN_SCHED_BASE + 0x108)
1418f302007SRui Paulo #define IWN5000_SCHED_QUEUE_STATUS(qid)	(IWN_SCHED_BASE + 0x10c + (qid) * 4)
1428f302007SRui Paulo #define IWN5000_SCHED_AGGR_SEL		(IWN_SCHED_BASE + 0x248)
1438f302007SRui Paulo 
1448f302007SRui Paulo /*
1458f302007SRui Paulo  * Offsets in TX scheduler's SRAM.
1468f302007SRui Paulo  */
1478f302007SRui Paulo #define IWN4965_SCHED_CTX_OFF		0x380
1488f302007SRui Paulo #define IWN4965_SCHED_CTX_LEN		416
1498f302007SRui Paulo #define IWN4965_SCHED_QUEUE_OFFSET(qid)	(0x380 + (qid) * 8)
1508f302007SRui Paulo #define IWN4965_SCHED_TRANS_TBL(qid)	(0x500 + (qid) * 2)
1518f302007SRui Paulo #define IWN5000_SCHED_CTX_OFF		0x600
1528f302007SRui Paulo #define IWN5000_SCHED_CTX_LEN		520
1538f302007SRui Paulo #define IWN5000_SCHED_QUEUE_OFFSET(qid)	(0x600 + (qid) * 8)
1548f302007SRui Paulo #define IWN5000_SCHED_TRANS_TBL(qid)	(0x7e0 + (qid) * 2)
1553971d07bSSam Leffler 
1563971d07bSSam Leffler /*
1573971d07bSSam Leffler  * NIC internal memory offsets.
1583971d07bSSam Leffler  */
1590f454b93SRui Paulo #define IWN_APMG_CLK_CTRL	0x3000
1600f454b93SRui Paulo #define IWN_APMG_CLK_EN		0x3004
1618f302007SRui Paulo #define IWN_APMG_CLK_DIS	0x3008
1628f302007SRui Paulo #define IWN_APMG_PS		0x300c
1630f454b93SRui Paulo #define IWN_APMG_DIGITAL_SVR	0x3058
1640f454b93SRui Paulo #define IWN_APMG_ANALOG_SVR	0x306c
1658f302007SRui Paulo #define IWN_APMG_PCI_STT	0x3010
1668f302007SRui Paulo #define IWN_BSM_WR_CTRL		0x3400
1678f302007SRui Paulo #define IWN_BSM_WR_MEM_SRC	0x3404
1688f302007SRui Paulo #define IWN_BSM_WR_MEM_DST	0x3408
1698f302007SRui Paulo #define IWN_BSM_WR_DWCOUNT	0x340c
1708f302007SRui Paulo #define IWN_BSM_DRAM_TEXT_ADDR	0x3490
1718f302007SRui Paulo #define IWN_BSM_DRAM_TEXT_SIZE	0x3494
1728f302007SRui Paulo #define IWN_BSM_DRAM_DATA_ADDR	0x3498
1738f302007SRui Paulo #define IWN_BSM_DRAM_DATA_SIZE	0x349c
1748f302007SRui Paulo #define IWN_BSM_SRAM_BASE	0x3800
1753971d07bSSam Leffler 
1768f302007SRui Paulo /* Possible flags for register IWN_HW_IF_CONFIG. */
1778f302007SRui Paulo #define IWN_HW_IF_CONFIG_4965_R		(1 <<  4)
1788f302007SRui Paulo #define IWN_HW_IF_CONFIG_MAC_SI		(1 <<  8)
1798f302007SRui Paulo #define IWN_HW_IF_CONFIG_RADIO_SI	(1 <<  9)
1808f302007SRui Paulo #define IWN_HW_IF_CONFIG_EEPROM_LOCKED	(1 << 21)
1818f302007SRui Paulo #define IWN_HW_IF_CONFIG_NIC_READY	(1 << 22)
1828f302007SRui Paulo #define IWN_HW_IF_CONFIG_HAP_WAKE_L1A	(1 << 23)
1838f302007SRui Paulo #define IWN_HW_IF_CONFIG_PREPARE_DONE	(1 << 25)
1848f302007SRui Paulo #define IWN_HW_IF_CONFIG_PREPARE	(1 << 27)
1853971d07bSSam Leffler 
1860f454b93SRui Paulo /* Possible values for register IWN_INT_PERIODIC. */
1870f454b93SRui Paulo #define IWN_INT_PERIODIC_DIS	0x00
1880f454b93SRui Paulo #define IWN_INT_PERIODIC_ENA	0xff
1890f454b93SRui Paulo 
1908f302007SRui Paulo /* Possible flags for registers IWN_PRPH_RADDR/IWN_PRPH_WADDR. */
1918f302007SRui Paulo #define IWN_PRPH_DWORD	((sizeof (uint32_t) - 1) << 24)
1923971d07bSSam Leffler 
1938f302007SRui Paulo /* Possible values for IWN_BSM_WR_MEM_DST. */
1948f302007SRui Paulo #define IWN_FW_TEXT_BASE	0x00000000
1958f302007SRui Paulo #define IWN_FW_DATA_BASE	0x00800000
1963971d07bSSam Leffler 
1978f302007SRui Paulo /* Possible flags for register IWN_RESET. */
1988f302007SRui Paulo #define IWN_RESET_NEVO			(1 << 0)
1998f302007SRui Paulo #define IWN_RESET_SW			(1 << 7)
2008f302007SRui Paulo #define IWN_RESET_MASTER_DISABLED	(1 << 8)
2018f302007SRui Paulo #define IWN_RESET_STOP_MASTER		(1 << 9)
2027a22215cSEitan Adler #define IWN_RESET_LINK_PWR_MGMT_DIS	(1U << 31)
2033971d07bSSam Leffler 
2048f302007SRui Paulo /* Possible flags for register IWN_GP_CNTRL. */
2058f302007SRui Paulo #define IWN_GP_CNTRL_MAC_ACCESS_ENA	(1 << 0)
2068f302007SRui Paulo #define IWN_GP_CNTRL_MAC_CLOCK_READY	(1 << 0)
2078f302007SRui Paulo #define IWN_GP_CNTRL_INIT_DONE		(1 << 2)
2088f302007SRui Paulo #define IWN_GP_CNTRL_MAC_ACCESS_REQ	(1 << 3)
2098f302007SRui Paulo #define IWN_GP_CNTRL_SLEEP		(1 << 4)
2108f302007SRui Paulo #define IWN_GP_CNTRL_RFKILL		(1 << 27)
2113971d07bSSam Leffler 
2128f302007SRui Paulo /* Possible flags for register IWN_GIO_CHICKEN. */
2138f302007SRui Paulo #define IWN_GIO_CHICKEN_L1A_NO_L0S_RX	(1 << 23)
2148f302007SRui Paulo #define IWN_GIO_CHICKEN_DIS_L0S_TIMER	(1 << 29)
2153971d07bSSam Leffler 
2168f302007SRui Paulo /* Possible flags for register IWN_GIO. */
2178f302007SRui Paulo #define IWN_GIO_L0S_ENA		(1 << 1)
2183971d07bSSam Leffler 
2190f454b93SRui Paulo /* Possible flags for register IWN_GP_DRIVER. */
2200f454b93SRui Paulo #define IWN_GP_DRIVER_RADIO_3X3_HYB	(0 << 0)
2210f454b93SRui Paulo #define IWN_GP_DRIVER_RADIO_2X2_HYB	(1 << 0)
2220f454b93SRui Paulo #define IWN_GP_DRIVER_RADIO_2X2_IPA	(2 << 0)
2237373959eSBernhard Schmidt #define IWN_GP_DRIVER_CALIB_VER6	(1 << 2)
2249dd0e40bSBernhard Schmidt #define IWN_GP_DRIVER_6050_1X2		(1 << 3)
225f8639279SAdrian Chadd #define	IWN_GP_DRIVER_REG_BIT_RADIO_IQ_INVERT	(1 << 7)
2264cfb1a08SAdrian Chadd #define	IWN_GP_DRIVER_NONE		0
2270f454b93SRui Paulo 
2288f302007SRui Paulo /* Possible flags for register IWN_UCODE_GP1_CLR. */
2298f302007SRui Paulo #define IWN_UCODE_GP1_RFKILL		(1 << 1)
2308f302007SRui Paulo #define IWN_UCODE_GP1_CMD_BLOCKED	(1 << 2)
2318f302007SRui Paulo #define IWN_UCODE_GP1_CTEMP_STOP_RF	(1 << 3)
232f8639279SAdrian Chadd #define	IWN_UCODE_GP1_CFG_COMPLETE	(1 << 5)
2333971d07bSSam Leffler 
2348f302007SRui Paulo /* Possible flags/values for register IWN_LED. */
2358f302007SRui Paulo #define IWN_LED_BSM_CTRL	(1 << 5)
2368f302007SRui Paulo #define IWN_LED_OFF		0x00000038
2378f302007SRui Paulo #define IWN_LED_ON		0x00000078
2383971d07bSSam Leffler 
239f8639279SAdrian Chadd #define	IWN_MAX_BLINK_TBL	10
240f8639279SAdrian Chadd #define	IWN_LED_STATIC_ON	0
241f8639279SAdrian Chadd #define	IWN_LED_STATIC_OFF	1
242f8639279SAdrian Chadd #define	IWN_LED_SLOW_BLINK	2
243f8639279SAdrian Chadd #define	IWN_LED_INT_BLINK	3
244f8639279SAdrian Chadd #define	IWN_LED_UNIT		0x1388	/* 5 ms */
245f8639279SAdrian Chadd 
246f8639279SAdrian Chadd static const struct {
247f8639279SAdrian Chadd 	uint16_t	tpt;	/* Mb/s */
248f8639279SAdrian Chadd 	uint8_t		on_time;
249f8639279SAdrian Chadd 	uint8_t		off_time;
250f8639279SAdrian Chadd } blink_tbl[] =
251f8639279SAdrian Chadd {
252f8639279SAdrian Chadd 	{300, 5, 5},
253f8639279SAdrian Chadd 	{200, 8, 8},
254f8639279SAdrian Chadd 	{100, 11, 11},
255f8639279SAdrian Chadd 	{70, 13, 13},
256f8639279SAdrian Chadd 	{50, 15, 15},
257f8639279SAdrian Chadd 	{20, 17, 17},
258f8639279SAdrian Chadd 	{10, 19, 19},
259f8639279SAdrian Chadd 	{5, 22, 22},
260f8639279SAdrian Chadd 	{1, 26, 26},
261f8639279SAdrian Chadd 	{0, 33, 33},
262f8639279SAdrian Chadd 	/* SOLID_ON */
263f8639279SAdrian Chadd };
264f8639279SAdrian Chadd 
2650f454b93SRui Paulo /* Possible flags for register IWN_DRAM_INT_TBL. */
2660f454b93SRui Paulo #define IWN_DRAM_INT_TBL_WRAP_CHECK	(1 << 27)
2677a22215cSEitan Adler #define IWN_DRAM_INT_TBL_ENABLE		(1U << 31)
2680f454b93SRui Paulo 
2698f302007SRui Paulo /* Possible values for register IWN_ANA_PLL. */
2708f302007SRui Paulo #define IWN_ANA_PLL_INIT	0x00880300
2713971d07bSSam Leffler 
2728f302007SRui Paulo /* Possible flags for register IWN_FH_RX_STATUS. */
2738f302007SRui Paulo #define	IWN_FH_RX_STATUS_IDLE	(1 << 24)
2743971d07bSSam Leffler 
2758f302007SRui Paulo /* Possible flags for register IWN_BSM_WR_CTRL. */
2768f302007SRui Paulo #define IWN_BSM_WR_CTRL_START_EN	(1 << 30)
2777a22215cSEitan Adler #define IWN_BSM_WR_CTRL_START		(1U << 31)
2783971d07bSSam Leffler 
2798f302007SRui Paulo /* Possible flags for register IWN_INT. */
2808f302007SRui Paulo #define IWN_INT_ALIVE		(1 <<  0)
2818f302007SRui Paulo #define IWN_INT_WAKEUP		(1 <<  1)
2828f302007SRui Paulo #define IWN_INT_SW_RX		(1 <<  3)
2838f302007SRui Paulo #define IWN_INT_CT_REACHED	(1 <<  6)
2848f302007SRui Paulo #define IWN_INT_RF_TOGGLED	(1 <<  7)
2858f302007SRui Paulo #define IWN_INT_SW_ERR		(1 << 25)
2860f454b93SRui Paulo #define IWN_INT_SCHED		(1 << 26)
2878f302007SRui Paulo #define IWN_INT_FH_TX		(1 << 27)
2880f454b93SRui Paulo #define IWN_INT_RX_PERIODIC	(1 << 28)
2898f302007SRui Paulo #define IWN_INT_HW_ERR		(1 << 29)
2907a22215cSEitan Adler #define IWN_INT_FH_RX		(1U << 31)
2913971d07bSSam Leffler 
2928f302007SRui Paulo /* Shortcut. */
2930f454b93SRui Paulo #define IWN_INT_MASK_DEF						\
2948f302007SRui Paulo 	(IWN_INT_SW_ERR | IWN_INT_HW_ERR | IWN_INT_FH_TX |		\
2958f302007SRui Paulo 	 IWN_INT_FH_RX | IWN_INT_ALIVE | IWN_INT_WAKEUP |		\
2968f302007SRui Paulo 	 IWN_INT_SW_RX | IWN_INT_CT_REACHED | IWN_INT_RF_TOGGLED)
2973971d07bSSam Leffler 
2988f302007SRui Paulo /* Possible flags for register IWN_FH_INT. */
2998f302007SRui Paulo #define IWN_FH_INT_TX_CHNL(x)	(1 << (x))
3008f302007SRui Paulo #define IWN_FH_INT_RX_CHNL(x)	(1 << ((x) + 16))
3018f302007SRui Paulo #define IWN_FH_INT_HI_PRIOR	(1 << 30)
3028f302007SRui Paulo /* Shortcuts for the above. */
3038f302007SRui Paulo #define IWN_FH_INT_TX							\
3048f302007SRui Paulo 	(IWN_FH_INT_TX_CHNL(0) | IWN_FH_INT_TX_CHNL(1))
3058f302007SRui Paulo #define IWN_FH_INT_RX							\
3068f302007SRui Paulo 	(IWN_FH_INT_RX_CHNL(0) | IWN_FH_INT_RX_CHNL(1) | IWN_FH_INT_HI_PRIOR)
3073971d07bSSam Leffler 
3088f302007SRui Paulo /* Possible flags/values for register IWN_FH_TX_CONFIG. */
3098f302007SRui Paulo #define IWN_FH_TX_CONFIG_DMA_PAUSE		0
3107a22215cSEitan Adler #define IWN_FH_TX_CONFIG_DMA_ENA		(1U << 31)
3118f302007SRui Paulo #define IWN_FH_TX_CONFIG_CIRQ_HOST_ENDTFD	(1 << 20)
3123971d07bSSam Leffler 
3138f302007SRui Paulo /* Possible flags/values for register IWN_FH_TXBUF_STATUS. */
3148f302007SRui Paulo #define IWN_FH_TXBUF_STATUS_TBNUM(x)	((x) << 20)
3158f302007SRui Paulo #define IWN_FH_TXBUF_STATUS_TBIDX(x)	((x) << 12)
3168f302007SRui Paulo #define IWN_FH_TXBUF_STATUS_TFBD_VALID	3
3178f302007SRui Paulo 
3188f302007SRui Paulo /* Possible flags for register IWN_FH_TX_CHICKEN. */
3198f302007SRui Paulo #define IWN_FH_TX_CHICKEN_SCHED_RETRY	(1 << 1)
3208f302007SRui Paulo 
3218f302007SRui Paulo /* Possible flags for register IWN_FH_TX_STATUS. */
32269e775c3SBernhard Schmidt #define IWN_FH_TX_STATUS_IDLE(chnl)	(1 << ((chnl) + 16))
3238f302007SRui Paulo 
3248f302007SRui Paulo /* Possible flags for register IWN_FH_RX_CONFIG. */
3257a22215cSEitan Adler #define IWN_FH_RX_CONFIG_ENA		(1U << 31)
3268f302007SRui Paulo #define IWN_FH_RX_CONFIG_NRBD(x)	((x) << 20)
3278f302007SRui Paulo #define IWN_FH_RX_CONFIG_RB_SIZE_8K	(1 << 16)
3288f302007SRui Paulo #define IWN_FH_RX_CONFIG_SINGLE_FRAME	(1 << 15)
3298f302007SRui Paulo #define IWN_FH_RX_CONFIG_IRQ_DST_HOST	(1 << 12)
3308f302007SRui Paulo #define IWN_FH_RX_CONFIG_RB_TIMEOUT(x)	((x) << 4)
3318f302007SRui Paulo #define IWN_FH_RX_CONFIG_IGN_RXF_EMPTY	(1 <<  2)
3328f302007SRui Paulo 
3338f302007SRui Paulo /* Possible flags for register IWN_FH_TX_CONFIG. */
3347a22215cSEitan Adler #define IWN_FH_TX_CONFIG_DMA_ENA	(1U << 31)
3358f302007SRui Paulo #define IWN_FH_TX_CONFIG_DMA_CREDIT_ENA	(1 <<  3)
3368f302007SRui Paulo 
3378f302007SRui Paulo /* Possible flags for register IWN_EEPROM. */
3388f302007SRui Paulo #define IWN_EEPROM_READ_VALID	(1 << 0)
3398f302007SRui Paulo #define IWN_EEPROM_CMD		(1 << 1)
3408f302007SRui Paulo 
3418f302007SRui Paulo /* Possible flags for register IWN_EEPROM_GP. */
3428f302007SRui Paulo #define IWN_EEPROM_GP_IF_OWNER	0x00000180
3438f302007SRui Paulo 
3448f302007SRui Paulo /* Possible flags for register IWN_OTP_GP. */
3458f302007SRui Paulo #define IWN_OTP_GP_DEV_SEL_OTP		(1 << 16)
3468f302007SRui Paulo #define IWN_OTP_GP_RELATIVE_ACCESS	(1 << 17)
3478f302007SRui Paulo #define IWN_OTP_GP_ECC_CORR_STTS	(1 << 20)
3488f302007SRui Paulo #define IWN_OTP_GP_ECC_UNCORR_STTS	(1 << 21)
3498f302007SRui Paulo 
3508f302007SRui Paulo /* Possible flags for register IWN_SCHED_QUEUE_STATUS. */
3518f302007SRui Paulo #define IWN4965_TXQ_STATUS_ACTIVE	0x0007fc01
3528f302007SRui Paulo #define IWN4965_TXQ_STATUS_INACTIVE	0x0007fc00
3538f302007SRui Paulo #define IWN4965_TXQ_STATUS_AGGR_ENA	(1 << 5 | 1 << 8)
3548f302007SRui Paulo #define IWN4965_TXQ_STATUS_CHGACT	(1 << 10)
3558f302007SRui Paulo #define IWN5000_TXQ_STATUS_ACTIVE	0x00ff0018
3568f302007SRui Paulo #define IWN5000_TXQ_STATUS_INACTIVE	0x00ff0010
3578f302007SRui Paulo #define IWN5000_TXQ_STATUS_CHGACT	(1 << 19)
3588f302007SRui Paulo 
3590f454b93SRui Paulo /* Possible flags for registers IWN_APMG_CLK_*. */
3608f302007SRui Paulo #define IWN_APMG_CLK_CTRL_DMA_CLK_RQT	(1 <<  9)
3618f302007SRui Paulo #define IWN_APMG_CLK_CTRL_BSM_CLK_RQT	(1 << 11)
3628f302007SRui Paulo 
3638f302007SRui Paulo /* Possible flags for register IWN_APMG_PS. */
3648f302007SRui Paulo #define IWN_APMG_PS_EARLY_PWROFF_DIS	(1 << 22)
3658f302007SRui Paulo #define IWN_APMG_PS_PWR_SRC(x)		((x) << 24)
3668f302007SRui Paulo #define IWN_APMG_PS_PWR_SRC_VMAIN	0
3678f302007SRui Paulo #define IWN_APMG_PS_PWR_SRC_VAUX	2
3688f302007SRui Paulo #define IWN_APMG_PS_PWR_SRC_MASK	IWN_APMG_PS_PWR_SRC(3)
3698f302007SRui Paulo #define IWN_APMG_PS_RESET_REQ		(1 << 26)
3708f302007SRui Paulo 
3710f454b93SRui Paulo /* Possible flags for register IWN_APMG_DIGITAL_SVR. */
3720f454b93SRui Paulo #define IWN_APMG_DIGITAL_SVR_VOLTAGE(x)		(((x) & 0xf) << 5)
3730f454b93SRui Paulo #define IWN_APMG_DIGITAL_SVR_VOLTAGE_MASK	\
3740f454b93SRui Paulo 	IWN_APMG_DIGITAL_SVR_VOLTAGE(0xf)
3750f454b93SRui Paulo #define IWN_APMG_DIGITAL_SVR_VOLTAGE_1_32	\
3760f454b93SRui Paulo 	IWN_APMG_DIGITAL_SVR_VOLTAGE(3)
3770f454b93SRui Paulo 
3788f302007SRui Paulo /* Possible flags for IWN_APMG_PCI_STT. */
3798f302007SRui Paulo #define IWN_APMG_PCI_STT_L1A_DIS	(1 << 11)
3808f302007SRui Paulo 
3818f302007SRui Paulo /* Possible flags for register IWN_BSM_DRAM_TEXT_SIZE. */
3827a22215cSEitan Adler #define IWN_FW_UPDATED	(1U << 31)
3833971d07bSSam Leffler 
3848f302007SRui Paulo #define IWN_SCHED_WINSZ		64
3858f302007SRui Paulo #define IWN_SCHED_LIMIT		64
3868f302007SRui Paulo #define IWN4965_SCHED_COUNT	512
3878f302007SRui Paulo #define IWN5000_SCHED_COUNT	(IWN_TX_RING_COUNT + IWN_SCHED_WINSZ)
3888f302007SRui Paulo #define IWN4965_SCHEDSZ		(IWN4965_NTXQUEUES * IWN4965_SCHED_COUNT * 2)
3898f302007SRui Paulo #define IWN5000_SCHEDSZ		(IWN5000_NTXQUEUES * IWN5000_SCHED_COUNT * 2)
3903971d07bSSam Leffler 
3918f302007SRui Paulo struct iwn_tx_desc {
3928f302007SRui Paulo 	uint8_t		reserved1[3];
3938f302007SRui Paulo 	uint8_t		nsegs;
3948f302007SRui Paulo 	struct {
3958f302007SRui Paulo 		uint32_t	addr;
3968f302007SRui Paulo 		uint16_t	len;
3978f302007SRui Paulo 	} __packed	segs[IWN_MAX_SCATTER];
3988f302007SRui Paulo 	/* Pad to 128 bytes. */
3998f302007SRui Paulo 	uint32_t	reserved2;
4008f302007SRui Paulo } __packed;
4013971d07bSSam Leffler 
4028f302007SRui Paulo struct iwn_rx_status {
4033971d07bSSam Leffler 	uint16_t	closed_count;
4043971d07bSSam Leffler 	uint16_t	closed_rx_count;
4053971d07bSSam Leffler 	uint16_t	finished_count;
4063971d07bSSam Leffler 	uint16_t	finished_rx_count;
4073971d07bSSam Leffler 	uint32_t	reserved[2];
4083971d07bSSam Leffler } __packed;
4093971d07bSSam Leffler 
4103971d07bSSam Leffler struct iwn_rx_desc {
411f8639279SAdrian Chadd 	/*
412f8639279SAdrian Chadd 	 * The first 4 bytes of the RX frame header contain both the RX frame
413f8639279SAdrian Chadd 	 * size and some flags.
414f8639279SAdrian Chadd 	 * Bit fields:
415f8639279SAdrian Chadd 	 * 31:    flag flush RB request
416f8639279SAdrian Chadd 	 * 30:    flag ignore TC (terminal counter) request
417f8639279SAdrian Chadd 	 * 29:    flag fast IRQ request
418f8639279SAdrian Chadd 	 * 28-14: Reserved
419f8639279SAdrian Chadd 	 * 13-00: RX frame size
420f8639279SAdrian Chadd 	 */
4213971d07bSSam Leffler 	uint32_t	len;
4223971d07bSSam Leffler 	uint8_t		type;
4233971d07bSSam Leffler #define IWN_UC_READY			  1
4243971d07bSSam Leffler #define IWN_ADD_NODE_DONE		 24
4253971d07bSSam Leffler #define IWN_TX_DONE			 28
426f8639279SAdrian Chadd #define	IWN_REPLY_LED_CMD		72
4278f302007SRui Paulo #define IWN5000_CALIBRATION_RESULT	102
4288f302007SRui Paulo #define IWN5000_CALIBRATION_DONE	103
4293971d07bSSam Leffler #define IWN_START_SCAN			130
430f8639279SAdrian Chadd #define	IWN_NOTIF_SCAN_RESULT		131
4313971d07bSSam Leffler #define IWN_STOP_SCAN			132
4323971d07bSSam Leffler #define IWN_RX_STATISTICS		156
4333971d07bSSam Leffler #define IWN_BEACON_STATISTICS		157
4343971d07bSSam Leffler #define IWN_STATE_CHANGED		161
4353971d07bSSam Leffler #define IWN_BEACON_MISSED		162
4368f302007SRui Paulo #define IWN_RX_PHY			192
4378f302007SRui Paulo #define IWN_MPDU_RX_DONE		193
4383971d07bSSam Leffler #define IWN_RX_DONE			195
4390f454b93SRui Paulo #define IWN_RX_COMPRESSED_BA		197
4403971d07bSSam Leffler 
441f8639279SAdrian Chadd 	uint8_t		flags;	/* 0:5 reserved, 6 abort, 7 internal */
442f8639279SAdrian Chadd 	uint8_t		idx;	/* position within TX queue */
4433971d07bSSam Leffler 	uint8_t		qid;
444f8639279SAdrian Chadd 	/* 0:4 TX queue id - 5:6 reserved - 7 unsolicited RX
445f8639279SAdrian Chadd 	 * or uCode-originated notification
446f8639279SAdrian Chadd 	 */
4473971d07bSSam Leffler } __packed;
4483971d07bSSam Leffler 
449f8639279SAdrian Chadd #define	IWN_RX_DESC_QID_MSK		0x1F
450f8639279SAdrian Chadd #define	IWN_UNSOLICITED_RX_NOTIF	0x80
451f8639279SAdrian Chadd 
452f8639279SAdrian Chadd /* CARD_STATE_NOTIFICATION */
453f8639279SAdrian Chadd #define	IWN_STATE_CHANGE_HW_CARD_DISABLED		0x01
454f8639279SAdrian Chadd #define	IWN_STATE_CHANGE_SW_CARD_DISABLED		0x02
455f8639279SAdrian Chadd #define	IWN_STATE_CHANGE_CT_CARD_DISABLED		0x04
456f8639279SAdrian Chadd #define	IWN_STATE_CHANGE_RXON_CARD_DISABLED		0x10
457f8639279SAdrian Chadd 
4588f302007SRui Paulo /* Possible RX status flags. */
4593971d07bSSam Leffler #define IWN_RX_NO_CRC_ERR	(1 <<  0)
4603971d07bSSam Leffler #define IWN_RX_NO_OVFL_ERR	(1 <<  1)
4618f302007SRui Paulo /* Shortcut for the above. */
4623971d07bSSam Leffler #define IWN_RX_NOERROR	(IWN_RX_NO_CRC_ERR | IWN_RX_NO_OVFL_ERR)
4638f302007SRui Paulo #define IWN_RX_MPDU_MIC_OK	(1 <<  6)
4648f302007SRui Paulo #define IWN_RX_CIPHER_MASK	(7 <<  8)
4658f302007SRui Paulo #define IWN_RX_CIPHER_CCMP	(2 <<  8)
4668f302007SRui Paulo #define IWN_RX_MPDU_DEC		(1 << 11)
4678f302007SRui Paulo #define IWN_RX_DECRYPT_MASK	(3 << 11)
4688f302007SRui Paulo #define IWN_RX_DECRYPT_OK	(3 << 11)
4693971d07bSSam Leffler 
4703971d07bSSam Leffler struct iwn_tx_cmd {
4713971d07bSSam Leffler 	uint8_t	code;
4720f454b93SRui Paulo #define IWN_CMD_RXON			 16
4730f454b93SRui Paulo #define IWN_CMD_RXON_ASSOC		 17
4748f302007SRui Paulo #define IWN_CMD_EDCA_PARAMS		 19
4758f302007SRui Paulo #define IWN_CMD_TIMING			 20
4768f302007SRui Paulo #define IWN_CMD_ADD_NODE		 24
4778f302007SRui Paulo #define IWN_CMD_TX_DATA			 28
4788f302007SRui Paulo #define IWN_CMD_LINK_QUALITY		 78
4798f302007SRui Paulo #define IWN_CMD_SET_LED			 72
4808f302007SRui Paulo #define IWN5000_CMD_WIMAX_COEX		 90
481f8639279SAdrian Chadd #define	IWN_TEMP_NOTIFICATION		98
4828f302007SRui Paulo #define IWN5000_CMD_CALIB_CONFIG	101
483654baa4aSRui Paulo #define IWN5000_CMD_CALIB_RESULT	102
484654baa4aSRui Paulo #define IWN5000_CMD_CALIB_COMPLETE	103
4858f302007SRui Paulo #define IWN_CMD_SET_POWER_MODE		119
4868f302007SRui Paulo #define IWN_CMD_SCAN			128
487654baa4aSRui Paulo #define IWN_CMD_SCAN_RESULTS		131
4880f454b93SRui Paulo #define IWN_CMD_TXPOWER_DBM		149
4898f302007SRui Paulo #define IWN_CMD_TXPOWER			151
4900f454b93SRui Paulo #define IWN5000_CMD_TX_ANT_CONFIG	152
491bc0203e2SAdrian Chadd #define IWN_CMD_TXPOWER_DBM_V1		152
4928f302007SRui Paulo #define IWN_CMD_BT_COEX			155
4938f302007SRui Paulo #define IWN_CMD_GET_STATISTICS		156
4948f302007SRui Paulo #define IWN_CMD_SET_CRITICAL_TEMP	164
4958f302007SRui Paulo #define IWN_CMD_SET_SENSITIVITY		168
4968f302007SRui Paulo #define IWN_CMD_PHY_CALIB		176
4978bb237d9SBernhard Schmidt #define IWN_CMD_BT_COEX_PRIOTABLE	204
4988bb237d9SBernhard Schmidt #define IWN_CMD_BT_COEX_PROT		205
499f8639279SAdrian Chadd #define	IWN_CMD_BT_COEX_NOTIF		206
500f8639279SAdrian Chadd /* PAN commands */
501f8639279SAdrian Chadd #define	IWN_CMD_WIPAN_PARAMS			0xb2
502f8639279SAdrian Chadd #define	IWN_CMD_WIPAN_RXON			0xb3
503f8639279SAdrian Chadd #define	IWN_CMD_WIPAN_RXON_TIMING		0xb4
504f8639279SAdrian Chadd #define	IWN_CMD_WIPAN_RXON_ASSOC		0xb6
505f8639279SAdrian Chadd #define	IWN_CMD_WIPAN_QOS_PARAM			0xb7
506f8639279SAdrian Chadd #define	IWN_CMD_WIPAN_WEPKEY			0xb8
507f8639279SAdrian Chadd #define	IWN_CMD_WIPAN_P2P_CHANNEL_SWITCH	0xb9
508f8639279SAdrian Chadd #define	IWN_CMD_WIPAN_NOA_NOTIFICATION		0xbc
509f8639279SAdrian Chadd #define	IWN_CMD_WIPAN_DEACTIVATION_COMPLETE	0xbd
5108f302007SRui Paulo 
5113971d07bSSam Leffler 	uint8_t	flags;
5123971d07bSSam Leffler 	uint8_t	idx;
5133971d07bSSam Leffler 	uint8_t	qid;
5143971d07bSSam Leffler 	uint8_t	data[136];
5153971d07bSSam Leffler } __packed;
5163971d07bSSam Leffler 
517f8639279SAdrian Chadd /*
518f8639279SAdrian Chadd  * Structure for IWN_CMD_GET_STATISTICS = (0x9c) 156
519f8639279SAdrian Chadd  * all devices identical.
520f8639279SAdrian Chadd  *
521f8639279SAdrian Chadd  * This command triggers an immediate response containing uCode statistics.
522f8639279SAdrian Chadd  * The response is in the same format as IWN_BEACON_STATISTICS (0x9d) 157.
523f8639279SAdrian Chadd  *
524f8639279SAdrian Chadd  * If the CLEAR_STATS configuration flag is set, uCode will clear its
525f8639279SAdrian Chadd  * internal copy of the statistics (counters) after issuing the response.
526f8639279SAdrian Chadd  * This flag does not affect IWN_BEACON_STATISTICS after beacons (see below).
527f8639279SAdrian Chadd  *
528f8639279SAdrian Chadd  * If the DISABLE_NOTIF configuration flag is set, uCode will not issue
529f8639279SAdrian Chadd  * IWN_BEACON_STATISTICS after received beacons.  This flag
530f8639279SAdrian Chadd  * does not affect the response to the IWN_CMD_GET_STATISTICS 0x9c itself.
531f8639279SAdrian Chadd  */
532f8639279SAdrian Chadd struct iwn_statistics_cmd {
533f8639279SAdrian Chadd 	uint32_t	configuration_flags;
534f8639279SAdrian Chadd #define	IWN_STATS_CONF_CLEAR_STATS		htole32(0x1)
535f8639279SAdrian Chadd #define	IWN_STATS_CONF_DISABLE_NOTIF	htole32(0x2)
536f8639279SAdrian Chadd } __packed;
537f8639279SAdrian Chadd 
5388f302007SRui Paulo /* Antenna flags, used in various commands. */
5398f302007SRui Paulo #define IWN_ANT_A	(1 << 0)
5408f302007SRui Paulo #define IWN_ANT_B	(1 << 1)
5418f302007SRui Paulo #define IWN_ANT_C	(1 << 2)
5420f454b93SRui Paulo /* Shortcuts. */
5430f454b93SRui Paulo #define IWN_ANT_AB	(IWN_ANT_A | IWN_ANT_B)
5440f454b93SRui Paulo #define IWN_ANT_BC	(IWN_ANT_B | IWN_ANT_C)
545f8639279SAdrian Chadd #define	IWN_ANT_AC	(IWN_ANT_A | IWN_ANT_C)
5468f302007SRui Paulo #define IWN_ANT_ABC	(IWN_ANT_A | IWN_ANT_B | IWN_ANT_C)
5478f302007SRui Paulo 
5480f454b93SRui Paulo /* Structure for command IWN_CMD_RXON. */
5498f302007SRui Paulo struct iwn_rxon {
5503971d07bSSam Leffler 	uint8_t		myaddr[IEEE80211_ADDR_LEN];
5513971d07bSSam Leffler 	uint16_t	reserved1;
5523971d07bSSam Leffler 	uint8_t		bssid[IEEE80211_ADDR_LEN];
5533971d07bSSam Leffler 	uint16_t	reserved2;
5543971d07bSSam Leffler 	uint8_t		wlap[IEEE80211_ADDR_LEN];
5553971d07bSSam Leffler 	uint16_t	reserved3;
5563971d07bSSam Leffler 	uint8_t		mode;
5573971d07bSSam Leffler #define IWN_MODE_HOSTAP		1
5583971d07bSSam Leffler #define IWN_MODE_STA		3
5593971d07bSSam Leffler #define IWN_MODE_IBSS		4
5603971d07bSSam Leffler #define IWN_MODE_MONITOR	6
561f8639279SAdrian Chadd #define	IWN_MODE_2STA		8
562f8639279SAdrian Chadd #define	IWN_MODE_P2P		9
5638f302007SRui Paulo 
5648f302007SRui Paulo 	uint8_t		air;
5653971d07bSSam Leffler 	uint16_t	rxchain;
5660f454b93SRui Paulo #define IWN_RXCHAIN_DRIVER_FORCE	(1 << 0)
5670f454b93SRui Paulo #define IWN_RXCHAIN_VALID(x)		(((x) & IWN_ANT_ABC) << 1)
5680f454b93SRui Paulo #define IWN_RXCHAIN_FORCE_SEL(x)	(((x) & IWN_ANT_ABC) << 4)
5690f454b93SRui Paulo #define IWN_RXCHAIN_FORCE_MIMO_SEL(x)	(((x) & IWN_ANT_ABC) << 7)
5708f302007SRui Paulo #define IWN_RXCHAIN_IDLE_COUNT(x)	((x) << 10)
5718f302007SRui Paulo #define IWN_RXCHAIN_MIMO_COUNT(x)	((x) << 12)
5728f302007SRui Paulo #define IWN_RXCHAIN_MIMO_FORCE		(1 << 14)
5738f302007SRui Paulo 
5748f302007SRui Paulo 	uint8_t		ofdm_mask;
5758f302007SRui Paulo 	uint8_t		cck_mask;
5763971d07bSSam Leffler 	uint16_t	associd;
5773971d07bSSam Leffler 	uint32_t	flags;
5780f454b93SRui Paulo #define IWN_RXON_24GHZ		(1 <<  0)
5790f454b93SRui Paulo #define IWN_RXON_CCK		(1 <<  1)
5800f454b93SRui Paulo #define IWN_RXON_AUTO		(1 <<  2)
5810f454b93SRui Paulo #define IWN_RXON_SHSLOT		(1 <<  4)
5820f454b93SRui Paulo #define IWN_RXON_SHPREAMBLE	(1 <<  5)
5830f454b93SRui Paulo #define IWN_RXON_NODIVERSITY	(1 <<  7)
5840f454b93SRui Paulo #define IWN_RXON_ANTENNA_A	(1 <<  8)
5850f454b93SRui Paulo #define IWN_RXON_ANTENNA_B	(1 <<  9)
5860f454b93SRui Paulo #define IWN_RXON_TSF		(1 << 15)
587b5d2f6bfSBernhard Schmidt #define IWN_RXON_HT_HT40MINUS	(1 << 22)
58854991f37SAdrian Chadd 
589b5d2f6bfSBernhard Schmidt #define IWN_RXON_HT_PROTMODE(x)	(x << 23)
59054991f37SAdrian Chadd 
59154991f37SAdrian Chadd /* 0=legacy, 1=pure40, 2=mixed */
592b5d2f6bfSBernhard Schmidt #define IWN_RXON_HT_MODEPURE40	(1 << 25)
593b5d2f6bfSBernhard Schmidt #define IWN_RXON_HT_MODEMIXED	(2 << 25)
59454991f37SAdrian Chadd 
5950f454b93SRui Paulo #define IWN_RXON_CTS_TO_SELF	(1 << 30)
5968f302007SRui Paulo 
5973971d07bSSam Leffler 	uint32_t	filter;
5988f302007SRui Paulo #define IWN_FILTER_PROMISC	(1 << 0)
5998f302007SRui Paulo #define IWN_FILTER_CTL		(1 << 1)
6008f302007SRui Paulo #define IWN_FILTER_MULTICAST	(1 << 2)
6018f302007SRui Paulo #define IWN_FILTER_NODECRYPT	(1 << 3)
6028f302007SRui Paulo #define IWN_FILTER_BSS		(1 << 5)
6038f302007SRui Paulo #define IWN_FILTER_BEACON	(1 << 6)
6048f302007SRui Paulo 
6058f302007SRui Paulo 	uint8_t		chan;
6068f302007SRui Paulo 	uint8_t		reserved4;
6078f302007SRui Paulo 	uint8_t		ht_single_mask;
6088f302007SRui Paulo 	uint8_t		ht_dual_mask;
6090f454b93SRui Paulo 	/* The following fields are for >=5000 Series only. */
6108f302007SRui Paulo 	uint8_t		ht_triple_mask;
6118f302007SRui Paulo 	uint8_t		reserved5;
6128f302007SRui Paulo 	uint16_t	acquisition;
6138f302007SRui Paulo 	uint16_t	reserved6;
6143971d07bSSam Leffler } __packed;
6153971d07bSSam Leffler 
6168f302007SRui Paulo #define IWN4965_RXONSZ	(sizeof (struct iwn_rxon) - 6)
6178f302007SRui Paulo #define IWN5000_RXONSZ	(sizeof (struct iwn_rxon))
6188f302007SRui Paulo 
6199d5228cdSAndriy Voskoboinyk /* Structure for command IWN_CMD_RXON_ASSOC (4965AGN only.) */
6209d5228cdSAndriy Voskoboinyk struct iwn4965_rxon_assoc {
6219d5228cdSAndriy Voskoboinyk 	uint32_t	flags;
6229d5228cdSAndriy Voskoboinyk 	uint32_t	filter;
6239d5228cdSAndriy Voskoboinyk 	uint8_t		ofdm_mask;
6249d5228cdSAndriy Voskoboinyk 	uint8_t		cck_mask;
6259d5228cdSAndriy Voskoboinyk 	uint8_t		ht_single_mask;
6269d5228cdSAndriy Voskoboinyk 	uint8_t		ht_dual_mask;
6279d5228cdSAndriy Voskoboinyk 	uint16_t	rxchain;
6289d5228cdSAndriy Voskoboinyk 	uint16_t	reserved;
6299d5228cdSAndriy Voskoboinyk } __packed;
6309d5228cdSAndriy Voskoboinyk 
6319d5228cdSAndriy Voskoboinyk /* Structure for command IWN_CMD_RXON_ASSOC (5000 Series only.) */
6329d5228cdSAndriy Voskoboinyk struct iwn5000_rxon_assoc {
6339d5228cdSAndriy Voskoboinyk 	uint32_t	flags;
6349d5228cdSAndriy Voskoboinyk 	uint32_t	filter;
6359d5228cdSAndriy Voskoboinyk 	uint8_t		ofdm_mask;
6369d5228cdSAndriy Voskoboinyk 	uint8_t		cck_mask;
6379d5228cdSAndriy Voskoboinyk 	uint16_t	reserved1;
6389d5228cdSAndriy Voskoboinyk 	uint8_t		ht_single_mask;
6399d5228cdSAndriy Voskoboinyk 	uint8_t		ht_dual_mask;
6409d5228cdSAndriy Voskoboinyk 	uint8_t		ht_triple_mask;
6419d5228cdSAndriy Voskoboinyk 	uint8_t		reserved2;
6429d5228cdSAndriy Voskoboinyk 	uint16_t	rxchain;
6439d5228cdSAndriy Voskoboinyk 	uint16_t	acquisition;
6449d5228cdSAndriy Voskoboinyk 	uint32_t	reserved3;
6459d5228cdSAndriy Voskoboinyk } __packed;
6469d5228cdSAndriy Voskoboinyk 
6478f302007SRui Paulo /* Structure for command IWN_CMD_ASSOCIATE. */
6483971d07bSSam Leffler struct iwn_assoc {
6493971d07bSSam Leffler 	uint32_t	flags;
6503971d07bSSam Leffler 	uint32_t	filter;
6513971d07bSSam Leffler 	uint8_t		ofdm_mask;
6523971d07bSSam Leffler 	uint8_t		cck_mask;
6533971d07bSSam Leffler 	uint16_t	reserved;
6543971d07bSSam Leffler } __packed;
6553971d07bSSam Leffler 
6568f302007SRui Paulo /* Structure for command IWN_CMD_EDCA_PARAMS. */
6573971d07bSSam Leffler struct iwn_edca_params {
6583971d07bSSam Leffler 	uint32_t	flags;
6593971d07bSSam Leffler #define IWN_EDCA_UPDATE	(1 << 0)
6603971d07bSSam Leffler #define IWN_EDCA_TXOP	(1 << 4)
6613971d07bSSam Leffler 
6623971d07bSSam Leffler 	struct {
6633971d07bSSam Leffler 		uint16_t	cwmin;
6643971d07bSSam Leffler 		uint16_t	cwmax;
6653971d07bSSam Leffler 		uint8_t		aifsn;
6663971d07bSSam Leffler 		uint8_t		reserved;
6673971d07bSSam Leffler 		uint16_t	txoplimit;
6680f454b93SRui Paulo 	} __packed	ac[WME_NUM_AC];
6693971d07bSSam Leffler } __packed;
6703971d07bSSam Leffler 
6718f302007SRui Paulo /* Structure for command IWN_CMD_TIMING. */
6728f302007SRui Paulo struct iwn_cmd_timing {
6733971d07bSSam Leffler 	uint64_t	tstamp;
6743971d07bSSam Leffler 	uint16_t	bintval;
6753971d07bSSam Leffler 	uint16_t	atim;
6763971d07bSSam Leffler 	uint32_t	binitval;
6773971d07bSSam Leffler 	uint16_t	lintval;
678f8639279SAdrian Chadd 	uint8_t		dtim_period;
679f8639279SAdrian Chadd 	uint8_t		delta_cp_bss_tbtts;
6803971d07bSSam Leffler } __packed;
6813971d07bSSam Leffler 
6828f302007SRui Paulo /* Structure for command IWN_CMD_ADD_NODE. */
6833971d07bSSam Leffler struct iwn_node_info {
6843971d07bSSam Leffler 	uint8_t		control;
6853971d07bSSam Leffler #define IWN_NODE_UPDATE		(1 << 0)
6868f302007SRui Paulo 
6873971d07bSSam Leffler 	uint8_t		reserved1[3];
6888f302007SRui Paulo 
6893971d07bSSam Leffler 	uint8_t		macaddr[IEEE80211_ADDR_LEN];
6903971d07bSSam Leffler 	uint16_t	reserved2;
6913971d07bSSam Leffler 	uint8_t		id;
6923971d07bSSam Leffler #define IWN_ID_BSS		0
693f8639279SAdrian Chadd #define	IWN_STA_ID		1
694f8639279SAdrian Chadd 
695f8639279SAdrian Chadd #define	IWN_PAN_ID_BCAST	14
6968f302007SRui Paulo #define IWN5000_ID_BROADCAST	15
6978f302007SRui Paulo #define IWN4965_ID_BROADCAST	31
69864b92f26SAndriy Voskoboinyk 
69964b92f26SAndriy Voskoboinyk #define IWN_ID_UNDEFINED	(uint8_t)-1
7008f302007SRui Paulo 
7013971d07bSSam Leffler 	uint8_t		flags;
7023971d07bSSam Leffler #define IWN_FLAG_SET_KEY		(1 << 0)
7038f302007SRui Paulo #define IWN_FLAG_SET_DISABLE_TID	(1 << 1)
7048f302007SRui Paulo #define IWN_FLAG_SET_TXRATE		(1 << 2)
7058f302007SRui Paulo #define IWN_FLAG_SET_ADDBA		(1 << 3)
7068f302007SRui Paulo #define IWN_FLAG_SET_DELBA		(1 << 4)
7078f302007SRui Paulo 
7083971d07bSSam Leffler 	uint16_t	reserved3;
7098f302007SRui Paulo 	uint16_t	kflags;
7108f302007SRui Paulo #define IWN_KFLAG_CCMP		(1 <<  1)
7118f302007SRui Paulo #define IWN_KFLAG_MAP		(1 <<  3)
7128f302007SRui Paulo #define IWN_KFLAG_KID(kid)	((kid) << 8)
7138f302007SRui Paulo #define IWN_KFLAG_INVALID	(1 << 11)
7148f302007SRui Paulo #define IWN_KFLAG_GROUP		(1 << 14)
7158f302007SRui Paulo 
7163971d07bSSam Leffler 	uint8_t		tsc2;	/* TKIP TSC2 */
7173971d07bSSam Leffler 	uint8_t		reserved4;
7183971d07bSSam Leffler 	uint16_t	ttak[5];
7198f302007SRui Paulo 	uint8_t		kid;
7208f302007SRui Paulo 	uint8_t		reserved5;
7218f302007SRui Paulo 	uint8_t		key[16];
7228f302007SRui Paulo 	/* The following 3 fields are for 5000 Series only. */
7238f302007SRui Paulo 	uint64_t	tsc;
7248f302007SRui Paulo 	uint8_t		rxmic[8];
7258f302007SRui Paulo 	uint8_t		txmic[8];
7268f302007SRui Paulo 
7273971d07bSSam Leffler 	uint32_t	htflags;
728b5d2f6bfSBernhard Schmidt #define IWN_SMPS_MIMO_PROT		(1 << 17)
7298f302007SRui Paulo #define IWN_AMDPU_SIZE_FACTOR(x)	((x) << 19)
730b5d2f6bfSBernhard Schmidt #define IWN_NODE_HT40			(1 << 21)
731b5d2f6bfSBernhard Schmidt #define IWN_SMPS_MIMO_DIS		(1 << 22)
7328f302007SRui Paulo #define IWN_AMDPU_DENSITY(x)		((x) << 23)
7338f302007SRui Paulo 
7343971d07bSSam Leffler 	uint32_t	mask;
7358f302007SRui Paulo 	uint16_t	disable_tid;
7368f302007SRui Paulo 	uint16_t	reserved6;
7378f302007SRui Paulo 	uint8_t		addba_tid;
7388f302007SRui Paulo 	uint8_t		delba_tid;
7398f302007SRui Paulo 	uint16_t	addba_ssn;
7408f302007SRui Paulo 	uint32_t	reserved7;
7418f302007SRui Paulo } __packed;
7428f302007SRui Paulo 
7438f302007SRui Paulo struct iwn4965_node_info {
7448f302007SRui Paulo 	uint8_t		control;
7458f302007SRui Paulo 	uint8_t		reserved1[3];
7468f302007SRui Paulo 	uint8_t		macaddr[IEEE80211_ADDR_LEN];
7478f302007SRui Paulo 	uint16_t	reserved2;
7488f302007SRui Paulo 	uint8_t		id;
7498f302007SRui Paulo 	uint8_t		flags;
7508f302007SRui Paulo 	uint16_t	reserved3;
7518f302007SRui Paulo 	uint16_t	kflags;
7528f302007SRui Paulo 	uint8_t		tsc2;	/* TKIP TSC2 */
7538f302007SRui Paulo 	uint8_t		reserved4;
7548f302007SRui Paulo 	uint16_t	ttak[5];
7558f302007SRui Paulo 	uint8_t		kid;
7568f302007SRui Paulo 	uint8_t		reserved5;
7578f302007SRui Paulo 	uint8_t		key[16];
7588f302007SRui Paulo 	uint32_t	htflags;
7598f302007SRui Paulo 	uint32_t	mask;
7608f302007SRui Paulo 	uint16_t	disable_tid;
7618f302007SRui Paulo 	uint16_t	reserved6;
7628f302007SRui Paulo 	uint8_t		addba_tid;
7638f302007SRui Paulo 	uint8_t		delba_tid;
7648f302007SRui Paulo 	uint16_t	addba_ssn;
7658f302007SRui Paulo 	uint32_t	reserved7;
7668f302007SRui Paulo } __packed;
7678f302007SRui Paulo 
7687ab19263SAndriy Voskoboinyk #define IWN_RFLAG_RATE		0xff
7697ab19263SAndriy Voskoboinyk #define IWN_RFLAG_RATE_MCS	0x1f
7707ab19263SAndriy Voskoboinyk #define IWN_RFLAG_HT40_DUP	0x20
7717ab19263SAndriy Voskoboinyk 
772fa818eaeSBernhard Schmidt #define IWN_RFLAG_MCS		(1 << 8)
7731647639aSBernhard Schmidt #define IWN_RFLAG_CCK		(1 << 9)
774fa818eaeSBernhard Schmidt #define IWN_RFLAG_GREENFIELD	(1 << 10)
775fa818eaeSBernhard Schmidt #define IWN_RFLAG_HT40		(1 << 11)
776fa818eaeSBernhard Schmidt #define IWN_RFLAG_DUPLICATE	(1 << 12)
777fa818eaeSBernhard Schmidt #define IWN_RFLAG_SGI		(1 << 13)
7781647639aSBernhard Schmidt #define IWN_RFLAG_ANT(x)	((x) << 14)
7793971d07bSSam Leffler 
7808f302007SRui Paulo /* Structure for command IWN_CMD_TX_DATA. */
7813971d07bSSam Leffler struct iwn_cmd_data {
7823971d07bSSam Leffler 	uint16_t	len;
7833971d07bSSam Leffler 	uint16_t	lnext;
7843971d07bSSam Leffler 	uint32_t	flags;
7858f302007SRui Paulo #define IWN_TX_NEED_PROTECTION	(1 <<  0)	/* 5000 only */
7863971d07bSSam Leffler #define IWN_TX_NEED_RTS		(1 <<  1)
7873971d07bSSam Leffler #define IWN_TX_NEED_CTS		(1 <<  2)
7883971d07bSSam Leffler #define IWN_TX_NEED_ACK		(1 <<  3)
7898f302007SRui Paulo #define IWN_TX_LINKQ		(1 <<  4)
7908f302007SRui Paulo #define IWN_TX_IMM_BA		(1 <<  6)
7913971d07bSSam Leffler #define IWN_TX_FULL_TXOP	(1 <<  7)
7923971d07bSSam Leffler #define IWN_TX_BT_DISABLE	(1 << 12)	/* bluetooth coexistence */
7933971d07bSSam Leffler #define IWN_TX_AUTO_SEQ		(1 << 13)
7948f302007SRui Paulo #define IWN_TX_MORE_FRAG	(1 << 14)
7953971d07bSSam Leffler #define IWN_TX_INSERT_TSTAMP	(1 << 16)
7963971d07bSSam Leffler #define IWN_TX_NEED_PADDING	(1 << 20)
7973971d07bSSam Leffler 
7988f302007SRui Paulo 	uint32_t	scratch;
7991647639aSBernhard Schmidt 	uint32_t	rate;
8008f302007SRui Paulo 
8013971d07bSSam Leffler 	uint8_t		id;
8023971d07bSSam Leffler 	uint8_t		security;
8033971d07bSSam Leffler #define IWN_CIPHER_WEP40	1
8043971d07bSSam Leffler #define IWN_CIPHER_CCMP		2
8053971d07bSSam Leffler #define IWN_CIPHER_TKIP		3
8063971d07bSSam Leffler #define IWN_CIPHER_WEP104	9
8073971d07bSSam Leffler 
8088f302007SRui Paulo 	uint8_t		linkq;
8093971d07bSSam Leffler 	uint8_t		reserved2;
8108f302007SRui Paulo 	uint8_t		key[16];
8113971d07bSSam Leffler 	uint16_t	fnext;
8123971d07bSSam Leffler 	uint16_t	reserved3;
8133971d07bSSam Leffler 	uint32_t	lifetime;
8143971d07bSSam Leffler #define IWN_LIFETIME_INFINITE	0xffffffff
8153971d07bSSam Leffler 
8163971d07bSSam Leffler 	uint32_t	loaddr;
8173971d07bSSam Leffler 	uint8_t		hiaddr;
8183971d07bSSam Leffler 	uint8_t		rts_ntries;
8193971d07bSSam Leffler 	uint8_t		data_ntries;
8203971d07bSSam Leffler 	uint8_t		tid;
8213971d07bSSam Leffler 	uint16_t	timeout;
8223971d07bSSam Leffler 	uint16_t	txop;
8233971d07bSSam Leffler } __packed;
8243971d07bSSam Leffler 
8258f302007SRui Paulo /* Structure for command IWN_CMD_LINK_QUALITY. */
8263971d07bSSam Leffler #define IWN_MAX_TX_RETRIES	16
8273971d07bSSam Leffler struct iwn_cmd_link_quality {
8283971d07bSSam Leffler 	uint8_t		id;
8293971d07bSSam Leffler 	uint8_t		reserved1;
8303971d07bSSam Leffler 	uint16_t	ctl;
8313971d07bSSam Leffler 	uint8_t		flags;
8328f302007SRui Paulo 	uint8_t		mimo;
8338f302007SRui Paulo 	uint8_t		antmsk_1stream;
8348f302007SRui Paulo 	uint8_t		antmsk_2stream;
8350f454b93SRui Paulo 	uint8_t		ridx[WME_NUM_AC];
8368f302007SRui Paulo 	uint16_t	ampdu_limit;
8378f302007SRui Paulo 	uint8_t		ampdu_threshold;
8388f302007SRui Paulo 	uint8_t		ampdu_max;
8393971d07bSSam Leffler 	uint32_t	reserved2;
8401647639aSBernhard Schmidt 	uint32_t	retry[IWN_MAX_TX_RETRIES];
8413971d07bSSam Leffler 	uint32_t	reserved3;
8423971d07bSSam Leffler } __packed;
8433971d07bSSam Leffler 
8448f302007SRui Paulo /* Structure for command IWN_CMD_SET_LED. */
8453971d07bSSam Leffler struct iwn_cmd_led {
8463971d07bSSam Leffler 	uint32_t	unit;	/* multiplier (in usecs) */
8473971d07bSSam Leffler 	uint8_t		which;
8483971d07bSSam Leffler #define IWN_LED_ACTIVITY	1
8493971d07bSSam Leffler #define IWN_LED_LINK		2
8503971d07bSSam Leffler 
8513971d07bSSam Leffler 	uint8_t		off;
8523971d07bSSam Leffler 	uint8_t		on;
8533971d07bSSam Leffler 	uint8_t		reserved;
8543971d07bSSam Leffler } __packed;
8553971d07bSSam Leffler 
8568f302007SRui Paulo /* Structure for command IWN5000_CMD_WIMAX_COEX. */
8578f302007SRui Paulo struct iwn5000_wimax_coex {
8588f302007SRui Paulo 	uint32_t	flags;
8590f454b93SRui Paulo #define IWN_WIMAX_COEX_STA_TABLE_VALID		(1 << 0)
8600f454b93SRui Paulo #define IWN_WIMAX_COEX_UNASSOC_WA_UNMASK	(1 << 2)
8610f454b93SRui Paulo #define IWN_WIMAX_COEX_ASSOC_WA_UNMASK		(1 << 3)
8620f454b93SRui Paulo #define IWN_WIMAX_COEX_ENABLE			(1 << 7)
8630f454b93SRui Paulo 
8640f454b93SRui Paulo 	struct iwn5000_wimax_event {
8658f302007SRui Paulo 		uint8_t	request;
8668f302007SRui Paulo 		uint8_t	window;
8678f302007SRui Paulo 		uint8_t	reserved;
8688f302007SRui Paulo 		uint8_t	flags;
8698f302007SRui Paulo 	} __packed	events[16];
8708f302007SRui Paulo } __packed;
8713971d07bSSam Leffler 
8728f302007SRui Paulo /* Structures for command IWN5000_CMD_CALIB_CONFIG. */
8738f302007SRui Paulo struct iwn5000_calib_elem {
8748f302007SRui Paulo 	uint32_t	enable;
8758f302007SRui Paulo 	uint32_t	start;
87626ddc983SBernhard Schmidt #define	IWN5000_CALIB_DC	(1 << 1)
87726ddc983SBernhard Schmidt 
8788f302007SRui Paulo 	uint32_t	send;
8798f302007SRui Paulo 	uint32_t	apply;
8808f302007SRui Paulo 	uint32_t	reserved;
8818f302007SRui Paulo } __packed;
8828f302007SRui Paulo 
8838f302007SRui Paulo struct iwn5000_calib_status {
8848f302007SRui Paulo 	struct iwn5000_calib_elem	once;
8858f302007SRui Paulo 	struct iwn5000_calib_elem	perd;
8868f302007SRui Paulo 	uint32_t			flags;
8878f302007SRui Paulo } __packed;
8888f302007SRui Paulo 
8898f302007SRui Paulo struct iwn5000_calib_config {
8908f302007SRui Paulo 	struct iwn5000_calib_status	ucode;
8918f302007SRui Paulo 	struct iwn5000_calib_status	driver;
8928f302007SRui Paulo 	uint32_t			reserved;
8938f302007SRui Paulo } __packed;
8948f302007SRui Paulo 
8958f302007SRui Paulo /* Structure for command IWN_CMD_SET_POWER_MODE. */
8968f302007SRui Paulo struct iwn_pmgt_cmd {
8978f302007SRui Paulo 	uint16_t	flags;
8988f302007SRui Paulo #define IWN_PS_ALLOW_SLEEP	(1 << 0)
8998f302007SRui Paulo #define IWN_PS_NOTIFY		(1 << 1)
9008f302007SRui Paulo #define IWN_PS_SLEEP_OVER_DTIM	(1 << 2)
9018f302007SRui Paulo #define IWN_PS_PCI_PMGT		(1 << 3)
9028f302007SRui Paulo #define IWN_PS_FAST_PD		(1 << 4)
903f8639279SAdrian Chadd #define	IWN_PS_BEACON_FILTERING	(1 << 5)
904f8639279SAdrian Chadd #define	IWN_PS_SHADOW_REG	(1 << 6)
905f8639279SAdrian Chadd #define	IWN_PS_CT_KILL		(1 << 7)
906f8639279SAdrian Chadd #define	IWN_PS_BT_SCD		(1 << 8)
907f8639279SAdrian Chadd #define	IWN_PS_ADVANCED_PM	(1 << 9)
9088f302007SRui Paulo 
9098f302007SRui Paulo 	uint8_t		keepalive;
9103971d07bSSam Leffler 	uint8_t		debug;
9118f302007SRui Paulo 	uint32_t	rxtimeout;
9128f302007SRui Paulo 	uint32_t	txtimeout;
9138f302007SRui Paulo 	uint32_t	intval[5];
9143971d07bSSam Leffler 	uint32_t	beacons;
9153971d07bSSam Leffler } __packed;
9163971d07bSSam Leffler 
9178f302007SRui Paulo /* Structures for command IWN_CMD_SCAN. */
9183971d07bSSam Leffler struct iwn_scan_essid {
9193971d07bSSam Leffler 	uint8_t	id;
9203971d07bSSam Leffler 	uint8_t	len;
9213971d07bSSam Leffler 	uint8_t	data[IEEE80211_NWID_LEN];
9223971d07bSSam Leffler } __packed;
9233971d07bSSam Leffler 
9243971d07bSSam Leffler struct iwn_scan_hdr {
9253971d07bSSam Leffler 	uint16_t	len;
9261650f039SAdrian Chadd 	uint8_t		scan_flags;
9273971d07bSSam Leffler 	uint8_t		nchan;
9288f302007SRui Paulo 	uint16_t	quiet_time;
9298f302007SRui Paulo 	uint16_t	quiet_threshold;
9303971d07bSSam Leffler 	uint16_t	crc_threshold;
9313971d07bSSam Leffler 	uint16_t	rxchain;
9323971d07bSSam Leffler 	uint32_t	max_svc;	/* background scans */
9333971d07bSSam Leffler 	uint32_t	pause_svc;	/* background scans */
9343971d07bSSam Leffler 	uint32_t	flags;
9353971d07bSSam Leffler 	uint32_t	filter;
9363971d07bSSam Leffler 
9378f302007SRui Paulo 	/* Followed by a struct iwn_cmd_data. */
9388f302007SRui Paulo 	/* Followed by an array of 20 structs iwn_scan_essid. */
9398f302007SRui Paulo 	/* Followed by probe request body. */
9408f302007SRui Paulo 	/* Followed by an array of ``nchan'' structs iwn_scan_chan. */
9413971d07bSSam Leffler } __packed;
9423971d07bSSam Leffler 
9433971d07bSSam Leffler struct iwn_scan_chan {
9448f302007SRui Paulo 	uint32_t	flags;
945f8639279SAdrian Chadd #define	IWN_CHAN_PASSIVE	(0 << 0)
9463971d07bSSam Leffler #define IWN_CHAN_ACTIVE		(1 << 0)
9478f302007SRui Paulo #define IWN_CHAN_NPBREQS(x)	(((1 << (x)) - 1) << 1)
9483971d07bSSam Leffler 
9498f302007SRui Paulo 	uint16_t	chan;
9503971d07bSSam Leffler 	uint8_t		rf_gain;
9513971d07bSSam Leffler 	uint8_t		dsp_gain;
9523971d07bSSam Leffler 	uint16_t	active;		/* msecs */
9533971d07bSSam Leffler 	uint16_t	passive;	/* msecs */
9543971d07bSSam Leffler } __packed;
9553971d07bSSam Leffler 
956f8639279SAdrian Chadd #define	IWN_SCAN_CRC_TH_DISABLED	0
957f8639279SAdrian Chadd #define	IWN_SCAN_CRC_TH_DEFAULT		htole16(1)
958f8639279SAdrian Chadd #define	IWN_SCAN_CRC_TH_NEVER		htole16(0xffff)
959f8639279SAdrian Chadd 
9608f302007SRui Paulo /* Maximum size of a scan command. */
9618f302007SRui Paulo #define IWN_SCAN_MAXSZ	(MCLBYTES - 4)
9628f302007SRui Paulo 
963fee842aaSAdrian Chadd /*
964fee842aaSAdrian Chadd  * For active scan, listen ACTIVE_DWELL_TIME (msec) on each channel after
965fee842aaSAdrian Chadd  * sending probe req.  This should be set long enough to hear probe responses
966fee842aaSAdrian Chadd  * from more than one AP.
967fee842aaSAdrian Chadd  */
968fee842aaSAdrian Chadd #define	IWN_ACTIVE_DWELL_TIME_2GHZ	(30)	/* all times in msec */
969fee842aaSAdrian Chadd #define	IWN_ACTIVE_DWELL_TIME_5GHZ	(20)
970fee842aaSAdrian Chadd #define	IWN_ACTIVE_DWELL_FACTOR_2GHZ	(3)
971fee842aaSAdrian Chadd #define	IWN_ACTIVE_DWELL_FACTOR_5GHZ	(2)
972f8639279SAdrian Chadd 
973fee842aaSAdrian Chadd /*
974fee842aaSAdrian Chadd  * For passive scan, listen PASSIVE_DWELL_TIME (msec) on each channel.
975fee842aaSAdrian Chadd  * Must be set longer than active dwell time.
976fee842aaSAdrian Chadd  * For the most reliable scan, set > AP beacon interval (typically 100msec).
977fee842aaSAdrian Chadd  */
978fee842aaSAdrian Chadd #define	IWN_PASSIVE_DWELL_TIME_2GHZ	(20)	/* all times in msec */
979fee842aaSAdrian Chadd #define	IWN_PASSIVE_DWELL_TIME_5GHZ	(10)
980f8639279SAdrian Chadd #define	IWN_PASSIVE_DWELL_BASE		(100)
981f8639279SAdrian Chadd #define	IWN_CHANNEL_TUNE_TIME		(5)
982f8639279SAdrian Chadd 
983f8639279SAdrian Chadd #define	IWN_SCAN_CHAN_TIMEOUT		2
984fee842aaSAdrian Chadd #define	IWN_MAX_SCAN_CHANNEL		50
985fee842aaSAdrian Chadd 
986fee842aaSAdrian Chadd /*
987fee842aaSAdrian Chadd  * If active scanning is requested but a certain channel is
988fee842aaSAdrian Chadd  * marked passive, we can do active scanning if we detect
989fee842aaSAdrian Chadd  * transmissions.
990fee842aaSAdrian Chadd  *
991fee842aaSAdrian Chadd  * There is an issue with some firmware versions that triggers
992fee842aaSAdrian Chadd  * a sysassert on a "good CRC threshold" of zero (== disabled),
993fee842aaSAdrian Chadd  * on a radar channel even though this means that we should NOT
994fee842aaSAdrian Chadd  * send probes.
995fee842aaSAdrian Chadd  *
996fee842aaSAdrian Chadd  * The "good CRC threshold" is the number of frames that we
997fee842aaSAdrian Chadd  * need to receive during our dwell time on a channel before
998fee842aaSAdrian Chadd  * sending out probes -- setting this to a huge value will
999fee842aaSAdrian Chadd  * mean we never reach it, but at the same time work around
1000fee842aaSAdrian Chadd  * the aforementioned issue. Thus use IWL_GOOD_CRC_TH_NEVER
1001fee842aaSAdrian Chadd  * here instead of IWL_GOOD_CRC_TH_DISABLED.
1002fee842aaSAdrian Chadd  *
1003fee842aaSAdrian Chadd  * This was fixed in later versions along with some other
1004fee842aaSAdrian Chadd  * scan changes, and the threshold behaves as a flag in those
1005fee842aaSAdrian Chadd  * versions.
1006fee842aaSAdrian Chadd  */
1007fee842aaSAdrian Chadd #define	IWN_GOOD_CRC_TH_DISABLED	0
1008fee842aaSAdrian Chadd #define	IWN_GOOD_CRC_TH_DEFAULT		htole16(1)
1009fee842aaSAdrian Chadd #define	IWN_GOOD_CRC_TH_NEVER		htole16(0xffff)
1010f8639279SAdrian Chadd 
10118f302007SRui Paulo /* Structure for command IWN_CMD_TXPOWER (4965AGN only.) */
10123971d07bSSam Leffler #define IWN_RIDX_MAX	32
10138f302007SRui Paulo struct iwn4965_cmd_txpower {
10143971d07bSSam Leffler 	uint8_t		band;
10153971d07bSSam Leffler 	uint8_t		reserved1;
10163971d07bSSam Leffler 	uint8_t		chan;
10173971d07bSSam Leffler 	uint8_t		reserved2;
10183971d07bSSam Leffler 	struct {
10198f302007SRui Paulo 		uint8_t	rf_gain[2];
10208f302007SRui Paulo 		uint8_t	dsp_gain[2];
10218f302007SRui Paulo 	} __packed	power[IWN_RIDX_MAX + 1];
10223971d07bSSam Leffler } __packed;
10233971d07bSSam Leffler 
10248f302007SRui Paulo /* Structure for command IWN_CMD_TXPOWER_DBM (5000 Series only.) */
10258f302007SRui Paulo struct iwn5000_cmd_txpower {
10268f302007SRui Paulo 	int8_t	global_limit;	/* in half-dBm */
10278f302007SRui Paulo #define IWN5000_TXPOWER_AUTO		0x7f
10288f302007SRui Paulo #define IWN5000_TXPOWER_MAX_DBM		16
10298f302007SRui Paulo 
10308f302007SRui Paulo 	uint8_t	flags;
10318f302007SRui Paulo #define IWN5000_TXPOWER_NO_CLOSED	(1 << 6)
10328f302007SRui Paulo 
10338f302007SRui Paulo 	int8_t	srv_limit;	/* in half-dBm */
10348f302007SRui Paulo 	uint8_t	reserved;
10358f302007SRui Paulo } __packed;
10368f302007SRui Paulo 
10378bb237d9SBernhard Schmidt /* Structures for command IWN_CMD_BLUETOOTH. */
10383971d07bSSam Leffler struct iwn_bluetooth {
10393971d07bSSam Leffler 	uint8_t		flags;
10407373959eSBernhard Schmidt #define IWN_BT_COEX_CHAN_ANN	(1 << 0)
10417373959eSBernhard Schmidt #define IWN_BT_COEX_BT_PRIO	(1 << 1)
10427373959eSBernhard Schmidt #define IWN_BT_COEX_2_WIRE	(1 << 2)
10430f454b93SRui Paulo 
10440f454b93SRui Paulo 	uint8_t		lead_time;
10450f454b93SRui Paulo #define IWN_BT_LEAD_TIME_DEF	30
10460f454b93SRui Paulo 
10470f454b93SRui Paulo 	uint8_t		max_kill;
10480f454b93SRui Paulo #define IWN_BT_MAX_KILL_DEF	5
10490f454b93SRui Paulo 
10503971d07bSSam Leffler 	uint8_t		reserved;
10510f454b93SRui Paulo 	uint32_t	kill_ack;
10520f454b93SRui Paulo 	uint32_t	kill_cts;
10533971d07bSSam Leffler } __packed;
10543971d07bSSam Leffler 
10558bb237d9SBernhard Schmidt struct iwn6000_btcoex_config {
10568bb237d9SBernhard Schmidt 	uint8_t		flags;
1057f8639279SAdrian Chadd #define	IWN_BT_FLAG_COEX6000_CHAN_INHIBITION	1
1058f8639279SAdrian Chadd #define	IWN_BT_FLAG_COEX6000_MODE_MASK		((1 << 3) | (1 << 4) | (1 << 5 ))
1059f8639279SAdrian Chadd #define	IWN_BT_FLAG_COEX6000_MODE_SHIFT			3
1060f8639279SAdrian Chadd #define	IWN_BT_FLAG_COEX6000_MODE_DISABLED		0
1061f8639279SAdrian Chadd #define	IWN_BT_FLAG_COEX6000_MODE_LEGACY_2W		1
1062f8639279SAdrian Chadd #define	IWN_BT_FLAG_COEX6000_MODE_3W			2
1063f8639279SAdrian Chadd #define	IWN_BT_FLAG_COEX6000_MODE_4W			3
1064f8639279SAdrian Chadd 
1065f8639279SAdrian Chadd #define	IWN_BT_FLAG_UCODE_DEFAULT		(1 << 6)
1066f8639279SAdrian Chadd #define	IWN_BT_FLAG_SYNC_2_BT_DISABLE	(1 << 7)
10678bb237d9SBernhard Schmidt 	uint8_t		lead_time;
10688bb237d9SBernhard Schmidt 	uint8_t		max_kill;
10698bb237d9SBernhard Schmidt 	uint8_t		bt3_t7_timer;
10708bb237d9SBernhard Schmidt 	uint32_t	kill_ack;
10718bb237d9SBernhard Schmidt 	uint32_t	kill_cts;
10728bb237d9SBernhard Schmidt 	uint8_t		sample_time;
10738bb237d9SBernhard Schmidt 	uint8_t		bt3_t2_timer;
10748bb237d9SBernhard Schmidt 	uint16_t	bt4_reaction;
10758bb237d9SBernhard Schmidt 	uint32_t	lookup_table[12];
10768bb237d9SBernhard Schmidt 	uint16_t	bt4_decision;
10778bb237d9SBernhard Schmidt 	uint16_t	valid;
10788bb237d9SBernhard Schmidt 	uint8_t		prio_boost;
10798bb237d9SBernhard Schmidt 	uint8_t		tx_prio_boost;
10808bb237d9SBernhard Schmidt 	uint16_t	rx_prio_boost;
10818bb237d9SBernhard Schmidt } __packed;
10828bb237d9SBernhard Schmidt 
1083f8639279SAdrian Chadd /* Structure for enhanced command IWN_CMD_BLUETOOTH for 2000 Series. */
1084f8639279SAdrian Chadd struct iwn2000_btcoex_config {
1085f8639279SAdrian Chadd 	uint8_t		flags;	/* Cf Flags in iwn6000_btcoex_config */
1086f8639279SAdrian Chadd 	uint8_t		lead_time;
1087f8639279SAdrian Chadd 	uint8_t		max_kill;
1088f8639279SAdrian Chadd 	uint8_t		bt3_t7_timer;
1089f8639279SAdrian Chadd 	uint32_t	kill_ack;
1090f8639279SAdrian Chadd 	uint32_t	kill_cts;
1091f8639279SAdrian Chadd 	uint8_t		sample_time;
1092f8639279SAdrian Chadd 	uint8_t		bt3_t2_timer;
1093f8639279SAdrian Chadd 	uint16_t	bt4_reaction;
1094f8639279SAdrian Chadd 	uint32_t	lookup_table[12];
1095f8639279SAdrian Chadd 	uint16_t	bt4_decision;
1096f8639279SAdrian Chadd 	uint16_t	valid;
1097f8639279SAdrian Chadd 
1098f8639279SAdrian Chadd 	uint32_t	prio_boost;	/* size change prior to iwn6000_btcoex_config */
1099f8639279SAdrian Chadd 	uint8_t		reserved;	/* added prior to iwn6000_btcoex_config */
1100f8639279SAdrian Chadd 
1101f8639279SAdrian Chadd 	uint8_t		tx_prio_boost;
1102f8639279SAdrian Chadd 	uint16_t	rx_prio_boost;
1103f8639279SAdrian Chadd } __packed;
1104f8639279SAdrian Chadd 
11058bb237d9SBernhard Schmidt struct iwn_btcoex_priotable {
11068bb237d9SBernhard Schmidt 	uint8_t		calib_init1;
11078bb237d9SBernhard Schmidt 	uint8_t		calib_init2;
11088bb237d9SBernhard Schmidt 	uint8_t		calib_periodic_low1;
11098bb237d9SBernhard Schmidt 	uint8_t		calib_periodic_low2;
11108bb237d9SBernhard Schmidt 	uint8_t		calib_periodic_high1;
11118bb237d9SBernhard Schmidt 	uint8_t		calib_periodic_high2;
11128bb237d9SBernhard Schmidt 	uint8_t		dtim;
11138bb237d9SBernhard Schmidt 	uint8_t		scan52;
11148bb237d9SBernhard Schmidt 	uint8_t		scan24;
11158bb237d9SBernhard Schmidt 	uint8_t		reserved[7];
11168bb237d9SBernhard Schmidt } __packed;
11178bb237d9SBernhard Schmidt 
11188bb237d9SBernhard Schmidt struct iwn_btcoex_prot {
11198bb237d9SBernhard Schmidt 	uint8_t		open;
11208bb237d9SBernhard Schmidt 	uint8_t		type;
11218bb237d9SBernhard Schmidt 	uint8_t		reserved[2];
11228bb237d9SBernhard Schmidt } __packed;
11238bb237d9SBernhard Schmidt 
11248f302007SRui Paulo /* Structure for command IWN_CMD_SET_CRITICAL_TEMP. */
11253971d07bSSam Leffler struct iwn_critical_temp {
11263971d07bSSam Leffler 	uint32_t	reserved;
11273971d07bSSam Leffler 	uint32_t	tempM;
11283971d07bSSam Leffler 	uint32_t	tempR;
11298f302007SRui Paulo /* degK <-> degC conversion macros. */
11303971d07bSSam Leffler #define IWN_CTOK(c)	((c) + 273)
11313971d07bSSam Leffler #define IWN_KTOC(k)	((k) - 273)
11323971d07bSSam Leffler #define IWN_CTOMUK(c)	(((c) * 1000000) + 273150000)
11333971d07bSSam Leffler } __packed;
11343971d07bSSam Leffler 
11359dd0e40bSBernhard Schmidt /* Structures for command IWN_CMD_SET_SENSITIVITY. */
11363971d07bSSam Leffler struct iwn_sensitivity_cmd {
11373971d07bSSam Leffler 	uint16_t	which;
11383971d07bSSam Leffler #define IWN_SENSITIVITY_DEFAULTTBL	0
11393971d07bSSam Leffler #define IWN_SENSITIVITY_WORKTBL		1
11403971d07bSSam Leffler 
11413971d07bSSam Leffler 	uint16_t	energy_cck;
11423971d07bSSam Leffler 	uint16_t	energy_ofdm;
11433971d07bSSam Leffler 	uint16_t	corr_ofdm_x1;
11443971d07bSSam Leffler 	uint16_t	corr_ofdm_mrc_x1;
11453971d07bSSam Leffler 	uint16_t	corr_cck_mrc_x4;
11463971d07bSSam Leffler 	uint16_t	corr_ofdm_x4;
11473971d07bSSam Leffler 	uint16_t	corr_ofdm_mrc_x4;
11483971d07bSSam Leffler 	uint16_t	corr_barker;
11493971d07bSSam Leffler 	uint16_t	corr_barker_mrc;
11503971d07bSSam Leffler 	uint16_t	corr_cck_x4;
11513971d07bSSam Leffler 	uint16_t	energy_ofdm_th;
11523971d07bSSam Leffler } __packed;
11533971d07bSSam Leffler 
11549dd0e40bSBernhard Schmidt struct iwn_enhanced_sensitivity_cmd {
11559dd0e40bSBernhard Schmidt 	uint16_t	which;
11569dd0e40bSBernhard Schmidt 	uint16_t	energy_cck;
11579dd0e40bSBernhard Schmidt 	uint16_t	energy_ofdm;
11589dd0e40bSBernhard Schmidt 	uint16_t	corr_ofdm_x1;
11599dd0e40bSBernhard Schmidt 	uint16_t	corr_ofdm_mrc_x1;
11609dd0e40bSBernhard Schmidt 	uint16_t	corr_cck_mrc_x4;
11619dd0e40bSBernhard Schmidt 	uint16_t	corr_ofdm_x4;
11629dd0e40bSBernhard Schmidt 	uint16_t	corr_ofdm_mrc_x4;
11639dd0e40bSBernhard Schmidt 	uint16_t	corr_barker;
11649dd0e40bSBernhard Schmidt 	uint16_t	corr_barker_mrc;
11659dd0e40bSBernhard Schmidt 	uint16_t	corr_cck_x4;
11669dd0e40bSBernhard Schmidt 	uint16_t	energy_ofdm_th;
11679dd0e40bSBernhard Schmidt 	/* "Enhanced" part. */
11689dd0e40bSBernhard Schmidt 	uint16_t	ina_det_ofdm;
11699dd0e40bSBernhard Schmidt 	uint16_t	ina_det_cck;
11709dd0e40bSBernhard Schmidt 	uint16_t	corr_11_9_en;
11719dd0e40bSBernhard Schmidt 	uint16_t	ofdm_det_slope_mrc;
11729dd0e40bSBernhard Schmidt 	uint16_t	ofdm_det_icept_mrc;
11739dd0e40bSBernhard Schmidt 	uint16_t	ofdm_det_slope;
11749dd0e40bSBernhard Schmidt 	uint16_t	ofdm_det_icept;
11759dd0e40bSBernhard Schmidt 	uint16_t	cck_det_slope_mrc;
11769dd0e40bSBernhard Schmidt 	uint16_t	cck_det_icept_mrc;
11779dd0e40bSBernhard Schmidt 	uint16_t	cck_det_slope;
11789dd0e40bSBernhard Schmidt 	uint16_t	cck_det_icept;
11799dd0e40bSBernhard Schmidt 	uint16_t	reserved;
11809dd0e40bSBernhard Schmidt } __packed;
11819dd0e40bSBernhard Schmidt 
11824cfb1a08SAdrian Chadd /*
11834cfb1a08SAdrian Chadd  * Define maximal number of calib result send to runtime firmware
11844cfb1a08SAdrian Chadd  * PS: TEMP_OFFSET count for 2 (std and v2)
11854cfb1a08SAdrian Chadd  */
11864cfb1a08SAdrian Chadd #define	IWN5000_PHY_CALIB_MAX_RESULT		8
11874cfb1a08SAdrian Chadd 
11888f302007SRui Paulo /* Structures for command IWN_CMD_PHY_CALIB. */
11898f302007SRui Paulo struct iwn_phy_calib {
11903971d07bSSam Leffler 	uint8_t	code;
11918f302007SRui Paulo #define IWN4965_PHY_CALIB_DIFF_GAIN		 7
11928f302007SRui Paulo #define IWN5000_PHY_CALIB_DC			 8
11938f302007SRui Paulo #define IWN5000_PHY_CALIB_LO			 9
11948f302007SRui Paulo #define IWN5000_PHY_CALIB_TX_IQ			11
11958f302007SRui Paulo #define IWN5000_PHY_CALIB_CRYSTAL		15
11968f302007SRui Paulo #define IWN5000_PHY_CALIB_BASE_BAND		16
11970f454b93SRui Paulo #define IWN5000_PHY_CALIB_TX_IQ_PERIODIC	17
119889a84499SBernhard Schmidt #define IWN5000_PHY_CALIB_TEMP_OFFSET		18
119989a84499SBernhard Schmidt 
12008f302007SRui Paulo #define IWN5000_PHY_CALIB_RESET_NOISE_GAIN	18
12018f302007SRui Paulo #define IWN5000_PHY_CALIB_NOISE_GAIN		19
12023971d07bSSam Leffler 
12038f302007SRui Paulo 	uint8_t	group;
12048f302007SRui Paulo 	uint8_t	ngroups;
12058f302007SRui Paulo 	uint8_t	isvalid;
12063971d07bSSam Leffler } __packed;
12073971d07bSSam Leffler 
12088f302007SRui Paulo struct iwn5000_phy_calib_crystal {
12098f302007SRui Paulo 	uint8_t	code;
12108f302007SRui Paulo 	uint8_t	group;
12118f302007SRui Paulo 	uint8_t	ngroups;
12128f302007SRui Paulo 	uint8_t	isvalid;
12133971d07bSSam Leffler 
12148f302007SRui Paulo 	uint8_t	cap_pin[2];
12158f302007SRui Paulo 	uint8_t	reserved[2];
12168f302007SRui Paulo } __packed;
12178f302007SRui Paulo 
121889a84499SBernhard Schmidt struct iwn5000_phy_calib_temp_offset {
121989a84499SBernhard Schmidt 	uint8_t		code;
122089a84499SBernhard Schmidt 	uint8_t		group;
122189a84499SBernhard Schmidt 	uint8_t		ngroups;
122289a84499SBernhard Schmidt 	uint8_t		isvalid;
122389a84499SBernhard Schmidt 	int16_t		offset;
122489a84499SBernhard Schmidt #define IWN_DEFAULT_TEMP_OFFSET	2700
122589a84499SBernhard Schmidt 
122689a84499SBernhard Schmidt 	uint16_t	reserved;
122789a84499SBernhard Schmidt } __packed;
122889a84499SBernhard Schmidt 
1229f8639279SAdrian Chadd struct iwn5000_phy_calib_temp_offsetv2 {
1230f8639279SAdrian Chadd 	uint8_t		code;
1231f8639279SAdrian Chadd 	uint8_t		group;
1232f8639279SAdrian Chadd 	uint8_t		ngroups;
1233f8639279SAdrian Chadd 	uint8_t		isvalid;
1234f8639279SAdrian Chadd 	int16_t		offset_high;
1235f8639279SAdrian Chadd 	int16_t		offset_low;
1236f8639279SAdrian Chadd 	int16_t		burnt_voltage_ref;
1237f8639279SAdrian Chadd 	int16_t		reserved;
1238f8639279SAdrian Chadd } __packed;
1239f8639279SAdrian Chadd 
12408f302007SRui Paulo struct iwn_phy_calib_gain {
12418f302007SRui Paulo 	uint8_t	code;
12428f302007SRui Paulo 	uint8_t	group;
12438f302007SRui Paulo 	uint8_t	ngroups;
12448f302007SRui Paulo 	uint8_t	isvalid;
12458f302007SRui Paulo 
12468f302007SRui Paulo 	int8_t	gain[3];
12478f302007SRui Paulo 	uint8_t	reserved;
12488f302007SRui Paulo } __packed;
12498f302007SRui Paulo 
12508f302007SRui Paulo /* Structure for command IWN_CMD_SPECTRUM_MEASUREMENT. */
12518f302007SRui Paulo struct iwn_spectrum_cmd {
12528f302007SRui Paulo 	uint16_t	len;
12538f302007SRui Paulo 	uint8_t		token;
12548f302007SRui Paulo 	uint8_t		id;
12558f302007SRui Paulo 	uint8_t		origin;
12568f302007SRui Paulo 	uint8_t		periodic;
12578f302007SRui Paulo 	uint16_t	timeout;
12588f302007SRui Paulo 	uint32_t	start;
12598f302007SRui Paulo 	uint32_t	reserved1;
12608f302007SRui Paulo 	uint32_t	flags;
12618f302007SRui Paulo 	uint32_t	filter;
12628f302007SRui Paulo 	uint16_t	nchan;
12638f302007SRui Paulo 	uint16_t	reserved2;
12648f302007SRui Paulo 	struct {
12658f302007SRui Paulo 		uint32_t	duration;
12668f302007SRui Paulo 		uint8_t		chan;
12678f302007SRui Paulo 		uint8_t		type;
12688f302007SRui Paulo #define IWN_MEASUREMENT_BASIC		(1 << 0)
12698f302007SRui Paulo #define IWN_MEASUREMENT_CCA		(1 << 1)
12708f302007SRui Paulo #define IWN_MEASUREMENT_RPI_HISTOGRAM	(1 << 2)
12718f302007SRui Paulo #define IWN_MEASUREMENT_NOISE_HISTOGRAM	(1 << 3)
12728f302007SRui Paulo #define IWN_MEASUREMENT_FRAME		(1 << 4)
12738f302007SRui Paulo #define IWN_MEASUREMENT_IDLE		(1 << 7)
12748f302007SRui Paulo 
12758f302007SRui Paulo 		uint16_t	reserved;
12768f302007SRui Paulo 	} __packed	chan[10];
12778f302007SRui Paulo } __packed;
12788f302007SRui Paulo 
12798f302007SRui Paulo /* Structure for IWN_UC_READY notification. */
12803971d07bSSam Leffler #define IWN_NATTEN_GROUPS	5
12813971d07bSSam Leffler struct iwn_ucode_info {
12823971d07bSSam Leffler 	uint8_t		minor;
12833971d07bSSam Leffler 	uint8_t		major;
12843971d07bSSam Leffler 	uint16_t	reserved1;
12853971d07bSSam Leffler 	uint8_t		revision[8];
12863971d07bSSam Leffler 	uint8_t		type;
12873971d07bSSam Leffler 	uint8_t		subtype;
12883971d07bSSam Leffler #define IWN_UCODE_RUNTIME	0
12893971d07bSSam Leffler #define IWN_UCODE_INIT		9
12903971d07bSSam Leffler 
12913971d07bSSam Leffler 	uint16_t	reserved2;
12923971d07bSSam Leffler 	uint32_t	logptr;
12938f302007SRui Paulo 	uint32_t	errptr;
12943971d07bSSam Leffler 	uint32_t	tstamp;
12953971d07bSSam Leffler 	uint32_t	valid;
12963971d07bSSam Leffler 
12978f302007SRui Paulo 	/* The following fields are for UCODE_INIT only. */
12983971d07bSSam Leffler 	int32_t		volt;
12993971d07bSSam Leffler 	struct {
13003971d07bSSam Leffler 		int32_t	chan20MHz;
13013971d07bSSam Leffler 		int32_t	chan40MHz;
13023971d07bSSam Leffler 	} __packed	temp[4];
13038f302007SRui Paulo 	int32_t		atten[IWN_NATTEN_GROUPS][2];
13043971d07bSSam Leffler } __packed;
13053971d07bSSam Leffler 
13068f302007SRui Paulo /* Structures for IWN_TX_DONE notification. */
1307f8639279SAdrian Chadd 
1308f7efe7e9SAdrian Chadd /*
1309f7efe7e9SAdrian Chadd  * TX command response is sent after *agn* transmission attempts.
1310f7efe7e9SAdrian Chadd  *
1311f7efe7e9SAdrian Chadd  * both postpone and abort status are expected behavior from uCode. there is
1312f7efe7e9SAdrian Chadd  * no special operation required from driver; except for RFKILL_FLUSH,
1313f7efe7e9SAdrian Chadd  * which required tx flush host command to flush all the tx frames in queues
1314f7efe7e9SAdrian Chadd  */
1315f7efe7e9SAdrian Chadd #define	IWN_TX_STATUS_MSK		0x000000ff
1316f7efe7e9SAdrian Chadd #define	IWN_TX_STATUS_DELAY_MSK		0x00000040
1317f7efe7e9SAdrian Chadd #define	IWN_TX_STATUS_ABORT_MSK		0x00000080
1318f7efe7e9SAdrian Chadd #define	IWN_TX_PACKET_MODE_MSK		0x0000ff00
1319f7efe7e9SAdrian Chadd #define	IWN_TX_FIFO_NUMBER_MSK		0x00070000
1320f7efe7e9SAdrian Chadd #define	IWN_TX_RESERVED			0x00780000
1321f7efe7e9SAdrian Chadd #define	IWN_TX_POWER_PA_DETECT_MSK	0x7f800000
1322f7efe7e9SAdrian Chadd #define	IWN_TX_ABORT_REQUIRED_MSK	0x80000000
1323f7efe7e9SAdrian Chadd 
1324f7efe7e9SAdrian Chadd /* Success status */
1325f7efe7e9SAdrian Chadd #define	IWN_TX_STATUS_SUCCESS		0x01
1326f7efe7e9SAdrian Chadd #define	IWN_TX_STATUS_DIRECT_DONE	0x02
1327f7efe7e9SAdrian Chadd 
1328f7efe7e9SAdrian Chadd /* postpone TX */
1329f7efe7e9SAdrian Chadd #define	IWN_TX_STATUS_POSTPONE_DELAY		0x40
1330f7efe7e9SAdrian Chadd #define	IWN_TX_STATUS_POSTPONE_FEW_BYTES	0x41
1331f7efe7e9SAdrian Chadd #define	IWN_TX_STATUS_POSTPONE_BT_PRIO		0x42
1332f7efe7e9SAdrian Chadd #define	IWN_TX_STATUS_POSTPONE_QUIET_PERIOD	0x43
1333f7efe7e9SAdrian Chadd #define	IWN_TX_STATUS_POSTPONE_CALC_TTAK	0x44
1334f7efe7e9SAdrian Chadd 
1335f7efe7e9SAdrian Chadd /* Failures */
13363971d07bSSam Leffler #define	IWN_TX_FAIL			0x80	/* all failures have 0x80 set */
1337f7efe7e9SAdrian Chadd #define	IWN_TX_STATUS_FAIL_INTERNAL_CROSSED_RETRY	0x81
13383971d07bSSam Leffler #define	IWN_TX_FAIL_SHORT_LIMIT		0x82	/* too many RTS retries */
13393971d07bSSam Leffler #define	IWN_TX_FAIL_LONG_LIMIT		0x83	/* too many retries */
13403971d07bSSam Leffler #define	IWN_TX_FAIL_FIFO_UNDERRRUN	0x84	/* tx fifo not kept running */
1341f7efe7e9SAdrian Chadd #define	IWN_TX_STATUS_FAIL_DRAIN_FLOW	0x85
1342f7efe7e9SAdrian Chadd #define	IWN_TX_STATUS_FAIL_RFKILL_FLUSH	0x86
1343f7efe7e9SAdrian Chadd #define	IWN_TX_STATUS_FAIL_LIFE_EXPIRE	0x87
13443971d07bSSam Leffler #define	IWN_TX_FAIL_DEST_IN_PS		0x88	/* sta found in power save */
1345f7efe7e9SAdrian Chadd #define	IWN_TX_STATUS_FAIL_HOST_ABORTED	0x89
1346f7efe7e9SAdrian Chadd #define	IWN_TX_STATUS_FAIL_BT_RETRY	0x8a
134749457198SAdrian Chadd #define	IWN_TX_FAIL_STA_INVALID		0x8b	/* XXX STA invalid (???) */
1348f7efe7e9SAdrian Chadd #define	IWN_TX_STATUS_FAIL_FRAG_DROPPED	0x8c
1349f7efe7e9SAdrian Chadd #define	IWN_TX_STATUS_FAIL_TID_DISABLE	0x8d
1350f7efe7e9SAdrian Chadd #define	IWN_TX_STATUS_FAIL_FIFO_FLUSHED	0x8e
1351f7efe7e9SAdrian Chadd #define	IWN_TX_STATUS_FAIL_INSUFFICIENT_CF_POLL	0x8f
1352f7efe7e9SAdrian Chadd #define	IWN_TX_FAIL_TX_LOCKED		0x90	/* waiting to see traffic */
1353f7efe7e9SAdrian Chadd #define	IWN_TX_STATUS_FAIL_NO_BEACON_ON_RADAR	0x91
1354f7efe7e9SAdrian Chadd 
1355f7efe7e9SAdrian Chadd /*
1356f7efe7e9SAdrian Chadd  * TX command response for A-MPDU packet responses.
1357f7efe7e9SAdrian Chadd  *
1358f7efe7e9SAdrian Chadd  * The status response is different to the non A-MPDU responses.
1359f7efe7e9SAdrian Chadd  * In addition, the sequence number is treated as the sequence
1360f7efe7e9SAdrian Chadd  * number of the TX command, NOT the 802.11 sequence number!
1361f7efe7e9SAdrian Chadd  */
1362f7efe7e9SAdrian Chadd #define	IWN_AGG_TX_STATE_TRANSMITTED		0x00
1363f7efe7e9SAdrian Chadd #define	IWN_AGG_TX_STATE_UNDERRUN_MSK		0x01
1364f7efe7e9SAdrian Chadd #define	IWN_AGG_TX_STATE_FEW_BYTES_MSK		0x04
1365f7efe7e9SAdrian Chadd #define	IWN_AGG_TX_STATE_ABORT_MSK		0x08
1366f7efe7e9SAdrian Chadd 
1367f7efe7e9SAdrian Chadd #define	IWN_AGG_TX_STATE_LAST_SENT_TTL_MSK	0x10
1368f7efe7e9SAdrian Chadd #define	IWN_AGG_TX_STATE_LAST_SENT_TRY_CNT_MSK	0x20
1369f7efe7e9SAdrian Chadd 
1370f7efe7e9SAdrian Chadd #define	IWN_AGG_TX_STATE_SCD_QUERY_MSK		0x80
1371f7efe7e9SAdrian Chadd 
1372f7efe7e9SAdrian Chadd #define	IWN_AGG_TX_STATE_TEST_BAD_CRC32_MSK	0x100
1373f7efe7e9SAdrian Chadd 
1374f7efe7e9SAdrian Chadd #define	IWN_AGG_TX_STATE_RESPONSE_MSK		0x1ff
1375f7efe7e9SAdrian Chadd #define	IWN_AGG_TX_STATE_DUMP_TX_MSK		0x200
1376f7efe7e9SAdrian Chadd #define	IWN_AGG_TX_STATE_DELAY_TX_MSK		0x400
1377f7efe7e9SAdrian Chadd 
1378f7efe7e9SAdrian Chadd #define	IWN_AGG_TX_STATUS_MSK		0x00000fff
1379f7efe7e9SAdrian Chadd #define	IWN_AGG_TX_TRY_MSK		0x0000f000
13800613dc6fSAndriy Voskoboinyk #define	IWN_AGG_TX_TRY_POS		12
13810613dc6fSAndriy Voskoboinyk #define	IWN_AGG_TX_TRY_COUNT(status)	\
13820613dc6fSAndriy Voskoboinyk 	(((status) & IWN_AGG_TX_TRY_MSK) >> IWN_AGG_TX_TRY_POS)
1383f7efe7e9SAdrian Chadd 
1384f7efe7e9SAdrian Chadd #define	IWN_AGG_TX_STATE_LAST_SENT_MSK		\
1385f7efe7e9SAdrian Chadd 	    (IWN_AGG_TX_STATE_LAST_SENT_TTL_MSK | \
1386f7efe7e9SAdrian Chadd 	     IWN_AGG_TX_STATE_LAST_SENT_TRY_CNT_MSK)
1387f7efe7e9SAdrian Chadd 
13880613dc6fSAndriy Voskoboinyk #define IWN_AGG_TX_STATE_IGNORE_MASK		\
13890613dc6fSAndriy Voskoboinyk 	    (IWN_AGG_TX_STATE_FEW_BYTES_MSK | \
13900613dc6fSAndriy Voskoboinyk 	     IWN_AGG_TX_STATE_ABORT_MSK)
13910613dc6fSAndriy Voskoboinyk 
1392f7efe7e9SAdrian Chadd /* # tx attempts for first frame in aggregation */
1393f7efe7e9SAdrian Chadd #define	IWN_AGG_TX_STATE_TRY_CNT_POS	12
1394f7efe7e9SAdrian Chadd #define	IWN_AGG_TX_STATE_TRY_CNT_MSK	0xf000
1395f7efe7e9SAdrian Chadd 
1396f7efe7e9SAdrian Chadd /* Command ID and sequence number of Tx command for this frame */
1397f7efe7e9SAdrian Chadd #define	IWN_AGG_TX_STATE_SEQ_NUM_POS	16
1398f7efe7e9SAdrian Chadd #define	IWN_AGG_TX_STATE_SEQ_NUM_MSK	0xffff0000
13998f302007SRui Paulo 
14008f302007SRui Paulo struct iwn4965_tx_stat {
14018f302007SRui Paulo 	uint8_t		nframes;
14020f454b93SRui Paulo 	uint8_t		btkillcnt;
14030f454b93SRui Paulo 	uint8_t		rtsfailcnt;
14040f454b93SRui Paulo 	uint8_t		ackfailcnt;
14051647639aSBernhard Schmidt 	uint32_t	rate;
14068f302007SRui Paulo 	uint16_t	duration;
14078f302007SRui Paulo 	uint16_t	reserved;
14088f302007SRui Paulo 	uint32_t	power[2];
14098f302007SRui Paulo 	uint32_t	status;
14103971d07bSSam Leffler } __packed;
14113971d07bSSam Leffler 
14128f302007SRui Paulo struct iwn5000_tx_stat {
1413f8639279SAdrian Chadd 	uint8_t		nframes;	/* 1 no aggregation, >1 aggregation */
14140f454b93SRui Paulo 	uint8_t		btkillcnt;
14150f454b93SRui Paulo 	uint8_t		rtsfailcnt;
14160f454b93SRui Paulo 	uint8_t		ackfailcnt;
14171647639aSBernhard Schmidt 	uint32_t	rate;
14188f302007SRui Paulo 	uint16_t	duration;
14198f302007SRui Paulo 	uint16_t	reserved;
14208f302007SRui Paulo 	uint32_t	power[2];
14218f302007SRui Paulo 	uint32_t	info;
14228f302007SRui Paulo 	uint16_t	seq;
14238f302007SRui Paulo 	uint16_t	len;
14240f454b93SRui Paulo 	uint8_t		tlc;
1425f8639279SAdrian Chadd 	uint8_t		ratid;	/* tid (0:3), sta_id (4:7) */
14260f454b93SRui Paulo 	uint8_t		fc[2];
14278f302007SRui Paulo 	uint16_t	status;
14288f302007SRui Paulo 	uint16_t	sequence;
14298f302007SRui Paulo } __packed;
14308f302007SRui Paulo 
14318f302007SRui Paulo /* Structure for IWN_BEACON_MISSED notification. */
14323971d07bSSam Leffler struct iwn_beacon_missed {
14333971d07bSSam Leffler 	uint32_t	consecutive;
14343971d07bSSam Leffler 	uint32_t	total;
14353971d07bSSam Leffler 	uint32_t	expected;
14363971d07bSSam Leffler 	uint32_t	received;
14373971d07bSSam Leffler } __packed;
14383971d07bSSam Leffler 
14398f302007SRui Paulo /* Structure for IWN_MPDU_RX_DONE notification. */
14408f302007SRui Paulo struct iwn_rx_mpdu {
14413971d07bSSam Leffler 	uint16_t	len;
14423971d07bSSam Leffler 	uint16_t	reserved;
14433971d07bSSam Leffler } __packed;
14443971d07bSSam Leffler 
14458f302007SRui Paulo /* Structures for IWN_RX_DONE and IWN_MPDU_RX_DONE notifications. */
14468f302007SRui Paulo struct iwn4965_rx_phystat {
14478f302007SRui Paulo 	uint16_t	antenna;
14488f302007SRui Paulo 	uint16_t	agc;
14498f302007SRui Paulo 	uint8_t		rssi[6];
14508f302007SRui Paulo } __packed;
14518f302007SRui Paulo 
14528f302007SRui Paulo struct iwn5000_rx_phystat {
14538f302007SRui Paulo 	uint32_t	reserved1;
14548f302007SRui Paulo 	uint32_t	agc;
14558f302007SRui Paulo 	uint16_t	rssi[3];
14568f302007SRui Paulo } __packed;
14578f302007SRui Paulo 
14583971d07bSSam Leffler struct iwn_rx_stat {
14593971d07bSSam Leffler 	uint8_t		phy_len;
14603971d07bSSam Leffler 	uint8_t		cfg_phy_len;
14613971d07bSSam Leffler #define IWN_STAT_MAXLEN	20
14623971d07bSSam Leffler 
14633971d07bSSam Leffler 	uint8_t		id;
14643971d07bSSam Leffler 	uint8_t		reserved1;
14653971d07bSSam Leffler 	uint64_t	tstamp;
14663971d07bSSam Leffler 	uint32_t	beacon;
14673971d07bSSam Leffler 	uint16_t	flags;
14688f302007SRui Paulo #define IWN_STAT_FLAG_SHPREAMBLE	(1 << 2)
14693971d07bSSam Leffler 
14708f302007SRui Paulo 	uint16_t	chan;
14718f302007SRui Paulo 	uint8_t		phybuf[32];
14721647639aSBernhard Schmidt 	uint32_t	rate;
1473f8639279SAdrian Chadd /*
1474f8639279SAdrian Chadd  * rate bit fields
1475f8639279SAdrian Chadd  *
1476f8639279SAdrian Chadd  * High-throughput (HT) rate format for bits 7:0 (bit 8 must be "1"):
1477f8639279SAdrian Chadd  *  2-0:  0)   6 Mbps
1478f8639279SAdrian Chadd  *        1)  12 Mbps
1479f8639279SAdrian Chadd  *        2)  18 Mbps
1480f8639279SAdrian Chadd  *        3)  24 Mbps
1481f8639279SAdrian Chadd  *        4)  36 Mbps
1482f8639279SAdrian Chadd  *        5)  48 Mbps
1483f8639279SAdrian Chadd  *        6)  54 Mbps
1484f8639279SAdrian Chadd  *        7)  60 Mbps
1485f8639279SAdrian Chadd  *
1486f8639279SAdrian Chadd  *  4-3:  0)  Single stream (SISO)
1487f8639279SAdrian Chadd  *        1)  Dual stream (MIMO)
1488f8639279SAdrian Chadd  *        2)  Triple stream (MIMO)
1489f8639279SAdrian Chadd  *
1490f8639279SAdrian Chadd  *    5:  Value of 0x20 in bits 7:0 indicates 6 Mbps HT40 duplicate data
1491f8639279SAdrian Chadd  *
1492f8639279SAdrian Chadd  * Legacy OFDM rate format for bits 7:0 (bit 8 must be "0", bit 9 "0"):
1493f8639279SAdrian Chadd  *  3-0:  0xD)   6 Mbps
1494f8639279SAdrian Chadd  *        0xF)   9 Mbps
1495f8639279SAdrian Chadd  *        0x5)  12 Mbps
1496f8639279SAdrian Chadd  *        0x7)  18 Mbps
1497f8639279SAdrian Chadd  *        0x9)  24 Mbps
1498f8639279SAdrian Chadd  *        0xB)  36 Mbps
1499f8639279SAdrian Chadd  *        0x1)  48 Mbps
1500f8639279SAdrian Chadd  *        0x3)  54 Mbps
1501f8639279SAdrian Chadd  *
1502f8639279SAdrian Chadd  * Legacy CCK rate format for bits 7:0 (bit 8 must be "0", bit 9 "1"):
1503f8639279SAdrian Chadd  *  6-0:   10)  1 Mbps
1504f8639279SAdrian Chadd  *         20)  2 Mbps
1505f8639279SAdrian Chadd  *         55)  5.5 Mbps
1506f8639279SAdrian Chadd  *        110)  11 Mbps
1507f8639279SAdrian Chadd  *
1508f8639279SAdrian Chadd  */
15093971d07bSSam Leffler 	uint16_t	len;
15103971d07bSSam Leffler 	uint16_t	reserve3;
15113971d07bSSam Leffler } __packed;
15123971d07bSSam Leffler 
15138f302007SRui Paulo #define IWN_RSSI_TO_DBM	44
15148f302007SRui Paulo 
15150f454b93SRui Paulo /* Structure for IWN_RX_COMPRESSED_BA notification. */
15160f454b93SRui Paulo struct iwn_compressed_ba {
15170f454b93SRui Paulo 	uint8_t		macaddr[IEEE80211_ADDR_LEN];
15180f454b93SRui Paulo 	uint16_t	reserved;
15190f454b93SRui Paulo 	uint8_t		id;
15200f454b93SRui Paulo 	uint8_t		tid;
15210f454b93SRui Paulo 	uint16_t	seq;
15220f454b93SRui Paulo 	uint64_t	bitmap;
15230f454b93SRui Paulo 	uint16_t	qid;
15240f454b93SRui Paulo 	uint16_t	ssn;
1525f7efe7e9SAdrian Chadd 	/* extra fields starting with iwn5000 */
1526f7efe7e9SAdrian Chadd #if 0
1527f7efe7e9SAdrian Chadd 	uint8_t		txed;		/* number of frames sent */
1528f7efe7e9SAdrian Chadd 	uint8_t		txed_2_done;	/* number of frames acked */
1529f7efe7e9SAdrian Chadd 	uint16_t	reserved1;
1530f7efe7e9SAdrian Chadd #endif
15310f454b93SRui Paulo } __packed;
15320f454b93SRui Paulo 
15338f302007SRui Paulo /* Structure for IWN_START_SCAN notification. */
15343971d07bSSam Leffler struct iwn_start_scan {
15353971d07bSSam Leffler 	uint64_t	tstamp;
15363971d07bSSam Leffler 	uint32_t	tbeacon;
15373971d07bSSam Leffler 	uint8_t		chan;
15383971d07bSSam Leffler 	uint8_t		band;
15393971d07bSSam Leffler 	uint16_t	reserved;
15403971d07bSSam Leffler 	uint32_t	status;
15413971d07bSSam Leffler } __packed;
15423971d07bSSam Leffler 
15438f302007SRui Paulo /* Structure for IWN_STOP_SCAN notification. */
15443971d07bSSam Leffler struct iwn_stop_scan {
15453971d07bSSam Leffler 	uint8_t		nchan;
15463971d07bSSam Leffler 	uint8_t		status;
15473971d07bSSam Leffler 	uint8_t		reserved;
15483971d07bSSam Leffler 	uint8_t		chan;
15493971d07bSSam Leffler 	uint64_t	tsf;
15503971d07bSSam Leffler } __packed;
15513971d07bSSam Leffler 
15528f302007SRui Paulo /* Structure for IWN_SPECTRUM_MEASUREMENT notification. */
15538f302007SRui Paulo struct iwn_spectrum_notif {
15548f302007SRui Paulo 	uint8_t		id;
15558f302007SRui Paulo 	uint8_t		token;
15568f302007SRui Paulo 	uint8_t		idx;
15578f302007SRui Paulo 	uint8_t		state;
15588f302007SRui Paulo #define IWN_MEASUREMENT_START	0
15598f302007SRui Paulo #define IWN_MEASUREMENT_STOP	1
15608f302007SRui Paulo 
15618f302007SRui Paulo 	uint32_t	start;
15628f302007SRui Paulo 	uint8_t		band;
15638f302007SRui Paulo 	uint8_t		chan;
15648f302007SRui Paulo 	uint8_t		type;
15658f302007SRui Paulo 	uint8_t		reserved1;
15668f302007SRui Paulo 	uint32_t	cca_ofdm;
15678f302007SRui Paulo 	uint32_t	cca_cck;
15688f302007SRui Paulo 	uint32_t	cca_time;
15698f302007SRui Paulo 	uint8_t		basic;
15708f302007SRui Paulo 	uint8_t		reserved2[3];
15718f302007SRui Paulo 	uint32_t	ofdm[8];
15728f302007SRui Paulo 	uint32_t	cck[8];
15738f302007SRui Paulo 	uint32_t	stop;
15748f302007SRui Paulo 	uint32_t	status;
15758f302007SRui Paulo #define IWN_MEASUREMENT_OK		0
15768f302007SRui Paulo #define IWN_MEASUREMENT_CONCURRENT	1
15778f302007SRui Paulo #define IWN_MEASUREMENT_CSA_CONFLICT	2
15788f302007SRui Paulo #define IWN_MEASUREMENT_TGH_CONFLICT	3
15798f302007SRui Paulo #define IWN_MEASUREMENT_STOPPED		6
15808f302007SRui Paulo #define IWN_MEASUREMENT_TIMEOUT		7
15818f302007SRui Paulo #define IWN_MEASUREMENT_FAILED		8
15828f302007SRui Paulo } __packed;
15838f302007SRui Paulo 
15840f454b93SRui Paulo /* Structures for IWN_{RX,BEACON}_STATISTICS notification. */
15853971d07bSSam Leffler struct iwn_rx_phy_stats {
15863971d07bSSam Leffler 	uint32_t	ina;
15873971d07bSSam Leffler 	uint32_t	fina;
15883971d07bSSam Leffler 	uint32_t	bad_plcp;
15893971d07bSSam Leffler 	uint32_t	bad_crc32;
15903971d07bSSam Leffler 	uint32_t	overrun;
15913971d07bSSam Leffler 	uint32_t	eoverrun;
15923971d07bSSam Leffler 	uint32_t	good_crc32;
15933971d07bSSam Leffler 	uint32_t	fa;
15943971d07bSSam Leffler 	uint32_t	bad_fina_sync;
15953971d07bSSam Leffler 	uint32_t	sfd_timeout;
15963971d07bSSam Leffler 	uint32_t	fina_timeout;
15973971d07bSSam Leffler 	uint32_t	no_rts_ack;
15983971d07bSSam Leffler 	uint32_t	rxe_limit;
15993971d07bSSam Leffler 	uint32_t	ack;
16003971d07bSSam Leffler 	uint32_t	cts;
16013971d07bSSam Leffler 	uint32_t	ba_resp;
16023971d07bSSam Leffler 	uint32_t	dsp_kill;
16033971d07bSSam Leffler 	uint32_t	bad_mh;
16043971d07bSSam Leffler 	uint32_t	rssi_sum;
16053971d07bSSam Leffler 	uint32_t	reserved;
16063971d07bSSam Leffler } __packed;
16073971d07bSSam Leffler 
16083971d07bSSam Leffler struct iwn_rx_general_stats {
16093971d07bSSam Leffler 	uint32_t	bad_cts;
16103971d07bSSam Leffler 	uint32_t	bad_ack;
16113971d07bSSam Leffler 	uint32_t	not_bss;
16123971d07bSSam Leffler 	uint32_t	filtered;
16133971d07bSSam Leffler 	uint32_t	bad_chan;
16143971d07bSSam Leffler 	uint32_t	beacons;
16153971d07bSSam Leffler 	uint32_t	missed_beacons;
16163971d07bSSam Leffler 	uint32_t	adc_saturated;	/* time in 0.8us */
16173971d07bSSam Leffler 	uint32_t	ina_searched;	/* time in 0.8us */
16183971d07bSSam Leffler 	uint32_t	noise[3];
16193971d07bSSam Leffler 	uint32_t	flags;
16203971d07bSSam Leffler 	uint32_t	load;
16213971d07bSSam Leffler 	uint32_t	fa;
16223971d07bSSam Leffler 	uint32_t	rssi[3];
16233971d07bSSam Leffler 	uint32_t	energy[3];
16243971d07bSSam Leffler } __packed;
16253971d07bSSam Leffler 
16263971d07bSSam Leffler struct iwn_rx_ht_phy_stats {
16273971d07bSSam Leffler 	uint32_t	bad_plcp;
16283971d07bSSam Leffler 	uint32_t	overrun;
16293971d07bSSam Leffler 	uint32_t	eoverrun;
16303971d07bSSam Leffler 	uint32_t	good_crc32;
16313971d07bSSam Leffler 	uint32_t	bad_crc32;
16323971d07bSSam Leffler 	uint32_t	bad_mh;
16333971d07bSSam Leffler 	uint32_t	good_ampdu_crc32;
16343971d07bSSam Leffler 	uint32_t	ampdu;
16353971d07bSSam Leffler 	uint32_t	fragment;
16360840bbcdSAdrian Chadd 	uint32_t	unsupport_mcs;
16373971d07bSSam Leffler } __packed;
16383971d07bSSam Leffler 
16393971d07bSSam Leffler struct iwn_rx_stats {
16403971d07bSSam Leffler 	struct iwn_rx_phy_stats		ofdm;
16413971d07bSSam Leffler 	struct iwn_rx_phy_stats		cck;
16423971d07bSSam Leffler 	struct iwn_rx_general_stats	general;
16433971d07bSSam Leffler 	struct iwn_rx_ht_phy_stats	ht;
16443971d07bSSam Leffler } __packed;
16453971d07bSSam Leffler 
16460840bbcdSAdrian Chadd struct iwn_rx_general_stats_bt {
16470840bbcdSAdrian Chadd 	struct iwn_rx_general_stats common;
16480840bbcdSAdrian Chadd 	/* additional stats for bt */
16490840bbcdSAdrian Chadd 	uint32_t num_bt_kills;
16500840bbcdSAdrian Chadd 	uint32_t reserved[2];
16510840bbcdSAdrian Chadd } __packed;
16520840bbcdSAdrian Chadd 
16530840bbcdSAdrian Chadd struct iwn_rx_stats_bt {
16540840bbcdSAdrian Chadd 	struct iwn_rx_phy_stats		ofdm;
16550840bbcdSAdrian Chadd 	struct iwn_rx_phy_stats		cck;
16560840bbcdSAdrian Chadd 	struct iwn_rx_general_stats_bt	general_bt;
16570840bbcdSAdrian Chadd 	struct iwn_rx_ht_phy_stats	ht;
16580840bbcdSAdrian Chadd } __packed;
16590840bbcdSAdrian Chadd 
16603971d07bSSam Leffler struct iwn_tx_stats {
16613971d07bSSam Leffler 	uint32_t	preamble;
16623971d07bSSam Leffler 	uint32_t	rx_detected;
16633971d07bSSam Leffler 	uint32_t	bt_defer;
16643971d07bSSam Leffler 	uint32_t	bt_kill;
16653971d07bSSam Leffler 	uint32_t	short_len;
16663971d07bSSam Leffler 	uint32_t	cts_timeout;
16673971d07bSSam Leffler 	uint32_t	ack_timeout;
16683971d07bSSam Leffler 	uint32_t	exp_ack;
16693971d07bSSam Leffler 	uint32_t	ack;
16703971d07bSSam Leffler 	uint32_t	msdu;
16712e9afe95SAdrian Chadd 	uint32_t	burst_err1;
16723971d07bSSam Leffler 	uint32_t	burst_err2;
16733971d07bSSam Leffler 	uint32_t	cts_collision;
16743971d07bSSam Leffler 	uint32_t	ack_collision;
16753971d07bSSam Leffler 	uint32_t	ba_timeout;
16763971d07bSSam Leffler 	uint32_t	ba_resched;
16773971d07bSSam Leffler 	uint32_t	query_ampdu;
16783971d07bSSam Leffler 	uint32_t	query;
16793971d07bSSam Leffler 	uint32_t	query_ampdu_frag;
16803971d07bSSam Leffler 	uint32_t	query_mismatch;
16813971d07bSSam Leffler 	uint32_t	not_ready;
16823971d07bSSam Leffler 	uint32_t	underrun;
16833971d07bSSam Leffler 	uint32_t	bt_ht_kill;
16843971d07bSSam Leffler 	uint32_t	rx_ba_resp;
16850840bbcdSAdrian Chadd 	/*
16860840bbcdSAdrian Chadd 	 * 6000 series only - LSB=ant A, ant B, ant C, MSB=reserved
16870840bbcdSAdrian Chadd 	 * TX power on chain in 1/2 dBm.
16880840bbcdSAdrian Chadd 	 */
16890840bbcdSAdrian Chadd 	uint32_t	tx_power;
16900840bbcdSAdrian Chadd 	uint32_t	reserved[1];
16913971d07bSSam Leffler } __packed;
16923971d07bSSam Leffler 
16933971d07bSSam Leffler struct iwn_general_stats {
16940840bbcdSAdrian Chadd 	uint32_t	temp;		/* radio temperature */
16950840bbcdSAdrian Chadd 	uint32_t	temp_m;		/* radio voltage */
16963971d07bSSam Leffler 	uint32_t	burst_check;
16973971d07bSSam Leffler 	uint32_t	burst;
16980840bbcdSAdrian Chadd 	uint32_t	wait_for_silence_timeout_cnt;
16990840bbcdSAdrian Chadd 	uint32_t	reserved1[3];
17003971d07bSSam Leffler 	uint32_t	sleep;
17013971d07bSSam Leffler 	uint32_t	slot_out;
17023971d07bSSam Leffler 	uint32_t	slot_idle;
17033971d07bSSam Leffler 	uint32_t	ttl_tstamp;
17043971d07bSSam Leffler 	uint32_t	tx_ant_a;
17053971d07bSSam Leffler 	uint32_t	tx_ant_b;
17063971d07bSSam Leffler 	uint32_t	exec;
17073971d07bSSam Leffler 	uint32_t	probe;
17083971d07bSSam Leffler 	uint32_t	reserved2[2];
17093971d07bSSam Leffler 	uint32_t	rx_enabled;
17100840bbcdSAdrian Chadd 	/*
17110840bbcdSAdrian Chadd 	 * This is the number of times we have to re-tune
17120840bbcdSAdrian Chadd 	 * in order to get out of bad PHY status.
17130840bbcdSAdrian Chadd 	 */
17140840bbcdSAdrian Chadd 	uint32_t	num_of_sos_states;
17153971d07bSSam Leffler } __packed;
17163971d07bSSam Leffler 
17173971d07bSSam Leffler struct iwn_stats {
17183971d07bSSam Leffler 	uint32_t			flags;
17193971d07bSSam Leffler 	struct iwn_rx_stats		rx;
17203971d07bSSam Leffler 	struct iwn_tx_stats		tx;
17213971d07bSSam Leffler 	struct iwn_general_stats	general;
17220840bbcdSAdrian Chadd 	uint32_t			reserved1[2];
17233971d07bSSam Leffler } __packed;
17243971d07bSSam Leffler 
17250840bbcdSAdrian Chadd struct iwn_bt_activity_stats {
17260840bbcdSAdrian Chadd 	/* Tx statistics */
17270840bbcdSAdrian Chadd 	uint32_t hi_priority_tx_req_cnt;
17280840bbcdSAdrian Chadd 	uint32_t hi_priority_tx_denied_cnt;
17290840bbcdSAdrian Chadd 	uint32_t lo_priority_tx_req_cnt;
17300840bbcdSAdrian Chadd 	uint32_t lo_priority_tx_denied_cnt;
17310840bbcdSAdrian Chadd 	/* Rx statistics */
17320840bbcdSAdrian Chadd 	uint32_t hi_priority_rx_req_cnt;
17330840bbcdSAdrian Chadd 	uint32_t hi_priority_rx_denied_cnt;
17340840bbcdSAdrian Chadd 	uint32_t lo_priority_rx_req_cnt;
17350840bbcdSAdrian Chadd 	uint32_t lo_priority_rx_denied_cnt;
17360840bbcdSAdrian Chadd } __packed;
17370840bbcdSAdrian Chadd 
17380840bbcdSAdrian Chadd struct iwn_stats_bt {
17390840bbcdSAdrian Chadd 	uint32_t			flags;
17400840bbcdSAdrian Chadd 	struct iwn_rx_stats_bt		rx_bt;
17410840bbcdSAdrian Chadd 	struct iwn_tx_stats		tx;
17420840bbcdSAdrian Chadd 	struct iwn_general_stats	general;
17430840bbcdSAdrian Chadd 	struct iwn_bt_activity_stats	activity;
17440840bbcdSAdrian Chadd 	uint32_t			reserved1[2];
17450840bbcdSAdrian Chadd };
17463971d07bSSam Leffler 
17478f302007SRui Paulo /* Firmware error dump. */
17488f302007SRui Paulo struct iwn_fw_dump {
17498f302007SRui Paulo 	uint32_t	valid;
17508f302007SRui Paulo 	uint32_t	id;
17518f302007SRui Paulo 	uint32_t	pc;
17528f302007SRui Paulo 	uint32_t	branch_link[2];
17538f302007SRui Paulo 	uint32_t	interrupt_link[2];
17548f302007SRui Paulo 	uint32_t	error_data[2];
17558f302007SRui Paulo 	uint32_t	src_line;
17568f302007SRui Paulo 	uint32_t	tsf;
17578f302007SRui Paulo 	uint32_t	time[2];
17588f302007SRui Paulo } __packed;
17598f302007SRui Paulo 
17607832b1f6SBernhard Schmidt /* TLV firmware header. */
17617832b1f6SBernhard Schmidt struct iwn_fw_tlv_hdr {
17627832b1f6SBernhard Schmidt 	uint32_t	zero;	/* Always 0, to differentiate from legacy. */
17637832b1f6SBernhard Schmidt 	uint32_t	signature;
17647832b1f6SBernhard Schmidt #define IWN_FW_SIGNATURE	0x0a4c5749	/* "IWL\n" */
17657832b1f6SBernhard Schmidt 
17667832b1f6SBernhard Schmidt 	uint8_t		descr[64];
17677832b1f6SBernhard Schmidt 	uint32_t	rev;
17687832b1f6SBernhard Schmidt #define IWN_FW_API(x)	(((x) >> 8) & 0xff)
17697832b1f6SBernhard Schmidt 
17707832b1f6SBernhard Schmidt 	uint32_t	build;
17717832b1f6SBernhard Schmidt 	uint64_t	altmask;
17727832b1f6SBernhard Schmidt } __packed;
17737832b1f6SBernhard Schmidt 
17747832b1f6SBernhard Schmidt /* TLV header. */
17757832b1f6SBernhard Schmidt struct iwn_fw_tlv {
17767832b1f6SBernhard Schmidt 	uint16_t	type;
17777832b1f6SBernhard Schmidt #define IWN_FW_TLV_MAIN_TEXT		1
17787832b1f6SBernhard Schmidt #define IWN_FW_TLV_MAIN_DATA		2
17797832b1f6SBernhard Schmidt #define IWN_FW_TLV_INIT_TEXT		3
17807832b1f6SBernhard Schmidt #define IWN_FW_TLV_INIT_DATA		4
17817832b1f6SBernhard Schmidt #define IWN_FW_TLV_BOOT_TEXT		5
17827832b1f6SBernhard Schmidt #define IWN_FW_TLV_PBREQ_MAXLEN		6
1783f8639279SAdrian Chadd #define	IWN_FW_TLV_PAN			7
1784f8639279SAdrian Chadd #define	IWN_FW_TLV_RUNT_EVTLOG_PTR	8
1785f8639279SAdrian Chadd #define	IWN_FW_TLV_RUNT_EVTLOG_SIZE	9
1786f8639279SAdrian Chadd #define	IWN_FW_TLV_RUNT_ERRLOG_PTR	10
1787f8639279SAdrian Chadd #define	IWN_FW_TLV_INIT_EVTLOG_PTR	11
1788f8639279SAdrian Chadd #define	IWN_FW_TLV_INIT_EVTLOG_SIZE	12
1789f8639279SAdrian Chadd #define	IWN_FW_TLV_INIT_ERRLOG_PTR	13
17909ff2129fSBernhard Schmidt #define IWN_FW_TLV_ENH_SENS		14
17919ff2129fSBernhard Schmidt #define IWN_FW_TLV_PHY_CALIB		15
1792f8639279SAdrian Chadd #define	IWN_FW_TLV_WOWLAN_INST		16
1793f8639279SAdrian Chadd #define	IWN_FW_TLV_WOWLAN_DATA		17
1794f8639279SAdrian Chadd #define	IWN_FW_TLV_FLAGS		18
17957832b1f6SBernhard Schmidt 
17967832b1f6SBernhard Schmidt 	uint16_t	alt;
17977832b1f6SBernhard Schmidt 	uint32_t	len;
17987832b1f6SBernhard Schmidt } __packed;
17997832b1f6SBernhard Schmidt 
18008f302007SRui Paulo #define IWN4965_FW_TEXT_MAXSZ	( 96 * 1024)
18018f302007SRui Paulo #define IWN4965_FW_DATA_MAXSZ	( 40 * 1024)
18028f302007SRui Paulo #define IWN5000_FW_TEXT_MAXSZ	(256 * 1024)
18038f302007SRui Paulo #define IWN5000_FW_DATA_MAXSZ	( 80 * 1024)
18043971d07bSSam Leffler #define IWN_FW_BOOT_TEXT_MAXSZ	1024
18058f302007SRui Paulo #define IWN4965_FWSZ		(IWN4965_FW_TEXT_MAXSZ + IWN4965_FW_DATA_MAXSZ)
18068f302007SRui Paulo #define IWN5000_FWSZ		IWN5000_FW_TEXT_MAXSZ
18073971d07bSSam Leffler 
18083971d07bSSam Leffler /*
18093b64bbd2SAdrian Chadd  * Microcode flags TLV (18.)
18103b64bbd2SAdrian Chadd  */
18113b64bbd2SAdrian Chadd 
18123b64bbd2SAdrian Chadd /**
18133b64bbd2SAdrian Chadd  * enum iwn_ucode_tlv_flag - ucode API flags
18143b64bbd2SAdrian Chadd  * @IWN_UCODE_TLV_FLAGS_PAN: This is PAN capable microcode; this previously
18153b64bbd2SAdrian Chadd  *      was a separate TLV but moved here to save space.
18163b64bbd2SAdrian Chadd  * @IWN_UCODE_TLV_FLAGS_NEWSCAN: new uCode scan behaviour on hidden SSID,
18173b64bbd2SAdrian Chadd  *      treats good CRC threshold as a boolean
18183b64bbd2SAdrian Chadd  * @IWN_UCODE_TLV_FLAGS_MFP: This uCode image supports MFP (802.11w).
18193b64bbd2SAdrian Chadd  * @IWN_UCODE_TLV_FLAGS_P2P: This uCode image supports P2P.
18203b64bbd2SAdrian Chadd  * @IWN_UCODE_TLV_FLAGS_DW_BC_TABLE: The SCD byte count table is in DWORDS
18213b64bbd2SAdrian Chadd  * @IWN_UCODE_TLV_FLAGS_UAPSD: This uCode image supports uAPSD
18223b64bbd2SAdrian Chadd  * @IWN_UCODE_TLV_FLAGS_SHORT_BL: 16 entries of black list instead of 64 in scan
18233b64bbd2SAdrian Chadd  *      offload profile config command.
18243b64bbd2SAdrian Chadd  * @IWN_UCODE_TLV_FLAGS_RX_ENERGY_API: supports rx signal strength api
18253b64bbd2SAdrian Chadd  * @IWN_UCODE_TLV_FLAGS_TIME_EVENT_API_V2: using the new time event API.
18263b64bbd2SAdrian Chadd  * @IWN_UCODE_TLV_FLAGS_D3_6_IPV6_ADDRS: D3 image supports up to six
18273b64bbd2SAdrian Chadd  *      (rather than two) IPv6 addresses
18283b64bbd2SAdrian Chadd  * @IWN_UCODE_TLV_FLAGS_BF_UPDATED: new beacon filtering API
18293b64bbd2SAdrian Chadd  * @IWN_UCODE_TLV_FLAGS_NO_BASIC_SSID: not sending a probe with the SSID element
18303b64bbd2SAdrian Chadd  *      from the probe request template.
18313b64bbd2SAdrian Chadd  * @IWN_UCODE_TLV_FLAGS_D3_CONTINUITY_API: modified D3 API to allow keeping
18323b64bbd2SAdrian Chadd  *      connection when going back to D0
18333b64bbd2SAdrian Chadd  * @IWN_UCODE_TLV_FLAGS_NEW_NSOFFL_SMALL: new NS offload (small version)
18343b64bbd2SAdrian Chadd  * @IWN_UCODE_TLV_FLAGS_NEW_NSOFFL_LARGE: new NS offload (large version)
18353b64bbd2SAdrian Chadd  * @IWN_UCODE_TLV_FLAGS_SCHED_SCAN: this uCode image supports scheduled scan.
18363b64bbd2SAdrian Chadd  * @IWN_UCODE_TLV_FLAGS_STA_KEY_CMD: new ADD_STA and ADD_STA_KEY command API
18373b64bbd2SAdrian Chadd  * @IWN_UCODE_TLV_FLAGS_DEVICE_PS_CMD: support device wide power command
18383b64bbd2SAdrian Chadd  *      containing CAM (Continuous Active Mode) indication.
18393b64bbd2SAdrian Chadd  */
18403b64bbd2SAdrian Chadd enum iwn_ucode_tlv_flag {
18413b64bbd2SAdrian Chadd 	IWN_UCODE_TLV_FLAGS_PAN			= (1 << 0),
18423b64bbd2SAdrian Chadd 	IWN_UCODE_TLV_FLAGS_NEWSCAN		= (1 << 1),
18433b64bbd2SAdrian Chadd 	IWN_UCODE_TLV_FLAGS_MFP			= (1 << 2),
18443b64bbd2SAdrian Chadd 	IWN_UCODE_TLV_FLAGS_P2P			= (1 << 3),
18453b64bbd2SAdrian Chadd 	IWN_UCODE_TLV_FLAGS_DW_BC_TABLE		= (1 << 4),
18463b64bbd2SAdrian Chadd 	IWN_UCODE_TLV_FLAGS_NEWBT_COEX		= (1 << 5),
18473b64bbd2SAdrian Chadd 	IWN_UCODE_TLV_FLAGS_UAPSD		= (1 << 6),
18483b64bbd2SAdrian Chadd 	IWN_UCODE_TLV_FLAGS_SHORT_BL		= (1 << 7),
18493b64bbd2SAdrian Chadd 	IWN_UCODE_TLV_FLAGS_RX_ENERGY_API	= (1 << 8),
18503b64bbd2SAdrian Chadd 	IWN_UCODE_TLV_FLAGS_TIME_EVENT_API_V2	= (1 << 9),
18513b64bbd2SAdrian Chadd 	IWN_UCODE_TLV_FLAGS_D3_6_IPV6_ADDRS	= (1 << 10),
18523b64bbd2SAdrian Chadd 	IWN_UCODE_TLV_FLAGS_BF_UPDATED		= (1 << 11),
18533b64bbd2SAdrian Chadd 	IWN_UCODE_TLV_FLAGS_NO_BASIC_SSID	= (1 << 12),
18543b64bbd2SAdrian Chadd 	IWN_UCODE_TLV_FLAGS_D3_CONTINUITY_API	= (1 << 14),
18553b64bbd2SAdrian Chadd 	IWN_UCODE_TLV_FLAGS_NEW_NSOFFL_SMALL	= (1 << 15),
18563b64bbd2SAdrian Chadd 	IWN_UCODE_TLV_FLAGS_NEW_NSOFFL_LARGE	= (1 << 16),
18573b64bbd2SAdrian Chadd 	IWN_UCODE_TLV_FLAGS_SCHED_SCAN		= (1 << 17),
18583b64bbd2SAdrian Chadd 	IWN_UCODE_TLV_FLAGS_STA_KEY_CMD		= (1 << 19),
18593b64bbd2SAdrian Chadd 	IWN_UCODE_TLV_FLAGS_DEVICE_PS_CMD	= (1 << 20),
18603b64bbd2SAdrian Chadd };
18613b64bbd2SAdrian Chadd 
18623b64bbd2SAdrian Chadd /*
18633971d07bSSam Leffler  * Offsets into EEPROM.
18643971d07bSSam Leffler  */
18653971d07bSSam Leffler #define IWN_EEPROM_MAC		0x015
18669dd0e40bSBernhard Schmidt #define IWN_EEPROM_SKU_CAP	0x045
18678f302007SRui Paulo #define IWN_EEPROM_RFCFG	0x048
18688f302007SRui Paulo #define IWN4965_EEPROM_DOMAIN	0x060
18698f302007SRui Paulo #define IWN4965_EEPROM_BAND1	0x063
18708f302007SRui Paulo #define IWN5000_EEPROM_REG	0x066
18718f302007SRui Paulo #define IWN5000_EEPROM_CAL	0x067
18728f302007SRui Paulo #define IWN4965_EEPROM_BAND2	0x072
18738f302007SRui Paulo #define IWN4965_EEPROM_BAND3	0x080
18748f302007SRui Paulo #define IWN4965_EEPROM_BAND4	0x08d
18758f302007SRui Paulo #define IWN4965_EEPROM_BAND5	0x099
18768f302007SRui Paulo #define IWN4965_EEPROM_BAND6	0x0a0
18778f302007SRui Paulo #define IWN4965_EEPROM_BAND7	0x0a8
18788f302007SRui Paulo #define IWN4965_EEPROM_MAXPOW	0x0e8
18798f302007SRui Paulo #define IWN4965_EEPROM_VOLTAGE	0x0e9
18808f302007SRui Paulo #define IWN4965_EEPROM_BANDS	0x0ea
18818f302007SRui Paulo /* Indirect offsets. */
1882f8639279SAdrian Chadd #define	IWN5000_EEPROM_NO_HT40	0x000
18838f302007SRui Paulo #define IWN5000_EEPROM_DOMAIN	0x001
18848f302007SRui Paulo #define IWN5000_EEPROM_BAND1	0x004
18858f302007SRui Paulo #define IWN5000_EEPROM_BAND2	0x013
18868f302007SRui Paulo #define IWN5000_EEPROM_BAND3	0x021
18878f302007SRui Paulo #define IWN5000_EEPROM_BAND4	0x02e
18888f302007SRui Paulo #define IWN5000_EEPROM_BAND5	0x03a
18898f302007SRui Paulo #define IWN5000_EEPROM_BAND6	0x041
1890688f9483SBernhard Schmidt #define IWN6000_EEPROM_BAND6	0x040
18918f302007SRui Paulo #define IWN5000_EEPROM_BAND7	0x049
18920f454b93SRui Paulo #define IWN6000_EEPROM_ENHINFO	0x054
18938f302007SRui Paulo #define IWN5000_EEPROM_CRYSTAL	0x128
18948f302007SRui Paulo #define IWN5000_EEPROM_TEMP	0x12a
18958f302007SRui Paulo #define IWN5000_EEPROM_VOLT	0x12b
18968f302007SRui Paulo 
18979dd0e40bSBernhard Schmidt /* Possible flags for IWN_EEPROM_SKU_CAP. */
18989dd0e40bSBernhard Schmidt #define IWN_EEPROM_SKU_CAP_11N	(1 << 6)
18999dd0e40bSBernhard Schmidt #define IWN_EEPROM_SKU_CAP_AMT	(1 << 7)
19009dd0e40bSBernhard Schmidt #define IWN_EEPROM_SKU_CAP_IPAN	(1 << 8)
19019dd0e40bSBernhard Schmidt 
19028f302007SRui Paulo /* Possible flags for IWN_EEPROM_RFCFG. */
19038f302007SRui Paulo #define IWN_RFCFG_TYPE(x)	(((x) >>  0) & 0x3)
19048f302007SRui Paulo #define IWN_RFCFG_STEP(x)	(((x) >>  2) & 0x3)
19058f302007SRui Paulo #define IWN_RFCFG_DASH(x)	(((x) >>  4) & 0x3)
19068f302007SRui Paulo #define IWN_RFCFG_TXANTMSK(x)	(((x) >>  8) & 0xf)
19078f302007SRui Paulo #define IWN_RFCFG_RXANTMSK(x)	(((x) >> 12) & 0xf)
19083971d07bSSam Leffler 
19093971d07bSSam Leffler struct iwn_eeprom_chan {
19103971d07bSSam Leffler 	uint8_t	flags;
19113971d07bSSam Leffler #define IWN_EEPROM_CHAN_VALID	(1 << 0)
19128f302007SRui Paulo #define IWN_EEPROM_CHAN_IBSS	(1 << 1)
19138f302007SRui Paulo #define IWN_EEPROM_CHAN_ACTIVE	(1 << 3)
19148f302007SRui Paulo #define IWN_EEPROM_CHAN_RADAR	(1 << 4)
19153971d07bSSam Leffler 
19163971d07bSSam Leffler 	int8_t	maxpwr;
19173971d07bSSam Leffler } __packed;
19183971d07bSSam Leffler 
19190f454b93SRui Paulo struct iwn_eeprom_enhinfo {
19203c2a1fc3SBernhard Schmidt 	uint8_t		flags;
19213c2a1fc3SBernhard Schmidt #define IWN_ENHINFO_VALID	0x01
19223c2a1fc3SBernhard Schmidt #define IWN_ENHINFO_5GHZ	0x02
19233c2a1fc3SBernhard Schmidt #define IWN_ENHINFO_OFDM	0x04
19243c2a1fc3SBernhard Schmidt #define IWN_ENHINFO_HT40	0x08
19253c2a1fc3SBernhard Schmidt #define IWN_ENHINFO_HTAP	0x10
19263c2a1fc3SBernhard Schmidt #define IWN_ENHINFO_RES1	0x20
19273c2a1fc3SBernhard Schmidt #define IWN_ENHINFO_RES2	0x40
19283c2a1fc3SBernhard Schmidt #define IWN_ENHINFO_COMMON	0x80
19293c2a1fc3SBernhard Schmidt 
19303c2a1fc3SBernhard Schmidt 	uint8_t		chan;
19310f454b93SRui Paulo 	int8_t		chain[3];	/* max power in half-dBm */
19320f454b93SRui Paulo 	uint8_t		reserved;
19330f454b93SRui Paulo 	int8_t		mimo2;		/* max power in half-dBm */
19340f454b93SRui Paulo 	int8_t		mimo3;		/* max power in half-dBm */
19350f454b93SRui Paulo } __packed;
19360f454b93SRui Paulo 
19377373959eSBernhard Schmidt struct iwn5000_eeprom_calib_hdr {
19387373959eSBernhard Schmidt 	uint8_t		version;
19397373959eSBernhard Schmidt 	uint8_t		pa_type;
19407373959eSBernhard Schmidt 	uint16_t	volt;
19417373959eSBernhard Schmidt } __packed;
19427373959eSBernhard Schmidt 
19433971d07bSSam Leffler #define IWN_NSAMPLES	3
19448f302007SRui Paulo struct iwn4965_eeprom_chan_samples {
19453971d07bSSam Leffler 	uint8_t	num;
19463971d07bSSam Leffler 	struct {
19473971d07bSSam Leffler 		uint8_t temp;
19483971d07bSSam Leffler 		uint8_t	gain;
19493971d07bSSam Leffler 		uint8_t	power;
19503971d07bSSam Leffler 		int8_t	pa_det;
19518f302007SRui Paulo 	}	samples[2][IWN_NSAMPLES];
19523971d07bSSam Leffler } __packed;
19533971d07bSSam Leffler 
19543971d07bSSam Leffler #define IWN_NBANDS	8
19558f302007SRui Paulo struct iwn4965_eeprom_band {
19563971d07bSSam Leffler 	uint8_t	lo;	/* low channel number */
19573971d07bSSam Leffler 	uint8_t	hi;	/* high channel number */
19588f302007SRui Paulo 	struct	iwn4965_eeprom_chan_samples chans[2];
19593971d07bSSam Leffler } __packed;
19603971d07bSSam Leffler 
19618f302007SRui Paulo /*
19628f302007SRui Paulo  * Offsets of channels descriptions in EEPROM.
19638f302007SRui Paulo  */
19648f302007SRui Paulo static const uint32_t iwn4965_regulatory_bands[IWN_NBANDS] = {
19658f302007SRui Paulo 	IWN4965_EEPROM_BAND1,
19668f302007SRui Paulo 	IWN4965_EEPROM_BAND2,
19678f302007SRui Paulo 	IWN4965_EEPROM_BAND3,
19688f302007SRui Paulo 	IWN4965_EEPROM_BAND4,
19698f302007SRui Paulo 	IWN4965_EEPROM_BAND5,
19708f302007SRui Paulo 	IWN4965_EEPROM_BAND6,
19718f302007SRui Paulo 	IWN4965_EEPROM_BAND7
19728f302007SRui Paulo };
19738f302007SRui Paulo 
19748f302007SRui Paulo static const uint32_t iwn5000_regulatory_bands[IWN_NBANDS] = {
19758f302007SRui Paulo 	IWN5000_EEPROM_BAND1,
19768f302007SRui Paulo 	IWN5000_EEPROM_BAND2,
19778f302007SRui Paulo 	IWN5000_EEPROM_BAND3,
19788f302007SRui Paulo 	IWN5000_EEPROM_BAND4,
19798f302007SRui Paulo 	IWN5000_EEPROM_BAND5,
19808f302007SRui Paulo 	IWN5000_EEPROM_BAND6,
19818f302007SRui Paulo 	IWN5000_EEPROM_BAND7
19828f302007SRui Paulo };
19838f302007SRui Paulo 
1984688f9483SBernhard Schmidt static const uint32_t iwn6000_regulatory_bands[IWN_NBANDS] = {
1985688f9483SBernhard Schmidt 	IWN5000_EEPROM_BAND1,
1986688f9483SBernhard Schmidt 	IWN5000_EEPROM_BAND2,
1987688f9483SBernhard Schmidt 	IWN5000_EEPROM_BAND3,
1988688f9483SBernhard Schmidt 	IWN5000_EEPROM_BAND4,
1989688f9483SBernhard Schmidt 	IWN5000_EEPROM_BAND5,
1990688f9483SBernhard Schmidt 	IWN6000_EEPROM_BAND6,
1991688f9483SBernhard Schmidt 	IWN5000_EEPROM_BAND7
1992688f9483SBernhard Schmidt };
1993688f9483SBernhard Schmidt 
1994f8639279SAdrian Chadd static const uint32_t iwn1000_regulatory_bands[IWN_NBANDS] = {
1995f8639279SAdrian Chadd 	IWN5000_EEPROM_BAND1,
1996f8639279SAdrian Chadd 	IWN5000_EEPROM_BAND2,
1997f8639279SAdrian Chadd 	IWN5000_EEPROM_BAND3,
1998f8639279SAdrian Chadd 	IWN5000_EEPROM_BAND4,
1999f8639279SAdrian Chadd 	IWN5000_EEPROM_BAND5,
2000f8639279SAdrian Chadd 	IWN5000_EEPROM_BAND6,
2001f8639279SAdrian Chadd 	IWN5000_EEPROM_NO_HT40,
2002f8639279SAdrian Chadd };
2003f8639279SAdrian Chadd 
20044cfb1a08SAdrian Chadd static const uint32_t iwn2030_regulatory_bands[IWN_NBANDS] = {
20054cfb1a08SAdrian Chadd 	IWN5000_EEPROM_BAND1,
20064cfb1a08SAdrian Chadd 	IWN5000_EEPROM_BAND2,
20074cfb1a08SAdrian Chadd 	IWN5000_EEPROM_BAND3,
20084cfb1a08SAdrian Chadd 	IWN5000_EEPROM_BAND4,
20094cfb1a08SAdrian Chadd 	IWN5000_EEPROM_BAND5,
20104cfb1a08SAdrian Chadd 	IWN6000_EEPROM_BAND6,
20114cfb1a08SAdrian Chadd 	IWN5000_EEPROM_BAND7
20124cfb1a08SAdrian Chadd };
20134cfb1a08SAdrian Chadd 
20148f302007SRui Paulo #define IWN_CHAN_BANDS_COUNT	 7
20158f302007SRui Paulo #define IWN_MAX_CHAN_PER_BAND	14
20168f302007SRui Paulo static const struct iwn_chan_band {
20178f302007SRui Paulo 	uint8_t	nchan;
20188f302007SRui Paulo 	uint8_t	chan[IWN_MAX_CHAN_PER_BAND];
20198f302007SRui Paulo } iwn_bands[] = {
20208f302007SRui Paulo 	/* 20MHz channels, 2GHz band. */
20218f302007SRui Paulo 	{ 14, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 } },
20228f302007SRui Paulo 	/* 20MHz channels, 5GHz band. */
20238f302007SRui Paulo 	{ 13, { 183, 184, 185, 187, 188, 189, 192, 196, 7, 8, 11, 12, 16 } },
20248f302007SRui Paulo 	{ 12, { 34, 36, 38, 40, 42, 44, 46, 48, 52, 56, 60, 64 } },
20258f302007SRui Paulo 	{ 11, { 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140 } },
20268f302007SRui Paulo 	{  6, { 145, 149, 153, 157, 161, 165 } },
20278f302007SRui Paulo 	/* 40MHz channels (primary channels), 2GHz band. */
20288f302007SRui Paulo 	{  7, { 1, 2, 3, 4, 5, 6, 7 } },
20298f302007SRui Paulo 	/* 40MHz channels (primary channels), 5GHz band. */
20308f302007SRui Paulo 	{ 11, { 36, 44, 52, 60, 100, 108, 116, 124, 132, 149, 157 } }
20318f302007SRui Paulo };
20328f302007SRui Paulo 
2033f8639279SAdrian Chadd static const uint8_t iwn_bss_ac_to_queue[] = {
2034f8639279SAdrian Chadd 	2, 3, 1, 0,
2035f8639279SAdrian Chadd };
2036f8639279SAdrian Chadd 
2037f8639279SAdrian Chadd static const uint8_t iwn_pan_ac_to_queue[] = {
2038f8639279SAdrian Chadd 	5, 4, 6, 7,
2039f8639279SAdrian Chadd };
20400f454b93SRui Paulo #define IWN1000_OTP_NBLOCKS	3
20410f454b93SRui Paulo #define IWN6000_OTP_NBLOCKS	4
20420f454b93SRui Paulo #define IWN6050_OTP_NBLOCKS	7
20438f302007SRui Paulo 
20448f302007SRui Paulo /* HW rate indices. */
20458f302007SRui Paulo #define IWN_RIDX_CCK1	0
20468f302007SRui Paulo #define IWN_RIDX_OFDM6	4
20478f302007SRui Paulo 
20488f302007SRui Paulo #define IWN4965_MAX_PWR_INDEX	107
2049f8639279SAdrian Chadd #define	IWN_POWERSAVE_LVL_NONE			0
2050f8639279SAdrian Chadd #define	IWN_POWERSAVE_LVL_VOIP_COMPATIBLE	1
2051f8639279SAdrian Chadd #define	IWN_POWERSAVE_LVL_MAX			5
2052f8639279SAdrian Chadd 
2053f8639279SAdrian Chadd #define	IWN_POWERSAVE_LVL_DEFAULT	IWN_POWERSAVE_LVL_NONE
2054f8639279SAdrian Chadd 
2055f8639279SAdrian Chadd /* DTIM value to pass in for IWN_POWERSAVE_LVL_VOIP_COMPATIBLE */
2056f8639279SAdrian Chadd #define	IWN_POWERSAVE_DTIM_VOIP_COMPATIBLE	2
20573971d07bSSam Leffler 
20583971d07bSSam Leffler /*
20593971d07bSSam Leffler  * RF Tx gain values from highest to lowest power (values obtained from
20603971d07bSSam Leffler  * the reference driver.)
20613971d07bSSam Leffler  */
20628f302007SRui Paulo static const uint8_t iwn4965_rf_gain_2ghz[IWN4965_MAX_PWR_INDEX + 1] = {
20633971d07bSSam Leffler 	0x3f, 0x3f, 0x3f, 0x3e, 0x3e, 0x3e, 0x3d, 0x3d, 0x3d, 0x3c, 0x3c,
20643971d07bSSam Leffler 	0x3c, 0x3b, 0x3b, 0x3b, 0x3a, 0x3a, 0x3a, 0x39, 0x39, 0x39, 0x38,
20653971d07bSSam Leffler 	0x38, 0x38, 0x37, 0x37, 0x37, 0x36, 0x36, 0x36, 0x35, 0x35, 0x35,
20663971d07bSSam Leffler 	0x34, 0x34, 0x34, 0x33, 0x33, 0x33, 0x32, 0x32, 0x32, 0x31, 0x31,
20673971d07bSSam Leffler 	0x31, 0x30, 0x30, 0x30, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x04,
20683971d07bSSam Leffler 	0x04, 0x04, 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01,
20693971d07bSSam Leffler 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
20703971d07bSSam Leffler 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
20713971d07bSSam Leffler 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
20723971d07bSSam Leffler 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
20733971d07bSSam Leffler };
20743971d07bSSam Leffler 
20758f302007SRui Paulo static const uint8_t iwn4965_rf_gain_5ghz[IWN4965_MAX_PWR_INDEX + 1] = {
20763971d07bSSam Leffler 	0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3e, 0x3e, 0x3e, 0x3d, 0x3d, 0x3d,
20773971d07bSSam Leffler 	0x3c, 0x3c, 0x3c, 0x3b, 0x3b, 0x3b, 0x3a, 0x3a, 0x3a, 0x39, 0x39,
20783971d07bSSam Leffler 	0x39, 0x38, 0x38, 0x38, 0x37, 0x37, 0x37, 0x36, 0x36, 0x36, 0x35,
20793971d07bSSam Leffler 	0x35, 0x35, 0x34, 0x34, 0x34, 0x33, 0x33, 0x33, 0x32, 0x32, 0x32,
20803971d07bSSam Leffler 	0x31, 0x31, 0x31, 0x30, 0x30, 0x30, 0x25, 0x25, 0x25, 0x24, 0x24,
20813971d07bSSam Leffler 	0x24, 0x23, 0x23, 0x23, 0x22, 0x18, 0x18, 0x17, 0x17, 0x17, 0x16,
20823971d07bSSam Leffler 	0x16, 0x16, 0x15, 0x15, 0x15, 0x14, 0x14, 0x14, 0x13, 0x13, 0x13,
20833971d07bSSam Leffler 	0x12, 0x08, 0x08, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x05, 0x05,
20843971d07bSSam Leffler 	0x05, 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x01,
20853971d07bSSam Leffler 	0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
20863971d07bSSam Leffler };
20873971d07bSSam Leffler 
20883971d07bSSam Leffler /*
20893971d07bSSam Leffler  * DSP pre-DAC gain values from highest to lowest power (values obtained
20903971d07bSSam Leffler  * from the reference driver.)
20913971d07bSSam Leffler  */
20928f302007SRui Paulo static const uint8_t iwn4965_dsp_gain_2ghz[IWN4965_MAX_PWR_INDEX + 1] = {
20933971d07bSSam Leffler 	0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68,
20943971d07bSSam Leffler 	0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e,
20953971d07bSSam Leffler 	0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62,
20963971d07bSSam Leffler 	0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68,
20973971d07bSSam Leffler 	0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e,
20983971d07bSSam Leffler 	0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62,
20993971d07bSSam Leffler 	0x6e, 0x68, 0x62, 0x61, 0x60, 0x5f, 0x5e, 0x5d, 0x5c, 0x5b, 0x5a,
21003971d07bSSam Leffler 	0x59, 0x58, 0x57, 0x56, 0x55, 0x54, 0x53, 0x52, 0x51, 0x50, 0x4f,
21013971d07bSSam Leffler 	0x4e, 0x4d, 0x4c, 0x4b, 0x4a, 0x49, 0x48, 0x47, 0x46, 0x45, 0x44,
21023971d07bSSam Leffler 	0x43, 0x42, 0x41, 0x40, 0x3f, 0x3e, 0x3d, 0x3c, 0x3b
21033971d07bSSam Leffler };
21043971d07bSSam Leffler 
21058f302007SRui Paulo static const uint8_t iwn4965_dsp_gain_5ghz[IWN4965_MAX_PWR_INDEX + 1] = {
21063971d07bSSam Leffler 	0x7b, 0x75, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62,
21073971d07bSSam Leffler 	0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68,
21083971d07bSSam Leffler 	0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e,
21093971d07bSSam Leffler 	0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62,
21103971d07bSSam Leffler 	0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68,
21113971d07bSSam Leffler 	0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e,
21123971d07bSSam Leffler 	0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62,
21133971d07bSSam Leffler 	0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68,
21143971d07bSSam Leffler 	0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e,
21153971d07bSSam Leffler 	0x68, 0x62, 0x6e, 0x68, 0x62, 0x5d, 0x58, 0x53, 0x4e
21163971d07bSSam Leffler };
21173971d07bSSam Leffler 
21188f302007SRui Paulo /*
21198f302007SRui Paulo  * Power saving settings (values obtained from the reference driver.)
21208f302007SRui Paulo  */
21218f302007SRui Paulo #define IWN_NDTIMRANGES		3
21228f302007SRui Paulo #define IWN_NPOWERLEVELS	6
21238f302007SRui Paulo static const struct iwn_pmgt {
21248f302007SRui Paulo 	uint32_t	rxtimeout;
21258f302007SRui Paulo 	uint32_t	txtimeout;
21268f302007SRui Paulo 	uint32_t	intval[5];
21278f302007SRui Paulo 	int		skip_dtim;
21288f302007SRui Paulo } iwn_pmgt[IWN_NDTIMRANGES][IWN_NPOWERLEVELS] = {
21298f302007SRui Paulo 	/* DTIM <= 2 */
21308f302007SRui Paulo 	{
21318f302007SRui Paulo 	{   0,   0, {  0,  0,  0,  0,  0 }, 0 },	/* CAM */
21328f302007SRui Paulo 	{ 200, 500, {  1,  2,  2,  2, -1 }, 0 },	/* PS level 1 */
21338f302007SRui Paulo 	{ 200, 300, {  1,  2,  2,  2, -1 }, 0 },	/* PS level 2 */
21348f302007SRui Paulo 	{  50, 100, {  2,  2,  2,  2, -1 }, 0 },	/* PS level 3 */
21358f302007SRui Paulo 	{  50,  25, {  2,  2,  4,  4, -1 }, 1 },	/* PS level 4 */
21368f302007SRui Paulo 	{  25,  25, {  2,  2,  4,  6, -1 }, 2 }		/* PS level 5 */
21378f302007SRui Paulo 	},
21388f302007SRui Paulo 	/* 3 <= DTIM <= 10 */
21398f302007SRui Paulo 	{
21408f302007SRui Paulo 	{   0,   0, {  0,  0,  0,  0,  0 }, 0 },	/* CAM */
21418f302007SRui Paulo 	{ 200, 500, {  1,  2,  3,  4,  4 }, 0 },	/* PS level 1 */
21428f302007SRui Paulo 	{ 200, 300, {  1,  2,  3,  4,  7 }, 0 },	/* PS level 2 */
21438f302007SRui Paulo 	{  50, 100, {  2,  4,  6,  7,  9 }, 0 },	/* PS level 3 */
21448f302007SRui Paulo 	{  50,  25, {  2,  4,  6,  9, 10 }, 1 },	/* PS level 4 */
21458f302007SRui Paulo 	{  25,  25, {  2,  4,  7, 10, 10 }, 2 }		/* PS level 5 */
21468f302007SRui Paulo 	},
21478f302007SRui Paulo 	/* DTIM >= 11 */
21488f302007SRui Paulo 	{
21498f302007SRui Paulo 	{   0,   0, {  0,  0,  0,  0,  0 }, 0 },	/* CAM */
21508f302007SRui Paulo 	{ 200, 500, {  1,  2,  3,  4, -1 }, 0 },	/* PS level 1 */
21518f302007SRui Paulo 	{ 200, 300, {  2,  4,  6,  7, -1 }, 0 },	/* PS level 2 */
21528f302007SRui Paulo 	{  50, 100, {  2,  7,  9,  9, -1 }, 0 },	/* PS level 3 */
21538f302007SRui Paulo 	{  50,  25, {  2,  7,  9,  9, -1 }, 0 },	/* PS level 4 */
21548f302007SRui Paulo 	{  25,  25, {  4,  7, 10, 10, -1 }, 0 }		/* PS level 5 */
21558f302007SRui Paulo 	}
21568f302007SRui Paulo };
21578f302007SRui Paulo 
21588f302007SRui Paulo struct iwn_sensitivity_limits {
21598f302007SRui Paulo 	uint32_t	min_ofdm_x1;
21608f302007SRui Paulo 	uint32_t	max_ofdm_x1;
21618f302007SRui Paulo 	uint32_t	min_ofdm_mrc_x1;
21628f302007SRui Paulo 	uint32_t	max_ofdm_mrc_x1;
21638f302007SRui Paulo 	uint32_t	min_ofdm_x4;
21648f302007SRui Paulo 	uint32_t	max_ofdm_x4;
21658f302007SRui Paulo 	uint32_t	min_ofdm_mrc_x4;
21668f302007SRui Paulo 	uint32_t	max_ofdm_mrc_x4;
21678f302007SRui Paulo 	uint32_t	min_cck_x4;
21688f302007SRui Paulo 	uint32_t	max_cck_x4;
21698f302007SRui Paulo 	uint32_t	min_cck_mrc_x4;
21708f302007SRui Paulo 	uint32_t	max_cck_mrc_x4;
21718f302007SRui Paulo 	uint32_t	min_energy_cck;
21728f302007SRui Paulo 	uint32_t	energy_cck;
21738f302007SRui Paulo 	uint32_t	energy_ofdm;
2174929f6e3cSAdrian Chadd 	uint32_t	barker_mrc;
21758f302007SRui Paulo };
21768f302007SRui Paulo 
21778f302007SRui Paulo /*
21788f302007SRui Paulo  * RX sensitivity limits (values obtained from the reference driver.)
21798f302007SRui Paulo  */
21808f302007SRui Paulo static const struct iwn_sensitivity_limits iwn4965_sensitivity_limits = {
21818f302007SRui Paulo 	105, 140,
21820f454b93SRui Paulo 	220, 270,
21838f302007SRui Paulo 	 85, 120,
21848f302007SRui Paulo 	170, 210,
21858f302007SRui Paulo 	125, 200,
21868f302007SRui Paulo 	200, 400,
21878f302007SRui Paulo 	 97,
21888f302007SRui Paulo 	100,
2189929f6e3cSAdrian Chadd 	100,
2190929f6e3cSAdrian Chadd 	390
21918f302007SRui Paulo };
21928f302007SRui Paulo 
21938f302007SRui Paulo static const struct iwn_sensitivity_limits iwn5000_sensitivity_limits = {
21947373959eSBernhard Schmidt 	120, 120,	/* min = max for performance bug in DSP. */
21957373959eSBernhard Schmidt 	240, 240,	/* min = max for performance bug in DSP. */
21968f302007SRui Paulo 	 90, 120,
21978f302007SRui Paulo 	170, 210,
21988f302007SRui Paulo 	125, 200,
21998f302007SRui Paulo 	170, 400,
22008f302007SRui Paulo 	 95,
22018f302007SRui Paulo 	 95,
2202929f6e3cSAdrian Chadd 	 95,
2203929f6e3cSAdrian Chadd 	 390
22048f302007SRui Paulo };
22058f302007SRui Paulo 
22060f454b93SRui Paulo static const struct iwn_sensitivity_limits iwn5150_sensitivity_limits = {
22070f454b93SRui Paulo 	105, 105,	/* min = max for performance bug in DSP. */
22080f454b93SRui Paulo 	220, 220,	/* min = max for performance bug in DSP. */
22090f454b93SRui Paulo 	 90, 120,
22100f454b93SRui Paulo 	170, 210,
22110f454b93SRui Paulo 	125, 200,
22120f454b93SRui Paulo 	170, 400,
22130f454b93SRui Paulo 	 95,
22140f454b93SRui Paulo 	 95,
2215929f6e3cSAdrian Chadd 	 95,
2216929f6e3cSAdrian Chadd 	 390,
22170f454b93SRui Paulo };
22180f454b93SRui Paulo 
22197373959eSBernhard Schmidt static const struct iwn_sensitivity_limits iwn1000_sensitivity_limits = {
22207373959eSBernhard Schmidt 	120, 155,
22217373959eSBernhard Schmidt 	240, 290,
22227373959eSBernhard Schmidt 	 90, 120,
22237373959eSBernhard Schmidt 	170, 210,
22247373959eSBernhard Schmidt 	125, 200,
22257373959eSBernhard Schmidt 	170, 400,
22267373959eSBernhard Schmidt 	 95,
22277373959eSBernhard Schmidt 	 95,
2228929f6e3cSAdrian Chadd 	 95,
2229929f6e3cSAdrian Chadd 	 390,
22307373959eSBernhard Schmidt };
22317373959eSBernhard Schmidt 
22320f454b93SRui Paulo static const struct iwn_sensitivity_limits iwn6000_sensitivity_limits = {
22337373959eSBernhard Schmidt 	105, 110,
22340f454b93SRui Paulo 	192, 232,
22350f454b93SRui Paulo 	 80, 145,
22360f454b93SRui Paulo 	128, 232,
22370f454b93SRui Paulo 	125, 175,
22380f454b93SRui Paulo 	160, 310,
22390f454b93SRui Paulo 	 97,
22400f454b93SRui Paulo 	 97,
2241929f6e3cSAdrian Chadd 	100,
2242929f6e3cSAdrian Chadd 	390
22430f454b93SRui Paulo };
22440f454b93SRui Paulo 
2245929f6e3cSAdrian Chadd static const struct iwn_sensitivity_limits iwn6235_sensitivity_limits = {
2246929f6e3cSAdrian Chadd 	105, 110,
2247929f6e3cSAdrian Chadd 	192, 232,
2248929f6e3cSAdrian Chadd 	 80, 145,
2249929f6e3cSAdrian Chadd 	128, 232,
2250929f6e3cSAdrian Chadd 	125, 175,
2251929f6e3cSAdrian Chadd 	160, 310,
2252929f6e3cSAdrian Chadd 	100,
2253929f6e3cSAdrian Chadd 	110,
2254929f6e3cSAdrian Chadd 	110,
2255929f6e3cSAdrian Chadd 	336
2256929f6e3cSAdrian Chadd };
2257929f6e3cSAdrian Chadd 
2258929f6e3cSAdrian Chadd 
2259f8639279SAdrian Chadd /* Get value from linux kernel 3.2.+ in Drivers/net/wireless/iwlwifi/iwl-2000.c*/
2260f8639279SAdrian Chadd static const struct iwn_sensitivity_limits iwn2030_sensitivity_limits = {
2261f8639279SAdrian Chadd 	105,110,
2262f8639279SAdrian Chadd 	128,232,
2263f8639279SAdrian Chadd 	80,145,
2264f8639279SAdrian Chadd 	128,232,
2265f8639279SAdrian Chadd 	125,175,
2266f8639279SAdrian Chadd 	160,310,
2267f8639279SAdrian Chadd 	97,
2268f8639279SAdrian Chadd 	97,
2269*561d34d7SSofian Brabez 	110,
2270*561d34d7SSofian Brabez 	390
2271f8639279SAdrian Chadd };
2272f8639279SAdrian Chadd 
22738f302007SRui Paulo /* Map TID to TX scheduler's FIFO. */
22748f302007SRui Paulo static const uint8_t iwn_tid2fifo[] = {
22758f302007SRui Paulo 	1, 0, 0, 1, 2, 2, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 3
22768f302007SRui Paulo };
22778f302007SRui Paulo 
22780f454b93SRui Paulo /* WiFi/WiMAX coexist event priority table for 6050. */
22790f454b93SRui Paulo static const struct iwn5000_wimax_event iwn6050_wimax_events[] = {
22800f454b93SRui Paulo 	{ 0x04, 0x03, 0x00, 0x00 },
22810f454b93SRui Paulo 	{ 0x04, 0x03, 0x00, 0x03 },
22820f454b93SRui Paulo 	{ 0x04, 0x03, 0x00, 0x03 },
22830f454b93SRui Paulo 	{ 0x04, 0x03, 0x00, 0x03 },
22840f454b93SRui Paulo 	{ 0x04, 0x03, 0x00, 0x00 },
22850f454b93SRui Paulo 	{ 0x04, 0x03, 0x00, 0x07 },
22860f454b93SRui Paulo 	{ 0x04, 0x03, 0x00, 0x00 },
22870f454b93SRui Paulo 	{ 0x04, 0x03, 0x00, 0x03 },
22880f454b93SRui Paulo 	{ 0x04, 0x03, 0x00, 0x03 },
22890f454b93SRui Paulo 	{ 0x04, 0x03, 0x00, 0x00 },
22900f454b93SRui Paulo 	{ 0x06, 0x03, 0x00, 0x07 },
22910f454b93SRui Paulo 	{ 0x04, 0x03, 0x00, 0x00 },
22920f454b93SRui Paulo 	{ 0x06, 0x06, 0x00, 0x03 },
22930f454b93SRui Paulo 	{ 0x04, 0x03, 0x00, 0x07 },
22940f454b93SRui Paulo 	{ 0x04, 0x03, 0x00, 0x00 },
22950f454b93SRui Paulo 	{ 0x04, 0x03, 0x00, 0x00 }
22960f454b93SRui Paulo };
22970f454b93SRui Paulo 
22988f302007SRui Paulo /* Firmware errors. */
22998f302007SRui Paulo static const char * const iwn_fw_errmsg[] = {
23008f302007SRui Paulo 	"OK",
23018f302007SRui Paulo 	"FAIL",
23028f302007SRui Paulo 	"BAD_PARAM",
23038f302007SRui Paulo 	"BAD_CHECKSUM",
23048f302007SRui Paulo 	"NMI_INTERRUPT_WDG",
23058f302007SRui Paulo 	"SYSASSERT",
23068f302007SRui Paulo 	"FATAL_ERROR",
23078f302007SRui Paulo 	"BAD_COMMAND",
23088f302007SRui Paulo 	"HW_ERROR_TUNE_LOCK",
23098f302007SRui Paulo 	"HW_ERROR_TEMPERATURE",
23108f302007SRui Paulo 	"ILLEGAL_CHAN_FREQ",
23118f302007SRui Paulo 	"VCC_NOT_STABLE",
23128f302007SRui Paulo 	"FH_ERROR",
23138f302007SRui Paulo 	"NMI_INTERRUPT_HOST",
23148f302007SRui Paulo 	"NMI_INTERRUPT_ACTION_PT",
23158f302007SRui Paulo 	"NMI_INTERRUPT_UNKNOWN",
23168f302007SRui Paulo 	"UCODE_VERSION_MISMATCH",
23178f302007SRui Paulo 	"HW_ERROR_ABS_LOCK",
23188f302007SRui Paulo 	"HW_ERROR_CAL_LOCK_FAIL",
23198f302007SRui Paulo 	"NMI_INTERRUPT_INST_ACTION_PT",
23208f302007SRui Paulo 	"NMI_INTERRUPT_DATA_ACTION_PT",
23218f302007SRui Paulo 	"NMI_TRM_HW_ER",
23228f302007SRui Paulo 	"NMI_INTERRUPT_TRM",
232348a098e3SChristian Brueffer 	"NMI_INTERRUPT_BREAKPOINT",
23248f302007SRui Paulo 	"DEBUG_0",
23258f302007SRui Paulo 	"DEBUG_1",
23268f302007SRui Paulo 	"DEBUG_2",
23278f302007SRui Paulo 	"DEBUG_3",
23287373959eSBernhard Schmidt 	"ADVANCED_SYSASSERT"
23298f302007SRui Paulo };
23308f302007SRui Paulo 
23318f302007SRui Paulo /* Find least significant bit that is set. */
23328f302007SRui Paulo #define IWN_LSB(x)	((((x) - 1) & (x)) ^ (x))
23338f302007SRui Paulo 
23343971d07bSSam Leffler #define IWN_READ(sc, reg)						\
23353971d07bSSam Leffler 	bus_space_read_4((sc)->sc_st, (sc)->sc_sh, (reg))
23363971d07bSSam Leffler 
23373971d07bSSam Leffler #define IWN_WRITE(sc, reg, val)						\
23383971d07bSSam Leffler 	bus_space_write_4((sc)->sc_st, (sc)->sc_sh, (reg), (val))
23393971d07bSSam Leffler 
23400f454b93SRui Paulo #define IWN_WRITE_1(sc, reg, val)					\
23410f454b93SRui Paulo 	bus_space_write_1((sc)->sc_st, (sc)->sc_sh, (reg), (val))
23420f454b93SRui Paulo 
23438f302007SRui Paulo #define IWN_SETBITS(sc, reg, mask)					\
23448f302007SRui Paulo 	IWN_WRITE(sc, reg, IWN_READ(sc, reg) | (mask))
23458f302007SRui Paulo 
23468f302007SRui Paulo #define IWN_CLRBITS(sc, reg, mask)					\
23478f302007SRui Paulo 	IWN_WRITE(sc, reg, IWN_READ(sc, reg) & ~(mask))
23480f454b93SRui Paulo 
23490f454b93SRui Paulo #define IWN_BARRIER_WRITE(sc)						\
23500f454b93SRui Paulo 	bus_space_barrier((sc)->sc_st, (sc)->sc_sh, 0, (sc)->sc_sz,	\
23510f454b93SRui Paulo 	    BUS_SPACE_BARRIER_WRITE)
23520f454b93SRui Paulo 
23530f454b93SRui Paulo #define IWN_BARRIER_READ_WRITE(sc)					\
23540f454b93SRui Paulo 	bus_space_barrier((sc)->sc_st, (sc)->sc_sh, 0, (sc)->sc_sz,	\
23550f454b93SRui Paulo 	    BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE)
2356b876a4a3SAdrian Chadd 
2357b876a4a3SAdrian Chadd #endif	/* __IF_IWNREG_H__ */
2358