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