1*ef89f9e6Smpi /* $OpenBSD: pgtvar.h,v 1.17 2015/12/11 16:07:01 mpi Exp $ */
2a9b5e135Smglocker
3a9b5e135Smglocker /*
4a9b5e135Smglocker * Copyright (c) 2006 Claudio Jeker <claudio@openbsd.org>
5a9b5e135Smglocker * Copyright (c) 2006 Marcus Glocker <mglocker@openbsd.org>
6a9b5e135Smglocker *
7a9b5e135Smglocker * Permission to use, copy, modify, and distribute this software for any
8a9b5e135Smglocker * purpose with or without fee is hereby granted, provided that the above
9a9b5e135Smglocker * copyright notice and this permission notice appear in all copies.
10a9b5e135Smglocker *
11a9b5e135Smglocker * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12a9b5e135Smglocker * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13a9b5e135Smglocker * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14a9b5e135Smglocker * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15a9b5e135Smglocker * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16a9b5e135Smglocker * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17a9b5e135Smglocker * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18a9b5e135Smglocker */
19a9b5e135Smglocker
20a9b5e135Smglocker /*
21d98f2119Smglocker * Copyright (c) 2004 Fujitsu Laboratories of America, Inc.
22d98f2119Smglocker * Copyright (c) 2004 Brian Fundakowski Feldman
23d98f2119Smglocker * All rights reserved.
24d98f2119Smglocker *
25d98f2119Smglocker * Redistribution and use in source and binary forms, with or without
26d98f2119Smglocker * modification, are permitted provided that the following conditions
27d98f2119Smglocker * are met:
28d98f2119Smglocker * 1. Redistributions of source code must retain the above copyright
29d98f2119Smglocker * notice, this list of conditions and the following disclaimer.
30d98f2119Smglocker * 2. Redistributions in binary form must reproduce the above copyright
31d98f2119Smglocker * notice, this list of conditions and the following disclaimer in the
32d98f2119Smglocker * documentation and/or other materials provided with the distribution.
33d98f2119Smglocker *
34d98f2119Smglocker * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
35d98f2119Smglocker * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
36d98f2119Smglocker * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
37d98f2119Smglocker * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
38d98f2119Smglocker * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
39d98f2119Smglocker * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
40d98f2119Smglocker * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
41d98f2119Smglocker * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
42d98f2119Smglocker * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
43d98f2119Smglocker * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
44d98f2119Smglocker * SUCH DAMAGE.
45d98f2119Smglocker */
46d98f2119Smglocker
47a9b5e135Smglocker #ifndef __PGTVAR_H__
48a9b5e135Smglocker #define __PGTVAR_H__
49a9b5e135Smglocker
50a9b5e135Smglocker #define PGT_RX_RADIOTAP_PRESENT \
51a9b5e135Smglocker ((1 << IEEE80211_RADIOTAP_FLAGS) | \
52a9b5e135Smglocker (1 << IEEE80211_RADIOTAP_CHANNEL) | \
53a9b5e135Smglocker (1 << IEEE80211_RADIOTAP_RSSI))
54a9b5e135Smglocker
55a9b5e135Smglocker struct pgt_rx_radiotap_hdr {
56a9b5e135Smglocker struct ieee80211_radiotap_header wr_ihdr;
57a9b5e135Smglocker uint8_t wr_flags;
58a9b5e135Smglocker uint16_t wr_chan_freq;
59a9b5e135Smglocker uint16_t wr_chan_flags;
60a9b5e135Smglocker uint8_t wr_rssi;
61a9b5e135Smglocker uint8_t wr_max_rssi;
62a9b5e135Smglocker } __packed;
63a9b5e135Smglocker
64a9b5e135Smglocker #define PGT_TX_RADIOTAP_PRESENT \
65a9b5e135Smglocker ((1 << IEEE80211_RADIOTAP_FLAGS) | \
66a9b5e135Smglocker (1 << IEEE80211_RADIOTAP_RATE) | \
67a9b5e135Smglocker (1 << IEEE80211_RADIOTAP_CHANNEL))
68a9b5e135Smglocker
69a9b5e135Smglocker struct pgt_tx_radiotap_hdr {
70a9b5e135Smglocker struct ieee80211_radiotap_header wt_ihdr;
71a9b5e135Smglocker uint8_t wt_flags;
72a9b5e135Smglocker uint8_t wt_rate;
73a9b5e135Smglocker uint16_t wt_chan_freq;
74a9b5e135Smglocker uint16_t wt_chan_flags;
75a9b5e135Smglocker } __packed;
76a9b5e135Smglocker
77d98f2119Smglocker /*
78d98f2119Smglocker * The struct pgt_desc is used to either enqueue or dequeue pgt_frags
79d98f2119Smglocker * (packets) when either free or in flight.
80d98f2119Smglocker */
81d98f2119Smglocker struct pgt_desc {
82d98f2119Smglocker TAILQ_ENTRY(pgt_desc) pd_link;
83d1339dabSdhill caddr_t pd_mem;
84d98f2119Smglocker bus_addr_t pd_dmaaddr;
85d98f2119Smglocker bus_dmamap_t pd_dmam;
86d1aab4d9Smglocker bus_dma_segment_t pd_dmas;
87d98f2119Smglocker struct pgt_frag *pd_fragp;
88d98f2119Smglocker unsigned int pd_fragnum;
89d98f2119Smglocker };
90d98f2119Smglocker TAILQ_HEAD(pgt_descq, pgt_desc);
91d98f2119Smglocker
92d98f2119Smglocker /*
93d98f2119Smglocker * The struct pgt_mgmt_desc is used to enqueue a management request
94d98f2119Smglocker * and await response.
95d98f2119Smglocker */
96d98f2119Smglocker struct pgt_mgmt_desc {
97d98f2119Smglocker TAILQ_ENTRY(pgt_mgmt_desc) pmd_link;
98d98f2119Smglocker const void *pmd_sendbuf; /* NULL = get op */
99d98f2119Smglocker void *pmd_recvbuf; /* NULL = set op */
100d98f2119Smglocker size_t pmd_len;
101d98f2119Smglocker uint32_t pmd_oid;
102d98f2119Smglocker int pmd_error;
103d98f2119Smglocker };
104d98f2119Smglocker TAILQ_HEAD(pgt_mgmt_descq, pgt_mgmt_desc);
105d98f2119Smglocker
106d98f2119Smglocker /*
107d98f2119Smglocker * These events are put on the per-device kthread to be
108d98f2119Smglocker * able to trigger actions from inside the interrupt; as most
109d98f2119Smglocker * operations require waiting for another interrupt for response
110d98f2119Smglocker * (that is, management packets), this is common.
111d98f2119Smglocker */
112d98f2119Smglocker struct pgt_async_trap {
113d98f2119Smglocker TAILQ_ENTRY(pgt_async_trap) pa_link;
114d98f2119Smglocker struct mbuf *pa_mbuf;
115d98f2119Smglocker /* followed by the rest of the mbuf data */
116d98f2119Smglocker };
117d98f2119Smglocker
118d98f2119Smglocker struct pgt_ieee80211_node {
119d98f2119Smglocker struct ieee80211_node pin_node;
120d98f2119Smglocker enum pin_dot1x_authorization {
121d98f2119Smglocker PIN_DOT1X_UNAUTHORIZED,
122d98f2119Smglocker PIN_DOT1X_AUTHORIZED
123d98f2119Smglocker } pin_dot1x_auth_desired, pin_dot1x_auth;
124d98f2119Smglocker uint16_t pin_mlme_state;
125d98f2119Smglocker };
126d98f2119Smglocker
127d98f2119Smglocker struct pgt_softc {
128d98f2119Smglocker struct device sc_dev;
129d98f2119Smglocker struct ieee80211com sc_ic;
130d98f2119Smglocker unsigned int sc_flags;
131d98f2119Smglocker #define SC_NEEDS_FIRMWARE 0x00000001 /* do firmware upload on reset */
132d98f2119Smglocker #define SC_UNINITIALIZED 0x00000002 /* still awaiting initial intr */
133d98f2119Smglocker #define SC_DYING 0x00000004 /* going away */
134d98f2119Smglocker #define SC_NEEDS_RESET 0x00000008 /* going to reset when refcnt = 1 */
135d98f2119Smglocker #define SC_INTR_RESET 0x00000020 /* interrupt resets at end */
136d98f2119Smglocker #define SC_POWERSAVE 0x00000040 /* device is asleep */
137d98f2119Smglocker #define SC_NOFREE_ALLNODES 0x00000100 /* do not free assoc w/reinit */
138d98f2119Smglocker #define SC_START_DESIRED 0x00000200 /* tried to start during mgmt-crit */
139d98f2119Smglocker #define SC_KTHREAD 0x00000400 /* has a kthread around */
140def915ffSmglocker #define SC_ISL3877 0x00000800 /* chipset */
141a9b5e135Smglocker struct timeout sc_chanscan_timer;
142d98f2119Smglocker /* configuration sysctls */
143d98f2119Smglocker int sc_dot1x;
144d98f2119Smglocker int sc_wds;
145d98f2119Smglocker /* cached values */
146d98f2119Smglocker int sc_if_flags;
147d98f2119Smglocker int16_t sc_80211_ioc_wep;
148d98f2119Smglocker int16_t sc_80211_ioc_auth;
149d98f2119Smglocker uint32_t sc_noise;
150d98f2119Smglocker unsigned int sc_debug;
151d98f2119Smglocker #define SC_DEBUG_QUEUES 0x00000001
152d98f2119Smglocker #define SC_DEBUG_MGMT 0x00000002
153d98f2119Smglocker #define SC_DEBUG_UNEXPECTED 0x00000004
154d98f2119Smglocker #define SC_DEBUG_TRIGGER 0x00000008
155d98f2119Smglocker #define SC_DEBUG_EVENTS 0x00000010
156d98f2119Smglocker #define SC_DEBUG_POWER 0x00000020
157d98f2119Smglocker #define SC_DEBUG_TRAP 0x00000040
158d98f2119Smglocker #define SC_DEBUG_LINK 0x00000080
159d98f2119Smglocker #define SC_DEBUG_RXANNEX 0x00000100
160d98f2119Smglocker #define SC_DEBUG_RXFRAG 0x00000200
161d98f2119Smglocker #define SC_DEBUG_RXETHER 0x00000400
162d98f2119Smglocker bus_space_tag_t sc_iotag;
163d98f2119Smglocker bus_space_handle_t sc_iohandle;
164d1aab4d9Smglocker bus_dma_tag_t sc_dmat;
165a9b5e135Smglocker
166d98f2119Smglocker bus_dmamap_t sc_cbdmam;
167d1aab4d9Smglocker bus_dma_segment_t sc_cbdmas;
168d98f2119Smglocker struct pgt_control_block *sc_cb; /* DMA-mapped control block */
169a9b5e135Smglocker
170d98f2119Smglocker bus_dmamap_t sc_psmdmam;
171d1aab4d9Smglocker bus_dma_segment_t sc_psmdmas;
172d98f2119Smglocker void *sc_psmbuf; /* DMA-mapped psm frame area */
173a9b5e135Smglocker
174a9b5e135Smglocker int (*sc_newstate)
175a9b5e135Smglocker (struct ieee80211com *,
176a9b5e135Smglocker enum ieee80211_state, int);
177a9b5e135Smglocker
178c97a8095Smglocker int (*sc_enable)(struct pgt_softc *);
179c97a8095Smglocker void (*sc_disable)(struct pgt_softc *);
180c97a8095Smglocker void (*sc_power)(struct pgt_softc *, int);
181c97a8095Smglocker
182d98f2119Smglocker struct pgt_mgmt_descq sc_mgmtinprog;
183744a0745Smglocker struct pgt_descq sc_freeq[PGT_QUEUE_COUNT];
184744a0745Smglocker size_t sc_freeq_count[PGT_QUEUE_COUNT];
185744a0745Smglocker struct pgt_descq sc_dirtyq[PGT_QUEUE_COUNT];
186744a0745Smglocker size_t sc_dirtyq_count[PGT_QUEUE_COUNT];
187a9b5e135Smglocker int sc_txtimer;
188d98f2119Smglocker struct pgt_softc_kthread {
189d98f2119Smglocker struct proc *sck_proc;
190d98f2119Smglocker int sck_exit, sck_reset, sck_update;
191d98f2119Smglocker TAILQ_HEAD(, pgt_async_trap) sck_traps;
192d98f2119Smglocker } sc_kthread;
193a9b5e135Smglocker
194a9b5e135Smglocker #if NBPFILTER > 0
195a9b5e135Smglocker caddr_t sc_drvbpf;
196a9b5e135Smglocker
197a9b5e135Smglocker union {
198a9b5e135Smglocker struct pgt_rx_radiotap_hdr th;
199a9b5e135Smglocker uint8_t pad[64];
200a9b5e135Smglocker } sc_rxtapu;
201a9b5e135Smglocker #define sc_rxtap sc_rxtapu.th
202a9b5e135Smglocker int sc_rxtap_len;
203a9b5e135Smglocker
204a9b5e135Smglocker union {
205a9b5e135Smglocker struct pgt_tx_radiotap_hdr th;
206a9b5e135Smglocker uint8_t pad[64];
207a9b5e135Smglocker } sc_txtapu;
208a9b5e135Smglocker #define sc_txtap sc_txtapu.th
209a9b5e135Smglocker int sc_txtap_len;
210a9b5e135Smglocker #endif
211d98f2119Smglocker };
212d98f2119Smglocker
2130bd160c5Smglocker int pgt_intr(void *);
214*ef89f9e6Smpi void pgt_attach(struct device *);
215acd94ea6Smglocker int pgt_detach(struct pgt_softc *);
21600cfefb5Sderaadt int pgt_activate(struct device *, int);
217d98f2119Smglocker
218d98f2119Smglocker static __inline int
pgt_queue_is_rx(enum pgt_queue pq)219d98f2119Smglocker pgt_queue_is_rx(enum pgt_queue pq)
220d98f2119Smglocker {
221744a0745Smglocker return (pq == PGT_QUEUE_DATA_LOW_RX ||
222744a0745Smglocker pq == PGT_QUEUE_DATA_HIGH_RX ||
223744a0745Smglocker pq == PGT_QUEUE_MGMT_RX);
224d98f2119Smglocker }
225d98f2119Smglocker
226d98f2119Smglocker static __inline int
pgt_queue_is_tx(enum pgt_queue pq)227d98f2119Smglocker pgt_queue_is_tx(enum pgt_queue pq)
228d98f2119Smglocker {
229744a0745Smglocker return (pq == PGT_QUEUE_DATA_LOW_TX ||
230744a0745Smglocker pq == PGT_QUEUE_DATA_HIGH_TX ||
231744a0745Smglocker pq == PGT_QUEUE_MGMT_TX);
232d98f2119Smglocker }
233d98f2119Smglocker
234d98f2119Smglocker static __inline int
pgt_queue_is_data(enum pgt_queue pq)235d98f2119Smglocker pgt_queue_is_data(enum pgt_queue pq)
236d98f2119Smglocker {
237744a0745Smglocker return (pq == PGT_QUEUE_DATA_LOW_RX ||
238744a0745Smglocker pq == PGT_QUEUE_DATA_HIGH_RX ||
239744a0745Smglocker pq == PGT_QUEUE_DATA_LOW_TX ||
240744a0745Smglocker pq == PGT_QUEUE_DATA_HIGH_TX);
241d98f2119Smglocker }
242d98f2119Smglocker
243d98f2119Smglocker static __inline int
pgt_queue_is_mgmt(enum pgt_queue pq)244d98f2119Smglocker pgt_queue_is_mgmt(enum pgt_queue pq)
245d98f2119Smglocker {
246744a0745Smglocker return (pq == PGT_QUEUE_MGMT_RX ||
247744a0745Smglocker pq == PGT_QUEUE_MGMT_TX);
248d98f2119Smglocker }
249a9b5e135Smglocker
250a9b5e135Smglocker #endif
251