diff -r af21f0bdc7c9 -r 2b9c78543663 devices/e1000e/netdev-2.6.33-ethercat.c --- a/devices/e1000e/netdev-2.6.33-ethercat.c Thu Sep 06 14:21:02 2012 +0200 +++ b/devices/e1000e/netdev-2.6.33-ethercat.c Mon Nov 03 15:20:05 2014 +0100 @@ -2913,7 +2913,7 @@ clear_bit(__E1000_DOWN, &adapter->state); - if (!adapter->ecdev) + if (!adapter->ecdev) napi_enable(&adapter->napi); if (adapter->msix_entries) @@ -2947,7 +2947,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 */ @@ -3237,11 +3237,13 @@ /* From here on the code is the same as e1000e_up() */ clear_bit(__E1000_DOWN, &adapter->state); - napi_enable(&adapter->napi); - - e1000_irq_enable(adapter); - - netif_start_queue(netdev); + if (!adapter->ecdev) { + napi_enable(&adapter->napi); + + e1000_irq_enable(adapter); + + netif_start_queue(netdev); + } /* fire a link status change interrupt to start the watchdog */ ew32(ICS, E1000_ICS_LSC); @@ -3654,7 +3656,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; /* update snapshot of PHY registers on LSC */ @@ -3754,7 +3756,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)) @@ -3762,7 +3764,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; @@ -3797,8 +3799,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) { @@ -4175,6 +4176,10 @@ { struct e1000_adapter *adapter = netdev_priv(netdev); + if (adapter->ecdev) { + return -EBUSY; + } + netif_stop_queue(netdev); /* * Herbert's original patch had: @@ -4859,7 +4864,7 @@ bool wake = false; struct net_device *netdev = pci_get_drvdata(pdev); struct e1000_adapter *adapter = netdev_priv(netdev); - + if (adapter->ecdev) return; @@ -5359,7 +5364,8 @@ 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; }