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