aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Chan <mchan@broadcom.com>2014-05-11 23:22:53 -0400
committerDavid S. Miller <davem@davemloft.net>2014-05-13 18:38:51 -0400
commitd71c0dc4e961e74143a644f248fc1a39cabf6586 (patch)
tree7cfcab8112f848ace6738b699afe630e8430bef9
parentb6bd26c4de0141d0736a51487e4ca37390fcae03 (diff)
tg3: Don't modify ip header fields when doing GSO
tg3 uses GSO as workaround if the hardware cannot perform TSO on certain packets. We should not modify the ip header fields if we do GSO on the packet. It happens to work by accident because GSO recalculates the IP checksum and IP total length. Also fix the tg3_start_xmit comment to reflect that this is the only xmit function for all devices. Signed-off-by: Prashant Sreedharan <prashant@broadcom.com> Signed-off-by: Michael Chan <mchan@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/broadcom/tg3.c12
1 files changed, 5 insertions, 7 deletions
diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c
index e5d95c5ce1ad..bdfd08bcfe57 100644
--- a/drivers/net/ethernet/broadcom/tg3.c
+++ b/drivers/net/ethernet/broadcom/tg3.c
@@ -7871,9 +7871,7 @@ tg3_tso_bug_end:
7871 return NETDEV_TX_OK; 7871 return NETDEV_TX_OK;
7872} 7872}
7873 7873
7874/* hard_start_xmit for devices that have the 4G bug and/or 40-bit bug and 7874/* hard_start_xmit for all devices */
7875 * support TG3_FLAG_HW_TSO_1 or firmware TSO only.
7876 */
7877static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev) 7875static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
7878{ 7876{
7879 struct tg3 *tp = netdev_priv(dev); 7877 struct tg3 *tp = netdev_priv(dev);
@@ -7927,14 +7925,14 @@ static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
7927 hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb) - ETH_HLEN; 7925 hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb) - ETH_HLEN;
7928 7926
7929 if (!skb_is_gso_v6(skb)) { 7927 if (!skb_is_gso_v6(skb)) {
7928 if (unlikely((ETH_HLEN + hdr_len) > 80) &&
7929 tg3_flag(tp, TSO_BUG))
7930 return tg3_tso_bug(tp, skb);
7931
7930 iph->check = 0; 7932 iph->check = 0;
7931 iph->tot_len = htons(mss + hdr_len); 7933 iph->tot_len = htons(mss + hdr_len);
7932 } 7934 }
7933 7935
7934 if (unlikely((ETH_HLEN + hdr_len) > 80) &&
7935 tg3_flag(tp, TSO_BUG))
7936 return tg3_tso_bug(tp, skb);
7937
7938 base_flags |= (TXD_FLAG_CPU_PRE_DMA | 7936 base_flags |= (TXD_FLAG_CPU_PRE_DMA |
7939 TXD_FLAG_CPU_POST_DMA); 7937 TXD_FLAG_CPU_POST_DMA);
7940 7938