# HG changeset patch # User Florian Pose # Date 1230556253 0 # Node ID adf0b6f46ecd65c93055c2fdc383f61ec3c24e5f # Parent 815789678f269beea2b3ac4e9f2760725dbf3d77 Fixed e1000 ring bug. diff -r 815789678f26 -r adf0b6f46ecd NEWS --- 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: diff -r 815789678f26 -r adf0b6f46ecd devices/e1000/e1000_main-2.6.13-ethercat.c --- 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 Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 + vim: noexpandtab + *******************************************************************************/ #include "e1000-2.6.13-ethercat.h" diff -r 815789678f26 -r adf0b6f46ecd devices/e1000/e1000_main-2.6.18-ethercat.c --- 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 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)); + } + } } diff -r 815789678f26 -r adf0b6f46ecd devices/e1000/e1000_main-2.6.20-ethercat.c --- 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 e1000-devel Mailing List 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, diff -r 815789678f26 -r adf0b6f46ecd devices/e1000/e1000_main-2.6.22-ethercat.c --- 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 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, diff -r 815789678f26 -r adf0b6f46ecd devices/e1000/e1000_main-2.6.24-ethercat.c --- 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 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,