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