Annotation of sys/dev/ic/fxpvar.h, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: fxpvar.h,v 1.27 2007/05/28 22:54:04 ckuethe Exp $ */
! 2: /* $NetBSD: if_fxpvar.h,v 1.1 1997/06/05 02:01:58 thorpej Exp $ */
! 3:
! 4: /*
! 5: * Copyright (c) 1995, David Greenman
! 6: * All rights reserved.
! 7: *
! 8: * Modifications to support NetBSD:
! 9: * Copyright (c) 1997 Jason R. Thorpe. All rights reserved.
! 10: *
! 11: * Redistribution and use in source and binary forms, with or without
! 12: * modification, are permitted provided that the following conditions
! 13: * are met:
! 14: * 1. Redistributions of source code must retain the above copyright
! 15: * notice unmodified, this list of conditions, and the following
! 16: * disclaimer.
! 17: * 2. Redistributions in binary form must reproduce the above copyright
! 18: * notice, this list of conditions and the following disclaimer in the
! 19: * documentation and/or other materials provided with the distribution.
! 20: *
! 21: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
! 22: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 23: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 24: * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
! 25: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
! 26: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
! 27: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 28: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 29: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 30: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 31: * SUCH DAMAGE.
! 32: *
! 33: * Id: if_fxpvar.h,v 1.6 1998/08/02 00:29:15 dg Exp
! 34: */
! 35:
! 36: /*
! 37: * Misc. definitions for the Intel EtherExpress Pro/100B PCI Fast
! 38: * Ethernet driver
! 39: */
! 40:
! 41: /*
! 42: * Number of transmit control blocks. This determines the number
! 43: * of transmit buffers that can be chained in the CB list.
! 44: * This must be a power of two.
! 45: */
! 46: #define FXP_NTXCB 128
! 47:
! 48: /*
! 49: * Minimum and maximum number of receive frame area buffers.
! 50: */
! 51: #define FXP_NRFABUFS_MIN 4
! 52: #define FXP_NRFABUFS_MAX 64 /* These are large so choose wisely. */
! 53:
! 54: /*
! 55: * Default maximum time, in microseconds, that an interrupt may be delayed
! 56: * in an attempt to coalesce interrupts. This is only effective if the Intel
! 57: * microcode is loaded.
! 58: */
! 59: #ifndef FXP_INT_DELAY
! 60: #define FXP_INT_DELAY 128
! 61: #endif
! 62:
! 63: /*
! 64: * Default number of packets that will be bundled, before an interrupt is
! 65: * generated. This is only effective if the Intel microcode is loaded.
! 66: * This is not present in all microcode revisions.
! 67: */
! 68: #ifndef FXP_BUNDLE_MAX
! 69: #define FXP_BUNDLE_MAX 16
! 70: #endif
! 71:
! 72: /*
! 73: * Bit-mask describing minimum size frame that will be bundled.
! 74: * This is only effetive if the Intel microcode is loaded.
! 75: * This is not present in all microcode revisions. Disabled by default,
! 76: * to reduce recieving immediately interrupts from all frames with size less
! 77: * than 128 bytes.
! 78: */
! 79: #ifndef FXP_MIN_SIZE_MASK
! 80: #define FXP_MIN_SIZE_MASK 0xFFFF
! 81: #endif
! 82:
! 83: /*
! 84: * NOTE: Elements are ordered for optimal cacheline behavior, and NOT
! 85: * for functional grouping.
! 86: */
! 87:
! 88: struct fxp_txsw {
! 89: struct fxp_txsw *tx_next;
! 90: struct mbuf *tx_mbuf;
! 91: bus_dmamap_t tx_map;
! 92: bus_addr_t tx_off;
! 93: struct fxp_cb_tx *tx_cb;
! 94: };
! 95:
! 96: struct fxp_ctrl {
! 97: struct fxp_cb_tx tx_cb[FXP_NTXCB];
! 98: struct fxp_stats stats;
! 99: union {
! 100: struct fxp_cb_mcs mcs;
! 101: struct fxp_cb_ias ias;
! 102: struct fxp_cb_config cfg;
! 103: struct fxp_cb_ucode code;
! 104: } u;
! 105: };
! 106:
! 107: struct fxp_softc {
! 108: struct device sc_dev; /* generic device structures */
! 109: void *sc_ih; /* interrupt handler cookie */
! 110: bus_space_tag_t sc_st; /* bus space tag */
! 111: bus_space_handle_t sc_sh; /* bus space handle */
! 112: bus_dma_tag_t sc_dmat; /* bus dma tag */
! 113: struct arpcom sc_arpcom; /* per-interface network data */
! 114: struct mii_data sc_mii; /* MII media information */
! 115: struct mbuf *rfa_headm; /* first mbuf in receive frame area */
! 116: struct mbuf *rfa_tailm; /* last mbuf in receive frame area */
! 117: int sc_flags; /* misc. flags */
! 118: #define FXPF_MWI_ENABLE 0x10 /* enable use of PCI MWI command */
! 119: #define FXPF_DISABLE_STANDBY 0x20 /* currently need to work-around */
! 120: #define FXPF_UCODE 0x40 /* ucode load already attempted */
! 121: #define FXPF_RECV_WORKAROUND 0x80 /* receiver lock-up workaround */
! 122: struct timeout stats_update_to; /* Pointer to timeout structure */
! 123: int rx_idle_secs; /* # of seconds RX has been idle */
! 124: struct fxp_cb_tx *cbl_base; /* base of TxCB list */
! 125: int phy_primary_addr; /* address of primary PHY */
! 126: int phy_primary_device; /* device type of primary PHY */
! 127: int phy_10Mbps_only; /* PHY is 10Mbps-only device */
! 128: int eeprom_size; /* size of serial EEPROM */
! 129: int rx_bufs; /* how many rx buffers allocated? */
! 130: void *sc_sdhook; /* shutdownhook */
! 131: void *sc_powerhook; /* powerhook */
! 132: struct fxp_txsw txs[FXP_NTXCB];
! 133: struct fxp_txsw *sc_cbt_cons, *sc_cbt_prod, *sc_cbt_prev;
! 134: int sc_cbt_cnt;
! 135: bus_dmamap_t tx_cb_map;
! 136: bus_dma_segment_t sc_cb_seg;
! 137: int sc_cb_nseg;
! 138: struct fxp_ctrl *sc_ctrl;
! 139: bus_dmamap_t sc_rxmaps[FXP_NRFABUFS_MAX];
! 140: int sc_rxfree;
! 141: u_int32_t sc_revision; /* chip revision */
! 142: u_int16_t sc_int_delay; /* interrupt delay value for ucode */
! 143: u_int16_t sc_bundle_max; /* max # frames per interrupt (ucode) */
! 144: u_int16_t sc_min_size_mask; /* bit-mask describing the minimum
! 145: * size of frame that will be bundled */
! 146: };
! 147:
! 148: /* Macros to ease CSR access. */
! 149: #define CSR_READ_1(sc, reg) \
! 150: bus_space_read_1((sc)->sc_st, (sc)->sc_sh, (reg))
! 151: #define CSR_READ_2(sc, reg) \
! 152: bus_space_read_2((sc)->sc_st, (sc)->sc_sh, (reg))
! 153: #define CSR_READ_4(sc, reg) \
! 154: bus_space_read_4((sc)->sc_st, (sc)->sc_sh, (reg))
! 155: #define CSR_WRITE_1(sc, reg, val) \
! 156: bus_space_write_1((sc)->sc_st, (sc)->sc_sh, (reg), (val))
! 157: #define CSR_WRITE_2(sc, reg, val) \
! 158: bus_space_write_2((sc)->sc_st, (sc)->sc_sh, (reg), (val))
! 159: #define CSR_WRITE_4(sc, reg, val) \
! 160: bus_space_write_4((sc)->sc_st, (sc)->sc_sh, (reg), (val))
! 161:
! 162: extern int fxp_intr(void *);
! 163: extern int fxp_attach(struct fxp_softc *, const char *);
! 164:
! 165: #define FXP_RXMAP_GET(sc) ((sc)->sc_rxmaps[(sc)->sc_rxfree++])
! 166: #define FXP_RXMAP_PUT(sc,map) ((sc)->sc_rxmaps[--(sc)->sc_rxfree] = (map))
! 167:
! 168: #define FXP_TXCB_SYNC(sc, txs, p) \
! 169: bus_dmamap_sync((sc)->sc_dmat, (sc)->tx_cb_map, (txs)->tx_off, \
! 170: sizeof(struct fxp_cb_tx), (p))
! 171:
! 172: #define FXP_MCS_SYNC(sc, p) \
! 173: bus_dmamap_sync((sc)->sc_dmat, (sc)->tx_cb_map, \
! 174: offsetof(struct fxp_ctrl, u.mcs), sizeof(struct fxp_cb_mcs), (p))
! 175:
! 176: #define FXP_IAS_SYNC(sc, p) \
! 177: bus_dmamap_sync((sc)->sc_dmat, (sc)->tx_cb_map, \
! 178: offsetof(struct fxp_ctrl, u.ias), sizeof(struct fxp_cb_ias), (p))
! 179:
! 180: #define FXP_CFG_SYNC(sc, p) \
! 181: bus_dmamap_sync((sc)->sc_dmat, (sc)->tx_cb_map, \
! 182: offsetof(struct fxp_ctrl, u.cfg), sizeof(struct fxp_cb_config), (p))
! 183:
! 184: #define FXP_UCODE_SYNC(sc, p) \
! 185: bus_dmamap_sync((sc)->sc_dmat, (sc)->tx_cb_map, \
! 186: offsetof(struct fxp_ctrl, u.code), sizeof(struct fxp_cb_ucode), (p))
! 187:
! 188: #define FXP_STATS_SYNC(sc, p) \
! 189: bus_dmamap_sync((sc)->sc_dmat, (sc)->tx_cb_map, \
! 190: offsetof(struct fxp_ctrl, stats), sizeof(struct fxp_stats), (p))
! 191:
! 192: #define FXP_MBUF_SYNC(sc, m, p) \
! 193: bus_dmamap_sync((sc)->sc_dmat, (m), 0, (m)->dm_mapsize, (p))
CVSweb