diff options
-rw-r--r-- | sys/mips/atheros/if_arge.c | 25 | ||||
-rw-r--r-- | sys/mips/atheros/if_argevar.h | 1 |
2 files changed, 21 insertions, 5 deletions
diff --git a/sys/mips/atheros/if_arge.c b/sys/mips/atheros/if_arge.c index 223b5ae..e552320 100644 --- a/sys/mips/atheros/if_arge.c +++ b/sys/mips/atheros/if_arge.c @@ -272,6 +272,7 @@ arge_attach(device_t dev) ifp->if_ioctl = arge_ioctl; ifp->if_start = arge_start; ifp->if_init = arge_init; + sc->arge_if_flags = ifp->if_flags; /* XXX: add real size */ IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN); @@ -900,25 +901,38 @@ arge_ioctl(struct ifnet *ifp, u_long command, caddr_t data) switch (command) { case SIOCSIFFLAGS: - printf("Implement me: SIOCSIFFLAGS\n"); + ARGE_LOCK(sc); + if ((ifp->if_flags & IFF_UP) != 0) { + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) { + if (((ifp->if_flags ^ sc->arge_if_flags) + & (IFF_PROMISC | IFF_ALLMULTI)) != 0) + arge_rx_locked(sc); + } else { + if (!sc->arge_detach) + arge_init_locked(sc); + } + } else if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) { + ifp->if_drv_flags &= ~IFF_DRV_RUNNING; + arge_stop(sc); + } + sc->arge_if_flags = ifp->if_flags; + ARGE_UNLOCK(sc); error = 0; break; case SIOCADDMULTI: case SIOCDELMULTI: - printf("Implement me: SIOCDELMULTI\n"); + /* XXX: implement SIOCDELMULTI */ error = 0; break; case SIOCGIFMEDIA: case SIOCSIFMEDIA: - printf("Implement me: SIOCSIFMEDIA\n"); mii = device_get_softc(sc->arge_miibus); error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, command); break; case SIOCSIFCAP: - printf("Implement me: SIOCSIFCAP\n"); + /* XXX: Check other capabilities */ #ifdef DEVICE_POLLING mask = ifp->if_capenable ^ ifr->ifr_reqcap; - error = 0; if (mask & IFCAP_POLLING) { if (ifr->ifr_reqcap & IFCAP_POLLING) { ARGE_WRITE(sc, AR71XX_DMA_INTR, 0); @@ -936,6 +950,7 @@ arge_ioctl(struct ifnet *ifp, u_long command, caddr_t data) ARGE_UNLOCK(sc); } } + error = 0; break; #endif default: diff --git a/sys/mips/atheros/if_argevar.h b/sys/mips/atheros/if_argevar.h index 1966e61..4e7e40d 100644 --- a/sys/mips/atheros/if_argevar.h +++ b/sys/mips/atheros/if_argevar.h @@ -133,6 +133,7 @@ struct arge_softc { int arge_phy_num; uint32_t arge_ddr_flush_reg; uint32_t arge_pll_reg; + int arge_if_flags; }; #endif /* __IF_ARGEVAR_H__ */ |