Module Name: src Committed By: kiyohara Date: Sat Apr 24 11:26:15 UTC 2010
Modified Files: src/sys/dev/pci: fwohci_pci.c Log Message: Support detach by drvctl(8). To generate a diff of this commit: cvs rdiff -u -r1.37 -r1.38 src/sys/dev/pci/fwohci_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/fwohci_pci.c diff -u src/sys/dev/pci/fwohci_pci.c:1.37 src/sys/dev/pci/fwohci_pci.c:1.38 --- src/sys/dev/pci/fwohci_pci.c:1.37 Mon Mar 29 03:05:27 2010 +++ src/sys/dev/pci/fwohci_pci.c Sat Apr 24 11:26:15 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: fwohci_pci.c,v 1.37 2010/03/29 03:05:27 kiyohara Exp $ */ +/* $NetBSD: fwohci_pci.c,v 1.38 2010/04/24 11:26:15 kiyohara Exp $ */ /*- * Copyright (c) 2000 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: fwohci_pci.c,v 1.37 2010/03/29 03:05:27 kiyohara Exp $"); +__KERNEL_RCSID(0, "$NetBSD: fwohci_pci.c,v 1.38 2010/04/24 11:26:15 kiyohara Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -60,12 +60,13 @@ static int fwohci_pci_match(device_t, cfdata_t, void *); static void fwohci_pci_attach(device_t, device_t, void *); +static int fwohci_pci_detach(device_t, int); static bool fwohci_pci_suspend(device_t, const pmf_qual_t *); static bool fwohci_pci_resume(device_t, const pmf_qual_t *); CFATTACH_DECL_NEW(fwohci_pci, sizeof(struct fwohci_pci_softc), - fwohci_pci_match, fwohci_pci_attach, NULL, NULL); + fwohci_pci_match, fwohci_pci_attach, fwohci_pci_detach, NULL); static int fwohci_pci_match(device_t parent, cfdata_t match, @@ -163,6 +164,29 @@ return; } +static int +fwohci_pci_detach(device_t self, int flags) +{ + struct fwohci_pci_softc *psc = device_private(self); + int rv; + + pmf_device_deregister(self); + rv = fwohci_detach(&psc->psc_sc, flags); + if (rv) + return rv; + + if (psc->psc_ih != NULL) { + pci_intr_disestablish(psc->psc_pc, psc->psc_ih); + psc->psc_ih = NULL; + } + if (psc->psc_sc.bssize) { + bus_space_unmap(psc->psc_sc.bst, psc->psc_sc.bsh, + psc->psc_sc.bssize); + psc->psc_sc.bssize = 0; + } + return 0; +} + static bool fwohci_pci_suspend(device_t dv, const pmf_qual_t *qual) {