[comp.sys.ibm.pc] Help with WD7000-ASC SCSI card and a great big tape drive

daved@cscnj.csc.COM (Dave Douglass) (11/28/89)

I'm trying to use an Exabyte 2.8 Gig 8mm Cartridge Tape Subsystem with a
WD7000-ASC SCSI controller on an AT.  I'm trying to read a tape written
by the Exabyte while it was connected to a Sun.

My device driver isn't working.  I believe that I am missing some vital
piece of information about how interrupts work on the AT.  Below are
some details.  Any suggestions would be appreciated.

----------------------------------------------------------------------------

The controller uses DRQ/DACK 6.  It takes control of the bus
during DMA, and so I've set channel 6 on the AT's DMA chip into cascade
mode and removed the mask.

I configured the controller to use IRQ12.  I set up an interrupt service
routine and installed it with INT 21h, AH=25h.  I removed the mask for
IRQ12.  My service routine sets a flag, strobes a port on the WD7000 to
acknowledge the interrupt, send an EOI to the AT's interrupt chip and
IRETs.

The first command executed by the WD7000 and tape drive executes and 
returns flawlessly.  The DMA is performed properly and the interrupt
service routine is invoked on completion.

The second command to the WD7000 executes.  The DMA is performed.  The
interrupt occurs.  However, the service routine is never called.  The
hard drive (on IRQ14) now fails and puts the AT into an endless loop
of 'Abort, Retry, Ignore' messages.  On inspection, the mask register
and interrupt vector table entries are as they should be.

I've tried reconfiguring the controller and driver to use IRQ5.  The first
command executes and DMA is performed.  The interrupt occurs.  The interrupt
service routine is never called.  On inspection, the interrupt mask register
has been mysteriously reset to mask off IRQ5.  Although this avoids hanging
the entire system with each run,  it is impossible to complete even one
command.

I suspect that ONE of my problems may be that I've forgotten to make
certain key sections of my code 'critical' using CLI and STI.  Right
now I only do this when changing the interrupt mask register.  Where
else should I prevent interrupts from occurring?

Help.

-- 
---------
Dave Douglass  Computer Sciences Corporation  Piscataway, NJ  08854
....!rutgers.rutgers.edu!cscnj!daved