Skip to content
Snippets Groups Projects
Commit 4e85e055 authored by dpgilbert's avatar dpgilbert
Browse files

more fine tuning on scsi "not ready", (default action is to exit)

git-svn-id: https://smartmontools.svn.sourceforge.net/svnroot/smartmontools/trunk@1266 4ea69e1a-61f1-4043-bf83-b5c94c648137
parent edcb9631
Branches
No related tags found
No related merge requests found
......@@ -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)
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) {
} 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
......
......@@ -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)
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) {
} 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
......
......@@ -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) {
......
......@@ -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) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment