diff -urN ppc64-linux-2.5.orig/drivers/net/e1000/e1000.h ppc64-linux-2.5/drivers/net/e1000/e1000.h --- ppc64-linux-2.5.orig/drivers/net/e1000/e1000.h 2004-02-26 22:14:44.000000000 +1100 +++ ppc64-linux-2.5/drivers/net/e1000/e1000.h 2004-03-09 12:58:53.000000000 +1100 @@ -246,5 +246,9 @@ uint32_t pci_state[16]; + + /* TSO hack */ + unsigned long tso_hack_dma, tso_hack_len; + struct sk_buff *tso_hack_skb; }; #endif /* _E1000_H_ */ diff -urN ppc64-linux-2.5.orig/drivers/net/e1000/e1000_main.c ppc64-linux-2.5/drivers/net/e1000/e1000_main.c --- ppc64-linux-2.5.orig/drivers/net/e1000/e1000_main.c 2004-02-26 22:14:44.000000000 +1100 +++ ppc64-linux-2.5/drivers/net/e1000/e1000_main.c 2004-03-09 13:01:06.000000000 +1100 @@ -2200,17 +2200,25 @@ if(buffer_info->dma) { - pci_unmap_page(pdev, - buffer_info->dma, - buffer_info->length, + if (adapter->tso_hack_dma) { + pci_unmap_page(pdev, + adapter->tso_hack_dma, + adapter->tso_hack_len, PCI_DMA_TODEVICE); + } + adapter->tso_hack_dma = buffer_info->dma; + adapter->tso_hack_len = buffer_info->length; buffer_info->dma = 0; } if(buffer_info->skb) { - dev_kfree_skb_any(buffer_info->skb); + if (adapter->tso_hack_skb) + dev_kfree_skb_any( + adapter->tso_hack_skb); + + adapter->tso_hack_skb = buffer_info->skb; buffer_info->skb = NULL; }