Deleted Added
sdiff udiff text old ( 213229 ) new ( 213364 )
full compact
1/* $NetBSD: ukphy.c,v 1.2 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/ukphy.c 213229 2010-09-27 20:31:03Z marius $");
59
60/*
61 * driver for generic unknown PHYs
62 */
63
64#include <sys/param.h>
65#include <sys/systm.h>
66#include <sys/kernel.h>

--- 58 unchanged lines hidden (view full) ---

125 mii = ma->mii_data;
126 LIST_INSERT_HEAD(&mii->mii_phys, sc, mii_list);
127
128 if (bootverbose)
129 device_printf(dev, "OUI 0x%06x, model 0x%04x, rev. %d\n",
130 MII_OUI(ma->mii_id1, ma->mii_id2),
131 MII_MODEL(ma->mii_id2), MII_REV(ma->mii_id2));
132
133 sc->mii_inst = mii->mii_instance;
134 sc->mii_phy = ma->mii_phyno;
135 sc->mii_service = ukphy_service;
136 sc->mii_pdata = mii;
137
138 mii->mii_instance++;
139
140 mii_phy_reset(sc);
141
142 sc->mii_capabilities =
143 PHY_READ(sc, MII_BMSR) & ma->mii_capmask;
144 if (sc->mii_capabilities & BMSR_EXTSTAT)
145 sc->mii_extcapabilities = PHY_READ(sc, MII_EXTSR);
146 device_printf(dev, " ");
147 mii_phy_add_media(sc);
148 printf("\n");
149
150 MIIBUS_MEDIAINIT(sc->mii_dev);
151 mii_phy_setmedia(sc);
152
153 return (0);
154}
155
156static int
157ukphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
158{
159 struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
160 int reg;
161
162 switch (cmd) {
163 case MII_POLLSTAT:
164 /*
165 * If we're not polling our PHY instance, just return.
166 */
167 if (IFM_INST(ife->ifm_media) != sc->mii_inst)
168 return (0);
169 break;
170
171 case MII_MEDIACHG:
172 /*
173 * If the media indicates a different PHY instance,
174 * isolate ourselves.
175 */
176 if (IFM_INST(ife->ifm_media) != sc->mii_inst) {
177 reg = PHY_READ(sc, MII_BMCR);
178 PHY_WRITE(sc, MII_BMCR, reg | BMCR_ISO);
179 return (0);
180 }
181
182 /*
183 * If the interface is not up, don't do anything.
184 */
185 if ((mii->mii_ifp->if_flags & IFF_UP) == 0)
186 break;
187
188 mii_phy_setmedia(sc);
189 break;
190
191 case MII_TICK:
192 /*
193 * If we're not currently selected, just return.
194 */
195 if (IFM_INST(ife->ifm_media) != sc->mii_inst)
196 return (0);
197 if (mii_phy_tick(sc) == EJUSTRETURN)
198 return (0);
199 break;
200 }
201
202 /* Update the media status. */
203 ukphy_status(sc);
204
205 /* Callback if something changed. */
206 mii_phy_update(sc, cmd);
207 return (0);
208}