2 #include "../port/lib.h"
7 #include "../port/error.h"
8 #include "../port/netif.h"
14 mii(Mii* mii, int mask)
17 int bit, oui, phyno, r, rmask;
20 * Probe through mii for PHYs in mask;
21 * return the mask of those found in the current probe.
22 * If the PHY has not already been probed, update
23 * the Mii information.
26 for(phyno = 0; phyno < NMiiPhy; phyno++){
34 if(mii->mir(mii, phyno, Bmsr) == -1)
36 r = mii->mir(mii, phyno, Phyidr1);
37 oui = (r & 0x3FFF)<<6;
38 r = mii->mir(mii, phyno, Phyidr2);
40 if(oui == 0xFFFFF || oui == 0)
43 if((miiphy = malloc(sizeof(MiiPhy))) == nil)
48 miiphy->phyno = phyno;
54 mii->phy[phyno] = miiphy;
55 if(mii->curphy == nil)
66 miimir(Mii* mii, int r)
68 if(mii == nil || mii->ctlr == nil || mii->curphy == nil)
70 return mii->mir(mii, mii->curphy->phyno, r);
74 miimiw(Mii* mii, int r, int data)
76 if(mii == nil || mii->ctlr == nil || mii->curphy == nil)
78 return mii->miw(mii, mii->curphy->phyno, r, data);
86 if(mii == nil || mii->ctlr == nil || mii->curphy == nil)
88 bmcr = mii->mir(mii, mii->curphy->phyno, Bmcr);
90 mii->miw(mii, mii->curphy->phyno, Bmcr, bmcr);
97 miiane(Mii* mii, int a, int p, int e)
99 int anar, bmsr, mscr, r, phyno;
101 if(mii == nil || mii->ctlr == nil || mii->curphy == nil)
103 phyno = mii->curphy->phyno;
105 bmsr = mii->mir(mii, phyno, Bmsr);
106 if(!(bmsr & BmsrAna))
110 anar = (AnaTXFD|AnaTXHD|Ana10FD|Ana10HD) & a;
111 else if(mii->curphy->anar != ~0)
112 anar = mii->curphy->anar;
114 anar = mii->mir(mii, phyno, Anar);
115 anar &= ~(AnaAP|AnaP|AnaT4|AnaTXFD|AnaTXHD|Ana10FD|Ana10HD);
120 if(bmsr & Bmsr100TXHD)
122 if(bmsr & Bmsr100TXFD)
125 mii->curphy->anar = anar;
128 anar |= (AnaAP|AnaP) & p;
129 else if(mii->curphy->fc != ~0)
130 anar |= mii->curphy->fc;
131 mii->curphy->fc = (AnaAP|AnaP) & anar;
134 mscr = mii->mir(mii, phyno, Mscr);
135 mscr &= ~(Mscr1000TFD|Mscr1000THD);
137 mscr |= (Mscr1000TFD|Mscr1000THD) & e;
138 else if(mii->curphy->mscr != ~0)
139 mscr = mii->curphy->mscr;
141 r = mii->mir(mii, phyno, Esr);
147 mii->curphy->mscr = mscr;
148 mii->miw(mii, phyno, Mscr, mscr);
150 mii->miw(mii, phyno, Anar, anar);
152 r = mii->mir(mii, phyno, Bmcr);
154 r |= BmcrAne|BmcrRan;
155 mii->miw(mii, phyno, Bmcr, r);
165 int anlpar, bmsr, p, r, phyno;
167 if(mii == nil || mii->ctlr == nil || mii->curphy == nil)
173 * Check Auto-Negotiation is complete and link is up.
174 * (Read status twice as the Ls bit is sticky).
176 bmsr = mii->mir(mii, phyno, Bmsr);
177 if(!(bmsr & (BmsrAnc|BmsrAna))) {
178 // print("miistatus: auto-neg incomplete\n");
182 bmsr = mii->mir(mii, phyno, Bmsr);
183 if(!(bmsr & BmsrLs)){
184 // print("miistatus: link down\n");
189 phy->speed = phy->fd = phy->rfc = phy->tfc = 0;
191 r = mii->mir(mii, phyno, Mssr);
192 if((phy->mscr & Mscr1000TFD) && (r & Mssr1000TFD)){
196 else if((phy->mscr & Mscr1000THD) && (r & Mssr1000THD))
200 anlpar = mii->mir(mii, phyno, Anlpar);
202 r = phy->anar & anlpar;
209 else if(r & Ana10FD){
216 if(phy->speed == 0) {
217 // print("miistatus: phy speed 0\n");
223 r = anlpar & (AnaAP|AnaP);
224 if(p == AnaAP && r == (AnaAP|AnaP))
226 else if(p == (AnaAP|AnaP) && r == AnaAP)
228 else if((p & AnaP) && (r & AnaP))
229 phy->rfc = phy->tfc = 1;