diff -urN -x Patches linux-2.6.23.1-orig/drivers/net/via-rhine.c linux-2.6.23.1/drivers/net/via-rhine.c
--- linux-2.6.23.1-orig/drivers/net/via-rhine.c	2007-11-02 12:14:45.000000000 +0200
+++ linux-2.6.23.1/drivers/net/via-rhine.c	2007-11-05 12:02:07.000000000 +0200
@@ -101,6 +101,8 @@
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
 #include <linux/skbuff.h>
+#include <linux/in.h>
+#include <linux/ip.h>
 #include <linux/init.h>
 #include <linux/delay.h>
 #include <linux/mii.h>
@@ -349,6 +351,9 @@
 
 /* Initial value for tx_desc.desc_length, Buffer size goes to bits 0-10 */
 #define TXDESC		0x00e08000
+#define TDES1_TCPCK    0x00100000  /* Bit 20,Transmit Desc 1 (VT6105M Data Sheet 1.63) */
+#define TDES1_UDPCK    0x00080000  /* Bit 19,Transmit Desc 1 (VT6105M Data Sheet 1.63) */     
+#define TDES1_IPCK     0x00040000  /* Bit 18,Transmit Desc 1 (VT6105M Data Sheet 1.63) */     
 
 enum rx_status_bits {
 	RxOK=0x8000, RxWholePkt=0x0300, RxErr=0x008F
@@ -789,6 +794,10 @@
 #endif
 	if (rp->quirks & rqRhineI)
 		dev->features |= NETIF_F_SG|NETIF_F_HW_CSUM;
+		
+	if (pdev->revision >=  VT6105M)    
+                dev->features |= NETIF_F_IP_CSUM;   /*tell stack chip does checksum */
+
 
 	/* dev->name not defined before register_netdev()! */
 	rc = register_netdev(dev);
@@ -1266,6 +1275,19 @@
 
 	/* lock eth irq */
 	spin_lock_irq(&rp->lock);
+	
+	if ((dev->features & NETIF_F_IP_CSUM) &&(skb->ip_summed == CHECKSUM_PARTIAL)) { 
+		const struct iphdr *ip = ip_hdr(skb);
+		
+		/* offload checksum to chip. */
+
+		if (ip->protocol == IPPROTO_TCP)
+			rp->tx_ring[entry].desc_length |= TDES1_TCPCK;
+		else if (ip->protocol == IPPROTO_UDP)
+			rp->tx_ring[entry].desc_length |=  TDES1_UDPCK;
+		rp->tx_ring[entry].desc_length |= TDES1_IPCK;
+	}
+
 	wmb();
 	rp->tx_ring[entry].tx_status = cpu_to_le32(DescOwn);
 	wmb();

