summaryrefslogtreecommitdiff
path: root/linux/drivers/media/video/ivtv
diff options
context:
space:
mode:
authorHans Verkuil <hverkuil@xs4all.nl>2007-08-18 20:48:42 +0200
committerHans Verkuil <hverkuil@xs4all.nl>2007-08-18 20:48:42 +0200
commit1e0fb811716f6d1e429f43701e30d4ca10e142db (patch)
tree6526394c75f42065b444a4d944ea02424459d428 /linux/drivers/media/video/ivtv
parentcfc5c4e6bc9c0c61bb5696b0198117b9d34ddc3f (diff)
downloadmediapointer-dvb-s2-1e0fb811716f6d1e429f43701e30d4ca10e142db.tar.gz
mediapointer-dvb-s2-1e0fb811716f6d1e429f43701e30d4ca10e142db.tar.bz2
ivtv: retry/timer improvements
From: Hans Verkuil <hverkuil@xs4all.nl> - Give up frame after three retries. - When the last capture/decode ends, make sure to delete the dma_timer. Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Diffstat (limited to 'linux/drivers/media/video/ivtv')
-rw-r--r--linux/drivers/media/video/ivtv/ivtv-irq.c4
-rw-r--r--linux/drivers/media/video/ivtv/ivtv-streams.c2
2 files changed, 6 insertions, 0 deletions
diff --git a/linux/drivers/media/video/ivtv/ivtv-irq.c b/linux/drivers/media/video/ivtv/ivtv-irq.c
index f6f9e490b..365176612 100644
--- a/linux/drivers/media/video/ivtv/ivtv-irq.c
+++ b/linux/drivers/media/video/ivtv/ivtv-irq.c
@@ -500,7 +500,9 @@ static void ivtv_irq_dma_read(struct ivtv *itv)
s->sg_processed, s->sg_processing_size, itv->dma_retries);
write_reg(read_reg(IVTV_REG_DMASTATUS) & 3, IVTV_REG_DMASTATUS);
if (itv->dma_retries == 3) {
+ /* Too many retries, give up on this frame */
itv->dma_retries = 0;
+ s->sg_processed = s->sg_processing_size;
}
else {
/* Retry, starting with the first xfer segment.
@@ -560,7 +562,9 @@ static void ivtv_irq_enc_dma_complete(struct ivtv *itv)
s->dma_offset, s->sg_processed, s->sg_processing_size, itv->dma_retries);
write_reg(read_reg(IVTV_REG_DMASTATUS) & 3, IVTV_REG_DMASTATUS);
if (itv->dma_retries == 3) {
+ /* Too many retries, give up on this frame */
itv->dma_retries = 0;
+ s->sg_processed = s->sg_processing_size;
}
else {
/* Retry, starting with the first xfer segment.
diff --git a/linux/drivers/media/video/ivtv/ivtv-streams.c b/linux/drivers/media/video/ivtv/ivtv-streams.c
index 4272fbc0b..2e632014c 100644
--- a/linux/drivers/media/video/ivtv/ivtv-streams.c
+++ b/linux/drivers/media/video/ivtv/ivtv-streams.c
@@ -816,6 +816,7 @@ int ivtv_stop_v4l2_encode_stream(struct ivtv_stream *s, int gop_end)
/* Set the following Interrupt mask bits for capture */
ivtv_set_irq_mask(itv, IVTV_IRQ_MASK_CAPTURE);
+ del_timer(&itv->dma_timer);
/* event notification (off) */
if (test_and_clear_bit(IVTV_F_I_DIG_RST, &itv->i_flags)) {
@@ -873,6 +874,7 @@ int ivtv_stop_v4l2_decode_stream(struct ivtv_stream *s, int flags, u64 pts)
ivtv_vapi(itv, CX2341X_DEC_SET_EVENT_NOTIFICATION, 4, 0, 0, IVTV_IRQ_DEC_AUD_MODE_CHG, -1);
ivtv_set_irq_mask(itv, IVTV_IRQ_MASK_DECODE);
+ del_timer(&itv->dma_timer);
clear_bit(IVTV_F_S_NEEDS_DATA, &s->s_flags);
clear_bit(IVTV_F_S_STREAMING, &s->s_flags);