On TEST_UNIT, use REQUEST_SENSE to know the device state

This commit is contained in:
Laurent Vivier 2006-11-01 17:47:32 +00:00
parent 7ce6576ba8
commit 002e3026ae

View File

@ -6,6 +6,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <scsi/scsi.h>
#include <macos/errors.h> #include <macos/errors.h>
@ -17,16 +18,38 @@ scsi_device_t *scsi_open(int target)
scsi_device_t *dev; scsi_device_t *dev;
unsigned char buff[BUFFER_SIZE]; unsigned char buff[BUFFER_SIZE];
OSErr err; OSErr err;
int retries;
err = scsi_TEST_UNIT_READY(target, buff, BUFFER_SIZE);
if (err != noErr)
printf("WARNING: cannot execute TEST_UNIT_READY\n");
err = scsi_INQUIRY(target, buff, BUFFER_SIZE); err = scsi_INQUIRY(target, buff, BUFFER_SIZE);
if (err != noErr) if (err != noErr)
printf("WARNING: cannot execute INQUIRY\n"); printf("WARNING: cannot execute INQUIRY\n");
err = scsi_READ_CAPACITY(target, buff, BUFFER_SIZE); retries = 0;
while (retries < 300)
{
err = scsi_TEST_UNIT_READY(target);
retries++;
if (err == noErr) {
err = scsi_REQUEST_SENSE(target, buff, BUFFER_SIZE);
if ((err == noErr) && (buff[2] != UNIT_ATTENTION) &&
(buff[2] != NOT_READY))
break;
}
}
if (retries == 300)
{
printf("ERROR: unit not ready !\n");
return NULL;
}
retries = 0;
while (retries < 3)
{
err = scsi_READ_CAPACITY(target, buff, BUFFER_SIZE);
if (err == noErr)
break;
retries++;
}
if (err != noErr) { if (err != noErr) {
printf("ERROR: cannot execute READ_CAPACITY\n"); printf("ERROR: cannot execute READ_CAPACITY\n");
return NULL; return NULL;