diff options
| author | jdc <jdc@NetBSD.org> | 2008-01-05 20:33:29 +0000 |
|---|---|---|
| committer | jdc <jdc@NetBSD.org> | 2008-01-05 20:33:29 +0000 |
| commit | bb4a0543ee299bbf4dd221c4159c01fe628bc30b (patch) | |
| tree | a6c3a45048351571da095953018b916fc7232385 /sys/dev/mii | |
| parent | 20409ec3a884e1fcad7480a9b27d1fb05759057a (diff) | |
Updates from OpenBSD:
-- r1.15
Add some DSP init code for BCM5221's.
Values derived from Apple's GMAC driver, same init
code also exists in Linux's sungem_phy driver.
tested by miod@ pedro@ and otto@ on a few systems.
-- r1.16
Always explicitly set IFM_HDX for half-duplex.
From brad@
--
Diffstat (limited to 'sys/dev/mii')
| -rw-r--r-- | sys/dev/mii/bmtphy.c | 37 |
1 files changed, 34 insertions, 3 deletions
diff --git a/sys/dev/mii/bmtphy.c b/sys/dev/mii/bmtphy.c index b892f7dc3f9..08c9764d921 100644 --- a/sys/dev/mii/bmtphy.c +++ b/sys/dev/mii/bmtphy.c @@ -1,4 +1,4 @@ -/* $NetBSD: bmtphy.c,v 1.23 2007/12/09 20:28:02 jmcneill Exp $ */ +/* $NetBSD: bmtphy.c,v 1.24 2008/01/05 20:33:29 jdc Exp $ */ /*- * Copyright (c) 1998, 1999, 2000, 2001 The NetBSD Foundation, Inc. @@ -73,7 +73,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: bmtphy.c,v 1.23 2007/12/09 20:28:02 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: bmtphy.c,v 1.24 2008/01/05 20:33:29 jdc Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -99,9 +99,10 @@ CFATTACH_DECL(bmtphy, sizeof(struct mii_softc), static int bmtphy_service(struct mii_softc *, struct mii_data *, int); static void bmtphy_status(struct mii_softc *); +static void bmtphy_reset(struct mii_softc *); static const struct mii_phy_funcs bmtphy_funcs = { - bmtphy_service, bmtphy_status, mii_phy_reset, + bmtphy_service, bmtphy_status, bmtphy_reset, }; static const struct mii_phydesc bmtphys[] = { @@ -148,6 +149,7 @@ bmtphyattach(struct device *parent, struct device *self, void *aux) aprint_naive(": Media interface\n"); aprint_normal(": %s, rev. %d\n", mpd->mpd_name, MII_REV(ma->mii_id2)); + sc->mii_mpd_model = MII_MODEL(ma->mii_id2); sc->mii_inst = mii->mii_instance; sc->mii_phy = ma->mii_phyno; sc->mii_funcs = &bmtphy_funcs; @@ -276,6 +278,35 @@ bmtphy_status(struct mii_softc *sc) mii->mii_media_active |= IFM_10_T; if (aux_csr & AUX_CSR_FDX) mii->mii_media_active |= IFM_FDX; + else + mii->mii_media_active |= IFM_HDX; } else mii->mii_media_active = ife->ifm_media; } + +static void +bmtphy_reset(struct mii_softc *sc) +{ + u_int16_t data; + + mii_phy_reset(sc); + + if (sc->mii_mpd_model == MII_MODEL_xxBROADCOM_BCM5221) { + /* Enable shadow register mode */ + data = PHY_READ(sc, 0x1f); + PHY_WRITE(sc, 0x1f, data | 0x0080); + + /* Enable APD (Auto PowerDetect) */ + data = PHY_READ(sc, MII_BMTPHY_AUX2); + PHY_WRITE(sc, MII_BMTPHY_AUX2, data | 0x0020); + + /* Enable clocks across APD for + * Auto-MDIX functionality */ + data = PHY_READ(sc, MII_BMTPHY_INTR); + PHY_WRITE(sc, MII_BMTPHY_INTR, data | 0x0004); + + /* Disable shadow register mode */ + data = PHY_READ(sc, 0x1f); + PHY_WRITE(sc, 0x1f, data & ~0x0080); + } +} |
