Commit 50bcb4ae authored by Steven Toth's avatar Steven Toth Committed by Mauro Carvalho Chehab

V4L/DVB (12933): SAA7164: Fix IRQ related system hang when firmware is not found.

Signed-off-by: default avatarSteven Toth <stoth@kernellabs.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent c303e3e1
...@@ -119,8 +119,7 @@ static irqreturn_t saa7164_irq_ts(struct saa7164_tsport *port) ...@@ -119,8 +119,7 @@ static irqreturn_t saa7164_irq_ts(struct saa7164_tsport *port)
static irqreturn_t saa7164_irq(int irq, void *dev_id) static irqreturn_t saa7164_irq(int irq, void *dev_id)
{ {
struct saa7164_dev *dev = dev_id; struct saa7164_dev *dev = dev_id;
u32 hwacc = 0, interruptid; u32 intid, intstat[INT_SIZE/4];
u32 intstat[INT_SIZE/4];
int i, handled = 0, bit; int i, handled = 0, bit;
if (dev == 0) { if (dev == 0) {
...@@ -140,15 +139,11 @@ static irqreturn_t saa7164_irq(int irq, void *dev_id) ...@@ -140,15 +139,11 @@ static irqreturn_t saa7164_irq(int irq, void *dev_id)
/* Read the 4 hardware interrupt registers */ /* Read the 4 hardware interrupt registers */
intstat[i] = saa7164_readl(dev->int_status + (i * 4)); intstat[i] = saa7164_readl(dev->int_status + (i * 4));
if (intstat[i] != 0xffffffff) if (intstat[i])
hwacc = 1; handled = 1;
} }
if (hwacc == 0) { if (handled == 0)
handled = 0;
goto out; goto out;
}
handled = 1;
/* For each of the HW interrupt registers */ /* For each of the HW interrupt registers */
for (i = 0; i < INT_SIZE/4; i++) { for (i = 0; i < INT_SIZE/4; i++) {
...@@ -165,17 +160,17 @@ static irqreturn_t saa7164_irq(int irq, void *dev_id) ...@@ -165,17 +160,17 @@ static irqreturn_t saa7164_irq(int irq, void *dev_id)
/* Calculate the interrupt id (0x00 to 0x7f) */ /* Calculate the interrupt id (0x00 to 0x7f) */
interruptid = (i * 32) + bit; intid = (i * 32) + bit;
if (interruptid == dev->intfdesc.bInterruptId) { if (intid == dev->intfdesc.bInterruptId) {
/* A response to an cmd/api call */ /* A response to an cmd/api call */
schedule_work(&dev->workcmd); schedule_work(&dev->workcmd);
} else if (interruptid == } else if (intid ==
dev->ts1.hwcfg.interruptid) { dev->ts1.hwcfg.interruptid) {
/* Transport path 1 */ /* Transport path 1 */
saa7164_irq_ts(&dev->ts1); saa7164_irq_ts(&dev->ts1);
} else if (interruptid == } else if (intid ==
dev->ts2.hwcfg.interruptid) { dev->ts2.hwcfg.interruptid) {
/* Transport path 2 */ /* Transport path 2 */
...@@ -187,7 +182,7 @@ static irqreturn_t saa7164_irq(int irq, void *dev_id) ...@@ -187,7 +182,7 @@ static irqreturn_t saa7164_irq(int irq, void *dev_id)
"%s() unhandled interrupt " "%s() unhandled interrupt "
"reg 0x%x bit 0x%x " "reg 0x%x bit 0x%x "
"intid = 0x%x\n", "intid = 0x%x\n",
__func__, i, bit, interruptid); __func__, i, bit, intid);
} }
} }
...@@ -598,8 +593,9 @@ static int __devinit saa7164_initdev(struct pci_dev *pci_dev, ...@@ -598,8 +593,9 @@ static int __devinit saa7164_initdev(struct pci_dev *pci_dev,
err = saa7164_downloadfirmware(dev); err = saa7164_downloadfirmware(dev);
if (err < 0) { if (err < 0) {
printk(KERN_ERR printk(KERN_ERR
"Failed to boot firmware, cannot continue\n"); "Failed to boot firmware, no features "
goto fail_irq; "registered\n");
goto fail_fw;
} }
saa7164_get_descriptors(dev); saa7164_get_descriptors(dev);
...@@ -666,6 +662,7 @@ static int __devinit saa7164_initdev(struct pci_dev *pci_dev, ...@@ -666,6 +662,7 @@ static int __devinit saa7164_initdev(struct pci_dev *pci_dev,
printk(KERN_ERR "%s() Unsupported board detected, " printk(KERN_ERR "%s() Unsupported board detected, "
"registering without firmware\n", __func__); "registering without firmware\n", __func__);
fail_fw:
return 0; return 0;
fail_irq: fail_irq:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment