Date: Tue, 5 Apr 2005 14:49:30 -0400 From: John Baldwin <jhb@FreeBSD.org> To: freebsd-current@FreeBSD.org Cc: Antoine Brodin <antoine.brodin@laposte.net> Subject: Re: Interrupt storm Message-ID: <200504051449.30871.jhb@FreeBSD.org> In-Reply-To: <20050405204106.15e9d993.antoine.brodin@laposte.net> References: <b37cb09705032911295ce15f84@mail.gmail.com> <200504051349.13620.jhb@FreeBSD.org> <20050405204106.15e9d993.antoine.brodin@laposte.net>
next in thread | previous in thread | raw e-mail | index | archive | help
On Tuesday 05 April 2005 02:41 pm, Antoine Brodin wrote: > John Baldwin <jhb@FreeBSD.org> wrote: > > Ok, I see the issue now. The problem is that the BIOS sets the IRQ > > registers in the PCI devices to values that don't match how the links are > > programmed and we tend to trust the BIOS over the links in those cases. > > Can you tell me what IRQ sk0 gets if you don't use ACPI? Does it get 5 > > or 9? If it gets 9, does it work ok? > > > > You can try this patch for ACPI. Unfortunately, some BIOSes lie when you > > ask a link which IRQ it is routed to, so I'm not sure if this patch can > > be committed as is. Nate, do you know if such BIOSen only return no IRQ > > at all (0 or 255) when they lie rather than a bogus "valid" IRQ? > > Without ACPI, sk0 gets irq 5 and it works ok. > > With your patch and ACPI, sk0 no longer timeouts, and it's usable. > But I still have interrupt storms. > dmesg: http://bsd.miki.eu.org/~antoine/current+acpi+patch.dmesg Well, all the interrupts are now routed the same as with the old ACPI code. Perhaps, can you try commenting out the code that calls _DIS in acpi_pci_link_attach()? Specifically, here: /* * Try to disable this link. If successful, set the current IRQ to * zero and flags to indicate this link is not routed. If we can't * run _DIS (i.e., the method doesn't exist), assume the initial * IRQ was routed by the BIOS. */ if (ACPI_SUCCESS(AcpiEvaluateObject(acpi_get_handle(dev), "_DIS", NULL, NULL))) for (i = 0; i < sc->pl_num_links; i++) sc->pl_links[i].l_irq = PCI_INVALID_IRQ; else for (i = 0; i < sc->pl_num_links; i++) if (PCI_INTERRUPT_VALID(sc->pl_links[i].l_irq)) sc->pl_links[i].l_routed = TRUE; Add #if 0 / #endif so you have this: #if 0 /* * Try to disable this link. If successful, set the current IRQ to * zero and flags to indicate this link is not routed. If we can't * run _DIS (i.e., the method doesn't exist), assume the initial * IRQ was routed by the BIOS. */ if (ACPI_SUCCESS(AcpiEvaluateObject(acpi_get_handle(dev), "_DIS", NULL, NULL))) for (i = 0; i < sc->pl_num_links; i++) sc->pl_links[i].l_irq = PCI_INVALID_IRQ; else #endif for (i = 0; i < sc->pl_num_links; i++) if (PCI_INTERRUPT_VALID(sc->pl_links[i].l_irq)) sc->pl_links[i].l_routed = TRUE; And let me know if that makes a difference. -- John Baldwin <jhb@FreeBSD.org> <>< http://www.FreeBSD.org/~jhb/ "Power Users Use the Power to Serve" = http://www.FreeBSD.org
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200504051449.30871.jhb>