| From 1f42db786b14a31bf807fc41ee5583a00c08fcb1 Mon Sep 17 00:00:00 2001 |
| From: Bjorn Helgaas <bhelgaas@google.com> |
| Date: Fri, 14 Feb 2014 13:48:16 -0700 |
| Subject: PCI: Enable INTx if BIOS left them disabled |
| |
| From: Bjorn Helgaas <bhelgaas@google.com> |
| |
| commit 1f42db786b14a31bf807fc41ee5583a00c08fcb1 upstream. |
| |
| Some firmware leaves the Interrupt Disable bit set even if the device uses |
| INTx interrupts. Clear Interrupt Disable so we get those interrupts. |
| |
| Based on the report mentioned below, if the user selects the "EHCI only" |
| option in the Intel Baytrail BIOS, the EHCI device is handed off to the OS |
| with the PCI_COMMAND_INTX_DISABLE bit set. |
| |
| Link: http://lkml.kernel.org/r/20140114181721.GC12126@xanatos |
| Link: https://bugzilla.kernel.org/show_bug.cgi?id=70601 |
| Reported-by: Chris Cheng <chris.cheng@atrustcorp.com> |
| Reported-and-tested-by: Jamie Chen <jamie.chen@intel.com> |
| Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> |
| CC: Sarah Sharp <sarah.a.sharp@linux.intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/pci/pci.c | 10 ++++++++++ |
| 1 file changed, 10 insertions(+) |
| |
| --- a/drivers/pci/pci.c |
| +++ b/drivers/pci/pci.c |
| @@ -1120,6 +1120,8 @@ EXPORT_SYMBOL_GPL(pci_load_and_free_save |
| static int do_pci_enable_device(struct pci_dev *dev, int bars) |
| { |
| int err; |
| + u16 cmd; |
| + u8 pin; |
| |
| err = pci_set_power_state(dev, PCI_D0); |
| if (err < 0 && err != -EIO) |
| @@ -1129,6 +1131,14 @@ static int do_pci_enable_device(struct p |
| return err; |
| pci_fixup_device(pci_fixup_enable, dev); |
| |
| + pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin); |
| + if (pin) { |
| + pci_read_config_word(dev, PCI_COMMAND, &cmd); |
| + if (cmd & PCI_COMMAND_INTX_DISABLE) |
| + pci_write_config_word(dev, PCI_COMMAND, |
| + cmd & ~PCI_COMMAND_INTX_DISABLE); |
| + } |
| + |
| return 0; |
| } |
| |