Link-Down-Verhalten verbessert.
authorFlorian Pose <fp@igh-essen.com>
Thu, 02 Mar 2006 13:08:07 +0000
changeset 97 e6264685dd7b
parent 96 080b46eb6e2d
child 98 f564d0929292
Link-Down-Verhalten verbessert.
devices/8139too.c
master/device.c
master/domain.c
--- a/devices/8139too.c	Thu Mar 02 11:19:27 2006 +0000
+++ b/devices/8139too.c	Thu Mar 02 13:08:07 2006 +0000
@@ -1925,18 +1925,6 @@
 	dirty_tx = tp->dirty_tx;
 	tx_left = tp->cur_tx - dirty_tx;
 
-	/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
-
-#if 0
-	if (EtherCAT_dev_is_ec(rtl_ec_dev, dev))
-    {
-                rtl_ec_dev.tx_intr_cnt++;
-                rdtscl(rtl_ec_dev.tx_time); // Get CPU cycles
-	}
-#endif
-
-        /* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
-
 	while (tx_left > 0) {
 		int entry = dirty_tx % NUM_TX_DESC;
 		int txstatus;
@@ -1967,9 +1955,7 @@
                         /* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
 
                         if (EtherCAT_dev_is_ec(rtl_ec_dev, dev))
-                        {
-                          EtherCAT_dev_state(rtl_ec_dev, EC_DEVICE_STATE_ERROR);
-                        }
+                            EtherCAT_dev_state(rtl_ec_dev, EC_DEVICE_STATE_ERROR);
 
                         /* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
 
@@ -2156,17 +2142,6 @@
 		 RTL_R16 (RxBufAddr),
 		 RTL_R16 (RxBufPtr), RTL_R8 (ChipCmd));
 
-        /* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
-#if 0
-	if (EtherCAT_dev_is_ec(rtl_ec_dev, dev))
-	{
-                rtl_ec_dev.rx_intr_cnt++;
-                rdtscl(rtl_ec_dev.rx_time); // Get CPU cycles
-	}
-#endif
-
-        /* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
-
 	while ((EtherCAT_dev_is_ec(rtl_ec_dev, dev) || netif_running(dev))
 	       && received < budget
 	       && (RTL_R8 (ChipCmd) & RxBufEmpty) == 0) {
--- a/master/device.c	Thu Mar 02 11:19:27 2006 +0000
+++ b/master/device.c	Thu Mar 02 13:08:07 2006 +0000
@@ -168,9 +168,8 @@
 {
     struct ethhdr *eth;
 
-    if (unlikely(!device->link_state)) { // Link down
+    if (unlikely(!device->link_state)) // Link down
         return;
-    }
 
     // Framegröße auf (jetzt bekannte) Länge abschneiden
     skb_trim(device->tx_skb, length);
--- a/master/domain.c	Thu Mar 02 11:19:27 2006 +0000
+++ b/master/domain.c	Thu Mar 02 13:08:07 2006 +0000
@@ -180,6 +180,23 @@
     return 0;
 }
 
+/*****************************************************************************/
+
+/**
+   Gibt die Anzahl der antwortenden Slaves aus.
+*/
+
+void ec_domain_response_count(ec_domain_t *domain, /**< Domäne */
+                              unsigned int count /**< Neue Anzahl */
+                              )
+{
+    if (count != domain->response_count) {
+        domain->response_count = count;
+        EC_INFO("Domain %08X state change - %i slaves responding.\n",
+                (u32) domain, count);
+    }
+}
+
 /******************************************************************************
  *
  * Echtzeitschnittstelle
@@ -281,6 +298,12 @@
 
     ec_cyclic_output(master);
 
+    if (unlikely(!master->device.link_state)) {
+        ec_domain_response_count(domain, working_counter_sum);
+        ec_device_call_isr(&master->device);
+        return -1;
+    }
+
     rdtscl(start_ticks); // Sendezeit nehmen
     timeout_ticks = domain->timeout_us * cpu_khz / 1000;
 
@@ -297,10 +320,7 @@
             master->device.state = EC_DEVICE_STATE_READY;
             master->frames_lost++;
             ec_cyclic_output(master);
-
-            // Falls Link down...
-            ec_device_call_isr(&master->device);
-
+            ec_domain_response_count(domain, working_counter_sum);
             return -1;
         }
 
@@ -323,12 +343,13 @@
                 master->device.state = EC_DEVICE_STATE_READY;
                 master->frames_lost++;
                 ec_cyclic_output(master);
+                ec_domain_response_count(domain, working_counter_sum);
                 return -1;
             }
         }
 
         if (unlikely(ec_frame_receive(frame) < 0)) {
-            EC_ERR("Receiving process data failed!\n");
+            ec_domain_response_count(domain, working_counter_sum);
             return -1;
         }
 
@@ -340,11 +361,7 @@
         offset += size;
     }
 
-    if (working_counter_sum != domain->response_count) {
-        domain->response_count = working_counter_sum;
-        EC_INFO("Domain %08X state change - %i slaves responding.\n",
-                (u32) domain, working_counter_sum);
-    }
+    ec_domain_response_count(domain, working_counter_sum);
 
     return 0;
 }