Module Name: src Committed By: msaitoh Date: Wed Apr 26 08:00:03 UTC 2017
Modified Files: src/sys/dev/pci: ppb.c Log Message: Disable ppb(4)'s interrupt for a while. It causes hangup on some environment. Define PPB_USEINTR if you'd like to use interrupt. To generate a diff of this commit: cvs rdiff -u -r1.59 -r1.60 src/sys/dev/pci/ppb.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/ppb.c diff -u src/sys/dev/pci/ppb.c:1.59 src/sys/dev/pci/ppb.c:1.60 --- src/sys/dev/pci/ppb.c:1.59 Wed Apr 26 03:54:37 2017 +++ src/sys/dev/pci/ppb.c Wed Apr 26 08:00:03 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: ppb.c,v 1.59 2017/04/26 03:54:37 msaitoh Exp $ */ +/* $NetBSD: ppb.c,v 1.60 2017/04/26 08:00:03 msaitoh Exp $ */ /* * Copyright (c) 1996, 1998 Christopher G. Demetriou. All rights reserved. @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ppb.c,v 1.59 2017/04/26 03:54:37 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ppb.c,v 1.60 2017/04/26 08:00:03 msaitoh Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -60,7 +60,9 @@ static int ppbmatch(device_t, cfdata_t, static void ppbattach(device_t, device_t, void *); static int ppbdetach(device_t, int); static void ppbchilddet(device_t, device_t); +#ifdef PPB_USEINTR static int ppb_intr(void *); +#endif static bool ppb_resume(device_t, const pmf_qual_t *); static bool ppb_suspend(device_t, const pmf_qual_t *); @@ -203,8 +205,10 @@ ppbattach(device_t parent, device_t self struct pci_attach_args *pa = aux; pci_chipset_tag_t pc = pa->pa_pc; struct pcibus_attach_args pba; +#ifdef PPB_USEINTR char const *intrstr; char intrbuf[PCI_INTRSTR_LEN]; +#endif pcireg_t busdata, reg; pci_aprint_devinfo(pa, NULL); @@ -237,6 +241,7 @@ ppbattach(device_t parent, device_t self /* Check for PCI Express capabilities and setup hotplug support. */ if (pci_get_capability(pc, pa->pa_tag, PCI_CAP_PCIEXPRESS, &sc->sc_pciecapoff, ®) && (reg & PCIE_XCAP_SI)) { +#ifdef PPB_USEINTR #if 0 /* * XXX Initialize workqueue or something else for @@ -304,6 +309,17 @@ ppbattach(device_t parent, device_t self pci_conf_write(pc, pa->pa_tag, sc->sc_pciecapoff + PCIE_SLCSR, slcsr); } +#else + reg = pci_conf_read(sc->sc_pc, sc->sc_tag, + sc->sc_pciecapoff + PCIE_SLCSR); + if (reg & PCIE_SLCSR_NOTIFY_MASK) { + aprint_debug_dev(self, + "disabling notification events\n"); + reg &= ~PCIE_SLCSR_NOTIFY_MASK; + pci_conf_write(sc->sc_pc, sc->sc_tag, + sc->sc_pciecapoff + PCIE_SLCSR, reg); + } +#endif /* PPB_USEINTR */ } if (!pmf_device_register(self, ppb_suspend, ppb_resume)) @@ -327,6 +343,7 @@ ppbattach(device_t parent, device_t self pba.pba_intrswiz = pa->pa_intrswiz; pba.pba_intrtag = pa->pa_intrtag; +#ifdef PPB_USEINTR /* Attach event counters */ evcnt_attach_dynamic(&sc->sc_ev_intr, EVCNT_TYPE_INTR, NULL, device_xname(sc->sc_dev), "Interrupt"); @@ -342,6 +359,7 @@ ppbattach(device_t parent, device_t self device_xname(sc->sc_dev), "Command Completed"); evcnt_attach_dynamic(&sc->sc_ev_lacs, EVCNT_TYPE_MISC, NULL, device_xname(sc->sc_dev), "Data Link Layer State Changed"); +#endif config_found_ia(self, "pcibus", &pba, pcibusprint); } @@ -349,13 +367,16 @@ ppbattach(device_t parent, device_t self static int ppbdetach(device_t self, int flags) { +#ifdef PPB_USEINTR struct ppb_softc *sc = device_private(self); pcireg_t slcsr; +#endif int rc; if ((rc = config_detach_children(self, flags)) != 0) return rc; +#ifdef PPB_USEINTR /* Detach event counters */ evcnt_detach(&sc->sc_ev_intr); evcnt_detach(&sc->sc_ev_abp); @@ -377,6 +398,7 @@ ppbdetach(device_t self, int flags) pci_intr_disestablish(sc->sc_pc, sc->sc_intrhand); pci_intr_release(sc->sc_pc, sc->sc_pihp, 1); } +#endif pmf_device_deregister(self); return 0; @@ -418,6 +440,7 @@ ppbchilddet(device_t self, device_t chil /* we keep no references to child devices, so do nothing */ } +#ifdef PPB_USEINTR static int ppb_intr(void *arg) { @@ -482,3 +505,4 @@ ppb_intr(void *arg) return 0; } +#endif /* PPB_USEINTR */