Latest idea of clearing IER was nice, but practical 
test showed that it tends to stop TS feed (alevt stops
receiving pages).

So I reverted to old patch with delayed ISR clearing
and added two wait_for_debi that I saw looked like missing
in av7110.c.

The proposed loop of repeated inerrupt serving in the tasklet
I'm afrait I can't do because there's interplay between
debiirq and gpioirq, sometning looking like mutual exclusion
of those two tasklets, one exclusion is done by IER while
the other by wait_for_debi....

Changing things there didn't lead to any stability at all.
The whole theory of data transport should be reconsidered and
then av7110 may be cleanly rewritten.

Anyway, I shuffled my PCI cards to the position when
before  there was very high expectancy of freezing

The patch was applied.

The system is now completely loaded: disk is constantly 
blinking, both dvb's transferring, xawtv, alevt, network 
card downloading at over 50MBit/s and I'm still writing this 
message.

Without the patch, something like this was unthinkable.
This is my final candidate patch that I will keep testing.

Emard


Only in DVB/driver: .dvb_frontend.o.flags
Only in DVB/driver: .dvb_i2c.o.flags
Only in DVB/driver: .dvb_ksyms.o.flags
Only in DVB/driver: .dvb_net.o.flags
Only in DVB/driver: .dvbdev.o.flags
diff -pur /home/loader/src/DVB/driver/Makefile DVB/driver/Makefile
--- /home/loader/src/DVB/driver/Makefile        Mon Dec  9 23:51:40 2002
+++ DVB/driver/Makefile Fri Jan  3 19:47:32 2003
@@ -93,7 +93,7 @@ dvb-core-objs = dmxdev.o dvb_demux.o dvb
 subdir-y    := frontends $(CARDS)
 mod-subdirs := frontends $(CARDS)
 
-EXTRA_CFLAGS = -I ../include -I . -g -MD
+EXTRA_CFLAGS = -I ../include -I . -MD
 
 dvb-core.o: $(dvb-core-objs)
        $(LD) -r -o $@ $(dvb-core-objs)
Only in DVB/driver/av7110: .av7110.o.flags
Only in DVB/driver/av7110: .av7110_ir.o.flags
Only in DVB/driver/av7110: .saa7146_core.o.flags
Only in DVB/driver/av7110: .saa7146_v4l.o.flags
diff -pur /home/loader/src/DVB/driver/av7110/Makefile DVB/driver/av7110/Makefile
--- /home/loader/src/DVB/driver/av7110/Makefile Sun Nov 17 00:36:24 2002
+++ DVB/driver/av7110/Makefile  Fri Jan  3 19:47:43 2003
@@ -14,7 +14,7 @@ dvb-ttpci.o: $(dvb-ttpci-objs)
        $(LD) -r -o $@ $(dvb-ttpci-objs)
 
 
-EXTRA_CFLAGS = -I.. -I. -g -DCONFIG_DVB_AV7110_OSD -MD
+EXTRA_CFLAGS = -I.. -I. -DCONFIG_DVB_AV7110_OSD -MD
 
 
 ifdef DVB_PACK 
diff -pur /home/loader/src/DVB/driver/av7110/av7110.c DVB/driver/av7110/av7110.c
--- /home/loader/src/DVB/driver/av7110/av7110.c Mon Dec 30 15:48:57 2002
+++ DVB/driver/av7110/av7110.c  Fri Jan  3 19:33:05 2003
@@ -1331,6 +1331,7 @@ void gpioirq (unsigned long data)
                 }                  /* yes, fall through */
         case DATA_TS_RECORD:
         case DATA_PES_RECORD:
+                wait_for_debi_done(av7110);
                 saa7146_write(av7110->saa_mem, IER, 
                               saa7146_read(av7110->saa_mem, IER) | MASK_19);
                 irdebi(av7110, DEBISWAB, DPRAM_BASE+rxbuf, 0, len);
@@ -1342,6 +1343,7 @@ void gpioirq (unsigned long data)
                         iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
                         break;
                 }
+                wait_for_debi_done(av7110);
                 saa7146_write(av7110->saa_mem, IER, 
                               saa7146_read(av7110->saa_mem, IER) | MASK_19);
                 irdebi(av7110, DEBISWAB, Reserved, 0, len);
Only in DVB/driver/av7110: av7110.d
Only in DVB/driver/av7110: av7110.o
Only in DVB/driver/av7110: av7110_firm.h
Only in DVB/driver/av7110: av7110_ir.d
Only in DVB/driver/av7110: av7110_ir.o
Only in DVB/driver/av7110: dvb-ttpci.o
Only in DVB/driver/av7110: fdump
diff -pur /home/loader/src/DVB/driver/av7110/saa7146_core.c 
DVB/driver/av7110/saa7146_core.c
--- /home/loader/src/DVB/driver/av7110/saa7146_core.c   Tue Nov 26 22:00:04 2002
+++ DVB/driver/av7110/saa7146_core.c    Fri Jan  3 19:28:17 2003
@@ -418,12 +418,14 @@ static void saa7146_irq(int irq, void *d
 
                /* read out the primary status register */
                isr = saa7146_read(saa->mem, ISR);
-               /* clear all IRQs */
-               saa7146_write(saa->mem, ISR, isr);
        
                /* is anything to do? */
                if ( 0 == isr )
+               {
+                       /* clear all IRQs */
+                       saa7146_write(saa->mem, ISR, isr);
                        return;
+               }
 
                dprintk("%s: irq-call: isr:0x%08x\n",saa->name,isr);
                
@@ -434,6 +436,8 @@ static void saa7146_irq(int irq, void *d
                          saa7146_ext[i]->irq_handler(saa, isr, saa->data[i]);
                          //saa7146_write(saa->mem, ISR, saa7146_ext[i]->handles_irqs);
                        }
+               /* clear all IRQs */
+               saa7146_write(saa->mem, ISR, isr);
                
                //printk(KERN_ERR "%s: unhandled interrupt: 0x%08x\n", saa->name, isr);
                
Only in DVB/driver/av7110: saa7146_core.d
Only in DVB/driver/av7110: saa7146_core.o
Only in DVB/driver/av7110: saa7146_v4l.d
Only in DVB/driver/av7110: saa7146_v4l.o


-- 
Info:
To unsubscribe send a mail to [EMAIL PROTECTED] with "unsubscribe linux-dvb" as 
subject.

Reply via email to