From 0d71884b7f5abf14c2e378f75d83f401753fa6b0 Mon Sep 17 00:00:00 2001 From: Joerg Sonnenberger Date: Thu, 30 Jun 2005 17:11:28 +0000 Subject: [PATCH] Tear down interrupt in wi_free when necessary. Return error from wi_reset in wi_attach. Return error value when all-zero MAC was read. Let wi_attach call wi_free in error conditions, not the frontends. Based-on-patch-by: Sepherosa Ziehau --- sys/dev/netif/wi/if_wi.c | 38 ++++++++++++++++++++------------- sys/dev/netif/wi/if_wi_pccard.c | 8 ++----- sys/dev/netif/wi/if_wi_pci.c | 7 ++---- 3 files changed, 27 insertions(+), 26 deletions(-) diff --git a/sys/dev/netif/wi/if_wi.c b/sys/dev/netif/wi/if_wi.c index 9d68a08eb9..5b6823a10c 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.27 2005/06/30 15:57:27 joerg Exp $ + * $DragonFly: src/sys/dev/netif/wi/if_wi.c,v 1.28 2005/06/30 17:11:28 joerg Exp $ */ /* @@ -255,17 +255,16 @@ wi_attach(device_t dev) */ error = bus_setup_intr(dev, sc->irq, INTR_TYPE_NET | INTR_MPSAFE, wi_intr, sc, &sc->wi_intrhand, NULL); - if (error) { device_printf(dev, "bus_setup_intr() failed! (%d)\n", error); - wi_free(dev); - return (error); + goto fail; } sc->wi_cmd_count = 500; /* Reset the NIC. */ - if (wi_reset(sc) != 0) - return ENXIO; /* XXX */ + error = wi_reset(sc); + if (error) + goto fail; /* * Read the station address. @@ -279,13 +278,14 @@ wi_attach(device_t dev) buflen = IEEE80211_ADDR_LEN; error = wi_read_rid(sc, WI_RID_MAC_NODE, ic->ic_myaddr, &buflen); } - if (error || IEEE80211_ADDR_EQ(ic->ic_myaddr, empty_macaddr)) { - if (error != 0) - device_printf(dev, "mac read failed %d\n", error); - else - device_printf(dev, "mac read failed (all zeros)\n"); - wi_free(dev); - return (error); + if (error) { + device_printf(dev, "mac read failed %d\n", error); + goto fail; + } + if (IEEE80211_ADDR_EQ(ic->ic_myaddr, empty_macaddr)) { + device_printf(dev, "mac read failed (all zeros)\n"); + error = ENXIO; + goto fail; } /* Read NIC identification */ @@ -491,7 +491,12 @@ wi_attach(device_t dev) sc->sc_rx_th.wr_ihdr.it_len = htole16(sc->sc_rx_th_len); sc->sc_rx_th.wr_ihdr.it_present = htole32(WI_RX_RADIOTAP_PRESENT); - return (0); + + return(0); + +fail: + wi_free(dev); + return(error); } int @@ -509,7 +514,6 @@ wi_detach(device_t dev) wi_stop(ifp, 0); ieee80211_ifdetach(ifp); - bus_teardown_intr(dev, sc->irq, sc->wi_intrhand); WI_UNLOCK(sc); wi_free(dev); return (0); @@ -2837,6 +2841,10 @@ wi_free(device_t dev) { struct wi_softc *sc = device_get_softc(dev); + if (sc->wi_intrhand != NULL) { + bus_teardown_intr(dev, sc->irq, sc->wi_intrhand); + sc->wi_intrhand = NULL; + } if (sc->iobase != NULL) { bus_release_resource(dev, SYS_RES_IOPORT, sc->iobase_rid, sc->iobase); sc->iobase = NULL; diff --git a/sys/dev/netif/wi/if_wi_pccard.c b/sys/dev/netif/wi/if_wi_pccard.c index cd7f5bed51..fd63877842 100644 --- a/sys/dev/netif/wi/if_wi_pccard.c +++ b/sys/dev/netif/wi/if_wi_pccard.c @@ -30,7 +30,7 @@ * THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/wi/if_wi_pccard.c,v 1.47 2004/06/09 06:31:40 imp Exp $ - * $DragonFly: src/sys/dev/netif/wi/if_wi_pccard.c,v 1.6 2004/09/06 13:52:24 joerg Exp $ + * $DragonFly: src/sys/dev/netif/wi/if_wi_pccard.c,v 1.7 2005/06/30 17:11:28 joerg Exp $ */ /* @@ -211,7 +211,6 @@ wi_pccard_attach(device_t dev) int error; uint32_t vendor; uint32_t product; - int retval; sc = device_get_softc(dev); @@ -242,8 +241,5 @@ wi_pccard_attach(device_t dev) return (ENXIO); #endif } - retval = wi_attach(dev); - if (retval != 0) - wi_free(dev); - return (retval); + return wi_attach(dev); } diff --git a/sys/dev/netif/wi/if_wi_pci.c b/sys/dev/netif/wi/if_wi_pci.c index 87ff04e358..0fe2952080 100644 --- a/sys/dev/netif/wi/if_wi_pci.c +++ b/sys/dev/netif/wi/if_wi_pci.c @@ -30,7 +30,7 @@ * THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/wi/if_wi_pci.c,v 1.22 2004/03/17 17:50:48 njl Exp $ - * $DragonFly: src/sys/dev/netif/wi/if_wi_pci.c,v 1.6 2005/06/30 16:05:14 joerg Exp $ + * $DragonFly: src/sys/dev/netif/wi/if_wi_pci.c,v 1.7 2005/06/30 17:11:28 joerg Exp $ */ /* @@ -232,10 +232,7 @@ wi_pci_attach(device_t dev) return (ENXIO); } - error = wi_attach(dev); - if (error != 0) - wi_free(dev); - return (error); + return wi_attach(dev); } static int -- 2.41.0