diff options
Diffstat (limited to 'drivers/net/ethernet/freescale/gianfar.c')
| -rw-r--r-- | drivers/net/ethernet/freescale/gianfar.c | 38 | 
1 files changed, 28 insertions, 10 deletions
diff --git a/drivers/net/ethernet/freescale/gianfar.c b/drivers/net/ethernet/freescale/gianfar.c index c4eaadeb572f..9fbe4dda7a0e 100644 --- a/drivers/net/ethernet/freescale/gianfar.c +++ b/drivers/net/ethernet/freescale/gianfar.c @@ -88,6 +88,7 @@  #include <asm/io.h>  #include <asm/reg.h> +#include <asm/mpc85xx.h>  #include <asm/irq.h>  #include <asm/uaccess.h>  #include <linux/module.h> @@ -939,9 +940,8 @@ static void gfar_init_filer_table(struct gfar_private *priv)  	}  } -static void gfar_detect_errata(struct gfar_private *priv) +static void __gfar_detect_errata_83xx(struct gfar_private *priv)  { -	struct device *dev = &priv->ofdev->dev;  	unsigned int pvr = mfspr(SPRN_PVR);  	unsigned int svr = mfspr(SPRN_SVR);  	unsigned int mod = (svr >> 16) & 0xfff6; /* w/o E suffix */ @@ -957,15 +957,33 @@ static void gfar_detect_errata(struct gfar_private *priv)  	    (pvr == 0x80861010 && (mod & 0xfff9) == 0x80c0))  		priv->errata |= GFAR_ERRATA_76; -	/* MPC8313 and MPC837x all rev */ -	if ((pvr == 0x80850010 && mod == 0x80b0) || -	    (pvr == 0x80861010 && (mod & 0xfff9) == 0x80c0)) -		priv->errata |= GFAR_ERRATA_A002; +	/* MPC8313 Rev < 2.0 */ +	if (pvr == 0x80850010 && mod == 0x80b0 && rev < 0x0020) +		priv->errata |= GFAR_ERRATA_12; +} -	/* MPC8313 Rev < 2.0, MPC8548 rev 2.0 */ -	if ((pvr == 0x80850010 && mod == 0x80b0 && rev < 0x0020) || -	    (pvr == 0x80210020 && mod == 0x8030 && rev == 0x0020)) +static void __gfar_detect_errata_85xx(struct gfar_private *priv) +{ +	unsigned int svr = mfspr(SPRN_SVR); + +	if ((SVR_SOC_VER(svr) == SVR_8548) && (SVR_REV(svr) == 0x20))  		priv->errata |= GFAR_ERRATA_12; +	if (((SVR_SOC_VER(svr) == SVR_P2020) && (SVR_REV(svr) < 0x20)) || +	    ((SVR_SOC_VER(svr) == SVR_P2010) && (SVR_REV(svr) < 0x20))) +		priv->errata |= GFAR_ERRATA_76; /* aka eTSEC 20 */ +} + +static void gfar_detect_errata(struct gfar_private *priv) +{ +	struct device *dev = &priv->ofdev->dev; + +	/* no plans to fix */ +	priv->errata |= GFAR_ERRATA_A002; + +	if (pvr_version_is(PVR_VER_E500V1) || pvr_version_is(PVR_VER_E500V2)) +		__gfar_detect_errata_85xx(priv); +	else /* non-mpc85xx parts, i.e. e300 core based */ +		__gfar_detect_errata_83xx(priv);  	if (priv->errata)  		dev_info(dev, "enabled errata workarounds, flags: 0x%x\n", @@ -1599,7 +1617,7 @@ static int __gfar_is_rx_idle(struct gfar_private *priv)  	/* Normaly TSEC should not hang on GRS commands, so we should  	 * actually wait for IEVENT_GRSC flag.  	 */ -	if (likely(!gfar_has_errata(priv, GFAR_ERRATA_A002))) +	if (!gfar_has_errata(priv, GFAR_ERRATA_A002))  		return 0;  	/* Read the eTSEC register at offset 0xD1C. If bits 7-14 are  | 
