aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/ipr.c
diff options
context:
space:
mode:
authorBrian King <brking@linux.vnet.ibm.com>2007-04-26 17:00:12 -0400
committerJames Bottomley <jejb@mulgrave.il.steeleye.com>2007-05-06 10:33:19 -0400
commit65f5647544960a68030352015d0b4a6234a818f8 (patch)
treee862690a950706a514c3bb25012f8353db11dfe1 /drivers/scsi/ipr.c
parent8a048994f4be7d0b670a358cea7812c6d5232105 (diff)
[SCSI] ipr: Handle IOA reset request
In ipr dual adapter configurations, the ipr adapter firmware may require an adapter reset for various reasons. The reset is requested by the adapter firmware logging an error with an IOASC of 0x02048000. Add support to log this error, and reset the adapter. Signed-off-by: Brian King <brking@linux.vnet.ibm.com> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
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);