ciphy.c (213893) | ciphy.c (215297) |
---|---|
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 213893 2010-10-15 14:52:11Z marius $"); | 34__FBSDID("$FreeBSD: head/sys/dev/mii/ciphy.c 215297 2010-11-14 13:26:10Z 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> --- 117 unchanged lines hidden (view full) --- 160 case IFM_AUTO: 161#ifdef foo 162 /* 163 * If we're already in auto mode, just return. 164 */ 165 if (PHY_READ(sc, CIPHY_MII_BMCR) & CIPHY_BMCR_AUTOEN) 166 return (0); 167#endif | 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> --- 117 unchanged lines hidden (view full) --- 160 case IFM_AUTO: 161#ifdef foo 162 /* 163 * If we're already in auto mode, just return. 164 */ 165 if (PHY_READ(sc, CIPHY_MII_BMCR) & CIPHY_BMCR_AUTOEN) 166 return (0); 167#endif |
168 (void) mii_phy_auto(sc); | 168 (void)mii_phy_auto(sc); |
169 break; 170 case IFM_1000_T: 171 speed = CIPHY_S1000; 172 goto setit; 173 case IFM_100_TX: 174 speed = CIPHY_S100; 175 goto setit; 176 case IFM_10_T: --- 8 unchanged lines hidden (view full) --- 185 186 PHY_WRITE(sc, CIPHY_MII_1000CTL, 0); 187 PHY_WRITE(sc, CIPHY_MII_BMCR, speed); 188 PHY_WRITE(sc, CIPHY_MII_ANAR, CIPHY_SEL_TYPE); 189 190 if (IFM_SUBTYPE(ife->ifm_media) != IFM_1000_T) 191 break; 192 | 169 break; 170 case IFM_1000_T: 171 speed = CIPHY_S1000; 172 goto setit; 173 case IFM_100_TX: 174 speed = CIPHY_S100; 175 goto setit; 176 case IFM_10_T: --- 8 unchanged lines hidden (view full) --- 185 186 PHY_WRITE(sc, CIPHY_MII_1000CTL, 0); 187 PHY_WRITE(sc, CIPHY_MII_BMCR, speed); 188 PHY_WRITE(sc, CIPHY_MII_ANAR, CIPHY_SEL_TYPE); 189 190 if (IFM_SUBTYPE(ife->ifm_media) != IFM_1000_T) 191 break; 192 |
193 gig |= CIPHY_1000CTL_MSE; 194 if ((ife->ifm_media & IFM_ETH_MASTER) != 0) 195 gig |= CIPHY_1000CTL_MSC; |
|
193 PHY_WRITE(sc, CIPHY_MII_1000CTL, gig); 194 PHY_WRITE(sc, CIPHY_MII_BMCR, | 196 PHY_WRITE(sc, CIPHY_MII_1000CTL, gig); 197 PHY_WRITE(sc, CIPHY_MII_BMCR, |
195 speed|CIPHY_BMCR_AUTOEN|CIPHY_BMCR_STARTNEG); 196 197 /* 198 * When setting the link manually, one side must 199 * be the master and the other the slave. However 200 * ifmedia doesn't give us a good way to specify 201 * this, so we fake it by using one of the LINK 202 * flags. If LINK0 is set, we program the PHY to 203 * be a master, otherwise it's a slave. 204 */ 205 if ((mii->mii_ifp->if_flags & IFF_LINK0)) { 206 PHY_WRITE(sc, CIPHY_MII_1000CTL, 207 gig|CIPHY_1000CTL_MSE|CIPHY_1000CTL_MSC); 208 } else { 209 PHY_WRITE(sc, CIPHY_MII_1000CTL, 210 gig|CIPHY_1000CTL_MSE); 211 } | 198 speed | CIPHY_BMCR_AUTOEN | CIPHY_BMCR_STARTNEG); |
212 break; 213 case IFM_NONE: | 199 break; 200 case IFM_NONE: |
214 PHY_WRITE(sc, MII_BMCR, BMCR_ISO|BMCR_PDOWN); | 201 PHY_WRITE(sc, MII_BMCR, BMCR_ISO | BMCR_PDOWN); |
215 break; | 202 break; |
216 case IFM_100_T4: | |
217 default: 218 return (EINVAL); 219 } 220 break; 221 222 case MII_TICK: 223 /* 224 * Is the interface even up? --- 89 unchanged lines hidden (view full) --- 314 bmsr & CIPHY_AUXCSR_SPEED); 315 break; 316 } 317 318 if (bmsr & CIPHY_AUXCSR_FDX) 319 mii->mii_media_active |= IFM_FDX; 320 else 321 mii->mii_media_active |= IFM_HDX; | 203 default: 204 return (EINVAL); 205 } 206 break; 207 208 case MII_TICK: 209 /* 210 * Is the interface even up? --- 89 unchanged lines hidden (view full) --- 300 bmsr & CIPHY_AUXCSR_SPEED); 301 break; 302 } 303 304 if (bmsr & CIPHY_AUXCSR_FDX) 305 mii->mii_media_active |= IFM_FDX; 306 else 307 mii->mii_media_active |= IFM_HDX; |
308 309 if ((IFM_SUBTYPE(mii->mii_media_active) == IFM_1000_T) && 310 (PHY_READ(sc, CIPHY_MII_1000STS) & CIPHY_1000STS_MSR) != 0) 311 mii->mii_media_active |= IFM_ETH_MASTER; |
|
322} 323 324static void 325ciphy_reset(struct mii_softc *sc) 326{ 327 328 mii_phy_reset(sc); 329 DELAY(1000); --- 82 unchanged lines hidden --- | 312} 313 314static void 315ciphy_reset(struct mii_softc *sc) 316{ 317 318 mii_phy_reset(sc); 319 DELAY(1000); --- 82 unchanged lines hidden --- |