summaryrefslogtreecommitdiff
path: root/tmp.dif
diff options
context:
space:
mode:
Diffstat (limited to 'tmp.dif')
-rw-r--r--tmp.dif118
1 files changed, 118 insertions, 0 deletions
diff --git a/tmp.dif b/tmp.dif
new file mode 100644
index 0000000..87c57b7
--- /dev/null
+++ b/tmp.dif
@@ -0,0 +1,118 @@
+--- dvb.c
++++ dvb.c Wed May 29 17:41:53 2002
+@@ -444,6 +444,8 @@
+ break;
+ if (!dvb->arm_ready)
+ continue;
++ if (down_interruptible(&dvb->dcomlock))
++ continue;
+ newloops=rdebi(dvb, DEBINOSWAP, STATUS_LOOPS, 0, 2);
+ if (newloops==dvb->arm_loops) {
+ printk("dvb%d: ARM crashed!\n", dvb->num);
+@@ -451,6 +453,7 @@
+ newloops=rdebi(dvb, DEBINOSWAP, STATUS_LOOPS, 0, 2)-1;
+ }
+ dvb->arm_loops=newloops;
++ up(&dvb->dcomlock);
+ }
+ dvb->arm_thread = NULL;
+ return 0;
+@@ -1158,6 +1161,31 @@
+ return blen;
+ }
+
++/* Timer to avoid broken data transfer in gpioirq() */
++
++#define GPIO_RXTIME_FRAME ((32*HZ)/1000)
++
++static void gpio_receive_timeout(unsigned long data)
++{
++ struct dvb_struct *dvb = (struct dvb_struct *)data;
++ dvb->debitimer.expires = 0;
++}
++
++static void gpio_receive_timer(struct dvb_struct *dvb, unsigned long ticks)
++{
++ dvb_demux_filter_t *dvbdmxfilter = dvb->handle2filter[((dvb->debitype)>>8)&0x1f];
++
++ if (!dvbdmxfilter || dvbdmxfilter->type != DMX_TYPE_TS)
++ return;
++ mod_timer(&dvb->debitimer, jiffies + ticks);
++}
++
++static inline int gpio_rx_pending(struct dvb_struct *dvb)
++{
++ return !timer_pending(&dvb->debitimer) && \
++ dvb->debitimer.expires == 0;
++}
++
+ static void
+ gpioirq(struct saa7146* saa, void *data)
+ {
+@@ -1313,6 +1341,7 @@
+ iwdebi(dvb, DEBINOSWAP, RX_BUFF, 0, 2);
+ break;
+ } /* yes, fall through */
++ gpio_receive_timer(dvb, GPIO_RXTIME_FRAME);
+ case DATA_TS_RECORD:
+ case DATA_PES_RECORD:
+ saa7146_write(dvb->saa_mem, IER,
+@@ -1843,7 +1872,7 @@
+ bpp=dvb->osdbpp[dvb->osdwin]+1;
+ bpl=((w*bpp+7)&~7)/8;
+ size=h*bpl;
+- lpb=(32*1024)/bpl;
++ lpb=(16*1024)/bpl;
+ bnum=size/(lpb*bpl);
+ brest=size-bnum*lpb*bpl;
+
+@@ -1851,6 +1880,10 @@
+ LoadBitmap(dvb, bpp2bit[dvb->osdbpp[dvb->osdwin]], w, lpb, inc, data);
+ BlitBitmap(dvb, dvb->osdwin, x0, y0+i*lpb, 0);
+ data+=lpb*inc;
++ if (gpio_rx_pending(dvb)) {
++ set_current_state(TASK_INTERRUPTIBLE);
++ schedule_timeout(GPIO_RXTIME_FRAME);
++ }
+ }
+ if (brest) {
+ LoadBitmap(dvb, bpp2bit[dvb->osdbpp[dvb->osdwin]], w, brest/bpl, inc, data);
+@@ -3819,6 +3852,7 @@
+ return TTBStop(dvb);
+
+ if (dvbdmxfeed->type == DMX_TYPE_TS) {
++ del_timer(&dvb->debitimer);
+ if (dvbdmxfeed->ts_type & TS_DECODER) {
+ if (dvbdmxfeed->pes_type>=DMX_TS_PES_OTHER ||
+ !dvbdmx->pesfilter[dvbdmxfeed->pes_type])
+@@ -5472,8 +5506,12 @@
+ spin_lock_init (&dvb->debilock);
+ sema_init(&dvb->dcomlock, 1);
+ init_waitqueue_head(&dvb->debiq);
++ init_timer(&dvb->debitimer);
+ dvb->debilock=SPIN_LOCK_UNLOCKED;
+ dvb->debitype=-1;
++ dvb->debitimer.function = gpio_receive_timeout;
++ dvb->debitimer.data = (unsigned long) dvb;
++ dvb->debitimer.expires = jiffies;
+
+ dvb->num=num;
+ dvb->i2cbus=adap;
+@@ -5741,6 +5779,7 @@
+
+ /* release the saa7146s */
+ for( i = 0; i < num_dvb; i++) {
++ del_timer_sync(&(dvbs[i].debitimer));
+ dvbs[i].arm_rmmod=1;
+ wake_up_interruptible(&dvbs[i].arm_wait);
+ while (dvbs[i].arm_thread)
+--- dvb.h
++++ dvb.h Wed May 29 17:41:08 2002
+@@ -566,6 +566,7 @@
+ spinlock_t debilock;
+ struct semaphore dcomlock;
+ WAIT_QUEUE debiq;
++ struct timer_list debitimer;
+ int debitype;
+ int debilen;
+ int debibuf;