aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/aacraid
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/aacraid')
-rw-r--r--drivers/scsi/aacraid/aachba.c81
1 files changed, 30 insertions, 51 deletions
diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c
index d7235f42cf5f..bfd0e64964ac 100644
--- a/drivers/scsi/aacraid/aachba.c
+++ b/drivers/scsi/aacraid/aachba.c
@@ -859,44 +859,31 @@ static int setinqserial(struct aac_dev *dev, void *data, int cid)
859 le32_to_cpu(dev->adapter_info.serial[0]), cid); 859 le32_to_cpu(dev->adapter_info.serial[0]), cid);
860} 860}
861 861
862static void set_sense(u8 *sense_buf, u8 sense_key, u8 sense_code, 862static inline void set_sense(struct sense_data *sense_data, u8 sense_key,
863 u8 a_sense_code, u8 incorrect_length, 863 u8 sense_code, u8 a_sense_code, u8 bit_pointer, u16 field_pointer)
864 u8 bit_pointer, u16 field_pointer,
865 u32 residue)
866{ 864{
867 sense_buf[0] = 0xF0; /* Sense data valid, err code 70h (current error) */ 865 u8 *sense_buf = (u8 *)sense_data;
866 /* Sense data valid, err code 70h */
867 sense_buf[0] = 0x70; /* No info field */
868 sense_buf[1] = 0; /* Segment number, always zero */ 868 sense_buf[1] = 0; /* Segment number, always zero */
869 869
870 if (incorrect_length) { 870 sense_buf[2] = sense_key; /* Sense key */
871 sense_buf[2] = sense_key | 0x20;/* Set ILI bit | sense key */
872 sense_buf[3] = BYTE3(residue);
873 sense_buf[4] = BYTE2(residue);
874 sense_buf[5] = BYTE1(residue);
875 sense_buf[6] = BYTE0(residue);
876 } else
877 sense_buf[2] = sense_key; /* Sense key */
878
879 if (sense_key == ILLEGAL_REQUEST)
880 sense_buf[7] = 10; /* Additional sense length */
881 else
882 sense_buf[7] = 6; /* Additional sense length */
883 871
884 sense_buf[12] = sense_code; /* Additional sense code */ 872 sense_buf[12] = sense_code; /* Additional sense code */
885 sense_buf[13] = a_sense_code; /* Additional sense code qualifier */ 873 sense_buf[13] = a_sense_code; /* Additional sense code qualifier */
874
886 if (sense_key == ILLEGAL_REQUEST) { 875 if (sense_key == ILLEGAL_REQUEST) {
887 sense_buf[15] = 0; 876 sense_buf[7] = 10; /* Additional sense length */
888 877
889 if (sense_code == SENCODE_INVALID_PARAM_FIELD) 878 sense_buf[15] = bit_pointer;
890 sense_buf[15] = 0x80;/* Std sense key specific field */
891 /* Illegal parameter is in the parameter block */ 879 /* Illegal parameter is in the parameter block */
892
893 if (sense_code == SENCODE_INVALID_CDB_FIELD) 880 if (sense_code == SENCODE_INVALID_CDB_FIELD)
894 sense_buf[15] = 0xc0;/* Std sense key specific field */ 881 sense_buf[15] |= 0xc0;/* Std sense key specific field */
895 /* Illegal parameter is in the CDB block */ 882 /* Illegal parameter is in the CDB block */
896 sense_buf[15] |= bit_pointer;
897 sense_buf[16] = field_pointer >> 8; /* MSB */ 883 sense_buf[16] = field_pointer >> 8; /* MSB */
898 sense_buf[17] = field_pointer; /* LSB */ 884 sense_buf[17] = field_pointer; /* LSB */
899 } 885 } else
886 sense_buf[7] = 6; /* Additional sense length */
900} 887}
901 888
902static int aac_bounds_32(struct aac_dev * dev, struct scsi_cmnd * cmd, u64 lba) 889static 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)
906 dprintk((KERN_DEBUG "aacraid: Illegal lba\n")); 893 dprintk((KERN_DEBUG "aacraid: Illegal lba\n"));
907 cmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | 894 cmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 |
908 SAM_STAT_CHECK_CONDITION; 895 SAM_STAT_CHECK_CONDITION;
909 set_sense((u8 *) &dev->fsa_dev[cid].sense_data, 896 set_sense(&dev->fsa_dev[cid].sense_data,
910 HARDWARE_ERROR, 897 HARDWARE_ERROR, SENCODE_INTERNAL_TARGET_FAILURE,
911 SENCODE_INTERNAL_TARGET_FAILURE, 898 ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0);
912 ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0,
913 0, 0);
914 memcpy(cmd->sense_buffer, &dev->fsa_dev[cid].sense_data, 899 memcpy(cmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
915 min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data), 900 min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data),
916 SCSI_SENSE_BUFFERSIZE)); 901 SCSI_SENSE_BUFFERSIZE));
@@ -1520,11 +1505,9 @@ static void io_callback(void *context, struct fib * fibptr)
1520 le32_to_cpu(readreply->status)); 1505 le32_to_cpu(readreply->status));
1521#endif 1506#endif
1522 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION; 1507 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION;
1523 set_sense((u8 *) &dev->fsa_dev[cid].sense_data, 1508 set_sense(&dev->fsa_dev[cid].sense_data,
1524 HARDWARE_ERROR, 1509 HARDWARE_ERROR, SENCODE_INTERNAL_TARGET_FAILURE,
1525 SENCODE_INTERNAL_TARGET_FAILURE, 1510 ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0);
1526 ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0,
1527 0, 0);
1528 memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data, 1511 memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
1529 min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data), 1512 min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data),
1530 SCSI_SENSE_BUFFERSIZE)); 1513 SCSI_SENSE_BUFFERSIZE));
@@ -1733,11 +1716,9 @@ static void synchronize_callback(void *context, struct fib *fibptr)
1733 le32_to_cpu(synchronizereply->status)); 1716 le32_to_cpu(synchronizereply->status));
1734 cmd->result = DID_OK << 16 | 1717 cmd->result = DID_OK << 16 |
1735 COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION; 1718 COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION;
1736 set_sense((u8 *)&dev->fsa_dev[cid].sense_data, 1719 set_sense(&dev->fsa_dev[cid].sense_data,
1737 HARDWARE_ERROR, 1720 HARDWARE_ERROR, SENCODE_INTERNAL_TARGET_FAILURE,
1738 SENCODE_INTERNAL_TARGET_FAILURE, 1721 ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0);
1739 ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0,
1740 0, 0);
1741 memcpy(cmd->sense_buffer, &dev->fsa_dev[cid].sense_data, 1722 memcpy(cmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
1742 min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data), 1723 min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data),
1743 SCSI_SENSE_BUFFERSIZE)); 1724 SCSI_SENSE_BUFFERSIZE));
@@ -1945,10 +1926,9 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
1945 { 1926 {
1946 dprintk((KERN_WARNING "Only INQUIRY & TUR command supported for controller, rcvd = 0x%x.\n", scsicmd->cmnd[0])); 1927 dprintk((KERN_WARNING "Only INQUIRY & TUR command supported for controller, rcvd = 0x%x.\n", scsicmd->cmnd[0]));
1947 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION; 1928 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION;
1948 set_sense((u8 *) &dev->fsa_dev[cid].sense_data, 1929 set_sense(&dev->fsa_dev[cid].sense_data,
1949 ILLEGAL_REQUEST, 1930 ILLEGAL_REQUEST, SENCODE_INVALID_COMMAND,
1950 SENCODE_INVALID_COMMAND, 1931 ASENCODE_INVALID_COMMAND, 0, 0);
1951 ASENCODE_INVALID_COMMAND, 0, 0, 0, 0);
1952 memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data, 1932 memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
1953 min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data), 1933 min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data),
1954 SCSI_SENSE_BUFFERSIZE)); 1934 SCSI_SENSE_BUFFERSIZE));
@@ -1995,10 +1975,9 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
1995 scsicmd->result = DID_OK << 16 | 1975 scsicmd->result = DID_OK << 16 |
1996 COMMAND_COMPLETE << 8 | 1976 COMMAND_COMPLETE << 8 |
1997 SAM_STAT_CHECK_CONDITION; 1977 SAM_STAT_CHECK_CONDITION;
1998 set_sense((u8 *) &dev->fsa_dev[cid].sense_data, 1978 set_sense(&dev->fsa_dev[cid].sense_data,
1999 ILLEGAL_REQUEST, 1979 ILLEGAL_REQUEST, SENCODE_INVALID_CDB_FIELD,
2000 SENCODE_INVALID_CDB_FIELD, 1980 ASENCODE_NO_SENSE, 7, 2);
2001 ASENCODE_NO_SENSE, 0, 7, 2, 0);
2002 memcpy(scsicmd->sense_buffer, 1981 memcpy(scsicmd->sense_buffer,
2003 &dev->fsa_dev[cid].sense_data, 1982 &dev->fsa_dev[cid].sense_data,
2004 min_t(size_t, 1983 min_t(size_t,
@@ -2254,9 +2233,9 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
2254 */ 2233 */
2255 dprintk((KERN_WARNING "Unhandled SCSI Command: 0x%x.\n", scsicmd->cmnd[0])); 2234 dprintk((KERN_WARNING "Unhandled SCSI Command: 0x%x.\n", scsicmd->cmnd[0]));
2256 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION; 2235 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION;
2257 set_sense((u8 *) &dev->fsa_dev[cid].sense_data, 2236 set_sense(&dev->fsa_dev[cid].sense_data,
2258 ILLEGAL_REQUEST, SENCODE_INVALID_COMMAND, 2237 ILLEGAL_REQUEST, SENCODE_INVALID_COMMAND,
2259 ASENCODE_INVALID_COMMAND, 0, 0, 0, 0); 2238 ASENCODE_INVALID_COMMAND, 0, 0);
2260 memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data, 2239 memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
2261 min_t(size_t, 2240 min_t(size_t,
2262 sizeof(dev->fsa_dev[cid].sense_data), 2241 sizeof(dev->fsa_dev[cid].sense_data),