1/*- 2 * Copyright (c) 2004 3 * Bill Paul <wpaul@windriver.com>. 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 --- 17 unchanged lines hidden (view full) --- 26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 30 * THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33#include <sys/cdefs.h> |
34__FBSDID("$FreeBSD: head/sys/dev/mii/ciphy.c 221407 2011-05-03 19:51:29Z marius $"); |
35 36/* 37 * Driver for the Cicada/Vitesse CS/VSC8xxx 10/100/1000 copper PHY. 38 */ 39 40#include <sys/param.h> 41#include <sys/systm.h> 42#include <sys/kernel.h> --- 38 unchanged lines hidden (view full) --- 81DRIVER_MODULE(ciphy, miibus, ciphy_driver, ciphy_devclass, 0, 0); 82 83static int ciphy_service(struct mii_softc *, struct mii_data *, int); 84static void ciphy_status(struct mii_softc *); 85static void ciphy_reset(struct mii_softc *); 86static void ciphy_fixup(struct mii_softc *); 87 88static const struct mii_phydesc ciphys[] = { |
89 MII_PHY_DESC(xxCICADA, CS8201), 90 MII_PHY_DESC(xxCICADA, CS8201A), 91 MII_PHY_DESC(xxCICADA, CS8201B), 92 MII_PHY_DESC(xxCICADA, CS8204), 93 MII_PHY_DESC(xxCICADA, VSC8211), 94 MII_PHY_DESC(xxCICADA, CS8244), 95 MII_PHY_DESC(xxVITESSE, VSC8601), |
96 MII_PHY_END 97}; 98 |
99static const struct mii_phy_funcs ciphy_funcs = { 100 ciphy_service, 101 ciphy_status, 102 ciphy_reset 103}; 104 |
105static int 106ciphy_probe(device_t dev) 107{ 108 109 return (mii_phy_dev_probe(dev, ciphys, BUS_PROBE_DEFAULT)); 110} 111 112static int 113ciphy_attach(device_t dev) 114{ |
115 |
116 mii_phy_dev_attach(dev, MIIF_NOISOLATE | MIIF_NOMANPAUSE, 117 &ciphy_funcs, 1); |
118 return (0); 119} 120 121static int 122ciphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd) 123{ 124 struct ifmedia_entry *ife = mii->mii_media.ifm_cur; 125 int reg, speed, gig; --- 89 unchanged lines hidden (view full) --- 215 break; 216 217 sc->mii_ticks = 0; 218 mii_phy_auto(sc); 219 break; 220 } 221 222 /* Update the media status. */ |
223 PHY_STATUS(sc); |
224 225 /* 226 * Callback if something changed. Note that we need to poke 227 * apply fixups for certain PHY revs. 228 */ 229 if (sc->mii_media_active != mii->mii_media_active || 230 sc->mii_media_status != mii->mii_media_status || 231 cmd == MII_MEDIACHG) { --- 43 unchanged lines hidden (view full) --- 275 break; 276 default: 277 device_printf(sc->mii_dev, "unknown PHY speed %x\n", 278 bmsr & CIPHY_AUXCSR_SPEED); 279 break; 280 } 281 282 if (bmsr & CIPHY_AUXCSR_FDX) |
283 mii->mii_media_active |= IFM_FDX | mii_phy_flowstatus(sc); |
284 else 285 mii->mii_media_active |= IFM_HDX; 286 287 if ((IFM_SUBTYPE(mii->mii_media_active) == IFM_1000_T) && 288 (PHY_READ(sc, CIPHY_MII_1000STS) & CIPHY_1000STS_MSR) != 0) 289 mii->mii_media_active |= IFM_ETH_MASTER; 290} 291 --- 33 unchanged lines hidden (view full) --- 325 val |= CIPHY_AUXCSR_MDPPS; 326 PHY_WRITE(sc, CIPHY_MII_AUXCSR, val); 327 val = PHY_READ(sc, CIPHY_MII_10BTCSR); 328 val |= CIPHY_10BTCSR_ECHO; 329 PHY_WRITE(sc, CIPHY_MII_10BTCSR, val); 330 } 331 332 switch (model) { |
333 case MII_MODEL_xxCICADA_CS8204: 334 case MII_MODEL_xxCICADA_CS8201: |
335 336 /* Turn off "aux mode" (whatever that means) */ 337 PHY_SETBIT(sc, CIPHY_MII_AUXCSR, CIPHY_AUXCSR_MDPPS); 338 339 /* 340 * Work around speed polling bug in VT3119/VT3216 341 * when using MII in full duplex mode. 342 */ --- 4 unchanged lines hidden (view full) --- 347 PHY_CLRBIT(sc, CIPHY_MII_10BTCSR, CIPHY_10BTCSR_ECHO); 348 } 349 350 /* Enable link/activity LED blink. */ 351 PHY_SETBIT(sc, CIPHY_MII_LED, CIPHY_LED_LINKACTBLINK); 352 353 break; 354 |
355 case MII_MODEL_xxCICADA_CS8201A: 356 case MII_MODEL_xxCICADA_CS8201B: |
357 358 /* 359 * Work around speed polling bug in VT3119/VT3216 360 * when using MII in full duplex mode. 361 */ 362 if ((speed == CIPHY_SPEED10 || speed == CIPHY_SPEED100) && 363 (status & CIPHY_AUXCSR_FDX)) { 364 PHY_SETBIT(sc, CIPHY_MII_10BTCSR, CIPHY_10BTCSR_ECHO); 365 } else { 366 PHY_CLRBIT(sc, CIPHY_MII_10BTCSR, CIPHY_10BTCSR_ECHO); 367 } 368 369 break; |
370 case MII_MODEL_xxCICADA_VSC8211: 371 case MII_MODEL_xxCICADA_CS8244: 372 case MII_MODEL_xxVITESSE_VSC8601: |
373 break; 374 default: 375 device_printf(sc->mii_dev, "unknown CICADA PHY model %x\n", 376 model); 377 break; 378 } 379} |