mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
Merge branch 'gianfar'
Merge in gianfar driver bug fixes from Claudiu Manoil. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
9ed8111d02
1 changed files with 29 additions and 11 deletions
|
@ -88,6 +88,7 @@
|
||||||
|
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/reg.h>
|
#include <asm/reg.h>
|
||||||
|
#include <asm/mpc85xx.h>
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <linux/module.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 pvr = mfspr(SPRN_PVR);
|
||||||
unsigned int svr = mfspr(SPRN_SVR);
|
unsigned int svr = mfspr(SPRN_SVR);
|
||||||
unsigned int mod = (svr >> 16) & 0xfff6; /* w/o E suffix */
|
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))
|
(pvr == 0x80861010 && (mod & 0xfff9) == 0x80c0))
|
||||||
priv->errata |= GFAR_ERRATA_76;
|
priv->errata |= GFAR_ERRATA_76;
|
||||||
|
|
||||||
/* MPC8313 and MPC837x all rev */
|
/* MPC8313 Rev < 2.0 */
|
||||||
if ((pvr == 0x80850010 && mod == 0x80b0) ||
|
if (pvr == 0x80850010 && mod == 0x80b0 && rev < 0x0020)
|
||||||
(pvr == 0x80861010 && (mod & 0xfff9) == 0x80c0))
|
priv->errata |= GFAR_ERRATA_12;
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
priv->errata |= GFAR_ERRATA_A002;
|
||||||
|
|
||||||
/* MPC8313 Rev < 2.0, MPC8548 rev 2.0 */
|
if (pvr_version_is(PVR_VER_E500V1) || pvr_version_is(PVR_VER_E500V2))
|
||||||
if ((pvr == 0x80850010 && mod == 0x80b0 && rev < 0x0020) ||
|
__gfar_detect_errata_85xx(priv);
|
||||||
(pvr == 0x80210020 && mod == 0x8030 && rev == 0x0020))
|
else /* non-mpc85xx parts, i.e. e300 core based */
|
||||||
priv->errata |= GFAR_ERRATA_12;
|
__gfar_detect_errata_83xx(priv);
|
||||||
|
|
||||||
if (priv->errata)
|
if (priv->errata)
|
||||||
dev_info(dev, "enabled errata workarounds, flags: 0x%x\n",
|
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
|
/* Normaly TSEC should not hang on GRS commands, so we should
|
||||||
* actually wait for IEVENT_GRSC flag.
|
* 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;
|
return 0;
|
||||||
|
|
||||||
/* Read the eTSEC register at offset 0xD1C. If bits 7-14 are
|
/* Read the eTSEC register at offset 0xD1C. If bits 7-14 are
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue