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