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