dal@syntel.UUCP (Dale Schumacher) (02/02/89)
I've gotten several requests for information about any progress toward
getting the older Supra hard disk drives to work with Minix/ST. As usual,
Willie Brown, of Supra Corp., has been most helpful in tracking down this
elusive problem. Below is a message he sent to me containing a new version
of the kernel routine do_xfer() from the source file "stwini.c".
First a little background information and a caveat. If you have a Supra
drive with a DMA port on the back of it (for connecting additional DMA
devices) then you don't need this fix, though it won't hurt it install it.
If you have a REALLY old Supra drive (like mine :-) that uses the Seagate
225 drive mechanism, then this fix will *NOT* help you. The 225 has a
further (as yet unidentified) problem that causes it not to even register
a drive access at all on boot-up. If you have this symptom, then you
probably have a 225 and will have to wait (like ME :-) for a further patch.
If the drive accesses, but panics during boot or randomly during operation,
then you probably have a Seagate 1xx or Miniscribe drive and THIS IS THE
FIX YOU'RE LOOKING FOR!
The code comments explain the technical aspects of the problem and solution.
----------------------------------------------------------------------------
From: Willie Brown <hpda!hp-pcd!orstcs!jacobs.CS.ORST.EDU!willieb>
Message-Id: <8901120631.AA16601@jacobs.CS.ORST.EDU>
To: syntel!dal
Subject: Supra HD fix! (_finally_)
Dale
Here is the fix that I left you a message on your machine about. I used it
to compile a version (actually a bunch of versions) of MINIX. It works
great with a version 6 of our interface and a MiniScribe 8425S 20MB hard
disk. Try it out and let me know if it works for you. I set the rest of
this up so that it could be put on the network if you dont find any more
problems. Be talking to you later.
Willie
/*****************************************************************************
* The following is a replacement routine in STWINI.C to allow older Supra *
* hard disk systems (those _without_ a DMA pass thru) to work correctly *
* with MINIX. The problem is that an extra interrupt gets generated at *
* the end of EVERY hard disk transfer. I corrected this by disabling the *
* interrups _before_ the status byte is read in. The delay loop set by *
* PNK_DELAY adds a little extra fudge factor to guaranty that the inter- *
* rupt has happened. The value of 50 should work with all drives, but I *
* was only able to test it with a MiniScribe 8425S. The value could be *
* as low as 10 with that drive. I hope that this will allow all Supra *
* hard disk owners to run MINIX. *
* Willie Brown - Supra Corporation *
*****************************************************************************/
#define PNK_DELAY 50
/*===========================================================================*
* do_xfer *
*===========================================================================*/
PRIVATE int do_xfer(drive, address, sector, count, rw)
int drive;
phys_bytes address;
long sector;
int count;
int rw;
{
register r, s, wrbit;
/*
* Carry out the transfer. All parameters have been checked and
* are set up properly.
*
* Every single byte written to the hdc will cause an interrupt.
* Thus disable interrupts while communicating with hdc. Ready test
* will be done by busy waiting. Only for real hard disk operations
* interrupts will be enabled.
*/
TRACE(printf("hd drive:%d address:0x%X sector:%D count=%d cmd:%s\n",
drive, address, sector, count, (rw==DISK_READ)?"READ":"WRITE")
);
IDISABLE();
if (rw == DISK_READ) {
cmdhead(drive, HD_RD); /* command code */
dmaaddr(address); /* DMA address setup */
wrbit = 0;
} else {
dmaaddr(address); /* DMA address setup */
cmdhead(drive, HD_WR); /* command code */
wrbit = WRBIT;
}
r = cmdtail(drive, sector, count); /* command parameters */
if (r == OK) {
IENABLE();
dmacomm(wrbit | FDC | SCREG, count, HDC_DELAY);
dmawdat(wrbit | FDC | HDC | A0, 0, HDC_DELAY);
DMA->dma_mode = wrbit; /* needed? */
receive(HARDWARE, &mess); /* Wait for interrupt. */
IDISABLE(); /* Cancel interrupt for status bytes */
s = dmardat(wrbit | FDC | HDC | A0, HDC_DELAY);
if (s & HDC_CC) {
printf("hd: %s: drive=%d sector=%D status=0x%x\n",
wrbit ? "write" : "read", drive, sector, s&0xFF);
r = ERROR;
}
}
if (dmardat(FDC, HDC_DELAY)) /* finish HDC command */
;
for (s = 0; s < PNK_DELAY; s++) {} /* Guaranty interrupt is gone! */
IENABLE(); /* Re-enable normal interrupts */
return(r);
}
----------------------------------------------------------------------------
PS. As you may have noticed, Supra now has a representative on the net.
This is a new development, and Willie still doesn't get much time to read
news, but at least they are now reachable via E-Mail.
--
Dale Schumacher 399 Beacon Ave.
(alias: Dalnefre') St. Paul, MN 55104
...pwcs!stag!syntel!dal United States of America
"It's not reality that's important, but how you perceive things."