diff -Naru e1000-5.2.52-k3/src/e1000.h e1000-pb/src/e1000.h
--- e1000-5.2.52-k3/src/e1000.h	2004-05-17 23:59:53.000000000 +0100
+++ e1000-pb/src/e1000.h	2004-06-28 14:45:04.000000000 +0100
@@ -177,6 +177,8 @@
 	unsigned int next_to_use;
 	/* next descriptor to check for DD status bit */
 	unsigned int next_to_clean;
+	/* whether next buffer is partial packet */
+	unsigned int multi_buf_pkt;
 	/* array of buffer information structs */
 	struct e1000_buffer *buffer_info;
 };
diff -Naru e1000-5.2.52-k3/src/e1000_hw.h e1000-pb/src/e1000_hw.h
--- e1000-5.2.52-k3/src/e1000_hw.h	2004-05-17 23:59:53.000000000 +0100
+++ e1000-pb/src/e1000_hw.h	2004-06-29 14:30:45.000000000 +0100
@@ -922,6 +922,7 @@
     uint64_t sec;
     uint64_t cexterr;
     uint64_t rlec;
+    uint64_t multibuf;
     uint64_t xonrxc;
     uint64_t xontxc;
     uint64_t xoffrxc;
diff -Naru e1000-5.2.52-k3/src/e1000_main.c e1000-pb/src/e1000_main.c
--- e1000-5.2.52-k3/src/e1000_main.c	2004-05-17 23:59:53.000000000 +0100
+++ e1000-pb/src/e1000_main.c	2004-07-01 19:24:41.000000000 +0100
@@ -817,6 +817,8 @@
 	txdr->next_to_use = 0;
 	txdr->next_to_clean = 0;
 
+	txdr->multi_buf_pkt = 0;
+
 	return 0;
 }
 
@@ -935,6 +937,8 @@
 	rxdr->next_to_clean = 0;
 	rxdr->next_to_use = 0;
 
+	rxdr->multi_buf_pkt = 0;
+
 	return 0;
 }
 
@@ -962,11 +966,12 @@
 		rctl &= ~E1000_RCTL_SBP;
 
 	rctl &= ~(E1000_RCTL_SZ_4096);
+	rctl |= E1000_RCTL_LPE;
 	switch (adapter->rx_buffer_len) {
 	case E1000_RXBUFFER_2048:
 	default:
 		rctl |= E1000_RCTL_SZ_2048;
-		rctl &= ~(E1000_RCTL_BSEX | E1000_RCTL_LPE);
+		rctl &= ~(E1000_RCTL_BSEX);
 		break;
 	case E1000_RXBUFFER_4096:
 		rctl |= E1000_RCTL_SZ_4096 | E1000_RCTL_BSEX | E1000_RCTL_LPE;
@@ -1101,6 +1106,8 @@
 	tx_ring->next_to_use = 0;
 	tx_ring->next_to_clean = 0;
 
+	tx_ring->multi_buf_pkt = 0;
+
 	E1000_WRITE_REG(&adapter->hw, TDH, 0);
 	E1000_WRITE_REG(&adapter->hw, TDT, 0);
 }
@@ -1169,6 +1176,8 @@
 	rx_ring->next_to_clean = 0;
 	rx_ring->next_to_use = 0;
 
+	rx_ring->multi_buf_pkt = 0;
+
 	E1000_WRITE_REG(&adapter->hw, RDH, 0);
 	E1000_WRITE_REG(&adapter->hw, RDT, 0);
 }
@@ -1904,14 +1913,16 @@
 		DPRINTK(PROBE, ERR, "Invalid MTU setting\n");
 		return -EINVAL;
 	}
+	if(max_frame > MAXIMUM_ETHERNET_FRAME_SIZE) {
+		if(adapter->hw.mac_type < e1000_82543) {
+			DPRINTK(PROBE, ERR, "Jumbo Frames not supported on 82542\n");
+			return -EINVAL;
+		}
+	}
 
-	if(max_frame <= MAXIMUM_ETHERNET_FRAME_SIZE) {
+	if(max_frame <= E1000_RXBUFFER_2048) {
 		adapter->rx_buffer_len = E1000_RXBUFFER_2048;
 
-	} else if(adapter->hw.mac_type < e1000_82543) {
-		DPRINTK(PROBE, ERR, "Jumbo Frames not supported on 82542\n");
-		return -EINVAL;
-
 	} else if(max_frame <= E1000_RXBUFFER_4096) {
 		adapter->rx_buffer_len = E1000_RXBUFFER_4096;
 
@@ -1961,7 +1972,7 @@
 	adapter->stats.gorch += E1000_READ_REG(hw, GORCH);
 	adapter->stats.bprc += E1000_READ_REG(hw, BPRC);
 	adapter->stats.mprc += E1000_READ_REG(hw, MPRC);
-	adapter->stats.roc += E1000_READ_REG(hw, ROC);
+	adapter->stats.roc += E1000_READ_REG(hw, ROC); adapter->stats.roc += adapter->stats.multibuf;
 	adapter->stats.prc64 += E1000_READ_REG(hw, PRC64);
 	adapter->stats.prc127 += E1000_READ_REG(hw, PRC127);
 	adapter->stats.prc255 += E1000_READ_REG(hw, PRC255);
@@ -1979,7 +1990,7 @@
 	adapter->stats.latecol += E1000_READ_REG(hw, LATECOL);
 	adapter->stats.dc += E1000_READ_REG(hw, DC);
 	adapter->stats.sec += E1000_READ_REG(hw, SEC);
-	adapter->stats.rlec += E1000_READ_REG(hw, RLEC);
+	adapter->stats.rlec += E1000_READ_REG(hw, RLEC); adapter->stats.rlec += adapter->stats.multibuf;
 	adapter->stats.xonrxc += E1000_READ_REG(hw, XONRXC);
 	adapter->stats.xontxc += E1000_READ_REG(hw, XONTXC);
 	adapter->stats.xoffrxc += E1000_READ_REG(hw, XOFFRXC);
@@ -2069,6 +2080,8 @@
 			adapter->phy_stats.receive_errors += phy_tmp;
 	}
 
+	adapter->stats.multibuf=0;
+
 	spin_unlock_irqrestore(&adapter->stats_lock, flags);
 }
 
@@ -2190,6 +2203,7 @@
 	if(work_done < work_to_do || !netif_running(netdev)) {
 		netif_rx_complete(netdev);
 		e1000_irq_enable(adapter);
+		return 0;
 	}
 
 	return (work_done >= work_to_do);
@@ -2312,7 +2326,18 @@
 		skb = buffer_info->skb;
 		length = le16_to_cpu(rx_desc->length);
 
-		if(!(rx_desc->status & E1000_RXD_STAT_EOP)) {
+		if((!(rx_desc->status & E1000_RXD_STAT_EOP)) || rx_ring->multi_buf_pkt) {
+
+			if(!(rx_desc->status & E1000_RXD_STAT_EOP)) {
+				rx_ring->multi_buf_pkt=1; /* Next buffer also to be dropped */
+			} else {
+				spin_lock_irqsave(&adapter->stats_lock, flags);
+				adapter->stats.multibuf++; /* counted as "frame too large" error */
+				/* TODO: decrement byte and packet counts */
+				spin_unlock_irqrestore(&adapter->stats_lock, flags);
+
+				rx_ring->multi_buf_pkt=0;
+			}
 
 			/* All receives must fit into a single buffer */
 
@@ -2358,6 +2383,27 @@
 			}
 		}
 
+		if(length > adapter->hw.max_frame_size +
+		   (rx_desc->status & E1000_RXD_STAT_VP ? VLAN_TAG_SIZE : 0)) {
+
+			spin_lock_irqsave(&adapter->stats_lock, flags);
+			adapter->stats.multibuf++; /* counted as "frame too large" error */
+			/* TODO: decrement byte and packet counts */
+			spin_unlock_irqrestore(&adapter->stats_lock, flags);
+
+			E1000_DBG("%s: Packet length %d too big\n",
+				netdev->name, length);
+
+			dev_kfree_skb_irq(skb);
+			rx_desc->status = 0;
+			buffer_info->skb = NULL;
+
+			if(++i == rx_ring->count) i = 0;
+
+			rx_desc = E1000_RX_DESC(*rx_ring, i);
+			continue;
+		}
+
 		/* Good Receive */
 		skb_put(skb, length - ETHERNET_FCS_SIZE);
 
