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

Annotation of sys/dev/pci/if_em.h, Revision 1.1

1.1     ! nbrk        1: /**************************************************************************
        !             2:
        !             3: Copyright (c) 2001-2003, Intel Corporation
        !             4: All rights reserved.
        !             5:
        !             6: Redistribution and use in source and binary forms, with or without
        !             7: modification, are permitted provided that the following conditions are met:
        !             8:
        !             9:  1. Redistributions of source code must retain the above copyright notice,
        !            10:     this list of conditions and the following disclaimer.
        !            11:
        !            12:  2. Redistributions in binary form must reproduce the above copyright
        !            13:     notice, this list of conditions and the following disclaimer in the
        !            14:     documentation and/or other materials provided with the distribution.
        !            15:
        !            16:  3. Neither the name of the Intel Corporation nor the names of its
        !            17:     contributors may be used to endorse or promote products derived from
        !            18:     this software without specific prior written permission.
        !            19:
        !            20: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
        !            21: AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
        !            22: IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
        !            23: ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
        !            24: LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
        !            25: CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
        !            26: SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
        !            27: INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
        !            28: CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
        !            29: ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
        !            30: POSSIBILITY OF SUCH DAMAGE.
        !            31:
        !            32: ***************************************************************************/
        !            33:
        !            34: /* $FreeBSD: if_em.h,v 1.26 2004/09/01 23:22:41 pdeuskar Exp $ */
        !            35: /* $OpenBSD: if_em.h,v 1.35 2007/05/30 06:29:17 ckuethe Exp $ */
        !            36:
        !            37: #ifndef _EM_H_DEFINED_
        !            38: #define _EM_H_DEFINED_
        !            39:
        !            40: #include "bpfilter.h"
        !            41: #include "vlan.h"
        !            42:
        !            43: #include <sys/param.h>
        !            44: #include <sys/systm.h>
        !            45: #include <sys/sockio.h>
        !            46: #include <sys/mbuf.h>
        !            47: #include <sys/malloc.h>
        !            48: #include <sys/kernel.h>
        !            49: #include <sys/device.h>
        !            50: #include <sys/socket.h>
        !            51:
        !            52: #include <net/if.h>
        !            53: #include <net/if_dl.h>
        !            54: #include <net/if_media.h>
        !            55:
        !            56: #ifdef INET
        !            57: #include <netinet/in.h>
        !            58: #include <netinet/in_systm.h>
        !            59: #include <netinet/in_var.h>
        !            60: #include <netinet/ip.h>
        !            61: #include <netinet/if_ether.h>
        !            62: #include <netinet/tcp.h>
        !            63: #include <netinet/udp.h>
        !            64: #endif
        !            65:
        !            66: #if NVLAN > 0
        !            67: #include <net/if_types.h>
        !            68: #include <net/if_vlan_var.h>
        !            69: #endif
        !            70:
        !            71: #if NBPFILTER > 0
        !            72: #include <net/bpf.h>
        !            73: #endif
        !            74:
        !            75: #include <uvm/uvm_extern.h>
        !            76:
        !            77: #include <dev/pci/pcireg.h>
        !            78: #include <dev/pci/pcivar.h>
        !            79: #include <dev/pci/pcidevs.h>
        !            80:
        !            81: #include <dev/pci/if_em_hw.h>
        !            82:
        !            83: /* Tunables */
        !            84:
        !            85: /*
        !            86:  * EM_TXD: Maximum number of Transmit Descriptors
        !            87:  * Valid Range: 80-256 for 82542 and 82543-based adapters
        !            88:  *              80-4096 for others
        !            89:  * Default Value: 256
        !            90:  *   This value is the number of transmit descriptors allocated by the driver.
        !            91:  *   Increasing this value allows the driver to queue more transmits. Each
        !            92:  *   descriptor is 16 bytes.
        !            93:  *   Since TDLEN should be multiple of 128bytes, the number of transmit
        !            94:  *   desscriptors should meet the following condition.
        !            95:  *      (num_tx_desc * sizeof(struct em_tx_desc)) % 128 == 0
        !            96:  */
        !            97: #define EM_MIN_TXD                     12
        !            98: #define EM_MAX_TXD_82543               256
        !            99: #define EM_MAX_TXD                     512
        !           100:
        !           101: /*
        !           102:  * EM_RXD - Maximum number of receive Descriptors
        !           103:  * Valid Range: 80-256 for 82542 and 82543-based adapters
        !           104:  *              80-4096 for others
        !           105:  * Default Value: 256
        !           106:  *   This value is the number of receive descriptors allocated by the driver.
        !           107:  *   Increasing this value allows the driver to buffer more incoming packets.
        !           108:  *   Each descriptor is 16 bytes.  A receive buffer is also allocated for each
        !           109:  *   descriptor. The maximum MTU size is 16110.
        !           110:  *   Since TDLEN should be multiple of 128bytes, the number of transmit
        !           111:  *   desscriptors should meet the following condition.
        !           112:  *      (num_tx_desc * sizeof(struct em_tx_desc)) % 128 == 0
        !           113:  */
        !           114: #define EM_MIN_RXD                     12
        !           115: #define EM_MAX_RXD                     256
        !           116:
        !           117: /*
        !           118:  * MAX_INTS_PER_SEC (ITR - Interrupt Throttle Register)
        !           119:  * The Interrupt Throttle Register (ITR) limits the delivery of interrupts
        !           120:  * to a reasonable rate by providing a guaranteed inter-interrupt delay
        !           121:  * between interrupts asserted by the Ethernet controller.
        !           122:  */
        !           123: #define MAX_INTS_PER_SEC       8000
        !           124: #define DEFAULT_ITR            1000000000/(MAX_INTS_PER_SEC * 256)
        !           125:
        !           126: /*
        !           127:  * EM_TIDV - Transmit Interrupt Delay Value
        !           128:  * Valid Range: 0-65535 (0=off)
        !           129:  * Default Value: 64
        !           130:  *   This value delays the generation of transmit interrupts in units of
        !           131:  *   1.024 microseconds. Transmit interrupt reduction can improve CPU
        !           132:  *   efficiency if properly tuned for specific network traffic. If the
        !           133:  *   system is reporting dropped transmits, this value may be set too high
        !           134:  *   causing the driver to run out of available transmit descriptors.
        !           135:  */
        !           136: #define EM_TIDV                                64
        !           137:
        !           138: /*
        !           139:  * EM_TADV - Transmit Absolute Interrupt Delay Value
        !           140:  * (Not valid for 82542/82543/82544)
        !           141:  * Valid Range: 0-65535 (0=off)
        !           142:  * Default Value: 64
        !           143:  *   This value, in units of 1.024 microseconds, limits the delay in which a
        !           144:  *   transmit interrupt is generated. Useful only if EM_TIDV is non-zero,
        !           145:  *   this value ensures that an interrupt is generated after the initial
        !           146:  *   packet is sent on the wire within the set amount of time.  Proper tuning,
        !           147:  *   along with EM_TIDV, may improve traffic throughput in specific
        !           148:  *   network conditions.
        !           149:  */
        !           150: #define EM_TADV                                64
        !           151:
        !           152: /*
        !           153:  * EM_RDTR - Receive Interrupt Delay Timer (Packet Timer)
        !           154:  * Valid Range: 0-65535 (0=off)
        !           155:  * Default Value: 0
        !           156:  *   This value delays the generation of receive interrupts in units of 1.024
        !           157:  *   microseconds.  Receive interrupt reduction can improve CPU efficiency if
        !           158:  *   properly tuned for specific network traffic. Increasing this value adds
        !           159:  *   extra latency to frame reception and can end up decreasing the throughput
        !           160:  *   of TCP traffic. If the system is reporting dropped receives, this value
        !           161:  *   may be set too high, causing the driver to run out of available receive
        !           162:  *   descriptors.
        !           163:  *
        !           164:  *   CAUTION: When setting EM_RDTR to a value other than 0, adapters
        !           165:  *            may hang (stop transmitting) under certain network conditions.
        !           166:  *            If this occurs a WATCHDOG message is logged in the system
        !           167:  *            event log. In addition, the controller is automatically reset,
        !           168:  *            restoring the network connection. To eliminate the potential
        !           169:  *            for the hang ensure that EM_RDTR is set to 0.
        !           170:  */
        !           171: #define EM_RDTR                                0
        !           172:
        !           173: /*
        !           174:  * Receive Interrupt Absolute Delay Timer (Not valid for 82542/82543/82544)
        !           175:  * Valid Range: 0-65535 (0=off)
        !           176:  * Default Value: 64
        !           177:  *   This value, in units of 1.024 microseconds, limits the delay in which a
        !           178:  *   receive interrupt is generated. Useful only if EM_RDTR is non-zero,
        !           179:  *   this value ensures that an interrupt is generated after the initial
        !           180:  *   packet is received within the set amount of time.  Proper tuning,
        !           181:  *   along with EM_RDTR, may improve traffic throughput in specific network
        !           182:  *   conditions.
        !           183:  */
        !           184: #define EM_RADV                                64
        !           185:
        !           186: /*
        !           187:  * This parameter controls the duration of transmit watchdog timer.
        !           188:  */
        !           189: #define EM_TX_TIMEOUT                  5       /* set to 5 seconds */
        !           190:
        !           191: /*
        !           192:  * These parameters control when the driver calls the routine to reclaim
        !           193:  * transmit descriptors.
        !           194:  */
        !           195: #define EM_TX_CLEANUP_THRESHOLD                (sc->num_tx_desc / 8)
        !           196: #define EM_TX_OP_THRESHOLD             (sc->num_tx_desc / 32)
        !           197:
        !           198: /*
        !           199:  * This parameter controls whether or not autonegotation is enabled.
        !           200:  *              0 - Disable autonegotiation
        !           201:  *              1 - Enable  autonegotiation
        !           202:  */
        !           203: #define DO_AUTO_NEG                    1
        !           204:
        !           205: /*
        !           206:  * This parameter control whether or not the driver will wait for
        !           207:  * autonegotiation to complete.
        !           208:  *              1 - Wait for autonegotiation to complete
        !           209:  *              0 - Don't wait for autonegotiation to complete
        !           210:  */
        !           211: #define WAIT_FOR_AUTO_NEG_DEFAULT      0
        !           212:
        !           213: /*
        !           214:  * EM_MASTER_SLAVE is only defined to enable a workaround for a known
        !           215:  * compatibility issue with 82541/82547 devices and some switches.
        !           216:  * See the "Known Limitations" section of the README file for a complete
        !           217:  * description and a list of affected switches.
        !           218:  *
        !           219:  *              0 = Hardware default
        !           220:  *              1 = Master mode
        !           221:  *              2 = Slave mode
        !           222:  *              3 = Auto master/slave
        !           223:  */
        !           224: /* #define EM_MASTER_SLAVE     2 */
        !           225:
        !           226: /* Tunables -- End */
        !           227:
        !           228: #define AUTONEG_ADV_DEFAULT    (ADVERTISE_10_HALF | ADVERTISE_10_FULL | \
        !           229:                                 ADVERTISE_100_HALF | ADVERTISE_100_FULL | \
        !           230:                                 ADVERTISE_1000_FULL)
        !           231:
        !           232: #define EM_MMBA                                0x0010 /* Mem base address */
        !           233: #define EM_FLASH                       0x0014 /* Flash memory on ICH8 */
        !           234: #define EM_ROUNDUP(size, unit) (((size) + (unit) - 1) & ~((unit) - 1))
        !           235:
        !           236: #define EM_SMARTSPEED_DOWNSHIFT                3
        !           237: #define EM_SMARTSPEED_MAX              15
        !           238:
        !           239: #define MAX_NUM_MULTICAST_ADDRESSES    128
        !           240:
        !           241: /*
        !           242:  * TDBA/RDBA should be aligned on 16 byte boundary. But TDLEN/RDLEN should be
        !           243:  * multiple of 128 bytes. So we align TDBA/RDBA on 128 byte boundary. This will
        !           244:  * also optimize cache line size effect. H/W supports up to cache line size 128.
        !           245:  */
        !           246: #define EM_DBA_ALIGN                   128
        !           247:
        !           248: #define SPEED_MODE_BIT (1<<21)         /* On PCI-E MACs only */
        !           249:
        !           250: /* Defines for printing debug information */
        !           251: #define DEBUG_INIT     0
        !           252: #define DEBUG_IOCTL    0
        !           253: #define DEBUG_HW       0
        !           254:
        !           255: #define INIT_DEBUGOUT(S)               if (DEBUG_INIT)  printf(S "\n")
        !           256: #define INIT_DEBUGOUT1(S, A)           if (DEBUG_INIT)  printf(S "\n", A)
        !           257: #define INIT_DEBUGOUT2(S, A, B)                if (DEBUG_INIT)  printf(S "\n", A, B)
        !           258: #define IOCTL_DEBUGOUT(S)              if (DEBUG_IOCTL) printf(S "\n")
        !           259: #define IOCTL_DEBUGOUT1(S, A)          if (DEBUG_IOCTL) printf(S "\n", A)
        !           260: #define IOCTL_DEBUGOUT2(S, A, B)       if (DEBUG_IOCTL) printf(S "\n", A, B)
        !           261: #define HW_DEBUGOUT(S)                 if (DEBUG_HW) printf(S "\n")
        !           262: #define HW_DEBUGOUT1(S, A)             if (DEBUG_HW) printf(S "\n", A)
        !           263: #define HW_DEBUGOUT2(S, A, B)          if (DEBUG_HW) printf(S "\n", A, B)
        !           264:
        !           265: /* Supported RX Buffer Sizes */
        !           266: #define EM_RXBUFFER_2048       2048
        !           267: #define EM_RXBUFFER_4096       4096
        !           268: #define EM_RXBUFFER_8192       8192
        !           269: #define EM_RXBUFFER_16384      16384
        !           270:
        !           271: #define EM_MAX_SCATTER         64
        !           272: #define EM_TSO_SIZE            65535
        !           273:
        !           274: struct em_buffer {
        !           275:        int             next_eop;       /* Index of the desc to watch */
        !           276:        struct mbuf     *m_head;
        !           277:        bus_dmamap_t    map;            /* bus_dma map for packet */
        !           278: };
        !           279:
        !           280: /*
        !           281:  * Bus dma allocation structure used by
        !           282:  * em_dma_malloc and em_dma_free.
        !           283:  */
        !           284: struct em_dma_alloc {
        !           285:        bus_addr_t              dma_paddr;
        !           286:        caddr_t                 dma_vaddr;
        !           287:        bus_dma_tag_t           dma_tag;
        !           288:        bus_dmamap_t            dma_map;
        !           289:        bus_dma_segment_t       dma_seg;
        !           290:        bus_size_t              dma_size;
        !           291:        int                     dma_nseg;
        !           292: };
        !           293:
        !           294: typedef enum _XSUM_CONTEXT_T {
        !           295:        OFFLOAD_NONE,
        !           296:        OFFLOAD_TCP_IP,
        !           297:        OFFLOAD_UDP_IP
        !           298: } XSUM_CONTEXT_T;
        !           299:
        !           300: /* For 82544 PCI-X Workaround */
        !           301: typedef struct _ADDRESS_LENGTH_PAIR
        !           302: {
        !           303:        u_int64_t       address;
        !           304:        u_int32_t       length;
        !           305: } ADDRESS_LENGTH_PAIR, *PADDRESS_LENGTH_PAIR;
        !           306:
        !           307: typedef struct _DESCRIPTOR_PAIR
        !           308: {
        !           309:        ADDRESS_LENGTH_PAIR descriptor[4];
        !           310:        u_int32_t       elements;
        !           311: } DESC_ARRAY, *PDESC_ARRAY;
        !           312:
        !           313: /* Our adapter structure */
        !           314: struct em_softc {
        !           315:        struct device   sc_dv;
        !           316:        struct arpcom   interface_data;
        !           317:        struct em_hw    hw;
        !           318:
        !           319:        /* OpenBSD operating-system-specific structures */
        !           320:        struct em_osdep osdep;
        !           321:        struct ifmedia  media;
        !           322:        int             io_rid;
        !           323:
        !           324:        void            *sc_intrhand;
        !           325:        struct timeout  em_intr_enable;
        !           326:        struct timeout  timer_handle;
        !           327:        struct timeout  tx_fifo_timer_handle;
        !           328:        int             if_flags;
        !           329:        void            *sc_powerhook;
        !           330:        void            *sc_shutdownhook;
        !           331:
        !           332: #ifdef __STRICT_ALIGNMENT
        !           333:        /* Used for carrying forward alignment adjustments */
        !           334:        unsigned char   align_buf[ETHER_ALIGN]; /* tail of unaligned packet */
        !           335:        u_int8_t        align_buf_len;          /* bytes in tail */
        !           336: #endif /* __STRICT_ALIGNMENT */
        !           337:
        !           338:        /* Info about the board itself */
        !           339:        u_int32_t       part_num;
        !           340:        u_int8_t        link_active;
        !           341:        u_int16_t       link_speed;
        !           342:        u_int16_t       link_duplex;
        !           343:        u_int32_t       smartspeed;
        !           344:        u_int32_t       tx_int_delay;
        !           345:        u_int32_t       tx_abs_int_delay;
        !           346:        u_int32_t       rx_int_delay;
        !           347:        u_int32_t       rx_abs_int_delay;
        !           348:
        !           349:        XSUM_CONTEXT_T  active_checksum_context;
        !           350:
        !           351:        /*
        !           352:         * Transmit definitions
        !           353:         *
        !           354:         * We have an array of num_tx_desc descriptors (handled
        !           355:         * by the controller) paired with an array of tx_buffers
        !           356:         * (at tx_buffer_area).
        !           357:         * The index of the next available descriptor is next_avail_tx_desc.
        !           358:         * The number of remaining tx_desc is num_tx_desc_avail.
        !           359:         */
        !           360:        struct em_dma_alloc     txdma;          /* bus_dma glue for tx desc */
        !           361:        struct em_tx_desc       *tx_desc_base;
        !           362:        u_int32_t               next_avail_tx_desc;
        !           363:        u_int32_t               next_tx_to_clean;
        !           364:        volatile u_int16_t      num_tx_desc_avail;
        !           365:        u_int16_t               num_tx_desc;
        !           366:        u_int32_t               txd_cmd;
        !           367:        struct em_buffer        *tx_buffer_area;
        !           368:        bus_dma_tag_t           txtag;          /* dma tag for tx */
        !           369:
        !           370:        /*
        !           371:         * Receive definitions
        !           372:         *
        !           373:         * we have an array of num_rx_desc rx_desc (handled by the
        !           374:         * controller), and paired with an array of rx_buffers
        !           375:         * (at rx_buffer_area).
        !           376:         * The next pair to check on receive is at offset next_rx_desc_to_check
        !           377:         */
        !           378:        struct em_dma_alloc     rxdma;          /* bus_dma glue for rx desc */
        !           379:        struct em_rx_desc       *rx_desc_base;
        !           380:        u_int32_t               next_rx_desc_to_check;
        !           381:        u_int32_t               rx_buffer_len;
        !           382:        u_int16_t               num_rx_desc;
        !           383:        struct em_buffer        *rx_buffer_area;
        !           384:        bus_dma_tag_t           rxtag;
        !           385:        bus_dmamap_t            rx_sparemap;
        !           386:
        !           387:        /*
        !           388:         * First/last mbuf pointers, for
        !           389:         * collecting multisegment RX packets.
        !           390:         */
        !           391:        struct mbuf             *fmp;
        !           392:        struct mbuf             *lmp;
        !           393:
        !           394:        /* Misc stats maintained by the driver */
        !           395:        unsigned long           dropped_pkts;
        !           396:        unsigned long           mbuf_alloc_failed;
        !           397:        unsigned long           mbuf_cluster_failed;
        !           398:        unsigned long           no_tx_desc_avail1;
        !           399:        unsigned long           no_tx_desc_avail2;
        !           400:        unsigned long           no_tx_map_avail;
        !           401:        unsigned long           no_tx_dma_setup;
        !           402:        unsigned long           watchdog_events;
        !           403:        unsigned long           rx_overruns;
        !           404:
        !           405:        /* Used in for 82547 10Mb Half workaround */
        !           406:        #define EM_PBA_BYTES_SHIFT      0xA
        !           407:        #define EM_TX_HEAD_ADDR_SHIFT   7
        !           408:        #define EM_PBA_TX_MASK          0xFFFF0000
        !           409:        #define EM_FIFO_HDR             0x10
        !           410:
        !           411:        #define EM_82547_PKT_THRESH     0x3e0
        !           412:
        !           413:        u_int32_t       tx_fifo_size;
        !           414:        u_int32_t       tx_fifo_head;
        !           415:        u_int32_t       tx_fifo_head_addr;
        !           416:        u_int64_t       tx_fifo_reset_cnt;
        !           417:        u_int64_t       tx_fifo_wrk_cnt;
        !           418:        u_int32_t       tx_head_addr;
        !           419:
        !           420:        /* For 82544 PCI-X Workaround */
        !           421:        boolean_t       pcix_82544;
        !           422:
        !           423:        struct em_hw_stats stats;
        !           424: };
        !           425:
        !           426: #endif /* _EM_H_DEFINED_ */

CVSweb