xref: /freebsd-src/sys/dev/ipw/if_ipwvar.h (revision 71625ec9ad2a9bc8c09784fbd23b759830e0ee5f)
1ceaec73dSDamien Bergamini 
2ceaec73dSDamien Bergamini /*-
3*4d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
4718cf2ccSPedro F. Giffuni  *
584ca7670SDamien Bergamini  * Copyright (c) 2004-2006
6ceaec73dSDamien Bergamini  *      Damien Bergamini <damien.bergamini@free.fr>. All rights reserved.
7ceaec73dSDamien Bergamini  *
8ceaec73dSDamien Bergamini  * Redistribution and use in source and binary forms, with or without
9ceaec73dSDamien Bergamini  * modification, are permitted provided that the following conditions
10ceaec73dSDamien Bergamini  * are met:
11ceaec73dSDamien Bergamini  * 1. Redistributions of source code must retain the above copyright
12ceaec73dSDamien Bergamini  *    notice unmodified, this list of conditions, and the following
13ceaec73dSDamien Bergamini  *    disclaimer.
14ceaec73dSDamien Bergamini  * 2. Redistributions in binary form must reproduce the above copyright
15ceaec73dSDamien Bergamini  *    notice, this list of conditions and the following disclaimer in the
16ceaec73dSDamien Bergamini  *    documentation and/or other materials provided with the distribution.
17ceaec73dSDamien Bergamini  *
18ceaec73dSDamien Bergamini  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19ceaec73dSDamien Bergamini  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20ceaec73dSDamien Bergamini  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21ceaec73dSDamien Bergamini  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22ceaec73dSDamien Bergamini  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23ceaec73dSDamien Bergamini  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24ceaec73dSDamien Bergamini  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25ceaec73dSDamien Bergamini  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26ceaec73dSDamien Bergamini  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27ceaec73dSDamien Bergamini  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28ceaec73dSDamien Bergamini  * SUCH DAMAGE.
29ceaec73dSDamien Bergamini  */
30ceaec73dSDamien Bergamini 
31ceaec73dSDamien Bergamini #define IPW_MAX_NSEG	1
32ceaec73dSDamien Bergamini 
33ceaec73dSDamien Bergamini struct ipw_soft_bd {
34ceaec73dSDamien Bergamini 	struct ipw_bd	*bd;
35ceaec73dSDamien Bergamini 	int		type;
36ceaec73dSDamien Bergamini #define IPW_SBD_TYPE_NOASSOC	0
37ceaec73dSDamien Bergamini #define IPW_SBD_TYPE_COMMAND	1
38ceaec73dSDamien Bergamini #define IPW_SBD_TYPE_HEADER	2
39ceaec73dSDamien Bergamini #define IPW_SBD_TYPE_DATA	3
40ceaec73dSDamien Bergamini 	void		*priv;
41ceaec73dSDamien Bergamini };
42ceaec73dSDamien Bergamini 
43ceaec73dSDamien Bergamini struct ipw_soft_hdr {
44ceaec73dSDamien Bergamini 	struct ipw_hdr			hdr;
45ceaec73dSDamien Bergamini 	bus_dmamap_t			map;
46ceaec73dSDamien Bergamini 	SLIST_ENTRY(ipw_soft_hdr)	next;
47ceaec73dSDamien Bergamini };
48ceaec73dSDamien Bergamini 
49ceaec73dSDamien Bergamini struct ipw_soft_buf {
50ceaec73dSDamien Bergamini 	struct mbuf			*m;
51ceaec73dSDamien Bergamini 	struct ieee80211_node		*ni;
52ceaec73dSDamien Bergamini 	bus_dmamap_t			map;
53ceaec73dSDamien Bergamini 	SLIST_ENTRY(ipw_soft_buf)	next;
54ceaec73dSDamien Bergamini };
55ceaec73dSDamien Bergamini 
56ceaec73dSDamien Bergamini struct ipw_rx_radiotap_header {
57ceaec73dSDamien Bergamini 	struct ieee80211_radiotap_header wr_ihdr;
58ceaec73dSDamien Bergamini 	uint8_t		wr_flags;
59786ac703SAndriy Voskoboinyk 	uint8_t		wr_pad;
60ceaec73dSDamien Bergamini 	uint16_t	wr_chan_freq;
61ceaec73dSDamien Bergamini 	uint16_t	wr_chan_flags;
625463c4a4SSam Leffler 	int8_t		wr_antsignal;
635463c4a4SSam Leffler 	int8_t		wr_antnoise;
64786ac703SAndriy Voskoboinyk } __packed __aligned(8);
65ceaec73dSDamien Bergamini 
66ceaec73dSDamien Bergamini #define IPW_RX_RADIOTAP_PRESENT						\
67ceaec73dSDamien Bergamini 	((1 << IEEE80211_RADIOTAP_FLAGS) |				\
68ceaec73dSDamien Bergamini 	 (1 << IEEE80211_RADIOTAP_CHANNEL) |				\
695463c4a4SSam Leffler 	 (1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL) |			\
705463c4a4SSam Leffler 	 (1 << IEEE80211_RADIOTAP_DB_ANTNOISE))
71ceaec73dSDamien Bergamini 
72ceaec73dSDamien Bergamini struct ipw_tx_radiotap_header {
73ceaec73dSDamien Bergamini 	struct ieee80211_radiotap_header wt_ihdr;
74ceaec73dSDamien Bergamini 	uint8_t		wt_flags;
75786ac703SAndriy Voskoboinyk 	uint8_t		wt_pad;
76ceaec73dSDamien Bergamini 	uint16_t	wt_chan_freq;
77ceaec73dSDamien Bergamini 	uint16_t	wt_chan_flags;
78786ac703SAndriy Voskoboinyk } __packed;
79ceaec73dSDamien Bergamini 
80ceaec73dSDamien Bergamini #define IPW_TX_RADIOTAP_PRESENT						\
81ceaec73dSDamien Bergamini 	((1 << IEEE80211_RADIOTAP_FLAGS) |				\
82ceaec73dSDamien Bergamini 	 (1 << IEEE80211_RADIOTAP_CHANNEL))
83ceaec73dSDamien Bergamini 
84b032f27cSSam Leffler struct ipw_vap {
85b032f27cSSam Leffler 	struct ieee80211vap	vap;
86b032f27cSSam Leffler 
87b032f27cSSam Leffler 	int			(*newstate)(struct ieee80211vap *,
88b032f27cSSam Leffler 				    enum ieee80211_state, int);
89b032f27cSSam Leffler };
90b032f27cSSam Leffler #define	IPW_VAP(vap)	((struct ipw_vap *)(vap))
91b032f27cSSam Leffler 
92ceaec73dSDamien Bergamini struct ipw_softc {
937a79cebfSGleb Smirnoff 	struct ieee80211com		sc_ic;
947a79cebfSGleb Smirnoff 	struct mbufq			sc_snd;
95ceaec73dSDamien Bergamini 	device_t			sc_dev;
96ceaec73dSDamien Bergamini 
97ceaec73dSDamien Bergamini 	struct mtx			sc_mtx;
9884ca7670SDamien Bergamini 	struct task			sc_init_task;
9988d3b172SAndrew Thompson 	struct callout			sc_wdtimer;	/* watchdog timer */
100ceaec73dSDamien Bergamini 
101ceaec73dSDamien Bergamini 	uint32_t			flags;
102b032f27cSSam Leffler #define IPW_FLAG_FW_INITED		0x0001
103b032f27cSSam Leffler #define IPW_FLAG_INIT_LOCKED		0x0002
104b032f27cSSam Leffler #define IPW_FLAG_HAS_RADIO_SWITCH	0x0004
105b032f27cSSam Leffler #define	IPW_FLAG_HACK			0x0008
106b032f27cSSam Leffler #define	IPW_FLAG_SCANNING		0x0010
107b032f27cSSam Leffler #define	IPW_FLAG_ENABLED		0x0020
108b032f27cSSam Leffler #define	IPW_FLAG_BUSY			0x0040
109b032f27cSSam Leffler #define	IPW_FLAG_ASSOCIATING		0x0080
110b032f27cSSam Leffler #define	IPW_FLAG_ASSOCIATED		0x0100
1117a79cebfSGleb Smirnoff #define	IPW_FLAG_RUNNING		0x0200
112ceaec73dSDamien Bergamini 
113ceaec73dSDamien Bergamini 	struct resource			*irq;
114ceaec73dSDamien Bergamini 	struct resource			*mem;
115ceaec73dSDamien Bergamini 	bus_space_tag_t			sc_st;
116ceaec73dSDamien Bergamini 	bus_space_handle_t		sc_sh;
117ceaec73dSDamien Bergamini 	void 				*sc_ih;
11833d54970SLuigi Rizzo 	const struct firmware		*sc_firmware;
119ceaec73dSDamien Bergamini 
120ceaec73dSDamien Bergamini 	int				sc_tx_timer;
12188d3b172SAndrew Thompson 	int				sc_scan_timer;
122ceaec73dSDamien Bergamini 
12362ce43ccSScott Long 	bus_dma_tag_t			parent_dmat;
124ceaec73dSDamien Bergamini 	bus_dma_tag_t			tbd_dmat;
125ceaec73dSDamien Bergamini 	bus_dma_tag_t			rbd_dmat;
126ceaec73dSDamien Bergamini 	bus_dma_tag_t			status_dmat;
127ceaec73dSDamien Bergamini 	bus_dma_tag_t			cmd_dmat;
128ceaec73dSDamien Bergamini 	bus_dma_tag_t			hdr_dmat;
129ceaec73dSDamien Bergamini 	bus_dma_tag_t			txbuf_dmat;
130ceaec73dSDamien Bergamini 	bus_dma_tag_t			rxbuf_dmat;
131ceaec73dSDamien Bergamini 
132ceaec73dSDamien Bergamini 	bus_dmamap_t			tbd_map;
133ceaec73dSDamien Bergamini 	bus_dmamap_t			rbd_map;
134ceaec73dSDamien Bergamini 	bus_dmamap_t			status_map;
135ceaec73dSDamien Bergamini 	bus_dmamap_t			cmd_map;
136ceaec73dSDamien Bergamini 
137ceaec73dSDamien Bergamini 	bus_addr_t			tbd_phys;
138ceaec73dSDamien Bergamini 	bus_addr_t			rbd_phys;
139ceaec73dSDamien Bergamini 	bus_addr_t			status_phys;
140ceaec73dSDamien Bergamini 
141ceaec73dSDamien Bergamini 	struct ipw_bd			*tbd_list;
142ceaec73dSDamien Bergamini 	struct ipw_bd			*rbd_list;
143ceaec73dSDamien Bergamini 	struct ipw_status		*status_list;
144ceaec73dSDamien Bergamini 
145ceaec73dSDamien Bergamini 	struct ipw_cmd			cmd;
146ceaec73dSDamien Bergamini 	struct ipw_soft_bd		stbd_list[IPW_NTBD];
147ceaec73dSDamien Bergamini 	struct ipw_soft_buf		tx_sbuf_list[IPW_NDATA];
148ceaec73dSDamien Bergamini 	struct ipw_soft_hdr		shdr_list[IPW_NDATA];
149ceaec73dSDamien Bergamini 	struct ipw_soft_bd		srbd_list[IPW_NRBD];
150ceaec73dSDamien Bergamini 	struct ipw_soft_buf		rx_sbuf_list[IPW_NRBD];
151ceaec73dSDamien Bergamini 
152ceaec73dSDamien Bergamini 	SLIST_HEAD(, ipw_soft_hdr)	free_shdr;
153ceaec73dSDamien Bergamini 	SLIST_HEAD(, ipw_soft_buf)	free_sbuf;
154ceaec73dSDamien Bergamini 
155ceaec73dSDamien Bergamini 	uint32_t			table1_base;
156ceaec73dSDamien Bergamini 	uint32_t			table2_base;
157ceaec73dSDamien Bergamini 
158ceaec73dSDamien Bergamini 	uint32_t			txcur;
159ceaec73dSDamien Bergamini 	uint32_t			txold;
160ceaec73dSDamien Bergamini 	uint32_t			rxcur;
161ceaec73dSDamien Bergamini 	int				txfree;
162ceaec73dSDamien Bergamini 
1630587ad6bSAndriy Voskoboinyk 	uint16_t			chanmask;
1640587ad6bSAndriy Voskoboinyk 
165b032f27cSSam Leffler 	struct ipw_rx_radiotap_header	sc_rxtap;
166b032f27cSSam Leffler 	struct ipw_tx_radiotap_header	sc_txtap;
167ceaec73dSDamien Bergamini };
16888d3b172SAndrew Thompson 
16988d3b172SAndrew Thompson /*
17088d3b172SAndrew Thompson  * NB.: This models the only instance of async locking in ipw_init_locked
17188d3b172SAndrew Thompson  *	and must be kept in sync.
17288d3b172SAndrew Thompson  */
17382ff07c0SBernhard Schmidt #define IPW_LOCK(sc)		mtx_lock(&sc->sc_mtx);
17482ff07c0SBernhard Schmidt #define IPW_UNLOCK(sc)		mtx_unlock(&sc->sc_mtx);
17588d3b172SAndrew Thompson #define IPW_LOCK_ASSERT(sc)	mtx_assert(&(sc)->sc_mtx, MA_OWNED)
176