aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrans Pop <elendil@planet.nl>2008-12-06 09:36:47 -0500
committerStefan Richter <stefanr@s5r6.in-berlin.de>2009-01-04 17:50:33 -0500
commitd1069aea6840c24f6e0617a758334312b60d3fc6 (patch)
tree674fdbace682472255dca24f9b713c41fa1c61fa
parentb17a55096071898454d7b5b6fb30cca7faedf9f1 (diff)
ieee1394: ohci1394: don't leave interrupts enabled during suspend/resume
On my HP 2510p I get the following in dmesg during near the end of most resumes from suspend to RAM: irq 19: nobody cared (try booting with the "irqpoll" option) Pid: 0, comm: swapper Not tainted 2.6.28-rc7 #67 Call Trace: <IRQ> [<ffffffffa00ee9e1>] ? ohci_irq_handler+0x60/0x7e9 [ohci1394] [<ffffffff8026aa4d>] __report_bad_irq+0x38/0x87 [<ffffffff8026abaa>] note_interrupt+0x10e/0x174 [<ffffffff8026b262>] handle_fasteoi_irq+0xa7/0xd1 [<ffffffff8020eb87>] do_IRQ+0x73/0xe4 [<ffffffff8020c626>] ret_from_intr+0x0/0xa <EOI> [<ffffffffa0012606>] ? acpi_idle_enter_bm+0x26b/0x2b2 [processor] [<ffffffffa00125fc>] ? acpi_idle_enter_bm+0x261/0x2b2 [processor] [<ffffffff8024f30f>] ? notifier_call_chain+0x33/0x5b [<ffffffff803b9c64>] ? cpuidle_idle_call+0x8c/0xc4 [<ffffffff8020b312>] ? cpu_idle+0x4a/0x9a [<ffffffff8042c5c8>] ? rest_init+0x5c/0x5e handlers: [<ffffffffa00ee981>] (ohci_irq_handler+0x0/0x7e9 [ohci1394]) Disabling IRQ #19 There also seems to be an interrupt storm during suspend/resume when this happens: 19: 99968 33 IO-APIC-fasteoi ohci1394 This patch gets rid of both issues and makes the resume as a whole significantly faster. Signed-off-by: Frans Pop <elendil@planet.nl> As was pointed out in http://lkml.org/lkml/2008/12/6/127, this does not fix the cause of the interrupt storm. However, since the source of the interrupts could not be determined yet, we make the system at least more usable with this change. Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
-rw-r--r--drivers/ieee1394/ohci1394.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/ieee1394/ohci1394.c b/drivers/ieee1394/ohci1394.c
index e509e13cb7a..066726bcb0e 100644
--- a/drivers/ieee1394/ohci1394.c
+++ b/drivers/ieee1394/ohci1394.c
@@ -3381,6 +3381,7 @@ static int ohci1394_pci_suspend(struct pci_dev *dev, pm_message_t state)
3381 ohci_devctl(ohci->host, RESET_BUS, LONG_RESET_NO_FORCE_ROOT); 3381 ohci_devctl(ohci->host, RESET_BUS, LONG_RESET_NO_FORCE_ROOT);
3382 ohci_soft_reset(ohci); 3382 ohci_soft_reset(ohci);
3383 3383
3384 free_irq(dev->irq, ohci);
3384 err = pci_save_state(dev); 3385 err = pci_save_state(dev);
3385 if (err) { 3386 if (err) {
3386 PRINT(KERN_ERR, "pci_save_state failed with %d", err); 3387 PRINT(KERN_ERR, "pci_save_state failed with %d", err);
@@ -3421,6 +3422,13 @@ static int ohci1394_pci_resume(struct pci_dev *dev)
3421 reg_write(ohci, OHCI1394_IntEventClear, 0xffffffff); 3422 reg_write(ohci, OHCI1394_IntEventClear, 0xffffffff);
3422 reg_write(ohci, OHCI1394_IntMaskClear, 0xffffffff); 3423 reg_write(ohci, OHCI1394_IntMaskClear, 0xffffffff);
3423 mdelay(50); 3424 mdelay(50);
3425
3426 if (request_irq(dev->irq, ohci_irq_handler, IRQF_SHARED,
3427 OHCI1394_DRIVER_NAME, ohci)) {
3428 PRINT_G(KERN_ERR, "Failed to allocate interrupt %d", dev->irq);
3429 return -EIO;
3430 }
3431
3424 ohci_initialize(ohci); 3432 ohci_initialize(ohci);
3425 3433
3426 hpsb_resume_host(ohci->host); 3434 hpsb_resume_host(ohci->host);