Lines Matching refs:mii
1 /* $NetBSD: mii.c,v 1.59 2024/02/08 20:11:55 andvar Exp $ */
34 * MII bus layer, glues MII-capable network interface drivers to shareable
39 __KERNEL_RCSID(0, "$NetBSD: mii.c,v 1.59 2024/02/08 20:11:55 andvar Exp $");
51 #include <dev/mii/mii.h>
52 #include <dev/mii/miivar.h>
63 mii_attach(device_t parent, struct mii_data *mii, int capmask,
74 KASSERT(mii->mii_media.ifm_lock != NULL);
85 mii_lock(mii);
87 if ((mii->mii_flags & MIIF_INITDONE) == 0) {
88 LIST_INIT(&mii->mii_phys);
89 cv_init(&mii->mii_probe_cv, "mii_attach");
90 mii->mii_flags |= MIIF_INITDONE;
94 * Probing temporarily unlocks the MII; wait until anyone
97 mii->mii_probe_waiters++;
99 if (mii->mii_flags & MIIF_EXITING) {
100 mii->mii_probe_waiters--;
101 cv_signal(&mii->mii_probe_cv);
102 mii_unlock(mii);
105 if ((mii->mii_flags & MIIF_PROBING) == 0)
107 cv_wait(&mii->mii_probe_cv, mii->mii_media.ifm_lock);
109 mii->mii_probe_waiters--;
112 mii->mii_flags |= MIIF_PROBING;
120 LIST_FOREACH(child, &mii->mii_phys, mii_list) {
137 rv = (*mii->mii_readreg)(parent, ma.mii_phyno, MII_BMSR,
160 rv = (*mii->mii_readreg)(parent, ma.mii_phyno,
162 rv |= (*mii->mii_readreg)(parent, ma.mii_phyno,
167 ma.mii_data = mii;
169 ma.mii_flags = flags | (mii->mii_flags & MIIF_INHERIT_MASK);
173 mii_unlock(mii);
178 .iattr = "mii",
181 /* Link it up in the parent's MII data. */
186 mii_lock(mii);
187 LIST_INSERT_HEAD(&mii->mii_phys, child, mii_list);
189 mii->mii_instance++;
191 mii_lock(mii);
197 mii->mii_flags &= ~MIIF_PROBING;
198 cv_signal(&mii->mii_probe_cv);
199 mii_unlock(mii);
203 mii_detach(struct mii_data *mii, int phyloc, int offloc)
211 mii_lock(mii);
213 if ((mii->mii_flags & MIIF_INITDONE) == 0 ||
214 (mii->mii_flags & MIIF_EXITING) != 0) {
215 mii_unlock(mii);
227 mii->mii_flags |= MIIF_EXITING;
228 cv_broadcast(&mii->mii_probe_cv);
232 mii->mii_probe_waiters++;
238 if (!exiting && (mii->mii_flags & MIIF_EXITING) != 0) {
239 mii->mii_probe_waiters--;
240 cv_signal(&mii->mii_probe_cv);
241 mii_unlock(mii);
244 if ((mii->mii_flags & MIIF_PROBING) == 0 &&
245 (!exiting || (exiting && mii->mii_probe_waiters == 1)))
247 cv_wait(&mii->mii_probe_cv, mii->mii_media.ifm_lock);
249 mii->mii_probe_waiters--;
252 mii->mii_flags |= MIIF_PROBING;
254 LIST_FOREACH_SAFE(child, &mii->mii_phys, mii_list, nchild) {
264 mii_unlock(mii);
266 mii_lock(mii);
270 cv_destroy(&mii->mii_probe_cv);
272 mii->mii_flags &= ~MIIF_PROBING;
273 cv_signal(&mii->mii_probe_cv);
276 mii_unlock(mii);
294 phy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
299 return PHY_SERVICE(sc, mii, cmd);
303 mii_ifmedia_change(struct mii_data *mii)
306 KASSERT(mii_locked(mii) ||
307 ifmedia_islegacy(&mii->mii_media));
308 return ifmedia_change(&mii->mii_media, mii->mii_ifp);
315 mii_mediachg(struct mii_data *mii)
320 IFMEDIA_LOCK_FOR_LEGACY(&mii->mii_media);
321 KASSERT(mii_locked(mii));
323 mii->mii_media_status = 0;
324 mii->mii_media_active = IFM_NONE;
326 LIST_FOREACH(child, &mii->mii_phys, mii_list) {
327 rv = phy_service(child, mii, MII_MEDIACHG);
331 IFMEDIA_UNLOCK_FOR_LEGACY(&mii->mii_media);
339 mii_tick(struct mii_data *mii)
343 IFMEDIA_LOCK_FOR_LEGACY(&mii->mii_media);
344 KASSERT(mii_locked(mii));
346 LIST_FOREACH(child, &mii->mii_phys, mii_list)
347 (void)phy_service(child, mii, MII_TICK);
349 IFMEDIA_UNLOCK_FOR_LEGACY(&mii->mii_media);
356 mii_pollstat(struct mii_data *mii)
360 IFMEDIA_LOCK_FOR_LEGACY(&mii->mii_media);
361 KASSERT(mii_locked(mii));
363 mii->mii_media_status = 0;
364 mii->mii_media_active = IFM_NONE;
366 LIST_FOREACH(child, &mii->mii_phys, mii_list)
367 (void)phy_service(child, mii, MII_POLLSTAT);
369 IFMEDIA_UNLOCK_FOR_LEGACY(&mii->mii_media);
376 mii_down(struct mii_data *mii)
380 IFMEDIA_LOCK_FOR_LEGACY(&mii->mii_media);
381 KASSERT(mii_locked(mii));
383 LIST_FOREACH(child, &mii->mii_phys, mii_list)
384 (void)phy_service(child, mii, MII_DOWN);
386 IFMEDIA_UNLOCK_FOR_LEGACY(&mii->mii_media);