Module Name:    src
Committed By:   snj
Date:           Sun Dec 10 10:10:25 UTC 2017

Modified Files:
        src/sys/arch/amiga/dev [netbsd-8]: if_bah_zbus.c
        src/sys/arch/arm/broadcom [netbsd-8]: bcm53xx_eth.c
        src/sys/arch/powerpc/booke/dev [netbsd-8]: pq3etsec.c
        src/sys/arch/usermode/dev [netbsd-8]: if_veth.c
        src/sys/dev/ic [netbsd-8]: an.c athn.c atw.c bwi.c dwc_gmac.c malo.c
            rt2560.c rt2661.c rt2860.c rtw.c rtwvar.h smc90cx6.c smc90cx6var.h
            wi.c
        src/sys/dev/pci [netbsd-8]: if_ipw.c if_iwi.c if_iwm.c if_iwn.c
            if_rtwn.c if_wm.c if_wpi.c
        src/sys/dev/pci/ixgbe [netbsd-8]: ixgbe.c ixv.c
        src/sys/dev/pcmcia [netbsd-8]: if_malo_pcmcia.c
        src/sys/dev/scsipi [netbsd-8]: if_se.c
        src/sys/dev/usb [netbsd-8]: if_upl.c
        src/sys/net [netbsd-8]: if.c if.h if_arc.h if_arcsubr.c if_bridge.c
            if_etherip.c if_faith.c if_gif.c if_loop.c if_mpls.c if_pppoe.c
            if_srt.c if_stf.c if_tap.c if_vlan.c
        src/sys/netinet [netbsd-8]: ip_carp.c
        src/sys/rump/net/lib/libshmif [netbsd-8]: if_shmem.c
        src/sys/rump/net/lib/libvirtif [netbsd-8]: if_virt.c

Log Message:
Pull up following revision(s) (requested by msaitoh in ticket #427):
        sys/arch/amiga/dev/if_bah_zbus.c: 1.17
        sys/arch/arm/broadcom/bcm53xx_eth.c: 1.30
        sys/arch/powerpc/booke/dev/pq3etsec.c: 1.32
        sys/arch/usermode/dev/if_veth.c: 1.9
        sys/dev/ic/an.c: 1.66
        sys/dev/ic/athn.c: 1.17
        sys/dev/ic/atw.c: 1.162
        sys/dev/ic/bwi.c: 1.33
        sys/dev/ic/dwc_gmac.c: 1.41-1.42
        sys/dev/ic/malo.c: 1.10
        sys/dev/ic/rt2560.c: 1.31
        sys/dev/ic/rt2661.c: 1.36
        sys/dev/ic/rt2860.c: 1.29
        sys/dev/ic/rtw.c: 1.127
        sys/dev/ic/rtwvar.h: 1.46
        sys/dev/ic/smc90cx6.c: 1.71
        sys/dev/ic/smc90cx6var.h: 1.12
        sys/dev/ic/wi.c: 1.244
        sys/dev/pci/if_ipw.c: 1.66
        sys/dev/pci/if_iwi.c: 1.104
        sys/dev/pci/if_iwm.c: 1.76
        sys/dev/pci/if_iwn.c: 1.86
        sys/dev/pci/if_rtwn.c: 1.13
        sys/dev/pci/if_wm.c: 1.541
        sys/dev/pci/if_wpi.c: 1.79
        sys/dev/pci/ixgbe/ixgbe.c: 1.106
        sys/dev/pci/ixgbe/ixv.c: 1.73 via patch
        sys/dev/pcmcia/if_malo_pcmcia.c: 1.15
        sys/dev/scsipi/if_se.c: 1.95
        sys/dev/usb/if_upl.c: 1.60
        sys/net/if.c: 1.396
        sys/net/if.h: 1.241
        sys/net/if_arc.h: 1.23
        sys/net/if_arcsubr.c: 1.78
        sys/net/if_bridge.c: 1.136-1.137
        sys/net/if_etherip.c: 1.39
        sys/net/if_faith.c: 1.56
        sys/net/if_gif.c: 1.131
        sys/net/if_loop.c: 1.96
        sys/net/if_mpls.c: 1.30
        sys/net/if_pppoe.c: 1.129
        sys/net/if_srt.c: 1.27
        sys/net/if_stf.c: 1.102
        sys/net/if_tap.c: 1.100
        sys/net/if_vlan.c: 1.105
        sys/netinet/ip_carp.c: 1.91
        sys/rump/net/lib/libshmif/if_shmem.c: 1.73-1.74
        sys/rump/net/lib/libvirtif/if_virt.c: 1.55-1.56
 if_initalize() and if_attach() failed when resource allocation failed
(e.g. allocating softint). Without this change, it panics. It's bad because
resource shortage really occured when a lot of pseudo interface is created.
To avoid this problem, don't panic and change return value of if_initialize()
and if_attach() to int. Caller fanction will be recover from error cleanly by
checking the return value.
 Return if bah_attach_subr() failed.
 If if_attach() failed in the attach function, return.
- If if_initialize() failed in the attach function, free resources and return.
- Add some missing frees in bridge_clone_destroy().
- KNF
 If error occured in bcmeth_ccb_attach(), free resources and return.
 If error occured in pq3etsec_attach(), free resources and return.
 If error occured in the attach function, free resources and return.
- If if_initialize() failed in athn_attach(), free resources and return.
- Add missing pmf_event_deregister() in athn_detach().
- Free resources correctly on some errors in atw_attach().
- Use apint*() insread of printf() in the attach function.
 If if_initialize() failed in the attach function, return.
- If if_initialize() failed in the attach function, free resources and return.
- Add missing dwc_gmac_free_dma_rings() and mutex_destroy() when attach
   failed.
- If if_initialize() failed in the attach function, free resources and return.
- ifp is always not NULL in iwi_detach(). Check correctly with ifp->if_softc.
- If if_initialize() failed in the attach function, free resources and return.
- Fix error path in the attach function correctly.
 If if_initialize() failed in the attach function, free resources and return.
 If if_attach() failed in the attach function, free resources and return.
 - If if_initialize() failed in the attach function, free resources and return.
 - KNF
 - If if_attach() failed in the attach function, free resources and return.
 - KNF
 Fix compile error.
 Fix compile error.
We don't need '&mii', but just 'mii' for mii_detach().
Don't free sc_rthash twice


To generate a diff of this commit:
cvs rdiff -u -r1.16 -r1.16.10.1 src/sys/arch/amiga/dev/if_bah_zbus.c
cvs rdiff -u -r1.29 -r1.29.8.1 src/sys/arch/arm/broadcom/bcm53xx_eth.c
cvs rdiff -u -r1.29.8.1 -r1.29.8.2 src/sys/arch/powerpc/booke/dev/pq3etsec.c
cvs rdiff -u -r1.8 -r1.8.8.1 src/sys/arch/usermode/dev/if_veth.c
cvs rdiff -u -r1.65 -r1.65.2.1 src/sys/dev/ic/an.c
cvs rdiff -u -r1.16 -r1.16.4.1 src/sys/dev/ic/athn.c
cvs rdiff -u -r1.161 -r1.161.6.1 src/sys/dev/ic/atw.c
cvs rdiff -u -r1.31.6.1 -r1.31.6.2 src/sys/dev/ic/bwi.c
cvs rdiff -u -r1.40 -r1.40.6.1 src/sys/dev/ic/dwc_gmac.c
cvs rdiff -u -r1.9 -r1.9.6.1 src/sys/dev/ic/malo.c
cvs rdiff -u -r1.30 -r1.30.2.1 src/sys/dev/ic/rt2560.c
cvs rdiff -u -r1.35 -r1.35.2.1 src/sys/dev/ic/rt2661.c
cvs rdiff -u -r1.26.2.2 -r1.26.2.3 src/sys/dev/ic/rt2860.c
cvs rdiff -u -r1.126 -r1.126.2.1 src/sys/dev/ic/rtw.c
cvs rdiff -u -r1.45 -r1.45.6.1 src/sys/dev/ic/rtwvar.h
cvs rdiff -u -r1.70 -r1.70.2.1 src/sys/dev/ic/smc90cx6.c
cvs rdiff -u -r1.11 -r1.11.30.1 src/sys/dev/ic/smc90cx6var.h
cvs rdiff -u -r1.243 -r1.243.6.1 src/sys/dev/ic/wi.c
cvs rdiff -u -r1.64.2.1 -r1.64.2.2 src/sys/dev/pci/if_ipw.c
cvs rdiff -u -r1.103 -r1.103.2.1 src/sys/dev/pci/if_iwi.c
cvs rdiff -u -r1.73.2.1 -r1.73.2.2 src/sys/dev/pci/if_iwm.c
cvs rdiff -u -r1.84.6.1 -r1.84.6.2 src/sys/dev/pci/if_iwn.c
cvs rdiff -u -r1.12 -r1.12.2.1 src/sys/dev/pci/if_rtwn.c
cvs rdiff -u -r1.508.4.8 -r1.508.4.9 src/sys/dev/pci/if_wm.c
cvs rdiff -u -r1.78 -r1.78.2.1 src/sys/dev/pci/if_wpi.c
cvs rdiff -u -r1.88.2.4 -r1.88.2.5 src/sys/dev/pci/ixgbe/ixgbe.c
cvs rdiff -u -r1.56.2.1 -r1.56.2.2 src/sys/dev/pci/ixgbe/ixv.c
cvs rdiff -u -r1.13.6.1 -r1.13.6.2 src/sys/dev/pcmcia/if_malo_pcmcia.c
cvs rdiff -u -r1.94 -r1.94.8.1 src/sys/dev/scsipi/if_se.c
cvs rdiff -u -r1.59 -r1.59.8.1 src/sys/dev/usb/if_upl.c
cvs rdiff -u -r1.394.2.2 -r1.394.2.3 src/sys/net/if.c
cvs rdiff -u -r1.239.2.1 -r1.239.2.2 src/sys/net/if.h
cvs rdiff -u -r1.22 -r1.22.90.1 src/sys/net/if_arc.h
cvs rdiff -u -r1.77 -r1.77.6.1 src/sys/net/if_arcsubr.c
cvs rdiff -u -r1.134.6.3 -r1.134.6.4 src/sys/net/if_bridge.c
cvs rdiff -u -r1.38 -r1.38.10.1 src/sys/net/if_etherip.c
cvs rdiff -u -r1.55 -r1.55.8.1 src/sys/net/if_faith.c
cvs rdiff -u -r1.126.2.3 -r1.126.2.4 src/sys/net/if_gif.c
cvs rdiff -u -r1.94.6.2 -r1.94.6.3 src/sys/net/if_loop.c
cvs rdiff -u -r1.29 -r1.29.8.1 src/sys/net/if_mpls.c
cvs rdiff -u -r1.125.6.3 -r1.125.6.4 src/sys/net/if_pppoe.c
cvs rdiff -u -r1.26 -r1.26.6.1 src/sys/net/if_srt.c
cvs rdiff -u -r1.101.8.1 -r1.101.8.2 src/sys/net/if_stf.c
cvs rdiff -u -r1.99.6.1 -r1.99.6.2 src/sys/net/if_tap.c
cvs rdiff -u -r1.97.2.9 -r1.97.2.10 src/sys/net/if_vlan.c
cvs rdiff -u -r1.90.2.1 -r1.90.2.2 src/sys/netinet/ip_carp.c
cvs rdiff -u -r1.72 -r1.72.8.1 src/sys/rump/net/lib/libshmif/if_shmem.c
cvs rdiff -u -r1.54 -r1.54.8.1 src/sys/rump/net/lib/libvirtif/if_virt.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/arch/amiga/dev/if_bah_zbus.c
diff -u src/sys/arch/amiga/dev/if_bah_zbus.c:1.16 src/sys/arch/amiga/dev/if_bah_zbus.c:1.16.10.1
--- src/sys/arch/amiga/dev/if_bah_zbus.c:1.16	Fri Oct 30 12:19:08 2015
+++ src/sys/arch/amiga/dev/if_bah_zbus.c	Sun Dec 10 10:10:23 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_bah_zbus.c,v 1.16 2015/10/30 12:19:08 phx Exp $ */
+/*	$NetBSD: if_bah_zbus.c,v 1.16.10.1 2017/12/10 10:10:23 snj Exp $ */
 
 /*-
  * Copyright (c) 1994, 1995, 1998 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
 #endif
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_bah_zbus.c,v 1.16 2015/10/30 12:19:08 phx Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_bah_zbus.c,v 1.16.10.1 2017/12/10 10:10:23 snj Exp $");
 
 /*
  * Driver frontend for the Commodore Busines Machines and the
@@ -98,6 +98,7 @@ bah_zbus_attach(device_t parent, device_
 	struct bah_zbus_softc *bsc = device_private(self);
 	struct bah_softc *sc = &bsc->sc_bah;
 	struct zbus_args *zap = aux;
+	int rv;
 
 	sc->sc_dev = self;
 #if (defined(BAH_DEBUG) && (BAH_DEBUG > 2))
@@ -115,7 +116,11 @@ bah_zbus_attach(device_t parent, device_
 
 	sc->sc_reset = bah_zbus_reset;
 
-	bah_attach_subr(sc);
+	rv = bah_attach_subr(sc);
+	if (rv != 0) {
+		aprint_error_dev(self, "bah_attach_subr failed(%d)\n", rv);
+		return;
+	}
 
 	bsc->sc_isr.isr_intr = bahintr;
 	bsc->sc_isr.isr_arg = sc;

Index: src/sys/arch/arm/broadcom/bcm53xx_eth.c
diff -u src/sys/arch/arm/broadcom/bcm53xx_eth.c:1.29 src/sys/arch/arm/broadcom/bcm53xx_eth.c:1.29.8.1
--- src/sys/arch/arm/broadcom/bcm53xx_eth.c:1.29	Thu Dec 15 09:28:02 2016
+++ src/sys/arch/arm/broadcom/bcm53xx_eth.c	Sun Dec 10 10:10:23 2017
@@ -35,7 +35,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(1, "$NetBSD: bcm53xx_eth.c,v 1.29 2016/12/15 09:28:02 ozaki-r Exp $");
+__KERNEL_RCSID(1, "$NetBSD: bcm53xx_eth.c,v 1.29.8.1 2017/12/10 10:10:23 snj Exp $");
 
 #include <sys/param.h>
 #include <sys/atomic.h>
@@ -321,45 +321,52 @@ bcmeth_ccb_attach(device_t parent, devic
 	error = bcmeth_rxq_attach(sc, &sc->sc_rxq, 0);
 	if (error) {
 		aprint_error(": failed to init rxq: %d\n", error);
-		return;
+		goto fail_1;
 	}
 
 	error = bcmeth_txq_attach(sc, &sc->sc_txq, 0);
 	if (error) {
 		aprint_error(": failed to init txq: %d\n", error);
-		return;
+		goto fail_1;
 	}
 
 	error = bcmeth_mapcache_create(sc, &sc->sc_rx_mapcache, 
 	    BCMETH_MAXRXMBUFS, MCLBYTES, BCMETH_NRXSEGS);
 	if (error) {
 		aprint_error(": failed to allocate rx dmamaps: %d\n", error);
-		return;
+		goto fail_1;
 	}
 
 	error = bcmeth_mapcache_create(sc, &sc->sc_tx_mapcache, 
 	    BCMETH_MAXTXMBUFS, MCLBYTES, BCMETH_NTXSEGS);
 	if (error) {
 		aprint_error(": failed to allocate tx dmamaps: %d\n", error);
-		return;
+		goto fail_1;
 	}
 
 	error = workqueue_create(&sc->sc_workq, xname, bcmeth_worker, sc,
 	    (PRI_USER + MAXPRI_USER) / 2, IPL_NET, WQ_MPSAFE|WQ_PERCPU);
 	if (error) {
 		aprint_error(": failed to create workqueue: %d\n", error);
-		return;
+		goto fail_2;
 	}
 
 	sc->sc_soft_ih = softint_establish(SOFTINT_MPSAFE | SOFTINT_NET,
 	    bcmeth_soft_intr, sc);
 
+	if (sc->sc_ih == NULL) {
+		aprint_error_dev(self, "failed to establish interrupt %d\n",
+		     loc->loc_intrs[0]);
+		goto fail_3;
+	}
+
 	sc->sc_ih = intr_establish(loc->loc_intrs[0], IPL_VM, IST_LEVEL,
 	    bcmeth_intr, sc);
 
 	if (sc->sc_ih == NULL) {
 		aprint_error_dev(self, "failed to establish interrupt %d\n",
 		     loc->loc_intrs[0]);
+		goto fail_4;
 	} else {
 		aprint_normal_dev(self, "interrupting on irq %d\n",
 		     loc->loc_intrs[0]);
@@ -401,7 +408,12 @@ bcmeth_ccb_attach(device_t parent, devic
 	/*
 	 * Attach the interface.
 	 */
-	if_initialize(ifp);
+	error = if_initialize(ifp);
+	if (error != 0) {
+		aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n",
+		    error);
+		goto fail_5;
+	}
 	ether_ifattach(ifp, sc->sc_enaddr);
 	if_register(ifp);
 
@@ -419,6 +431,20 @@ bcmeth_ccb_attach(device_t parent, devic
 	evcnt_attach_dynamic(&sc->sc_ev_rx_badmagic_hi, EVCNT_TYPE_MISC,
 	    NULL, xname, "rx badmagic hi");
 #endif
+
+	return;
+
+fail_5:
+	ifmedia_removeall(&sc->sc_media);
+fail_4:
+	intr_disestablish(sc->sc_ih);
+fail_3:
+	softint_disestablish(sc->sc_soft_ih);
+fail_2:	
+	workqueue_destroy(sc->sc_workq);
+fail_1:	
+	mutex_obj_free(sc->sc_lock);
+	mutex_obj_free(sc->sc_hwlock);
 }
 
 static int

Index: src/sys/arch/powerpc/booke/dev/pq3etsec.c
diff -u src/sys/arch/powerpc/booke/dev/pq3etsec.c:1.29.8.1 src/sys/arch/powerpc/booke/dev/pq3etsec.c:1.29.8.2
--- src/sys/arch/powerpc/booke/dev/pq3etsec.c:1.29.8.1	Tue Oct 24 08:38:58 2017
+++ src/sys/arch/powerpc/booke/dev/pq3etsec.c	Sun Dec 10 10:10:23 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: pq3etsec.c,v 1.29.8.1 2017/10/24 08:38:58 snj Exp $	*/
+/*	$NetBSD: pq3etsec.c,v 1.29.8.2 2017/12/10 10:10:23 snj Exp $	*/
 /*-
  * Copyright (c) 2010, 2011 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -41,7 +41,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(0, "$NetBSD: pq3etsec.c,v 1.29.8.1 2017/10/24 08:38:58 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pq3etsec.c,v 1.29.8.2 2017/12/10 10:10:23 snj Exp $");
 
 #include <sys/param.h>
 #include <sys/cpu.h>
@@ -648,27 +648,27 @@ pq3etsec_attach(device_t parent, device_
 	error = pq3etsec_rxq_attach(sc, &sc->sc_rxq, 0);
 	if (error) {
 		aprint_error(": failed to init rxq: %d\n", error);
-		return;
+		goto fail_1;
 	}
 
 	error = pq3etsec_txq_attach(sc, &sc->sc_txq, 0);
 	if (error) {
 		aprint_error(": failed to init txq: %d\n", error);
-		return;
+		goto fail_2;
 	}
 
 	error = pq3etsec_mapcache_create(sc, &sc->sc_rx_mapcache, 
 	    ETSEC_MAXRXMBUFS, MCLBYTES, ETSEC_NRXSEGS);
 	if (error) {
 		aprint_error(": failed to allocate rx dmamaps: %d\n", error);
-		return;
+		goto fail_3;
 	}
 
 	error = pq3etsec_mapcache_create(sc, &sc->sc_tx_mapcache, 
 	    ETSEC_MAXTXMBUFS, MCLBYTES, ETSEC_NTXSEGS);
 	if (error) {
 		aprint_error(": failed to allocate tx dmamaps: %d\n", error);
-		return;
+		goto fail_4;
 	}
 
 	sc->sc_tx_ih = intr_establish(cnl->cnl_intrs[0], IPL_VM, IST_ONCHIP,
@@ -676,7 +676,7 @@ pq3etsec_attach(device_t parent, device_
 	if (sc->sc_tx_ih == NULL) {
 		aprint_error(": failed to establish tx interrupt: %d\n",
 		    cnl->cnl_intrs[0]);
-		return;
+		goto fail_5;
 	}
 
 	sc->sc_rx_ih = intr_establish(cnl->cnl_intrs[1], IPL_VM, IST_ONCHIP,
@@ -684,7 +684,7 @@ pq3etsec_attach(device_t parent, device_
 	if (sc->sc_rx_ih == NULL) {
 		aprint_error(": failed to establish rx interrupt: %d\n",
 		    cnl->cnl_intrs[1]);
-		return;
+		goto fail_6;
 	}
 
 	sc->sc_error_ih = intr_establish(cnl->cnl_intrs[2], IPL_VM, IST_ONCHIP,
@@ -692,7 +692,7 @@ pq3etsec_attach(device_t parent, device_
 	if (sc->sc_error_ih == NULL) {
 		aprint_error(": failed to establish error interrupt: %d\n",
 		    cnl->cnl_intrs[2]);
-		return;
+		goto fail_7;
 	}
 
 	int softint_flags = SOFTINT_NET;
@@ -703,7 +703,7 @@ pq3etsec_attach(device_t parent, device_
 	    pq3etsec_soft_intr, sc);
 	if (sc->sc_soft_ih == NULL) {
 		aprint_error(": failed to establish soft interrupt\n");
-		return;
+		goto fail_8;
 	}
 
 	/*
@@ -719,7 +719,7 @@ pq3etsec_attach(device_t parent, device_
 		sc->sc_mdio_dev = device_find_by_driver_unit("mdio", mdio);
 		if (sc->sc_mdio_dev == NULL) {
 			aprint_error(": failed to locate mdio device\n");
-			return;
+			goto fail_9;
 		}
 		aprint_normal("\n");
 	}
@@ -734,7 +734,6 @@ pq3etsec_attach(device_t parent, device_
 	sc->sc_ic_tx_count = 16;
 	pq3etsec_set_ic_rx(sc);
 	pq3etsec_set_ic_tx(sc);
-	pq3etsec_sysctl_setup(NULL, sc);
 
 	char enaddr[ETHER_ADDR_LEN] = {
 	    [0] = sc->sc_macstnaddr2 >> 16,
@@ -794,7 +793,13 @@ pq3etsec_attach(device_t parent, device_
 	/*
 	 * Attach the interface.
 	 */
-	if_initialize(ifp);
+	error = if_initialize(ifp);
+	if (error != 0) {
+		aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n",
+		    error);
+		goto fail_10;
+	}
+	pq3etsec_sysctl_setup(NULL, sc);
 	ether_ifattach(ifp, enaddr);
 	if_register(ifp);
 
@@ -818,6 +823,36 @@ pq3etsec_attach(device_t parent, device_
 	    NULL, xname, "rx pause");
 	evcnt_attach_dynamic(&sc->sc_ev_mii_ticks, EVCNT_TYPE_MISC,
 	    NULL, xname, "mii ticks");
+	return;
+
+fail_10:
+	ifmedia_removeall(&sc->sc_mii.mii_media);
+	mii_detach(&sc->sc_mii, sc->sc_phy_addr, MII_OFFSET_ANY);
+fail_9:
+	softint_disestablish(sc->sc_soft_ih);
+fail_8:
+	intr_disestablish(sc->sc_error_ih);
+fail_7:
+	intr_disestablish(sc->sc_rx_ih);
+fail_6:
+	intr_disestablish(sc->sc_tx_ih);
+fail_5:
+	pq3etsec_mapcache_destroy(sc, sc->sc_tx_mapcache);
+fail_4:
+	pq3etsec_mapcache_destroy(sc, sc->sc_rx_mapcache);
+fail_3:
+#if 0 /* notyet */
+	pq3etsec_txq_detach(sc);
+#endif
+fail_2:
+#if 0 /* notyet */
+	pq3etsec_rxq_detach(sc);
+#endif
+fail_1:
+	callout_destroy(&sc->sc_mii_callout);
+	mutex_obj_free(sc->sc_lock);
+	mutex_obj_free(sc->sc_hwlock);
+	bus_space_unmap(sc->sc_bst, sc->sc_bsh, cnl->cnl_size);
 }
 
 static uint64_t

Index: src/sys/arch/usermode/dev/if_veth.c
diff -u src/sys/arch/usermode/dev/if_veth.c:1.8 src/sys/arch/usermode/dev/if_veth.c:1.8.8.1
--- src/sys/arch/usermode/dev/if_veth.c:1.8	Thu Dec 15 09:28:04 2016
+++ src/sys/arch/usermode/dev/if_veth.c	Sun Dec 10 10:10:23 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: if_veth.c,v 1.8 2016/12/15 09:28:04 ozaki-r Exp $ */
+/* $NetBSD: if_veth.c,v 1.8.8.1 2017/12/10 10:10:23 snj Exp $ */
 
 /*-
  * Copyright (c) 2011 Jared D. McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_veth.c,v 1.8 2016/12/15 09:28:04 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_veth.c,v 1.8.8.1 2017/12/10 10:10:23 snj Exp $");
 
 #include <sys/param.h>
 #include <sys/proc.h>
@@ -102,6 +102,7 @@ veth_attach(device_t parent, device_t se
 	struct veth_softc *sc = device_private(self);
 	struct thunkbus_attach_args *taa = opaque;
 	struct ifnet *ifp = &sc->sc_ec.ec_if;
+	int rv;
 
 	sc->sc_dev = self;
 
@@ -137,7 +138,13 @@ veth_attach(device_t parent, device_t se
 	IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN);
 	IFQ_SET_READY(&ifq->if_snd);
 
-	if_initialize(ifp);
+	rv = if_initialize(ifp);
+	if (rv != 0) {
+		aprint_error_dev(self, "if_initialize failed(%d)\n", rv);
+		thunk_close(sc->sc_tapfd);
+		pmf_device_deregister(self);
+		return; /* Error */
+	}
 	ether_ifattach(ifp, sc->sc_eaddr);
 	if_register(ifp);
 

Index: src/sys/dev/ic/an.c
diff -u src/sys/dev/ic/an.c:1.65 src/sys/dev/ic/an.c:1.65.2.1
--- src/sys/dev/ic/an.c:1.65	Tue May 23 02:19:14 2017
+++ src/sys/dev/ic/an.c	Sun Dec 10 10:10:23 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: an.c,v 1.65 2017/05/23 02:19:14 ozaki-r Exp $	*/
+/*	$NetBSD: an.c,v 1.65.2.1 2017/12/10 10:10:23 snj Exp $	*/
 /*
  * Copyright (c) 1997, 1998, 1999
  *	Bill Paul <wp...@ctr.columbia.edu>.  All rights reserved.
@@ -77,7 +77,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: an.c,v 1.65 2017/05/23 02:19:14 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: an.c,v 1.65.2.1 2017/12/10 10:10:23 snj Exp $");
 
 
 #include <sys/param.h>
@@ -166,7 +166,7 @@ an_attach(struct an_softc *sc)
 {
 	struct ieee80211com *ic = &sc->sc_ic;
 	struct ifnet *ifp = &sc->sc_if;
-	int i, s;
+	int i, s, rv = 0;
 	struct an_rid_wepkey *akey;
 	int buflen, kid, rid;
 	int chan, chan_min, chan_max;
@@ -176,38 +176,38 @@ an_attach(struct an_softc *sc)
 	an_wait(sc);
 	if (an_reset(sc) != 0) {
 		config_deactivate(sc->sc_dev);
-		splx(s);
-		return 1;
+		rv = 1;
+		goto fail_1;
 	}
 
 	sc->sc_soft_ih = softint_establish(SOFTINT_NET, an_softintr, sc);
 	if (sc->sc_soft_ih == NULL) {
-		splx(s);
 		aprint_error_dev(sc->sc_dev, "failed to establish softint\n");
-		return 1;
+		rv = 1;
+		goto fail_1;
 	}
 
 	/* Load factory config */
 	if (an_cmd(sc, AN_CMD_READCFG, 0) != 0) {
-		splx(s);
 		aprint_error_dev(sc->sc_dev, "failed to load config data\n");
-		return 1;
+		rv = 1;
+		goto fail_2;
 	}
 
 	/* Read the current configuration */
 	buflen = sizeof(sc->sc_config);
 	if (an_read_rid(sc, AN_RID_GENCONFIG, &sc->sc_config, &buflen) != 0) {
-		splx(s);
 		aprint_error_dev(sc->sc_dev, "read config failed\n");
-		return 1;
+		rv = 1;
+		goto fail_2;
 	}
 
 	/* Read the card capabilities */
 	buflen = sizeof(sc->sc_caps);
 	if (an_read_rid(sc, AN_RID_CAPABILITIES, &sc->sc_caps, &buflen) != 0) {
-		splx(s);
 		aprint_error_dev(sc->sc_dev, "read caps failed\n");
-		return 1;
+		rv = 1;
+		goto fail_2;
 	}
 
 #ifdef AN_DEBUG
@@ -317,7 +317,11 @@ an_attach(struct an_softc *sc)
 	/*
 	 * Call MI attach routine.
 	 */
-	if_initialize(ifp);
+	rv = if_initialize(ifp);
+	if (rv != 0) {
+		aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n", rv);
+		goto fail_2;
+	}
 	ieee80211_ifattach(ic);
 	ifp->if_percpuq = if_percpuq_create(ifp);
 	if_register(ifp);
@@ -346,6 +350,14 @@ an_attach(struct an_softc *sc)
 
 	ieee80211_announce(ic);
 	return 0;
+
+fail_2:
+	if (sc->sc_soft_ih != NULL)
+		softint_disestablish(sc->sc_soft_ih);
+fail_1:
+	splx(s);
+
+	return rv;
 }
 
 #ifdef AN_DEBUG

Index: src/sys/dev/ic/athn.c
diff -u src/sys/dev/ic/athn.c:1.16 src/sys/dev/ic/athn.c:1.16.4.1
--- src/sys/dev/ic/athn.c:1.16	Tue Apr 11 17:27:54 2017
+++ src/sys/dev/ic/athn.c	Sun Dec 10 10:10:23 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: athn.c,v 1.16 2017/04/11 17:27:54 jmcneill Exp $	*/
+/*	$NetBSD: athn.c,v 1.16.4.1 2017/12/10 10:10:23 snj Exp $	*/
 /*	$OpenBSD: athn.c,v 1.83 2014/07/22 13:12:11 mpi Exp $	*/
 
 /*-
@@ -23,7 +23,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: athn.c,v 1.16 2017/04/11 17:27:54 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: athn.c,v 1.16.4.1 2017/12/10 10:10:23 snj Exp $");
 
 #ifndef _MODULE
 #include "athn_usb.h"		/* for NATHN_USB */
@@ -349,7 +349,16 @@ athn_attach(struct athn_softc *sc)
 	IFQ_SET_READY(&ifp->if_snd);
 	memcpy(ifp->if_xname, device_xname(sc->sc_dev), IFNAMSIZ);
 
-	if_initialize(ifp);
+	error = if_initialize(ifp);
+	if (error != 0) {
+		aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n",
+		    error);
+		pmf_event_deregister(sc->sc_dev, PMFE_RADIO_OFF,
+		    athn_pmf_wlan_off, false);
+		callout_destroy(&sc->sc_scan_to);
+		callout_destroy(&sc->sc_calib_to);
+		return error;
+	}
 	ieee80211_ifattach(ic);
 	/* Use common softint-based if_input */
 	ifp->if_percpuq = if_percpuq_create(ifp);
@@ -412,6 +421,9 @@ athn_detach(struct athn_softc *sc)
 
 	callout_destroy(&sc->sc_scan_to);
 	callout_destroy(&sc->sc_calib_to);
+
+	pmf_event_deregister(sc->sc_dev, PMFE_RADIO_OFF, athn_pmf_wlan_off,
+	    false);
 }
 
 /*

Index: src/sys/dev/ic/atw.c
diff -u src/sys/dev/ic/atw.c:1.161 src/sys/dev/ic/atw.c:1.161.6.1
--- src/sys/dev/ic/atw.c:1.161	Thu Feb  2 10:05:35 2017
+++ src/sys/dev/ic/atw.c	Sun Dec 10 10:10:23 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: atw.c,v 1.161 2017/02/02 10:05:35 nonaka Exp $  */
+/*	$NetBSD: atw.c,v 1.161.6.1 2017/12/10 10:10:23 snj Exp $  */
 
 /*-
  * Copyright (c) 1998, 1999, 2000, 2002, 2003, 2004 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: atw.c,v 1.161 2017/02/02 10:05:35 nonaka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: atw.c,v 1.161.6.1 2017/12/10 10:10:23 snj Exp $");
 
 
 #include <sys/param.h>
@@ -621,7 +621,7 @@ atw_attach(struct atw_softc *sc)
 	atw_reset(sc);
 
 	if (atw_read_srom(sc) == -1)
-		return;
+		goto fail_5;
 
 	sc->sc_rftype = __SHIFTOUT(sc->sc_srom[ATW_SR_CSR20],
 	    ATW_SR_RFTYPE_MASK);
@@ -631,14 +631,14 @@ atw_attach(struct atw_softc *sc)
 
 	if (sc->sc_rftype >= __arraycount(type_strings)) {
 		aprint_error_dev(sc->sc_dev, "unknown RF\n");
-		return;
+		goto fail_5;
 	}
 	if (sc->sc_bbptype >= __arraycount(type_strings)) {
 		aprint_error_dev(sc->sc_dev, "unknown BBP\n");
-		return;
+		goto fail_5;
 	}
 
-	printf("%s: %s RF, %s BBP", device_xname(sc->sc_dev),
+	aprint_normal_dev(sc->sc_dev, "%s RF, %s BBP",
 	    type_strings[sc->sc_rftype], type_strings[sc->sc_bbptype]);
 
 	/* XXX There exists a Linux driver which seems to use RFType = 0 for
@@ -674,8 +674,8 @@ atw_attach(struct atw_softc *sc)
 	case ATW_BBPTYPE_MARVEL:
 		break;
 	case ATW_C_BBPTYPE_RFMD:
-		printf("%s: ADM8211C MAC/RFMD BBP not supported yet.\n",
-		    device_xname(sc->sc_dev));
+		aprint_error_dev(sc->sc_dev,
+		    "ADM8211C MAC/RFMD BBP not supported yet.\n");
 		break;
 	}
 
@@ -757,11 +757,12 @@ atw_attach(struct atw_softc *sc)
 	ic->ic_myaddr[5] = __SHIFTOUT(reg, ATW_PAR1_PAB5_MASK);
 
 	if (IEEE80211_ADDR_EQ(ic->ic_myaddr, empty_macaddr)) {
-		printf(" could not get mac address, attach failed\n");
-		return;
+		aprint_error_dev(sc->sc_dev,
+		    "could not get mac address, attach failed\n");
+		goto fail_5;
 	}
 
-	printf(" 802.11 address %s\n", ether_sprintf(ic->ic_myaddr));
+	aprint_normal(" 802.11 address %s\n", ether_sprintf(ic->ic_myaddr));
 
 	memcpy(ifp->if_xname, device_xname(sc->sc_dev), IFNAMSIZ);
 	ifp->if_softc = sc;
@@ -791,7 +792,12 @@ atw_attach(struct atw_softc *sc)
 	 * Call MI attach routines.
 	 */
 
-	if_initialize(ifp);
+	error = if_initialize(ifp);
+	if (error != 0) {
+		aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n",
+		    error);
+		goto fail_5;
+	}
 	ieee80211_ifattach(ic);
 	/* Use common softint-based if_input */
 	ifp->if_percpuq = if_percpuq_create(ifp);

Index: src/sys/dev/ic/bwi.c
diff -u src/sys/dev/ic/bwi.c:1.31.6.1 src/sys/dev/ic/bwi.c:1.31.6.2
--- src/sys/dev/ic/bwi.c:1.31.6.1	Sat Aug  5 05:06:48 2017
+++ src/sys/dev/ic/bwi.c	Sun Dec 10 10:10:23 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: bwi.c,v 1.31.6.1 2017/08/05 05:06:48 snj Exp $	*/
+/*	$NetBSD: bwi.c,v 1.31.6.2 2017/12/10 10:10:23 snj Exp $	*/
 /*	$OpenBSD: bwi.c,v 1.74 2008/02/25 21:13:30 mglocker Exp $	*/
 
 /*
@@ -48,7 +48,7 @@
 
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: bwi.c,v 1.31.6.1 2017/08/05 05:06:48 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bwi.c,v 1.31.6.2 2017/12/10 10:10:23 snj Exp $");
 
 #include <sys/param.h>
 #include <sys/callout.h>
@@ -1021,7 +1021,12 @@ bwi_attach(struct bwi_softc *sc)
 
 	ic->ic_updateslot = bwi_updateslot;
 
-	if_initialize(ifp);
+	error = if_initialize(ifp);
+	if (error != 0) {
+		aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n",
+		    error);
+		goto fail;
+	}
 	ieee80211_ifattach(ic);
 	ifp->if_percpuq = if_percpuq_create(ifp);
 	if_register(ifp);

Index: src/sys/dev/ic/dwc_gmac.c
diff -u src/sys/dev/ic/dwc_gmac.c:1.40 src/sys/dev/ic/dwc_gmac.c:1.40.6.1
--- src/sys/dev/ic/dwc_gmac.c:1.40	Mon Feb 20 07:43:29 2017
+++ src/sys/dev/ic/dwc_gmac.c	Sun Dec 10 10:10:23 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: dwc_gmac.c,v 1.40 2017/02/20 07:43:29 ozaki-r Exp $ */
+/* $NetBSD: dwc_gmac.c,v 1.40.6.1 2017/12/10 10:10:23 snj Exp $ */
 
 /*-
  * Copyright (c) 2013, 2014 The NetBSD Foundation, Inc.
@@ -41,7 +41,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(1, "$NetBSD: dwc_gmac.c,v 1.40 2017/02/20 07:43:29 ozaki-r Exp $");
+__KERNEL_RCSID(1, "$NetBSD: dwc_gmac.c,v 1.40.6.1 2017/12/10 10:10:23 snj Exp $");
 
 /* #define	DWC_GMAC_DEBUG	1 */
 
@@ -146,6 +146,7 @@ dwc_gmac_attach(struct dwc_gmac_softc *s
 	struct mii_data * const mii = &sc->sc_mii;
 	struct ifnet * const ifp = &sc->sc_ec.ec_if;
 	prop_dictionary_t dict;
+	int rv;
 
 	mutex_init(&sc->sc_mdio_lock, MUTEX_DEFAULT, IPL_NET);
 	sc->sc_mii_clk = mii_clk & 7;
@@ -259,7 +260,9 @@ dwc_gmac_attach(struct dwc_gmac_softc *s
 	 * Ready, attach interface
 	 */
 	/* Attach the interface. */
-	if_initialize(ifp);
+	rv = if_initialize(ifp);
+	if (rv != 0)
+		goto fail_2;
 	sc->sc_ipq = if_percpuq_create(&sc->sc_ec.ec_if);
 	if_deferred_start_init(ifp, NULL);
 	ether_ifattach(ifp, enaddr);
@@ -277,10 +280,17 @@ dwc_gmac_attach(struct dwc_gmac_softc *s
 	mutex_exit(sc->sc_lock);
 
 	return;
-
+fail_2:
+	ifmedia_removeall(&mii->mii_media);
+	mii_detach(mii, MII_PHY_ANY, MII_OFFSET_ANY);
+	mutex_destroy(&sc->sc_txq.t_mtx);
+	mutex_destroy(&sc->sc_rxq.r_mtx);
+	mutex_obj_free(sc->sc_lock);
 fail:
 	dwc_gmac_free_rx_ring(sc, &sc->sc_rxq);
 	dwc_gmac_free_tx_ring(sc, &sc->sc_txq);
+	dwc_gmac_free_dma_rings(sc);
+	mutex_destroy(&sc->sc_mdio_lock);
 }
 
 

Index: src/sys/dev/ic/malo.c
diff -u src/sys/dev/ic/malo.c:1.9 src/sys/dev/ic/malo.c:1.9.6.1
--- src/sys/dev/ic/malo.c:1.9	Thu Feb  2 10:05:35 2017
+++ src/sys/dev/ic/malo.c	Sun Dec 10 10:10:23 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: malo.c,v 1.9 2017/02/02 10:05:35 nonaka Exp $ */
+/*	$NetBSD: malo.c,v 1.9.6.1 2017/12/10 10:10:23 snj Exp $ */
 /*	$OpenBSD: malo.c,v 1.92 2010/08/27 17:08:00 jsg Exp $ */
 
 /*
@@ -19,7 +19,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: malo.c,v 1.9 2017/02/02 10:05:35 nonaka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: malo.c,v 1.9.6.1 2017/12/10 10:10:23 snj Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
@@ -366,7 +366,7 @@ malo_attach(struct malo_softc *sc)
 {
 	struct ieee80211com *ic = &sc->sc_ic;
 	struct ifnet *ifp = &sc->sc_if;
-	int i;
+	int i, rv;
 
 	/* initialize channel scanning timer */
 	callout_init(&sc->sc_scan_to, 0);
@@ -422,7 +422,16 @@ malo_attach(struct malo_softc *sc)
 	aprint_normal(", address %s\n", ether_sprintf(ic->ic_myaddr));
 
 	/* attach interface */
-	if_initialize(ifp);
+	rv = if_initialize(ifp);
+	if (rv != 0) {
+		aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n", rv);
+		malo_free_tx_ring(sc, &sc->sc_txring);
+		malo_free_rx_ring(sc, &sc->sc_rxring);
+		malo_free_cmd(sc);
+		callout_destroy(&sc->sc_scan_to);
+
+		return rv; /* Error */
+	}
 	ieee80211_ifattach(ic);
 	/* Use common softint-based if_input */
 	ifp->if_percpuq = if_percpuq_create(ifp);

Index: src/sys/dev/ic/rt2560.c
diff -u src/sys/dev/ic/rt2560.c:1.30 src/sys/dev/ic/rt2560.c:1.30.2.1
--- src/sys/dev/ic/rt2560.c:1.30	Tue May 23 02:19:14 2017
+++ src/sys/dev/ic/rt2560.c	Sun Dec 10 10:10:23 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: rt2560.c,v 1.30 2017/05/23 02:19:14 ozaki-r Exp $	*/
+/*	$NetBSD: rt2560.c,v 1.30.2.1 2017/12/10 10:10:23 snj Exp $	*/
 /*	$OpenBSD: rt2560.c,v 1.15 2006/04/20 20:31:12 miod Exp $  */
 /*	$FreeBSD: rt2560.c,v 1.3 2006/03/21 21:15:43 damien Exp $*/
 
@@ -24,7 +24,7 @@
  * http://www.ralinktech.com/
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rt2560.c,v 1.30 2017/05/23 02:19:14 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rt2560.c,v 1.30.2.1 2017/12/10 10:10:23 snj Exp $");
 
 
 #include <sys/param.h>
@@ -453,7 +453,12 @@ rt2560_attach(void *xsc, int id)
 		    IEEE80211_CHAN_DYN | IEEE80211_CHAN_2GHZ;
 	}
 
-	if_initialize(ifp);
+	error = if_initialize(ifp);
+	if (error != 0) {
+		aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n",
+		    error);
+		goto fail6;
+	}
 	ieee80211_ifattach(ic);
 	/* Use common softint-based if_input */
 	ifp->if_percpuq = if_percpuq_create(ifp);
@@ -492,6 +497,7 @@ rt2560_attach(void *xsc, int id)
 
 	return 0;
 
+fail6:	rt2560_free_rx_ring(sc, &sc->rxq);
 fail5:	rt2560_free_tx_ring(sc, &sc->bcnq);
 fail4:	rt2560_free_tx_ring(sc, &sc->prioq);
 fail3:	rt2560_free_tx_ring(sc, &sc->atimq);

Index: src/sys/dev/ic/rt2661.c
diff -u src/sys/dev/ic/rt2661.c:1.35 src/sys/dev/ic/rt2661.c:1.35.2.1
--- src/sys/dev/ic/rt2661.c:1.35	Tue May 23 02:19:14 2017
+++ src/sys/dev/ic/rt2661.c	Sun Dec 10 10:10:23 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: rt2661.c,v 1.35 2017/05/23 02:19:14 ozaki-r Exp $	*/
+/*	$NetBSD: rt2661.c,v 1.35.2.1 2017/12/10 10:10:23 snj Exp $	*/
 /*	$OpenBSD: rt2661.c,v 1.17 2006/05/01 08:41:11 damien Exp $	*/
 /*	$FreeBSD: rt2560.c,v 1.5 2006/06/02 19:59:31 csjp Exp $	*/
 
@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rt2661.c,v 1.35 2017/05/23 02:19:14 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rt2661.c,v 1.35.2.1 2017/12/10 10:10:23 snj Exp $");
 
 
 #include <sys/param.h>
@@ -342,7 +342,12 @@ rt2661_attach(void *xsc, int id)
 		    IEEE80211_CHAN_DYN | IEEE80211_CHAN_2GHZ;
 	}
 
-	if_initialize(ifp);
+	error = if_initialize(ifp);
+	if (error != 0) {
+		aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n",
+		    error);
+		goto fail7;
+	}
 	ieee80211_ifattach(ic);
 	/* Use common softint-based if_input */
 	ifp->if_percpuq = if_percpuq_create(ifp);
@@ -380,6 +385,7 @@ rt2661_attach(void *xsc, int id)
 
 	return 0;
 
+fail7:	rt2661_free_rx_ring(sc, &sc->rxq);
 fail6:	rt2661_free_tx_ring(sc, &sc->mgtq);
 fail5:	rt2661_free_tx_ring(sc, &sc->txq[3]);
 fail4:	rt2661_free_tx_ring(sc, &sc->txq[2]);

Index: src/sys/dev/ic/rt2860.c
diff -u src/sys/dev/ic/rt2860.c:1.26.2.2 src/sys/dev/ic/rt2860.c:1.26.2.3
--- src/sys/dev/ic/rt2860.c:1.26.2.2	Tue Aug  1 23:10:00 2017
+++ src/sys/dev/ic/rt2860.c	Sun Dec 10 10:10:23 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: rt2860.c,v 1.26.2.2 2017/08/01 23:10:00 snj Exp $	*/
+/*	$NetBSD: rt2860.c,v 1.26.2.3 2017/12/10 10:10:23 snj Exp $	*/
 /*	$OpenBSD: rt2860.c,v 1.90 2016/04/13 10:49:26 mpi Exp $	*/
 /*	$FreeBSD: head/sys/dev/ral/rt2860.c 306591 2016-10-02 20:35:55Z avos $ */
 
@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rt2860.c,v 1.26.2.2 2017/08/01 23:10:00 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rt2860.c,v 1.26.2.3 2017/12/10 10:10:23 snj Exp $");
 
 #include <sys/param.h>
 #include <sys/sockio.h>
@@ -401,7 +401,25 @@ rt2860_attachhook(device_t self)
 	IFQ_SET_READY(&ifp->if_snd);
 	memcpy(ifp->if_xname, device_xname(sc->sc_dev), IFNAMSIZ);
 
-	if_initialize(ifp);
+	error = if_initialize(ifp);
+	if (error != 0) {
+		int qid;
+
+		aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n",
+		    error);
+		for (qid = 0; qid < MAXQS; qid++)
+			rt2860_free_tx_ring(sc, &sc->txq[qid]);
+		rt2860_free_rx_ring(sc, &sc->rxq);
+		rt2860_free_tx_pool(sc);
+
+		if (sc->sc_soft_ih != NULL) {
+			softint_disestablish(sc->sc_soft_ih);
+			sc->sc_soft_ih = NULL;
+		}
+		if (sc->ucode != NULL)
+			firmware_free(sc->ucode, sc->ucsize);
+		return;
+	}
 	ieee80211_ifattach(ic);
 	/* Use common softint-based if_input */
 	ifp->if_percpuq = if_percpuq_create(ifp);

Index: src/sys/dev/ic/rtw.c
diff -u src/sys/dev/ic/rtw.c:1.126 src/sys/dev/ic/rtw.c:1.126.2.1
--- src/sys/dev/ic/rtw.c:1.126	Tue May 23 02:19:14 2017
+++ src/sys/dev/ic/rtw.c	Sun Dec 10 10:10:23 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: rtw.c,v 1.126 2017/05/23 02:19:14 ozaki-r Exp $ */
+/* $NetBSD: rtw.c,v 1.126.2.1 2017/12/10 10:10:23 snj Exp $ */
 /*-
  * Copyright (c) 2004, 2005, 2006, 2007 David Young.  All rights
  * reserved.
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rtw.c,v 1.126 2017/05/23 02:19:14 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rtw.c,v 1.126.2.1 2017/12/10 10:10:23 snj Exp $");
 
 
 #include <sys/param.h>
@@ -4225,11 +4225,16 @@ rtw_attach(struct rtw_softc *sc)
 	rtw_set80211props(&sc->sc_ic);
 
 	rtw_led_attach(&sc->sc_led_state, (void *)sc);
+	NEXT_ATTACH_STATE(sc, FINISH_LED_ATTACH);
 
 	/*
 	 * Call MI attach routines.
 	 */
-	if_initialize(ifp);
+	rc = if_initialize(ifp);
+	if (rc != 0) {
+		aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n", rc);
+		goto err;
+	}
 	ieee80211_ifattach(ic);
 	/* Use common softint-based if_input */
 	ifp->if_percpuq = if_percpuq_create(ifp);
@@ -4276,6 +4281,7 @@ rtw_detach(struct rtw_softc *sc)
 		callout_stop(&sc->sc_scan_ch);
 		ieee80211_ifdetach(&sc->sc_ic);
 		if_detach(ifp);
+	case FINISH_LED_ATTACH:
 		rtw_led_detach(&sc->sc_led_state);
 		/*FALLTHROUGH*/
 	case FINISH_ID_STA:

Index: src/sys/dev/ic/rtwvar.h
diff -u src/sys/dev/ic/rtwvar.h:1.45 src/sys/dev/ic/rtwvar.h:1.45.6.1
--- src/sys/dev/ic/rtwvar.h:1.45	Thu Feb  2 10:05:35 2017
+++ src/sys/dev/ic/rtwvar.h	Sun Dec 10 10:10:23 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: rtwvar.h,v 1.45 2017/02/02 10:05:35 nonaka Exp $ */
+/* $NetBSD: rtwvar.h,v 1.45.6.1 2017/12/10 10:10:23 snj Exp $ */
 /*-
  * Copyright (c) 2004, 2005 David Young.  All rights reserved.
  *
@@ -313,8 +313,8 @@ struct rtw_tx_radiotap_header {
 enum rtw_attach_state {FINISHED, FINISH_DESCMAP_LOAD, FINISH_DESCMAP_CREATE,
 	FINISH_DESC_MAP, FINISH_DESC_ALLOC, FINISH_RXMAPS_CREATE,
 	FINISH_TXMAPS_CREATE, FINISH_RESET, FINISH_READ_SROM, FINISH_PARSE_SROM,
-	FINISH_RF_ATTACH, FINISH_ID_STA, FINISH_TXDESCBLK_SETUP,
-	FINISH_TXCTLBLK_SETUP, DETACHED};
+	FINISH_RF_ATTACH, FINISH_ID_STA, FINISH_LED_ATTACH,
+	FINISH_TXDESCBLK_SETUP, FINISH_TXCTLBLK_SETUP, DETACHED};
 
 struct rtw_mtbl {
 	int			(*mt_newstate)(struct ieee80211com *,

Index: src/sys/dev/ic/smc90cx6.c
diff -u src/sys/dev/ic/smc90cx6.c:1.70 src/sys/dev/ic/smc90cx6.c:1.70.2.1
--- src/sys/dev/ic/smc90cx6.c:1.70	Tue May 23 02:43:13 2017
+++ src/sys/dev/ic/smc90cx6.c	Sun Dec 10 10:10:23 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: smc90cx6.c,v 1.70 2017/05/23 02:43:13 ozaki-r Exp $ */
+/*	$NetBSD: smc90cx6.c,v 1.70.2.1 2017/12/10 10:10:23 snj Exp $ */
 
 /*-
  * Copyright (c) 1994, 1995, 1998 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: smc90cx6.c,v 1.70 2017/05/23 02:43:13 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: smc90cx6.c,v 1.70.2.1 2017/12/10 10:10:23 snj Exp $");
 
 /* #define BAHSOFTCOPY */
 #define BAHRETRANSMIT /**/
@@ -140,11 +140,11 @@ void	bah_reconwatch(void *);
 #define GETMEM(off)	bus_space_read_1(bst_m, mem, (off))
 #define PUTMEM(off, v)	bus_space_write_1(bst_m, mem, (off), (v))
 
-void
+int
 bah_attach_subr(struct bah_softc *sc)
 {
 	struct ifnet *ifp = &sc->sc_arccom.ac_if;
-	int s;
+	int s, rv;
 	u_int8_t linkaddress;
 
 	bus_space_tag_t bst_r = sc->sc_bst_r;
@@ -197,7 +197,9 @@ bah_attach_subr(struct bah_softc *sc)
 
 	ifp->if_mtu = ARCMTU;
 
-	arc_ifattach(ifp, linkaddress);
+	rv = arc_ifattach(ifp, linkaddress);
+	if (rv != 0)
+		return rv;
 	if_deferred_start_init(ifp, NULL);
 
 #ifdef BAHSOFTCOPY
@@ -207,6 +209,7 @@ bah_attach_subr(struct bah_softc *sc)
 #endif
 
 	callout_init(&sc->sc_recon_ch, 0);
+	return 0;
 }
 
 /*

Index: src/sys/dev/ic/smc90cx6var.h
diff -u src/sys/dev/ic/smc90cx6var.h:1.11 src/sys/dev/ic/smc90cx6var.h:1.11.30.1
--- src/sys/dev/ic/smc90cx6var.h:1.11	Sat Oct 27 17:18:22 2012
+++ src/sys/dev/ic/smc90cx6var.h	Sun Dec 10 10:10:23 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: smc90cx6var.h,v 1.11 2012/10/27 17:18:22 chs Exp $	*/
+/*	$NetBSD: smc90cx6var.h,v 1.11.30.1 2017/12/10 10:10:23 snj Exp $	*/
 
 /*-
  * Copyright (c) 1994, 1995, 1998 The NetBSD Foundation, Inc.
@@ -70,7 +70,7 @@ struct bah_softc {
 	u_char	sc_retransmits[2];	/* unused at the moment */
 };
 
-void	bah_attach_subr(struct bah_softc *);
+int	bah_attach_subr(struct bah_softc *);
 int	bahintr(void *);
 
 #endif

Index: src/sys/dev/ic/wi.c
diff -u src/sys/dev/ic/wi.c:1.243 src/sys/dev/ic/wi.c:1.243.6.1
--- src/sys/dev/ic/wi.c:1.243	Wed Mar 29 09:04:35 2017
+++ src/sys/dev/ic/wi.c	Sun Dec 10 10:10:23 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: wi.c,v 1.243 2017/03/29 09:04:35 msaitoh Exp $	*/
+/*	$NetBSD: wi.c,v 1.243.6.1 2017/12/10 10:10:23 snj Exp $	*/
 
 /*-
  * Copyright (c) 2004 The NetBSD Foundation, Inc.
@@ -99,7 +99,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: wi.c,v 1.243 2017/03/29 09:04:35 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: wi.c,v 1.243.6.1 2017/12/10 10:10:23 snj Exp $");
 
 #define WI_HERMES_AUTOINC_WAR	/* Work around data write autoinc bug. */
 #define WI_HERMES_STATS_WAR	/* Work around stats counter bug. */
@@ -373,7 +373,7 @@ wi_attach(struct wi_softc *sc, const u_i
 	static const u_int8_t empty_macaddr[IEEE80211_ADDR_LEN] = {
 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00
 	};
-	int s;
+	int s, rv;
 
 	sc->sc_soft_ih = softint_establish(SOFTINT_NET, wi_softintr, sc);
 	if (sc->sc_soft_ih == NULL) {
@@ -550,7 +550,11 @@ wi_attach(struct wi_softc *sc, const u_i
 	/*
 	 * Call MI attach routines.
 	 */
-	if_initialize(ifp);
+	rv = if_initialize(ifp);
+	if (rv != 0) {
+		aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n", rv);
+		goto fail_2;
+	}
 	ieee80211_ifattach(ic);
 	/* Use common softint-based if_input */
 	ifp->if_percpuq = if_percpuq_create(ifp);
@@ -588,6 +592,9 @@ wi_attach(struct wi_softc *sc, const u_i
 	ieee80211_announce(ic);
 	return 0;
 
+fail_2:
+	callout_destroy(&sc->sc_rssadapt_ch);
+
 fail:	splx(s);
 	softint_disestablish(sc->sc_soft_ih);
 	sc->sc_soft_ih = NULL;

Index: src/sys/dev/pci/if_ipw.c
diff -u src/sys/dev/pci/if_ipw.c:1.64.2.1 src/sys/dev/pci/if_ipw.c:1.64.2.2
--- src/sys/dev/pci/if_ipw.c:1.64.2.1	Sat Aug  5 04:35:21 2017
+++ src/sys/dev/pci/if_ipw.c	Sun Dec 10 10:10:24 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_ipw.c,v 1.64.2.1 2017/08/05 04:35:21 snj Exp $	*/
+/*	$NetBSD: if_ipw.c,v 1.64.2.2 2017/12/10 10:10:24 snj Exp $	*/
 /*	FreeBSD: src/sys/dev/ipw/if_ipw.c,v 1.15 2005/11/13 17:17:40 damien Exp 	*/
 
 /*-
@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_ipw.c,v 1.64.2.1 2017/08/05 04:35:21 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ipw.c,v 1.64.2.2 2017/12/10 10:10:24 snj Exp $");
 
 /*-
  * Intel(R) PRO/Wireless 2100 MiniPCI driver
@@ -303,7 +303,13 @@ ipw_attach(device_t parent, device_t sel
 	aprint_normal_dev(sc->sc_dev, "802.11 address %s\n",
 	    ether_sprintf(ic->ic_myaddr));
 
-	if_initialize(ifp);
+	error = if_initialize(ifp);
+	if (error != 0) {
+		ifp->if_softc = NULL; /* For ipw_detach(). */
+		aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n",
+		    error);
+		goto fail;
+	}
 	ieee80211_ifattach(ic);
 	/* Use common softint-based if_input */
 	ifp->if_percpuq = if_percpuq_create(ifp);

Index: src/sys/dev/pci/if_iwi.c
diff -u src/sys/dev/pci/if_iwi.c:1.103 src/sys/dev/pci/if_iwi.c:1.103.2.1
--- src/sys/dev/pci/if_iwi.c:1.103	Tue May 23 02:19:14 2017
+++ src/sys/dev/pci/if_iwi.c	Sun Dec 10 10:10:24 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_iwi.c,v 1.103 2017/05/23 02:19:14 ozaki-r Exp $  */
+/*	$NetBSD: if_iwi.c,v 1.103.2.1 2017/12/10 10:10:24 snj Exp $  */
 /*	$OpenBSD: if_iwi.c,v 1.111 2010/11/15 19:11:57 damien Exp $	*/
 
 /*-
@@ -19,7 +19,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_iwi.c,v 1.103 2017/05/23 02:19:14 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_iwi.c,v 1.103.2.1 2017/12/10 10:10:24 snj Exp $");
 
 /*-
  * Intel(R) PRO/Wireless 2200BG/2225BG/2915ABG driver
@@ -367,7 +367,13 @@ iwi_attach(device_t parent, device_t sel
 	IFQ_SET_READY(&ifp->if_snd);
 	memcpy(ifp->if_xname, device_xname(self), IFNAMSIZ);
 
-	if_initialize(ifp);
+	error = if_initialize(ifp);
+	if (error != 0) {
+		ifp->if_softc = NULL; /* For iwi_detach() */
+		aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n",
+		    error);
+		goto fail;
+	}
 	ieee80211_ifattach(ic);
 	/* Use common softint-based if_input */
 	ifp->if_percpuq = if_percpuq_create(ifp);
@@ -454,16 +460,13 @@ iwi_detach(device_t self, int flags)
 	struct iwi_softc *sc = device_private(self);
 	struct ifnet *ifp = &sc->sc_if;
 
-	pmf_device_deregister(self);
-
-	if (ifp != NULL)
+	if (ifp->if_softc != NULL) {
+		pmf_device_deregister(self);
 		iwi_stop(ifp, 1);
-
-	iwi_free_firmware(sc);
-
-	ieee80211_ifdetach(&sc->sc_ic);
-	if (ifp != NULL)
+		iwi_free_firmware(sc);
+		ieee80211_ifdetach(&sc->sc_ic);
 		if_detach(ifp);
+	}
 
 	iwi_free_cmd_ring(sc, &sc->cmdq);
 	iwi_free_tx_ring(sc, &sc->txq[0]);

Index: src/sys/dev/pci/if_iwm.c
diff -u src/sys/dev/pci/if_iwm.c:1.73.2.1 src/sys/dev/pci/if_iwm.c:1.73.2.2
--- src/sys/dev/pci/if_iwm.c:1.73.2.1	Sat Jun 10 06:17:01 2017
+++ src/sys/dev/pci/if_iwm.c	Sun Dec 10 10:10:24 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_iwm.c,v 1.73.2.1 2017/06/10 06:17:01 snj Exp $	*/
+/*	$NetBSD: if_iwm.c,v 1.73.2.2 2017/12/10 10:10:24 snj Exp $	*/
 /*	OpenBSD: if_iwm.c,v 1.148 2016/11/19 21:07:08 stsp Exp	*/
 #define IEEE80211_NO_HT
 /*
@@ -106,7 +106,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_iwm.c,v 1.73.2.1 2017/06/10 06:17:01 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_iwm.c,v 1.73.2.2 2017/12/10 10:10:24 snj Exp $");
 
 #include <sys/param.h>
 #include <sys/conf.h>
@@ -8037,7 +8037,7 @@ iwm_attach(device_t parent, device_t sel
 	err = iwm_alloc_rx_ring(sc, &sc->rxq);
 	if (err) {
 		aprint_error_dev(sc->sc_dev, "could not allocate RX ring\n");
-		goto fail4;
+		goto fail5;
 	}
 
 	/* Clear pending interrupts. */
@@ -8122,7 +8122,12 @@ iwm_attach(device_t parent, device_t sel
 	IFQ_SET_READY(&ifp->if_snd);
 	memcpy(ifp->if_xname, DEVNAME(sc), IFNAMSIZ);
 
-	if_initialize(ifp);
+	err = if_initialize(ifp);
+	if (err != 0) {
+		aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n",
+		    err);
+		goto fail6;
+	}
 #if 0
 	ieee80211_ifattach(ic);
 #else
@@ -8168,10 +8173,10 @@ iwm_attach(device_t parent, device_t sel
 
 	return;
 
-fail4:	while (--txq_i >= 0)
+fail6:	iwm_free_rx_ring(sc, &sc->rxq);
+fail5:	while (--txq_i >= 0)
 		iwm_free_tx_ring(sc, &sc->txq[txq_i]);
-	iwm_free_rx_ring(sc, &sc->rxq);
-	iwm_dma_contig_free(&sc->sched_dma);
+fail4:	iwm_dma_contig_free(&sc->sched_dma);
 fail3:	if (sc->ict_dma.vaddr != NULL)
 		iwm_dma_contig_free(&sc->ict_dma);
 fail2:	iwm_dma_contig_free(&sc->kw_dma);

Index: src/sys/dev/pci/if_iwn.c
diff -u src/sys/dev/pci/if_iwn.c:1.84.6.1 src/sys/dev/pci/if_iwn.c:1.84.6.2
--- src/sys/dev/pci/if_iwn.c:1.84.6.1	Fri Aug 25 05:38:06 2017
+++ src/sys/dev/pci/if_iwn.c	Sun Dec 10 10:10:24 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_iwn.c,v 1.84.6.1 2017/08/25 05:38:06 snj Exp $	*/
+/*	$NetBSD: if_iwn.c,v 1.84.6.2 2017/12/10 10:10:24 snj Exp $	*/
 /*	$OpenBSD: if_iwn.c,v 1.135 2014/09/10 07:22:09 dcoppa Exp $	*/
 
 /*-
@@ -22,7 +22,7 @@
  * adapters.
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_iwn.c,v 1.84.6.1 2017/08/25 05:38:06 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_iwn.c,v 1.84.6.2 2017/12/10 10:10:24 snj Exp $");
 
 #define IWN_USE_RBUF	/* Use local storage for RX */
 #undef IWN_HWCRYPTO	/* XXX does not even compile yet */
@@ -596,7 +596,12 @@ iwn_attach(device_t parent __unused, dev
 	IFQ_SET_READY(&ifp->if_snd);
 	memcpy(ifp->if_xname, device_xname(self), IFNAMSIZ);
 
-	if_initialize(ifp);
+	error = if_initialize(ifp);
+	if (error != 0) {
+		aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n",
+		    error);
+		goto fail5;
+	}
 	ieee80211_ifattach(ic);
 	/* Use common softint-based if_input */
 	ifp->if_percpuq = if_percpuq_create(ifp);
@@ -643,6 +648,7 @@ iwn_attach(device_t parent __unused, dev
 	return;
 
 	/* Free allocated memory if something failed during attachment. */
+fail5:	iwn_free_rx_ring(sc, &sc->rxq);
 fail4:	while (--i >= 0)
 		iwn_free_tx_ring(sc, &sc->txq[i]);
 #ifdef IWN_USE_RBUF

Index: src/sys/dev/pci/if_rtwn.c
diff -u src/sys/dev/pci/if_rtwn.c:1.12 src/sys/dev/pci/if_rtwn.c:1.12.2.1
--- src/sys/dev/pci/if_rtwn.c:1.12	Thu May 18 01:32:46 2017
+++ src/sys/dev/pci/if_rtwn.c	Sun Dec 10 10:10:24 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_rtwn.c,v 1.12 2017/05/18 01:32:46 nonaka Exp $	*/
+/*	$NetBSD: if_rtwn.c,v 1.12.2.1 2017/12/10 10:10:24 snj Exp $	*/
 /*	$OpenBSD: if_rtwn.c,v 1.5 2015/06/14 08:02:47 stsp Exp $	*/
 #define	IEEE80211_NO_HT
 /*-
@@ -23,7 +23,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_rtwn.c,v 1.12 2017/05/18 01:32:46 nonaka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_rtwn.c,v 1.12.2.1 2017/12/10 10:10:24 snj Exp $");
 
 #include <sys/param.h>
 #include <sys/sockio.h>
@@ -357,7 +357,13 @@ rtwn_attach(device_t parent, device_t se
 	IFQ_SET_READY(&ifp->if_snd);
 	memcpy(ifp->if_xname, device_xname(sc->sc_dev), IFNAMSIZ);
 
-	if_initialize(ifp);
+	error = if_initialize(ifp);
+	if (error != 0) {
+		ifp->if_softc = NULL; /* For rtwn_detach() */
+		aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n",
+		    error);
+		goto fail;
+	}
 	ieee80211_ifattach(ic);
 	/* Use common softint-based if_input */
 	ifp->if_percpuq = if_percpuq_create(ifp);
@@ -389,6 +395,9 @@ rtwn_attach(device_t parent, device_t se
 
 	if (!pmf_device_register(self, NULL, NULL))
 		aprint_error_dev(self, "couldn't establish power handler\n");
+
+fail:
+	rtwn_detach(self, 0);
 }
 
 static int
@@ -407,6 +416,7 @@ rtwn_detach(device_t self, int flags)
 	if (ifp->if_softc != NULL) {
 		rtwn_stop(ifp, 0);
 
+		pmf_device_deregister(self);
 		ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
 		bpf_detach(ifp);
 		ieee80211_ifdetach(ic);
@@ -433,8 +443,6 @@ rtwn_detach(device_t self, int flags)
 		pci_intr_release(sc->sc_pc, sc->sc_pihp, 1);
 	}
 
-	pmf_device_deregister(self);
-
 	return 0;
 }
 

Index: src/sys/dev/pci/if_wm.c
diff -u src/sys/dev/pci/if_wm.c:1.508.4.8 src/sys/dev/pci/if_wm.c:1.508.4.9
--- src/sys/dev/pci/if_wm.c:1.508.4.8	Sun Dec 10 09:48:04 2017
+++ src/sys/dev/pci/if_wm.c	Sun Dec 10 10:10:24 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_wm.c,v 1.508.4.8 2017/12/10 09:48:04 snj Exp $	*/
+/*	$NetBSD: if_wm.c,v 1.508.4.9 2017/12/10 10:10:24 snj Exp $	*/
 
 /*
  * Copyright (c) 2001, 2002, 2003, 2004 Wasabi Systems, Inc.
@@ -83,7 +83,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.508.4.8 2017/12/10 09:48:04 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.508.4.9 2017/12/10 10:10:24 snj Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_net_mpsafe.h"
@@ -2759,7 +2759,12 @@ alloc_retry:
 #endif
 
 	/* Attach the interface. */
-	if_initialize(ifp);
+	error = if_initialize(ifp);
+	if (error != 0) {
+		aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n",
+		    error);
+		return; /* Error */
+	}
 	sc->sc_ipq = if_percpuq_create(&sc->sc_ethercom.ec_if);
 	ether_ifattach(ifp, enaddr);
 	if_register(ifp);

Index: src/sys/dev/pci/if_wpi.c
diff -u src/sys/dev/pci/if_wpi.c:1.78 src/sys/dev/pci/if_wpi.c:1.78.2.1
--- src/sys/dev/pci/if_wpi.c:1.78	Tue May 23 02:19:14 2017
+++ src/sys/dev/pci/if_wpi.c	Sun Dec 10 10:10:24 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_wpi.c,v 1.78 2017/05/23 02:19:14 ozaki-r Exp $	*/
+/*	$NetBSD: if_wpi.c,v 1.78.2.1 2017/12/10 10:10:24 snj Exp $	*/
 
 /*-
  * Copyright (c) 2006, 2007
@@ -18,7 +18,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_wpi.c,v 1.78 2017/05/23 02:19:14 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_wpi.c,v 1.78.2.1 2017/12/10 10:10:24 snj Exp $");
 
 /*
  * Driver for Intel PRO/Wireless 3945ABG 802.11 network adapters.
@@ -366,7 +366,12 @@ wpi_attach(device_t parent __unused, dev
 	IFQ_SET_READY(&ifp->if_snd);
 	memcpy(ifp->if_xname, device_xname(self), IFNAMSIZ);
 
-	if_initialize(ifp);
+	error = if_initialize(ifp);
+	if (error != 0) {
+		aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n",
+		    error);
+		goto fail5;
+	}
 	ieee80211_ifattach(ic);
 	/* Use common softint-based if_input */
 	ifp->if_percpuq = if_percpuq_create(ifp);
@@ -409,6 +414,7 @@ wpi_attach(device_t parent __unused, dev
 	return;
 
 	/* free allocated memory if something failed during attachment */
+fail5:	wpi_free_rx_ring(sc, &sc->rxq);
 fail4:	wpi_free_tx_ring(sc, &sc->cmdq);
 fail3:	while (--ac >= 0)
 		wpi_free_tx_ring(sc, &sc->txq[ac]);

Index: src/sys/dev/pci/ixgbe/ixgbe.c
diff -u src/sys/dev/pci/ixgbe/ixgbe.c:1.88.2.4 src/sys/dev/pci/ixgbe/ixgbe.c:1.88.2.5
--- src/sys/dev/pci/ixgbe/ixgbe.c:1.88.2.4	Tue Nov 21 11:38:19 2017
+++ src/sys/dev/pci/ixgbe/ixgbe.c	Sun Dec 10 10:10:24 2017
@@ -59,7 +59,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 /*$FreeBSD: head/sys/dev/ixgbe/if_ix.c 302384 2016-07-07 03:39:18Z sbruno $*/
-/*$NetBSD: ixgbe.c,v 1.88.2.4 2017/11/21 11:38:19 martin Exp $*/
+/*$NetBSD: ixgbe.c,v 1.88.2.5 2017/12/10 10:10:24 snj Exp $*/
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -3122,6 +3122,7 @@ ixgbe_setup_interface(device_t dev, stru
 {
 	struct ethercom *ec = &adapter->osdep.ec;
 	struct ifnet   *ifp;
+	int rv;
 
 	INIT_DEBUGOUT("ixgbe_setup_interface: begin");
 
@@ -3149,7 +3150,11 @@ ixgbe_setup_interface(device_t dev, stru
 	IFQ_SET_MAXLEN(&ifp->if_snd, adapter->num_tx_desc - 2);
 	IFQ_SET_READY(&ifp->if_snd);
 
-	if_initialize(ifp);
+	rv = if_initialize(ifp);
+	if (rv != 0) {
+		aprint_error_dev(dev, "if_initialize failed(%d)\n", rv);
+		return rv;
+	}
 	adapter->ipq = if_percpuq_create(&adapter->osdep.ec.ec_if);
 	ether_ifattach(ifp, adapter->hw.mac.addr);
 	/*

Index: src/sys/dev/pci/ixgbe/ixv.c
diff -u src/sys/dev/pci/ixgbe/ixv.c:1.56.2.1 src/sys/dev/pci/ixgbe/ixv.c:1.56.2.2
--- src/sys/dev/pci/ixgbe/ixv.c:1.56.2.1	Sat Sep 23 17:47:34 2017
+++ src/sys/dev/pci/ixgbe/ixv.c	Sun Dec 10 10:10:24 2017
@@ -31,7 +31,7 @@
 
 ******************************************************************************/
 /*$FreeBSD: head/sys/dev/ixgbe/if_ixv.c 302384 2016-07-07 03:39:18Z sbruno $*/
-/*$NetBSD: ixv.c,v 1.56.2.1 2017/09/23 17:47:34 snj Exp $*/
+/*$NetBSD: ixv.c,v 1.56.2.2 2017/12/10 10:10:24 snj Exp $*/
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -100,7 +100,7 @@ static int	ixv_setup_msix(struct adapter
 static void	ixv_free_pci_resources(struct adapter *);
 static void     ixv_local_timer(void *);
 static void     ixv_local_timer_locked(void *);
-static void     ixv_setup_interface(device_t, struct adapter *);
+static int      ixv_setup_interface(device_t, struct adapter *);
 static void     ixv_config_link(struct adapter *);
 
 static void     ixv_initialize_transmit_units(struct adapter *);
@@ -442,7 +442,11 @@ ixv_attach(device_t parent, device_t dev
 	adapter->enable_aim = ixv_enable_aim;
 
 	/* Setup OS specific network interface */
-	ixv_setup_interface(dev, adapter);
+	error = ixv_setup_interface(dev, adapter);
+	if (error != 0) {
+		aprint_error_dev(dev, "ixv_setup_interface() failed!\n");
+		goto err_late;
+	}
 
 	/* Do the stats setup */
 	ixv_save_stats(adapter);
@@ -1663,11 +1667,12 @@ ixv_free_pci_resources(struct adapter * 
  *  Setup networking device structure and register an interface.
  *
  **********************************************************************/
-static void
+static int
 ixv_setup_interface(device_t dev, struct adapter *adapter)
 {
 	struct ethercom *ec = &adapter->osdep.ec;
 	struct ifnet   *ifp;
+	int rv;
 
 	INIT_DEBUGOUT("ixv_setup_interface: begin");
 
@@ -1689,7 +1694,11 @@ ixv_setup_interface(device_t dev, struct
 	IFQ_SET_MAXLEN(&ifp->if_snd, adapter->num_tx_desc - 2);
 	IFQ_SET_READY(&ifp->if_snd);
 
-	if_initialize(ifp);
+	rv = if_initialize(ifp);
+	if (rv != 0) {
+		aprint_error_dev(dev, "if_initialize failed(%d)\n", rv);
+		return rv;
+	}
 	adapter->ipq = if_percpuq_create(&adapter->osdep.ec.ec_if);
 	ether_ifattach(ifp, adapter->hw.mac.addr);
 	/*
@@ -1741,7 +1750,7 @@ ixv_setup_interface(device_t dev, struct
 	ifmedia_add(&adapter->media, IFM_ETHER | IFM_AUTO, 0, NULL);
 	ifmedia_set(&adapter->media, IFM_ETHER | IFM_AUTO);
 
-	return;
+	return 0;
 }
 	
 static void

Index: src/sys/dev/pcmcia/if_malo_pcmcia.c
diff -u src/sys/dev/pcmcia/if_malo_pcmcia.c:1.13.6.1 src/sys/dev/pcmcia/if_malo_pcmcia.c:1.13.6.2
--- src/sys/dev/pcmcia/if_malo_pcmcia.c:1.13.6.1	Sun Dec 10 09:50:59 2017
+++ src/sys/dev/pcmcia/if_malo_pcmcia.c	Sun Dec 10 10:10:24 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_malo_pcmcia.c,v 1.13.6.1 2017/12/10 09:50:59 snj Exp $	*/
+/*	$NetBSD: if_malo_pcmcia.c,v 1.13.6.2 2017/12/10 10:10:24 snj Exp $	*/
 /*      $OpenBSD: if_malo.c,v 1.65 2009/03/29 21:53:53 sthen Exp $ */
 
 /*
@@ -18,7 +18,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_malo_pcmcia.c,v 1.13.6.1 2017/12/10 09:50:59 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_malo_pcmcia.c,v 1.13.6.2 2017/12/10 10:10:24 snj Exp $");
 
 #ifdef _MODULE
 #include <sys/module.h>
@@ -307,7 +307,7 @@ cmalo_attach(void *arg)
 	struct malo_softc *sc = arg;
 	struct ieee80211com *ic = &sc->sc_ic;
 	struct ifnet *ifp = &sc->sc_if;
-	int i;
+	int i, rv;
 
 	/* disable interrupts */
 	cmalo_intr_mask(sc, 0);
@@ -318,7 +318,7 @@ cmalo_attach(void *arg)
 	    cmalo_fw_load_main(sc) != 0) {
 		/* free firmware */
 		cmalo_fw_free(sc);
-		return;
+		goto fail_1;
 	}
 	sc->sc_flags |= MALO_FW_LOADED;
 
@@ -368,7 +368,11 @@ cmalo_attach(void *arg)
 	}
 
 	/* attach interface */
-	if_initialize(ifp);
+	rv = if_initialize(ifp);
+	if (rv != 0) {
+		aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n", rv);
+		goto fail_2;
+	}
 	ieee80211_ifattach(ic);
 	/* Use common softint-based if_input */
 	ifp->if_percpuq = if_percpuq_create(ifp);
@@ -386,6 +390,16 @@ cmalo_attach(void *arg)
 
 	/* device attached */
 	sc->sc_flags |= MALO_DEVICE_ATTACHED;
+
+	return;
+
+fail_2:
+	cv_destroy(&sc->sc_cv);
+	mutex_destroy(&sc->sc_mtx);
+	free(sc->sc_cmd, M_DEVBUF);
+	free(sc->sc_data, M_DEVBUF);
+fail_1:
+	cmalo_fw_free(sc);
 }
 
 static void

Index: src/sys/dev/scsipi/if_se.c
diff -u src/sys/dev/scsipi/if_se.c:1.94 src/sys/dev/scsipi/if_se.c:1.94.8.1
--- src/sys/dev/scsipi/if_se.c:1.94	Thu Dec 15 09:28:06 2016
+++ src/sys/dev/scsipi/if_se.c	Sun Dec 10 10:10:24 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_se.c,v 1.94 2016/12/15 09:28:06 ozaki-r Exp $	*/
+/*	$NetBSD: if_se.c,v 1.94.8.1 2017/12/10 10:10:24 snj Exp $	*/
 
 /*
  * Copyright (c) 1997 Ian W. Dall <ian.d...@dsto.defence.gov.au>
@@ -59,7 +59,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_se.c,v 1.94 2016/12/15 09:28:06 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_se.c,v 1.94.8.1 2017/12/10 10:10:24 snj Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -314,6 +314,7 @@ seattach(device_t parent, device_t self,
 	struct scsipi_periph *periph = sa->sa_periph;
 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	u_int8_t myaddr[ETHER_ADDR_LEN];
+	int rv;
 
 	sc->sc_dev = self;
 
@@ -363,7 +364,13 @@ seattach(device_t parent, device_t self,
 	IFQ_SET_READY(&ifp->if_snd);
 
 	/* Attach the interface. */
-	if_initialize(ifp);
+	rv = if_initialize(ifp);
+	if (rv != 0) {
+		free(sc->sc_tbuf, M_DEVBUF);
+		callout_destroy(&sc->sc_ifstart_ch);
+		callout_destroy(&sc->sc_recv_ch);
+		return; /* Error */
+	}
 	ether_ifattach(ifp, myaddr);
 	if_register(ifp);
 }

Index: src/sys/dev/usb/if_upl.c
diff -u src/sys/dev/usb/if_upl.c:1.59 src/sys/dev/usb/if_upl.c:1.59.8.1
--- src/sys/dev/usb/if_upl.c:1.59	Thu Jan 12 18:26:08 2017
+++ src/sys/dev/usb/if_upl.c	Sun Dec 10 10:10:24 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_upl.c,v 1.59 2017/01/12 18:26:08 maya Exp $	*/
+/*	$NetBSD: if_upl.c,v 1.59.8.1 2017/12/10 10:10:24 snj Exp $	*/
 /*
  * Copyright (c) 2000 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_upl.c,v 1.59 2017/01/12 18:26:08 maya Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_upl.c,v 1.59.8.1 2017/12/10 10:10:24 snj Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -228,6 +228,7 @@ upl_attach(device_t parent, device_t sel
 	usb_interface_descriptor_t	*id;
 	usb_endpoint_descriptor_t	*ed;
 	int			i;
+	int			rv;
 
 	DPRINTFN(5,(" : upl_attach: sc=%p, dev=%p", sc, dev));
 
@@ -307,7 +308,12 @@ upl_attach(device_t parent, device_t sel
 	IFQ_SET_READY(&ifp->if_snd);
 
 	/* Attach the interface. */
-	if_initialize(ifp);
+	rv = if_initialize(ifp);
+	if (rv != 0) {
+		aprint_error_dev(self, "if_initialize failed(%d)\n", rv);
+		splx(s);
+		return;
+	}
 	if_register(ifp);
 	if_alloc_sadl(ifp);
 

Index: src/sys/net/if.c
diff -u src/sys/net/if.c:1.394.2.2 src/sys/net/if.c:1.394.2.3
--- src/sys/net/if.c:1.394.2.2	Thu Nov 30 15:57:37 2017
+++ src/sys/net/if.c	Sun Dec 10 10:10:24 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: if.c,v 1.394.2.2 2017/11/30 15:57:37 martin Exp $	*/
+/*	$NetBSD: if.c,v 1.394.2.3 2017/12/10 10:10:24 snj Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2000, 2001, 2008 The NetBSD Foundation, Inc.
@@ -90,7 +90,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if.c,v 1.394.2.2 2017/11/30 15:57:37 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if.c,v 1.394.2.3 2017/12/10 10:10:24 snj Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_inet.h"
@@ -670,9 +670,11 @@ skip:
  *     ether_ifattach(ifp, enaddr);
  *     if_register(ifp);
  */
-void
+int
 if_initialize(ifnet_t *ifp)
 {
+	int rv = 0;
+
 	KASSERT(if_indexlim > 0);
 	TAILQ_INIT(&ifp->if_addrlist);
 
@@ -711,8 +713,10 @@ if_initialize(ifnet_t *ifp)
 	if (if_is_link_state_changeable(ifp)) {
 		ifp->if_link_si = softint_establish(SOFTINT_NET,
 		    if_link_state_change_si, ifp);
-		if (ifp->if_link_si == NULL)
-			panic("%s: softint_establish() failed", __func__);
+		if (ifp->if_link_si == NULL) {
+			rv = ENOMEM;
+			goto fail;
+		}
 	}
 
 	PSLIST_ENTRY_INIT(ifp, if_pslist_entry);
@@ -724,6 +728,18 @@ if_initialize(ifnet_t *ifp)
 	IFNET_LOCK();
 	if_getindex(ifp);
 	IFNET_UNLOCK();
+
+	return 0;
+
+fail:
+	IF_AFDATA_LOCK_DESTROY(ifp);
+
+	pfil_run_ifhooks(if_pfil, PFIL_IFNET_DETACH, ifp);
+	(void)pfil_head_destroy(ifp->if_pfil);
+
+	IFQ_LOCK_DESTROY(&ifp->if_snd);
+
+	return rv;
 }
 
 /*
@@ -1094,13 +1110,19 @@ if_input(struct ifnet *ifp, struct mbuf 
  * migrate softint-based if_input without much changes. If you don't
  * want to enable it, use if_initialize instead.
  */
-void
+int
 if_attach(ifnet_t *ifp)
 {
+	int rv;
+
+	rv = if_initialize(ifp);
+	if (rv != 0)
+		return rv;
 
-	if_initialize(ifp);
 	ifp->if_percpuq = if_percpuq_create(ifp);
 	if_register(ifp);
+
+	return 0;
 }
 
 void

Index: src/sys/net/if.h
diff -u src/sys/net/if.h:1.239.2.1 src/sys/net/if.h:1.239.2.2
--- src/sys/net/if.h:1.239.2.1	Sat Jul  1 08:56:06 2017
+++ src/sys/net/if.h	Sun Dec 10 10:10:24 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: if.h,v 1.239.2.1 2017/07/01 08:56:06 snj Exp $	*/
+/*	$NetBSD: if.h,v 1.239.2.2 2017/12/10 10:10:24 snj Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2000, 2001 The NetBSD Foundation, Inc.
@@ -923,6 +923,7 @@ do {									\
 
 #define IFQ_LOCK_INIT(ifq)	(ifq)->ifq_lock =			\
 	    mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET)
+#define IFQ_LOCK_DESTROY(ifq)	mutex_obj_free((ifq)->ifq_lock)
 #define IFQ_LOCK(ifq)		mutex_enter((ifq)->ifq_lock)
 #define IFQ_UNLOCK(ifq)		mutex_exit((ifq)->ifq_lock)
 
@@ -946,9 +947,9 @@ void if_activate_sadl(struct ifnet *, st
     const struct sockaddr_dl *);
 void	if_set_sadl(struct ifnet *, const void *, u_char, bool);
 void	if_alloc_sadl(struct ifnet *);
-void	if_initialize(struct ifnet *);
+int	if_initialize(struct ifnet *);
 void	if_register(struct ifnet *);
-void	if_attach(struct ifnet *); /* Deprecated. Use if_initialize and if_register */
+int	if_attach(struct ifnet *); /* Deprecated. Use if_initialize and if_register */
 void	if_attachdomain(void);
 void	if_deactivate(struct ifnet *);
 bool	if_is_deactivated(const struct ifnet *);

Index: src/sys/net/if_arc.h
diff -u src/sys/net/if_arc.h:1.22 src/sys/net/if_arc.h:1.22.90.1
--- src/sys/net/if_arc.h:1.22	Wed Feb 20 17:05:52 2008
+++ src/sys/net/if_arc.h	Sun Dec 10 10:10:24 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_arc.h,v 1.22 2008/02/20 17:05:52 matt Exp $	*/
+/*	$NetBSD: if_arc.h,v 1.22.90.1 2017/12/10 10:10:24 snj Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1993
@@ -118,7 +118,7 @@ struct	arccom {
 extern uint8_t arcbroadcastaddr;
 extern int arc_ipmtu;	/* XXX new ip only, no RFC 1051! */
 
-void	arc_ifattach(struct ifnet *, uint8_t);
+int	arc_ifattach(struct ifnet *, uint8_t);
 char	*arc_sprintf(uint8_t *);
 int	arc_isphds(uint8_t);
 #endif

Index: src/sys/net/if_arcsubr.c
diff -u src/sys/net/if_arcsubr.c:1.77 src/sys/net/if_arcsubr.c:1.77.6.1
--- src/sys/net/if_arcsubr.c:1.77	Tue Feb 14 03:05:06 2017
+++ src/sys/net/if_arcsubr.c	Sun Dec 10 10:10:24 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_arcsubr.c,v 1.77 2017/02/14 03:05:06 ozaki-r Exp $	*/
+/*	$NetBSD: if_arcsubr.c,v 1.77.6.1 2017/12/10 10:10:24 snj Exp $	*/
 
 /*
  * Copyright (c) 1994, 1995 Ignatios Souvatzis
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_arcsubr.c,v 1.77 2017/02/14 03:05:06 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_arcsubr.c,v 1.77.6.1 2017/12/10 10:10:24 snj Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -610,10 +610,11 @@ arc_sprintf(uint8_t *ap)
 /*
  * Perform common duties while attaching to interface list
  */
-void
+int
 arc_ifattach(struct ifnet *ifp, uint8_t lla)
 {
 	struct arccom *ac;
+	int rv;
 
 	ifp->if_type = IFT_ARCNET;
 	ifp->if_addrlen = 1;
@@ -635,10 +636,15 @@ arc_ifattach(struct ifnet *ifp, uint8_t 
 		log(LOG_ERR,"%s: link address 0 reserved for broadcasts.  Please change it and ifconfig %s down up\n",
 		   ifp->if_xname, ifp->if_xname);
 	}
-	if_attach(ifp);
+	rv = if_attach(ifp);
+	if (rv != 0)
+		return rv;
+
 	if_set_sadl(ifp, &lla, sizeof(lla), true);
 
 	ifp->if_broadcastaddr = &arcbroadcastaddr;
 
 	bpf_attach(ifp, DLT_ARCNET, ARC_HDRLEN);
+
+	return 0;
 }

Index: src/sys/net/if_bridge.c
diff -u src/sys/net/if_bridge.c:1.134.6.3 src/sys/net/if_bridge.c:1.134.6.4
--- src/sys/net/if_bridge.c:1.134.6.3	Thu Nov 23 13:34:24 2017
+++ src/sys/net/if_bridge.c	Sun Dec 10 10:10:24 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_bridge.c,v 1.134.6.3 2017/11/23 13:34:24 martin Exp $	*/
+/*	$NetBSD: if_bridge.c,v 1.134.6.4 2017/12/10 10:10:24 snj Exp $	*/
 
 /*
  * Copyright 2001 Wasabi Systems, Inc.
@@ -80,7 +80,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_bridge.c,v 1.134.6.3 2017/11/23 13:34:24 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_bridge.c,v 1.134.6.4 2017/12/10 10:10:24 snj Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_bridge_ipf.h"
@@ -436,12 +436,23 @@ bridge_clone_create(struct if_clone *ifc
 	ifp->if_dlt = DLT_EN10MB;
 	ifp->if_hdrlen = ETHER_HDR_LEN;
 
-	if_initialize(ifp);
+	error = if_initialize(ifp);
+	if (error != 0) {
+		pserialize_destroy(sc->sc_iflist_psref.bip_psz);
+		mutex_destroy(&sc->sc_iflist_psref.bip_lock);
+		callout_destroy(&sc->sc_brcallout);
+		callout_destroy(&sc->sc_bstpcallout);
+		workqueue_destroy(sc->sc_rtage_wq);
+		bridge_rtable_fini(sc);
+		kmem_free(sc, sizeof(*sc));
+
+		return error;
+	}
 	if_register(ifp);
 
 	if_alloc_sadl(ifp);
 
-	return (0);
+	return 0;
 }
 
 /*
@@ -480,12 +491,12 @@ bridge_clone_destroy(struct ifnet *ifp)
 
 	pserialize_destroy(sc->sc_iflist_psref.bip_psz);
 	mutex_destroy(&sc->sc_iflist_psref.bip_lock);
-
+	callout_destroy(&sc->sc_brcallout);
+	callout_destroy(&sc->sc_bstpcallout);
 	workqueue_destroy(sc->sc_rtage_wq);
-
 	kmem_free(sc, sizeof(*sc));
 
-	return (0);
+	return 0;
 }
 
 /*
@@ -530,7 +541,7 @@ bridge_ioctl(struct ifnet *ifp, u_long c
 		     KAUTH_REQ_NETWORK_INTERFACE_BRIDGE_SETPRIV,
 		     ifd, NULL, NULL);
 		if (error)
-			return (error);
+			return error;
 
 		break;
 	}
@@ -618,7 +629,7 @@ bridge_ioctl(struct ifnet *ifp, u_long c
 
 	splx(s);
 
-	return (error);
+	return error;
 }
 
 /*
@@ -733,7 +744,7 @@ bridge_ioctl_add(struct bridge_softc *sc
 
 	ifs = if_get(req->ifbr_ifsname, &psref);
 	if (ifs == NULL)
-		return (ENOENT);
+		return ENOENT;
 
 	if (ifs->if_bridge == sc) {
 		error = EEXIST;
@@ -807,7 +818,7 @@ bridge_ioctl_add(struct bridge_softc *sc
 		if (bif != NULL)
 			kmem_free(bif, sizeof(*bif));
 	}
-	return (error);
+	return error;
 }
 
 static int
@@ -873,7 +884,7 @@ bridge_ioctl_gifflags(struct bridge_soft
 
 	bif = bridge_lookup_member(sc, req->ifbr_ifsname, &psref);
 	if (bif == NULL)
-		return (ENOENT);
+		return ENOENT;
 
 	req->ifbr_ifsflags = bif->bif_flags;
 	req->ifbr_state = bif->bif_state;
@@ -883,7 +894,7 @@ bridge_ioctl_gifflags(struct bridge_soft
 
 	bridge_release_member(sc, bif, &psref);
 
-	return (0);
+	return 0;
 }
 
 static int
@@ -895,7 +906,7 @@ bridge_ioctl_sifflags(struct bridge_soft
 
 	bif = bridge_lookup_member(sc, req->ifbr_ifsname, &psref);
 	if (bif == NULL)
-		return (ENOENT);
+		return ENOENT;
 
 	if (req->ifbr_ifsflags & IFBIF_STP) {
 		switch (bif->bif_ifp->if_type) {
@@ -907,7 +918,7 @@ bridge_ioctl_sifflags(struct bridge_soft
 		default:
 			/* Nothing else can. */
 			bridge_release_member(sc, bif, &psref);
-			return (EINVAL);
+			return EINVAL;
 		}
 	}
 
@@ -918,7 +929,7 @@ bridge_ioctl_sifflags(struct bridge_soft
 	if (sc->sc_if.if_flags & IFF_RUNNING)
 		bstp_initialization(sc);
 
-	return (0);
+	return 0;
 }
 
 static int
@@ -929,7 +940,7 @@ bridge_ioctl_scache(struct bridge_softc 
 	sc->sc_brtmax = param->ifbrp_csize;
 	bridge_rttrim(sc);
 
-	return (0);
+	return 0;
 }
 
 static int
@@ -939,7 +950,7 @@ bridge_ioctl_gcache(struct bridge_softc 
 
 	param->ifbrp_csize = sc->sc_brtmax;
 
-	return (0);
+	return 0;
 }
 
 static int
@@ -1023,7 +1034,7 @@ bridge_ioctl_rts(struct bridge_softc *sc
 	int count = 0, error = 0, len;
 
 	if (bac->ifbac_len == 0)
-		return (0);
+		return 0;
 
 	BRIDGE_RT_LOCK(sc);
 
@@ -1051,7 +1062,7 @@ bridge_ioctl_rts(struct bridge_softc *sc
 	BRIDGE_RT_UNLOCK(sc);
 
 	bac->ifbac_len = sizeof(bareq) * count;
-	return (error);
+	return error;
 }
 
 static int
@@ -1064,14 +1075,14 @@ bridge_ioctl_saddr(struct bridge_softc *
 
 	bif = bridge_lookup_member(sc, req->ifba_ifsname, &psref);
 	if (bif == NULL)
-		return (ENOENT);
+		return ENOENT;
 
 	error = bridge_rtupdate(sc, req->ifba_dst, bif->bif_ifp, 1,
 	    req->ifba_flags);
 
 	bridge_release_member(sc, bif, &psref);
 
-	return (error);
+	return error;
 }
 
 static int
@@ -1081,7 +1092,7 @@ bridge_ioctl_sto(struct bridge_softc *sc
 
 	sc->sc_brttimeout = param->ifbrp_ctime;
 
-	return (0);
+	return 0;
 }
 
 static int
@@ -1091,7 +1102,7 @@ bridge_ioctl_gto(struct bridge_softc *sc
 
 	param->ifbrp_ctime = sc->sc_brttimeout;
 
-	return (0);
+	return 0;
 }
 
 static int
@@ -1109,7 +1120,7 @@ bridge_ioctl_flush(struct bridge_softc *
 
 	bridge_rtflush(sc, req->ifbr_ifsflags);
 
-	return (0);
+	return 0;
 }
 
 static int
@@ -1119,7 +1130,7 @@ bridge_ioctl_gpri(struct bridge_softc *s
 
 	param->ifbrp_prio = sc->sc_bridge_priority;
 
-	return (0);
+	return 0;
 }
 
 static int
@@ -1132,7 +1143,7 @@ bridge_ioctl_spri(struct bridge_softc *s
 	if (sc->sc_if.if_flags & IFF_RUNNING)
 		bstp_initialization(sc);
 
-	return (0);
+	return 0;
 }
 
 static int
@@ -1142,7 +1153,7 @@ bridge_ioctl_ght(struct bridge_softc *sc
 
 	param->ifbrp_hellotime = sc->sc_bridge_hello_time >> 8;
 
-	return (0);
+	return 0;
 }
 
 static int
@@ -1151,13 +1162,13 @@ bridge_ioctl_sht(struct bridge_softc *sc
 	struct ifbrparam *param = arg;
 
 	if (param->ifbrp_hellotime == 0)
-		return (EINVAL);
+		return EINVAL;
 	sc->sc_bridge_hello_time = param->ifbrp_hellotime << 8;
 
 	if (sc->sc_if.if_flags & IFF_RUNNING)
 		bstp_initialization(sc);
 
-	return (0);
+	return 0;
 }
 
 static int
@@ -1167,7 +1178,7 @@ bridge_ioctl_gfd(struct bridge_softc *sc
 
 	param->ifbrp_fwddelay = sc->sc_bridge_forward_delay >> 8;
 
-	return (0);
+	return 0;
 }
 
 static int
@@ -1176,13 +1187,13 @@ bridge_ioctl_sfd(struct bridge_softc *sc
 	struct ifbrparam *param = arg;
 
 	if (param->ifbrp_fwddelay == 0)
-		return (EINVAL);
+		return EINVAL;
 	sc->sc_bridge_forward_delay = param->ifbrp_fwddelay << 8;
 
 	if (sc->sc_if.if_flags & IFF_RUNNING)
 		bstp_initialization(sc);
 
-	return (0);
+	return 0;
 }
 
 static int
@@ -1192,7 +1203,7 @@ bridge_ioctl_gma(struct bridge_softc *sc
 
 	param->ifbrp_maxage = sc->sc_bridge_max_age >> 8;
 
-	return (0);
+	return 0;
 }
 
 static int
@@ -1201,13 +1212,13 @@ bridge_ioctl_sma(struct bridge_softc *sc
 	struct ifbrparam *param = arg;
 
 	if (param->ifbrp_maxage == 0)
-		return (EINVAL);
+		return EINVAL;
 	sc->sc_bridge_max_age = param->ifbrp_maxage << 8;
 
 	if (sc->sc_if.if_flags & IFF_RUNNING)
 		bstp_initialization(sc);
 
-	return (0);
+	return 0;
 }
 
 static int
@@ -1219,7 +1230,7 @@ bridge_ioctl_sifprio(struct bridge_softc
 
 	bif = bridge_lookup_member(sc, req->ifbr_ifsname, &psref);
 	if (bif == NULL)
-		return (ENOENT);
+		return ENOENT;
 
 	bif->bif_priority = req->ifbr_priority;
 
@@ -1228,7 +1239,7 @@ bridge_ioctl_sifprio(struct bridge_softc
 
 	bridge_release_member(sc, bif, &psref);
 
-	return (0);
+	return 0;
 }
 
 #if defined(BRIDGE_IPF)
@@ -1239,7 +1250,7 @@ bridge_ioctl_gfilt(struct bridge_softc *
 
 	param->ifbrp_filter = sc->sc_filter_flags;
 
-	return (0);
+	return 0;
 }
 
 static int
@@ -1249,7 +1260,7 @@ bridge_ioctl_sfilt(struct bridge_softc *
 	uint32_t nflags, oflags;
 
 	if (param->ifbrp_filter & ~IFBF_FILT_MASK)
-		return (EINVAL);
+		return EINVAL;
 
 	nflags = param->ifbrp_filter;
 	oflags = sc->sc_filter_flags;
@@ -1265,7 +1276,7 @@ bridge_ioctl_sfilt(struct bridge_softc *
 
 	sc->sc_filter_flags = nflags;
 
-	return (0);
+	return 0;
 }
 #endif /* BRIDGE_IPF */
 
@@ -1278,7 +1289,7 @@ bridge_ioctl_sifcost(struct bridge_softc
 
 	bif = bridge_lookup_member(sc, req->ifbr_ifsname, &psref);
 	if (bif == NULL)
-		return (ENOENT);
+		return ENOENT;
 
 	bif->bif_path_cost = req->ifbr_path_cost;
 
@@ -1287,7 +1298,7 @@ bridge_ioctl_sifcost(struct bridge_softc
 
 	bridge_release_member(sc, bif, &psref);
 
-	return (0);
+	return 0;
 }
 
 /*
@@ -1322,14 +1333,14 @@ bridge_init(struct ifnet *ifp)
 	struct bridge_softc *sc = ifp->if_softc;
 
 	if (ifp->if_flags & IFF_RUNNING)
-		return (0);
+		return 0;
 
 	callout_reset(&sc->sc_brcallout, bridge_rtable_prune_period * hz,
 	    bridge_timer, sc);
 
 	ifp->if_flags |= IFF_RUNNING;
 	bstp_initialization(sc);
-	return (0);
+	return 0;
 }
 
 /*
@@ -1440,7 +1451,7 @@ bridge_output(struct ifnet *ifp, struct 
 	if (m->m_len < ETHER_HDR_LEN) {
 		m = m_pullup(m, ETHER_HDR_LEN);
 		if (m == NULL)
-			return (0);
+			return 0;
 	}
 
 	eh = mtod(m, struct ether_header *);
@@ -1566,7 +1577,7 @@ next:
 
 		if (!used)
 			m_freem(m);
-		return (0);
+		return 0;
 	}
 
  sendunicast:
@@ -1576,12 +1587,12 @@ next:
 
 	if ((dst_if->if_flags & IFF_RUNNING) == 0) {
 		m_freem(m);
-		return (0);
+		return 0;
 	}
 
 	bridge_enqueue(sc, dst_if, m, 0);
 
-	return (0);
+	return 0;
 }
 
 /*
@@ -2395,12 +2406,12 @@ bridge_rtnode_lookup(struct bridge_softc
 	LIST_FOREACH(brt, &sc->sc_rthash[hash], brt_hash) {
 		dir = memcmp(addr, brt->brt_addr, ETHER_ADDR_LEN);
 		if (dir == 0)
-			return (brt);
+			return brt;
 		if (dir > 0)
-			return (NULL);
+			return NULL;
 	}
 
-	return (NULL);
+	return NULL;
 }
 
 /*
@@ -2429,7 +2440,7 @@ bridge_rtnode_insert(struct bridge_softc
 	do {
 		dir = memcmp(brt->brt_addr, lbrt->brt_addr, ETHER_ADDR_LEN);
 		if (dir == 0)
-			return (EEXIST);
+			return EEXIST;
 		if (dir > 0) {
 			LIST_INSERT_BEFORE(lbrt, brt, brt_hash);
 			goto out;
@@ -2449,7 +2460,7 @@ bridge_rtnode_insert(struct bridge_softc
 	LIST_INSERT_HEAD(&sc->sc_rtlist, brt, brt_list);
 	sc->sc_brtcnt++;
 
-	return (0);
+	return 0;
 }
 
 /*

Index: src/sys/net/if_etherip.c
diff -u src/sys/net/if_etherip.c:1.38 src/sys/net/if_etherip.c:1.38.10.1
--- src/sys/net/if_etherip.c:1.38	Mon Jul 11 11:31:51 2016
+++ src/sys/net/if_etherip.c	Sun Dec 10 10:10:25 2017
@@ -1,4 +1,4 @@
-/*      $NetBSD: if_etherip.c,v 1.38 2016/07/11 11:31:51 msaitoh Exp $        */
+/*      $NetBSD: if_etherip.c,v 1.38.10.1 2017/12/10 10:10:25 snj Exp $        */
 
 /*
  *  Copyright (c) 2006, Hans Rosenfeld <rosenf...@grumpf.hope-2000.org>
@@ -86,7 +86,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_etherip.c,v 1.38 2016/07/11 11:31:51 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_etherip.c,v 1.38.10.1 2017/12/10 10:10:25 snj Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -266,7 +266,13 @@ etherip_attach(device_t parent, device_t
 	 * Those steps are mandatory for an Ethernet driver, the first call
 	 * being common to all network interface drivers.
 	 */
-	if_attach(ifp);
+	error = if_attach(ifp);
+	if (error != 0) {
+		aprint_error_dev(self, "if_attach failed(%d)\n", error);
+		ifmedia_delete_instance(&sc->sc_im, IFM_INST_ANY);
+		pmf_device_deregister(self);
+		return;
+	}
 	ether_ifattach(ifp, enaddr);
 
 	/*

Index: src/sys/net/if_faith.c
diff -u src/sys/net/if_faith.c:1.55 src/sys/net/if_faith.c:1.55.8.1
--- src/sys/net/if_faith.c:1.55	Mon Dec 12 03:55:57 2016
+++ src/sys/net/if_faith.c	Sun Dec 10 10:10:25 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_faith.c,v 1.55 2016/12/12 03:55:57 ozaki-r Exp $	*/
+/*	$NetBSD: if_faith.c,v 1.55.8.1 2017/12/10 10:10:25 snj Exp $	*/
 /*	$KAME: if_faith.c,v 1.21 2001/02/20 07:59:26 itojun Exp $	*/
 
 /*
@@ -40,7 +40,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_faith.c,v 1.55 2016/12/12 03:55:57 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_faith.c,v 1.55.8.1 2017/12/10 10:10:25 snj Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -140,6 +140,7 @@ static int
 faith_clone_create(struct if_clone *ifc, int unit)
 {
 	struct ifnet *ifp;
+	int rv;
 
 	ifp = if_alloc(IFT_FAITH);
 
@@ -154,7 +155,11 @@ faith_clone_create(struct if_clone *ifc,
 	ifp->if_hdrlen = 0;
 	ifp->if_addrlen = 0;
 	ifp->if_dlt = DLT_NULL;
-	if_attach(ifp);
+	rv = if_attach(ifp);
+	if (rv != 0) {
+		if_free(ifp);
+		return rv;
+	}
 	if_alloc_sadl(ifp);
 	bpf_attach(ifp, DLT_NULL, sizeof(u_int));
 	atomic_inc_uint(&faith_count);

Index: src/sys/net/if_gif.c
diff -u src/sys/net/if_gif.c:1.126.2.3 src/sys/net/if_gif.c:1.126.2.4
--- src/sys/net/if_gif.c:1.126.2.3	Tue Oct 24 08:47:24 2017
+++ src/sys/net/if_gif.c	Sun Dec 10 10:10:25 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_gif.c,v 1.126.2.3 2017/10/24 08:47:24 snj Exp $	*/
+/*	$NetBSD: if_gif.c,v 1.126.2.4 2017/12/10 10:10:25 snj Exp $	*/
 /*	$KAME: if_gif.c,v 1.76 2001/08/20 02:01:02 kjc Exp $	*/
 
 /*
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_gif.c,v 1.126.2.3 2017/10/24 08:47:24 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_gif.c,v 1.126.2.4 2017/12/10 10:10:25 snj Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -105,7 +105,7 @@ static struct {
 static void	gif_ro_init_pc(void *, void *, struct cpu_info *);
 static void	gif_ro_fini_pc(void *, void *, struct cpu_info *);
 
-static void	gifattach0(struct gif_softc *);
+static int	gifattach0(struct gif_softc *);
 static int	gif_output(struct ifnet *, struct mbuf *,
 			   const struct sockaddr *, const struct rtentry *);
 static void	gif_start(struct ifnet *);
@@ -242,12 +242,17 @@ static int
 gif_clone_create(struct if_clone *ifc, int unit)
 {
 	struct gif_softc *sc;
+	int rv;
 
 	sc = kmem_zalloc(sizeof(struct gif_softc), KM_SLEEP);
 
 	if_initname(&sc->gif_if, ifc->ifc_name, unit);
 
-	gifattach0(sc);
+	rv = gifattach0(sc);
+	if (rv != 0) {
+		kmem_free(sc, sizeof(struct gif_softc));
+		return rv;
+	}
 
 	sc->gif_ro_percpu = percpu_alloc(sizeof(struct gif_ro));
 	percpu_foreach(sc->gif_ro_percpu, gif_ro_init_pc, NULL);
@@ -255,12 +260,13 @@ gif_clone_create(struct if_clone *ifc, i
 	mutex_enter(&gif_softcs.lock);
 	LIST_INSERT_HEAD(&gif_softcs.list, sc, gif_list);
 	mutex_exit(&gif_softcs.lock);
-	return (0);
+	return 0;
 }
 
-static void
+static int
 gifattach0(struct gif_softc *sc)
 {
+	int rv;
 
 	sc->encap_cookie4 = sc->encap_cookie6 = NULL;
 
@@ -279,10 +285,14 @@ gifattach0(struct gif_softc *sc)
 	sc->gif_if.if_dlt    = DLT_NULL;
 	sc->gif_if.if_softc  = sc;
 	IFQ_SET_READY(&sc->gif_if.if_snd);
-	if_initialize(&sc->gif_if);
+	rv = if_initialize(&sc->gif_if);
+	if (rv != 0)
+		return rv;
+
 	if_register(&sc->gif_if);
 	if_alloc_sadl(&sc->gif_if);
 	bpf_attach(&sc->gif_if, DLT_NULL, sizeof(u_int));
+	return 0;
 }
 
 static void
@@ -327,7 +337,7 @@ gif_clone_destroy(struct ifnet *ifp)
 
 	kmem_free(sc, sizeof(struct gif_softc));
 
-	return (0);
+	return 0;
 }
 
 #ifdef GIF_ENCAPCHECK

Index: src/sys/net/if_loop.c
diff -u src/sys/net/if_loop.c:1.94.6.2 src/sys/net/if_loop.c:1.94.6.3
--- src/sys/net/if_loop.c:1.94.6.2	Thu Nov 23 02:13:31 2017
+++ src/sys/net/if_loop.c	Sun Dec 10 10:10:25 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_loop.c,v 1.94.6.2 2017/11/23 02:13:31 snj Exp $	*/
+/*	$NetBSD: if_loop.c,v 1.94.6.3 2017/12/10 10:10:25 snj Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -65,7 +65,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_loop.c,v 1.94.6.2 2017/11/23 02:13:31 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_loop.c,v 1.94.6.3 2017/12/10 10:10:25 snj Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -175,6 +175,7 @@ static int
 loop_clone_create(struct if_clone *ifc, int unit)
 {
 	struct ifnet *ifp;
+	int rv;
 
 	ifp = if_alloc(IFT_LOOP);
 
@@ -195,7 +196,11 @@ loop_clone_create(struct if_clone *ifc, 
 	IFQ_SET_READY(&ifp->if_snd);
 	if (unit == 0)
 		lo0ifp = ifp;
-	if_attach(ifp);
+	rv = if_attach(ifp);
+	if (rv != 0) {
+		if_free(ifp);
+		return rv;
+	}
 	if_alloc_sadl(ifp);
 	bpf_attach(ifp, DLT_NULL, sizeof(u_int));
 #ifdef MBUFTRACE

Index: src/sys/net/if_mpls.c
diff -u src/sys/net/if_mpls.c:1.29 src/sys/net/if_mpls.c:1.29.8.1
--- src/sys/net/if_mpls.c:1.29	Mon Dec 12 03:55:57 2016
+++ src/sys/net/if_mpls.c	Sun Dec 10 10:10:25 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_mpls.c,v 1.29 2016/12/12 03:55:57 ozaki-r Exp $ */
+/*	$NetBSD: if_mpls.c,v 1.29.8.1 2017/12/10 10:10:25 snj Exp $ */
 
 /*
  * Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_mpls.c,v 1.29 2016/12/12 03:55:57 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_mpls.c,v 1.29.8.1 2017/12/10 10:10:25 snj Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -149,6 +149,7 @@ static int
 mpls_clone_create(struct if_clone *ifc, int unit)
 {
 	struct mpls_softc *sc;
+	int rv;
 
 	atomic_inc_uint(&mpls_count);
 	sc = malloc(sizeof(*sc), M_DEVBUF, M_WAITOK | M_ZERO);
@@ -165,7 +166,12 @@ mpls_clone_create(struct if_clone *ifc, 
 	sc->sc_if.if_output = mpls_output;
 	sc->sc_if.if_ioctl = mpls_ioctl;
 
-	if_attach(&sc->sc_if);
+	rv = if_attach(&sc->sc_if);
+	if (rv != 0) {
+		free(sc, M_DEVBUF);
+		atomic_dec_uint(&mpls_count);
+		return rv;
+	}
 	if_alloc_sadl(&sc->sc_if);
 	bpf_attach(&sc->sc_if, DLT_NULL, sizeof(uint32_t));
 	return 0;

Index: src/sys/net/if_pppoe.c
diff -u src/sys/net/if_pppoe.c:1.125.6.3 src/sys/net/if_pppoe.c:1.125.6.4
--- src/sys/net/if_pppoe.c:1.125.6.3	Fri Dec  8 06:12:35 2017
+++ src/sys/net/if_pppoe.c	Sun Dec 10 10:10:25 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: if_pppoe.c,v 1.125.6.3 2017/12/08 06:12:35 msaitoh Exp $ */
+/* $NetBSD: if_pppoe.c,v 1.125.6.4 2017/12/10 10:10:25 snj Exp $ */
 
 /*-
  * Copyright (c) 2002, 2008 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_pppoe.c,v 1.125.6.3 2017/12/08 06:12:35 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_pppoe.c,v 1.125.6.4 2017/12/10 10:10:25 snj Exp $");
 
 #ifdef _KERNEL_OPT
 #include "pppoe.h"
@@ -221,7 +221,8 @@ static int pppoe_send_padt(struct ifnet 
 static int pppoe_output(struct pppoe_softc *, struct mbuf *);
 
 /* internal helper functions */
-static struct pppoe_softc * pppoe_find_softc_by_session(u_int, struct ifnet *, krw_t);
+static struct pppoe_softc * pppoe_find_softc_by_session(u_int, struct ifnet *,
+    krw_t);
 static struct pppoe_softc * pppoe_find_softc_by_hunique(uint8_t *, size_t,
     struct ifnet *, krw_t);
 static struct mbuf *pppoe_get_mbuf(size_t len);
@@ -291,6 +292,7 @@ static int
 pppoe_clone_create(struct if_clone *ifc, int unit)
 {
 	struct pppoe_softc *sc;
+	int rv;
 
 	sc = malloc(sizeof(struct pppoe_softc), M_DEVBUF, M_WAITOK|M_ZERO);
 
@@ -323,7 +325,13 @@ pppoe_clone_create(struct if_clone *ifc,
 	sc->sc_sppp.pp_tlf = pppoe_tlf;
 	sc->sc_sppp.pp_framebytes = PPPOE_HEADERLEN;	/* framing added to ppp packets */
 
-	if_initialize(&sc->sc_sppp.pp_if);
+	rv = if_initialize(&sc->sc_sppp.pp_if);
+	if (rv != 0) {
+		callout_halt(&sc->sc_timeout, NULL);
+		callout_destroy(&sc->sc_timeout);
+		free(sc, M_DEVBUF);
+		return rv;
+	}
 	sc->sc_sppp.pp_if.if_percpuq = if_percpuq_create(&sc->sc_sppp.pp_if);
 	sppp_attach(&sc->sc_sppp.pp_if);
 	if_register(&sc->sc_sppp.pp_if);
@@ -358,7 +366,6 @@ pppoe_clone_destroy(struct ifnet *ifp)
 	}
 	rw_exit(&pppoe_softc_list_lock);
 
-
 	bpf_detach(ifp);
 	sppp_detach(&sc->sc_sppp.pp_if);
 	if_detach(ifp);
@@ -377,7 +384,7 @@ pppoe_clone_destroy(struct ifnet *ifp)
 
 	free(sc, M_DEVBUF);
 
-	return (0);
+	return 0;
 }
 
 /*
@@ -632,8 +639,9 @@ pppoe_dispatch_disc_pkt(struct mbuf *m, 
 #endif
 			rcvif = m_get_rcvif_psref(m, &psref);
 			if (rcvif != NULL) {
-				sc = pppoe_find_softc_by_hunique(mtod(n, char *) + noff,
-				    len, rcvif, RW_READER);
+				sc = pppoe_find_softc_by_hunique(
+					mtod(n, char *) + noff, len, rcvif,
+					RW_READER);
 			}
 			m_put_rcvif_psref(rcvif, &psref);
 			if (sc != NULL) {
@@ -1013,8 +1021,7 @@ pppoe_data_input(struct mbuf *m)
 		struct mbuf *p;
 
 		printf("%s: pkthdr.len=%d, pppoe.len=%d",
-			sc->sc_sppp.pp_if.if_xname,
-			m->m_pkthdr.len, plen);
+		    sc->sc_sppp.pp_if.if_xname, m->m_pkthdr.len, plen);
 		p = m;
 		while (p) {
 			printf(" l=%d", p->m_len);
@@ -1028,7 +1035,10 @@ pppoe_data_input(struct mbuf *m)
 	if (m->m_pkthdr.len < plen)
 		goto drop;
 
-	/* fix incoming interface pointer (not the raw ethernet interface anymore) */
+	/*
+	 *  Fix incoming interface pointer (not the raw ethernet interface
+	 * anymore)
+	 */
 	m_set_rcvif(m, &sc->sc_sppp.pp_if);
 
 	/* pass packet up and account for it */
@@ -1055,7 +1065,8 @@ pppoe_output(struct pppoe_softc *sc, str
 	memset(&dst, 0, sizeof dst);
 	dst.sa_family = AF_UNSPEC;
 	eh = (struct ether_header*)&dst.sa_data;
-	etype = sc->sc_state == PPPOE_STATE_SESSION ? ETHERTYPE_PPPOE : ETHERTYPE_PPPOEDISC;
+	etype = sc->sc_state == PPPOE_STATE_SESSION
+	    ? ETHERTYPE_PPPOE : ETHERTYPE_PPPOEDISC;
 	eh->ether_type = htons(etype);
 	memcpy(&eh->ether_dhost, &sc->sc_dest, sizeof sc->sc_dest);
 
@@ -1086,7 +1097,7 @@ pppoe_ioctl(struct ifnet *ifp, unsigned 
 		if (kauth_authorize_network(l->l_cred, KAUTH_NETWORK_INTERFACE,
 		    KAUTH_REQ_NETWORK_INTERFACE_SETPRIV, ifp, (void *)cmd,
 		    NULL) != 0)
-			return (EPERM);
+			return EPERM;
 		if (parms->eth_ifname[0] != 0) {
 			struct ifnet	*eth_if;
 
@@ -1377,8 +1388,7 @@ pppoe_timeout(void *arg)
 				if (sc->sc_sppp.pp_if.if_flags & IFF_DEBUG)
 					printf("%s: failed to send PADI"
 					    ", error=%d\n",
-					    sc->sc_sppp.pp_if.if_xname,
-					    err);
+					    sc->sc_sppp.pp_if.if_xname, err);
 			}
 			callout_reset(&sc->sc_timeout,
 			    PPPOE_DISC_TIMEOUT * (1 + sc->sc_padi_retried),
@@ -1456,7 +1466,8 @@ pppoe_disconnect(struct pppoe_softc *sc)
 		if (sc->sc_sppp.pp_if.if_flags & IFF_DEBUG)
 			printf("%s: disconnecting\n",
 			    sc->sc_sppp.pp_if.if_xname);
-		err = pppoe_send_padt(sc->sc_eth_if, sc->sc_session, (const uint8_t *)&sc->sc_dest);
+		err = pppoe_send_padt(sc->sc_eth_if, sc->sc_session,
+		    (const uint8_t *)&sc->sc_dest);
 	}
 
 	/* cleanup softc */

Index: src/sys/net/if_srt.c
diff -u src/sys/net/if_srt.c:1.26 src/sys/net/if_srt.c:1.26.6.1
--- src/sys/net/if_srt.c:1.26	Tue Feb 14 03:05:06 2017
+++ src/sys/net/if_srt.c	Sun Dec 10 10:10:25 2017
@@ -1,8 +1,8 @@
-/* $NetBSD: if_srt.c,v 1.26 2017/02/14 03:05:06 ozaki-r Exp $ */
+/* $NetBSD: if_srt.c,v 1.26.6.1 2017/12/10 10:10:25 snj Exp $ */
 /* This file is in the public domain. */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_srt.c,v 1.26 2017/02/14 03:05:06 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_srt.c,v 1.26.6.1 2017/12/10 10:10:25 snj Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -88,7 +88,7 @@ update_mtu(struct srt_softc *sc)
 	if (sc->flags & SSF_MTULOCK)
 		return;
 	mtu = 65535;
-	for (i=sc->nrt-1;i>=0;i--) {
+	for (i = sc->nrt-1; i>=0; i--) {
 		r = sc->rts[i];
 		if (r->u.dstifp->if_mtu < mtu)
 			mtu = r->u.dstifp->if_mtu;
@@ -249,12 +249,13 @@ static int
 srt_clone_create(struct if_clone *cl, int unit)
 {
 	struct srt_softc *sc;
+	int rv;
 
 	if (unit < 0 || unit > SRT_MAXUNIT)
 		return ENXIO;
 	if (softcv[unit])
 		return EBUSY;
-	sc = malloc(sizeof(struct srt_softc), M_DEVBUF, M_WAITOK|M_ZERO);
+	sc = malloc(sizeof(struct srt_softc), M_DEVBUF, M_WAITOK | M_ZERO);
 	sc->unit = unit;
 	sc->nrt = 0;
 	sc->rts = 0;
@@ -268,7 +269,13 @@ srt_clone_create(struct if_clone *cl, in
 	sc->intf.if_ioctl = &srt_if_ioctl;
 	sc->intf.if_output = &srt_if_output;
 	sc->intf.if_dlt = DLT_RAW;
-	if_attach(&sc->intf);
+	rv = if_attach(&sc->intf);
+	if (rv != 0) {
+		aprint_error("%s: if_initialize failed(%d)\n",
+		    sc->intf.if_xname, rv);
+		free(sc, M_DEVBUF);
+		return rv;
+	}
 	if_alloc_sadl(&sc->intf);
 #ifdef BPFILTER_NOW_AVAILABLE
 	bpf_attach(&sc->intf, 0, 0);
@@ -295,16 +302,16 @@ srt_clone_destroy(struct ifnet *ifp)
 	}
 	if (softcv[sc->unit] != sc) {
 		panic("srt_clone_destroy: bad backpointer ([%d]=%p not %p)\n",
-		sc->unit,(void *)softcv[sc->unit],(void *)sc);
+		sc->unit, (void *)softcv[sc->unit], (void *)sc);
 	}
 	softcv[sc->unit] = 0;
-	free(sc,M_DEVBUF);
+	free(sc, M_DEVBUF);
 	atomic_inc_uint(&srt_count);
 	return 0;
 }
 
 struct if_clone srt_clone =
-    IF_CLONE_INITIALIZER("srt",&srt_clone_create,&srt_clone_destroy);
+    IF_CLONE_INITIALIZER("srt", &srt_clone_create, &srt_clone_destroy);
 
 void
 srtattach(int n)
@@ -408,8 +415,9 @@ srt_ioctl(dev_t dev, u_long cmd, void *d
 		dr->af = scr->af;
 		dr->srcmatch = scr->srcmatch;
 		dr->srcmask = scr->srcmask;
-		strlcpy(&dr->u.dstifn[0],&scr->u.dstifp->if_xname[0],IFNAMSIZ);
-		memcpy(&dr->dst,&scr->dst,scr->dst.sa.sa_len);
+		strlcpy(&dr->u.dstifn[0], &scr->u.dstifp->if_xname[0],
+		    IFNAMSIZ);
+		memcpy(&dr->dst, &scr->dst, scr->dst.sa.sa_len);
 		return 0;
 	case SRT_SETRT:
 		if (! (flag & FWRITE))
@@ -417,7 +425,7 @@ srt_ioctl(dev_t dev, u_long cmd, void *d
 		dr = (struct srt_rt *) data;
 		if (dr->inx > sc->nrt)
 			return EDOM;
-		strlcpy(&nbuf[0],&dr->u.dstifn[0],IFNAMSIZ);
+		strlcpy(&nbuf[0], &dr->u.dstifn[0], IFNAMSIZ);
 		nbuf[IFNAMSIZ-1] = '\0';
 		if (dr->dst.sa.sa_family != dr->af)
 			return EIO;
@@ -460,7 +468,7 @@ srt_ioctl(dev_t dev, u_long cmd, void *d
 		}
 		scr = sc->rts[dr->inx];
 		if (scr == 0) {
-			scr = malloc(sizeof(struct srt_rt),M_DEVBUF,M_WAITOK);
+			scr = malloc(sizeof(struct srt_rt), M_DEVBUF,M_WAITOK);
 			if (scr == 0)
 				return ENOBUFS;
 			scr->inx = dr->inx;
@@ -488,7 +496,7 @@ srt_ioctl(dev_t dev, u_long cmd, void *d
 		sc->nrt--;
 		if (i < sc->nrt) {
 			memcpy(sc->rts+i, sc->rts+i+1,
-			    (sc->nrt-i)*sizeof(*sc->rts));
+			    (sc->nrt-i) * sizeof(*sc->rts));
 		}
 		if (sc->nrt == 0) {
 			free(sc->rts, M_DEVBUF);
@@ -510,7 +518,7 @@ srt_ioctl(dev_t dev, u_long cmd, void *d
 		*(unsigned int *)data = sc->flags | global_flags;
 		return 0;
 	case SRT_SGFLAGS:
-		if ((flag & (FWRITE|FREAD)) != (FWRITE|FREAD))
+		if ((flag & (FWRITE | FREAD)) != (FWRITE | FREAD))
 			return EBADF;
 		o = sc->flags | global_flags;
 		n = *(unsigned int *)data & SSF_UCHG;

Index: src/sys/net/if_stf.c
diff -u src/sys/net/if_stf.c:1.101.8.1 src/sys/net/if_stf.c:1.101.8.2
--- src/sys/net/if_stf.c:1.101.8.1	Sun Dec 10 09:41:31 2017
+++ src/sys/net/if_stf.c	Sun Dec 10 10:10:25 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_stf.c,v 1.101.8.1 2017/12/10 09:41:31 snj Exp $	*/
+/*	$NetBSD: if_stf.c,v 1.101.8.2 2017/12/10 10:10:25 snj Exp $	*/
 /*	$KAME: if_stf.c,v 1.62 2001/06/07 22:32:16 itojun Exp $ */
 
 /*
@@ -75,7 +75,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_stf.c,v 1.101.8.1 2017/12/10 09:41:31 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_stf.c,v 1.101.8.2 2017/12/10 10:10:25 snj Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -220,7 +220,7 @@ stf_clone_create(struct if_clone *ifc, i
 		/* Only one stf interface is allowed. */
 		encap_lock_exit();
 		free(sc, M_DEVBUF);
-		return (EEXIST);
+		return EEXIST;
 	}
 
 	sc->encap_cookie = encap_attach_func(AF_INET, IPPROTO_IPV6,
@@ -229,7 +229,7 @@ stf_clone_create(struct if_clone *ifc, i
 	if (sc->encap_cookie == NULL) {
 		printf("%s: unable to attach encap\n", if_name(&sc->sc_if));
 		free(sc, M_DEVBUF);
-		return (EIO);	/* XXX */
+		return EIO;	/* XXX */
 	}
 
 	sc->sc_if.if_mtu    = STF_MTU;
@@ -238,11 +238,20 @@ stf_clone_create(struct if_clone *ifc, i
 	sc->sc_if.if_output = stf_output;
 	sc->sc_if.if_type   = IFT_STF;
 	sc->sc_if.if_dlt    = DLT_NULL;
-	if_attach(&sc->sc_if);
+	error = if_attach(&sc->sc_if);
+	if (error != 0) {
+		aprint_error("%s: if_initialize failed(%d)\n",
+		    if_name(&sc->sc_if), error);
+		encap_lock_enter();
+		encap_detach(sc->encap_cookie);
+		encap_lock_exit();
+		free(sc, M_DEVBUF);
+		return error;
+	}
 	if_alloc_sadl(&sc->sc_if);
 	bpf_attach(&sc->sc_if, DLT_NULL, sizeof(u_int));
 	LIST_INSERT_HEAD(&stf_softc_list, sc, sc_list);
-	return (0);
+	return 0;
 }
 
 static int
@@ -259,7 +268,7 @@ stf_clone_destroy(struct ifnet *ifp)
 	rtcache_free(&sc->sc_ro);
 	free(sc, M_DEVBUF);
 
-	return (0);
+	return 0;
 }
 
 static int

Index: src/sys/net/if_tap.c
diff -u src/sys/net/if_tap.c:1.99.6.1 src/sys/net/if_tap.c:1.99.6.2
--- src/sys/net/if_tap.c:1.99.6.1	Wed Nov  8 22:20:59 2017
+++ src/sys/net/if_tap.c	Sun Dec 10 10:10:25 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_tap.c,v 1.99.6.1 2017/11/08 22:20:59 snj Exp $	*/
+/*	$NetBSD: if_tap.c,v 1.99.6.2 2017/12/10 10:10:25 snj Exp $	*/
 
 /*
  *  Copyright (c) 2003, 2004, 2008, 2009 The NetBSD Foundation.
@@ -33,7 +33,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_tap.c,v 1.99.6.1 2017/11/08 22:20:59 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_tap.c,v 1.99.6.2 2017/12/10 10:10:25 snj Exp $");
 
 #if defined(_KERNEL_OPT)
 
@@ -380,7 +380,17 @@ tap_attach(device_t parent, device_t sel
 	sc->sc_ec.ec_capabilities = ETHERCAP_VLAN_MTU | ETHERCAP_JUMBO_MTU;
 
 	/* Those steps are mandatory for an Ethernet driver. */
-	if_initialize(ifp);
+	error = if_initialize(ifp);
+	if (error != 0) {
+		aprint_error_dev(self, "if_initialize failed(%d)\n", error);
+		ifmedia_removeall(&sc->sc_im);
+		pmf_device_deregister(self);
+		mutex_destroy(&sc->sc_rdlock);
+		mutex_destroy(&sc->sc_kqlock);
+		seldestroy(&sc->sc_rsel);
+
+		return; /* Error */
+	}
 	ether_ifattach(ifp, enaddr);
 	if_register(ifp);
 
@@ -404,8 +414,8 @@ tap_attach(device_t parent, device_t sel
 	    tap_sysctl_handler, 0, (void *)sc, 18,
 	    CTL_NET, AF_LINK, tap_node, device_unit(sc->sc_dev),
 	    CTL_EOL)) != 0)
-		aprint_error_dev(self, "sysctl_createv returned %d, ignoring\n",
-		    error);
+		aprint_error_dev(self,
+		    "sysctl_createv returned %d, ignoring\n", error);
 }
 
 /*
@@ -442,7 +452,7 @@ tap_detach(device_t self, int flags)
 		    "sysctl_destroyv returned %d, ignoring\n", error);
 	ether_ifdetach(ifp);
 	if_detach(ifp);
-	ifmedia_delete_instance(&sc->sc_im, IFM_INST_ANY);
+	ifmedia_removeall(&sc->sc_im);
 	seldestroy(&sc->sc_rsel);
 	mutex_destroy(&sc->sc_rdlock);
 	mutex_destroy(&sc->sc_kqlock);

Index: src/sys/net/if_vlan.c
diff -u src/sys/net/if_vlan.c:1.97.2.9 src/sys/net/if_vlan.c:1.97.2.10
--- src/sys/net/if_vlan.c:1.97.2.9	Mon Nov 27 14:11:17 2017
+++ src/sys/net/if_vlan.c	Sun Dec 10 10:10:25 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_vlan.c,v 1.97.2.9 2017/11/27 14:11:17 martin Exp $	*/
+/*	$NetBSD: if_vlan.c,v 1.97.2.10 2017/12/10 10:10:25 snj Exp $	*/
 
 /*-
  * Copyright (c) 2000, 2001 The NetBSD Foundation, Inc.
@@ -78,7 +78,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_vlan.c,v 1.97.2.9 2017/11/27 14:11:17 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_vlan.c,v 1.97.2.10 2017/12/10 10:10:25 snj Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -317,6 +317,7 @@ vlan_clone_create(struct if_clone *ifc, 
 	struct ifvlan *ifv;
 	struct ifnet *ifp;
 	struct ifvlan_linkmib *mib;
+	int rv;
 
 	ifv = malloc(sizeof(struct ifvlan), M_DEVBUF, M_WAITOK|M_ZERO);
 	mib = kmem_zalloc(sizeof(struct ifvlan_linkmib), KM_SLEEP);
@@ -343,11 +344,28 @@ vlan_clone_create(struct if_clone *ifc, 
 	ifp->if_ioctl = vlan_ioctl;
 	IFQ_SET_READY(&ifp->if_snd);
 
-	if_initialize(ifp);
+	rv = if_initialize(ifp);
+	if (rv != 0) {
+		aprint_error("%s: if_initialize failed(%d)\n", ifp->if_xname,
+		    rv);
+		goto fail;
+	}
+
 	vlan_reset_linkname(ifp);
 	if_register(ifp);
+	return 0;
 
-	return (0);
+fail:
+	mutex_enter(&ifv_list.lock);
+	LIST_REMOVE(ifv, ifv_list);
+	mutex_exit(&ifv_list.lock);
+
+	mutex_destroy(&ifv->ifv_lock);
+	psref_target_destroy(&ifv->ifv_mib->ifvm_psref, ifvm_psref_class);
+	kmem_free(ifv->ifv_mib, sizeof(struct ifvlan_linkmib));
+	free(ifv, M_DEVBUF);
+
+	return rv;
 }
 
 static int

Index: src/sys/netinet/ip_carp.c
diff -u src/sys/netinet/ip_carp.c:1.90.2.1 src/sys/netinet/ip_carp.c:1.90.2.2
--- src/sys/netinet/ip_carp.c:1.90.2.1	Thu Nov 30 15:57:37 2017
+++ src/sys/netinet/ip_carp.c	Sun Dec 10 10:10:25 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: ip_carp.c,v 1.90.2.1 2017/11/30 15:57:37 martin Exp $	*/
+/*	$NetBSD: ip_carp.c,v 1.90.2.2 2017/12/10 10:10:25 snj Exp $	*/
 /*	$OpenBSD: ip_carp.c,v 1.113 2005/11/04 08:11:54 mcbride Exp $	*/
 
 /*
@@ -33,7 +33,7 @@
 #endif
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip_carp.c,v 1.90.2.1 2017/11/30 15:57:37 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip_carp.c,v 1.90.2.2 2017/12/10 10:10:25 snj Exp $");
 
 /*
  * TODO:
@@ -847,6 +847,7 @@ carp_clone_create(struct if_clone *ifc, 
 	extern int ifqmaxlen;
 	struct carp_softc *sc;
 	struct ifnet *ifp;
+	int rv;
 
 	sc = malloc(sizeof(*sc), M_DEVBUF, M_NOWAIT|M_ZERO);
 	if (!sc)
@@ -880,7 +881,15 @@ carp_clone_create(struct if_clone *ifc, 
 	ifp->if_start = carp_start;
 	IFQ_SET_MAXLEN(&ifp->if_snd, ifqmaxlen);
 	IFQ_SET_READY(&ifp->if_snd);
-	if_initialize(ifp);
+	rv = if_initialize(ifp);
+	if (rv != 0) {	
+		callout_destroy(&sc->sc_ad_tmo);
+		callout_destroy(&sc->sc_md_tmo);
+		callout_destroy(&sc->sc_md6_tmo);
+		free(ifp->if_softc, M_DEVBUF);
+
+		return rv;
+	}
 	ether_ifattach(ifp, NULL);
 	carp_set_enaddr(sc);
 	/* Overwrite ethernet defaults */

Index: src/sys/rump/net/lib/libshmif/if_shmem.c
diff -u src/sys/rump/net/lib/libshmif/if_shmem.c:1.72 src/sys/rump/net/lib/libshmif/if_shmem.c:1.72.8.1
--- src/sys/rump/net/lib/libshmif/if_shmem.c:1.72	Thu Dec 22 12:55:28 2016
+++ src/sys/rump/net/lib/libshmif/if_shmem.c	Sun Dec 10 10:10:25 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_shmem.c,v 1.72 2016/12/22 12:55:28 ozaki-r Exp $	*/
+/*	$NetBSD: if_shmem.c,v 1.72.8.1 2017/12/10 10:10:25 snj Exp $	*/
 
 /*
  * Copyright (c) 2009, 2010 Antti Kantee.  All Rights Reserved.
@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_shmem.c,v 1.72 2016/12/22 12:55:28 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_shmem.c,v 1.72.8.1 2017/12/10 10:10:25 snj Exp $");
 
 #include <sys/param.h>
 #include <sys/atomic.h>
@@ -187,7 +187,16 @@ allocif(int unit, struct shmif_sc **scp)
 	mutex_init(&sc->sc_mtx, MUTEX_DEFAULT, IPL_NONE);
 	cv_init(&sc->sc_cv, "shmifcv");
 
-	if_initialize(ifp);
+	error = if_initialize(ifp);
+	if (error != 0) {
+		aprint_error("shmif%d: if_initialize failed(%d)\n", unit,
+		    error);
+		cv_destroy(&sc->sc_cv);
+		mutex_destroy(&sc->sc_mtx);
+		kmem_free(sc, sizeof(*sc));
+
+		return error;
+	}
 	ether_ifattach(ifp, enaddr);
 	if_register(ifp);
 

Index: src/sys/rump/net/lib/libvirtif/if_virt.c
diff -u src/sys/rump/net/lib/libvirtif/if_virt.c:1.54 src/sys/rump/net/lib/libvirtif/if_virt.c:1.54.8.1
--- src/sys/rump/net/lib/libvirtif/if_virt.c:1.54	Thu Dec 15 09:28:07 2016
+++ src/sys/rump/net/lib/libvirtif/if_virt.c	Sun Dec 10 10:10:25 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_virt.c,v 1.54 2016/12/15 09:28:07 ozaki-r Exp $	*/
+/*	$NetBSD: if_virt.c,v 1.54.8.1 2017/12/10 10:10:25 snj Exp $	*/
 
 /*
  * Copyright (c) 2008, 2013 Antti Kantee.  All Rights Reserved.
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_virt.c,v 1.54 2016/12/15 09:28:07 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_virt.c,v 1.54.8.1 2017/12/10 10:10:25 snj Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -121,7 +121,13 @@ virtif_clone(struct if_clone *ifc, int n
 	ifp->if_mtu = ETHERMTU;
 	ifp->if_dlt = DLT_EN10MB;
 
-	if_initialize(ifp);
+	error = if_initialize(ifp);
+	if (error != 0) {
+		aprint_error("%s: if_initialize failed(%d)\n", ifp->if_xname,
+		    error);
+		goto fail_1;
+	}
+
 	if_register(ifp);
 
 #ifndef RUMP_VIF_LINKSTR
@@ -132,11 +138,19 @@ virtif_clone(struct if_clone *ifc, int n
 	 */
 #define LINKSTRNUMLEN 16
 	sc->sc_linkstr = kmem_alloc(LINKSTRNUMLEN, KM_SLEEP);
+	if (sc->sc_linkstr == NULL) {
+		error = ENOMEM;
+		goto fail_2;
+	}
 	snprintf(sc->sc_linkstr, LINKSTRNUMLEN, "%d", sc->sc_num);
-#undef LINKSTRNUMLEN
 	error = virtif_create(ifp);
 	if (error) {
+fail_2:
 		if_detach(ifp);
+		if (sc->sc_linkstr != NULL)
+			kmem_free(sc->sc_linkstr, LINKSTRNUMLEN);
+#undef LINKSTRNUMLEN
+fail_1:
 		kmem_free(sc, sizeof(*sc));
 		ifp->if_softc = NULL;
 	}

Reply via email to