From 4e85e0553b4c56b3578afc244b3b1653194bf00d Mon Sep 17 00:00:00 2001
From: dpgilbert <dpgilbert@4ea69e1a-61f1-4043-bf83-b5c94c648137>
Date: Thu, 20 Nov 2003 01:03:26 +0000
Subject: [PATCH] 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
---
 sm5/scsicmds.c    | 31 ++++++++++++++++++++-----------
 sm5/scsicmds.cpp  | 31 ++++++++++++++++++++-----------
 sm5/scsiprint.c   | 17 +++++++++++++----
 sm5/scsiprint.cpp | 17 +++++++++++++----
 4 files changed, 66 insertions(+), 30 deletions(-)

diff --git a/sm5/scsicmds.c b/sm5/scsicmds.c
index 3eddcddc7..155d3a744 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 941e2dae3..44177840c 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 c0fcb28d5..5323b0f2a 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 a2544dec6..5993dafa4 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)) {
-- 
GitLab