Mantis and Hopper: Fix CAM hangup caused by losing GPIF status
PATCH 1/1 Mantis and Hopper: Fix CAM hangup caused by losing GPIF status
Mantis and Hopper drivers: Fix CAM hangup problem, where interrupt handler clears GPIF status, even though GPIF interrupt isn't active.
Manuel reported that this patch fixes his problem:
http://www.spinics.net/lists/linux-media/msg41473.html
(CAM hangs up about once per 20 minutes, each hangup takes about 3-5s.)
Signed-off-by Marko Ristola <[email protected]>
drivers/media/dvb/mantis/hopper_cards.c +10 -9
@@ -84,15 +84,6 @@ static irqreturn_t hopper_irq_handler(int irq, void *dev_id)if (!(stat & mask))return IRQ_NONE ; - rst_mask =MANTIS_GPIF_WRACK | -MANTIS_GPIF_OTHERR | -MANTIS_SBUF_WSTO | -MANTIS_GPIF_EXTIRQ ; - - rst_stat =mmread (MANTIS_GPIF_STATUS ); - rst_stat &= rst_mask; -mmwrite (rst_stat,MANTIS_GPIF_STATUS ); - mantis->mantis_int_stat = stat; mantis->mantis_int_mask = mask;dprintk (MANTIS_DEBUG ,0 ,"\n-- Stat=<%02x> Mask=<%02x> --" , stat, mask);
@@ -101,6 +92,16 @@ static irqreturn_t hopper_irq_handler(int irq, void *dev_id) }if (stat &MANTIS_INT_IRQ0 ) {dprintk (MANTIS_DEBUG ,0 ,"<%s>" , label[1 ]); + + rst_mask =MANTIS_GPIF_WRACK | +MANTIS_GPIF_OTHERR | +MANTIS_SBUF_WSTO | +MANTIS_GPIF_EXTIRQ ; + + rst_stat =mmread (MANTIS_GPIF_STATUS ); + rst_stat &= rst_mask; +mmwrite (rst_stat,MANTIS_GPIF_STATUS ); + mantis->gpif_status = rst_stat;wake_up (&ca->hif_write_wq);schedule_work (&ca->hif_evm_work);
drivers/media/dvb/mantis/mantis_cards.c +9 -9
@@ -92,15 +92,6 @@ static irqreturn_t mantis_irq_handler(int irq, void *dev_id)if (!(stat & mask))return IRQ_NONE ; - rst_mask =MANTIS_GPIF_WRACK | -MANTIS_GPIF_OTHERR | -MANTIS_SBUF_WSTO | -MANTIS_GPIF_EXTIRQ ; - - rst_stat =mmread (MANTIS_GPIF_STATUS ); - rst_stat &= rst_mask; -mmwrite (rst_stat,MANTIS_GPIF_STATUS ); - mantis->mantis_int_stat = stat; mantis->mantis_int_mask = mask;dprintk (MANTIS_DEBUG ,0 ,"\n-- Stat=<%02x> Mask=<%02x> --" , stat, mask);
@@ -109,6 +100,15 @@ static irqreturn_t mantis_irq_handler(int irq, void *dev_id) }if (stat &MANTIS_INT_IRQ0 ) {dprintk (MANTIS_DEBUG ,0 ,"<%s>" , label[1 ]); + rst_mask =MANTIS_GPIF_WRACK | +MANTIS_GPIF_OTHERR | +MANTIS_SBUF_WSTO | +MANTIS_GPIF_EXTIRQ ; + + rst_stat =mmread (MANTIS_GPIF_STATUS ); + rst_stat &= rst_mask; +mmwrite (rst_stat,MANTIS_GPIF_STATUS ); + mantis->gpif_status = rst_stat;wake_up (&ca->hif_write_wq);schedule_work (&ca->hif_evm_work);