if_em.h revision 93914
1/**************************************************************************
2
3Copyright (c) 2001-2002 Intel Corporation
4All rights reserved.
5
6Redistribution and use in source and binary forms of the Software, with or
7without modification, are permitted provided that the following conditions
8are met:
9
10 1. Redistributions of source code of the Software may retain the above
11    copyright notice, this list of conditions and the following disclaimer.
12
13 2. Redistributions in binary form of the Software may reproduce the above
14    copyright notice, this list of conditions and the following disclaimer
15    in the documentation and/or other materials provided with the
16    distribution.
17
18 3. Neither the name of the Intel Corporation nor the names of its
19    contributors shall be used to endorse or promote products derived from
20    this Software without specific prior written permission.
21
22THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS CONTRIBUTORS BE LIABLE
26FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
28SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32SUCH DAMAGE.
33
34***************************************************************************/
35
36/*$FreeBSD: head/sys/dev/em/if_em.h 93914 2002-04-06 00:36:53Z pdeuskar $*/
37
38#ifndef _EM_H_DEFINED_
39#define _EM_H_DEFINED_
40
41
42#include <sys/param.h>
43#include <sys/systm.h>
44#include <sys/mbuf.h>
45#include <sys/protosw.h>
46#include <sys/socket.h>
47#include <sys/malloc.h>
48#include <sys/kernel.h>
49
50#include <net/if.h>
51#include <net/if_dl.h>
52#include <net/if_media.h>
53#include <net/bpf.h>
54#include <net/ethernet.h>
55#include <net/if_arp.h>
56#include <sys/sockio.h>
57
58#include <netinet/in_systm.h>
59#include <netinet/in.h>
60#include <netinet/ip.h>
61#include <netinet/tcp.h>
62#include <netinet/udp.h>
63
64#include <sys/bus.h>
65#include <machine/bus.h>
66#include <sys/rman.h>
67#include <machine/resource.h>
68#include <vm/vm.h>
69#include <vm/pmap.h>
70#include <machine/clock.h>
71#include <pci/pcivar.h>
72#include <pci/pcireg.h>
73#include "opt_bdg.h"
74
75#include <dev/em/if_em_fxhw.h>
76#include <dev/em/if_em_phy.h>
77
78/* Tunables */
79#define MAX_TXD                         256
80#define MAX_RXD                         256
81#define TX_CLEANUP_THRESHOLD            MAX_TXD / 8
82#define TIDV                            128
83#define RIDV                            28
84#define DO_AUTO_NEG                     1
85#define WAIT_FOR_AUTO_NEG_DEFAULT       1
86#define AUTONEG_ADV_DEFAULT             (ADVERTISE_10_HALF | ADVERTISE_10_FULL | \
87                                         ADVERTISE_100_HALF | ADVERTISE_100_FULL | \
88                                         ADVERTISE_1000_FULL)
89#define EM_ENABLE_RXCSUM_OFFLOAD        1
90#define EM_REPORT_TX_EARLY              2
91#define EM_CHECKSUM_FEATURES            (CSUM_TCP | CSUM_UDP)
92#define EM_MAX_INTR                     3
93#define EM_TX_TIMEOUT                   5    /* set to 5 seconds */
94
95
96#define EM_VENDOR_ID                    0x8086
97#define EM_MMBA                         0x0010 /* Mem base address */
98#define EM_ROUNDUP(size, unit) (((size) + (unit) - 1) & ~((unit) - 1))
99#define EM_JUMBO_PBA                    0x00000028
100#define EM_DEFAULT_PBA                  0x00000030
101
102#define IOCTL_CMD_TYPE                  u_long
103#define MAX_NUM_MULTICAST_ADDRESSES     128
104#define PCI_ANY_ID                      (~0U)
105#define ETHER_ALIGN                     2
106
107/* Defines for printing debug information */
108#define DEBUG_INIT  0
109#define DEBUG_IOCTL 0
110#define DEBUG_HW    0
111
112#define INIT_DEBUGOUT(S)            if (DEBUG_INIT)  printf(S "\n")
113#define INIT_DEBUGOUT1(S, A)        if (DEBUG_INIT)  printf(S "\n", A)
114#define INIT_DEBUGOUT2(S, A, B)     if (DEBUG_INIT)  printf(S "\n", A, B)
115#define IOCTL_DEBUGOUT(S)           if (DEBUG_IOCTL) printf(S "\n")
116#define IOCTL_DEBUGOUT1(S, A)       if (DEBUG_IOCTL) printf(S "\n", A)
117#define IOCTL_DEBUGOUT2(S, A, B)    if (DEBUG_IOCTL) printf(S "\n", A, B)
118#define HW_DEBUGOUT(S)              if (DEBUG_HW) printf(S "\n")
119#define HW_DEBUGOUT1(S, A)          if (DEBUG_HW) printf(S "\n", A)
120#define HW_DEBUGOUT2(S, A, B)       if (DEBUG_HW) printf(S "\n", A, B)
121
122
123/* Supported RX Buffer Sizes */
124#define EM_RXBUFFER_2048        2048
125#define EM_RXBUFFER_4096        4096
126#define EM_RXBUFFER_8192        8192
127#define EM_RXBUFFER_16384      16384
128
129#ifdef __alpha__
130#undef vtophys
131#define vtophys(va)     alpha_XXX_dmamap((vm_offset_t)(va))
132#endif /* __alpha__ */
133
134/* ******************************************************************************
135 * vendor_info_array
136 *
137 * This array contains the list of Subvendor/Subdevice IDs on which the driver
138 * should load.
139 *
140 * ******************************************************************************/
141typedef struct _em_vendor_info_t
142{
143        unsigned int vendor_id;
144        unsigned int device_id;
145        unsigned int subvendor_id;
146        unsigned int subdevice_id;
147        unsigned int index;
148} em_vendor_info_t;
149
150
151struct em_tx_buffer {
152        STAILQ_ENTRY(em_tx_buffer) em_tx_entry;
153        struct mbuf    *m_head;
154        u_int32_t       num_tx_desc_used;
155};
156
157
158/* ******************************************************************************
159 * This structure stores information about the 2k aligned receive buffer
160 * into which the E1000 DMA's frames.
161 * ******************************************************************************/
162struct em_rx_buffer {
163        STAILQ_ENTRY(em_rx_buffer) em_rx_entry;
164        struct mbuf    *m_head;
165        u_int64_t      buffer_addr;
166};
167
168typedef enum _XSUM_CONTEXT_T {
169        OFFLOAD_NONE,
170        OFFLOAD_TCP_IP,
171        OFFLOAD_UDP_IP
172} XSUM_CONTEXT_T;
173
174/* Our adapter structure */
175struct adapter {
176        struct arpcom   interface_data;
177        struct adapter *next;
178        struct adapter *prev;
179        struct em_shared_adapter shared;
180
181        /* FreeBSD operating-system-specific structures */
182        struct em_osdep osdep;
183        struct device   *dev;
184        struct resource *res_memory;
185        struct resource *res_interrupt;
186        void            *int_handler_tag;
187        struct ifmedia  media;
188        struct callout_handle timer_handle;
189        u_int8_t        unit;
190
191        /* Info about the board itself */
192        u_int32_t       part_num;
193        u_int8_t        link_active;
194        u_int16_t       link_speed;
195        u_int16_t       link_duplex;
196        u_int32_t       tx_int_delay;
197        u_int32_t       rx_int_delay;
198
199        u_int8_t        rx_checksum;
200        XSUM_CONTEXT_T  active_checksum_context;
201
202        /* Transmit definitions */
203        struct em_tx_desc *first_tx_desc;
204        struct em_tx_desc *last_tx_desc;
205        struct em_tx_desc *next_avail_tx_desc;
206        struct em_tx_desc *oldest_used_tx_desc;
207        struct em_tx_desc *tx_desc_base;
208        volatile u_int16_t num_tx_desc_avail;
209        u_int16_t       num_tx_desc;
210        u_int32_t       txd_cmd;
211        struct em_tx_buffer   *tx_buffer_area;
212        STAILQ_HEAD(__em_tx_buffer_free, em_tx_buffer)  free_tx_buffer_list;
213        STAILQ_HEAD(__em_tx_buffer_used, em_tx_buffer)  used_tx_buffer_list;
214
215        /* Receive definitions */
216        struct em_rx_desc *first_rx_desc;
217        struct em_rx_desc *last_rx_desc;
218        struct em_rx_desc *next_rx_desc_to_check;
219        struct em_rx_desc *rx_desc_base;
220        u_int16_t       num_rx_desc;
221        u_int32_t       rx_buffer_len;
222        struct em_rx_buffer   *rx_buffer_area;
223        STAILQ_HEAD(__em_rx_buffer, em_rx_buffer)  rx_buffer_list;
224
225        /* Jumbo frame */
226        struct mbuf     *fmp;
227        struct mbuf     *lmp;
228
229
230        /* Misc stats maintained by the driver */
231        unsigned long   dropped_pkts;
232        unsigned long   mbuf_alloc_failed;
233        unsigned long   mbuf_cluster_failed;
234        unsigned long   xmit_pullup;
235        unsigned long   no_tx_desc_avail;
236        unsigned long   no_tx_buffer_avail1;
237        unsigned long   no_tx_buffer_avail2;
238#ifdef DBG_STATS
239        unsigned long   no_pkts_avail;
240        unsigned long   clean_tx_interrupts;
241
242#endif
243
244        struct em_shared_stats stats;
245};
246
247#endif                                                  /* _EM_H_DEFINED_ */
248