diff options
| -rw-r--r-- | drivers/net/gianfar.c | 19 | ||||
| -rw-r--r-- | drivers/net/gianfar.h | 1 | 
2 files changed, 20 insertions, 0 deletions
| diff --git a/drivers/net/gianfar.c b/drivers/net/gianfar.c index cee8ae714731..c2fabc1853ad 100644 --- a/drivers/net/gianfar.c +++ b/drivers/net/gianfar.c | |||
| @@ -942,6 +942,11 @@ static void gfar_detect_errata(struct gfar_private *priv) | |||
| 942 | (pvr == 0x80861010 && (mod & 0xfff9) == 0x80c0)) | 942 | (pvr == 0x80861010 && (mod & 0xfff9) == 0x80c0)) | 
| 943 | priv->errata |= GFAR_ERRATA_74; | 943 | priv->errata |= GFAR_ERRATA_74; | 
| 944 | 944 | ||
| 945 | /* MPC8313 and MPC837x all rev */ | ||
| 946 | if ((pvr == 0x80850010 && mod == 0x80b0) || | ||
| 947 | (pvr == 0x80861010 && (mod & 0xfff9) == 0x80c0)) | ||
| 948 | priv->errata |= GFAR_ERRATA_76; | ||
| 949 | |||
| 945 | if (priv->errata) | 950 | if (priv->errata) | 
| 946 | dev_info(dev, "enabled errata workarounds, flags: 0x%x\n", | 951 | dev_info(dev, "enabled errata workarounds, flags: 0x%x\n", | 
| 947 | priv->errata); | 952 | priv->errata); | 
| @@ -2011,6 +2016,20 @@ static int gfar_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 2011 | unsigned int nr_frags, nr_txbds, length; | 2016 | unsigned int nr_frags, nr_txbds, length; | 
| 2012 | union skb_shared_tx *shtx; | 2017 | union skb_shared_tx *shtx; | 
| 2013 | 2018 | ||
| 2019 | /* | ||
| 2020 | * TOE=1 frames larger than 2500 bytes may see excess delays | ||
| 2021 | * before start of transmission. | ||
| 2022 | */ | ||
| 2023 | if (unlikely(gfar_has_errata(priv, GFAR_ERRATA_76) && | ||
| 2024 | skb->ip_summed == CHECKSUM_PARTIAL && | ||
| 2025 | skb->len > 2500)) { | ||
| 2026 | int ret; | ||
| 2027 | |||
| 2028 | ret = skb_checksum_help(skb); | ||
| 2029 | if (ret) | ||
| 2030 | return ret; | ||
| 2031 | } | ||
| 2032 | |||
| 2014 | rq = skb->queue_mapping; | 2033 | rq = skb->queue_mapping; | 
| 2015 | tx_queue = priv->tx_queue[rq]; | 2034 | tx_queue = priv->tx_queue[rq]; | 
| 2016 | txq = netdev_get_tx_queue(dev, rq); | 2035 | txq = netdev_get_tx_queue(dev, rq); | 
| diff --git a/drivers/net/gianfar.h b/drivers/net/gianfar.h index 0a0483ce21d2..c414374f407f 100644 --- a/drivers/net/gianfar.h +++ b/drivers/net/gianfar.h | |||
| @@ -1027,6 +1027,7 @@ struct gfar_priv_grp { | |||
| 1027 | 1027 | ||
| 1028 | enum gfar_errata { | 1028 | enum gfar_errata { | 
| 1029 | GFAR_ERRATA_74 = 0x01, | 1029 | GFAR_ERRATA_74 = 0x01, | 
| 1030 | GFAR_ERRATA_76 = 0x02, | ||
| 1030 | }; | 1031 | }; | 
| 1031 | 1032 | ||
| 1032 | /* Struct stolen almost completely (and shamelessly) from the FCC enet source | 1033 | /* Struct stolen almost completely (and shamelessly) from the FCC enet source | 
