Module Name: src Committed By: cegger Date: Fri Apr 17 12:59:19 UTC 2009
Modified Files: src/sys/dev/pci: if_tlp_pci.c Log Message: Detach tlp(4) during shutdown. Free unused resources on attachment. To generate a diff of this commit: cvs rdiff -u -r1.107 -r1.108 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.107 src/sys/dev/pci/if_tlp_pci.c:1.108 --- src/sys/dev/pci/if_tlp_pci.c:1.107 Fri Apr 17 10:20:32 2009 +++ src/sys/dev/pci/if_tlp_pci.c Fri Apr 17 12:59:19 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: if_tlp_pci.c,v 1.107 2009/04/17 10:20:32 cegger Exp $ */ +/* $NetBSD: if_tlp_pci.c,v 1.108 2009/04/17 12:59:19 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.107 2009/04/17 10:20:32 cegger Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_tlp_pci.c,v 1.108 2009/04/17 12:59:19 cegger Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -86,6 +86,7 @@ /* PCI-specific goo. */ void *sc_ih; /* interrupt handle */ + bus_size_t sc_mapsize; pci_chipset_tag_t sc_pc; /* our PCI chipset */ pcitag_t sc_pcitag; /* our PCI tag */ @@ -107,9 +108,11 @@ static int tlp_pci_match(device_t, struct cfdata *, void *); static void tlp_pci_attach(device_t, device_t, void *); +static int tlp_pci_detach(device_t, int); -CFATTACH_DECL_NEW(tlp_pci, sizeof(struct tulip_pci_softc), - tlp_pci_match, tlp_pci_attach, NULL, NULL); +CFATTACH_DECL3_NEW(tlp_pci, sizeof(struct tulip_pci_softc), + tlp_pci_match, tlp_pci_attach, tlp_pci_detach, NULL, NULL, NULL, + DVF_DETACH_SHUTDOWN); static const struct tulip_pci_product { uint32_t tpp_vendor; /* PCI vendor ID */ @@ -357,6 +360,7 @@ uint32_t val = 0; pcireg_t reg; int error; + bus_size_t iosize = 0, memsize = 0; sc->sc_dev = self; sc->sc_devno = pa->pa_device; @@ -532,18 +536,28 @@ ioh_valid = (pci_mapreg_map(pa, TULIP_PCI_IOBA, PCI_MAPREG_TYPE_IO, 0, - &iot, &ioh, NULL, NULL) == 0); + &iot, &ioh, NULL, &iosize) == 0); memh_valid = (pci_mapreg_map(pa, TULIP_PCI_MMBA, PCI_MAPREG_TYPE_MEM|PCI_MAPREG_MEM_TYPE_32BIT, 0, - &memt, &memh, NULL, NULL) == 0); + &memt, &memh, NULL, &memsize) == 0); if (memh_valid) { sc->sc_st = memt; sc->sc_sh = memh; + psc->sc_mapsize = memsize; + if (ioh_valid) + bus_space_unmap(iot, ioh, iosize); } 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); } 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; } @@ -1022,6 +1036,30 @@ } static int +tlp_pci_detach(device_t self, int flags) +{ + struct tulip_pci_softc *psc = device_private(self); + struct tulip_softc *sc = &psc->sc_tulip; + int rv; + + rv = tlp_detach(sc); + if (rv) + return rv; + + if (psc->sc_ih != NULL) { + pci_intr_disestablish(psc->sc_pc, psc->sc_ih); + psc->sc_ih = NULL; + } + + if (psc->sc_mapsize) { + bus_space_unmap(sc->sc_st, sc->sc_sh, psc->sc_mapsize); + psc->sc_mapsize = 0; + } + + return 0; +} + +static int tlp_pci_shared_intr(void *arg) { struct tulip_pci_softc *master = arg, *slave;