edge-triggered IRQ

Martin Mares mj na atrey.karlin.mff.cuni.cz
Pondělí Červen 15 19:55:44 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?

   Dokumentace od PICu by mela byt obsazena v dokumentaci od vetsiny
chipsetu -- budto Intel nebo AMD to ve svych chipsetovych PDF zarucene
ma (mohu to zkusit najit ve svem domacim archivu). Ale tipoval bych,
ze to timto nebude.

> linux/arch/i386/io_apic.c obsahuje sice neco o edge/level-triggered
> prerusenich, ale pokud tomu rozumim, APIC je pouze na SMP systemech.

   Ano. A mimochodem, ve kterem kernelu tyto problemy pozorujes?

> 	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.

   Pouziva se nekde v onom driveru disable_irq()?

> 	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?

   Nedelal bych to primo jako bottom half, protoze tech je v celem kernelu
k dispozici neprijemne malo. Podstatne rozumejsi je vyuzit IMMEDIATE_BH
-- staci vyrobit strukturu tq_struct, do ni si dat pointer na svoji
funkci, zavolat queue_task(&dotycna_struktura, tq_immediate) a pak
mark_bh(IMMEDIATE_BH).

				Have a nice fortnight
-- 
Martin `MJ' Mares   <mj na ucw.cz>   http://atrey.karlin.mff.cuni.cz/~mj/
Faculty of Math and Physics, Charles University, Prague, Czech Rep., Earth
"Anyone can build a fast CPU. The trick is to build a fast system." -- S. Cray


Další informace o konferenci Linux