if_malo_pcmciavar.h revision 1.4 1 1.4 gutterid /* $NetBSD: if_malo_pcmciavar.h,v 1.4 2025/03/31 23:15:41 gutteridge Exp $ */
2 1.1 kiyohara /* $OpenBSD: if_malovar.h,v 1.27 2007/10/09 20:37:32 mglocker Exp $ */
3 1.1 kiyohara
4 1.1 kiyohara /*
5 1.1 kiyohara * Copyright (c) 2007 Marcus Glocker <mglocker (at) openbsd.org>
6 1.1 kiyohara *
7 1.1 kiyohara * Permission to use, copy, modify, and distribute this software for any
8 1.1 kiyohara * purpose with or without fee is hereby granted, provided that the above
9 1.1 kiyohara * copyright notice and this permission notice appear in all copies.
10 1.1 kiyohara *
11 1.1 kiyohara * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 1.1 kiyohara * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 1.1 kiyohara * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 1.1 kiyohara * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 1.1 kiyohara * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 1.1 kiyohara * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 1.1 kiyohara * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 1.1 kiyohara */
19 1.1 kiyohara
20 1.1 kiyohara /* simplify bus space access */
21 1.1 kiyohara #define MALO_READ_1(sc, reg) \
22 1.1 kiyohara bus_space_read_1((sc)->sc_iot, (sc)->sc_ioh, (reg))
23 1.1 kiyohara #define MALO_READ_2(sc, reg) \
24 1.1 kiyohara bus_space_read_2((sc)->sc_iot, (sc)->sc_ioh, (reg))
25 1.1 kiyohara #ifdef __BUS_SPACE_HAS_STREAM_METHODS
26 1.1 kiyohara #define MALO_READ_MULTI_2(sc, reg, off, size) \
27 1.1 kiyohara bus_space_read_multi_stream_2((sc)->sc_iot, (sc)->sc_ioh, (reg), (off), (size))
28 1.1 kiyohara #else
29 1.1 kiyohara #if _BYTE_ORDER == _LITTLE_ENDIAN
30 1.1 kiyohara #define MALO_READ_MULTI_2(sc, reg, off, size) \
31 1.1 kiyohara bus_space_read_multi_2((sc)->sc_iot, (sc)->sc_ioh, (reg), (off), (size))
32 1.1 kiyohara #else
33 1.4 gutterid #error bus_space_read_multi_stream_2() is not supported
34 1.1 kiyohara #endif
35 1.1 kiyohara #endif
36 1.1 kiyohara #define MALO_WRITE_1(sc, reg, val) \
37 1.1 kiyohara bus_space_write_1((sc)->sc_iot, (sc)->sc_ioh, (reg), (val))
38 1.1 kiyohara #define MALO_WRITE_2(sc, reg, val) \
39 1.1 kiyohara bus_space_write_2((sc)->sc_iot, (sc)->sc_ioh, (reg), (val))
40 1.1 kiyohara #ifdef __BUS_SPACE_HAS_STREAM_METHODS
41 1.1 kiyohara #define MALO_WRITE_MULTI_2(sc, reg, off, size) \
42 1.1 kiyohara bus_space_write_multi_stream_2((sc)->sc_iot, (sc)->sc_ioh, (reg), (off), (size))
43 1.1 kiyohara #else
44 1.1 kiyohara #if _BYTE_ORDER == _LITTLE_ENDIAN
45 1.1 kiyohara #define MALO_WRITE_MULTI_2(sc, reg, off, size) \
46 1.1 kiyohara bus_space_write_multi_2((sc)->sc_iot, (sc)->sc_ioh, (reg), (off), (size))
47 1.1 kiyohara #else
48 1.4 gutterid #error bus_space_write_multi_stream_2() is not supported
49 1.1 kiyohara #endif
50 1.1 kiyohara #endif
51 1.1 kiyohara
52 1.1 kiyohara /* miscellaneous */
53 1.1 kiyohara #define MALO_FW_HELPER_BSIZE 256 /* helper FW block size */
54 1.1 kiyohara #define MALO_FW_HELPER_LOADED 0x10 /* helper FW loaded */
55 1.1 kiyohara #define MALO_FW_MAIN_MAXRETRY 20 /* main FW block resend max retry */
56 1.1 kiyohara #define MALO_CMD_BUFFER_SIZE 4096 /* cmd buffer */
57 1.1 kiyohara #define MALO_DATA_BUFFER_SIZE 4096 /* data buffer */
58 1.1 kiyohara
59 1.1 kiyohara /* device flags */
60 1.1 kiyohara #define MALO_DEVICE_ATTACHED (1 << 0)
61 1.1 kiyohara #define MALO_DEVICE_ENABLED (1 << 1)
62 1.1 kiyohara #define MALO_FW_LOADED (1 << 2)
63 1.1 kiyohara #define MALO_ASSOC_FAILED (1 << 3)
64 1.1 kiyohara
65 1.1 kiyohara /*
66 1.1 kiyohara * FW command structures
67 1.1 kiyohara */
68 1.1 kiyohara struct malo_cmd_header {
69 1.1 kiyohara uint16_t cmd;
70 1.1 kiyohara uint16_t size;
71 1.1 kiyohara uint16_t seqnum;
72 1.1 kiyohara uint16_t result;
73 1.1 kiyohara /* malo_cmd_body */
74 1.1 kiyohara };
75 1.1 kiyohara
76 1.1 kiyohara struct malo_cmd_body_spec {
77 1.1 kiyohara uint16_t hw_if_version;
78 1.1 kiyohara uint16_t hw_version;
79 1.1 kiyohara uint16_t num_of_wcb;
80 1.1 kiyohara uint16_t num_of_mcast;
81 1.1 kiyohara uint8_t macaddr[ETHER_ADDR_LEN];
82 1.1 kiyohara uint16_t regioncode;
83 1.1 kiyohara uint16_t num_of_antenna;
84 1.1 kiyohara uint32_t fw_version;
85 1.1 kiyohara uint32_t wcbbase;
86 1.1 kiyohara uint32_t rxpdrdptr;
87 1.1 kiyohara uint32_t rxpdwrptr;
88 1.1 kiyohara uint32_t fw_capinfo;
89 1.1 kiyohara } __packed;
90 1.1 kiyohara
91 1.1 kiyohara struct malo_cmd_body_scan {
92 1.1 kiyohara uint8_t bsstype;
93 1.1 kiyohara uint8_t bssid[ETHER_ADDR_LEN];
94 1.1 kiyohara /* malo_cmd_tlv_ssid */
95 1.1 kiyohara /* malo_cmd_tlv_chanlist */
96 1.1 kiyohara /* malo_cmd_tlv_rates */
97 1.1 kiyohara /* malo_cmd_tlv_numprobes */
98 1.1 kiyohara } __packed;
99 1.1 kiyohara
100 1.1 kiyohara struct malo_cmd_body_rsp_scan {
101 1.1 kiyohara uint16_t bufsize;
102 1.1 kiyohara uint8_t numofset;
103 1.1 kiyohara } __packed;
104 1.1 kiyohara struct malo_cmd_body_rsp_scan_set {
105 1.1 kiyohara uint16_t size;
106 1.1 kiyohara uint8_t bssid[ETHER_ADDR_LEN];
107 1.1 kiyohara uint8_t rssi;
108 1.1 kiyohara uint8_t timestamp[8];
109 1.1 kiyohara uint16_t beaconintvl;
110 1.1 kiyohara uint16_t capinfo;
111 1.1 kiyohara uint8_t data[0];
112 1.1 kiyohara } __packed;
113 1.1 kiyohara
114 1.1 kiyohara struct malo_cmd_body_auth {
115 1.1 kiyohara uint8_t peermac[ETHER_ADDR_LEN];
116 1.1 kiyohara uint8_t authtype;
117 1.1 kiyohara } __packed;
118 1.1 kiyohara
119 1.1 kiyohara #define MALO_WEP_ACTION_TYPE_ADD 0x02
120 1.1 kiyohara #define MALO_WEP_ACTION_TYPE_REMOVE 0x04
121 1.1 kiyohara #define MALO_WEP_ACTION_TYPE_DEFAULT 0x08
122 1.1 kiyohara #define MALO_WEP_KEY_TYPE_40BIT 0x01
123 1.1 kiyohara #define MALO_WEP_KEY_TYPE_104BIT 0x02
124 1.1 kiyohara struct malo_cmd_body_wep {
125 1.1 kiyohara uint16_t action;
126 1.1 kiyohara uint16_t key_index;
127 1.1 kiyohara uint8_t key_type_1;
128 1.1 kiyohara uint8_t key_type_2;
129 1.1 kiyohara uint8_t key_type_3;
130 1.1 kiyohara uint8_t key_type_4;
131 1.1 kiyohara uint8_t key_value_1[16];
132 1.1 kiyohara uint8_t key_value_2[16];
133 1.1 kiyohara uint8_t key_value_3[16];
134 1.1 kiyohara uint8_t key_value_4[16];
135 1.1 kiyohara } __packed;
136 1.1 kiyohara
137 1.1 kiyohara #define MALO_OID_BSS 0x00
138 1.1 kiyohara #define MALO_OID_RATE 0x01
139 1.1 kiyohara #define MALO_OID_BCNPERIOD 0x02
140 1.1 kiyohara #define MALO_OID_DTIMPERIOD 0x03
141 1.1 kiyohara #define MALO_OID_ASSOCTIMEOUT 0x04
142 1.1 kiyohara #define MALO_OID_RTSTRESH 0x05
143 1.1 kiyohara #define MALO_OID_SHORTRETRY 0x06
144 1.1 kiyohara #define MALO_OID_LONGRETRY 0x07
145 1.1 kiyohara #define MALO_OID_FRAGTRESH 0x08
146 1.1 kiyohara #define MALO_OID_80211D 0x09
147 1.1 kiyohara #define MALO_OID_80211H 0x0a
148 1.1 kiyohara struct malo_cmd_body_snmp {
149 1.1 kiyohara uint16_t action;
150 1.1 kiyohara uint16_t oid;
151 1.1 kiyohara uint16_t size;
152 1.1 kiyohara uint8_t data[128];
153 1.1 kiyohara } __packed;
154 1.1 kiyohara
155 1.1 kiyohara struct malo_cmd_body_radio {
156 1.1 kiyohara uint16_t action;
157 1.1 kiyohara uint16_t control;
158 1.1 kiyohara } __packed;
159 1.1 kiyohara
160 1.1 kiyohara struct malo_cmd_body_channel {
161 1.1 kiyohara uint16_t action;
162 1.1 kiyohara uint16_t channel;
163 1.1 kiyohara uint16_t rftype;
164 1.1 kiyohara uint16_t reserved;
165 1.1 kiyohara uint8_t channel_list[32];
166 1.1 kiyohara } __packed;
167 1.1 kiyohara
168 1.1 kiyohara struct malo_cmd_body_txpower {
169 1.1 kiyohara uint16_t action;
170 1.1 kiyohara int16_t txpower;
171 1.1 kiyohara } __packed;
172 1.1 kiyohara
173 1.1 kiyohara struct malo_cmd_body_antenna {
174 1.1 kiyohara uint16_t action;
175 1.1 kiyohara uint16_t antenna_mode;
176 1.1 kiyohara } __packed;
177 1.1 kiyohara
178 1.1 kiyohara struct malo_cmd_body_macctrl {
179 1.1 kiyohara uint16_t action;
180 1.1 kiyohara uint16_t reserved;
181 1.1 kiyohara } __packed;
182 1.1 kiyohara
183 1.1 kiyohara struct malo_cmd_body_macaddr {
184 1.1 kiyohara uint16_t action;
185 1.1 kiyohara uint8_t macaddr[ETHER_ADDR_LEN];
186 1.1 kiyohara } __packed;
187 1.1 kiyohara
188 1.1 kiyohara struct malo_cmd_body_assoc {
189 1.1 kiyohara uint8_t peermac[ETHER_ADDR_LEN];
190 1.1 kiyohara uint16_t capinfo;
191 1.1 kiyohara uint16_t listenintrv;
192 1.1 kiyohara uint16_t bcnperiod;
193 1.1 kiyohara uint8_t dtimperiod;
194 1.1 kiyohara /* malo_cmd_tlv_ssid */
195 1.1 kiyohara /* malo_cmd_tlv_phy */
196 1.1 kiyohara /* malo_cmd_tlv_cf */
197 1.1 kiyohara /* malo_cmd_tlv_rate */
198 1.1 kiyohara } __packed;
199 1.1 kiyohara
200 1.1 kiyohara struct malo_cmd_body_rsp_assoc {
201 1.1 kiyohara uint16_t capinfo;
202 1.1 kiyohara uint16_t status;
203 1.1 kiyohara uint16_t assoc_id;
204 1.1 kiyohara uint16_t info_len;
205 1.1 kiyohara /* uint8_t info[270] */
206 1.1 kiyohara } __packed;
207 1.1 kiyohara
208 1.1 kiyohara struct malo_cmd_body_80211d {
209 1.1 kiyohara uint16_t action;
210 1.1 kiyohara /* malo_cmd_tlv_80211d */
211 1.1 kiyohara } __packed;
212 1.1 kiyohara
213 1.1 kiyohara struct malo_cmd_body_bgscan_config {
214 1.1 kiyohara uint16_t action;
215 1.1 kiyohara uint8_t enable;
216 1.1 kiyohara uint8_t bsstype;
217 1.1 kiyohara uint8_t chperscan;
218 1.1 kiyohara uint8_t discard;
219 1.1 kiyohara uint16_t reserved;
220 1.1 kiyohara uint32_t scanintvl;
221 1.1 kiyohara uint32_t storecond;
222 1.1 kiyohara uint32_t reportcond;
223 1.1 kiyohara uint16_t maxscanres;
224 1.1 kiyohara } __packed;
225 1.1 kiyohara
226 1.1 kiyohara struct malo_cmd_body_bgscan_query {
227 1.1 kiyohara uint8_t flush;
228 1.1 kiyohara } __packed;
229 1.1 kiyohara
230 1.1 kiyohara #define MALO_RATE_BITMAP_DS1 (1 << 0)
231 1.1 kiyohara #define MALO_RATE_BITMAP_DS2 (1 << 1)
232 1.1 kiyohara #define MALO_RATE_BITMAP_DS5 (1 << 2)
233 1.1 kiyohara #define MALO_RATE_BITMAP_DS11 (1 << 3)
234 1.1 kiyohara #define MALO_RATE_BITMAP_OFDM6 (1 << 5)
235 1.1 kiyohara #define MALO_RATE_BITMAP_OFDM9 (1 << 6)
236 1.1 kiyohara #define MALO_RATE_BITMAP_OFDM12 (1 << 7)
237 1.1 kiyohara #define MALO_RATE_BITMAP_OFDM18 (1 << 8)
238 1.1 kiyohara #define MALO_RATE_BITMAP_OFDM24 (1 << 9)
239 1.1 kiyohara #define MALO_RATE_BITMAP_OFDM36 (1 << 10)
240 1.1 kiyohara #define MALO_RATE_BITMAP_OFDM48 (1 << 11)
241 1.1 kiyohara #define MALO_RATE_BITMAP_OFDM54 (1 << 12)
242 1.1 kiyohara #define MALO_RATE_BITMAP_AUTO 0x1fef
243 1.1 kiyohara struct malo_cmd_body_rate {
244 1.1 kiyohara uint16_t action;
245 1.1 kiyohara uint16_t hwauto;
246 1.1 kiyohara uint16_t ratebitmap;
247 1.1 kiyohara } __packed;
248 1.1 kiyohara
249 1.1 kiyohara /*
250 1.1 kiyohara * FW command TLV structures
251 1.1 kiyohara */
252 1.1 kiyohara #define MALO_TLV_TYPE_SSID 0x0000
253 1.1 kiyohara #define MALO_TLV_TYPE_RATES 0x0001
254 1.1 kiyohara #define MALO_TLV_TYPE_PHY 0x0003
255 1.1 kiyohara #define MALO_TLV_TYPE_CF 0x0004
256 1.1 kiyohara #define MALO_TLV_TYPE_80211D 0x0007
257 1.1 kiyohara #define MALO_TLV_TYPE_CHANLIST 0x0101
258 1.1 kiyohara #define MALO_TLV_TYPE_NUMPROBES 0x0102
259 1.1 kiyohara #define MALO_TLV_TYPE_PASSEID 0x010a
260 1.1 kiyohara
261 1.1 kiyohara struct malo_cmd_tlv_ssid {
262 1.1 kiyohara uint16_t type;
263 1.1 kiyohara uint16_t size;
264 1.1 kiyohara uint8_t data[0];
265 1.1 kiyohara } __packed;
266 1.1 kiyohara
267 1.1 kiyohara struct malo_cmd_tlv_rates {
268 1.1 kiyohara uint16_t type;
269 1.1 kiyohara uint16_t size;
270 1.1 kiyohara uint8_t data[0];
271 1.1 kiyohara } __packed;
272 1.1 kiyohara
273 1.1 kiyohara struct malo_cmd_tlv_phy {
274 1.1 kiyohara uint16_t type;
275 1.1 kiyohara uint16_t size;
276 1.1 kiyohara uint8_t data[0];
277 1.1 kiyohara } __packed;
278 1.1 kiyohara
279 1.1 kiyohara struct malo_cmd_tlv_cf {
280 1.1 kiyohara uint16_t type;
281 1.1 kiyohara uint16_t size;
282 1.1 kiyohara uint8_t data[0];
283 1.1 kiyohara } __packed;
284 1.1 kiyohara
285 1.1 kiyohara struct malo_cmd_tlv_80211d_param {
286 1.1 kiyohara uint8_t firstchannel;
287 1.1 kiyohara uint8_t numchannels;
288 1.1 kiyohara uint8_t maxtxpower;
289 1.1 kiyohara } __packed;
290 1.1 kiyohara struct malo_cmd_tlv_80211d {
291 1.1 kiyohara uint16_t type;
292 1.1 kiyohara uint16_t size;
293 1.1 kiyohara uint8_t countrycode[3];
294 1.1 kiyohara struct malo_cmd_tlv_80211d_param data[12];
295 1.1 kiyohara } __packed;
296 1.1 kiyohara
297 1.1 kiyohara struct malo_cmd_tlv_chanlist_param {
298 1.1 kiyohara uint8_t radiotype;
299 1.1 kiyohara uint8_t channumber;
300 1.1 kiyohara uint8_t scantype;
301 1.1 kiyohara uint16_t minscantime;
302 1.1 kiyohara uint16_t maxscantime;
303 1.1 kiyohara } __packed;
304 1.1 kiyohara #define CHANNELS 12
305 1.1 kiyohara struct malo_cmd_tlv_chanlist {
306 1.1 kiyohara uint16_t type;
307 1.1 kiyohara uint16_t size;
308 1.1 kiyohara struct malo_cmd_tlv_chanlist_param data[CHANNELS];
309 1.1 kiyohara } __packed;
310 1.1 kiyohara
311 1.1 kiyohara struct malo_cmd_tlv_numprobes {
312 1.1 kiyohara uint16_t type;
313 1.1 kiyohara uint16_t size;
314 1.1 kiyohara uint16_t numprobes;
315 1.1 kiyohara } __packed;
316 1.1 kiyohara
317 1.1 kiyohara struct malo_cmd_tlv_passeid {
318 1.1 kiyohara uint16_t type;
319 1.1 kiyohara uint16_t size;
320 1.1 kiyohara uint8_t data[0];
321 1.1 kiyohara } __packed;
322 1.1 kiyohara
323 1.1 kiyohara /* RX descriptor */
324 1.1 kiyohara #define MALO_RX_STATUS_OK 0x0001
325 1.1 kiyohara struct malo_rx_desc {
326 1.1 kiyohara uint16_t status;
327 1.1 kiyohara uint8_t snr;
328 1.1 kiyohara uint8_t control;
329 1.1 kiyohara uint16_t pkglen;
330 1.1 kiyohara uint8_t nf;
331 1.1 kiyohara uint8_t rate;
332 1.1 kiyohara uint32_t pkgoffset;
333 1.1 kiyohara uint32_t reserved1;
334 1.1 kiyohara uint8_t priority;
335 1.1 kiyohara uint8_t reserved2[3];
336 1.1 kiyohara } __packed;
337 1.1 kiyohara
338 1.1 kiyohara /* TX descriptor */
339 1.1 kiyohara struct malo_tx_desc {
340 1.1 kiyohara uint32_t status;
341 1.1 kiyohara uint32_t control;
342 1.1 kiyohara uint32_t pkgoffset;
343 1.1 kiyohara uint16_t pkglen;
344 1.2 christos uint8_t dstaddr[ETHER_ADDR_LEN];
345 1.1 kiyohara uint8_t priority;
346 1.1 kiyohara uint8_t flags;
347 1.1 kiyohara uint8_t reserved[2];
348 1.1 kiyohara } __packed;
349 1.1 kiyohara
350 1.1 kiyohara /* scanned network */
351 1.1 kiyohara struct malo_networks {
352 1.1 kiyohara uint8_t bssid[ETHER_ADDR_LEN];
353 1.1 kiyohara uint8_t rssi;
354 1.1 kiyohara uint8_t timestamp[8];
355 1.1 kiyohara uint16_t beaconintvl;
356 1.1 kiyohara uint16_t capinfo;
357 1.1 kiyohara uint8_t ssid[32];
358 1.1 kiyohara uint8_t rates[14];
359 1.1 kiyohara uint8_t channel;
360 1.1 kiyohara } __packed;
361 1.1 kiyohara
362 1.1 kiyohara /*
363 1.1 kiyohara * Softc
364 1.1 kiyohara */
365 1.1 kiyohara struct malo_softc {
366 1.1 kiyohara device_t sc_dev;
367 1.1 kiyohara struct ethercom sc_ec;
368 1.1 kiyohara #define sc_if sc_ec.ec_if
369 1.1 kiyohara struct ieee80211com sc_ic;
370 1.3 nonaka void *sc_soft_ih;
371 1.1 kiyohara bus_space_tag_t sc_iot;
372 1.1 kiyohara bus_space_handle_t sc_ioh;
373 1.1 kiyohara int (*sc_newstate)
374 1.1 kiyohara (struct ieee80211com *, enum ieee80211_state,
375 1.1 kiyohara int);
376 1.1 kiyohara
377 1.1 kiyohara int sc_flags;
378 1.1 kiyohara uint8_t *sc_fw_h;
379 1.1 kiyohara uint8_t *sc_fw_m;
380 1.1 kiyohara size_t sc_fw_h_size;
381 1.1 kiyohara size_t sc_fw_m_size;
382 1.1 kiyohara int sc_cmd_ctxsave;
383 1.1 kiyohara uint8_t *sc_cmd;
384 1.1 kiyohara uint8_t *sc_data;
385 1.1 kiyohara uint8_t sc_curchan;
386 1.1 kiyohara int sc_net_num;
387 1.1 kiyohara int sc_net_cur;
388 1.1 kiyohara struct malo_networks sc_net[12];
389 1.1 kiyohara callout_t sc_scan_ch;
390 1.1 kiyohara #if NBPFILTER > 0
391 1.1 kiyohara void *sc_drvbpf;
392 1.1 kiyohara #endif
393 1.1 kiyohara kcondvar_t sc_cv;
394 1.1 kiyohara kmutex_t sc_mtx;
395 1.1 kiyohara };
396