ciphy.c (217413) | ciphy.c (221407) |
---|---|
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> | 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 217413 2011-01-14 19:29:53Z marius $"); | 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[] = { | 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(CICADA, CS8201), 90 MII_PHY_DESC(CICADA, CS8201A), 91 MII_PHY_DESC(CICADA, CS8201B), 92 MII_PHY_DESC(CICADA, CS8204), 93 MII_PHY_DESC(CICADA, VSC8211), 94 MII_PHY_DESC(CICADA, CS8244), 95 MII_PHY_DESC(VITESSE, VSC8601), | 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 | 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 |
|
99static int 100ciphy_probe(device_t dev) 101{ 102 103 return (mii_phy_dev_probe(dev, ciphys, BUS_PROBE_DEFAULT)); 104} 105 106static int 107ciphy_attach(device_t dev) 108{ | 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{ |
109 struct mii_softc *sc; 110 struct mii_attach_args *ma; 111 struct mii_data *mii; | |
112 | 115 |
113 sc = device_get_softc(dev); 114 ma = device_get_ivars(dev); 115 sc->mii_dev = device_get_parent(dev); 116 mii = ma->mii_data; 117 LIST_INSERT_HEAD(&mii->mii_phys, sc, mii_list); 118 119 sc->mii_flags = miibus_get_flags(dev); 120 sc->mii_inst = mii->mii_instance++; 121 sc->mii_phy = ma->mii_phyno; 122 sc->mii_service = ciphy_service; 123 sc->mii_pdata = mii; 124 125 sc->mii_flags |= MIIF_NOISOLATE; 126 127 ciphy_reset(sc); 128 129 sc->mii_capabilities = PHY_READ(sc, MII_BMSR) & ma->mii_capmask; 130 if (sc->mii_capabilities & BMSR_EXTSTAT) 131 sc->mii_extcapabilities = PHY_READ(sc, MII_EXTSR); 132 device_printf(dev, " "); 133 mii_phy_add_media(sc); 134 printf("\n"); 135 136 MIIBUS_MEDIAINIT(sc->mii_dev); | 116 mii_phy_dev_attach(dev, MIIF_NOISOLATE | MIIF_NOMANPAUSE, 117 &ciphy_funcs, 1); |
137 return (0); 138} 139 140static int 141ciphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd) 142{ 143 struct ifmedia_entry *ife = mii->mii_media.ifm_cur; 144 int reg, speed, gig; --- 89 unchanged lines hidden (view full) --- 234 break; 235 236 sc->mii_ticks = 0; 237 mii_phy_auto(sc); 238 break; 239 } 240 241 /* Update the media status. */ | 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. */ |
242 ciphy_status(sc); | 223 PHY_STATUS(sc); |
243 244 /* 245 * Callback if something changed. Note that we need to poke 246 * apply fixups for certain PHY revs. 247 */ 248 if (sc->mii_media_active != mii->mii_media_active || 249 sc->mii_media_status != mii->mii_media_status || 250 cmd == MII_MEDIACHG) { --- 43 unchanged lines hidden (view full) --- 294 break; 295 default: 296 device_printf(sc->mii_dev, "unknown PHY speed %x\n", 297 bmsr & CIPHY_AUXCSR_SPEED); 298 break; 299 } 300 301 if (bmsr & CIPHY_AUXCSR_FDX) | 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) |
302 mii->mii_media_active |= IFM_FDX; | 283 mii->mii_media_active |= IFM_FDX | mii_phy_flowstatus(sc); |
303 else 304 mii->mii_media_active |= IFM_HDX; 305 306 if ((IFM_SUBTYPE(mii->mii_media_active) == IFM_1000_T) && 307 (PHY_READ(sc, CIPHY_MII_1000STS) & CIPHY_1000STS_MSR) != 0) 308 mii->mii_media_active |= IFM_ETH_MASTER; 309} 310 --- 33 unchanged lines hidden (view full) --- 344 val |= CIPHY_AUXCSR_MDPPS; 345 PHY_WRITE(sc, CIPHY_MII_AUXCSR, val); 346 val = PHY_READ(sc, CIPHY_MII_10BTCSR); 347 val |= CIPHY_10BTCSR_ECHO; 348 PHY_WRITE(sc, CIPHY_MII_10BTCSR, val); 349 } 350 351 switch (model) { | 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) { |
352 case MII_MODEL_CICADA_CS8204: 353 case MII_MODEL_CICADA_CS8201: | 333 case MII_MODEL_xxCICADA_CS8204: 334 case MII_MODEL_xxCICADA_CS8201: |
354 355 /* Turn off "aux mode" (whatever that means) */ 356 PHY_SETBIT(sc, CIPHY_MII_AUXCSR, CIPHY_AUXCSR_MDPPS); 357 358 /* 359 * Work around speed polling bug in VT3119/VT3216 360 * when using MII in full duplex mode. 361 */ --- 4 unchanged lines hidden (view full) --- 366 PHY_CLRBIT(sc, CIPHY_MII_10BTCSR, CIPHY_10BTCSR_ECHO); 367 } 368 369 /* Enable link/activity LED blink. */ 370 PHY_SETBIT(sc, CIPHY_MII_LED, CIPHY_LED_LINKACTBLINK); 371 372 break; 373 | 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 |
374 case MII_MODEL_CICADA_CS8201A: 375 case MII_MODEL_CICADA_CS8201B: | 355 case MII_MODEL_xxCICADA_CS8201A: 356 case MII_MODEL_xxCICADA_CS8201B: |
376 377 /* 378 * Work around speed polling bug in VT3119/VT3216 379 * when using MII in full duplex mode. 380 */ 381 if ((speed == CIPHY_SPEED10 || speed == CIPHY_SPEED100) && 382 (status & CIPHY_AUXCSR_FDX)) { 383 PHY_SETBIT(sc, CIPHY_MII_10BTCSR, CIPHY_10BTCSR_ECHO); 384 } else { 385 PHY_CLRBIT(sc, CIPHY_MII_10BTCSR, CIPHY_10BTCSR_ECHO); 386 } 387 388 break; | 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; |
389 case MII_MODEL_CICADA_VSC8211: 390 case MII_MODEL_CICADA_CS8244: 391 case MII_MODEL_VITESSE_VSC8601: | 370 case MII_MODEL_xxCICADA_VSC8211: 371 case MII_MODEL_xxCICADA_CS8244: 372 case MII_MODEL_xxVITESSE_VSC8601: |
392 break; 393 default: 394 device_printf(sc->mii_dev, "unknown CICADA PHY model %x\n", 395 model); 396 break; 397 } 398} | 373 break; 374 default: 375 device_printf(sc->mii_dev, "unknown CICADA PHY model %x\n", 376 model); 377 break; 378 } 379} |