| /* This file is part of the UCB release of Plan 9. It is subject to the license | 
 |  * terms in the LICENSE file found in the top-level directory of this | 
 |  * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No | 
 |  * part of the UCB release of Plan 9, including this file, may be copied, | 
 |  * modified, propagated, or distributed except according to the terms contained | 
 |  * in the LICENSE file. */ | 
 |  | 
 | enum {					/* registers */ | 
 | 	Bmcr		= 0x00,		/* Basic Mode Control */ | 
 | 	Bmsr		= 0x01,		/* Basic Mode Status */ | 
 | 	Phyidr1		= 0x02,		/* PHY Identifier #1 */ | 
 | 	Phyidr2		= 0x03,		/* PHY Identifier #2 */ | 
 | 	Anar		= 0x04,		/* Auto-Negotiation Advertisement */ | 
 | 	Anlpar		= 0x05,		/* AN Link Partner Ability */ | 
 | 	Aner		= 0x06,		/* AN Expansion */ | 
 | 	Annptr		= 0x07,		/* AN Next Page TX */ | 
 | 	Annprr		= 0x08,		/* AN Next Page RX */ | 
 | 	Mscr		= 0x09,		/* MASTER-SLAVE Control */ | 
 | 	Mssr		= 0x0a,		/* MASTER-SLAVE Status */ | 
 | 	Esr		= 0x0f,		/* Extended Status */ | 
 |  | 
 | 	NMiiPhyr	= 32, | 
 | 	NMiiPhy		= 32, | 
 | }; | 
 |  | 
 | enum {					/* Bmcr */ | 
 | 	BmcrSs1		= 0x0040,	/* Speed Select[1] */ | 
 | 	BmcrCte		= 0x0080,	/* Collision Test Enable */ | 
 | 	BmcrDm		= 0x0100,	/* Duplex Mode */ | 
 | 	BmcrRan		= 0x0200,	/* Restart Auto-Negotiation */ | 
 | 	BmcrI		= 0x0400,	/* Isolate */ | 
 | 	BmcrPd		= 0x0800,	/* Power Down */ | 
 | 	BmcrAne		= 0x1000,	/* Auto-Negotiation Enable */ | 
 | 	BmcrSs0		= 0x2000,	/* Speed Select[0] */ | 
 | 	BmcrLe		= 0x4000,	/* Loopback Enable */ | 
 | 	BmcrR		= 0x8000,	/* Reset */ | 
 | }; | 
 |  | 
 | enum {					/* Bmsr */ | 
 | 	BmsrEc		= 0x0001,	/* Extended Capability */ | 
 | 	BmsrJd		= 0x0002,	/* Jabber Detect */ | 
 | 	BmsrLs		= 0x0004,	/* Link Status */ | 
 | 	BmsrAna		= 0x0008,	/* Auto-Negotiation Ability */ | 
 | 	BmsrRf		= 0x0010,	/* Remote Fault */ | 
 | 	BmsrAnc		= 0x0020,	/* Auto-Negotiation Complete */ | 
 | 	BmsrPs		= 0x0040,	/* Preamble Suppression Capable */ | 
 | 	BmsrEs		= 0x0100,	/* Extended Status */ | 
 | 	Bmsr100T2HD	= 0x0200,	/* 100BASE-T2 HD Capable */ | 
 | 	Bmsr100T2FD	= 0x0400,	/* 100BASE-T2 FD Capable */ | 
 | 	Bmsr10THD	= 0x0800,	/* 10BASE-T HD Capable */ | 
 | 	Bmsr10TFD	= 0x1000,	/* 10BASE-T FD Capable */ | 
 | 	Bmsr100TXHD	= 0x2000,	/* 100BASE-TX HD Capable */ | 
 | 	Bmsr100TXFD	= 0x4000,	/* 100BASE-TX FD Capable */ | 
 | 	Bmsr100T4	= 0x8000,	/* 100BASE-T4 Capable */ | 
 | }; | 
 |  | 
 | enum {					/* Anar/Anlpar */ | 
 | 	Ana10G		= 0x0001, | 
 |  | 
 | 	Ana10HD		= 0x0020,	/* Advertise 10BASE-T */ | 
 | 	Ana10FD		= 0x0040,	/* Advertise 10BASE-T FD */ | 
 | 	AnaTXHD		= 0x0080,	/* Advertise 100BASE-TX */ | 
 | 	AnaTXFD		= 0x0100,	/* Advertise 100BASE-TX FD */ | 
 | 	AnaT4		= 0x0200,	/* Advertise 100BASE-T4 */ | 
 | 	AnaP		= 0x0400,	/* Pause */ | 
 | 	AnaAP		= 0x0800,	/* Asymmetrical Pause */ | 
 | 	AnaRf		= 0x2000,	/* Remote Fault */ | 
 | 	AnaAck		= 0x4000,	/* Acknowledge */ | 
 | 	AnaNp		= 0x8000,	/* Next Page Indication */ | 
 | }; | 
 |  | 
 | enum {					/* Mscr */ | 
 | 	Mscr1000THD	= 0x0100,	/* Advertise 1000BASE-T HD */ | 
 | 	Mscr1000TFD	= 0x0200,	/* Advertise 1000BASE-T FD */ | 
 | }; | 
 |  | 
 | enum {					/* Mssr */ | 
 | 	Mssr1000THD	= 0x0400,	/* Link Partner 1000BASE-T HD able */ | 
 | 	Mssr1000TFD	= 0x0800,	/* Link Partner 1000BASE-T FD able */ | 
 | }; | 
 |  | 
 | enum {					/* Esr */ | 
 | 	Esr1000THD	= 0x1000,	/* 1000BASE-T HD Capable */ | 
 | 	Esr1000TFD	= 0x2000,	/* 1000BASE-T FD Capable */ | 
 | 	Esr1000XHD	= 0x4000,	/* 1000BASE-X HD Capable */ | 
 | 	Esr1000XFD	= 0x8000,	/* 1000BASE-X FD Capable */ | 
 | }; | 
 |  | 
 | struct mii { | 
 | 	spinlock_t lock; | 
 | 	int	nphy; | 
 | 	int	mask; | 
 | 	struct miiphy*	phy[NMiiPhy]; | 
 | 	struct miiphy*	curphy; | 
 |  | 
 | 	void*	ctlr; | 
 | 	int	(*rw)(struct mii*, int unused_int, int, int, int); | 
 | }; | 
 |  | 
 | struct miiphy { | 
 | 	struct mii*	mii; | 
 | 	int	phyno; | 
 | 	int	phyid; | 
 | 	int	oui; | 
 |  | 
 | 	int	anar; | 
 | 	int	fc; | 
 | 	int	mscr; | 
 |  | 
 | 	int	link; | 
 | 	int	speed; | 
 | 	int	fd; | 
 | 	int	rfc; | 
 | 	int	tfc; | 
 | }; | 
 |  | 
 | int miimir(struct mii *mii, int r); | 
 | int miimiw(struct mii *mii, int r, int data); | 
 | int miireset(struct mii *mii); | 
 | int miiane(struct mii *mii, int a, int p, int e); | 
 | int miistatus(struct mii *mii); | 
 | char *miidumpphy(struct mii *mii, char *p, char *e); | 
 | void miidetach(struct mii *mii); | 
 | struct mii *miiattach(void *ctlr, int mask, int (*rw)(struct mii *, int unused_int, int unused2, int unused3, int unused4)); |