diff options
Diffstat (limited to 'drivers/scsi/aacraid/aachba.c')
-rw-r--r-- | drivers/scsi/aacraid/aachba.c | 265 |
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"); |
260 | module_param_named(msi, aac_msi, int, S_IRUGO|S_IWUSR); | 260 | module_param_named(msi, aac_msi, int, S_IRUGO|S_IWUSR); |
261 | MODULE_PARM_DESC(msi, "IRQ handling." | 261 | MODULE_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)"); |
263 | module_param(startup_timeout, int, S_IRUGO|S_IWUSR); | 263 | module_param(startup_timeout, int, S_IRUGO|S_IWUSR); |
264 | MODULE_PARM_DESC(startup_timeout, "The duration of time in seconds to wait for" | 264 | MODULE_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) |