master/device.c
changeset 96 080b46eb6e2d
parent 91 0120d6214948
child 97 e6264685dd7b
--- a/master/device.c	Tue Feb 28 13:07:05 2006 +0000
+++ b/master/device.c	Thu Mar 02 11:19:27 2006 +0000
@@ -39,6 +39,7 @@
     device->isr = NULL;
     device->module = NULL;
     device->error_reported = 0;
+    device->link_state = 0; // down
 
     if ((device->tx_skb = dev_alloc_skb(ETH_HLEN + EC_MAX_FRAME_SIZE)) == NULL) {
         EC_ERR("Error allocating device socket buffer!\n");
@@ -101,6 +102,7 @@
 
     // Reset old device state
     device->state = EC_DEVICE_STATE_READY;
+    device->link_state = 0;
 
     if (device->dev->open(device->dev) == 0) device->open = 1;
 
@@ -166,6 +168,10 @@
 {
     struct ethhdr *eth;
 
+    if (unlikely(!device->link_state)) { // Link down
+        return;
+    }
+
     // Framegröße auf (jetzt bekannte) Länge abschneiden
     skb_trim(device->tx_skb, length);
 
@@ -375,9 +381,26 @@
 
 /*****************************************************************************/
 
+/**
+   Setzt einen neuen Verbindungszustand.
+*/
+
+void EtherCAT_dev_link_state(ec_device_t *device, /**< EtherCAT-Gerät */
+                             uint8_t state /**< Verbindungszustand */
+                             )
+{
+    if (state != device->link_state) {
+        device->link_state = state;
+        EC_INFO("Link state changed to %s.\n", (state ? "UP" : "DOWN"));
+    }
+}
+
+/*****************************************************************************/
+
 EXPORT_SYMBOL(EtherCAT_dev_is_ec);
 EXPORT_SYMBOL(EtherCAT_dev_state);
 EXPORT_SYMBOL(EtherCAT_dev_receive);
+EXPORT_SYMBOL(EtherCAT_dev_link_state);
 
 /*****************************************************************************/