On 04/16/2015 03:48 PM, Don Brace wrote:
> From: Joe Handzik <[email protected]>
> 
> improve ioaccel2 error handling, including better handling of
> underrun statuses
> 
> Reviewed-by: Scott Teel <[email protected]>
> Reviewed-by: Kevin Barnett <[email protected]>
> Signed-off-by: Joe Handzik <[email protected]>
> Signed-off-by: Don Brace <[email protected]>
> ---
>  drivers/scsi/hpsa.c     |   33 ++++++++++++++++++++++++++++-----
>  drivers/scsi/hpsa_cmd.h |    6 ++++++
>  2 files changed, 34 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c
> index 1839761..fd9620d 100644
> --- a/drivers/scsi/hpsa.c
> +++ b/drivers/scsi/hpsa.c
> @@ -1868,6 +1868,7 @@ static int handle_ioaccel_mode2_error(struct ctlr_info 
> *h,
>  {
>       int data_len;
>       int retry = 0;
> +     u32 ioaccel2_resid = 0;
>  
>       switch (c2->error_data.serv_response) {
>       case IOACCEL2_SERV_RESPONSE_COMPLETE:
> @@ -1926,11 +1927,33 @@ static int handle_ioaccel_mode2_error(struct 
> ctlr_info *h,
>               }
>               break;
>       case IOACCEL2_SERV_RESPONSE_FAILURE:
> -             /* don't expect to get here. */
> -             dev_warn(&h->pdev->dev,
> -                     "unexpected delivery or target failure, status = 
> 0x%02x\n",
> -                     c2->error_data.status);
> -             retry = 1;
> +             switch (c2->error_data.status) {
> +             case IOACCEL2_STATUS_SR_IO_ERROR:
> +             case IOACCEL2_STATUS_SR_IO_ABORTED:
> +             case IOACCEL2_STATUS_SR_OVERRUN:
> +                     retry = 1;
> +                     break;
> +             case IOACCEL2_STATUS_SR_UNDERRUN:
> +                     cmd->result = (DID_OK << 16);           /* host byte */
> +                     cmd->result |= (COMMAND_COMPLETE << 8); /* msg byte */
> +                     ioaccel2_resid = c2->error_data.resid_cnt[3] << 24;
> +                     ioaccel2_resid |= c2->error_data.resid_cnt[2] << 16;
> +                     ioaccel2_resid |= c2->error_data.resid_cnt[1] << 8;
> +                     ioaccel2_resid |= c2->error_data.resid_cnt[0];
> +                     scsi_set_resid(cmd, ioaccel2_resid);
> +                     break;
How curious. be32_to_cpu is probably a better choice here.

> +             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;
>       case IOACCEL2_SERV_RESPONSE_TMF_COMPLETE:
>               break;
> diff --git a/drivers/scsi/hpsa_cmd.h b/drivers/scsi/hpsa_cmd.h
> index 0efb6f2b..cecb62b 100644
> --- a/drivers/scsi/hpsa_cmd.h
> +++ b/drivers/scsi/hpsa_cmd.h
> @@ -532,6 +532,12 @@ struct io_accel2_scsi_response {
>  #define IOACCEL2_STATUS_SR_TASK_COMP_SET_FULL        0x28
>  #define IOACCEL2_STATUS_SR_TASK_COMP_ABORTED 0x40
>  #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 */
>  #define IOACCEL2_NO_DATAPRESENT              0x000
>  #define IOACCEL2_RESPONSE_DATAPRESENT        0x001
> 
Cheers,

Hannes
-- 
Dr. Hannes Reinecke                            zSeries & Storage
[email protected]                                   +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
HRB 21284 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to