Module Name:    src
Committed By:   cegger
Date:           Sun Apr 26 06:56:46 UTC 2009

Modified Files:
        src/sys/dev/pci: if_lii.c

Log Message:
fix error handling in lii_attach()
ok jmcneill@


To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/sys/dev/pci/if_lii.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_lii.c
diff -u src/sys/dev/pci/if_lii.c:1.5 src/sys/dev/pci/if_lii.c:1.6
--- src/sys/dev/pci/if_lii.c:1.5	Tue Jul  8 12:39:27 2008
+++ src/sys/dev/pci/if_lii.c	Sun Apr 26 06:56:46 2009
@@ -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 @@
 	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 @@
 		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 @@
 
 	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 @@
 		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 @@
 		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

Reply via email to