[SCSI] aacraid: do not set valid bit in sense information
authorSalyzyn, Mark <Mark_Salyzyn@adaptec.com>
Wed, 6 Feb 2008 21:54:12 +0000 (13:54 -0800)
committerJames Bottomley <James.Bottomley@HansenPartnership.com>
Fri, 8 Feb 2008 00:31:51 +0000 (18:31 -0600)
Luben Tuikov [mailto:ltuikov@yahoo.com] sez:
> Just as in your case and Tony's case, which I presume
> uses the same RAID firmware vendor, it would've
> probably been better if the RAID firmware vendor
> fixed the firmware to not set the VALID bit if the
> INFORMATION field is not valid.

Point taken regarding the aacraid driver. Dropped the VALID bit, and
then did some cleanup/simplification of the set_sense procedure and
the associated parameters. Mike did some preliminary tests when the
VALID bit was dropped before the 'Re: [PATCH] [SCSI] sd: make error
handling more robust' patches came on the scene. The change in the
SCSI subsystem does make this enclosed aacraid patch unnecessary, so
this aacraid patch is merely post battle ground cleanup. If the
simplification is an issue, repugnant, too much for a back-port to the
stable trees or clouds the point, this patch could be happily
distilled down to:

diff -ru a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c
--- a/drivers/scsi/aacraid/aachba.c     2008-02-06 16:26:45.834938955 -0500
+++ b/drivers/scsi/aacraid/aachba.c     2008-02-06 16:32:01.109035329 -0500
@@ -865,7 +865,7 @@
                         u32 residue)
 {
-        sense_buf[0] = 0xF0;    /* Sense data valid, err code 70h (current error) */
+        sense_buf[0] = 0x70;    /* Sense data invalid, err code 70h (current error) */
         sense_buf[1] = 0;       /* Segment number, always zero */

         if (incorrect_length) {

Signed-off-by: Mark Salyzyn <aacraid@adaptec.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
drivers/scsi/aacraid/aachba.c

index d7235f4..bfd0e64 100644 (file)
@@ -859,44 +859,31 @@ static int setinqserial(struct aac_dev *dev, void *data, int cid)
                        le32_to_cpu(dev->adapter_info.serial[0]), cid);
 }
 
-static void set_sense(u8 *sense_buf, u8 sense_key, u8 sense_code,
-                     u8 a_sense_code, u8 incorrect_length,
-                     u8 bit_pointer, u16 field_pointer,
-                     u32 residue)
+static inline void set_sense(struct sense_data *sense_data, u8 sense_key,
+       u8 sense_code, u8 a_sense_code, u8 bit_pointer, u16 field_pointer)
 {
-       sense_buf[0] = 0xF0;    /* Sense data valid, err code 70h (current error) */
+       u8 *sense_buf = (u8 *)sense_data;
+       /* Sense data valid, err code 70h */
+       sense_buf[0] = 0x70; /* No info field */
        sense_buf[1] = 0;       /* Segment number, always zero */
 
-       if (incorrect_length) {
-               sense_buf[2] = sense_key | 0x20;/* Set ILI bit | sense key */
-               sense_buf[3] = BYTE3(residue);
-               sense_buf[4] = BYTE2(residue);
-               sense_buf[5] = BYTE1(residue);
-               sense_buf[6] = BYTE0(residue);
-       } else
-               sense_buf[2] = sense_key;       /* Sense key */
-
-       if (sense_key == ILLEGAL_REQUEST)
-               sense_buf[7] = 10;      /* Additional sense length */
-       else
-               sense_buf[7] = 6;       /* Additional sense length */
+       sense_buf[2] = sense_key;       /* Sense key */
 
        sense_buf[12] = sense_code;     /* Additional sense code */
        sense_buf[13] = a_sense_code;   /* Additional sense code qualifier */
+
        if (sense_key == ILLEGAL_REQUEST) {
-               sense_buf[15] = 0;
+               sense_buf[7] = 10;      /* Additional sense length */
 
-               if (sense_code == SENCODE_INVALID_PARAM_FIELD)
-                       sense_buf[15] = 0x80;/* Std sense key specific field */
+               sense_buf[15] = bit_pointer;
                /* Illegal parameter is in the parameter block */
-
                if (sense_code == SENCODE_INVALID_CDB_FIELD)
-                       sense_buf[15] = 0xc0;/* Std sense key specific field */
+                       sense_buf[15] |= 0xc0;/* Std sense key specific field */
                /* Illegal parameter is in the CDB block */
-               sense_buf[15] |= bit_pointer;
                sense_buf[16] = field_pointer >> 8;     /* MSB */
                sense_buf[17] = field_pointer;          /* LSB */
-       }
+       } else
+               sense_buf[7] = 6;       /* Additional sense length */
 }
 
 static int aac_bounds_32(struct aac_dev * dev, struct scsi_cmnd * cmd, u64 lba)
@@ -906,11 +893,9 @@ static int aac_bounds_32(struct aac_dev * dev, struct scsi_cmnd * cmd, u64 lba)
                dprintk((KERN_DEBUG "aacraid: Illegal lba\n"));
                cmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 |
                        SAM_STAT_CHECK_CONDITION;
-               set_sense((u8 *) &dev->fsa_dev[cid].sense_data,
-                           HARDWARE_ERROR,
-                           SENCODE_INTERNAL_TARGET_FAILURE,
-                           ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0,
-                           0, 0);
+               set_sense(&dev->fsa_dev[cid].sense_data,
+                 HARDWARE_ERROR, SENCODE_INTERNAL_TARGET_FAILURE,
+                 ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0);
                memcpy(cmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
                       min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data),
                             SCSI_SENSE_BUFFERSIZE));
@@ -1520,11 +1505,9 @@ static void io_callback(void *context, struct fib * fibptr)
                  le32_to_cpu(readreply->status));
 #endif
                scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION;
-               set_sense((u8 *) &dev->fsa_dev[cid].sense_data,
-                                   HARDWARE_ERROR,
-                                   SENCODE_INTERNAL_TARGET_FAILURE,
-                                   ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0,
-                                   0, 0);
+               set_sense(&dev->fsa_dev[cid].sense_data,
+                 HARDWARE_ERROR, SENCODE_INTERNAL_TARGET_FAILURE,
+                 ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0);
                memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
                       min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data),
                             SCSI_SENSE_BUFFERSIZE));
@@ -1733,11 +1716,9 @@ static void synchronize_callback(void *context, struct fib *fibptr)
                     le32_to_cpu(synchronizereply->status));
                cmd->result = DID_OK << 16 |
                        COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION;
-               set_sense((u8 *)&dev->fsa_dev[cid].sense_data,
-                                   HARDWARE_ERROR,
-                                   SENCODE_INTERNAL_TARGET_FAILURE,
-                                   ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0,
-                                   0, 0);
+               set_sense(&dev->fsa_dev[cid].sense_data,
+                 HARDWARE_ERROR, SENCODE_INTERNAL_TARGET_FAILURE,
+                 ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0);
                memcpy(cmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
                       min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data),
                             SCSI_SENSE_BUFFERSIZE));
@@ -1945,10 +1926,9 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
        {
                dprintk((KERN_WARNING "Only INQUIRY & TUR command supported for controller, rcvd = 0x%x.\n", scsicmd->cmnd[0]));
                scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION;
-               set_sense((u8 *) &dev->fsa_dev[cid].sense_data,
-                           ILLEGAL_REQUEST,
-                           SENCODE_INVALID_COMMAND,
-                           ASENCODE_INVALID_COMMAND, 0, 0, 0, 0);
+               set_sense(&dev->fsa_dev[cid].sense_data,
+                 ILLEGAL_REQUEST, SENCODE_INVALID_COMMAND,
+                 ASENCODE_INVALID_COMMAND, 0, 0);
                memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
                       min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data),
                             SCSI_SENSE_BUFFERSIZE));
@@ -1995,10 +1975,9 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
                                scsicmd->result = DID_OK << 16 |
                                  COMMAND_COMPLETE << 8 |
                                  SAM_STAT_CHECK_CONDITION;
-                               set_sense((u8 *) &dev->fsa_dev[cid].sense_data,
-                                 ILLEGAL_REQUEST,
-                                 SENCODE_INVALID_CDB_FIELD,
-                                 ASENCODE_NO_SENSE, 0, 7, 2, 0);
+                               set_sense(&dev->fsa_dev[cid].sense_data,
+                                 ILLEGAL_REQUEST, SENCODE_INVALID_CDB_FIELD,
+                                 ASENCODE_NO_SENSE, 7, 2);
                                memcpy(scsicmd->sense_buffer,
                                  &dev->fsa_dev[cid].sense_data,
                                  min_t(size_t,
@@ -2254,9 +2233,9 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
                         */
                        dprintk((KERN_WARNING "Unhandled SCSI Command: 0x%x.\n", scsicmd->cmnd[0]));
                        scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION;
-                       set_sense((u8 *) &dev->fsa_dev[cid].sense_data,
-                               ILLEGAL_REQUEST, SENCODE_INVALID_COMMAND,
-                               ASENCODE_INVALID_COMMAND, 0, 0, 0, 0);
+                       set_sense(&dev->fsa_dev[cid].sense_data,
+                         ILLEGAL_REQUEST, SENCODE_INVALID_COMMAND,
+                         ASENCODE_INVALID_COMMAND, 0, 0);
                        memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
                                min_t(size_t,
                                      sizeof(dev->fsa_dev[cid].sense_data),