Skip to content

Commit

Permalink
staging: mei: enable msi when supported
Browse files Browse the repository at this point in the history
enable msi when supported
also in that case we can drop the quick handler
from the threaded interrupt that protected us from
handling USB interrupts

Signed-off-by: Maarten Lankhorst <m.b.lankhorst@gmail.com>
Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
  • Loading branch information
Tomas Winkler authored and Greg Kroah-Hartman committed Aug 23, 2011
1 parent b4f6209 commit 4f61a7a
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 5 deletions.
6 changes: 6 additions & 0 deletions drivers/staging/mei/interrupt.c
Original file line number Diff line number Diff line change
Expand Up @@ -1540,6 +1540,12 @@ irqreturn_t mei_interrupt_thread_handler(int irq, void *dev_id)
mutex_lock(&dev->device_lock);
mei_io_list_init(&complete_list);
dev->host_hw_state = mei_hcsr_read(dev);

/* Ack the interrupt here
* In case of MSI we don't go throuhg the quick handler */
if (pci_dev_msi_enabled(dev->pdev))
mei_reg_write(dev, H_CSR, dev->host_hw_state);

dev->me_hw_state = mei_mecsr_read(dev);

/* check if ME wants a reset */
Expand Down
30 changes: 25 additions & 5 deletions drivers/staging/mei/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -151,11 +151,20 @@ static int __devinit mei_probe(struct pci_dev *pdev,
err = -ENOMEM;
goto free_device;
}
/* request and enable interrupt */
err = request_threaded_irq(pdev->irq,
pci_enable_msi(pdev);

/* request and enable interrupt */
if (pci_dev_msi_enabled(pdev))
err = request_threaded_irq(pdev->irq,
NULL,
mei_interrupt_thread_handler,
0, mei_driver_name, dev);
else
err = request_threaded_irq(pdev->irq,
mei_interrupt_quick_handler,
mei_interrupt_thread_handler,
IRQF_SHARED, mei_driver_name, dev);

if (err) {
printk(KERN_ERR "mei: request_threaded_irq failure. irq = %d\n",
pdev->irq);
Expand Down Expand Up @@ -183,6 +192,7 @@ static int __devinit mei_probe(struct pci_dev *pdev,
mei_disable_interrupts(dev);
flush_scheduled_work();
free_irq(pdev->irq, dev);
pci_disable_msi(pdev);
unmap_memory:
pci_iounmap(pdev, dev->mem_addr);
free_device:
Expand Down Expand Up @@ -247,6 +257,7 @@ static void __devexit mei_remove(struct pci_dev *pdev)
mei_disable_interrupts(dev);

free_irq(pdev->irq, dev);
pci_disable_msi(pdev);
pci_set_drvdata(pdev, NULL);

if (dev->mem_addr)
Expand Down Expand Up @@ -1096,7 +1107,7 @@ static int mei_pci_suspend(struct device *device)
mutex_unlock(&dev->device_lock);

free_irq(pdev->irq, dev);

pci_disable_msi(pdev);

return err;
}
Expand All @@ -1111,11 +1122,20 @@ static int mei_pci_resume(struct device *device)
if (!dev)
return -ENODEV;

/* request and enable interrupt */
err = request_threaded_irq(pdev->irq,
pci_enable_msi(pdev);

/* request and enable interrupt */
if (pci_dev_msi_enabled(pdev))
err = request_threaded_irq(pdev->irq,
NULL,
mei_interrupt_thread_handler,
0, mei_driver_name, dev);
else
err = request_threaded_irq(pdev->irq,
mei_interrupt_quick_handler,
mei_interrupt_thread_handler,
IRQF_SHARED, mei_driver_name, dev);

if (err) {
printk(KERN_ERR "mei: Request_irq failure. irq = %d\n",
pdev->irq);
Expand Down

0 comments on commit 4f61a7a

Please sign in to comment.