# HG changeset patch # User Florian Pose # Date 1357639126 -3600 # Node ID d7b1a62709af0a567915ea08376585ea1e4099a9 # Parent 5e9221a78855f0efc514e5573e174b4c0ac09643 Improved e1000e driver for kernel 3.4. diff -r 5e9221a78855 -r d7b1a62709af devices/e1000e/netdev-3.4-ethercat.c --- a/devices/e1000e/netdev-3.4-ethercat.c Mon Jan 07 18:23:27 2013 +0100 +++ b/devices/e1000e/netdev-3.4-ethercat.c Tue Jan 08 10:58:46 2013 +0100 @@ -1170,7 +1170,9 @@ tx_ring->next_to_clean = i; - netdev_completed_queue(netdev, pkts_compl, bytes_compl); + if (!adapter->ecdev) { + netdev_completed_queue(netdev, pkts_compl, bytes_compl); + } #define TX_WAKE_THRESHOLD 32 if (!adapter->ecdev && count && netif_carrier_ok(netdev) && @@ -1702,7 +1704,7 @@ * read ICR disables interrupts using IAM */ - if (!adapter->ecdev && icr & E1000_ICR_LSC) { + if (icr & E1000_ICR_LSC) { hw->mac.get_link_status = true; /* * ICH8 workaround-- Call gig speed drop workaround on cable @@ -1752,6 +1754,13 @@ struct e1000_hw *hw = &adapter->hw; u32 rctl, icr = er32(ICR); + if (adapter->ecdev) { + int ec_work_done = 0; + adapter->clean_rx(adapter->rx_ring, &ec_work_done, 100); + e1000_clean_tx_irq(adapter->tx_ring); + return IRQ_HANDLED; + } + if (!icr || test_bit(__E1000_DOWN, &adapter->state)) return IRQ_NONE; /* Not our interrupt */ @@ -1759,7 +1768,7 @@ * IMS will not auto-mask if INT_ASSERTED is not set, and if it is * not set, then the adapter didn't send an interrupt */ - if (!adapter->ecdev && !(icr & E1000_ICR_INT_ASSERTED)) + if (!(icr & E1000_ICR_INT_ASSERTED)) return IRQ_NONE; /* @@ -1796,13 +1805,6 @@ mod_timer(&adapter->watchdog_timer, jiffies + 1); } - if (adapter->ecdev) { - int ec_work_done = 0; - adapter->clean_rx(adapter->rx_ring, &ec_work_done, 100); - e1000_clean_tx_irq(adapter->tx_ring); - return IRQ_HANDLED; - } - if (napi_schedule_prep(&adapter->napi)) { adapter->total_tx_bytes = 0; adapter->total_tx_packets = 0; @@ -2126,8 +2128,9 @@ { struct net_device *netdev = adapter->netdev; - if (adapter->ecdev) + if (adapter->ecdev) { return; + } if (adapter->msix_entries) { int vector = 0; @@ -4061,7 +4064,9 @@ pm_runtime_get_sync(&pdev->dev); - napi_disable(&adapter->napi); + if (!adapter->ecdev) { + napi_disable(&adapter->napi); + } if (!test_bit(__E1000_DOWN, &adapter->state)) { e1000e_down(adapter); @@ -6201,9 +6206,9 @@ } #ifdef CONFIG_PCI_MSI - e1000_intr_msi(0,netdev); + e1000_intr_msi(0, netdev); #else - e1000_intr(0,netdev); + e1000_intr(0, netdev); #endif } @@ -6571,6 +6576,11 @@ struct e1000_adapter *adapter = netdev_priv(netdev); bool down = test_bit(__E1000_DOWN, &adapter->state); + if (adapter->ecdev) { + ecdev_close(adapter->ecdev); + ecdev_withdraw(adapter->ecdev); + } + /* * The timers may be rescheduled, so explicitly disable them * from being rescheduled. @@ -6593,10 +6603,7 @@ if (!down) clear_bit(__E1000_DOWN, &adapter->state); - if (adapter->ecdev) { - ecdev_close(adapter->ecdev); - ecdev_withdraw(adapter->ecdev); - } else { + if (!adapter->ecdev) { unregister_netdev(netdev); }