Fixed e1000 ring bug. stable-1.4
authorFlorian Pose <fp@igh-essen.com>
Mon, 29 Dec 2008 13:10:53 +0000
branchstable-1.4
changeset 1684 adf0b6f46ecd
parent 1683 815789678f26
child 1685 399ef727bf62
Fixed e1000 ring bug.
NEWS
devices/e1000/e1000_main-2.6.13-ethercat.c
devices/e1000/e1000_main-2.6.18-ethercat.c
devices/e1000/e1000_main-2.6.20-ethercat.c
devices/e1000/e1000_main-2.6.22-ethercat.c
devices/e1000/e1000_main-2.6.24-ethercat.c
--- a/NEWS	Mon Dec 29 13:07:38 2008 +0000
+++ b/NEWS	Mon Dec 29 13:10:53 2008 +0000
@@ -2,6 +2,8 @@
 
 $Id$
 
+vim: spelllang=en spell
+
 -------------------------------------------------------------------------------
 
 Changes since version 1.4.0-rc3:
@@ -13,7 +15,9 @@
 * Fixed a kernel oops when a slave configuration is detached while the actual
   configuration is in progress.
 * Fixed typo in logging output.
-* Removed bashisms from init script.
+* Removed 'bashisms' from init script ('function' keyword).
+* Fixed bug in e1000 drivers. Memory was allocated when sending the first
+  frame.
 
 Changes in version 1.4.0-rc3:
 
--- a/devices/e1000/e1000_main-2.6.13-ethercat.c	Mon Dec 29 13:07:38 2008 +0000
+++ b/devices/e1000/e1000_main-2.6.13-ethercat.c	Mon Dec 29 13:10:53 2008 +0000
@@ -24,6 +24,8 @@
   Linux NICS <linux.nics@intel.com>
   Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
 
+  vim: noexpandtab
+
 *******************************************************************************/
 
 #include "e1000-2.6.13-ethercat.h"
--- a/devices/e1000/e1000_main-2.6.18-ethercat.c	Mon Dec 29 13:07:38 2008 +0000
+++ b/devices/e1000/e1000_main-2.6.18-ethercat.c	Mon Dec 29 13:10:53 2008 +0000
@@ -25,6 +25,8 @@
   e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
   Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
 
+  vim: noexpandtab
+
 *******************************************************************************/
 
 #include "e1000-2.6.18-ethercat.h"
@@ -465,8 +467,14 @@
 	 * next_to_use != next_to_clean */
 	for (i = 0; i < adapter->num_rx_queues; i++) {
 		struct e1000_rx_ring *ring = &adapter->rx_ring[i];
-		adapter->alloc_rx_buf(adapter, ring,
-		                      E1000_DESC_UNUSED(ring));
+		if (adapter->ecdev) {
+			/* fill rx ring completely! */
+			adapter->alloc_rx_buf(adapter, ring, ring->count);
+		} else {
+            /* this one leaves the last ring element unallocated! */
+			adapter->alloc_rx_buf(adapter, ring,
+					E1000_DESC_UNUSED(ring));
+		}
 	}
 
 	adapter->tx_queue_len = netdev->tx_queue_len;
@@ -2170,7 +2178,14 @@
 		/* No need to loop, because 82542 supports only 1 queue */
 		struct e1000_rx_ring *ring = &adapter->rx_ring[0];
 		e1000_configure_rx(adapter);
-		adapter->alloc_rx_buf(adapter, ring, E1000_DESC_UNUSED(ring));
+		if (adapter->ecdev) { 
+			/* fill rx ring completely! */
+			adapter->alloc_rx_buf(adapter, ring, ring->count);
+		} else {
+            /* this one leaves the last ring element unallocated! */
+			adapter->alloc_rx_buf(adapter, ring, E1000_DESC_UNUSED(ring));
+		}
+
 	}
 }
 
--- a/devices/e1000/e1000_main-2.6.20-ethercat.c	Mon Dec 29 13:07:38 2008 +0000
+++ b/devices/e1000/e1000_main-2.6.20-ethercat.c	Mon Dec 29 13:10:53 2008 +0000
@@ -23,6 +23,8 @@
   Linux NICS <linux.nics@intel.com>
   e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
   Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
+  
+  vim: noexpandtab
 
 *******************************************************************************/
 
@@ -557,8 +559,14 @@
 	 * next_to_use != next_to_clean */
 	for (i = 0; i < adapter->num_rx_queues; i++) {
 		struct e1000_rx_ring *ring = &adapter->rx_ring[i];
-		adapter->alloc_rx_buf(adapter, ring,
-		                      E1000_DESC_UNUSED(ring));
+		if (adapter->ecdev) {
+			/* fill rx ring completely! */
+			adapter->alloc_rx_buf(adapter, ring, ring->count);
+		} else {
+            /* this one leaves the last ring element unallocated! */
+			adapter->alloc_rx_buf(adapter, ring,
+					E1000_DESC_UNUSED(ring));
+		}
 	}
 
 	adapter->tx_queue_len = netdev->tx_queue_len;
@@ -2395,7 +2403,14 @@
 		/* No need to loop, because 82542 supports only 1 queue */
 		struct e1000_rx_ring *ring = &adapter->rx_ring[0];
 		e1000_configure_rx(adapter);
-		adapter->alloc_rx_buf(adapter, ring, E1000_DESC_UNUSED(ring));
+		if (adapter->ecdev) { 
+			/* fill rx ring completely! */
+			adapter->alloc_rx_buf(adapter, ring, ring->count);
+		} else {
+            /* this one leaves the last ring element unallocated! */
+			adapter->alloc_rx_buf(adapter, ring, E1000_DESC_UNUSED(ring));
+		}
+
 	}
 }
 
@@ -3856,11 +3871,11 @@
 	struct e1000_adapter *adapter = netdev_priv(netdev);
 	struct e1000_hw *hw = &adapter->hw;
 	int i;
+
+	if (adapter->ecdev) {
 #ifdef CONFIG_E1000_NAPI
-	int ec_work_done = 0;
-#endif
-
-	if (adapter->ecdev) {
+		int ec_work_done = 0;
+#endif
 		for (i = 0; i < E1000_MAX_INTR; i++)
 #ifdef CONFIG_E1000_NAPI
 			if (unlikely(!adapter->clean_rx(adapter, adapter->rx_ring,
@@ -3959,9 +3974,6 @@
 	struct e1000_hw *hw = &adapter->hw;
 	uint32_t rctl, icr = E1000_READ_REG(hw, ICR);
 	int i;
-#ifdef CONFIG_E1000_NAPI
-	int ec_work_done = 0;
-#endif
 	if (unlikely(!icr))
 		return IRQ_NONE;  /* Not our interrupt */
 
@@ -3999,6 +4011,9 @@
 	}
 
 	if (adapter->ecdev) {
+#ifdef CONFIG_E1000_NAPI
+		int ec_work_done = 0;
+#endif
 		for (i = 0; i < E1000_MAX_INTR; i++)
 #ifdef CONFIG_E1000_NAPI
 			if (unlikely(!adapter->clean_rx(adapter, adapter->rx_ring,
--- a/devices/e1000/e1000_main-2.6.22-ethercat.c	Mon Dec 29 13:07:38 2008 +0000
+++ b/devices/e1000/e1000_main-2.6.22-ethercat.c	Mon Dec 29 13:10:53 2008 +0000
@@ -24,6 +24,8 @@
   e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
   Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
 
+  vim: noexpandtab
+
 *******************************************************************************/
 
 #include "e1000-2.6.22-ethercat.h"
@@ -540,8 +542,14 @@
 	 * next_to_use != next_to_clean */
 	for (i = 0; i < adapter->num_rx_queues; i++) {
 		struct e1000_rx_ring *ring = &adapter->rx_ring[i];
-		adapter->alloc_rx_buf(adapter, ring,
-		                      E1000_DESC_UNUSED(ring));
+		if (adapter->ecdev) {
+			/* fill rx ring completely! */
+			adapter->alloc_rx_buf(adapter, ring, ring->count);
+		} else {
+            /* this one leaves the last ring element unallocated! */
+			adapter->alloc_rx_buf(adapter, ring,
+					E1000_DESC_UNUSED(ring));
+		}
 	}
 
 	adapter->tx_queue_len = netdev->tx_queue_len;
@@ -2396,7 +2404,14 @@
 		/* No need to loop, because 82542 supports only 1 queue */
 		struct e1000_rx_ring *ring = &adapter->rx_ring[0];
 		e1000_configure_rx(adapter);
-		adapter->alloc_rx_buf(adapter, ring, E1000_DESC_UNUSED(ring));
+		if (adapter->ecdev) { 
+			/* fill rx ring completely! */
+			adapter->alloc_rx_buf(adapter, ring, ring->count);
+		} else {
+            /* this one leaves the last ring element unallocated! */
+			adapter->alloc_rx_buf(adapter, ring, E1000_DESC_UNUSED(ring));
+		}
+
 	}
 }
 
@@ -3836,12 +3851,12 @@
 	struct e1000_adapter *adapter = netdev_priv(netdev);
 	struct e1000_hw *hw = &adapter->hw;
 	int i;
+	uint32_t icr = E1000_READ_REG(hw, ICR);
+
+	if (adapter->ecdev) {
 #ifdef CONFIG_E1000_NAPI
-	int ec_work_done = 0;
+		int ec_work_done = 0;
 #endif
-	uint32_t icr = E1000_READ_REG(hw, ICR);
-
-	if (adapter->ecdev) {
 		for (i = 0; i < E1000_MAX_INTR; i++)
 #ifdef CONFIG_E1000_NAPI
 			if (unlikely(!adapter->clean_rx(adapter, adapter->rx_ring,
@@ -3916,9 +3931,6 @@
 	struct e1000_hw *hw = &adapter->hw;
 	uint32_t rctl, icr = E1000_READ_REG(hw, ICR);
 	int i;
-#ifdef CONFIG_E1000_NAPI
-	int ec_work_done = 0;
-#endif
 	if (unlikely(!icr))
 		return IRQ_NONE;  /* Not our interrupt */
 
@@ -3956,6 +3968,9 @@
 	}
 
 	if (adapter->ecdev) {
+#ifdef CONFIG_E1000_NAPI
+		int ec_work_done = 0;
+#endif
 		for (i = 0; i < E1000_MAX_INTR; i++)
 #ifdef CONFIG_E1000_NAPI
 			if (unlikely(!adapter->clean_rx(adapter, adapter->rx_ring,
--- a/devices/e1000/e1000_main-2.6.24-ethercat.c	Mon Dec 29 13:07:38 2008 +0000
+++ b/devices/e1000/e1000_main-2.6.24-ethercat.c	Mon Dec 29 13:10:53 2008 +0000
@@ -24,6 +24,8 @@
   e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
   Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
 
+  vim: noexpandtab
+
 *******************************************************************************/
 
 #include "e1000-2.6.24-ethercat.h"
@@ -541,8 +543,14 @@
 	 * next_to_use != next_to_clean */
 	for (i = 0; i < adapter->num_rx_queues; i++) {
 		struct e1000_rx_ring *ring = &adapter->rx_ring[i];
-		adapter->alloc_rx_buf(adapter, ring,
-		                      E1000_DESC_UNUSED(ring));
+		if (adapter->ecdev) {
+			/* fill rx ring completely! */
+			adapter->alloc_rx_buf(adapter, ring, ring->count);
+		} else {
+            /* this one leaves the last ring element unallocated! */
+			adapter->alloc_rx_buf(adapter, ring,
+					E1000_DESC_UNUSED(ring));
+		}
 	}
 
 	adapter->tx_queue_len = netdev->tx_queue_len;
@@ -2394,7 +2402,14 @@
 		/* No need to loop, because 82542 supports only 1 queue */
 		struct e1000_rx_ring *ring = &adapter->rx_ring[0];
 		e1000_configure_rx(adapter);
-		adapter->alloc_rx_buf(adapter, ring, E1000_DESC_UNUSED(ring));
+		if (adapter->ecdev) { 
+			/* fill rx ring completely! */
+			adapter->alloc_rx_buf(adapter, ring, ring->count);
+		} else {
+            /* this one leaves the last ring element unallocated! */
+			adapter->alloc_rx_buf(adapter, ring, E1000_DESC_UNUSED(ring));
+		}
+
 	}
 }
 
@@ -3833,10 +3848,12 @@
 	struct net_device *netdev = data;
 	struct e1000_adapter *adapter = netdev_priv(netdev);
 	struct e1000_hw *hw = &adapter->hw;
-	int ec_work_done = 0;
 	int i;
 	
 	if (adapter->ecdev) {
+#ifdef CONFIG_E1000_NAPI
+		int ec_work_done = 0;
+#endif
 		for (i = 0; i < E1000_MAX_INTR; i++)
 #ifdef CONFIG_E1000_NAPI
 			if (unlikely(!adapter->clean_rx(adapter, adapter->rx_ring,
@@ -3913,7 +3930,6 @@
 	struct e1000_hw *hw = &adapter->hw;
 	uint32_t rctl, icr = E1000_READ_REG(hw, ICR);
 	int i;
-	int ec_work_done = 0;
 	if (unlikely(!icr))
 		return IRQ_NONE;  /* Not our interrupt */
 
@@ -3951,6 +3967,9 @@
 	}
 
 	if (adapter->ecdev) {
+#ifdef CONFIG_E1000_NAPI
+		int ec_work_done = 0;
+#endif
 		for (i = 0; i < E1000_MAX_INTR; i++)
 #ifdef CONFIG_E1000_NAPI
 			if (unlikely(!adapter->clean_rx(adapter, adapter->rx_ring,