diff options
Diffstat (limited to 'drivers/net/gianfar.c')
| -rw-r--r-- | drivers/net/gianfar.c | 19 |
1 files changed, 19 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); |
