From cdf8943267dded98e264d518696299371b913d6d Mon Sep 17 00:00:00 2001 From: Sepherosa Ziehau Date: Sat, 31 Dec 2005 14:08:01 +0000 Subject: [PATCH] {ether,ieee80211}_ifdetach() can't be called with serializer being held, since 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 Discussed-with: dillon and joerg Partially-Reviewed-by: dillon and joerg Reported-by: Steve Mynott and me --- sys/dev/netif/an/if_an.c | 7 ++++--- sys/dev/netif/awi/if_awi_pccard.c | 8 ++++++-- sys/dev/netif/bfe/if_bfe.c | 15 +++++++------- sys/dev/netif/bge/if_bge.c | 16 ++++++--------- sys/dev/netif/cm/if_cm_isa.c | 7 ++++--- sys/dev/netif/cs/if_cs.c | 11 +++++------ sys/dev/netif/dc/if_dc.c | 14 ++++++------- sys/dev/netif/ed/if_ed_isa.c | 10 +++++++--- sys/dev/netif/ed/if_ed_pccard.c | 10 +++++++--- sys/dev/netif/ed/if_ed_pci.c | 10 +++++++--- sys/dev/netif/em/if_em.c | 20 +++++++++---------- sys/dev/netif/ep/if_ep_pccard.c | 13 +++++++++--- sys/dev/netif/ex/if_ex_pccard.c | 9 +++++---- sys/dev/netif/fe/if_fe_pccard.c | 7 ++++--- sys/dev/netif/fwe/if_fwe.c | 5 +++-- sys/dev/netif/fxp/if_fxp.c | 15 +++++++------- sys/dev/netif/gx/if_gx.c | 14 ++++++------- sys/dev/netif/ipw/if_ipw.c | 33 +++++++++++++++++-------------- sys/dev/netif/iwi/if_iwi.c | 11 +++++------ sys/dev/netif/lge/if_lge.c | 11 +++++------ sys/dev/netif/lnc/if_lnc_isa.c | 14 ++++++------- sys/dev/netif/lnc/if_lnc_pci.c | 14 ++++++------- sys/dev/netif/my/if_my.c | 12 +++++------ sys/dev/netif/ndis/if_ndis.c | 22 ++++++++++----------- sys/dev/netif/nge/if_nge.c | 12 +++++------ sys/dev/netif/nv/if_nv.c | 19 +++++++++++------- sys/dev/netif/owi/if_owi.c | 10 +++++----- sys/dev/netif/pcn/if_pcn.c | 12 +++++------ sys/dev/netif/ray/if_ray.c | 17 +++++++++------- sys/dev/netif/re/if_re.c | 15 +++++++------- sys/dev/netif/rl/if_rl.c | 13 +++++------- sys/dev/netif/sbsh/if_sbsh.c | 15 +++++++------- sys/dev/netif/sf/if_sf.c | 14 ++++++------- sys/dev/netif/sis/if_sis.c | 11 +++++------ sys/dev/netif/sk/if_sk.c | 21 +++++++++++++------- sys/dev/netif/sn/if_sn.c | 5 +---- sys/dev/netif/sn/if_sn_pccard.c | 10 ++++++++-- sys/dev/netif/ste/if_ste.c | 21 ++++++++------------ sys/dev/netif/ti/if_ti.c | 15 ++++++-------- sys/dev/netif/tl/if_tl.c | 11 +++++------ sys/dev/netif/tx/if_tx.c | 21 ++++++++------------ sys/dev/netif/txp/if_txp.c | 15 ++++++-------- sys/dev/netif/vr/if_vr.c | 12 +++++------ sys/dev/netif/wb/if_wb.c | 14 ++++++------- sys/dev/netif/wi/if_wi.c | 8 +++----- sys/dev/netif/wl/if_wl.c | 9 +++++---- sys/dev/netif/xe/if_xe.c | 14 +++++++------ sys/dev/netif/xl/if_xl.c | 12 +++++------ 48 files changed, 316 insertions(+), 318 deletions(-) diff --git a/sys/dev/netif/an/if_an.c b/sys/dev/netif/an/if_an.c index 4652be8551..cf377a7a2a 100644 --- a/sys/dev/netif/an/if_an.c +++ b/sys/dev/netif/an/if_an.c @@ -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; } diff --git a/sys/dev/netif/awi/if_awi_pccard.c b/sys/dev/netif/awi/if_awi_pccard.c index bd60232bc8..9f00210a72 100644 --- a/sys/dev/netif/awi/if_awi_pccard.c +++ b/sys/dev/netif/awi/if_awi_pccard.c @@ -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 @@ -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); diff --git a/sys/dev/netif/bfe/if_bfe.c b/sys/dev/netif/bfe/if_bfe.c index a319ab75b1..e6524ce403 100644 --- a/sys/dev/netif/bfe/if_bfe.c +++ b/sys/dev/netif/bfe/if_bfe.c @@ -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 @@ -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); } diff --git a/sys/dev/netif/bge/if_bge.c b/sys/dev/netif/bge/if_bge.c index fa0f5b03d0..76d666184d 100644 --- a/sys/dev/netif/bge/if_bge.c +++ b/sys/dev/netif/bge/if_bge.c @@ -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); diff --git a/sys/dev/netif/cm/if_cm_isa.c b/sys/dev/netif/cm/if_cm_isa.c index 46c9bc759b..ea0b3504f1 100644 --- a/sys/dev/netif/cm/if_cm_isa.c +++ b/sys/dev/netif/cm/if_cm_isa.c @@ -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); } diff --git a/sys/dev/netif/cs/if_cs.c b/sys/dev/netif/cs/if_cs.c index e4d50edf48..4a2b070d2b 100644 --- a/sys/dev/netif/cs/if_cs.c +++ b/sys/dev/netif/cs/if_cs.c @@ -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; } diff --git a/sys/dev/netif/dc/if_dc.c b/sys/dev/netif/dc/if_dc.c index d145ba343f..18cbf92c20 100644 --- a/sys/dev/netif/dc/if_dc.c +++ b/sys/dev/netif/dc/if_dc.c @@ -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); } diff --git a/sys/dev/netif/ed/if_ed_isa.c b/sys/dev/netif/ed/if_ed_isa.c index b3c93995f3..20e6f61b88 100644 --- a/sys/dev/netif/ed/if_ed_isa.c +++ b/sys/dev/netif/ed/if_ed_isa.c @@ -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 @@ -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); } diff --git a/sys/dev/netif/ed/if_ed_pccard.c b/sys/dev/netif/ed/if_ed_pccard.c index 04091dd0d4..619bd21089 100644 --- a/sys/dev/netif/ed/if_ed_pccard.c +++ b/sys/dev/netif/ed/if_ed_pccard.c @@ -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); } diff --git a/sys/dev/netif/ed/if_ed_pci.c b/sys/dev/netif/ed/if_ed_pci.c index 8c0a5d6f00..4b775604cc 100644 --- a/sys/dev/netif/ed/if_ed_pci.c +++ b/sys/dev/netif/ed/if_ed_pci.c @@ -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 @@ -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); } diff --git a/sys/dev/netif/em/if_em.c b/sys/dev/netif/em/if_em.c index 339825ba34..d49d58fd55 100644 --- a/sys/dev/netif/em/if_em.c +++ b/sys/dev/netif/em/if_em.c @@ -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); } diff --git a/sys/dev/netif/ep/if_ep_pccard.c b/sys/dev/netif/ep/if_ep_pccard.c index 79121b6d7e..fa35fdf733 100644 --- a/sys/dev/netif/ep/if_ep_pccard.c +++ b/sys/dev/netif/ep/if_ep_pccard.c @@ -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); } diff --git a/sys/dev/netif/ex/if_ex_pccard.c b/sys/dev/netif/ex/if_ex_pccard.c index 563b022ec0..c6dd281feb 100644 --- a/sys/dev/netif/ex/if_ex_pccard.c +++ b/sys/dev/netif/ex/if_ex_pccard.c @@ -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 @@ -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); } diff --git a/sys/dev/netif/fe/if_fe_pccard.c b/sys/dev/netif/fe/if_fe_pccard.c index 79f709e7f1..55d852a0ca 100644 --- a/sys/dev/netif/fe/if_fe_pccard.c +++ b/sys/dev/netif/fe/if_fe_pccard.c @@ -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; } diff --git a/sys/dev/netif/fwe/if_fwe.c b/sys/dev/netif/fwe/if_fwe.c index 103c6609fb..0aa7e80219 100644 --- a/sys/dev/netif/fwe/if_fwe.c +++ b/sys/dev/netif/fwe/if_fwe.c @@ -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; } diff --git a/sys/dev/netif/fxp/if_fxp.c b/sys/dev/netif/fxp/if_fxp.c index d4555d8fca..fad98f0edc 100644 --- a/sys/dev/netif/fxp/if_fxp.c +++ b/sys/dev/netif/fxp/if_fxp.c @@ -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); } diff --git a/sys/dev/netif/gx/if_gx.c b/sys/dev/netif/gx/if_gx.c index 235f74d511..f590560632 100644 --- a/sys/dev/netif/gx/if_gx.c +++ b/sys/dev/netif/gx/if_gx.c @@ -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 @@ -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); } diff --git a/sys/dev/netif/ipw/if_ipw.c b/sys/dev/netif/ipw/if_ipw.c index 736a2000c0..1b0e723fb8 100644 --- a/sys/dev/netif/ipw/if_ipw.c +++ b/sys/dev/netif/ipw/if_ipw.c @@ -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; } diff --git a/sys/dev/netif/iwi/if_iwi.c b/sys/dev/netif/iwi/if_iwi.c index 1f936d5cd2..7ad6a43b25 100644 --- a/sys/dev/netif/iwi/if_iwi.c +++ b/sys/dev/netif/iwi/if_iwi.c @@ -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); diff --git a/sys/dev/netif/lge/if_lge.c b/sys/dev/netif/lge/if_lge.c index 02bbce0108..8a617b86f2 100644 --- a/sys/dev/netif/lge/if_lge.c +++ b/sys/dev/netif/lge/if_lge.c @@ -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); } diff --git a/sys/dev/netif/lnc/if_lnc_isa.c b/sys/dev/netif/lnc/if_lnc_isa.c index 69d01e9432..988c93c812 100644 --- a/sys/dev/netif/lnc/if_lnc_isa.c +++ b/sys/dev/netif/lnc/if_lnc_isa.c @@ -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 @@ -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); } diff --git a/sys/dev/netif/lnc/if_lnc_pci.c b/sys/dev/netif/lnc/if_lnc_pci.c index 051455aaf4..120e32ad3f 100644 --- a/sys/dev/netif/lnc/if_lnc_pci.c +++ b/sys/dev/netif/lnc/if_lnc_pci.c @@ -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 @@ -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); } diff --git a/sys/dev/netif/my/if_my.c b/sys/dev/netif/my/if_my.c index b78f981c39..0bea17a1ef 100644 --- a/sys/dev/netif/my/if_my.c +++ b/sys/dev/netif/my/if_my.c @@ -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); diff --git a/sys/dev/netif/ndis/if_ndis.c b/sys/dev/netif/ndis/if_ndis.c index 90740a357c..4a362ac800 100644 --- a/sys/dev/netif/ndis/if_ndis.c +++ b/sys/dev/netif/ndis/if_ndis.c @@ -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 @@ -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 diff --git a/sys/dev/netif/nge/if_nge.c b/sys/dev/netif/nge/if_nge.c index f928da5f20..e26740ff4c 100644 --- a/sys/dev/netif/nge/if_nge.c +++ b/sys/dev/netif/nge/if_nge.c @@ -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); } diff --git a/sys/dev/netif/nv/if_nv.c b/sys/dev/netif/nv/if_nv.c index 3653b39197..857abbcd0a 100644 --- a/sys/dev/netif/nv/if_nv.c +++ b/sys/dev/netif/nv/if_nv.c @@ -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); } diff --git a/sys/dev/netif/owi/if_owi.c b/sys/dev/netif/owi/if_owi.c index a1ca22067e..98e46c098f 100644 --- a/sys/dev/netif/owi/if_owi.c +++ b/sys/dev/netif/owi/if_owi.c @@ -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); } diff --git a/sys/dev/netif/pcn/if_pcn.c b/sys/dev/netif/pcn/if_pcn.c index 3bbee4b195..b6ee2cd418 100644 --- a/sys/dev/netif/pcn/if_pcn.c +++ b/sys/dev/netif/pcn/if_pcn.c @@ -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); } diff --git a/sys/dev/netif/ray/if_ray.c b/sys/dev/netif/ray/if_ray.c index b391889c31..5b449cc98c 100644 --- a/sys/dev/netif/ray/if_ray.c +++ b/sys/dev/netif/ray/if_ray.c @@ -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); } diff --git a/sys/dev/netif/re/if_re.c b/sys/dev/netif/re/if_re.c index 9fed52a953..d58391a846 100644 --- a/sys/dev/netif/re/if_re.c +++ b/sys/dev/netif/re/if_re.c @@ -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); } diff --git a/sys/dev/netif/rl/if_rl.c b/sys/dev/netif/rl/if_rl.c index fe4fd63e45..930a949ab5 100644 --- a/sys/dev/netif/rl/if_rl.c +++ b/sys/dev/netif/rl/if_rl.c @@ -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); } diff --git a/sys/dev/netif/sbsh/if_sbsh.c b/sys/dev/netif/sbsh/if_sbsh.c index b3ec1a9e2e..6664c404ab 100644 --- a/sys/dev/netif/sbsh/if_sbsh.c +++ b/sys/dev/netif/sbsh/if_sbsh.c @@ -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 @@ -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); } diff --git a/sys/dev/netif/sf/if_sf.c b/sys/dev/netif/sf/if_sf.c index f227df8026..342ec07409 100644 --- a/sys/dev/netif/sf/if_sf.c +++ b/sys/dev/netif/sf/if_sf.c @@ -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); } diff --git a/sys/dev/netif/sis/if_sis.c b/sys/dev/netif/sis/if_sis.c index 3261fb00b0..7712940643 100644 --- a/sys/dev/netif/sis/if_sis.c +++ b/sys/dev/netif/sis/if_sis.c @@ -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); } diff --git a/sys/dev/netif/sk/if_sk.c b/sys/dev/netif/sk/if_sk.c index a1ae32f3a2..4b35b3491f 100644 --- a/sys/dev/netif/sk/if_sk.c +++ b/sys/dev/netif/sk/if_sk.c @@ -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); diff --git a/sys/dev/netif/sn/if_sn.c b/sys/dev/netif/sn/if_sn.c index 2af1a0c7bf..197b46bb3d 100644 --- a/sys/dev/netif/sn/if_sn.c +++ b/sys/dev/netif/sn/if_sn.c @@ -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); diff --git a/sys/dev/netif/sn/if_sn_pccard.c b/sys/dev/netif/sn/if_sn_pccard.c index 78bbe9042a..210d81ffd1 100644 --- a/sys/dev/netif/sn/if_sn_pccard.c +++ b/sys/dev/netif/sn/if_sn_pccard.c @@ -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; } diff --git a/sys/dev/netif/ste/if_ste.c b/sys/dev/netif/ste/if_ste.c index 38492c0720..77b18d5360 100644 --- a/sys/dev/netif/ste/if_ste.c +++ b/sys/dev/netif/ste/if_ste.c @@ -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 @@ -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); } diff --git a/sys/dev/netif/ti/if_ti.c b/sys/dev/netif/ti/if_ti.c index 5945e2fd3c..3ff15eed44 100644 --- a/sys/dev/netif/ti/if_ti.c +++ b/sys/dev/netif/ti/if_ti.c @@ -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); } diff --git a/sys/dev/netif/tl/if_tl.c b/sys/dev/netif/tl/if_tl.c index 6bf513f291..f9fb0605ac 100644 --- a/sys/dev/netif/tl/if_tl.c +++ b/sys/dev/netif/tl/if_tl.c @@ -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); } diff --git a/sys/dev/netif/tx/if_tx.c b/sys/dev/netif/tx/if_tx.c index 66a98df5da..e0e153439f 100644 --- a/sys/dev/netif/tx/if_tx.c +++ b/sys/dev/netif/tx/if_tx.c @@ -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); } diff --git a/sys/dev/netif/txp/if_txp.c b/sys/dev/netif/txp/if_txp.c index 41266365dc..b0b0695ac7 100644 --- a/sys/dev/netif/txp/if_txp.c +++ b/sys/dev/netif/txp/if_txp.c @@ -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); diff --git a/sys/dev/netif/vr/if_vr.c b/sys/dev/netif/vr/if_vr.c index 13ec573e65..113901925a 100644 --- a/sys/dev/netif/vr/if_vr.c +++ b/sys/dev/netif/vr/if_vr.c @@ -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); } diff --git a/sys/dev/netif/wb/if_wb.c b/sys/dev/netif/wb/if_wb.c index 50c7a74195..be09099a5f 100644 --- a/sys/dev/netif/wb/if_wb.c +++ b/sys/dev/netif/wb/if_wb.c @@ -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); } diff --git a/sys/dev/netif/wi/if_wi.c b/sys/dev/netif/wi/if_wi.c index bbc0ac61d2..486ec4b4fc 100644 --- a/sys/dev/netif/wi/if_wi.c +++ b/sys/dev/netif/wi/if_wi.c @@ -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); } diff --git a/sys/dev/netif/wl/if_wl.c b/sys/dev/netif/wl/if_wl.c index eae12e8983..b3e46569b5 100644 --- a/sys/dev/netif/wl/if_wl.c +++ b/sys/dev/netif/wl/if_wl.c @@ -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); } diff --git a/sys/dev/netif/xe/if_xe.c b/sys/dev/netif/xe/if_xe.c index ae3c50e41f..f5dcb88beb 100644 --- a/sys/dev/netif/xe/if_xe.c +++ b/sys/dev/netif/xe/if_xe.c @@ -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; } diff --git a/sys/dev/netif/xl/if_xl.c b/sys/dev/netif/xl/if_xl.c index 2f2e973629..3a8e7bb0b0 100644 --- a/sys/dev/netif/xl/if_xl.c +++ b/sys/dev/netif/xl/if_xl.c @@ -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); } -- 2.41.0