1019aa153SDavid du Colombier typedef struct Mii Mii; 2019aa153SDavid du Colombier typedef struct MiiPhy MiiPhy; 3019aa153SDavid du Colombier 4019aa153SDavid du Colombier enum { /* registers */ 5019aa153SDavid du Colombier Bmcr = 0x00, /* Basic Mode Control */ 6019aa153SDavid du Colombier Bmsr = 0x01, /* Basic Mode Status */ 7019aa153SDavid du Colombier Phyidr1 = 0x02, /* PHY Identifier #1 */ 8019aa153SDavid du Colombier Phyidr2 = 0x03, /* PHY Identifier #2 */ 9019aa153SDavid du Colombier Anar = 0x04, /* Auto-Negotiation Advertisement */ 10019aa153SDavid du Colombier Anlpar = 0x05, /* AN Link Partner Ability */ 11019aa153SDavid du Colombier Aner = 0x06, /* AN Expansion */ 12019aa153SDavid du Colombier Annptr = 0x07, /* AN Next Page TX */ 13019aa153SDavid du Colombier Annprr = 0x08, /* AN Next Page RX */ 14019aa153SDavid du Colombier Mscr = 0x09, /* MASTER-SLAVE Control */ 15019aa153SDavid du Colombier Mssr = 0x0A, /* MASTER-SLAVE Status */ 16019aa153SDavid du Colombier Esr = 0x0F, /* Extended Status */ 17019aa153SDavid du Colombier 18019aa153SDavid du Colombier NMiiPhyr = 32, 19019aa153SDavid du Colombier NMiiPhy = 32, 20019aa153SDavid du Colombier }; 21019aa153SDavid du Colombier 22019aa153SDavid du Colombier enum { /* Bmcr */ 23019aa153SDavid du Colombier BmcrSs1 = 0x0040, /* Speed Select[1] */ 24019aa153SDavid du Colombier BmcrCte = 0x0080, /* Collision Test Enable */ 25019aa153SDavid du Colombier BmcrDm = 0x0100, /* Duplex Mode */ 26019aa153SDavid du Colombier BmcrRan = 0x0200, /* Restart Auto-Negotiation */ 27019aa153SDavid du Colombier BmcrI = 0x0400, /* Isolate */ 28019aa153SDavid du Colombier BmcrPd = 0x0800, /* Power Down */ 29019aa153SDavid du Colombier BmcrAne = 0x1000, /* Auto-Negotiation Enable */ 30019aa153SDavid du Colombier BmcrSs0 = 0x2000, /* Speed Select[0] */ 31019aa153SDavid du Colombier BmcrLe = 0x4000, /* Loopback Enable */ 32019aa153SDavid du Colombier BmcrR = 0x8000, /* Reset */ 33019aa153SDavid du Colombier }; 34019aa153SDavid du Colombier 35019aa153SDavid du Colombier enum { /* Bmsr */ 36019aa153SDavid du Colombier BmsrEc = 0x0001, /* Extended Capability */ 37019aa153SDavid du Colombier BmsrJd = 0x0002, /* Jabber Detect */ 38019aa153SDavid du Colombier BmsrLs = 0x0004, /* Link Status */ 39019aa153SDavid du Colombier BmsrAna = 0x0008, /* Auto-Negotiation Ability */ 40019aa153SDavid du Colombier BmsrRf = 0x0010, /* Remote Fault */ 41019aa153SDavid du Colombier BmsrAnc = 0x0020, /* Auto-Negotiation Complete */ 42019aa153SDavid du Colombier BmsrPs = 0x0040, /* Preamble Suppression Capable */ 43019aa153SDavid du Colombier BmsrEs = 0x0100, /* Extended Status */ 44019aa153SDavid du Colombier Bmsr100T2HD = 0x0200, /* 100BASE-T2 HD Capable */ 45019aa153SDavid du Colombier Bmsr100T2FD = 0x0400, /* 100BASE-T2 FD Capable */ 46*eb752b91SDavid du Colombier Bmsr10THD = 0x0800, /* 10BASE-T HD Capable */ 47019aa153SDavid du Colombier Bmsr10TFD = 0x1000, /* 10BASE-T FD Capable */ 48019aa153SDavid du Colombier Bmsr100TXHD = 0x2000, /* 100BASE-TX HD Capable */ 49019aa153SDavid du Colombier Bmsr100TXFD = 0x4000, /* 100BASE-TX FD Capable */ 50019aa153SDavid du Colombier Bmsr100T4 = 0x8000, /* 100BASE-T4 Capable */ 51019aa153SDavid du Colombier }; 52019aa153SDavid du Colombier 53019aa153SDavid du Colombier enum { /* Anar/Anlpar */ 54019aa153SDavid du Colombier Ana10HD = 0x0020, /* Advertise 10BASE-T */ 55019aa153SDavid du Colombier Ana10FD = 0x0040, /* Advertise 10BASE-T FD */ 56019aa153SDavid du Colombier AnaTXHD = 0x0080, /* Advertise 100BASE-TX */ 57019aa153SDavid du Colombier AnaTXFD = 0x0100, /* Advertise 100BASE-TX FD */ 58019aa153SDavid du Colombier AnaT4 = 0x0200, /* Advertise 100BASE-T4 */ 59019aa153SDavid du Colombier AnaP = 0x0400, /* Pause */ 60019aa153SDavid du Colombier AnaAP = 0x0800, /* Asymmetrical Pause */ 61019aa153SDavid du Colombier AnaRf = 0x2000, /* Remote Fault */ 62019aa153SDavid du Colombier AnaAck = 0x4000, /* Acknowledge */ 63019aa153SDavid du Colombier AnaNp = 0x8000, /* Next Page Indication */ 64019aa153SDavid du Colombier }; 65019aa153SDavid du Colombier 66019aa153SDavid du Colombier enum { /* Mscr */ 67019aa153SDavid du Colombier Mscr1000THD = 0x0100, /* Advertise 1000BASE-T HD */ 68019aa153SDavid du Colombier Mscr1000TFD = 0x0200, /* Advertise 1000BASE-T FD */ 69019aa153SDavid du Colombier }; 70019aa153SDavid du Colombier 71019aa153SDavid du Colombier enum { /* Mssr */ 72019aa153SDavid du Colombier Mssr1000THD = 0x0400, /* Link Partner 1000BASE-T HD able */ 73019aa153SDavid du Colombier Mssr1000TFD = 0x0800, /* Link Partner 1000BASE-T FD able */ 74019aa153SDavid du Colombier }; 75019aa153SDavid du Colombier 76019aa153SDavid du Colombier enum { /* Esr */ 77019aa153SDavid du Colombier Esr1000THD = 0x1000, /* 1000BASE-T HD Capable */ 78019aa153SDavid du Colombier Esr1000TFD = 0x2000, /* 1000BASE-T FD Capable */ 79019aa153SDavid du Colombier Esr1000XHD = 0x4000, /* 1000BASE-X HD Capable */ 80019aa153SDavid du Colombier Esr1000XFD = 0x8000, /* 1000BASE-X FD Capable */ 81019aa153SDavid du Colombier }; 82019aa153SDavid du Colombier 83019aa153SDavid du Colombier typedef struct Mii { 84019aa153SDavid du Colombier Lock; 85019aa153SDavid du Colombier int nphy; 86019aa153SDavid du Colombier int mask; 87019aa153SDavid du Colombier MiiPhy* phy[NMiiPhy]; 88019aa153SDavid du Colombier MiiPhy* curphy; 89019aa153SDavid du Colombier 90019aa153SDavid du Colombier void* ctlr; 91019aa153SDavid du Colombier int (*mir)(Mii*, int, int); 92019aa153SDavid du Colombier int (*miw)(Mii*, int, int, int); 93019aa153SDavid du Colombier } Mii; 94019aa153SDavid du Colombier 95019aa153SDavid du Colombier typedef struct MiiPhy { 96019aa153SDavid du Colombier Mii* mii; 97019aa153SDavid du Colombier int oui; 98019aa153SDavid du Colombier int phyno; 99019aa153SDavid du Colombier 100019aa153SDavid du Colombier int anar; 101019aa153SDavid du Colombier int fc; 102019aa153SDavid du Colombier int mscr; 103019aa153SDavid du Colombier 104019aa153SDavid du Colombier int link; 105019aa153SDavid du Colombier int speed; 106019aa153SDavid du Colombier int fd; 107019aa153SDavid du Colombier int rfc; 108019aa153SDavid du Colombier int tfc; 109019aa153SDavid du Colombier }; 110019aa153SDavid du Colombier 111019aa153SDavid du Colombier extern int mii(Mii*, int); 112019aa153SDavid du Colombier extern int miiane(Mii*, int, int, int); 113019aa153SDavid du Colombier extern int miimir(Mii*, int); 114019aa153SDavid du Colombier extern int miimiw(Mii*, int, int); 115019aa153SDavid du Colombier extern int miireset(Mii*); 116019aa153SDavid du Colombier extern int miistatus(Mii*); 117