Shaohui Xie <b21...@freescale.com> wrote: > diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c > index a45a63c..9ab7b97 100644 > --- a/arch/powerpc/kernel/traps.c > +++ b/arch/powerpc/kernel/traps.c > @@ -55,6 +55,7 @@ > #endif > #include <asm/kexec.h> > #include <asm/ppc-opcode.h> > +#include <asm/rio.h> > > #if defined(CONFIG_DEBUGGER) || defined(CONFIG_KEXEC) > int (*__debugger)(struct pt_regs *regs) __read_mostly; > @@ -425,6 +426,12 @@ int machine_check_e500mc(struct pt_regs *regs) > unsigned long reason = mcsr; > int recoverable = 1; > > + if (reason & MCSR_BUS_RBERR) { > + recoverable = fsl_rio_mcheck_exception(regs); > + if (recoverable == 1) > + goto silent_out; > + } > + > printk("Machine check in kernel mode.\n"); > printk("Caused by (from MCSR=%lx): ", reason); > > @@ -500,6 +507,7 @@ int machine_check_e500mc(struct pt_regs *regs) > reason & MCSR_MEA ? "Effective" : "Physical", addr); > } > > +silent_out: > mtspr(SPRN_MCSR, mcsr); > return mfspr(SPRN_MCSR) == 0 && recoverable; > } > @@ -507,6 +515,13 @@ int machine_check_e500mc(struct pt_regs *regs) > int machine_check_e500(struct pt_regs *regs) > { > unsigned long reason = get_mc_reason(regs); > + int ret = 0; > + > + if (reason & MCSR_BUS_RBERR) { > + ret = fsl_rio_mcheck_exception(regs); > + if (ret == 1) > + return ret; > + }
Do we really need 'ret' variable here? There is no further use of it by the rest of the code. Maybe just return 1 here if fsl_rio_mcheck_exception() returns 1 ? > > printk("Machine check in kernel mode.\n"); > printk("Caused by (from MCSR=%lx): ", reason); > @@ -536,7 +551,7 @@ int machine_check_e500(struct pt_regs *regs) > if (reason & MCSR_BUS_RPERR) > printk("Bus - Read Parity Error\n"); > > - return 0; > + return ret; > } > #elif defined(CONFIG_E200) > int machine_check_e200(struct pt_regs *regs) Works for RapidIO as expected now. Thank you, Alex. _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev