[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

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