diff --git a/sm5/scsicmds.c b/sm5/scsicmds.c index 3eddcddc7df4e68ae03d850d74fb6fbb786ec442..155d3a74454f8d6d994424008d3c41786be0362a 100644 --- a/sm5/scsicmds.c +++ b/sm5/scsicmds.c @@ -46,7 +46,7 @@ #include "utility.h" #include "extern.h" -const char *scsicmds_c_cvsid="$Id: scsicmds.c,v 1.64 2003/11/19 06:09:37 dpgilbert Exp $" EXTERN_H_CVSID SCSICMDS_H_CVSID; +const char *scsicmds_c_cvsid="$Id: scsicmds.c,v 1.65 2003/11/20 01:02:27 dpgilbert Exp $" EXTERN_H_CVSID SCSICMDS_H_CVSID; /* for passing global control variables */ extern smartmonctrl *con; @@ -143,7 +143,7 @@ const char * scsi_get_opcode_name(UINT8 opcode) void scsi_do_sense_disect(const struct scsi_cmnd_io * io_buf, struct scsi_sense_disect * out) { - memset(out, 0, sizeof(out)); + memset(out, 0, sizeof(struct scsi_sense_disect)); if ((SCSI_STATUS_CHECK_CONDITION == io_buf->scsi_status) && (io_buf->resp_sense_len > 7)) { out->error_code = (io_buf->sensep[0] & 0x7f); @@ -157,9 +157,17 @@ void scsi_do_sense_disect(const struct scsi_cmnd_io * io_buf, static int scsiSimpleSenseFilter(const struct scsi_sense_disect * sinfo) { - if (SCSI_SK_NOT_READY == sinfo->sense_key) - return SIMPLE_ERR_NOT_READY; - else if (SCSI_SK_ILLEGAL_REQUEST == sinfo->sense_key) { + if (SCSI_SK_NOT_READY == sinfo->sense_key) { + if (SCSI_ASC_NO_MEDIUM == sinfo->asc) + return SIMPLE_ERR_NO_MEDIUM; + else if (SCSI_ASC_NOT_READY == sinfo->asc) { + if (0x1 == sinfo->ascq) + return SIMPLE_ERR_BECOMING_READY; + else + return SIMPLE_ERR_NOT_READY; + } else + return SIMPLE_ERR_NOT_READY; + } else if (SCSI_SK_ILLEGAL_REQUEST == sinfo->sense_key) { if (SCSI_ASC_UNKNOWN_OPCODE == sinfo->asc) return SIMPLE_ERR_BAD_OPCODE; else if (SCSI_ASC_UNKNOWN_FIELD == sinfo->asc) @@ -187,6 +195,10 @@ const char * scsiErrString(int scsiErr) return "badly formed scsi parameters"; case SIMPLE_ERR_BAD_RESP: return "scsi response fails sanity test"; + case SIMPLE_ERR_NO_MEDIUM: + return "no medium present"; + case SIMPLE_ERR_BECOMING_READY: + return "device will be ready soon"; default: return "unknown error"; } @@ -680,17 +692,14 @@ int scsiTestUnitReady(int device) status = _testunitready(device, &sinfo); if (0 != status) return status; - if (SCSI_SK_NOT_READY == sinfo.sense_key) - return SIMPLE_ERR_NOT_READY; - else if (SCSI_SK_UNIT_ATTENTION == sinfo.sense_key) { + + if (SCSI_SK_UNIT_ATTENTION == sinfo.sense_key) { /* power on reset, media changed, ok ... try again */ status = _testunitready(device, &sinfo); if (0 != status) return status; - if (SCSI_SK_NOT_READY == sinfo.sense_key) - return SIMPLE_ERR_BAD_FIELD; } - return 0; + return scsiSimpleSenseFilter(&sinfo); } /* Offset into mode sense (6 or 10 byte) response that actual mode page diff --git a/sm5/scsicmds.cpp b/sm5/scsicmds.cpp index 941e2dae3767b9ec81638f1d4ae5843751e16348..44177840c3cd96a1f7fa3839dcd470bd6be14be4 100644 --- a/sm5/scsicmds.cpp +++ b/sm5/scsicmds.cpp @@ -46,7 +46,7 @@ #include "utility.h" #include "extern.h" -const char *scsicmds_c_cvsid="$Id: scsicmds.cpp,v 1.64 2003/11/19 06:09:37 dpgilbert Exp $" EXTERN_H_CVSID SCSICMDS_H_CVSID; +const char *scsicmds_c_cvsid="$Id: scsicmds.cpp,v 1.65 2003/11/20 01:02:27 dpgilbert Exp $" EXTERN_H_CVSID SCSICMDS_H_CVSID; /* for passing global control variables */ extern smartmonctrl *con; @@ -143,7 +143,7 @@ const char * scsi_get_opcode_name(UINT8 opcode) void scsi_do_sense_disect(const struct scsi_cmnd_io * io_buf, struct scsi_sense_disect * out) { - memset(out, 0, sizeof(out)); + memset(out, 0, sizeof(struct scsi_sense_disect)); if ((SCSI_STATUS_CHECK_CONDITION == io_buf->scsi_status) && (io_buf->resp_sense_len > 7)) { out->error_code = (io_buf->sensep[0] & 0x7f); @@ -157,9 +157,17 @@ void scsi_do_sense_disect(const struct scsi_cmnd_io * io_buf, static int scsiSimpleSenseFilter(const struct scsi_sense_disect * sinfo) { - if (SCSI_SK_NOT_READY == sinfo->sense_key) - return SIMPLE_ERR_NOT_READY; - else if (SCSI_SK_ILLEGAL_REQUEST == sinfo->sense_key) { + if (SCSI_SK_NOT_READY == sinfo->sense_key) { + if (SCSI_ASC_NO_MEDIUM == sinfo->asc) + return SIMPLE_ERR_NO_MEDIUM; + else if (SCSI_ASC_NOT_READY == sinfo->asc) { + if (0x1 == sinfo->ascq) + return SIMPLE_ERR_BECOMING_READY; + else + return SIMPLE_ERR_NOT_READY; + } else + return SIMPLE_ERR_NOT_READY; + } else if (SCSI_SK_ILLEGAL_REQUEST == sinfo->sense_key) { if (SCSI_ASC_UNKNOWN_OPCODE == sinfo->asc) return SIMPLE_ERR_BAD_OPCODE; else if (SCSI_ASC_UNKNOWN_FIELD == sinfo->asc) @@ -187,6 +195,10 @@ const char * scsiErrString(int scsiErr) return "badly formed scsi parameters"; case SIMPLE_ERR_BAD_RESP: return "scsi response fails sanity test"; + case SIMPLE_ERR_NO_MEDIUM: + return "no medium present"; + case SIMPLE_ERR_BECOMING_READY: + return "device will be ready soon"; default: return "unknown error"; } @@ -680,17 +692,14 @@ int scsiTestUnitReady(int device) status = _testunitready(device, &sinfo); if (0 != status) return status; - if (SCSI_SK_NOT_READY == sinfo.sense_key) - return SIMPLE_ERR_NOT_READY; - else if (SCSI_SK_UNIT_ATTENTION == sinfo.sense_key) { + + if (SCSI_SK_UNIT_ATTENTION == sinfo.sense_key) { /* power on reset, media changed, ok ... try again */ status = _testunitready(device, &sinfo); if (0 != status) return status; - if (SCSI_SK_NOT_READY == sinfo.sense_key) - return SIMPLE_ERR_BAD_FIELD; } - return 0; + return scsiSimpleSenseFilter(&sinfo); } /* Offset into mode sense (6 or 10 byte) response that actual mode page diff --git a/sm5/scsiprint.c b/sm5/scsiprint.c index c0fcb28d52d64621cdd5b99cefb9d7e33521a75e..5323b0f2ac22985f9117b17d8f59fc781e9cd159 100644 --- a/sm5/scsiprint.c +++ b/sm5/scsiprint.c @@ -40,7 +40,7 @@ #define GBUF_SIZE 65535 -const char* scsiprint_c_cvsid="$Id: scsiprint.c,v 1.67 2003/11/19 07:50:39 ballen4705 Exp $" +const char* scsiprint_c_cvsid="$Id: scsiprint.c,v 1.68 2003/11/20 01:03:26 dpgilbert Exp $" EXTERN_H_CVSID SCSICMDS_H_CVSID SCSIPRINT_H_CVSID SMARTCTL_H_CVSID UTILITY_H_CVSID; // control block which points to external global control variables @@ -605,6 +605,7 @@ static int scsiGetDriveInfo(int device, UINT8 * peripheral_type, int all) int err, iec_err, len, val; int is_tape = 0; int peri_dt = 0; + int returnval=0; memset(gBuf, 0, 36); if ((err = scsiStdInquiry(device, gBuf, 36))) { @@ -688,14 +689,22 @@ static int scsiGetDriveInfo(int device, UINT8 * peripheral_type, int all) if ((err = scsiTestUnitReady(device))) { if (SIMPLE_ERR_NOT_READY == err) { QUIETON(con); - pout("device is NOT READY (media absent, spun down, etc)\n"); + pout("device is NOT READY (e.g. spun down, busy)\n"); + QUIETOFF(con); + } else if (SIMPLE_ERR_NO_MEDIUM == err) { + QUIETON(con); + pout("NO MEDIUM present on device\n"); + QUIETOFF(con); + } else if (SIMPLE_ERR_BECOMING_READY == err) { + QUIETON(con); + pout("device becoming ready (wait)\n"); QUIETOFF(con); } else { QUIETON(con); pout("device Test Unit Ready [%s]\n", scsiErrString(err)); QUIETOFF(con); } - return 0; + failuretest(MANDATORY_CMD, returnval|=FAILID); } if (iec_err) { @@ -816,7 +825,7 @@ int scsiPrintMain(int fd) { int checkedSupportedLogPages = 0; UINT8 peripheral_type = 0; - int returnval=0; + int returnval = 0; int res, durationSec; if (scsiGetDriveInfo(fd, &peripheral_type, con->driveinfo)) { diff --git a/sm5/scsiprint.cpp b/sm5/scsiprint.cpp index a2544dec69c8c733c4053d493752590b4983c387..5993dafa4b6d4dd1cbfa9ef137a0b7525c9dd09d 100644 --- a/sm5/scsiprint.cpp +++ b/sm5/scsiprint.cpp @@ -40,7 +40,7 @@ #define GBUF_SIZE 65535 -const char* scsiprint_c_cvsid="$Id: scsiprint.cpp,v 1.67 2003/11/19 07:50:39 ballen4705 Exp $" +const char* scsiprint_c_cvsid="$Id: scsiprint.cpp,v 1.68 2003/11/20 01:03:26 dpgilbert Exp $" EXTERN_H_CVSID SCSICMDS_H_CVSID SCSIPRINT_H_CVSID SMARTCTL_H_CVSID UTILITY_H_CVSID; // control block which points to external global control variables @@ -605,6 +605,7 @@ static int scsiGetDriveInfo(int device, UINT8 * peripheral_type, int all) int err, iec_err, len, val; int is_tape = 0; int peri_dt = 0; + int returnval=0; memset(gBuf, 0, 36); if ((err = scsiStdInquiry(device, gBuf, 36))) { @@ -688,14 +689,22 @@ static int scsiGetDriveInfo(int device, UINT8 * peripheral_type, int all) if ((err = scsiTestUnitReady(device))) { if (SIMPLE_ERR_NOT_READY == err) { QUIETON(con); - pout("device is NOT READY (media absent, spun down, etc)\n"); + pout("device is NOT READY (e.g. spun down, busy)\n"); + QUIETOFF(con); + } else if (SIMPLE_ERR_NO_MEDIUM == err) { + QUIETON(con); + pout("NO MEDIUM present on device\n"); + QUIETOFF(con); + } else if (SIMPLE_ERR_BECOMING_READY == err) { + QUIETON(con); + pout("device becoming ready (wait)\n"); QUIETOFF(con); } else { QUIETON(con); pout("device Test Unit Ready [%s]\n", scsiErrString(err)); QUIETOFF(con); } - return 0; + failuretest(MANDATORY_CMD, returnval|=FAILID); } if (iec_err) { @@ -816,7 +825,7 @@ int scsiPrintMain(int fd) { int checkedSupportedLogPages = 0; UINT8 peripheral_type = 0; - int returnval=0; + int returnval = 0; int res, durationSec; if (scsiGetDriveInfo(fd, &peripheral_type, con->driveinfo)) {