diff options
author | Matt Carlson <mcarlson@broadcom.com> | 2007-05-05 14:50:04 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2007-05-05 14:50:04 -0400 |
commit | c13e3713857d5ea572cd67f3d5749100b1963ad2 (patch) | |
tree | 99484a1ac84b083a58a60e9bcb3dcbeda44a6988 /drivers/net/tg3.c | |
parent | 64a327a7029d3860ddf6a024816afa9e6673eb57 (diff) |
[TG3]: Fix TSO bugs.
1. Remove the check for skb->len greater than MTU when doing TSO.
When the destination has a smaller MSS than the source, a TSO packet
may be smaller than the MTU and we still need to process it as a TSO
packet.
2. On 5705A3 devices with TSO enabled, the DMA engine can hang due to a
hardware bug. This patch avoids the hanging condition by reducing the
DMA burst size.
Signed-off-by: Matt Carlson <mcarlson@broadcom.com>
Signed-off-by: Michael Chan <mchan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/tg3.c')
-rw-r--r-- | drivers/net/tg3.c | 9 |
1 files changed, 3 insertions, 6 deletions
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index 9488f49ea569..b8141be56d74 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
@@ -3895,8 +3895,7 @@ static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
3895 | entry = tp->tx_prod; | 3895 | entry = tp->tx_prod; |
3896 | base_flags = 0; | 3896 | base_flags = 0; |
3897 | mss = 0; | 3897 | mss = 0; |
3898 | if (skb->len > (tp->dev->mtu + ETH_HLEN) && | 3898 | if ((mss = skb_shinfo(skb)->gso_size) != 0) { |
3899 | (mss = skb_shinfo(skb)->gso_size) != 0) { | ||
3900 | int tcp_opt_len, ip_tcp_len; | 3899 | int tcp_opt_len, ip_tcp_len; |
3901 | 3900 | ||
3902 | if (skb_header_cloned(skb) && | 3901 | if (skb_header_cloned(skb) && |
@@ -4053,8 +4052,7 @@ static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev) | |||
4053 | if (skb->ip_summed == CHECKSUM_PARTIAL) | 4052 | if (skb->ip_summed == CHECKSUM_PARTIAL) |
4054 | base_flags |= TXD_FLAG_TCPUDP_CSUM; | 4053 | base_flags |= TXD_FLAG_TCPUDP_CSUM; |
4055 | mss = 0; | 4054 | mss = 0; |
4056 | if (skb->len > (tp->dev->mtu + ETH_HLEN) && | 4055 | if ((mss = skb_shinfo(skb)->gso_size) != 0) { |
4057 | (mss = skb_shinfo(skb)->gso_size) != 0) { | ||
4058 | struct iphdr *iph; | 4056 | struct iphdr *iph; |
4059 | int tcp_opt_len, ip_tcp_len, hdr_len; | 4057 | int tcp_opt_len, ip_tcp_len, hdr_len; |
4060 | 4058 | ||
@@ -6346,8 +6344,7 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) | |||
6346 | tp->pci_chip_rev_id != CHIPREV_ID_5705_A0) || | 6344 | tp->pci_chip_rev_id != CHIPREV_ID_5705_A0) || |
6347 | (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750)) { | 6345 | (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750)) { |
6348 | if (tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE && | 6346 | if (tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE && |
6349 | (tp->pci_chip_rev_id == CHIPREV_ID_5705_A1 || | 6347 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) { |
6350 | tp->pci_chip_rev_id == CHIPREV_ID_5705_A2)) { | ||
6351 | rdmac_mode |= RDMAC_MODE_FIFO_SIZE_128; | 6348 | rdmac_mode |= RDMAC_MODE_FIFO_SIZE_128; |
6352 | } else if (!(tr32(TG3PCI_PCISTATE) & PCISTATE_BUS_SPEED_HIGH) && | 6349 | } else if (!(tr32(TG3PCI_PCISTATE) & PCISTATE_BUS_SPEED_HIGH) && |
6353 | !(tp->tg3_flags2 & TG3_FLG2_IS_5788)) { | 6350 | !(tp->tg3_flags2 & TG3_FLG2_IS_5788)) { |