jmphy.c (215298) | jmphy.c (216551) |
---|---|
1/*- 2 * Copyright (c) 2008, Pyun YongHyeon <yongari@FreeBSD.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 12 unchanged lines hidden (view full) --- 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 */ 27 28#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 2008, Pyun YongHyeon <yongari@FreeBSD.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 12 unchanged lines hidden (view full) --- 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 */ 27 28#include <sys/cdefs.h> |
29__FBSDID("$FreeBSD: head/sys/dev/mii/jmphy.c 215298 2010-11-14 13:31:01Z marius $"); | 29__FBSDID("$FreeBSD: head/sys/dev/mii/jmphy.c 216551 2010-12-18 23:52:50Z yongari $"); |
30 31/* 32 * Driver for the JMicron JMP211 10/100/1000, JMP202 10/100 PHY. 33 */ 34 35#include <sys/param.h> 36#include <sys/systm.h> 37#include <sys/kernel.h> --- 61 unchanged lines hidden (view full) --- 99 100static int 101jmphy_attach(device_t dev) 102{ 103 struct jmphy_softc *jsc; 104 struct mii_softc *sc; 105 struct mii_attach_args *ma; 106 struct mii_data *mii; | 30 31/* 32 * Driver for the JMicron JMP211 10/100/1000, JMP202 10/100 PHY. 33 */ 34 35#include <sys/param.h> 36#include <sys/systm.h> 37#include <sys/kernel.h> --- 61 unchanged lines hidden (view full) --- 99 100static int 101jmphy_attach(device_t dev) 102{ 103 struct jmphy_softc *jsc; 104 struct mii_softc *sc; 105 struct mii_attach_args *ma; 106 struct mii_data *mii; |
107 struct ifnet *ifp; |
|
107 108 jsc = device_get_softc(dev); 109 sc = &jsc->mii_sc; 110 ma = device_get_ivars(dev); 111 sc->mii_dev = device_get_parent(dev); 112 mii = ma->mii_data; 113 LIST_INSERT_HEAD(&mii->mii_phys, sc, mii_list); 114 115 sc->mii_flags = miibus_get_flags(dev); 116 sc->mii_inst = mii->mii_instance++; 117 sc->mii_phy = ma->mii_phyno; 118 sc->mii_service = jmphy_service; 119 sc->mii_pdata = mii; 120 | 108 109 jsc = device_get_softc(dev); 110 sc = &jsc->mii_sc; 111 ma = device_get_ivars(dev); 112 sc->mii_dev = device_get_parent(dev); 113 mii = ma->mii_data; 114 LIST_INSERT_HEAD(&mii->mii_phys, sc, mii_list); 115 116 sc->mii_flags = miibus_get_flags(dev); 117 sc->mii_inst = mii->mii_instance++; 118 sc->mii_phy = ma->mii_phyno; 119 sc->mii_service = jmphy_service; 120 sc->mii_pdata = mii; 121 |
122 ifp = sc->mii_pdata->mii_ifp; 123 if (strcmp(ifp->if_dname, "jme") == 0 && 124 (sc->mii_flags & MIIF_MACPRIV0) != 0) 125 sc->mii_flags |= MIIF_PHYPRIV0; |
|
121 jsc->mii_oui = MII_OUI(ma->mii_id1, ma->mii_id2); 122 jsc->mii_model = MII_MODEL(ma->mii_id2); 123 jsc->mii_rev = MII_REV(ma->mii_id2); 124 if (bootverbose) 125 device_printf(dev, "OUI 0x%06x, model 0x%04x, rev. %d\n", 126 jsc->mii_oui, jsc->mii_model, jsc->mii_rev); 127 128 jmphy_reset(sc); --- 131 unchanged lines hidden (view full) --- 260 mii->mii_media_active |= IFM_ETH_MASTER; 261 } 262} 263 264static void 265jmphy_reset(struct mii_softc *sc) 266{ 267 struct jmphy_softc *jsc; | 126 jsc->mii_oui = MII_OUI(ma->mii_id1, ma->mii_id2); 127 jsc->mii_model = MII_MODEL(ma->mii_id2); 128 jsc->mii_rev = MII_REV(ma->mii_id2); 129 if (bootverbose) 130 device_printf(dev, "OUI 0x%06x, model 0x%04x, rev. %d\n", 131 jsc->mii_oui, jsc->mii_model, jsc->mii_rev); 132 133 jmphy_reset(sc); --- 131 unchanged lines hidden (view full) --- 265 mii->mii_media_active |= IFM_ETH_MASTER; 266 } 267} 268 269static void 270jmphy_reset(struct mii_softc *sc) 271{ 272 struct jmphy_softc *jsc; |
273 uint16_t t2cr, val; |
|
268 int i; 269 270 jsc = (struct jmphy_softc *)sc; 271 272 /* Disable sleep mode. */ 273 PHY_WRITE(sc, JMPHY_TMCTL, 274 PHY_READ(sc, JMPHY_TMCTL) & ~JMPHY_TMCTL_SLEEP_ENB); 275 PHY_WRITE(sc, MII_BMCR, BMCR_RESET | BMCR_AUTOEN); 276 277 for (i = 0; i < 1000; i++) { 278 DELAY(1); 279 if ((PHY_READ(sc, MII_BMCR) & BMCR_RESET) == 0) 280 break; 281 } | 274 int i; 275 276 jsc = (struct jmphy_softc *)sc; 277 278 /* Disable sleep mode. */ 279 PHY_WRITE(sc, JMPHY_TMCTL, 280 PHY_READ(sc, JMPHY_TMCTL) & ~JMPHY_TMCTL_SLEEP_ENB); 281 PHY_WRITE(sc, MII_BMCR, BMCR_RESET | BMCR_AUTOEN); 282 283 for (i = 0; i < 1000; i++) { 284 DELAY(1); 285 if ((PHY_READ(sc, MII_BMCR) & BMCR_RESET) == 0) 286 break; 287 } |
288 /* Perform vendor recommended PHY calibration. */ 289 if ((sc->mii_flags & MIIF_PHYPRIV0) != 0) { 290 /* Select PHY test mode 1. */ 291 t2cr = PHY_READ(sc, MII_100T2CR); 292 t2cr &= ~GTCR_TEST_MASK; 293 t2cr |= 0x2000; 294 PHY_WRITE(sc, MII_100T2CR, t2cr); 295 /* Apply calibration patch. */ 296 PHY_WRITE(sc, JMPHY_SPEC_ADDR, JMPHY_SPEC_ADDR_READ | 297 JMPHY_EXT_COMM_2); 298 val = PHY_READ(sc, JMPHY_SPEC_DATA); 299 val &= ~0x0002; 300 val |= 0x0010 | 0x0001; 301 PHY_WRITE(sc, JMPHY_SPEC_DATA, val); 302 PHY_WRITE(sc, JMPHY_SPEC_ADDR, JMPHY_SPEC_ADDR_WRITE | 303 JMPHY_EXT_COMM_2); 304 305 /* XXX 20ms to complete recalibration. */ 306 DELAY(20 * 1000); 307 308 PHY_READ(sc, MII_100T2CR); 309 PHY_WRITE(sc, JMPHY_SPEC_ADDR, JMPHY_SPEC_ADDR_READ | 310 JMPHY_EXT_COMM_2); 311 val = PHY_READ(sc, JMPHY_SPEC_DATA); 312 val &= ~(0x0001 | 0x0002 | 0x0010); 313 PHY_WRITE(sc, JMPHY_SPEC_DATA, val); 314 PHY_WRITE(sc, JMPHY_SPEC_ADDR, JMPHY_SPEC_ADDR_WRITE | 315 JMPHY_EXT_COMM_2); 316 /* Disable PHY test mode. */ 317 PHY_READ(sc, MII_100T2CR); 318 t2cr &= ~GTCR_TEST_MASK; 319 PHY_WRITE(sc, MII_100T2CR, t2cr); 320 } |
|
282} 283 284static uint16_t 285jmphy_anar(struct ifmedia_entry *ife) 286{ 287 uint16_t anar; 288 289 anar = 0; --- 66 unchanged lines hidden --- | 321} 322 323static uint16_t 324jmphy_anar(struct ifmedia_entry *ife) 325{ 326 uint16_t anar; 327 328 anar = 0; --- 66 unchanged lines hidden --- |