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
-rw-r--r--drivers/scsi/aacraid/commctrl.c26
-rw-r--r--drivers/scsi/aacraid/linit.c28
3 files changed, 57 insertions, 78 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),
diff --git a/drivers/scsi/aacraid/commctrl.c b/drivers/scsi/aacraid/commctrl.c
index f8afa358b6b6..abef05146d75 100644
--- a/drivers/scsi/aacraid/commctrl.c
+++ b/drivers/scsi/aacraid/commctrl.c
@@ -243,6 +243,7 @@ static int next_getadapter_fib(struct aac_dev * dev, void __user *arg)
243 * Search the list of AdapterFibContext addresses on the adapter 243 * Search the list of AdapterFibContext addresses on the adapter
244 * to be sure this is a valid address 244 * to be sure this is a valid address
245 */ 245 */
246 spin_lock_irqsave(&dev->fib_lock, flags);
246 entry = dev->fib_list.next; 247 entry = dev->fib_list.next;
247 fibctx = NULL; 248 fibctx = NULL;
248 249
@@ -251,24 +252,25 @@ static int next_getadapter_fib(struct aac_dev * dev, void __user *arg)
251 /* 252 /*
252 * Extract the AdapterFibContext from the Input parameters. 253 * Extract the AdapterFibContext from the Input parameters.
253 */ 254 */
254 if (fibctx->unique == f.fibctx) { /* We found a winner */ 255 if (fibctx->unique == f.fibctx) { /* We found a winner */
255 break; 256 break;
256 } 257 }
257 entry = entry->next; 258 entry = entry->next;
258 fibctx = NULL; 259 fibctx = NULL;
259 } 260 }
260 if (!fibctx) { 261 if (!fibctx) {
262 spin_unlock_irqrestore(&dev->fib_lock, flags);
261 dprintk ((KERN_INFO "Fib Context not found\n")); 263 dprintk ((KERN_INFO "Fib Context not found\n"));
262 return -EINVAL; 264 return -EINVAL;
263 } 265 }
264 266
265 if((fibctx->type != FSAFS_NTC_GET_ADAPTER_FIB_CONTEXT) || 267 if((fibctx->type != FSAFS_NTC_GET_ADAPTER_FIB_CONTEXT) ||
266 (fibctx->size != sizeof(struct aac_fib_context))) { 268 (fibctx->size != sizeof(struct aac_fib_context))) {
269 spin_unlock_irqrestore(&dev->fib_lock, flags);
267 dprintk ((KERN_INFO "Fib Context corrupt?\n")); 270 dprintk ((KERN_INFO "Fib Context corrupt?\n"));
268 return -EINVAL; 271 return -EINVAL;
269 } 272 }
270 status = 0; 273 status = 0;
271 spin_lock_irqsave(&dev->fib_lock, flags);
272 /* 274 /*
273 * If there are no fibs to send back, then either wait or return 275 * If there are no fibs to send back, then either wait or return
274 * -EAGAIN 276 * -EAGAIN
@@ -414,8 +416,8 @@ static int close_getadapter_fib(struct aac_dev * dev, void __user *arg)
414 * @arg: ioctl arguments 416 * @arg: ioctl arguments
415 * 417 *
416 * This routine returns the driver version. 418 * This routine returns the driver version.
417 * Under Linux, there have been no version incompatibilities, so this is 419 * Under Linux, there have been no version incompatibilities, so this is
418 * simple! 420 * simple!
419 */ 421 */
420 422
421static int check_revision(struct aac_dev *dev, void __user *arg) 423static int check_revision(struct aac_dev *dev, void __user *arg)
@@ -463,7 +465,7 @@ static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg)
463 u32 data_dir; 465 u32 data_dir;
464 void __user *sg_user[32]; 466 void __user *sg_user[32];
465 void *sg_list[32]; 467 void *sg_list[32];
466 u32 sg_indx = 0; 468 u32 sg_indx = 0;
467 u32 byte_count = 0; 469 u32 byte_count = 0;
468 u32 actual_fibsize64, actual_fibsize = 0; 470 u32 actual_fibsize64, actual_fibsize = 0;
469 int i; 471 int i;
@@ -517,11 +519,11 @@ static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg)
517 // Fix up srb for endian and force some values 519 // Fix up srb for endian and force some values
518 520
519 srbcmd->function = cpu_to_le32(SRBF_ExecuteScsi); // Force this 521 srbcmd->function = cpu_to_le32(SRBF_ExecuteScsi); // Force this
520 srbcmd->channel = cpu_to_le32(user_srbcmd->channel); 522 srbcmd->channel = cpu_to_le32(user_srbcmd->channel);
521 srbcmd->id = cpu_to_le32(user_srbcmd->id); 523 srbcmd->id = cpu_to_le32(user_srbcmd->id);
522 srbcmd->lun = cpu_to_le32(user_srbcmd->lun); 524 srbcmd->lun = cpu_to_le32(user_srbcmd->lun);
523 srbcmd->timeout = cpu_to_le32(user_srbcmd->timeout); 525 srbcmd->timeout = cpu_to_le32(user_srbcmd->timeout);
524 srbcmd->flags = cpu_to_le32(flags); 526 srbcmd->flags = cpu_to_le32(flags);
525 srbcmd->retry_limit = 0; // Obsolete parameter 527 srbcmd->retry_limit = 0; // Obsolete parameter
526 srbcmd->cdb_size = cpu_to_le32(user_srbcmd->cdb_size); 528 srbcmd->cdb_size = cpu_to_le32(user_srbcmd->cdb_size);
527 memcpy(srbcmd->cdb, user_srbcmd->cdb, sizeof(srbcmd->cdb)); 529 memcpy(srbcmd->cdb, user_srbcmd->cdb, sizeof(srbcmd->cdb));
@@ -786,9 +788,9 @@ static int aac_get_pci_info(struct aac_dev* dev, void __user *arg)
786 pci_info.bus = dev->pdev->bus->number; 788 pci_info.bus = dev->pdev->bus->number;
787 pci_info.slot = PCI_SLOT(dev->pdev->devfn); 789 pci_info.slot = PCI_SLOT(dev->pdev->devfn);
788 790
789 if (copy_to_user(arg, &pci_info, sizeof(struct aac_pci_info))) { 791 if (copy_to_user(arg, &pci_info, sizeof(struct aac_pci_info))) {
790 dprintk((KERN_DEBUG "aacraid: Could not copy pci info\n")); 792 dprintk((KERN_DEBUG "aacraid: Could not copy pci info\n"));
791 return -EFAULT; 793 return -EFAULT;
792 } 794 }
793 return 0; 795 return 0;
794} 796}
diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
index fb0886140dd7..e80d2a0c46af 100644
--- a/drivers/scsi/aacraid/linit.c
+++ b/drivers/scsi/aacraid/linit.c
@@ -1130,31 +1130,29 @@ static int __devinit aac_probe_one(struct pci_dev *pdev,
1130 if (error < 0) 1130 if (error < 0)
1131 goto out_deinit; 1131 goto out_deinit;
1132 1132
1133 if (!(aac->adapter_info.options & AAC_OPT_NEW_COMM)) {
1134 error = pci_set_dma_max_seg_size(pdev, 65536);
1135 if (error)
1136 goto out_deinit;
1137 }
1138
1139 /* 1133 /*
1140 * Lets override negotiations and drop the maximum SG limit to 34 1134 * Lets override negotiations and drop the maximum SG limit to 34
1141 */ 1135 */
1142 if ((aac_drivers[index].quirks & AAC_QUIRK_34SG) && 1136 if ((aac_drivers[index].quirks & AAC_QUIRK_34SG) &&
1143 (aac->scsi_host_ptr->sg_tablesize > 34)) { 1137 (shost->sg_tablesize > 34)) {
1144 aac->scsi_host_ptr->sg_tablesize = 34; 1138 shost->sg_tablesize = 34;
1145 aac->scsi_host_ptr->max_sectors 1139 shost->max_sectors = (shost->sg_tablesize * 8) + 112;
1146 = (aac->scsi_host_ptr->sg_tablesize * 8) + 112;
1147 } 1140 }
1148 1141
1149 if ((aac_drivers[index].quirks & AAC_QUIRK_17SG) && 1142 if ((aac_drivers[index].quirks & AAC_QUIRK_17SG) &&
1150 (aac->scsi_host_ptr->sg_tablesize > 17)) { 1143 (shost->sg_tablesize > 17)) {
1151 aac->scsi_host_ptr->sg_tablesize = 17; 1144 shost->sg_tablesize = 17;
1152 aac->scsi_host_ptr->max_sectors 1145 shost->max_sectors = (shost->sg_tablesize * 8) + 112;
1153 = (aac->scsi_host_ptr->sg_tablesize * 8) + 112;
1154 } 1146 }
1155 1147
1148 error = pci_set_dma_max_seg_size(pdev,
1149 (aac->adapter_info.options & AAC_OPT_NEW_COMM) ?
1150 (shost->max_sectors << 9) : 65536);
1151 if (error)
1152 goto out_deinit;
1153
1156 /* 1154 /*
1157 * Firware printf works only with older firmware. 1155 * Firmware printf works only with older firmware.
1158 */ 1156 */
1159 if (aac_drivers[index].quirks & AAC_QUIRK_34SG) 1157 if (aac_drivers[index].quirks & AAC_QUIRK_34SG)
1160 aac->printf_enabled = 1; 1158 aac->printf_enabled = 1;