hpsa: add more ioaccel2 error handling, including underrun statuses.
improve ioaccel2 error handling, including better handling of underrun statuses Reviewed-by: Scott Teel <scott.teel@pmcs.com> Reviewed-by: Kevin Barnett <kevin.barnett@pmcs.com> Signed-off-by: Joe Handzik <joseph.t.handzik@hp.com> Signed-off-by: Don Brace <don.brace@pmcs.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: James Bottomley <JBottomley@Odin.com>
This commit is contained in:
parent
d9a729f3e4
commit
c40820d511
@ -1863,6 +1863,7 @@ static int handle_ioaccel_mode2_error(struct ctlr_info *h,
|
|||||||
{
|
{
|
||||||
int data_len;
|
int data_len;
|
||||||
int retry = 0;
|
int retry = 0;
|
||||||
|
u32 ioaccel2_resid = 0;
|
||||||
|
|
||||||
switch (c2->error_data.serv_response) {
|
switch (c2->error_data.serv_response) {
|
||||||
case IOACCEL2_SERV_RESPONSE_COMPLETE:
|
case IOACCEL2_SERV_RESPONSE_COMPLETE:
|
||||||
@ -1921,11 +1922,31 @@ static int handle_ioaccel_mode2_error(struct ctlr_info *h,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case IOACCEL2_SERV_RESPONSE_FAILURE:
|
case IOACCEL2_SERV_RESPONSE_FAILURE:
|
||||||
/* don't expect to get here. */
|
switch (c2->error_data.status) {
|
||||||
dev_warn(&h->pdev->dev,
|
case IOACCEL2_STATUS_SR_IO_ERROR:
|
||||||
"unexpected delivery or target failure, status = 0x%02x\n",
|
case IOACCEL2_STATUS_SR_IO_ABORTED:
|
||||||
c2->error_data.status);
|
case IOACCEL2_STATUS_SR_OVERRUN:
|
||||||
retry = 1;
|
retry = 1;
|
||||||
|
break;
|
||||||
|
case IOACCEL2_STATUS_SR_UNDERRUN:
|
||||||
|
cmd->result = (DID_OK << 16); /* host byte */
|
||||||
|
cmd->result |= (COMMAND_COMPLETE << 8); /* msg byte */
|
||||||
|
ioaccel2_resid = get_unaligned_le32(
|
||||||
|
&c2->error_data.resid_cnt[0]);
|
||||||
|
scsi_set_resid(cmd, ioaccel2_resid);
|
||||||
|
break;
|
||||||
|
case IOACCEL2_STATUS_SR_NO_PATH_TO_DEVICE:
|
||||||
|
case IOACCEL2_STATUS_SR_INVALID_DEVICE:
|
||||||
|
case IOACCEL2_STATUS_SR_IOACCEL_DISABLED:
|
||||||
|
/* We will get an event from ctlr to trigger rescan */
|
||||||
|
retry = 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
retry = 1;
|
||||||
|
dev_warn(&h->pdev->dev,
|
||||||
|
"unexpected delivery or target failure, status = 0x%02x\n",
|
||||||
|
c2->error_data.status);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case IOACCEL2_SERV_RESPONSE_TMF_COMPLETE:
|
case IOACCEL2_SERV_RESPONSE_TMF_COMPLETE:
|
||||||
break;
|
break;
|
||||||
|
@ -532,6 +532,12 @@ struct io_accel2_scsi_response {
|
|||||||
#define IOACCEL2_STATUS_SR_TASK_COMP_SET_FULL 0x28
|
#define IOACCEL2_STATUS_SR_TASK_COMP_SET_FULL 0x28
|
||||||
#define IOACCEL2_STATUS_SR_TASK_COMP_ABORTED 0x40
|
#define IOACCEL2_STATUS_SR_TASK_COMP_ABORTED 0x40
|
||||||
#define IOACCEL2_STATUS_SR_IOACCEL_DISABLED 0x0E
|
#define IOACCEL2_STATUS_SR_IOACCEL_DISABLED 0x0E
|
||||||
|
#define IOACCEL2_STATUS_SR_IO_ERROR 0x01
|
||||||
|
#define IOACCEL2_STATUS_SR_IO_ABORTED 0x02
|
||||||
|
#define IOACCEL2_STATUS_SR_NO_PATH_TO_DEVICE 0x03
|
||||||
|
#define IOACCEL2_STATUS_SR_INVALID_DEVICE 0x04
|
||||||
|
#define IOACCEL2_STATUS_SR_UNDERRUN 0x51
|
||||||
|
#define IOACCEL2_STATUS_SR_OVERRUN 0x75
|
||||||
u8 data_present; /* low 2 bits */
|
u8 data_present; /* low 2 bits */
|
||||||
#define IOACCEL2_NO_DATAPRESENT 0x000
|
#define IOACCEL2_NO_DATAPRESENT 0x000
|
||||||
#define IOACCEL2_RESPONSE_DATAPRESENT 0x001
|
#define IOACCEL2_RESPONSE_DATAPRESENT 0x001
|
||||||
|
Loading…
x
Reference in New Issue
Block a user