aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/e1000
diff options
context:
space:
mode:
authorMalli Chilakala <mallikarjuna.chilakala@intel.com>2005-04-28 22:41:46 -0400
committerJeff Garzik <jgarzik@pobox.com>2005-05-12 20:48:54 -0400
commit97338bde27d97347bc83203d6ac5e93be1ebcd03 (patch)
treea2897ca9e0ea40ef14ea1bcb4af69769021e9414 /drivers/net/e1000
parenta4cb847dac40577dd751a4deb4085ed080780679 (diff)
[PATCH] e1000: Implement a workaround for 82546 errata 10
Implement 82546 errata 10 -- first Tx descriptor cannot have more than 2015 byte of data in it or it could hang the transmitter. Signed-off-by: Mallikarjuna R Chilakala <mallikarjuna.chilakala@intel.com> Signed-off-by: Ganesh Venkatesan <ganesh.venkatesan@intel.com> Signed-off-by: John Ronciak <john.ronciak@intel.com> diff -up net-drivers-2.6/drivers/net/e1000/e1000_main.c net-drivers-2.6/drivers/net/e1000.new/e1000_main.c
Diffstat (limited to 'drivers/net/e1000')
-rw-r--r--drivers/net/e1000/e1000_main.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c
index 479915a9f0fb..e54890aff5f1 100644
--- a/drivers/net/e1000/e1000_main.c
+++ b/drivers/net/e1000/e1000_main.c
@@ -1777,6 +1777,15 @@ e1000_tx_map(struct e1000_adapter *adapter, struct sk_buff *skb,
1777 if(unlikely(mss && !nr_frags && size == len && size > 8)) 1777 if(unlikely(mss && !nr_frags && size == len && size > 8))
1778 size -= 4; 1778 size -= 4;
1779#endif 1779#endif
1780 /* work-around for errata 10 and it applies
1781 * to all controllers in PCI-X mode
1782 * The fix is to make sure that the first descriptor of a
1783 * packet is smaller than 2048 - 16 - 16 (or 2016) bytes
1784 */
1785 if(unlikely((adapter->hw.bus_type == e1000_bus_type_pcix) &&
1786 (size > 2015) && count == 0))
1787 size = 2015;
1788
1780 /* Workaround for potential 82544 hang in PCI-X. Avoid 1789 /* Workaround for potential 82544 hang in PCI-X. Avoid
1781 * terminating buffers within evenly-aligned dwords. */ 1790 * terminating buffers within evenly-aligned dwords. */
1782 if(unlikely(adapter->pcix_82544 && 1791 if(unlikely(adapter->pcix_82544 &&
@@ -1979,6 +1988,13 @@ e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
1979 if(adapter->pcix_82544) 1988 if(adapter->pcix_82544)
1980 count++; 1989 count++;
1981 1990
1991 /* work-around for errata 10 and it applies to all controllers
1992 * in PCI-X mode, so add one more descriptor to the count
1993 */
1994 if(unlikely((adapter->hw.bus_type == e1000_bus_type_pcix) &&
1995 (len > 2015)))
1996 count++;
1997
1982 nr_frags = skb_shinfo(skb)->nr_frags; 1998 nr_frags = skb_shinfo(skb)->nr_frags;
1983 for(f = 0; f < nr_frags; f++) 1999 for(f = 0; f < nr_frags; f++)
1984 count += TXD_USE_COUNT(skb_shinfo(skb)->frags[f].size, 2000 count += TXD_USE_COUNT(skb_shinfo(skb)->frags[f].size,