diff options
Diffstat (limited to 'drivers/net/ethernet/intel/e1000/e1000_main.c')
-rw-r--r-- | drivers/net/ethernet/intel/e1000/e1000_main.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/drivers/net/ethernet/intel/e1000/e1000_main.c b/drivers/net/ethernet/intel/e1000/e1000_main.c index 98375e1e1185..1982f7917a8d 100644 --- a/drivers/net/ethernet/intel/e1000/e1000_main.c +++ b/drivers/net/ethernet/intel/e1000/e1000_main.c | |||
@@ -520,8 +520,6 @@ void e1000_down(struct e1000_adapter *adapter) | |||
520 | struct net_device *netdev = adapter->netdev; | 520 | struct net_device *netdev = adapter->netdev; |
521 | u32 rctl, tctl; | 521 | u32 rctl, tctl; |
522 | 522 | ||
523 | netif_carrier_off(netdev); | ||
524 | |||
525 | /* disable receives in the hardware */ | 523 | /* disable receives in the hardware */ |
526 | rctl = er32(RCTL); | 524 | rctl = er32(RCTL); |
527 | ew32(RCTL, rctl & ~E1000_RCTL_EN); | 525 | ew32(RCTL, rctl & ~E1000_RCTL_EN); |
@@ -537,6 +535,15 @@ void e1000_down(struct e1000_adapter *adapter) | |||
537 | E1000_WRITE_FLUSH(); | 535 | E1000_WRITE_FLUSH(); |
538 | msleep(10); | 536 | msleep(10); |
539 | 537 | ||
538 | /* Set the carrier off after transmits have been disabled in the | ||
539 | * hardware, to avoid race conditions with e1000_watchdog() (which | ||
540 | * may be running concurrently to us, checking for the carrier | ||
541 | * bit to decide whether it should enable transmits again). Such | ||
542 | * a race condition would result into transmission being disabled | ||
543 | * in the hardware until the next IFF_DOWN+IFF_UP cycle. | ||
544 | */ | ||
545 | netif_carrier_off(netdev); | ||
546 | |||
540 | napi_disable(&adapter->napi); | 547 | napi_disable(&adapter->napi); |
541 | 548 | ||
542 | e1000_irq_disable(adapter); | 549 | e1000_irq_disable(adapter); |