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