xref: /plan9-contrib/sys/src/9/bcm/ethermii.h (revision 5c47fe09a0cc86dfb02c0ea4a2b6aec7eda2361f)
1*5c47fe09SDavid du Colombier typedef struct Mii Mii;
2*5c47fe09SDavid du Colombier typedef struct MiiPhy MiiPhy;
3*5c47fe09SDavid du Colombier 
4*5c47fe09SDavid du Colombier enum {					/* registers */
5*5c47fe09SDavid du Colombier 	Bmcr		= 0x00,		/* Basic Mode Control */
6*5c47fe09SDavid du Colombier 	Bmsr		= 0x01,		/* Basic Mode Status */
7*5c47fe09SDavid du Colombier 	Phyidr1		= 0x02,		/* PHY Identifier #1 */
8*5c47fe09SDavid du Colombier 	Phyidr2		= 0x03,		/* PHY Identifier #2 */
9*5c47fe09SDavid du Colombier 	Anar		= 0x04,		/* Auto-Negotiation Advertisement */
10*5c47fe09SDavid du Colombier 	Anlpar		= 0x05,		/* AN Link Partner Ability */
11*5c47fe09SDavid du Colombier 	Aner		= 0x06,		/* AN Expansion */
12*5c47fe09SDavid du Colombier 	Annptr		= 0x07,		/* AN Next Page TX */
13*5c47fe09SDavid du Colombier 	Annprr		= 0x08,		/* AN Next Page RX */
14*5c47fe09SDavid du Colombier 	Mscr		= 0x09,		/* MASTER-SLAVE Control */
15*5c47fe09SDavid du Colombier 	Mssr		= 0x0A,		/* MASTER-SLAVE Status */
16*5c47fe09SDavid du Colombier 	Mmdctrl		= 0x0D,		/* MMD Access Control */
17*5c47fe09SDavid du Colombier 	Mmddata		= 0x0E,		/* MMD Access Data Register */
18*5c47fe09SDavid du Colombier 	Esr		= 0x0F,		/* Extended Status */
19*5c47fe09SDavid du Colombier 
20*5c47fe09SDavid du Colombier 	NMiiPhyr	= 32,
21*5c47fe09SDavid du Colombier 	NMiiPhy		= 32,
22*5c47fe09SDavid du Colombier };
23*5c47fe09SDavid du Colombier 
24*5c47fe09SDavid du Colombier enum {					/* Bmcr */
25*5c47fe09SDavid du Colombier 	BmcrSs1		= 0x0040,	/* Speed Select[1] */
26*5c47fe09SDavid du Colombier 	BmcrCte		= 0x0080,	/* Collision Test Enable */
27*5c47fe09SDavid du Colombier 	BmcrDm		= 0x0100,	/* Duplex Mode */
28*5c47fe09SDavid du Colombier 	BmcrRan		= 0x0200,	/* Restart Auto-Negotiation */
29*5c47fe09SDavid du Colombier 	BmcrI		= 0x0400,	/* Isolate */
30*5c47fe09SDavid du Colombier 	BmcrPd		= 0x0800,	/* Power Down */
31*5c47fe09SDavid du Colombier 	BmcrAne		= 0x1000,	/* Auto-Negotiation Enable */
32*5c47fe09SDavid du Colombier 	BmcrSs0		= 0x2000,	/* Speed Select[0] */
33*5c47fe09SDavid du Colombier 	BmcrLe		= 0x4000,	/* Loopback Enable */
34*5c47fe09SDavid du Colombier 	BmcrR		= 0x8000,	/* Reset */
35*5c47fe09SDavid du Colombier };
36*5c47fe09SDavid du Colombier 
37*5c47fe09SDavid du Colombier enum {					/* Bmsr */
38*5c47fe09SDavid du Colombier 	BmsrEc		= 0x0001,	/* Extended Capability */
39*5c47fe09SDavid du Colombier 	BmsrJd		= 0x0002,	/* Jabber Detect */
40*5c47fe09SDavid du Colombier 	BmsrLs		= 0x0004,	/* Link Status */
41*5c47fe09SDavid du Colombier 	BmsrAna		= 0x0008,	/* Auto-Negotiation Ability */
42*5c47fe09SDavid du Colombier 	BmsrRf		= 0x0010,	/* Remote Fault */
43*5c47fe09SDavid du Colombier 	BmsrAnc		= 0x0020,	/* Auto-Negotiation Complete */
44*5c47fe09SDavid du Colombier 	BmsrPs		= 0x0040,	/* Preamble Suppression Capable */
45*5c47fe09SDavid du Colombier 	BmsrEs		= 0x0100,	/* Extended Status */
46*5c47fe09SDavid du Colombier 	Bmsr100T2HD	= 0x0200,	/* 100BASE-T2 HD Capable */
47*5c47fe09SDavid du Colombier 	Bmsr100T2FD	= 0x0400,	/* 100BASE-T2 FD Capable */
48*5c47fe09SDavid du Colombier 	Bmsr10THD	= 0x0800,	/* 10BASE-T HD Capable */
49*5c47fe09SDavid du Colombier 	Bmsr10TFD	= 0x1000,	/* 10BASE-T FD Capable */
50*5c47fe09SDavid du Colombier 	Bmsr100TXHD	= 0x2000,	/* 100BASE-TX HD Capable */
51*5c47fe09SDavid du Colombier 	Bmsr100TXFD	= 0x4000,	/* 100BASE-TX FD Capable */
52*5c47fe09SDavid du Colombier 	Bmsr100T4	= 0x8000,	/* 100BASE-T4 Capable */
53*5c47fe09SDavid du Colombier };
54*5c47fe09SDavid du Colombier 
55*5c47fe09SDavid du Colombier enum {					/* Anar/Anlpar */
56*5c47fe09SDavid du Colombier 	Ana10HD		= 0x0020,	/* Advertise 10BASE-T */
57*5c47fe09SDavid du Colombier 	Ana10FD		= 0x0040,	/* Advertise 10BASE-T FD */
58*5c47fe09SDavid du Colombier 	AnaTXHD		= 0x0080,	/* Advertise 100BASE-TX */
59*5c47fe09SDavid du Colombier 	AnaTXFD		= 0x0100,	/* Advertise 100BASE-TX FD */
60*5c47fe09SDavid du Colombier 	AnaT4		= 0x0200,	/* Advertise 100BASE-T4 */
61*5c47fe09SDavid du Colombier 	AnaP		= 0x0400,	/* Pause */
62*5c47fe09SDavid du Colombier 	AnaAP		= 0x0800,	/* Asymmetrical Pause */
63*5c47fe09SDavid du Colombier 	AnaRf		= 0x2000,	/* Remote Fault */
64*5c47fe09SDavid du Colombier 	AnaAck		= 0x4000,	/* Acknowledge */
65*5c47fe09SDavid du Colombier 	AnaNp		= 0x8000,	/* Next Page Indication */
66*5c47fe09SDavid du Colombier };
67*5c47fe09SDavid du Colombier 
68*5c47fe09SDavid du Colombier enum {					/* Mscr */
69*5c47fe09SDavid du Colombier 	Mscr1000THD	= 0x0100,	/* Advertise 1000BASE-T HD */
70*5c47fe09SDavid du Colombier 	Mscr1000TFD	= 0x0200,	/* Advertise 1000BASE-T FD */
71*5c47fe09SDavid du Colombier };
72*5c47fe09SDavid du Colombier 
73*5c47fe09SDavid du Colombier enum {					/* Mssr */
74*5c47fe09SDavid du Colombier 	Mssr1000THD	= 0x0400,	/* Link Partner 1000BASE-T HD able */
75*5c47fe09SDavid du Colombier 	Mssr1000TFD	= 0x0800,	/* Link Partner 1000BASE-T FD able */
76*5c47fe09SDavid du Colombier };
77*5c47fe09SDavid du Colombier 
78*5c47fe09SDavid du Colombier enum {					/* Esr */
79*5c47fe09SDavid du Colombier 	Esr1000THD	= 0x1000,	/* 1000BASE-T HD Capable */
80*5c47fe09SDavid du Colombier 	Esr1000TFD	= 0x2000,	/* 1000BASE-T FD Capable */
81*5c47fe09SDavid du Colombier 	Esr1000XHD	= 0x4000,	/* 1000BASE-X HD Capable */
82*5c47fe09SDavid du Colombier 	Esr1000XFD	= 0x8000,	/* 1000BASE-X FD Capable */
83*5c47fe09SDavid du Colombier };
84*5c47fe09SDavid du Colombier 
85*5c47fe09SDavid du Colombier typedef struct Mii {
86*5c47fe09SDavid du Colombier 	Lock;
87*5c47fe09SDavid du Colombier 	int	nphy;
88*5c47fe09SDavid du Colombier 	int	mask;
89*5c47fe09SDavid du Colombier 	MiiPhy*	phy[NMiiPhy];
90*5c47fe09SDavid du Colombier 	MiiPhy*	curphy;
91*5c47fe09SDavid du Colombier 
92*5c47fe09SDavid du Colombier 	void*	ctlr;
93*5c47fe09SDavid du Colombier 	int	(*mir)(Mii*, int, int);
94*5c47fe09SDavid du Colombier 	int	(*miw)(Mii*, int, int, int);
95*5c47fe09SDavid du Colombier } Mii;
96*5c47fe09SDavid du Colombier 
97*5c47fe09SDavid du Colombier typedef struct MiiPhy {
98*5c47fe09SDavid du Colombier 	Mii*	mii;
99*5c47fe09SDavid du Colombier 	u32int	id;
100*5c47fe09SDavid du Colombier 	int	oui;
101*5c47fe09SDavid du Colombier 	int	phyno;
102*5c47fe09SDavid du Colombier 
103*5c47fe09SDavid du Colombier 	int	anar;
104*5c47fe09SDavid du Colombier 	int	fc;
105*5c47fe09SDavid du Colombier 	int	mscr;
106*5c47fe09SDavid du Colombier 
107*5c47fe09SDavid du Colombier 	int	link;
108*5c47fe09SDavid du Colombier 	int	speed;
109*5c47fe09SDavid du Colombier 	int	fd;
110*5c47fe09SDavid du Colombier 	int	rfc;
111*5c47fe09SDavid du Colombier 	int	tfc;
112*5c47fe09SDavid du Colombier };
113*5c47fe09SDavid du Colombier 
114*5c47fe09SDavid du Colombier extern int mii(Mii*, int);
115*5c47fe09SDavid du Colombier extern int miiane(Mii*, int, int, int);
116*5c47fe09SDavid du Colombier extern int miimir(Mii*, int);
117*5c47fe09SDavid du Colombier extern int miimiw(Mii*, int, int);
118*5c47fe09SDavid du Colombier extern int miireset(Mii*);
119*5c47fe09SDavid du Colombier extern int miistatus(Mii*);
120*5c47fe09SDavid du Colombier 
121*5c47fe09SDavid du Colombier extern int miimmdr(Mii*, int, int);
122*5c47fe09SDavid du Colombier extern int miimmdw(Mii*, int, int, int);
123