From patchwork Mon Jul 19 21:49:19 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Brad Peters X-Patchwork-Id: 112809 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter.kernel.org (8.14.4/8.14.3) with ESMTP id o6JLnk6M002099 for ; Mon, 19 Jul 2010 21:49:53 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S966904Ab0GSVti (ORCPT ); Mon, 19 Jul 2010 17:49:38 -0400 Received: from e38.co.us.ibm.com ([32.97.110.159]:45656 "EHLO e38.co.us.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S966352Ab0GSVth (ORCPT ); Mon, 19 Jul 2010 17:49:37 -0400 Received: from d03relay05.boulder.ibm.com (d03relay05.boulder.ibm.com [9.17.195.107]) by e38.co.us.ibm.com (8.14.4/8.13.1) with ESMTP id o6JLgXLI025425 for ; Mon, 19 Jul 2010 15:42:33 -0600 Received: from d03av05.boulder.ibm.com (d03av05.boulder.ibm.com [9.17.195.85]) by d03relay05.boulder.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id o6JLnNgo028620 for ; Mon, 19 Jul 2010 15:49:24 -0600 Received: from d03av05.boulder.ibm.com (loopback [127.0.0.1]) by d03av05.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id o6JLnNgt009154 for ; Mon, 19 Jul 2010 15:49:23 -0600 Received: from [9.48.97.53] (sig-9-48-97-53.mts.ibm.com [9.48.97.53]) by d03av05.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id o6JLnLV4008745 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 19 Jul 2010 15:49:23 -0600 Message-ID: <4C44C85F.2050004@linux.vnet.ibm.com> Date: Mon, 19 Jul 2010 14:49:19 -0700 From: Brad Peters User-Agent: Thunderbird 2.0.0.23 (X11/20090817) MIME-Version: 1.0 To: linux-pci@vger.kernel.org, jbarnes@virtuousgeek.org Subject: PCI EEH pci_restore_state fix allowing for repeated adapter recovery per state save X-Enigmail-Version: 0.96.0 OpenPGP: id=D217D861 Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter.kernel.org [140.211.167.41]); Mon, 19 Jul 2010 21:49:57 +0000 (UTC) diff -uNrp -X linux-2.6.34/Documentation/dontdiff linux-2.6.34.orig/drivers/pci/pci.c linux-2.6.34/drivers/pci/pci.c --- linux-2.6.34.orig/drivers/pci/pci.c 2010-05-16 14:17:36.000000000 -0700 +++ linux-2.6.34/drivers/pci/pci.c 2010-05-26 17:16:20.000000000 -0700 @@ -920,19 +920,11 @@ pci_save_state(struct pci_dev *dev) return 0; } -/** - * pci_restore_state - Restore the saved state of a PCI device - * @dev: - PCI device that we're dealing with - */ -int -pci_restore_state(struct pci_dev *dev) +static void __pci_restore_state(struct pci_dev *dev) { int i; u32 val; - if (!dev->state_saved) - return 0; - /* PCI Express register must be restored first */ pci_restore_pcie_state(dev); @@ -953,12 +945,44 @@ pci_restore_state(struct pci_dev *dev) pci_restore_pcix_state(dev); pci_restore_msi_state(dev); pci_restore_iov_state(dev); +} + + +/** + * pci_restore_state - Restore the saved state of a PCI device + * only if dev->state_saved is not 0. Used by + * power management suspend/restore routines. + * @dev: - PCI device that we're dealing with + */ +int +pci_restore_state(struct pci_dev *dev) +{ + + if (!dev->state_saved) + return 0; + + __pci_restore_state(dev); dev->state_saved = false; return 0; } +/** + * pci_force_restore_state - Restore the saved state of a PCI device + * even if dev->state_saved is 0. Used by + * EEH and AER PCI error recovery. + * @dev: - PCI device that we're dealing with + */ +int +pci_force_restore_state(struct pci_dev *dev) +{ + __pci_restore_state(dev); + + return 0; +} + + static int do_pci_enable_device(struct pci_dev *dev, int bars) { int err; @@ -3039,6 +3063,7 @@ EXPORT_SYMBOL(pci_select_bars); EXPORT_SYMBOL(pci_set_power_state); EXPORT_SYMBOL(pci_save_state); EXPORT_SYMBOL(pci_restore_state); +EXPORT_SYMBOL(pci_force_restore_state); EXPORT_SYMBOL(pci_pme_capable); EXPORT_SYMBOL(pci_pme_active); EXPORT_SYMBOL(pci_wake_from_d3); diff -uNrp -X linux-2.6.34/Documentation/dontdiff linux-2.6.34.orig/include/linux/pci.h linux-2.6.34/include/linux/pci.h --- linux-2.6.34.orig/include/linux/pci.h 2010-05-16 14:17:36.000000000 -0700 +++ linux-2.6.34/include/linux/pci.h 2010-05-26 17:16:21.000000000 -0700 @@ -792,6 +792,7 @@ size_t pci_get_rom_size(struct pci_dev * /* Power management related routines */ int pci_save_state(struct pci_dev *dev); int pci_restore_state(struct pci_dev *dev); +int pci_force_restore_state(struct pci_dev *dev); int __pci_complete_power_transition(struct pci_dev *dev, pci_power_t state); int pci_set_power_state(struct pci_dev *dev, pci_power_t state); pci_power_t pci_choose_state(struct pci_dev *dev, pm_message_t state); @@ -1155,6 +1156,11 @@ static inline int pci_restore_state(stru return 0; } +static inline int pci_force_restore_state(struct pci_dev *dev) +{ + return 0; +} + static inline int pci_set_power_state(struct pci_dev *dev, pci_power_t state) { return 0;