Hi,
If, as you said, the bus was faster than the device,
then I think my ISR would never have worked properly
whether the machine was booted or not. Now, even after
booting, if I disable the network adapter card on PCI,
which shares the same interrupt as my device,
then my ISR works fine.
I do not have any DPC, nor have any locks in the ISR.
Basically, this is what my ISR looks like as of now:
BOOLEAN FifoIsr( IN PKINTERRUPT pIntObj, IN PVOID
pServiceContext )
{
PDEVICE_EXTENSION pDevExt ;
ULONG ulFifoState = 0,ulCumWordsHwCnt=0, ulIrqType
= 0;
pDevExt = (PDEVICE_EXTENSION)pServiceContext ;
if ( pDevExt->bStatusFlag)/*This is initialised to
TRUE*/
{
pDevExt->bStatusFlag = FALSE ;
ulFifoState =
MAC_READSTATUS(pDevExt->pMemRegs);/*calls
READ_REGISTER_ULONG to read status register*/
}
if (ulFifoState != ulMyInterrupt)
{
/*Not our interrupt*/
pDevExt->bStatusFlag = TRUE ;
return (FALSE) ;
}
DbgPrint (“FIFO5W: My interrupt \n”);
pDevExt->bStatusFlag = TRUE ;
EnableDeviceInterrupt(pDevExt);/*Enabling the device
to interrupt again by writing to the control
register*/
return TRUE;
}
I use only a flag, bStatusFlag to control access to my
device registers. My device is a FIFO card which
interrupts every time it is half full. In the ISR, I
just read this data to a buffer.
Thanks.
Madhu
— Gary Little wrote:
> Perhaps your device suffers from Alzheimer’s? That’s
> a bit facetious, but it
> does describe a situation that can occur in
> hardware. Case in point,
> attempting to use an ISA card with a Zilog 8530 on
> it that was made in 1989
> for an 8Mhz bus. If you try to use that card in one
> of today’s motherboards,
> you can get into a situation where the bus is faster
> than the 8530, and you
> can loose or miss states in the device. The 8530
> requires a dual IO
> operation to access a register. You write to the
> control register to tell it
> what register you want to access and then read or
> write that register. If
> you do allow enough “settling” time for the data in
> that register to
> “settle”, then you end up accessing garbage and
> confusing the hell out of
> the device. The typical solution was to do NOPs
> between the write to the
> device’s control port and the access of the state
> register.
>
> Now this may not be your problem, but it does sound
> familiar.
>
> I’m not familiar with your hardware, but I would
> look to see if I am safely
> checking the state of the device and not leaving it
> vulnerable when another
> device in the chain causes it to be queried
> unexpectedly, sometimes while I
> am currently checking it. Perhaps you are not at the
> proper IRQL? maybe you
> queued a DpcForIsr but failed to sync to DIRQL to
> access data or strucutes
> or status information? Or you released a lock to
> soon?
>
> Gary G. Little
> Staff Engineer
> Broadband Storage, Inc.
> xxxxx@Broadstor.com
> xxxxx@inland.net
>
>
> -----Original Message-----
> From: M V [mailto:xxxxx@yahoo.com]
> Sent: Tuesday, June 12, 2001 10:01 AM
> To: NT Developers Interest List
> Subject: [ntdev] RE: ISR gets called although device
> does not interrupt
>
>
> Hi Tim.
>
> My device is accessing an interrupt that seems to be
> shared by all PCI devices including a network
> adapter.
>
> 1. When I boot the system, my ISR gets a lot of
> interrupts from other devices as well, probably
> because it may be among the the first ISRs available
> in that interrupt vector chain. When my device ( a
> FIFO card which sends an interrupt every time it is
> half full) starts sending interrupts, in between
> these
> interrupts I get interrupts from other devices as
> well. After some time, the machine just freezes
> although the device still is interrupting. It
> freezes
> at the point where I am trying to read a status
> register of the device to determine whether it is my
> interrupt or not.
>
> 2. When I install the driver and then send
> interrupts
> from the device( without rebooting), my ISR gets
> only
> the interrupts that are meant for my device and
> nothing else. Probably this is because my ISR is the
> last in the interrupt vector chain for that
> particular
> interrupt. In this case everything works fine.
>
> Is there any way to make sure that my ISR is the
> last
> ISR available in that interrupt vector chain ? Or is
> there any way to make sure that I use an interrupt
> which is not shared by other devices ?
>
> Thanks for all help
>
> Madhu
> — “Timothy A. Johns” wrote:
> > Madhu,
> >
> > That ‘hang’ sounds like an unhandled PCI
> interrupt.
> > Is your ISR being
> > called repeatedly while this hang is occuring, and
> > if so, can you verify
> > 100% (using a logic analyzer or oscilliscope, if
> > you’re going to have to
> > take your evidence to the proverbial hardware
> > person) that your device is
> > not asserting the interrupt?
> >
> > Also, it could be a PCI bus access problem, or
> > either a master or target
> > abort. It’s also possible that it may be that
> your
> > driver is getting an
> > interrupt that a different device is already
> using,
> > and the ‘other’ device
> > is not sharing it properly, but I’d view that as a
> > last resort, since the
> > driver you added is new and changing the behavior.
> > You can move it to a
> > different slot and if the problem goes away or
> > changes, the problem is very
> > likely in either your driver’s ISR or some other
> > device’s ISR.
> >
> > In any case, the registry entries for Start and
> > LoadOrderGroup that you have
> > below are almost certainly correct for a PnP
> driver.
> >
> > -Tim
> >
> > Timothy A. Johns — xxxxx@driverdev.com
> > Driver Development Corporation — 800.841.0092
> > Bring Up Your Hardware — Fast. www.driverdev.com
> >
> >
> > > -----Original Message-----
> > > From: xxxxx@lists.osr.com
> > > [mailto:xxxxx@lists.osr.com]On
> Behalf
> > Of M V
> > > Sent: Tuesday, June 12, 2001 5:50 AM
> > > To: NT Developers Interest List
> > > Subject: [ntdev] ISR gets called although device
> > does not interrupt
> > >
> > >
> > > In continuation with the last message, my ISR is
> > > working fine now. But I am facing a strange
> > problem. I
> > > install the WDM (without booting after
> > > installation)and send data to my FIFO device so
> > that
> > > it interrupts. I receive all the interrupts and
> > read
> > > all data. Everything is fine. But if I boot my
> > machine
> > > anytime after installation and then send data to
> > the
> > > device so that it interrupts, I receive some
> > > interrupts and after that the machine hangs. Why
> > would
> > > this be happening ? Is there any problem in my
> > > installation ? I have decared my service to be
> of
> > > SERVICE_DEMAND_START and have not specified
> > anything
> > > in the LoadOrderGroup.Can this be a problem ?
> > >
> > > Thanks for all help
> > > Madhu
> > >
> > > > On 06/06/01, ““Roddy, Mark”
> > > > ” wrote:
> > > > > Well that sounds very much like you are not
> > > > looking at the correct location
> > > > > for this status register, or you are looking
> > at
> > > > the correct location and
> > > > > have not interpreted the interrupt reason
> > > > correctly and not done the proper
> > > > > handshaking with your device to convince it
> to
> > > > stop generating an interrupt.
> > > > >
> > > > > The fact that when you return FALSE the
> system
> > > > works correctly argues for
> > > > > the case that you are looking at the wrong
> > > > locations on the PCI bus for your
> > > > > status register. You are of course talking
> > about
> > > > some register located off
> > > > > of BAR0 or BAR1, right? Not some value in
> the
> > > > config space for your device?
> > > > > And you did do all the right things to
> obtain
>
=== message truncated ===
__________________________________________________
Do You Yahoo!?
Get personalized email addresses from Yahoo! Mail - only $35
a year! http://personal.mail.yahoo.com/
—
You are currently subscribed to ntdev as: $subst(‘Recip.EmailAddr’)
To unsubscribe send a blank email to leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com