Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 65f56475 authored by Brian King's avatar Brian King Committed by James Bottomley
Browse files

[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: default avatarBrian King <brking@linux.vnet.ibm.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent 8a048994
Loading
Loading
Loading
Loading
+12 −2
Original line number Original line Diff line number Diff line
@@ -206,6 +206,8 @@ struct ipr_error_table_t ipr_error_table[] = {
	"8009: Impending cache battery pack failure"},
	"8009: Impending cache battery pack failure"},
	{0x02040400, 0, 0,
	{0x02040400, 0, 0,
	"34FF: Disk device format in progress"},
	"34FF: Disk device format in progress"},
	{0x02048000, 0, IPR_DEFAULT_LOG_LEVEL,
	"9070: IOA requested reset"},
	{0x023F0000, 0, 0,
	{0x023F0000, 0, 0,
	"Synchronization required"},
	"Synchronization required"},
	{0x024E0000, 0, 0,
	{0x024E0000, 0, 0,
@@ -1672,12 +1674,15 @@ static void ipr_process_error(struct ipr_cmnd *ipr_cmd)
	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
	struct ipr_hostrcb *hostrcb = ipr_cmd->u.hostrcb;
	struct ipr_hostrcb *hostrcb = ipr_cmd->u.hostrcb;
	u32 ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc);
	u32 ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc);
	u32 fd_ioasc = be32_to_cpu(hostrcb->hcam.u.error.failing_dev_ioasc);


	list_del(&hostrcb->queue);
	list_del(&hostrcb->queue);
	list_add_tail(&ipr_cmd->queue, &ioa_cfg->free_q);
	list_add_tail(&ipr_cmd->queue, &ioa_cfg->free_q);


	if (!ioasc) {
	if (!ioasc) {
		ipr_handle_log_data(ioa_cfg, hostrcb);
		ipr_handle_log_data(ioa_cfg, hostrcb);
		if (fd_ioasc == IPR_IOASC_NR_IOA_RESET_REQUIRED)
			ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_ABBREV);
	} else if (ioasc != IPR_IOASC_IOA_WAS_RESET) {
	} else if (ioasc != IPR_IOASC_IOA_WAS_RESET) {
		dev_err(&ioa_cfg->pdev->dev,
		dev_err(&ioa_cfg->pdev->dev,
			"Host RCB failed with IOASC: 0x%08X\n", ioasc);
			"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)
	struct ipr_hostrcb *hostrcb;
	struct ipr_hostrcb *hostrcb;
	struct ipr_uc_sdt sdt;
	struct ipr_uc_sdt sdt;
	int rc, length;
	int rc, length;
	u32 ioasc;


	mailbox = readl(ioa_cfg->ioa_mailbox);
	mailbox = readl(ioa_cfg->ioa_mailbox);


@@ -6322,9 +6328,13 @@ static void ipr_get_unit_check_buffer(struct ipr_ioa_cfg *ioa_cfg)
					(__be32 *)&hostrcb->hcam,
					(__be32 *)&hostrcb->hcam,
					min(length, (int)sizeof(hostrcb->hcam)) / sizeof(__be32));
					min(length, (int)sizeof(hostrcb->hcam)) / sizeof(__be32));


	if (!rc)
	if (!rc) {
		ipr_handle_log_data(ioa_cfg, hostrcb);
		ipr_handle_log_data(ioa_cfg, hostrcb);
	else
		ioasc = be32_to_cpu(hostrcb->hcam.u.error.failing_dev_ioasc);
		if (ioasc == IPR_IOASC_NR_IOA_RESET_REQUIRED &&
		    ioa_cfg->sdt_state == GET_DUMP)
			ioa_cfg->sdt_state = WAIT_FOR_DUMP;
	} else
		ipr_unit_check_no_data(ioa_cfg);
		ipr_unit_check_no_data(ioa_cfg);


	list_add_tail(&hostrcb->queue, &ioa_cfg->hostrcb_free_q);
	list_add_tail(&hostrcb->queue, &ioa_cfg->hostrcb_free_q);
+1 −0
Original line number Original line Diff line number Diff line
@@ -91,6 +91,7 @@
 * IOASCs
 * IOASCs
 */
 */
#define IPR_IOASC_NR_INIT_CMD_REQUIRED		0x02040200
#define IPR_IOASC_NR_INIT_CMD_REQUIRED		0x02040200
#define IPR_IOASC_NR_IOA_RESET_REQUIRED		0x02048000
#define IPR_IOASC_SYNC_REQUIRED			0x023f0000
#define IPR_IOASC_SYNC_REQUIRED			0x023f0000
#define IPR_IOASC_MED_DO_NOT_REALLOC		0x03110C00
#define IPR_IOASC_MED_DO_NOT_REALLOC		0x03110C00
#define IPR_IOASC_HW_SEL_TIMEOUT			0x04050000
#define IPR_IOASC_HW_SEL_TIMEOUT			0x04050000