|
@@ -1743,8 +1743,11 @@ static int e100_up(struct nic *nic)
|
|
if((err = request_irq(nic->pdev->irq, e100_intr, SA_SHIRQ,
|
|
if((err = request_irq(nic->pdev->irq, e100_intr, SA_SHIRQ,
|
|
nic->netdev->name, nic->netdev)))
|
|
nic->netdev->name, nic->netdev)))
|
|
goto err_no_irq;
|
|
goto err_no_irq;
|
|
- e100_enable_irq(nic);
|
|
|
|
netif_wake_queue(nic->netdev);
|
|
netif_wake_queue(nic->netdev);
|
|
|
|
+ netif_poll_enable(nic->netdev);
|
|
|
|
+ /* enable ints _after_ enabling poll, preventing a race between
|
|
|
|
+ * disable ints+schedule */
|
|
|
|
+ e100_enable_irq(nic);
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
err_no_irq:
|
|
err_no_irq:
|
|
@@ -1758,11 +1761,13 @@ err_rx_clean_list:
|
|
|
|
|
|
static void e100_down(struct nic *nic)
|
|
static void e100_down(struct nic *nic)
|
|
{
|
|
{
|
|
|
|
+ /* wait here for poll to complete */
|
|
|
|
+ netif_poll_disable(nic->netdev);
|
|
|
|
+ netif_stop_queue(nic->netdev);
|
|
e100_hw_reset(nic);
|
|
e100_hw_reset(nic);
|
|
free_irq(nic->pdev->irq, nic->netdev);
|
|
free_irq(nic->pdev->irq, nic->netdev);
|
|
del_timer_sync(&nic->watchdog);
|
|
del_timer_sync(&nic->watchdog);
|
|
netif_carrier_off(nic->netdev);
|
|
netif_carrier_off(nic->netdev);
|
|
- netif_stop_queue(nic->netdev);
|
|
|
|
e100_clean_cbs(nic);
|
|
e100_clean_cbs(nic);
|
|
e100_rx_clean_list(nic);
|
|
e100_rx_clean_list(nic);
|
|
}
|
|
}
|