Deleted Added
full compact
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}