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