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.orgReceived on Tue Apr 05 2005 - 16:50:58 UTC
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:38:31 UTC