Module Name: src Committed By: ozaki-r Date: Tue Mar 28 04:09:52 UTC 2017
Modified Files: src/sys/dev/pci: if_vioif.c Log Message: Don't write to read-only VIRTIO_NET_S_LINK_UP bit The bit is defined as read-only in the Virtio PCI Card Specification. The fix is inspired by FreeBSD. PR kern/52103 by s-yamaguchi@IIJ To generate a diff of this commit: cvs rdiff -u -r1.32 -r1.33 src/sys/dev/pci/if_vioif.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/pci/if_vioif.c diff -u src/sys/dev/pci/if_vioif.c:1.32 src/sys/dev/pci/if_vioif.c:1.33 --- src/sys/dev/pci/if_vioif.c:1.32 Sat Mar 25 18:02:06 2017 +++ src/sys/dev/pci/if_vioif.c Tue Mar 28 04:09:52 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if_vioif.c,v 1.32 2017/03/25 18:02:06 jdolecek Exp $ */ +/* $NetBSD: if_vioif.c,v 1.33 2017/03/28 04:09:52 ozaki-r Exp $ */ /* * Copyright (c) 2010 Minoura Makoto. @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_vioif.c,v 1.32 2017/03/25 18:02:06 jdolecek Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_vioif.c,v 1.33 2017/03/28 04:09:52 ozaki-r Exp $"); #ifdef _KERNEL_OPT #include "opt_net_mpsafe.h" @@ -269,7 +269,6 @@ static int vioif_tx_vq_done_locked(struc static void vioif_tx_drain(struct vioif_softc *); /* other control */ -static int vioif_updown(struct vioif_softc *, bool); static int vioif_ctrl_rx(struct vioif_softc *, int, bool); static int vioif_set_promisc(struct vioif_softc *, bool); static int vioif_set_allmulti(struct vioif_softc *, bool); @@ -719,9 +718,18 @@ static int vioif_init(struct ifnet *ifp) { struct vioif_softc *sc = ifp->if_softc; + struct virtio_softc *vsc = sc->sc_virtio; vioif_stop(ifp, 0); + virtio_reinit_start(vsc); + virtio_negotiate_features(vsc, virtio_features(vsc)); + virtio_start_vq_intr(vsc, &sc->sc_vq[VQ_RX]); + virtio_stop_vq_intr(vsc, &sc->sc_vq[VQ_TX]); + if (sc->sc_has_ctrl) + virtio_start_vq_intr(vsc, &sc->sc_vq[VQ_CTRL]); + virtio_reinit_end(vsc); + if (!sc->sc_deferred_init_done) { sc->sc_deferred_init_done = 1; if (sc->sc_has_ctrl) @@ -733,7 +741,6 @@ vioif_init(struct ifnet *ifp) vioif_populate_rx_mbufs(sc); - vioif_updown(sc, true); ifp->if_flags |= IFF_RUNNING; ifp->if_flags &= ~IFF_OACTIVE; vioif_rx_filter(sc); @@ -754,6 +761,12 @@ vioif_stop(struct ifnet *ifp, int disabl VIOIF_RX_UNLOCK(sc); VIOIF_TX_UNLOCK(sc); + /* disable interrupts */ + virtio_stop_vq_intr(vsc, &sc->sc_vq[VQ_RX]); + virtio_stop_vq_intr(vsc, &sc->sc_vq[VQ_TX]); + if (sc->sc_has_ctrl) + virtio_stop_vq_intr(vsc, &sc->sc_vq[VQ_CTRL]); + /* only way to stop I/O and DMA is resetting... */ virtio_reset(vsc); vioif_rx_deq(sc); @@ -762,15 +775,6 @@ vioif_stop(struct ifnet *ifp, int disabl if (disable) vioif_rx_drain(sc); - - virtio_reinit_start(vsc); - virtio_negotiate_features(vsc, virtio_features(vsc)); - virtio_start_vq_intr(vsc, &sc->sc_vq[VQ_RX]); - virtio_stop_vq_intr(vsc, &sc->sc_vq[VQ_TX]); - if (sc->sc_has_ctrl) - virtio_start_vq_intr(vsc, &sc->sc_vq[VQ_CTRL]); - virtio_reinit_end(vsc); - vioif_updown(sc, false); } static void @@ -1499,20 +1503,6 @@ set: return r; } -/* change link status */ -static int -vioif_updown(struct vioif_softc *sc, bool isup) -{ - struct virtio_softc *vsc = sc->sc_virtio; - - if (!(virtio_features(vsc) & VIRTIO_NET_F_STATUS)) - return ENODEV; - virtio_write_device_config_1(vsc, - VIRTIO_NET_CONFIG_STATUS, - isup?VIRTIO_NET_S_LINK_UP:0); - return 0; -} - MODULE(MODULE_CLASS_DRIVER, if_vioif, "virtio"); #ifdef _MODULE