Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 28 Jan 1998 23:16:32 +1030
From:      Mike Smith <mike@smith.net.au>
To:        Bruce Evans <bde@zeta.org.au>
Cc:        cvs-all@FreeBSD.ORG, cvs-committers@FreeBSD.ORG, cvs-sys@FreeBSD.ORG, msmith@FreeBSD.ORG
Subject:   Re: cvs commit: src/sys/i386/isa atapi.c 
Message-ID:  <199801281246.XAA01110@word.smith.net.au>
In-Reply-To: Your message of "Wed, 28 Jan 1998 23:29:06 %2B1100." <199801281229.XAA05384@godzilla.zeta.org.au> 

next in thread | previous in thread | raw e-mail | index | archive | help
> >  Modified files:
> >    sys/i386/isa         atapi.c 
> >  Log:
> >  Check the status port after waiting for DRQ; some drives seem to be very
> >  slow coming off the bus (eg. Iomega's ATAPI Zip).  Failure to do
> >  this results in a false probe of an ATAPI device with garbage
> >  data.
> >  
> >  Revision  Changes    Path
> >  1.22      +9 -0      src/sys/i386/isa/atapi.c
> 
> How can this help?  The status port has been checked about 1 usec before
> and has been found to have a value that would pass the new check
> (ARS_CHECK was clear on the previous read, and ARS_BUSY was clear on a
> read before that, so the bits are unlikely to be all 1).

The Zip is, as I said, slow off the bus.  At least on the P6 I was 
using, it goes like this (PC98 junk elided):

        /* Wait for controller not busy. */
        outb (port + AR_DRIVE, unit ? ARD_DRIVE1 : ARD_DRIVE0);
        if (atapi_wait (port, 0) < 0) {

## Zip is still on the bus here; atapi_wait() returns happily thinking 
## there is a device present and ready.  A possibly better fix would be 
## to have the 10us delay earlier in the loop in atapi_wait().

        /* Issue ATAPI IDENTIFY command. */
        outb (port + AR_DRIVE, unit ? ARD_DRIVE1 : ARD_DRIVE0);
        outb (port + AR_COMMAND, ATAPIC_IDENTIFY);

        /* Check that device is present. */
        if (inb (port + AR_STATUS) == 0xff) {

## Zip is going off the bus at this point, but not gone.
## Read returns 0xa1.

        /* Wait for data ready. */
        if (atapi_wait (port, ARS_DRQ) != 0) {

## Zip eventually goes off the bus, and thus DRQ reads high.

At this point the probe thinks it has a device that's responded to the 
IDENTIFY.  The Zip is off having a beer, and the result is a garbage 
probe.  The easiest fix at the time was to simply catch the obviously 
nonsense case where the status register reads 0xff *after* waiting for 
DRQ.

> Perhaps the problem is earlier.  According to an old draft version of
> the ATA spec, the timing for issueing a polled-mode input command is:
> 
> 	driver				drive
> 	------				-----
> 1.	Write to command register.
> 2.					"sets BSY within 400 nsec".
...

I am inclined to suspect that the problem is actually with step 0.5, 
where:

0.0	Select the target
0.5	Wait XXX<units) for drive to respond to selection, or poll 
	(some register) to indicate drive is selected.

(You can tell I'm in the wrong office.)

-- 
\\  Sometimes you're ahead,       \\  Mike Smith
\\  sometimes you're behind.      \\  mike@smith.net.au
\\  The race is long, and in the  \\  msmith@freebsd.org
\\  end it's only with yourself.  \\ 





Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199801281246.XAA01110>