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).
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).
Try this patch to DVB instead, it justs adds the special case where there is no data available. This is already covered in the dvb-kernel code.
The dvb-kernel vpeirq() code looks easier to understand than the DVB code, but looks like it should do exactly the same thing. Should we consider putting the dvb-kernel vpeirq() into DVB?
Jon
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;
