Dear Friends,
        I am sending a mail after a long time. I am facing a problem now. Please
help me to come out of this.

Environment:
~~~~~~~~~~~~
RT-Linux - Version 3.1
Linux      - 2.4.16 with RT patch from contribution

Hardware
~~~~~~~~
Pentium III  - 700 MHz
128 MB SDRAM
40GB HAR DISK

ADD-ON Module
~~~~~~~~~~~~~~
Supports PCI Ver 2.1
Memory Requirement - 1 MB PCI
IO Requirement  - 256 bytes I/O
IRQ                     - 1 Line INT A


We are developing a driver for a PCI add-on module which is actually a
communication add-on like RS-422 and 1553B. The problem here is if I put
more than one PCI add-on (same module) in the same PC, I am not able to
service interrupts properly.
Because, both are sharing the same interrupt the line. When I program the
BIOS to allocate different IRQs there is no problem.

Please tell me wheather RT-Linux supports IRQ sharing, if so how to
implement that.

Because I have return a single driver to handle multiple cards, I am having
a single ISR and registering with the rtl_request_interrupt function. In
that function, whenever I get an interrupt, I am checking which board is
using the raised IRQ number (from ISR function parameter), then I am
servicing the interrupt. If more that one board matches I am reading the IRQ
status from the board and verifying wheather it has generated the Interrupt,
if not I will go to the next matching board, I am also verifying the other
board even the Interrupt is raised by the any one of the matching boards.

Code snippet
~~~~~~~~~~~~

PCI_ISR(irqno, regs)
{
        for(i=0; i <= g_uiTotalBrds; i++)
        {
                if(g_strBrdDetail[i].IRQ == irqno)
                {
                        // Read Interrupts Status
                        // Clear Interrupt
                }
        }
        rtl_irq_hardenable(irqno);
}


The Problem
~~~~~~~~~~~
* In an instance, if two or more boards is raising interrupts on the same
line, IRQ is serviced for any one board only, with this effect the system is
hanging and stops responding. This is due to the un serviced interrupts of
other boards.

Typical case:

Let us say the Interrupt is raised for the third board, my interrupt service
routine is called immediately. Now in the processing when the loop reaches
the third iteration (Board 3, i=2), assume board 2 is raising interrupt, in
this case there won't be any call to ISR because the IRQ line is same for
both boards and in RT-Linux the IRQ line is disabled when the ISR is called.
Because the loop is in third iteration and board 2 has raised the interrupt
there will not be any chance of servicing the Board 2 until the loop is
fully executed and ISR is returned with the rtl_irq_hard_enable.

My Problem is, the ISR is not getting invoked even though there is a pending
interrupt on the same line.


Please advice on how to handle this problem.

Regards
RD


-- [rtl] ---
To unsubscribe:
echo "unsubscribe rtl" | mail [EMAIL PROTECTED] OR
echo "unsubscribe rtl <Your_email>" | mail [EMAIL PROTECTED]
--
For more information on Real-Time Linux see:
http://www.rtlinux.org/

Reply via email to