xref: /openbsd/sys/dev/ic/acxreg.h (revision 4b1a56af)
1 /*	$OpenBSD: acxreg.h,v 1.13 2022/01/09 05:42:38 jsg Exp $ */
2 
3 /*
4  * Copyright (c) 2006 Jonathan Gray <jsg@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 /*
20  * Copyright (c) 2006 The DragonFly Project.  All rights reserved.
21  *
22  * This code is derived from software contributed to The DragonFly Project
23  * by Sepherosa Ziehau <sepherosa@gmail.com>
24  *
25  * Redistribution and use in source and binary forms, with or without
26  * modification, are permitted provided that the following conditions
27  * are met:
28  *
29  * 1. Redistributions of source code must retain the above copyright
30  *    notice, this list of conditions and the following disclaimer.
31  * 2. Redistributions in binary form must reproduce the above copyright
32  *    notice, this list of conditions and the following disclaimer in
33  *    the documentation and/or other materials provided with the
34  *    distribution.
35  * 3. Neither the name of The DragonFly Project nor the names of its
36  *    contributors may be used to endorse or promote products derived
37  *    from this software without specific, prior written permission.
38  *
39  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
40  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
41  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
42  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
43  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
44  * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
45  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
47  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
48  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
49  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
50  * SUCH DAMAGE.
51  */
52 
53 #ifndef _ACXREG_H
54 #define _ACXREG_H
55 
56 /*
57  * IO register index
58  */
59 #define ACXREG_SOFT_RESET		0
60 #define ACXREG_FWMEM_ADDR		1
61 #define ACXREG_FWMEM_DATA		2
62 #define ACXREG_FWMEM_CTRL		3
63 #define ACXREG_FWMEM_START		4
64 #define ACXREG_EVENT_MASK		5
65 #define ACXREG_INTR_TRIG		6
66 #define ACXREG_INTR_MASK		7
67 #define ACXREG_INTR_STATUS		8
68 #define ACXREG_INTR_STATUS_CLR		9	/* cleared after being read */
69 #define ACXREG_INTR_ACK			10
70 #define ACXREG_HINTR_TRIG		11	/* XXX what's this? */
71 #define ACXREG_RADIO_ENABLE		12
72 #define ACXREG_EEPROM_INIT		13
73 #define ACXREG_EEPROM_CTRL		14
74 #define ACXREG_EEPROM_ADDR		15
75 #define ACXREG_EEPROM_DATA		16
76 #define ACXREG_EEPROM_CONF		17
77 #define ACXREG_EEPROM_INFO		18
78 #define ACXREG_PHY_ADDR			19
79 #define ACXREG_PHY_DATA			20
80 #define ACXREG_PHY_CTRL			21
81 #define ACXREG_GPIO_OUT_ENABLE		22
82 #define ACXREG_GPIO_OUT			23
83 #define ACXREG_CMD_REG_OFFSET		24
84 #define ACXREG_INFO_REG_OFFSET		25
85 #define ACXREG_RESET_SENSE		26
86 #define ACXREG_ECPU_CTRL		27
87 #define ACXREG_MAX			28
88 #define ACXREG(reg, val)		[ACXREG_##reg] = val
89 
90 /*
91  * Value read from ACXREG_EEPROM_INFO
92  * upper 8bits are radio type
93  * lower 8bits are form factor
94  */
95 #define ACX_EEINFO_RADIO_TYPE_SHIFT	8
96 #define ACX_EEINFO_RADIO_TYPE_MASK	(0xff << ACX_EEINFO_RADIO_TYPE_SHIFT)
97 #define ACX_EEINFO_FORM_FACTOR_MASK	0xff
98 
99 #define ACX_EEINFO_HAS_RADIO_TYPE(info)	((info) & ACX_EEINFO_RADIO_TYPE_MASK)
100 #define ACX_EEINFO_RADIO_TYPE(info)	((info) >> ACX_EEINFO_RADIO_TYPE_SHIFT)
101 #define ACX_EEINFO_FORM_FACTOR(info)	((info) & ACX_EEINFO_FORM_FACTOR_MASK)
102 
103 /*
104  * Size of command register whose location is obtained
105  * from ACXREG_CMD_REG_OFFSET IO register
106  */
107 #define ACX_CMD_REG_SIZE		4	/* 4 bytes */
108 
109 /*
110  * Size of information register whose location is obtained
111  * from ACXREG_INFO_REG_OFFSET IO register
112  */
113 #define ACX_INFO_REG_SIZE		4	/* 4 bytes */
114 
115 /*
116  * Offset of EEPROM variables
117  */
118 #define ACX_EE_VERSION_OFS		0x05
119 
120 /*
121  * Possible values for various IO registers
122  */
123 
124 /* ACXREG_SOFT_RESET */
125 #define ACXRV_SOFT_RESET		0x1
126 
127 /* ACXREG_FWMEM_START */
128 #define ACXRV_FWMEM_START_OP		0x0
129 
130 /* ACXREG_FWMEM_CTRL */
131 #define ACXRV_FWMEM_ADDR_AUTOINC	0x10000
132 
133 /* ACXREG_EVENT_MASK */
134 #define ACXRV_EVENT_DISABLE		0x8000	/* XXX What's this?? */
135 
136 /* ACXREG_INTR_TRIG */
137 #define ACXRV_TRIG_CMD_FINI		0x0001
138 #define ACXRV_TRIG_TX_FINI		0x0004
139 
140 /* ACXREG_INTR_MASK */
141 #define ACXRV_INTR_RX_DATA		0x0001
142 #define ACXRV_INTR_TX_FINI		0x0002
143 #define ACXRV_INTR_TX_XFER		0x0004
144 #define ACXRV_INTR_RX_FINI		0x0008
145 #define ACXRV_INTR_DTIM			0x0010
146 #define ACXRV_INTR_BEACON		0x0020
147 #define ACXRV_INTR_TIMER		0x0040
148 #define ACXRV_INTR_KEY_MISS		0x0080
149 #define ACXRV_INTR_WEP_FAIL		0x0100
150 #define ACXRV_INTR_CMD_FINI		0x0200
151 #define ACXRV_INTR_INFO			0x0400
152 #define ACXRV_INTR_OVERFLOW		0x0800	/* XXX */
153 #define ACXRV_INTR_PROC_ERR		0x1000	/* XXX */
154 #define ACXRV_INTR_SCAN_FINI		0x2000
155 #define ACXRV_INTR_FCS_THRESH		0x4000	/* XXX */
156 #define ACXRV_INTR_UNKN			0x8000
157 #define ACXRV_INTR_ALL			0xffff
158 
159 /* ACXREG_EEPROM_INIT */
160 #define ACXRV_EEPROM_INIT		0x1
161 
162 /* ACXREG_EEPROM_CTRL */
163 #define ACXRV_EEPROM_READ		0x2
164 
165 /* ACXREG_PHY_CTRL */
166 #define ACXRV_PHY_WRITE			0x1
167 #define ACXRV_PHY_READ			0x2
168 
169 /* ACXREG_PHY_ADDR */
170 #define ACXRV_PHYREG_TXPOWER		0x11	/* axc100 */
171 #define ACXRV_PHYREG_SENSITIVITY	0x30
172 
173 /* ACXREG_ECPU_CTRL */
174 #define ACXRV_ECPU_HALT			0x1
175 #define ACXRV_ECPU_START		0x0
176 
177 /* Commands */
178 #define ACXCMD_GET_CONF		0x01
179 #define ACXCMD_SET_CONF		0x02
180 #define ACXCMD_ENABLE_RXCHAN	0x03
181 #define ACXCMD_ENABLE_TXCHAN	0x04
182 #define ACXCMD_TMPLT_TIM	0x0a
183 #define ACXCMD_JOIN_BSS		0x0b
184 #define ACXCMD_WEP_MGMT		0x0c	/* acx111 */
185 #define ACXCMD_SLEEP		0x0f
186 #define ACXCMD_WAKEUP		0x10
187 #define ACXCMD_INIT_MEM		0x12	/* acx100 */
188 #define ACXCMD_TMPLT_BEACON	0x13
189 #define ACXCMD_TMPLT_PROBE_RESP	0x14
190 #define ACXCMD_TMPLT_NULL_DATA	0x15
191 #define ACXCMD_TMPLT_PROBE_REQ	0x16
192 #define ACXCMD_INIT_RADIO	0x18
193 
194 #if 0
195 /*
196  * acx111 does not agree with acx100 about
197  * the meaning of following values.  So they
198  * are put into chip specific files.
199  */
200 #define ACX_CONF_FW_RING	0x0003
201 #define ACX_CONF_MEMOPT		0x0005
202 #endif
203 #define ACX_CONF_MEMBLK_SIZE	0x0004	/* acx100 */
204 #define ACX_CONF_RATE_FALLBACK	0x0006
205 #define ACX_CONF_WEPOPT		0x0007	/* acx100 */
206 #define ACX_CONF_MMAP		0x0008
207 #define ACX_CONF_FWREV		0x000d
208 #define ACX_CONF_RXOPT		0x0010
209 #define ACX_CONF_OPTION		0x0015	/* acx111 */
210 #define ACX_CONF_EADDR		0x1001
211 #define ACX_CONF_NRETRY_SHORT	0x1005
212 #define ACX_CONF_NRETRY_LONG	0x1006
213 #define ACX_CONF_WEPKEY		0x1007	/* acx100 */
214 #define ACX_CONF_MSDU_LIFETIME	0x1008
215 #define ACX_CONF_REGDOM		0x100a
216 #define ACX_CONF_ANTENNA	0x100b
217 #define ACX_CONF_TXPOWER	0x100d	/* acx111 */
218 #define ACX_CONF_CCA_MODE	0x100e
219 #define ACX_CONF_ED_THRESH	0x100f
220 #define ACX_CONF_WEP_TXKEY	0x1010
221 
222 /*
223  * NOTE:
224  * Following structs' fields are little endian
225  */
226 
227 struct acx_conf {
228 	uint16_t	conf_id;	/* see ACXCONF_ (_acxcmd.h) */
229 	uint16_t	conf_data_len;
230 } __packed;
231 
232 struct acx_conf_mmap {
233 	struct acx_conf	confcom;
234 	uint32_t	code_start;
235 	uint32_t	code_end;
236 	uint32_t	wep_cache_start;
237 	uint32_t	wep_cache_end;
238 	uint32_t	pkt_tmplt_start;
239 	uint32_t	pkt_tmplt_end;
240 	uint32_t	fw_desc_start;
241 	uint32_t	fw_desc_end;
242 	uint32_t	memblk_start;
243 	uint32_t	memblk_end;
244 } __packed;
245 
246 struct acx_conf_wepopt {
247 	struct acx_conf	confcom;
248 	uint16_t	nkey;
249 	uint8_t		opt;	/* see WEPOPT_ */
250 } __packed;
251 
252 #define WEPOPT_HDWEP	0	/* hardware WEP */
253 
254 struct acx_conf_eaddr {
255 	struct acx_conf	confcom;
256 	uint8_t		eaddr[IEEE80211_ADDR_LEN];
257 } __packed;
258 
259 struct acx_conf_regdom {
260 	struct acx_conf	confcom;
261 	uint8_t		regdom;
262 	uint8_t		unknown;
263 } __packed;
264 
265 struct acx_conf_antenna {
266 	struct acx_conf	confcom;
267 	uint8_t		antenna;
268 } __packed;
269 
270 struct acx_conf_fwrev {
271 	struct acx_conf	confcom;
272 #define ACX_FWREV_LEN	20
273 	/*
274 	 * "Rev xx.xx.xx.xx"
275 	 * '\0' terminated
276 	 */
277 	char		fw_rev[ACX_FWREV_LEN];
278 	uint32_t	hw_id;
279 } __packed;
280 
281 struct acx_conf_nretry_long {
282 	struct acx_conf	confcom;
283 	uint8_t		nretry;
284 } __packed;
285 
286 struct acx_conf_nretry_short {
287 	struct acx_conf	confcom;
288 	uint8_t		nretry;
289 } __packed;
290 
291 struct acx_conf_msdu_lifetime {
292 	struct acx_conf	confcom;
293 	uint32_t	lifetime;
294 } __packed;
295 
296 struct acx_conf_rate_fallback {
297 	struct acx_conf	confcom;
298 	uint8_t		ratefb_enable;	/* 0/1 */
299 } __packed;
300 
301 struct acx_conf_rxopt {
302 	struct acx_conf	confcom;
303 	uint16_t	opt1;	/* see RXOPT1_ */
304 	uint16_t	opt2;	/* see RXOPT2_ */
305 } __packed;
306 
307 #define RXOPT1_INCL_RXBUF_HDR	0x2000	/* rxbuf with acx_rxbuf_hdr */
308 #define RXOPT1_RECV_SSID	0x0400	/* recv frame for joined SSID */
309 #define RXOPT1_FILT_BCAST	0x0200	/* filt broadcast pkt */
310 #define RXOPT1_RECV_MCAST1	0x0100	/* recv pkt for multicast addr1 */
311 #define RXOPT1_RECV_MCAST0	0x0080	/* recv pkt for multicast addr0 */
312 #define RXOPT1_FILT_ALLMULTI	0x0040	/* filt allmulti pkt */
313 #define RXOPT1_FILT_FSSID	0x0020	/* filt frame for foreign SSID */
314 #define RXOPT1_FILT_FDEST	0x0010	/* filt frame for foreign dest addr */
315 #define RXOPT1_PROMISC		0x0008	/* promisc mode */
316 #define RXOPT1_INCL_FCS		0x0004
317 #define RXOPT1_INCL_PHYHDR	0x0000	/* XXX 0x0002 */
318 
319 #define RXOPT2_RECV_ASSOC_REQ	0x0800
320 #define RXOPT2_RECV_AUTH	0x0400
321 #define RXOPT2_RECV_BEACON	0x0200
322 #define RXOPT2_RECV_CF		0x0100
323 #define RXOPT2_RECV_CTRL	0x0080
324 #define RXOPT2_RECV_DATA	0x0040
325 #define RXOPT2_RECV_BROKEN	0x0020	/* broken frame */
326 #define RXOPT2_RECV_MGMT	0x0010
327 #define RXOPT2_RECV_PROBE_REQ	0x0008
328 #define RXOPT2_RECV_PROBE_RESP	0x0004
329 #define RXOPT2_RECV_ACK		0x0002	/* RTS/CTS/ACK */
330 #define RXOPT2_RECV_OTHER	0x0001
331 
332 struct acx_conf_wep_txkey {
333 	struct acx_conf	confcom;
334 	uint8_t		wep_txkey;
335 } __packed;
336 
337 
338 struct acx_tmplt_null_data {
339 	uint16_t	size;
340 	struct ieee80211_frame data;
341 } __packed;
342 
343 struct acx_tmplt_probe_req {
344 	uint16_t	size;
345 	union {
346 		struct {
347 			struct ieee80211_frame f;
348 			uint8_t		var[1];
349 		} __packed	u_data;
350 		uint8_t		u_mem[0x44];
351 	}		data;
352 } __packed;
353 
354 #define ACX_TMPLT_PROBE_REQ_SIZ(var_len)	\
355 	(sizeof(uint16_t) + sizeof(struct ieee80211_frame) + (var_len))
356 
357 struct acx_tmplt_probe_resp {
358 	uint16_t	size;
359 	union {
360 		struct {
361 			struct ieee80211_frame f;
362 			uint8_t		time_stamp[8];
363 			uint16_t	beacon_intvl;
364 			uint16_t	cap;
365 			uint8_t		var[1];
366 		} __packed	u_data;
367 		uint8_t		u_mem[0x54];
368 	}		data;
369 } __packed;
370 
371 #define ACX_TMPLT_PROBE_RESP_SIZ(var_len)				\
372 	(sizeof(uint16_t) + sizeof(struct ieee80211_frame) +		\
373 	 8 * sizeof(uint8_t) + sizeof(uint16_t) + sizeof(uint16_t) + (var_len))
374 
375 /* XXX same as acx_tmplt_probe_resp */
376 struct acx_tmplt_beacon {
377 	uint16_t	size;
378 	union {
379 		struct {
380 			struct ieee80211_frame f;
381 			uint8_t		time_stamp[8];
382 			uint16_t	beacon_intvl;
383 			uint16_t	cap;
384 			uint8_t		var[1];
385 		} __packed	u_data;
386 		uint8_t		u_mem[0x54];
387 	}		data;
388 } __packed;
389 
390 /* XXX C&P of ACX_TMPLT_PROVE_RESP_SIZ() */
391 #define ACX_TMPLT_BEACON_SIZ(var_len)					\
392 	(sizeof(uint16_t) + sizeof(struct ieee80211_frame) +		\
393 	 8 * sizeof(uint8_t) + sizeof(uint16_t) + sizeof(uint16_t) + (var_len))
394 
395 /* XXX do NOT belong here */
396 struct tim_head {
397 	uint8_t	eid;
398 	uint8_t	len;
399 	uint8_t	dtim_count;
400 	uint8_t	dtim_period;
401 	uint8_t	bitmap_ctrl;
402 } __packed;
403 
404 /* For tim_head.len (tim_head - eid - len + bitmap) */
405 #define ACX_TIM_LEN(bitmap_len)	\
406 	(sizeof(struct tim_head) - (2 * sizeof(uint8_t)) + (bitmap_len))
407 #define ACX_TIM_BITMAP_LEN	1
408 
409 struct acx_tmplt_tim {
410 	uint16_t	size;
411 	union {
412 		struct {
413 			struct tim_head	th;
414 			uint8_t		bitmap[1];
415 		} __packed	u_data;
416 		uint8_t		u_mem[0x100];
417 	}		data;
418 #define tim_eid		data.u_data.th.eid
419 #define tim_len		data.u_data.th.len
420 #define tim_dtim_count	data.u_data.th.dtim_count
421 #define tim_dtim_period	data.u_data.th.dtim_period
422 #define tim_bitmap_ctrl	data.u_data.th.bitmap_ctrl
423 #define tim_bitmap	data.u_data.bitmap
424 } __packed;
425 
426 #define ACX_TMPLT_TIM_SIZ(bitmap_len)	\
427 	(sizeof(uint16_t) + sizeof(struct tim_head) + (bitmap_len))
428 
429 #define CMDPRM_WRITE_REGION_1(sc, r, rlen)		\
430 	bus_space_write_region_1((sc)->sc_mem2_bt,	\
431 				 (sc)->sc_mem2_bh,	\
432 				 (sc)->sc_cmd_param,	\
433 				 (const uint8_t *)(r), (rlen))
434 
435 #define CMDPRM_READ_REGION_1(sc, r, rlen)				\
436 	bus_space_read_region_1((sc)->sc_mem2_bt, (sc)->sc_mem2_bh,	\
437 				(sc)->sc_cmd_param, (uint8_t *)(r), (rlen))
438 
439 /*
440  * This will clear previous command's
441  * execution status too
442  */
443 #define CMD_WRITE_4(sc, val)					\
444 	bus_space_write_4((sc)->sc_mem2_bt, (sc)->sc_mem2_bh,	\
445 			  (sc)->sc_cmd, (val))
446 #define CMD_READ_4(sc)		\
447 	bus_space_read_4((sc)->sc_mem2_bt, (sc)->sc_mem2_bh, (sc)->sc_cmd)
448 
449 /*
450  * acx command register layerout:
451  * upper 16bits are command execution status
452  * lower 16bits are command to be executed
453  */
454 #define ACX_CMD_STATUS_SHIFT	16
455 #define ACX_CMD_STATUS_OK	1
456 
457 struct radio_init {
458 	uint32_t	radio_ofs;	/* radio firmware offset */
459 	uint32_t	radio_len;	/* radio firmware length */
460 } __packed;
461 
462 struct bss_join_hdr {
463 	uint8_t		bssid[IEEE80211_ADDR_LEN];
464 	uint16_t	beacon_intvl;
465 	uint8_t		chip_spec[3];
466 	uint8_t		ndata_txrate;	/* see ACX_NDATA_TXRATE_ */
467 	uint8_t		ndata_txopt;	/* see ACX_NDATA_TXOPT_ */
468 	uint8_t		mode;		/* see ACX_MODE_ */
469 	uint8_t		channel;
470 	uint8_t		esslen;
471 	char		essid[1];
472 } __packed;
473 
474 /*
475  * non-data frame tx rate
476  */
477 #define ACX_NDATA_TXRATE_1		10	/* 1Mbits/s */
478 #define ACX_NDATA_TXRATE_2		20	/* 2Mbits/s */
479 
480 /*
481  * non-data frame tx options
482  */
483 #define ACX_NDATA_TXOPT_PBCC		0x40
484 #define ACX_NDATA_TXOPT_OFDM		0x20
485 #define ACX_NDATA_TXOPT_SHORT_PREAMBLE	0x10
486 
487 #define BSS_JOIN_BUFLEN		\
488 	(sizeof(struct bss_join_hdr) + IEEE80211_NWID_LEN - 1)
489 #define BSS_JOIN_PARAM_SIZE(bj)	\
490 	(sizeof(struct bss_join_hdr) + (bj)->esslen - 1)
491 
492 
493 #define PCIR_BAR(x)     (PCI_MAPS + (x) * 4)
494 
495 #endif	/* !_ACXREG_H */
496