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