aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/ipr.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/ipr.c')
-rw-r--r--drivers/scsi/ipr.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c
index d871dd37d22c..393eda1d6537 100644
--- a/drivers/scsi/ipr.c
+++ b/drivers/scsi/ipr.c
@@ -206,6 +206,8 @@ struct ipr_error_table_t ipr_error_table[] = {
206 "8009: Impending cache battery pack failure"}, 206 "8009: Impending cache battery pack failure"},
207 {0x02040400, 0, 0, 207 {0x02040400, 0, 0,
208 "34FF: Disk device format in progress"}, 208 "34FF: Disk device format in progress"},
209 {0x02048000, 0, IPR_DEFAULT_LOG_LEVEL,
210 "9070: IOA requested reset"},
209 {0x023F0000, 0, 0, 211 {0x023F0000, 0, 0,
210 "Synchronization required"}, 212 "Synchronization required"},
211 {0x024E0000, 0, 0, 213 {0x024E0000, 0, 0,
@@ -1672,12 +1674,15 @@ static void ipr_process_error(struct ipr_cmnd *ipr_cmd)
1672 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; 1674 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
1673 struct ipr_hostrcb *hostrcb = ipr_cmd->u.hostrcb; 1675 struct ipr_hostrcb *hostrcb = ipr_cmd->u.hostrcb;
1674 u32 ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc); 1676 u32 ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc);
1677 u32 fd_ioasc = be32_to_cpu(hostrcb->hcam.u.error.failing_dev_ioasc);
1675 1678
1676 list_del(&hostrcb->queue); 1679 list_del(&hostrcb->queue);
1677 list_add_tail(&ipr_cmd->queue, &ioa_cfg->free_q); 1680 list_add_tail(&ipr_cmd->queue, &ioa_cfg->free_q);
1678 1681
1679 if (!ioasc) { 1682 if (!ioasc) {
1680 ipr_handle_log_data(ioa_cfg, hostrcb); 1683 ipr_handle_log_data(ioa_cfg, hostrcb);
1684 if (fd_ioasc == IPR_IOASC_NR_IOA_RESET_REQUIRED)
1685 ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_ABBREV);
1681 } else if (ioasc != IPR_IOASC_IOA_WAS_RESET) { 1686 } else if (ioasc != IPR_IOASC_IOA_WAS_RESET) {
1682 dev_err(&ioa_cfg->pdev->dev, 1687 dev_err(&ioa_cfg->pdev->dev,
1683 "Host RCB failed with IOASC: 0x%08X\n", ioasc); 1688 "Host RCB failed with IOASC: 0x%08X\n", ioasc);
@@ -6290,6 +6295,7 @@ static void ipr_get_unit_check_buffer(struct ipr_ioa_cfg *ioa_cfg)
6290 struct ipr_hostrcb *hostrcb; 6295 struct ipr_hostrcb *hostrcb;
6291 struct ipr_uc_sdt sdt; 6296 struct ipr_uc_sdt sdt;
6292 int rc, length; 6297 int rc, length;
6298 u32 ioasc;
6293 6299
6294 mailbox = readl(ioa_cfg->ioa_mailbox); 6300 mailbox = readl(ioa_cfg->ioa_mailbox);
6295 6301
@@ -6322,9 +6328,13 @@ static void ipr_get_unit_check_buffer(struct ipr_ioa_cfg *ioa_cfg)
6322 (__be32 *)&hostrcb->hcam, 6328 (__be32 *)&hostrcb->hcam,
6323 min(length, (int)sizeof(hostrcb->hcam)) / sizeof(__be32)); 6329 min(length, (int)sizeof(hostrcb->hcam)) / sizeof(__be32));
6324 6330
6325 if (!rc) 6331 if (!rc) {
6326 ipr_handle_log_data(ioa_cfg, hostrcb); 6332 ipr_handle_log_data(ioa_cfg, hostrcb);
6327 else 6333 ioasc = be32_to_cpu(hostrcb->hcam.u.error.failing_dev_ioasc);
6334 if (ioasc == IPR_IOASC_NR_IOA_RESET_REQUIRED &&
6335 ioa_cfg->sdt_state == GET_DUMP)
6336 ioa_cfg->sdt_state = WAIT_FOR_DUMP;
6337 } else
6328 ipr_unit_check_no_data(ioa_cfg); 6338 ipr_unit_check_no_data(ioa_cfg);
6329 6339
6330 list_add_tail(&hostrcb->queue, &ioa_cfg->hostrcb_free_q); 6340 list_add_tail(&hostrcb->queue, &ioa_cfg->hostrcb_free_q);