aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHans Verkuil <hverkuil@xs4all.nl>2007-08-18 14:48:42 -0400
committerMauro Carvalho Chehab <mchehab@infradead.org>2007-10-09 21:05:37 -0400
commite17a06badaedba89fad989eed409661c89a22e04 (patch)
treef24043bfa94678b8b0d09aa906ecab1974c365d0
parent51a99c0428cc6d3a442eef1c9046099c9383d72b (diff)
V4L/DVB (6050): ivtv: retry/timer improvements
- 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> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
-rw-r--r--drivers/media/video/ivtv/ivtv-irq.c4
-rw-r--r--drivers/media/video/ivtv/ivtv-streams.c2
2 files changed, 6 insertions, 0 deletions
diff --git a/drivers/media/video/ivtv/ivtv-irq.c b/drivers/media/video/ivtv/ivtv-irq.c
index 7272f1a71dd9..d68853fd60a3 100644
--- a/drivers/media/video/ivtv/ivtv-irq.c
+++ b/drivers/media/video/ivtv/ivtv-irq.c
@@ -494,7 +494,9 @@ static void ivtv_irq_dma_read(struct ivtv *itv)
494 s->sg_processed, s->sg_processing_size, itv->dma_retries); 494 s->sg_processed, s->sg_processing_size, itv->dma_retries);
495 write_reg(read_reg(IVTV_REG_DMASTATUS) & 3, IVTV_REG_DMASTATUS); 495 write_reg(read_reg(IVTV_REG_DMASTATUS) & 3, IVTV_REG_DMASTATUS);
496 if (itv->dma_retries == 3) { 496 if (itv->dma_retries == 3) {
497 /* Too many retries, give up on this frame */
497 itv->dma_retries = 0; 498 itv->dma_retries = 0;
499 s->sg_processed = s->sg_processing_size;
498 } 500 }
499 else { 501 else {
500 /* Retry, starting with the first xfer segment. 502 /* Retry, starting with the first xfer segment.
@@ -554,7 +556,9 @@ static void ivtv_irq_enc_dma_complete(struct ivtv *itv)
554 s->dma_offset, s->sg_processed, s->sg_processing_size, itv->dma_retries); 556 s->dma_offset, s->sg_processed, s->sg_processing_size, itv->dma_retries);
555 write_reg(read_reg(IVTV_REG_DMASTATUS) & 3, IVTV_REG_DMASTATUS); 557 write_reg(read_reg(IVTV_REG_DMASTATUS) & 3, IVTV_REG_DMASTATUS);
556 if (itv->dma_retries == 3) { 558 if (itv->dma_retries == 3) {
559 /* Too many retries, give up on this frame */
557 itv->dma_retries = 0; 560 itv->dma_retries = 0;
561 s->sg_processed = s->sg_processing_size;
558 } 562 }
559 else { 563 else {
560 /* Retry, starting with the first xfer segment. 564 /* Retry, starting with the first xfer segment.
diff --git a/drivers/media/video/ivtv/ivtv-streams.c b/drivers/media/video/ivtv/ivtv-streams.c
index 4272fbc0bc8b..2e632014c90d 100644
--- a/drivers/media/video/ivtv/ivtv-streams.c
+++ b/drivers/media/video/ivtv/ivtv-streams.c
@@ -816,6 +816,7 @@ int ivtv_stop_v4l2_encode_stream(struct ivtv_stream *s, int gop_end)
816 816
817 /* Set the following Interrupt mask bits for capture */ 817 /* Set the following Interrupt mask bits for capture */
818 ivtv_set_irq_mask(itv, IVTV_IRQ_MASK_CAPTURE); 818 ivtv_set_irq_mask(itv, IVTV_IRQ_MASK_CAPTURE);
819 del_timer(&itv->dma_timer);
819 820
820 /* event notification (off) */ 821 /* event notification (off) */
821 if (test_and_clear_bit(IVTV_F_I_DIG_RST, &itv->i_flags)) { 822 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)
873 ivtv_vapi(itv, CX2341X_DEC_SET_EVENT_NOTIFICATION, 4, 0, 0, IVTV_IRQ_DEC_AUD_MODE_CHG, -1); 874 ivtv_vapi(itv, CX2341X_DEC_SET_EVENT_NOTIFICATION, 4, 0, 0, IVTV_IRQ_DEC_AUD_MODE_CHG, -1);
874 875
875 ivtv_set_irq_mask(itv, IVTV_IRQ_MASK_DECODE); 876 ivtv_set_irq_mask(itv, IVTV_IRQ_MASK_DECODE);
877 del_timer(&itv->dma_timer);
876 878
877 clear_bit(IVTV_F_S_NEEDS_DATA, &s->s_flags); 879 clear_bit(IVTV_F_S_NEEDS_DATA, &s->s_flags);
878 clear_bit(IVTV_F_S_STREAMING, &s->s_flags); 880 clear_bit(IVTV_F_S_STREAMING, &s->s_flags);