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 --- |