This is the mail archive of the ecos-discuss@sourceware.org mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: How DSR is executed in interrupt ?


On Mon, Sep 10, 2007 at 05:21:21PM +0900, ariga masahiro wrote:
> Hi,
>
> Please help me next question ?
>
> I am trying to run LAN91CXX drive on interrupt,
> and it became to enter ISR routine when IRQ3 Line is asserted.
>
> But it looks like IRQ3 Line is ON-State forever and never become OFF-State.
> ISR is repetedly entered but never enter into DSR routine.
>
> ISR/DSR are setted like this in smsc_lan91cxx_init(),
>    // Initialize environment, setup interrupt handler
>    cyg_drv_interrupt_create(cpd->interrupt,
>                            8, // Priority - what goes here?
>                             (cyg_addrword_t)sc, //  Data item passed to 
> interrupt handler
>                             (cyg_ISR_t *)lan91cxx_isr,
>                             (cyg_DSR_t *)eth_drv_dsr, // The logical driver 
> DSR
>                             &lan91cxx_interrupt_handle,
>                             &lan91cxx_interrupt);
>    cyg_drv_interrupt_attach(lan91cxx_interrupt_handle);
>
> ISR is like below,
> static int
> lan91cxx_isr(cyg_vector_t vector, cyg_addrword_t data
>             /* , HAL_SavedRegisters *regs */ )
> {
>    struct eth_drv_sc *sc = (struct eth_drv_sc *)data;
>    struct lan91cxx_priv_data *cpd =
>        (struct lan91cxx_priv_data *)sc->driver_private;
>
>    DEBUG_FUNCTION();
>
>    INCR_STAT( interrupts );
>
>    cyg_drv_interrupt_mask(cpd->interrupt);
>    cyg_drv_interrupt_acknowledge(cpd->interrupt);
>    return (CYG_ISR_HANDLED|CYG_ISR_CALL_DSR);  // Run the DSR
> }

Are you sure the ISR is being called multiple times? 

This masks the interrupt. i.e. it should disable the interrupt
controller from causing further interrupts from this source. The
interrupt is usually unmasked in the delivery function once the
hardware has been reprogrammed to de-assert the interrupt. Since you
say the DSR is not getting called, i don't see how the interrupt can
get unmasked and so i don't see how the ISR can be called again.....

This suggests that cyg_drv_interrupt_mask() is not working. It is not
masking the interrupt. I would take a look at your HAL and check the
interrupt handling code.

> I think /packages/io/eth/v2_0/src/net/eth_drv.c file's

As i've said before v2_0 is very old. It could be this has been fixed
in newer code....

   Andrew

-- 
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]