Interrupt storm
John Baldwin
jhb at FreeBSD.org
Tue Apr 5 11:50:58 PDT 2005
On Tuesday 05 April 2005 02:41 pm, Antoine Brodin wrote:
> John Baldwin <jhb at 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 at FreeBSD.org> <>< http://www.FreeBSD.org/~jhb/
"Power Users Use the Power to Serve" = http://www.FreeBSD.org
More information about the freebsd-current
mailing list