Skip to content

Commit d1f96c3

Browse files
Raghava Aditya Renukuntagregkh
authored andcommitted
scsi: aacraid: Process Error for response I/O
[ Upstream commit 4ec57fb4edaec523f0f78a0449a3b063749ac58b ] Make sure that the driver processes error conditions even in the fast response path for response from the adapter. Signed-off-by: Raghava Aditya Renukunta <RaghavaAditya.Renukunta@microsemi.com> Signed-off-by: Dave Carroll <David.Carroll@microsemi.com> Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> Signed-off-by: Sasha Levin <alexander.levin@verizon.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent fff544c commit d1f96c3

1 file changed

Lines changed: 151 additions & 138 deletions

File tree

drivers/scsi/aacraid/aachba.c

Lines changed: 151 additions & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -2977,16 +2977,11 @@ static void aac_srb_callback(void *context, struct fib * fibptr)
29772977
return;
29782978

29792979
BUG_ON(fibptr == NULL);
2980-
dev = fibptr->dev;
2981-
2982-
scsi_dma_unmap(scsicmd);
29832980

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);
2981+
dev = fibptr->dev;
29882982

29892983
srbreply = (struct aac_srb_reply *) fib_data(fibptr);
2984+
29902985
scsicmd->sense_buffer[0] = '\0'; /* Initialize sense valid flag to false */
29912986

29922987
if (fibptr->flags & FIB_CONTEXT_FLAG_FASTRESP) {
@@ -2999,158 +2994,176 @@ static void aac_srb_callback(void *context, struct fib * fibptr)
29992994
*/
30002995
scsi_set_resid(scsicmd, scsi_bufflen(scsicmd)
30012996
- le32_to_cpu(srbreply->data_xfer_length));
3002-
/*
3003-
* First check the fib status
3004-
*/
2997+
}
30052998

3006-
if (le32_to_cpu(srbreply->status) != ST_OK) {
3007-
int len;
30082999

3009-
printk(KERN_WARNING "aac_srb_callback: srb failed, status = %d\n", le32_to_cpu(srbreply->status));
3010-
len = min_t(u32, le32_to_cpu(srbreply->sense_data_size),
3011-
SCSI_SENSE_BUFFERSIZE);
3012-
scsicmd->result = DID_ERROR << 16
3013-
| COMMAND_COMPLETE << 8
3014-
| SAM_STAT_CHECK_CONDITION;
3015-
memcpy(scsicmd->sense_buffer,
3016-
srbreply->sense_data, len);
3017-
}
3000+
scsi_dma_unmap(scsicmd);
30183001

3019-
/*
3020-
* Next check the srb status
3021-
*/
3022-
switch ((le32_to_cpu(srbreply->srb_status))&0x3f) {
3023-
case SRB_STATUS_ERROR_RECOVERY:
3024-
case SRB_STATUS_PENDING:
3025-
case SRB_STATUS_SUCCESS:
3026-
scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8;
3027-
break;
3028-
case SRB_STATUS_DATA_OVERRUN:
3029-
switch (scsicmd->cmnd[0]) {
3030-
case READ_6:
3031-
case WRITE_6:
3032-
case READ_10:
3033-
case WRITE_10:
3034-
case READ_12:
3035-
case WRITE_12:
3036-
case READ_16:
3037-
case WRITE_16:
3038-
if (le32_to_cpu(srbreply->data_xfer_length)
3039-
< scsicmd->underflow)
3040-
printk(KERN_WARNING"aacraid: SCSI CMD underflow\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;
3054-
}
3055-
break;
3056-
case SRB_STATUS_ABORTED:
3057-
scsicmd->result = DID_ABORT << 16 | ABORT << 8;
3058-
break;
3059-
case SRB_STATUS_ABORT_FAILED:
3060-
/*
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;
3077-
break;
3002+
/* expose physical device if expose_physicald flag is on */
3003+
if (scsicmd->cmnd[0] == INQUIRY && !(scsicmd->cmnd[1] & 0x01)
3004+
&& expose_physicals > 0)
3005+
aac_expose_phy_device(scsicmd);
30783006

3079-
case SRB_STATUS_COMMAND_TIMEOUT:
3080-
case SRB_STATUS_TIMEOUT:
3081-
scsicmd->result = DID_TIME_OUT << 16
3082-
| COMMAND_COMPLETE << 8;
3083-
break;
3007+
/*
3008+
* First check the fib status
3009+
*/
30843010

3085-
case SRB_STATUS_BUSY:
3086-
scsicmd->result = DID_BUS_BUSY << 16
3087-
| COMMAND_COMPLETE << 8;
3088-
break;
3011+
if (le32_to_cpu(srbreply->status) != ST_OK) {
3012+
int len;
30893013

3090-
case SRB_STATUS_BUS_RESET:
3091-
scsicmd->result = DID_RESET << 16
3092-
| COMMAND_COMPLETE << 8;
3093-
break;
3014+
pr_warn("aac_srb_callback: srb failed, status = %d\n",
3015+
le32_to_cpu(srbreply->status));
3016+
len = min_t(u32, le32_to_cpu(srbreply->sense_data_size),
3017+
SCSI_SENSE_BUFFERSIZE);
3018+
scsicmd->result = DID_ERROR << 16
3019+
| COMMAND_COMPLETE << 8
3020+
| SAM_STAT_CHECK_CONDITION;
3021+
memcpy(scsicmd->sense_buffer,
3022+
srbreply->sense_data, len);
3023+
}
30943024

3095-
case SRB_STATUS_MESSAGE_REJECTED:
3025+
/*
3026+
* Next check the srb status
3027+
*/
3028+
switch ((le32_to_cpu(srbreply->srb_status))&0x3f) {
3029+
case SRB_STATUS_ERROR_RECOVERY:
3030+
case SRB_STATUS_PENDING:
3031+
case SRB_STATUS_SUCCESS:
3032+
scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8;
3033+
break;
3034+
case SRB_STATUS_DATA_OVERRUN:
3035+
switch (scsicmd->cmnd[0]) {
3036+
case READ_6:
3037+
case WRITE_6:
3038+
case READ_10:
3039+
case WRITE_10:
3040+
case READ_12:
3041+
case WRITE_12:
3042+
case READ_16:
3043+
case WRITE_16:
3044+
if (le32_to_cpu(srbreply->data_xfer_length)
3045+
< scsicmd->underflow)
3046+
pr_warn("aacraid: SCSI CMD underflow\n");
3047+
else
3048+
pr_warn("aacraid: SCSI CMD Data Overrun\n");
30963049
scsicmd->result = DID_ERROR << 16
3097-
| MESSAGE_REJECT << 8;
3050+
| COMMAND_COMPLETE << 8;
3051+
break;
3052+
case INQUIRY:
3053+
scsicmd->result = DID_OK << 16
3054+
| COMMAND_COMPLETE << 8;
30983055
break;
3099-
case SRB_STATUS_REQUEST_FLUSHED:
3100-
case SRB_STATUS_ERROR:
3101-
case SRB_STATUS_INVALID_REQUEST:
3102-
case SRB_STATUS_REQUEST_SENSE_FAILED:
3103-
case SRB_STATUS_NO_HBA:
3104-
case SRB_STATUS_UNEXPECTED_BUS_FREE:
3105-
case SRB_STATUS_PHASE_SEQUENCE_FAILURE:
3106-
case SRB_STATUS_BAD_SRB_BLOCK_LENGTH:
3107-
case SRB_STATUS_DELAYED_RETRY:
3108-
case SRB_STATUS_BAD_FUNCTION:
3109-
case SRB_STATUS_NOT_STARTED:
3110-
case SRB_STATUS_NOT_IN_USE:
3111-
case SRB_STATUS_FORCE_ABORT:
3112-
case SRB_STATUS_DOMAIN_VALIDATION_FAIL:
31133056
default:
3057+
scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8;
3058+
break;
3059+
}
3060+
break;
3061+
case SRB_STATUS_ABORTED:
3062+
scsicmd->result = DID_ABORT << 16 | ABORT << 8;
3063+
break;
3064+
case SRB_STATUS_ABORT_FAILED:
3065+
/*
3066+
* Not sure about this one - but assuming the
3067+
* hba was trying to abort for some reason
3068+
*/
3069+
scsicmd->result = DID_ERROR << 16 | ABORT << 8;
3070+
break;
3071+
case SRB_STATUS_PARITY_ERROR:
3072+
scsicmd->result = DID_PARITY << 16
3073+
| MSG_PARITY_ERROR << 8;
3074+
break;
3075+
case SRB_STATUS_NO_DEVICE:
3076+
case SRB_STATUS_INVALID_PATH_ID:
3077+
case SRB_STATUS_INVALID_TARGET_ID:
3078+
case SRB_STATUS_INVALID_LUN:
3079+
case SRB_STATUS_SELECTION_TIMEOUT:
3080+
scsicmd->result = DID_NO_CONNECT << 16
3081+
| COMMAND_COMPLETE << 8;
3082+
break;
3083+
3084+
case SRB_STATUS_COMMAND_TIMEOUT:
3085+
case SRB_STATUS_TIMEOUT:
3086+
scsicmd->result = DID_TIME_OUT << 16
3087+
| COMMAND_COMPLETE << 8;
3088+
break;
3089+
3090+
case SRB_STATUS_BUSY:
3091+
scsicmd->result = DID_BUS_BUSY << 16
3092+
| COMMAND_COMPLETE << 8;
3093+
break;
3094+
3095+
case SRB_STATUS_BUS_RESET:
3096+
scsicmd->result = DID_RESET << 16
3097+
| COMMAND_COMPLETE << 8;
3098+
break;
3099+
3100+
case SRB_STATUS_MESSAGE_REJECTED:
3101+
scsicmd->result = DID_ERROR << 16
3102+
| MESSAGE_REJECT << 8;
3103+
break;
3104+
case SRB_STATUS_REQUEST_FLUSHED:
3105+
case SRB_STATUS_ERROR:
3106+
case SRB_STATUS_INVALID_REQUEST:
3107+
case SRB_STATUS_REQUEST_SENSE_FAILED:
3108+
case SRB_STATUS_NO_HBA:
3109+
case SRB_STATUS_UNEXPECTED_BUS_FREE:
3110+
case SRB_STATUS_PHASE_SEQUENCE_FAILURE:
3111+
case SRB_STATUS_BAD_SRB_BLOCK_LENGTH:
3112+
case SRB_STATUS_DELAYED_RETRY:
3113+
case SRB_STATUS_BAD_FUNCTION:
3114+
case SRB_STATUS_NOT_STARTED:
3115+
case SRB_STATUS_NOT_IN_USE:
3116+
case SRB_STATUS_FORCE_ABORT:
3117+
case SRB_STATUS_DOMAIN_VALIDATION_FAIL:
3118+
default:
31143119
#ifdef AAC_DETAILED_STATUS_INFO
3115-
printk(KERN_INFO "aacraid: SRB ERROR(%u) %s scsi cmd 0x%x - scsi status 0x%x\n",
3116-
le32_to_cpu(srbreply->srb_status) & 0x3F,
3117-
aac_get_status_string(
3118-
le32_to_cpu(srbreply->srb_status) & 0x3F),
3119-
scsicmd->cmnd[0],
3120-
le32_to_cpu(srbreply->scsi_status));
3120+
pr_info("aacraid: SRB ERROR(%u) %s scsi cmd 0x%x -scsi status 0x%x\n",
3121+
le32_to_cpu(srbreply->srb_status) & 0x3F,
3122+
aac_get_status_string(
3123+
le32_to_cpu(srbreply->srb_status) & 0x3F),
3124+
scsicmd->cmnd[0],
3125+
le32_to_cpu(srbreply->scsi_status));
31213126
#endif
3122-
if ((scsicmd->cmnd[0] == ATA_12)
3123-
|| (scsicmd->cmnd[0] == ATA_16)) {
3124-
if (scsicmd->cmnd[2] & (0x01 << 5)) {
3125-
scsicmd->result = DID_OK << 16
3126-
| COMMAND_COMPLETE << 8;
3127-
break;
3128-
} else {
3129-
scsicmd->result = DID_ERROR << 16
3130-
| COMMAND_COMPLETE << 8;
3131-
break;
3132-
}
3127+
/*
3128+
* When the CC bit is SET by the host in ATA pass thru CDB,
3129+
* driver is supposed to return DID_OK
3130+
*
3131+
* When the CC bit is RESET by the host, driver should
3132+
* return DID_ERROR
3133+
*/
3134+
if ((scsicmd->cmnd[0] == ATA_12)
3135+
|| (scsicmd->cmnd[0] == ATA_16)) {
3136+
3137+
if (scsicmd->cmnd[2] & (0x01 << 5)) {
3138+
scsicmd->result = DID_OK << 16
3139+
| COMMAND_COMPLETE << 8;
3140+
break;
31333141
} else {
31343142
scsicmd->result = DID_ERROR << 16
31353143
| COMMAND_COMPLETE << 8;
3136-
break;
3144+
break;
31373145
}
3146+
} else {
3147+
scsicmd->result = DID_ERROR << 16
3148+
| COMMAND_COMPLETE << 8;
3149+
break;
31383150
}
3139-
if (le32_to_cpu(srbreply->scsi_status)
3140-
== SAM_STAT_CHECK_CONDITION) {
3141-
int len;
3151+
}
3152+
if (le32_to_cpu(srbreply->scsi_status)
3153+
== SAM_STAT_CHECK_CONDITION) {
3154+
int len;
31423155

3143-
scsicmd->result |= SAM_STAT_CHECK_CONDITION;
3144-
len = min_t(u32, le32_to_cpu(srbreply->sense_data_size),
3145-
SCSI_SENSE_BUFFERSIZE);
3156+
scsicmd->result |= SAM_STAT_CHECK_CONDITION;
3157+
len = min_t(u32, le32_to_cpu(srbreply->sense_data_size),
3158+
SCSI_SENSE_BUFFERSIZE);
31463159
#ifdef AAC_DETAILED_STATUS_INFO
3147-
printk(KERN_WARNING "aac_srb_callback: check condition, status = %d len=%d\n",
3148-
le32_to_cpu(srbreply->status), len);
3160+
pr_warn("aac_srb_callback: check condition, status = %d len=%d\n",
3161+
le32_to_cpu(srbreply->status), len);
31493162
#endif
3150-
memcpy(scsicmd->sense_buffer,
3151-
srbreply->sense_data, len);
3152-
}
3163+
memcpy(scsicmd->sense_buffer,
3164+
srbreply->sense_data, len);
31533165
}
3166+
31543167
/*
31553168
* OR in the scsi status (already shifted up a bit)
31563169
*/

0 commit comments

Comments
 (0)