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