Subject: Re: [PATCH] [POWERPC] AMCC Kilauea (405EX): Disable EMAC loopback mode

From: Benjamin Herrenschmidt <[email-masked]>
Date: Sat, 23 Feb 2008 08:27:35 +1100

On Fri, 2008-02-22 at 09:32 +0100, Stefan Roese wrote:
> 405EX(r) has SDR0_MFR[E0CS/E1CS] set after reset. This selects
> the internal loopback mode. Clear these bits so that both EMACs
> don't use loopback mode as default.
> 
> Signed-off-by: Stefan Roese <[email-masked]>
> ---
> I'm not sure if this should be done here in the board platform code,
> or in the newemac driver or perhaps in some code common for 405EX.
> 
> Any thoughts on this welcome.

This should be done in EMAC since we also need to force internal
loopback & clocking when probing the PHY or we might not probe
it properly (and fail reset) if there is no link.

I need to work on that.

Ben.

> Thanks.
> 
>  arch/powerpc/platforms/40x/kilauea.c |   11 ++++++++++-
>  1 files changed, 10 insertions(+), 1 deletions(-)
> 
> diff --git a/arch/powerpc/platforms/40x/kilauea.c b/arch/powerpc/platforms/40x/kilauea.c
> index f9206a7..b5456cc 100644
> --- a/arch/powerpc/platforms/40x/kilauea.c
> +++ b/arch/powerpc/platforms/40x/kilauea.c
> @@ -1,7 +1,7 @@
>  /*
>   * Kilauea board specific routines
>   *
> - * Copyright 2007 DENX Software Engineering, Stefan Roese <[email-masked]>
> + * Copyright 2007-2008 DENX Software Engineering, Stefan Roese <[email-masked]>
>   *
>   * Based on the Walnut code by
>   * Josh Boyer <[email-masked]>
> @@ -20,6 +20,8 @@
>  #include <asm/time.h>
>  #include <asm/uic.h>
>  #include <asm/pci-bridge.h>
> +#include <asm/dcr.h>
> +#include <asm/dcr-regs.h>
>  
>  static __initdata struct of_device_id kilauea_of_bus[] = {
>  	{ .compatible = "ibm,plb4", },
> @@ -45,6 +47,13 @@ static int __init kilauea_probe(void)
>  
>  	ppc_pci_flags = PPC_PCI_REASSIGN_ALL_RSRC;
>  
> +	/*
> +	 * 405EX(r) has SDR0_MFR[E0CS/E1CS] set after reset. This selects
> +	 * the internal loopback mode. Clear these bits so that both EMACs
> +	 * don't use loopback mode as deafult.
> +	 */
> +	mtdcri(SDR0, SDR0_MFR, mfdcri(SDR0, SDR0_MFR) & ~0x0c000000);
> +
>  	return 1;
>  }
>