Mailing List archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[linux-dvb] Re: DVB-S interrupt nesting



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 listar@linuxtv.org with "unsubscribe linux-dvb" as subject.



Home | Main Index | Thread Index