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.
-
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. -
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
> the
> > > NT safe ‘translated’
> > > > resource addresses, rather than using raw
> values,
> > > right? And finally you are
> > > > of course using the HAL API to access your
> device
> > > rather than using raw
> > > > pointers, right?
> > > >
> > > > It is also possible that your device has
> > > malfunctioned, but as I said the
> > > > fact that when you do not process the
> interrupt
> > > (you return FALSE) the
> > > > system behaves normally, strongly suggests
> that
> > > your ISR is defective.
> > > >
> > > >
> > > > -----Original Message-----
> > > > From: xxxxx@yahoo.com [mailto:xxxxx@yahoo.com]
> > > > Sent: Wednesday, June 06, 2001 9:19 AM
> > > > To: NT Developers Interest List
> > > > Subject: [ntdev] RE: ISR gets called although
> > > device does not interrupt
> > > >
> > > >
> > > > Thanks for the quick reply. Actually initially
> I
> > > was reading the status
> > > > register of my device and verifying whether it
> is
> > > my interrupt or not. But
> > > > even then, it would always tell me that I have
> an
> > > interrupt although I am
> > > > sure that my device is not interrupting. ( My
> > > device is a FIFO card. It
> > > > needs to be connected to a testor which sends
> data
> > > to it. Only after the
> > > > FIFO is half full, it sends an interrupt. As
> of
> > > now, I have not connected
> > > > the testor at all).
> > > >
> > > > Madhu
> > > >
> > > > On 06/06/01, ““Roddy, Mark”
> > > ” wrote:
> > > > > You need to very carefully re-read the DDK
> > > manual regarding how to
> > > > > process interrupts. You only return TRUE if
> the
> > > interrupt is for you.
> > > > > You have to use a hardware specific
> mechanism to
> > > determine if the
> > > > > interrupt is for you. Testing your device
> > > extension does not help -
> > > > > that simply validates that the device object
> is
> > > your device object. If
> > > > > it wasn’t your device object you should
> bugcheck
> > > as the operating
> > > > > system is seriously compromised. As you are
> > > sharing interrupts (and
> > > > > that is very normal for PCI devices,) it is
> very
> > > likely that your ISR
> > > > > will be invoked a lot when the interrupt is
> NOT
> > > from your device. The
> > > > > OS has no idea who requested the interrupt,
> it
> > > just calls in turn each
> > > > > ISR linked to the same interrupt vector.
> > > > >
> > > > > Generally your hardware will have some
> status
> > > register that will have
> > > > > a bit that is asserted when the device has
> > > requested an interrupt.
> > > > > Like I said, this is hardware specific, I
> can’t
> > > tell you which
> > > > > register it is, but unless your PCI device
> is
> > > seriously brain-dead, it
> > > > > has such a register. Your ISR should look at
> > > this register in order to
> > > > > decide if the interrupt is for your device.
> If
> > > it is then you will be
> > > > > returning TRUE from your ISR, otherwise you
> will
> > > be returning FALSE.
> > > > >
> > > > > But wait! There’s more! If it is your
> interrupt,
> > > you absolutely have
> > > > > to tell your device to shut up (stop
> asserting
> > > an interrupt,) or you
> > > > > will just be back in your ISR again as soon
> as
>
=== 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: xxxxx@broadstor.com
To unsubscribe send a blank email to leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.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