public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Luben Tuikov <luben@splentec.com>
To: linux-scsi <linux-scsi@vger.kernel.org>,
	linux-kernel <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH] scsi: extracting the sense key, ASC and ASCQ
Date: Wed, 13 Nov 2002 16:49:04 -0500	[thread overview]
Message-ID: <3DD2C8D0.803DC1AF@splentec.com> (raw)
In-Reply-To: 3DD2C4D8.4E8B7A7D@splentec.com

Linewrap at 120... DOH!


diff -Nru -X /usr/src/dontdiff linux-2.5.47/drivers/scsi/scsi.c linux/drivers/scsi/scsi.c
--- linux-2.5.47/drivers/scsi/scsi.c	Sun Nov 10 22:28:16 2002
+++ linux/drivers/scsi/scsi.c	Wed Nov 13 14:00:51 2002
@@ -2257,7 +2257,7 @@
 				       SCpnt->internal_timeout,
 
 				       SCpnt->cmnd[0],
-				       SCpnt->sense_buffer[2],
+				       get_sense_key(SCpnt->sense_buffer),
 				       SCpnt->result);
 			}
 		}
diff -Nru -X /usr/src/dontdiff linux-2.5.47/drivers/scsi/scsi.h linux/drivers/scsi/scsi.h
--- linux-2.5.47/drivers/scsi/scsi.h	Sun Nov 10 22:28:06 2002
+++ linux/drivers/scsi/scsi.h	Wed Nov 13 13:55:52 2002
@@ -133,6 +133,33 @@
 #define sense_error(sense)  ((sense) & 0xf)
 #define sense_valid(sense)  ((sense) & 0x80);
 
+/* Support for descriptor format sense data.
+ */
+static inline u8 get_sense_key(unsigned char *sense_buf)
+{
+	return (sense_buf[0]&2) ? sense_buf[1]&0xf : sense_buf[2]&0xf;
+}
+
+static inline u8 get_asc(unsigned char *sense_buf)
+{
+	if (sense_buf[0]&2)
+		return sense_buf[2];
+	else if (sense_buf[7]>4)
+		return sense_buf[12];
+	else
+		return 0;
+}
+
+static inline u8 get_ascq(unsigned char *sense_buf)
+{
+	if (sense_buf[0]&2)
+		return sense_buf[3];
+	else if (sense_buf[7]>5)
+		return sense_buf[13];
+	else
+		return 0;
+}
+
 #define NEEDS_RETRY     0x2001
 #define SUCCESS         0x2002
 #define FAILED          0x2003
diff -Nru -X /usr/src/dontdiff linux-2.5.47/drivers/scsi/scsi_error.c linux/drivers/scsi/scsi_error.c
--- linux-2.5.47/drivers/scsi/scsi_error.c	Sun Nov 10 22:28:02 2002
+++ linux/drivers/scsi/scsi_error.c	Wed Nov 13 14:04:24 2002
@@ -299,13 +299,15 @@
  **/
 static int scsi_check_sense(Scsi_Cmnd *scmd)
 {
+	u8 sense_key = get_sense_key(scmd->sense_buffer);
+	u8 asc  = get_asc(scmd->sense_buffer);
+	u8 ascq = get_ascq(scmd->sense_buffer);
+	
 	if (!SCSI_SENSE_VALID(scmd)) {
 		return FAILED;
 	}
-	if (scmd->sense_buffer[2] & 0xe0)
-		return SUCCESS;
 
-	switch (scmd->sense_buffer[2] & 0xf) {
+	switch (sense_key) {
 	case NO_SENSE:
 		return SUCCESS;
 	case RECOVERED_ERROR:
@@ -329,8 +331,7 @@
 		 * if the device is in the process of becoming ready, we 
 		 * should retry.
 		 */
-		if ((scmd->sense_buffer[12] == 0x04) &&
-			(scmd->sense_buffer[13] == 0x01)) {
+		if (asc == 0x04 && ascq == 0x01) {
 			return NEEDS_RETRY;
 		}
 		return SUCCESS;
diff -Nru -X /usr/src/dontdiff linux-2.5.47/drivers/scsi/scsi_ioctl.c linux/drivers/scsi/scsi_ioctl.c
--- linux-2.5.47/drivers/scsi/scsi_ioctl.c	Sun Nov 10 22:28:31 2002
+++ linux/drivers/scsi/scsi_ioctl.c	Wed Nov 13 14:06:04 2002
@@ -108,7 +108,7 @@
 	SCSI_LOG_IOCTL(2, printk("Ioctl returned  0x%x\n", SRpnt->sr_result));
 
 	if (driver_byte(SRpnt->sr_result) != 0)
-		switch (SRpnt->sr_sense_buffer[2] & 0xf) {
+		switch (get_sense_key(SRpnt->sr_sense_buffer)) {
 		case ILLEGAL_REQUEST:
 			if (cmd[0] == ALLOW_MEDIUM_REMOVAL)
 				dev->lockable = 0;
@@ -134,10 +134,10 @@
 			       dev->id,
 			       dev->lun,
 			       SRpnt->sr_result);
-			printk("\tSense class %x, sense error %x, extended sense %x\n",
+			printk("\tSense class %x, sense error %x, sense key %x\n",
 			       sense_class(SRpnt->sr_sense_buffer[0]),
 			       sense_error(SRpnt->sr_sense_buffer[0]),
-			       SRpnt->sr_sense_buffer[2] & 0xf);
+			       get_sense_key(SRpnt->sr_sense_buffer));
 
 		}
 
diff -Nru -X /usr/src/dontdiff linux-2.5.47/drivers/scsi/scsi_lib.c linux/drivers/scsi/scsi_lib.c
--- linux-2.5.47/drivers/scsi/scsi_lib.c	Sun Nov 10 22:28:14 2002
+++ linux/drivers/scsi/scsi_lib.c	Wed Nov 13 14:14:52 2002
@@ -581,17 +581,17 @@
 			}
 #endif
 		}
-		if ((SCpnt->sense_buffer[0] & 0x7f) == 0x70) {
+		if (SCSI_SENSE_VALID(SCpnt)) {
 			/*
 			 * If the device is in the process of becoming ready,
 			 * retry.
 			 */
-			if (SCpnt->sense_buffer[12] == 0x04 &&
-			    SCpnt->sense_buffer[13] == 0x01) {
+			if (get_asc(SCpnt->sense_buffer) == 0x04 &&
+			    get_ascq(SCpnt->sense_buffer) == 0x01) {
 				scsi_queue_next_request(q, SCpnt);
 				return;
 			}
-			if ((SCpnt->sense_buffer[2] & 0xf) == UNIT_ATTENTION) {
+			if (get_sense_key(SCpnt->sense_buffer) == UNIT_ATTENTION) {
 				if (SCpnt->device->removable) {
 					/* detected disc change.  set a bit 
 					 * and quietly refuse further access.
@@ -618,7 +618,7 @@
 		 * past the end of the disk.
 		 */
 
-		switch (SCpnt->sense_buffer[2]) {
+		switch (get_sense_key(SCpnt->sense_buffer)) {
 		case ILLEGAL_REQUEST:
 			if (SCpnt->device->ten) {
 				SCpnt->device->ten = 0;
diff -Nru -X /usr/src/dontdiff linux-2.5.47/drivers/scsi/scsi_scan.c linux/drivers/scsi/scsi_scan.c
--- linux-2.5.47/drivers/scsi/scsi_scan.c	Sun Nov 10 22:28:29 2002
+++ linux/drivers/scsi/scsi_scan.c	Wed Nov 13 14:10:20 2002
@@ -1205,9 +1205,9 @@
 
 	if (sreq->sr_result) {
 		if ((driver_byte(sreq->sr_result) & DRIVER_SENSE) != 0 &&
-		    (sreq->sr_sense_buffer[2] & 0xf) == UNIT_ATTENTION &&
-		    sreq->sr_sense_buffer[12] == 0x28 &&
-		    sreq->sr_sense_buffer[13] == 0) {
+		    get_sense_key(sreq->sr_sense_buffer) == UNIT_ATTENTION &&
+		    get_asc(sreq->sr_sense_buffer) == 0x28 &&
+		    get_ascq(sreq->sr_sense_buffer) == 0) {
 			/* not-ready to ready transition - good */
 			/* dpg: bogus? INQUIRY never returns UNIT_ATTENTION */
 		} else
@@ -1830,7 +1830,7 @@
 				?  "failed" : "successful", retries,
 				sreq->sr_result));
 		if (sreq->sr_result == 0
-		    || sreq->sr_sense_buffer[2] != UNIT_ATTENTION)
+		    || get_sense_key(sreq->sr_sense_buffer) != UNIT_ATTENTION)
 			break;
 	}
 	scsi_release_commandblocks(sdevscan);
diff -Nru -X /usr/src/dontdiff linux-2.5.47/drivers/scsi/scsiiom.c linux/drivers/scsi/scsiiom.c
--- linux-2.5.47/drivers/scsi/scsiiom.c	Sun Nov 10 22:28:03 2002
+++ linux/drivers/scsi/scsiiom.c	Wed Nov 13 14:12:01 2002
@@ -1380,7 +1380,7 @@
 	pSRB->AdaptStatus = 0;
 	pSRB->TargetStatus = CHECK_CONDITION << 1;
 #ifdef DC390_REMOVABLEDEBUG
-	switch (pcmd->sense_buffer[2] & 0x0f)
+	switch (get_sense_key(pcmd->sense_buffer))
 	{	    
 	 case NOT_READY: printk (KERN_INFO "DC390: ReqSense: NOT_READY (Cmnd = 0x%02x, Dev = %i-%i, Stat = %i, Scan = %i)\n",
 				 pcmd->cmnd[0], pDCB->TargetID, pDCB->TargetLUN,
@@ -1584,8 +1584,8 @@
 	    else printk ("\n");
 #endif
 	    if( (host_byte(pcmd->result) != DID_OK && !(status_byte(pcmd->result) & CHECK_CONDITION) && !(status_byte(pcmd->result) & BUSY)) ||
-	       ((driver_byte(pcmd->result) & DRIVER_SENSE) && (pcmd->sense_buffer[0] & 0x70) == 0x70 &&
-		(pcmd->sense_buffer[2] & 0xf) == ILLEGAL_REQUEST) || host_byte(pcmd->result) & DID_ERROR )
+	       ((driver_byte(pcmd->result) & DRIVER_SENSE) && SCSI_SENSE_VALID(pcmd->sense_buffer) &&
+		get_sense_key(pcmd->sense_buffer) == ILLEGAL_REQUEST) || host_byte(pcmd->result) & DID_ERROR )
 	    {
 	       /* device not present: remove */ 
 	       //dc390_Going_remove (pDCB, pSRB);

      reply	other threads:[~2002-11-13 21:42 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-11-13 21:32 [PATCH] scsi: extracting the sense key, ASC and ASCQ Luben Tuikov
2002-11-13 21:49 ` Luben Tuikov [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=3DD2C8D0.803DC1AF@splentec.com \
    --to=luben@splentec.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-scsi@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox