diff options
author | Auke Kok <auke-jan.h.kok@intel.com> | 2006-05-26 12:35:28 -0400 |
---|---|---|
committer | Auke Kok <juke-jan.h.kok@intel.com> | 2006-05-26 12:35:28 -0400 |
commit | e59d16965ca38df91c4d9390d8eb5a62d7739589 (patch) | |
tree | 430dd5d0174c4a7c566d8f176599b4a1c324c8c7 /drivers/net/ixgb/ixgb_main.c | |
parent | a24e2513c2d03c9a92739ec6fa7e7208f792881e (diff) |
ixgb: fix smp polling race condition
Moved interrupt masking to before requesting the interrupt from the OS.
Moved interrupt enable to after netif_poll_enable. This fixes a racy
BUG() where polling would be running on another CPU at the same time
that netif_poll_enable would run.
Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
Signed-off-by: Auke Kok <auke-jan.h.kok@intel.com>
Signed-off-by: John Ronciak <john.ronciak@intel.com>
Diffstat (limited to 'drivers/net/ixgb/ixgb_main.c')
-rw-r--r-- | drivers/net/ixgb/ixgb_main.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/drivers/net/ixgb/ixgb_main.c b/drivers/net/ixgb/ixgb_main.c index 0a0c876dcbdd..954894b5308c 100644 --- a/drivers/net/ixgb/ixgb_main.c +++ b/drivers/net/ixgb/ixgb_main.c | |||
@@ -247,6 +247,9 @@ ixgb_up(struct ixgb_adapter *adapter) | |||
247 | ixgb_configure_rx(adapter); | 247 | ixgb_configure_rx(adapter); |
248 | ixgb_alloc_rx_buffers(adapter); | 248 | ixgb_alloc_rx_buffers(adapter); |
249 | 249 | ||
250 | /* disable interrupts and get the hardware into a known state */ | ||
251 | IXGB_WRITE_REG(&adapter->hw, IMC, 0xffffffff); | ||
252 | |||
250 | #ifdef CONFIG_PCI_MSI | 253 | #ifdef CONFIG_PCI_MSI |
251 | { | 254 | { |
252 | boolean_t pcix = (IXGB_READ_REG(&adapter->hw, STATUS) & | 255 | boolean_t pcix = (IXGB_READ_REG(&adapter->hw, STATUS) & |
@@ -272,9 +275,6 @@ ixgb_up(struct ixgb_adapter *adapter) | |||
272 | return err; | 275 | return err; |
273 | } | 276 | } |
274 | 277 | ||
275 | /* disable interrupts and get the hardware into a known state */ | ||
276 | IXGB_WRITE_REG(&adapter->hw, IMC, 0xffffffff); | ||
277 | |||
278 | if((hw->max_frame_size != max_frame) || | 278 | if((hw->max_frame_size != max_frame) || |
279 | (hw->max_frame_size != | 279 | (hw->max_frame_size != |
280 | (IXGB_READ_REG(hw, MFS) >> IXGB_MFS_SHIFT))) { | 280 | (IXGB_READ_REG(hw, MFS) >> IXGB_MFS_SHIFT))) { |
@@ -295,11 +295,12 @@ ixgb_up(struct ixgb_adapter *adapter) | |||
295 | } | 295 | } |
296 | 296 | ||
297 | mod_timer(&adapter->watchdog_timer, jiffies); | 297 | mod_timer(&adapter->watchdog_timer, jiffies); |
298 | ixgb_irq_enable(adapter); | ||
299 | 298 | ||
300 | #ifdef CONFIG_IXGB_NAPI | 299 | #ifdef CONFIG_IXGB_NAPI |
301 | netif_poll_enable(netdev); | 300 | netif_poll_enable(netdev); |
302 | #endif | 301 | #endif |
302 | ixgb_irq_enable(adapter); | ||
303 | |||
303 | return 0; | 304 | return 0; |
304 | } | 305 | } |
305 | 306 | ||