|
@@ -949,6 +949,11 @@ static void gfar_detect_errata(struct gfar_private *priv)
|
|
(pvr == 0x80861010 && (mod & 0xfff9) == 0x80c0))
|
|
(pvr == 0x80861010 && (mod & 0xfff9) == 0x80c0))
|
|
priv->errata |= GFAR_ERRATA_A002;
|
|
priv->errata |= GFAR_ERRATA_A002;
|
|
|
|
|
|
|
|
+ /* MPC8313 Rev < 2.0, MPC8548 rev 2.0 */
|
|
|
|
+ if ((pvr == 0x80850010 && mod == 0x80b0 && rev < 0x0020) ||
|
|
|
|
+ (pvr == 0x80210020 && mod == 0x8030 && rev == 0x0020))
|
|
|
|
+ priv->errata |= GFAR_ERRATA_12;
|
|
|
|
+
|
|
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",
|
|
priv->errata);
|
|
priv->errata);
|
|
@@ -2154,8 +2159,15 @@ static int gfar_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
/* Set up checksumming */
|
|
/* Set up checksumming */
|
|
if (CHECKSUM_PARTIAL == skb->ip_summed) {
|
|
if (CHECKSUM_PARTIAL == skb->ip_summed) {
|
|
fcb = gfar_add_fcb(skb);
|
|
fcb = gfar_add_fcb(skb);
|
|
- lstatus |= BD_LFLAG(TXBD_TOE);
|
|
|
|
- gfar_tx_checksum(skb, fcb);
|
|
|
|
|
|
+ /* as specified by errata */
|
|
|
|
+ if (unlikely(gfar_has_errata(priv, GFAR_ERRATA_12)
|
|
|
|
+ && ((unsigned long)fcb % 0x20) > 0x18)) {
|
|
|
|
+ __skb_pull(skb, GMAC_FCB_LEN);
|
|
|
|
+ skb_checksum_help(skb);
|
|
|
|
+ } else {
|
|
|
|
+ lstatus |= BD_LFLAG(TXBD_TOE);
|
|
|
|
+ gfar_tx_checksum(skb, fcb);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
if (vlan_tx_tag_present(skb)) {
|
|
if (vlan_tx_tag_present(skb)) {
|