xlphy.c (221407) | xlphy.c (226154) |
---|---|
1/* $NetBSD: exphy.c,v 1.16 1999/04/23 04:24:32 thorpej Exp $ */ 2 3/*- 4 * Copyright (c) 1998, 1999 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility, --- 41 unchanged lines hidden (view full) --- 50 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 51 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 52 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 53 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 54 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 55 */ 56 57#include <sys/cdefs.h> | 1/* $NetBSD: exphy.c,v 1.16 1999/04/23 04:24:32 thorpej Exp $ */ 2 3/*- 4 * Copyright (c) 1998, 1999 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility, --- 41 unchanged lines hidden (view full) --- 50 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 51 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 52 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 53 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 54 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 55 */ 56 57#include <sys/cdefs.h> |
58__FBSDID("$FreeBSD: head/sys/dev/mii/exphy.c 221407 2011-05-03 19:51:29Z marius $"); | 58__FBSDID("$FreeBSD: head/sys/dev/xl/xlphy.c 226154 2011-10-08 12:33:10Z marius $"); |
59 60/* 61 * driver for 3Com internal PHYs 62 */ 63 64#include <sys/param.h> 65#include <sys/systm.h> 66#include <sys/kernel.h> --- 5 unchanged lines hidden (view full) --- 72#include <net/if_media.h> 73 74#include <dev/mii/mii.h> 75#include <dev/mii/miivar.h> 76#include "miidevs.h" 77 78#include "miibus_if.h" 79 | 59 60/* 61 * driver for 3Com internal PHYs 62 */ 63 64#include <sys/param.h> 65#include <sys/systm.h> 66#include <sys/kernel.h> --- 5 unchanged lines hidden (view full) --- 72#include <net/if_media.h> 73 74#include <dev/mii/mii.h> 75#include <dev/mii/miivar.h> 76#include "miidevs.h" 77 78#include "miibus_if.h" 79 |
80static int exphy_probe(device_t); 81static int exphy_attach(device_t); | 80static int xlphy_probe(device_t); 81static int xlphy_attach(device_t); |
82 | 82 |
83static device_method_t exphy_methods[] = { | 83static device_method_t xlphy_methods[] = { |
84 /* device interface */ | 84 /* device interface */ |
85 DEVMETHOD(device_probe, exphy_probe), 86 DEVMETHOD(device_attach, exphy_attach), | 85 DEVMETHOD(device_probe, xlphy_probe), 86 DEVMETHOD(device_attach, xlphy_attach), |
87 DEVMETHOD(device_detach, mii_phy_detach), 88 DEVMETHOD(device_shutdown, bus_generic_shutdown), 89 { 0, 0 } 90}; 91 | 87 DEVMETHOD(device_detach, mii_phy_detach), 88 DEVMETHOD(device_shutdown, bus_generic_shutdown), 89 { 0, 0 } 90}; 91 |
92static devclass_t exphy_devclass; | 92static devclass_t xlphy_devclass; |
93 | 93 |
94static driver_t exphy_driver = { | 94static driver_t xlphy_driver = { |
95 "xlphy", | 95 "xlphy", |
96 exphy_methods, | 96 xlphy_methods, |
97 sizeof(struct mii_softc) 98}; 99 | 97 sizeof(struct mii_softc) 98}; 99 |
100DRIVER_MODULE(xlphy, miibus, exphy_driver, exphy_devclass, 0, 0); | 100DRIVER_MODULE(xlphy, miibus, xlphy_driver, xlphy_devclass, 0, 0); |
101 | 101 |
102static int exphy_service(struct mii_softc *, struct mii_data *, int); 103static void exphy_reset(struct mii_softc *); | 102static int xlphy_service(struct mii_softc *, struct mii_data *, int); 103static void xlphy_reset(struct mii_softc *); |
104 105/* 106 * Some 3Com internal PHYs report zero for OUI and model, others use 107 * actual values. 108 * Note that the 3Com internal PHYs having OUI 0x105a and model 0 are 109 * handled fine by ukphy(4); they can be isolated and don't require 110 * special treatment after reset. 111 */ | 104 105/* 106 * Some 3Com internal PHYs report zero for OUI and model, others use 107 * actual values. 108 * Note that the 3Com internal PHYs having OUI 0x105a and model 0 are 109 * handled fine by ukphy(4); they can be isolated and don't require 110 * special treatment after reset. 111 */ |
112static const struct mii_phydesc exphys[] = { | 112static const struct mii_phydesc xlphys[] = { |
113 { 0, 0, "3Com internal media interface" }, 114 MII_PHY_DESC(xxBROADCOM, 3C905C), 115 MII_PHY_END 116}; 117 | 113 { 0, 0, "3Com internal media interface" }, 114 MII_PHY_DESC(xxBROADCOM, 3C905C), 115 MII_PHY_END 116}; 117 |
118static const struct mii_phy_funcs exphy_funcs = { 119 exphy_service, | 118static const struct mii_phy_funcs xlphy_funcs = { 119 xlphy_service, |
120 ukphy_status, | 120 ukphy_status, |
121 exphy_reset | 121 xlphy_reset |
122}; 123 124static int | 122}; 123 124static int |
125exphy_probe(device_t dev) | 125xlphy_probe(device_t dev) |
126{ 127 128 if (strcmp(device_get_name(device_get_parent(device_get_parent(dev))), 129 "xl") == 0) | 126{ 127 128 if (strcmp(device_get_name(device_get_parent(device_get_parent(dev))), 129 "xl") == 0) |
130 return (mii_phy_dev_probe(dev, exphys, BUS_PROBE_DEFAULT)); | 130 return (mii_phy_dev_probe(dev, xlphys, BUS_PROBE_DEFAULT)); |
131 return (ENXIO); 132} 133 134static int | 131 return (ENXIO); 132} 133 134static int |
135exphy_attach(device_t dev) | 135xlphy_attach(device_t dev) |
136{ 137 138 /* 139 * The 3Com PHY can never be isolated. 140 */ 141 mii_phy_dev_attach(dev, MIIF_NOISOLATE | MIIF_NOMANPAUSE, | 136{ 137 138 /* 139 * The 3Com PHY can never be isolated. 140 */ 141 mii_phy_dev_attach(dev, MIIF_NOISOLATE | MIIF_NOMANPAUSE, |
142 &exphy_funcs, 1); | 142 &xlphy_funcs, 1); |
143 return (0); 144} 145 146static int | 143 return (0); 144} 145 146static int |
147exphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd) | 147xlphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd) |
148{ 149 150 switch (cmd) { 151 case MII_POLLSTAT: 152 break; 153 154 case MII_MEDIACHG: 155 /* --- 23 unchanged lines hidden (view full) --- 179 PHY_STATUS(sc); 180 181 /* Callback if something changed. */ 182 mii_phy_update(sc, cmd); 183 return (0); 184} 185 186static void | 148{ 149 150 switch (cmd) { 151 case MII_POLLSTAT: 152 break; 153 154 case MII_MEDIACHG: 155 /* --- 23 unchanged lines hidden (view full) --- 179 PHY_STATUS(sc); 180 181 /* Callback if something changed. */ 182 mii_phy_update(sc, cmd); 183 return (0); 184} 185 186static void |
187exphy_reset(struct mii_softc *sc) | 187xlphy_reset(struct mii_softc *sc) |
188{ 189 190 mii_phy_reset(sc); 191 192 /* 193 * XXX 3Com PHY doesn't set the BMCR properly after 194 * XXX reset, which breaks autonegotiation. 195 */ 196 PHY_WRITE(sc, MII_BMCR, BMCR_S100|BMCR_AUTOEN|BMCR_FDX); 197} | 188{ 189 190 mii_phy_reset(sc); 191 192 /* 193 * XXX 3Com PHY doesn't set the BMCR properly after 194 * XXX reset, which breaks autonegotiation. 195 */ 196 PHY_WRITE(sc, MII_BMCR, BMCR_S100|BMCR_AUTOEN|BMCR_FDX); 197} |