Deleted Added
sdiff udiff text old ( 213893 ) new ( 221407 )
full compact
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 $
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 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;
143 struct mii_attach_args *ma;
144 struct mii_data *mii;
145
146 sc = device_get_softc(dev);
147 ma = device_get_ivars(dev);
148
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);
153
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;
159
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;
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,
213 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. */
225 truephy_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
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)
329 mii->mii_media_active |= IFM_FDX;
330 else
331 mii->mii_media_active |= IFM_HDX;
332}