diff options
author | Maxim Levitsky <maximlevitsky@gmail.com> | 2007-11-04 17:34:23 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@infradead.org> | 2008-01-25 16:02:44 -0500 |
commit | 3203cb86d22c63504f8368151029bf9dad014ddb (patch) | |
tree | c8bc84fcfb3f0b3b5d001f40b2d4a046e87de2e3 /drivers/media/video/saa7134 | |
parent | 0d65cd4f2bfe70872e4218d9d35d37a7000d6739 (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.c | 8 |
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 | ||