{ether,ieee80211}_ifdetach() can't be called with serializer being held, since
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Sat, 31 Dec 2005 14:08:01 +0000 (14:08 +0000)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Sat, 31 Dec 2005 14:08:01 +0000 (14:08 +0000)
they will go through code which tries to hold serializer again, e.g.
ether_ifdetach() -> if_detach() -> in_control()

So in various NICs' xxx_detach():
- Move bus_teardown_intr() under "(device_is_attached())", whenever it is
  applicable.  Since it is not possible that intrhandle is NULL here, nuke
  original "(intrhandle != NULL)".  This can:
    1) Avoid holding serializer, if xxx_attach() fails
    2) Release serializer ASAP
    3) Ease following tasks
- Hold serializer only for xxx_stop()(or similar functions which stops NIC) and
  bus_teardown_intr()
- Call {ether,ieee80211}_ifdetach() after serializer is released

Other stuffs:
- Serialize xxx_detach() for awi(4), ep(4), sn(4) and xe(4)
- Release serializer before returning from {ed_pccard,ray}_detach()
- Make ipw(4)'s ipw_detach() suitable for error handling, adjust ipw_attach()
  accordingly
- Fix a bug in ex_pccard_detach(): instead of if_detach(), ether_ifdetach()
  should be used here
- For ndis(4), "ifp->serializer" ==> "ifp->if_serializer"
Reported-by: esmith <esmith@postmark.net>
Discussed-with: dillon and joerg
Partially-Reviewed-by: dillon and joerg
Reported-by: Steve Mynott <steve.mynott@gmail.com> and me
48 files changed:
sys/dev/netif/an/if_an.c
sys/dev/netif/awi/if_awi_pccard.c
sys/dev/netif/bfe/if_bfe.c
sys/dev/netif/bge/if_bge.c
sys/dev/netif/cm/if_cm_isa.c
sys/dev/netif/cs/if_cs.c
sys/dev/netif/dc/if_dc.c
sys/dev/netif/ed/if_ed_isa.c
sys/dev/netif/ed/if_ed_pccard.c
sys/dev/netif/ed/if_ed_pci.c
sys/dev/netif/em/if_em.c
sys/dev/netif/ep/if_ep_pccard.c
sys/dev/netif/ex/if_ex_pccard.c
sys/dev/netif/fe/if_fe_pccard.c
sys/dev/netif/fwe/if_fwe.c
sys/dev/netif/fxp/if_fxp.c
sys/dev/netif/gx/if_gx.c
sys/dev/netif/ipw/if_ipw.c
sys/dev/netif/iwi/if_iwi.c
sys/dev/netif/lge/if_lge.c
sys/dev/netif/lnc/if_lnc_isa.c
sys/dev/netif/lnc/if_lnc_pci.c
sys/dev/netif/my/if_my.c
sys/dev/netif/ndis/if_ndis.c
sys/dev/netif/nge/if_nge.c
sys/dev/netif/nv/if_nv.c
sys/dev/netif/owi/if_owi.c
sys/dev/netif/pcn/if_pcn.c
sys/dev/netif/ray/if_ray.c
sys/dev/netif/re/if_re.c
sys/dev/netif/rl/if_rl.c
sys/dev/netif/sbsh/if_sbsh.c
sys/dev/netif/sf/if_sf.c
sys/dev/netif/sis/if_sis.c
sys/dev/netif/sk/if_sk.c
sys/dev/netif/sn/if_sn.c
sys/dev/netif/sn/if_sn_pccard.c
sys/dev/netif/ste/if_ste.c
sys/dev/netif/ti/if_ti.c
sys/dev/netif/tl/if_tl.c
sys/dev/netif/tx/if_tx.c
sys/dev/netif/txp/if_txp.c
sys/dev/netif/vr/if_vr.c
sys/dev/netif/wb/if_wb.c
sys/dev/netif/wi/if_wi.c
sys/dev/netif/wl/if_wl.c
sys/dev/netif/xe/if_xe.c
sys/dev/netif/xl/if_xl.c

index 4652be8..cf377a7 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/an/if_an.c,v 1.2.2.13 2003/02/11 03:32:48 ambrisko Exp $
- * $DragonFly: src/sys/dev/netif/an/if_an.c,v 1.35 2005/12/11 01:54:08 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/an/if_an.c,v 1.36 2005/12/31 14:07:58 sephe Exp $
  */
 
 /*
@@ -794,11 +794,12 @@ an_detach(device_t dev)
 
        lwkt_serialize_enter(ifp->if_serializer);
        an_stop(sc);
+       bus_teardown_intr(dev, sc->irq_res, sc->irq_handle);
+       lwkt_serialize_exit(ifp->if_serializer);
+
        ifmedia_removeall(&sc->an_ifmedia);
        ether_ifdetach(ifp);
-       bus_teardown_intr(dev, sc->irq_res, sc->irq_handle);
        an_release_resources(dev);
-       lwkt_serialize_exit(ifp->if_serializer);
        return 0;
 }
 
index bd60232..9f00210 100644 (file)
@@ -23,7 +23,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/awi/if_awi_pccard.c,v 1.5.2.1 2000/12/07 04:09:39 imp Exp $
- * $DragonFly: src/sys/dev/netif/awi/Attic/if_awi_pccard.c,v 1.14 2005/11/28 17:13:41 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/awi/Attic/if_awi_pccard.c,v 1.15 2005/12/31 14:07:58 sephe Exp $
  */
 
 #include <sys/param.h>
@@ -239,12 +239,16 @@ awi_pccard_detach(device_t dev)
        struct awi_softc *sc = &psc->sc_awi;
        struct ifnet *ifp = &sc->sc_ec.ac_if;
 
-       ether_ifdetach(ifp);
+       lwkt_serialize_enter(&ifp->if_serializer);
        ifp->if_flags &= ~IFF_RUNNING; 
        if (psc->sc_intrhand) {
                bus_teardown_intr(dev, psc->sc_irq_res, psc->sc_intrhand);
                psc->sc_intrhand = 0;
        }
+       lwkt_serialize_exit(&ifp->if_serializer);
+
+       ether_ifdetach(ifp);
+
        if (psc->sc_port_res) {
                bus_release_resource(dev, SYS_RES_IOPORT, psc->sc_port_rid,
                    psc->sc_port_res);
index a319ab7..e6524ce 100644 (file)
@@ -29,7 +29,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/bfe/if_bfe.c 1.4.4.7 2004/03/02 08:41:33 julian Exp  v
- * $DragonFly: src/sys/dev/netif/bfe/if_bfe.c,v 1.27 2005/11/28 17:13:41 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/bfe/if_bfe.c,v 1.28 2005/12/31 14:07:58 sephe Exp $
  */
 
 #include <sys/param.h>
@@ -440,20 +440,19 @@ bfe_detach(device_t dev)
        struct bfe_softc *sc = device_get_softc(dev);
        struct ifnet *ifp = &sc->arpcom.ac_if;
 
-       lwkt_serialize_enter(ifp->if_serializer);
-
        if (device_is_attached(dev)) {
+               lwkt_serialize_enter(ifp->if_serializer);
                bfe_stop(sc);
-               ether_ifdetach(ifp);
                bfe_chip_reset(sc);
+               bus_teardown_intr(dev, sc->bfe_irq, sc->bfe_intrhand);
+               lwkt_serialize_exit(ifp->if_serializer);
+
+               ether_ifdetach(ifp);
        }
        if (sc->bfe_miibus != NULL)
                device_delete_child(dev, sc->bfe_miibus);
        bus_generic_detach(dev);
 
-       if (sc->bfe_intrhand != NULL)
-               bus_teardown_intr(dev, sc->bfe_irq, sc->bfe_intrhand);
-
        if (sc->bfe_irq != NULL)
                bus_release_resource(dev, SYS_RES_IRQ, 0, sc->bfe_irq);
 
@@ -462,7 +461,7 @@ bfe_detach(device_t dev)
                                     sc->bfe_res);
        }
        bfe_dma_free(sc);
-       lwkt_serialize_exit(ifp->if_serializer);
+
        return(0);
 }
 
index fa0f5b0..76d6661 100644 (file)
@@ -31,7 +31,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/bge/if_bge.c,v 1.3.2.29 2003/12/01 21:06:59 ambrisko Exp $
- * $DragonFly: src/sys/dev/netif/bge/if_bge.c,v 1.51 2005/11/29 19:56:50 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/bge/if_bge.c,v 1.52 2005/12/31 14:07:59 sephe Exp $
  *
  */
 
@@ -1758,14 +1758,15 @@ bge_detach(device_t dev)
        struct bge_softc *sc = device_get_softc(dev);
        struct ifnet *ifp = &sc->arpcom.ac_if;
 
-       lwkt_serialize_enter(ifp->if_serializer);
-
        if (device_is_attached(dev)) {
-               ether_ifdetach(ifp);
+               lwkt_serialize_enter(ifp->if_serializer);
                bge_stop(sc);
                bge_reset(sc);
-       }
+               bus_teardown_intr(dev, sc->bge_irq, sc->bge_intrhand);
+               lwkt_serialize_exit(ifp->if_serializer);
 
+               ether_ifdetach(ifp);
+       }
        if (sc->bge_tbi)
                ifmedia_removeall(&sc->bge_ifmedia);
        if (sc->bge_miibus);
@@ -1778,8 +1779,6 @@ bge_detach(device_t dev)
            sc->bge_asicrev != BGE_ASICREV_BCM5750)
                bge_free_jumbo_mem(sc);
 
-       lwkt_serialize_exit(ifp->if_serializer);
-
        return(0);
 }
 
@@ -1796,9 +1795,6 @@ bge_release_resources(struct bge_softc *sc)
        if (sc->bge_vpd_readonly != NULL)
                free(sc->bge_vpd_readonly, M_DEVBUF);
 
-        if (sc->bge_intrhand != NULL)
-                bus_teardown_intr(dev, sc->bge_irq, sc->bge_intrhand);
-
         if (sc->bge_irq != NULL)
                bus_release_resource(dev, SYS_RES_IRQ, 0, sc->bge_irq);
 
index 46c9bc7..ea0b350 100644 (file)
@@ -1,6 +1,6 @@
 /*     $NetBSD: if_bah_zbus.c,v 1.6 2000/01/23 21:06:12 aymeric Exp $ */
 /*     $FreeBSD: src/sys/dev/cm/if_cm_isa.c,v 1.1.2.1 2002/02/13 22:33:41 fjoe Exp $ */
-/*     $DragonFly: src/sys/dev/netif/cm/Attic/if_cm_isa.c,v 1.13 2005/11/28 17:13:41 dillon Exp $ */
+/*     $DragonFly: src/sys/dev/netif/cm/Attic/if_cm_isa.c,v 1.14 2005/12/31 14:07:59 sephe Exp $ */
 
 /*-
  * Copyright (c) 1994, 1995, 1998 The NetBSD Foundation, Inc.
@@ -105,11 +105,12 @@ cm_isa_detach(device_t dev)
 
        lwkt_serialize_enter(sc->sc_arccom.ac_if.if_serializer);
        cm_stop(sc);
-       arc_ifdetach(&sc->sc_arccom.ac_if);
        bus_teardown_intr(dev, sc->irq_res, sc->irq_handle);
-       cm_release_resources(dev);
        lwkt_serialize_exit(sc->sc_arccom.ac_if.if_serializer);
 
+       arc_ifdetach(&sc->sc_arccom.ac_if);
+       cm_release_resources(dev);
+
        return (0);
 }
 
index e4d50ed..4a2b070 100644 (file)
@@ -25,7 +25,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/cs/if_cs.c,v 1.19.2.1 2001/01/25 20:13:48 imp Exp $
- * $DragonFly: src/sys/dev/netif/cs/if_cs.c,v 1.23 2005/11/28 17:13:41 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/cs/if_cs.c,v 1.24 2005/12/31 14:07:59 sephe Exp $
  */
 
 /*
@@ -695,14 +695,14 @@ cs_detach(device_t dev)
        struct cs_softc *sc = device_get_softc(dev);
        struct ifnet *ifp = &sc->arpcom.ac_if;
 
-       lwkt_serialize_enter(ifp->if_serializer);
-
        if (device_is_attached(dev)) {
+               lwkt_serialize_enter(ifp->if_serializer);
                cs_stop(sc);
+               bus_teardown_intr(dev, sc->irq_res, sc->irq_handle);
+               lwkt_serialize_exit(ifp->if_serializer);
+
                ether_ifdetach(&sc->arpcom.ac_if);
        }
-       if (sc->irq_handle != NULL)
-               bus_teardown_intr(dev, sc->irq_res, sc->irq_handle);
 
 #if 0
        /*
@@ -717,7 +717,6 @@ cs_detach(device_t dev)
        cs_release_resources(dev);
        ifmedia_removeall(&sc->media);
 
-       lwkt_serialize_exit(ifp->if_serializer);
        return 0;
 }
 
index d145ba3..18cbf92 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/pci/if_dc.c,v 1.9.2.45 2003/06/08 14:31:53 mux Exp $
- * $DragonFly: src/sys/dev/netif/dc/if_dc.c,v 1.48 2005/12/30 13:39:21 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/dc/if_dc.c,v 1.49 2005/12/31 14:07:59 sephe Exp $
  */
 
 /*
@@ -2195,10 +2195,12 @@ dc_detach(device_t dev)
        struct ifnet *ifp = &sc->arpcom.ac_if;
        struct dc_mediainfo *m;
 
-       lwkt_serialize_enter(ifp->if_serializer);
-
        if (device_is_attached(dev)) {
+               lwkt_serialize_enter(ifp->if_serializer);
                dc_stop(sc);
+               bus_teardown_intr(dev, sc->dc_irq, sc->dc_intrhand);
+               lwkt_serialize_exit(ifp->if_serializer);
+
                ether_ifdetach(ifp);
        }
 
@@ -2206,9 +2208,6 @@ dc_detach(device_t dev)
                device_delete_child(dev, sc->dc_miibus);
        bus_generic_detach(dev);
 
-       if (sc->dc_intrhand)
-               bus_teardown_intr(dev, sc->dc_irq, sc->dc_intrhand);
-
        if (sc->dc_irq)
                bus_release_resource(dev, SYS_RES_IRQ, 0, sc->dc_irq);
        if (sc->dc_res)
@@ -2219,7 +2218,7 @@ dc_detach(device_t dev)
        if (sc->dc_pnic_rx_buf != NULL)
                free(sc->dc_pnic_rx_buf, M_DEVBUF);
 
-       while(sc->dc_mi != NULL) {
+       while (sc->dc_mi != NULL) {
                m = sc->dc_mi->dc_next;
                free(sc->dc_mi, M_DEVBUF);
                sc->dc_mi = m;
@@ -2228,7 +2227,6 @@ dc_detach(device_t dev)
        if (sc->dc_srom)
                free(sc->dc_srom, M_DEVBUF);
 
-       lwkt_serialize_exit(ifp->if_serializer);
        return(0);
 }
 
index b3c9399..20e6f61 100644 (file)
@@ -25,7 +25,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/ed/if_ed_isa.c,v 1.15 2003/10/31 18:31:58 brooks Exp $
- * $DragonFly: src/sys/dev/netif/ed/if_ed_isa.c,v 1.13 2005/11/28 17:13:42 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/ed/if_ed_isa.c,v 1.14 2005/12/31 14:07:59 sephe Exp $
  */
 
 #include <sys/param.h>
@@ -150,17 +150,21 @@ ed_isa_detach(device_t dev)
         struct ifnet *ifp = &sc->arpcom.ac_if;
 
         lwkt_serialize_enter(ifp->if_serializer);
+
         if (sc->gone) {
                 device_printf(dev, "already unloaded\n");
+               lwkt_serialize_exit(ifp->if_serializer);
                 return (0);
         }
         ed_stop(sc);
         ifp->if_flags &= ~IFF_RUNNING;
-        ether_ifdetach(ifp);
         sc->gone = 1;
         bus_teardown_intr(dev, sc->irq_res, sc->irq_handle);
-        ed_release_resources(dev);
+
         lwkt_serialize_exit(ifp->if_serializer);
+
+        ether_ifdetach(ifp);
+        ed_release_resources(dev);
         return (0);
 }
 
index 04091dd..619bd21 100644 (file)
@@ -25,7 +25,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/ed/if_ed_pccard.c,v 1.55 2003/12/31 04:25:00 kato Exp $
- * $DragonFly: src/sys/dev/netif/ed/if_ed_pccard.c,v 1.14 2005/11/28 17:13:42 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/ed/if_ed_pccard.c,v 1.15 2005/12/31 14:07:59 sephe Exp $
  */
 
 #include "opt_ed.h"
@@ -103,17 +103,21 @@ ed_pccard_detach(device_t dev)
        struct ifnet *ifp = &sc->arpcom.ac_if;
 
        lwkt_serialize_enter(ifp->if_serializer);
+
        if (sc->gone) {
                device_printf(dev, "already unloaded\n");
+               lwkt_serialize_exit(ifp->if_serializer);
                return (0);
        }
        ed_stop(sc);
        ifp->if_flags &= ~IFF_RUNNING;
-       ether_ifdetach(ifp);
        sc->gone = 1;
        bus_teardown_intr(dev, sc->irq_res, sc->irq_handle);
-       ed_release_resources(dev);
+
        lwkt_serialize_exit(ifp->if_serializer);
+
+       ether_ifdetach(ifp);
+       ed_release_resources(dev);
        return (0);
 }
 
index 8c0a5d6..4b77560 100644 (file)
@@ -18,7 +18,7 @@
  *    are met.
  *
  * $FreeBSD: src/sys/dev/ed/if_ed_pci.c,v 1.34 2003/10/31 18:31:58 brooks Exp $
- * $DragonFly: src/sys/dev/netif/ed/if_ed_pci.c,v 1.10 2005/11/28 17:13:42 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/ed/if_ed_pci.c,v 1.11 2005/12/31 14:07:59 sephe Exp $
  */
 
 #include <sys/param.h>
@@ -117,17 +117,21 @@ ed_pci_detach(device_t dev)
        struct ifnet *ifp = &sc->arpcom.ac_if;
 
        lwkt_serialize_enter(ifp->if_serializer);
+
        if (sc->gone) {
                device_printf(dev, "already unloaded\n");
+               lwkt_serialize_exit(ifp->if_serializer);
                return (0);
        }
        ed_stop(sc);
        ifp->if_flags &= ~IFF_RUNNING;
-       ether_ifdetach(ifp);
        sc->gone = 1;
        bus_teardown_intr(dev, sc->irq_res, sc->irq_handle);
-       ed_release_resources(dev);
+
        lwkt_serialize_exit(ifp->if_serializer);
+
+       ether_ifdetach(ifp);
+       ed_release_resources(dev);
        return (0);
 }
 
index 339825b..d49d58f 100644 (file)
@@ -64,7 +64,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/dev/netif/em/if_em.c,v 1.45 2005/12/10 18:28:18 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/em/if_em.c,v 1.46 2005/12/31 14:07:59 sephe Exp $
  * $FreeBSD$
  */
 /*
@@ -639,20 +639,21 @@ em_detach(device_t dev)
 
        INIT_DEBUGOUT("em_detach: begin");
 
-       lwkt_serialize_enter(adapter->interface_data.ac_if.if_serializer);
-       adapter->in_detach = 1;
-
        if (device_is_attached(dev)) {
+               struct ifnet *ifp = &adapter->interface_data.ac_if;
+
+               lwkt_serialize_enter(ifp->if_serializer);
+               adapter->in_detach = 1;
                em_stop(adapter);
                em_phy_hw_reset(&adapter->hw);
-               ether_ifdetach(&adapter->interface_data.ac_if);
-       }
-       bus_generic_detach(dev);
-
-       if (adapter->int_handler_tag != NULL) {
                bus_teardown_intr(dev, adapter->res_interrupt, 
                                  adapter->int_handler_tag);
+               lwkt_serialize_exit(ifp->if_serializer);
+
+               ether_ifdetach(ifp);
        }
+       bus_generic_detach(dev);
+
        if (adapter->res_interrupt != NULL) {
                bus_release_resource(dev, SYS_RES_IRQ, 0, 
                                     adapter->res_interrupt);
@@ -682,7 +683,6 @@ em_detach(device_t dev)
        adapter->sysctl_tree = NULL;
        sysctl_ctx_free(&adapter->sysctl_ctx);
 
-       lwkt_serialize_exit(adapter->interface_data.ac_if.if_serializer);
        return(0);
 }
 
index 79121b6..fa35fdf 100644 (file)
@@ -28,7 +28,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/ep/if_ep_pccard.c,v 1.12.2.2 2000/08/08 23:55:02 peter Exp $
- * $DragonFly: src/sys/dev/netif/ep/if_ep_pccard.c,v 1.9 2005/11/28 17:13:42 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/ep/if_ep_pccard.c,v 1.10 2005/12/31 14:07:59 sephe Exp $
  */
 
 /*
@@ -230,15 +230,22 @@ static int
 ep_pccard_detach(device_t dev)
 {
        struct ep_softc *sc = device_get_softc(dev);
+       struct ifnet *ifp = &sc->arpcom.ac_if;
+
+       lwkt_serialize_enter(ifp->if_serializer);
 
        if (sc->gone) {
                device_printf(dev, "already unloaded\n");
+               lwkt_serialize_exit(ifp->if_serializer);
                return (0);
        }
-       sc->arpcom.ac_if.if_flags &= ~IFF_RUNNING; 
-       ether_ifdetach(&sc->arpcom.ac_if);
+       ifp->if_flags &= ~IFF_RUNNING; 
        sc->gone = 1;
        bus_teardown_intr(dev, sc->irq, sc->ep_intrhand);
+
+       lwkt_serialize_exit(ifp->if_serializer);
+
+       ether_ifdetach(&sc->arpcom.ac_if);
        ep_free(dev);
        return (0);
 }
index 563b022..c6dd281 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  *     $FreeBSD: src/sys/dev/ex/if_ex_pccard.c,v 1.2.2.1 2001/03/05 05:33:20 imp Exp $
- *     $DragonFly: src/sys/dev/netif/ex/if_ex_pccard.c,v 1.10 2005/11/28 17:13:42 dillon Exp $
+ *     $DragonFly: src/sys/dev/netif/ex/if_ex_pccard.c,v 1.11 2005/12/31 14:07:59 sephe Exp $
  */
 
 #include <sys/param.h>
@@ -183,11 +183,12 @@ ex_pccard_detach(device_t dev)
        struct ex_softc         *sc = device_get_softc(dev);
        struct ifnet            *ifp = &sc->arpcom.ac_if;
 
-       lwkt_serialize_enter(sc->arpcom.ac_if.if_serializer);
+       lwkt_serialize_enter(ifp->if_serializer);
        ex_stop(sc);
        ifp->if_flags &= ~IFF_RUNNING;
-       if_detach(ifp);
+       lwkt_serialize_exit(ifp->if_serializer);
+
+       ether_ifdetach(ifp);
        ex_release_resources(dev);
-       lwkt_serialize_exit(sc->arpcom.ac_if.if_serializer);
        return (0);
 }
index 79f709e..55d852a 100644 (file)
@@ -20,7 +20,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/fe/if_fe_pccard.c,v 1.2.2.1 2000/09/22 10:01:47 nyan Exp $
- * $DragonFly: src/sys/dev/netif/fe/if_fe_pccard.c,v 1.8 2005/11/28 17:13:42 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/fe/if_fe_pccard.c,v 1.9 2005/12/31 14:07:59 sephe Exp $
  */
 
 #include "opt_fe.h"
@@ -188,11 +188,12 @@ fe_pccard_detach(device_t dev)
 
        lwkt_serialize_enter(ifp->if_serializer);
        fe_stop(sc);
-       ether_ifdetach(ifp);
        bus_teardown_intr(dev, sc->irq_res, sc->irq_handle);
-       fe_release_resource(dev);
        lwkt_serialize_exit(ifp->if_serializer);
 
+       ether_ifdetach(ifp);
+       fe_release_resource(dev);
+
        return 0;
 }
 
index 103c660..0aa7e80 100644 (file)
@@ -32,7 +32,7 @@
  * SUCH DAMAGE.
  * 
  * $FreeBSD: src/sys/dev/firewire/if_fwe.c,v 1.27 2004/01/08 14:58:09 simokawa Exp $
- * $DragonFly: src/sys/dev/netif/fwe/if_fwe.c,v 1.23 2005/11/28 17:13:42 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/fwe/if_fwe.c,v 1.24 2005/12/31 14:07:59 sephe Exp $
  */
 
 #include "opt_inet.h"
@@ -255,8 +255,9 @@ fwe_detach(device_t dev)
 
        lwkt_serialize_enter(fwe->fwe_if.if_serializer);
        fwe_stop(fwe);
-       ether_ifdetach(&fwe->fwe_if);
        lwkt_serialize_exit(fwe->fwe_if.if_serializer);
+
+       ether_ifdetach(&fwe->fwe_if);
        return 0;
 }
 
index d4555d8..fad98f0 100644 (file)
@@ -26,7 +26,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/fxp/if_fxp.c,v 1.110.2.30 2003/06/12 16:47:05 mux Exp $
- * $DragonFly: src/sys/dev/netif/fxp/if_fxp.c,v 1.41 2005/12/28 10:28:24 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/fxp/if_fxp.c,v 1.42 2005/12/31 14:07:59 sephe Exp $
  */
 
 /*
@@ -747,11 +747,6 @@ fxp_detach(device_t dev)
         */
        CSR_WRITE_1(sc, FXP_CSR_SCB_INTRCNTL, FXP_SCB_INTR_DISABLE);
 
-       /*
-        * Close down routes etc.
-        */
-       ether_ifdetach(&sc->arpcom.ac_if);
-
        /*
         * Free all media structures.
         */
@@ -761,9 +756,15 @@ fxp_detach(device_t dev)
        if (sc->ih)
                bus_teardown_intr(dev, sc->irq, sc->ih);
 
+       lwkt_serialize_exit(sc->arpcom.ac_if.if_serializer);
+
+       /*
+        * Close down routes etc.
+        */
+       ether_ifdetach(&sc->arpcom.ac_if);
+
        /* Release our allocated resources. */
        fxp_release(dev);
-       lwkt_serialize_exit(sc->arpcom.ac_if.if_serializer);
 
        return (0);
 }
index 235f74d..f590560 100644 (file)
@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/gx/if_gx.c,v 1.2.2.3 2001/12/14 19:51:39 jlemon Exp $
- * $DragonFly: src/sys/dev/netif/gx/Attic/if_gx.c,v 1.22 2005/11/28 17:13:42 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/gx/Attic/if_gx.c,v 1.23 2005/12/31 14:07:59 sephe Exp $
  */
 
 #include <sys/param.h>
@@ -570,20 +570,19 @@ gx_detach(device_t dev)
        struct gx_softc *gx = device_get_softc(dev);
        struct ifnet *ifp = &gx->arpcom.ac_if;
 
-       lwkt_serialize_enter(ifp->if_serializer);
        if (device_is_attached(dev)) {
-               ether_ifdetach(ifp);
+               lwkt_serialize_enter(ifp->if_serializer);
                gx_reset(gx);
                gx_stop(gx);
-       }
+               bus_teardown_intr(gx->gx_dev, gx->gx_irq, gx->gx_intrhand);
+               lwkt_serialize_exit(ifp->if_serializer);
 
+               ether_ifdetach(ifp);
+       }
        if (gx->gx_miibus)
                device_delete_child(gx->gx_dev, gx->gx_miibus);
        bus_generic_detach(gx->gx_dev);
 
-       if (gx->gx_intrhand)
-               bus_teardown_intr(gx->gx_dev, gx->gx_irq, gx->gx_intrhand);
-
        if (gx->gx_irq)
                bus_release_resource(gx->gx_dev, SYS_RES_IRQ, 0, gx->gx_irq);
        if (gx->gx_res)
@@ -597,7 +596,6 @@ gx_detach(device_t dev)
        if (gx->gx_tbimode)
                ifmedia_removeall(&gx->gx_media);
 
-       lwkt_serialize_exit(ifp->if_serializer);
        return (0);
 }
 
index 736a200..1b0e723 100644 (file)
@@ -26,7 +26,7 @@
  *
  *
  * $Id: if_ipw.c,v 1.7.2.1 2005/01/13 20:01:03 damien Exp $
- * $DragonFly: src/sys/dev/netif/ipw/Attic/if_ipw.c,v 1.12 2005/11/29 19:55:02 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/ipw/Attic/if_ipw.c,v 1.13 2005/12/31 14:07:59 sephe Exp $
  */
 
 /*-
@@ -363,12 +363,15 @@ ipw_attach(device_t dev)
                               ipw_intr, sc, &sc->sc_ih, ifp->if_serializer);
        if (error != 0) {
                device_printf(dev, "could not set up interrupt\n");
+               bpfdetach(ifp);
+               ieee80211_ifdetach(ifp);
                goto fail;
        }
 
        return 0;
 
-fail:  ipw_detach(dev);
+fail:
+       ipw_detach(dev);
        return ENXIO;
 }
 
@@ -378,29 +381,29 @@ ipw_detach(device_t dev)
        struct ipw_softc *sc = device_get_softc(dev);
        struct ifnet *ifp = &sc->sc_ic.ic_if;
 
-       lwkt_serialize_enter(ifp->if_serializer);
-
-       ipw_stop(sc);
-       ipw_free_firmware(sc);
-
-       bpfdetach(ifp);
+       if (device_is_attached(dev)) {
+               lwkt_serialize_enter(ifp->if_serializer);
+               ipw_stop(sc);
+               ipw_free_firmware(sc);
+               bus_teardown_intr(dev, sc->irq, sc->sc_ih);
+               lwkt_serialize_exit(ifp->if_serializer);
 
-       ieee80211_ifdetach(ifp);
+               bpfdetach(ifp);
+               ieee80211_ifdetach(ifp);
+       }
 
        ipw_release(sc);
 
-       if (sc->irq != NULL) {
-               bus_teardown_intr(dev, sc->irq, sc->sc_ih);
+       if (sc->irq != NULL)
                bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq);
-       }
 
-       if (sc->mem != NULL)
+       if (sc->mem != NULL) {
                bus_release_resource(dev, SYS_RES_MEMORY, IPW_PCI_BAR0,
-                   sc->mem);
+                                    sc->mem);
+       }
 
        sysctl_ctx_free(&sc->sysctl_ctx);
 
-       lwkt_serialize_exit(ifp->if_serializer);
        return 0;
 }
 
index 1f936d5..7ad6a43 100644 (file)
@@ -28,7 +28,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $DragonFly: src/sys/dev/netif/iwi/if_iwi.c,v 1.9 2005/12/18 02:47:34 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/iwi/if_iwi.c,v 1.10 2005/12/31 14:07:59 sephe Exp $
  */
 
 #include "opt_inet.h"
@@ -571,10 +571,13 @@ iwi_detach(device_t dev)
 
        tsleep(IWI_FW_MON_EXIT(sc), 0, "iwiexi", 10 * hz);
 
-       lwkt_serialize_enter(ifp->if_serializer);
        if (device_is_attached(dev)) {
+               lwkt_serialize_enter(ifp->if_serializer);
                iwi_stop(sc);
                iwi_free_firmware(sc);
+               bus_teardown_intr(dev, sc->irq, sc->sc_ih);
+               lwkt_serialize_exit(ifp->if_serializer);
+
                bpfdetach(ifp);
                ieee80211_ifdetach(ifp);
        }
@@ -584,9 +587,6 @@ iwi_detach(device_t dev)
                sc->sysctl_tree = 0;
        }
 
-       if (sc->sc_ih != NULL)
-               bus_teardown_intr(dev, sc->irq, sc->sc_ih);
-
        if (sc->irq != NULL)
                bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq);
 
@@ -594,7 +594,6 @@ iwi_detach(device_t dev)
                bus_release_resource(dev, SYS_RES_MEMORY, IWI_PCI_BAR0,
                    sc->mem);
        }
-       lwkt_serialize_exit(ifp->if_serializer);
 
        iwi_release(sc);
 
index 02bbce0..8a617b8 100644 (file)
@@ -31,7 +31,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/lge/if_lge.c,v 1.5.2.2 2001/12/14 19:49:23 jlemon Exp $
- * $DragonFly: src/sys/dev/netif/lge/if_lge.c,v 1.34 2005/11/29 19:56:51 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/lge/if_lge.c,v 1.35 2005/12/31 14:07:59 sephe Exp $
  */
 
 /*
@@ -571,10 +571,13 @@ lge_detach(device_t dev)
        struct lge_softc *sc= device_get_softc(dev);
        struct ifnet *ifp = &sc->arpcom.ac_if;
 
-       lwkt_serialize_enter(ifp->if_serializer);
        if (device_is_attached(dev)) {
+               lwkt_serialize_enter(ifp->if_serializer);
                lge_reset(sc);
                lge_stop(sc);
+               bus_teardown_intr(dev, sc->lge_irq, sc->lge_intrhand);
+               lwkt_serialize_exit(ifp->if_serializer);
+
                ether_ifdetach(ifp);
        }
 
@@ -582,9 +585,6 @@ lge_detach(device_t dev)
                device_delete_child(dev, sc->lge_miibus);
        bus_generic_detach(dev);
 
-       if (sc->lge_intrhand)
-               bus_teardown_intr(dev, sc->lge_irq, sc->lge_intrhand);
-
        if (sc->lge_irq)
                bus_release_resource(dev, SYS_RES_IRQ, 0, sc->lge_irq);
        if (sc->lge_res)
@@ -595,7 +595,6 @@ lge_detach(device_t dev)
                           M_DEVBUF);
        lge_free_jumbo_mem(sc);
 
-       lwkt_serialize_exit(ifp->if_serializer);
        return(0);
 }
 
index 69d01e9..988c93c 100644 (file)
@@ -28,7 +28,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/lnc/if_lnc_isa.c,v 1.12 2001/07/04 13:00:19 nyan Exp $
- * $DragonFly: src/sys/dev/netif/lnc/if_lnc_isa.c,v 1.7 2005/11/28 17:13:43 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/lnc/if_lnc_isa.c,v 1.8 2005/12/31 14:07:59 sephe Exp $
  */
 
 #include <sys/param.h>
@@ -265,15 +265,14 @@ lnc_isa_detach(device_t dev)
 {
        lnc_softc_t *sc = device_get_softc(dev);
 
-       lwkt_serialize_enter(sc->arpcom.ac_if.if_serializer);
-
        if (device_is_attached(dev)) {
-               ether_ifdetach(&sc->arpcom.ac_if);
+               lwkt_serialize_enter(sc->arpcom.ac_if.if_serializer);
                lnc_stop(sc);
-       }
-
-       if (sc->intrhand)
                bus_teardown_intr(dev, sc->irqres, sc->intrhand);
+               lwkt_serialize_exit(sc->arpcom.ac_if.if_serializer);
+
+               ether_ifdetach(&sc->arpcom.ac_if);
+       }
 
        if (sc->irqres)
                bus_release_resource(dev, SYS_RES_IRQ, sc->irqrid, sc->irqres);
@@ -289,7 +288,6 @@ lnc_isa_detach(device_t dev)
        if (sc->dmat)
                bus_dma_tag_destroy(sc->dmat);
 
-       lwkt_serialize_exit(sc->arpcom.ac_if.if_serializer);
        return (0);
 }
 
index 051455a..120e32a 100644 (file)
@@ -28,7 +28,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/lnc/if_lnc_pci.c,v 1.25 2001/07/04 13:00:19 nyan Exp $
- * $DragonFly: src/sys/dev/netif/lnc/if_lnc_pci.c,v 1.8 2005/11/28 17:13:43 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/lnc/if_lnc_pci.c,v 1.9 2005/12/31 14:07:59 sephe Exp $
  */
 
 #include <sys/param.h>
@@ -209,15 +209,15 @@ lnc_pci_detach(device_t dev)
 {
        lnc_softc_t *sc = device_get_softc(dev);
 
-       lwkt_serialize_enter(sc->arpcom.ac_if.if_serializer);
 
        if (device_is_attached(dev)) {
-               ether_ifdetach(&sc->arpcom.ac_if);
+               lwkt_serialize_enter(sc->arpcom.ac_if.if_serializer);
                lnc_stop(sc);
-       }
-
-       if (sc->intrhand)
                bus_teardown_intr(dev, sc->irqres, sc->intrhand);
+               lwkt_serialize_exit(sc->arpcom.ac_if.if_serializer);
+
+               ether_ifdetach(&sc->arpcom.ac_if);
+       }
 
        if (sc->irqres)
                bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irqres);
@@ -232,8 +232,6 @@ lnc_pci_detach(device_t dev)
        if (sc->dmat)
                bus_dma_tag_destroy(sc->dmat);
 
-       lwkt_serialize_exit(sc->arpcom.ac_if.if_serializer);
-
        return (0);
 }
 
index b78f981..0bea17a 100644 (file)
@@ -26,7 +26,7 @@
  * Written by: yen_cw@myson.com.tw  available at: http://www.myson.com.tw/
  *
  * $FreeBSD: src/sys/dev/my/if_my.c,v 1.2.2.4 2002/04/17 02:05:27 julian Exp $
- * $DragonFly: src/sys/dev/netif/my/if_my.c,v 1.23 2005/11/28 17:13:43 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/my/if_my.c,v 1.24 2005/12/31 14:07:59 sephe Exp $
  *
  * Myson fast ethernet PCI NIC driver
  *
@@ -987,16 +987,14 @@ my_detach(device_t dev)
        struct my_softc *sc = device_get_softc(dev);
        struct ifnet *ifp = &sc->arpcom.ac_if;
 
-       lwkt_serialize_enter(ifp->if_serializer);
        if (device_is_attached(dev)) {
-               ether_ifdetach(ifp);
+               lwkt_serialize_enter(ifp->if_serializer);
                my_stop(sc);
-       }
-
-       if (sc->my_intrhand)
                bus_teardown_intr(dev, sc->my_irq, sc->my_intrhand);
+               lwkt_serialize_exit(ifp->if_serializer);
 
-       lwkt_serialize_exit(ifp->if_serializer);
+               ether_ifdetach(ifp);
+       }
 
        if (sc->my_irq)
                bus_release_resource(dev, SYS_RES_IRQ, 0, sc->my_irq);
index 90740a3..4a362ac 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/if_ndis/if_ndis.c,v 1.65 2004/07/07 17:46:30 wpaul Exp $
- * $DragonFly: src/sys/dev/netif/ndis/if_ndis.c,v 1.11 2005/11/28 17:13:43 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/ndis/if_ndis.c,v 1.12 2005/12/31 14:07:59 sephe Exp $
  */
 
 #include <sys/param.h>
@@ -704,14 +704,18 @@ ndis_detach(dev)
 
        sc = device_get_softc(dev);
        ifp = &sc->arpcom.ac_if;
-       lwkt_serialize_enter(ifp->if_serializer);
 
        NDIS_LOCK(sc);
        ifp->if_flags &= ~IFF_UP;
 
        if (device_is_attached(dev)) {
                NDIS_UNLOCK(sc);
+
+               lwkt_serialize_enter(ifp->if_serializer);
                ndis_stop(sc);
+               bus_teardown_intr(dev, sc->ndis_irq, sc->ndis_intrhand);
+               lwkt_serialize_exit(ifp->if_serializer);
+
                if (sc->ndis_80211)
                        ieee80211_ifdetach(ifp);
                else
@@ -721,8 +725,6 @@ ndis_detach(dev)
 
        bus_generic_detach(dev);
 
-       if (sc->ndis_intrhand)
-               bus_teardown_intr(dev, sc->ndis_irq, sc->ndis_intrhand);
        if (sc->ndis_irq)
                bus_release_resource(dev, SYS_RES_IRQ, 0, sc->ndis_irq);
        if (sc->ndis_res_io)
@@ -745,12 +747,10 @@ ndis_detach(dev)
 
 #if __FreeBSD_version < 502113
        sysctl_ctx_free(&sc->ndis_ctx);
-
 #endif
        NDIS_LOCK_DESTROY(&sc->ndis_lock);
        NDIS_LOCK_DESTROY(&sc->ndis_intrlock);
 
-       lwkt_serialize_exit(ifp->if_serializer);
        return(0);
 }
 
@@ -991,14 +991,14 @@ ndis_intrtask(arg)
        sc = arg;
        ifp = &sc->arpcom.ac_if;
 
-       lwkt_serialize_enter(ifp->serializer);
+       lwkt_serialize_enter(ifp->if_serializer);
        irql = FASTCALL1(hal_raise_irql, DISPATCH_LEVEL);
        ndis_intrhand(sc);
        FASTCALL1(hal_lower_irql, irql);
        NDIS_INTRLOCK(sc);
        ndis_enable_intr(sc);
        NDIS_INTRUNLOCK(sc);
-       lwkt_serialize_exit(ifp->serializer);
+       lwkt_serialize_exit(ifp->if_serializer);
 
        return;
 }
@@ -1062,14 +1062,14 @@ ndis_ticktask(xsc)
        sc = xsc;
        ifp = &sc->arpcom.ac_if;
 
-       lwkt_serialize_enter(ifp->serializer);
+       lwkt_serialize_enter(ifp->if_serializer);
        hangfunc = sc->ndis_chars.nmc_checkhang_func;
 
        if (hangfunc != NULL) {
                rval = hangfunc(sc->ndis_block.nmb_miniportadapterctx);
                if (rval == TRUE) {
                        ndis_reset_nic(sc);
-                       lwkt_serialize_exit(ifp->serializer);
+                       lwkt_serialize_exit(ifp->if_serializer);
                        return;
                }
        }
@@ -1103,7 +1103,7 @@ ndis_ticktask(xsc)
        }
 
        NDIS_UNLOCK(sc);
-       lwkt_serialize_exit(ifp->serializer);
+       lwkt_serialize_exit(ifp->if_serializer);
 }
 
 static void
index f928da5..e26740f 100644 (file)
@@ -31,7 +31,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/nge/if_nge.c,v 1.13.2.13 2003/02/05 22:03:57 mbr Exp $
- * $DragonFly: src/sys/dev/netif/nge/if_nge.c,v 1.35 2005/11/29 19:56:53 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/nge/if_nge.c,v 1.36 2005/12/31 14:07:59 sephe Exp $
  */
 
 /*
@@ -921,11 +921,13 @@ nge_detach(device_t dev)
        struct nge_softc *sc = device_get_softc(dev);
        struct ifnet *ifp = &sc->arpcom.ac_if;
 
-       lwkt_serialize_enter(ifp->if_serializer);
-
        if (device_is_attached(dev)) {
+               lwkt_serialize_enter(ifp->if_serializer);
                nge_reset(sc);
                nge_stop(sc);
+               bus_teardown_intr(dev, sc->nge_irq, sc->nge_intrhand);
+               lwkt_serialize_exit(ifp->if_serializer);
+
                ether_ifdetach(ifp);
        }
 
@@ -933,9 +935,6 @@ nge_detach(device_t dev)
                device_delete_child(dev, sc->nge_miibus);
        bus_generic_detach(dev);
 
-       if (sc->nge_intrhand)
-               bus_teardown_intr(dev, sc->nge_irq, sc->nge_intrhand);
-
        if (sc->nge_irq)
                bus_release_resource(dev, SYS_RES_IRQ, 0, sc->nge_irq);
        if (sc->nge_res)
@@ -947,7 +946,6 @@ nge_detach(device_t dev)
        if (sc->nge_cdata.nge_jumbo_buf)
                contigfree(sc->nge_cdata.nge_jumbo_buf, NGE_JMEM, M_DEVBUF);
 
-       lwkt_serialize_exit(ifp->if_serializer);
        return(0);
 }
 
index 3653b39..857abbc 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  * 
  * $Id: if_nv.c,v 1.20 2005/03/12 01:11:00 q Exp $
- * $DragonFly: src/sys/dev/netif/nv/Attic/if_nv.c,v 1.24 2005/12/14 17:04:29 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/nv/Attic/if_nv.c,v 1.25 2005/12/31 14:07:59 sephe Exp $
  */
 
 /*
@@ -550,16 +550,17 @@ nv_detach(device_t dev)
 {
        struct nv_softc *sc = device_get_softc(dev);
        struct ifnet   *ifp;
+       int is_attached;
 
        ifp = &sc->arpcom.ac_if;
-       lwkt_serialize_enter(ifp->if_serializer);
 
        DEBUGOUT(NV_DEBUG_DEINIT, "nv: nv_detach - entry\n");
 
-       if (device_is_attached(dev)) {
+       lwkt_serialize_enter(ifp->if_serializer);
+
+       is_attached = device_is_attached(dev);
+       if (is_attached)
                nv_stop(sc);
-               ether_ifdetach(ifp);
-       }
 
        if (sc->miibus)
                device_delete_child(dev, sc->miibus);
@@ -576,6 +577,12 @@ nv_detach(device_t dev)
        /* Release resources */
        if (sc->sc_ih)
                bus_teardown_intr(sc->dev, sc->irq, sc->sc_ih);
+
+       lwkt_serialize_exit(ifp->if_serializer);
+
+       if (is_attached)
+               ether_ifdetach(ifp);
+
        if (sc->irq)
                bus_release_resource(sc->dev, SYS_RES_IRQ, 0, sc->irq);
        if (sc->res)
@@ -595,8 +602,6 @@ nv_detach(device_t dev)
        if (sc->rtag)
                bus_dma_tag_destroy(sc->rtag);
 
-       lwkt_serialize_exit(ifp->if_serializer);
-
        DEBUGOUT(NV_DEBUG_DEINIT, "nv: nv_detach - exit\n");
        return (0);
 }
index a1ca220..98e46c0 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/wi/if_wi.c,v 1.103.2.2 2002/08/02 07:11:34 imp Exp $
- * $DragonFly: src/sys/dev/netif/owi/Attic/if_owi.c,v 1.14 2005/12/11 01:54:09 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/owi/Attic/if_owi.c,v 1.15 2005/12/31 14:08:00 sephe Exp $
  */
 
 /*
@@ -190,17 +190,17 @@ owi_generic_detach(device_t dev)
                lwkt_serialize_exit(ifp->if_serializer);
                return(ENODEV);
        }
-
        wi_stop(sc);
+       bus_teardown_intr(dev, sc->irq, sc->wi_intrhand);
+       sc->wi_gone = 1;
+
+       lwkt_serialize_exit(ifp->if_serializer);
 
        /* Delete all remaining media. */
        ifmedia_removeall(&sc->ifmedia);
        ether_ifdetach(ifp);
-       bus_teardown_intr(dev, sc->irq, sc->wi_intrhand);
        owi_free(dev);
-       sc->wi_gone = 1;
 
-       lwkt_serialize_exit(ifp->if_serializer);
        return(0);
 }
 
index 3bbee4b..b6ee2cd 100644 (file)
@@ -31,7 +31,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/pci/if_pcn.c,v 1.5.2.10 2003/03/05 18:42:33 njl Exp $
- * $DragonFly: src/sys/dev/netif/pcn/if_pcn.c,v 1.28 2005/12/28 02:49:31 y0netan1 Exp $
+ * $DragonFly: src/sys/dev/netif/pcn/if_pcn.c,v 1.29 2005/12/31 14:08:00 sephe Exp $
  */
 
 /*
@@ -635,11 +635,13 @@ pcn_detach(device_t dev)
        struct pcn_softc *sc = device_get_softc(dev);
        struct ifnet *ifp = &sc->arpcom.ac_if;
 
-       lwkt_serialize_enter(ifp->if_serializer);
-
        if (device_is_attached(dev)) {
+               lwkt_serialize_enter(ifp->if_serializer);
                pcn_reset(sc);
                pcn_stop(sc);
+               bus_teardown_intr(dev, sc->pcn_irq, sc->pcn_intrhand);
+               lwkt_serialize_exit(ifp->if_serializer);
+
                ether_ifdetach(ifp);
        }
 
@@ -647,9 +649,6 @@ pcn_detach(device_t dev)
                device_delete_child(dev, sc->pcn_miibus);
        bus_generic_detach(dev);
 
-       if (sc->pcn_intrhand)
-               bus_teardown_intr(dev, sc->pcn_irq, sc->pcn_intrhand);
-
        if (sc->pcn_irq)
                bus_release_resource(dev, SYS_RES_IRQ, 0, sc->pcn_irq);
        if (sc->pcn_res)
@@ -659,7 +658,6 @@ pcn_detach(device_t dev)
                contigfree(sc->pcn_ldata, sizeof(struct pcn_list_data),
                           M_DEVBUF);
        }
-       lwkt_serialize_exit(ifp->if_serializer);
 
        return(0);
 }
index b391889..5b449cc 100644 (file)
@@ -29,7 +29,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/ray/if_ray.c,v 1.47.2.4 2001/08/14 22:54:05 dmlb Exp $
- * $DragonFly: src/sys/dev/netif/ray/Attic/if_ray.c,v 1.26 2005/11/28 17:13:43 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/ray/Attic/if_ray.c,v 1.27 2005/12/31 14:08:00 sephe Exp $
  *
  */
 
@@ -584,8 +584,10 @@ ray_detach(device_t dev)
 
        RAY_DPRINTF(sc, RAY_DBG_SUBR | RAY_DBG_STOP, "");
 
-       if ((sc == NULL) || (sc->sc_gone))
+       if ((sc == NULL) || (sc->sc_gone)) {
+               lwkt_serialize_exit(ifp->if_serializer);
                return (0);
+       }
 
        /*
         * Mark as not running and detach the interface.
@@ -596,7 +598,6 @@ ray_detach(device_t dev)
        sc->sc_gone = 1;
        sc->sc_c.np_havenet = 0;
        ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
-       ether_ifdetach(ifp);
 
        /*
         * Stop the runq and wake up anyone sleeping for us.
@@ -605,7 +606,7 @@ ray_detach(device_t dev)
        callout_stop(&sc->tx_timer);
        com = TAILQ_FIRST(&sc->sc_comq);
        for (com = TAILQ_FIRST(&sc->sc_comq); com != NULL;
-           com = TAILQ_NEXT(com, c_chain)) {
+            com = TAILQ_NEXT(com, c_chain)) {
                com->c_flags |= RAY_COM_FDETACHED;
                com->c_retval = 0;
                RAY_DPRINTF(sc, RAY_DBG_STOP, "looking at com %p %b",
@@ -615,15 +616,17 @@ ray_detach(device_t dev)
                        wakeup(com->c_wakeup);
                }
        }
-       
+
+       lwkt_serialize_exit(ifp->if_serializer);
+
+       ether_ifdetach(ifp);
+
        /*
         * Release resources
         */
        ray_res_release(sc);
        RAY_DPRINTF(sc, RAY_DBG_STOP, "unloading complete");
 
-       lwkt_serialize_exit(ifp->if_serializer);
-
        return (0);
 }
 
index 9fed52a..d58391a 100644 (file)
@@ -33,7 +33,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/re/if_re.c,v 1.25 2004/06/09 14:34:01 naddy Exp $
- * $DragonFly: src/sys/dev/netif/re/if_re.c,v 1.20 2005/12/04 18:07:49 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/re/if_re.c,v 1.21 2005/12/31 14:08:00 sephe Exp $
  */
 
 /*
@@ -1207,25 +1207,25 @@ re_detach(device_t dev)
        struct ifnet *ifp = &sc->arpcom.ac_if;
        int i;
 
-       lwkt_serialize_enter(ifp->if_serializer);
-
        /* These should only be active if attach succeeded */
        if (device_is_attached(dev)) {
+               lwkt_serialize_enter(ifp->if_serializer);
                re_stop(sc);
+               bus_teardown_intr(dev, sc->re_irq, sc->re_intrhand);
+               lwkt_serialize_exit(ifp->if_serializer);
+
                ether_ifdetach(ifp);
        }
        if (sc->re_miibus)
                device_delete_child(dev, sc->re_miibus);
        bus_generic_detach(dev);
 
-       if (sc->re_intrhand)
-               bus_teardown_intr(dev, sc->re_irq, sc->re_intrhand);
-
        if (sc->re_irq)
                bus_release_resource(dev, SYS_RES_IRQ, 0, sc->re_irq);
-       if (sc->re_res)
+       if (sc->re_res) {
                bus_release_resource(dev, SYS_RES_IOPORT, RE_PCI_LOIO,
                                     sc->re_res);
+       }
 
        /* Unload and free the RX DMA ring memory and map */
 
@@ -1275,7 +1275,6 @@ re_detach(device_t dev)
        if (sc->re_parent_tag)
                bus_dma_tag_destroy(sc->re_parent_tag);
 
-       lwkt_serialize_exit(ifp->if_serializer);
        return(0);
 }
 
index fe4fd63..930a949 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/pci/if_rl.c,v 1.38.2.16 2003/03/05 18:42:33 njl Exp $
- * $DragonFly: src/sys/dev/netif/rl/if_rl.c,v 1.29 2005/11/28 17:13:43 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/rl/if_rl.c,v 1.30 2005/12/31 14:08:00 sephe Exp $
  */
 
 /*
@@ -954,10 +954,12 @@ rl_detach(device_t dev)
        sc = device_get_softc(dev);
        ifp = &sc->arpcom.ac_if;
 
-       lwkt_serialize_enter(ifp->if_serializer);
-
        if (device_is_attached(dev)) {
+               lwkt_serialize_enter(ifp->if_serializer);
                rl_stop(sc);
+               bus_teardown_intr(dev, sc->rl_irq, sc->rl_intrhand);
+               lwkt_serialize_exit(ifp->if_serializer);
+
                ether_ifdetach(ifp);
        }
 
@@ -965,9 +967,6 @@ rl_detach(device_t dev)
                device_delete_child(dev, sc->rl_miibus);
        bus_generic_detach(dev);
 
-       if (sc->rl_intrhand)
-               bus_teardown_intr(dev, sc->rl_irq, sc->rl_intrhand);
-
        if (sc->rl_irq)
                bus_release_resource(dev, SYS_RES_IRQ, 0, sc->rl_irq);
        if (sc->rl_res)
@@ -983,8 +982,6 @@ rl_detach(device_t dev)
        if (sc->rl_parent_tag)
                bus_dma_tag_destroy(sc->rl_parent_tag);
 
-       lwkt_serialize_exit(ifp->if_serializer);
-
        return(0);
 }
 
index b3ec1a9..6664c40 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/sbsh/if_sbsh.c,v 1.3.2.1 2003/04/15 18:15:07 fjoe Exp $
- * $DragonFly: src/sys/dev/netif/sbsh/if_sbsh.c,v 1.22 2005/11/28 17:13:44 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/sbsh/if_sbsh.c,v 1.23 2005/12/31 14:08:00 sephe Exp $
  */
 
 #include <sys/param.h>
@@ -289,23 +289,22 @@ sbsh_detach(device_t dev)
        struct sbsh_softc *sc = device_get_softc(dev);
        struct ifnet *ifp = &sc->arpcom.ac_if;
 
-       lwkt_serialize_enter(ifp->if_serializer);
-
        if (device_is_attached(dev)) {
+               lwkt_serialize_enter(ifp->if_serializer);
                sbsh_stop(sc);
+               bus_teardown_intr(dev, sc->irq_res, sc->intr_hand);
+               lwkt_serialize_exit(ifp->if_serializer);
+
                ether_ifdetach(ifp);
        }
 
-       if (sc->intr_hand)
-               bus_teardown_intr(dev, sc->irq_res, sc->intr_hand);
-
        if (sc->irq_res)
                bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq_res);
-       if (sc->mem_res)
+       if (sc->mem_res) {
                bus_release_resource(dev, SYS_RES_MEMORY, PCIR_MAPS + 4,
                                     sc->mem_res);
+       }
 
-       lwkt_serialize_exit(ifp->if_serializer);
        return (0);
 }
 
index f227df8..342ec07 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/pci/if_sf.c,v 1.18.2.8 2001/12/16 15:46:07 luigi Exp $
- * $DragonFly: src/sys/dev/netif/sf/if_sf.c,v 1.26 2005/12/11 01:54:09 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/sf/if_sf.c,v 1.27 2005/12/31 14:08:00 sephe Exp $
  */
 
 /*
@@ -804,20 +804,19 @@ sf_detach(device_t dev)
        struct sf_softc *sc = device_get_softc(dev);
        struct ifnet *ifp = &sc->arpcom.ac_if;
 
-       lwkt_serialize_enter(ifp->if_serializer);
-
        if (device_is_attached(dev)) {
-               ether_ifdetach(ifp);
+               lwkt_serialize_enter(ifp->if_serializer);
                sf_stop(sc);
+               bus_teardown_intr(dev, sc->sf_irq, sc->sf_intrhand);
+               lwkt_serialize_exit(ifp->if_serializer);
+
+               ether_ifdetach(ifp);
        }
 
        if (sc->sf_miibus)
                device_delete_child(dev, sc->sf_miibus);
        bus_generic_detach(dev);
 
-       if (sc->sf_intrhand)
-               bus_teardown_intr(dev, sc->sf_irq, sc->sf_intrhand);
-
        if (sc->sf_irq)
                bus_release_resource(dev, SYS_RES_IRQ, 0, sc->sf_irq);
        if(sc->sf_res)
@@ -828,7 +827,6 @@ sf_detach(device_t dev)
                           M_DEVBUF);
        }
 
-       lwkt_serialize_exit(ifp->if_serializer);
        return(0);
 }
 
index 3261fb0..7712940 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/pci/if_sis.c,v 1.13.4.24 2003/03/05 18:42:33 njl Exp $
- * $DragonFly: src/sys/dev/netif/sis/if_sis.c,v 1.30 2005/11/28 17:13:44 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/sis/if_sis.c,v 1.31 2005/12/31 14:08:00 sephe Exp $
  */
 
 /*
@@ -1331,20 +1331,20 @@ sis_detach(device_t dev)
        struct sis_softc *sc = device_get_softc(dev);
        struct ifnet *ifp = &sc->arpcom.ac_if;
 
-       lwkt_serialize_enter(ifp->if_serializer);
 
        if (device_is_attached(dev)) {
+               lwkt_serialize_enter(ifp->if_serializer);
                sis_reset(sc);
                sis_stop(sc);
+               bus_teardown_intr(dev, sc->sis_irq, sc->sis_intrhand);
+               lwkt_serialize_exit(ifp->if_serializer);
+
                ether_ifdetach(ifp);
        }
        if (sc->sis_miibus)
                device_delete_child(dev, sc->sis_miibus);
        bus_generic_detach(dev);
 
-       if (sc->sis_intrhand)
-               bus_teardown_intr(dev, sc->sis_irq, sc->sis_intrhand);
-
        if (sc->sis_irq)
                bus_release_resource(dev, SYS_RES_IRQ, 0, sc->sis_irq);
        if (sc->sis_res)
@@ -1372,7 +1372,6 @@ sis_detach(device_t dev)
        if (sc->sis_parent_tag)
                bus_dma_tag_destroy(sc->sis_parent_tag);
 
-       lwkt_serialize_exit(ifp->if_serializer);
        return(0);
 }
 
index a1ae32f..4b35b34 100644 (file)
@@ -31,7 +31,7 @@
  *
  * $OpenBSD: if_sk.c,v 1.33 2003/08/12 05:23:06 nate Exp $
  * $FreeBSD: src/sys/pci/if_sk.c,v 1.19.2.9 2003/03/05 18:42:34 njl Exp $
- * $DragonFly: src/sys/dev/netif/sk/if_sk.c,v 1.41 2005/11/29 19:56:55 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/sk/if_sk.c,v 1.42 2005/12/31 14:08:00 sephe Exp $
  */
 
 /*
@@ -1246,6 +1246,7 @@ sk_attach(device_t dev)
        default:
                printf("skc%d: unsupported PHY type: %d\n",
                    sc->sk_unit, sc_if->sk_phytype);
+               sc->sk_if[port] = NULL;
                return(ENODEV);
        }
 
@@ -1303,6 +1304,7 @@ sk_attach(device_t dev)
                    M_DEVBUF);
                contigfree(sc_if->sk_rdata,
                    sizeof(struct sk_ring_data), M_DEVBUF);
+               sc->sk_if[port] = NULL;
                return(ENXIO);
        }
 
@@ -1528,9 +1530,6 @@ sk_detach(device_t dev)
        struct sk_if_softc *sc_if = device_get_softc(dev);
        struct ifnet *ifp = &sc_if->arpcom.ac_if;
 
-       lwkt_serialize_enter(&sk_serializer);
-
-       sk_stop(sc_if);
        ether_ifdetach(ifp);
        bus_generic_detach(dev);
        if (sc_if->sk_miibus != NULL)
@@ -1538,8 +1537,6 @@ sk_detach(device_t dev)
        contigfree(sc_if->sk_cdata.sk_jumbo_buf, SK_JMEM, M_DEVBUF);
        contigfree(sc_if->sk_rdata, sizeof(struct sk_ring_data), M_DEVBUF);
 
-       lwkt_serialize_exit(&sk_serializer);
-
        return(0);
 }
 
@@ -1550,6 +1547,17 @@ skc_detach(device_t dev)
 
        sc = device_get_softc(dev);
 
+       lwkt_serialize_enter(&sk_serializer);
+
+       if (sc->sk_if[SK_PORT_A] != NULL)
+               sk_stop(sc->sk_if[SK_PORT_A]);
+       if (sc->sk_if[SK_PORT_B] != NULL)
+               sk_stop(sc->sk_if[SK_PORT_B]);
+
+       bus_teardown_intr(dev, sc->sk_irq, sc->sk_intrhand);
+
+       lwkt_serialize_exit(&sk_serializer);
+
        /*
         * recursed from sk_detach ?  don't need serializer
         */
@@ -1559,7 +1567,6 @@ skc_detach(device_t dev)
        if (sc->sk_devs[SK_PORT_B] != NULL)
                device_delete_child(dev, sc->sk_devs[SK_PORT_B]);
 
-       bus_teardown_intr(dev, sc->sk_irq, sc->sk_intrhand);
        bus_release_resource(dev, SYS_RES_IRQ, 0, sc->sk_irq);
        bus_release_resource(dev, SK_RES, SK_RID, sc->sk_res);
 
index 2af1a0c..197b46b 100644 (file)
@@ -29,7 +29,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  *   $FreeBSD: src/sys/dev/sn/if_sn.c,v 1.7.2.3 2001/02/04 04:38:38 toshi Exp $
- *   $DragonFly: src/sys/dev/netif/sn/if_sn.c,v 1.24 2005/11/28 17:13:44 dillon Exp $
+ *   $DragonFly: src/sys/dev/netif/sn/if_sn.c,v 1.25 2005/12/31 14:08:00 sephe Exp $
  */
 
 /*
@@ -1213,9 +1213,6 @@ sn_deactivate(device_t dev)
 {
        struct sn_softc *sc = device_get_softc(dev);
        
-       if (sc->intrhand)
-               bus_teardown_intr(dev, sc->irq_res, sc->intrhand);
-       sc->intrhand = 0;
        if (sc->port_res)
                bus_release_resource(dev, SYS_RES_IOPORT, sc->port_rid, 
                    sc->port_res);
index 78bbe90..210d81f 100644 (file)
@@ -23,7 +23,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/sn/if_sn_pccard.c,v 1.3.2.2 2001/01/25 19:40:27 imp Exp $
- * $DragonFly: src/sys/dev/netif/sn/if_sn_pccard.c,v 1.6 2004/03/14 15:36:52 joerg Exp $
+ * $DragonFly: src/sys/dev/netif/sn/if_sn_pccard.c,v 1.7 2005/12/31 14:08:00 sephe Exp $
  */
 
 /*
@@ -115,10 +115,16 @@ static int
 sn_pccard_detach(device_t dev)
 {
        struct sn_softc *sc = device_get_softc(dev);
+       struct ifnet *ifp = &sc->arpcom.ac_if;
+
+       lwkt_serialize_enter(ifp->if_serializer);
+       ifp->if_flags &= ~IFF_RUNNING;
+       bus_teardown_intr(dev, sc->irq_res, sc->intrhand);
+       lwkt_serialize_enter(ifp->if_serializer);
 
-       sc->arpcom.ac_if.if_flags &= ~IFF_RUNNING; 
        ether_ifdetach(&sc->arpcom.ac_if);
        sn_deactivate(dev);
+
        return 0;
 }
 
index 38492c0..77b18d5 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/pci/if_ste.c,v 1.14.2.9 2003/02/05 22:03:57 mbr Exp $
- * $DragonFly: src/sys/dev/netif/ste/if_ste.c,v 1.32 2005/12/11 01:54:09 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/ste/if_ste.c,v 1.33 2005/12/31 14:08:00 sephe Exp $
  */
 
 #include <sys/param.h>
@@ -991,25 +991,21 @@ fail:
 static int
 ste_detach(device_t dev)
 {
-       struct ste_softc        *sc;
-       struct ifnet            *ifp;
-
-       sc = device_get_softc(dev);
-       ifp = &sc->arpcom.ac_if;
-       lwkt_serialize_enter(ifp->if_serializer);
+       struct ste_softc        *sc = device_get_softc(dev);
+       struct ifnet            *ifp = &sc->arpcom.ac_if;
 
        if (device_is_attached(dev)) {
-               if (bus_child_present(dev))
-                       ste_stop(sc);
+               lwkt_serialize_enter(ifp->if_serializer);
+               ste_stop(sc);
+               bus_teardown_intr(dev, sc->ste_irq, sc->ste_intrhand);
+               lwkt_serialize_exit(ifp->if_serializer);
+
                ether_ifdetach(ifp);
        }
        if (sc->ste_miibus != NULL)
                device_delete_child(dev, sc->ste_miibus);
        bus_generic_detach(dev);
 
-       if (sc->ste_intrhand != NULL)
-               bus_teardown_intr(dev, sc->ste_irq, sc->ste_intrhand);
-
        if (sc->ste_irq != NULL)
                bus_release_resource(dev, SYS_RES_IRQ, 0, sc->ste_irq);
        if (sc->ste_res != NULL)
@@ -1018,7 +1014,6 @@ ste_detach(device_t dev)
                contigfree(sc->ste_ldata, sizeof(struct ste_list_data),
                           M_DEVBUF);
        }
-       lwkt_serialize_exit(ifp->if_serializer);
 
        return(0);
 }
index 5945e2f..3ff15ee 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/pci/if_ti.c,v 1.25.2.14 2002/02/15 04:20:20 silby Exp $
- * $DragonFly: src/sys/dev/netif/ti/if_ti.c,v 1.39 2005/11/29 19:56:56 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/ti/if_ti.c,v 1.40 2005/12/31 14:08:00 sephe Exp $
  */
 
 /*
@@ -1580,17 +1580,15 @@ ti_detach(device_t dev)
        struct ti_softc *sc = device_get_softc(dev);
        struct ifnet *ifp = &sc->arpcom.ac_if;
 
-       lwkt_serialize_enter(ifp->if_serializer);
-
        if (device_is_attached(dev)) {
-               if (bus_child_present(dev))
-                       ti_stop(sc);
+               lwkt_serialize_enter(ifp->if_serializer);
+               ti_stop(sc);
+               bus_teardown_intr(dev, sc->ti_irq, sc->ti_intrhand);
+               lwkt_serialize_exit(ifp->if_serializer);
+
                ether_ifdetach(ifp);
        }
 
-       if (sc->ti_intrhand != NULL)
-               bus_teardown_intr(dev, sc->ti_irq, sc->ti_intrhand);
-
        if (sc->ti_irq != NULL)
                bus_release_resource(dev, SYS_RES_IRQ, 0, sc->ti_irq);
        if (sc->ti_res != NULL) {
@@ -1603,7 +1601,6 @@ ti_detach(device_t dev)
                contigfree(sc->ti_rdata, sizeof(struct ti_ring_data), M_DEVBUF);
        ifmedia_removeall(&sc->ifmedia);
 
-       lwkt_serialize_exit(ifp->if_serializer);
 
        return(0);
 }
index 6bf513f..f9fb060 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/pci/if_tl.c,v 1.51.2.5 2001/12/16 15:46:08 luigi Exp $
- * $DragonFly: src/sys/dev/netif/tl/if_tl.c,v 1.34 2005/12/11 01:54:09 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/tl/if_tl.c,v 1.35 2005/12/31 14:08:00 sephe Exp $
  */
 
 /*
@@ -1266,10 +1266,12 @@ tl_detach(device_t dev)
        struct tl_softc *sc = device_get_softc(dev);
        struct ifnet *ifp = &sc->arpcom.ac_if;
 
-       lwkt_serialize_enter(ifp->if_serializer);
-
        if (device_is_attached(dev)) {
+               lwkt_serialize_enter(ifp->if_serializer);
                tl_stop(sc);
+               bus_teardown_intr(dev, sc->tl_irq, sc->tl_intrhand);
+               lwkt_serialize_exit(ifp->if_serializer);
+
                ether_ifdetach(ifp);
        }
 
@@ -1281,14 +1283,11 @@ tl_detach(device_t dev)
                contigfree(sc->tl_ldata, sizeof(struct tl_list_data), M_DEVBUF);
        if (sc->tl_bitrate)
                ifmedia_removeall(&sc->ifmedia);
-       if (sc->tl_intrhand)
-               bus_teardown_intr(dev, sc->tl_irq, sc->tl_intrhand);
        if (sc->tl_irq)
                bus_release_resource(dev, SYS_RES_IRQ, 0, sc->tl_irq);
        if (sc->tl_res)
                bus_release_resource(dev, TL_RES, TL_RID, sc->tl_res);
 
-       lwkt_serialize_exit(ifp->if_serializer);
        return(0);
 }
 
index 66a98df..e0e1534 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/tx/if_tx.c,v 1.61.2.1 2002/10/29 01:43:49 semenu Exp $
- * $DragonFly: src/sys/dev/netif/tx/if_tx.c,v 1.33 2005/11/28 17:13:44 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/tx/if_tx.c,v 1.34 2005/12/31 14:08:00 sephe Exp $
  */
 
 /*
@@ -297,26 +297,22 @@ fail:
 static int
 epic_detach(device_t dev)
 {
-       struct ifnet *ifp;
-       epic_softc_t *sc;
-
-       sc = device_get_softc(dev);
-       ifp = &sc->arpcom.ac_if;
-
-       lwkt_serialize_enter(ifp->if_serializer);
+       epic_softc_t *sc = device_get_softc(dev);
+       struct ifnet *ifp = &sc->arpcom.ac_if;
 
        if (device_is_attached(dev)) {
-               ether_ifdetach(ifp);
+               lwkt_serialize_enter(ifp->if_serializer);
                epic_stop(sc);
+               bus_teardown_intr(dev, sc->irq, sc->sc_ih);
+               lwkt_serialize_exit(ifp->if_serializer);
+
+               ether_ifdetach(ifp);
        }
 
        if (sc->miibus)
                device_delete_child(dev, sc->miibus);
        bus_generic_detach(dev);
 
-       if (sc->sc_ih)
-               bus_teardown_intr(dev, sc->irq, sc->sc_ih);
-
        if (sc->irq)
                bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq);
        if (sc->res)
@@ -329,7 +325,6 @@ epic_detach(device_t dev)
        if (sc->rx_desc)
                free(sc->rx_desc, M_DEVBUF);
 
-       lwkt_serialize_exit(ifp->if_serializer);
        return(0);
 }
 
index 4126636..b0b0695 100644 (file)
@@ -1,6 +1,6 @@
 /*     $OpenBSD: if_txp.c,v 1.48 2001/06/27 06:34:50 kjc Exp $ */
 /*     $FreeBSD: src/sys/dev/txp/if_txp.c,v 1.4.2.4 2001/12/14 19:50:43 jlemon Exp $ */
-/*     $DragonFly: src/sys/dev/netif/txp/if_txp.c,v 1.34 2005/12/11 01:54:09 swildner Exp $ */
+/*     $DragonFly: src/sys/dev/netif/txp/if_txp.c,v 1.35 2005/12/31 14:08:00 sephe Exp $ */
 
 /*
  * Copyright (c) 2001
@@ -332,16 +332,17 @@ fail:
 static int
 txp_detach(device_t dev)
 {
-       struct txp_softc *sc;
-       struct ifnet *ifp;
+       struct txp_softc *sc = device_get_softc(dev);
+       struct ifnet *ifp = &sc->sc_arpcom.ac_if;
        int i;
 
-       sc = device_get_softc(dev);
-       ifp = &sc->sc_arpcom.ac_if;
        lwkt_serialize_enter(ifp->if_serializer);
 
        txp_stop(sc);
        txp_shutdown(dev);
+       bus_teardown_intr(dev, sc->sc_irq, sc->sc_intrhand);
+
+       lwkt_serialize_exit(ifp->if_serializer);
 
        ifmedia_removeall(&sc->sc_ifmedia);
        ether_ifdetach(ifp);
@@ -350,7 +351,6 @@ txp_detach(device_t dev)
                free(sc->sc_rxbufs[i].rb_sd, M_DEVBUF);
 
        txp_release_resources(dev);
-       lwkt_serialize_exit(ifp->if_serializer);
 
        return(0);
 }
@@ -362,9 +362,6 @@ txp_release_resources(device_t dev)
 
        sc = device_get_softc(dev);
 
-       if (sc->sc_intrhand != NULL)
-               bus_teardown_intr(dev, sc->sc_irq, sc->sc_intrhand);
-
        if (sc->sc_irq != NULL)
                bus_release_resource(dev, SYS_RES_IRQ, 0, sc->sc_irq);
 
index 13ec573..1139019 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/pci/if_vr.c,v 1.26.2.13 2003/02/06 04:46:20 silby Exp $
- * $DragonFly: src/sys/dev/netif/vr/if_vr.c,v 1.40 2005/11/28 17:13:44 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/vr/if_vr.c,v 1.41 2005/12/31 14:08:00 sephe Exp $
  */
 
 /*
@@ -813,19 +813,18 @@ vr_detach(device_t dev)
        struct vr_softc *sc = device_get_softc(dev);
        struct ifnet *ifp = &sc->arpcom.ac_if;
 
-       lwkt_serialize_enter(ifp->if_serializer);
-
        if (device_is_attached(dev)) {
+               lwkt_serialize_enter(ifp->if_serializer);
                vr_stop(sc);
+               bus_teardown_intr(dev, sc->vr_irq, sc->vr_intrhand);
+               lwkt_serialize_exit(ifp->if_serializer);
+
                ether_ifdetach(ifp);
        }
        if (sc->vr_miibus != NULL)
                device_delete_child(dev, sc->vr_miibus);
        bus_generic_detach(dev);
 
-       if (sc->vr_intrhand != NULL)
-               bus_teardown_intr(dev, sc->vr_irq, sc->vr_intrhand);
-
        if (sc->vr_irq != NULL)
                bus_release_resource(dev, SYS_RES_IRQ, 0, sc->vr_irq);
        if (sc->vr_res != NULL)
@@ -835,7 +834,6 @@ vr_detach(device_t dev)
        if (sc->vr_cdata.vr_tx_buf != NULL)
                contigfree(sc->vr_cdata.vr_tx_buf, VR_TX_BUF_SIZE, M_DEVBUF);
 
-       lwkt_serialize_exit(ifp->if_serializer);
        return(0);
 }
 
index 50c7a74..be09099 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/pci/if_wb.c,v 1.26.2.6 2003/03/05 18:42:34 njl Exp $
- * $DragonFly: src/sys/dev/netif/wb/if_wb.c,v 1.33 2005/11/28 17:13:44 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/wb/if_wb.c,v 1.34 2005/12/31 14:08:00 sephe Exp $
  */
 
 /*
@@ -836,11 +836,13 @@ wb_detach(device_t dev)
        struct wb_softc *sc = device_get_softc(dev);
        struct ifnet *ifp = &sc->arpcom.ac_if;
 
-       lwkt_serialize_enter(ifp->if_serializer);
 
        if (device_is_attached(dev)) {
-               if (bus_child_present(dev))
-                       wb_stop(sc);
+               lwkt_serialize_enter(ifp->if_serializer);
+               wb_stop(sc);
+               bus_teardown_intr(dev, sc->wb_irq, sc->wb_intrhand);
+               lwkt_serialize_exit(ifp->if_serializer);
+
                ether_ifdetach(ifp);
        }
 
@@ -848,9 +850,6 @@ wb_detach(device_t dev)
                device_delete_child(dev, sc->wb_miibus);
        bus_generic_detach(dev);
 
-       if (sc->wb_intrhand)
-               bus_teardown_intr(dev, sc->wb_irq, sc->wb_intrhand);
-       crit_exit();
        if (sc->wb_irq);
                bus_release_resource(dev, SYS_RES_IRQ, 0, sc->wb_irq);
        if (sc->wb_res)
@@ -859,7 +858,6 @@ wb_detach(device_t dev)
                contigfree(sc->wb_ldata_ptr, sizeof(struct wb_list_data) + 8,
                    M_DEVBUF);
        }
-       lwkt_serialize_exit(ifp->if_serializer);
 
        return(0);
 }
index bbc0ac6..486ec4b 100644 (file)
@@ -32,7 +32,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/wi/if_wi.c,v 1.166 2004/04/01 00:38:45 sam Exp $
- * $DragonFly: src/sys/dev/netif/wi/if_wi.c,v 1.33 2005/12/16 21:05:48 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/wi/if_wi.c,v 1.34 2005/12/31 14:08:00 sephe Exp $
  */
 
 /*
@@ -510,14 +510,12 @@ wi_detach(device_t dev)
 
        /* check if device was removed */
        sc->wi_gone |= !bus_child_present(dev);
-
        wi_stop(ifp, 0);
 
-       ieee80211_ifdetach(ifp);
-       wi_free(dev);
-
        lwkt_serialize_exit(ifp->if_serializer);
 
+       ieee80211_ifdetach(ifp);
+       wi_free(dev);
        return (0);
 }
 
index eae12e8..b3e4656 100644 (file)
@@ -1,5 +1,5 @@
 /* $FreeBSD: src/sys/i386/isa/if_wl.c,v 1.27.2.2 2000/07/17 21:24:32 archie Exp $ */
-/* $DragonFly: src/sys/dev/netif/wl/if_wl.c,v 1.26 2005/11/28 17:13:44 dillon Exp $ */
+/* $DragonFly: src/sys/dev/netif/wl/if_wl.c,v 1.27 2005/12/31 14:08:00 sephe Exp $ */
 /* 
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -577,7 +577,6 @@ wldetach(device_t dev)
     struct ifnet *ifp = &sc->wl_if;
 
     lwkt_serialize_enter(ifp->if_serializer);
-    ether_ifdetach(ifp);
 
     /* reset the board */
     sc->hacr = HACR_RESET;
@@ -590,10 +589,12 @@ wldetach(device_t dev)
        sc->intr_handle = NULL;
     }
 
-    bus_generic_detach(dev);
+    lwkt_serialize_exit(ifp->if_serializer);
 
+    ether_ifdetach(ifp);
+    bus_generic_detach(dev);
     wl_free_resources(dev);
-    lwkt_serialize_exit(ifp->if_serializer);
+
     return (0);
 }
 
index ae3c50e..f5dcb88 100644 (file)
@@ -25,7 +25,7 @@
  *
  *     $Id: if_xe.c,v 1.20 1999/06/13 19:17:40 scott Exp $
  * $FreeBSD: src/sys/dev/xe/if_xe.c,v 1.39 2003/10/14 22:51:35 rsm Exp $
- * $DragonFly: src/sys/dev/netif/xe/if_xe.c,v 1.30 2005/11/28 17:13:44 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/xe/if_xe.c,v 1.31 2005/12/31 14:08:00 sephe Exp $
  */
 
 /*
@@ -186,7 +186,7 @@ static u_int16_t xe_phy_readreg             (struct xe_softc *scp, u_int16_t reg);
 static void      xe_phy_writereg       (struct xe_softc *scp, u_int16_t reg, u_int16_t data);
 
 /* Debugging functions */
-static void      xe_reg_dump           (struct xe_softc *scp);
+static void      xe_reg_dump           (struct xe_softc *scp) __unused;
 static void      xe_mii_dump           (struct xe_softc *scp);
 
 #define XE_DEBUG
@@ -232,17 +232,19 @@ int
 xe_detach(device_t dev)
 {
   struct xe_softc *sc = device_get_softc(dev);
+  struct ifnet *ifp = &sc->arpcom.ac_if;
 
-  crit_enter();
+  lwkt_serialize_enter(ifp->if_serializer);
 
-  sc->arpcom.ac_if.if_flags &= ~IFF_RUNNING; 
+  ifp->if_flags &= ~IFF_RUNNING; 
   callout_stop(&sc->xe_timer);
-  ether_ifdetach(&sc->arpcom.ac_if);
   bus_teardown_intr(dev, sc->irq_res, sc->intrhand);
 
-  crit_exit();
+  lwkt_serialize_exit(ifp->if_serializer);
 
+  ether_ifdetach(ifp);
   xe_deactivate(dev);
+
   return 0;
 }
 
index 2f2e973..3a8e7bb 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/pci/if_xl.c,v 1.72.2.28 2003/10/08 06:01:57 murray Exp $
- * $DragonFly: src/sys/dev/netif/xl/if_xl.c,v 1.42 2005/11/28 17:13:44 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/xl/if_xl.c,v 1.43 2005/12/31 14:08:01 sephe Exp $
  */
 
 /*
@@ -1632,8 +1632,6 @@ xl_detach(device_t dev)
        sc = device_get_softc(dev);
        ifp = &sc->arpcom.ac_if;
 
-       lwkt_serialize_enter(ifp->if_serializer);
-
        if (sc->xl_flags & XL_FLAG_USE_MMIO) {
                rid = XL_PCI_LOMEM;
                res = SYS_RES_MEMORY;
@@ -1643,8 +1641,12 @@ xl_detach(device_t dev)
        }
 
        if (device_is_attached(dev)) {
+               lwkt_serialize_enter(ifp->if_serializer);
                xl_reset(sc);
                xl_stop(sc);
+               bus_teardown_intr(dev, sc->xl_irq, sc->xl_intrhand);
+               lwkt_serialize_exit(ifp->if_serializer);
+
                ether_ifdetach(ifp);
        }
 
@@ -1653,9 +1655,6 @@ xl_detach(device_t dev)
        bus_generic_detach(dev);
        ifmedia_removeall(&sc->ifmedia);
 
-       if (sc->xl_intrhand)
-               bus_teardown_intr(dev, sc->xl_irq, sc->xl_intrhand);
-
        if (sc->xl_irq)
                bus_release_resource(dev, SYS_RES_IRQ, 0, sc->xl_irq);
        if (sc->xl_fres != NULL)
@@ -1665,7 +1664,6 @@ xl_detach(device_t dev)
                bus_release_resource(dev, res, rid, sc->xl_res);
 
        xl_dma_free(dev);
-       lwkt_serialize_exit(ifp->if_serializer);
 
        return(0);
 }