summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/io/efe/efe.h
blob: 87864ec4b632a2e7385057809d9fafc5833aab67 (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
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 */