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