Annotation of sys/dev/ic/acxvar.h, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: acxvar.h,v 1.18 2007/07/18 18:10:31 damien 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: struct resource *sc_mem1_res;
! 356: bus_space_tag_t sc_mem1_bt;
! 357: bus_space_handle_t sc_mem1_bh;
! 358: int chip_mem1_rid;
! 359:
! 360: /*
! 361: * MMIO 2
! 362: */
! 363: struct resource *sc_mem2_res;
! 364: bus_space_tag_t sc_mem2_bt;
! 365: bus_space_handle_t sc_mem2_bh;
! 366: int chip_mem2_rid;
! 367:
! 368: struct resource *sc_irq_res;
! 369: void *sc_irq_handle;
! 370: int sc_irq_rid;
! 371:
! 372: int (*sc_enable)(struct acx_softc *);
! 373: void (*sc_disable)(struct acx_softc *);
! 374: void (*sc_power)(struct acx_softc *, int);
! 375:
! 376: uint32_t sc_cmd; /* cmd reg (MMIO 2) */
! 377: uint32_t sc_cmd_param; /* cmd param reg (MMIO 2) */
! 378: uint32_t sc_info; /* unused */
! 379: uint32_t sc_info_param; /* unused */
! 380:
! 381: const uint16_t *chip_ioreg; /* reg map (MMIO 1) */
! 382:
! 383: /*
! 384: * NOTE:
! 385: * chip_intr_enable is not necessarily same as
! 386: * ~chip_intr_disable
! 387: */
! 388: uint16_t chip_intr_enable;
! 389: uint16_t chip_intr_disable;
! 390:
! 391: int chip_hw_crypt;
! 392: uint16_t chip_gpio_pled; /* power led */
! 393: uint16_t chip_chan_flags; /* see IEEE80211_CHAN_ */
! 394: uint16_t chip_txdesc1_len;
! 395: int chip_rxbuf_exhdr; /* based on fw ver */
! 396: uint32_t chip_ee_eaddr_ofs;
! 397: enum ieee80211_phymode chip_phymode; /* see IEEE80211_MODE_ */
! 398: uint8_t chip_fw_txdesc_ctrl;
! 399:
! 400: uint8_t sc_eeprom_ver; /* unused */
! 401: uint8_t sc_form_factor; /* unused */
! 402: uint8_t sc_radio_type; /* see ACX_RADIO_TYPE_ */
! 403:
! 404: struct acx_ring_data sc_ring_data;
! 405: struct acx_buf_data sc_buf_data;
! 406:
! 407: struct acx_stats sc_stats; /* statistics */
! 408:
! 409: /*
! 410: * Per interface sysctl variables
! 411: */
! 412: int sc_txtimer;
! 413: int sc_long_retry_limit;
! 414: int sc_short_retry_limit;
! 415: int sc_msdu_lifetime;
! 416:
! 417: int (*sc_newstate)
! 418: (struct ieee80211com *,
! 419: enum ieee80211_state, int);
! 420:
! 421: int (*chip_init) /* non-NULL */
! 422: (struct acx_softc *);
! 423:
! 424: int (*chip_set_wepkey)
! 425: (struct acx_softc *,
! 426: struct ieee80211_key *, int);
! 427:
! 428: int (*chip_read_config)
! 429: (struct acx_softc *, struct acx_config *);
! 430:
! 431: int (*chip_write_config)
! 432: (struct acx_softc *, struct acx_config *);
! 433:
! 434: void (*chip_set_fw_txdesc_rate) /* non-NULL */
! 435: (struct acx_softc *, struct acx_txbuf *, int);
! 436:
! 437: void (*chip_set_bss_join_param) /* non-NULL */
! 438: (struct acx_softc *, void *, int);
! 439:
! 440: void (*chip_proc_wep_rxbuf)
! 441: (struct acx_softc *, struct mbuf *, int *);
! 442:
! 443: #if NBPFILTER > 0
! 444: caddr_t sc_drvbpf;
! 445:
! 446: union {
! 447: struct acx_rx_radiotap_hdr th;
! 448: uint8_t pad[64];
! 449: } sc_rxtapu;
! 450: #define sc_rxtap sc_rxtapu.th
! 451: int sc_rxtap_len;
! 452:
! 453: union {
! 454: struct acx_tx_radiotap_hdr th;
! 455: uint8_t pad[64];
! 456: } sc_txtapu;
! 457: #define sc_txtap sc_txtapu.th
! 458: int sc_txtap_len;
! 459: #endif
! 460: };
! 461:
! 462: #define ACX_FLAG_FW_LOADED 0x01
! 463: #define ACX_FLAG_ACX111 0x02
! 464:
! 465: #define ACX_RADIO_TYPE_MAXIM 0x0d
! 466: #define ACX_RADIO_TYPE_RFMD 0x11
! 467: #define ACX_RADIO_TYPE_RALINK 0x15
! 468: #define ACX_RADIO_TYPE_RADIA 0x16
! 469: #define ACX_RADIO_TYPE_UNKN17 0x17
! 470: #define ACX_RADIO_TYPE_UNKN19 0x19
! 471:
! 472: #define ACX_RADIO_RSSI_MAXIM 120 /* 100dB */
! 473: #define ACX_RADIO_RSSI_RFMD 215 /* 215dB */
! 474: #define ACX_RADIO_RSSI_RALINK 0 /* XXX unknown yet */
! 475: #define ACX_RADIO_RSSI_RADIA 78 /* 78db */
! 476: #define ACX_RADIO_RSSI_UNKN 0 /* unknown radio */
! 477:
! 478: extern const struct ieee80211_rateset acx_rates_11b;
! 479: extern const struct ieee80211_rateset acx_rates_11g;
! 480: extern int acx_beacon_intvl;
! 481:
! 482: void acx100_set_param(struct acx_softc *);
! 483: void acx111_set_param(struct acx_softc *);
! 484:
! 485: int acx_init_tmplt_ordered(struct acx_softc *);
! 486: void acx_write_phyreg(struct acx_softc *, uint32_t, uint8_t);
! 487:
! 488: int acx_set_tmplt(struct acx_softc *, uint16_t, void *, uint16_t);
! 489: int acx_get_conf(struct acx_softc *, uint16_t, void *, uint16_t);
! 490: int acx_set_conf(struct acx_softc *, uint16_t, void *, uint16_t);
! 491: int acx_exec_command(struct acx_softc *, uint16_t, void *, uint16_t,
! 492: void *, uint16_t);
! 493: int acx_attach(struct acx_softc *);
! 494: int acx_detach(void *);
! 495: int acx_intr(void *);
! 496:
! 497: #endif /* !_IF_ACXVAR_H */
CVSweb