[BACK]Return to if_lmcvar.h CVS log [TXT][DIR] Up to [local] / sys / dev / pci

Annotation of sys/dev/pci/if_lmcvar.h, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: if_lmcvar.h,v 1.10 2006/03/25 22:41:45 djm Exp $ */
                      2: /*     $NetBSD: if_lmcvar.h,v 1.1 1999/03/25 03:32:43 explorer Exp $   */
                      3:
                      4: /*-
                      5:  * Copyright (c) 1997-1999 LAN Media Corporation (LMC)
                      6:  * All rights reserved.  www.lanmedia.com
                      7:  *
                      8:  * This code is written by Michael Graff <graff@vix.com> for LMC.
                      9:  * The code is derived from permitted modifications to software created
                     10:  * by Matt Thomas (matt@3am-software.com).
                     11:  *
                     12:  * Redistribution and use in source and binary forms, with or without
                     13:  * modification, are permitted provided that the following conditions
                     14:  * are met:
                     15:  * 1. Redistributions of source code must retain the above copyright
                     16:  *    notice, this list of conditions and the following disclaimer.
                     17:  * 2. Redistributions in binary form must reproduce the above
                     18:  *    copyright notice, this list of conditions and the following disclaimer
                     19:  *    in the documentation and/or other materials provided with the
                     20:  *    distribution.
                     21:  * 3. All marketing or advertising materials mentioning features or
                     22:  *    use of this software must display the following acknowledgement:
                     23:  *      This product includes software developed by LAN Media Corporation
                     24:  *      and its contributors.
                     25:  * 4. Neither the name of LAN Media Corporation nor the names of its
                     26:  *    contributors may be used to endorse or promote products derived
                     27:  *    from this software without specific prior written permission.
                     28:  *
                     29:  * THIS SOFTWARE IS PROVIDED BY LAN MEDIA CORPORATION AND CONTRIBUTORS
                     30:  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
                     31:  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
                     32:  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
                     33:  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
                     34:  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
                     35:  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
                     36:  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
                     37:  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
                     38:  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
                     39:  * THE POSSIBILITY OF SUCH DAMAGE.
                     40:  */
                     41:
                     42: /*-
                     43:  * Copyright (c) 1994-1997 Matt Thomas (matt@3am-software.com)
                     44:  * All rights reserved.
                     45:  *
                     46:  * Redistribution and use in source and binary forms, with or without
                     47:  * modification, are permitted provided that the following conditions
                     48:  * are met:
                     49:  * 1. Redistributions of source code must retain the above copyright
                     50:  *    notice, this list of conditions and the following disclaimer.
                     51:  * 2. The name of the author may not be used to endorse or promote products
                     52:  *    derived from this software without specific prior written permission
                     53:  *
                     54:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     55:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     56:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     57:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
                     58:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
                     59:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
                     60:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
                     61:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
                     62:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
                     63:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     64:  */
                     65:
                     66: #define LMC_MTU 1500
                     67: #define PPP_HEADER_LEN 4
                     68: #define BIG_PACKET
                     69: #define        LMC_DATA_PER_DESC       2032
                     70:
                     71: /*
                     72:  * This turns on all sort of debugging stuff and make the
                     73:  * driver much larger.
                     74:  */
                     75: #if 0
                     76: #define LMC_DEBUG
                     77: typedef enum {
                     78:     LMC_21040_GENERIC,         /* Generic 21040 (works with most any board) */
                     79:     LMC_21140_ISV,                     /* Digital Semicondutor 21140 ISV SROM Format */
                     80:     LMC_21142_ISV,                     /* Digital Semicondutor 21142 ISV SROM Format */
                     81:     LMC_21143_ISV,                     /* Digital Semicondutor 21143 ISV SROM Format */
                     82:     LMC_21140_DEC_EB,                  /* Digital Semicondutor 21140 Evaluation Board */
                     83:     LMC_21140_MII,                     /* 21140[A] with MII */
                     84:     LMC_21140_DEC_DE500,               /* Digital DE500-?? 10/100 */
                     85:     LMC_21140_SMC_9332,                        /* SMC 9332 */
                     86:     LMC_21140_COGENT_EM100,            /* Cogent EM100 100 only */
                     87:     LMC_21140_ZNYX_ZX34X,              /* ZNYX ZX342 10/100 */
                     88:     LMC_21140_ASANTE,                  /* AsanteFast 10/100 */
                     89:     LMC_21140_EN1207,                  /* Accton EN2107 10/100 BNC */
                     90:     LMC_21041_GENERIC                  /* Generic 21041 card */
                     91: } lmc_board_t;
                     92:
                     93: typedef enum {
                     94:     LMC_MEDIAPOLL_TIMER,               /* 100ms timer fired */
                     95:     LMC_MEDIAPOLL_FASTTIMER,           /* <100ms timer fired */
                     96:     LMC_MEDIAPOLL_LINKFAIL,            /* called from interrupt routine */
                     97:     LMC_MEDIAPOLL_LINKPASS,            /* called from interrupt routine */
                     98:     LMC_MEDIAPOLL_START,               /* start a media probe (called from reset) */
                     99:     LMC_MEDIAPOLL_TXPROBE_OK,          /* txprobe succeeded */
                    100:     LMC_MEDIAPOLL_TXPROBE_FAILED,      /* txprobe failed */
                    101:     LMC_MEDIAPOLL_MAX
                    102: } lmc_mediapoll_event_t;
                    103: #define DP(x)  printf x
                    104: #else
                    105: #define DP(x)
                    106: #endif
                    107:
                    108: /*
                    109:  * the dec chip has its own idea of what a receive error is, but we don't
                    110:  * want to use it, as it will get the crc error wrong when 16-bit
                    111:  * crcs are used.  So, we only care about certain conditions.
                    112:  */
                    113: #ifndef TULIP_DSTS_RxMIIERR
                    114: #define TULIP_DSTS_RxMIIERR 0x00000008
                    115: #endif
                    116: #define LMC_DSTS_ERRSUM (TULIP_DSTS_RxMIIERR)
                    117:
                    118: /*
                    119:  * This is the PCI configuration support.
                    120:  */
                    121: #define        PCI_CFID        0x00    /* Configuration ID */
                    122: #define        PCI_CFCS        0x04    /* Configurtion Command/Status */
                    123: #define        PCI_CFRV        0x08    /* Configuration Revision */
                    124: #define        PCI_CFLT        0x0c    /* Configuration Latency Timer */
                    125: #define        PCI_CBIO        0x10    /* Configuration Base IO Address */
                    126: #define        PCI_CBMA        0x14    /* Configuration Base Memory Address */
                    127: #define PCI_SSID       0x2c    /* subsystem config register */
                    128: #define        PCI_CFIT        0x3c    /* Configuration Interrupt */
                    129: #define        PCI_CFDA        0x40    /* Configuration Driver Area */
                    130:
                    131: #define        LMC_HZ  10
                    132:
                    133: #ifndef TULIP_GP_PINSET
                    134: #define TULIP_GP_PINSET                        0x00000100L
                    135: #endif
                    136: #ifndef TULIP_BUSMODE_READMULTIPLE
                    137: #define TULIP_BUSMODE_READMULTIPLE     0x00200000L
                    138: #endif
                    139:
                    140: #define LMC_CSR_READ(sc, csr) \
                    141:     bus_space_read_4((sc)->lmc_bustag, (sc)->lmc_bushandle, (sc)->lmc_csrs.csr)
                    142: #define LMC_CSR_WRITE(sc, csr, val) \
                    143:     bus_space_write_4((sc)->lmc_bustag, (sc)->lmc_bushandle, (sc)->lmc_csrs.csr, (val))
                    144:
                    145: #define LMC_CSR_READBYTE(sc, csr) \
                    146:     bus_space_read_1((sc)->lmc_bustag, (sc)->lmc_bushandle, (sc)->lmc_csrs.csr)
                    147: #define LMC_CSR_WRITEBYTE(sc, csr, val) \
                    148:     bus_space_write_1((sc)->lmc_bustag, (sc)->lmc_bushandle, (sc)->lmc_csrs.csr, (val))
                    149:
                    150: #define        LMC_PCI_CSRSIZE 8
                    151: #define        LMC_PCI_CSROFFSET       0
                    152:
                    153: /*
                    154:  * This structure contains "pointers" for the registers on
                    155:  * the various 21x4x chips.
                    156:  */
                    157: typedef struct {
                    158:     lmc_csrptr_t csr_busmode;                  /* CSR0 */
                    159:     lmc_csrptr_t csr_txpoll;                   /* CSR1 */
                    160:     lmc_csrptr_t csr_rxpoll;                   /* CSR2 */
                    161:     lmc_csrptr_t csr_rxlist;                   /* CSR3 */
                    162:     lmc_csrptr_t csr_txlist;                   /* CSR4 */
                    163:     lmc_csrptr_t csr_status;                   /* CSR5 */
                    164:     lmc_csrptr_t csr_command;                  /* CSR6 */
                    165:     lmc_csrptr_t csr_intr;                     /* CSR7 */
                    166:     lmc_csrptr_t csr_missed_frames;            /* CSR8 */
                    167:     lmc_csrptr_t csr_9;                                /* CSR9 */
                    168:     lmc_csrptr_t csr_10;                       /* CSR10 */
                    169:     lmc_csrptr_t csr_11;                       /* CSR11 */
                    170:     lmc_csrptr_t csr_12;                       /* CSR12 */
                    171:     lmc_csrptr_t csr_13;                       /* CSR13 */
                    172:     lmc_csrptr_t csr_14;                       /* CSR14 */
                    173:     lmc_csrptr_t csr_15;                       /* CSR15 */
                    174: } lmc_regfile_t;
                    175:
                    176: #define        csr_enetrom             csr_9   /* 21040 */
                    177: #define        csr_reserved            csr_10  /* 21040 */
                    178: #define        csr_full_duplex         csr_11  /* 21040 */
                    179: #define        csr_bootrom             csr_10  /* 21041/21140A/?? */
                    180: #define        csr_gp                  csr_12  /* 21140* */
                    181: #define        csr_watchdog            csr_15  /* 21140* */
                    182: #define        csr_gp_timer            csr_11  /* 21041/21140* */
                    183: #define        csr_srom_mii            csr_9   /* 21041/21140* */
                    184: #define        csr_sia_status          csr_12  /* 2104x */
                    185: #define csr_sia_connectivity   csr_13  /* 2104x */
                    186: #define csr_sia_tx_rx          csr_14  /* 2104x */
                    187: #define csr_sia_general                csr_15  /* 2104x */
                    188:
                    189: /*
                    190:  * While 21x4x allows chaining of its descriptors, this driver
                    191:  * doesn't take advantage of it.  We keep the descriptors in a
                    192:  * traditional FIFO ring.
                    193:  */
                    194: struct lmc_ringinfo {
                    195:     lmc_desc_t *ri_first;      /* first entry in ring */
                    196:     lmc_desc_t *ri_last;       /* one after last entry */
                    197:     lmc_desc_t *ri_nextin;     /* next to processed by host */
                    198:     lmc_desc_t *ri_nextout;    /* next to processed by adapter */
                    199:     int ri_max;
                    200:     int ri_free;
                    201: };
                    202:
                    203: /*
                    204:  * The 21040 has a stupid restriction in that the receive
                    205:  * buffers must be longword aligned.  But since Ethernet
                    206:  * headers are not a multiple of longwords in size this forces
                    207:  * the data to non-longword aligned.  Since IP requires the
                    208:  * data to be longword aligned, we need to copy it after it has
                    209:  * been DMA'ed in our memory.
                    210:  *
                    211:  * Since we have to copy it anyways, we might as well as allocate
                    212:  * dedicated receive space for the input.  This allows to use a
                    213:  * small receive buffer size and more ring entries to be able to
                    214:  * better keep with a flood of tiny Ethernet packets.
                    215:  *
                    216:  * The receive space MUST ALWAYS be a multiple of the page size.
                    217:  * And the number of receive descriptors multiplied by the size
                    218:  * of the receive buffers must equal the recevive space.  This
                    219:  * is so that we can manipulate the page tables so that even if a
                    220:  * packet wraps around the end of the receive space, we can
                    221:  * treat it as virtually contiguous.
                    222:  *
                    223:  * The above used to be true (the stupid restriction is still true)
                    224:  * but we gone to directly DMA'ing into MBUFs (unless it's on an
                    225:  * architecture which can't handle unaligned accesses) because with
                    226:  * 100Mb/s cards the copying is just too much of a hit.
                    227:  */
                    228:
                    229: #define        LMC_RXDESCS             48
                    230: #define        LMC_TXDESCS             128
                    231: #define        LMC_RXQ_TARGET  32
                    232: #if LMC_RXQ_TARGET >= LMC_RXDESCS
                    233: #error LMC_RXQ_TARGET must be less than LMC_RXDESCS
                    234: #endif
                    235:
                    236: #define        LMC_RX_BUFLEN           ((MCLBYTES < 2048 ? MCLBYTES : 2048) - 16)
                    237:
                    238: #define        LMC_LINK_UP             1
                    239: #define        LMC_LINK_DOWN           0
                    240:
                    241: typedef enum {
                    242:     LMC_21140, LMC_21140A,
                    243:     LMC_CHIPID_UNKNOWN
                    244: } lmc_chipid_t;
                    245:
                    246: #define        LMC_BIT(b)              (1L << ((int)(b)))
                    247:
                    248: typedef struct {
                    249:     /*
                    250:      * Transmit Statistics
                    251:      */
                    252:     u_int32_t dot3StatsSingleCollisionFrames;
                    253:     u_int32_t dot3StatsMultipleCollisionFrames;
                    254:     u_int32_t dot3StatsSQETestErrors;
                    255:     u_int32_t dot3StatsDeferredTransmissions;
                    256:     u_int32_t dot3StatsLateCollisions;
                    257:     u_int32_t dot3StatsExcessiveCollisions;
                    258:     u_int32_t dot3StatsCarrierSenseErrors;
                    259:     u_int32_t dot3StatsInternalMacTransmitErrors;
                    260:     u_int32_t dot3StatsInternalTransmitUnderflows;     /* not in rfc1650! */
                    261:     u_int32_t dot3StatsInternalTransmitBabbles;                /* not in rfc1650! */
                    262:     /*
                    263:      * Receive Statistics
                    264:      */
                    265:     u_int32_t dot3StatsMissedFrames;   /* not in rfc1650! */
                    266:     u_int32_t dot3StatsAlignmentErrors;
                    267:     u_int32_t dot3StatsFCSErrors;
                    268:     u_int32_t dot3StatsFrameTooLongs;
                    269:     u_int32_t dot3StatsInternalMacReceiveErrors;
                    270: } lmc_dot3_stats_t;
                    271:
                    272: /*
                    273:  * Now to important stuff.  This is softc structure (where does softc
                    274:  * come from??? No idea) for the tulip device.
                    275:  *
                    276:  */
                    277: struct lmc___softc {
                    278:     struct device lmc_dev;             /* base device */
                    279:     void *lmc_ih;                      /* intrrupt vectoring */
                    280:     void *lmc_ats;                     /* shutdown hook */
                    281:     bus_space_tag_t lmc_bustag;
                    282:     bus_space_handle_t lmc_bushandle;  /* CSR region handle */
                    283:     pci_chipset_tag_t lmc_pc;
                    284:
                    285:     struct sppp lmc_sppp;
                    286: #define lmc_if lmc_sppp.pp_if
                    287:
                    288:     u_int8_t lmc_enaddr[6];            /* yes, a small hack... */
                    289:     lmc_regfile_t lmc_csrs;
                    290:     volatile u_int32_t lmc_txtick;
                    291:     volatile u_int32_t lmc_rxtick;
                    292:     u_int32_t lmc_flags;
                    293:
                    294:     u_int32_t lmc_features;    /* static bits indicating features of chip */
                    295:     u_int32_t lmc_intrmask;    /* our copy of csr_intr */
                    296:     u_int32_t lmc_cmdmode;     /* our copy of csr_cmdmode */
                    297:     u_int32_t lmc_last_system_error : 3;       /* last system error (only value is LMC_SYSTEMERROR is also set) */
                    298:     u_int32_t lmc_system_errors;       /* number of system errors encountered */
                    299:     u_int32_t lmc_statusbits;  /* status bits from CSR5 that may need to be printed */
                    300:
                    301:     u_int8_t lmc_revinfo;                      /* revision of chip */
                    302:     u_int8_t lmc_cardtype;             /* LMC_CARDTYPE_HSSI or ..._DS3 */
                    303:     u_int32_t          lmc_gpio_io;    /* state of in/out settings */
                    304:     u_int32_t          lmc_gpio;       /* state of outputs */
                    305:     u_int8_t lmc_gp;
                    306:
                    307:     lmc_chipid_t lmc_chipid;           /* type of chip we are using */
                    308:     u_int32_t lmc_miireg16;
                    309:     struct ifqueue lmc_txq;
                    310:     struct ifqueue lmc_rxq;
                    311:     lmc_dot3_stats_t lmc_dot3stats;
                    312:     lmc_ringinfo_t lmc_rxinfo;
                    313:     lmc_ringinfo_t lmc_txinfo;
                    314:     u_int8_t lmc_rombuf[128];
                    315:     lmc_media_t *lmc_media;
                    316:     lmc_ctl_t ictl;
                    317:
                    318:     bus_dma_tag_t lmc_dmatag;          /* bus DMA tag */
                    319:     bus_dmamap_t lmc_setupmap;
                    320:     bus_dmamap_t lmc_txdescmap;
                    321:     bus_dmamap_t lmc_txmaps[LMC_TXDESCS];
                    322:     unsigned lmc_txmaps_free;
                    323:     bus_dmamap_t lmc_rxdescmap;
                    324:     bus_dmamap_t lmc_rxmaps[LMC_RXDESCS];
                    325:     unsigned lmc_rxmaps_free;
                    326:
                    327:     struct device *lmc_pci_busno;      /* needed for multiport boards */
                    328:     u_int8_t lmc_pci_devno;            /* needed for multiport boards */
                    329:     lmc_desc_t *lmc_rxdescs;
                    330:     lmc_desc_t *lmc_txdescs;
                    331:
                    332:     u_int32_t  lmc_crcSize;
                    333:     u_int32_t  tx_clockState;
                    334:     char       lmc_yel, lmc_blue, lmc_red;     /* for T1 and DS3 */
                    335:     char       lmc_timing;                     /* for HSSI and SSI */
                    336:     u_int16_t  t1_alarm1_status;
                    337:     u_int16_t  t1_alarm2_status;
                    338: #if defined(LMC_DEBUG)
                    339:     /*
                    340:      * Debugging/Statistical information
                    341:      */
                    342:     struct {
                    343:        lmc_media_t dbg_last_media;
                    344:        u_int32_t dbg_intrs;
                    345:        u_int32_t dbg_media_probes;
                    346:        u_int32_t dbg_txprobe_nocarr;
                    347:        u_int32_t dbg_txprobe_exccoll;
                    348:        u_int32_t dbg_link_downed;
                    349:        u_int32_t dbg_link_suspected;
                    350:        u_int32_t dbg_link_intrs;
                    351:        u_int32_t dbg_link_pollintrs;
                    352:        u_int32_t dbg_link_failures;
                    353:        u_int32_t dbg_nway_starts;
                    354:        u_int32_t dbg_nway_failures;
                    355:        u_int16_t dbg_phyregs[32][4];
                    356:        u_int32_t dbg_rxlowbufs;
                    357:        u_int32_t dbg_rxintrs;
                    358:        u_int32_t dbg_last_rxintrs;
                    359:        u_int32_t dbg_high_rxintrs_hz;
                    360:        u_int32_t dbg_no_txmaps;
                    361:        u_int32_t dbg_txput_finishes[8];
                    362:        u_int32_t dbg_txprobes_ok;
                    363:        u_int32_t dbg_txprobes_failed;
                    364:        u_int32_t dbg_events[LMC_MEDIAPOLL_MAX];
                    365:        u_int32_t dbg_rxpktsperintr[LMC_RXDESCS];
                    366:     } lmc_dbg;
                    367: #endif
                    368: };
                    369:
                    370: /*
                    371:  * lmc_flags
                    372:  */
                    373: #define        LMC_IFUP                0x00000001
                    374: #define        LMC_00000002            0x00000002
                    375: #define        LMC_00000004            0x00000004
                    376: #define        LMC_00000008            0x00000008
                    377: #define        LMC_00000010            0x00000010
                    378: #define        LMC_MODEMOK             0x00000020
                    379: #define        LMC_00000040            0x00000040
                    380: #define        LMC_00000080            0x00000080
                    381: #define        LMC_RXACT               0x00000100
                    382: #define        LMC_INRESET             0x00000200
                    383: #define        LMC_NEEDRESET           0x00000400
                    384: #define        LMC_00000800            0x00000800
                    385: #define        LMC_00001000            0x00001000
                    386: #define        LMC_00002000            0x00002000
                    387: #define        LMC_WANTTXSTART         0x00004000
                    388: #define        LMC_NEWTXTHRESH         0x00008000
                    389: #define        LMC_NOAUTOSENSE         0x00010000
                    390: #define        LMC_PRINTLINKUP         0x00020000
                    391: #define        LMC_LINKUP              0x00040000
                    392: #define        LMC_RXBUFSLOW           0x00080000
                    393: #define        LMC_NOMESSAGES          0x00100000
                    394: #define        LMC_SYSTEMERROR         0x00200000
                    395: #define        LMC_TIMEOUTPENDING      0x00400000
                    396: #define        LMC_00800000            0x00800000
                    397: #define        LMC_01000000            0x01000000
                    398: #define        LMC_02000000            0x02000000
                    399: #define        LMC_RXIGNORE            0x04000000
                    400: #define        LMC_08000000            0x08000000
                    401: #define        LMC_10000000            0x10000000
                    402: #define        LMC_20000000            0x20000000
                    403: #define        LMC_40000000            0x40000000
                    404: #define        LMC_80000000            0x80000000
                    405:
                    406: /*
                    407:  * lmc_features
                    408:  */
                    409: #define        LMC_HAVE_GPR            0x00000001      /* have gp register (140[A]) */
                    410: #define        LMC_HAVE_RXBADOVRFLW    0x00000002      /* RX corrupts on overflow */
                    411: #define        LMC_HAVE_POWERMGMT      0x00000004      /* Snooze/sleep modes */
                    412: #define        LMC_HAVE_MII            0x00000008      /* Some medium on MII */
                    413: #define        LMC_HAVE_SIANWAY        0x00000010      /* SIA does NWAY */
                    414: #define        LMC_HAVE_DUALSENSE      0x00000020      /* SIA senses both AUI & TP */
                    415: #define        LMC_HAVE_SIAGP          0x00000040      /* SIA has a GP port */
                    416: #define        LMC_HAVE_BROKEN_HASH    0x00000080      /* Broken Multicast Hash */
                    417: #define        LMC_HAVE_ISVSROM        0x00000100      /* uses ISV SROM Format */
                    418: #define        LMC_HAVE_BASEROM        0x00000200      /* Board ROM can be cloned */
                    419: #define        LMC_HAVE_SLAVEDROM      0x00000400      /* Board ROM cloned */
                    420: #define        LMC_HAVE_SLAVEDINTR     0x00000800      /* Board slaved interrupt */
                    421: #define        LMC_HAVE_SHAREDINTR     0x00001000      /* Board shares interrupts */
                    422: #define        LMC_HAVE_OKROM          0x00002000      /* ROM was recognized */
                    423: #define        LMC_HAVE_NOMEDIA        0x00004000      /* did not detect any media */
                    424: #define        LMC_HAVE_STOREFWD       0x00008000      /* have CMD_STOREFWD */
                    425: #define        LMC_HAVE_SIA100         0x00010000      /* has LS100 in SIA status */
                    426:
                    427: #if 0
                    428: static const char * const lmc_status_bits[] = {
                    429:     NULL,
                    430:     "transmit process stopped",
                    431:     NULL,
                    432:     "transmit jabber timeout",
                    433:
                    434:     NULL,
                    435:     "transmit underflow",
                    436:     NULL,
                    437:     "receive underflow",
                    438:
                    439:     "receive process stopped",
                    440:     "receive watchdog timeout",
                    441:     NULL,
                    442:     NULL,
                    443:
                    444:     "link failure",
                    445:     NULL,
                    446:     NULL,
                    447: };
                    448: #endif
                    449:
                    450: /*
                    451:  * This driver supports a maximum of 32 devices.
                    452:  */
                    453: #define        LMC_MAX_DEVICES 32
                    454:
                    455: #define LMC_RXDESC_PRESYNC(sc, di, s)  \
                    456:        bus_dmamap_sync((sc)->lmc_dmatag, (sc)->lmc_rxdescmap, \
                    457:                   (caddr_t) di - (caddr_t) (sc)->lmc_rxdescs, \
                    458:                   (s), BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE)
                    459: #define LMC_RXDESC_POSTSYNC(sc, di, s) \
                    460:        bus_dmamap_sync((sc)->lmc_dmatag, (sc)->lmc_rxdescmap, \
                    461:                   (caddr_t) di - (caddr_t) (sc)->lmc_rxdescs, \
                    462:                   (s), BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE)
                    463: #define        LMC_RXMAP_PRESYNC(sc, map) \
                    464:        bus_dmamap_sync((sc)->lmc_dmatag, (map), 0, (map)->dm_mapsize, \
                    465:                        BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE)
                    466: #define        LMC_RXMAP_POSTSYNC(sc, map) \
                    467:        bus_dmamap_sync((sc)->lmc_dmatag, (map), 0, (map)->dm_mapsize, \
                    468:                        BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE)
                    469: #define        LMC_RXMAP_CREATE(sc, mapp) \
                    470:        bus_dmamap_create((sc)->lmc_dmatag, LMC_RX_BUFLEN, 2, \
                    471:                          LMC_DATA_PER_DESC, 0, \
                    472:                          BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW, (mapp))
                    473:
                    474: #define LMC_TXDESC_PRESYNC(sc, di, s)  \
                    475:        bus_dmamap_sync((sc)->lmc_dmatag, (sc)->lmc_txdescmap, \
                    476:                        (caddr_t) di - (caddr_t) (sc)->lmc_txdescs, \
                    477:                        (s), BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE)
                    478: #define LMC_TXDESC_POSTSYNC(sc, di, s) \
                    479:        bus_dmamap_sync((sc)->lmc_dmatag, (sc)->lmc_txdescmap, \
                    480:                        (caddr_t) di - (caddr_t) (sc)->lmc_txdescs, \
                    481:                        (s), BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE)
                    482: #define        LMC_TXMAP_PRESYNC(sc, map) \
                    483:        bus_dmamap_sync((sc)->lmc_dmatag, (map), 0, (map)->dm_mapsize, \
                    484:                        BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE)
                    485: #define        LMC_TXMAP_POSTSYNC(sc, map) \
                    486:        bus_dmamap_sync((sc)->lmc_dmatag, (map), 0, (map)->dm_mapsize, \
                    487:                        BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE)
                    488: #define        LMC_TXMAP_CREATE(sc, mapp) \
                    489:        bus_dmamap_create((sc)->lmc_dmatag, LMC_DATA_PER_DESC, \
                    490:                          LMC_MAX_TXSEG, LMC_DATA_PER_DESC, \
                    491:                          0, BUS_DMA_NOWAIT, (mapp))
                    492:
                    493: typedef void ifnet_ret_t;
                    494: typedef u_long ioctl_cmd_t;
                    495: extern struct cfattach lmc_ca;
                    496: extern struct cfdriver lmc_cd;
                    497: #define        LMC_UNIT_TO_SOFTC(unit) ((lmc_softc_t *) lmc_cd.cd_devs[unit])
                    498: #define LMC_IFP_TO_SOFTC(ifp)         ((lmc_softc_t *)((ifp)->if_softc))
                    499: #define        lmc_unit                        lmc_dev.dv_unit
                    500: #define        lmc_xname                       lmc_if.if_xname
                    501: #define        LMC_RAISESPL()          splnet()
                    502: #define        LMC_RAISESOFTSPL()              splsoftnet()
                    503: #define        LMC_RESTORESPL(s)               splx(s)
                    504: /*     #define lmc_enaddr                      lmc_enaddr */
                    505: #define        loudprintf                      printf
                    506: #define        LMC_PRINTF_FMT          "%s"
                    507: #define        LMC_PRINTF_ARGS         sc->lmc_xname
                    508:
                    509: #ifndef LMC_PRINTF_FMT
                    510: #define        LMC_PRINTF_FMT          "%s%d"
                    511: #endif
                    512: #ifndef LMC_PRINTF_ARGS
                    513: #define        LMC_PRINTF_ARGS         sc->lmc_name, sc->lmc_unit
                    514: #endif
                    515:
                    516: #ifndef LMC_BURSTSIZE
                    517: #define        LMC_BURSTSIZE(unit)             3
                    518: #endif
                    519:
                    520: #ifndef lmc_unit
                    521: #define        lmc_unit        lmc_sppp.pp_if.if_unit
                    522: #endif
                    523:
                    524: #ifndef lmc_name
                    525: #define        lmc_name        lmc_sppp.pp_if.if_name
                    526: #endif
                    527:
                    528: #if !defined(lmc_bpf)
                    529: #define        lmc_bpf lmc_sppp.pp_if.if_bpf
                    530: #endif
                    531:
                    532: #ifndef LMC_RAISESPL
                    533: #define        LMC_RAISESPL()          splnet()
                    534: #endif
                    535: #ifndef LMC_RAISESOFTSPL
                    536: #define        LMC_RAISESOFTSPL()              splnet()
                    537: #endif
                    538: #ifndef TULUP_RESTORESPL
                    539: #define        LMC_RESTORESPL(s)               splx(s)
                    540: #endif
                    541:
                    542: /*
                    543:  * While I think FreeBSD's 2.2 change to the bpf is a nice simplification,
                    544:  * it does add yet more conditional code to this driver.  Sigh.
                    545:  */
                    546: #if !defined(LMC_BPF_MTAP) && NBPFILTER > 0
                    547: #define        LMC_BPF_MTAP(sc, m, d)          bpf_mtap((sc)->lmc_bpf, m, d)
                    548: #define        LMC_BPF_TAP(sc, p, l, d)        bpf_tap((sc)->lmc_bpf, p, l, d)
                    549: #define        LMC_BPF_ATTACH(sc)      bpfattach(&(sc)->lmc_bpf, &(sc)->lmc_sppp.pp_if, DLT_PPP, PPP_HEADER_LEN)
                    550: #endif
                    551:
                    552: /*
                    553:  * However, this change to FreeBSD I am much less enamored with.
                    554:  */
                    555: #if !defined(LMC_EADDR_FMT)
                    556: #define        LMC_EADDR_FMT           "%s"
                    557: #define        LMC_EADDR_ARGS(addr)    ether_sprintf(addr)
                    558: #endif
                    559:
                    560: #define        LMC_CRC32_POLY  0xEDB88320UL    /* CRC-32 Poly -- Little Endian */
                    561: #define        LMC_MAX_TXSEG           30
                    562:
                    563: #define        LMC_ADDREQUAL(a1, a2) \
                    564:        (((u_int16_t *)a1)[0] == ((u_int16_t *)a2)[0] \
                    565:         && ((u_int16_t *)a1)[1] == ((u_int16_t *)a2)[1] \
                    566:         && ((u_int16_t *)a1)[2] == ((u_int16_t *)a2)[2])
                    567: #define        LMC_ADDRBRDCST(a1) \
                    568:        (((u_int16_t *)a1)[0] == 0xFFFFU \
                    569:         && ((u_int16_t *)a1)[1] == 0xFFFFU \
                    570:         && ((u_int16_t *)a1)[2] == 0xFFFFU)
                    571:
                    572: typedef int lmc_spl_t;
                    573:
                    574: #define LMC_GETCTX(m, t)       ((t) (m)->m_pkthdr.rcvif + 0)
                    575: #define LMC_SETCTX(m, c)       ((void) ((m)->m_pkthdr.rcvif = (void *) (c)))

CVSweb