master/slave.c
changeset 618 e4b89c862c43
parent 613 bf28ede88c70
child 619 15becb1879fd
--- a/master/slave.c	Mon Mar 05 16:59:02 2007 +0000
+++ b/master/slave.c	Tue Mar 06 09:06:01 2007 +0000
@@ -127,7 +127,6 @@
     slave->base_revision = 0;
     slave->base_build = 0;
     slave->base_fmmu_count = 0;
-    slave->base_sync_count = 0;
 
     slave->eeprom_data = NULL;
     slave->eeprom_size = 0;
@@ -149,7 +148,8 @@
     slave->sii_current_on_ebus = 0;
 
     INIT_LIST_HEAD(&slave->sii_strings);
-    INIT_LIST_HEAD(&slave->sii_syncs);
+    slave->sii_syncs = NULL;
+    slave->sii_sync_count = 0;
     INIT_LIST_HEAD(&slave->sii_pdos);
     INIT_LIST_HEAD(&slave->sdo_dictionary);
     INIT_LIST_HEAD(&slave->sdo_confs);
@@ -240,7 +240,6 @@
 {
     ec_slave_t *slave;
     ec_sii_string_t *string, *next_str;
-    ec_sii_sync_t *sync, *next_sync;
     ec_sii_pdo_t *pdo, *next_pdo;
     ec_sii_pdo_entry_t *entry, *next_ent;
     ec_sdo_data_t *sdodata, *next_sdodata;
@@ -254,10 +253,7 @@
     }
 
     // free all sync managers
-    list_for_each_entry_safe(sync, next_sync, &slave->sii_syncs, list) {
-        list_del(&sync->list);
-        kfree(sync);
-    }
+    if (slave->sii_syncs) kfree(slave->sii_syncs);
 
     // free all PDOs
     list_for_each_entry_safe(pdo, next_pdo, &slave->sii_pdos, list) {
@@ -309,7 +305,7 @@
 void ec_slave_reset(ec_slave_t *slave /**< EtherCAT slave */)
 {
     ec_sdo_data_t *sdodata, *next_sdodata;
-    ec_sii_sync_t *sync;
+    unsigned int i;
 
     // remove FMMU configurations
     slave->fmmu_count = 0;
@@ -323,8 +319,8 @@
     }
 
     // remove estimated sync manager sizes
-    list_for_each_entry(sync, &slave->sii_syncs, list) {
-        sync->est_length = 0;
+    for (i = 0; i < slave->sii_sync_count; i++) {
+        slave->sii_syncs[i].est_length = 0;
     }
 }
 
@@ -472,27 +468,28 @@
                         size_t word_count /**< number of words */
                         )
 {
-    unsigned int sync_count, i;
+    unsigned int i;
     ec_sii_sync_t *sync;
 
-    sync_count = word_count / 4; // sync manager struct is 4 words long
-
-    for (i = 0; i < sync_count; i++, data += 8) {
-        if (!(sync = (ec_sii_sync_t *)
-              kmalloc(sizeof(ec_sii_sync_t), GFP_ATOMIC))) {
-            EC_ERR("Failed to allocate Sync-Manager memory.\n");
-            return -1;
-        }
-
-        sync->index = i;
+    // sync manager struct is 4 words long
+    slave->sii_sync_count = word_count / 4;
+
+    if (!(slave->sii_syncs = kmalloc(sizeof(ec_sii_sync_t) *
+                    slave->sii_sync_count, GFP_ATOMIC))) {
+        EC_ERR("Failed to allocate Sync-Manager memory.\n");
+        return -1;
+    }
+    
+    for (i = 0; i < slave->sii_sync_count; i++, data += 8) {
+        sync = &slave->sii_syncs[i];
+
+        sync->index = i; 
         sync->physical_start_address = EC_READ_U16(data);
         sync->length                 = EC_READ_U16(data + 2);
         sync->control_register       = EC_READ_U8 (data + 4);
         sync->enable                 = EC_READ_U8 (data + 6);
-
+        
         sync->est_length = 0;
-
-        list_add_tail(&sync->list, &slave->sii_syncs);
     }
 
     return 0;
@@ -785,15 +782,16 @@
     if (slave->sii_order)
         off += sprintf(buffer + off, "  Order number: %s\n", slave->sii_order);
 
-    if (!list_empty(&slave->sii_syncs))
+    if (slave->sii_sync_count)
         off += sprintf(buffer + off, "\nSync-Managers:\n");
 
-    list_for_each_entry(sync, &slave->sii_syncs, list) {
+    for (i = 0; i < slave->sii_sync_count; i++) {
+        sync = &slave->sii_syncs[i];
         off += sprintf(buffer + off, "  %i: 0x%04X, length %i,"
-                       " control 0x%02X, %s\n",
-                       sync->index, sync->physical_start_address,
-                       sync->length, sync->control_register,
-                       sync->enable ? "enable" : "disable");
+                " control 0x%02X, %s\n",
+                sync->index, sync->physical_start_address,
+                sync->length, sync->control_register,
+                sync->enable ? "enable" : "disable");
     }
 
     if (!list_empty(&slave->sii_pdos))