Edward Wildgoose wrote:
I took a look at the DVB code and it looks like it does the wrong thing when there is no data available (i.e. newdma == av7110->ttbp).Sorry, wasn't deliberate. To be clear. It completely fixes the problem for me with the dvb_kernel branch. However, with the DVB branch, it is vastly better, but there is still severe corruption (ie no way tolerable).
diff -urw cvs/DVB/driver/av7110/av7110.c DVB/driver/av7110/av7110.c --- cvs/DVB/driver/av7110/av7110.c 2003-08-28 14:05:53.000000000 +0100 +++ DVB/driver/av7110/av7110.c 2003-08-31 00:55:34.000000000 +0100 @@ -919,11 +919,27 @@ u32 dmapos; dmapos=saa7146_read(av7110->saa_mem, PCI_VDP3); + + if ((dmapos == 0) || (dmapos == TS_BUFLEN / 2)) { + /* The DMA Pointer is unreliable at 0% and 50% of buffer and + * frequently gets the two positions confused, we make a + * guess of the likely value based on the last known value + */ + if (av7110->ttbp < TS_BUFLEN/2) { + dmapos = TS_BUFLEN/2; + } else { + dmapos = 0; + } + } + dmapos-=(dmapos%188); if (dmapos >= TS_BUFLEN) return; + if (dmapos == av7110->ttbp) { + return; + } if (dmapos > av7110->ttbp) { mem+=av7110->ttbp;