Skip to content

Commit

Permalink
[media] solo6x10: fix a race in IRQ handler
Browse files Browse the repository at this point in the history
The IRQs have to be acknowledged before they are serviced, otherwise some events
may be skipped. Also, acknowledging IRQs just before returning from the handler
doesn't leave enough time for the device to deassert the INTx line, and for
bridges to propagate this change. This resulted in twice the IRQ rate on ARMv6
dual core CPU.

Signed-off-by: Krzysztof Ha?asa <khalasa@piap.pl>
Acked-by: Andrey Utkin <andrey.utkin@corp.bluecherry.net>
Tested-by: Andrey Utkin <andrey.utkin@corp.bluecherry.net>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
  • Loading branch information
Krzysztof Hałasa authored and Mauro Carvalho Chehab committed Nov 21, 2014
1 parent b31eb90 commit 3c787b1
Showing 1 changed file with 2 additions and 8 deletions.
10 changes: 2 additions & 8 deletions drivers/media/pci/solo6x10/solo6x10-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -105,11 +105,8 @@ static irqreturn_t solo_isr(int irq, void *data)
if (!status)
return IRQ_NONE;

if (status & ~solo_dev->irq_mask) {
solo_reg_write(solo_dev, SOLO_IRQ_STAT,
status & ~solo_dev->irq_mask);
status &= solo_dev->irq_mask;
}
/* Acknowledge all interrupts immediately */
solo_reg_write(solo_dev, SOLO_IRQ_STAT, status);

if (status & SOLO_IRQ_PCI_ERR)
solo_p2m_error_isr(solo_dev);
Expand All @@ -132,9 +129,6 @@ static irqreturn_t solo_isr(int irq, void *data)
if (status & SOLO_IRQ_G723)
solo_g723_isr(solo_dev);

/* Clear all interrupts handled */
solo_reg_write(solo_dev, SOLO_IRQ_STAT, status);

return IRQ_HANDLED;
}

Expand Down

0 comments on commit 3c787b1

Please sign in to comment.