diff options
| author | cegger <cegger@NetBSD.org> | 2009-04-26 06:56:46 +0000 |
|---|---|---|
| committer | cegger <cegger@NetBSD.org> | 2009-04-26 06:56:46 +0000 |
| commit | f8c09ed139fbea076540cd6a2726be9eaabcac32 (patch) | |
| tree | 4da3f7d31d22cef97b00ce9a36652067c2c04e47 /sys/dev | |
| parent | 10a1256f76971fc74f0e6bcc0762545c8a7b0764 (diff) | |
fix error handling in lii_attach()
ok jmcneill@
Diffstat (limited to 'sys/dev')
| -rw-r--r-- | sys/dev/pci/if_lii.c | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/sys/dev/pci/if_lii.c b/sys/dev/pci/if_lii.c index db0a8d7e90d..8d2b4bf5d79 100644 --- a/sys/dev/pci/if_lii.c +++ b/sys/dev/pci/if_lii.c @@ -1,4 +1,4 @@ -/* $NetBSD: if_lii.c,v 1.5 2008/07/08 12:39:27 sborrill Exp $ */ +/* $NetBSD: if_lii.c,v 1.6 2009/04/26 06:56:46 cegger Exp $ */ /* * Copyright (c) 2008 The NetBSD Foundation. @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_lii.c,v 1.5 2008/07/08 12:39:27 sborrill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_lii.c,v 1.6 2009/04/26 06:56:46 cegger Exp $"); #include "bpfilter.h" @@ -243,6 +243,7 @@ lii_attach(device_t parent, device_t self, void *aux) pci_intr_handle_t ih; const char *intrstr; pcireg_t cmd; + bus_size_t memsize = 0; aprint_naive("\n"); aprint_normal(": Attansic/Atheros L2 Fast Ethernet\n"); @@ -267,7 +268,7 @@ lii_attach(device_t parent, device_t self, void *aux) break; } if (pci_mapreg_map(pa, PCI_MAPREG_START, cmd, 0, - &sc->sc_mmiot, &sc->sc_mmioh, NULL, NULL) != 0) { + &sc->sc_mmiot, &sc->sc_mmioh, NULL, &memsize) != 0) { aprint_error_dev(self, "failed to map registers\n"); return; } @@ -291,7 +292,7 @@ lii_attach(device_t parent, device_t self, void *aux) if (pci_intr_map(pa, &ih) != 0) { aprint_error_dev(self, "failed to map interrupt\n"); - return; + goto fail; } intrstr = pci_intr_string(sc->sc_pc, ih); sc->sc_ih = pci_intr_establish(sc->sc_pc, ih, IPL_NET, lii_intr, sc); @@ -300,14 +301,12 @@ lii_attach(device_t parent, device_t self, void *aux) if (intrstr != NULL) aprint_error(" at %s", intrstr); aprint_error("\n"); - return; + goto fail; } aprint_normal_dev(self, "interrupting at %s\n", intrstr); - if (lii_alloc_rings(sc)) { - pci_intr_disestablish(sc->sc_pc, sc->sc_ih); - return; - } + if (lii_alloc_rings(sc)) + goto fail; callout_init(&sc->sc_tick_ch, 0); callout_setfunc(&sc->sc_tick_ch, lii_tick, sc); @@ -347,6 +346,14 @@ lii_attach(device_t parent, device_t self, void *aux) pmf_class_network_register(self, ifp); return; + +fail: + if (sc->sc_ih != NULL) { + pci_intr_disestablish(sc->sc_pc, sc->sc_ih); + sc->sc_ih = NULL; + } + if (memsize) + bus_space_unmap(sc->sc_mmiot, sc->sc_mmioh, memsize); } static int |
