public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Linas Vepstas <linas@austin.ibm.com>
To: paulus@samba.org, benh@kernel.crashing.org
Cc: linuxppc64-dev@ozlabs.org, linux-kernel@vger.kernel.org,
	linux-pci@atrey.karlin.mff.cuni.cz,
	pcihpd-discuss@lists.sourceforge.net, johnrose@us.ibm.com,
	moilanen@austin.ibm.com, akpm@osdl.org, greg@kroah.com
Subject: [patch 3/8] PCI Error Recovery: IPR SCSI device driver
Date: Tue, 23 Aug 2005 18:41:50 -0500	[thread overview]
Message-ID: <20050823234150.GD18113@austin.ibm.com> (raw)
In-Reply-To: <20050823232140.520090000@bilge>

[-- Attachment #1: Type: text/plain, Size: 5493 bytes --]


Various PCI bus errors can be signaled by newer PCI controllers.  This
patch adds the PCI error recovery callbacks to the IPR SCSI device driver.
The patch has been tested, and appears to work well.

Signed-off-by: Linas Vepstas <linas@linas.org>

--
 arch/ppc64/configs/pSeries_defconfig |    1 
 drivers/scsi/Kconfig                 |    8 +++
 drivers/scsi/ipr.c                   |   93 +++++++++++++++++++++++++++++++++++
 3 files changed, 102 insertions(+)

Index: linux-2.6.13-rc6-git9/drivers/scsi/Kconfig
===================================================================
--- linux-2.6.13-rc6-git9.orig/drivers/scsi/Kconfig	2005-08-19 13:39:32.000000000 -0500
+++ linux-2.6.13-rc6-git9/drivers/scsi/Kconfig	2005-08-19 13:40:10.000000000 -0500
@@ -1065,6 +1065,14 @@
 	  If you enable this support, the iprdump daemon can be used
 	  to capture adapter failure analysis information.
 
+config SCSI_IPR_EEH_RECOVERY
+	bool "Enable PCI bus error recovery"
+	depends on SCSI_IPR && PPC_PSERIES
+	help
+		If you say Y here, the driver will be able to recover from
+		PCI bus errors on many PowerPC platforms. IBM pSeries users
+		should answer Y.
+
 config SCSI_ZALON
 	tristate "Zalon SCSI support"
 	depends on GSC && SCSI
Index: linux-2.6.13-rc6-git9/drivers/scsi/ipr.c
===================================================================
--- linux-2.6.13-rc6-git9.orig/drivers/scsi/ipr.c	2005-08-19 13:39:31.000000000 -0500
+++ linux-2.6.13-rc6-git9/drivers/scsi/ipr.c	2005-08-19 13:40:09.000000000 -0500
@@ -5326,6 +5326,88 @@
 				shutdown_type);
 }
 
+#ifdef CONFIG_SCSI_IPR_EEH_RECOVERY
+
+/** If the PCI slot is frozen, hold off all i/o
+ *  activity; then, as soon as the slot is available again,
+ *  initiate an adapter reset.
+ */
+static int ipr_reset_freeze(struct ipr_cmnd *ipr_cmd)
+{
+	list_add_tail(&ipr_cmd->queue, &ipr_cmd->ioa_cfg->pending_q);
+	ipr_cmd->done = ipr_reset_ioa_job;
+	return IPR_RC_JOB_RETURN;
+}
+
+/** ipr_eeh_frozen -- called when slot has experience PCI bus error.
+ *  This routine is called to tell us that the PCI bus is down.
+ *  Can't do anything here, except put the device driver into a
+ *  holding pattern, waiting for the PCI bus to come back.
+ */
+static void ipr_eeh_frozen (struct pci_dev *pdev)
+{
+	unsigned long flags = 0;
+	struct ipr_ioa_cfg *ioa_cfg = pci_get_drvdata(pdev);
+
+	spin_lock_irqsave(ioa_cfg->host->host_lock, flags);
+	_ipr_initiate_ioa_reset(ioa_cfg, ipr_reset_freeze, IPR_SHUTDOWN_NONE);
+	spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags);
+}
+
+/** ipr_eeh_slot_reset - called when pci slot has been reset.
+ *
+ * This routine is called by the pci error recovery recovery
+ * code after the PCI slot has been reset, just before we
+ * should resume normal operations.
+ */
+static int ipr_eeh_slot_reset (struct pci_dev *pdev)
+{
+	unsigned long flags = 0;
+	struct ipr_ioa_cfg *ioa_cfg = pci_get_drvdata(pdev);
+
+	pci_enable_device(pdev);
+	pci_set_master(pdev);
+	enable_irq (pdev->irq);
+	spin_lock_irqsave(ioa_cfg->host->host_lock, flags);
+	_ipr_initiate_ioa_reset(ioa_cfg, ipr_reset_restore_cfg_space,
+	                                 IPR_SHUTDOWN_NONE);
+	spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags);
+
+	return PCIERR_RESULT_RECOVERED;
+}
+
+/** This routine is called when the PCI bus has permanently
+ *  failed.  This routine should purge all pending I/O and
+ *  shut down the device driver (close and unload).
+ *  XXX Needs to be implemented.
+ */
+static void ipr_eeh_perm_failure (struct pci_dev *pdev)
+{
+#if 0  // XXXXXXXXXXXXXXXXXXXXXXX
+	ipr_cmd->job_step = ipr_reset_shutdown_ioa;
+	rc = IPR_RC_JOB_CONTINUE;
+#endif
+}
+
+static int ipr_eeh_error_detected (struct pci_dev *pdev,
+                                enum pci_channel_state state)
+{
+	switch (state) {
+		case pci_channel_io_frozen:
+			ipr_eeh_frozen (pdev);
+			return PCIERR_RESULT_NEED_RESET;
+
+		case pci_channel_io_perm_failure:
+			ipr_eeh_perm_failure (pdev);
+			return PCIERR_RESULT_DISCONNECT;
+			break;
+		default:
+			break;
+	}
+	return PCIERR_RESULT_NEED_RESET;
+}
+#endif
+
 /**
  * ipr_probe_ioa_part2 - Initializes IOAs found in ipr_probe_ioa(..)
  * @ioa_cfg:	ioa cfg struct
@@ -6063,12 +6145,23 @@
 };
 MODULE_DEVICE_TABLE(pci, ipr_pci_table);
 
+
+#ifdef CONFIG_SCSI_IPR_EEH_RECOVERY
+static struct pci_error_handlers ipr_err_handler = {
+	.error_detected = ipr_eeh_error_detected,
+	.slot_reset = ipr_eeh_slot_reset,
+};
+#endif /* CONFIG_SCSI_IPR_EEH_RECOVERY */
+
 static struct pci_driver ipr_driver = {
 	.name = IPR_NAME,
 	.id_table = ipr_pci_table,
 	.probe = ipr_probe,
 	.remove = ipr_remove,
 	.shutdown = ipr_shutdown,
+#ifdef CONFIG_SCSI_IPR_EEH_RECOVERY
+	.err_handler = &ipr_err_handler,
+#endif /* CONFIG_SCSI_IPR_EEH_RECOVERY */
 };
 
 /**
Index: linux-2.6.13-rc6-git9/arch/ppc64/configs/pSeries_defconfig
===================================================================
--- linux-2.6.13-rc6-git9.orig/arch/ppc64/configs/pSeries_defconfig	2005-08-19 13:39:32.000000000 -0500
+++ linux-2.6.13-rc6-git9/arch/ppc64/configs/pSeries_defconfig	2005-08-19 13:40:44.000000000 -0500
@@ -476,6 +476,7 @@
 CONFIG_SCSI_IPR=y
 CONFIG_SCSI_IPR_TRACE=y
 CONFIG_SCSI_IPR_DUMP=y
+CONFIG_SCSI_IPR_EEH_RECOVERY=y
 # CONFIG_SCSI_QLOGIC_FC is not set
 # CONFIG_SCSI_QLOGIC_1280 is not set
 CONFIG_SCSI_QLA2XXX=y

--

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 189 bytes --]

  parent reply	other threads:[~2005-08-23 23:41 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20050823231817.829359000@bilge>
2005-08-23 23:35 ` [patch 0/8] PCI Error Recovery patchset Linas Vepstas
     [not found] ` <20050823232140.337320000@bilge>
2005-08-23 23:39   ` [patch 2/8] PCI Error Recovery: header file patch Linas Vepstas
     [not found] ` <20050823232140.520090000@bilge>
2005-08-23 23:41   ` Linas Vepstas [this message]
     [not found] ` <20050823232140.903067000@bilge>
2005-08-23 23:43   ` [patch 4/8] PCI Error Recovery: Symbios SCSI device driver Linas Vepstas
     [not found] ` <20050823232141.286102000@bilge>
2005-08-23 23:45   ` [patch 5/8] PCI Error Recovery: e100 network " Linas Vepstas
     [not found] ` <20050823232141.925586000@bilge>
2005-08-23 23:46   ` [patch 6/8] PCI Error Recovery: e1000 " Linas Vepstas
     [not found] ` <20050823232142.651390000@bilge>
2005-08-23 23:47   ` [patch 7/8] PCI Error Recovery: ixgb " Linas Vepstas
     [not found] ` <20050823232143.003048000@bilge>
2005-08-23 23:47   ` [patch 8/8] PCI Error Recovery: PPC64 core recovery routines Linas Vepstas
2005-08-24  0:43     ` Paul Mackerras
2005-08-24  4:49       ` Paul Mackerras
2005-08-24 15:45     ` John Rose
2005-08-24 16:29       ` Linas Vepstas
2005-08-25  0:10         ` Paul Mackerras
2005-08-25  0:49           ` Benjamin Herrenschmidt
2005-08-25 16:21             ` Linas Vepstas
2005-08-25 21:43               ` Benjamin Herrenschmidt
2005-08-25 23:18                 ` Paul Mackerras
2005-08-25 23:37                   ` Benjamin Herrenschmidt
2005-08-29 16:00                     ` Linas Vepstas
2005-08-29 15:57                 ` Linas Vepstas
2005-08-25 16:13           ` Linas Vepstas
2005-08-29  6:40             ` Paul Mackerras
2005-08-29 16:09               ` Linas Vepstas
2005-08-30  4:44                 ` Paul Mackerras
2005-08-30 22:33                   ` John Rose
2005-08-29 20:26               ` John Rose
2005-08-29 20:31                 ` John Rose

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20050823234150.GD18113@austin.ibm.com \
    --to=linas@austin.ibm.com \
    --cc=akpm@osdl.org \
    --cc=benh@kernel.crashing.org \
    --cc=greg@kroah.com \
    --cc=johnrose@us.ibm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@atrey.karlin.mff.cuni.cz \
    --cc=linuxppc64-dev@ozlabs.org \
    --cc=moilanen@austin.ibm.com \
    --cc=paulus@samba.org \
    --cc=pcihpd-discuss@lists.sourceforge.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox