xref: /plan9-contrib/sys/src/9/vt4/ethermii.h (revision d6dfd9ef91cf0fa8514a249d5f2a550978c19369)
1*d6dfd9efSDavid du Colombier typedef struct Mii Mii;
2*d6dfd9efSDavid du Colombier typedef struct MiiPhy MiiPhy;
3*d6dfd9efSDavid du Colombier 
4*d6dfd9efSDavid du Colombier enum {					/* registers */
5*d6dfd9efSDavid du Colombier 	Bmcr		= 0,		/* Basic Mode Control */
6*d6dfd9efSDavid du Colombier 	Bmsr		= 1,		/* Basic Mode Status */
7*d6dfd9efSDavid du Colombier 	Phyidr1		= 2,		/* PHY Identifier #1 */
8*d6dfd9efSDavid du Colombier 	Phyidr2		= 3,		/* PHY Identifier #2 */
9*d6dfd9efSDavid du Colombier 	Anar		= 4,		/* Auto-Negotiation Advertisement */
10*d6dfd9efSDavid du Colombier 	Anlpar		= 5,		/* AN Link Partner Ability */
11*d6dfd9efSDavid du Colombier 	Aner		= 6,		/* AN Expansion */
12*d6dfd9efSDavid du Colombier 	Annptr		= 7,		/* AN Next Page TX */
13*d6dfd9efSDavid du Colombier 	Annprr		= 8,		/* AN Next Page RX */
14*d6dfd9efSDavid du Colombier 	Mscr		= 9,		/* Gb Control */
15*d6dfd9efSDavid du Colombier 	Mssr		= 10,		/* Gb Status */
16*d6dfd9efSDavid du Colombier 	Esr		= 15,		/* Extended Status */
17*d6dfd9efSDavid du Colombier 
18*d6dfd9efSDavid du Colombier 	/* 88e1116-specific paged registers */
19*d6dfd9efSDavid du Colombier 	Scr		= 16,		/* special control register */
20*d6dfd9efSDavid du Colombier 	Ssr		= 17,		/* special status register */
21*d6dfd9efSDavid du Colombier 	Ier		= 18,		/* interrupt enable reg */
22*d6dfd9efSDavid du Colombier 	Isr		= 19,		/* interrupt status reg */
23*d6dfd9efSDavid du Colombier 	Escr		= 20,		/* extended special control reg */
24*d6dfd9efSDavid du Colombier 	Recr		= 21,		/* RX error counter reg */
25*d6dfd9efSDavid du Colombier 	Eadr		= 22,		/* extended address reg (page select) */
26*d6dfd9efSDavid du Colombier 	Globsts		= 23,		/* global status */
27*d6dfd9efSDavid du Colombier 	Impover		= 24,	/* RGMII output impedance override (page 2) */
28*d6dfd9efSDavid du Colombier 	Imptarg		= 25,	/* RGMII output impedance target (page 2) */
29*d6dfd9efSDavid du Colombier 	Scr2		= 26,		/* special control register 2 */
30*d6dfd9efSDavid du Colombier 
31*d6dfd9efSDavid du Colombier 	NMiiPhyr	= 32,
32*d6dfd9efSDavid du Colombier 	NMiiPhy		= 32,
33*d6dfd9efSDavid du Colombier };
34*d6dfd9efSDavid du Colombier 
35*d6dfd9efSDavid du Colombier enum {					/* Bmcr */
36*d6dfd9efSDavid du Colombier 	BmcrSs1		= 0x0040,	/* Speed Select[1] */
37*d6dfd9efSDavid du Colombier 	BmcrCte		= 0x0080,	/* Collision Test Enable */
38*d6dfd9efSDavid du Colombier 	BmcrDm		= 0x0100,	/* Duplex Mode */
39*d6dfd9efSDavid du Colombier 	BmcrRan		= 0x0200,	/* Restart Auto-Negotiation */
40*d6dfd9efSDavid du Colombier 	BmcrI		= 0x0400,	/* Isolate */
41*d6dfd9efSDavid du Colombier 	BmcrPd		= 0x0800,	/* Power Down */
42*d6dfd9efSDavid du Colombier 	BmcrAne		= 0x1000,	/* Auto-Negotiation Enable */
43*d6dfd9efSDavid du Colombier 	BmcrSs0		= 0x2000,	/* Speed Select[0] */
44*d6dfd9efSDavid du Colombier 	BmcrLe		= 0x4000,	/* Loopback Enable */
45*d6dfd9efSDavid du Colombier 	BmcrR		= 0x8000,	/* Reset */
46*d6dfd9efSDavid du Colombier };
47*d6dfd9efSDavid du Colombier 
48*d6dfd9efSDavid du Colombier enum {					/* Bmsr */
49*d6dfd9efSDavid du Colombier 	BmsrEc		= 0x0001,	/* Extended Capability */
50*d6dfd9efSDavid du Colombier 	BmsrJd		= 0x0002,	/* Jabber Detect */
51*d6dfd9efSDavid du Colombier 	BmsrLs		= 0x0004,	/* Link Status */
52*d6dfd9efSDavid du Colombier 	BmsrAna		= 0x0008,	/* Auto-Negotiation Ability */
53*d6dfd9efSDavid du Colombier 	BmsrRf		= 0x0010,	/* Remote Fault */
54*d6dfd9efSDavid du Colombier 	BmsrAnc		= 0x0020,	/* Auto-Negotiation Complete */
55*d6dfd9efSDavid du Colombier 	BmsrPs		= 0x0040,	/* Preamble Suppression Capable */
56*d6dfd9efSDavid du Colombier 	BmsrEs		= 0x0100,	/* Extended Status */
57*d6dfd9efSDavid du Colombier 	Bmsr100T2HD	= 0x0200,	/* 100BASE-T2 HD Capable */
58*d6dfd9efSDavid du Colombier 	Bmsr100T2FD	= 0x0400,	/* 100BASE-T2 FD Capable */
59*d6dfd9efSDavid du Colombier 	Bmsr10THD	= 0x0800,	/* 10BASE-T HD Capable */
60*d6dfd9efSDavid du Colombier 	Bmsr10TFD	= 0x1000,	/* 10BASE-T FD Capable */
61*d6dfd9efSDavid du Colombier 	Bmsr100TXHD	= 0x2000,	/* 100BASE-TX HD Capable */
62*d6dfd9efSDavid du Colombier 	Bmsr100TXFD	= 0x4000,	/* 100BASE-TX FD Capable */
63*d6dfd9efSDavid du Colombier 	Bmsr100T4	= 0x8000,	/* 100BASE-T4 Capable */
64*d6dfd9efSDavid du Colombier };
65*d6dfd9efSDavid du Colombier 
66*d6dfd9efSDavid du Colombier enum {					/* Anar/Anlpar */
67*d6dfd9efSDavid du Colombier 	Ana10HD		= 0x0020,	/* Advertise 10BASE-T */
68*d6dfd9efSDavid du Colombier 	Ana10FD		= 0x0040,	/* Advertise 10BASE-T FD */
69*d6dfd9efSDavid du Colombier 	AnaTXHD		= 0x0080,	/* Advertise 100BASE-TX */
70*d6dfd9efSDavid du Colombier 	AnaTXFD		= 0x0100,	/* Advertise 100BASE-TX FD */
71*d6dfd9efSDavid du Colombier 	AnaT4		= 0x0200,	/* Advertise 100BASE-T4 */
72*d6dfd9efSDavid du Colombier 	AnaP		= 0x0400,	/* Pause */
73*d6dfd9efSDavid du Colombier 	AnaAP		= 0x0800,	/* Asymmetrical Pause */
74*d6dfd9efSDavid du Colombier 	AnaRf		= 0x2000,	/* Remote Fault */
75*d6dfd9efSDavid du Colombier 	AnaAck		= 0x4000,	/* Acknowledge */
76*d6dfd9efSDavid du Colombier 	AnaNp		= 0x8000,	/* Next Page Indication */
77*d6dfd9efSDavid du Colombier };
78*d6dfd9efSDavid du Colombier 
79*d6dfd9efSDavid du Colombier enum {					/* Mscr */
80*d6dfd9efSDavid du Colombier 	Mscr1000THD	= 0x0100,	/* Advertise 1000BASE-T HD */
81*d6dfd9efSDavid du Colombier 	Mscr1000TFD	= 0x0200,	/* Advertise 1000BASE-T FD */
82*d6dfd9efSDavid du Colombier };
83*d6dfd9efSDavid du Colombier 
84*d6dfd9efSDavid du Colombier enum {					/* Mssr */
85*d6dfd9efSDavid du Colombier 	Mssr1000THD	= 0x0400,	/* Link Partner 1000BASE-T HD able */
86*d6dfd9efSDavid du Colombier 	Mssr1000TFD	= 0x0800,	/* Link Partner 1000BASE-T FD able */
87*d6dfd9efSDavid du Colombier };
88*d6dfd9efSDavid du Colombier 
89*d6dfd9efSDavid du Colombier enum {					/* Esr */
90*d6dfd9efSDavid du Colombier 	Esr1000THD	= 0x1000,	/* 1000BASE-T HD Capable */
91*d6dfd9efSDavid du Colombier 	Esr1000TFD	= 0x2000,	/* 1000BASE-T FD Capable */
92*d6dfd9efSDavid du Colombier 	Esr1000XHD	= 0x4000,	/* 1000BASE-X HD Capable */
93*d6dfd9efSDavid du Colombier 	Esr1000XFD	= 0x8000,	/* 1000BASE-X FD Capable */
94*d6dfd9efSDavid du Colombier };
95*d6dfd9efSDavid du Colombier 
96*d6dfd9efSDavid du Colombier enum {					/* Scr page 0 */
97*d6dfd9efSDavid du Colombier 	Pwrdown		= 0x0004,	/* power down */
98*d6dfd9efSDavid du Colombier 	Mdix		= 0x0060,	/* MDI crossover mode */
99*d6dfd9efSDavid du Colombier 	Endetect	= 0x0300,	/* energy detect */
100*d6dfd9efSDavid du Colombier };
101*d6dfd9efSDavid du Colombier enum {					/* Scr page 2 */
102*d6dfd9efSDavid du Colombier 	Rgmiipwrup	= 0x0008,	/* RGMII power up: must sw reset after */
103*d6dfd9efSDavid du Colombier };
104*d6dfd9efSDavid du Colombier 
105*d6dfd9efSDavid du Colombier enum {					/* Recr page 2 */
106*d6dfd9efSDavid du Colombier 	Txtiming	= 1<<4,
107*d6dfd9efSDavid du Colombier 	Rxtiming	= 1<<5,
108*d6dfd9efSDavid du Colombier };
109*d6dfd9efSDavid du Colombier 
110*d6dfd9efSDavid du Colombier typedef struct Mii {
111*d6dfd9efSDavid du Colombier 	Lock;
112*d6dfd9efSDavid du Colombier 	int	nphy;
113*d6dfd9efSDavid du Colombier 	int	mask;
114*d6dfd9efSDavid du Colombier 	MiiPhy*	phy[NMiiPhy];
115*d6dfd9efSDavid du Colombier 	MiiPhy*	curphy;
116*d6dfd9efSDavid du Colombier 
117*d6dfd9efSDavid du Colombier 	void*	ctlr;
118*d6dfd9efSDavid du Colombier 	int	(*mir)(Mii*, int, int);
119*d6dfd9efSDavid du Colombier 	int	(*miw)(Mii*, int, int, int);
120*d6dfd9efSDavid du Colombier } Mii;
121*d6dfd9efSDavid du Colombier 
122*d6dfd9efSDavid du Colombier typedef struct MiiPhy {
123*d6dfd9efSDavid du Colombier 	Mii*	mii;
124*d6dfd9efSDavid du Colombier 	int	oui;
125*d6dfd9efSDavid du Colombier 	int	phyno;
126*d6dfd9efSDavid du Colombier 
127*d6dfd9efSDavid du Colombier 	int	anar;
128*d6dfd9efSDavid du Colombier 	int	fc;
129*d6dfd9efSDavid du Colombier 	int	mscr;
130*d6dfd9efSDavid du Colombier 
131*d6dfd9efSDavid du Colombier 	int	link;
132*d6dfd9efSDavid du Colombier 	int	speed;
133*d6dfd9efSDavid du Colombier 	int	fd;
134*d6dfd9efSDavid du Colombier 	int	rfc;
135*d6dfd9efSDavid du Colombier 	int	tfc;
136*d6dfd9efSDavid du Colombier };
137*d6dfd9efSDavid du Colombier 
138*d6dfd9efSDavid du Colombier extern int mii(Mii*, int);
139*d6dfd9efSDavid du Colombier extern int miiane(Mii*, int, int, int);
140*d6dfd9efSDavid du Colombier extern int miimir(Mii*, int);
141*d6dfd9efSDavid du Colombier extern int miimiw(Mii*, int, int);
142*d6dfd9efSDavid du Colombier extern int miireset(Mii*);
143*d6dfd9efSDavid du Colombier extern int miistatus(Mii*);
144