This moves code that is supposed to be in init, but is in stop
right now.  Tested on qemu.  OK?

diff --git sys/dev/pci/if_vio.c sys/dev/pci/if_vio.c
index d8c9798..68e6636 100644
--- sys/dev/pci/if_vio.c
+++ sys/dev/pci/if_vio.c
@@ -662,14 +662,22 @@ vio_media_status(struct ifnet *ifp, struct ifmediareq 
*imr)
  */
 int
 vio_init(struct ifnet *ifp)
 {
        struct vio_softc *sc = ifp->if_softc;
+       struct virtio_softc *vsc = sc->sc_virtio;
 
        vio_stop(ifp, 0);
        if_rxr_init(&sc->sc_rx_ring, 2 * ((ifp->if_hardmtu / MCLBYTES) + 1),
            sc->sc_vq[VQRX].vq_num);
+       virtio_reinit_start(vsc);
+       virtio_negotiate_features(vsc, vsc->sc_features, NULL);
+       virtio_start_vq_intr(vsc, &sc->sc_vq[VQRX]);
+       virtio_stop_vq_intr(vsc, &sc->sc_vq[VQTX]);
+       if (vsc->sc_nvqs >= 3)
+               virtio_start_vq_intr(vsc, &sc->sc_vq[VQCTL]);
+       virtio_reinit_end(vsc);
        vio_populate_rx_mbufs(sc);
        ifp->if_flags |= IFF_RUNNING;
        ifq_clr_oactive(&ifp->if_snd);
        vio_iff(sc);
        vio_link_state(ifp);
@@ -693,17 +701,10 @@ vio_stop(struct ifnet *ifp, int disable)
                vio_ctrleof(&sc->sc_vq[VQCTL]);
        vio_tx_drain(sc);
        if (disable)
                vio_rx_drain(sc);
 
-       virtio_reinit_start(vsc);
-       virtio_negotiate_features(vsc, vsc->sc_features, NULL);
-       virtio_start_vq_intr(vsc, &sc->sc_vq[VQRX]);
-       virtio_stop_vq_intr(vsc, &sc->sc_vq[VQTX]);
-       if (vsc->sc_nvqs >= 3)
-               virtio_start_vq_intr(vsc, &sc->sc_vq[VQCTL]);
-       virtio_reinit_end(vsc);
        if (vsc->sc_nvqs >= 3) {
                if (sc->sc_ctrl_inuse != FREE)
                        sc->sc_ctrl_inuse = RESET;
                wakeup(&sc->sc_ctrl_inuse);
        }

Reply via email to