Home | History | Annotate | Line # | Download | only in pci
if_wpireg.h revision 1.3
      1  1.3  degroote /*  $NetBSD: if_wpireg.h,v 1.3 2007/01/13 09:39:06 degroote Exp $    */
      2  1.1    simonb 
      3  1.1    simonb /*-
      4  1.1    simonb  * Copyright (c) 2006
      5  1.1    simonb  *	Damien Bergamini <damien.bergamini (at) free.fr>
      6  1.1    simonb  *
      7  1.1    simonb  * Permission to use, copy, modify, and distribute this software for any
      8  1.1    simonb  * purpose with or without fee is hereby granted, provided that the above
      9  1.1    simonb  * copyright notice and this permission notice appear in all copies.
     10  1.1    simonb  *
     11  1.1    simonb  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
     12  1.1    simonb  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
     13  1.1    simonb  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
     14  1.1    simonb  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     15  1.1    simonb  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
     16  1.1    simonb  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
     17  1.1    simonb  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     18  1.1    simonb  */
     19  1.1    simonb 
     20  1.1    simonb #define WPI_TX_RING_COUNT	256
     21  1.1    simonb #define WPI_SVC_RING_COUNT	256
     22  1.1    simonb #define WPI_CMD_RING_COUNT	256
     23  1.1    simonb #define WPI_RX_RING_COUNT	64
     24  1.1    simonb 
     25  1.3  degroote #define WPI_BUF_ALIGN       4096
     26  1.3  degroote 
     27  1.1    simonb /*
     28  1.1    simonb  * Rings must be aligned on a four 4K-pages boundary.
     29  1.1    simonb  * I had a hard time figuring this out.
     30  1.1    simonb  */
     31  1.1    simonb #define WPI_RING_DMA_ALIGN	0x4000
     32  1.1    simonb 
     33  1.1    simonb /* maximum scatter/gather */
     34  1.1    simonb #define WPI_MAX_SCATTER	4
     35  1.1    simonb 
     36  1.3  degroote /* maximum Rx buffer size */
     37  1.3  degroote #define WPI_RBUF_SIZE	(3 * 1024)	/* XXX 3000 but must be aligned! */
     38  1.3  degroote 
     39  1.1    simonb /*
     40  1.1    simonb  * Control and status registers.
     41  1.1    simonb  */
     42  1.1    simonb #define WPI_HWCONFIG		0x000
     43  1.1    simonb #define WPI_INTR		0x008
     44  1.1    simonb #define WPI_MASK		0x00c
     45  1.1    simonb #define WPI_INTR_STATUS		0x010
     46  1.1    simonb #define WPI_GPIO_STATUS		0x018
     47  1.1    simonb #define WPI_RESET		0x020
     48  1.1    simonb #define WPI_GPIO_CTL		0x024
     49  1.1    simonb #define WPI_EEPROM_CTL		0x02c
     50  1.1    simonb #define WPI_EEPROM_STATUS	0x030
     51  1.1    simonb #define WPI_UCODE_CLR		0x05c
     52  1.1    simonb #define WPI_TEMPERATURE		0x060
     53  1.1    simonb #define WPI_CHICKEN		0x100
     54  1.1    simonb #define WPI_PLL_CTL		0x20c
     55  1.1    simonb #define WPI_FW_TARGET		0x410
     56  1.1    simonb #define WPI_WRITE_MEM_ADDR  	0x444
     57  1.1    simonb #define WPI_READ_MEM_ADDR   	0x448
     58  1.1    simonb #define WPI_WRITE_MEM_DATA  	0x44c
     59  1.1    simonb #define WPI_READ_MEM_DATA   	0x450
     60  1.1    simonb #define WPI_TX_WIDX		0x460
     61  1.1    simonb #define WPI_TX_CTL(qid)		(0x940 + (qid) * 8)
     62  1.1    simonb #define WPI_TX_BASE(qid)	(0x944 + (qid) * 8)
     63  1.1    simonb #define WPI_TX_DESC(qid)	(0x980 + (qid) * 80)
     64  1.1    simonb #define WPI_RX_CONFIG		0xc00
     65  1.1    simonb #define WPI_RX_BASE		0xc04
     66  1.1    simonb #define WPI_RX_WIDX		0xc20
     67  1.1    simonb #define WPI_RX_RIDX_PTR		0xc24
     68  1.1    simonb #define WPI_RX_CTL		0xcc0
     69  1.1    simonb #define WPI_RX_STATUS		0xcc4
     70  1.1    simonb #define WPI_TX_CONFIG(qid)	(0xd00 + (qid) * 32)
     71  1.1    simonb #define WPI_TX_CREDIT(qid)	(0xd04 + (qid) * 32)
     72  1.1    simonb #define WPI_TX_STATE(qid)	(0xd08 + (qid) * 32)
     73  1.1    simonb #define WPI_TX_BASE_PTR		0xe80
     74  1.1    simonb #define WPI_MSG_CONFIG		0xe88
     75  1.1    simonb #define WPI_TX_STATUS		0xe90
     76  1.1    simonb 
     77  1.1    simonb 
     78  1.1    simonb /*
     79  1.1    simonb  * NIC internal memory offsets.
     80  1.1    simonb  */
     81  1.1    simonb #define WPI_MEM_MODE		0x2e00
     82  1.1    simonb #define WPI_MEM_RA		0x2e04
     83  1.1    simonb #define WPI_MEM_TXCFG		0x2e10
     84  1.1    simonb #define WPI_MEM_MAGIC4		0x2e14
     85  1.1    simonb #define WPI_MEM_MAGIC5		0x2e20
     86  1.1    simonb #define WPI_MEM_BYPASS1		0x2e2c
     87  1.1    simonb #define WPI_MEM_BYPASS2		0x2e30
     88  1.1    simonb #define WPI_MEM_CLOCK1		0x3004
     89  1.1    simonb #define WPI_MEM_CLOCK2		0x3008
     90  1.1    simonb #define WPI_MEM_POWER		0x300c
     91  1.1    simonb #define WPI_MEM_PCIDEV		0x3010
     92  1.1    simonb #define WPI_MEM_UCODE_CTL	0x3400
     93  1.1    simonb #define WPI_MEM_UCODE_SRC	0x3404
     94  1.1    simonb #define WPI_MEM_UCODE_DST	0x3408
     95  1.1    simonb #define WPI_MEM_UCODE_SIZE	0x340c
     96  1.1    simonb #define WPI_MEM_UCODE_BASE	0x3800
     97  1.1    simonb 
     98  1.1    simonb 
     99  1.1    simonb /* possible flags for register WPI_HWCONFIG */
    100  1.1    simonb #define WPI_HW_ALM_MB	(1 << 8)
    101  1.1    simonb #define WPI_HW_ALM_MM	(1 << 9)
    102  1.1    simonb #define WPI_HW_SKU_MRC	(1 << 10)
    103  1.1    simonb #define WPI_HW_REV_D	(1 << 11)
    104  1.1    simonb #define WPI_HW_TYPE_B	(1 << 12)
    105  1.1    simonb 
    106  1.1    simonb /* possible flags for registers WPI_READ_MEM_ADDR/WPI_WRITE_MEM_ADDR */
    107  1.1    simonb #define WPI_MEM_4	((sizeof (uint32_t) - 1) << 24)
    108  1.1    simonb 
    109  1.1    simonb /* possible values for WPI_FW_TARGET */
    110  1.1    simonb #define WPI_FW_TEXT	0x00000000
    111  1.1    simonb #define WPI_FW_DATA	0x00800000
    112  1.1    simonb 
    113  1.1    simonb /* possible flags for WPI_GPIO_STATUS */
    114  1.1    simonb #define WPI_POWERED		(1 << 9)
    115  1.1    simonb 
    116  1.1    simonb /* possible flags for register WPI_RESET */
    117  1.1    simonb #define WPI_NEVO_RESET		(1 << 0)
    118  1.1    simonb #define WPI_SW_RESET		(1 << 7)
    119  1.1    simonb #define WPI_MASTER_DISABLED	(1 << 8)
    120  1.1    simonb #define WPI_STOP_MASTER		(1 << 9)
    121  1.1    simonb 
    122  1.1    simonb /* possible flags for register WPI_GPIO_CTL */
    123  1.1    simonb #define WPI_GPIO_CLOCK		(1 << 0)
    124  1.1    simonb #define WPI_GPIO_INIT		(1 << 2)
    125  1.1    simonb #define WPI_GPIO_MAC		(1 << 3)
    126  1.1    simonb #define WPI_GPIO_SLEEP		(1 << 4)
    127  1.1    simonb #define WPI_GPIO_PWR_STATUS	0x07000000
    128  1.1    simonb #define WPI_GPIO_PWR_SLEEP	(4 << 24)
    129  1.1    simonb 
    130  1.1    simonb /* possible flags for register WPI_CHICKEN */
    131  1.1    simonb #define WPI_CHICKEN_RXNOLOS	(1 << 23)
    132  1.1    simonb 
    133  1.1    simonb /* possible flags for register WPI_PLL_CTL */
    134  1.1    simonb #define WPI_PLL_INIT		(1 << 24)
    135  1.1    simonb 
    136  1.1    simonb /* possible flags for register WPI_UCODE_CLR */
    137  1.1    simonb #define WPI_RADIO_OFF		(1 << 1)
    138  1.1    simonb #define WPI_DISABLE_CMD		(1 << 2)
    139  1.1    simonb 
    140  1.1    simonb /* possible flags for WPI_RX_STATUS */
    141  1.1    simonb #define	WPI_RX_IDLE	(1 << 24)
    142  1.1    simonb 
    143  1.1    simonb /* possible flags for register WPI_UC_CTL */
    144  1.1    simonb #define WPI_UC_RUN	(1 << 30)
    145  1.1    simonb 
    146  1.1    simonb /* possible flags for register WPI_INTR_CSR */
    147  1.1    simonb #define WPI_ALIVE_INTR	(1 << 0)
    148  1.1    simonb #define WPI_WAKEUP_INTR	(1 << 1)
    149  1.1    simonb #define WPI_SW_ERROR	(1 << 25)
    150  1.1    simonb #define WPI_TX_INTR	(1 << 27)
    151  1.1    simonb #define WPI_HW_ERROR	(1 << 29)
    152  1.1    simonb #define WPI_RX_INTR	(1 << 31)
    153  1.1    simonb 
    154  1.1    simonb #define WPI_INTR_MASK							\
    155  1.1    simonb 	(WPI_SW_ERROR | WPI_HW_ERROR | WPI_TX_INTR | WPI_RX_INTR |	\
    156  1.1    simonb 	 WPI_ALIVE_INTR | WPI_WAKEUP_INTR)
    157  1.1    simonb 
    158  1.1    simonb /* possible flags for register WPI_TX_STATUS */
    159  1.1    simonb #define WPI_TX_IDLE(qid)	(1 << ((qid) + 24) | 1 << ((qid) + 16))
    160  1.1    simonb 
    161  1.1    simonb /* possible flags for register WPI_EEPROM_CTL */
    162  1.1    simonb #define WPI_EEPROM_READY	(1 << 0)
    163  1.1    simonb 
    164  1.1    simonb /* possible flags for register WPI_EEPROM_STATUS */
    165  1.1    simonb #define WPI_EEPROM_VERSION	0x00000007
    166  1.1    simonb #define WPI_EEPROM_LOCKED	0x00000180
    167  1.1    simonb 
    168  1.1    simonb 
    169  1.1    simonb struct wpi_shared {
    170  1.1    simonb 	uint32_t	txbase[8];
    171  1.1    simonb 	uint32_t	next;
    172  1.1    simonb 	uint32_t	reserved[2];
    173  1.1    simonb } __attribute__((__packed__));
    174  1.1    simonb 
    175  1.1    simonb #define WPI_MAX_SEG_LEN	65520
    176  1.1    simonb struct wpi_tx_desc {
    177  1.1    simonb 	uint32_t	flags;
    178  1.1    simonb #define WPI_PAD32(x)	((((x) + 3) & ~3) - (x))
    179  1.1    simonb 
    180  1.1    simonb 	struct {
    181  1.1    simonb 		uint32_t	addr;
    182  1.1    simonb 		uint32_t	len;
    183  1.1    simonb 	} __attribute__((__packed__))	segs[WPI_MAX_SCATTER];
    184  1.1    simonb 	uint8_t		reserved[28];
    185  1.1    simonb } __attribute__((__packed__));
    186  1.1    simonb 
    187  1.1    simonb struct wpi_tx_stat {
    188  1.1    simonb 	uint8_t		nrts;
    189  1.1    simonb 	uint8_t		ntries;
    190  1.1    simonb 	uint8_t		nkill;
    191  1.1    simonb 	uint8_t		rate;
    192  1.1    simonb 	uint32_t	duration;
    193  1.1    simonb 	uint32_t	status;
    194  1.1    simonb } __attribute__((__packed__));
    195  1.1    simonb 
    196  1.1    simonb struct wpi_rx_desc {
    197  1.1    simonb 	uint32_t	len;
    198  1.1    simonb 	uint8_t		type;
    199  1.1    simonb #define WPI_UC_READY		  1
    200  1.1    simonb #define WPI_RX_DONE		 27
    201  1.1    simonb #define WPI_TX_DONE		 28
    202  1.1    simonb #define WPI_START_SCAN		130
    203  1.1    simonb #define WPI_STOP_SCAN		132
    204  1.1    simonb #define WPI_STATE_CHANGED	161
    205  1.1    simonb 
    206  1.1    simonb 	uint8_t		flags;
    207  1.1    simonb 	uint8_t		idx;
    208  1.1    simonb 	uint8_t		qid;
    209  1.1    simonb } __attribute__((__packed__));
    210  1.1    simonb 
    211  1.1    simonb struct wpi_rx_stat {
    212  1.1    simonb 	uint8_t		len;
    213  1.1    simonb #define WPI_STAT_MAXLEN	20
    214  1.1    simonb 
    215  1.1    simonb 	uint8_t		id;
    216  1.1    simonb 	uint8_t		rssi;	/* received signal strength */
    217  1.1    simonb #define WPI_RSSI_OFFSET	95
    218  1.1    simonb 
    219  1.1    simonb 	uint8_t		agc;	/* access gain control */
    220  1.1    simonb 	uint16_t	signal;
    221  1.1    simonb 	uint16_t	noise;
    222  1.1    simonb } __attribute__((__packed__));
    223  1.1    simonb 
    224  1.1    simonb struct wpi_rx_head {
    225  1.1    simonb 	uint16_t	chan;
    226  1.1    simonb 	uint16_t	flags;
    227  1.1    simonb 	uint8_t		reserved;
    228  1.1    simonb 	uint8_t		rate;
    229  1.1    simonb 	uint16_t	len;
    230  1.1    simonb } __attribute__((__packed__));
    231  1.1    simonb 
    232  1.1    simonb struct wpi_rx_tail {
    233  1.1    simonb 	uint32_t	flags;
    234  1.1    simonb #define WPI_RX_NO_CRC_ERR	(1 << 0)
    235  1.1    simonb #define WPI_RX_NO_OVFL_ERR	(1 << 1)
    236  1.1    simonb /* shortcut for the above */
    237  1.1    simonb #define WPI_RX_NOERROR		(WPI_RX_NO_CRC_ERR | WPI_RX_NO_OVFL_ERR)
    238  1.1    simonb 
    239  1.1    simonb 	uint64_t	tstamp;
    240  1.1    simonb 	uint32_t	tbeacon;
    241  1.1    simonb } __attribute__((__packed__));
    242  1.1    simonb 
    243  1.1    simonb struct wpi_tx_cmd {
    244  1.1    simonb 	uint8_t	code;
    245  1.1    simonb #define WPI_CMD_CONFIGURE	 16
    246  1.1    simonb #define WPI_CMD_ASSOCIATE	 17
    247  1.1    simonb #define WPI_CMD_SET_WME          19
    248  1.1    simonb #define WPI_CMD_TSF		 20
    249  1.1    simonb #define WPI_CMD_ADD_NODE	 24
    250  1.1    simonb #define WPI_CMD_TX_DATA		 28
    251  1.1    simonb #define WPI_CMD_MRR_SETUP	 71
    252  1.1    simonb #define WPI_CMD_SET_LED		 72
    253  1.1    simonb #define WPI_CMD_SET_POWER_MODE	119
    254  1.1    simonb #define WPI_CMD_SCAN		128
    255  1.1    simonb #define WPI_CMD_SET_BEACON	145
    256  1.1    simonb #define WPI_CMD_BLUETOOTH	155
    257  1.1    simonb #define WPI_CMD_TXPOWER		176
    258  1.1    simonb 
    259  1.1    simonb 	uint8_t	flags;
    260  1.1    simonb 	uint8_t	idx;
    261  1.1    simonb 	uint8_t	qid;
    262  1.1    simonb 	uint8_t	data[124];
    263  1.1    simonb } __attribute__((__packed__));
    264  1.1    simonb 
    265  1.1    simonb /* structure for WPI_CMD_CONFIGURE */
    266  1.1    simonb struct wpi_config {
    267  1.1    simonb 	uint8_t		myaddr[IEEE80211_ADDR_LEN];
    268  1.1    simonb 	uint16_t	reserved1;
    269  1.1    simonb 	uint8_t		bssid[IEEE80211_ADDR_LEN];
    270  1.1    simonb 	uint16_t	reserved2;
    271  1.1    simonb 	uint32_t	reserved3[2];
    272  1.1    simonb 	uint8_t		mode;
    273  1.1    simonb #define WPI_MODE_HOSTAP		1
    274  1.1    simonb #define WPI_MODE_STA		3
    275  1.1    simonb #define WPI_MODE_IBSS		4
    276  1.1    simonb #define WPI_MODE_MONITOR	6
    277  1.1    simonb 
    278  1.1    simonb 	uint8_t		reserved4[3];
    279  1.1    simonb 	uint8_t		ofdm_mask;
    280  1.1    simonb 	uint8_t		cck_mask;
    281  1.1    simonb 	uint16_t	state;
    282  1.1    simonb #define WPI_STATE_ASSOCIATED	4
    283  1.1    simonb 
    284  1.1    simonb 	uint32_t	flags;
    285  1.1    simonb #define WPI_CONFIG_24GHZ	(1 << 0)
    286  1.1    simonb #define WPI_CONFIG_CCK		(1 << 1)
    287  1.1    simonb #define WPI_CONFIG_AUTO		(1 << 2)
    288  1.1    simonb #define WPI_CONFIG_SHSLOT	(1 << 4)
    289  1.1    simonb #define WPI_CONFIG_SHPREAMBLE	(1 << 5)
    290  1.1    simonb #define WPI_CONFIG_NODIVERSITY	(1 << 7)
    291  1.1    simonb #define WPI_CONFIG_ANTENNA_A	(1 << 8)
    292  1.1    simonb #define WPI_CONFIG_ANTENNA_B	(1 << 9)
    293  1.1    simonb #define WPI_CONFIG_TSF		(1 << 15)
    294  1.1    simonb 
    295  1.1    simonb 	uint32_t	filter;
    296  1.1    simonb #define WPI_FILTER_PROMISC	(1 << 0)
    297  1.1    simonb #define WPI_FILTER_CTL		(1 << 1)
    298  1.1    simonb #define WPI_FILTER_MULTICAST	(1 << 2)
    299  1.1    simonb #define WPI_FILTER_NODECRYPT	(1 << 3)
    300  1.1    simonb #define WPI_FILTER_BSS		(1 << 5)
    301  1.1    simonb #define WPI_FILTER_BEACON	(1 << 6)
    302  1.1    simonb 
    303  1.1    simonb 	uint8_t		chan;
    304  1.1    simonb 	uint8_t		reserved6[3];
    305  1.1    simonb } __attribute__((__packed__));
    306  1.1    simonb 
    307  1.1    simonb /* structure for command WPI_CMD_ASSOCIATE */
    308  1.1    simonb struct wpi_assoc {
    309  1.1    simonb 	uint32_t	flags;
    310  1.1    simonb 	uint32_t	filter;
    311  1.1    simonb 	uint8_t		ofdm_mask;
    312  1.1    simonb 	uint8_t		cck_mask;
    313  1.1    simonb 	uint16_t	reserved;
    314  1.1    simonb } __attribute__((__packed__));
    315  1.1    simonb 
    316  1.1    simonb /* structure for command WPI_CMD_SET_WME */
    317  1.1    simonb struct wpi_wme_setup {
    318  1.1    simonb 	uint32_t	flags;
    319  1.1    simonb 	struct {
    320  1.1    simonb 		uint16_t	cwmin;
    321  1.1    simonb 		uint16_t	cwmax;
    322  1.1    simonb 		uint8_t		aifsn;
    323  1.1    simonb 		uint8_t		reserved;
    324  1.1    simonb 		uint16_t	txop;
    325  1.1    simonb 	} __packed	ac[WME_NUM_AC];
    326  1.1    simonb } __packed;
    327  1.1    simonb 
    328  1.1    simonb /* structure for command WPI_CMD_TSF */
    329  1.1    simonb struct wpi_cmd_tsf {
    330  1.1    simonb 	uint64_t	tstamp;
    331  1.1    simonb 	uint16_t	bintval;
    332  1.1    simonb 	uint16_t	atim;
    333  1.1    simonb 	uint32_t	binitval;
    334  1.1    simonb 	uint16_t	lintval;
    335  1.1    simonb 	uint16_t	reserved;
    336  1.1    simonb } __attribute__((__packed__));
    337  1.1    simonb 
    338  1.1    simonb /* structure for WPI_CMD_ADD_NODE */
    339  1.2     joerg struct wpi_node_info {
    340  1.1    simonb 	uint8_t		control;
    341  1.1    simonb #define WPI_NODE_UPDATE	(1 << 0)
    342  1.1    simonb 
    343  1.1    simonb 	uint8_t		reserved1[3];
    344  1.1    simonb 	uint8_t		bssid[IEEE80211_ADDR_LEN];
    345  1.1    simonb 	uint16_t	reserved2;
    346  1.1    simonb 	uint8_t		id;
    347  1.1    simonb #define WPI_ID_BSS		0
    348  1.1    simonb #define WPI_ID_BROADCAST	24
    349  1.1    simonb 
    350  1.1    simonb 	uint8_t		sta_mask;
    351  1.1    simonb 	uint16_t	reserved3;
    352  1.1    simonb 	uint16_t	key_flags;
    353  1.1    simonb 	uint8_t		tkip;
    354  1.1    simonb 	uint8_t		reserved4;
    355  1.1    simonb 	uint16_t	ttak[5];
    356  1.1    simonb 	uint16_t	reserved5;
    357  1.1    simonb 	uint8_t		key[IEEE80211_KEYBUF_SIZE];
    358  1.1    simonb 	uint32_t	flags;
    359  1.1    simonb 	uint32_t	mask;
    360  1.1    simonb 	uint16_t	tid;
    361  1.1    simonb 	uint8_t		rate;
    362  1.1    simonb 	uint8_t		reserved6;
    363  1.1    simonb 	uint8_t		add_imm;
    364  1.1    simonb 	uint8_t		del_imm;
    365  1.1    simonb 	uint16_t	add_imm_start;
    366  1.1    simonb } __attribute__((__packed__));
    367  1.1    simonb 
    368  1.1    simonb /* structure for command WPI_CMD_TX_DATA */
    369  1.1    simonb struct wpi_cmd_data {
    370  1.1    simonb 	uint16_t	len;
    371  1.1    simonb 	uint16_t	lnext;
    372  1.1    simonb 	uint32_t	flags;
    373  1.1    simonb #define WPI_TX_NEED_RTS		(1 <<  1)
    374  1.1    simonb #define WPI_TX_NEED_ACK		(1 <<  3)
    375  1.1    simonb #define WPI_TX_FULL_TXOP	(1 <<  7)
    376  1.1    simonb #define WPI_TX_AUTO_SEQ		(1 << 13)
    377  1.1    simonb #define WPI_TX_INSERT_TSTAMP	(1 << 16)
    378  1.1    simonb 
    379  1.1    simonb 	uint8_t		rate;
    380  1.1    simonb 	uint8_t		id;
    381  1.1    simonb 	uint8_t		tid;
    382  1.1    simonb 	uint8_t		security;
    383  1.1    simonb 	uint8_t		key[IEEE80211_KEYBUF_SIZE];
    384  1.1    simonb 	uint8_t		tkip[IEEE80211_WEP_MICLEN];
    385  1.1    simonb 	uint32_t	fnext;
    386  1.1    simonb 	uint32_t	lifetime;
    387  1.1    simonb 	uint8_t		ofdm_mask;
    388  1.1    simonb 	uint8_t		cck_mask;
    389  1.1    simonb 	uint8_t		rts_ntries;
    390  1.1    simonb 	uint8_t		data_ntries;
    391  1.1    simonb 	uint16_t	timeout;
    392  1.1    simonb 	uint16_t	txop;
    393  1.1    simonb 	struct		ieee80211_frame wh;
    394  1.1    simonb } __attribute__((__packed__));
    395  1.1    simonb 
    396  1.1    simonb /* structure for command WPI_CMD_SET_BEACON */
    397  1.1    simonb struct wpi_cmd_beacon {
    398  1.1    simonb 	uint16_t	len;
    399  1.1    simonb 	uint16_t	reserved1;
    400  1.1    simonb 	uint32_t	flags;	/* same as wpi_cmd_data */
    401  1.1    simonb 	uint8_t		rate;
    402  1.1    simonb 	uint8_t		id;
    403  1.1    simonb 	uint8_t		reserved2[30];
    404  1.1    simonb 	uint32_t	lifetime;
    405  1.1    simonb 	uint8_t		ofdm_mask;
    406  1.1    simonb 	uint8_t		cck_mask;
    407  1.1    simonb 	uint16_t	reserved3[3];
    408  1.1    simonb 	uint16_t	tim;
    409  1.1    simonb 	uint8_t		timsz;
    410  1.1    simonb 	uint8_t		reserved4;
    411  1.1    simonb 	struct		ieee80211_frame wh;
    412  1.1    simonb } __attribute__((__packed__));
    413  1.1    simonb 
    414  1.1    simonb /* structure for WPI_CMD_MRR_SETUP */
    415  1.1    simonb struct wpi_mrr_setup {
    416  1.1    simonb 	uint32_t	which;
    417  1.1    simonb #define WPI_MRR_CTL	0
    418  1.1    simonb #define WPI_MRR_DATA	1
    419  1.1    simonb 
    420  1.1    simonb 	struct {
    421  1.1    simonb 		uint8_t	plcp;
    422  1.1    simonb 		uint8_t	flags;
    423  1.1    simonb 		uint8_t	ntries;
    424  1.1    simonb 		uint8_t	next;
    425  1.1    simonb #define WPI_OFDM6	0
    426  1.1    simonb #define WPI_OFDM54	7
    427  1.1    simonb #define WPI_CCK1	8
    428  1.1    simonb #define WPI_CCK2	9
    429  1.1    simonb #define WPI_CCK11	11
    430  1.1    simonb 
    431  1.1    simonb 	} __attribute__((__packed__))	rates[WPI_CCK11 + 1];
    432  1.1    simonb } __attribute__((__packed__));
    433  1.1    simonb 
    434  1.1    simonb /* structure for WPI_CMD_SET_LED */
    435  1.1    simonb struct wpi_cmd_led {
    436  1.1    simonb 	uint32_t	unit;	/* multiplier (in usecs) */
    437  1.1    simonb 	uint8_t		which;
    438  1.1    simonb #define WPI_LED_ACTIVITY	1
    439  1.1    simonb #define WPI_LED_LINK		2
    440  1.1    simonb 
    441  1.1    simonb 	uint8_t		off;
    442  1.1    simonb 	uint8_t		on;
    443  1.1    simonb 	uint8_t		reserved;
    444  1.1    simonb } __attribute__((__packed__));
    445  1.1    simonb 
    446  1.1    simonb /* structure for WPI_CMD_SET_POWER_MODE */
    447  1.1    simonb struct wpi_power {
    448  1.1    simonb 	uint32_t	flags;
    449  1.1    simonb 	uint32_t	rx_timeout;
    450  1.1    simonb 	uint32_t	tx_timeout;
    451  1.1    simonb 	uint32_t	sleep[5];
    452  1.1    simonb } __attribute__((__packed__));
    453  1.1    simonb 
    454  1.1    simonb /* structure for command WPI_CMD_SCAN */
    455  1.1    simonb struct wpi_scan_hdr {
    456  1.1    simonb 	uint8_t		len;
    457  1.1    simonb 	uint8_t		first;
    458  1.1    simonb 	uint8_t		reserved1;
    459  1.1    simonb 	uint8_t		nchan;
    460  1.1    simonb 	uint16_t	quiet;
    461  1.1    simonb 	uint16_t	threshold;
    462  1.1    simonb 	uint16_t	band;
    463  1.1    simonb #define WPI_SCAN_5GHZ 1
    464  1.1    simonb 	uint16_t	reserved2[5];
    465  1.1    simonb 	uint32_t	flags;
    466  1.1    simonb 	uint32_t	filter;
    467  1.1    simonb 	uint16_t	pbrlen;
    468  1.1    simonb 	uint16_t	reserved4;
    469  1.1    simonb 	uint32_t	magic1;
    470  1.1    simonb 	uint8_t		rate;
    471  1.1    simonb 	uint8_t		id;
    472  1.1    simonb 	uint16_t	reserved5;
    473  1.1    simonb 	uint32_t	reserved6[7];
    474  1.1    simonb 	uint32_t	mask;
    475  1.1    simonb 	uint32_t	reserved7[2];
    476  1.1    simonb 	uint8_t		reserved8;
    477  1.1    simonb 	uint8_t		esslen;
    478  1.1    simonb 	uint8_t		essid[134];
    479  1.1    simonb 
    480  1.1    simonb 	/* followed by probe request body */
    481  1.1    simonb 	/* followed by nchan x wpi_scan_chan */
    482  1.1    simonb } __attribute__((__packed__));
    483  1.1    simonb 
    484  1.1    simonb struct wpi_scan_chan {
    485  1.1    simonb 	uint8_t		flags;
    486  1.1    simonb 	uint8_t		chan;
    487  1.1    simonb #define WPI_CHAN_ACTIVE	3
    488  1.1    simonb 	uint16_t	magic;		/* XXX */
    489  1.1    simonb 	uint16_t	active;		/* msecs */
    490  1.1    simonb 	uint16_t	passive;	/* msecs */
    491  1.1    simonb } __attribute__((__packed__));
    492  1.1    simonb 
    493  1.1    simonb /* structure for WPI_CMD_BLUETOOTH */
    494  1.1    simonb struct wpi_bluetooth {
    495  1.1    simonb 	uint8_t		flags;
    496  1.1    simonb 	uint8_t		lead;
    497  1.1    simonb 	uint8_t		kill;
    498  1.1    simonb 	uint8_t		reserved;
    499  1.1    simonb 	uint32_t	ack;
    500  1.1    simonb 	uint32_t	cts;
    501  1.1    simonb } __attribute__((__packed__));
    502  1.1    simonb 
    503  1.1    simonb /* structure for command WPI_CMD_TXPOWER */
    504  1.1    simonb struct wpi_txpower {
    505  1.1    simonb 	uint32_t	reserved1;
    506  1.1    simonb 	uint16_t	pwr1[14];
    507  1.1    simonb 	uint32_t	reserved2[2];
    508  1.1    simonb 	uint16_t	pwr2[14];
    509  1.1    simonb 	uint32_t	reserved3[2];
    510  1.1    simonb } __attribute__((__packed__));
    511  1.1    simonb 
    512  1.1    simonb 
    513  1.1    simonb /* firmware image header */
    514  1.1    simonb struct wpi_firmware_hdr {
    515  1.1    simonb 	uint32_t	version;
    516  1.1    simonb 	uint32_t	textsz;
    517  1.1    simonb 	uint32_t	datasz;
    518  1.1    simonb 	uint32_t	bootsz;
    519  1.1    simonb } __attribute__((__packed__));
    520  1.1    simonb 
    521  1.1    simonb /* structure for WPI_UC_READY notification */
    522  1.1    simonb struct wpi_ucode_info {
    523  1.1    simonb 	uint32_t	version;
    524  1.1    simonb 	uint8_t		revision[8];
    525  1.1    simonb 	uint8_t		type;
    526  1.1    simonb 	uint8_t		subtype;
    527  1.1    simonb 	uint16_t	reserved;
    528  1.1    simonb 	uint32_t	logptr;
    529  1.1    simonb 	uint32_t	errorptr;
    530  1.1    simonb 	uint32_t	timestamp;
    531  1.1    simonb 	uint32_t	valid;
    532  1.1    simonb } __attribute__((__packed__));
    533  1.1    simonb 
    534  1.1    simonb /* structure for WPI_START_SCAN notification */
    535  1.1    simonb struct wpi_start_scan {
    536  1.1    simonb 	uint64_t	tstamp;
    537  1.1    simonb 	uint32_t	tbeacon;
    538  1.1    simonb 	uint8_t		chan;
    539  1.1    simonb 	uint8_t		band;
    540  1.1    simonb 	uint16_t	reserved;
    541  1.1    simonb 	uint32_t	status;
    542  1.1    simonb } __attribute__((__packed__));
    543  1.1    simonb 
    544  1.1    simonb /* structure for WPI_STOP_SCAN notification */
    545  1.1    simonb struct wpi_stop_scan {
    546  1.1    simonb 	uint8_t		nchan;
    547  1.1    simonb 	uint8_t		status;
    548  1.1    simonb 	uint8_t		reserved;
    549  1.1    simonb 	uint8_t		chan;
    550  1.1    simonb 	uint64_t	tsf;
    551  1.1    simonb } __packed;
    552  1.1    simonb 
    553  1.1    simonb #define WPI_EEPROM_MAC		0x015
    554  1.1    simonb #define WPI_EEPROM_REVISION	0x035
    555  1.1    simonb #define WPI_EEPROM_CAPABILITIES	0x045
    556  1.1    simonb #define WPI_EEPROM_TYPE		0x04a
    557  1.1    simonb #define WPI_EEPROM_PWR1		0x1ae
    558  1.1    simonb #define WPI_EEPROM_PWR2		0x1bc
    559  1.1    simonb 
    560  1.1    simonb #define WPI_READ(sc, reg)						\
    561  1.1    simonb 	bus_space_read_4((sc)->sc_st, (sc)->sc_sh, (reg))
    562  1.1    simonb 
    563  1.1    simonb #define WPI_WRITE(sc, reg, val)						\
    564  1.1    simonb 	bus_space_write_4((sc)->sc_st, (sc)->sc_sh, (reg), (val))
    565  1.1    simonb 
    566  1.1    simonb #define WPI_WRITE_REGION_4(sc, offset, datap, count)			\
    567  1.1    simonb 	bus_space_write_region_4((sc)->sc_st, (sc)->sc_sh, (offset),	\
    568  1.1    simonb 		(datap), (count))
    569