devices/8139too-2.6.13-ethercat.c
changeset 573 cdee4ea90ce9
parent 535 4c8edc04fe24
child 639 aa23c48dca2d
--- a/devices/8139too-2.6.13-ethercat.c	Fri Feb 16 13:30:46 2007 +0000
+++ b/devices/8139too-2.6.13-ethercat.c	Fri Feb 16 17:13:39 2007 +0000
@@ -153,8 +153,6 @@
 #include <asm/uaccess.h>
 #include <asm/irq.h>
 
-/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
-
 #include "../globals.h"
 #include "ecdev.h"
 
@@ -162,8 +160,6 @@
                             " EtherCAT-capable Fast Ethernet driver " \
                             DRV_VERSION ", master " EC_MASTER_VERSION
 
-/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
-
 #define PFX DRV_NAME ": "
 
 /* Default Message level */
@@ -215,15 +211,6 @@
 /* bitmapped message enable number */
 static int debug = -1;
 
-/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
-
-static int ec_device_index = -1;
-static int ec_device_master_index = 0;
-static ec_device_t *rtl_ec_dev;
-struct net_device *rtl_ec_net_dev = NULL;
-
-/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
-
 /*
  * Receive ring size 
  * Warning: 64K ring has hardware issues and may lock up.
@@ -338,13 +325,9 @@
 	{0,}
 };
 
-/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
-
 /* prevent driver from being loaded automatically */
 //MODULE_DEVICE_TABLE (pci, rtl8139_pci_tbl);
 
-/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
-
 static struct {
 	const char str[ETH_GSTRING_LEN];
 } ethtool_stats_keys[] = {
@@ -664,17 +647,15 @@
 	struct mii_if_info mii;
 	unsigned int regs_len;
 	unsigned long fifo_copy_timeout;
+    
+	ec_device_t *ecdev;
 };
 
-/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
-
 MODULE_AUTHOR("Florian Pose <fp@igh-essen.com>");
 MODULE_DESCRIPTION("RealTek RTL-8139 EtherCAT driver");
 MODULE_LICENSE("GPL");
 MODULE_VERSION(EC_MASTER_VERSION);
 
-/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
-
 module_param(multicast_filter_limit, int, 0);
 module_param_array(media, int, NULL, 0);
 module_param_array(full_duplex, int, NULL, 0);
@@ -684,19 +665,8 @@
 MODULE_PARM_DESC (media, "8139too: Bits 4+9: force full duplex, bit 5: 100Mbps");
 MODULE_PARM_DESC (full_duplex, "8139too: Force full duplex for board(s) (1)");
 
-/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
-
-module_param(ec_device_index, int, -1);
-module_param(ec_device_master_index, int, 0);
-MODULE_PARM_DESC(ec_device_index,
-                 "Index of the device reserved for EtherCAT.");
-MODULE_PARM_DESC(ec_device_master_index,
-                 "Index of the EtherCAT master to register the device.");
-
 void ec_poll(struct net_device *);
 
-/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
-
 static int read_eeprom (void __iomem *ioaddr, int location, int addr_len);
 static int rtl8139_open (struct net_device *dev);
 static int mdio_read (struct net_device *dev, int phy_id, int location);
@@ -1046,15 +1016,6 @@
 	assert (dev != NULL);
 	tp = netdev_priv(dev);
 
-	/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
-
-	if (board_idx == ec_device_index) {
-		rtl_ec_net_dev = dev;
-		strcpy(dev->name, "ec0");
-	}
-
-	/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
-
 	ioaddr = tp->mmio_addr;
 	assert (ioaddr != NULL);
 
@@ -1106,17 +1067,20 @@
 	tp->mii.reg_num_mask = 0x1f;
 
 	/* dev is fully set up and ready to use now */
-
-	/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
-
-	if (dev != rtl_ec_net_dev) {
+    
+	// offer device to EtherCAT master module
+	if (ecdev_offer(dev, &tp->ecdev, "8139too", board_idx,
+				ec_poll, THIS_MODULE)) {
+		printk(KERN_ERR PFX "Failed to offer device.\n");
+		goto err_out;
+	}
+
+	if (!tp->ecdev) {
 		DPRINTK("about to register device named %s (%p)...\n", dev->name, dev);
 		i = register_netdev (dev);
 		if (i) goto err_out;
 	}
 
-	/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
-
 	pci_set_drvdata (pdev, dev);
 
 	printk (KERN_INFO "%s: %s at 0x%lx, "
@@ -1189,6 +1153,11 @@
 	if (rtl_chip_info[tp->chipset].flags & HasHltClk)
 		RTL_W8 (HltClk, 'H');	/* 'R' would leave the clock running. */
 
+	if (tp->ecdev && ecdev_open(tp->ecdev)) {
+		ecdev_withdraw(tp->ecdev);
+		goto err_out;
+	}
+
 	return 0;
 
 err_out:
@@ -1201,17 +1170,18 @@
 static void __devexit rtl8139_remove_one (struct pci_dev *pdev)
 {
 	struct net_device *dev = pci_get_drvdata (pdev);
+	struct rtl8139_private *tp = netdev_priv(dev);
 
 	assert (dev != NULL);
 
-	/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
-
-	if (dev != rtl_ec_net_dev) {
+	if (tp->ecdev) {
+		ecdev_close(tp->ecdev);
+		ecdev_withdraw(tp->ecdev);
+	}
+	else {
 		unregister_netdev (dev);
 	}
 
-	/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
-
 	__rtl8139_cleanup_dev (dev);
 	pci_disable_device (pdev);
 }
@@ -1412,30 +1382,19 @@
 	int retval;
 	void __iomem *ioaddr = tp->mmio_addr;
 
-	/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
-
-	if (dev != rtl_ec_net_dev) {
+	if (!tp->ecdev) {
 		retval = request_irq(dev->irq, rtl8139_interrupt,
 			SA_SHIRQ, dev->name, dev);
 		if (retval)
 			return retval;
 	}
 
-	/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
-
 	tp->tx_bufs = pci_alloc_consistent(tp->pci_dev, TX_BUF_TOT_LEN,
 					   &tp->tx_bufs_dma);
 	tp->rx_ring = pci_alloc_consistent(tp->pci_dev, RX_BUF_TOT_LEN,
 					   &tp->rx_ring_dma);
 	if (tp->tx_bufs == NULL || tp->rx_ring == NULL) {
-		/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
-
-		if (dev != rtl_ec_net_dev) {
-			free_irq(dev->irq, dev);
-		}
-
-		/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
-
+		if (!tp->ecdev) free_irq(dev->irq, dev);
 		if (tp->tx_bufs)
 			pci_free_consistent(tp->pci_dev, TX_BUF_TOT_LEN,
 					    tp->tx_bufs, tp->tx_bufs_dma);
@@ -1453,9 +1412,7 @@
 	rtl8139_init_ring (dev);
 	rtl8139_hw_start (dev);
 
-	/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
-
-	if (dev != rtl_ec_net_dev) {
+	if (!tp->ecdev) {
 		netif_start_queue (dev);
 
 		if (netif_msg_ifup(tp))
@@ -1468,8 +1425,6 @@
 		rtl8139_start_thread(dev);
 	}
 
-	/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
-
 	return 0;
 }
 
@@ -1478,19 +1433,16 @@
 {
 	struct rtl8139_private *tp = netdev_priv(dev);
 
-	/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
-
-	if (dev != rtl_ec_net_dev) {
+	if (tp->ecdev) {
+		void __iomem *ioaddr = tp->mmio_addr;
+		uint16_t state = RTL_R16(BasicModeStatus) & BMSR_LSTATUS;
+		ecdev_link_state(tp->ecdev, state ? 1 : 0);
+	}
+	else {
 		if (tp->phys[0] >= 0) {
 			mii_check_media(&tp->mii, netif_msg_link(tp), init_media);
 		}
-	} else {
-		void __iomem *ioaddr = tp->mmio_addr;
-		uint16_t state = RTL_R16(BasicModeStatus) & BMSR_LSTATUS;
-		ecdev_link_state(rtl_ec_dev, state ? 1 : 0);
-	}
-
-	/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
+	}
 }
 
 /* Start the hardware at open or resume. */
@@ -1555,14 +1507,9 @@
 	if ((!(tmp & CmdRxEnb)) || (!(tmp & CmdTxEnb)))
 		RTL_W8 (ChipCmd, CmdRxEnb | CmdTxEnb);
 
-	/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
-
-	if (dev != rtl_ec_net_dev) {
+	if (!tp->ecdev)
 		/* Enable all known interrupts by setting the interrupt mask. */
 		RTL_W16 (IntrMask, rtl8139_intr_mask);
-	}
-
-	/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
 }
 
 
@@ -1821,30 +1768,27 @@
 	if (tmp8 & CmdTxEnb)
 		RTL_W8 (ChipCmd, CmdRxEnb);
 
-	/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
-
-	if (dev != rtl_ec_net_dev) {
-		spin_lock(&tp->rx_lock);
-		/* Disable interrupts by clearing the interrupt mask. */
-		RTL_W16 (IntrMask, 0x0000);
-
-		/* Stop a shared interrupt from scavenging while we are. */
-		spin_lock_irqsave (&tp->lock, flags);
-		rtl8139_tx_clear (tp);
-		spin_unlock_irqrestore (&tp->lock, flags);
-
-		/* ...and finally, reset everything */
-		if (netif_running(dev)) {
-			rtl8139_hw_start (dev);
-			netif_wake_queue (dev);
-		}
-		spin_unlock(&tp->rx_lock);
-	} else {
-		rtl8139_tx_clear (tp);
-		rtl8139_hw_start (dev);
-	}
-
-	/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
+    if (tp->ecdev) {
+        rtl8139_tx_clear (tp);
+        rtl8139_hw_start (dev);
+    }
+    else {
+        spin_lock(&tp->rx_lock);
+        /* Disable interrupts by clearing the interrupt mask. */
+        RTL_W16 (IntrMask, 0x0000);
+
+        /* Stop a shared interrupt from scavenging while we are. */
+        spin_lock_irqsave (&tp->lock, flags);
+        rtl8139_tx_clear (tp);
+        spin_unlock_irqrestore (&tp->lock, flags);
+
+        /* ...and finally, reset everything */
+        if (netif_running(dev)) {
+            rtl8139_hw_start (dev);
+            netif_wake_queue (dev);
+        }
+        spin_unlock(&tp->rx_lock);
+    }
 }
 
 
@@ -1858,30 +1802,19 @@
 	/* Calculate the next Tx descriptor entry. */
 	entry = tp->cur_tx % NUM_TX_DESC;
 
-	/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
-
 	/* Note: the chip doesn't have auto-pad! */
 	if (likely(len < TX_BUF_SIZE)) {
 		if (len < ETH_ZLEN)
 			memset(tp->tx_buf[entry], 0, ETH_ZLEN);
 		skb_copy_and_csum_dev(skb, tp->tx_buf[entry]);
-		if (dev != rtl_ec_net_dev) {
-			dev_kfree_skb(skb);
-		}
+		if (!tp->ecdev) dev_kfree_skb(skb);
 	} else {
-		if (dev != rtl_ec_net_dev) {
-			dev_kfree_skb(skb);
-		}
+		if (!tp->ecdev) dev_kfree_skb(skb);
 		tp->stats.tx_dropped++;
 		return 0;
 	}
 
-	if (dev != rtl_ec_net_dev) {
-		spin_lock_irq(&tp->lock);
-	}
-
-	/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
-
+	if (!tp->ecdev) spin_lock_irq(&tp->lock);
 	RTL_W32_F (TxStatus0 + (entry * sizeof (u32)),
 		   tp->tx_flag | max(len, (unsigned int)ETH_ZLEN));
 
@@ -1890,9 +1823,7 @@
 	tp->cur_tx++;
 	wmb();
 
-	/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
-
-	if (dev != rtl_ec_net_dev) {
+	if (!tp->ecdev) {
 		if ((tp->cur_tx - NUM_TX_DESC) == tp->dirty_tx)
 			netif_stop_queue (dev);
 		spin_unlock_irq(&tp->lock);
@@ -1902,8 +1833,6 @@
 				dev->name, len, entry);
 	}
 
-	/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
-
 	return 0;
 }
 
@@ -1961,10 +1890,8 @@
 		tx_left--;
 	}
 
-	/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
-
 #ifndef RTL8139_NDEBUG
-	if (dev != rtl_ec_net_dev && tp->cur_tx - dirty_tx > NUM_TX_DESC) {
+	if (!tp->ecdev && tp->cur_tx - dirty_tx > NUM_TX_DESC) {
 		printk (KERN_ERR "%s: Out-of-sync dirty pointer, %ld vs. %ld.\n",
 		        dev->name, dirty_tx, tp->cur_tx);
 		dirty_tx += NUM_TX_DESC;
@@ -1975,13 +1902,8 @@
 	if (tp->dirty_tx != dirty_tx) {
 		tp->dirty_tx = dirty_tx;
 		mb();
-
-		if (dev != rtl_ec_net_dev) {
-			netif_wake_queue (dev);
-		}
-	}
-
-	/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
+		if (!tp->ecdev) netif_wake_queue (dev);
+	}
 }
 
 
@@ -2114,15 +2036,9 @@
 		 RTL_R16 (RxBufAddr),
 		 RTL_R16 (RxBufPtr), RTL_R8 (ChipCmd));
 
-
-	/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
-
-	while ((dev == rtl_ec_net_dev || netif_running(dev))
+	while ((tp->ecdev || netif_running(dev))
 	       && received < budget
 	       && (RTL_R8 (ChipCmd) & RxBufEmpty) == 0) {
-
-	/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
-
 		u32 ring_offset = cur_rx % RX_BUF_LEN;
 		u32 rx_status;
 		unsigned int pkt_size;
@@ -2135,17 +2051,12 @@
 		rx_size = rx_status >> 16;
 		pkt_size = rx_size - 4;
 
-		/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
-
-		if (dev != rtl_ec_net_dev) {
+		if (!tp->ecdev) {
 			if (netif_msg_rx_status(tp))
 				printk(KERN_DEBUG "%s:  rtl8139_rx() status %4.4x, size %4.4x,"
 				       " cur %4.4x.\n", dev->name, rx_status,
 				       rx_size, cur_rx);
 		}
-
-		/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
-
 #if RTL8139_DEBUG > 2
 		{
 			int i;
@@ -2193,9 +2104,14 @@
 			goto out;
 		}
 
-		/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
-
-		if (dev != rtl_ec_net_dev) {
+		if (tp->ecdev) {
+			ecdev_receive(tp->ecdev,
+					&rx_ring[ring_offset + 4], pkt_size);
+			dev->last_rx = jiffies;
+			tp->stats.rx_bytes += pkt_size;
+			tp->stats.rx_packets++;
+		}
+		else {
 			/* Malloc up new buffer, compatible with net-2e. */
 			/* Omit the four octet CRC from the length. */
 
@@ -2220,20 +2136,11 @@
 			} else {
 				if (net_ratelimit())
 					printk(KERN_WARNING
-					       "%s: Memory squeeze, dropping packet.\n",
-					       dev->name);
+							"%s: Memory squeeze, dropping packet.\n",
+							dev->name);
 				tp->stats.rx_dropped++;
 			}
-		} else {
-			ecdev_receive(rtl_ec_dev,
-			              &rx_ring[ring_offset + 4], pkt_size);
-			dev->last_rx = jiffies;
-			tp->stats.rx_bytes += pkt_size;
-			tp->stats.rx_packets++;
 		}
-
-		/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
-
 		received++;
 
 		cur_rx = (cur_rx + rx_size + 4 + 3) & ~3;
@@ -2339,19 +2246,15 @@
 	return !done;
 }
 
-/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
-
 void ec_poll(struct net_device *dev)
 {
     rtl8139_interrupt(0, dev, NULL);
 }
 
-/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
-
 /* The interrupt handler does all of the Rx thread work and cleans up
    after the Tx thread. */
-irqreturn_t rtl8139_interrupt (int irq, void *dev_instance,
-                               struct pt_regs *regs)
+static irqreturn_t rtl8139_interrupt (int irq, void *dev_instance,
+			       struct pt_regs *regs)
 {
 	struct net_device *dev = (struct net_device *) dev_instance;
 	struct rtl8139_private *tp = netdev_priv(dev);
@@ -2360,20 +2263,17 @@
 	int link_changed = 0; /* avoid bogus "uninit" warning */
 	int handled = 0;
 
-	/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
-
-	if (dev != rtl_ec_net_dev) {
+	if (tp->ecdev) {
+		status = RTL_R16 (IntrStatus);
+	}
+	else {
 		spin_lock (&tp->lock);
 		status = RTL_R16 (IntrStatus);
 
 		/* shared irq? */
 		if (unlikely((status & rtl8139_intr_mask) == 0))
 			goto out;
-	} else {
-		status = RTL_R16 (IntrStatus);
-	}
-
-	/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
+	}
 
 	handled = 1;
 
@@ -2381,9 +2281,7 @@
 	if (unlikely(status == 0xFFFF)) 
 		goto out;
 
-	/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
-
-	if (dev != rtl_ec_net_dev) {
+	if (!tp->ecdev) {
 		/* close possible race's with dev_close */
 		if (unlikely(!netif_running(dev))) {
 			RTL_W16 (IntrMask, 0);
@@ -2391,8 +2289,6 @@
 		}
 	}
 
-	/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
-
 	/* Acknowledge all of the current interrupt sources ASAP, but
 	   an first get an additional status bit from CSCR. */
 	if (unlikely(status & RxUnderrun))
@@ -2404,24 +2300,20 @@
 
 	/* Receive packets are processed by poll routine.
 	   If not running start it now. */
-
-	/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
-
 	if (status & RxAckBits){
-		if (dev != rtl_ec_net_dev) {
+		if (tp->ecdev) {
+			/* EtherCAT device: Just receive all frames */
+			rtl8139_rx(dev, tp, 100); // FIXME
+		}
+		else {
 			/* Mark for polling */
 			if (netif_rx_schedule_prep(dev)) {
 				RTL_W16_F (IntrMask, rtl8139_norx_intr_mask);
 				__netif_rx_schedule (dev);
 			}
-		} else {
-			/* EtherCAT device: Just receive all frames */
-			rtl8139_rx(dev, tp, 100); // FIXME
 		}
 	}
 
-	/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
-
 	/* Check uncommon events with one test. */
 	if (unlikely(status & (PCIErr | PCSTimeout | RxUnderrun | RxErr)))
 		rtl8139_weird_interrupt (dev, tp, ioaddr,
@@ -2433,14 +2325,7 @@
 			RTL_W16 (IntrStatus, TxErr);
 	}
  out:
-
-	/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
-
-	if (dev != rtl_ec_net_dev) {
-		spin_unlock (&tp->lock);
-	}
-
-	/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
+	if (!tp->ecdev) spin_unlock (&tp->lock);
 
 	DPRINTK ("%s: exiting interrupt, intr_status=%#4.4x.\n",
 		 dev->name, RTL_R16 (IntrStatus));
@@ -2467,9 +2352,17 @@
 	int ret = 0;
 	unsigned long flags;
 
-	/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
-
-	if (dev != rtl_ec_net_dev) {
+	if (tp->ecdev) {
+		/* Stop the chip's Tx and Rx DMA processes. */
+		RTL_W8 (ChipCmd, 0);
+
+		/* Disable interrupts by clearing the interrupt mask. */
+		RTL_W16 (IntrMask, 0);
+
+		/* Update the error counts. */
+		tp->stats.rx_missed_errors += RTL_R32 (RxMissed);
+		RTL_W32 (RxMissed, 0);
+	} else {
 		netif_stop_queue (dev);
 
 		if (tp->thr_pid >= 0) {
@@ -2503,19 +2396,7 @@
 
 		synchronize_irq (dev->irq);	/* racy, but that's ok here */
 		free_irq (dev->irq, dev);
-	} else {
-		/* Stop the chip's Tx and Rx DMA processes. */
-		RTL_W8 (ChipCmd, 0);
-
-		/* Disable interrupts by clearing the interrupt mask. */
-		RTL_W16 (IntrMask, 0);
-
-		/* Update the error counts. */
-		tp->stats.rx_missed_errors += RTL_R32 (RxMissed);
-		RTL_W32 (RxMissed, 0);
-	}
-
-	/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
+	}
 
 	rtl8139_tx_clear (tp);
 
@@ -2730,13 +2611,9 @@
 	struct rtl8139_private *np = netdev_priv(dev);
 	int rc;
 
-	/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
-
-	if (dev == rtl_ec_net_dev || !netif_running(dev))
+	if (np->ecdev || !netif_running(dev))
 		return -EINVAL;
 
-	/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
-
 	spin_lock_irq(&np->lock);
 	rc = generic_mii_ioctl(&np->mii, if_mii(rq), cmd, NULL);
 	spin_unlock_irq(&np->lock);
@@ -2751,17 +2628,13 @@
 	void __iomem *ioaddr = tp->mmio_addr;
 	unsigned long flags;
 
-	/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
-
-	if (dev == rtl_ec_net_dev || netif_running(dev)) {
+	if (tp->ecdev || netif_running(dev)) {
 		spin_lock_irqsave (&tp->lock, flags);
 		tp->stats.rx_missed_errors += RTL_R32 (RxMissed);
 		RTL_W32 (RxMissed, 0);
 		spin_unlock_irqrestore (&tp->lock, flags);
 	}
 
-	/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
-
 	return &tp->stats;
 }
 
@@ -2837,13 +2710,9 @@
 
 	pci_save_state (pdev);
 
-	/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
-
-	if (dev == rtl_ec_net_dev || !netif_running (dev))
+	if (tp->ecdev || !netif_running (dev))
 		return 0;
 
-	/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
-
 	netif_device_detach (dev);
 
 	spin_lock_irqsave (&tp->lock, flags);
@@ -2867,16 +2736,11 @@
 static int rtl8139_resume (struct pci_dev *pdev)
 {
 	struct net_device *dev = pci_get_drvdata (pdev);
+	struct rtl8139_private *tp = netdev_priv(dev);
 
 	pci_restore_state (pdev);
-
-	/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
-
-	if (dev == rtl_ec_net_dev || !netif_running (dev))
+	if (tp->ecdev || !netif_running (dev))
 		return 0;
-
-	/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
-
 	pci_set_power_state (pdev, PCI_D0);
 	rtl8139_init_ring (dev);
 	rtl8139_hw_start (dev);
@@ -2901,69 +2765,20 @@
 
 static int __init rtl8139_init_module (void)
 {
-	/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
-
-	printk(KERN_INFO RTL8139_DRIVER_NAME "\n");
-	printk(KERN_INFO "ec_device_index is %i\n", ec_device_index);
-
-	if (pci_module_init(&rtl8139_pci_driver) < 0) {
-		printk(KERN_ERR "Failed to init PCI module.\n");
-		goto out_return;
-	}
-
-	if (rtl_ec_net_dev) {
-		printk(KERN_INFO "Registering EtherCAT device...\n");
-		if (!(rtl_ec_dev = ecdev_register(ec_device_master_index,
-			rtl_ec_net_dev, ec_poll, THIS_MODULE))) {
-			printk(KERN_ERR "Failed to register EtherCAT device!\n");
-			goto out_pci;
-		}
-
-		printk(KERN_INFO "Opening EtherCAT device...\n");
-		if (ecdev_open(rtl_ec_dev)) {
-			printk(KERN_ERR "Failed to open EtherCAT device!\n");
-			goto out_unregister;
-		}
-
-		printk(KERN_INFO "EtherCAT device ready.\n");
-	} else {
-		printk(KERN_WARNING "No EtherCAT device registered!\n");
-	}
-
-	return 0;
-
-    out_unregister:
-	printk(KERN_INFO "Unregistering EtherCAT device...\n");
-	ecdev_unregister(ec_device_master_index, rtl_ec_dev);
-	rtl_ec_dev = NULL;
-    out_pci:
-	pci_unregister_driver(&rtl8139_pci_driver);
-    out_return:
-	return -1;
-
-	/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
+	/* when we're a module, we always print a version message,
+	 * even if no 8139 board is found.
+	 */
+#ifdef MODULE
+	printk (KERN_INFO RTL8139_DRIVER_NAME "\n");
+#endif
+
+	return pci_module_init (&rtl8139_pci_driver);
 }
 
 
 static void __exit rtl8139_cleanup_module (void)
 {
-	/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
-
-	printk(KERN_INFO "Cleaning up RTL8139-EtherCAT module...\n");
-
-	if (rtl_ec_net_dev) {
-		printk(KERN_INFO "Closing EtherCAT device...\n");
-		ecdev_close(rtl_ec_dev);
-		printk(KERN_INFO "Unregistering EtherCAT device...\n");
-		ecdev_unregister(ec_device_master_index, rtl_ec_dev);
-		rtl_ec_dev = NULL;
-	}
-
-	pci_unregister_driver(&rtl8139_pci_driver);
-
-	printk(KERN_INFO "RTL8139-EtherCAT module cleaned up.\n");
-
-	/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
+	pci_unregister_driver (&rtl8139_pci_driver);
 }