Deleted Added
full compact
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 ---