Deleted Added
full compact
if_cas.c (210334) if_cas.c (213893)
1/*-
2 * Copyright (C) 2001 Eduardo Horvath.
3 * Copyright (c) 2001-2003 Thomas Moestl
4 * Copyright (c) 2007-2009 Marius Strobl <marius@FreeBSD.org>
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions

--- 16 unchanged lines hidden (view full) ---

25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 *
28 * from: NetBSD: gem.c,v 1.21 2002/06/01 23:50:58 lukem Exp
29 * from: FreeBSD: if_gem.c 182060 2008-08-23 15:03:26Z marius
30 */
31
32#include <sys/cdefs.h>
1/*-
2 * Copyright (C) 2001 Eduardo Horvath.
3 * Copyright (c) 2001-2003 Thomas Moestl
4 * Copyright (c) 2007-2009 Marius Strobl <marius@FreeBSD.org>
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions

--- 16 unchanged lines hidden (view full) ---

25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 *
28 * from: NetBSD: gem.c,v 1.21 2002/06/01 23:50:58 lukem Exp
29 * from: FreeBSD: if_gem.c 182060 2008-08-23 15:03:26Z marius
30 */
31
32#include <sys/cdefs.h>
33__FBSDID("$FreeBSD: head/sys/dev/cas/if_cas.c 210334 2010-07-21 10:05:07Z attilio $");
33__FBSDID("$FreeBSD: head/sys/dev/cas/if_cas.c 213893 2010-10-15 14:52:11Z marius $");
34
35/*
36 * driver for Sun Cassini/Cassini+ and National Semiconductor DP83065
37 * Saturn Gigabit Ethernet controllers
38 */
39
40#if 0
41#define CAS_DEBUG

--- 297 unchanged lines hidden (view full) ---

339 BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
340 /* Enable/unfreeze the GMII pins of Saturn. */
341 if (sc->sc_variant == CAS_SATURN) {
342 CAS_WRITE_4(sc, CAS_SATURN_PCFG, 0);
343 CAS_BARRIER(sc, CAS_SATURN_PCFG, 4,
344 BUS_SPACE_BARRIER_READ |
345 BUS_SPACE_BARRIER_WRITE);
346 }
34
35/*
36 * driver for Sun Cassini/Cassini+ and National Semiconductor DP83065
37 * Saturn Gigabit Ethernet controllers
38 */
39
40#if 0
41#define CAS_DEBUG

--- 297 unchanged lines hidden (view full) ---

339 BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
340 /* Enable/unfreeze the GMII pins of Saturn. */
341 if (sc->sc_variant == CAS_SATURN) {
342 CAS_WRITE_4(sc, CAS_SATURN_PCFG, 0);
343 CAS_BARRIER(sc, CAS_SATURN_PCFG, 4,
344 BUS_SPACE_BARRIER_READ |
345 BUS_SPACE_BARRIER_WRITE);
346 }
347 switch (sc->sc_variant) {
348 default:
349 sc->sc_phyad = -1;
350 break;
351 }
352 error = mii_phy_probe(sc->sc_dev, &sc->sc_miibus,
353 cas_mediachange, cas_mediastatus);
347 error = mii_attach(sc->sc_dev, &sc->sc_miibus, ifp,
348 cas_mediachange, cas_mediastatus, BMSR_DEFCAPMASK,
349 MII_PHY_ANY, MII_OFFSET_ANY, 0);
354 }
355 /*
356 * Fall back on an internal PHY if no external PHY was found.
357 */
358 if (error != 0 && (v & CAS_MIF_CONF_MDI0) != 0) {
359 v &= ~CAS_MIF_CONF_PHY_SELECT;
360 CAS_WRITE_4(sc, CAS_MIF_CONF, v);
361 CAS_BARRIER(sc, CAS_MIF_CONF, 4,
362 BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
363 /* Freeze the GMII pins of Saturn for saving power. */
364 if (sc->sc_variant == CAS_SATURN) {
365 CAS_WRITE_4(sc, CAS_SATURN_PCFG,
366 CAS_SATURN_PCFG_FSI);
367 CAS_BARRIER(sc, CAS_SATURN_PCFG, 4,
368 BUS_SPACE_BARRIER_READ |
369 BUS_SPACE_BARRIER_WRITE);
370 }
350 }
351 /*
352 * Fall back on an internal PHY if no external PHY was found.
353 */
354 if (error != 0 && (v & CAS_MIF_CONF_MDI0) != 0) {
355 v &= ~CAS_MIF_CONF_PHY_SELECT;
356 CAS_WRITE_4(sc, CAS_MIF_CONF, v);
357 CAS_BARRIER(sc, CAS_MIF_CONF, 4,
358 BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
359 /* Freeze the GMII pins of Saturn for saving power. */
360 if (sc->sc_variant == CAS_SATURN) {
361 CAS_WRITE_4(sc, CAS_SATURN_PCFG,
362 CAS_SATURN_PCFG_FSI);
363 CAS_BARRIER(sc, CAS_SATURN_PCFG, 4,
364 BUS_SPACE_BARRIER_READ |
365 BUS_SPACE_BARRIER_WRITE);
366 }
371 switch (sc->sc_variant) {
372 default:
373 sc->sc_phyad = -1;
374 break;
375 }
376 error = mii_phy_probe(sc->sc_dev, &sc->sc_miibus,
377 cas_mediachange, cas_mediastatus);
367 error = mii_attach(sc->sc_dev, &sc->sc_miibus, ifp,
368 cas_mediachange, cas_mediastatus, BMSR_DEFCAPMASK,
369 MII_PHY_ANY, MII_OFFSET_ANY, 0);
378 }
379 } else {
380 /*
381 * Use the external PCS SERDES.
382 */
383 CAS_WRITE_4(sc, CAS_PCS_DATAPATH, CAS_PCS_DATAPATH_SERDES);
384 CAS_BARRIER(sc, CAS_PCS_DATAPATH, 4, BUS_SPACE_BARRIER_WRITE);
385 /* Enable/unfreeze the SERDES pins of Saturn. */
386 if (sc->sc_variant == CAS_SATURN) {
387 CAS_WRITE_4(sc, CAS_SATURN_PCFG, 0);
388 CAS_BARRIER(sc, CAS_SATURN_PCFG, 4,
389 BUS_SPACE_BARRIER_WRITE);
390 }
391 CAS_WRITE_4(sc, CAS_PCS_SERDES_CTRL, CAS_PCS_SERDES_CTRL_ESD);
392 CAS_BARRIER(sc, CAS_PCS_SERDES_CTRL, 4,
393 BUS_SPACE_BARRIER_WRITE);
394 CAS_WRITE_4(sc, CAS_PCS_CONF, CAS_PCS_CONF_EN);
395 CAS_BARRIER(sc, CAS_PCS_CONF, 4,
396 BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
370 }
371 } else {
372 /*
373 * Use the external PCS SERDES.
374 */
375 CAS_WRITE_4(sc, CAS_PCS_DATAPATH, CAS_PCS_DATAPATH_SERDES);
376 CAS_BARRIER(sc, CAS_PCS_DATAPATH, 4, BUS_SPACE_BARRIER_WRITE);
377 /* Enable/unfreeze the SERDES pins of Saturn. */
378 if (sc->sc_variant == CAS_SATURN) {
379 CAS_WRITE_4(sc, CAS_SATURN_PCFG, 0);
380 CAS_BARRIER(sc, CAS_SATURN_PCFG, 4,
381 BUS_SPACE_BARRIER_WRITE);
382 }
383 CAS_WRITE_4(sc, CAS_PCS_SERDES_CTRL, CAS_PCS_SERDES_CTRL_ESD);
384 CAS_BARRIER(sc, CAS_PCS_SERDES_CTRL, 4,
385 BUS_SPACE_BARRIER_WRITE);
386 CAS_WRITE_4(sc, CAS_PCS_CONF, CAS_PCS_CONF_EN);
387 CAS_BARRIER(sc, CAS_PCS_CONF, 4,
388 BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
397 sc->sc_phyad = CAS_PHYAD_EXTERNAL;
398 error = mii_phy_probe(sc->sc_dev, &sc->sc_miibus,
399 cas_mediachange, cas_mediastatus);
389 error = mii_attach(sc->sc_dev, &sc->sc_miibus, ifp,
390 cas_mediachange, cas_mediastatus, BMSR_DEFCAPMASK,
391 CAS_PHYAD_EXTERNAL, MII_OFFSET_ANY, 0);
400 }
401 if (error != 0) {
392 }
393 if (error != 0) {
402 device_printf(sc->sc_dev, "PHY probe failed: %d\n", error);
394 device_printf(sc->sc_dev, "attaching PHYs failed\n");
403 goto fail_rxmap;
404 }
405 sc->sc_mii = device_get_softc(sc->sc_miibus);
406
407 /*
408 * From this point forward, the attachment cannot fail. A failure
409 * before this point releases all resources that may have been
410 * allocated.

--- 1756 unchanged lines hidden (view full) ---

2167 int n;
2168 uint32_t v;
2169
2170#ifdef CAS_DEBUG_PHY
2171 printf("%s: phy %d reg %d\n", __func__, phy, reg);
2172#endif
2173
2174 sc = device_get_softc(dev);
395 goto fail_rxmap;
396 }
397 sc->sc_mii = device_get_softc(sc->sc_miibus);
398
399 /*
400 * From this point forward, the attachment cannot fail. A failure
401 * before this point releases all resources that may have been
402 * allocated.

--- 1756 unchanged lines hidden (view full) ---

2159 int n;
2160 uint32_t v;
2161
2162#ifdef CAS_DEBUG_PHY
2163 printf("%s: phy %d reg %d\n", __func__, phy, reg);
2164#endif
2165
2166 sc = device_get_softc(dev);
2175 if (sc->sc_phyad != -1 && phy != sc->sc_phyad)
2176 return (0);
2177
2178 if ((sc->sc_flags & CAS_SERDES) != 0) {
2179 switch (reg) {
2180 case MII_BMCR:
2181 reg = CAS_PCS_CTRL;
2182 break;
2183 case MII_BMSR:
2184 reg = CAS_PCS_STATUS;
2185 break;

--- 42 unchanged lines hidden (view full) ---

2228 int n;
2229 uint32_t v;
2230
2231#ifdef CAS_DEBUG_PHY
2232 printf("%s: phy %d reg %d val %x\n", phy, reg, val, __func__);
2233#endif
2234
2235 sc = device_get_softc(dev);
2167 if ((sc->sc_flags & CAS_SERDES) != 0) {
2168 switch (reg) {
2169 case MII_BMCR:
2170 reg = CAS_PCS_CTRL;
2171 break;
2172 case MII_BMSR:
2173 reg = CAS_PCS_STATUS;
2174 break;

--- 42 unchanged lines hidden (view full) ---

2217 int n;
2218 uint32_t v;
2219
2220#ifdef CAS_DEBUG_PHY
2221 printf("%s: phy %d reg %d val %x\n", phy, reg, val, __func__);
2222#endif
2223
2224 sc = device_get_softc(dev);
2236 if (sc->sc_phyad != -1 && phy != sc->sc_phyad)
2237 return (0);
2238
2239 if ((sc->sc_flags & CAS_SERDES) != 0) {
2240 switch (reg) {
2241 case MII_BMSR:
2242 reg = CAS_PCS_STATUS;
2243 break;
2244 case MII_BMCR:
2245 reg = CAS_PCS_CTRL;
2246 if ((val & CAS_PCS_CTRL_RESET) == 0)

--- 66 unchanged lines hidden (view full) ---

2313
2314 sc = device_get_softc(dev);
2315 ifp = sc->sc_ifp;
2316
2317 CAS_LOCK_ASSERT(sc, MA_OWNED);
2318
2319#ifdef CAS_DEBUG
2320 if ((ifp->if_flags & IFF_DEBUG) != 0)
2225 if ((sc->sc_flags & CAS_SERDES) != 0) {
2226 switch (reg) {
2227 case MII_BMSR:
2228 reg = CAS_PCS_STATUS;
2229 break;
2230 case MII_BMCR:
2231 reg = CAS_PCS_CTRL;
2232 if ((val & CAS_PCS_CTRL_RESET) == 0)

--- 66 unchanged lines hidden (view full) ---

2299
2300 sc = device_get_softc(dev);
2301 ifp = sc->sc_ifp;
2302
2303 CAS_LOCK_ASSERT(sc, MA_OWNED);
2304
2305#ifdef CAS_DEBUG
2306 if ((ifp->if_flags & IFF_DEBUG) != 0)
2321 device_printf(sc->sc_dev, "%s: status change: PHY = %d\n",
2322 __func__, sc->sc_phyad);
2307 device_printf(sc->sc_dev, "%s: status changen", __func__);
2323#endif
2324
2325 if ((sc->sc_mii->mii_media_status & IFM_ACTIVE) != 0 &&
2326 IFM_SUBTYPE(sc->sc_mii->mii_media_active) != IFM_NONE)
2327 sc->sc_flags |= CAS_LINK;
2328 else
2329 sc->sc_flags &= ~CAS_LINK;
2330

--- 624 unchanged lines hidden ---
2308#endif
2309
2310 if ((sc->sc_mii->mii_media_status & IFM_ACTIVE) != 0 &&
2311 IFM_SUBTYPE(sc->sc_mii->mii_media_active) != IFM_NONE)
2312 sc->sc_flags |= CAS_LINK;
2313 else
2314 sc->sc_flags &= ~CAS_LINK;
2315

--- 624 unchanged lines hidden ---