[SCSI] aacraid: do not set valid bit in sense information
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>
This commit is contained in:
Родитель
9927c68864
Коммит
8e31e607ea
|
@ -859,44 +859,31 @@ static int setinqserial(struct aac_dev *dev, void *data, int cid)
|
||||||
le32_to_cpu(dev->adapter_info.serial[0]), cid);
|
le32_to_cpu(dev->adapter_info.serial[0]), cid);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void set_sense(u8 *sense_buf, u8 sense_key, u8 sense_code,
|
static inline void set_sense(struct sense_data *sense_data, u8 sense_key,
|
||||||
u8 a_sense_code, u8 incorrect_length,
|
u8 sense_code, u8 a_sense_code, u8 bit_pointer, u16 field_pointer)
|
||||||
u8 bit_pointer, u16 field_pointer,
|
|
||||||
u32 residue)
|
|
||||||
{
|
{
|
||||||
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 */
|
sense_buf[1] = 0; /* Segment number, always zero */
|
||||||
|
|
||||||
if (incorrect_length) {
|
sense_buf[2] = sense_key; /* Sense key */
|
||||||
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[12] = sense_code; /* Additional sense code */
|
sense_buf[12] = sense_code; /* Additional sense code */
|
||||||
sense_buf[13] = a_sense_code; /* Additional sense code qualifier */
|
sense_buf[13] = a_sense_code; /* Additional sense code qualifier */
|
||||||
|
|
||||||
if (sense_key == ILLEGAL_REQUEST) {
|
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] = bit_pointer;
|
||||||
sense_buf[15] = 0x80;/* Std sense key specific field */
|
|
||||||
/* Illegal parameter is in the parameter block */
|
/* Illegal parameter is in the parameter block */
|
||||||
|
|
||||||
if (sense_code == SENCODE_INVALID_CDB_FIELD)
|
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 */
|
/* Illegal parameter is in the CDB block */
|
||||||
sense_buf[15] |= bit_pointer;
|
|
||||||
sense_buf[16] = field_pointer >> 8; /* MSB */
|
sense_buf[16] = field_pointer >> 8; /* MSB */
|
||||||
sense_buf[17] = field_pointer; /* LSB */
|
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)
|
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"));
|
dprintk((KERN_DEBUG "aacraid: Illegal lba\n"));
|
||||||
cmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 |
|
cmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 |
|
||||||
SAM_STAT_CHECK_CONDITION;
|
SAM_STAT_CHECK_CONDITION;
|
||||||
set_sense((u8 *) &dev->fsa_dev[cid].sense_data,
|
set_sense(&dev->fsa_dev[cid].sense_data,
|
||||||
HARDWARE_ERROR,
|
HARDWARE_ERROR, SENCODE_INTERNAL_TARGET_FAILURE,
|
||||||
SENCODE_INTERNAL_TARGET_FAILURE,
|
ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0);
|
||||||
ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0,
|
|
||||||
0, 0);
|
|
||||||
memcpy(cmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
|
memcpy(cmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
|
||||||
min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data),
|
min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data),
|
||||||
SCSI_SENSE_BUFFERSIZE));
|
SCSI_SENSE_BUFFERSIZE));
|
||||||
|
@ -1520,11 +1505,9 @@ static void io_callback(void *context, struct fib * fibptr)
|
||||||
le32_to_cpu(readreply->status));
|
le32_to_cpu(readreply->status));
|
||||||
#endif
|
#endif
|
||||||
scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION;
|
scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION;
|
||||||
set_sense((u8 *) &dev->fsa_dev[cid].sense_data,
|
set_sense(&dev->fsa_dev[cid].sense_data,
|
||||||
HARDWARE_ERROR,
|
HARDWARE_ERROR, SENCODE_INTERNAL_TARGET_FAILURE,
|
||||||
SENCODE_INTERNAL_TARGET_FAILURE,
|
ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0);
|
||||||
ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0,
|
|
||||||
0, 0);
|
|
||||||
memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
|
memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
|
||||||
min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data),
|
min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data),
|
||||||
SCSI_SENSE_BUFFERSIZE));
|
SCSI_SENSE_BUFFERSIZE));
|
||||||
|
@ -1733,11 +1716,9 @@ static void synchronize_callback(void *context, struct fib *fibptr)
|
||||||
le32_to_cpu(synchronizereply->status));
|
le32_to_cpu(synchronizereply->status));
|
||||||
cmd->result = DID_OK << 16 |
|
cmd->result = DID_OK << 16 |
|
||||||
COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION;
|
COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION;
|
||||||
set_sense((u8 *)&dev->fsa_dev[cid].sense_data,
|
set_sense(&dev->fsa_dev[cid].sense_data,
|
||||||
HARDWARE_ERROR,
|
HARDWARE_ERROR, SENCODE_INTERNAL_TARGET_FAILURE,
|
||||||
SENCODE_INTERNAL_TARGET_FAILURE,
|
ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0);
|
||||||
ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0,
|
|
||||||
0, 0);
|
|
||||||
memcpy(cmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
|
memcpy(cmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
|
||||||
min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data),
|
min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data),
|
||||||
SCSI_SENSE_BUFFERSIZE));
|
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]));
|
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;
|
scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION;
|
||||||
set_sense((u8 *) &dev->fsa_dev[cid].sense_data,
|
set_sense(&dev->fsa_dev[cid].sense_data,
|
||||||
ILLEGAL_REQUEST,
|
ILLEGAL_REQUEST, SENCODE_INVALID_COMMAND,
|
||||||
SENCODE_INVALID_COMMAND,
|
ASENCODE_INVALID_COMMAND, 0, 0);
|
||||||
ASENCODE_INVALID_COMMAND, 0, 0, 0, 0);
|
|
||||||
memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
|
memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
|
||||||
min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data),
|
min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data),
|
||||||
SCSI_SENSE_BUFFERSIZE));
|
SCSI_SENSE_BUFFERSIZE));
|
||||||
|
@ -1995,10 +1975,9 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
|
||||||
scsicmd->result = DID_OK << 16 |
|
scsicmd->result = DID_OK << 16 |
|
||||||
COMMAND_COMPLETE << 8 |
|
COMMAND_COMPLETE << 8 |
|
||||||
SAM_STAT_CHECK_CONDITION;
|
SAM_STAT_CHECK_CONDITION;
|
||||||
set_sense((u8 *) &dev->fsa_dev[cid].sense_data,
|
set_sense(&dev->fsa_dev[cid].sense_data,
|
||||||
ILLEGAL_REQUEST,
|
ILLEGAL_REQUEST, SENCODE_INVALID_CDB_FIELD,
|
||||||
SENCODE_INVALID_CDB_FIELD,
|
ASENCODE_NO_SENSE, 7, 2);
|
||||||
ASENCODE_NO_SENSE, 0, 7, 2, 0);
|
|
||||||
memcpy(scsicmd->sense_buffer,
|
memcpy(scsicmd->sense_buffer,
|
||||||
&dev->fsa_dev[cid].sense_data,
|
&dev->fsa_dev[cid].sense_data,
|
||||||
min_t(size_t,
|
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]));
|
dprintk((KERN_WARNING "Unhandled SCSI Command: 0x%x.\n", scsicmd->cmnd[0]));
|
||||||
scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION;
|
scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION;
|
||||||
set_sense((u8 *) &dev->fsa_dev[cid].sense_data,
|
set_sense(&dev->fsa_dev[cid].sense_data,
|
||||||
ILLEGAL_REQUEST, SENCODE_INVALID_COMMAND,
|
ILLEGAL_REQUEST, SENCODE_INVALID_COMMAND,
|
||||||
ASENCODE_INVALID_COMMAND, 0, 0, 0, 0);
|
ASENCODE_INVALID_COMMAND, 0, 0);
|
||||||
memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
|
memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
|
||||||
min_t(size_t,
|
min_t(size_t,
|
||||||
sizeof(dev->fsa_dev[cid].sense_data),
|
sizeof(dev->fsa_dev[cid].sense_data),
|
||||||
|
|
Загрузка…
Ссылка в новой задаче