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