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); }