Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
/*
 *  ターゲットシステム依存 初期化ルーチン
 */
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();
}
Ejemplo n.º 3
0
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;
}