Hi, Here is a small rewrite for consistency in vio_attach() error handling path, also a fix for dmesg message "vlan2: initialized with non-standard mtu 1496 (parent vio0)", while creating vlan
Index: if_vio.c =================================================================== RCS file: /cvs/src/sys/dev/pci/if_vio.c,v retrieving revision 1.3 diff -u -r1.3 if_vio.c --- sys/dev/pci/if_vio.c 31 Oct 2012 00:07:21 -0000 1.3 +++ sys/dev/pci/if_vio.c 6 Nov 2012 05:50:16 -0000 @@ -485,6 +485,7 @@ struct vio_softc *sc = (struct vio_softc *)self; struct virtio_softc *vsc = (struct virtio_softc *)parent; uint32_t features; + int i; struct ifnet *ifp = &sc->sc_ac.ac_if; if (vsc->sc_child != NULL) { @@ -559,7 +560,7 @@ ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; ifp->if_start = vio_start; ifp->if_ioctl = vio_ioctl; - ifp->if_capabilities = 0; + ifp->if_capabilities = IFCAP_VLAN_MTU; IFQ_SET_MAXLEN(&ifp->if_snd, vsc->sc_vqs[1].vq_num - 1); IFQ_SET_READY(&ifp->if_snd); ifmedia_init(&sc->sc_media, 0, vio_media_change, vio_media_status); @@ -575,18 +576,9 @@ return; err: - if (vsc->sc_nvqs == 3) { - virtio_free_vq(vsc, &sc->sc_vq[2]); - vsc->sc_nvqs = 2; - } - if (vsc->sc_nvqs == 2) { - virtio_free_vq(vsc, &sc->sc_vq[1]); - vsc->sc_nvqs = 1; - } - if (vsc->sc_nvqs == 1) { - virtio_free_vq(vsc, &sc->sc_vq[0]); - vsc->sc_nvqs = 0; - } + for (i = 0; i < vsc->sc_nvqs; i++) + virtio_free_vq(vsc, &sc->sc_vq[i]); + vsc->sc_nvqs = 0; vsc->sc_child = VIRTIO_CHILD_ERROR; return; }