int smsc_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) { struct smsc_softc *sc = ifp->if_softc; struct ifreq *ifr = (struct ifreq *)data; struct ifaddr *ifa = (struct ifaddr *)data; int s, error = 0; s = splnet(); switch(cmd) { case SIOCSIFADDR: ifp->if_flags |= IFF_UP; if (!(ifp->if_flags & IFF_RUNNING)) smsc_init(sc); #ifdef INET if (ifa->ifa_addr->sa_family == AF_INET) arp_ifinit(&sc->sc_ac, ifa); #endif break; case SIOCSIFFLAGS: if (ifp->if_flags & IFF_UP) { if (ifp->if_flags & IFF_RUNNING) error = ENETRESET; else smsc_init(sc); } else { if (ifp->if_flags & IFF_RUNNING) smsc_stop(sc); } break; case SIOCGIFMEDIA: case SIOCSIFMEDIA: error = ifmedia_ioctl(ifp, ifr, &sc->sc_mii.mii_media, cmd); break; default: error = ether_ioctl(ifp, &sc->sc_ac, cmd, data); } if (error == ENETRESET) { if (ifp->if_flags & IFF_RUNNING) smsc_iff(sc); error = 0; } splx(s); return(error); }
/* * ターゲットシステム依存 初期化ルーチン */ void sys_initialize() { #if defined(MS7709ASE01) || defined(MS7729RSE01) /* Enable IRL Interrupt */ sil_wrh_mem((VP)ICR1, 0x5000); #else /* MS7750SE01 */ sil_wrh_mem((VP)ICR, 0x0000); #endif /* defined(MS7709ASE01) | defined(MS7729RSE01) */ /* * Init Super I/O */ smsc_init(); /* * Init SIO */ fdc37c935a_init(); }
int smsc_ioctl(struct ifnet *ifp, u_long cmd, void *data) { struct smsc_softc *sc = ifp->if_softc; struct ifreq /*const*/ *ifr = data; int s, error = 0; if (sc->sc_dying) return EIO; s = splnet(); switch(cmd) { case SIOCSIFFLAGS: if ((error = ifioctl_common(ifp, cmd, data)) != 0) break; switch (ifp->if_flags & (IFF_UP | IFF_RUNNING)) { case IFF_RUNNING: smsc_stop(ifp, 1); break; case IFF_UP: smsc_init(ifp); break; case IFF_UP | IFF_RUNNING: if (ifp->if_flags & IFF_PROMISC && !(sc->sc_if_flags & IFF_PROMISC)) { sc->sc_mac_csr |= SMSC_MAC_CSR_PRMS; smsc_write_reg(sc, SMSC_MAC_CSR, sc->sc_mac_csr); smsc_setmulti(sc); } else if (!(ifp->if_flags & IFF_PROMISC) && sc->sc_if_flags & IFF_PROMISC) { sc->sc_mac_csr &= ~SMSC_MAC_CSR_PRMS; smsc_write_reg(sc, SMSC_MAC_CSR, sc->sc_mac_csr); smsc_setmulti(sc); } else { smsc_init(ifp); } break; } sc->sc_if_flags = ifp->if_flags; break; case SIOCGIFMEDIA: case SIOCSIFMEDIA: error = ifmedia_ioctl(ifp, ifr, &sc->sc_mii.mii_media, cmd); break; default: if ((error = ether_ioctl(ifp, cmd, data)) != ENETRESET) break; error = 0; if (cmd == SIOCADDMULTI || cmd == SIOCDELMULTI) smsc_setmulti(sc); } splx(s); return error; }