xref: /netbsd/sys/dev/ic/i82557reg.h (revision 364d5022)
1 /*	$NetBSD: i82557reg.h,v 1.25 2011/09/02 03:16:19 msaitoh Exp $	*/
2 
3 /*-
4  * Copyright (c) 1998, 1999, 2001 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
9  * NASA Ames Research Center.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions and the following disclaimer.
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in the
18  *    documentation and/or other materials provided with the distribution.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
21  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
24  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30  * POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 /*
34  * Copyright (c) 1995, David Greenman
35  * Copyright (c) 2001 Jonathan Lemon <jlemon@freebsd.org>
36  * All rights reserved.
37  *
38  * Redistribution and use in source and binary forms, with or without
39  * modification, are permitted provided that the following conditions
40  * are met:
41  * 1. Redistributions of source code must retain the above copyright
42  *    notice unmodified, this list of conditions, and the following
43  *    disclaimer.
44  * 2. Redistributions in binary form must reproduce the above copyright
45  *    notice, this list of conditions and the following disclaimer in the
46  *    documentation and/or other materials provided with the distribution.
47  *
48  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
49  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
50  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
51  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
52  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
53  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
54  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
55  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
56  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
57  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
58  * SUCH DAMAGE.
59  *
60  *	Id: if_fxpreg.h,v 1.24 2001/05/15 18:52:40 jlemon Exp
61  */
62 
63 #define FXP_PCI_MMBA	0x10
64 #define FXP_PCI_IOBA	0x14
65 
66 /*
67  * Control/status registers.
68  */
69 #define	FXP_CSR_SCB_RUSCUS	0x00	/* scb_rus/scb_cus (1 byte) */
70 #define	FXP_CSR_SCB_STATACK	0x01	/* scb_statack (1 byte) */
71 #define	FXP_CSR_SCB_COMMAND	0x02	/* scb_command (1 byte) */
72 #define	FXP_CSR_SCB_INTRCNTL	0x03	/* scb_intrcntl (1 byte) */
73 #define	FXP_CSR_SCB_GENERAL	0x04	/* scb_general (4 bytes) */
74 #define	FXP_CSR_PORT		0x08	/* port (4 bytes) */
75 #define	FXP_CSR_FLASHCONTROL	0x0c	/* flash control (2 bytes) */
76 #define	FXP_CSR_EEPROMCONTROL	0x0e	/* eeprom control (2 bytes) */
77 #define	FXP_CSR_MDICONTROL	0x10	/* mdi control (4 bytes) */
78 #define	FXP_CSR_FLOWCONTROL	0x19	/* flow control (2 bytes) */
79 
80 /*
81  * FOR REFERENCE ONLY, the old definition of FXP_CSR_SCB_RUSCUS:
82  *
83  *	volatile uint8_t	:2,
84  *				scb_rus:4,
85  *				scb_cus:2;
86  */
87 
88 #define FXP_PORT_SOFTWARE_RESET		0
89 #define FXP_PORT_SELFTEST		1
90 #define FXP_PORT_SELECTIVE_RESET	2
91 #define FXP_PORT_DUMP			3
92 
93 #define FXP_SCB_RUS_IDLE		0
94 #define FXP_SCB_RUS_SUSPENDED		1
95 #define FXP_SCB_RUS_NORESOURCES		2
96 #define FXP_SCB_RUS_READY		4
97 #define FXP_SCB_RUS_SUSP_NORBDS		9
98 #define FXP_SCB_RUS_NORES_NORBDS	10
99 #define FXP_SCB_RUS_READY_NORBDS	12
100 
101 #define FXP_SCB_CUS_IDLE		0
102 #define FXP_SCB_CUS_SUSPENDED		1
103 #define FXP_SCB_CUS_ACTIVE		2
104 
105 #define	FXP_SCB_INTR_DISABLE		0x01	/* disable all interrupts */
106 #define	FXP_SCB_INTR_SWI		0x02	/* generate SWI */
107 #define	FXP_SCB_INTMASK_FCP		0x04
108 #define	FXP_SCB_INTMASK_ER		0x08
109 #define	FXP_SCB_INTMASK_RNR		0x10
110 #define	FXP_SCB_INTMASK_CNA		0x20
111 #define	FXP_SCB_INTMASK_FR		0x40
112 #define	FXP_SCB_INTMASK_CXTNO		0x80
113 
114 #define	FXP_SCB_STATACK_FCP		0x01	/* flow control pause */
115 #define	FXP_SCB_STATACK_ER		0x02	/* early receive */
116 #define FXP_SCB_STATACK_SWI		0x04
117 #define FXP_SCB_STATACK_MDI		0x08
118 #define FXP_SCB_STATACK_RNR		0x10
119 #define FXP_SCB_STATACK_CNA		0x20
120 #define FXP_SCB_STATACK_FR		0x40
121 #define FXP_SCB_STATACK_CXTNO		0x80
122 
123 #define FXP_SCB_COMMAND_CU_NOP		0x00
124 #define FXP_SCB_COMMAND_CU_START	0x10
125 #define FXP_SCB_COMMAND_CU_RESUME	0x20
126 #define FXP_SCB_COMMAND_CU_DUMP_ADR	0x40
127 #define FXP_SCB_COMMAND_CU_DUMP		0x50
128 #define FXP_SCB_COMMAND_CU_BASE		0x60
129 #define FXP_SCB_COMMAND_CU_DUMPRESET	0x70
130 
131 #define FXP_SCB_COMMAND_RU_NOP		0
132 #define FXP_SCB_COMMAND_RU_START	1
133 #define FXP_SCB_COMMAND_RU_RESUME	2
134 #define FXP_SCB_COMMAND_RU_ABORT	4
135 #define FXP_SCB_COMMAND_RU_LOADHDS	5
136 #define FXP_SCB_COMMAND_RU_BASE		6
137 #define FXP_SCB_COMMAND_RU_RBDRESUME	7
138 
139 #define FXP_SCB_INTRCNTL_REQUEST_SWI	0x02
140 /*
141  * Command block definitions
142  */
143 
144 /*
145  * NOP command.
146  */
147 struct fxp_cb_nop {
148 	volatile uint16_t cb_status;
149 	volatile uint16_t cb_command;
150 	volatile uint32_t link_addr;
151 };
152 
153 /*
154  * Individual Address command.
155  */
156 struct fxp_cb_ias {
157 	volatile uint16_t cb_status;
158 	volatile uint16_t cb_command;
159 	volatile uint32_t link_addr;
160 	uint8_t macaddr[6];
161 };
162 
163 #if BYTE_ORDER == LITTLE_ENDIAN
164 #define	__FXP_BITFIELD2(a, b)			a, b
165 #define	__FXP_BITFIELD3(a, b, c)		a, b, c
166 #define	__FXP_BITFIELD4(a, b, c, d)		a, b, c, d
167 #define	__FXP_BITFIELD5(a, b, c, d, e)		a, b, c, d, e
168 #define	__FXP_BITFIELD6(a, b, c, d, e, f)	a, b, c, d, e, f
169 #define	__FXP_BITFIELD7(a, b, c, d, e, f, g)	a, b, c, d, e, f, g
170 #define	__FXP_BITFIELD8(a, b, c, d, e, f, g, h)	a, b, c, d, e, f, g, h
171 #else
172 #define	__FXP_BITFIELD2(a, b)			b, a
173 #define	__FXP_BITFIELD3(a, b, c)		c, b, a
174 #define	__FXP_BITFIELD4(a, b, c, d)		d, c, b, a
175 #define	__FXP_BITFIELD5(a, b, c, d, e)		e, d, c, b, a
176 #define	__FXP_BITFIELD6(a, b, c, d, e, f)	f, e, d, c, b, a
177 #define	__FXP_BITFIELD7(a, b, c, d, e, f, g)	g, f, e, d, c, b, a
178 #define	__FXP_BITFIELD8(a, b, c, d, e, f, g, h)	h, g, f, e, d, c, b, a
179 #endif
180 
181 /*
182  * Configure command.
183  */
184 struct fxp_cb_config {
185 	volatile uint16_t	cb_status;
186 	volatile uint16_t	cb_command;
187 	volatile uint32_t	link_addr;
188 
189 	/* Bytes 0 - 21 -- common to all i8255x */
190 /*0*/	volatile uint8_t	__FXP_BITFIELD2(byte_count:6, :2);
191 /*1*/	volatile uint8_t	__FXP_BITFIELD3(rx_fifo_limit:4,
192 				    tx_fifo_limit:3,
193 				    :1);
194 /*2*/	volatile uint8_t	adaptive_ifs;
195 /*3*/	volatile uint8_t	__FXP_BITFIELD5(mwi_enable:1,	/* 8,9 */
196 				    type_enable:1,		/* 8,9 */
197 				    read_align_en:1,		/* 8,9 */
198 				    end_wr_on_cl:1,		/* 8,9 */
199 				    :4);
200 /*4*/	volatile uint8_t	__FXP_BITFIELD2(rx_dma_bytecount:7,
201 				    :1);
202 /*5*/	volatile uint8_t	__FXP_BITFIELD2(tx_dma_bytecount:7,
203 				    dma_mbce:1);
204 /*6*/	volatile uint8_t	__FXP_BITFIELD8(late_scb:1,	/* 7 */
205 				    direct_dma_dis:1,		/* 8,9 */
206 				    tno_int_or_tco_en:1,	/* 7,9 */
207 				    ci_int:1,
208 				    ext_txcb_dis:1,		/* 8,9 */
209 				    ext_stats_dis:1,		/* 8,9 */
210 				    keep_overrun_rx:1,
211 				    save_bf:1);
212 /*7*/	volatile uint8_t	__FXP_BITFIELD6(disc_short_rx:1,
213 				    underrun_retry:2,
214 				    :2,
215 				    ext_rfa:1,			/* 0 */
216 				    two_frames:1,		/* 8,9 */
217 				    dyn_tbd:1);			/* 8,9 */
218 /*8*/	volatile uint8_t	__FXP_BITFIELD3(mediatype:1,	/* 7 */
219 				    :6,
220 				    csma_dis:1);		/* 8,9 */
221 /*9*/	volatile uint8_t	__FXP_BITFIELD6(tcp_udp_cksum:1,/* 9 */
222 				    :3,
223 				    vlan_tco:1,			/* 8,9 */
224 				    link_wake_en:1,		/* 8,9 */
225 				    arp_wake_en:1,		/* 8 */
226 				    mc_wake_en:1);		/* 8 */
227 /*10*/	volatile uint8_t	__FXP_BITFIELD4(:3,
228 				    nsai:1,
229 				    preamble_length:2,
230 				    loopback:2);
231 /*11*/	volatile uint8_t	__FXP_BITFIELD2(linear_priority:3,/* 7 */
232 				    :5);
233 /*12*/	volatile uint8_t	__FXP_BITFIELD3(linear_pri_mode:1,/* 7 */
234 				    :3,
235 				    interfrm_spacing:4);
236 /*13*/	volatile uint8_t	:8;
237 /*14*/	volatile uint8_t	:8;
238 /*15*/	volatile uint8_t	__FXP_BITFIELD8(promiscuous:1,
239 				    bcast_disable:1,
240 				    wait_after_win:1,		/* 8,9 */
241 				    :1,
242 				    ignore_ul:1,		/* 8,9 */
243 				    crc16_en:1,			/* 9 */
244 				    :1,
245 				    crscdt:1);
246 /*16*/	volatile uint8_t	fc_delay_lsb:8;			/* 8,9 */
247 /*17*/	volatile uint8_t	fc_delay_msb:8;			/* 8,9 */
248 /*18*/	volatile uint8_t	__FXP_BITFIELD6(stripping:1,
249 				    padding:1,
250 				    rcv_crc_xfer:1,
251 				    long_rx_en:1,		/* 8,9 */
252 				    pri_fc_thresh:3,		/* 8,9 */
253 				    :1);
254 /*19*/	volatile uint8_t	__FXP_BITFIELD8(ia_wake_en:1,	/* 8 */
255 				    magic_pkt_dis:1,		/* 8,9,!9ER */
256 				    tx_fc_dis:1,		/* 8,9 */
257 				    rx_fc_restop:1,		/* 8,9 */
258 				    rx_fc_restart:1,		/* 8,9 */
259 				    fc_filter:1,		/* 8,9 */
260 				    force_fdx:1,
261 				    fdx_pin_en:1);
262 /*20*/	volatile uint8_t	__FXP_BITFIELD4(:5,
263 				    pri_fc_loc:1		/* 8,9 */,
264 				    multi_ia:1,
265 				    :1);
266 /*21*/	volatile uint8_t	__FXP_BITFIELD3(:3, mc_all:1, :4);
267 
268 	/* Bytes 22 - 31 -- i82550 only */
269 /*22*/	volatile uint8_t	__FXP_BITFIELD3(ext_rx_mode:1,
270 				    vlan_drop_en:1,
271 				    :6);
272 	volatile uint8_t	reserved[9];
273 };
274 
275 #define	FXP_CONFIG_LEN		22	/* i8255x */
276 #define	FXP_EXT_CONFIG_LEN	32	/* i82550 */
277 
278 /*
279  * Multicast setup command.
280  */
281 #define MAXMCADDR 80
282 struct fxp_cb_mcs {
283 	volatile uint16_t cb_status;
284 	volatile uint16_t cb_command;
285 	volatile uint32_t link_addr;
286 	volatile uint16_t mc_cnt;
287 	uint8_t mc_addr[MAXMCADDR][6];
288 };
289 
290 #define	MAXUCODESIZE		192
291 struct fxp_cb_ucode {
292 	volatile uint16_t cb_status;
293 	volatile uint16_t cb_command;
294 	volatile uint32_t link_addr;
295 	uint32_t ucode[MAXUCODESIZE];
296 };
297 
298 struct fxp_ipcb {
299 	/*
300 	 * The following fields are valid only when
301 	 * using the IPCB command block for TX checksum offload
302 	 * (and TCP large send, VLANs, and (I think) IPsec). To use
303 	 * them, you must enable extended TxCBs (available only
304 	 * on the 82559 and later) and use the IPCBXMIT command.
305 	 * Note that Intel defines the IPCB to be 32 bytes long,
306 	 * the last 8 bytes of which comprise the first entry
307 	 * in the TBD array. This means we only have to define
308 	 * 8 extra bytes here.
309          */
310 	volatile uint16_t ipcb_schedule_low;
311 	volatile uint8_t ipcb_ip_schedule;
312 	volatile uint8_t ipcb_ip_activation_high;
313 	volatile uint16_t ipcb_vlan_id;
314 	volatile uint8_t ipcb_ip_header_offset;
315 	volatile uint8_t ipcb_tcp_header_offset;
316 };
317 
318 /*
319  * IPCB field definitions
320  */
321 /* for ipcb_ip_schedule */
322 #define FXP_IPCB_IP_CHECKSUM_ENABLE	0x10
323 #define FXP_IPCB_TCPUDP_CHECKSUM_ENABLE	0x20
324 #define FXP_IPCB_TCP_PACKET		0x40
325 #define FXP_IPCB_LARGESEND_ENABLE	0x80
326 /* for ipcb_ip_activation_high */
327 #define FXP_IPCB_HARDWAREPARSING_ENABLE	0x01
328 #define FXP_IPCB_INSERTVLAN_ENABLE	0x02
329 
330 /*
331  * hardware ip4csum-tx on fxp(4) doesn't set IP checksums properly
332  * if the TX IP packet length is 21 or 22 bytes and it requires autopadding.
333  * To avoid this bug, we have to pad such very short packets manually.
334  */
335 #define FXP_IP4CSUMTX_MINLEN	22
336 #define FXP_IP4CSUMTX_PADLEN	(ETHER_HDR_LEN + FXP_IP4CSUMTX_MINLEN)
337 
338 /*
339  * Transmit command.
340  */
341 struct fxp_cb_tx {
342 	volatile uint16_t cb_status;
343 	volatile uint16_t cb_command;
344 	volatile uint32_t link_addr;
345 	volatile uint32_t tbd_array_addr;
346 	volatile uint16_t byte_count;
347 	volatile uint8_t tx_threshold;
348 	volatile uint8_t tbd_number;
349 	/*
350 	 * If using the extended TxCB feature, there is a
351 	 * two TBDs right here.  We handle this in the
352 	 * fxp_control_data in i82557var.h.
353 	 */
354 };
355 
356 /*
357  * Transmit buffer descriptors.
358  */
359 struct fxp_tbd {
360 	volatile uint32_t tb_addr;
361 	volatile uint32_t tb_size;
362 };
363 
364 /*
365  * Control Block (CB) definitions
366  */
367 
368 /* status */
369 #define FXP_CB_STATUS_OK	0x2000
370 #define FXP_CB_STATUS_C		0x8000
371 
372 /* commands */
373 #define FXP_CB_COMMAND_CMD	0x0007
374 #define FXP_CB_COMMAND_NOP	0x0
375 #define FXP_CB_COMMAND_IAS	0x1
376 #define FXP_CB_COMMAND_CONFIG	0x2
377 #define FXP_CB_COMMAND_MCAS	0x3
378 #define FXP_CB_COMMAND_XMIT	0x4
379 #define FXP_CB_COMMAND_UCODE	0x5
380 #define FXP_CB_COMMAND_DUMP	0x6
381 #define FXP_CB_COMMAND_DIAG	0x7
382 #define FXP_CB_COMMAND_IPCBXMIT	0x9
383 
384 /* command flags */
385 #define FXP_CB_COMMAND_SF	0x0008	/* simple/flexible mode */
386 #define FXP_CB_COMMAND_I	0x2000	/* generate interrupt on completion */
387 #define FXP_CB_COMMAND_S	0x4000	/* suspend on completion */
388 #define FXP_CB_COMMAND_EL	0x8000	/* end of list */
389 
390 /*
391  * Receive Frame Area.
392  *
393  * NOTE!  The RFA will NOT be aligned on a 4-byte boundary in the DMA
394  * area!  To prevent EGCS from optimizing the copy of link_addr and
395  * rbd_addr (which would cause an unaligned access fault on RISC systems),
396  * we must make them an array of bytes!
397  */
398 struct fxp_rfa {
399 	/* Fields common to all i8255x chips. */
400 	volatile uint16_t rfa_status;
401 	volatile uint16_t rfa_control;
402 	volatile uint8_t link_addr[4];
403 	volatile uint8_t rbd_addr[4];
404 	volatile uint16_t actual_size;
405 	volatile uint16_t size;
406 
407 	/* Fields available only on the i82550/i82551 in extended RFD mode. */
408 	volatile uint16_t vlan_id;
409 	volatile uint8_t rx_parse_stat;
410 	volatile uint8_t reserved;
411 	volatile uint16_t security_stat;
412 	volatile uint8_t cksum_stat;
413 	volatile uint8_t zerocopy_stat;
414 	volatile uint8_t unused[8];
415 };
416 
417 #define	RFA_SIZE		16
418 #define	RFA_EXT_SIZE		32
419 
420 #define FXP_RFA_STATUS_RCOL	0x0001	/* receive collision */
421 #define FXP_RFA_STATUS_IAMATCH	0x0002	/* 0 = matches station address */
422 #define FXP_RFA_STATUS_NOAMATCH	0x0004	/* 1 = doesn't match anything */
423 #define FXP_RFA_STATUS_PARSE	0x0008	/* pkt parse ok (82550/1 only) */
424 #define FXP_RFA_STATUS_S4	0x0010	/* receive error from PHY */
425 #define FXP_RFA_STATUS_TL	0x0020	/* type/length */
426 #define FXP_RFA_STATUS_FTS	0x0080	/* frame too short */
427 #define FXP_RFA_STATUS_OVERRUN	0x0100	/* DMA overrun */
428 #define FXP_RFA_STATUS_RNR	0x0200	/* no resources */
429 #define FXP_RFA_STATUS_ALIGN	0x0400	/* alignment error */
430 #define FXP_RFA_STATUS_CRC	0x0800	/* CRC error */
431 #define FXP_RFA_STATUS_VLAN	0x1000	/* VLAN */
432 #define FXP_RFA_STATUS_OK	0x2000	/* packet received okay */
433 #define FXP_RFA_STATUS_C	0x8000	/* packet reception complete */
434 
435 #define FXP_RFA_CONTROL_SF	0x0008	/* simple/flexible memory mode */
436 #define FXP_RFA_CONTROL_H	0x0010	/* header RFD */
437 #define FXP_RFA_CONTROL_S	0x4000	/* suspend after reception */
438 #define FXP_RFA_CONTROL_EL	0x8000	/* end of list */
439 
440 /* Bits in the 'cksum_stat' byte */
441 #define FXP_RFDX_CS_TCPUDP_CSUM_BIT_VALID	0x10
442 #define FXP_RFDX_CS_TCPUDP_CSUM_VALID		0x20
443 #define FXP_RFDX_CS_IP_CSUM_BIT_VALID		0x01
444 #define FXP_RFDX_CS_IP_CSUM_VALID		0x02
445 
446 /* Bits in the 'rx_parse_stat' byte */
447 #define FXP_RFDX_P_PARSE_BIT			0x08
448 #define FXP_RFDX_P_CSUM_PROTOCOL_MASK		0x03
449 #define FXP_RFDX_P_TCP_PACKET			0x00
450 #define FXP_RFDX_P_UDP_PACKET			0x01
451 #define FXP_RFDX_P_IP_PACKET			0x03
452 
453 /*
454  * Statistics dump area definitions
455  */
456 struct fxp_stats {
457 	volatile uint32_t tx_good;
458 	volatile uint32_t tx_maxcols;
459 	volatile uint32_t tx_latecols;
460 	volatile uint32_t tx_underruns;
461 	volatile uint32_t tx_lostcrs;
462 	volatile uint32_t tx_deferred;
463 	volatile uint32_t tx_single_collisions;
464 	volatile uint32_t tx_multiple_collisions;
465 	volatile uint32_t tx_total_collisions;
466 	volatile uint32_t rx_good;
467 	volatile uint32_t rx_crc_errors;
468 	volatile uint32_t rx_alignment_errors;
469 	volatile uint32_t rx_rnr_errors;
470 	volatile uint32_t rx_overrun_errors;
471 	volatile uint32_t rx_cdt_errors;
472 	volatile uint32_t rx_shortframes;
473 	volatile uint32_t tx_pauseframes;
474 #define	completion_status	tx_pauseframes
475 	volatile uint32_t rx_pauseframes;
476 	volatile uint32_t rx_unsupportedframes;
477 	volatile uint32_t tx_tco_frames;
478 	volatile uint32_t rx_tco_frames;
479 	volatile uint32_t ext_completion_status;
480 };
481 #define FXP_STATS_DUMP_COMPLETE	0xa005
482 #define FXP_STATS_DR_COMPLETE	0xa007
483 
484 /*
485  * Serial EEPROM control register bits
486  */
487 #define FXP_EEPROM_EESK		0x01		/* shift clock */
488 #define FXP_EEPROM_EECS		0x02		/* chip select */
489 #define FXP_EEPROM_EEDI		0x04		/* data in */
490 #define FXP_EEPROM_EEDO		0x08		/* data out */
491 
492 /*
493  * Serial EEPROM opcodes, including start bit
494  */
495 #define FXP_EEPROM_OPC_ERASE	0x4
496 #define FXP_EEPROM_OPC_WRITE	0x5
497 #define FXP_EEPROM_OPC_READ	0x6
498 
499 /*
500  * Management Data Interface opcodes
501  */
502 #define FXP_MDI_WRITE		0x1
503 #define FXP_MDI_READ		0x2
504 
505 /*
506  * PHY device types (from EEPROM)
507  */
508 #define	FXP_PHY_DEVICE_MASK	0x3f00
509 #define	FXP_PHY_DEVICE_SHIFT	8
510 #define	FXP_PHY_DEVADDR_MASK	0x00ff
511 #define	FXP_PHY_SERIAL_ONLY	0x8000
512 #define FXP_PHY_NONE		0
513 #define FXP_PHY_82553A		1
514 #define FXP_PHY_82553C		2
515 #define FXP_PHY_82503		3
516 #define FXP_PHY_DP83840		4
517 #define FXP_PHY_80C240		5
518 #define FXP_PHY_80C24		6
519 #define FXP_PHY_82555		7
520 #define FXP_PHY_DP83840A	10
521 #define	FXP_PHY_DP82555B	11
522 
523 /*
524  * PCI revisions.
525  */
526 #define	FXP_REV_82558_A4	4
527 #define	FXP_REV_82558_B0	5
528 #define	FXP_REV_82559_A0	8
529 #define	FXP_REV_82559S_A	9
530 #define	FXP_REV_82550		12
531 #define	FXP_REV_82550_C		13
532 #define	FXP_REV_82551_E		14	/* 82551 */
533 #define	FXP_REV_82551_F		15
534 #define	FXP_REV_82551_10	16	/* 82551 */
535