if_em.h revision 106937
1/************************************************************************** 2 3Copyright (c) 2001-2002, Intel Corporation 4All rights reserved. 5 6Redistribution and use in source and binary forms, with or without 7modification, 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 20THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 24LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30POSSIBILITY OF SUCH DAMAGE. 31 32***************************************************************************/ 33 34/*$FreeBSD: head/sys/dev/em/if_em.h 106937 2002-11-14 23:54:55Z sam $*/ 35 36#ifndef _EM_H_DEFINED_ 37#define _EM_H_DEFINED_ 38 39 40#include <sys/param.h> 41#include <sys/systm.h> 42#include <sys/mbuf.h> 43#include <sys/protosw.h> 44#include <sys/socket.h> 45#include <sys/malloc.h> 46#include <sys/kernel.h> 47#include <sys/sockio.h> 48 49#include <net/if.h> 50#include <net/if_arp.h> 51#include <net/ethernet.h> 52#include <net/if_dl.h> 53#include <net/if_media.h> 54 55#include <net/bpf.h> 56#include <net/if_types.h> 57#include <net/if_vlan_var.h> 58 59#include <netinet/in_systm.h> 60#include <netinet/in.h> 61#include <netinet/ip.h> 62#include <netinet/tcp.h> 63#include <netinet/udp.h> 64 65#include <sys/bus.h> 66#include <machine/bus.h> 67#include <sys/rman.h> 68#include <machine/resource.h> 69#include <vm/vm.h> 70#include <vm/pmap.h> 71#include <machine/clock.h> 72#include <pci/pcivar.h> 73#include <pci/pcireg.h> 74#include "opt_bdg.h" 75 76#include <dev/em/if_em_hw.h> 77 78/* Tunables -- Begin */ 79 80/* 81 * FlowControl 82 * Valid Range: 0-3 (0=none, 1=Rx only, 2=Tx only, 3=Rx&Tx) 83 * Default: Read flow control settings from the EEPROM 84 * This parameter controls the automatic generation(Tx) and response(Rx) to 85 * Ethernet PAUSE frames. 86 */ 87 88 89/* 90 * TxDescriptors 91 * Valid Range: 80-256 for 82542 and 82543-based adapters 92 * 80-4096 for 82540, 82544, 82545, and 82546-based adapters 93 * Default Value: 256 94 * This value is the number of transmit descriptors allocated by the driver. 95 * Increasing this value allows the driver to queue more transmits. Each 96 * descriptor is 16 bytes. 97 */ 98#define EM_MAX_TXD 256 99 100/* 101 * RxDescriptors 102 * Valid Range: 80-256 for 82542 and 82543-based adapters 103 * 80-4096 for 82540, 82544, 82545, and 82546-based adapters 104 * Default Value: 256 105 * This value is the number of receive descriptors allocated by the driver. 106 * Increasing this value allows the driver to buffer more incoming packets. 107 * Each descriptor is 16 bytes. A receive buffer is also allocated for each 108 * descriptor. The maximum MTU size is 16110. 109 * 110 */ 111#define EM_MAX_RXD 256 112 113/* 114 * TxIntDelay 115 * Valid Range: 0-65535 (0=off) 116 * Default Value: 64 117 * This value delays the generation of transmit interrupts in units of 118 * 1.024 microseconds. Transmit interrupt reduction can improve CPU 119 * efficiency if properly tuned for specific network traffic. If the 120 * system is reporting dropped transmits, this value may be set too high 121 * causing the driver to run out of available transmit descriptors. 122 */ 123#define EM_TIDV 128 124 125/* 126 * RxIntDelay 127 * Valid Range: 0-65535 (0=off) 128 * Default Value: 0 129 * This value delays the generation of receive interrupts in units of 1.024 130 * microseconds. Receive interrupt reduction can improve CPU efficiency if 131 * properly tuned for specific network traffic. Increasing this value adds 132 * extra latency to frame reception and can end up decreasing the throughput 133 * of TCP traffic. If the system is reporting dropped receives, this value 134 * may be set too high, causing the driver to run out of available receive 135 * descriptors. 136 * 137 * CAUTION: When setting RxIntDelay to a value other than 0, adapters 138 * may hang (stop transmitting) under certain network conditions. 139 * If this occurs a WATCHDOG message is logged in the system event log. 140 * In addition, the controller is automatically reset, restoring the 141 * network connection. To eliminate the potential for the hang 142 * ensure that RxIntDelay is set to 0. 143 */ 144#define EM_RDTR 0 145 146 147/* 148 * This parameter controls the maximum no of times the driver will loop 149 * in the isr. 150 * Minimum Value = 1 151 */ 152#define EM_MAX_INTR 3 153 154 155/* 156 * This parameter determines when the hardware will report that it is 157 * done with the packet. 158 * 0 - "Done" is reported when the packet has been sent on the wire 159 * 1 - "Done" is reported when the packet has been DMA'ed and is on chip. 160 * 2 - Determine the best method. 161 */ 162#define EM_REPORT_TX_EARLY 2 163 164/* 165 * Inform the stack about transmit checksum offload capabilities. 166 */ 167#define EM_CHECKSUM_FEATURES (CSUM_TCP | CSUM_UDP) 168 169/* 170 * This parameter controls the duration of transmit watchdog timer. 171 */ 172#define EM_TX_TIMEOUT 5 /* set to 5 seconds */ 173 174/* 175 * This parameter controls when the driver calls the routine to reclaim 176 * transmit descriptors. 177 */ 178#define EM_TX_CLEANUP_THRESHOLD EM_MAX_TXD / 8 179 180/* 181 * This parameter controls whether or not autonegotation is enabled. 182 * 0 - Disable autonegotiation 183 * 1 - Enable autonegotiation 184 */ 185#define DO_AUTO_NEG 1 186 187/* 188 * This parameter control whether or not the driver will wait for 189 * autonegotiation to complete. 190 * 1 - Wait for autonegotiation to complete 191 * 0 - Don't wait for autonegotiation to complete 192 */ 193#define WAIT_FOR_AUTO_NEG_DEFAULT 1 194 195 196/* Tunables -- End */ 197 198#define AUTONEG_ADV_DEFAULT (ADVERTISE_10_HALF | ADVERTISE_10_FULL | \ 199 ADVERTISE_100_HALF | ADVERTISE_100_FULL | \ 200 ADVERTISE_1000_FULL) 201#define EM_VENDOR_ID 0x8086 202#define EM_MMBA 0x0010 /* Mem base address */ 203#define EM_ROUNDUP(size, unit) (((size) + (unit) - 1) & ~((unit) - 1)) 204#define EM_JUMBO_PBA 0x00000028 205#define EM_DEFAULT_PBA 0x00000030 206 207#define IOCTL_CMD_TYPE u_long 208#define MAX_NUM_MULTICAST_ADDRESSES 128 209#define PCI_ANY_ID (~0U) 210#ifndef ETHER_ALIGN 211#define ETHER_ALIGN 2 212#endif 213#define QTAG_TYPE 0x8100 214 215/* Defines for printing debug information */ 216#define DEBUG_INIT 0 217#define DEBUG_IOCTL 0 218#define DEBUG_HW 0 219 220#define INIT_DEBUGOUT(S) if (DEBUG_INIT) printf(S "\n") 221#define INIT_DEBUGOUT1(S, A) if (DEBUG_INIT) printf(S "\n", A) 222#define INIT_DEBUGOUT2(S, A, B) if (DEBUG_INIT) printf(S "\n", A, B) 223#define IOCTL_DEBUGOUT(S) if (DEBUG_IOCTL) printf(S "\n") 224#define IOCTL_DEBUGOUT1(S, A) if (DEBUG_IOCTL) printf(S "\n", A) 225#define IOCTL_DEBUGOUT2(S, A, B) if (DEBUG_IOCTL) printf(S "\n", A, B) 226#define HW_DEBUGOUT(S) if (DEBUG_HW) printf(S "\n") 227#define HW_DEBUGOUT1(S, A) if (DEBUG_HW) printf(S "\n", A) 228#define HW_DEBUGOUT2(S, A, B) if (DEBUG_HW) printf(S "\n", A, B) 229 230 231/* Supported RX Buffer Sizes */ 232#define EM_RXBUFFER_2048 2048 233#define EM_RXBUFFER_4096 4096 234#define EM_RXBUFFER_8192 8192 235#define EM_RXBUFFER_16384 16384 236 237#ifdef __alpha__ 238 #undef vtophys 239 #define vtophys(va) alpha_XXX_dmamap((vm_offset_t)(va)) 240#endif /* __alpha__ */ 241 242/* ****************************************************************************** 243 * vendor_info_array 244 * 245 * This array contains the list of Subvendor/Subdevice IDs on which the driver 246 * should load. 247 * 248 * ******************************************************************************/ 249typedef struct _em_vendor_info_t { 250 unsigned int vendor_id; 251 unsigned int device_id; 252 unsigned int subvendor_id; 253 unsigned int subdevice_id; 254 unsigned int index; 255} em_vendor_info_t; 256 257 258struct em_tx_buffer { 259 STAILQ_ENTRY(em_tx_buffer) em_tx_entry; 260 struct mbuf *m_head; 261 struct em_tx_desc *used_tx_desc; 262}; 263 264/* ****************************************************************************** 265 * This structure stores information about the 2k aligned receive buffer 266 * into which the E1000 DMA's frames. 267 * ******************************************************************************/ 268struct em_rx_buffer { 269 STAILQ_ENTRY(em_rx_buffer) em_rx_entry; 270 struct mbuf *m_head; 271 u_int64_t buffer_addr; 272}; 273 274typedef enum _XSUM_CONTEXT_T { 275 OFFLOAD_NONE, 276 OFFLOAD_TCP_IP, 277 OFFLOAD_UDP_IP 278} XSUM_CONTEXT_T; 279 280/* Our adapter structure */ 281struct adapter { 282 struct arpcom interface_data; 283 struct adapter *next; 284 struct adapter *prev; 285 struct em_hw hw; 286 287 /* FreeBSD operating-system-specific structures */ 288 struct em_osdep osdep; 289 struct device *dev; 290 struct resource *res_memory; 291 struct resource *res_ioport; 292 struct resource *res_interrupt; 293 void *int_handler_tag; 294 struct ifmedia media; 295 struct callout_handle timer_handle; 296 int io_rid; 297 u_int8_t unit; 298 299 /* Info about the board itself */ 300 u_int32_t part_num; 301 u_int8_t link_active; 302 u_int16_t link_speed; 303 u_int16_t link_duplex; 304 u_int32_t tx_int_delay; 305 u_int32_t rx_int_delay; 306 307 XSUM_CONTEXT_T active_checksum_context; 308 309 /* Transmit definitions */ 310 struct em_tx_desc *first_tx_desc; 311 struct em_tx_desc *last_tx_desc; 312 struct em_tx_desc *next_avail_tx_desc; 313 struct em_tx_desc *tx_desc_base; 314 volatile u_int16_t num_tx_desc_avail; 315 u_int16_t num_tx_desc; 316 u_int32_t txd_cmd; 317 struct em_tx_buffer *tx_buffer_area; 318 STAILQ_HEAD(__em_tx_buffer_free, em_tx_buffer) free_tx_buffer_list; 319 STAILQ_HEAD(__em_tx_buffer_used, em_tx_buffer) used_tx_buffer_list; 320 321 /* Receive definitions */ 322 struct em_rx_desc *first_rx_desc; 323 struct em_rx_desc *last_rx_desc; 324 struct em_rx_desc *next_rx_desc_to_check; 325 struct em_rx_desc *rx_desc_base; 326 u_int16_t num_rx_desc; 327 u_int32_t rx_buffer_len; 328 struct em_rx_buffer *rx_buffer_area; 329 STAILQ_HEAD(__em_rx_buffer, em_rx_buffer) rx_buffer_list; 330 331 /* Jumbo frame */ 332 struct mbuf *fmp; 333 struct mbuf *lmp; 334 335 336 /* Misc stats maintained by the driver */ 337 unsigned long dropped_pkts; 338 unsigned long mbuf_alloc_failed; 339 unsigned long mbuf_cluster_failed; 340 unsigned long no_tx_desc_avail1; 341 unsigned long no_tx_desc_avail2; 342 unsigned long no_tx_buffer_avail1; 343 unsigned long no_tx_buffer_avail2; 344#ifdef DBG_STATS 345 unsigned long no_pkts_avail; 346 unsigned long clean_tx_interrupts; 347 348#endif 349 350 struct em_hw_stats stats; 351}; 352 353#endif /* _EM_H_DEFINED_ */ 354