Home | History | Annotate | Line # | Download | only in pci
if_iwnreg.h revision 1.1
      1  1.1  ober /*	$OpenBSD: if_iwnreg.h,v 1.9 2007/11/27 20:59:40 damien Exp $	*/
      2  1.1  ober 
      3  1.1  ober /*-
      4  1.1  ober  * Copyright (c) 2007
      5  1.1  ober  *	Damien Bergamini <damien.bergamini (at) free.fr>
      6  1.1  ober  *
      7  1.1  ober  * Permission to use, copy, modify, and distribute this software for any
      8  1.1  ober  * purpose with or without fee is hereby granted, provided that the above
      9  1.1  ober  * copyright notice and this permission notice appear in all copies.
     10  1.1  ober  *
     11  1.1  ober  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
     12  1.1  ober  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
     13  1.1  ober  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
     14  1.1  ober  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     15  1.1  ober  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
     16  1.1  ober  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
     17  1.1  ober  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     18  1.1  ober  */
     19  1.1  ober 
     20  1.1  ober #define IWN_TX_RING_COUNT	256
     21  1.1  ober #define IWN_RX_RING_COUNT	64
     22  1.1  ober 
     23  1.1  ober #define IWN_NTXQUEUES		16
     24  1.1  ober #define IWN_NTXCHAINS		2
     25  1.1  ober 
     26  1.1  ober #define	IWN_BUF_ALIGN		4096
     27  1.1  ober 
     28  1.1  ober /*
     29  1.1  ober  * Rings must be aligned on a 256-byte boundary.
     30  1.1  ober  */
     31  1.1  ober #define IWN_RING_DMA_ALIGN	256
     32  1.1  ober 
     33  1.1  ober /* maximum scatter/gather */
     34  1.1  ober #define IWN_MAX_SCATTER	20
     35  1.1  ober 
     36  1.1  ober /* Rx buffers must be large enough to hold a full 4K A-MPDU */
     37  1.1  ober #define IWN_RBUF_SIZE	(4 * 1024)
     38  1.1  ober 
     39  1.1  ober /*
     40  1.1  ober  * Control and status registers.
     41  1.1  ober  */
     42  1.1  ober #define IWN_HWCONFIG		0x000
     43  1.1  ober #define IWN_INTR_MIT		0x004
     44  1.1  ober #define IWN_INTR		0x008
     45  1.1  ober #define IWN_MASK		0x00c
     46  1.1  ober #define IWN_INTR_STATUS		0x010
     47  1.1  ober #define IWN_RESET		0x020
     48  1.1  ober #define IWN_GPIO_CTL		0x024
     49  1.1  ober #define IWN_EEPROM_CTL		0x02c
     50  1.1  ober #define IWN_UCODE_CLR		0x05c
     51  1.1  ober #define IWN_CHICKEN		0x100
     52  1.1  ober #define IWN_QUEUE_OFFSET(qid)	(0x380 + (qid) * 8)
     53  1.1  ober #define IWN_MEM_WADDR		0x410
     54  1.1  ober #define IWN_MEM_WDATA		0x418
     55  1.1  ober #define IWN_WRITE_MEM_ADDR  	0x444
     56  1.1  ober #define IWN_READ_MEM_ADDR   	0x448
     57  1.1  ober #define IWN_WRITE_MEM_DATA  	0x44c
     58  1.1  ober #define IWN_READ_MEM_DATA   	0x450
     59  1.1  ober #define IWN_TX_WIDX		0x460
     60  1.1  ober 
     61  1.1  ober #define IWN_KW_BASE		0x197c
     62  1.1  ober #define IWN_TX_BASE(qid)	(0x19d0 + (qid) * 4)
     63  1.1  ober #define IWN_RW_WIDX_PTR		0x1bc0
     64  1.1  ober #define IWN_RX_BASE		0x1bc4
     65  1.1  ober #define IWN_RX_WIDX		0x1bc8
     66  1.1  ober #define IWN_RX_CONFIG		0x1c00
     67  1.1  ober #define IWN_RX_STATUS		0x1c44
     68  1.1  ober #define IWN_TX_CONFIG(qid)	(0x1d00 + (qid) * 32)
     69  1.1  ober #define IWN_TX_STATUS		0x1eb0
     70  1.1  ober 
     71  1.1  ober #define IWN_SRAM_BASE		0xa02c00
     72  1.1  ober #define IWN_TX_ACTIVE		(IWN_SRAM_BASE + 0x01c)
     73  1.1  ober #define IWN_QUEUE_RIDX(qid)	(IWN_SRAM_BASE + 0x064 + (qid) * 4)
     74  1.1  ober #define IWN_SELECT_QCHAIN	(IWN_SRAM_BASE + 0x0d0)
     75  1.1  ober #define IWN_QUEUE_INTR_MASK	(IWN_SRAM_BASE + 0x0e4)
     76  1.1  ober #define IWN_TXQ_STATUS(qid)	(IWN_SRAM_BASE + 0x104 + (qid) * 4)
     77  1.1  ober 
     78  1.1  ober /*
     79  1.1  ober  * NIC internal memory offsets.
     80  1.1  ober  */
     81  1.1  ober #define IWN_CLOCK_CTL		0x3000
     82  1.1  ober #define IWN_MEM_CLOCK2		0x3008
     83  1.1  ober #define IWN_MEM_POWER		0x300c
     84  1.1  ober #define IWN_MEM_PCIDEV		0x3010
     85  1.1  ober #define IWN_MEM_UCODE_CTL	0x3400
     86  1.1  ober #define IWN_MEM_UCODE_SRC	0x3404
     87  1.1  ober #define IWN_MEM_UCODE_DST	0x3408
     88  1.1  ober #define IWN_MEM_UCODE_SIZE	0x340c
     89  1.1  ober #define IWN_MEM_TEXT_BASE	0x3490
     90  1.1  ober #define IWN_MEM_TEXT_SIZE	0x3494
     91  1.1  ober #define IWN_MEM_DATA_BASE	0x3498
     92  1.1  ober #define IWN_MEM_DATA_SIZE	0x349c
     93  1.1  ober #define IWN_MEM_UCODE_BASE	0x3800
     94  1.1  ober 
     95  1.1  ober 
     96  1.1  ober /* possible flags for register IWN_HWCONFIG */
     97  1.1  ober #define IWN_HW_EEPROM_LOCKED	(1 << 21)
     98  1.1  ober 
     99  1.1  ober /* possible flags for registers IWN_READ_MEM_ADDR/IWN_WRITE_MEM_ADDR */
    100  1.1  ober #define IWN_MEM_4	((sizeof (uint32_t) - 1) << 24)
    101  1.1  ober 
    102  1.1  ober /* possible values for IWN_MEM_UCODE_DST */
    103  1.1  ober #define IWN_FW_TEXT	0x00000000
    104  1.1  ober 
    105  1.1  ober /* possible flags for register IWN_RESET */
    106  1.1  ober #define IWN_NEVO_RESET		(1 << 0)
    107  1.1  ober #define IWN_SW_RESET		(1 << 7)
    108  1.1  ober #define IWN_MASTER_DISABLED	(1 << 8)
    109  1.1  ober #define IWN_STOP_MASTER		(1 << 9)
    110  1.1  ober 
    111  1.1  ober /* possible flags for register IWN_GPIO_CTL */
    112  1.1  ober #define IWN_GPIO_CLOCK		(1 << 0)
    113  1.1  ober #define IWN_GPIO_INIT		(1 << 2)
    114  1.1  ober #define IWN_GPIO_MAC		(1 << 3)
    115  1.1  ober #define IWN_GPIO_SLEEP		(1 << 4)
    116  1.1  ober #define IWN_GPIO_PWR_STATUS	0x07000000
    117  1.1  ober #define IWN_GPIO_PWR_SLEEP	(4 << 24)
    118  1.1  ober #define IWN_GPIO_RF_ENABLED	(1 << 27)
    119  1.1  ober 
    120  1.1  ober /* possible flags for register IWN_CHICKEN */
    121  1.1  ober #define IWN_CHICKEN_DISLOS	(1 << 29)
    122  1.1  ober 
    123  1.1  ober /* possible flags for register IWN_UCODE_CLR */
    124  1.1  ober #define IWN_RADIO_OFF		(1 << 1)
    125  1.1  ober #define IWN_DISABLE_CMD		(1 << 2)
    126  1.1  ober #define IWN_CTEMP_STOP_RF	(1 << 3)
    127  1.1  ober 
    128  1.1  ober /* possible flags for IWN_RX_STATUS */
    129  1.1  ober #define	IWN_RX_IDLE	(1 << 24)
    130  1.1  ober 
    131  1.1  ober /* possible flags for register IWN_UC_CTL */
    132  1.1  ober #define IWN_UC_ENABLE	(1 << 30)
    133  1.1  ober #define IWN_UC_RUN	(1 << 31)
    134  1.1  ober 
    135  1.1  ober /* possible flags for register IWN_INTR */
    136  1.1  ober #define IWN_ALIVE_INTR	(1 <<  0)
    137  1.1  ober #define IWN_WAKEUP_INTR	(1 <<  1)
    138  1.1  ober #define IWN_SW_RX_INTR	(1 <<  3)
    139  1.1  ober #define IWN_CT_REACHED	(1 <<  6)
    140  1.1  ober #define IWN_RF_TOGGLED	(1 <<  7)
    141  1.1  ober #define IWN_SW_ERROR	(1 << 25)
    142  1.1  ober #define IWN_TX_INTR	(1 << 27)
    143  1.1  ober #define IWN_HW_ERROR	(1 << 29)
    144  1.1  ober #define IWN_RX_INTR	(1 << 31)
    145  1.1  ober 
    146  1.1  ober #define IWN_INTR_MASK							\
    147  1.1  ober 	(IWN_SW_ERROR | IWN_HW_ERROR | IWN_TX_INTR | IWN_RX_INTR |	\
    148  1.1  ober 	 IWN_ALIVE_INTR | IWN_WAKEUP_INTR | IWN_SW_RX_INTR |		\
    149  1.1  ober 	 IWN_CT_REACHED | IWN_RF_TOGGLED)
    150  1.1  ober 
    151  1.1  ober /* possible flags for register IWN_INTR_STATUS */
    152  1.1  ober #define IWN_STATUS_TXQ(x)	(1 << (x))
    153  1.1  ober #define IWN_STATUS_RXQ(x)	(1 << ((x) + 16))
    154  1.1  ober #define IWN_STATUS_PRI		(1 << 30)
    155  1.1  ober /* shortcuts for the above */
    156  1.1  ober #define IWN_TX_STATUS_INTR						\
    157  1.1  ober 	(IWN_STATUS_TXQ(0) | IWN_STATUS_TXQ(1) | IWN_STATUS_TXQ(6))
    158  1.1  ober #define IWN_RX_STATUS_INTR						\
    159  1.1  ober 	(IWN_STATUS_RXQ(0) | IWN_STATUS_RXQ(1) | IWN_STATUS_RXQ(2) |	\
    160  1.1  ober 	 IWN_STATUS_PRI)
    161  1.1  ober 
    162  1.1  ober /* possible flags for register IWN_TX_STATUS */
    163  1.1  ober #define IWN_TX_IDLE(qid)	(1 << ((qid) + 24) | 1 << ((qid) + 16))
    164  1.1  ober 
    165  1.1  ober /* possible flags for register IWN_EEPROM_CTL */
    166  1.1  ober #define IWN_EEPROM_READY	(1 << 0)
    167  1.1  ober #define IWN_EEPROM_CMD		(1 << 1)
    168  1.1  ober 
    169  1.1  ober /* possible flags for register IWN_TXQ_STATUS */
    170  1.1  ober #define IWN_TXQ_STATUS_ACTIVE	0x0007fc01
    171  1.1  ober 
    172  1.1  ober /* possible flags for register IWN_MEM_POWER */
    173  1.1  ober #define IWN_POWER_RESET	(1 << 26)
    174  1.1  ober 
    175  1.1  ober /* possible flags for register IWN_MEM_TEXT_SIZE */
    176  1.1  ober #define IWN_FW_UPDATED	(1 << 31)
    177  1.1  ober 
    178  1.1  ober /* possible flags for device-specific PCI register 0xe8 */
    179  1.1  ober #define IWN_DIS_NOSNOOP	(1 << 11)
    180  1.1  ober 
    181  1.1  ober /* possible flags for device-specific PCI register 0xf0 */
    182  1.1  ober #define IWN_ENA_L1	(1 << 1)
    183  1.1  ober 
    184  1.1  ober 
    185  1.1  ober #define IWN_TX_WINDOW	64
    186  1.1  ober struct iwn_shared {
    187  1.1  ober 	uint16_t	len[IWN_NTXQUEUES][512];	/* 16KB total */
    188  1.1  ober 	uint16_t	closed_count;
    189  1.1  ober 	uint16_t	closed_rx_count;
    190  1.1  ober 	uint16_t	finished_count;
    191  1.1  ober 	uint16_t	finished_rx_count;
    192  1.1  ober 	uint32_t	reserved[2];
    193  1.1  ober } __packed;
    194  1.1  ober 
    195  1.1  ober struct iwn_tx_desc {
    196  1.1  ober 	uint32_t	flags;
    197  1.1  ober 	struct {
    198  1.1  ober 		uint32_t	w1;
    199  1.1  ober 		uint32_t	w2;
    200  1.1  ober 		uint32_t	w3;
    201  1.1  ober 	} __packed	segs[IWN_MAX_SCATTER / 2];
    202  1.1  ober 	/* pad to 128 bytes */
    203  1.1  ober 	uint32_t	reserved;
    204  1.1  ober } __packed;
    205  1.1  ober 
    206  1.1  ober #define IWN_SET_DESC_NSEGS(d, x)					\
    207  1.1  ober 	(d)->flags = htole32(((x) & 0x1f) << 24)
    208  1.1  ober 
    209  1.1  ober /* set a segment physical address and length in a Tx descriptor */
    210  1.1  ober #define IWN_SET_DESC_SEG(d, n, addr, size) do {				\
    211  1.1  ober 	if ((n) & 1) {							\
    212  1.1  ober 		(d)->segs[(n) / 2].w2 |=				\
    213  1.1  ober 		    htole32(((addr) & 0xffff) << 16);			\
    214  1.1  ober 		(d)->segs[(n) / 2].w3 =					\
    215  1.1  ober 		    htole32((((addr) >> 16) & 0xffff) | (size) << 20);	\
    216  1.1  ober 	} else {							\
    217  1.1  ober 		(d)->segs[(n) / 2].w1 = htole32(addr);			\
    218  1.1  ober 		(d)->segs[(n) / 2].w2 = htole32((size) << 4);		\
    219  1.1  ober 	}								\
    220  1.1  ober } while (0)
    221  1.1  ober 
    222  1.1  ober struct iwn_rx_desc {
    223  1.1  ober 	uint32_t	len;
    224  1.1  ober 	uint8_t		type;
    225  1.1  ober #define IWN_UC_READY		  1
    226  1.1  ober #define IWN_ADD_NODE_DONE	 24
    227  1.1  ober #define IWN_TX_DONE		 28
    228  1.1  ober #define IWN_START_SCAN		130
    229  1.1  ober #define IWN_STOP_SCAN		132
    230  1.1  ober #define IWN_RX_STATISTICS	156
    231  1.1  ober #define IWN_BEACON_STATISTICS	157
    232  1.1  ober #define IWN_STATE_CHANGED	161
    233  1.1  ober #define IWN_BEACON_MISSED	162
    234  1.1  ober #define IWN_AMPDU_RX_START	192
    235  1.1  ober #define IWN_AMPDU_RX_DONE	193
    236  1.1  ober #define IWN_RX_DONE		195
    237  1.1  ober 
    238  1.1  ober 	uint8_t		flags;
    239  1.1  ober 	uint8_t		idx;
    240  1.1  ober 	uint8_t		qid;
    241  1.1  ober } __packed;
    242  1.1  ober 
    243  1.1  ober /* possible Rx status flags */
    244  1.1  ober #define IWN_RX_NO_CRC_ERR	(1 << 0)
    245  1.1  ober #define IWN_RX_NO_OVFL_ERR	(1 << 1)
    246  1.1  ober /* shortcut for the above */
    247  1.1  ober #define IWN_RX_NOERROR	(IWN_RX_NO_CRC_ERR | IWN_RX_NO_OVFL_ERR)
    248  1.1  ober 
    249  1.1  ober struct iwn_tx_cmd {
    250  1.1  ober 	uint8_t	code;
    251  1.1  ober #define IWN_CMD_CONFIGURE		 16
    252  1.1  ober #define IWN_CMD_ASSOCIATE		 17
    253  1.1  ober #define IWN_CMD_SET_WME          19
    254  1.1  ober #define IWN_CMD_TSF			 20
    255  1.1  ober #define IWN_CMD_ADD_NODE		 24
    256  1.1  ober #define IWN_CMD_TX_DATA			 28
    257  1.1  ober #define IWN_CMD_NODE_MRR_SETUP		 78
    258  1.1  ober #define IWN_CMD_SET_LED			 72
    259  1.1  ober #define IWN_CMD_SET_POWER_MODE		119
    260  1.1  ober #define IWN_CMD_SCAN			128
    261  1.1  ober #define IWN_CMD_SET_BEACON		145
    262  1.1  ober #define IWN_CMD_TXPOWER			151
    263  1.1  ober #define IWN_CMD_BLUETOOTH		155
    264  1.1  ober #define IWN_CMD_GET_STATISTICS		156
    265  1.1  ober #define IWN_CMD_SET_CRITICAL_TEMP	164
    266  1.1  ober #define IWN_SENSITIVITY			168
    267  1.1  ober #define IWN_PHY_CALIB			176
    268  1.1  ober 
    269  1.1  ober 	uint8_t	flags;
    270  1.1  ober 	uint8_t	idx;
    271  1.1  ober 	uint8_t	qid;
    272  1.1  ober 	uint8_t	data[136];
    273  1.1  ober } __packed;
    274  1.1  ober 
    275  1.1  ober /* structure for command IWN_CMD_CONFIGURE */
    276  1.1  ober struct iwn_config {
    277  1.1  ober 	uint8_t		myaddr[IEEE80211_ADDR_LEN];
    278  1.1  ober 	uint16_t	reserved1;
    279  1.1  ober 	uint8_t		bssid[IEEE80211_ADDR_LEN];
    280  1.1  ober 	uint16_t	reserved2;
    281  1.1  ober 	uint8_t		wlap[IEEE80211_ADDR_LEN];
    282  1.1  ober 	uint16_t	reserved3;
    283  1.1  ober 	uint8_t		mode;
    284  1.1  ober #define IWN_MODE_HOSTAP		1
    285  1.1  ober #define IWN_MODE_STA		3
    286  1.1  ober #define IWN_MODE_IBSS		4
    287  1.1  ober #define IWN_MODE_MONITOR	6
    288  1.1  ober 
    289  1.1  ober 	uint8_t		reserved4;
    290  1.1  ober 	uint16_t	rxchain;
    291  1.1  ober #define IWN_RXCHAIN_ANTMSK_SHIFT	1
    292  1.1  ober #define IWN_RXCHAIN_FORCE_MIMO		(1 << 14)
    293  1.1  ober 
    294  1.1  ober 	uint8_t		ofdm_mask;
    295  1.1  ober 	uint8_t		cck_mask;
    296  1.1  ober 	uint16_t	associd;
    297  1.1  ober 	uint32_t	flags;
    298  1.1  ober #define IWN_CONFIG_24GHZ	(1 <<  0)
    299  1.1  ober #define IWN_CONFIG_CCK		(1 <<  1)
    300  1.1  ober #define IWN_CONFIG_AUTO		(1 <<  2)
    301  1.1  ober #define IWN_CONFIG_SHSLOT	(1 <<  4)
    302  1.1  ober #define IWN_CONFIG_SHPREAMBLE	(1 <<  5)
    303  1.1  ober #define IWN_CONFIG_NODIVERSITY	(1 <<  7)
    304  1.1  ober #define IWN_CONFIG_ANTENNA_A	(1 <<  8)
    305  1.1  ober #define IWN_CONFIG_ANTENNA_B	(1 <<  9)
    306  1.1  ober #define IWN_CONFIG_TSF		(1 << 15)
    307  1.1  ober 
    308  1.1  ober 	uint32_t	filter;
    309  1.1  ober #define IWN_FILTER_PROMISC	(1 << 0)
    310  1.1  ober #define IWN_FILTER_CTL		(1 << 1)
    311  1.1  ober #define IWN_FILTER_MULTICAST	(1 << 2)
    312  1.1  ober #define IWN_FILTER_NODECRYPT	(1 << 3)
    313  1.1  ober #define IWN_FILTER_BSS		(1 << 5)
    314  1.1  ober 
    315  1.1  ober 	uint8_t		chan;
    316  1.1  ober 	uint8_t		reserved5;
    317  1.1  ober 	uint8_t		ht_single_mask;
    318  1.1  ober 	uint8_t		ht_dual_mask;
    319  1.1  ober } __packed;
    320  1.1  ober 
    321  1.1  ober /* structure for command IWN_CMD_ASSOCIATE */
    322  1.1  ober struct iwn_assoc {
    323  1.1  ober 	uint32_t	flags;
    324  1.1  ober 	uint32_t	filter;
    325  1.1  ober 	uint8_t		ofdm_mask;
    326  1.1  ober 	uint8_t		cck_mask;
    327  1.1  ober 	uint16_t	reserved;
    328  1.1  ober } __packed;
    329  1.1  ober 
    330  1.1  ober /* structure for command IWN_CMD_SET_WME */
    331  1.1  ober struct iwn_wme_setup {
    332  1.1  ober 	uint32_t	flags;
    333  1.1  ober #define IWN_EDCA_UPDATE	(1 << 0)
    334  1.1  ober #define IWN_EDCA_TXOP	(1 << 4)
    335  1.1  ober 
    336  1.1  ober 	struct {
    337  1.1  ober 		uint16_t	cwmin;
    338  1.1  ober 		uint16_t	cwmax;
    339  1.1  ober 		uint8_t		aifsn;
    340  1.1  ober 		uint8_t		reserved;
    341  1.1  ober 		uint16_t	txop;
    342  1.1  ober 	} __packed	ac[WME_NUM_AC];
    343  1.1  ober } __packed;
    344  1.1  ober 
    345  1.1  ober /* structure for command IWN_CMD_TSF */
    346  1.1  ober struct iwn_cmd_tsf {
    347  1.1  ober 	uint64_t	tstamp;
    348  1.1  ober 	uint16_t	bintval;
    349  1.1  ober 	uint16_t	atim;
    350  1.1  ober 	uint32_t	binitval;
    351  1.1  ober 	uint16_t	lintval;
    352  1.1  ober 	uint16_t	reserved;
    353  1.1  ober } __packed;
    354  1.1  ober 
    355  1.1  ober /* structure for command IWN_CMD_ADD_NODE */
    356  1.1  ober struct iwn_node_info {
    357  1.1  ober 	uint8_t		control;
    358  1.1  ober #define IWN_NODE_UPDATE		(1 << 0)
    359  1.1  ober 
    360  1.1  ober 	uint8_t		reserved1[3];
    361  1.1  ober 	uint8_t		macaddr[IEEE80211_ADDR_LEN];
    362  1.1  ober 	uint16_t	reserved2;
    363  1.1  ober 	uint8_t		id;
    364  1.1  ober #define IWN_ID_BSS		 0
    365  1.1  ober #define IWN_ID_BROADCAST	31
    366  1.1  ober 
    367  1.1  ober 	uint8_t		flags;
    368  1.1  ober #define IWN_FLAG_SET_KEY	(1 << 0)
    369  1.1  ober 
    370  1.1  ober 	uint16_t	reserved3;
    371  1.1  ober 	uint16_t	security;
    372  1.1  ober 	uint8_t		tsc2;	/* TKIP TSC2 */
    373  1.1  ober 	uint8_t		reserved4;
    374  1.1  ober 	uint16_t	ttak[5];
    375  1.1  ober 	uint16_t	reserved5;
    376  1.1  ober 	uint8_t		key[IEEE80211_KEYBUF_SIZE];
    377  1.1  ober 	uint32_t	htflags;
    378  1.1  ober #define IWN_AMDPU_SIZE_FACTOR_SHIFT	19
    379  1.1  ober #define IWN_AMDPU_DENSITY_SHIFT		23
    380  1.1  ober 
    381  1.1  ober 	uint32_t	mask;
    382  1.1  ober 	uint16_t	tid;
    383  1.1  ober 	uint8_t		rate;
    384  1.1  ober 	uint8_t		rflags;
    385  1.1  ober #define IWN_RFLAG_CCK	(1 << 1)
    386  1.1  ober #define IWN_RFLAG_ANT_A	(1 << 6)
    387  1.1  ober #define IWN_RFLAG_ANT_B	(1 << 7)
    388  1.1  ober 
    389  1.1  ober 	uint8_t		add_imm;
    390  1.1  ober 	uint8_t		del_imm;
    391  1.1  ober 	uint16_t	add_imm_start;
    392  1.1  ober 	uint32_t	reserved6;
    393  1.1  ober } __packed;
    394  1.1  ober 
    395  1.1  ober /* structure for command IWN_CMD_TX_DATA */
    396  1.1  ober struct iwn_cmd_data {
    397  1.1  ober 	uint16_t	len;
    398  1.1  ober 	uint16_t	lnext;
    399  1.1  ober 	uint32_t	flags;
    400  1.1  ober #define IWN_TX_NEED_RTS		(1 <<  1)
    401  1.1  ober #define IWN_TX_NEED_CTS		(1 <<  2)
    402  1.1  ober #define IWN_TX_NEED_ACK		(1 <<  3)
    403  1.1  ober #define IWN_TX_USE_NODE_RATE	(1 <<  4)
    404  1.1  ober #define IWN_TX_FULL_TXOP	(1 <<  7)
    405  1.1  ober #define IWN_TX_BT_DISABLE	(1 << 12)	/* bluetooth coexistence */
    406  1.1  ober #define IWN_TX_AUTO_SEQ		(1 << 13)
    407  1.1  ober #define IWN_TX_INSERT_TSTAMP	(1 << 16)
    408  1.1  ober #define IWN_TX_NEED_PADDING	(1 << 20)
    409  1.1  ober 
    410  1.1  ober 	uint8_t		ntries;
    411  1.1  ober 	uint8_t		bluetooth;
    412  1.1  ober 	uint16_t	reserved1;
    413  1.1  ober 	uint8_t		rate;
    414  1.1  ober 	uint8_t		rflags;
    415  1.1  ober 	uint16_t	xrflags;
    416  1.1  ober 	uint8_t		id;
    417  1.1  ober 	uint8_t		security;
    418  1.1  ober #define IWN_CIPHER_WEP40	1
    419  1.1  ober #define IWN_CIPHER_CCMP		2
    420  1.1  ober #define IWN_CIPHER_TKIP		3
    421  1.1  ober #define IWN_CIPHER_WEP104	9
    422  1.1  ober 
    423  1.1  ober 	uint8_t		ridx;
    424  1.1  ober 	uint8_t		reserved2;
    425  1.1  ober 	uint8_t		key[IEEE80211_KEYBUF_SIZE];
    426  1.1  ober 	uint16_t	fnext;
    427  1.1  ober 	uint16_t	reserved3;
    428  1.1  ober 	uint32_t	lifetime;
    429  1.1  ober #define IWN_LIFETIME_INFINITE	0xffffffff
    430  1.1  ober 
    431  1.1  ober 	uint32_t	loaddr;
    432  1.1  ober 	uint8_t		hiaddr;
    433  1.1  ober 	uint8_t		rts_ntries;
    434  1.1  ober 	uint8_t		data_ntries;
    435  1.1  ober 	uint8_t		tid;
    436  1.1  ober 	uint16_t	timeout;
    437  1.1  ober 	uint16_t	txop;
    438  1.1  ober } __packed;
    439  1.1  ober 
    440  1.1  ober /* structure for command IWN_CMD_SET_BEACON */
    441  1.1  ober struct iwn_cmd_beacon {
    442  1.1  ober 	uint16_t	len;
    443  1.1  ober 	uint16_t	reserved1;
    444  1.1  ober 	uint32_t	flags;	/* same as iwn_cmd_data */
    445  1.1  ober 	uint8_t		rate;
    446  1.1  ober 	uint8_t		id;
    447  1.1  ober 	uint8_t		reserved2[30];
    448  1.1  ober 	uint32_t	lifetime;
    449  1.1  ober 	uint8_t		ofdm_mask;
    450  1.1  ober 	uint8_t		cck_mask;
    451  1.1  ober 	uint16_t	reserved3[3];
    452  1.1  ober 	uint16_t	tim;
    453  1.1  ober 	uint8_t		timsz;
    454  1.1  ober 	uint8_t		reserved4;
    455  1.1  ober 	struct		ieee80211_frame wh;
    456  1.1  ober } __packed;
    457  1.1  ober 
    458  1.1  ober /* structure for command IWN_CMD_MRR_NODE_SETUP */
    459  1.1  ober #define IWN_MAX_TX_RETRIES	16
    460  1.1  ober struct iwn_cmd_mrr {
    461  1.1  ober 	uint8_t		id;
    462  1.1  ober 	uint8_t		reserved1;
    463  1.1  ober 	uint16_t	ctl;
    464  1.1  ober 	uint8_t		flags;
    465  1.1  ober 	uint8_t		mimo;
    466  1.1  ober 	uint8_t		ssmask;
    467  1.1  ober 	uint8_t		dsmask;
    468  1.1  ober 	uint8_t		ridx[WME_NUM_AC];
    469  1.1  ober 	uint16_t	ampdu_limit;
    470  1.1  ober 	uint8_t		ampdu_disable;
    471  1.1  ober 	uint8_t		ampdu_max;
    472  1.1  ober 	uint32_t	reserved2;
    473  1.1  ober 	struct {
    474  1.1  ober 		uint8_t		rate;
    475  1.1  ober #define IWN_CCK1	 0
    476  1.1  ober #define IWN_CCK11	 3
    477  1.1  ober #define IWN_OFDM6	 4
    478  1.1  ober #define IWN_OFDM54	11
    479  1.1  ober 
    480  1.1  ober 		uint8_t		rflags;
    481  1.1  ober 		uint16_t	xrflags;
    482  1.1  ober 	}		table[IWN_MAX_TX_RETRIES];
    483  1.1  ober 	uint32_t	reserved3;
    484  1.1  ober } __packed;
    485  1.1  ober 
    486  1.1  ober /* structure for command IWN_CMD_SET_LED */
    487  1.1  ober struct iwn_cmd_led {
    488  1.1  ober 	uint32_t	unit;	/* multiplier (in usecs) */
    489  1.1  ober 	uint8_t		which;
    490  1.1  ober #define IWN_LED_ACTIVITY	1
    491  1.1  ober #define IWN_LED_LINK		2
    492  1.1  ober 
    493  1.1  ober 	uint8_t		off;
    494  1.1  ober 	uint8_t		on;
    495  1.1  ober 	uint8_t		reserved;
    496  1.1  ober } __packed;
    497  1.1  ober 
    498  1.1  ober /* structure for command IWN_CMD_SET_POWER_MODE */
    499  1.1  ober struct iwn_power {
    500  1.1  ober 	uint16_t	flags;
    501  1.1  ober #define IWN_POWER_CAM	0	/* constantly awake mode */
    502  1.1  ober 
    503  1.1  ober 	uint8_t		alive;
    504  1.1  ober 	uint8_t		debug;
    505  1.1  ober 	uint32_t	rx_timeout;
    506  1.1  ober 	uint32_t	tx_timeout;
    507  1.1  ober 	uint32_t	sleep[5];
    508  1.1  ober 	uint32_t	beacons;
    509  1.1  ober } __packed;
    510  1.1  ober 
    511  1.1  ober /* structures for command IWN_CMD_SCAN */
    512  1.1  ober struct iwn_scan_essid {
    513  1.1  ober 	uint8_t	id;
    514  1.1  ober 	uint8_t	len;
    515  1.1  ober 	uint8_t	data[IEEE80211_NWID_LEN];
    516  1.1  ober } __packed;
    517  1.1  ober 
    518  1.1  ober struct iwn_scan_hdr {
    519  1.1  ober 	uint16_t	len;
    520  1.1  ober 	uint8_t		reserved1;
    521  1.1  ober 	uint8_t		nchan;
    522  1.1  ober 	uint16_t	quiet;
    523  1.1  ober 	uint16_t	plcp_threshold;
    524  1.1  ober 	uint16_t	crc_threshold;
    525  1.1  ober 	uint16_t	rxchain;
    526  1.1  ober 	uint32_t	max_svc;	/* background scans */
    527  1.1  ober 	uint32_t	pause_svc;	/* background scans */
    528  1.1  ober 	uint32_t	flags;
    529  1.1  ober 	uint32_t	filter;
    530  1.1  ober 
    531  1.1  ober 	/* followed by a struct iwn_cmd_data */
    532  1.1  ober 	/* followed by an array of 4x struct iwn_scan_essid */
    533  1.1  ober 	/* followed by probe request body */
    534  1.1  ober 	/* followed by nchan x struct iwn_scan_chan */
    535  1.1  ober } __packed;
    536  1.1  ober 
    537  1.1  ober struct iwn_scan_chan {
    538  1.1  ober 	uint8_t		flags;
    539  1.1  ober #define IWN_CHAN_ACTIVE	(1 << 0)
    540  1.1  ober #define IWN_CHAN_DIRECT	(1 << 1)
    541  1.1  ober 
    542  1.1  ober 	uint8_t		chan;
    543  1.1  ober 	uint8_t		rf_gain;
    544  1.1  ober 	uint8_t		dsp_gain;
    545  1.1  ober 	uint16_t	active;		/* msecs */
    546  1.1  ober 	uint16_t	passive;	/* msecs */
    547  1.1  ober } __packed;
    548  1.1  ober 
    549  1.1  ober /* structure for command IWN_CMD_TXPOWER */
    550  1.1  ober #define IWN_RIDX_MAX	32
    551  1.1  ober struct iwn_cmd_txpower {
    552  1.1  ober 	uint8_t	band;
    553  1.1  ober 	uint8_t	reserved1;
    554  1.1  ober 	uint8_t	chan;
    555  1.1  ober 	uint8_t	reserved2;
    556  1.1  ober 	struct {
    557  1.1  ober 		uint8_t	rf_gain[IWN_NTXCHAINS];
    558  1.1  ober 		uint8_t	dsp_gain[IWN_NTXCHAINS];
    559  1.1  ober 	}	power[IWN_RIDX_MAX + 1];
    560  1.1  ober } __packed;
    561  1.1  ober 
    562  1.1  ober /* structure for command IWN_CMD_BLUETOOTH */
    563  1.1  ober struct iwn_bluetooth {
    564  1.1  ober 	uint8_t		flags;
    565  1.1  ober 	uint8_t		lead;
    566  1.1  ober 	uint8_t		kill;
    567  1.1  ober 	uint8_t		reserved;
    568  1.1  ober 	uint32_t	ack;
    569  1.1  ober 	uint32_t	cts;
    570  1.1  ober } __packed;
    571  1.1  ober 
    572  1.1  ober /* structure for command IWN_CMD_SET_CRITICAL_TEMP */
    573  1.1  ober struct iwn_critical_temp {
    574  1.1  ober 	uint32_t	reserved;
    575  1.1  ober 	uint32_t	tempM;
    576  1.1  ober 	uint32_t	tempR;
    577  1.1  ober /* degK <-> degC conversion macros */
    578  1.1  ober #define IWN_CTOK(c)	((c) + 273)
    579  1.1  ober #define IWN_KTOC(k)	((k) - 273)
    580  1.1  ober #define IWN_CTOMUK(c)	(((c) * 1000000) + 273150000)
    581  1.1  ober } __packed;
    582  1.1  ober 
    583  1.1  ober /* structure for command IWN_SENSITIVITY */
    584  1.1  ober struct iwn_sensitivity_cmd {
    585  1.1  ober 	uint16_t	which;
    586  1.1  ober #define IWN_SENSITIVITY_DEFAULTTBL	0
    587  1.1  ober #define IWN_SENSITIVITY_WORKTBL		1
    588  1.1  ober 
    589  1.1  ober 	uint16_t	energy_cck;
    590  1.1  ober 	uint16_t	energy_ofdm;
    591  1.1  ober 	uint16_t	corr_ofdm_x1;
    592  1.1  ober 	uint16_t	corr_ofdm_mrc_x1;
    593  1.1  ober 	uint16_t	corr_cck_mrc_x4;
    594  1.1  ober 	uint16_t	corr_ofdm_x4;
    595  1.1  ober 	uint16_t	corr_ofdm_mrc_x4;
    596  1.1  ober 	uint16_t	corr_barker;
    597  1.1  ober 	uint16_t	corr_barker_mrc;
    598  1.1  ober 	uint16_t	corr_cck_x4;
    599  1.1  ober 	uint16_t	energy_ofdm_th;
    600  1.1  ober } __packed;
    601  1.1  ober 
    602  1.1  ober /* structure for command IWN_PHY_CALIB */
    603  1.1  ober struct iwn_phy_calib_cmd {
    604  1.1  ober 	uint8_t		code;
    605  1.1  ober #define IWN_SET_DIFF_GAIN	7
    606  1.1  ober 
    607  1.1  ober 	uint8_t		flags;
    608  1.1  ober 	uint16_t	reserved1;
    609  1.1  ober 	int8_t		gain[3];
    610  1.1  ober #define IWN_GAIN_SET	(1 << 2)
    611  1.1  ober 
    612  1.1  ober 	uint8_t		reserved2;
    613  1.1  ober } __packed;
    614  1.1  ober 
    615  1.1  ober 
    616  1.1  ober /* structure for IWN_UC_READY notification */
    617  1.1  ober #define IWN_NATTEN_GROUPS	5
    618  1.1  ober struct iwn_ucode_info {
    619  1.1  ober 	uint8_t		minor;
    620  1.1  ober 	uint8_t		major;
    621  1.1  ober 	uint16_t	reserved1;
    622  1.1  ober 	uint8_t		revision[8];
    623  1.1  ober 	uint8_t		type;
    624  1.1  ober 	uint8_t		subtype;
    625  1.1  ober #define IWN_UCODE_RUNTIME	0
    626  1.1  ober #define IWN_UCODE_INIT		9
    627  1.1  ober 
    628  1.1  ober 	uint16_t	reserved2;
    629  1.1  ober 	uint32_t	logptr;
    630  1.1  ober 	uint32_t	errorptr;
    631  1.1  ober 	uint32_t	tstamp;
    632  1.1  ober 	uint32_t	valid;
    633  1.1  ober 
    634  1.1  ober 	/* the following fields are for UCODE_INIT only */
    635  1.1  ober 	int32_t		volt;
    636  1.1  ober 	struct {
    637  1.1  ober 		int32_t	chan20MHz;
    638  1.1  ober 		int32_t	chan40MHz;
    639  1.1  ober 	} __packed	temp[4];
    640  1.1  ober 	int32_t		atten[IWN_NATTEN_GROUPS][IWN_NTXCHAINS];
    641  1.1  ober } __packed;
    642  1.1  ober 
    643  1.1  ober /* structure for IWN_TX_DONE notification */
    644  1.1  ober struct iwn_tx_stat {
    645  1.1  ober 	uint8_t		nframes;
    646  1.1  ober 	uint8_t		nkill;
    647  1.1  ober 	uint8_t		nrts;
    648  1.1  ober 	uint8_t		ntries;
    649  1.1  ober 	uint8_t		rate;
    650  1.1  ober 	uint8_t		rflags;
    651  1.1  ober 	uint16_t	xrflags;
    652  1.1  ober 	uint16_t	duration;
    653  1.1  ober 	uint16_t	reserved;
    654  1.1  ober 	uint32_t	power[2];
    655  1.1  ober 	uint32_t	status;
    656  1.1  ober } __packed;
    657  1.1  ober 
    658  1.1  ober /* structure for IWN_BEACON_MISSED notification */
    659  1.1  ober struct iwn_beacon_missed {
    660  1.1  ober 	uint32_t	consecutive;
    661  1.1  ober 	uint32_t	total;
    662  1.1  ober 	uint32_t	expected;
    663  1.1  ober 	uint32_t	received;
    664  1.1  ober } __packed;
    665  1.1  ober 
    666  1.1  ober /* structure for IWN_AMPDU_RX_DONE notification */
    667  1.1  ober struct iwn_rx_ampdu {
    668  1.1  ober 	uint16_t	len;
    669  1.1  ober 	uint16_t	reserved;
    670  1.1  ober } __packed;
    671  1.1  ober 
    672  1.1  ober /* structure for IWN_RX_DONE and IWN_AMPDU_RX_START notifications */
    673  1.1  ober struct iwn_rx_stat {
    674  1.1  ober 	uint8_t		phy_len;
    675  1.1  ober 	uint8_t		cfg_phy_len;
    676  1.1  ober #define IWN_STAT_MAXLEN	20
    677  1.1  ober 
    678  1.1  ober 	uint8_t		id;
    679  1.1  ober 	uint8_t		reserved1;
    680  1.1  ober 	uint64_t	tstamp;
    681  1.1  ober 	uint32_t	beacon;
    682  1.1  ober 	uint16_t	flags;
    683  1.1  ober 	uint16_t	chan;
    684  1.1  ober 	uint16_t	antenna;
    685  1.1  ober 	uint16_t	agc;
    686  1.1  ober 	uint8_t		rssi[6];
    687  1.1  ober #define IWN_RSSI_TO_DBM	44
    688  1.1  ober 
    689  1.1  ober 	uint8_t		reserved2[22];
    690  1.1  ober 	uint8_t		rate;
    691  1.1  ober 	uint8_t		rflags;
    692  1.1  ober 	uint16_t	xrflags;
    693  1.1  ober 	uint16_t	len;
    694  1.1  ober 	uint16_t	reserve3;
    695  1.1  ober } __packed;
    696  1.1  ober 
    697  1.1  ober /* structure for IWN_START_SCAN notification */
    698  1.1  ober struct iwn_start_scan {
    699  1.1  ober 	uint64_t	tstamp;
    700  1.1  ober 	uint32_t	tbeacon;
    701  1.1  ober 	uint8_t		chan;
    702  1.1  ober 	uint8_t		band;
    703  1.1  ober 	uint16_t	reserved;
    704  1.1  ober 	uint32_t	status;
    705  1.1  ober } __packed;
    706  1.1  ober 
    707  1.1  ober /* structure for IWN_STOP_SCAN notification */
    708  1.1  ober struct iwn_stop_scan {
    709  1.1  ober 	uint8_t		nchan;
    710  1.1  ober 	uint8_t		status;
    711  1.1  ober 	uint8_t		reserved;
    712  1.1  ober 	uint8_t		chan;
    713  1.1  ober 	uint64_t	tsf;
    714  1.1  ober } __packed;
    715  1.1  ober 
    716  1.1  ober /* structure for IWN_{RX,BEACON}_STATISTICS notification */
    717  1.1  ober struct iwn_rx_phy_stats {
    718  1.1  ober 	uint32_t	ina;
    719  1.1  ober 	uint32_t	fina;
    720  1.1  ober 	uint32_t	bad_plcp;
    721  1.1  ober 	uint32_t	bad_crc32;
    722  1.1  ober 	uint32_t	overrun;
    723  1.1  ober 	uint32_t	eoverrun;
    724  1.1  ober 	uint32_t	good_crc32;
    725  1.1  ober 	uint32_t	fa;
    726  1.1  ober 	uint32_t	bad_fina_sync;
    727  1.1  ober 	uint32_t	sfd_timeout;
    728  1.1  ober 	uint32_t	fina_timeout;
    729  1.1  ober 	uint32_t	no_rts_ack;
    730  1.1  ober 	uint32_t	rxe_limit;
    731  1.1  ober 	uint32_t	ack;
    732  1.1  ober 	uint32_t	cts;
    733  1.1  ober 	uint32_t	ba_resp;
    734  1.1  ober 	uint32_t	dsp_kill;
    735  1.1  ober 	uint32_t	bad_mh;
    736  1.1  ober 	uint32_t	rssi_sum;
    737  1.1  ober 	uint32_t	reserved;
    738  1.1  ober } __packed;
    739  1.1  ober 
    740  1.1  ober struct iwn_rx_general_stats {
    741  1.1  ober 	uint32_t	bad_cts;
    742  1.1  ober 	uint32_t	bad_ack;
    743  1.1  ober 	uint32_t	not_bss;
    744  1.1  ober 	uint32_t	filtered;
    745  1.1  ober 	uint32_t	bad_chan;
    746  1.1  ober 	uint32_t	beacons;
    747  1.1  ober 	uint32_t	missed_beacons;
    748  1.1  ober 	uint32_t	adc_saturated;	/* time in 0.8us */
    749  1.1  ober 	uint32_t	ina_searched;	/* time in 0.8us */
    750  1.1  ober 	uint32_t	noise[3];
    751  1.1  ober 	uint32_t	flags;
    752  1.1  ober 	uint32_t	load;
    753  1.1  ober 	uint32_t	fa;
    754  1.1  ober 	uint32_t	rssi[3];
    755  1.1  ober 	uint32_t	energy[3];
    756  1.1  ober } __packed;
    757  1.1  ober 
    758  1.1  ober struct iwn_rx_ht_phy_stats {
    759  1.1  ober 	uint32_t	bad_plcp;
    760  1.1  ober 	uint32_t	overrun;
    761  1.1  ober 	uint32_t	eoverrun;
    762  1.1  ober 	uint32_t	good_crc32;
    763  1.1  ober 	uint32_t	bad_crc32;
    764  1.1  ober 	uint32_t	bad_mh;
    765  1.1  ober 	uint32_t	good_ampdu_crc32;
    766  1.1  ober 	uint32_t	ampdu;
    767  1.1  ober 	uint32_t	fragment;
    768  1.1  ober 	uint32_t	reserved;
    769  1.1  ober } __packed;
    770  1.1  ober 
    771  1.1  ober struct iwn_rx_stats {
    772  1.1  ober 	struct iwn_rx_phy_stats		ofdm;
    773  1.1  ober 	struct iwn_rx_phy_stats		cck;
    774  1.1  ober 	struct iwn_rx_general_stats	general;
    775  1.1  ober 	struct iwn_rx_ht_phy_stats	ht;
    776  1.1  ober } __packed;
    777  1.1  ober 
    778  1.1  ober struct iwn_tx_stats {
    779  1.1  ober 	uint32_t	preamble;
    780  1.1  ober 	uint32_t	rx_detected;
    781  1.1  ober 	uint32_t	bt_defer;
    782  1.1  ober 	uint32_t	bt_kill;
    783  1.1  ober 	uint32_t	short_len;
    784  1.1  ober 	uint32_t	cts_timeout;
    785  1.1  ober 	uint32_t	ack_timeout;
    786  1.1  ober 	uint32_t	exp_ack;
    787  1.1  ober 	uint32_t	ack;
    788  1.1  ober 	uint32_t	msdu;
    789  1.1  ober 	uint32_t	busrt_err1;
    790  1.1  ober 	uint32_t	burst_err2;
    791  1.1  ober 	uint32_t	cts_collision;
    792  1.1  ober 	uint32_t	ack_collision;
    793  1.1  ober 	uint32_t	ba_timeout;
    794  1.1  ober 	uint32_t	ba_resched;
    795  1.1  ober 	uint32_t	query_ampdu;
    796  1.1  ober 	uint32_t	query;
    797  1.1  ober 	uint32_t	query_ampdu_frag;
    798  1.1  ober 	uint32_t	query_mismatch;
    799  1.1  ober 	uint32_t	not_ready;
    800  1.1  ober 	uint32_t	underrun;
    801  1.1  ober 	uint32_t	bt_ht_kill;
    802  1.1  ober 	uint32_t	rx_ba_resp;
    803  1.1  ober 	uint32_t	reserved[2];
    804  1.1  ober } __packed;
    805  1.1  ober 
    806  1.1  ober struct iwn_general_stats {
    807  1.1  ober 	uint32_t	temp;
    808  1.1  ober 	uint32_t	temp_m;
    809  1.1  ober 	uint32_t	burst_check;
    810  1.1  ober 	uint32_t	burst;
    811  1.1  ober 	uint32_t	reserved1[4];
    812  1.1  ober 	uint32_t	sleep;
    813  1.1  ober 	uint32_t	slot_out;
    814  1.1  ober 	uint32_t	slot_idle;
    815  1.1  ober 	uint32_t	ttl_tstamp;
    816  1.1  ober 	uint32_t	tx_ant_a;
    817  1.1  ober 	uint32_t	tx_ant_b;
    818  1.1  ober 	uint32_t	exec;
    819  1.1  ober 	uint32_t	probe;
    820  1.1  ober 	uint32_t	reserved2[2];
    821  1.1  ober 	uint32_t	rx_enabled;
    822  1.1  ober 	uint32_t	reserved3[3];
    823  1.1  ober } __packed;
    824  1.1  ober 
    825  1.1  ober struct iwn_stats {
    826  1.1  ober 	uint32_t			flags;
    827  1.1  ober 	struct iwn_rx_stats		rx;
    828  1.1  ober 	struct iwn_tx_stats		tx;
    829  1.1  ober 	struct iwn_general_stats	general;
    830  1.1  ober } __packed;
    831  1.1  ober 
    832  1.1  ober 
    833  1.1  ober /* firmware image header */
    834  1.1  ober struct iwn_firmware_hdr {
    835  1.1  ober 	uint32_t	version;
    836  1.1  ober 	uint32_t	main_textsz;
    837  1.1  ober 	uint32_t	main_datasz;
    838  1.1  ober 	uint32_t	init_textsz;
    839  1.1  ober 	uint32_t	init_datasz;
    840  1.1  ober 	uint32_t	boot_textsz;
    841  1.1  ober } __packed;
    842  1.1  ober 
    843  1.1  ober #define IWN_FW_MAIN_TEXT_MAXSZ	(96 * 1024)
    844  1.1  ober #define IWN_FW_MAIN_DATA_MAXSZ	(40 * 1024)
    845  1.1  ober #define IWN_FW_INIT_TEXT_MAXSZ	(96 * 1024)
    846  1.1  ober #define IWN_FW_INIT_DATA_MAXSZ	(40 * 1024)
    847  1.1  ober #define IWN_FW_BOOT_TEXT_MAXSZ	1024
    848  1.1  ober 
    849  1.1  ober 
    850  1.1  ober /*
    851  1.1  ober  * Offsets into EEPROM.
    852  1.1  ober  */
    853  1.1  ober #define IWN_EEPROM_MAC		0x015
    854  1.1  ober #define IWN_EEPROM_DOMAIN	0x060
    855  1.1  ober #define IWN_EEPROM_BAND1	0x063
    856  1.1  ober #define IWN_EEPROM_BAND2	0x072
    857  1.1  ober #define IWN_EEPROM_BAND3	0x080
    858  1.1  ober #define IWN_EEPROM_BAND4	0x08d
    859  1.1  ober #define IWN_EEPROM_BAND5	0x099
    860  1.1  ober #define IWN_EEPROM_BAND6	0x0a0
    861  1.1  ober #define IWN_EEPROM_BAND7	0x0a8
    862  1.1  ober #define IWN_EEPROM_MAXPOW	0x0e8
    863  1.1  ober #define IWN_EEPROM_VOLTAGE	0x0e9
    864  1.1  ober #define IWN_EEPROM_BANDS	0x0ea
    865  1.1  ober 
    866  1.1  ober struct iwn_eeprom_chan {
    867  1.1  ober 	uint8_t	flags;
    868  1.1  ober #define IWN_EEPROM_CHAN_VALID	(1 << 0)
    869  1.1  ober #define IWN_EEPROM_CHAN_IBSS	(1 << 1)
    870  1.1  ober #define IWN_EEPROM_CHAN_ACTIVE	(1 << 3)
    871  1.1  ober #define IWN_EEPROM_CHAN_RADAR	(1 << 4)
    872  1.1  ober 
    873  1.1  ober 	int8_t	maxpwr;
    874  1.1  ober } __packed;
    875  1.1  ober 
    876  1.1  ober #define IWN_NSAMPLES	3
    877  1.1  ober struct iwn_eeprom_chan_samples {
    878  1.1  ober 	uint8_t	num;
    879  1.1  ober 	struct {
    880  1.1  ober 		uint8_t temp;
    881  1.1  ober 		uint8_t	gain;
    882  1.1  ober 		uint8_t	power;
    883  1.1  ober 		int8_t	pa_det;
    884  1.1  ober 	}	samples[IWN_NTXCHAINS][IWN_NSAMPLES];
    885  1.1  ober } __packed;
    886  1.1  ober 
    887  1.1  ober #define IWN_NBANDS	8
    888  1.1  ober struct iwn_eeprom_band {
    889  1.1  ober 	uint8_t	lo;	/* low channel number */
    890  1.1  ober 	uint8_t	hi;	/* high channel number */
    891  1.1  ober 	struct	iwn_eeprom_chan_samples chans[2];
    892  1.1  ober } __packed;
    893  1.1  ober 
    894  1.1  ober #define IWN_CHAN_BANDS_COUNT	 7
    895  1.1  ober #define IWN_MAX_CHAN_PER_BAND	14
    896  1.1  ober static const struct iwn_chan_band {
    897  1.1  ober 	uint32_t	addr;	/* offset in EEPROM */
    898  1.1  ober 	uint8_t		nchan;
    899  1.1  ober 	uint8_t		chan[IWN_MAX_CHAN_PER_BAND];
    900  1.1  ober } iwn_bands[] = {
    901  1.1  ober 	{ IWN_EEPROM_BAND1, 14,
    902  1.1  ober 	    { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 } },
    903  1.1  ober 	{ IWN_EEPROM_BAND2, 13,
    904  1.1  ober 	    { 183, 184, 185, 187, 188, 189, 192, 196, 7, 8, 11, 12, 16 } },
    905  1.1  ober 	{ IWN_EEPROM_BAND3, 12,
    906  1.1  ober 	    { 34, 36, 38, 40, 42, 44, 46, 48, 52, 56, 60, 64 } },
    907  1.1  ober 	{ IWN_EEPROM_BAND4, 11,
    908  1.1  ober 	    { 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140 } },
    909  1.1  ober 	{ IWN_EEPROM_BAND5, 6,
    910  1.1  ober 	    { 145, 149, 153, 157, 161, 165 } },
    911  1.1  ober 	{ IWN_EEPROM_BAND6, 7,
    912  1.1  ober 	    { 1, 2, 3, 4, 5, 6, 7 } },
    913  1.1  ober 	{ IWN_EEPROM_BAND7, 11,
    914  1.1  ober 	    { 36, 44, 52, 60, 100, 108, 116, 124, 132, 149, 157 } }
    915  1.1  ober };
    916  1.1  ober 
    917  1.1  ober static const uint8_t iwn_ridx_to_plcp[] = {
    918  1.1  ober 	10, 20, 55, 110, /* CCK */
    919  1.1  ober 	0xd, 0xf, 0x5, 0x7, 0x9, 0xb, 0x1, 0x3, 0x3 /* OFDM R1-R4 */
    920  1.1  ober };
    921  1.1  ober 
    922  1.1  ober /* allow fallback from CCK11 to OFDM9 and from OFDM6 to CCK5 */
    923  1.1  ober static const uint8_t iwn_prev_ridx[] = {
    924  1.1  ober 	0, 0, 1, 5, /* CCK */
    925  1.1  ober 	2, 4, 3, 6, 7, 8, 9, 10, 10 /* OFDM */
    926  1.1  ober };
    927  1.1  ober 
    928  1.1  ober #define IWN_MAX_PWR_INDEX	107
    929  1.1  ober 
    930  1.1  ober /*
    931  1.1  ober  * RF Tx gain values from highest to lowest power (values obtained from
    932  1.1  ober  * the reference driver.)
    933  1.1  ober  */
    934  1.1  ober static const uint8_t iwn_rf_gain_2ghz[IWN_MAX_PWR_INDEX + 1] = {
    935  1.1  ober 	0x3f, 0x3f, 0x3f, 0x3e, 0x3e, 0x3e, 0x3d, 0x3d, 0x3d, 0x3c, 0x3c,
    936  1.1  ober 	0x3c, 0x3b, 0x3b, 0x3b, 0x3a, 0x3a, 0x3a, 0x39, 0x39, 0x39, 0x38,
    937  1.1  ober 	0x38, 0x38, 0x37, 0x37, 0x37, 0x36, 0x36, 0x36, 0x35, 0x35, 0x35,
    938  1.1  ober 	0x34, 0x34, 0x34, 0x33, 0x33, 0x33, 0x32, 0x32, 0x32, 0x31, 0x31,
    939  1.1  ober 	0x31, 0x30, 0x30, 0x30, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x04,
    940  1.1  ober 	0x04, 0x04, 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01,
    941  1.1  ober 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    942  1.1  ober 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    943  1.1  ober 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    944  1.1  ober 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    945  1.1  ober };
    946  1.1  ober 
    947  1.1  ober static const uint8_t iwn_rf_gain_5ghz[IWN_MAX_PWR_INDEX + 1] = {
    948  1.1  ober 	0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3e, 0x3e, 0x3e, 0x3d, 0x3d, 0x3d,
    949  1.1  ober 	0x3c, 0x3c, 0x3c, 0x3b, 0x3b, 0x3b, 0x3a, 0x3a, 0x3a, 0x39, 0x39,
    950  1.1  ober 	0x39, 0x38, 0x38, 0x38, 0x37, 0x37, 0x37, 0x36, 0x36, 0x36, 0x35,
    951  1.1  ober 	0x35, 0x35, 0x34, 0x34, 0x34, 0x33, 0x33, 0x33, 0x32, 0x32, 0x32,
    952  1.1  ober 	0x31, 0x31, 0x31, 0x30, 0x30, 0x30, 0x25, 0x25, 0x25, 0x24, 0x24,
    953  1.1  ober 	0x24, 0x23, 0x23, 0x23, 0x22, 0x18, 0x18, 0x17, 0x17, 0x17, 0x16,
    954  1.1  ober 	0x16, 0x16, 0x15, 0x15, 0x15, 0x14, 0x14, 0x14, 0x13, 0x13, 0x13,
    955  1.1  ober 	0x12, 0x08, 0x08, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x05, 0x05,
    956  1.1  ober 	0x05, 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x01,
    957  1.1  ober 	0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    958  1.1  ober };
    959  1.1  ober 
    960  1.1  ober /*
    961  1.1  ober  * DSP pre-DAC gain values from highest to lowest power (values obtained
    962  1.1  ober  * from the reference driver.)
    963  1.1  ober  */
    964  1.1  ober static const uint8_t iwn_dsp_gain_2ghz[IWN_MAX_PWR_INDEX + 1] = {
    965  1.1  ober 	0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68,
    966  1.1  ober 	0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e,
    967  1.1  ober 	0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62,
    968  1.1  ober 	0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68,
    969  1.1  ober 	0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e,
    970  1.1  ober 	0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62,
    971  1.1  ober 	0x6e, 0x68, 0x62, 0x61, 0x60, 0x5f, 0x5e, 0x5d, 0x5c, 0x5b, 0x5a,
    972  1.1  ober 	0x59, 0x58, 0x57, 0x56, 0x55, 0x54, 0x53, 0x52, 0x51, 0x50, 0x4f,
    973  1.1  ober 	0x4e, 0x4d, 0x4c, 0x4b, 0x4a, 0x49, 0x48, 0x47, 0x46, 0x45, 0x44,
    974  1.1  ober 	0x43, 0x42, 0x41, 0x40, 0x3f, 0x3e, 0x3d, 0x3c, 0x3b
    975  1.1  ober };
    976  1.1  ober 
    977  1.1  ober static const uint8_t iwn_dsp_gain_5ghz[IWN_MAX_PWR_INDEX + 1] = {
    978  1.1  ober 	0x7b, 0x75, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62,
    979  1.1  ober 	0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68,
    980  1.1  ober 	0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e,
    981  1.1  ober 	0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62,
    982  1.1  ober 	0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68,
    983  1.1  ober 	0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e,
    984  1.1  ober 	0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62,
    985  1.1  ober 	0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68,
    986  1.1  ober 	0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e,
    987  1.1  ober 	0x68, 0x62, 0x6e, 0x68, 0x62, 0x5d, 0x58, 0x53, 0x4e
    988  1.1  ober };
    989  1.1  ober 
    990  1.1  ober #define IWN_READ(sc, reg)						\
    991  1.1  ober 	bus_space_read_4((sc)->sc_st, (sc)->sc_sh, (reg))
    992  1.1  ober 
    993  1.1  ober #define IWN_WRITE(sc, reg, val)						\
    994  1.1  ober 	bus_space_write_4((sc)->sc_st, (sc)->sc_sh, (reg), (val))
    995  1.1  ober 
    996  1.1  ober #define IWN_WRITE_REGION_4(sc, offset, datap, count)			\
    997  1.1  ober 	bus_space_write_region_4((sc)->sc_st, (sc)->sc_sh, (offset),	\
    998  1.1  ober 	    (datap), (count))
    999