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