aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ixgb/ixgb_main.c
diff options
context:
space:
mode:
authorAuke Kok <auke-jan.h.kok@intel.com>2006-05-26 12:35:28 -0400
committerAuke Kok <juke-jan.h.kok@intel.com>2006-05-26 12:35:28 -0400
commite59d16965ca38df91c4d9390d8eb5a62d7739589 (patch)
tree430dd5d0174c4a7c566d8f176599b4a1c324c8c7 /drivers/net/ixgb/ixgb_main.c
parenta24e2513c2d03c9a92739ec6fa7e7208f792881e (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.c9
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