From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 31896 invoked by alias); 10 Sep 2007 08:52:46 -0000 Received: (qmail 31888 invoked by uid 22791); 10 Sep 2007 08:52:46 -0000 X-Spam-Check-By: sourceware.org Received: from londo.lunn.ch (HELO londo.lunn.ch) (80.238.139.98) by sourceware.org (qpsmtpd/0.31) with ESMTP; Mon, 10 Sep 2007 08:52:42 +0000 Received: from lunn by londo.lunn.ch with local (Exim 3.36 #1 (Debian)) id 1IUf0V-0005BS-00; Mon, 10 Sep 2007 10:52:35 +0200 Date: Mon, 10 Sep 2007 08:52:00 -0000 From: Andrew Lunn To: ariga masahiro Cc: ecos-discuss@ecos.sourceware.org Message-ID: <20070910085235.GC19258@lunn.ch> Mail-Followup-To: ariga masahiro , ecos-discuss@ecos.sourceware.org References: <001701c7f383$91bcbfc0$1c0110ac@ariga> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <001701c7f383$91bcbfc0$1c0110ac@ariga> User-Agent: Mutt/1.5.16 (2007-06-11) X-IsSubscribed: yes Mailing-List: contact ecos-discuss-help@ecos.sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: ecos-discuss-owner@ecos.sourceware.org Subject: Re: [ECOS] How DSR is executed in interrupt ? X-SW-Source: 2007-09/txt/msg00045.txt.bz2 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