Module Name: src
Committed By: cegger
Date: Fri Apr 17 14:07:32 UTC 2009
Modified Files:
src/sys/dev/pci: if_tlp_pci.c
Log Message:
Free resources in error path.
While here, fix copy&paste error I introduced in rev. 1.108.
To generate a diff of this commit:
cvs rdiff -u -r1.109 -r1.110 src/sys/dev/pci/if_tlp_pci.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/pci/if_tlp_pci.c
diff -u src/sys/dev/pci/if_tlp_pci.c:1.109 src/sys/dev/pci/if_tlp_pci.c:1.110
--- src/sys/dev/pci/if_tlp_pci.c:1.109 Fri Apr 17 13:15:53 2009
+++ src/sys/dev/pci/if_tlp_pci.c Fri Apr 17 14:07:32 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: if_tlp_pci.c,v 1.109 2009/04/17 13:15:53 cegger Exp $ */
+/* $NetBSD: if_tlp_pci.c,v 1.110 2009/04/17 14:07:32 cegger Exp $ */
/*-
* Copyright (c) 1998, 1999, 2000, 2002 The NetBSD Foundation, Inc.
@@ -36,7 +36,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_tlp_pci.c,v 1.109 2009/04/17 13:15:53 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_tlp_pci.c,v 1.110 2009/04/17 14:07:32 cegger Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -544,21 +544,21 @@
sc->sc_st = memt;
sc->sc_sh = memh;
psc->sc_mapsize = memsize;
- if (ioh_valid)
+ if (ioh_valid) {
bus_space_unmap(iot, ioh, iosize);
+ ioh_valid = 0;
+ }
} else if (ioh_valid) {
sc->sc_st = iot;
sc->sc_sh = ioh;
psc->sc_mapsize = iosize;
- if (memh_valid)
- bus_space_unmap(iot, ioh, memsize);
+ if (memh_valid) {
+ bus_space_unmap(memt, memh, memsize);
+ memh_valid = 0;
+ }
} else {
aprint_error_dev(self, "unable to map device registers\n");
- if (ioh_valid)
- bus_space_unmap(iot, ioh, iosize);
- if (memh_valid)
- bus_space_unmap(iot, ioh, memsize);
- return;
+ goto fail;
}
sc->sc_dmat = pa->pa_dmat;
@@ -626,7 +626,7 @@
}
if (val & PNIC_MIIROM_BUSY) {
aprint_error_dev(self, "EEPROM timed out\n");
- return;
+ goto fail;
}
val &= PNIC_MIIROM_DATA;
sc->sc_srom[i] = val >> 8;
@@ -981,7 +981,7 @@
default:
cant_cope:
aprint_error_dev(self, "sorry, unable to handle your board\n");
- return;
+ goto fail;
}
/*
@@ -1009,7 +1009,7 @@
*/
if (pci_intr_map(pa, &ih)) {
aprint_error_dev(self, "unable to map interrupt\n");
- return;
+ goto fail;
}
intrstr = pci_intr_string(pc, ih);
psc->sc_ih = pci_intr_establish(pc, ih, IPL_NET,
@@ -1020,7 +1020,7 @@
if (intrstr != NULL)
aprint_error(" at %s", intrstr);
aprint_error("\n");
- return;
+ goto fail;
}
aprint_normal_dev(self, "interrupting at %s\n",
intrstr);
@@ -1030,6 +1030,20 @@
* Finish off the attach.
*/
tlp_attach(sc, enaddr);
+ return;
+
+fail:
+ if (psc->sc_ih != NULL) {
+ pci_intr_disestablish(psc->sc_pc, psc->sc_ih);
+ psc->sc_ih = NULL;
+ }
+
+ if (ioh_valid)
+ bus_space_unmap(iot, ioh, iosize);
+ if (memh_valid)
+ bus_space_unmap(memt, memh, memsize);
+ psc->sc_mapsize = 0;
+ return;
}
static int