xref: /plan9/sys/src/9/kw/ethermii.h (revision 5e27dea93c37a6944933876218b2bfb60ef34178)
1154abd99SDavid du Colombier typedef struct Mii Mii;
2154abd99SDavid du Colombier typedef struct MiiPhy MiiPhy;
3154abd99SDavid du Colombier 
4154abd99SDavid du Colombier enum {					/* registers */
5*5e27dea9SDavid du Colombier 	Bmcr		= 0,		/* Basic Mode Control */
6*5e27dea9SDavid du Colombier 	Bmsr		= 1,		/* Basic Mode Status */
7*5e27dea9SDavid du Colombier 	Phyidr1		= 2,		/* PHY Identifier #1 */
8*5e27dea9SDavid du Colombier 	Phyidr2		= 3,		/* PHY Identifier #2 */
9*5e27dea9SDavid du Colombier 	Anar		= 4,		/* Auto-Negotiation Advertisement */
10*5e27dea9SDavid du Colombier 	Anlpar		= 5,		/* AN Link Partner Ability */
11*5e27dea9SDavid du Colombier 	Aner		= 6,		/* AN Expansion */
12*5e27dea9SDavid du Colombier 	Annptr		= 7,		/* AN Next Page TX */
13*5e27dea9SDavid du Colombier 	Annprr		= 8,		/* AN Next Page RX */
14*5e27dea9SDavid du Colombier 	Mscr		= 9,		/* Gb Control */
15*5e27dea9SDavid du Colombier 	Mssr		= 10,		/* Gb Status */
16*5e27dea9SDavid du Colombier 	Esr		= 15,		/* Extended Status */
17*5e27dea9SDavid du Colombier 
18*5e27dea9SDavid du Colombier 	/* 88e1116-specific paged registers */
19*5e27dea9SDavid du Colombier 	Scr		= 16,		/* special control register */
20*5e27dea9SDavid du Colombier 	Ssr		= 17,		/* special status register */
21*5e27dea9SDavid du Colombier 	Ier		= 18,		/* interrupt enable reg */
22*5e27dea9SDavid du Colombier 	Isr		= 19,		/* interrupt status reg */
23*5e27dea9SDavid du Colombier 	Escr		= 20,		/* extended special control reg */
24*5e27dea9SDavid du Colombier 	Recr		= 21,		/* RX error counter reg */
25*5e27dea9SDavid du Colombier 	Eadr		= 22,		/* extended address reg (page select) */
26*5e27dea9SDavid du Colombier 	Globsts		= 23,		/* global status */
27*5e27dea9SDavid du Colombier 	Impover		= 24,	/* RGMII output impedance override (page 2) */
28*5e27dea9SDavid du Colombier 	Imptarg		= 25,	/* RGMII output impedance target (page 2) */
29*5e27dea9SDavid du Colombier 	Scr2		= 26,		/* special control register 2 */
30154abd99SDavid du Colombier 
31154abd99SDavid du Colombier 	NMiiPhyr	= 32,
32154abd99SDavid du Colombier 	NMiiPhy		= 32,
33154abd99SDavid du Colombier };
34154abd99SDavid du Colombier 
35154abd99SDavid du Colombier enum {					/* Bmcr */
36154abd99SDavid du Colombier 	BmcrSs1		= 0x0040,	/* Speed Select[1] */
37154abd99SDavid du Colombier 	BmcrCte		= 0x0080,	/* Collision Test Enable */
38154abd99SDavid du Colombier 	BmcrDm		= 0x0100,	/* Duplex Mode */
39154abd99SDavid du Colombier 	BmcrRan		= 0x0200,	/* Restart Auto-Negotiation */
40154abd99SDavid du Colombier 	BmcrI		= 0x0400,	/* Isolate */
41154abd99SDavid du Colombier 	BmcrPd		= 0x0800,	/* Power Down */
42154abd99SDavid du Colombier 	BmcrAne		= 0x1000,	/* Auto-Negotiation Enable */
43154abd99SDavid du Colombier 	BmcrSs0		= 0x2000,	/* Speed Select[0] */
44154abd99SDavid du Colombier 	BmcrLe		= 0x4000,	/* Loopback Enable */
45154abd99SDavid du Colombier 	BmcrR		= 0x8000,	/* Reset */
46154abd99SDavid du Colombier };
47154abd99SDavid du Colombier 
48154abd99SDavid du Colombier enum {					/* Bmsr */
49154abd99SDavid du Colombier 	BmsrEc		= 0x0001,	/* Extended Capability */
50154abd99SDavid du Colombier 	BmsrJd		= 0x0002,	/* Jabber Detect */
51154abd99SDavid du Colombier 	BmsrLs		= 0x0004,	/* Link Status */
52154abd99SDavid du Colombier 	BmsrAna		= 0x0008,	/* Auto-Negotiation Ability */
53154abd99SDavid du Colombier 	BmsrRf		= 0x0010,	/* Remote Fault */
54154abd99SDavid du Colombier 	BmsrAnc		= 0x0020,	/* Auto-Negotiation Complete */
55154abd99SDavid du Colombier 	BmsrPs		= 0x0040,	/* Preamble Suppression Capable */
56154abd99SDavid du Colombier 	BmsrEs		= 0x0100,	/* Extended Status */
57154abd99SDavid du Colombier 	Bmsr100T2HD	= 0x0200,	/* 100BASE-T2 HD Capable */
58154abd99SDavid du Colombier 	Bmsr100T2FD	= 0x0400,	/* 100BASE-T2 FD Capable */
59154abd99SDavid du Colombier 	Bmsr10THD	= 0x0800,	/* 10BASE-T HD Capable */
60154abd99SDavid du Colombier 	Bmsr10TFD	= 0x1000,	/* 10BASE-T FD Capable */
61154abd99SDavid du Colombier 	Bmsr100TXHD	= 0x2000,	/* 100BASE-TX HD Capable */
62154abd99SDavid du Colombier 	Bmsr100TXFD	= 0x4000,	/* 100BASE-TX FD Capable */
63154abd99SDavid du Colombier 	Bmsr100T4	= 0x8000,	/* 100BASE-T4 Capable */
64154abd99SDavid du Colombier };
65154abd99SDavid du Colombier 
66154abd99SDavid du Colombier enum {					/* Anar/Anlpar */
67154abd99SDavid du Colombier 	Ana10HD		= 0x0020,	/* Advertise 10BASE-T */
68154abd99SDavid du Colombier 	Ana10FD		= 0x0040,	/* Advertise 10BASE-T FD */
69154abd99SDavid du Colombier 	AnaTXHD		= 0x0080,	/* Advertise 100BASE-TX */
70154abd99SDavid du Colombier 	AnaTXFD		= 0x0100,	/* Advertise 100BASE-TX FD */
71154abd99SDavid du Colombier 	AnaT4		= 0x0200,	/* Advertise 100BASE-T4 */
72154abd99SDavid du Colombier 	AnaP		= 0x0400,	/* Pause */
73154abd99SDavid du Colombier 	AnaAP		= 0x0800,	/* Asymmetrical Pause */
74154abd99SDavid du Colombier 	AnaRf		= 0x2000,	/* Remote Fault */
75154abd99SDavid du Colombier 	AnaAck		= 0x4000,	/* Acknowledge */
76154abd99SDavid du Colombier 	AnaNp		= 0x8000,	/* Next Page Indication */
77154abd99SDavid du Colombier };
78154abd99SDavid du Colombier 
79154abd99SDavid du Colombier enum {					/* Mscr */
80154abd99SDavid du Colombier 	Mscr1000THD	= 0x0100,	/* Advertise 1000BASE-T HD */
81154abd99SDavid du Colombier 	Mscr1000TFD	= 0x0200,	/* Advertise 1000BASE-T FD */
82154abd99SDavid du Colombier };
83154abd99SDavid du Colombier 
84154abd99SDavid du Colombier enum {					/* Mssr */
85154abd99SDavid du Colombier 	Mssr1000THD	= 0x0400,	/* Link Partner 1000BASE-T HD able */
86154abd99SDavid du Colombier 	Mssr1000TFD	= 0x0800,	/* Link Partner 1000BASE-T FD able */
87154abd99SDavid du Colombier };
88154abd99SDavid du Colombier 
89154abd99SDavid du Colombier enum {					/* Esr */
90154abd99SDavid du Colombier 	Esr1000THD	= 0x1000,	/* 1000BASE-T HD Capable */
91154abd99SDavid du Colombier 	Esr1000TFD	= 0x2000,	/* 1000BASE-T FD Capable */
92154abd99SDavid du Colombier 	Esr1000XHD	= 0x4000,	/* 1000BASE-X HD Capable */
93154abd99SDavid du Colombier 	Esr1000XFD	= 0x8000,	/* 1000BASE-X FD Capable */
94154abd99SDavid du Colombier };
95154abd99SDavid du Colombier 
96*5e27dea9SDavid du Colombier enum {					/* Scr page 0 */
97*5e27dea9SDavid du Colombier 	Pwrdown		= 0x0004,	/* power down */
98*5e27dea9SDavid du Colombier 	Mdix		= 0x0060,	/* MDI crossover mode */
99*5e27dea9SDavid du Colombier 	Endetect	= 0x0300,	/* energy detect */
100*5e27dea9SDavid du Colombier };
101*5e27dea9SDavid du Colombier enum {					/* Scr page 2 */
102*5e27dea9SDavid du Colombier 	Rgmiipwrup	= 0x0008,	/* RGMII power up: must sw reset after */
103*5e27dea9SDavid du Colombier };
104*5e27dea9SDavid du Colombier 
105*5e27dea9SDavid du Colombier enum {					/* Recr page 2 */
106*5e27dea9SDavid du Colombier 	Txtiming	= 1<<4,
107*5e27dea9SDavid du Colombier 	Rxtiming	= 1<<5,
108*5e27dea9SDavid du Colombier };
109*5e27dea9SDavid du Colombier 
110154abd99SDavid du Colombier typedef struct Mii {
111154abd99SDavid du Colombier 	Lock;
112154abd99SDavid du Colombier 	int	nphy;
113154abd99SDavid du Colombier 	int	mask;
114154abd99SDavid du Colombier 	MiiPhy*	phy[NMiiPhy];
115154abd99SDavid du Colombier 	MiiPhy*	curphy;
116154abd99SDavid du Colombier 
117154abd99SDavid du Colombier 	void*	ctlr;
118154abd99SDavid du Colombier 	int	(*mir)(Mii*, int, int);
119154abd99SDavid du Colombier 	int	(*miw)(Mii*, int, int, int);
120154abd99SDavid du Colombier } Mii;
121154abd99SDavid du Colombier 
122154abd99SDavid du Colombier typedef struct MiiPhy {
123154abd99SDavid du Colombier 	Mii*	mii;
124154abd99SDavid du Colombier 	int	oui;
125154abd99SDavid du Colombier 	int	phyno;
126154abd99SDavid du Colombier 
127154abd99SDavid du Colombier 	int	anar;
128154abd99SDavid du Colombier 	int	fc;
129154abd99SDavid du Colombier 	int	mscr;
130154abd99SDavid du Colombier 
131154abd99SDavid du Colombier 	int	link;
132154abd99SDavid du Colombier 	int	speed;
133154abd99SDavid du Colombier 	int	fd;
134154abd99SDavid du Colombier 	int	rfc;
135154abd99SDavid du Colombier 	int	tfc;
136154abd99SDavid du Colombier };
137154abd99SDavid du Colombier 
138154abd99SDavid du Colombier extern int mii(Mii*, int);
139154abd99SDavid du Colombier extern int miiane(Mii*, int, int, int);
140154abd99SDavid du Colombier extern int miimir(Mii*, int);
141154abd99SDavid du Colombier extern int miimiw(Mii*, int, int);
142154abd99SDavid du Colombier extern int miireset(Mii*);
143154abd99SDavid du Colombier extern int miistatus(Mii*);
144