diff -r af21f0bdc7c9 -r 2b9c78543663 devices/e1000e/netdev-2.6.37-ethercat.c --- a/devices/e1000e/netdev-2.6.37-ethercat.c Thu Sep 06 14:21:02 2012 +0200 +++ b/devices/e1000e/netdev-2.6.37-ethercat.c Mon Nov 03 15:20:05 2014 +0100 @@ -24,6 +24,8 @@ e1000-devel Mailing List Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 + vim: noexpandtab + *******************************************************************************/ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt @@ -1537,10 +1539,10 @@ struct e1000_hw *hw = &adapter->hw; u32 icr = er32(ICR); - if (adapter->ecdev) { - int ec_work_done = 0; - adapter->clean_rx(adapter, &ec_work_done, 100); - e1000_clean_tx_irq(adapter); + if (adapter->ecdev) { + int ec_work_done = 0; + adapter->clean_rx(adapter, &ec_work_done, 100); + e1000_clean_tx_irq(adapter); return IRQ_HANDLED; } /* @@ -1641,10 +1643,10 @@ mod_timer(&adapter->watchdog_timer, jiffies + 1); } - if (adapter->ecdev) { - int ec_work_done = 0; - adapter->clean_rx(adapter, &ec_work_done, 100); - e1000_clean_tx_irq(adapter); + if (adapter->ecdev) { + int ec_work_done = 0; + adapter->clean_rx(adapter, &ec_work_done, 100); + e1000_clean_tx_irq(adapter); return IRQ_HANDLED; } @@ -1724,9 +1726,9 @@ adapter->rx_ring->set_itr = 0; } - if (adapter->ecdev) { - int ec_work_done = 0; - adapter->clean_rx(adapter, &ec_work_done, 100); + if (adapter->ecdev) { + int ec_work_done = 0; + adapter->clean_rx(adapter, &ec_work_done, 100); } else { if (napi_schedule_prep(&adapter->napi)) { adapter->total_rx_bytes = 0; @@ -3414,7 +3416,7 @@ ew32(RCTL, rctl & ~E1000_RCTL_EN); /* flush and sleep below */ - if (!adapter->ecdev) + if (!adapter->ecdev) netif_stop_queue(netdev); /* disable transmits in the hardware */ @@ -3703,16 +3705,16 @@ e1000_irq_enable(adapter); netif_start_queue(netdev); - - adapter->idle_check = true; - pm_runtime_put(&pdev->dev); - - /* fire a link status change interrupt to start the watchdog */ - if (adapter->msix_entries) - ew32(ICS, E1000_ICS_LSC | E1000_ICR_OTHER); - else - ew32(ICS, E1000_ICS_LSC); - } + } + + adapter->idle_check = true; + pm_runtime_put(&pdev->dev); + + /* fire a link status change interrupt to start the watchdog */ + if (adapter->msix_entries) + ew32(ICS, E1000_ICS_LSC | E1000_ICR_OTHER); + else + ew32(ICS, E1000_ICS_LSC); return 0; @@ -4236,7 +4238,7 @@ e1000_update_mng_vlan(adapter); if (link) { - if ((adapter->ecdev && !ecdev_get_link(adapter->ecdev)) + if ((adapter->ecdev && !ecdev_get_link(adapter->ecdev)) || (!adapter->ecdev && !netif_carrier_ok(netdev))) { bool txb2b = 1; @@ -4334,7 +4336,7 @@ if (adapter->ecdev) ecdev_set_link(adapter->ecdev, 1); - else + else netif_carrier_on(netdev); if (!adapter->ecdev && !test_bit(__E1000_DOWN, &adapter->state)) @@ -4342,7 +4344,7 @@ round_jiffies(jiffies + 2 * HZ)); } } else { - if ((adapter->ecdev && ecdev_get_link(adapter->ecdev)) + if ((adapter->ecdev && ecdev_get_link(adapter->ecdev)) || (!adapter->ecdev && netif_carrier_ok(netdev))) { adapter->link_speed = 0; adapter->link_duplex = 0; @@ -4380,8 +4382,7 @@ e1000e_update_adaptive(&adapter->hw); - if ((adapter->ecdev && !ecdev_get_link(adapter->ecdev)) - || (!adapter->ecdev && !netif_carrier_ok(netdev))) { + if (!adapter->ecdev && !netif_carrier_ok(netdev)) { tx_pending = (e1000_desc_unused(tx_ring) + 1 < tx_ring->count); if (tx_pending) { @@ -4794,6 +4795,10 @@ { struct e1000_adapter *adapter = netdev_priv(netdev); + if (adapter->ecdev) { + return -EBUSY; + } + netif_stop_queue(netdev); /* * Herbert's original patch had: @@ -5564,7 +5569,7 @@ bool wake = false; struct net_device *netdev = pci_get_drvdata(pdev); struct e1000_adapter *adapter = netdev_priv(netdev); - + if (adapter->ecdev) return; @@ -5762,14 +5767,16 @@ struct e1000_adapter *adapter = netdev_priv(netdev); if (jiffies - adapter->ec_watchdog_jiffies >= 2 * HZ) { - e1000_watchdog((unsigned long) adapter); + struct e1000_hw *hw = &adapter->hw; + hw->mac.get_link_status = true; + e1000_watchdog_task(&adapter->watchdog_task); adapter->ec_watchdog_jiffies = jiffies; } #ifdef CONFIG_PCI_MSI - e1000_intr_msi(0,netdev); + e1000_intr_msi(0, netdev); #else - e1000_intr(0,netdev); + e1000_intr(0, netdev); #endif } @@ -6062,10 +6069,12 @@ adapter->ecdev = ecdev_offer(netdev, ec_poll, THIS_MODULE); if (adapter->ecdev) { - if (ecdev_open(adapter->ecdev)) { + err = ecdev_open(adapter->ecdev); + if (err) { ecdev_withdraw(adapter->ecdev); goto err_register; } + adapter->ec_watchdog_jiffies = jiffies; } else { strcpy(netdev->name, "eth%d"); err = register_netdev(netdev);