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