truephy.c (213893) | truephy.c (221407) |
---|---|
1/*- 2 * Copyright (c) 2007 The DragonFly Project. All rights reserved. 3 * 4 * This code is derived from software contributed to The DragonFly Project 5 * by Sepherosa Ziehau <sepherosa@gmail.com> 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions --- 18 unchanged lines hidden (view full) --- 27 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 28 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 29 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 30 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 31 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32 * SUCH DAMAGE. 33 * 34 * $DragonFly: src/sys/dev/netif/mii_layer/truephy.c,v 1.3 2008/02/10 07:29:27 sephe Exp $ | 1/*- 2 * Copyright (c) 2007 The DragonFly Project. All rights reserved. 3 * 4 * This code is derived from software contributed to The DragonFly Project 5 * by Sepherosa Ziehau <sepherosa@gmail.com> 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions --- 18 unchanged lines hidden (view full) --- 27 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 28 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 29 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 30 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 31 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32 * SUCH DAMAGE. 33 * 34 * $DragonFly: src/sys/dev/netif/mii_layer/truephy.c,v 1.3 2008/02/10 07:29:27 sephe Exp $ |
35 * $FreeBSD: head/sys/dev/mii/truephy.c 213893 2010-10-15 14:52:11Z marius $ | 35 * $FreeBSD: head/sys/dev/mii/truephy.c 221407 2011-05-03 19:51:29Z marius $ |
36 */ 37 38#include <sys/param.h> 39#include <sys/systm.h> 40#include <sys/kernel.h> 41#include <sys/socket.h> 42#include <sys/errno.h> 43#include <sys/module.h> --- 42 unchanged lines hidden (view full) --- 86static driver_t truephy_driver = { 87 "truephy", 88 truephy_methods, 89 sizeof(struct mii_softc) 90}; 91 92DRIVER_MODULE(truephy, miibus, truephy_driver, truephy_devclass, 0, 0); 93 | 36 */ 37 38#include <sys/param.h> 39#include <sys/systm.h> 40#include <sys/kernel.h> 41#include <sys/socket.h> 42#include <sys/errno.h> 43#include <sys/module.h> --- 42 unchanged lines hidden (view full) --- 86static driver_t truephy_driver = { 87 "truephy", 88 truephy_methods, 89 sizeof(struct mii_softc) 90}; 91 92DRIVER_MODULE(truephy, miibus, truephy_driver, truephy_devclass, 0, 0); 93 |
94static const struct mii_phy_funcs truephy_funcs = { 95 truephy_service, 96 truephy_status, 97 truephy_reset 98}; 99 |
|
94static const struct truephy_dsp { 95 uint16_t index; 96 uint16_t data; 97} truephy_dspcode[] = { 98 { 0x880b, 0x0926 }, /* AfeIfCreg4B1000Msbs */ 99 { 0x880c, 0x0926 }, /* AfeIfCreg4B100Msbs */ 100 { 0x880d, 0x0926 }, /* AfeIfCreg4B10Msbs */ 101 --- 33 unchanged lines hidden (view full) --- 135 136 return (mii_phy_dev_probe(dev, truephys, BUS_PROBE_DEFAULT)); 137} 138 139static int 140truephy_attach(device_t dev) 141{ 142 struct mii_softc *sc; | 100static const struct truephy_dsp { 101 uint16_t index; 102 uint16_t data; 103} truephy_dspcode[] = { 104 { 0x880b, 0x0926 }, /* AfeIfCreg4B1000Msbs */ 105 { 0x880c, 0x0926 }, /* AfeIfCreg4B100Msbs */ 106 { 0x880d, 0x0926 }, /* AfeIfCreg4B10Msbs */ 107 --- 33 unchanged lines hidden (view full) --- 141 142 return (mii_phy_dev_probe(dev, truephys, BUS_PROBE_DEFAULT)); 143} 144 145static int 146truephy_attach(device_t dev) 147{ 148 struct mii_softc *sc; |
143 struct mii_attach_args *ma; 144 struct mii_data *mii; | |
145 146 sc = device_get_softc(dev); | 149 150 sc = device_get_softc(dev); |
147 ma = device_get_ivars(dev); | |
148 | 151 |
149 sc->mii_phy = ma->mii_phyno; 150 sc->mii_dev = device_get_parent(dev); 151 mii = ma->mii_data; 152 LIST_INSERT_HEAD(&mii->mii_phys, sc, mii_list); | 152 mii_phy_dev_attach(dev, MIIF_NOISOLATE | MIIF_NOMANPAUSE, 153 &truephy_funcs, 0); |
153 | 154 |
154 sc->mii_flags = miibus_get_flags(dev); 155 sc->mii_inst = mii->mii_instance++; 156 sc->mii_phy = ma->mii_phyno; 157 sc->mii_service = truephy_service; 158 sc->mii_pdata = mii; | 155 PHY_RESET(sc); |
159 | 156 |
160 sc->mii_flags |= MIIF_NOISOLATE | MIIF_NOLOOP; 161 162 if (MII_MODEL(ma->mii_id2) == MII_MODEL_AGERE_ET1011) 163 mii_phy_reset(sc); 164 else 165 truephy_reset(sc); 166 167 sc->mii_capabilities = PHY_READ(sc, MII_BMSR) & ma->mii_capmask; | 157 sc->mii_capabilities = PHY_READ(sc, MII_BMSR) & sc->mii_capmask; |
168 if (sc->mii_capabilities & BMSR_EXTSTAT) { 169 sc->mii_extcapabilities = PHY_READ(sc, MII_EXTSR); 170 /* No 1000baseT half-duplex support */ 171 sc->mii_extcapabilities &= ~EXTSR_1000THDX; 172 } 173 174 device_printf(dev, " "); 175 mii_phy_add_media(sc); --- 29 unchanged lines hidden (view full) --- 205 mii_phy_setmedia(sc); 206 207 if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO) { 208 bmcr = PHY_READ(sc, MII_BMCR) & ~BMCR_PDOWN; 209 PHY_WRITE(sc, MII_BMCR, bmcr); 210 211 if (IFM_SUBTYPE(ife->ifm_media) == IFM_1000_T) { 212 PHY_WRITE(sc, MII_BMCR, | 158 if (sc->mii_capabilities & BMSR_EXTSTAT) { 159 sc->mii_extcapabilities = PHY_READ(sc, MII_EXTSR); 160 /* No 1000baseT half-duplex support */ 161 sc->mii_extcapabilities &= ~EXTSR_1000THDX; 162 } 163 164 device_printf(dev, " "); 165 mii_phy_add_media(sc); --- 29 unchanged lines hidden (view full) --- 195 mii_phy_setmedia(sc); 196 197 if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO) { 198 bmcr = PHY_READ(sc, MII_BMCR) & ~BMCR_PDOWN; 199 PHY_WRITE(sc, MII_BMCR, bmcr); 200 201 if (IFM_SUBTYPE(ife->ifm_media) == IFM_1000_T) { 202 PHY_WRITE(sc, MII_BMCR, |
213 bmcr | BMCR_AUTOEN | BMCR_STARTNEG); | 203 bmcr | BMCR_AUTOEN | BMCR_STARTNEG); |
214 } 215 } 216 break; 217 218 case MII_TICK: 219 if (mii_phy_tick(sc) == EJUSTRETURN) 220 return (0); 221 break; 222 } 223 224 /* Update the media status. */ | 204 } 205 } 206 break; 207 208 case MII_TICK: 209 if (mii_phy_tick(sc) == EJUSTRETURN) 210 return (0); 211 break; 212 } 213 214 /* Update the media status. */ |
225 truephy_status(sc); | 215 PHY_STATUS(sc); |
226 227 /* Callback if something changed. */ 228 mii_phy_update(sc, cmd); 229 return (0); 230} 231 232static void 233truephy_reset(struct mii_softc *sc) 234{ 235 int i; 236 | 216 217 /* Callback if something changed. */ 218 mii_phy_update(sc, cmd); 219 return (0); 220} 221 222static void 223truephy_reset(struct mii_softc *sc) 224{ 225 int i; 226 |
227 if (sc->mii_mpd_model == MII_MODEL_AGERE_ET1011) { 228 mii_phy_reset(sc); 229 return; 230 } 231 |
|
237 for (i = 0; i < 2; ++i) { 238 PHY_READ(sc, MII_PHYIDR1); 239 PHY_READ(sc, MII_PHYIDR2); 240 241 PHY_READ(sc, TRUEPHY_CTRL); 242 PHY_WRITE(sc, TRUEPHY_CTRL, 243 TRUEPHY_CTRL_DIAG | TRUEPHY_CTRL_RSV1); 244 --- 76 unchanged lines hidden (view full) --- 321 default: 322 /* XXX will this ever happen? */ 323 printf("invalid media SR %#x\n", sr); 324 mii->mii_media_active |= IFM_NONE; 325 return; 326 } 327 328 if (sr & TRUEPHY_SR_FDX) | 232 for (i = 0; i < 2; ++i) { 233 PHY_READ(sc, MII_PHYIDR1); 234 PHY_READ(sc, MII_PHYIDR2); 235 236 PHY_READ(sc, TRUEPHY_CTRL); 237 PHY_WRITE(sc, TRUEPHY_CTRL, 238 TRUEPHY_CTRL_DIAG | TRUEPHY_CTRL_RSV1); 239 --- 76 unchanged lines hidden (view full) --- 316 default: 317 /* XXX will this ever happen? */ 318 printf("invalid media SR %#x\n", sr); 319 mii->mii_media_active |= IFM_NONE; 320 return; 321 } 322 323 if (sr & TRUEPHY_SR_FDX) |
329 mii->mii_media_active |= IFM_FDX; | 324 mii->mii_media_active |= IFM_FDX | mii_phy_flowstatus(sc); |
330 else 331 mii->mii_media_active |= IFM_HDX; 332} | 325 else 326 mii->mii_media_active |= IFM_HDX; 327} |