Home | History | Annotate | Line # | Download | only in mii
mii_physubr.c revision 1.17.4.1
      1  1.17.4.1   thorpej /*	$NetBSD: mii_physubr.c,v 1.17.4.1 2000/07/04 04:11:13 thorpej Exp $	*/
      2       1.1   thorpej 
      3       1.1   thorpej /*-
      4      1.15   thorpej  * Copyright (c) 1998, 1999, 2000 The NetBSD Foundation, Inc.
      5       1.1   thorpej  * All rights reserved.
      6       1.1   thorpej  *
      7       1.1   thorpej  * This code is derived from software contributed to The NetBSD Foundation
      8       1.1   thorpej  * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
      9       1.1   thorpej  * NASA Ames Research Center.
     10       1.1   thorpej  *
     11       1.1   thorpej  * Redistribution and use in source and binary forms, with or without
     12       1.1   thorpej  * modification, are permitted provided that the following conditions
     13       1.1   thorpej  * are met:
     14       1.1   thorpej  * 1. Redistributions of source code must retain the above copyright
     15       1.1   thorpej  *    notice, this list of conditions and the following disclaimer.
     16       1.1   thorpej  * 2. Redistributions in binary form must reproduce the above copyright
     17       1.1   thorpej  *    notice, this list of conditions and the following disclaimer in the
     18       1.1   thorpej  *    documentation and/or other materials provided with the distribution.
     19       1.1   thorpej  * 3. All advertising materials mentioning features or use of this software
     20       1.1   thorpej  *    must display the following acknowledgement:
     21       1.1   thorpej  *	This product includes software developed by the NetBSD
     22       1.1   thorpej  *	Foundation, Inc. and its contributors.
     23       1.1   thorpej  * 4. Neither the name of The NetBSD Foundation nor the names of its
     24       1.1   thorpej  *    contributors may be used to endorse or promote products derived
     25       1.1   thorpej  *    from this software without specific prior written permission.
     26       1.1   thorpej  *
     27       1.1   thorpej  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     28       1.1   thorpej  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     29       1.1   thorpej  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     30       1.1   thorpej  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     31       1.1   thorpej  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     32       1.1   thorpej  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     33       1.1   thorpej  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     34       1.1   thorpej  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     35       1.1   thorpej  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     36       1.1   thorpej  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     37       1.1   thorpej  * POSSIBILITY OF SUCH DAMAGE.
     38       1.1   thorpej  */
     39       1.1   thorpej 
     40       1.1   thorpej /*
     41       1.1   thorpej  * Subroutines common to all PHYs.
     42       1.1   thorpej  */
     43       1.1   thorpej 
     44       1.1   thorpej #include <sys/param.h>
     45       1.1   thorpej #include <sys/device.h>
     46       1.1   thorpej #include <sys/systm.h>
     47       1.3   thorpej #include <sys/kernel.h>
     48       1.1   thorpej #include <sys/socket.h>
     49       1.3   thorpej #include <sys/errno.h>
     50       1.1   thorpej 
     51       1.1   thorpej #include <net/if.h>
     52       1.1   thorpej #include <net/if_media.h>
     53      1.15   thorpej #include <net/route.h>
     54       1.1   thorpej 
     55       1.1   thorpej #include <dev/mii/mii.h>
     56       1.1   thorpej #include <dev/mii/miivar.h>
     57       1.1   thorpej 
     58       1.6   thorpej /*
     59       1.6   thorpej  * Media to register setting conversion table.  Order matters.
     60       1.6   thorpej  */
     61       1.6   thorpej const struct mii_media mii_media_table[] = {
     62       1.6   thorpej 	{ BMCR_ISO,		ANAR_CSMA },		/* None */
     63       1.6   thorpej 	{ 0,			ANAR_CSMA|ANAR_10 },	/* 10baseT */
     64       1.6   thorpej 	{ BMCR_FDX,		ANAR_CSMA|ANAR_10_FD },	/* 10baseT-FDX */
     65       1.6   thorpej 	{ BMCR_S100,		ANAR_CSMA|ANAR_T4 },	/* 100baseT4 */
     66       1.6   thorpej 	{ BMCR_S100,		ANAR_CSMA|ANAR_TX },	/* 100baseTX */
     67       1.6   thorpej 	{ BMCR_S100|BMCR_FDX,	ANAR_CSMA|ANAR_TX_FD },	/* 100baseTX-FDX */
     68       1.6   thorpej };
     69       1.6   thorpej 
     70       1.3   thorpej void	mii_phy_auto_timeout __P((void *));
     71       1.3   thorpej 
     72       1.6   thorpej void
     73       1.6   thorpej mii_phy_setmedia(sc)
     74       1.6   thorpej 	struct mii_softc *sc;
     75       1.6   thorpej {
     76       1.6   thorpej 	struct mii_data *mii = sc->mii_pdata;
     77       1.6   thorpej 	struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
     78       1.6   thorpej 	int bmcr, anar;
     79      1.12   thorpej 
     80      1.13   thorpej 	if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) {
     81      1.14   thorpej 		if ((PHY_READ(sc, MII_BMCR) & BMCR_AUTOEN) == 0)
     82      1.14   thorpej 			(void) mii_phy_auto(sc, 1);
     83      1.13   thorpej 		return;
     84      1.13   thorpej 	}
     85       1.6   thorpej 
     86       1.6   thorpej 	/*
     87       1.6   thorpej 	 * Table index is stored in the media entry.
     88       1.6   thorpej 	 */
     89       1.6   thorpej 
     90       1.6   thorpej #ifdef DIAGNOSTIC
     91       1.6   thorpej 	if (ife->ifm_data < 0 || ife->ifm_data >= MII_NMEDIA)
     92       1.6   thorpej 		panic("mii_phy_setmedia");
     93       1.6   thorpej #endif
     94       1.6   thorpej 
     95       1.6   thorpej 	anar = mii_media_table[ife->ifm_data].mm_anar;
     96       1.6   thorpej 	bmcr = mii_media_table[ife->ifm_data].mm_bmcr;
     97       1.6   thorpej 
     98       1.6   thorpej 	if (ife->ifm_media & IFM_LOOP)
     99       1.6   thorpej 		bmcr |= BMCR_LOOP;
    100       1.6   thorpej 
    101       1.6   thorpej 	PHY_WRITE(sc, MII_ANAR, anar);
    102       1.6   thorpej 	PHY_WRITE(sc, MII_BMCR, bmcr);
    103       1.6   thorpej }
    104       1.6   thorpej 
    105       1.1   thorpej int
    106       1.6   thorpej mii_phy_auto(sc, waitfor)
    107       1.6   thorpej 	struct mii_softc *sc;
    108       1.4    kleink 	int waitfor;
    109       1.1   thorpej {
    110       1.1   thorpej 	int bmsr, i;
    111       1.1   thorpej 
    112       1.6   thorpej 	if ((sc->mii_flags & MIIF_DOINGAUTO) == 0) {
    113       1.6   thorpej 		PHY_WRITE(sc, MII_ANAR,
    114       1.6   thorpej 		    BMSR_MEDIA_TO_ANAR(sc->mii_capabilities) | ANAR_CSMA);
    115       1.6   thorpej 		PHY_WRITE(sc, MII_BMCR, BMCR_AUTOEN | BMCR_STARTNEG);
    116       1.3   thorpej 	}
    117       1.3   thorpej 
    118       1.3   thorpej 	if (waitfor) {
    119       1.3   thorpej 		/* Wait 500ms for it to complete. */
    120       1.3   thorpej 		for (i = 0; i < 500; i++) {
    121       1.6   thorpej 			if ((bmsr = PHY_READ(sc, MII_BMSR)) & BMSR_ACOMP)
    122       1.3   thorpej 				return (0);
    123       1.3   thorpej 			delay(1000);
    124       1.3   thorpej 		}
    125       1.3   thorpej 
    126       1.3   thorpej 		/*
    127       1.3   thorpej 		 * Don't need to worry about clearing MIIF_DOINGAUTO.
    128       1.3   thorpej 		 * If that's set, a timeout is pending, and it will
    129       1.3   thorpej 		 * clear the flag.
    130       1.3   thorpej 		 */
    131       1.3   thorpej 		return (EIO);
    132       1.1   thorpej 	}
    133       1.3   thorpej 
    134       1.3   thorpej 	/*
    135       1.3   thorpej 	 * Just let it finish asynchronously.  This is for the benefit of
    136       1.3   thorpej 	 * the tick handler driving autonegotiation.  Don't want 500ms
    137       1.3   thorpej 	 * delays all the time while the system is running!
    138       1.3   thorpej 	 */
    139       1.6   thorpej 	if ((sc->mii_flags & MIIF_DOINGAUTO) == 0) {
    140       1.6   thorpej 		sc->mii_flags |= MIIF_DOINGAUTO;
    141      1.17   thorpej 		callout_reset(&sc->mii_nway_ch, hz >> 1,
    142      1.17   thorpej 		    mii_phy_auto_timeout, sc);
    143       1.3   thorpej 	}
    144       1.3   thorpej 	return (EJUSTRETURN);
    145       1.3   thorpej }
    146       1.3   thorpej 
    147       1.3   thorpej void
    148       1.3   thorpej mii_phy_auto_timeout(arg)
    149       1.3   thorpej 	void *arg;
    150       1.3   thorpej {
    151       1.6   thorpej 	struct mii_softc *sc = arg;
    152       1.3   thorpej 	int s, bmsr;
    153       1.3   thorpej 
    154       1.9   thorpej 	if ((sc->mii_dev.dv_flags & DVF_ACTIVE) == 0)
    155       1.9   thorpej 		return;
    156       1.9   thorpej 
    157       1.3   thorpej 	s = splnet();
    158       1.6   thorpej 	sc->mii_flags &= ~MIIF_DOINGAUTO;
    159       1.6   thorpej 	bmsr = PHY_READ(sc, MII_BMSR);
    160       1.3   thorpej 
    161       1.3   thorpej 	/* Update the media status. */
    162  1.17.4.1   thorpej 	(void) PHY_SERVICE(sc, sc->mii_pdata, MII_POLLSTAT);
    163       1.3   thorpej 	splx(s);
    164       1.2   thorpej }
    165       1.2   thorpej 
    166      1.15   thorpej int
    167      1.15   thorpej mii_phy_tick(sc)
    168      1.15   thorpej 	struct mii_softc *sc;
    169      1.15   thorpej {
    170      1.15   thorpej 	struct mii_data *mii = sc->mii_pdata;
    171      1.15   thorpej 	struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
    172      1.15   thorpej 	int reg;
    173      1.15   thorpej 
    174      1.15   thorpej 	/* Just bail now if the interface is down. */
    175      1.15   thorpej 	if ((mii->mii_ifp->if_flags & IFF_UP) == 0)
    176      1.15   thorpej 		return (EJUSTRETURN);
    177      1.15   thorpej 
    178      1.15   thorpej 	/*
    179      1.15   thorpej 	 * If we're not doing autonegotiation, we don't need to do
    180      1.15   thorpej 	 * any extra work here.  However, we need to check the link
    181      1.15   thorpej 	 * status so we can generate an announcement if the status
    182      1.15   thorpej 	 * changes.
    183      1.15   thorpej 	 */
    184      1.15   thorpej 	if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO)
    185      1.15   thorpej 		return (0);
    186      1.15   thorpej 
    187      1.15   thorpej 	/* Read the status register twice; BMSR_LINK is latch-low. */
    188      1.15   thorpej 	reg = PHY_READ(sc, MII_BMSR) | PHY_READ(sc, MII_BMSR);
    189      1.15   thorpej 	if (reg & BMSR_LINK) {
    190      1.15   thorpej 		/*
    191      1.15   thorpej 		 * See above.
    192      1.15   thorpej 		 */
    193      1.15   thorpej 		return (0);
    194      1.15   thorpej 	}
    195      1.15   thorpej 
    196      1.15   thorpej 	/*
    197      1.15   thorpej 	 * Only retry autonegotiation every 5 seconds.
    198      1.15   thorpej 	 */
    199      1.15   thorpej 	if (++sc->mii_ticks != 5)
    200      1.15   thorpej 		return (EJUSTRETURN);
    201      1.15   thorpej 
    202      1.15   thorpej 	sc->mii_ticks = 0;
    203  1.17.4.1   thorpej 	PHY_RESET(sc);
    204      1.15   thorpej 
    205      1.15   thorpej 	if (mii_phy_auto(sc, 0) == EJUSTRETURN)
    206      1.15   thorpej 		return (EJUSTRETURN);
    207      1.15   thorpej 
    208      1.15   thorpej 	/*
    209      1.15   thorpej 	 * Might need to generate a status message if autonegotiation
    210      1.15   thorpej 	 * failed.
    211      1.15   thorpej 	 */
    212      1.15   thorpej 	return (0);
    213      1.15   thorpej }
    214      1.15   thorpej 
    215       1.2   thorpej void
    216       1.6   thorpej mii_phy_reset(sc)
    217       1.6   thorpej 	struct mii_softc *sc;
    218       1.2   thorpej {
    219       1.2   thorpej 	int reg, i;
    220       1.2   thorpej 
    221       1.6   thorpej 	if (sc->mii_flags & MIIF_NOISOLATE)
    222       1.2   thorpej 		reg = BMCR_RESET;
    223       1.2   thorpej 	else
    224       1.2   thorpej 		reg = BMCR_RESET | BMCR_ISO;
    225       1.6   thorpej 	PHY_WRITE(sc, MII_BMCR, reg);
    226       1.2   thorpej 
    227       1.2   thorpej 	/* Wait 100ms for it to complete. */
    228       1.2   thorpej 	for (i = 0; i < 100; i++) {
    229       1.6   thorpej 		reg = PHY_READ(sc, MII_BMCR);
    230       1.2   thorpej 		if ((reg & BMCR_RESET) == 0)
    231       1.2   thorpej 			break;
    232       1.2   thorpej 		delay(1000);
    233       1.2   thorpej 	}
    234       1.2   thorpej 
    235       1.6   thorpej 	if (sc->mii_inst != 0 && ((sc->mii_flags & MIIF_NOISOLATE) == 0))
    236       1.6   thorpej 		PHY_WRITE(sc, MII_BMCR, reg | BMCR_ISO);
    237       1.8   thorpej }
    238       1.8   thorpej 
    239       1.8   thorpej void
    240       1.8   thorpej mii_phy_down(sc)
    241       1.8   thorpej 	struct mii_softc *sc;
    242       1.8   thorpej {
    243       1.8   thorpej 
    244       1.8   thorpej 	if (sc->mii_flags & MIIF_DOINGAUTO) {
    245       1.8   thorpej 		sc->mii_flags &= ~MIIF_DOINGAUTO;
    246      1.17   thorpej 		callout_stop(&sc->mii_nway_ch);
    247       1.8   thorpej 	}
    248      1.11   thorpej }
    249      1.11   thorpej 
    250      1.11   thorpej void
    251      1.11   thorpej mii_phy_status(sc)
    252      1.11   thorpej 	struct mii_softc *sc;
    253      1.11   thorpej {
    254      1.11   thorpej 
    255  1.17.4.1   thorpej 	PHY_STATUS(sc);
    256      1.15   thorpej }
    257      1.15   thorpej 
    258      1.15   thorpej void
    259      1.15   thorpej mii_phy_update(sc, cmd)
    260      1.15   thorpej 	struct mii_softc *sc;
    261      1.15   thorpej 	int cmd;
    262      1.15   thorpej {
    263      1.15   thorpej 	struct mii_data *mii = sc->mii_pdata;
    264      1.15   thorpej 
    265      1.15   thorpej 	if (sc->mii_media_active != mii->mii_media_active ||
    266      1.15   thorpej 	    sc->mii_media_status != mii->mii_media_status ||
    267      1.15   thorpej 	    cmd == MII_MEDIACHG) {
    268      1.15   thorpej 		(*mii->mii_statchg)(sc->mii_dev.dv_parent);
    269      1.15   thorpej 		mii_phy_statusmsg(sc);
    270      1.15   thorpej 		sc->mii_media_active = mii->mii_media_active;
    271      1.15   thorpej 		sc->mii_media_status = mii->mii_media_status;
    272      1.15   thorpej 	}
    273      1.15   thorpej }
    274      1.15   thorpej 
    275      1.15   thorpej void
    276      1.15   thorpej mii_phy_statusmsg(sc)
    277      1.15   thorpej 	struct mii_softc *sc;
    278      1.15   thorpej {
    279      1.15   thorpej 	struct mii_data *mii = sc->mii_pdata;
    280      1.15   thorpej 	struct ifnet *ifp = mii->mii_ifp;
    281      1.16   thorpej 	int s, baudrate, link_state, announce = 0;
    282      1.15   thorpej 
    283      1.15   thorpej 	if (mii->mii_media_status & IFM_AVALID) {
    284      1.15   thorpej 		if (mii->mii_media_status & IFM_ACTIVE)
    285      1.15   thorpej 			link_state = LINK_STATE_UP;
    286      1.15   thorpej 		else
    287      1.15   thorpej 			link_state = LINK_STATE_DOWN;
    288      1.15   thorpej 	} else
    289      1.15   thorpej 		link_state = LINK_STATE_UNKNOWN;
    290      1.15   thorpej 
    291      1.15   thorpej 	baudrate = ifmedia_baudrate(mii->mii_media_active);
    292      1.15   thorpej 
    293      1.15   thorpej 	if (link_state != ifp->if_link_state) {
    294      1.15   thorpej 		ifp->if_link_state = link_state;
    295      1.16   thorpej 		/*
    296      1.16   thorpej 		 * XXX Right here we'd like to notify protocols
    297      1.16   thorpej 		 * XXX that the link status has changed, so that
    298      1.16   thorpej 		 * XXX e.g. Duplicate Address Detection can restart.
    299      1.16   thorpej 		 */
    300      1.15   thorpej 		announce = 1;
    301      1.15   thorpej 	}
    302      1.15   thorpej 
    303      1.15   thorpej 	if (baudrate != ifp->if_baudrate) {
    304      1.15   thorpej 		ifp->if_baudrate = baudrate;
    305      1.15   thorpej 		announce = 1;
    306      1.15   thorpej 	}
    307      1.15   thorpej 
    308      1.16   thorpej 	if (announce) {
    309      1.16   thorpej 		s = splimp();	/* XXX Should be splnet() */
    310      1.15   thorpej 		rt_ifmsg(ifp);
    311      1.16   thorpej 		splx(s);
    312      1.16   thorpej 	}
    313       1.5  drochner }
    314       1.5  drochner 
    315       1.5  drochner /*
    316       1.5  drochner  * Initialize generic PHY media based on BMSR, called when a PHY is
    317       1.5  drochner  * attached.  We expect to be set up to print a comma-separated list
    318       1.5  drochner  * of media names.  Does not print a newline.
    319       1.5  drochner  */
    320       1.5  drochner void
    321      1.10   thorpej mii_phy_add_media(sc)
    322       1.6   thorpej 	struct mii_softc *sc;
    323       1.5  drochner {
    324       1.6   thorpej 	struct mii_data *mii = sc->mii_pdata;
    325       1.5  drochner 	const char *sep = "";
    326       1.5  drochner 
    327       1.5  drochner #define	ADD(m, c)	ifmedia_add(&mii->mii_media, (m), (c), NULL)
    328       1.5  drochner #define	PRINT(s)	printf("%s%s", sep, s); sep = ", "
    329       1.5  drochner 
    330       1.6   thorpej 	if ((sc->mii_flags & MIIF_NOISOLATE) == 0)
    331       1.6   thorpej 		ADD(IFM_MAKEWORD(IFM_ETHER, IFM_NONE, 0, sc->mii_inst),
    332       1.6   thorpej 		    MII_MEDIA_NONE);
    333       1.6   thorpej 
    334       1.6   thorpej 	if (sc->mii_capabilities & BMSR_10THDX) {
    335       1.6   thorpej 		ADD(IFM_MAKEWORD(IFM_ETHER, IFM_10_T, 0, sc->mii_inst),
    336       1.6   thorpej 		    MII_MEDIA_10_T);
    337       1.7   thorpej #if 0
    338       1.6   thorpej 		if ((sc->mii_flags & MIIF_NOLOOP) == 0)
    339       1.6   thorpej 			ADD(IFM_MAKEWORD(IFM_ETHER, IFM_10_T, IFM_LOOP,
    340       1.6   thorpej 			    sc->mii_inst), MII_MEDIA_10_T);
    341       1.7   thorpej #endif
    342       1.5  drochner 		PRINT("10baseT");
    343       1.5  drochner 	}
    344       1.6   thorpej 	if (sc->mii_capabilities & BMSR_10TFDX) {
    345       1.6   thorpej 		ADD(IFM_MAKEWORD(IFM_ETHER, IFM_10_T, IFM_FDX, sc->mii_inst),
    346       1.6   thorpej 		    MII_MEDIA_10_T_FDX);
    347       1.5  drochner 		PRINT("10baseT-FDX");
    348       1.5  drochner 	}
    349       1.6   thorpej 	if (sc->mii_capabilities & BMSR_100TXHDX) {
    350       1.6   thorpej 		ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_TX, 0, sc->mii_inst),
    351       1.6   thorpej 		    MII_MEDIA_100_TX);
    352       1.7   thorpej #if 0
    353       1.6   thorpej 		if ((sc->mii_flags & MIIF_NOLOOP) == 0)
    354       1.6   thorpej 			ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_TX, IFM_LOOP,
    355       1.6   thorpej 			    sc->mii_inst), MII_MEDIA_100_TX);
    356       1.7   thorpej #endif
    357       1.5  drochner 		PRINT("100baseTX");
    358       1.5  drochner 	}
    359       1.6   thorpej 	if (sc->mii_capabilities & BMSR_100TXFDX) {
    360       1.6   thorpej 		ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_TX, IFM_FDX, sc->mii_inst),
    361       1.6   thorpej 		    MII_MEDIA_100_TX_FDX);
    362       1.5  drochner 		PRINT("100baseTX-FDX");
    363       1.5  drochner 	}
    364       1.6   thorpej 	if (sc->mii_capabilities & BMSR_100T4) {
    365       1.6   thorpej 		ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_T4, 0, sc->mii_inst),
    366       1.6   thorpej 		    MII_MEDIA_100_T4);
    367       1.7   thorpej #if 0
    368       1.6   thorpej 		if ((sc->mii_flags & MIIF_NOLOOP) == 0)
    369       1.6   thorpej 			ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_T4, IFM_LOOP,
    370       1.6   thorpej 			    sc->mii_inst), MII_MEDIA_100_T4);
    371       1.7   thorpej #endif
    372       1.5  drochner 		PRINT("100baseT4");
    373       1.5  drochner 	}
    374       1.6   thorpej 	if (sc->mii_capabilities & BMSR_ANEG) {
    375       1.6   thorpej 		ADD(IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, 0, sc->mii_inst),
    376       1.6   thorpej 		    MII_NMEDIA);	/* intentionally invalid index */
    377       1.5  drochner 		PRINT("auto");
    378       1.5  drochner 	}
    379       1.5  drochner #undef ADD
    380       1.5  drochner #undef PRINT
    381       1.9   thorpej }
    382       1.9   thorpej 
    383       1.9   thorpej void
    384      1.10   thorpej mii_phy_delete_media(sc)
    385       1.9   thorpej 	struct mii_softc *sc;
    386       1.9   thorpej {
    387       1.9   thorpej 	struct mii_data *mii = sc->mii_pdata;
    388       1.9   thorpej 
    389       1.9   thorpej 	ifmedia_delete_instance(&mii->mii_media, sc->mii_inst);
    390       1.9   thorpej }
    391       1.9   thorpej 
    392       1.9   thorpej int
    393      1.10   thorpej mii_phy_activate(self, act)
    394       1.9   thorpej 	struct device *self;
    395       1.9   thorpej 	enum devact act;
    396       1.9   thorpej {
    397       1.9   thorpej 	int rv = 0;
    398       1.9   thorpej 
    399       1.9   thorpej 	switch (act) {
    400       1.9   thorpej 	case DVACT_ACTIVATE:
    401       1.9   thorpej 		rv = EOPNOTSUPP;
    402       1.9   thorpej 		break;
    403       1.9   thorpej 
    404       1.9   thorpej 	case DVACT_DEACTIVATE:
    405       1.9   thorpej 		/* Nothing special to do. */
    406       1.9   thorpej 		break;
    407       1.9   thorpej 	}
    408       1.9   thorpej 
    409       1.9   thorpej 	return (rv);
    410       1.9   thorpej }
    411       1.9   thorpej 
    412       1.9   thorpej int
    413      1.10   thorpej mii_phy_detach(self, flags)
    414       1.9   thorpej 	struct device *self;
    415       1.9   thorpej 	int flags;
    416       1.9   thorpej {
    417       1.9   thorpej 	struct mii_softc *sc = (void *) self;
    418       1.9   thorpej 
    419       1.9   thorpej 	if (sc->mii_flags & MIIF_DOINGAUTO)
    420      1.17   thorpej 		callout_stop(&sc->mii_nway_ch);
    421       1.9   thorpej 
    422      1.10   thorpej 	mii_phy_delete_media(sc);
    423       1.9   thorpej 
    424       1.9   thorpej 	return (0);
    425       1.1   thorpej }
    426