Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4f61a7ad authored by Tomas Winkler's avatar Tomas Winkler Committed by Greg Kroah-Hartman
Browse files

staging: mei: enable msi when supported



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: default avatarMaarten Lankhorst <m.b.lankhorst@gmail.com>
Signed-off-by: default avatarTomas Winkler <tomas.winkler@intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent b4f6209d
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -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 */
+25 −5
Original line number Diff line number Diff line
@@ -151,11 +151,20 @@ static int __devinit mei_probe(struct pci_dev *pdev,
		err = -ENOMEM;
		goto free_device;
	}
	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);
@@ -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:
@@ -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)
@@ -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;
}
@@ -1111,11 +1122,20 @@ static int mei_pci_resume(struct device *device)
	if (!dev)
		return -ENODEV;

	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);