Module Name: src
Committed By: cegger
Date: Sun Apr 26 09:12:33 UTC 2009
Modified Files:
src/sys/dev/pci: ehci_pci.c
Log Message:
- Fix error handling in attachment
- use aprint_*_dev
To generate a diff of this commit:
cvs rdiff -u -r1.42 -r1.43 src/sys/dev/pci/ehci_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/ehci_pci.c
diff -u src/sys/dev/pci/ehci_pci.c:1.42 src/sys/dev/pci/ehci_pci.c:1.43
--- src/sys/dev/pci/ehci_pci.c:1.42 Fri Apr 17 20:32:27 2009
+++ src/sys/dev/pci/ehci_pci.c Sun Apr 26 09:12:33 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: ehci_pci.c,v 1.42 2009/04/17 20:32:27 christos Exp $ */
+/* $NetBSD: ehci_pci.c,v 1.43 2009/04/26 09:12:33 cegger Exp $ */
/*
* Copyright (c) 2001, 2002 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ehci_pci.c,v 1.42 2009/04/17 20:32:27 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ehci_pci.c,v 1.43 2009/04/26 09:12:33 cegger Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -100,7 +100,6 @@
pci_intr_handle_t ih;
pcireg_t csr;
const char *vendor;
- const char *devname = device_xname(self);
char devinfo[256];
usbd_status r;
int ncomp;
@@ -118,10 +117,16 @@
/* Map I/O registers */
if (pci_mapreg_map(pa, PCI_CBMEM, PCI_MAPREG_TYPE_MEM, 0,
&sc->sc.iot, &sc->sc.ioh, NULL, &sc->sc.sc_size)) {
- aprint_error("%s: can't map memory space\n", devname);
+ sc->sc.sc_size = 0;
+ aprint_error_dev(self, "can't map memory space\n");
return;
}
+ /* Disable interrupts, so we don't get any spurious ones. */
+ sc->sc.sc_offs = EREAD1(&sc->sc, EHCI_CAPLENGTH);
+ DPRINTF(("%s: offs=%d\n", device_xname(self), sc->sc.sc_offs));
+ EOWRITE2(&sc->sc, EHCI_USBINTR, 0);
+
sc->sc_pc = pc;
sc->sc_tag = tag;
sc->sc.sc_bus.dmatag = pa->pa_dmat;
@@ -131,33 +136,32 @@
pci_conf_write(pc, tag, PCI_COMMAND_STATUS_REG,
csr | PCI_COMMAND_MASTER_ENABLE);
- /* Disable interrupts, so we don't get any spurious ones. */
- sc->sc.sc_offs = EREAD1(&sc->sc, EHCI_CAPLENGTH);
- DPRINTF(("%s: offs=%d\n", devname, sc->sc.sc_offs));
- EOWRITE2(&sc->sc, EHCI_USBINTR, 0);
-
/* Map and establish the interrupt. */
if (pci_intr_map(pa, &ih)) {
- aprint_error("%s: couldn't map interrupt\n", devname);
- return;
+ aprint_error_dev(self, "couldn't map interrupt\n");
+ goto fail;
}
+
+ /*
+ * Allocate IRQ
+ */
intrstr = pci_intr_string(pc, ih);
sc->sc_ih = pci_intr_establish(pc, ih, IPL_USB, ehci_intr, sc);
if (sc->sc_ih == NULL) {
- aprint_error("%s: couldn't establish interrupt", devname);
+ aprint_error_dev(self, "couldn't establish interrupt");
if (intrstr != NULL)
- aprint_normal(" at %s", intrstr);
- aprint_normal("\n");
+ aprint_error(" at %s", intrstr);
+ aprint_error("\n");
return;
}
- aprint_normal("%s: interrupting at %s\n", devname, intrstr);
+ aprint_normal_dev(self, "interrupting at %s\n", intrstr);
switch(pci_conf_read(pc, tag, PCI_USBREV) & PCI_USBREV_MASK) {
case PCI_USBREV_PRE_1_0:
case PCI_USBREV_1_0:
case PCI_USBREV_1_1:
sc->sc.sc_bus.usbrev = USBREV_UNKNOWN;
- aprint_verbose("%s: pre-2.0 USB rev\n", devname);
+ aprint_verbose_dev(self, "pre-2.0 USB rev\n");
return;
case PCI_USBREV_2_0:
sc->sc.sc_bus.usbrev = USBREV_2_0;
@@ -181,7 +185,7 @@
case PCI_VENDOR_ATI:
case PCI_VENDOR_VIATECH:
sc->sc.sc_flags |= EHCIF_DROPPED_INTR_WORKAROUND;
- aprint_normal("%s: dropped intr workaround enabled\n", devname);
+ aprint_normal_dev(self, "dropped intr workaround enabled\n");
break;
default:
break;
@@ -207,8 +211,8 @@
r = ehci_init(&sc->sc);
if (r != USBD_NORMAL_COMPLETION) {
- aprint_error("%s: init failed, error=%d\n", devname, r);
- return;
+ aprint_error_dev(self, "init failed, error=%d\n", r);
+ goto fail;
}
if (!pmf_device_register1(self, ehci_pci_suspend, ehci_pci_resume,
@@ -217,6 +221,19 @@
/* Attach usb device. */
sc->sc.sc_child = config_found(self, &sc->sc.sc_bus, usbctlprint);
+ return;
+
+fail:
+ if (sc->sc_ih) {
+ pci_intr_disestablish(sc->sc_pc, sc->sc_ih);
+ sc->sc_ih = NULL;
+ }
+ if (sc->sc.sc_size) {
+ ehci_release_ownership(&sc->sc, sc->sc_pc, sc->sc_tag);
+ bus_space_unmap(sc->sc.iot, sc->sc.ioh, sc->sc.sc_size);
+ sc->sc.sc_size = 0;
+ }
+ return;
}
static int