]> err.no Git - linux-2.6/commitdiff
V4L/DVB (6668): Fix theoretical races between IRQ handler and .suspend/resume
authorMaxim Levitsky <maximlevitsky@gmail.com>
Sun, 4 Nov 2007 22:34:23 +0000 (19:34 -0300)
committerMauro Carvalho Chehab <mchehab@infradead.org>
Fri, 25 Jan 2008 21:02:44 +0000 (19:02 -0200)
*dev->insuspend = 1 should be set before synchronize_irq
 *ACK interrupts after synchronize_irq, to make sure there aren't
 pending interrupts.
 *Add barrier before we restart interrupts so the handler will 100%
 see the dev->insuspend

Signed-off-by: Maxim Levitsky <maximlevitsky@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
drivers/media/video/saa7134/saa7134-core.c

index 40cdec26a7f478169a17a4bc22e4a06880f0412b..85c165d173016eab4bfa58c397ae064263e5d252 100644 (file)
@@ -1181,8 +1181,13 @@ static int saa7134_suspend(struct pci_dev *pci_dev , pm_message_t state)
        saa_writel(SAA7134_IRQ2, 0);
        saa_writel(SAA7134_MAIN_CTRL, 0);
 
-       synchronize_irq(pci_dev->irq);
        dev->insuspend = 1;
+       synchronize_irq(pci_dev->irq);
+
+       /* ACK interrupts once more, just in case,
+               since the IRQ handler won't ack them anymore*/
+
+       saa_writel(SAA7134_IRQ_REPORT, saa_readl(SAA7134_IRQ_REPORT));
 
        /* Disable timeout timers - if we have active buffers, we will
           fill them on resume*/
@@ -1246,6 +1251,7 @@ static int saa7134_resume(struct pci_dev *pci_dev)
 
        /* start DMA now*/
        dev->insuspend = 0;
+       smp_wmb();
        saa7134_set_dmabits(dev);
        spin_unlock_irqrestore(&dev->slock, flags);