xref: /titanic_44/usr/src/uts/common/io/bfe/bfe.h (revision dd52495f0d9ba8ff6d84921ec0500be837896554)
1*dd52495fSSaurabh Misra /*
2*dd52495fSSaurabh Misra  * CDDL HEADER START
3*dd52495fSSaurabh Misra  *
4*dd52495fSSaurabh Misra  * The contents of this file are subject to the terms of the
5*dd52495fSSaurabh Misra  * Common Development and Distribution License (the "License").
6*dd52495fSSaurabh Misra  * You may not use this file except in compliance with the License.
7*dd52495fSSaurabh Misra  *
8*dd52495fSSaurabh Misra  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*dd52495fSSaurabh Misra  * or http://www.opensolaris.org/os/licensing.
10*dd52495fSSaurabh Misra  * See the License for the specific language governing permissions
11*dd52495fSSaurabh Misra  * and limitations under the License.
12*dd52495fSSaurabh Misra  *
13*dd52495fSSaurabh Misra  * When distributing Covered Code, include this CDDL HEADER in each
14*dd52495fSSaurabh Misra  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*dd52495fSSaurabh Misra  * If applicable, add the following below this CDDL HEADER, with the
16*dd52495fSSaurabh Misra  * fields enclosed by brackets "[]" replaced with your own identifying
17*dd52495fSSaurabh Misra  * information: Portions Copyright [yyyy] [name of copyright owner]
18*dd52495fSSaurabh Misra  *
19*dd52495fSSaurabh Misra  * CDDL HEADER END
20*dd52495fSSaurabh Misra  */
21*dd52495fSSaurabh Misra 
22*dd52495fSSaurabh Misra /*
23*dd52495fSSaurabh Misra  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24*dd52495fSSaurabh Misra  * Use is subject to license terms.
25*dd52495fSSaurabh Misra  */
26*dd52495fSSaurabh Misra 
27*dd52495fSSaurabh Misra #ifndef _BFE_H
28*dd52495fSSaurabh Misra #define	_BFE_H
29*dd52495fSSaurabh Misra 
30*dd52495fSSaurabh Misra #include "bfe_hw.h"
31*dd52495fSSaurabh Misra 
32*dd52495fSSaurabh Misra #ifdef __cplusplus
33*dd52495fSSaurabh Misra 	extern "C" {
34*dd52495fSSaurabh Misra #endif
35*dd52495fSSaurabh Misra 
36*dd52495fSSaurabh Misra #define	BFE_SUCCESS	DDI_SUCCESS
37*dd52495fSSaurabh Misra #define	BFE_FAILURE	DDI_FAILURE
38*dd52495fSSaurabh Misra 
39*dd52495fSSaurabh Misra #define	BFE_MAX_MULTICAST_TABLE	64
40*dd52495fSSaurabh Misra 
41*dd52495fSSaurabh Misra #define	BFE_LINK_SPEED_10MBS	1
42*dd52495fSSaurabh Misra #define	BFE_LINK_SPEED_100MBS	2
43*dd52495fSSaurabh Misra 
44*dd52495fSSaurabh Misra #define	VTAG_SIZE	4
45*dd52495fSSaurabh Misra 
46*dd52495fSSaurabh Misra #define	BFE_MTU		ETHERMTU
47*dd52495fSSaurabh Misra 
48*dd52495fSSaurabh Misra /*
49*dd52495fSSaurabh Misra  * Use to increment descriptor slot number.
50*dd52495fSSaurabh Misra  */
51*dd52495fSSaurabh Misra #define	BFE_INC_SLOT(i, p2) \
52*dd52495fSSaurabh Misra 	(i = ((i + 1) & (p2 - 1)))
53*dd52495fSSaurabh Misra 
54*dd52495fSSaurabh Misra #define	BFE_DEC_SLOT(i, p2) \
55*dd52495fSSaurabh Misra 	(i = ((i + p2 - 1) % p2))
56*dd52495fSSaurabh Misra 
57*dd52495fSSaurabh Misra /*
58*dd52495fSSaurabh Misra  * I/O instructions
59*dd52495fSSaurabh Misra  */
60*dd52495fSSaurabh Misra #define	OUTB(bfe, p, v)  \
61*dd52495fSSaurabh Misra 	ddi_put8((bfe)->bfe_mem_regset.hdl, \
62*dd52495fSSaurabh Misra 		(void *)((caddr_t)((bfe)->bfe_mem_regset.addr) + (p)), v)
63*dd52495fSSaurabh Misra 
64*dd52495fSSaurabh Misra #define	OUTW(bfe, p, v)  \
65*dd52495fSSaurabh Misra 	ddi_put16((bfe)->bfe_mem_regset.hdl, \
66*dd52495fSSaurabh Misra 		(void *)((caddr_t)((bfe)->bfe_mem_regset.addr) + (p)), v)
67*dd52495fSSaurabh Misra 
68*dd52495fSSaurabh Misra #define	OUTL(bfe, p, v)  \
69*dd52495fSSaurabh Misra 	ddi_put32((bfe)->bfe_mem_regset.hdl, \
70*dd52495fSSaurabh Misra 		(void *)((caddr_t)((bfe)->bfe_mem_regset.addr) + (p)), v)
71*dd52495fSSaurabh Misra 
72*dd52495fSSaurabh Misra #define	INB(bfe, p)      \
73*dd52495fSSaurabh Misra 	ddi_get8((bfe)->bfe_mem_regset.hdl, \
74*dd52495fSSaurabh Misra 		(void *)(((caddr_t)(bfe)->bfe_mem_regset.addr) + (p)))
75*dd52495fSSaurabh Misra #define	INW(bfe, p)      \
76*dd52495fSSaurabh Misra 	ddi_get16((bfe)->bfe_mem_regset.hdl, \
77*dd52495fSSaurabh Misra 		(void *)(((caddr_t)(bfe)->bfe_mem_regset.addr) + (p)))
78*dd52495fSSaurabh Misra 
79*dd52495fSSaurabh Misra #define	INL(bfe, p)      \
80*dd52495fSSaurabh Misra 	ddi_get32((bfe)->bfe_mem_regset.hdl, \
81*dd52495fSSaurabh Misra 		(void *)(((caddr_t)(bfe)->bfe_mem_regset.addr) + (p)))
82*dd52495fSSaurabh Misra 
83*dd52495fSSaurabh Misra #define	FLUSH(bfe, reg) \
84*dd52495fSSaurabh Misra 	(void) INL(bfe, reg)
85*dd52495fSSaurabh Misra 
86*dd52495fSSaurabh Misra #define	OUTL_OR(bfe, reg, v) \
87*dd52495fSSaurabh Misra 	OUTL(bfe, reg, (INL(bfe, reg) | v))
88*dd52495fSSaurabh Misra 
89*dd52495fSSaurabh Misra #define	OUTL_AND(bfe, reg, v) \
90*dd52495fSSaurabh Misra 	OUTL(bfe, reg, (INL(bfe, reg) & v))
91*dd52495fSSaurabh Misra 
92*dd52495fSSaurabh Misra /*
93*dd52495fSSaurabh Misra  * These macros allows use to write to descriptor memory.
94*dd52495fSSaurabh Misra  */
95*dd52495fSSaurabh Misra #define	PUT_DESC(r, member, val)	\
96*dd52495fSSaurabh Misra 	ddi_put32(r->r_desc_acc_handle, (member), (val))
97*dd52495fSSaurabh Misra 
98*dd52495fSSaurabh Misra #define	GET_DESC(r, member)	\
99*dd52495fSSaurabh Misra 	ddi_get32(r->r_desc_acc_handle, (member))
100*dd52495fSSaurabh Misra 
101*dd52495fSSaurabh Misra typedef struct bfe_cards {
102*dd52495fSSaurabh Misra 	uint16_t	vendor_id;
103*dd52495fSSaurabh Misra 	uint16_t	device_id;
104*dd52495fSSaurabh Misra 	char		*cardname;
105*dd52495fSSaurabh Misra } bfe_cards_t;
106*dd52495fSSaurabh Misra 
107*dd52495fSSaurabh Misra 
108*dd52495fSSaurabh Misra /*
109*dd52495fSSaurabh Misra  * Chip's state.
110*dd52495fSSaurabh Misra  */
111*dd52495fSSaurabh Misra typedef	enum {
112*dd52495fSSaurabh Misra 	BFE_CHIP_UNINITIALIZED = 0,
113*dd52495fSSaurabh Misra 	BFE_CHIP_INITIALIZED,
114*dd52495fSSaurabh Misra 	BFE_CHIP_ACTIVE,
115*dd52495fSSaurabh Misra 	BFE_CHIP_STOPPED,
116*dd52495fSSaurabh Misra 	BFE_CHIP_HALT,
117*dd52495fSSaurabh Misra 	BFE_CHIP_RESUME,
118*dd52495fSSaurabh Misra 	BFE_CHIP_SUSPENDED,
119*dd52495fSSaurabh Misra 	BFE_CHIP_QUIESCED
120*dd52495fSSaurabh Misra } bfe_chip_state_t;
121*dd52495fSSaurabh Misra 
122*dd52495fSSaurabh Misra /*
123*dd52495fSSaurabh Misra  * PHY state.
124*dd52495fSSaurabh Misra  */
125*dd52495fSSaurabh Misra typedef	enum {
126*dd52495fSSaurabh Misra 	BFE_PHY_STARTED = 1,
127*dd52495fSSaurabh Misra 	BFE_PHY_STOPPED,
128*dd52495fSSaurabh Misra 	BFE_PHY_RESET_DONE,
129*dd52495fSSaurabh Misra 	BFE_PHY_RESET_TIMEOUT,
130*dd52495fSSaurabh Misra 	BFE_PHY_NOTFOUND
131*dd52495fSSaurabh Misra } bfe_phy_state_t;
132*dd52495fSSaurabh Misra 
133*dd52495fSSaurabh Misra /*
134*dd52495fSSaurabh Misra  * Chip's mode
135*dd52495fSSaurabh Misra  */
136*dd52495fSSaurabh Misra #define	BFE_RX_MODE_ENABLE	0x1
137*dd52495fSSaurabh Misra #define	BFE_RX_MODE_PROMISC	0x2
138*dd52495fSSaurabh Misra #define	BFE_RX_MODE_BROADCAST	0x4
139*dd52495fSSaurabh Misra #define	BFE_RX_MODE_ALLMULTI	0x8
140*dd52495fSSaurabh Misra 
141*dd52495fSSaurabh Misra /*
142*dd52495fSSaurabh Misra  * Every packet has this header which is put by the card.
143*dd52495fSSaurabh Misra  */
144*dd52495fSSaurabh Misra typedef	struct	bfe_rx_header {
145*dd52495fSSaurabh Misra 	uint16_t len;
146*dd52495fSSaurabh Misra 	uint16_t flags;
147*dd52495fSSaurabh Misra 	uint16_t pad[12];
148*dd52495fSSaurabh Misra } bfe_rx_header_t;
149*dd52495fSSaurabh Misra 
150*dd52495fSSaurabh Misra typedef	struct bfe_stats {
151*dd52495fSSaurabh Misra 	uint64_t	ether_stat_align_errors;
152*dd52495fSSaurabh Misra 	uint64_t	ether_stat_carrier_errors;
153*dd52495fSSaurabh Misra 	uint64_t	ether_stat_ex_collisions;
154*dd52495fSSaurabh Misra 	uint64_t	ether_stat_fcs_errors;
155*dd52495fSSaurabh Misra 	uint64_t	ether_stat_first_collisions;
156*dd52495fSSaurabh Misra 	uint64_t	ether_stat_macrcv_errors;
157*dd52495fSSaurabh Misra 	uint64_t	ether_stat_macxmt_errors;
158*dd52495fSSaurabh Misra 	uint64_t	ether_stat_multi_collisions;
159*dd52495fSSaurabh Misra 	uint64_t	ether_stat_toolong_errors;
160*dd52495fSSaurabh Misra 	uint64_t	ether_stat_tooshort_errors;
161*dd52495fSSaurabh Misra 	uint64_t	ether_stat_tx_late_collisions;
162*dd52495fSSaurabh Misra 	uint64_t	ether_stat_defer_xmts;
163*dd52495fSSaurabh Misra 	uint64_t	brdcstrcv;
164*dd52495fSSaurabh Misra 	uint64_t	brdcstxmt;
165*dd52495fSSaurabh Misra 	uint64_t	multixmt;
166*dd52495fSSaurabh Misra 	uint64_t	collisions;
167*dd52495fSSaurabh Misra 	uint64_t	ierrors;
168*dd52495fSSaurabh Misra 	uint64_t	ipackets;
169*dd52495fSSaurabh Misra 	uint64_t	multircv;
170*dd52495fSSaurabh Misra 	uint64_t	norcvbuf;
171*dd52495fSSaurabh Misra 	uint64_t	noxmtbuf;
172*dd52495fSSaurabh Misra 	uint64_t	obytes;
173*dd52495fSSaurabh Misra 	uint64_t	opackets;
174*dd52495fSSaurabh Misra 	uint64_t	rbytes;
175*dd52495fSSaurabh Misra 	uint64_t	underflows;
176*dd52495fSSaurabh Misra 	uint64_t	overflows;
177*dd52495fSSaurabh Misra 	uint64_t	txchecks;
178*dd52495fSSaurabh Misra 	uint64_t	intr_claimed;
179*dd52495fSSaurabh Misra 	uint64_t	intr_unclaimed;
180*dd52495fSSaurabh Misra 	uint64_t	linkchanges;
181*dd52495fSSaurabh Misra 	uint64_t	txcpybytes;
182*dd52495fSSaurabh Misra 	uint64_t	txmapbytes;
183*dd52495fSSaurabh Misra 	uint64_t	rxcpybytes;
184*dd52495fSSaurabh Misra 	uint64_t	rxmapbytes;
185*dd52495fSSaurabh Misra 	uint64_t	txreclaim0;
186*dd52495fSSaurabh Misra 	uint64_t	txreclaims;
187*dd52495fSSaurabh Misra 	uint32_t	txstalls;
188*dd52495fSSaurabh Misra 	uint32_t	resets;
189*dd52495fSSaurabh Misra } bfe_stats_t;
190*dd52495fSSaurabh Misra 
191*dd52495fSSaurabh Misra typedef struct {
192*dd52495fSSaurabh Misra 	int	state;
193*dd52495fSSaurabh Misra 	int	speed;
194*dd52495fSSaurabh Misra 	int	duplex;
195*dd52495fSSaurabh Misra 	int	flowctrl;
196*dd52495fSSaurabh Misra 	int	mau;
197*dd52495fSSaurabh Misra } bfe_link_t;
198*dd52495fSSaurabh Misra 
199*dd52495fSSaurabh Misra /*
200*dd52495fSSaurabh Misra  * Device registers handle
201*dd52495fSSaurabh Misra  */
202*dd52495fSSaurabh Misra typedef struct {
203*dd52495fSSaurabh Misra 	ddi_acc_handle_t	hdl;
204*dd52495fSSaurabh Misra 	caddr_t			addr;
205*dd52495fSSaurabh Misra } bfe_acc_t;
206*dd52495fSSaurabh Misra 
207*dd52495fSSaurabh Misra /*
208*dd52495fSSaurabh Misra  * BCM4401 Chip state
209*dd52495fSSaurabh Misra  */
210*dd52495fSSaurabh Misra typedef struct bfe_chip {
211*dd52495fSSaurabh Misra 	int		link;
212*dd52495fSSaurabh Misra 	int		state;
213*dd52495fSSaurabh Misra 	int		speed;
214*dd52495fSSaurabh Misra 	int		duplex;
215*dd52495fSSaurabh Misra 	uint32_t	bmsr;
216*dd52495fSSaurabh Misra 	uint32_t	phyaddr;
217*dd52495fSSaurabh Misra } bfe_chip_t;
218*dd52495fSSaurabh Misra 
219*dd52495fSSaurabh Misra 
220*dd52495fSSaurabh Misra /*
221*dd52495fSSaurabh Misra  * Ring Management framework.
222*dd52495fSSaurabh Misra  */
223*dd52495fSSaurabh Misra 
224*dd52495fSSaurabh Misra /*
225*dd52495fSSaurabh Misra  * TX and RX descriptor format in the hardware.
226*dd52495fSSaurabh Misra  */
227*dd52495fSSaurabh Misra typedef	struct bfe_desc {
228*dd52495fSSaurabh Misra 	volatile uint32_t	desc_ctl;
229*dd52495fSSaurabh Misra 	volatile uint32_t	desc_addr;
230*dd52495fSSaurabh Misra } bfe_desc_t;
231*dd52495fSSaurabh Misra 
232*dd52495fSSaurabh Misra /*
233*dd52495fSSaurabh Misra  * DMA handle for each descriptor
234*dd52495fSSaurabh Misra  */
235*dd52495fSSaurabh Misra typedef struct bfe_dma {
236*dd52495fSSaurabh Misra 	ddi_dma_handle_t	handle;
237*dd52495fSSaurabh Misra 	ddi_acc_handle_t	acchdl;
238*dd52495fSSaurabh Misra 	ddi_dma_cookie_t	cookie;
239*dd52495fSSaurabh Misra 	caddr_t			addr;
240*dd52495fSSaurabh Misra 	size_t			len;
241*dd52495fSSaurabh Misra } bfe_dma_t;
242*dd52495fSSaurabh Misra 
243*dd52495fSSaurabh Misra /* Keep it power of 2 */
244*dd52495fSSaurabh Misra #define	TX_NUM_DESC	128
245*dd52495fSSaurabh Misra #define	RX_NUM_DESC	128
246*dd52495fSSaurabh Misra 
247*dd52495fSSaurabh Misra 
248*dd52495fSSaurabh Misra #define	BFE_RING_UNALLOCATED	0
249*dd52495fSSaurabh Misra #define	BFE_RING_ALLOCATED	1
250*dd52495fSSaurabh Misra 
251*dd52495fSSaurabh Misra struct	bfe;
252*dd52495fSSaurabh Misra 
253*dd52495fSSaurabh Misra typedef	struct bfe_ring {
254*dd52495fSSaurabh Misra 	/* Lock for the ring */
255*dd52495fSSaurabh Misra 	kmutex_t	r_lock;
256*dd52495fSSaurabh Misra 
257*dd52495fSSaurabh Misra 	/* Actual lock pointer. It may point to global lock */
258*dd52495fSSaurabh Misra 	kmutex_t	*r_lockp;
259*dd52495fSSaurabh Misra 
260*dd52495fSSaurabh Misra 	/* DMA handle for all buffers in descriptor table */
261*dd52495fSSaurabh Misra 	bfe_dma_t	*r_buf_dma;
262*dd52495fSSaurabh Misra 
263*dd52495fSSaurabh Misra 	/* DMA buffer holding descriptor table */
264*dd52495fSSaurabh Misra 	bfe_desc_t	*r_desc;
265*dd52495fSSaurabh Misra 
266*dd52495fSSaurabh Misra 	/* DMA handle for the descriptor table */
267*dd52495fSSaurabh Misra 	ddi_dma_handle_t r_desc_dma_handle;
268*dd52495fSSaurabh Misra 	ddi_acc_handle_t r_desc_acc_handle;
269*dd52495fSSaurabh Misra 	ddi_dma_cookie_t r_desc_cookie;
270*dd52495fSSaurabh Misra 	uint32_t	r_ndesc;	/* number of descriptors for the ring */
271*dd52495fSSaurabh Misra 	size_t		r_desc_len;	/* Actual descriptor size */
272*dd52495fSSaurabh Misra 
273*dd52495fSSaurabh Misra 	/* DMA buffer length */
274*dd52495fSSaurabh Misra 	size_t		r_buf_len;
275*dd52495fSSaurabh Misra 
276*dd52495fSSaurabh Misra 	/* Flags associated to the ring */
277*dd52495fSSaurabh Misra 	int		r_flags;
278*dd52495fSSaurabh Misra 
279*dd52495fSSaurabh Misra 	/* Pointer back to bfe instance */
280*dd52495fSSaurabh Misra 	struct	bfe	*r_bfe;
281*dd52495fSSaurabh Misra 
282*dd52495fSSaurabh Misra 	/* Current slot number (or descriptor number) in the ring */
283*dd52495fSSaurabh Misra 	uint_t		r_curr_desc;
284*dd52495fSSaurabh Misra 	/* Consumed descriptor if got the interrupt (only used for TX) */
285*dd52495fSSaurabh Misra 	uint_t		r_cons_desc;
286*dd52495fSSaurabh Misra 
287*dd52495fSSaurabh Misra 	uint_t		r_avail_desc;
288*dd52495fSSaurabh Misra } bfe_ring_t;
289*dd52495fSSaurabh Misra 
290*dd52495fSSaurabh Misra /*
291*dd52495fSSaurabh Misra  * Device driver's private data per instance.
292*dd52495fSSaurabh Misra  */
293*dd52495fSSaurabh Misra typedef struct bfe {
294*dd52495fSSaurabh Misra 	/* devinfo stuff */
295*dd52495fSSaurabh Misra 	dev_info_t	*bfe_dip;
296*dd52495fSSaurabh Misra 	int		bfe_unit;
297*dd52495fSSaurabh Misra 
298*dd52495fSSaurabh Misra 	/* PCI Configuration handle */
299*dd52495fSSaurabh Misra 	ddi_acc_handle_t	bfe_conf_handle;
300*dd52495fSSaurabh Misra 
301*dd52495fSSaurabh Misra 	/* Device registers handle and regset */
302*dd52495fSSaurabh Misra 	bfe_acc_t	bfe_mem_regset;
303*dd52495fSSaurabh Misra 
304*dd52495fSSaurabh Misra 	/* Ethernet addr */
305*dd52495fSSaurabh Misra 	ether_addr_t	bfe_ether_addr;
306*dd52495fSSaurabh Misra 	ether_addr_t	bfe_dev_addr;
307*dd52495fSSaurabh Misra 
308*dd52495fSSaurabh Misra 	/* MAC layer handle */
309*dd52495fSSaurabh Misra 	mac_handle_t	bfe_machdl;
310*dd52495fSSaurabh Misra 
311*dd52495fSSaurabh Misra 	/* Interrupt management */
312*dd52495fSSaurabh Misra 	ddi_intr_handle_t	bfe_intrhdl;
313*dd52495fSSaurabh Misra 	uint_t			bfe_intrpri;
314*dd52495fSSaurabh Misra 
315*dd52495fSSaurabh Misra 	/* Ring Management */
316*dd52495fSSaurabh Misra 	bfe_ring_t	bfe_tx_ring;
317*dd52495fSSaurabh Misra 	bfe_ring_t	bfe_rx_ring;
318*dd52495fSSaurabh Misra 	int		bfe_tx_resched;
319*dd52495fSSaurabh Misra 
320*dd52495fSSaurabh Misra 	/* Chip details */
321*dd52495fSSaurabh Misra 	bfe_chip_t	bfe_chip;
322*dd52495fSSaurabh Misra 	bfe_stats_t	bfe_stats;
323*dd52495fSSaurabh Misra 	bfe_chip_state_t	bfe_chip_state;
324*dd52495fSSaurabh Misra 	uint_t		bfe_chip_mode;
325*dd52495fSSaurabh Misra 	int32_t		bfe_phy_addr;
326*dd52495fSSaurabh Misra 	uchar_t		bfe_chip_action;
327*dd52495fSSaurabh Misra 	bfe_hw_stats_t	bfe_hw_stats;
328*dd52495fSSaurabh Misra 
329*dd52495fSSaurabh Misra 	/* rw lock for chip */
330*dd52495fSSaurabh Misra 	krwlock_t	bfe_rwlock;
331*dd52495fSSaurabh Misra 
332*dd52495fSSaurabh Misra 	/* Multicast table */
333*dd52495fSSaurabh Misra 	uint32_t	bfe_mcast_cnt;
334*dd52495fSSaurabh Misra 
335*dd52495fSSaurabh Misra 	/* Timeout and PHY state */
336*dd52495fSSaurabh Misra 	ddi_periodic_t	bfe_periodic_id;
337*dd52495fSSaurabh Misra 	hrtime_t	bfe_tx_stall_time;
338*dd52495fSSaurabh Misra 	bfe_phy_state_t	bfe_phy_state;
339*dd52495fSSaurabh Misra 	int		bfe_phy_id;
340*dd52495fSSaurabh Misra 
341*dd52495fSSaurabh Misra 	/* MII register set */
342*dd52495fSSaurabh Misra 	uint16_t	bfe_mii_exp;
343*dd52495fSSaurabh Misra 	uint16_t	bfe_mii_bmsr;
344*dd52495fSSaurabh Misra 	uint16_t	bfe_mii_anar;
345*dd52495fSSaurabh Misra 	uint16_t	bfe_mii_anlpar;
346*dd52495fSSaurabh Misra 	uint16_t	bfe_mii_bmcr;
347*dd52495fSSaurabh Misra 
348*dd52495fSSaurabh Misra 	/* Transceiver fields */
349*dd52495fSSaurabh Misra 	uint8_t		bfe_adv_aneg;
350*dd52495fSSaurabh Misra 	uint8_t		bfe_adv_100T4;
351*dd52495fSSaurabh Misra 	uint8_t		bfe_adv_100fdx;
352*dd52495fSSaurabh Misra 	uint8_t		bfe_adv_100hdx;
353*dd52495fSSaurabh Misra 	uint8_t		bfe_adv_10fdx;
354*dd52495fSSaurabh Misra 	uint8_t		bfe_adv_10hdx;
355*dd52495fSSaurabh Misra 	uint8_t		bfe_cap_aneg;
356*dd52495fSSaurabh Misra 	uint8_t		bfe_cap_100T4;
357*dd52495fSSaurabh Misra 	uint8_t		bfe_cap_100fdx;
358*dd52495fSSaurabh Misra 	uint8_t		bfe_cap_100hdx;
359*dd52495fSSaurabh Misra 	uint8_t		bfe_cap_10fdx;
360*dd52495fSSaurabh Misra 	uint8_t		bfe_cap_10hdx;
361*dd52495fSSaurabh Misra } bfe_t;
362*dd52495fSSaurabh Misra 
363*dd52495fSSaurabh Misra static int bfe_identify_hardware(bfe_t *);
364*dd52495fSSaurabh Misra 
365*dd52495fSSaurabh Misra #ifdef __cplusplus
366*dd52495fSSaurabh Misra }
367*dd52495fSSaurabh Misra #endif
368*dd52495fSSaurabh Misra #endif	/* _BFE_H */
369