Re: [PATCH 2/8] PCI / PCIe/ AER: Introduce pci_aer_available()
From: Rafael J. Wysocki <hidden>
Date: 2010-08-03 20:59:28
On Tuesday, August 03, 2010, Rafael J. Wysocki wrote:
On Tuesday, August 03, 2010, Hidetoshi Seto wrote:quoted
(2010/08/03 6:54), Rafael J. Wysocki wrote:quoted
From: Rafael J. Wysocki <redacted> Introduce a function allowing the caller to check if PCIe AER should be enabled. Signed-off-by: Rafael J. Wysocki <redacted> ---(snip)quoted
Index: linux-2.6/drivers/pci/pcie/aer/aerdrv.c ===================================================================--- linux-2.6.orig/drivers/pci/pcie/aer/aerdrv.c +++ linux-2.6/drivers/pci/pcie/aer/aerdrv.c@@ -72,6 +72,11 @@ void pci_no_aer(void) pcie_aer_disable = 1; /* has priority over 'forceload' */ } +bool pci_aer_available(void) +{ + return !pcie_aer_disable && pci_msi_enabled(); +} + static int set_device_error_reporting(struct pci_dev *dev, void *data) { bool enable = *((bool *)data);@@ -411,9 +416,7 @@ static void aer_error_resume(struct pci_ */ static int __init aer_service_init(void) { - if (pcie_aer_disable) - return -ENXIO; - if (!pci_msi_enabled()) + if (pci_aer_available()) return -ENXIO; return pcie_port_service_register(&aerdriver); }Breaking a big lump into small pieces often makes things clear. You should return error when AER is _NOT_ available. if (!pci_aer_available()) return -ENXIO; Be careful...Yup, sorry.
Corrected patch is appended. Thanks, Rafael --- From: Rafael J. Wysocki <redacted> Subject: PCI / PCIe/ AER: Introduce pci_aer_available() Introduce a function allowing the caller to check whether to try to enable PCIe AER. Signed-off-by: Rafael J. Wysocki <redacted> --- drivers/pci/pci.h | 2 ++ drivers/pci/pcie/aer/aerdrv.c | 9 ++++++--- 2 files changed, 8 insertions(+), 3 deletions(-) Index: linux-2.6/drivers/pci/pci.h ===================================================================
--- linux-2.6.orig/drivers/pci/pci.h
+++ linux-2.6/drivers/pci/pci.h@@ -131,8 +131,10 @@ static inline void pci_msi_init_pci_dev( #ifdef CONFIG_PCIEAER void pci_no_aer(void); +bool pci_aer_available(void); #else static inline void pci_no_aer(void) { } +static inline bool pci_aer_available(void) { return false; } #endif static inline int pci_no_d1d2(struct pci_dev *dev)
Index: linux-2.6/drivers/pci/pcie/aer/aerdrv.c ===================================================================
--- linux-2.6.orig/drivers/pci/pcie/aer/aerdrv.c
+++ linux-2.6/drivers/pci/pcie/aer/aerdrv.c@@ -72,6 +72,11 @@ void pci_no_aer(void) pcie_aer_disable = 1; /* has priority over 'forceload' */ } +bool pci_aer_available(void) +{ + return !pcie_aer_disable && pci_msi_enabled(); +} + static int set_device_error_reporting(struct pci_dev *dev, void *data) { bool enable = *((bool *)data);
@@ -411,9 +416,7 @@ static void aer_error_resume(struct pci_ */ static int __init aer_service_init(void) { - if (pcie_aer_disable) - return -ENXIO; - if (!pci_msi_enabled()) + if (!pci_aer_available()) return -ENXIO; return pcie_port_service_register(&aerdriver); }