aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/aacraid/aachba.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/aacraid/aachba.c')
-rw-r--r--drivers/scsi/aacraid/aachba.c265
1 files changed, 140 insertions, 125 deletions
diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c
index 9b3dd6ef6a0b..e4c243748a97 100644
--- a/drivers/scsi/aacraid/aachba.c
+++ b/drivers/scsi/aacraid/aachba.c
@@ -259,7 +259,7 @@ MODULE_PARM_DESC(commit, "Control whether a COMMIT_CONFIG is issued to the"
259 " 0=off, 1=on"); 259 " 0=off, 1=on");
260module_param_named(msi, aac_msi, int, S_IRUGO|S_IWUSR); 260module_param_named(msi, aac_msi, int, S_IRUGO|S_IWUSR);
261MODULE_PARM_DESC(msi, "IRQ handling." 261MODULE_PARM_DESC(msi, "IRQ handling."
262 " 0=PIC(default), 1=MSI, 2=MSI-X(unsupported, uses MSI)"); 262 " 0=PIC(default), 1=MSI, 2=MSI-X)");
263module_param(startup_timeout, int, S_IRUGO|S_IWUSR); 263module_param(startup_timeout, int, S_IRUGO|S_IWUSR);
264MODULE_PARM_DESC(startup_timeout, "The duration of time in seconds to wait for" 264MODULE_PARM_DESC(startup_timeout, "The duration of time in seconds to wait for"
265 " adapter to have it's kernel up and\n" 265 " adapter to have it's kernel up and\n"
@@ -570,7 +570,7 @@ static int aac_get_container_name(struct scsi_cmnd * scsicmd)
570 570
571 status = aac_fib_send(ContainerCommand, 571 status = aac_fib_send(ContainerCommand,
572 cmd_fibcontext, 572 cmd_fibcontext,
573 sizeof (struct aac_get_name), 573 sizeof(struct aac_get_name_resp),
574 FsaNormal, 574 FsaNormal,
575 0, 1, 575 0, 1,
576 (fib_callback)get_container_name_callback, 576 (fib_callback)get_container_name_callback,
@@ -1052,7 +1052,7 @@ static int aac_get_container_serial(struct scsi_cmnd * scsicmd)
1052 1052
1053 status = aac_fib_send(ContainerCommand, 1053 status = aac_fib_send(ContainerCommand,
1054 cmd_fibcontext, 1054 cmd_fibcontext,
1055 sizeof (struct aac_get_serial), 1055 sizeof(struct aac_get_serial_resp),
1056 FsaNormal, 1056 FsaNormal,
1057 0, 1, 1057 0, 1,
1058 (fib_callback) get_container_serial_callback, 1058 (fib_callback) get_container_serial_callback,
@@ -2977,11 +2977,16 @@ static void aac_srb_callback(void *context, struct fib * fibptr)
2977 return; 2977 return;
2978 2978
2979 BUG_ON(fibptr == NULL); 2979 BUG_ON(fibptr == NULL);
2980
2981 dev = fibptr->dev; 2980 dev = fibptr->dev;
2982 2981
2983 srbreply = (struct aac_srb_reply *) fib_data(fibptr); 2982 scsi_dma_unmap(scsicmd);
2984 2983
2984 /* expose physical device if expose_physicald flag is on */
2985 if (scsicmd->cmnd[0] == INQUIRY && !(scsicmd->cmnd[1] & 0x01)
2986 && expose_physicals > 0)
2987 aac_expose_phy_device(scsicmd);
2988
2989 srbreply = (struct aac_srb_reply *) fib_data(fibptr);
2985 scsicmd->sense_buffer[0] = '\0'; /* Initialize sense valid flag to false */ 2990 scsicmd->sense_buffer[0] = '\0'; /* Initialize sense valid flag to false */
2986 2991
2987 if (fibptr->flags & FIB_CONTEXT_FLAG_FASTRESP) { 2992 if (fibptr->flags & FIB_CONTEXT_FLAG_FASTRESP) {
@@ -2994,147 +2999,157 @@ static void aac_srb_callback(void *context, struct fib * fibptr)
2994 */ 2999 */
2995 scsi_set_resid(scsicmd, scsi_bufflen(scsicmd) 3000 scsi_set_resid(scsicmd, scsi_bufflen(scsicmd)
2996 - le32_to_cpu(srbreply->data_xfer_length)); 3001 - le32_to_cpu(srbreply->data_xfer_length));
2997 } 3002 /*
2998 3003 * First check the fib status
2999 scsi_dma_unmap(scsicmd); 3004 */
3000
3001 /* expose physical device if expose_physicald flag is on */
3002 if (scsicmd->cmnd[0] == INQUIRY && !(scsicmd->cmnd[1] & 0x01)
3003 && expose_physicals > 0)
3004 aac_expose_phy_device(scsicmd);
3005 3005
3006 /* 3006 if (le32_to_cpu(srbreply->status) != ST_OK) {
3007 * First check the fib status 3007 int len;
3008 */
3009 3008
3010 if (le32_to_cpu(srbreply->status) != ST_OK){ 3009 printk(KERN_WARNING "aac_srb_callback: srb failed, status = %d\n", le32_to_cpu(srbreply->status));
3011 int len; 3010 len = min_t(u32, le32_to_cpu(srbreply->sense_data_size),
3012 printk(KERN_WARNING "aac_srb_callback: srb failed, status = %d\n", le32_to_cpu(srbreply->status)); 3011 SCSI_SENSE_BUFFERSIZE);
3013 len = min_t(u32, le32_to_cpu(srbreply->sense_data_size), 3012 scsicmd->result = DID_ERROR << 16
3014 SCSI_SENSE_BUFFERSIZE); 3013 | COMMAND_COMPLETE << 8
3015 scsicmd->result = DID_ERROR << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION; 3014 | SAM_STAT_CHECK_CONDITION;
3016 memcpy(scsicmd->sense_buffer, srbreply->sense_data, len); 3015 memcpy(scsicmd->sense_buffer,
3017 } 3016 srbreply->sense_data, len);
3017 }
3018 3018
3019 /* 3019 /*
3020 * Next check the srb status 3020 * Next check the srb status
3021 */ 3021 */
3022 switch( (le32_to_cpu(srbreply->srb_status))&0x3f){ 3022 switch ((le32_to_cpu(srbreply->srb_status))&0x3f) {
3023 case SRB_STATUS_ERROR_RECOVERY: 3023 case SRB_STATUS_ERROR_RECOVERY:
3024 case SRB_STATUS_PENDING: 3024 case SRB_STATUS_PENDING:
3025 case SRB_STATUS_SUCCESS: 3025 case SRB_STATUS_SUCCESS:
3026 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8; 3026 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8;
3027 break; 3027 break;
3028 case SRB_STATUS_DATA_OVERRUN: 3028 case SRB_STATUS_DATA_OVERRUN:
3029 switch(scsicmd->cmnd[0]){ 3029 switch (scsicmd->cmnd[0]) {
3030 case READ_6: 3030 case READ_6:
3031 case WRITE_6: 3031 case WRITE_6:
3032 case READ_10: 3032 case READ_10:
3033 case WRITE_10: 3033 case WRITE_10:
3034 case READ_12: 3034 case READ_12:
3035 case WRITE_12: 3035 case WRITE_12:
3036 case READ_16: 3036 case READ_16:
3037 case WRITE_16: 3037 case WRITE_16:
3038 if (le32_to_cpu(srbreply->data_xfer_length) < scsicmd->underflow) { 3038 if (le32_to_cpu(srbreply->data_xfer_length)
3039 printk(KERN_WARNING"aacraid: SCSI CMD underflow\n"); 3039 < scsicmd->underflow)
3040 } else { 3040 printk(KERN_WARNING"aacraid: SCSI CMD underflow\n");
3041 printk(KERN_WARNING"aacraid: SCSI CMD Data Overrun\n"); 3041 else
3042 printk(KERN_WARNING"aacraid: SCSI CMD Data Overrun\n");
3043 scsicmd->result = DID_ERROR << 16
3044 | COMMAND_COMPLETE << 8;
3045 break;
3046 case INQUIRY: {
3047 scsicmd->result = DID_OK << 16
3048 | COMMAND_COMPLETE << 8;
3049 break;
3050 }
3051 default:
3052 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8;
3053 break;
3042 } 3054 }
3043 scsicmd->result = DID_ERROR << 16 | COMMAND_COMPLETE << 8;
3044 break; 3055 break;
3045 case INQUIRY: { 3056 case SRB_STATUS_ABORTED:
3046 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8; 3057 scsicmd->result = DID_ABORT << 16 | ABORT << 8;
3047 break; 3058 break;
3048 } 3059 case SRB_STATUS_ABORT_FAILED:
3049 default: 3060 /*
3050 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8; 3061 * Not sure about this one - but assuming the
3062 * hba was trying to abort for some reason
3063 */
3064 scsicmd->result = DID_ERROR << 16 | ABORT << 8;
3065 break;
3066 case SRB_STATUS_PARITY_ERROR:
3067 scsicmd->result = DID_PARITY << 16
3068 | MSG_PARITY_ERROR << 8;
3069 break;
3070 case SRB_STATUS_NO_DEVICE:
3071 case SRB_STATUS_INVALID_PATH_ID:
3072 case SRB_STATUS_INVALID_TARGET_ID:
3073 case SRB_STATUS_INVALID_LUN:
3074 case SRB_STATUS_SELECTION_TIMEOUT:
3075 scsicmd->result = DID_NO_CONNECT << 16
3076 | COMMAND_COMPLETE << 8;
3051 break; 3077 break;
3052 }
3053 break;
3054 case SRB_STATUS_ABORTED:
3055 scsicmd->result = DID_ABORT << 16 | ABORT << 8;
3056 break;
3057 case SRB_STATUS_ABORT_FAILED:
3058 // Not sure about this one - but assuming the hba was trying to abort for some reason
3059 scsicmd->result = DID_ERROR << 16 | ABORT << 8;
3060 break;
3061 case SRB_STATUS_PARITY_ERROR:
3062 scsicmd->result = DID_PARITY << 16 | MSG_PARITY_ERROR << 8;
3063 break;
3064 case SRB_STATUS_NO_DEVICE:
3065 case SRB_STATUS_INVALID_PATH_ID:
3066 case SRB_STATUS_INVALID_TARGET_ID:
3067 case SRB_STATUS_INVALID_LUN:
3068 case SRB_STATUS_SELECTION_TIMEOUT:
3069 scsicmd->result = DID_NO_CONNECT << 16 | COMMAND_COMPLETE << 8;
3070 break;
3071 3078
3072 case SRB_STATUS_COMMAND_TIMEOUT: 3079 case SRB_STATUS_COMMAND_TIMEOUT:
3073 case SRB_STATUS_TIMEOUT: 3080 case SRB_STATUS_TIMEOUT:
3074 scsicmd->result = DID_TIME_OUT << 16 | COMMAND_COMPLETE << 8; 3081 scsicmd->result = DID_TIME_OUT << 16
3075 break; 3082 | COMMAND_COMPLETE << 8;
3083 break;
3076 3084
3077 case SRB_STATUS_BUSY: 3085 case SRB_STATUS_BUSY:
3078 scsicmd->result = DID_BUS_BUSY << 16 | COMMAND_COMPLETE << 8; 3086 scsicmd->result = DID_BUS_BUSY << 16
3079 break; 3087 | COMMAND_COMPLETE << 8;
3088 break;
3080 3089
3081 case SRB_STATUS_BUS_RESET: 3090 case SRB_STATUS_BUS_RESET:
3082 scsicmd->result = DID_RESET << 16 | COMMAND_COMPLETE << 8; 3091 scsicmd->result = DID_RESET << 16
3083 break; 3092 | COMMAND_COMPLETE << 8;
3093 break;
3084 3094
3085 case SRB_STATUS_MESSAGE_REJECTED: 3095 case SRB_STATUS_MESSAGE_REJECTED:
3086 scsicmd->result = DID_ERROR << 16 | MESSAGE_REJECT << 8; 3096 scsicmd->result = DID_ERROR << 16
3087 break; 3097 | MESSAGE_REJECT << 8;
3088 case SRB_STATUS_REQUEST_FLUSHED: 3098 break;
3089 case SRB_STATUS_ERROR: 3099 case SRB_STATUS_REQUEST_FLUSHED:
3090 case SRB_STATUS_INVALID_REQUEST: 3100 case SRB_STATUS_ERROR:
3091 case SRB_STATUS_REQUEST_SENSE_FAILED: 3101 case SRB_STATUS_INVALID_REQUEST:
3092 case SRB_STATUS_NO_HBA: 3102 case SRB_STATUS_REQUEST_SENSE_FAILED:
3093 case SRB_STATUS_UNEXPECTED_BUS_FREE: 3103 case SRB_STATUS_NO_HBA:
3094 case SRB_STATUS_PHASE_SEQUENCE_FAILURE: 3104 case SRB_STATUS_UNEXPECTED_BUS_FREE:
3095 case SRB_STATUS_BAD_SRB_BLOCK_LENGTH: 3105 case SRB_STATUS_PHASE_SEQUENCE_FAILURE:
3096 case SRB_STATUS_DELAYED_RETRY: 3106 case SRB_STATUS_BAD_SRB_BLOCK_LENGTH:
3097 case SRB_STATUS_BAD_FUNCTION: 3107 case SRB_STATUS_DELAYED_RETRY:
3098 case SRB_STATUS_NOT_STARTED: 3108 case SRB_STATUS_BAD_FUNCTION:
3099 case SRB_STATUS_NOT_IN_USE: 3109 case SRB_STATUS_NOT_STARTED:
3100 case SRB_STATUS_FORCE_ABORT: 3110 case SRB_STATUS_NOT_IN_USE:
3101 case SRB_STATUS_DOMAIN_VALIDATION_FAIL: 3111 case SRB_STATUS_FORCE_ABORT:
3102 default: 3112 case SRB_STATUS_DOMAIN_VALIDATION_FAIL:
3113 default:
3103#ifdef AAC_DETAILED_STATUS_INFO 3114#ifdef AAC_DETAILED_STATUS_INFO
3104 printk("aacraid: SRB ERROR(%u) %s scsi cmd 0x%x - scsi status 0x%x\n", 3115 printk(KERN_INFO "aacraid: SRB ERROR(%u) %s scsi cmd 0x%x - scsi status 0x%x\n",
3105 le32_to_cpu(srbreply->srb_status) & 0x3F, 3116 le32_to_cpu(srbreply->srb_status) & 0x3F,
3106 aac_get_status_string( 3117 aac_get_status_string(
3107 le32_to_cpu(srbreply->srb_status) & 0x3F), 3118 le32_to_cpu(srbreply->srb_status) & 0x3F),
3108 scsicmd->cmnd[0], 3119 scsicmd->cmnd[0],
3109 le32_to_cpu(srbreply->scsi_status)); 3120 le32_to_cpu(srbreply->scsi_status));
3110#endif 3121#endif
3111 if ((scsicmd->cmnd[0] == ATA_12) 3122 if ((scsicmd->cmnd[0] == ATA_12)
3112 || (scsicmd->cmnd[0] == ATA_16)) { 3123 || (scsicmd->cmnd[0] == ATA_16)) {
3113 if (scsicmd->cmnd[2] & (0x01 << 5)) { 3124 if (scsicmd->cmnd[2] & (0x01 << 5)) {
3114 scsicmd->result = DID_OK << 16 3125 scsicmd->result = DID_OK << 16
3115 | COMMAND_COMPLETE << 8; 3126 | COMMAND_COMPLETE << 8;
3116 break; 3127 break;
3128 } else {
3129 scsicmd->result = DID_ERROR << 16
3130 | COMMAND_COMPLETE << 8;
3131 break;
3132 }
3117 } else { 3133 } else {
3118 scsicmd->result = DID_ERROR << 16 3134 scsicmd->result = DID_ERROR << 16
3119 | COMMAND_COMPLETE << 8; 3135 | COMMAND_COMPLETE << 8;
3120 break; 3136 break;
3121 } 3137 }
3122 } else {
3123 scsicmd->result = DID_ERROR << 16
3124 | COMMAND_COMPLETE << 8;
3125 break;
3126 } 3138 }
3127 } 3139 if (le32_to_cpu(srbreply->scsi_status)
3128 if (le32_to_cpu(srbreply->scsi_status) == SAM_STAT_CHECK_CONDITION) { 3140 == SAM_STAT_CHECK_CONDITION) {
3129 int len; 3141 int len;
3130 scsicmd->result |= SAM_STAT_CHECK_CONDITION; 3142
3131 len = min_t(u32, le32_to_cpu(srbreply->sense_data_size), 3143 scsicmd->result |= SAM_STAT_CHECK_CONDITION;
3132 SCSI_SENSE_BUFFERSIZE); 3144 len = min_t(u32, le32_to_cpu(srbreply->sense_data_size),
3145 SCSI_SENSE_BUFFERSIZE);
3133#ifdef AAC_DETAILED_STATUS_INFO 3146#ifdef AAC_DETAILED_STATUS_INFO
3134 printk(KERN_WARNING "aac_srb_callback: check condition, status = %d len=%d\n", 3147 printk(KERN_WARNING "aac_srb_callback: check condition, status = %d len=%d\n",
3135 le32_to_cpu(srbreply->status), len); 3148 le32_to_cpu(srbreply->status), len);
3136#endif 3149#endif
3137 memcpy(scsicmd->sense_buffer, srbreply->sense_data, len); 3150 memcpy(scsicmd->sense_buffer,
3151 srbreply->sense_data, len);
3152 }
3138 } 3153 }
3139 /* 3154 /*
3140 * OR in the scsi status (already shifted up a bit) 3155 * OR in the scsi status (already shifted up a bit)