Annotation of sys/dev/ic/rtwvar.h, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: rtwvar.h,v 1.23 2007/06/07 20:20:15 damien Exp $ */
! 2: /* $NetBSD: rtwvar.h,v 1.10 2004/12/26 22:37:57 mycroft Exp $ */
! 3:
! 4: /*-
! 5: * Copyright (c) 2004, 2005 David Young. All rights reserved.
! 6: *
! 7: * Driver for the Realtek RTL8180 802.11 MAC/BBP by David Young.
! 8: *
! 9: * Redistribution and use in source and binary forms, with or without
! 10: * modification, are permitted provided that the following conditions
! 11: * are met:
! 12: * 1. Redistributions of source code must retain the above copyright
! 13: * notice, this list of conditions and the following disclaimer.
! 14: * 2. Redistributions in binary form must reproduce the above copyright
! 15: * notice, this list of conditions and the following disclaimer in the
! 16: * documentation and/or other materials provided with the distribution.
! 17: * 3. The name of David Young may not be used to endorse or promote
! 18: * products derived from this software without specific prior
! 19: * written permission.
! 20: *
! 21: * THIS SOFTWARE IS PROVIDED BY David Young ``AS IS'' AND ANY
! 22: * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
! 23: * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
! 24: * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL David
! 25: * Young BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
! 26: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
! 27: * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
! 28: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
! 29: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
! 30: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 31: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
! 32: * OF SUCH DAMAGE.
! 33: */
! 34:
! 35: #ifndef _DEV_IC_RTWVAR_H_
! 36: #define _DEV_IC_RTWVAR_H_
! 37:
! 38: #include <sys/device.h>
! 39: #include <sys/queue.h>
! 40: #include <sys/timeout.h>
! 41:
! 42: #ifdef RTW_DEBUG
! 43: #define RTW_DEBUG_TUNE 0x0000001
! 44: #define RTW_DEBUG_PKTFILT 0x0000002
! 45: #define RTW_DEBUG_XMIT 0x0000004
! 46: #define RTW_DEBUG_XMIT_DESC 0x0000008
! 47: #define RTW_DEBUG_NODE 0x0000010
! 48: #define RTW_DEBUG_PWR 0x0000020
! 49: #define RTW_DEBUG_ATTACH 0x0000040
! 50: #define RTW_DEBUG_REGDUMP 0x0000080
! 51: #define RTW_DEBUG_ACCESS 0x0000100
! 52: #define RTW_DEBUG_RESET 0x0000200
! 53: #define RTW_DEBUG_INIT 0x0000400
! 54: #define RTW_DEBUG_IOSTATE 0x0000800
! 55: #define RTW_DEBUG_RECV 0x0001000
! 56: #define RTW_DEBUG_RECV_DESC 0x0002000
! 57: #define RTW_DEBUG_IO_KICK 0x0004000
! 58: #define RTW_DEBUG_INTR 0x0008000
! 59: #define RTW_DEBUG_PHY 0x0010000
! 60: #define RTW_DEBUG_PHYIO 0x0020000
! 61: #define RTW_DEBUG_PHYBITIO 0x0040000
! 62: #define RTW_DEBUG_TIMEOUT 0x0080000
! 63: #define RTW_DEBUG_BUGS 0x0100000
! 64: #define RTW_DEBUG_BEACON 0x0200000
! 65: #define RTW_DEBUG_LED 0x0400000
! 66: #define RTW_DEBUG_KEY 0x0800000
! 67: #define RTW_DEBUG_XMIT_RSRC 0x1000000
! 68: #define RTW_DEBUG_OACTIVE 0x2000000
! 69: #define RTW_DEBUG_MAX 0x3ffffff
! 70:
! 71: extern int rtw_debug;
! 72: #define RTW_DPRINTF(__flags, __x) \
! 73: if ((rtw_debug & (__flags)) != 0) printf __x
! 74: #define DPRINTF(__sc, __flags, __x) \
! 75: if (((__sc)->sc_ic.ic_if.if_flags & IFF_DEBUG) != 0) \
! 76: RTW_DPRINTF(__flags, __x)
! 77: #else /* RTW_DEBUG */
! 78: #define RTW_DPRINTF(__flags, __x)
! 79: #define DPRINTF(__sc, __flags, __x)
! 80: #endif /* RTW_DEBUG */
! 81:
! 82: #define KASSERT2(__cond, __msg) \
! 83: do { \
! 84: if (!(__cond)) \
! 85: panic __msg ; \
! 86: } while (0)
! 87:
! 88: enum rtw_locale {
! 89: RTW_LOCALE_USA = 0,
! 90: RTW_LOCALE_EUROPE,
! 91: RTW_LOCALE_JAPAN,
! 92: RTW_LOCALE_UNKNOWN
! 93: };
! 94:
! 95: #define RTW_RFCHIPID_RESERVED 0x00
! 96: #define RTW_RFCHIPID_INTERSIL 0x01
! 97: #define RTW_RFCHIPID_RFMD2948 0x02
! 98: #define RTW_RFCHIPID_PHILIPS 0x03
! 99: #define RTW_RFCHIPID_MAXIM2820 0x04
! 100: #define RTW_RFCHIPID_GCT 0x05
! 101: #define RTW_RFCHIPID_RFMD2958 0x06
! 102: #define RTW_RFCHIPID_MAXIM2822 0x07
! 103: #define RTW_RFCHIPID_MAXIM2825 0x08
! 104: #define RTW_RFCHIPID_RTL8225 0x09
! 105: #define RTW_RFCHIPID_RTL8255 0x0a
! 106:
! 107: /* sc_flags */
! 108: #define RTW_F_ENABLED 0x00000001 /* chip is enabled */
! 109: #define RTW_F_DIGPHY 0x00000002 /* digital PHY */
! 110: #define RTW_F_DFLANTB 0x00000004 /* B antenna is default */
! 111: #define RTW_F_RTL8185 0x00000008 /* RTL8185 or newer */
! 112: #define RTW_F_ANTDIV 0x00000010 /* h/w antenna diversity */
! 113: #define RTW_F_9356SROM 0x00000020 /* 93c56 SROM */
! 114: #define RTW_F_SLEEP 0x00000040 /* chip is asleep */
! 115: #define RTW_F_INVALID 0x00000080 /* chip is absent */
! 116: /* all PHY flags */
! 117: #define RTW_F_ALLPHY (RTW_F_DIGPHY|RTW_F_DFLANTB|RTW_F_ANTDIV)
! 118:
! 119: enum rtw_access {
! 120: RTW_ACCESS_NONE = 0,
! 121: RTW_ACCESS_CONFIG = 1,
! 122: RTW_ACCESS_ANAPARM = 2
! 123: };
! 124:
! 125: struct rtw_regs {
! 126: bus_space_tag_t r_bt;
! 127: bus_space_handle_t r_bh;
! 128: enum rtw_access r_access;
! 129: void *r_priv;
! 130:
! 131: /* bus independent I/O callbacks */
! 132: u_int8_t (*r_read8)(void *, u_int32_t);
! 133: u_int16_t (*r_read16)(void *, u_int32_t);
! 134: u_int32_t (*r_read32)(void *, u_int32_t);
! 135: void (*r_write8)(void *, u_int32_t, u_int8_t);
! 136: void (*r_write16)(void *, u_int32_t, u_int16_t);
! 137: void (*r_write32)(void *, u_int32_t, u_int32_t);
! 138: void (*r_barrier)(void *, u_int32_t, u_int32_t, int);
! 139: };
! 140:
! 141: #define RTW_SR_GET(sr, ofs) \
! 142: (((sr)->sr_content[(ofs)/2] >> (((ofs) % 2 == 0) ? 0 : 8)) & 0xff)
! 143:
! 144: #define RTW_SR_GET16(sr, ofs) \
! 145: (RTW_SR_GET((sr), (ofs)) | (RTW_SR_GET((sr), (ofs) + 1) << 8))
! 146:
! 147: struct rtw_srom {
! 148: u_int16_t *sr_content;
! 149: u_int16_t sr_size;
! 150: };
! 151:
! 152: struct rtw_rxsoft {
! 153: struct mbuf *rs_mbuf;
! 154: bus_dmamap_t rs_dmamap;
! 155: };
! 156:
! 157: struct rtw_duration {
! 158: uint16_t d_rts_dur;
! 159: uint16_t d_data_dur;
! 160: uint16_t d_plcp_len;
! 161: uint8_t d_residue; /* unused octets in time slot */
! 162: };
! 163:
! 164: struct rtw_txsoft {
! 165: SIMPLEQ_ENTRY(rtw_txsoft) ts_q;
! 166: struct mbuf *ts_mbuf;
! 167: bus_dmamap_t ts_dmamap;
! 168: struct ieee80211_node *ts_ni; /* destination node */
! 169: u_int ts_first; /* 1st hw descriptor */
! 170: u_int ts_last; /* last hw descriptor */
! 171: struct rtw_duration ts_d0;
! 172: struct rtw_duration ts_dn;
! 173: };
! 174:
! 175: #define RTW_NTXPRI 4 /* number of Tx priorities */
! 176: #define RTW_TXPRILO 0
! 177: #define RTW_TXPRIMD 1
! 178: #define RTW_TXPRIHI 2
! 179: #define RTW_TXPRIBCN 3 /* beacon priority */
! 180:
! 181: #define RTW_MAXPKTSEGS 64 /* max 64 segments per Tx packet */
! 182:
! 183: #define CASSERT(cond, complaint) \
! 184: complaint[(cond) ? 0 : -1] = complaint[(cond) ? 0 : -1]
! 185:
! 186: /* Note well: the descriptor rings must begin on RTW_DESC_ALIGNMENT
! 187: * boundaries. I allocate them consecutively from one buffer, so
! 188: * just round up.
! 189: */
! 190: #define RTW_TXQLENLO 64 /* low-priority queue length */
! 191: #define RTW_TXQLENMD 64 /* medium-priority */
! 192: #define RTW_TXQLENHI 64 /* high-priority */
! 193: #define RTW_TXQLENBCN 8 /* beacon */
! 194:
! 195: #define RTW_NTXDESCLO RTW_TXQLENLO
! 196: #define RTW_NTXDESCMD RTW_TXQLENMD
! 197: #define RTW_NTXDESCHI RTW_TXQLENHI
! 198: #define RTW_NTXDESCBCN RTW_TXQLENBCN
! 199:
! 200: #define RTW_NTXDESCTOTAL (RTW_NTXDESCLO + RTW_NTXDESCMD + \
! 201: RTW_NTXDESCHI + RTW_NTXDESCBCN)
! 202:
! 203: #define RTW_RXQLEN 64
! 204:
! 205: struct rtw_rxdesc_blk {
! 206: struct rtw_rxdesc *rdb_desc;
! 207: u_int rdb_next;
! 208: u_int rdb_ndesc;
! 209: bus_dma_tag_t rdb_dmat;
! 210: bus_dmamap_t rdb_dmamap;
! 211: };
! 212:
! 213: struct rtw_txdesc_blk {
! 214: u_int tdb_ndesc;
! 215: u_int tdb_next;
! 216: u_int tdb_nfree;
! 217: bus_dma_tag_t tdb_dmat;
! 218: bus_dmamap_t tdb_dmamap;
! 219: bus_addr_t tdb_physbase;
! 220: bus_addr_t tdb_ofs;
! 221: bus_size_t tdb_basereg;
! 222: uint32_t tdb_base;
! 223:
! 224: struct rtw_txdesc *tdb_desc;
! 225: };
! 226:
! 227: #define RTW_NEXT_IDX(__htc, __idx) (((__idx) + 1) % (__htc)->tdb_ndesc)
! 228:
! 229: #define RTW_NEXT_DESC(__htc, __idx) \
! 230: ((__htc)->tdb_physbase + \
! 231: sizeof(struct rtw_txdesc) * RTW_NEXT_IDX((__htc), (__idx)))
! 232:
! 233: SIMPLEQ_HEAD(rtw_txq, rtw_txsoft);
! 234:
! 235: struct rtw_txsoft_blk {
! 236: /* dirty/free s/w descriptors */
! 237: struct rtw_txq tsb_dirtyq;
! 238: struct rtw_txq tsb_freeq;
! 239: u_int tsb_ndesc;
! 240: int tsb_tx_timer;
! 241: struct rtw_txsoft *tsb_desc;
! 242: u_int8_t tsb_poll;
! 243: };
! 244:
! 245: struct rtw_descs {
! 246: struct rtw_txdesc hd_txlo[RTW_NTXDESCLO];
! 247: struct rtw_txdesc hd_txmd[RTW_NTXDESCMD];
! 248: struct rtw_txdesc hd_txhi[RTW_NTXDESCMD];
! 249: struct rtw_rxdesc hd_rx[RTW_RXQLEN];
! 250: struct rtw_txdesc hd_bcn[RTW_NTXDESCBCN];
! 251: };
! 252: #define RTW_DESC_OFFSET(ring, i) offsetof(struct rtw_descs, ring[i])
! 253: #define RTW_RING_OFFSET(ring) RTW_DESC_OFFSET(ring, 0)
! 254: #define RTW_RING_BASE(sc, ring) ((sc)->sc_desc_physaddr + \
! 255: RTW_RING_OFFSET(ring))
! 256:
! 257: /* Radio capture format for RTL8180. */
! 258:
! 259: #define RTW_RX_RADIOTAP_PRESENT \
! 260: ((1 << IEEE80211_RADIOTAP_TSFT) | \
! 261: (1 << IEEE80211_RADIOTAP_FLAGS) | \
! 262: (1 << IEEE80211_RADIOTAP_RATE) | \
! 263: (1 << IEEE80211_RADIOTAP_CHANNEL) | \
! 264: (1 << IEEE80211_RADIOTAP_LOCK_QUALITY) | \
! 265: (1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL) | \
! 266: 0)
! 267:
! 268: struct rtw_rx_radiotap_header {
! 269: struct ieee80211_radiotap_header rr_ihdr;
! 270: u_int64_t rr_tsft;
! 271: u_int8_t rr_flags;
! 272: u_int8_t rr_rate;
! 273: u_int16_t rr_chan_freq;
! 274: u_int16_t rr_chan_flags;
! 275: u_int16_t rr_barker_lock;
! 276: u_int8_t rr_antsignal;
! 277: } __packed;
! 278:
! 279: #define RTW_TX_RADIOTAP_PRESENT \
! 280: ((1 << IEEE80211_RADIOTAP_FLAGS) | \
! 281: (1 << IEEE80211_RADIOTAP_RATE) | \
! 282: (1 << IEEE80211_RADIOTAP_CHANNEL) | \
! 283: 0)
! 284:
! 285: struct rtw_tx_radiotap_header {
! 286: struct ieee80211_radiotap_header rt_ihdr;
! 287: u_int8_t rt_flags;
! 288: u_int8_t rt_rate;
! 289: u_int16_t rt_chan_freq;
! 290: u_int16_t rt_chan_flags;
! 291: } __packed;
! 292:
! 293: struct rtw_hooks {
! 294: void *rh_shutdown; /* shutdown hook */
! 295: void *rh_power; /* power management hook */
! 296: };
! 297:
! 298: struct rtw_mtbl {
! 299: int (*mt_newstate)(struct ieee80211com *,
! 300: enum ieee80211_state, int);
! 301: void (*mt_recv_mgmt)(struct ieee80211com *,
! 302: struct mbuf *, struct ieee80211_node *,
! 303: int, int, u_int32_t);
! 304: struct ieee80211_node *(*mt_node_alloc)(struct ieee80211com *);
! 305: void (*mt_node_free)(struct ieee80211com *,
! 306: struct ieee80211_node *);
! 307: };
! 308:
! 309: enum rtw_pwrstate { RTW_OFF = 0, RTW_SLEEP, RTW_ON };
! 310:
! 311: struct rtw_phy {
! 312: struct rtw_rf *p_rf;
! 313: struct rtw_regs *p_regs;
! 314: };
! 315:
! 316: struct rtw_bbpset {
! 317: u_int bb_antatten;
! 318: u_int bb_chestlim;
! 319: u_int bb_chsqlim;
! 320: u_int bb_ifagcdet;
! 321: u_int bb_ifagcini;
! 322: u_int bb_ifagclimit;
! 323: u_int bb_lnadet;
! 324: u_int bb_sys1;
! 325: u_int bb_sys2;
! 326: u_int bb_sys3;
! 327: u_int bb_trl;
! 328: u_int bb_txagc;
! 329: };
! 330:
! 331: typedef int (*rtw_rf_write_t)(struct rtw_regs *, int, u_int,
! 332: u_int32_t);
! 333:
! 334: typedef void (*rtw_pwrstate_t)(struct rtw_regs *, enum rtw_pwrstate, int, int);
! 335:
! 336: union rtw_keys {
! 337: u_int8_t rk_keys[4][16];
! 338: u_int32_t rk_words[16];
! 339: };
! 340:
! 341: #define RTW_LED_SLOW_TICKS MAX(1, hz/2)
! 342: #define RTW_LED_FAST_TICKS MAX(1, hz/10)
! 343:
! 344: struct rtw_led_state {
! 345: #define RTW_LED0 0x1
! 346: #define RTW_LED1 0x2
! 347: u_int8_t ls_slowblink:2;
! 348: u_int8_t ls_actblink:2;
! 349: u_int8_t ls_default:2;
! 350: u_int8_t ls_state;
! 351: u_int8_t ls_event;
! 352: #define RTW_LED_S_RX 0x1
! 353: #define RTW_LED_S_TX 0x2
! 354: #define RTW_LED_S_SLOW 0x4
! 355: struct timeout ls_slow_ch;
! 356: struct timeout ls_fast_ch;
! 357: };
! 358:
! 359: struct rtw_softc {
! 360: struct device sc_dev;
! 361: struct ieee80211com sc_ic;
! 362: struct rtw_regs sc_regs;
! 363: bus_dma_tag_t sc_dmat;
! 364: u_int32_t sc_flags;
! 365:
! 366: int sc_rfchipid;
! 367: enum rtw_locale sc_locale;
! 368: u_int8_t sc_phydelay;
! 369: struct rtw_bbpset sc_bbpset;
! 370:
! 371: /* s/w Tx/Rx descriptors */
! 372: struct rtw_txsoft_blk sc_txsoft_blk[RTW_NTXPRI];
! 373: struct rtw_txdesc_blk sc_txdesc_blk[RTW_NTXPRI];
! 374:
! 375: struct rtw_rxsoft sc_rxsoft[RTW_RXQLEN];
! 376: struct rtw_rxdesc_blk sc_rxdesc_blk;
! 377:
! 378: struct rtw_descs *sc_descs;
! 379:
! 380: bus_dma_segment_t sc_desc_segs;
! 381: int sc_desc_nsegs;
! 382: bus_dmamap_t sc_desc_dmamap;
! 383: #define sc_desc_physaddr sc_desc_dmamap->dm_segs[0].ds_addr
! 384:
! 385: struct rtw_srom sc_srom;
! 386:
! 387: enum rtw_pwrstate sc_pwrstate;
! 388:
! 389: rtw_pwrstate_t sc_pwrstate_cb;
! 390:
! 391: u_int16_t sc_inten;
! 392: int (*sc_rf_init)(struct rtw_softc *, u_int,
! 393: u_int8_t, enum rtw_pwrstate);
! 394: int (*sc_rf_pwrstate)(struct rtw_softc *,
! 395: enum rtw_pwrstate);
! 396: int (*sc_rf_tune)(struct rtw_softc *, u_int);
! 397: int (*sc_rf_txpower)(struct rtw_softc *, u_int8_t);
! 398:
! 399: /* interrupt acknowledge hook */
! 400: void (*sc_intr_ack)(struct rtw_regs *);
! 401:
! 402: int (*sc_enable)(struct rtw_softc *);
! 403: void (*sc_disable)(struct rtw_softc *);
! 404: void (*sc_power)(struct rtw_softc *, int);
! 405: struct rtw_mtbl sc_mtbl;
! 406: struct rtw_hooks sc_hooks;
! 407:
! 408: caddr_t sc_radiobpf;
! 409:
! 410: struct timeval sc_last_beacon;
! 411: struct timeout sc_scan_to;
! 412: u_int sc_cur_chan;
! 413:
! 414: u_int32_t sc_tsfth; /* most significant TSFT bits */
! 415: u_int32_t sc_rcr; /* RTW_RCR */
! 416: u_int8_t sc_csthr; /* carrier-sense threshold */
! 417:
! 418: int sc_do_tick; /* indicate 1s ticks */
! 419: struct timeval sc_tick0; /* first tick */
! 420:
! 421: u_int8_t sc_rev; /* PCI/Cardbus revision */
! 422:
! 423: u_int32_t sc_anaparm[2]; /* RTW_ANAPARM_? registers */
! 424:
! 425: union {
! 426: struct rtw_rx_radiotap_header tap;
! 427: u_int8_t pad[64];
! 428: } sc_rxtapu;
! 429: union {
! 430: struct rtw_tx_radiotap_header tap;
! 431: u_int8_t pad[64];
! 432: } sc_txtapu;
! 433: union rtw_keys sc_keys;
! 434: int sc_txkey;
! 435: struct ifqueue sc_beaconq;
! 436: struct rtw_led_state sc_led_state;
! 437: u_int sc_hwverid;
! 438: };
! 439:
! 440: #define sc_if sc_ic.ic_if
! 441: #define sc_rxtap sc_rxtapu.tap
! 442: #define sc_txtap sc_txtapu.tap
! 443:
! 444: extern int rtw_host_rfio;
! 445:
! 446: void rtw_txdac_enable(struct rtw_softc *, int);
! 447: void rtw_anaparm_enable(struct rtw_regs *, int);
! 448: void rtw_config0123_enable(struct rtw_regs *, int);
! 449: void rtw_continuous_tx_enable(struct rtw_softc *, int);
! 450: void rtw_set_access(struct rtw_regs *, enum rtw_access);
! 451:
! 452: void rtw_attach(struct rtw_softc *);
! 453: int rtw_detach(struct rtw_softc *);
! 454: int rtw_intr(void *);
! 455:
! 456: void rtw_disable(struct rtw_softc *);
! 457: int rtw_enable(struct rtw_softc *);
! 458:
! 459: int rtw_activate(struct device *, enum devact);
! 460: void rtw_power(int, void *);
! 461: void rtw_shutdown(void *);
! 462:
! 463: const char *rtw_pwrstate_string(enum rtw_pwrstate);
! 464:
! 465: #endif /* _DEV_IC_RTWVAR_H_ */
CVSweb