edge-triggered IRQ

Jan Kasprzak kas na informatics.muni.cz
Pondělí Červen 15 16:54:08 CEST 1998


	Zdravim,

	hledam nejakeho odbornika na Linuxove IRQ. Mam PC (single-CPU),
P100, i82430HX (nebo mozna VX) a zarizeni na sbernici ISA. Vypada to, ze
linux cas od casu (ale dost deterministicky) ztrati IRQ od daneho
zarizeni. Bylo mi doporuceno od autora te karty, abych zkontroloval,
ze mam PIC nastaveny na hranu (misto urovne). Vi nekdo, jak se to
udela? linux/arch/i386/io_apic.c obsahuje sice neco o edge/level-triggered
prerusenich, ale pokud tomu rozumim, APIC je pouze na SMP systemech.

	Pritom muj kod, ktery ma vyvolat preruseni, je pomerne jednoduchy.
Mam prerusovaci rutinu (napriklad) tx_interrupt, ve ktere nastartuji
DMA (nakonfiguruji DMA kontroler) a reknu karte, ze ma zacit DMA
prenos a ze na konci mi ma dat preruseni. A prave to druhe preruseni
se ztrati:

static void tx_interrupt() {
	...
	/* Nastaveni DMA kontroleru */
	...
	/* Start DMA a zadost o preruseni na konci DMA. DMA sice
	 * probehne, ale IRQ nedostanu. */
	outb(status_byte, TX_DMA_ENABLE|INTERRUPT_ENABLE);
}

	Je videt, ze DMA startuji az na uplnem konci prerusovaci rutiny,
takze o nejakych casovych prodlevach z duvodu zakazaneho IRQ snad nemuze
byt rec.

	Pokud je opravdu problem v casovani, muzu znacnou cast
tx_interrupt() prepsat jako bottom half. Vi nekdo, jak se definuje
a pouziva bottom half rutina?

-Yenya

--
\ Jan "Yenya" Kasprzak <kas at fi.muni.cz>       http://www.fi.muni.cz/~kas/
\\ PGP: finger kas at aisa.fi.muni.cz   0D99A7FB206605D7 8B35FCDE05B18A5E //
\\\             Czech Linux Homepage:  http://www.linux.cz/              ///
If there are race conditions in programs fix them. The "my programs suck fix
something else" mentality leads you to things like Java.         -- Alan Cox


Další informace o konferenci Linux