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