|
Lines 148-153
Link Here
|
| 148 |
{ |
148 |
{ |
| 149 |
struct ifmedia_entry *ife = mii->mii_media.ifm_cur; |
149 |
struct ifmedia_entry *ife = mii->mii_media.ifm_cur; |
| 150 |
int reg, speed, gig, anar; |
150 |
int reg, speed, gig, anar; |
|
|
151 |
int bmcr, bmsr; |
| 151 |
|
152 |
|
| 152 |
switch (cmd) { |
153 |
switch (cmd) { |
| 153 |
case MII_POLLSTAT: |
154 |
case MII_POLLSTAT: |
|
Lines 239-249
Link Here
|
| 239 |
*/ |
240 |
*/ |
| 240 |
if ((sc->mii_flags & MIIF_PHYPRIV0) == 0 && |
241 |
if ((sc->mii_flags & MIIF_PHYPRIV0) == 0 && |
| 241 |
sc->mii_mpd_rev >= 2) { |
242 |
sc->mii_mpd_rev >= 2) { |
| 242 |
/* RTL8211B(L) */ |
243 |
bmcr = PHY_READ(sc, RGEPHY_MII_BMCR); |
| 243 |
reg = PHY_READ(sc, RGEPHY_MII_SSR); |
244 |
/* A side effect is to update the link status. */ |
| 244 |
if (reg & RGEPHY_SSR_LINK) { |
245 |
bmsr = PHY_READ(sc, RGEPHY_MII_BMSR); |
| 245 |
sc->mii_ticks = 0; |
246 |
if ((bmcr & RGEPHY_BMCR_AUTOEN) == 0 || |
| 246 |
break; |
247 |
(bmsr & RGEPHY_BMSR_ACOMP) == RGEPHY_BMSR_ACOMP) { |
|
|
248 |
/* The previous read updated the link status. */ |
| 249 |
bmsr = PHY_READ(sc, RGEPHY_MII_BMSR); |
| 250 |
if ((bmsr & RGEPHY_BMSR_LINK) |
| 251 |
== RGEPHY_BMSR_LINK) { |
| 252 |
sc->mii_ticks = 0; |
| 253 |
break; |
| 254 |
} |
| 247 |
} |
255 |
} |
| 248 |
} else { |
256 |
} else { |
| 249 |
reg = PHY_READ(sc, RL_GMEDIASTAT); |
257 |
reg = PHY_READ(sc, RL_GMEDIASTAT); |
|
Lines 287-310
Link Here
|
| 287 |
rgephy_status(struct mii_softc *sc) |
295 |
rgephy_status(struct mii_softc *sc) |
| 288 |
{ |
296 |
{ |
| 289 |
struct mii_data *mii = sc->mii_pdata; |
297 |
struct mii_data *mii = sc->mii_pdata; |
| 290 |
int bmsr, bmcr; |
298 |
int bmcr, bmsr; |
| 291 |
uint16_t ssr; |
299 |
uint16_t ssr; |
| 292 |
|
300 |
|
| 293 |
mii->mii_media_status = IFM_AVALID; |
301 |
mii->mii_media_status = IFM_AVALID; |
| 294 |
mii->mii_media_active = IFM_ETHER; |
302 |
mii->mii_media_active = IFM_ETHER; |
| 295 |
|
303 |
|
| 296 |
if ((sc->mii_flags & MIIF_PHYPRIV0) == 0 && sc->mii_mpd_rev >= 2) { |
|
|
| 297 |
ssr = PHY_READ(sc, RGEPHY_MII_SSR); |
| 298 |
if (ssr & RGEPHY_SSR_LINK) |
| 299 |
mii->mii_media_status |= IFM_ACTIVE; |
| 300 |
} else { |
| 301 |
bmsr = PHY_READ(sc, RL_GMEDIASTAT); |
| 302 |
if (bmsr & RL_GMEDIASTAT_LINK) |
| 303 |
mii->mii_media_status |= IFM_ACTIVE; |
| 304 |
} |
| 305 |
|
| 306 |
bmsr = PHY_READ(sc, RGEPHY_MII_BMSR); |
| 307 |
|
| 308 |
bmcr = PHY_READ(sc, RGEPHY_MII_BMCR); |
304 |
bmcr = PHY_READ(sc, RGEPHY_MII_BMCR); |
| 309 |
if (bmcr & RGEPHY_BMCR_ISO) { |
305 |
if (bmcr & RGEPHY_BMCR_ISO) { |
| 310 |
mii->mii_media_active |= IFM_NONE; |
306 |
mii->mii_media_active |= IFM_NONE; |
|
Lines 315-320
Link Here
|
| 315 |
if (bmcr & RGEPHY_BMCR_LOOP) |
311 |
if (bmcr & RGEPHY_BMCR_LOOP) |
| 316 |
mii->mii_media_active |= IFM_LOOP; |
312 |
mii->mii_media_active |= IFM_LOOP; |
| 317 |
|
313 |
|
|
|
314 |
/* A side effect is to update the link status. */ |
| 315 |
bmsr = PHY_READ(sc, RGEPHY_MII_BMSR); |
| 318 |
if (bmcr & RGEPHY_BMCR_AUTOEN) { |
316 |
if (bmcr & RGEPHY_BMCR_AUTOEN) { |
| 319 |
if ((bmsr & RGEPHY_BMSR_ACOMP) == 0) { |
317 |
if ((bmsr & RGEPHY_BMSR_ACOMP) == 0) { |
| 320 |
/* Erg, still trying, I guess... */ |
318 |
/* Erg, still trying, I guess... */ |
|
Lines 324-348
Link Here
|
| 324 |
} |
322 |
} |
| 325 |
|
323 |
|
| 326 |
if ((sc->mii_flags & MIIF_PHYPRIV0) == 0 && sc->mii_mpd_rev >= 2) { |
324 |
if ((sc->mii_flags & MIIF_PHYPRIV0) == 0 && sc->mii_mpd_rev >= 2) { |
| 327 |
ssr = PHY_READ(sc, RGEPHY_MII_SSR); |
325 |
/* The previous read updated the link status. */ |
| 328 |
switch (ssr & RGEPHY_SSR_SPD_MASK) { |
326 |
bmsr = PHY_READ(sc, RGEPHY_MII_BMSR); |
| 329 |
case RGEPHY_SSR_S1000: |
327 |
if ((bmsr & RGEPHY_BMSR_LINK) == RGEPHY_BMSR_LINK) |
| 330 |
mii->mii_media_active |= IFM_1000_T; |
328 |
mii->mii_media_status |= IFM_ACTIVE; |
| 331 |
break; |
329 |
} else { |
| 332 |
case RGEPHY_SSR_S100: |
330 |
bmsr = PHY_READ(sc, RL_GMEDIASTAT); |
| 333 |
mii->mii_media_active |= IFM_100_TX; |
331 |
if (bmsr & RL_GMEDIASTAT_LINK) |
| 334 |
break; |
332 |
mii->mii_media_status |= IFM_ACTIVE; |
| 335 |
case RGEPHY_SSR_S10: |
333 |
} |
| 336 |
mii->mii_media_active |= IFM_10_T; |
334 |
|
| 337 |
break; |
335 |
if ((sc->mii_flags & MIIF_PHYPRIV0) == 0 && sc->mii_mpd_rev >= 2) { |
| 338 |
default: |
336 |
if (sc->mii_mpd_rev == 6) { |
| 339 |
mii->mii_media_active |= IFM_NONE; |
337 |
/* RTL8211F */ |
| 340 |
break; |
338 |
ssr = PHY_READ(sc, RGEPHY_F_MII_SSR); |
|
|
339 |
switch (ssr & RGEPHY_F_SSR_SPD_MASK) { |
| 340 |
case RGEPHY_F_SSR_S1000: |
| 341 |
mii->mii_media_active |= IFM_1000_T; |
| 342 |
break; |
| 343 |
case RGEPHY_F_SSR_S100: |
| 344 |
mii->mii_media_active |= IFM_100_TX; |
| 345 |
break; |
| 346 |
case RGEPHY_F_SSR_S10: |
| 347 |
mii->mii_media_active |= IFM_10_T; |
| 348 |
break; |
| 349 |
default: |
| 350 |
mii->mii_media_active |= IFM_NONE; |
| 351 |
break; |
| 352 |
} |
| 353 |
if (ssr & RGEPHY_F_SSR_FDX) |
| 354 |
mii->mii_media_active |= IFM_FDX; |
| 355 |
else |
| 356 |
mii->mii_media_active |= IFM_HDX; |
| 357 |
} else { |
| 358 |
ssr = PHY_READ(sc, RGEPHY_MII_SSR); |
| 359 |
switch (ssr & RGEPHY_SSR_SPD_MASK) { |
| 360 |
case RGEPHY_SSR_S1000: |
| 361 |
mii->mii_media_active |= IFM_1000_T; |
| 362 |
break; |
| 363 |
case RGEPHY_SSR_S100: |
| 364 |
mii->mii_media_active |= IFM_100_TX; |
| 365 |
break; |
| 366 |
case RGEPHY_SSR_S10: |
| 367 |
mii->mii_media_active |= IFM_10_T; |
| 368 |
break; |
| 369 |
default: |
| 370 |
mii->mii_media_active |= IFM_NONE; |
| 371 |
break; |
| 372 |
} |
| 373 |
if (ssr & RGEPHY_SSR_FDX) |
| 374 |
mii->mii_media_active |= IFM_FDX; |
| 375 |
else |
| 376 |
mii->mii_media_active |= IFM_HDX; |
| 341 |
} |
377 |
} |
| 342 |
if (ssr & RGEPHY_SSR_FDX) |
|
|
| 343 |
mii->mii_media_active |= IFM_FDX; |
| 344 |
else |
| 345 |
mii->mii_media_active |= IFM_HDX; |
| 346 |
} else { |
378 |
} else { |
| 347 |
bmsr = PHY_READ(sc, RL_GMEDIASTAT); |
379 |
bmsr = PHY_READ(sc, RL_GMEDIASTAT); |
| 348 |
if (bmsr & RL_GMEDIASTAT_1000MBPS) |
380 |
if (bmsr & RL_GMEDIASTAT_1000MBPS) |
|
Lines 491-501
Link Here
|
| 491 |
} |
523 |
} |
| 492 |
|
524 |
|
| 493 |
if (sc->mii_mpd_rev >= 2) { |
525 |
if (sc->mii_mpd_rev >= 2) { |
| 494 |
pcr = PHY_READ(sc, RGEPHY_MII_PCR); |
526 |
if (sc->mii_mpd_rev == 6) { |
| 495 |
if ((pcr & RGEPHY_PCR_MDIX_AUTO) == 0) { |
527 |
/* RTL8211F */ |
| 496 |
pcr &= ~RGEPHY_PCR_MDI_MASK; |
528 |
pcr = PHY_READ(sc, RGEPHY_F_MII_PCR1); |
| 497 |
pcr |= RGEPHY_PCR_MDIX_AUTO; |
529 |
if ((pcr & RGEPHY_F_PCR1_MDI_MM) |
| 498 |
PHY_WRITE(sc, RGEPHY_MII_PCR, pcr); |
530 |
== RGEPHY_F_PCR1_MDI_MM) { |
|
|
531 |
pcr &= ~RGEPHY_F_PCR1_MDI_MM; |
| 532 |
PHY_WRITE(sc, RGEPHY_F_MII_PCR1, pcr); |
| 533 |
} |
| 534 |
} else { |
| 535 |
pcr = PHY_READ(sc, RGEPHY_MII_PCR); |
| 536 |
if ((pcr & RGEPHY_PCR_MDIX_AUTO) == 0) { |
| 537 |
pcr &= ~RGEPHY_PCR_MDI_MASK; |
| 538 |
pcr |= RGEPHY_PCR_MDIX_AUTO; |
| 539 |
PHY_WRITE(sc, RGEPHY_MII_PCR, pcr); |
| 540 |
} |
| 499 |
} |
541 |
} |
| 500 |
} |
542 |
} |
| 501 |
|
543 |
|