Plugfest: master_open()/close() ausgelagert.
authorFlorian Pose <fp@igh-essen.com>
Wed, 05 Apr 2006 07:55:51 +0000
changeset 151 1961b674466c
parent 150 36530399236b
child 152 9654f3cf588d
Plugfest: master_open()/close() ausgelagert.
master/master.c
master/master.h
master/module.c
--- a/master/master.c	Wed Apr 05 07:47:26 2006 +0000
+++ b/master/master.c	Wed Apr 05 07:55:51 2006 +0000
@@ -131,47 +131,6 @@
 /*****************************************************************************/
 
 /**
-   Öffnet das EtherCAT-Geraet des Masters.
-
-   \return 0 wenn alles ok, < 0 wenn kein Gerät registriert wurde oder
-           es nicht geoeffnet werden konnte.
-*/
-
-int ec_master_open(ec_master_t *master /**< Der EtherCAT-Master */)
-{
-    if (!master->device) {
-        EC_ERR("No device registered!\n");
-        return -1;
-    }
-
-    if (ec_device_open(master->device)) {
-        EC_ERR("Could not open device!\n");
-        return -1;
-    }
-
-    return 0;
-}
-
-/*****************************************************************************/
-
-/**
-   Schliesst das EtherCAT-Geraet, auf dem der Master arbeitet.
-*/
-
-void ec_master_close(ec_master_t *master /**< EtherCAT-Master */)
-{
-    if (!master->device) {
-        EC_WARN("Warning - Trying to close an unregistered device!\n");
-        return;
-    }
-
-    if (ec_device_close(master->device))
-        EC_WARN("Warning - Could not close device!\n");
-}
-
-/*****************************************************************************/
-
-/**
    Stellt ein Kommando in die Warteschlange.
 */
 
--- a/master/master.h	Wed Apr 05 07:47:26 2006 +0000
+++ b/master/master.h	Wed Apr 05 07:55:51 2006 +0000
@@ -73,10 +73,6 @@
 void ec_master_queue_command(ec_master_t *, ec_command_t *);
 int ec_master_simple_io(ec_master_t *, ec_command_t *);
 
-// Registration of devices
-int ec_master_open(ec_master_t *);
-void ec_master_close(ec_master_t *);
-
 // Slave management
 int ec_master_bus_scan(ec_master_t *);
 
--- a/master/module.c	Wed Apr 05 07:47:26 2006 +0000
+++ b/master/module.c	Wed Apr 05 07:55:51 2006 +0000
@@ -82,14 +82,13 @@
 
     if (!(ec_masters = (ec_master_t *)
           kmalloc(sizeof(ec_master_t) * ec_master_count, GFP_KERNEL))) {
-        EC_ERR("Could not allocate memory for EtherCAT master(s)!\n");
+        EC_ERR("Failed to allocate master(s)!\n");
         goto out_return;
     }
 
-    if (!(ec_masters_reserved =
-          (unsigned int *) kmalloc(sizeof(int) * ec_master_count,
-                                   GFP_KERNEL))) {
-        EC_ERR("Could not allocate memory for reservation flags!\n");
+    if (!(ec_masters_reserved = (unsigned int *)
+          kmalloc(sizeof(int) * ec_master_count, GFP_KERNEL))) {
+        EC_ERR("Failed to allocate reservation flags!\n");
         goto out_free_masters;
     }
 
@@ -241,7 +240,7 @@
 {
     ec_master_t *master;
 
-    EC_INFO("===== Starting master %i... =====\n", index);
+    EC_INFO("Requesting master %i...\n", index);
 
     if (index < 0 || index >= ec_master_count) {
         EC_ERR("Master %i does not exist!\n", index);
@@ -249,48 +248,49 @@
     }
 
     if (ec_masters_reserved[index]) {
-        EC_ERR("Master %i already in use!\n", index);
+        EC_ERR("Master %i is already in use!\n", index);
         goto req_return;
     }
 
+    ec_masters_reserved[index] = 1;
     master = &ec_masters[index];
 
     if (!master->device) {
-        EC_ERR("Master %i has no device assigned yet!\n", index);
-        goto req_return;
+        EC_ERR("Master %i has no assigned device!\n", index);
+        goto req_release;
     }
 
     if (!try_module_get(master->device->module)) {
         EC_ERR("Failed to reserve device module!\n");
-        goto req_return;
-    }
-
-    if (ec_master_open(master)) {
+        goto req_release;
+    }
+
+    if (ec_device_open(master->device)) {
         EC_ERR("Failed to open device!\n");
         goto req_module_put;
     }
 
-    if (!master->device->link_state) EC_WARN("Link is DOWN.\n");
+    if (!master->device->link_state)
+        EC_WARN("Link is DOWN.\n");
 
     if (ec_master_bus_scan(master) != 0) {
         EC_ERR("Bus scan failed!\n");
         goto req_close;
     }
 
-    ec_masters_reserved[index] = 1;
-    EC_INFO("===== Master %i ready. =====\n", index);
-
+    EC_INFO("Master %i is ready.\n", index);
     return master;
 
  req_close:
-    ec_master_close(master);
-
+    if (ec_device_close(master->device))
+        EC_WARN("Warning - Failed to close device!\n");
  req_module_put:
     module_put(master->device->module);
     ec_master_reset(master);
-
+ req_release:
+    ec_masters_reserved[index] = 0;
  req_return:
-    EC_INFO("===== Failed to start master %i =====\n", index);
+    EC_ERR("Failed requesting master %i.\n", index);
     return NULL;
 }
 
@@ -300,7 +300,7 @@
    Gibt einen zuvor angeforderten EtherCAT-Master wieder frei.
 */
 
-void ecrt_release_master(ec_master_t *master /**< EtherCAT-Masdter */)
+void ecrt_release_master(ec_master_t *master /**< EtherCAT-Master */)
 {
     unsigned int i, found;
 
@@ -313,19 +313,21 @@
     }
 
     if (!found) {
-        EC_WARN("Master %X was never requested!\n", (u32) master);
+        EC_WARN("Master 0x%08X was never requested!\n", (u32) master);
         return;
     }
 
-    EC_INFO("===== Stopping master %i... =====\n", i);
-
-    ec_master_close(master);
+    EC_INFO("Releasing master %i...\n", i);
+
     ec_master_reset(master);
 
+    if (ec_device_close(master->device))
+        EC_WARN("Warning - Failed to close device!\n");
+
     module_put(master->device->module);
     ec_masters_reserved[i] = 0;
 
-    EC_INFO("===== Master %i stopped. =====\n", i);
+    EC_INFO("Released master %i.\n", i);
     return;
 }