xref: /openbsd-src/sys/dev/ic/acxvar.h (revision f88d426de7612285734bb0af7939ca7d19db1c69)
1*f88d426dSjsg /*	$OpenBSD: acxvar.h,v 1.20 2024/05/29 01:11:53 jsg Exp $ */
295339239Smglocker 
395339239Smglocker /*
495339239Smglocker  * Copyright (c) 2006 Jonathan Gray <jsg@openbsd.org>
595339239Smglocker  *
695339239Smglocker  * Permission to use, copy, modify, and distribute this software for any
795339239Smglocker  * purpose with or without fee is hereby granted, provided that the above
895339239Smglocker  * copyright notice and this permission notice appear in all copies.
995339239Smglocker  *
1095339239Smglocker  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1195339239Smglocker  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1295339239Smglocker  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1395339239Smglocker  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1495339239Smglocker  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1595339239Smglocker  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1695339239Smglocker  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1795339239Smglocker  */
180f91cf57Smglocker 
190f91cf57Smglocker /*
200f91cf57Smglocker  * Copyright (c) 2006 The DragonFly Project.  All rights reserved.
210f91cf57Smglocker  *
220f91cf57Smglocker  * This code is derived from software contributed to The DragonFly Project
230f91cf57Smglocker  * by Sepherosa Ziehau <sepherosa@gmail.com>
240f91cf57Smglocker  *
250f91cf57Smglocker  * Redistribution and use in source and binary forms, with or without
260f91cf57Smglocker  * modification, are permitted provided that the following conditions
270f91cf57Smglocker  * are met:
280f91cf57Smglocker  *
290f91cf57Smglocker  * 1. Redistributions of source code must retain the above copyright
300f91cf57Smglocker  *    notice, this list of conditions and the following disclaimer.
310f91cf57Smglocker  * 2. Redistributions in binary form must reproduce the above copyright
320f91cf57Smglocker  *    notice, this list of conditions and the following disclaimer in
330f91cf57Smglocker  *    the documentation and/or other materials provided with the
340f91cf57Smglocker  *    distribution.
350f91cf57Smglocker  * 3. Neither the name of The DragonFly Project nor the names of its
360f91cf57Smglocker  *    contributors may be used to endorse or promote products derived
370f91cf57Smglocker  *    from this software without specific, prior written permission.
380f91cf57Smglocker  *
390f91cf57Smglocker  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
400f91cf57Smglocker  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
410f91cf57Smglocker  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
420f91cf57Smglocker  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
430f91cf57Smglocker  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
440f91cf57Smglocker  * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
450f91cf57Smglocker  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
460f91cf57Smglocker  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
470f91cf57Smglocker  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
480f91cf57Smglocker  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
490f91cf57Smglocker  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
500f91cf57Smglocker  * SUCH DAMAGE.
510f91cf57Smglocker  */
520f91cf57Smglocker 
530f91cf57Smglocker #ifndef _IF_ACXVAR_H
540f91cf57Smglocker #define _IF_ACXVAR_H
550f91cf57Smglocker 
560f91cf57Smglocker #ifdef ACX_DEBUG
570f91cf57Smglocker extern int acxdebug;
580f91cf57Smglocker #define DPRINTF(x)      do { if (acxdebug) printf x; } while (0)
590f91cf57Smglocker #define DPRINTFN(n,x)   do { if (acxdebug >= (n)) printf x; } while (0)
600f91cf57Smglocker #else
610f91cf57Smglocker #define DPRINTF(x)
620f91cf57Smglocker #define DPRINTFN(n,x)
630f91cf57Smglocker #endif
640f91cf57Smglocker 
650f91cf57Smglocker #define ACX_FRAME_HDRLEN	sizeof(struct ieee80211_frame)
660f91cf57Smglocker #define ACX_MEMBLOCK_SIZE	256
670f91cf57Smglocker 
680f91cf57Smglocker #define ACX_TX_DESC_CNT		16
690f91cf57Smglocker #define ACX_RX_DESC_CNT		16
700f91cf57Smglocker 
710f91cf57Smglocker #define ACX_TX_RING_SIZE	\
720f91cf57Smglocker 	(2 * ACX_TX_DESC_CNT * sizeof(struct acx_host_desc))
730f91cf57Smglocker #define ACX_RX_RING_SIZE	\
740f91cf57Smglocker 	(ACX_RX_DESC_CNT * sizeof(struct acx_host_desc))
750f91cf57Smglocker 
760f91cf57Smglocker #define CSR_READ_1(sc, reg)					\
770f91cf57Smglocker 	bus_space_read_1((sc)->sc_mem1_bt, (sc)->sc_mem1_bh,	\
780f91cf57Smglocker 			 (sc)->chip_ioreg[(reg)])
790f91cf57Smglocker #define CSR_READ_2(sc, reg)					\
800f91cf57Smglocker 	bus_space_read_2((sc)->sc_mem1_bt, (sc)->sc_mem1_bh,	\
810f91cf57Smglocker 			 (sc)->chip_ioreg[(reg)])
820f91cf57Smglocker #define CSR_READ_4(sc, reg)					\
830f91cf57Smglocker 	bus_space_read_4((sc)->sc_mem1_bt, (sc)->sc_mem1_bh,	\
840f91cf57Smglocker 			 (sc)->chip_ioreg[(reg)])
850f91cf57Smglocker 
860f91cf57Smglocker #define CSR_WRITE_2(sc, reg, val)				\
870f91cf57Smglocker 	bus_space_write_2((sc)->sc_mem1_bt, (sc)->sc_mem1_bh,	\
880f91cf57Smglocker 			  (sc)->chip_ioreg[(reg)], val)
890f91cf57Smglocker #define CSR_WRITE_4(sc, reg, val)				\
900f91cf57Smglocker 	bus_space_write_4((sc)->sc_mem1_bt, (sc)->sc_mem1_bh,	\
910f91cf57Smglocker 			  (sc)->chip_ioreg[(reg)], val)
920f91cf57Smglocker 
930f91cf57Smglocker #define CSR_SETB_2(sc, reg, b)		\
940f91cf57Smglocker 	CSR_WRITE_2((sc), (reg), CSR_READ_2((sc), (reg)) | (b))
950f91cf57Smglocker #define CSR_CLRB_2(sc, reg, b)		\
960f91cf57Smglocker 	CSR_WRITE_2((sc), (reg), CSR_READ_2((sc), (reg)) & (~(b)))
970f91cf57Smglocker 
980f91cf57Smglocker #define DESC_WRITE_REGION_1(sc, off, d, dlen)				\
990f91cf57Smglocker 	bus_space_write_region_1((sc)->sc_mem2_bt, (sc)->sc_mem2_bh,	\
1000f91cf57Smglocker 				 (off),	(const uint8_t *)(d), (dlen))
1010f91cf57Smglocker 
1020f91cf57Smglocker #define FW_TXDESC_SETFIELD_1(sc, mb, field, val)		\
103280ea4a5Sclaudio 	bus_space_write_1((sc)->sc_mem2_bt, (sc)->sc_mem2_bh,	\
104280ea4a5Sclaudio 	    (mb)->tb_fwdesc_ofs + offsetof(struct acx_fw_txdesc, field), (val))
1050f91cf57Smglocker #define FW_TXDESC_SETFIELD_2(sc, mb, field, val)		\
106280ea4a5Sclaudio 	bus_space_write_2((sc)->sc_mem2_bt, (sc)->sc_mem2_bh,	\
107280ea4a5Sclaudio 	    (mb)->tb_fwdesc_ofs + offsetof(struct acx_fw_txdesc, field), (val))
1080f91cf57Smglocker #define FW_TXDESC_SETFIELD_4(sc, mb, field, val)	\
109280ea4a5Sclaudio 	bus_space_write_4((sc)->sc_mem2_bt, (sc)->sc_mem2_bh,	\
110280ea4a5Sclaudio 	    (mb)->tb_fwdesc_ofs + offsetof(struct acx_fw_txdesc, field), (val))
1110f91cf57Smglocker 
1120f91cf57Smglocker #define FW_TXDESC_GETFIELD_1(sc, mb, field)			\
113280ea4a5Sclaudio 	bus_space_read_1((sc)->sc_mem2_bt, (sc)->sc_mem2_bh,	\
114280ea4a5Sclaudio 	    (mb)->tb_fwdesc_ofs + offsetof(struct acx_fw_txdesc, field))
1150f91cf57Smglocker 
1160f91cf57Smglocker /*
1170f91cf57Smglocker  * Firmware TX descriptor
1180f91cf57Smglocker  * Fields are little endian
1190f91cf57Smglocker  */
1200f91cf57Smglocker struct acx_fw_txdesc {
1210f91cf57Smglocker 	uint32_t	f_tx_next_desc;	/* next acx_fw_txdesc phyaddr */
1220f91cf57Smglocker 	uint32_t	f_tx_host_desc;	/* acx_host_desc phyaddr */
1230f91cf57Smglocker 	uint32_t	f_tx_acx_ptr;
1240f91cf57Smglocker 	uint32_t	f_tx_time;
1250f91cf57Smglocker 	uint16_t	f_tx_len;
1260f91cf57Smglocker 	uint16_t	f_tx_reserved;
1270f91cf57Smglocker 
1280f91cf57Smglocker 	uint32_t	f_tx_dev_spec[4];
1290f91cf57Smglocker 
1300f91cf57Smglocker 	uint8_t		f_tx_ctrl;	/* see DESC_CTRL_ */
1310f91cf57Smglocker 	uint8_t		f_tx_ctrl2;
1320f91cf57Smglocker 	uint8_t		f_tx_error;	/* see DESC_ERR_ */
1330f91cf57Smglocker 	uint8_t		f_tx_ack_fail;
1340f91cf57Smglocker 	uint8_t		f_tx_rts_fail;
1350f91cf57Smglocker 	uint8_t		f_tx_rts_ok;
1360f91cf57Smglocker 
1370f91cf57Smglocker 	/* XXX should be moved to chip specific file */
1380f91cf57Smglocker 	union {
1390f91cf57Smglocker 		struct {
1400f91cf57Smglocker 			uint8_t		rate100;	/* acx100 tx rate */
1410f91cf57Smglocker 			uint8_t		queue_ctrl;
1420f91cf57Smglocker 		} __packed r1;
1430f91cf57Smglocker 		struct {
1440f91cf57Smglocker 			uint16_t	rate111;	/* acx111 tx rate */
1450f91cf57Smglocker 		} __packed r2;
1460f91cf57Smglocker 	} u;
1470f91cf57Smglocker #define f_tx_rate100	u.r1.rate100
1480f91cf57Smglocker #define f_tx_queue_ctrl	u.r1.queue_ctrl
1490f91cf57Smglocker #define f_tx_rate111	u.r2.rate111
1500f91cf57Smglocker 	uint32_t	f_tx_queue_info;
1510f91cf57Smglocker } __packed;
1520f91cf57Smglocker 
1530f91cf57Smglocker /*
1540f91cf57Smglocker  * Firmware RX descriptor
1550f91cf57Smglocker  * Fields are little endian
1560f91cf57Smglocker  */
1570f91cf57Smglocker struct acx_fw_rxdesc {
1580f91cf57Smglocker 	uint32_t	f_rx_next_desc;	/* next acx_fw_rxdesc phyaddr */
1590f91cf57Smglocker 	uint32_t	f_rx_host_desc;	/* acx_host_desc phyaddr */
1600f91cf57Smglocker 	uint32_t	f_rx_acx_ptr;
1610f91cf57Smglocker 	uint32_t	f_rx_time;
1620f91cf57Smglocker 	uint16_t	f_rx_len;
1630f91cf57Smglocker 	uint16_t	f_rx_wep_len;
1640f91cf57Smglocker 	uint32_t	f_rx_wep_ofs;
1650f91cf57Smglocker 
1660f91cf57Smglocker 	uint8_t		f_rx_dev_spec[16];
1670f91cf57Smglocker 
1680f91cf57Smglocker 	uint8_t		f_rx_ctrl;	/* see DESC_CTRL_ */
1690f91cf57Smglocker 	uint8_t		f_rx_rate;
1700f91cf57Smglocker 	uint8_t		f_rx_error;
1710f91cf57Smglocker 	uint8_t		f_rx_snr;	/* signal noise ratio */
1720f91cf57Smglocker 	uint8_t		f_rx_level;
1730f91cf57Smglocker 	uint8_t		f_rx_queue_ctrl;
1740f91cf57Smglocker 	uint16_t	f_rx_unknown0;
1750f91cf57Smglocker 	uint32_t	f_rx_unknown1;
1760f91cf57Smglocker } __packed;
1770f91cf57Smglocker 
1780f91cf57Smglocker /*
1790f91cf57Smglocker  * Host TX/RX descriptor
1800f91cf57Smglocker  * Fields are little endian
1810f91cf57Smglocker  */
1820f91cf57Smglocker struct acx_host_desc {
1830f91cf57Smglocker 	uint32_t	h_data_paddr;	/* data phyaddr */
1840f91cf57Smglocker 	uint16_t	h_data_ofs;
1850f91cf57Smglocker 	uint16_t	h_reserved;
1860f91cf57Smglocker 	uint16_t	h_ctrl;		/* see DESC_CTRL_ */
1870f91cf57Smglocker 	uint16_t	h_data_len;	/* data length */
1880f91cf57Smglocker 	uint32_t	h_next_desc;	/* next acx_host_desc phyaddr */
1890f91cf57Smglocker 	uint32_t	h_pnext;
1900f91cf57Smglocker 	uint32_t	h_status;	/* see DESC_STATUS_ */
1910f91cf57Smglocker } __packed;
1920f91cf57Smglocker 
1930f91cf57Smglocker #define DESC_STATUS_FULL		0x80000000
1940f91cf57Smglocker 
1950f91cf57Smglocker #define DESC_CTRL_SHORT_PREAMBLE	0x01
1960f91cf57Smglocker #define DESC_CTRL_FIRST_FRAG		0x02
1970f91cf57Smglocker #define DESC_CTRL_AUTODMA		0x04
1980f91cf57Smglocker #define DESC_CTRL_RECLAIM		0x08
1990f91cf57Smglocker #define DESC_CTRL_HOSTDONE		0x20	/* host finished buf proc */
2000f91cf57Smglocker #define DESC_CTRL_ACXDONE		0x40	/* chip finished buf proc */
2010f91cf57Smglocker #define DESC_CTRL_HOSTOWN		0x80	/* host controls desc */
2020f91cf57Smglocker 
2030f91cf57Smglocker #define DESC_ERR_OTHER_FRAG		0x01
2040f91cf57Smglocker #define DESC_ERR_ABORT			0x02
2050f91cf57Smglocker #define DESC_ERR_PARAM			0x04
2060f91cf57Smglocker #define DESC_ERR_NO_WEPKEY		0x08
2070f91cf57Smglocker #define DESC_ERR_MSDU_TIMEOUT		0x10
2080f91cf57Smglocker #define DESC_ERR_EXCESSIVE_RETRY	0x20
2090f91cf57Smglocker #define DESC_ERR_BUF_OVERFLOW		0x40
2100f91cf57Smglocker #define DESC_ERR_DMA			0x80
2110f91cf57Smglocker 
2120f91cf57Smglocker /*
2130f91cf57Smglocker  * Extra header in receiving buffer
2140f91cf57Smglocker  * Fields are little endian
2150f91cf57Smglocker  */
2160f91cf57Smglocker struct acx_rxbuf_hdr {
2170f91cf57Smglocker 	uint16_t	rbh_len;	/* ACX_RXBUG_LEN_MASK part is len */
2180f91cf57Smglocker 	uint8_t		rbh_memblk_cnt;
2190f91cf57Smglocker 	uint8_t		rbh_status;
2200f91cf57Smglocker 	uint8_t		rbh_stat_baseband; /* see ACX_RXBUF_STAT_ */
2210f91cf57Smglocker 	uint8_t		rbh_plcp;
2220f91cf57Smglocker 	uint8_t		rbh_level;	/* signal level */
2230f91cf57Smglocker 	uint8_t		rbh_snr;	/* signal noise ratio */
2240f91cf57Smglocker 	uint32_t	rbh_time;	/* recv timestamp */
2250f91cf57Smglocker 
2260f91cf57Smglocker 	/*
2270f91cf57Smglocker 	 * XXX may have 4~8 byte here which
2280f91cf57Smglocker 	 * depends on firmware version
2290f91cf57Smglocker 	 */
2300f91cf57Smglocker } __packed;
2310f91cf57Smglocker 
2320f91cf57Smglocker #define ACX_RXBUF_LEN_MASK	0xfff
2330f91cf57Smglocker #define ACX_RXBUF_STAT_LNA	0x80	/* low noise amplifier */
2340f91cf57Smglocker 
2350f91cf57Smglocker struct acx_ring_data {
2360f91cf57Smglocker 	struct acx_host_desc	*rx_ring;
2370f91cf57Smglocker 	bus_dma_segment_t	rx_ring_seg;
2380f91cf57Smglocker 	bus_dmamap_t		rx_ring_dmamap;
2390f91cf57Smglocker 	uint32_t		rx_ring_paddr;
2400f91cf57Smglocker 
2410f91cf57Smglocker 	struct acx_host_desc	*tx_ring;
2420f91cf57Smglocker 	bus_dma_segment_t	tx_ring_seg;
2430f91cf57Smglocker 	bus_dmamap_t		tx_ring_dmamap;
2440f91cf57Smglocker 	uint32_t		tx_ring_paddr;
2450f91cf57Smglocker };
2460f91cf57Smglocker 
2470f91cf57Smglocker struct acx_txbuf {
2480f91cf57Smglocker 	struct mbuf		*tb_mbuf;
2490f91cf57Smglocker 	bus_dmamap_t		tb_mbuf_dmamap;
2500f91cf57Smglocker 
2510f91cf57Smglocker 	struct acx_host_desc	*tb_desc1;
2520f91cf57Smglocker 	struct acx_host_desc	*tb_desc2;
2530f91cf57Smglocker 
2540f91cf57Smglocker 	uint32_t		tb_fwdesc_ofs;
2550f91cf57Smglocker 
2560f91cf57Smglocker 	/*
2570f91cf57Smglocker 	 * Used by tx rate updating
2580f91cf57Smglocker 	 */
2590f91cf57Smglocker 	struct acx_node		*tb_node;	/* remote node */
2600f91cf57Smglocker 	int			tb_rate;	/* current tx rate */
2610f91cf57Smglocker };
2620f91cf57Smglocker 
2630f91cf57Smglocker struct acx_rxbuf {
2640f91cf57Smglocker 	struct mbuf		*rb_mbuf;
2650f91cf57Smglocker 	bus_dmamap_t		rb_mbuf_dmamap;
2660f91cf57Smglocker 
2670f91cf57Smglocker 	struct acx_host_desc	*rb_desc;
2680f91cf57Smglocker };
2690f91cf57Smglocker 
2700f91cf57Smglocker struct acx_buf_data {
2710f91cf57Smglocker 	struct acx_rxbuf	rx_buf[ACX_RX_DESC_CNT];
2720f91cf57Smglocker 	struct acx_txbuf	tx_buf[ACX_TX_DESC_CNT];
2730f91cf57Smglocker 	bus_dmamap_t		mbuf_tmp_dmamap;
2740f91cf57Smglocker 
2750f91cf57Smglocker 	int			rx_scan_start;
2760f91cf57Smglocker 
2770f91cf57Smglocker 	int			tx_free_start;
2780f91cf57Smglocker 	int			tx_used_start;
2790f91cf57Smglocker 	int			tx_used_count;
2800f91cf57Smglocker };
2810f91cf57Smglocker 
2820f91cf57Smglocker struct acx_node {
283960b9804Smglocker 	struct ieee80211_node		ni;	/* must be first */
284960b9804Smglocker 	struct ieee80211_amrr_node	amn;
2850f91cf57Smglocker };
2860f91cf57Smglocker 
2870f91cf57Smglocker struct acx_config {
2880f91cf57Smglocker 	uint8_t	antenna;
2890f91cf57Smglocker 	uint8_t	regdom;
2900f91cf57Smglocker 	uint8_t	cca_mode;	/* acx100 */
2910f91cf57Smglocker 	uint8_t	ed_thresh;	/* acx100 */
2920f91cf57Smglocker };
2930f91cf57Smglocker 
2940f91cf57Smglocker struct acx_stats {
2950f91cf57Smglocker 	uint64_t	err_oth_frag;	/* XXX error in other frag?? */
2960f91cf57Smglocker 	uint64_t	err_abort;	/* tx abortion */
2970f91cf57Smglocker 	uint64_t	err_param;	/* tx desc contains invalid param */
2980f91cf57Smglocker 	uint64_t	err_no_wepkey;	/* no WEP key exists */
2990f91cf57Smglocker 	uint64_t	err_msdu_timeout; /* MSDU timed out */
3000f91cf57Smglocker 	uint64_t	err_ex_retry;	/* excessive tx retry */
3010f91cf57Smglocker 	uint64_t	err_buf_oflow;	/* buffer overflow */
3020f91cf57Smglocker 	uint64_t	err_dma;	/* DMA error */
3030f91cf57Smglocker 	uint64_t	err_unkn;	/* XXX unknown error */
3040f91cf57Smglocker };
3050f91cf57Smglocker 
306172cbfceSmglocker #define ACX_RX_RADIOTAP_PRESENT						\
307172cbfceSmglocker 	((1 << IEEE80211_RADIOTAP_FLAGS) |				\
308172cbfceSmglocker 	 (1 << IEEE80211_RADIOTAP_CHANNEL) |				\
309172cbfceSmglocker 	 (1 << IEEE80211_RADIOTAP_RSSI))
310172cbfceSmglocker 
311172cbfceSmglocker struct acx_rx_radiotap_hdr {
312172cbfceSmglocker 	struct ieee80211_radiotap_header	wr_ihdr;
313172cbfceSmglocker 	uint8_t					wr_flags;
314172cbfceSmglocker 	uint16_t				wr_chan_freq;
315172cbfceSmglocker 	uint16_t				wr_chan_flags;
316172cbfceSmglocker 	uint8_t					wr_rssi;
317172cbfceSmglocker 	uint8_t					wr_max_rssi;
318172cbfceSmglocker } __packed;
319172cbfceSmglocker 
320172cbfceSmglocker #define ACX_TX_RADIOTAP_PRESENT						\
321172cbfceSmglocker 	((1 << IEEE80211_RADIOTAP_FLAGS) |				\
322172cbfceSmglocker 	 (1 << IEEE80211_RADIOTAP_RATE) |				\
323172cbfceSmglocker 	 (1 << IEEE80211_RADIOTAP_CHANNEL))				\
324172cbfceSmglocker 
325172cbfceSmglocker struct acx_tx_radiotap_hdr {
326172cbfceSmglocker 	struct ieee80211_radiotap_header	wt_ihdr;
327172cbfceSmglocker 	uint8_t					wt_flags;
328172cbfceSmglocker 	uint8_t					wt_rate;
329172cbfceSmglocker 	uint16_t				wt_chan_freq;
330172cbfceSmglocker 	uint16_t				wt_chan_flags;
331172cbfceSmglocker } __packed;
332172cbfceSmglocker 
3330f91cf57Smglocker struct acx_softc {
3340f91cf57Smglocker 	/*
3350f91cf57Smglocker 	 * sc_xxx are filled in by common code
3360f91cf57Smglocker 	 * chip_xxx are filled in by chip specific code
3370f91cf57Smglocker 	 */
3380f91cf57Smglocker 	struct device		sc_dev;
3390f91cf57Smglocker 	struct ieee80211com	sc_ic;
3400f91cf57Smglocker 
3410f91cf57Smglocker 	struct timeout		sc_chanscan_timer;
3420f91cf57Smglocker 	uint32_t		sc_flags;	/* see ACX_FLAG_ */
3430f91cf57Smglocker 
3440f91cf57Smglocker 	uint32_t		sc_firmware_ver;
3450f91cf57Smglocker 	uint32_t		sc_hardware_id;
3460f91cf57Smglocker 
3470f91cf57Smglocker 	bus_dma_tag_t		sc_dmat;
3480f91cf57Smglocker 
349960b9804Smglocker 	struct ieee80211_amrr	amrr;
350960b9804Smglocker 	struct timeout		amrr_ch;
351960b9804Smglocker 
3520f91cf57Smglocker 	/*
3530f91cf57Smglocker 	 * MMIO 1
3540f91cf57Smglocker 	 */
3550f91cf57Smglocker 	bus_space_tag_t		sc_mem1_bt;
3560f91cf57Smglocker 	bus_space_handle_t	sc_mem1_bh;
3570f91cf57Smglocker 	int			chip_mem1_rid;
3580f91cf57Smglocker 
3590f91cf57Smglocker 	/*
3600f91cf57Smglocker 	 * MMIO 2
3610f91cf57Smglocker 	 */
3620f91cf57Smglocker 	bus_space_tag_t		sc_mem2_bt;
3630f91cf57Smglocker 	bus_space_handle_t	sc_mem2_bh;
3640f91cf57Smglocker 	int			chip_mem2_rid;
3650f91cf57Smglocker 
3660f91cf57Smglocker 	int			(*sc_enable)(struct acx_softc *);
3670f91cf57Smglocker 	void			(*sc_disable)(struct acx_softc *);
3680f91cf57Smglocker 	void			(*sc_power)(struct acx_softc *, int);
3690f91cf57Smglocker 
3700f91cf57Smglocker 	uint32_t		sc_cmd;		/* cmd reg (MMIO 2) */
3710f91cf57Smglocker 	uint32_t		sc_cmd_param;	/* cmd param reg (MMIO 2) */
3720f91cf57Smglocker 	uint32_t		sc_info;	/* unused */
3730f91cf57Smglocker 	uint32_t		sc_info_param;	/* unused */
3740f91cf57Smglocker 
3750f91cf57Smglocker 	const uint16_t		*chip_ioreg;	/* reg map (MMIO 1) */
3760f91cf57Smglocker 
3770f91cf57Smglocker 	/*
3780f91cf57Smglocker 	 * NOTE:
3790f91cf57Smglocker 	 * chip_intr_enable is not necessarily same as
3800f91cf57Smglocker 	 * ~chip_intr_disable
3810f91cf57Smglocker 	 */
3820f91cf57Smglocker 	uint16_t		chip_intr_enable;
3830f91cf57Smglocker 	uint16_t		chip_intr_disable;
3840f91cf57Smglocker 
3850f91cf57Smglocker 	int			chip_hw_crypt;
3860f91cf57Smglocker 	uint16_t		chip_gpio_pled;	/* power led */
3870f91cf57Smglocker 	uint16_t		chip_chan_flags; /* see IEEE80211_CHAN_ */
3880f91cf57Smglocker 	uint16_t		chip_txdesc1_len;
3890f91cf57Smglocker 	int			chip_rxbuf_exhdr; /* based on fw ver */
3900f91cf57Smglocker 	uint32_t		chip_ee_eaddr_ofs;
3910f91cf57Smglocker 	enum ieee80211_phymode	chip_phymode;	/* see IEEE80211_MODE_ */
3920f91cf57Smglocker 	uint8_t			chip_fw_txdesc_ctrl;
3930f91cf57Smglocker 
3940f91cf57Smglocker 	uint8_t			sc_eeprom_ver;	/* unused */
3950f91cf57Smglocker 	uint8_t			sc_form_factor;	/* unused */
3960f91cf57Smglocker 	uint8_t			sc_radio_type;	/* see ACX_RADIO_TYPE_ */
3970f91cf57Smglocker 
3980f91cf57Smglocker 	struct acx_ring_data	sc_ring_data;
3990f91cf57Smglocker 	struct acx_buf_data	sc_buf_data;
4000f91cf57Smglocker 
4010f91cf57Smglocker 	struct acx_stats	sc_stats;	/* statistics */
4020f91cf57Smglocker 
4030f91cf57Smglocker 	/*
4040f91cf57Smglocker 	 * Per interface sysctl variables
4050f91cf57Smglocker 	 */
40652d2b7e2Smglocker 	int			sc_txtimer;
4070f91cf57Smglocker 	int			sc_long_retry_limit;
4080f91cf57Smglocker 	int			sc_short_retry_limit;
4090f91cf57Smglocker 	int			sc_msdu_lifetime;
4100f91cf57Smglocker 
4110f91cf57Smglocker 	int			(*sc_newstate)
4120f91cf57Smglocker 				(struct ieee80211com *,
4130f91cf57Smglocker 				 enum ieee80211_state, int);
4140f91cf57Smglocker 
4150f91cf57Smglocker 	int			(*chip_init)		/* non-NULL */
4160f91cf57Smglocker 				(struct acx_softc *);
4170f91cf57Smglocker 
4180f91cf57Smglocker 	int			(*chip_set_wepkey)
4190f91cf57Smglocker 				(struct acx_softc *,
42083da4af0Sdamien 				 struct ieee80211_key *, int);
4210f91cf57Smglocker 
4220f91cf57Smglocker 	int			(*chip_read_config)
4230f91cf57Smglocker 				(struct acx_softc *, struct acx_config *);
4240f91cf57Smglocker 
4250f91cf57Smglocker 	int			(*chip_write_config)
4260f91cf57Smglocker 				(struct acx_softc *, struct acx_config *);
4270f91cf57Smglocker 
4280f91cf57Smglocker 	void			(*chip_set_fw_txdesc_rate) /* non-NULL */
4290f91cf57Smglocker 				(struct acx_softc *, struct acx_txbuf *, int);
4300f91cf57Smglocker 
4310f91cf57Smglocker 	void			(*chip_set_bss_join_param) /* non-NULL */
4320f91cf57Smglocker 				(struct acx_softc *, void *, int);
4330f91cf57Smglocker 
4340f91cf57Smglocker 	void			(*chip_proc_wep_rxbuf)
4350f91cf57Smglocker 				(struct acx_softc *, struct mbuf *, int *);
436172cbfceSmglocker 
437172cbfceSmglocker #if NBPFILTER > 0
438172cbfceSmglocker 	caddr_t			sc_drvbpf;
439172cbfceSmglocker 
440172cbfceSmglocker 	union {
441172cbfceSmglocker 		struct acx_rx_radiotap_hdr th;
442172cbfceSmglocker 		uint8_t pad[64];
443172cbfceSmglocker 	}			sc_rxtapu;
444172cbfceSmglocker #define sc_rxtap		sc_rxtapu.th
445172cbfceSmglocker 	int			sc_rxtap_len;
446172cbfceSmglocker 
447172cbfceSmglocker 	union {
448172cbfceSmglocker 		struct acx_tx_radiotap_hdr th;
449172cbfceSmglocker 		uint8_t pad[64];
450172cbfceSmglocker 	}			sc_txtapu;
451172cbfceSmglocker #define sc_txtap		sc_txtapu.th
452172cbfceSmglocker 	int			sc_txtap_len;
453172cbfceSmglocker #endif
4540f91cf57Smglocker };
4550f91cf57Smglocker 
4565f0637dbSjsg #define ACX_FLAG_FW_LOADED	0x01
4575f0637dbSjsg #define ACX_FLAG_ACX111		0x02
4580f91cf57Smglocker 
4590f91cf57Smglocker #define ACX_RADIO_TYPE_MAXIM	0x0d
4600f91cf57Smglocker #define ACX_RADIO_TYPE_RFMD	0x11
4610f91cf57Smglocker #define ACX_RADIO_TYPE_RALINK	0x15
4620f91cf57Smglocker #define ACX_RADIO_TYPE_RADIA	0x16
4630f91cf57Smglocker #define ACX_RADIO_TYPE_UNKN17	0x17
4640f91cf57Smglocker #define ACX_RADIO_TYPE_UNKN19	0x19
4650f91cf57Smglocker 
4668dc7d017Smglocker #define ACX_RADIO_RSSI_MAXIM	120	/* 100dB */
4678dc7d017Smglocker #define ACX_RADIO_RSSI_RFMD	215	/* 215dB */
4688dc7d017Smglocker #define ACX_RADIO_RSSI_RALINK	0	/* XXX unknown yet */
4698dc7d017Smglocker #define ACX_RADIO_RSSI_RADIA	78	/* 78db */
4708dc7d017Smglocker #define ACX_RADIO_RSSI_UNKN	0	/* unknown radio */
4718dc7d017Smglocker 
4720f91cf57Smglocker extern int				acx_beacon_intvl;
4730f91cf57Smglocker 
4740f91cf57Smglocker void	acx100_set_param(struct acx_softc *);
4750f91cf57Smglocker void	acx111_set_param(struct acx_softc *);
4760f91cf57Smglocker 
4770f91cf57Smglocker int	acx_init_tmplt_ordered(struct acx_softc *);
4780f91cf57Smglocker void	acx_write_phyreg(struct acx_softc *, uint32_t, uint8_t);
4790f91cf57Smglocker 
4800f91cf57Smglocker int	acx_set_tmplt(struct acx_softc *, uint16_t, void *, uint16_t);
4810f91cf57Smglocker int	acx_get_conf(struct acx_softc *, uint16_t, void *, uint16_t);
4820f91cf57Smglocker int	acx_set_conf(struct acx_softc *, uint16_t, void *, uint16_t);
4830f91cf57Smglocker int	acx_exec_command(struct acx_softc *, uint16_t, void *, uint16_t,
4840f91cf57Smglocker 	    void *, uint16_t);
4850f91cf57Smglocker int	acx_attach(struct acx_softc *);
4860f91cf57Smglocker int	acx_detach(void *);
4870f91cf57Smglocker int	acx_intr(void *);
4880f91cf57Smglocker 
4890f91cf57Smglocker #endif	/* !_IF_ACXVAR_H */
490