1*d6dfd9efSDavid du Colombier typedef struct Mii Mii; 2*d6dfd9efSDavid du Colombier typedef struct MiiPhy MiiPhy; 3*d6dfd9efSDavid du Colombier 4*d6dfd9efSDavid du Colombier enum { /* registers */ 5*d6dfd9efSDavid du Colombier Bmcr = 0, /* Basic Mode Control */ 6*d6dfd9efSDavid du Colombier Bmsr = 1, /* Basic Mode Status */ 7*d6dfd9efSDavid du Colombier Phyidr1 = 2, /* PHY Identifier #1 */ 8*d6dfd9efSDavid du Colombier Phyidr2 = 3, /* PHY Identifier #2 */ 9*d6dfd9efSDavid du Colombier Anar = 4, /* Auto-Negotiation Advertisement */ 10*d6dfd9efSDavid du Colombier Anlpar = 5, /* AN Link Partner Ability */ 11*d6dfd9efSDavid du Colombier Aner = 6, /* AN Expansion */ 12*d6dfd9efSDavid du Colombier Annptr = 7, /* AN Next Page TX */ 13*d6dfd9efSDavid du Colombier Annprr = 8, /* AN Next Page RX */ 14*d6dfd9efSDavid du Colombier Mscr = 9, /* Gb Control */ 15*d6dfd9efSDavid du Colombier Mssr = 10, /* Gb Status */ 16*d6dfd9efSDavid du Colombier Esr = 15, /* Extended Status */ 17*d6dfd9efSDavid du Colombier 18*d6dfd9efSDavid du Colombier /* 88e1116-specific paged registers */ 19*d6dfd9efSDavid du Colombier Scr = 16, /* special control register */ 20*d6dfd9efSDavid du Colombier Ssr = 17, /* special status register */ 21*d6dfd9efSDavid du Colombier Ier = 18, /* interrupt enable reg */ 22*d6dfd9efSDavid du Colombier Isr = 19, /* interrupt status reg */ 23*d6dfd9efSDavid du Colombier Escr = 20, /* extended special control reg */ 24*d6dfd9efSDavid du Colombier Recr = 21, /* RX error counter reg */ 25*d6dfd9efSDavid du Colombier Eadr = 22, /* extended address reg (page select) */ 26*d6dfd9efSDavid du Colombier Globsts = 23, /* global status */ 27*d6dfd9efSDavid du Colombier Impover = 24, /* RGMII output impedance override (page 2) */ 28*d6dfd9efSDavid du Colombier Imptarg = 25, /* RGMII output impedance target (page 2) */ 29*d6dfd9efSDavid du Colombier Scr2 = 26, /* special control register 2 */ 30*d6dfd9efSDavid du Colombier 31*d6dfd9efSDavid du Colombier NMiiPhyr = 32, 32*d6dfd9efSDavid du Colombier NMiiPhy = 32, 33*d6dfd9efSDavid du Colombier }; 34*d6dfd9efSDavid du Colombier 35*d6dfd9efSDavid du Colombier enum { /* Bmcr */ 36*d6dfd9efSDavid du Colombier BmcrSs1 = 0x0040, /* Speed Select[1] */ 37*d6dfd9efSDavid du Colombier BmcrCte = 0x0080, /* Collision Test Enable */ 38*d6dfd9efSDavid du Colombier BmcrDm = 0x0100, /* Duplex Mode */ 39*d6dfd9efSDavid du Colombier BmcrRan = 0x0200, /* Restart Auto-Negotiation */ 40*d6dfd9efSDavid du Colombier BmcrI = 0x0400, /* Isolate */ 41*d6dfd9efSDavid du Colombier BmcrPd = 0x0800, /* Power Down */ 42*d6dfd9efSDavid du Colombier BmcrAne = 0x1000, /* Auto-Negotiation Enable */ 43*d6dfd9efSDavid du Colombier BmcrSs0 = 0x2000, /* Speed Select[0] */ 44*d6dfd9efSDavid du Colombier BmcrLe = 0x4000, /* Loopback Enable */ 45*d6dfd9efSDavid du Colombier BmcrR = 0x8000, /* Reset */ 46*d6dfd9efSDavid du Colombier }; 47*d6dfd9efSDavid du Colombier 48*d6dfd9efSDavid du Colombier enum { /* Bmsr */ 49*d6dfd9efSDavid du Colombier BmsrEc = 0x0001, /* Extended Capability */ 50*d6dfd9efSDavid du Colombier BmsrJd = 0x0002, /* Jabber Detect */ 51*d6dfd9efSDavid du Colombier BmsrLs = 0x0004, /* Link Status */ 52*d6dfd9efSDavid du Colombier BmsrAna = 0x0008, /* Auto-Negotiation Ability */ 53*d6dfd9efSDavid du Colombier BmsrRf = 0x0010, /* Remote Fault */ 54*d6dfd9efSDavid du Colombier BmsrAnc = 0x0020, /* Auto-Negotiation Complete */ 55*d6dfd9efSDavid du Colombier BmsrPs = 0x0040, /* Preamble Suppression Capable */ 56*d6dfd9efSDavid du Colombier BmsrEs = 0x0100, /* Extended Status */ 57*d6dfd9efSDavid du Colombier Bmsr100T2HD = 0x0200, /* 100BASE-T2 HD Capable */ 58*d6dfd9efSDavid du Colombier Bmsr100T2FD = 0x0400, /* 100BASE-T2 FD Capable */ 59*d6dfd9efSDavid du Colombier Bmsr10THD = 0x0800, /* 10BASE-T HD Capable */ 60*d6dfd9efSDavid du Colombier Bmsr10TFD = 0x1000, /* 10BASE-T FD Capable */ 61*d6dfd9efSDavid du Colombier Bmsr100TXHD = 0x2000, /* 100BASE-TX HD Capable */ 62*d6dfd9efSDavid du Colombier Bmsr100TXFD = 0x4000, /* 100BASE-TX FD Capable */ 63*d6dfd9efSDavid du Colombier Bmsr100T4 = 0x8000, /* 100BASE-T4 Capable */ 64*d6dfd9efSDavid du Colombier }; 65*d6dfd9efSDavid du Colombier 66*d6dfd9efSDavid du Colombier enum { /* Anar/Anlpar */ 67*d6dfd9efSDavid du Colombier Ana10HD = 0x0020, /* Advertise 10BASE-T */ 68*d6dfd9efSDavid du Colombier Ana10FD = 0x0040, /* Advertise 10BASE-T FD */ 69*d6dfd9efSDavid du Colombier AnaTXHD = 0x0080, /* Advertise 100BASE-TX */ 70*d6dfd9efSDavid du Colombier AnaTXFD = 0x0100, /* Advertise 100BASE-TX FD */ 71*d6dfd9efSDavid du Colombier AnaT4 = 0x0200, /* Advertise 100BASE-T4 */ 72*d6dfd9efSDavid du Colombier AnaP = 0x0400, /* Pause */ 73*d6dfd9efSDavid du Colombier AnaAP = 0x0800, /* Asymmetrical Pause */ 74*d6dfd9efSDavid du Colombier AnaRf = 0x2000, /* Remote Fault */ 75*d6dfd9efSDavid du Colombier AnaAck = 0x4000, /* Acknowledge */ 76*d6dfd9efSDavid du Colombier AnaNp = 0x8000, /* Next Page Indication */ 77*d6dfd9efSDavid du Colombier }; 78*d6dfd9efSDavid du Colombier 79*d6dfd9efSDavid du Colombier enum { /* Mscr */ 80*d6dfd9efSDavid du Colombier Mscr1000THD = 0x0100, /* Advertise 1000BASE-T HD */ 81*d6dfd9efSDavid du Colombier Mscr1000TFD = 0x0200, /* Advertise 1000BASE-T FD */ 82*d6dfd9efSDavid du Colombier }; 83*d6dfd9efSDavid du Colombier 84*d6dfd9efSDavid du Colombier enum { /* Mssr */ 85*d6dfd9efSDavid du Colombier Mssr1000THD = 0x0400, /* Link Partner 1000BASE-T HD able */ 86*d6dfd9efSDavid du Colombier Mssr1000TFD = 0x0800, /* Link Partner 1000BASE-T FD able */ 87*d6dfd9efSDavid du Colombier }; 88*d6dfd9efSDavid du Colombier 89*d6dfd9efSDavid du Colombier enum { /* Esr */ 90*d6dfd9efSDavid du Colombier Esr1000THD = 0x1000, /* 1000BASE-T HD Capable */ 91*d6dfd9efSDavid du Colombier Esr1000TFD = 0x2000, /* 1000BASE-T FD Capable */ 92*d6dfd9efSDavid du Colombier Esr1000XHD = 0x4000, /* 1000BASE-X HD Capable */ 93*d6dfd9efSDavid du Colombier Esr1000XFD = 0x8000, /* 1000BASE-X FD Capable */ 94*d6dfd9efSDavid du Colombier }; 95*d6dfd9efSDavid du Colombier 96*d6dfd9efSDavid du Colombier enum { /* Scr page 0 */ 97*d6dfd9efSDavid du Colombier Pwrdown = 0x0004, /* power down */ 98*d6dfd9efSDavid du Colombier Mdix = 0x0060, /* MDI crossover mode */ 99*d6dfd9efSDavid du Colombier Endetect = 0x0300, /* energy detect */ 100*d6dfd9efSDavid du Colombier }; 101*d6dfd9efSDavid du Colombier enum { /* Scr page 2 */ 102*d6dfd9efSDavid du Colombier Rgmiipwrup = 0x0008, /* RGMII power up: must sw reset after */ 103*d6dfd9efSDavid du Colombier }; 104*d6dfd9efSDavid du Colombier 105*d6dfd9efSDavid du Colombier enum { /* Recr page 2 */ 106*d6dfd9efSDavid du Colombier Txtiming = 1<<4, 107*d6dfd9efSDavid du Colombier Rxtiming = 1<<5, 108*d6dfd9efSDavid du Colombier }; 109*d6dfd9efSDavid du Colombier 110*d6dfd9efSDavid du Colombier typedef struct Mii { 111*d6dfd9efSDavid du Colombier Lock; 112*d6dfd9efSDavid du Colombier int nphy; 113*d6dfd9efSDavid du Colombier int mask; 114*d6dfd9efSDavid du Colombier MiiPhy* phy[NMiiPhy]; 115*d6dfd9efSDavid du Colombier MiiPhy* curphy; 116*d6dfd9efSDavid du Colombier 117*d6dfd9efSDavid du Colombier void* ctlr; 118*d6dfd9efSDavid du Colombier int (*mir)(Mii*, int, int); 119*d6dfd9efSDavid du Colombier int (*miw)(Mii*, int, int, int); 120*d6dfd9efSDavid du Colombier } Mii; 121*d6dfd9efSDavid du Colombier 122*d6dfd9efSDavid du Colombier typedef struct MiiPhy { 123*d6dfd9efSDavid du Colombier Mii* mii; 124*d6dfd9efSDavid du Colombier int oui; 125*d6dfd9efSDavid du Colombier int phyno; 126*d6dfd9efSDavid du Colombier 127*d6dfd9efSDavid du Colombier int anar; 128*d6dfd9efSDavid du Colombier int fc; 129*d6dfd9efSDavid du Colombier int mscr; 130*d6dfd9efSDavid du Colombier 131*d6dfd9efSDavid du Colombier int link; 132*d6dfd9efSDavid du Colombier int speed; 133*d6dfd9efSDavid du Colombier int fd; 134*d6dfd9efSDavid du Colombier int rfc; 135*d6dfd9efSDavid du Colombier int tfc; 136*d6dfd9efSDavid du Colombier }; 137*d6dfd9efSDavid du Colombier 138*d6dfd9efSDavid du Colombier extern int mii(Mii*, int); 139*d6dfd9efSDavid du Colombier extern int miiane(Mii*, int, int, int); 140*d6dfd9efSDavid du Colombier extern int miimir(Mii*, int); 141*d6dfd9efSDavid du Colombier extern int miimiw(Mii*, int, int); 142*d6dfd9efSDavid du Colombier extern int miireset(Mii*); 143*d6dfd9efSDavid du Colombier extern int miistatus(Mii*); 144