summaryrefslogtreecommitdiffstats
path: root/sys/dev/em/if_em.h
blob: f8401835c17f21744151e9a02d1e4d394dbdc227 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
/**************************************************************************

Copyright (c) 2001 Intel Corporation
All rights reserved.

Redistribution and use in source and binary forms of the Software, with or
without modification, are permitted provided that the following conditions
are met:

 1. Redistributions of source code of the Software may retain the above
    copyright notice, this list of conditions and the following disclaimer.

 2. Redistributions in binary form of the Software may reproduce the above
    copyright notice, this list of conditions and the following disclaimer
    in the documentation and/or other materials provided with the
    distribution.

 3. Neither the name of the Intel Corporation nor the names of its
    contributors shall be used to endorse or promote products derived from
    this Software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.

***************************************************************************/

/*$FreeBSD$*/

#ifndef _EM_H_DEFINED_
#define _EM_H_DEFINED_


#include <sys/param.h>
#include <sys/systm.h>
#include <sys/mbuf.h>
#include <sys/protosw.h>
#include <sys/socket.h>
#include <sys/malloc.h>
#include <sys/kernel.h>

#include <net/if.h>
#include <net/if_dl.h>
#include <net/if_media.h>
#include <net/bpf.h>
#include <net/ethernet.h>
#include <net/if_arp.h>
#include <sys/sockio.h>

#include <netinet/in_systm.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
#include <netinet/udp.h>

#include <sys/bus.h>
#include <machine/bus.h>
#include <sys/rman.h>
#include <machine/resource.h>
#include <vm/vm.h>
#include <vm/pmap.h>
#include <machine/clock.h>
#include <pci/pcivar.h>
#include <pci/pcireg.h>

#include "opt_bdg.h"

#include <dev/em/if_em_fxhw.h>
#include <dev/em/if_em_phy.h>

/* Tunables */
#define MAX_TXD                         256
#define MAX_RXD                         256
#define TX_CLEANUP_THRESHOLD            MAX_TXD / 8
#define TIDV                            128     
#define RIDV                            28      
#define DO_AUTO_NEG                     1       
#define WAIT_FOR_AUTO_NEG_DEFAULT       1       
#define AUTONEG_ADV_DEFAULT             (ADVERTISE_10_HALF | ADVERTISE_10_FULL | \
                                         ADVERTISE_100_HALF | ADVERTISE_100_FULL | \
                                         ADVERTISE_1000_FULL)
#define EM_ENABLE_RXCSUM_OFFLOAD        1
#define EM_REPORT_TX_EARLY              2
#define EM_CHECKSUM_FEATURES            (CSUM_TCP | CSUM_UDP)
#define EM_MAX_INTR                     3
#define EM_TX_TIMEOUT                   5    /* set to 5 seconds */


#define EM_VENDOR_ID                    0x8086
#define EM_MMBA                         0x0010 /* Mem base address */
#define EM_ROUNDUP(size, unit) (((size) + (unit) - 1) & ~((unit) - 1))
#define EM_JUMBO_PBA                    0x00000028
#define EM_DEFAULT_PBA                  0x00000030

#define IOCTL_CMD_TYPE                  u_long
#define MAX_NUM_MULTICAST_ADDRESSES     128
#define PCI_ANY_ID                      (~0U)
#define ETHER_ALIGN                     2

/* Defines for printing debug information */
#define DEBUG_INIT  0
#define DEBUG_IOCTL 0
#define DEBUG_HW    0
#define DEBUG_TXRX  0
#define DEBUG_RXCSUM 0
#define DEBUG_TXCSUM 0

#define INIT_DEBUGOUT(S)            if (DEBUG_INIT)  printf(S "\n")
#define INIT_DEBUGOUT1(S, A)        if (DEBUG_INIT)  printf(S "\n", A)
#define INIT_DEBUGOUT2(S, A, B)     if (DEBUG_INIT)  printf(S "\n", A, B)
#define IOCTL_DEBUGOUT(S)           if (DEBUG_IOCTL) printf(S "\n")
#define IOCTL_DEBUGOUT1(S, A)       if (DEBUG_IOCTL) printf(S "\n", A)
#define IOCTL_DEBUGOUT2(S, A, B)    if (DEBUG_IOCTL) printf(S "\n", A, B)
#define HW_DEBUGOUT(S)              if (DEBUG_HW) printf(S "\n")
#define HW_DEBUGOUT1(S, A)          if (DEBUG_HW) printf(S "\n", A)
#define HW_DEBUGOUT2(S, A, B)       if (DEBUG_HW) printf(S "\n", A, B)
#define TXRX_DEBUGOUT(S)              if (DEBUG_TXRX) printf(S "\n")
#define TXRX_DEBUGOUT1(S, A)          if (DEBUG_TXRX) printf(S "\n", A)
#define TXRX_DEBUGOUT2(S, A, B)       if (DEBUG_TXRX) printf(S "\n", A, B)
#define RXCSUM_DEBUGOUT(S)              if (DEBUG_RXCSUM) printf(S "\n")
#define RXCSUM_DEBUGOUT1(S, A)          if (DEBUG_RXCSUM) printf(S "\n", A)
#define RXCSUM_DEBUGOUT2(S, A, B)       if (DEBUG_RXCSUM) printf(S "\n", A, B)
#define TXCSUM_DEBUGOUT(S)              if (DEBUG_TXCSUM) printf(S "\n")
#define TXCSUM_DEBUGOUT1(S, A)          if (DEBUG_TXCSUM) printf(S "\n", A)
#define TXCSUM_DEBUGOUT2(S, A, B)       if (DEBUG_TXCSUM) printf(S "\n", A, B)

/* Device ID defines */
#define PCI_DEVICE_ID_82542            0x1000
#define PCI_DEVICE_ID_82543GC_FIBER    0x1001
#define PCI_DEVICE_ID_82543GC_COPPER   0x1004
#define PCI_DEVICE_ID_82544EI_FIBER    0x1009
#define PCI_DEVICE_ID_82544EI_COPPER   0x1008
#define PCI_DEVICE_ID_82544GC_STRG     0x100C
#define PCI_DEVICE_ID_82544GC_COPPER   0x100D

/* Supported RX Buffer Sizes */
#define EM_RXBUFFER_2048        2048
#define EM_RXBUFFER_4096        4096
#define EM_RXBUFFER_8192        8192
#define EM_RXBUFFER_16384      16384


/* ******************************************************************************
 * vendor_info_array
 *
 * This array contains the list of Subvendor/Subdevice IDs on which the driver
 * should load.
 *
 * ******************************************************************************/
typedef struct _em_vendor_info_t
{
        unsigned int vendor_id;
        unsigned int device_id;
        unsigned int subvendor_id;
        unsigned int subdevice_id;
        unsigned int index;
} em_vendor_info_t;


struct em_tx_buffer {
        STAILQ_ENTRY(em_tx_buffer) em_tx_entry;
        struct mbuf    *Packet;
        u_int32_t       NumTxDescriptorsUsed;
};


/* ******************************************************************************
 * This structure stores information about the 2k aligned receive buffer
 * into which the E1000 DMA's frames. 
 * ******************************************************************************/
struct em_rx_buffer {
        STAILQ_ENTRY(em_rx_buffer) em_rx_entry;
        struct mbuf    *Packet;
        u_int32_t       LowPhysicalAddress;
        u_int32_t       HighPhysicalAddress;
};

typedef enum _XSUM_CONTEXT_T {
        OFFLOAD_NONE,
        OFFLOAD_TCP_IP,
        OFFLOAD_UDP_IP
} XSUM_CONTEXT_T;

/* Our adapter structure */
struct adapter {
        struct arpcom   interface_data;
        struct adapter *next;
        struct adapter *prev;
        struct em_shared_adapter shared;

        /* FreeBSD operating-system-specific structures */
        struct em_osdep osdep;
        struct device   *dev;
        struct resource *res_memory;
        struct resource *res_interrupt;
        void            *int_handler_tag;
        struct ifmedia  media;
        struct callout_handle timer_handle;
        u_int8_t        unit;

        /* PCI Info */
        u_int16_t       VendorId;
        u_int16_t       DeviceId;
        u_int8_t        RevId;
        u_int16_t       SubVendorId;
        u_int16_t       SubSystemId;


        /* Info about the board itself */
        uint8_t         PermNetAddress[ETH_LENGTH_OF_ADDRESS];
        u_int32_t       PartNumber;

        u_int8_t        MulticastAddressList[MAX_NUM_MULTICAST_ADDRESSES][ETH_LENGTH_OF_ADDRESS];
        u_int8_t        LinkStatusChanged;
        u_int8_t        LinkIsActive;
        u_int16_t       LineSpeed;
        u_int16_t       FullDuplex;
        u_int32_t       TxIntDelay;
        u_int32_t       RxIntDelay;

        u_int8_t        RxChecksum;
        XSUM_CONTEXT_T  ActiveChecksumContext;

        /* Transmit definitions */
        struct em_tx_desc *FirstTxDescriptor;
        struct em_tx_desc *LastTxDescriptor;
        struct em_tx_desc *NextAvailTxDescriptor;
        struct em_tx_desc *OldestUsedTxDescriptor;
        struct em_tx_desc *TxDescBase;
        volatile u_int16_t NumTxDescriptorsAvail;
        u_int16_t       NumTxDescriptors;
        u_int32_t       TxdCmd;
        struct em_tx_buffer   *tx_buffer_area;
        STAILQ_HEAD(__em_tx_buffer_free, em_tx_buffer)  FreeSwTxPacketList;
        STAILQ_HEAD(__em_tx_buffer_used, em_tx_buffer)  UsedSwTxPacketList;

        /* Receive definitions */
        struct em_rx_desc *FirstRxDescriptor;
        struct em_rx_desc *LastRxDescriptor;
        struct em_rx_desc *NextRxDescriptorToCheck;
        struct em_rx_desc *RxDescBase;
        u_int16_t       NumRxDescriptors;
        u_int16_t       NumRxDescriptorsEmpty;
        u_int16_t       NextRxDescriptorToFill;
        u_int32_t       RxBufferLen;
        struct em_rx_buffer   *rx_buffer_area;
        STAILQ_HEAD(__em_rx_buffer, em_rx_buffer)  RxSwPacketList;

        /* Jumbo frame */
        struct mbuf     *fmp;
        struct mbuf     *lmp;


        /* Misc stats maintained by the driver */
        unsigned long   DroppedPackets;
        unsigned long   NoJumboBufAvail;
        unsigned long   JumboMbufFailed;
        unsigned long   JumboClusterFailed;
        unsigned long   StdMbufFailed;
        unsigned long   StdClusterFailed;
#ifdef DBG_STATS
        unsigned long   NoTxDescAvail;
        unsigned long   NoPacketsAvail;
        unsigned long   CleanTxInterrupts;
        unsigned long   NoTxBufferAvail1;
        unsigned long   NoTxBufferAvail2;
#endif

        struct em_shared_stats stats;
};

#endif                                                  /* _EM_H_DEFINED_ */
OpenPOWER on IntegriCloud