FreeBSD/Linux Kernel Cross Reference
sys/dev/ic/acxvar.h
1 /* $OpenBSD: acxvar.h,v 1.19 2008/07/21 04:12:21 kevlo 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 _IF_ACXVAR_H
54 #define _IF_ACXVAR_H
55
56 #ifdef ACX_DEBUG
57 extern int acxdebug;
58 #define DPRINTF(x) do { if (acxdebug) printf x; } while (0)
59 #define DPRINTFN(n,x) do { if (acxdebug >= (n)) printf x; } while (0)
60 #else
61 #define DPRINTF(x)
62 #define DPRINTFN(n,x)
63 #endif
64
65 #define ACX_FRAME_HDRLEN sizeof(struct ieee80211_frame)
66 #define ACX_MEMBLOCK_SIZE 256
67
68 #define ACX_TX_DESC_CNT 16
69 #define ACX_RX_DESC_CNT 16
70
71 #define ACX_TX_RING_SIZE \
72 (2 * ACX_TX_DESC_CNT * sizeof(struct acx_host_desc))
73 #define ACX_RX_RING_SIZE \
74 (ACX_RX_DESC_CNT * sizeof(struct acx_host_desc))
75
76 #define CSR_READ_1(sc, reg) \
77 bus_space_read_1((sc)->sc_mem1_bt, (sc)->sc_mem1_bh, \
78 (sc)->chip_ioreg[(reg)])
79 #define CSR_READ_2(sc, reg) \
80 bus_space_read_2((sc)->sc_mem1_bt, (sc)->sc_mem1_bh, \
81 (sc)->chip_ioreg[(reg)])
82 #define CSR_READ_4(sc, reg) \
83 bus_space_read_4((sc)->sc_mem1_bt, (sc)->sc_mem1_bh, \
84 (sc)->chip_ioreg[(reg)])
85
86 #define CSR_WRITE_2(sc, reg, val) \
87 bus_space_write_2((sc)->sc_mem1_bt, (sc)->sc_mem1_bh, \
88 (sc)->chip_ioreg[(reg)], val)
89 #define CSR_WRITE_4(sc, reg, val) \
90 bus_space_write_4((sc)->sc_mem1_bt, (sc)->sc_mem1_bh, \
91 (sc)->chip_ioreg[(reg)], val)
92
93 #define CSR_SETB_2(sc, reg, b) \
94 CSR_WRITE_2((sc), (reg), CSR_READ_2((sc), (reg)) | (b))
95 #define CSR_CLRB_2(sc, reg, b) \
96 CSR_WRITE_2((sc), (reg), CSR_READ_2((sc), (reg)) & (~(b)))
97
98 #define DESC_WRITE_REGION_1(sc, off, d, dlen) \
99 bus_space_write_region_1((sc)->sc_mem2_bt, (sc)->sc_mem2_bh, \
100 (off), (const uint8_t *)(d), (dlen))
101
102 #define FW_TXDESC_SETFIELD_1(sc, mb, field, val) \
103 bus_space_write_1((sc)->sc_mem2_bt, (sc)->sc_mem2_bh, \
104 (mb)->tb_fwdesc_ofs + offsetof(struct acx_fw_txdesc, field), (val))
105 #define FW_TXDESC_SETFIELD_2(sc, mb, field, val) \
106 bus_space_write_2((sc)->sc_mem2_bt, (sc)->sc_mem2_bh, \
107 (mb)->tb_fwdesc_ofs + offsetof(struct acx_fw_txdesc, field), (val))
108 #define FW_TXDESC_SETFIELD_4(sc, mb, field, val) \
109 bus_space_write_4((sc)->sc_mem2_bt, (sc)->sc_mem2_bh, \
110 (mb)->tb_fwdesc_ofs + offsetof(struct acx_fw_txdesc, field), (val))
111
112 #define FW_TXDESC_GETFIELD_1(sc, mb, field) \
113 bus_space_read_1((sc)->sc_mem2_bt, (sc)->sc_mem2_bh, \
114 (mb)->tb_fwdesc_ofs + offsetof(struct acx_fw_txdesc, field))
115
116 /*
117 * Firmware TX descriptor
118 * Fields are little endian
119 */
120 struct acx_fw_txdesc {
121 uint32_t f_tx_next_desc; /* next acx_fw_txdesc phyaddr */
122 uint32_t f_tx_host_desc; /* acx_host_desc phyaddr */
123 uint32_t f_tx_acx_ptr;
124 uint32_t f_tx_time;
125 uint16_t f_tx_len;
126 uint16_t f_tx_reserved;
127
128 uint32_t f_tx_dev_spec[4];
129
130 uint8_t f_tx_ctrl; /* see DESC_CTRL_ */
131 uint8_t f_tx_ctrl2;
132 uint8_t f_tx_error; /* see DESC_ERR_ */
133 uint8_t f_tx_ack_fail;
134 uint8_t f_tx_rts_fail;
135 uint8_t f_tx_rts_ok;
136
137 /* XXX should be moved to chip specific file */
138 union {
139 struct {
140 uint8_t rate100; /* acx100 tx rate */
141 uint8_t queue_ctrl;
142 } __packed r1;
143 struct {
144 uint16_t rate111; /* acx111 tx rate */
145 } __packed r2;
146 } u;
147 #define f_tx_rate100 u.r1.rate100
148 #define f_tx_queue_ctrl u.r1.queue_ctrl
149 #define f_tx_rate111 u.r2.rate111
150 uint32_t f_tx_queue_info;
151 } __packed;
152
153 /*
154 * Firmware RX descriptor
155 * Fields are little endian
156 */
157 struct acx_fw_rxdesc {
158 uint32_t f_rx_next_desc; /* next acx_fw_rxdesc phyaddr */
159 uint32_t f_rx_host_desc; /* acx_host_desc phyaddr */
160 uint32_t f_rx_acx_ptr;
161 uint32_t f_rx_time;
162 uint16_t f_rx_len;
163 uint16_t f_rx_wep_len;
164 uint32_t f_rx_wep_ofs;
165
166 uint8_t f_rx_dev_spec[16];
167
168 uint8_t f_rx_ctrl; /* see DESC_CTRL_ */
169 uint8_t f_rx_rate;
170 uint8_t f_rx_error;
171 uint8_t f_rx_snr; /* signal noise ratio */
172 uint8_t f_rx_level;
173 uint8_t f_rx_queue_ctrl;
174 uint16_t f_rx_unknown0;
175 uint32_t f_rx_unknown1;
176 } __packed;
177
178 /*
179 * Host TX/RX descriptor
180 * Fields are little endian
181 */
182 struct acx_host_desc {
183 uint32_t h_data_paddr; /* data phyaddr */
184 uint16_t h_data_ofs;
185 uint16_t h_reserved;
186 uint16_t h_ctrl; /* see DESC_CTRL_ */
187 uint16_t h_data_len; /* data length */
188 uint32_t h_next_desc; /* next acx_host_desc phyaddr */
189 uint32_t h_pnext;
190 uint32_t h_status; /* see DESC_STATUS_ */
191 } __packed;
192
193 #define DESC_STATUS_FULL 0x80000000
194
195 #define DESC_CTRL_SHORT_PREAMBLE 0x01
196 #define DESC_CTRL_FIRST_FRAG 0x02
197 #define DESC_CTRL_AUTODMA 0x04
198 #define DESC_CTRL_RECLAIM 0x08
199 #define DESC_CTRL_HOSTDONE 0x20 /* host finished buf proc */
200 #define DESC_CTRL_ACXDONE 0x40 /* chip finished buf proc */
201 #define DESC_CTRL_HOSTOWN 0x80 /* host controls desc */
202
203 #define DESC_ERR_OTHER_FRAG 0x01
204 #define DESC_ERR_ABORT 0x02
205 #define DESC_ERR_PARAM 0x04
206 #define DESC_ERR_NO_WEPKEY 0x08
207 #define DESC_ERR_MSDU_TIMEOUT 0x10
208 #define DESC_ERR_EXCESSIVE_RETRY 0x20
209 #define DESC_ERR_BUF_OVERFLOW 0x40
210 #define DESC_ERR_DMA 0x80
211
212 /*
213 * Extra header in receiving buffer
214 * Fields are little endian
215 */
216 struct acx_rxbuf_hdr {
217 uint16_t rbh_len; /* ACX_RXBUG_LEN_MASK part is len */
218 uint8_t rbh_memblk_cnt;
219 uint8_t rbh_status;
220 uint8_t rbh_stat_baseband; /* see ACX_RXBUF_STAT_ */
221 uint8_t rbh_plcp;
222 uint8_t rbh_level; /* signal level */
223 uint8_t rbh_snr; /* signal noise ratio */
224 uint32_t rbh_time; /* recv timestamp */
225
226 /*
227 * XXX may have 4~8 byte here which
228 * depends on firmware version
229 */
230 } __packed;
231
232 #define ACX_RXBUF_LEN_MASK 0xfff
233 #define ACX_RXBUF_STAT_LNA 0x80 /* low noise amplifier */
234
235 struct acx_ring_data {
236 struct acx_host_desc *rx_ring;
237 bus_dma_segment_t rx_ring_seg;
238 bus_dmamap_t rx_ring_dmamap;
239 uint32_t rx_ring_paddr;
240
241 struct acx_host_desc *tx_ring;
242 bus_dma_segment_t tx_ring_seg;
243 bus_dmamap_t tx_ring_dmamap;
244 uint32_t tx_ring_paddr;
245 };
246
247 struct acx_txbuf {
248 struct mbuf *tb_mbuf;
249 bus_dmamap_t tb_mbuf_dmamap;
250
251 struct acx_host_desc *tb_desc1;
252 struct acx_host_desc *tb_desc2;
253
254 uint32_t tb_fwdesc_ofs;
255
256 /*
257 * Used by tx rate updating
258 */
259 struct acx_node *tb_node; /* remote node */
260 int tb_rate; /* current tx rate */
261 };
262
263 struct acx_rxbuf {
264 struct mbuf *rb_mbuf;
265 bus_dmamap_t rb_mbuf_dmamap;
266
267 struct acx_host_desc *rb_desc;
268 };
269
270 struct acx_buf_data {
271 struct acx_rxbuf rx_buf[ACX_RX_DESC_CNT];
272 struct acx_txbuf tx_buf[ACX_TX_DESC_CNT];
273 bus_dmamap_t mbuf_tmp_dmamap;
274
275 int rx_scan_start;
276
277 int tx_free_start;
278 int tx_used_start;
279 int tx_used_count;
280 };
281
282 struct acx_node {
283 struct ieee80211_node ni; /* must be first */
284 struct ieee80211_amrr_node amn;
285 };
286
287 struct acx_config {
288 uint8_t antenna;
289 uint8_t regdom;
290 uint8_t cca_mode; /* acx100 */
291 uint8_t ed_thresh; /* acx100 */
292 };
293
294 struct acx_stats {
295 uint64_t err_oth_frag; /* XXX error in other frag?? */
296 uint64_t err_abort; /* tx abortion */
297 uint64_t err_param; /* tx desc contains invalid param */
298 uint64_t err_no_wepkey; /* no WEP key exists */
299 uint64_t err_msdu_timeout; /* MSDU timed out */
300 uint64_t err_ex_retry; /* excessive tx retry */
301 uint64_t err_buf_oflow; /* buffer overflow */
302 uint64_t err_dma; /* DMA error */
303 uint64_t err_unkn; /* XXX unknown error */
304 };
305
306 #define ACX_RX_RADIOTAP_PRESENT \
307 ((1 << IEEE80211_RADIOTAP_FLAGS) | \
308 (1 << IEEE80211_RADIOTAP_CHANNEL) | \
309 (1 << IEEE80211_RADIOTAP_RSSI))
310
311 struct acx_rx_radiotap_hdr {
312 struct ieee80211_radiotap_header wr_ihdr;
313 uint8_t wr_flags;
314 uint16_t wr_chan_freq;
315 uint16_t wr_chan_flags;
316 uint8_t wr_rssi;
317 uint8_t wr_max_rssi;
318 } __packed;
319
320 #define ACX_TX_RADIOTAP_PRESENT \
321 ((1 << IEEE80211_RADIOTAP_FLAGS) | \
322 (1 << IEEE80211_RADIOTAP_RATE) | \
323 (1 << IEEE80211_RADIOTAP_CHANNEL)) \
324
325 struct acx_tx_radiotap_hdr {
326 struct ieee80211_radiotap_header wt_ihdr;
327 uint8_t wt_flags;
328 uint8_t wt_rate;
329 uint16_t wt_chan_freq;
330 uint16_t wt_chan_flags;
331 } __packed;
332
333 struct acx_softc {
334 /*
335 * sc_xxx are filled in by common code
336 * chip_xxx are filled in by chip specific code
337 */
338 struct device sc_dev;
339 struct ieee80211com sc_ic;
340
341 struct timeout sc_chanscan_timer;
342 uint32_t sc_flags; /* see ACX_FLAG_ */
343
344 uint32_t sc_firmware_ver;
345 uint32_t sc_hardware_id;
346
347 bus_dma_tag_t sc_dmat;
348
349 struct ieee80211_amrr amrr;
350 struct timeout amrr_ch;
351
352 /*
353 * MMIO 1
354 */
355 bus_space_tag_t sc_mem1_bt;
356 bus_space_handle_t sc_mem1_bh;
357 int chip_mem1_rid;
358
359 /*
360 * MMIO 2
361 */
362 bus_space_tag_t sc_mem2_bt;
363 bus_space_handle_t sc_mem2_bh;
364 int chip_mem2_rid;
365
366 int (*sc_enable)(struct acx_softc *);
367 void (*sc_disable)(struct acx_softc *);
368 void (*sc_power)(struct acx_softc *, int);
369
370 uint32_t sc_cmd; /* cmd reg (MMIO 2) */
371 uint32_t sc_cmd_param; /* cmd param reg (MMIO 2) */
372 uint32_t sc_info; /* unused */
373 uint32_t sc_info_param; /* unused */
374
375 const uint16_t *chip_ioreg; /* reg map (MMIO 1) */
376
377 /*
378 * NOTE:
379 * chip_intr_enable is not necessarily same as
380 * ~chip_intr_disable
381 */
382 uint16_t chip_intr_enable;
383 uint16_t chip_intr_disable;
384
385 int chip_hw_crypt;
386 uint16_t chip_gpio_pled; /* power led */
387 uint16_t chip_chan_flags; /* see IEEE80211_CHAN_ */
388 uint16_t chip_txdesc1_len;
389 int chip_rxbuf_exhdr; /* based on fw ver */
390 uint32_t chip_ee_eaddr_ofs;
391 enum ieee80211_phymode chip_phymode; /* see IEEE80211_MODE_ */
392 uint8_t chip_fw_txdesc_ctrl;
393
394 uint8_t sc_eeprom_ver; /* unused */
395 uint8_t sc_form_factor; /* unused */
396 uint8_t sc_radio_type; /* see ACX_RADIO_TYPE_ */
397
398 struct acx_ring_data sc_ring_data;
399 struct acx_buf_data sc_buf_data;
400
401 struct acx_stats sc_stats; /* statistics */
402
403 /*
404 * Per interface sysctl variables
405 */
406 int sc_txtimer;
407 int sc_long_retry_limit;
408 int sc_short_retry_limit;
409 int sc_msdu_lifetime;
410
411 int (*sc_newstate)
412 (struct ieee80211com *,
413 enum ieee80211_state, int);
414
415 int (*chip_init) /* non-NULL */
416 (struct acx_softc *);
417
418 int (*chip_set_wepkey)
419 (struct acx_softc *,
420 struct ieee80211_key *, int);
421
422 int (*chip_read_config)
423 (struct acx_softc *, struct acx_config *);
424
425 int (*chip_write_config)
426 (struct acx_softc *, struct acx_config *);
427
428 void (*chip_set_fw_txdesc_rate) /* non-NULL */
429 (struct acx_softc *, struct acx_txbuf *, int);
430
431 void (*chip_set_bss_join_param) /* non-NULL */
432 (struct acx_softc *, void *, int);
433
434 void (*chip_proc_wep_rxbuf)
435 (struct acx_softc *, struct mbuf *, int *);
436
437 #if NBPFILTER > 0
438 caddr_t sc_drvbpf;
439
440 union {
441 struct acx_rx_radiotap_hdr th;
442 uint8_t pad[64];
443 } sc_rxtapu;
444 #define sc_rxtap sc_rxtapu.th
445 int sc_rxtap_len;
446
447 union {
448 struct acx_tx_radiotap_hdr th;
449 uint8_t pad[64];
450 } sc_txtapu;
451 #define sc_txtap sc_txtapu.th
452 int sc_txtap_len;
453 #endif
454 };
455
456 #define ACX_FLAG_FW_LOADED 0x01
457 #define ACX_FLAG_ACX111 0x02
458
459 #define ACX_RADIO_TYPE_MAXIM 0x0d
460 #define ACX_RADIO_TYPE_RFMD 0x11
461 #define ACX_RADIO_TYPE_RALINK 0x15
462 #define ACX_RADIO_TYPE_RADIA 0x16
463 #define ACX_RADIO_TYPE_UNKN17 0x17
464 #define ACX_RADIO_TYPE_UNKN19 0x19
465
466 #define ACX_RADIO_RSSI_MAXIM 120 /* 100dB */
467 #define ACX_RADIO_RSSI_RFMD 215 /* 215dB */
468 #define ACX_RADIO_RSSI_RALINK 0 /* XXX unknown yet */
469 #define ACX_RADIO_RSSI_RADIA 78 /* 78db */
470 #define ACX_RADIO_RSSI_UNKN 0 /* unknown radio */
471
472 extern const struct ieee80211_rateset acx_rates_11b;
473 extern const struct ieee80211_rateset acx_rates_11g;
474 extern int acx_beacon_intvl;
475
476 void acx100_set_param(struct acx_softc *);
477 void acx111_set_param(struct acx_softc *);
478
479 int acx_init_tmplt_ordered(struct acx_softc *);
480 void acx_write_phyreg(struct acx_softc *, uint32_t, uint8_t);
481
482 int acx_set_tmplt(struct acx_softc *, uint16_t, void *, uint16_t);
483 int acx_get_conf(struct acx_softc *, uint16_t, void *, uint16_t);
484 int acx_set_conf(struct acx_softc *, uint16_t, void *, uint16_t);
485 int acx_exec_command(struct acx_softc *, uint16_t, void *, uint16_t,
486 void *, uint16_t);
487 int acx_attach(struct acx_softc *);
488 int acx_detach(void *);
489 int acx_intr(void *);
490
491 #endif /* !_IF_ACXVAR_H */
Cache object: edab04970aaf8e5caba9ba51fc5e258f
|