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