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