aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/saa7134
diff options
context:
space:
mode:
authorMaxim Levitsky <maximlevitsky@gmail.com>2007-11-04 17:34:23 -0500
committerMauro Carvalho Chehab <mchehab@infradead.org>2008-01-25 16:02:44 -0500
commit3203cb86d22c63504f8368151029bf9dad014ddb (patch)
treec8bc84fcfb3f0b3b5d001f40b2d4a046e87de2e3 /drivers/media/video/saa7134
parent0d65cd4f2bfe70872e4218d9d35d37a7000d6739 (diff)
V4L/DVB (6668): Fix theoretical races between IRQ handler and .suspend/resume
*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>
Diffstat (limited to 'drivers/media/video/saa7134')
-rw-r--r--drivers/media/video/saa7134/saa7134-core.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/media/video/saa7134/saa7134-core.c b/drivers/media/video/saa7134/saa7134-core.c
index 40cdec26a7f4..85c165d17301 100644
--- a/drivers/media/video/saa7134/saa7134-core.c
+++ b/drivers/media/video/saa7134/saa7134-core.c
@@ -1181,8 +1181,13 @@ static int saa7134_suspend(struct pci_dev *pci_dev , pm_message_t state)
1181 saa_writel(SAA7134_IRQ2, 0); 1181 saa_writel(SAA7134_IRQ2, 0);
1182 saa_writel(SAA7134_MAIN_CTRL, 0); 1182 saa_writel(SAA7134_MAIN_CTRL, 0);
1183 1183
1184 synchronize_irq(pci_dev->irq);
1185 dev->insuspend = 1; 1184 dev->insuspend = 1;
1185 synchronize_irq(pci_dev->irq);
1186
1187 /* ACK interrupts once more, just in case,
1188 since the IRQ handler won't ack them anymore*/
1189
1190 saa_writel(SAA7134_IRQ_REPORT, saa_readl(SAA7134_IRQ_REPORT));
1186 1191
1187 /* Disable timeout timers - if we have active buffers, we will 1192 /* Disable timeout timers - if we have active buffers, we will
1188 fill them on resume*/ 1193 fill them on resume*/
@@ -1246,6 +1251,7 @@ static int saa7134_resume(struct pci_dev *pci_dev)
1246 1251
1247 /* start DMA now*/ 1252 /* start DMA now*/
1248 dev->insuspend = 0; 1253 dev->insuspend = 0;
1254 smp_wmb();
1249 saa7134_set_dmabits(dev); 1255 saa7134_set_dmabits(dev);
1250 spin_unlock_irqrestore(&dev->slock, flags); 1256 spin_unlock_irqrestore(&dev->slock, flags);
1251 1257