Index: if_alc.c =================================================================== RCS file: /cvsroot/src/sys/dev/pci/if_alc.c,v retrieving revision 1.15 diff -u -p -r1.15 if_alc.c --- if_alc.c 8 Sep 2015 08:24:42 -0000 1.15 +++ if_alc.c 23 Nov 2015 18:39:18 -0000 @@ -2034,11 +2034,41 @@ static int alc_ioctl(struct ifnet *ifp, u_long cmd, void *data) { struct alc_softc *sc = ifp->if_softc; + struct mii_data *mii = &sc->sc_miibus; + struct ifreq *ifr = (struct ifreq *)data; int s, error = 0; s = splnet(); - error = ether_ioctl(ifp, cmd, data); + switch (cmd) { + case SIOCSIFADDR: + ifp->if_flags |= IFF_UP; + if (!(ifp->if_flags & IFF_RUNNING)) + alc_init(ifp); + break; + + case SIOCSIFFLAGS: + if (ifp->if_flags & IFF_UP) { + if (ifp->if_flags & IFF_RUNNING) + error = ENETRESET; + else + alc_init(ifp); + } else { + if (ifp->if_flags & IFF_RUNNING) + alc_stop(ifp, 0); + } + break; + + case SIOCSIFMEDIA: + case SIOCGIFMEDIA: + error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, cmd); + break; + + default: + error = ether_ioctl(ifp, cmd, data); + break; + } + if (error == ENETRESET) { if (ifp->if_flags & IFF_RUNNING) alc_iff(sc);