devices/e1000e/netdev-3.2-ethercat.c
changeset 2589 2b9c78543663
parent 2406 fee219bb31a9
--- a/devices/e1000e/netdev-3.2-ethercat.c	Thu Sep 06 14:21:02 2012 +0200
+++ b/devices/e1000e/netdev-3.2-ethercat.c	Mon Nov 03 15:20:05 2014 +0100
@@ -24,6 +24,8 @@
   e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
   Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
 
+  vim: noexpandtab
+
 *******************************************************************************/
 
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
@@ -984,7 +986,7 @@
 		} else {
 		    e1000_receive_skb(adapter, netdev, skb, staterr,
 				      rx_desc->wb.upper.vlan);
-        }
+		}
 
 next_desc:
 		rx_desc->wb.upper.status_error &= cpu_to_le32(~0xFF);
@@ -1065,7 +1067,9 @@
 	}
 	/* Real hang detected */
 	adapter->tx_hang_recheck = false;
-	netif_stop_queue(netdev);
+	if (!adapter->ecdev) {
+		netif_stop_queue(netdev);
+	}
 
 	e1e_rphy(hw, PHY_STATUS, &phy_status);
 	e1e_rphy(hw, PHY_1000T_STATUS, &phy_1000t_status);
@@ -1664,10 +1668,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;
 	}
 	/*
@@ -1768,10 +1772,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;
 	}
 
@@ -1851,9 +1855,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;
@@ -3523,12 +3527,14 @@
 	if (!adapter->ecdev) {
 		napi_enable(&adapter->napi);
 	}
+
 	if (adapter->msix_entries)
 		e1000_configure_msix(adapter);
+
 	if (!adapter->ecdev) {
 		e1000_irq_enable(adapter);
 
-	netif_start_queue(adapter->netdev);
+		netif_start_queue(adapter->netdev);
 
 		/* fire a link change interrupt to start the watchdog */
 		if (adapter->msix_entries)
@@ -3575,7 +3581,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 */
@@ -3871,19 +3877,22 @@
 		napi_enable(&adapter->napi);
 
 		e1000_irq_enable(adapter);
+	}
 
 	adapter->tx_hang_recheck = false;
+
+	if (!adapter->ecdev) {
 		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;
 
@@ -4391,7 +4400,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;
 
@@ -4489,7 +4498,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))
@@ -4497,7 +4506,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;
@@ -4537,9 +4546,8 @@
 
 	e1000e_update_adaptive(&adapter->hw);
 
-	if ((adapter->ecdev && !ecdev_get_link(adapter->ecdev)) 
-			|| (!adapter->ecdev && (!netif_carrier_ok(netdev) &&
-	    	(e1000_desc_unused(tx_ring) + 1 < tx_ring->count)))) {
+	if (!adapter->ecdev && !netif_carrier_ok(netdev) &&
+		(e1000_desc_unused(tx_ring) + 1 < tx_ring->count)) {
 		/*
 		 * We've lost link, so the controller stops DMA,
 		 * but we've got queued Tx work that's never going
@@ -4944,6 +4952,10 @@
 {
 	struct e1000_adapter *adapter = netdev_priv(netdev);
 
+	if (adapter->ecdev) {
+		return -EBUSY;
+	}
+
 	netif_stop_queue(netdev);
 	/*
 	 * Herbert's original patch had:
@@ -5767,7 +5779,7 @@
 	bool wake = false;
 	struct net_device *netdev = pci_get_drvdata(pdev);
 	struct e1000_adapter *adapter = netdev_priv(netdev);
-	
+
 	if (adapter->ecdev)
 		return;
 
@@ -6037,14 +6049,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
 }
 
@@ -6346,10 +6360,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 {
 		strncpy(netdev->name, "eth%d", sizeof(netdev->name) - 1);
 		err = register_netdev(netdev);