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
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
|
/*
* Copyright (c) 2010 Steven Stallion. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must 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 copyright owner nor the names of any
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 COPYRIGHT OWNER OR
* 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.
*/
#ifndef _EFE_H
#define _EFE_H
#ifdef __cplusplus
extern "C" {
#endif
#define VENDOR_ID 0x10B8
#define DEVICE_ID 0x0005
#define RESET_DELAY 1
#define RESET_TEST_CYCLES 16
#define STOP_DELAY 10
#define STOP_DELAY_CYCLES 160
#define MII_DELAY 1
#define MII_DELAY_CYCLES 16
#define EEPROM_DELAY 3
#define EEPROM_WORDSZ 16
#define AT93C46_ADDRLEN 6
#define AT93C56_ADDRLEN 8
#define FLAG_RUNNING (1UL << 0)
#define FLAG_SUSPENDED (1UL << 1)
#define MCHASHL 64
#define MCHASHSZ 16
#define BURSTLEN 0x3F
#define RXDESCL 128
#define TXDESCL 128
#define BUFSZ 1536
/*
* Control/Status registers.
*/
#define CSR_COMMAND 0x00 /* Control Register */
#define CSR_INTSTAT 0x04 /* Interrupt Status Register */
#define CSR_INTMASK 0x08 /* Interrupt Mask Register */
#define CSR_GENCTL 0x0C /* General Control Register */
#define CSR_NVCTL 0x10 /* Non-volatile Control Register */
#define CSR_EECTL 0x14 /* EEPROM Control Register */
#define CSR_PBLCNT 0x18 /* Programmable Burst Length Counter */
#define CSR_TEST 0x1C /* Test Register */
#define CSR_CRCCNT 0x20 /* CRC Error Counter */
#define CSR_ALICNT 0x24 /* Frame Alignment Error Counter */
#define CSR_MPCNT 0x28 /* Missed Packet Counter */
#define CSR_RXFIFO 0x2C /* Receive FIFO Contents */
#define CSR_MMCTL 0x30 /* MII Control Register */
#define CSR_MMDATA 0x34 /* MII Interface Register */
#define CSR_MMCFG 0x38 /* MII Configuration Register */
#define CSR_IPG 0x3C /* Interpacket Gap Register */
#define CSR_LAN0 0x40 /* LAN Address Register 0 */
#define CSR_LAN1 0x44 /* LAN Address Register 1 */
#define CSR_LAN2 0x48 /* LAN Address Register 2 */
#define CSR_IDCHK 0x4C /* Board ID/Checksum Register */
#define CSR_MC0 0x50 /* Multicast Address Register 0 */
#define CSR_MC1 0x54 /* Multicast Address Register 1 */
#define CSR_MC2 0x58 /* Multicast Address Register 2 */
#define CSR_MC3 0x5C /* Multicast Address Register 3 */
#define CSR_RXCON 0x60 /* Receive Control Register */
#define CSR_RXSTAT 0x64 /* Receive Status Register */
#define CSR_RXCNT 0x68 /* Receive Byte Count */
#define CSR_RXTEST 0x6C /* Receive Test */
#define CSR_TXCON 0x70 /* Transmit Control Register */
#define CSR_TXSTAT 0x74 /* Transmit Status Register */
#define CSR_TDPAR 0x78 /* Transmit Packet Address */
#define CSR_TXTEST 0x7C /* Transmit Test */
#define CSR_PRFDAR 0x80 /* PCI Receive First Descriptor Address */
#define CSR_PRCDAR 0x84 /* PCI Receive Current Descriptor Address */
#define CSR_PRHDAR 0x88 /* PCI Receive Host Data Address */
#define CSR_PRFLAR 0x8C /* PCI Receive Fragment List Address */
#define CSR_PRDLGTH 0x90 /* PCI Receive DMA Length/Control */
#define CSR_PRFCNT 0x94 /* PCI Receive Fragment Count */
#define CSR_PRLCAR 0x98 /* PCI Receive RAM Current Address */
#define CSR_PRLPAR 0x9C /* PCI Receive RAM Packet Address */
#define CSR_PREFAR 0xA0 /* PCI Receive End of Frame Address */
#define CSR_PRSTAT 0xA4 /* PCI Receive DMA Status Register */
#define CSR_PRBUF 0xA8 /* Receive RAM Buffer */
#define CSR_RDNCAR 0xAC /* Receive MTU Current Address */
#define CSR_PRCPTHR 0xB0 /* PCI Receive Copy Threshold Register */
#define CSR_ROMDATA 0xB4 /* ROMDATA */
#define CSR_PREEMPR 0xBC /* Preemptive Interrupt */
#define CSR_PTFDAR 0xC0 /* PCI Transmit First Descriptor Address */
#define CSR_PTCDAR 0xC4 /* PCI Transmit Current Descriptor Address */
#define CSR_PTHDAR 0xC8 /* PCI Transmit Host Data Address */
#define CSR_PTFLAR 0xCC /* PCI Transmit Fragment List Address */
#define CSR_PTDLGTH 0xD0 /* PCI Transmit DMA Length/Control */
#define CSR_PTFCNT 0xD4 /* PCI Transmit Fragment Count */
#define CSR_PTLCAR 0xD8 /* PCI Transmit RAM Current Address */
#define CSR_ETXTHR 0xDC /* PCI Early Transmit Threshold Register */
#define CSR_PTETXC 0xE0 /* PCI Early Transmit Count */
#define CSR_PTSTAT 0xE4 /* PCI Transmit DMA Status */
#define CSR_PTBUF 0xE8 /* Transmit RAM Buffer */
#define CSR_PTFDAR2 0xEC /* PCI Transmit 2 First Descriptor Address */
#define CSR_FEVTR 0xF0 /* CardBus (UNUSED) */
#define CSR_FEVTRMSKR 0xF4 /* CardBus (UNUSED) */
#define CSR_FPRSTSTR 0xF8 /* CardBus (UNUSED) */
#define CSR_FFRCEVTR 0xFF /* CardBus (UNUSED) */
/*
* Register fields.
*/
#define COMMAND_STOP_RX (1UL << 0) /* Stop Receiver */
#define COMMAND_START_RX (1UL << 1) /* Start Receiver */
#define COMMAND_TXQUEUED (1UL << 2) /* Queue TX Descriptor */
#define COMMAND_RXQUEUED (1UL << 3) /* Queue RX Descriptor */
#define COMMAND_NEXTFRAME (1UL << 4) /* Release RX Frame */
#define COMMAND_STOP_TDMA (1UL << 5) /* Stop TX DMA */
#define COMMAND_STOP_RDMA (1UL << 6) /* Stop RX DMA */
#define COMMAND_TXUGO (1UL << 7) /* Restart Transmission */
#define INTSTAT_RCC (1UL << 0) /* Receive Copy Complete */
#define INTSTAT_HCC (1UL << 1) /* Header Copy Complete */
#define INTSTAT_RQE (1UL << 2) /* Receive Queue Empty */
#define INTSTAT_OVW (1UL << 3) /* Receive Overflow */
#define INTSTAT_RXE (1UL << 4) /* Receive Error */
#define INTSTAT_TXC (1UL << 5) /* Transmit Complete */
#define INTSTAT_TCC (1UL << 6) /* Transmit Chain Complete */
#define INTSTAT_TQE (1UL << 7) /* Transmit Queue Empty */
#define INTSTAT_TXU (1UL << 8) /* Transmit Underrun */
#define INTSTAT_CNT (1UL << 9) /* Counter Overflow */
#define INTSTAT_PREI (1UL << 10) /* Preemptive Interrupt */
#define INTSTAT_RCT (1UL << 11) /* Receive Copy Threshold */
#define INTSTAT_FATAL (1UL << 12) /* Fatal Error */
#define INTSTAT_PME (1UL << 14) /* Power Management Event */
#define INTSTAT_GP2 (1UL << 15) /* GPIO Event */
#define INTSTAT_ACTV (1UL << 16) /* Interrupt Active */
#define INTSTAT_RXIDLE (1UL << 17) /* Receive Idle */
#define INTSTAT_TXIDLE (1UL << 18) /* Transmit Idle */
#define INTSTAT_RCIP (1UL << 19) /* Receive Copy in Progress */
#define INTSTAT_TCIP (1UL << 20) /* Transmit Copy in Progress */
#define INTSTAT_RBE (1UL << 21) /* Receive Buffers Empty */
#define INTSTAT_RCTS (1UL << 22) /* Receive Copy Threshold Status */
#define INTSTAT_RSV (1UL << 23) /* Receive Status Valid */
#define INTSTAT_DPE (1UL << 24) /* PCI Data Parity Error */
#define INTSTAT_APE (1UL << 25) /* PCI Address Parity Error */
#define INTSTAT_PMA (1UL << 26) /* PCI Master Abort */
#define INTSTAT_PTA (1UL << 27) /* PCI Target Abort */
#define INTMASK_RCC (1UL << 0) /* Receive Copy Complete */
#define INTMASK_HCC (1UL << 1) /* Header Copy Complete */
#define INTMASK_RQE (1UL << 2) /* Receive Queue Empty */
#define INTMASK_OVW (1UL << 3) /* Receive Overflow */
#define INTMASK_RXE (1UL << 4) /* Receive Error */
#define INTMASK_TXC (1UL << 5) /* Transmit Complete */
#define INTMASK_TCC (1UL << 6) /* Transmit Chain Complete */
#define INTMASK_TQE (1UL << 7) /* Transmit Queue Empty */
#define INTMASK_TXU (1UL << 8) /* Transmit Underrun */
#define INTMASK_CNT (1UL << 9) /* Counter Overflow */
#define INTMASK_PREI (1UL << 10) /* Preemptive Interrupt */
#define INTMASK_RCT (1UL << 11) /* Receive Copy Threshold */
#define INTMASK_FATAL (1UL << 12) /* Fatal Error */
#define INTMASK_PME (1UL << 14) /* Power Management Event */
#define INTMASK_GP2 (1UL << 15) /* GPIO Event */
#define GENCTL_RESET (1UL << 0) /* Soft Reset */
#define GENCTL_INT (1UL << 1) /* Interrupt Enable */
#define GENCTL_SWINT (1UL << 2) /* Software Interrupt */
#define GENCTL_PWRDWN (1UL << 3) /* Power Down */
#define GENCTL_ONECOPY (1UL << 4) /* One Copy per Receive Frame */
#define GENCTL_BE (1UL << 5) /* Big Endian */
#define GENCTL_RDP (1UL << 6) /* Receive DMA Priority */
#define GENCTL_TDP (1UL << 7) /* Transmit DMA Priority */
#define GENCTL_RFT_32 (0UL << 8) /* Receive FIFO Threshold (1/4) */
#define GENCTL_RFT_64 (1UL << 8) /* Receive FIFO Threshold (1/2) */
#define GENCTL_RFT_96 (2UL << 8) /* Receive FIFO Threshold (3/4) */
#define GENCTL_RFT_128 (3UL << 8) /* Receive FIFO Threshold (FULL) */
#define GENCTL_MRM (1UL << 10) /* Memory Read Multiple */
#define GENCTL_MRL (1UL << 11) /* Memory Read Line */
#define GENCTL_SOFT0 (1UL << 12) /* Software Bit 0 */
#define GENCTL_SOFT1 (1UL << 13) /* Software Bit 1 */
#define GENCTL_RSTPHY (1UL << 14) /* PHY Reset */
#define GENCTL_SCLK (1UL << 16) /* System Clock */
#define GENCTL_RD (1UL << 17) /* Reset Disable */
#define GENCTL_MPE (1UL << 18) /* Magic Packet Enable */
#define GENCTL_PME (1UL << 19) /* PME Interrupt Enable */
#define GENCTL_PS_00 (0UL << 20) /* Power State "00" */
#define GENCTL_PS_01 (1UL << 20) /* Power State "01" */
#define GENCTL_PS_10 (2UL << 20) /* Power State "10" */
#define GENCTL_PS_11 (3UL << 20) /* Power State "11" */
#define GENCTL_OPLE (1UL << 22) /* On Power Loss Enable */
#define NVCTL_EMM (1UL << 0) /* Enable Memory Map */
#define NVCTL_CRS (1UL << 1) /* Clock Run Supported */
#define NVCTL_GPOE1 (1UL << 2) /* General Purpose Output Enable 1 */
#define NVCTL_GPOE2 (1UL << 3) /* General Purpose Output Enable 2 */
#define NVCTL_GPIO1 (1UL << 4) /* General Purpose I/O 1 */
#define NVCTL_GPIO2 (1UL << 5) /* General Purpose I/O 2 */
#define NVCTL_CB_MODE (1UL << 6) /* CardBus (UNUSED) */
#define NVCTL_IPG_DLY 7 /* Inter-packet Gap Timer Delay */
#define EECTL_ENABLE (1UL << 0) /* EEPROM Enable */
#define EECTL_EECS (1UL << 1) /* EEPROM Chip Select */
#define EECTL_EESK (1UL << 2) /* EEPROM Clock */
#define EECTL_EEDI (1UL << 3) /* EEPROM Data Input */
#define EECTL_EEDO (1UL << 4) /* EEPROM Data Output */
#define EECTL_EERDY (1UL << 5) /* EEPROM Ready */
#define EECTL_SIZE (1UL << 6) /* EEPROM Size */
#define TEST_CLOCK (1UL << 3) /* Clock Test */
#define MMCTL_READ (1UL << 0) /* MII Read */
#define MMCTL_WRITE (1UL << 1) /* MII Write */
#define MMCTL_RESPONDER (1UL << 3) /* MII Responder */
#define MMCTL_PHYREG 4 /* PHY Address */
#define MMCTL_PHYADDR 9 /* PHY Register Address */
#define MMCFG_SME (1UL << 0) /* Serial Mode Enable */
#define MMCFG_EN694 (1UL << 1) /* EN694 Pin */
#define MMCFG_694LNK (1UL << 2) /* 694LNK Pin */
#define MMCFG_PHY (1UL << 3) /* PHY Present */
#define MMCFG_SMI (1UL << 4) /* Enable Serial Management */
#define MMCFG_ALTCS (1UL << 5) /* Alternate Clock Source */
#define MMCFG_ALTDATA (1UL << 6) /* Alternate Data */
#define MMCFG_STXC (1UL << 14) /* Select TX Clock */
#define MMCFG_SNTXC (1UL << 15) /* Set No TX Clock */
#define RXCON_SEP (1UL << 0) /* Save Errored Packets */
#define RXCON_RRF (1UL << 1) /* Receive Runt Frames */
#define RXCON_RBF (1UL << 2) /* Receive Broadcast Frames */
#define RXCON_RMF (1UL << 3) /* Receive Multicast Frames */
#define RXCON_RIIA (1UL << 4) /* Receive Inverse Addresses */
#define RXCON_PROMISC (1UL << 5) /* Promiscuous Mode */
#define RXCON_MONITOR (1UL << 6) /* Monitor Mode */
#define RXCON_ERE (1UL << 7) /* Early Receive Enable */
#define RXCON_EB_INT (0UL << 8) /* External Buffer (Inernal) */
#define RXCON_EB_16K (1UL << 8) /* External Buffer (16K) */
#define RXCON_EB_32K (2UL << 8) /* External Buffer (32K) */
#define RXCON_EB_128K (3UL << 8) /* External Buffer (128K) */
#define RXSTAT_PRI (1UL << 0) /* Packet Received Intact */
#define RXSTAT_FAE (1UL << 1) /* Frame Alignment Error */
#define RXSTAT_CRC (1UL << 2) /* CRC Error */
#define RXSTAT_MP (1UL << 3) /* Missed Packet */
#define RXSTAT_MAR (1UL << 4) /* Multicast Address Recognized */
#define RXSTAT_BAR (1UL << 5) /* Broadcast Address Recognized */
#define RXSTAT_RD (1UL << 6) /* Receiver Disabled */
#define RXSTAT_NSV (1UL << 12) /* Network Status Valid */
#define RXSTAT_FLE (1UL << 13) /* Fragment List Error */
#define RXSTAT_HC (1UL << 14) /* Header Copied */
#define RXSTAT_OWNER (1UL << 15) /* Descriptor Ownership Bit */
#define RXCTL_FRAGLIST (1UL << 0) /* Fragment List */
#define RXCTL_LFFORM (1UL << 1) /* Fragment List Format */
#define RXCTL_HEADER (1UL << 2) /* Header Copy */
#define TXCON_ETE (1UL << 0) /* Early Transmit Enable */
#define TXCON_LB_0 (0UL << 1) /* Normal Operation */
#define TXCON_LB_1 (1UL << 1) /* Internal Loopback */
#define TXCON_LB_2 (2UL << 1) /* External Loopback */
#define TXCON_LB_3 (3UL << 1) /* Full Duplex Mode */
#define TXCON_SLOT 3 /* Slot Time */
#define TXSTAT_PTX (1UL << 0) /* Packet Transmitted */
#define TXSTAT_ND (1UL << 1) /* Non-deferred Transmission */
#define TXSTAT_COLL (1UL << 2) /* Transmitted w/Collisions */
#define TXSTAT_CSL (1UL << 3) /* Carrier Sense Lost */
#define TXSTAT_UFLO (1UL << 4) /* TX Underrun */
#define TXSTAT_CDH (1UL << 5) /* Collision Detect Heartbeat */
#define TXSTAT_OWC (1UL << 6) /* Out of Window Collision */
#define TXSTAT_DEFER (1UL << 7) /* IGP Deferring */
#define TXSTAT_CCNT 8 /* Collision Count */
#define TXSTAT_CCNTMASK 0x1F /* Collision Count Mask */
#define TXSTAT_EXCOLL (1UL << 12) /* Excessive Collisions */
#define TXSTAT_OWNER (1UL << 15) /* Descriptor Ownership Bit */
#define TXCTL_FRAGLIST (1UL << 0) /* Fragment List */
#define TXCTL_LFFORM (1UL << 1) /* Fragment List Format */
#define TXCTL_IAF (1UL << 2) /* Interrupt After Frame */
#define TXCTL_NOCRC (1UL << 3) /* Disable CRC Generation */
#define TXCTL_LASTDESCR (1UL << 4) /* Last Transmit Descriptor */
/*
* Register access.
*/
#define GETCSR(efep, reg) \
ddi_get32((efep)->efe_regs_acch, \
(efep)->efe_regs + ((reg) / sizeof (uint32_t)))
#define PUTCSR(efep, reg, val) \
ddi_put32((efep)->efe_regs_acch, \
(efep)->efe_regs + ((reg) / sizeof (uint32_t)), (val))
#define CLRBIT(efep, reg, bit) \
PUTCSR(efep, reg, (GETCSR(efep, reg) & ~(bit)))
#define SETBIT(efep, reg, bit) \
PUTCSR(efep, reg, (GETCSR(efep, reg) | (bit)))
/*
* DMA access.
*/
#define DESCSZ(x) (sizeof (efe_desc_t) * (x))
#define BUFPSZ(x) (sizeof (efe_buf_t *) * (x))
#define DESCADDR(rp, x) ((rp)->r_dmac.dmac_address + DESCSZ(x))
#define DESCLEN(rp) ((rp)->r_len)
#define BUFADDR(bp) ((bp)->b_dmac.dmac_address)
#define BUFLEN(bp) ((bp)->b_len)
#define NEXTDESC(rp, x) (((x) + 1) % (rp)->r_len)
#define NEXTDESCADDR(rp, x) DESCADDR(rp, NEXTDESC(rp, x))
#define GETDESC(rp, x) (&(rp)->r_descp[(x)])
#define GETDESC16(rp, addr) \
ddi_get16((rp)->r_acch, (addr))
#define PUTDESC16(rp, addr, val) \
ddi_put16((rp)->r_acch, (addr), (val))
#define GETDESC32(rp, addr) \
ddi_get32((rp)->r_acch, (addr))
#define PUTDESC32(rp, addr, val) \
ddi_put32((rp)->r_acch, (addr), (val))
#define SYNCDESC(rp, x, type) \
(void) ddi_dma_sync((rp)->r_dmah, DESCSZ(x), \
sizeof (efe_desc_t), (type))
#define GETBUF(rp, x) ((rp)->r_bufpp[(x)])
#define SYNCBUF(bp, type) \
(void) ddi_dma_sync((bp)->b_dmah, 0, (bp)->b_len, (type))
/*
* Soft state.
*/
typedef struct {
uint16_t d_status;
uint16_t d_len;
uint32_t d_bufaddr;
uint16_t d_buflen;
uint16_t d_control;
uint32_t d_next;
} efe_desc_t;
typedef struct {
ddi_dma_handle_t b_dmah;
ddi_acc_handle_t b_acch;
ddi_dma_cookie_t b_dmac;
size_t b_len;
caddr_t b_kaddr;
} efe_buf_t;
typedef struct {
ddi_dma_handle_t r_dmah;
ddi_acc_handle_t r_acch;
ddi_dma_cookie_t r_dmac;
size_t r_len;
efe_desc_t *r_descp;
efe_buf_t **r_bufpp;
} efe_ring_t;
typedef struct {
dev_info_t *efe_dip;
mii_handle_t efe_miih;
mac_handle_t efe_mh;
uint32_t *efe_regs;
ddi_acc_handle_t efe_regs_acch;
ddi_intr_handle_t efe_intrh;
kmutex_t efe_intrlock;
kmutex_t efe_txlock;
int efe_flags;
boolean_t efe_promisc;
uint8_t efe_macaddr[ETHERADDRL];
uint_t efe_mccount[MCHASHL];
uint16_t efe_mchash[MCHASHL / MCHASHSZ];
efe_ring_t *efe_rx_ring;
uint_t efe_rx_desc;
efe_ring_t *efe_tx_ring;
uint_t efe_tx_desc;
uint_t efe_tx_sent;
/*
* Driver statistics.
*/
uint64_t efe_multircv;
uint64_t efe_brdcstrcv;
uint64_t efe_multixmt;
uint64_t efe_brdcstxmt;
uint64_t efe_norcvbuf;
uint64_t efe_ierrors;
uint64_t efe_noxmtbuf;
uint64_t efe_oerrors;
uint64_t efe_collisions;
uint64_t efe_rbytes;
uint64_t efe_ipackets;
uint64_t efe_obytes;
uint64_t efe_opackets;
uint64_t efe_uflo;
uint64_t efe_oflo;
uint64_t efe_align_errors;
uint64_t efe_fcs_errors;
uint64_t efe_first_collisions;
uint64_t efe_tx_late_collisions;
uint64_t efe_defer_xmts;
uint64_t efe_ex_collisions;
uint64_t efe_macxmt_errors;
uint64_t efe_carrier_errors;
uint64_t efe_toolong_errors;
uint64_t efe_macrcv_errors;
uint64_t efe_runt_errors;
uint64_t efe_jabber_errors;
} efe_t;
#ifdef __cplusplus
}
#endif
#endif /* _EFE_H */
|