Re: [PATCH 3/3] edac/85xx: Enable the EDAC PCI err driver by device_initcall
From: Chunhe Lan <hidden>
Date: 2012-09-28 02:27:13
On 09/27/2012 12:09 PM, Scott Wood wrote:
On 09/27/2012 02:02:03 PM, Chunhe Lan wrote:quoted
Original process of call: The mpc85xx_pci_err_probe function completes to been registered and enabled of EDAC PCI err driver at the latter time stage of kernel boot in the mpc85xx_edac.c. Current process of call: The mpc85xx_pci_err_probe function completes to been registered and enabled of EDAC PCI err driver at the first time stage of kernel boot in the fsl_pci.c. So in this case the following error messages appear in the boot log: PCI: Probing PCI hardware pci 0000:00:00.0: ignoring class b20 (doesn't match header type 01) PCIE error(s) detected PCIE ERR_DR register: 0x00020000 PCIE ERR_CAP_STAT register: 0x80000001 PCIE ERR_CAP_R0 register: 0x00000800 PCIE ERR_CAP_R1 register: 0x00000000 PCIE ERR_CAP_R2 register: 0x00000000 PCIE ERR_CAP_R3 register: 0x00000000 Because the EDAC PCI err driver is registered and enabled earlier than original point of call. But at this point of time, PCI hardware is not probed and initialized, and it is in unknowable state. So, move enable function into mpc85xx_pci_err_en which is called at the middle time stage of kernel boot and after PCI hardware is probed and initialized by device_initcall in the fsl_pci.c. Signed-off-by: Chunhe Lan <redacted> --- arch/powerpc/sysdev/fsl_pci.c | 12 ++++++++++ arch/powerpc/sysdev/fsl_pci.h | 5 ++++ drivers/edac/mpc85xx_edac.c | 47 ++++++++++++++++++++++++++++------------ 3 files changed, 50 insertions(+), 14 deletions(-)diff --git a/arch/powerpc/sysdev/fsl_pci.cb/arch/powerpc/sysdev/fsl_pci.c index 3d6f4d8..a591965 100644--- a/arch/powerpc/sysdev/fsl_pci.c +++ b/arch/powerpc/sysdev/fsl_pci.c@@ -904,4 +904,16 @@ static int __init fsl_pci_init(void) return platform_driver_register(&fsl_pci_driver); } arch_initcall(fsl_pci_init); + +static int __init fsl_pci_err_en(void) +{ + struct device_node *np; + + for_each_node_by_type(np, "pci") + if (of_match_node(pci_ids, np)) + mpc85xx_pci_err_en(np); + + return 0; +} +device_initcall(fsl_pci_err_en);Why can't you call this from the normal PCIe controller init, instead of searching for the node independently?
Because PCIe controller init is earlier than device_initcall, and
it does not fix this issue.
Do you indicate that which function calls fsl_pci_err_en in the
which file ?
Thanks,
Chunhe-Scott