On Wednesday 18 July 2007 16:42:08 Dieter Tschanz wrote:
> Hi!
>
> I am running YUV together with VBI for more than one hour without any
> problem. I let it run for an additonal hour.
>
> The YUV with PCM combination is my ordinary watching TV
> configuration, which is used quite often and for several hours. This
> one never froze.
>
> I assume that having a simple main that opens the device and keeps
> reading from it should be able to reproduce it in other environments.
> Together with the capture application provided in zvbi/test.
Fixed! It's a driver bug. The VBI DMA is handled in a special way and is
marked with a bit. However, that bit was set at the wrong time and
could be cleared by mistake if a PCM DMA request would arrive before
the VBI DMA was completed.
This bug is not specific to PCM, but the different timing of YUV+VBI or
MPG+VBI probably prevents this bug from occuring.
Still, it is a rather serious bug and it warrants a ivtv-0.10.5 release.
I'll see if I can get it queued for a 2.6.22 dot release as well.
Please report back if this solved your problem completely.
Thanks,
Hans
diff -r ce6e2e8c859f linux/drivers/media/video/ivtv/ivtv-irq.c
--- a/linux/drivers/media/video/ivtv/ivtv-irq.c Tue Jul 17 18:50:46 2007 +0200
+++ b/linux/drivers/media/video/ivtv/ivtv-irq.c Wed Jul 18 18:02:56 2007 +0200
@@ -409,6 +409,11 @@ static void ivtv_dma_enc_start(struct iv
/* Mark last buffer size for Interrupt flag */
s->SGarray[s->SG_length - 1].size |= cpu_to_le32(0x80000000);
+ if (s->type == IVTV_ENC_STREAM_TYPE_VBI)
+ set_bit(IVTV_F_I_ENC_VBI, &itv->i_flags);
+ else
+ clear_bit(IVTV_F_I_ENC_VBI, &itv->i_flags);
+
if (ivtv_use_pio(s)) {
for (i = 0; i < s->SG_length; i++) {
s->PIOarray[i].src = le32_to_cpu(s->SGarray[i].src);
@@ -603,7 +608,6 @@ static void ivtv_irq_enc_start_cap(struc
data[0], data[1], data[2]);
return;
}
- clear_bit(IVTV_F_I_ENC_VBI, &itv->i_flags);
s = &itv->streams[ivtv_stream_map[data[0]]];
if (!stream_enc_dma_append(s, data)) {
set_bit(ivtv_use_pio(s) ? IVTV_F_S_PIO_PENDING : IVTV_F_S_DMA_PENDING, &s->s_flags);
@@ -640,7 +644,6 @@ static void ivtv_irq_enc_vbi_cap(struct
then start a DMA request for just the VBI data. */
if (!stream_enc_dma_append(s, data) &&
!test_bit(IVTV_F_S_STREAMING, &s_mpg->s_flags)) {
- set_bit(IVTV_F_I_ENC_VBI, &itv->i_flags);
set_bit(ivtv_use_pio(s) ? IVTV_F_S_PIO_PENDING : IVTV_F_S_DMA_PENDING, &s->s_flags);
}
}
_______________________________________________
ivtv-users mailing list
[email protected]
http://ivtvdriver.org/mailman/listinfo/ivtv-users