root/dev/pci/if_devar.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. tulip_regfile_t
  2. tulip_ringinfo_t
  3. TULIP_21040
  4. TULIP_DE425
  5. TULIP_21041
  6. TULIP_21140
  7. TULIP_21142
  8. TULIP_21140A
  9. TULIP_21143
  10. TULIP_CHIPID_UNKNOWN
  11. tulip_chipid_t
  12. TULIP_MEDIA_UNKNOWN
  13. TULIP_MEDIA_10BASET
  14. TULIP_MEDIA_10BASET_FD
  15. TULIP_MEDIA_BNC
  16. TULIP_MEDIA_AUI
  17. TULIP_MEDIA_EXTSIA
  18. TULIP_MEDIA_AUIBNC
  19. TULIP_MEDIA_100BASETX
  20. TULIP_MEDIA_100BASETX_FD
  21. TULIP_MEDIA_100BASET4
  22. TULIP_MEDIA_100BASEFX
  23. TULIP_MEDIA_100BASEFX_FD
  24. TULIP_MEDIA_MAX
  25. tulip_media_t
  26. tulip_media_info_t
  27. TULIP_21040_GENERIC
  28. TULIP_21140_ISV
  29. TULIP_21142_ISV
  30. TULIP_21143_ISV
  31. TULIP_21140_DEC_EB
  32. TULIP_21140_MII
  33. TULIP_21140_DEC_DE500
  34. TULIP_21140_SMC_9332
  35. TULIP_21140_COGENT_EM100
  36. TULIP_21140_ZNYX_ZX34X
  37. TULIP_21140_ASANTE
  38. TULIP_21140_EN1207
  39. TULIP_21041_GENERIC
  40. tulip_board_t
  41. TULIP_MEDIAPOLL_TIMER
  42. TULIP_MEDIAPOLL_FASTTIMER
  43. TULIP_MEDIAPOLL_LINKFAIL
  44. TULIP_MEDIAPOLL_LINKPASS
  45. TULIP_MEDIAPOLL_START
  46. TULIP_MEDIAPOLL_TXPROBE_OK
  47. TULIP_MEDIAPOLL_TXPROBE_FAILED
  48. TULIP_MEDIAPOLL_MAX
  49. tulip_mediapoll_event_t
  50. TULIP_LINK_DOWN
  51. TULIP_LINK_UP
  52. TULIP_LINK_UNKNOWN
  53. tulip_link_status_t
  54. tulip_boardsw_t
  55. PHY_MODE_10T
  56. PHY_MODE_100TX
  57. PHY_MODE_100T4
  58. PHY_MODE_FULLDUPLEX
  59. PHY_MODE_MAX
  60. tulip_phy_mode_t
  61. tulip_phy_modedata_t
  62. tulip_phy_attr_t
  63. TULIP_PROBE_INACTIVE
  64. TULIP_PROBE_PHYRESET
  65. TULIP_PROBE_PHYAUTONEG
  66. TULIP_PROBE_GPRTEST
  67. TULIP_PROBE_MEDIATEST
  68. TULIP_PROBE_FAILED
  69. tulip_probe_state_t
  70. tulip_dot3_stats_t
  71. TULIP_PERFREAD
  72. TULIP_PERFREAD

    1 /*      $OpenBSD: if_devar.h,v 1.27 2006/07/08 04:15:36 brad Exp $      */
    2 /*      $NetBSD: if_devar.h,v 1.13 1997/06/08 18:46:36 thorpej Exp $    */
    3 
    4 /*-
    5  * Copyright (c) 1994-1997 Matt Thomas (matt@3am-software.com)
    6  * All rights reserved.
    7  *
    8  * Redistribution and use in source and binary forms, with or without
    9  * modification, are permitted provided that the following conditions
   10  * are met:
   11  * 1. Redistributions of source code must retain the above copyright
   12  *    notice, this list of conditions and the following disclaimer.
   13  * 2. The name of the author may not be used to endorse or promote products
   14  *    derived from this software without specific prior written permission
   15  *
   16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
   17  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   18  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
   19  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
   20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
   21  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
   22  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
   23  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
   25  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   26  *
   27  * Id: if_devar.h,v 1.23 1997/06/03 18:51:16 thomas Exp
   28  */
   29 
   30 #define TULIP_CSR_READ(sc, csr) \
   31     bus_space_read_4((sc)->tulip_bustag, (sc)->tulip_bushandle, (sc)->tulip_csrs.csr)
   32 #define TULIP_CSR_WRITE(sc, csr, val) \
   33     bus_space_write_4((sc)->tulip_bustag, (sc)->tulip_bushandle, (sc)->tulip_csrs.csr, (val))
   34 
   35 #define TULIP_CSR_READBYTE(sc, csr) \
   36     bus_space_read_1((sc)->tulip_bustag, (sc)->tulip_bushandle, (sc)->tulip_csrs.csr)
   37 #define TULIP_CSR_WRITEBYTE(sc, csr, val) \
   38     bus_space_write_1((sc)->tulip_bustag, (sc)->tulip_bushandle, (sc)->tulip_csrs.csr, (val))
   39 
   40 #ifdef TULIP_IOMAPPED
   41 #define TULIP_PCI_CSRSIZE       8
   42 #define TULIP_PCI_CSROFFSET     0
   43 #else /* TULIP_IOMAPPED */
   44 #define TULIP_PCI_CSRSIZE       8
   45 #define TULIP_PCI_CSROFFSET     0
   46 #endif /* TULIP_IOMAPPED */
   47 
   48 /*
   49  * This structure contains "pointers" for the registers on
   50  * the various 21x4x chips.  CSR0 through CSR8 are common
   51  * to all chips.  After that, it gets messy...
   52  */
   53 typedef struct {
   54     bus_size_t csr_busmode;                     /* CSR0 */
   55     bus_size_t csr_txpoll;                      /* CSR1 */
   56     bus_size_t csr_rxpoll;                      /* CSR2 */
   57     bus_size_t csr_rxlist;                      /* CSR3 */
   58     bus_size_t csr_txlist;                      /* CSR4 */
   59     bus_size_t csr_status;                      /* CSR5 */
   60     bus_size_t csr_command;                     /* CSR6 */
   61     bus_size_t csr_intr;                        /* CSR7 */
   62     bus_size_t csr_missed_frames;               /* CSR8 */
   63     bus_size_t csr_9;                   /* CSR9 */
   64     bus_size_t csr_10;                  /* CSR10 */
   65     bus_size_t csr_11;                  /* CSR11 */
   66     bus_size_t csr_12;                  /* CSR12 */
   67     bus_size_t csr_13;                  /* CSR13 */
   68     bus_size_t csr_14;                  /* CSR14 */
   69     bus_size_t csr_15;                  /* CSR15 */
   70 } tulip_regfile_t;
   71 
   72 #define csr_enetrom             csr_9   /* 21040 */
   73 #define csr_reserved            csr_10  /* 21040 */
   74 #define csr_full_duplex         csr_11  /* 21040 */
   75 #define csr_bootrom             csr_10  /* 21041/21140A/?? */
   76 #define csr_gp                  csr_12  /* 21140* */
   77 #define csr_watchdog            csr_15  /* 21140* */
   78 #define csr_gp_timer            csr_11  /* 21041/21140* */
   79 #define csr_srom_mii            csr_9   /* 21041/21140* */
   80 #define csr_sia_status          csr_12  /* 2104x */
   81 #define csr_sia_connectivity    csr_13  /* 2104x */
   82 #define csr_sia_tx_rx           csr_14  /* 2104x */
   83 #define csr_sia_general         csr_15  /* 2104x */
   84 
   85 /*
   86  * While 21x4x allows chaining of its descriptors, this driver
   87  * doesn't take advantage of it.  We keep the descriptors in a
   88  * traditional FIFO ring.
   89  */
   90 typedef struct {
   91     tulip_desc_t *ri_first;     /* first entry in ring */
   92     tulip_desc_t *ri_last;      /* one after last entry */
   93     tulip_desc_t *ri_nextin;    /* next to processed by host */
   94     tulip_desc_t *ri_nextout;   /* next to processed by adapter */
   95     int ri_max;
   96     int ri_free;
   97 } tulip_ringinfo_t;
   98 
   99 /*
  100  * The 21040 has a stupid restriction in that the receive
  101  * buffers must be longword aligned.  But since Ethernet
  102  * headers are not a multiple of longwords in size this forces
  103  * the data to non-longword aligned.  Since IP requires the
  104  * data to be longword aligned, we need to copy it after it has
  105  * been DMA'ed in our memory.
  106  *
  107  * Since we have to copy it anyways, we might as well as allocate
  108  * dedicated receive space for the input.  This allows to use a
  109  * small receive buffer size and more ring entries to be able to
  110  * better keep with a flood of tiny Ethernet packets.
  111  *
  112  * The receive space MUST ALWAYS be a multiple of the page size.
  113  * And the number of receive descriptors multiplied by the size
  114  * of the receive buffers must equal the recevive space.  This
  115  * is so that we can manipulate the page tables so that even if a
  116  * packet wraps around the end of the receive space, we can
  117  * treat it as virtually contiguous.
  118  *
  119  * The above used to be true (the stupid restriction is still true)
  120  * but we gone to directly DMA'ing into MBUFs (unless it's on an
  121  * architecture which can't handle unaligned accesses) because with
  122  * 100Mb/s cards the copying is just too much of a hit.
  123  */
  124 #if !defined(__i386__)
  125 #define TULIP_COPY_RXDATA       1
  126 #endif
  127 
  128 #define TULIP_DATA_PER_DESC     2032
  129 #define TULIP_TXTIMER           4
  130 #define TULIP_RXDESCS           48
  131 #define TULIP_TXDESCS           32
  132 #define TULIP_RXQ_TARGET        32
  133 #if TULIP_RXQ_TARGET >= TULIP_RXDESCS
  134 #error TULIP_RXQ_TARGET must be less than TULIP_RXDESCS
  135 #endif
  136 #define TULIP_RX_BUFLEN         ((MCLBYTES < 2048 ? MCLBYTES : 2048) - 16)
  137 
  138 /*
  139  * Forward reference to make C happy.
  140  */
  141 typedef struct _tulip_softc_t tulip_softc_t;
  142 
  143 /*
  144  * The various controllers support.  Technically the DE425 is just
  145  * a 21040 on EISA.  But since it remarkably difference from normal
  146  * 21040s, we give it its own chip id.
  147  */
  148 
  149 typedef enum {
  150     TULIP_21040, TULIP_DE425,
  151     TULIP_21041,
  152     TULIP_21140, TULIP_21140A, TULIP_21142,
  153     TULIP_21143,
  154     TULIP_CHIPID_UNKNOWN
  155 } tulip_chipid_t;
  156 
  157 /*
  158  * Various physical media types supported.
  159  * BNCAUI is BNC or AUI since on the 21040 you can't really tell
  160  * which is in use.
  161  */
  162 typedef enum {
  163     TULIP_MEDIA_UNKNOWN,
  164     TULIP_MEDIA_10BASET,
  165     TULIP_MEDIA_10BASET_FD,
  166     TULIP_MEDIA_BNC,
  167     TULIP_MEDIA_AUI,
  168     TULIP_MEDIA_EXTSIA,
  169     TULIP_MEDIA_AUIBNC,
  170     TULIP_MEDIA_100BASETX,
  171     TULIP_MEDIA_100BASETX_FD,
  172     TULIP_MEDIA_100BASET4,
  173     TULIP_MEDIA_100BASEFX,
  174     TULIP_MEDIA_100BASEFX_FD,
  175     TULIP_MEDIA_MAX
  176 } tulip_media_t;
  177 
  178 #define TULIP_BIT(b)            (1L << ((int)(b)))
  179 #define TULIP_FDBIT(m)          (1L << ((int)TULIP_MEDIA_ ## m ## _FD))
  180 #define TULIP_MBIT(m)           (1L << ((int)TULIP_MEDIA_ ## m ))
  181 #define TULIP_IS_MEDIA_FD(m)    (TULIP_BIT(m) & \
  182                                  (TULIP_FDBIT(10BASET) \
  183                                   |TULIP_FDBIT(100BASETX) \
  184                                   |TULIP_FDBIT(100BASEFX)))
  185 #define TULIP_CAN_MEDIA_FD(m)   (TULIP_BIT(m) & \
  186                                  (TULIP_MBIT(10BASET) \
  187                                   |TULIP_MBIT(100BASETX) \
  188                                   |TULIP_MBIT(100BASEFX)))
  189 #define TULIP_FD_MEDIA_OF(m)    ((tulip_media_t)((m) + 1))
  190 #define TULIP_HD_MEDIA_OF(m)    ((tulip_media_t)((m) - 1))
  191 #define TULIP_IS_MEDIA_100MB(m) ((m) >= TULIP_MEDIA_100BASETX)
  192 #define TULIP_IS_MEDIA_TP(m)    ((TULIP_BIT(m) & \
  193                                   (TULIP_MBIT(BNC) \
  194                                    |TULIP_MBIT(AUI) \
  195                                    |TULIP_MBIT(AUIBNC) \
  196                                    |TULIP_MBIT(EXTSIA))) == 0)
  197 
  198 #define TULIP_SROM_ATTR_MII             0x0100
  199 #define TULIP_SROM_ATTR_NWAY            0x0200
  200 #define TULIP_SROM_ATTR_AUTOSENSE       0x0400
  201 #define TULIP_SROM_ATTR_POWERUP         0x0800
  202 #define TULIP_SROM_ATTR_NOLINKPASS      0x1000
  203 
  204 typedef struct {
  205     enum {
  206         TULIP_MEDIAINFO_NONE,
  207         TULIP_MEDIAINFO_SIA,
  208         TULIP_MEDIAINFO_GPR,
  209         TULIP_MEDIAINFO_MII,
  210         TULIP_MEDIAINFO_RESET,
  211         TULIP_MEDIAINFO_SYM
  212     } mi_type;
  213     union {
  214         struct {
  215             u_int16_t sia_connectivity;
  216             u_int16_t sia_tx_rx;
  217             u_int16_t sia_general;
  218             u_int32_t sia_gp_control;   /* 21142/21143 */
  219             u_int32_t sia_gp_data;      /* 21142/21143 */
  220         } un_sia;
  221         struct {
  222             u_int32_t gpr_cmdmode;
  223             u_int32_t gpr_gpcontrol;    /* 21142/21143 */
  224             u_int32_t gpr_gpdata;
  225             u_int8_t gpr_actmask;
  226             u_int8_t gpr_actdata;
  227             u_int8_t gpr_default : 1;
  228         } un_gpr;
  229         struct {
  230             u_int32_t mii_mediamask;
  231             u_int16_t mii_capabilities;
  232             u_int16_t mii_advertisement;
  233             u_int16_t mii_full_duplex;
  234             u_int16_t mii_tx_threshold;
  235             u_int16_t mii_interrupt;    /* 21142/21143 */
  236             u_int8_t mii_phyaddr;
  237             u_int8_t mii_gpr_length;
  238             u_int8_t mii_gpr_offset;
  239             u_int8_t mii_reset_length;
  240             u_int8_t mii_reset_offset;
  241             u_int32_t mii_phyid;
  242         } un_mii;
  243     } mi_un;
  244 } tulip_media_info_t;
  245 
  246 #define mi_sia_connectivity     mi_un.un_sia.sia_connectivity
  247 #define mi_sia_tx_rx            mi_un.un_sia.sia_tx_rx
  248 #define mi_sia_general          mi_un.un_sia.sia_general
  249 #define mi_sia_gp_control       mi_un.un_sia.sia_gp_control
  250 #define mi_sia_gp_data          mi_un.un_sia.sia_gp_data
  251 
  252 #define mi_gpcontrol            mi_un.un_gpr.gpr_gpcontrol
  253 #define mi_gpdata               mi_un.un_gpr.gpr_gpdata
  254 #define mi_actmask              mi_un.un_gpr.gpr_actmask
  255 #define mi_actdata              mi_un.un_gpr.gpr_actdata
  256 #define mi_default              mi_un.un_gpr.gpr_default
  257 #define mi_cmdmode              mi_un.un_gpr.gpr_cmdmode
  258 
  259 #define mi_phyaddr              mi_un.un_mii.mii_phyaddr
  260 #define mi_gpr_length           mi_un.un_mii.mii_gpr_length
  261 #define mi_gpr_offset           mi_un.un_mii.mii_gpr_offset
  262 #define mi_reset_length         mi_un.un_mii.mii_reset_length
  263 #define mi_reset_offset         mi_un.un_mii.mii_reset_offset
  264 #define mi_capabilities         mi_un.un_mii.mii_capabilities
  265 #define mi_advertisement        mi_un.un_mii.mii_advertisement
  266 #define mi_full_duplex          mi_un.un_mii.mii_full_duplex
  267 #define mi_tx_threshold         mi_un.un_mii.mii_tx_threshold
  268 #define mi_mediamask            mi_un.un_mii.mii_mediamask
  269 #define mi_mii_interrupt        mi_un.un_mii.mii_interrupt
  270 #define mi_phyid                mi_un.un_mii.mii_phyid
  271 
  272 #define TULIP_MEDIAINFO_SIA_INIT(sc, mi, chipid, media) do { \
  273     (mi)->mi_type = TULIP_MEDIAINFO_SIA; \
  274     sc->tulip_mediums[TULIP_MEDIA_ ## media] = (mi); \
  275     (mi)->mi_sia_connectivity = TULIP_ ## chipid ## _SIACONN_ ## media; \
  276     (mi)->mi_sia_tx_rx        = TULIP_ ## chipid ## _SIATXRX_ ## media; \
  277     (mi)->mi_sia_general      = TULIP_ ## chipid ## _SIAGEN_ ## media; \
  278 } while (0)
  279 
  280 #define TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, media) do {      \
  281     if ((sc)->tulip_mediums[TULIP_MEDIA_ ## media] == NULL      \
  282             && ((mi)->mi_capabilities & PHYSTS_ ## media)) {    \
  283         (sc)->tulip_mediums[TULIP_MEDIA_ ## media] = (mi);      \
  284         (mi)->mi_mediamask |= TULIP_BIT(TULIP_MEDIA_ ## media); \
  285     } \
  286 } while (0)
  287 
  288 #define TULIP_MII_NOPHY         32
  289 /*
  290  * Some boards need to treated specially.  The following enumeration
  291  * identifies the cards with quirks (or those we just want to single
  292  * out for special merit or scorn).
  293  */
  294 typedef enum {
  295     TULIP_21040_GENERIC,                /* Generic 21040 (works with most any board) */
  296     TULIP_21140_ISV,                    /* Digital Semicondutor 21140 ISV SROM Format */
  297     TULIP_21142_ISV,                    /* Digital Semicondutor 21142 ISV SROM Format */
  298     TULIP_21143_ISV,                    /* Digital Semicondutor 21143 ISV SROM Format */
  299     TULIP_21140_DEC_EB,                 /* Digital Semicondutor 21140 Evaluation Board */
  300     TULIP_21140_MII,                    /* 21140[A] with MII */
  301     TULIP_21140_DEC_DE500,              /* Digital DE500-?? 10/100 */
  302     TULIP_21140_SMC_9332,               /* SMC 9332 */
  303     TULIP_21140_COGENT_EM100,           /* Cogent EM100 100 only */
  304     TULIP_21140_ZNYX_ZX34X,             /* ZNYX ZX342 10/100 */
  305     TULIP_21140_ASANTE,                 /* AsanteFast 10/100 */
  306     TULIP_21140_EN1207,                 /* Accton EN2107 10/100 BNC */
  307     TULIP_21041_GENERIC                 /* Generic 21041 card */
  308 } tulip_board_t;
  309 
  310 typedef enum {
  311     TULIP_MEDIAPOLL_TIMER,              /* 100ms timer fired */
  312     TULIP_MEDIAPOLL_FASTTIMER,          /* <100ms timer fired */
  313     TULIP_MEDIAPOLL_LINKFAIL,           /* called from interrupt routine */
  314     TULIP_MEDIAPOLL_LINKPASS,           /* called from interrupt routine */
  315     TULIP_MEDIAPOLL_START,              /* start a media probe (called from reset) */
  316     TULIP_MEDIAPOLL_TXPROBE_OK,         /* txprobe succeeded */
  317     TULIP_MEDIAPOLL_TXPROBE_FAILED,     /* txprobe failed */
  318     TULIP_MEDIAPOLL_MAX
  319 } tulip_mediapoll_event_t;
  320 
  321 typedef enum {
  322     TULIP_LINK_DOWN,                    /* Link is down */
  323     TULIP_LINK_UP,                      /* link is ok */
  324     TULIP_LINK_UNKNOWN                  /* we can't tell either way */
  325 } tulip_link_status_t;
  326 
  327 /*
  328  * This data structure is used to abstract out the quirks.
  329  * media_probe  = tries to determine the media type.
  330  * media_select = enables the current media (or autosenses)
  331  * media_poll   = autosenses media
  332  * media_preset = 21140, etal requires bit to set before the
  333  *                the software reset; hence pre-set.  Should be
  334  *                pre-reset but that's ugly.
  335  */
  336 
  337 typedef struct {
  338     tulip_board_t bd_type;
  339     void (*bd_media_probe)(tulip_softc_t * const sc);
  340     void (*bd_media_select)(tulip_softc_t * const sc);
  341     void (*bd_media_poll)(tulip_softc_t * const sc, tulip_mediapoll_event_t event);
  342     void (*bd_media_preset)(tulip_softc_t * const sc);
  343 } tulip_boardsw_t;
  344 
  345 /*
  346  * The next few declarations are for MII/PHY based board.
  347  *
  348  *    The first enumeration identifies a superset of various datums
  349  * that can be obtained from various PHY chips.  Not all PHYs will
  350  * support all datums.
  351  *    The modedata structure indicates what register contains
  352  * a datum, what mask is applied the register contents, and what the
  353  * result should be.
  354  *    The attr structure records information about a supported PHY.
  355  *    The phy structure records information about a PHY instance.
  356  */
  357 
  358 typedef enum {
  359     PHY_MODE_10T,
  360     PHY_MODE_100TX,
  361     PHY_MODE_100T4,
  362     PHY_MODE_FULLDUPLEX,
  363     PHY_MODE_MAX
  364 } tulip_phy_mode_t;
  365 
  366 typedef struct {
  367     u_int16_t pm_regno;
  368     u_int16_t pm_mask;
  369     u_int16_t pm_value;
  370 } tulip_phy_modedata_t;
  371 
  372 typedef struct {
  373     u_int32_t attr_id;
  374     u_int16_t attr_flags;
  375 #define PHY_NEED_HARD_RESET     0x0001
  376 #define PHY_DUAL_CYCLE_TA       0x0002
  377     tulip_phy_modedata_t attr_modes[PHY_MODE_MAX];
  378 #ifdef TULIP_DEBUG
  379     const char *attr_name;
  380 #endif
  381 } tulip_phy_attr_t;
  382 
  383 /*
  384  * Various probe states used when trying to autosense the media.
  385  */
  386 
  387 typedef enum {
  388     TULIP_PROBE_INACTIVE,
  389     TULIP_PROBE_PHYRESET,
  390     TULIP_PROBE_PHYAUTONEG,
  391     TULIP_PROBE_GPRTEST,
  392     TULIP_PROBE_MEDIATEST,
  393     TULIP_PROBE_FAILED
  394 } tulip_probe_state_t;
  395 
  396 typedef struct {
  397     /*
  398      * Transmit Statistics
  399      */
  400     u_int32_t dot3StatsSingleCollisionFrames;
  401     u_int32_t dot3StatsMultipleCollisionFrames;
  402     u_int32_t dot3StatsSQETestErrors;
  403     u_int32_t dot3StatsDeferredTransmissions;
  404     u_int32_t dot3StatsLateCollisions;
  405     u_int32_t dot3StatsExcessiveCollisions;
  406     u_int32_t dot3StatsCarrierSenseErrors;
  407     u_int32_t dot3StatsInternalMacTransmitErrors;
  408     u_int32_t dot3StatsInternalTransmitUnderflows;      /* not in rfc1650! */
  409     u_int32_t dot3StatsInternalTransmitBabbles;         /* not in rfc1650! */
  410     /*
  411      * Receive Statistics
  412      */
  413     u_int32_t dot3StatsMissedFrames;    /* not in rfc1650! */
  414     u_int32_t dot3StatsAlignmentErrors;
  415     u_int32_t dot3StatsFCSErrors;
  416     u_int32_t dot3StatsFrameTooLongs;
  417     u_int32_t dot3StatsInternalMacReceiveErrors;
  418 } tulip_dot3_stats_t;
  419 
  420 /*
  421  * Now to important stuff.  This is softc structure (where does softc
  422  * come from??? No idea) for the tulip device.
  423  *
  424  */
  425 struct _tulip_softc_t {
  426     struct device tulip_dev;            /* base device */
  427     void *tulip_ih;                     /* intrrupt vectoring */
  428     void *tulip_ats;                    /* shutdown hook */
  429 
  430     bus_space_tag_t tulip_bustag;       /* tag of CSR region being used */
  431     bus_space_handle_t tulip_bushandle; /* handle for CSR region being used */
  432     pci_chipset_tag_t tulip_pc;
  433     u_int8_t tulip_enaddr[ETHER_ADDR_LEN];
  434     struct ifmedia tulip_ifmedia;
  435     bus_dma_tag_t tulip_dmatag;         /* bus DMA tag */
  436     bus_dmamap_t tulip_setupmap;
  437     bus_dmamap_t tulip_txdescmap;
  438     bus_dmamap_t tulip_txmaps[TULIP_TXDESCS];
  439     unsigned tulip_txmaps_free;
  440     bus_dmamap_t tulip_rxdescmap;
  441     bus_dmamap_t tulip_rxmaps[TULIP_RXDESCS];
  442     unsigned tulip_rxmaps_free;
  443     struct arpcom tulip_ac;
  444     struct timeout tulip_ftmo, tulip_stmo;
  445     tulip_regfile_t tulip_csrs;
  446     u_int32_t tulip_flags;
  447 #define TULIP_WANTSETUP         0x00000001
  448 #define TULIP_WANTHASHPERFECT   0x00000002
  449 #define TULIP_WANTHASHONLY      0x00000004
  450 #define TULIP_DOINGSETUP        0x00000008
  451 #define TULIP_PRINTMEDIA        0x00000010
  452 #define TULIP_TXPROBE_ACTIVE    0x00000020
  453 #define TULIP_ALLMULTI          0x00000040
  454 #define TULIP_WANTRXACT         0x00000080
  455 #define TULIP_RXACT             0x00000100
  456 #define TULIP_INRESET           0x00000200
  457 #define TULIP_NEEDRESET         0x00000400
  458 #define TULIP_SQETEST           0x00000800
  459 #define TULIP_FULLDUPLEX        0x00001000
  460 #define TULIP_xxxxxx1           0x00002000
  461 #define TULIP_WANTTXSTART       0x00004000
  462 #define TULIP_NEWTXTHRESH       0x00008000
  463 #define TULIP_NOAUTOSENSE       0x00010000
  464 #define TULIP_PRINTLINKUP       0x00020000
  465 #define TULIP_LINKUP            0x00040000
  466 #define TULIP_RXBUFSLOW         0x00080000
  467 #define TULIP_NOMESSAGES        0x00100000
  468 #define TULIP_SYSTEMERROR       0x00200000
  469 #define TULIP_TIMEOUTPENDING    0x00400000
  470 #define TULIP_xxxxxx2           0x00800000
  471 #define TULIP_TRYNWAY           0x01000000
  472 #define TULIP_DIDNWAY           0x02000000
  473 #define TULIP_RXIGNORE          0x04000000
  474 #define TULIP_PROBE1STPASS      0x08000000
  475 #define TULIP_DEVICEPROBE       0x10000000
  476 #define TULIP_PROMISC           0x20000000
  477 #define TULIP_HASHONLY          0x40000000
  478 #define TULIP_xxxxxx3           0x80000000
  479     /* only 4 bits left! */
  480     u_int32_t tulip_features;   /* static bits indicating features of chip */
  481 #define TULIP_HAVE_GPR          0x00000001      /* have gp register (140[A]) */
  482 #define TULIP_HAVE_RXBADOVRFLW  0x00000002      /* RX corrupts on overflow */
  483 #define TULIP_HAVE_POWERMGMT    0x00000004      /* Snooze/sleep modes */
  484 #define TULIP_HAVE_MII          0x00000008      /* Some medium on MII */
  485 #define TULIP_HAVE_SIANWAY      0x00000010      /* SIA does NWAY */
  486 #define TULIP_HAVE_DUALSENSE    0x00000020      /* SIA senses both AUI & TP */
  487 #define TULIP_HAVE_SIAGP        0x00000040      /* SIA has a GP port */
  488 #define TULIP_HAVE_BROKEN_HASH  0x00000080      /* Broken Multicast Hash */
  489 #define TULIP_HAVE_ISVSROM      0x00000100      /* uses ISV SROM Format */
  490 #define TULIP_HAVE_BASEROM      0x00000200      /* Board ROM can be cloned */
  491 #define TULIP_HAVE_SLAVEDROM    0x00000400      /* Board ROM cloned */
  492 #define TULIP_HAVE_SLAVEDINTR   0x00000800      /* Board slaved interrupt */
  493 #define TULIP_HAVE_SHAREDINTR   0x00001000      /* Board shares interrupts */
  494 #define TULIP_HAVE_OKROM        0x00002000      /* ROM was recognized */
  495 #define TULIP_HAVE_NOMEDIA      0x00004000      /* did not detect any media */
  496 #define TULIP_HAVE_STOREFWD     0x00008000      /* have CMD_STOREFWD */
  497 #define TULIP_HAVE_SIA100       0x00010000      /* has LS100 in SIA status */
  498 #define TULIP_HAVE_OKSROM       0x00020000      /* SROM CRC is OK */
  499     u_int32_t tulip_intrmask;   /* our copy of csr_intr */
  500     u_int32_t tulip_cmdmode;    /* our copy of csr_cmdmode */
  501     u_int32_t tulip_last_system_error : 3;      /* last system error (only value is
  502                                                    TULIP_SYSTEMERROR is also set) */
  503     u_int32_t tulip_txtimer;            /* transmission timer */
  504     u_int32_t tulip_system_errors;      /* number of system errors encountered */
  505     u_int32_t tulip_statusbits; /* status bits from CSR5 that may need to be printed */
  506 
  507     tulip_media_info_t *tulip_mediums[TULIP_MEDIA_MAX]; /* indexes into mediainfo */
  508     tulip_media_t tulip_media;                  /* current media type */
  509     u_int32_t tulip_abilities;  /* remote system's abiltities (as defined in IEEE 802.3u) */
  510 
  511     u_int8_t tulip_revinfo;                     /* revision of chip */
  512     u_int8_t tulip_phyaddr;                     /* 0..31 -- address of current phy */
  513     u_int8_t tulip_gpinit;                      /* active pins on 21140 */
  514     u_int8_t tulip_gpdata;                      /* default gpdata for 21140 */
  515 
  516     struct {
  517         u_int8_t probe_count;                   /* count of probe operations */
  518         int32_t probe_timeout;                  /* time in ms of probe timeout */
  519         tulip_probe_state_t probe_state;        /* current media probe state */
  520         tulip_media_t probe_media;              /* current media being probed */
  521         u_int32_t probe_mediamask;              /* medias checked */
  522         u_int32_t probe_passes;                 /* times autosense failed */
  523         u_int32_t probe_txprobes;               /* txprobes attempted */
  524     } tulip_probe;
  525 #define tulip_probe_count       tulip_probe.probe_count
  526 #define tulip_probe_timeout     tulip_probe.probe_timeout
  527 #define tulip_probe_state       tulip_probe.probe_state
  528 #define tulip_probe_media       tulip_probe.probe_media
  529 #define tulip_probe_mediamask   tulip_probe.probe_mediamask
  530 #define tulip_probe_passes      tulip_probe.probe_passes
  531 
  532     tulip_chipid_t tulip_chipid;                /* type of chip we are using */
  533     const tulip_boardsw_t *tulip_boardsw;       /* board/chip characteristics */
  534     tulip_softc_t *tulip_slaves;                /* slaved devices (ZX3xx) */
  535 #if defined(TULIP_DEBUG)
  536     /*
  537      * Debugging/Statistical information
  538      */
  539     struct {
  540         tulip_media_t dbg_last_media;
  541         u_int32_t dbg_intrs;
  542         u_int32_t dbg_media_probes;
  543         u_int32_t dbg_txprobe_nocarr;
  544         u_int32_t dbg_txprobe_exccoll;
  545         u_int32_t dbg_link_downed;
  546         u_int32_t dbg_link_suspected;
  547         u_int32_t dbg_link_intrs;
  548         u_int32_t dbg_link_pollintrs;
  549         u_int32_t dbg_link_failures;
  550         u_int32_t dbg_nway_starts;
  551         u_int32_t dbg_nway_failures;
  552         u_int16_t dbg_phyregs[32][4];
  553         u_int32_t dbg_rxlowbufs;
  554         u_int32_t dbg_rxintrs;
  555         u_int32_t dbg_last_rxintrs;
  556         u_int32_t dbg_high_rxintrs_hz;
  557         u_int32_t dbg_no_txmaps;
  558         u_int32_t dbg_txput_finishes[8];
  559         u_int32_t dbg_txprobes_ok[TULIP_MEDIA_MAX];
  560         u_int32_t dbg_txprobes_failed[TULIP_MEDIA_MAX];
  561         u_int32_t dbg_events[TULIP_MEDIAPOLL_MAX];
  562         u_int32_t dbg_rxpktsperintr[TULIP_RXDESCS];
  563     } tulip_dbg;
  564 #endif
  565 #if defined(TULIP_PERFSTATS)
  566 #define TULIP_PERF_CURRENT      0
  567 #define TULIP_PERF_PREVIOUS     1
  568 #define TULIP_PERF_TOTAL        2
  569 #define TULIP_PERF_MAX          3
  570     struct tulip_perfstats {
  571         u_quad_t perf_intr_cycles;
  572         u_quad_t perf_ifstart_cycles;
  573         u_quad_t perf_ifioctl_cycles;
  574         u_quad_t perf_ifwatchdog_cycles;
  575         u_quad_t perf_timeout_cycles;
  576         u_quad_t perf_txput_cycles;
  577         u_quad_t perf_txintr_cycles;
  578         u_quad_t perf_rxintr_cycles;
  579         u_quad_t perf_rxget_cycles;
  580         unsigned perf_intr;
  581         unsigned perf_ifstart;
  582         unsigned perf_ifioctl;
  583         unsigned perf_ifwatchdog;
  584         unsigned perf_timeout;
  585         unsigned perf_txput;
  586         unsigned perf_txintr;
  587         unsigned perf_rxintr;
  588         unsigned perf_rxget;
  589     } tulip_perfstats[TULIP_PERF_MAX];
  590 #define tulip_curperfstats              tulip_perfstats[TULIP_PERF_CURRENT]
  591 #endif
  592     struct ifqueue tulip_txq;
  593     struct ifqueue tulip_rxq;
  594     tulip_dot3_stats_t tulip_dot3stats;
  595     tulip_ringinfo_t tulip_rxinfo;
  596     tulip_ringinfo_t tulip_txinfo;
  597     tulip_media_info_t tulip_mediainfo[10];
  598     /*
  599      * The setup buffers for sending the setup frame to the chip.
  600      * one is the one being sent while the other is the one being
  601      * filled.
  602      */
  603     u_int32_t tulip_setupbuf[192/sizeof(u_int32_t)];
  604     u_int32_t tulip_setupdata[192/sizeof(u_int32_t)];
  605     char tulip_boardid[16];             /* buffer for board ID */
  606     u_int8_t tulip_rombuf[128];
  607     struct device *tulip_pci_busno;     /* needed for multiport boards */
  608     u_int8_t tulip_pci_devno;           /* needed for multiport boards */
  609     u_int8_t tulip_connidx;
  610     tulip_srom_connection_t tulip_conntype;
  611     tulip_desc_t *tulip_rxdescs;
  612     tulip_desc_t *tulip_txdescs;
  613 };
  614 
  615 #define TULIP_DO_AUTOSENSE(sc)  (IFM_SUBTYPE((sc)->tulip_ifmedia.ifm_media) == IFM_AUTO)
  616 
  617 static const char * const tulip_chipdescs[] = {
  618     "21040",
  619     NULL,
  620     "21041",
  621     "21140",
  622     "21140A",
  623     "21142",
  624     "21143",
  625     "82C168",
  626 };
  627 
  628 #ifdef TULIP_DEBUG
  629 static const char * const tulip_mediums[] = {
  630     "unknown",                  /* TULIP_MEDIA_UNKNOWN */
  631     "10baseT",                  /* TULIP_MEDIA_10BASET */
  632     "Full Duplex 10baseT",      /* TULIP_MEDIA_10BASET_FD */
  633     "BNC",                      /* TULIP_MEDIA_BNC */
  634     "AUI",                      /* TULIP_MEDIA_AUI */
  635     "External SIA",             /* TULIP_MEDIA_EXTSIA */
  636     "AUI/BNC",                  /* TULIP_MEDIA_AUIBNC */
  637     "100baseTX",                /* TULIP_MEDIA_100BASET */
  638     "Full Duplex 100baseTX",    /* TULIP_MEDIA_100BASET_FD */
  639     "100baseT4",                /* TULIP_MEDIA_100BASET4 */
  640     "100baseFX",                /* TULIP_MEDIA_100BASEFX */
  641     "Full Duplex 100baseFX",    /* TULIP_MEDIA_100BASEFX_FD */
  642 };
  643 #endif
  644 
  645 static const int tulip_media_to_ifmedia[] = {
  646     IFM_ETHER | IFM_NONE,               /* TULIP_MEDIA_UNKNOWN */
  647     IFM_ETHER | IFM_10_T,               /* TULIP_MEDIA_10BASET */
  648     IFM_ETHER | IFM_10_T | IFM_FDX,     /* TULIP_MEDIA_10BASET_FD */
  649     IFM_ETHER | IFM_10_2,               /* TULIP_MEDIA_BNC */
  650     IFM_ETHER | IFM_10_5,               /* TULIP_MEDIA_AUI */
  651     IFM_ETHER | IFM_MANUAL,             /* TULIP_MEDIA_EXTSIA */
  652     IFM_ETHER | IFM_10_5,               /* TULIP_MEDIA_AUIBNC */
  653     IFM_ETHER | IFM_100_TX,             /* TULIP_MEDIA_100BASET */
  654     IFM_ETHER | IFM_100_TX | IFM_FDX,   /* TULIP_MEDIA_100BASET_FD */
  655     IFM_ETHER | IFM_100_T4,             /* TULIP_MEDIA_100BASET4 */
  656     IFM_ETHER | IFM_100_FX,             /* TULIP_MEDIA_100BASEFX */
  657     IFM_ETHER | IFM_100_FX | IFM_FDX,   /* TULIP_MEDIA_100BASEFX_FD */
  658 };
  659 
  660 #ifdef TULIP_DEBUG
  661 static const char * const tulip_system_errors[] = {
  662     "parity error",
  663     "master abort",
  664     "target abort",
  665     "reserved #3",
  666     "reserved #4",
  667     "reserved #5",
  668     "reserved #6",
  669     "reserved #7",
  670 };
  671 
  672 static const char * const tulip_status_bits[] = {
  673     NULL,
  674     "transmit process stopped",
  675     NULL,
  676     "transmit jabber timeout",
  677 
  678     NULL,
  679     "transmit underflow",
  680     NULL,
  681     "receive underflow",
  682 
  683     "receive process stopped",
  684     "receive watchdog timeout",
  685     NULL,
  686     NULL,
  687 
  688     "link failure",
  689     NULL,
  690     NULL,
  691 };
  692 #endif
  693 
  694 static const struct {
  695     tulip_srom_connection_t sc_type;
  696     tulip_media_t sc_media;
  697     u_int32_t sc_attrs;
  698 } tulip_srom_conninfo[] = {
  699     { TULIP_SROM_CONNTYPE_10BASET,              TULIP_MEDIA_10BASET },
  700     { TULIP_SROM_CONNTYPE_BNC,                  TULIP_MEDIA_BNC },
  701     { TULIP_SROM_CONNTYPE_AUI,                  TULIP_MEDIA_AUI },
  702     { TULIP_SROM_CONNTYPE_100BASETX,            TULIP_MEDIA_100BASETX },
  703     { TULIP_SROM_CONNTYPE_100BASET4,            TULIP_MEDIA_100BASET4 },
  704     { TULIP_SROM_CONNTYPE_100BASEFX,            TULIP_MEDIA_100BASEFX },
  705     { TULIP_SROM_CONNTYPE_MII_10BASET,          TULIP_MEDIA_10BASET,
  706                 TULIP_SROM_ATTR_MII },
  707     { TULIP_SROM_CONNTYPE_MII_100BASETX,        TULIP_MEDIA_100BASETX,
  708                 TULIP_SROM_ATTR_MII },
  709     { TULIP_SROM_CONNTYPE_MII_100BASET4,        TULIP_MEDIA_100BASET4,
  710                 TULIP_SROM_ATTR_MII },
  711     { TULIP_SROM_CONNTYPE_MII_100BASEFX,        TULIP_MEDIA_100BASEFX,
  712                 TULIP_SROM_ATTR_MII },
  713     { TULIP_SROM_CONNTYPE_10BASET_NWAY,         TULIP_MEDIA_10BASET,
  714                 TULIP_SROM_ATTR_NWAY },
  715     { TULIP_SROM_CONNTYPE_10BASET_FD,           TULIP_MEDIA_10BASET_FD },
  716     { TULIP_SROM_CONNTYPE_MII_10BASET_FD,       TULIP_MEDIA_10BASET_FD,
  717                 TULIP_SROM_ATTR_MII },
  718     { TULIP_SROM_CONNTYPE_100BASETX_FD,         TULIP_MEDIA_100BASETX_FD },
  719     { TULIP_SROM_CONNTYPE_MII_100BASETX_FD,     TULIP_MEDIA_100BASETX_FD,
  720                 TULIP_SROM_ATTR_MII },
  721     { TULIP_SROM_CONNTYPE_10BASET_NOLINKPASS,   TULIP_MEDIA_10BASET,
  722                 TULIP_SROM_ATTR_NOLINKPASS },
  723     { TULIP_SROM_CONNTYPE_AUTOSENSE,            TULIP_MEDIA_UNKNOWN,
  724                 TULIP_SROM_ATTR_AUTOSENSE },
  725     { TULIP_SROM_CONNTYPE_AUTOSENSE_POWERUP,    TULIP_MEDIA_UNKNOWN,
  726                 TULIP_SROM_ATTR_AUTOSENSE|TULIP_SROM_ATTR_POWERUP },
  727     { TULIP_SROM_CONNTYPE_AUTOSENSE_NWAY,       TULIP_MEDIA_UNKNOWN,
  728                 TULIP_SROM_ATTR_AUTOSENSE|TULIP_SROM_ATTR_NWAY },
  729     { TULIP_SROM_CONNTYPE_NOT_USED,             TULIP_MEDIA_UNKNOWN }
  730 };
  731 #define TULIP_SROM_LASTCONNIDX  \
  732                 (sizeof(tulip_srom_conninfo)/sizeof(tulip_srom_conninfo[0]) - 1)
  733 
  734 static const struct {
  735     tulip_media_t sm_type;
  736     tulip_srom_media_t sm_srom_type;
  737 } tulip_srom_mediums[] = {
  738     {   TULIP_MEDIA_100BASEFX_FD,       TULIP_SROM_MEDIA_100BASEFX_FD   },
  739     {   TULIP_MEDIA_100BASEFX,          TULIP_SROM_MEDIA_100BASEFX      },
  740     {   TULIP_MEDIA_100BASET4,          TULIP_SROM_MEDIA_100BASET4      },
  741     {   TULIP_MEDIA_100BASETX_FD,       TULIP_SROM_MEDIA_100BASETX_FD   },
  742     {   TULIP_MEDIA_100BASETX,          TULIP_SROM_MEDIA_100BASETX      },
  743     {   TULIP_MEDIA_10BASET_FD,         TULIP_SROM_MEDIA_10BASET_FD     },
  744     {   TULIP_MEDIA_AUI,                TULIP_SROM_MEDIA_AUI            },
  745     {   TULIP_MEDIA_BNC,                TULIP_SROM_MEDIA_BNC            },
  746     {   TULIP_MEDIA_10BASET,            TULIP_SROM_MEDIA_10BASET        },
  747     {   TULIP_MEDIA_UNKNOWN                                             }
  748 };
  749 
  750 /*
  751  * This driver supports a maximum of 32 tulip boards.
  752  * This should be enough for the forseeable future.
  753  */
  754 #define TULIP_MAX_DEVICES       32
  755 
  756 #define TULIP_RXDESC_PRESYNC(sc, di, s) \
  757         bus_dmamap_sync((sc)->tulip_dmatag, (sc)->tulip_rxdescmap, \
  758                    (caddr_t) di - (caddr_t) (sc)->tulip_rxdescs, \
  759                    (s), BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE)
  760 #define TULIP_RXDESC_POSTSYNC(sc, di, s)        \
  761         bus_dmamap_sync((sc)->tulip_dmatag, (sc)->tulip_rxdescmap, \
  762                    (caddr_t) di - (caddr_t) (sc)->tulip_rxdescs, \
  763                    (s), BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE)
  764 #define TULIP_RXMAP_PRESYNC(sc, map) \
  765         bus_dmamap_sync((sc)->tulip_dmatag, (map), 0, (map)->dm_mapsize, \
  766                         BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE)
  767 #define TULIP_RXMAP_POSTSYNC(sc, map) \
  768         bus_dmamap_sync((sc)->tulip_dmatag, (map), 0, (map)->dm_mapsize, \
  769                         BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE)
  770 #define TULIP_RXMAP_CREATE(sc, mapp) \
  771         bus_dmamap_create((sc)->tulip_dmatag, TULIP_RX_BUFLEN, 2, \
  772                           TULIP_DATA_PER_DESC, 0, \
  773                           BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW, (mapp))
  774 
  775 #define TULIP_TXDESC_PRESYNC(sc, di, s) \
  776         bus_dmamap_sync((sc)->tulip_dmatag, (sc)->tulip_txdescmap, \
  777                         (caddr_t) di - (caddr_t) (sc)->tulip_txdescs, \
  778                         (s), BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE)
  779 #define TULIP_TXDESC_POSTSYNC(sc, di, s)        \
  780         bus_dmamap_sync((sc)->tulip_dmatag, (sc)->tulip_txdescmap, \
  781                         (caddr_t) di - (caddr_t) (sc)->tulip_txdescs, \
  782                         (s), BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE)
  783 #define TULIP_TXMAP_PRESYNC(sc, map) \
  784         bus_dmamap_sync((sc)->tulip_dmatag, (map), 0, (map)->dm_mapsize, \
  785                         BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE)
  786 #define TULIP_TXMAP_POSTSYNC(sc, map) \
  787         bus_dmamap_sync((sc)->tulip_dmatag, (map), 0, (map)->dm_mapsize, \
  788                         BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE)
  789 #define TULIP_TXMAP_CREATE(sc, mapp) \
  790         bus_dmamap_create((sc)->tulip_dmatag, TULIP_DATA_PER_DESC, \
  791                           TULIP_MAX_TXSEG, TULIP_DATA_PER_DESC, \
  792                           0, BUS_DMA_NOWAIT, (mapp))
  793 
  794 extern struct cfattach de_ca;
  795 extern struct cfdriver de_cd;
  796 #define TULIP_UNIT_TO_SOFTC(unit)       ((tulip_softc_t *) de_cd.cd_devs[unit])
  797 #define TULIP_IFP_TO_SOFTC(ifp)         ((tulip_softc_t *)((ifp)->if_softc))
  798 #define tulip_unit                      tulip_dev.dv_unit
  799 #define tulip_xname                     tulip_dev.dv_cfdata->cf_driver->cd_name
  800 
  801 #define TULIP_PRINTF_FMT                "%s%d"
  802 #define TULIP_PRINTF_ARGS               sc->tulip_xname, sc->tulip_unit
  803 
  804 #define TULIP_BURSTSIZE(unit)           3
  805 
  806 #define tulip_if        tulip_ac.ac_if
  807 #define tulip_name      tulip_if.if_name
  808 #define tulip_enaddr    tulip_ac.ac_enaddr
  809 #define tulip_multicnt  tulip_ac.ac_multicnt
  810 
  811 #define tulip_bpf       tulip_if.if_bpf
  812 
  813 #define tulip_intrfunc_t        int
  814 
  815 #if defined(TULIP_PERFSTATS)
  816 #define TULIP_PERFMERGE(sc, member) \
  817         do { (sc)->tulip_perfstats[TULIP_PERF_TOTAL].member \
  818              += (sc)->tulip_perfstats[TULIP_PERF_CURRENT].member; \
  819          (sc)->tulip_perfstats[TULIP_PERF_PREVIOUS].member \
  820               = (sc)->tulip_perfstats[TULIP_PERF_CURRENT].member; \
  821             (sc)->tulip_perfstats[TULIP_PERF_CURRENT].member = 0; } while (0)
  822 #define TULIP_PERFSTART(name) const tulip_cycle_t perfstart_ ## name = TULIP_PERFREAD();
  823 #define TULIP_PERFEND(name)     do { \
  824             (sc)->tulip_curperfstats.perf_ ## name ## _cycles += TULIP_PERFDIFF(perfstart_ ## name, TULIP_PERFREAD()); \
  825             (sc)->tulip_curperfstats.perf_ ## name++; \
  826         } while (0)
  827 #if defined(__i386__)
  828 typedef u_quad_t tulip_cycle_t;
  829 static __inline__ tulip_cycle_t
  830 TULIP_PERFREAD(
  831     void)
  832 {
  833     tulip_cycle_t x;
  834     __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x));
  835     return x;
  836 }
  837 #define TULIP_PERFDIFF(s, f)    ((f) - (s))
  838 #elif defined(__alpha__)
  839 typedef unsigned long tulip_cycle_t;
  840 static __inline__ tulip_cycle_t
  841 TULIP_PERFREAD(
  842     void)
  843 {
  844     tulip_cycle_t x;
  845     __asm__ volatile ("rpcc %0" : "=r" (x));
  846     return x;
  847 }
  848 #define TULIP_PERFDIFF(s, f)    ((unsigned int) ((f) - (s)))
  849 #endif
  850 #else
  851 #define TULIP_PERFSTART(name)   
  852 #define TULIP_PERFEND(name)     do { } while (0)
  853 #define TULIP_PERFMERGE(s,n)    do { } while (0)
  854 #endif /* TULIP_PERFSTATS */
  855 
  856 #define TULIP_MAX_TXSEG         30
  857 
  858 #define TULIP_ADDREQUAL(a1, a2) \
  859         (((u_int16_t *)a1)[0] == ((u_int16_t *)a2)[0] \
  860          && ((u_int16_t *)a1)[1] == ((u_int16_t *)a2)[1] \
  861          && ((u_int16_t *)a1)[2] == ((u_int16_t *)a2)[2])
  862 #define TULIP_ADDRBRDCST(a1) \
  863         (((u_int16_t *)a1)[0] == 0xFFFFU \
  864          && ((u_int16_t *)a1)[1] == 0xFFFFU \
  865          && ((u_int16_t *)a1)[2] == 0xFFFFU)
  866 
  867 #define TULIP_GETCTX(m, t)      ((t) (m)->m_pkthdr.rcvif + 0)
  868 #define TULIP_SETCTX(m, c)      ((void) ((m)->m_pkthdr.rcvif = (void *) (c)))

/* [<][>][^][v][top][bottom][index][help] */