master/slave_config.c
changeset 858 69122084d066
parent 854 f4f53be425ac
child 859 233e32f428e1
--- a/master/slave_config.c	Tue Mar 04 09:20:14 2008 +0000
+++ b/master/slave_config.c	Tue Mar 04 09:57:36 2008 +0000
@@ -105,6 +105,7 @@
         ec_pdo_mapping_init(&sc->mapping[dir]);
 
     INIT_LIST_HEAD(&sc->sdo_configs);
+    INIT_LIST_HEAD(&sc->sdo_requests);
 
     sc->used_fmmus = 0;
 
@@ -174,6 +175,13 @@
         kfree(req);
     }
 
+    // free all Sdo requests
+    list_for_each_entry_safe(req, next_req, &sc->sdo_requests, list) {
+        list_del(&req->list);
+        ec_sdo_request_clear(req);
+        kfree(req);
+    }
+
     kfree(sc);
 }
 
@@ -276,6 +284,16 @@
         buf += sprintf(buf, "\n");
     }
 
+    // type-cast to avoid warnings on some compilers
+    if (!list_empty((struct list_head *) &sc->sdo_requests)) {
+        buf += sprintf(buf, "\nSdo requests:\n");
+
+        list_for_each_entry(req, &sc->sdo_requests, list) {
+            buf += sprintf(buf, "  0x%04X:%u\n", req->index, req->subindex);
+        }
+        buf += sprintf(buf, "\n");
+    }
+
     return buf - buffer;
 }
 
@@ -672,6 +690,32 @@
 
 /*****************************************************************************/
 
+ec_sdo_request_t *ecrt_slave_config_create_sdo_request(ec_slave_config_t *sc,
+        uint16_t index, uint8_t subindex, size_t size)
+{
+    ec_sdo_request_t *req;
+
+    if (!(req = (ec_sdo_request_t *)
+                kmalloc(sizeof(ec_sdo_request_t), GFP_KERNEL))) {
+        EC_ERR("Failed to allocate Sdo request memory!\n");
+        return NULL;
+    }
+
+    ec_sdo_request_init(req);
+    ec_sdo_request_address(req, index, subindex);
+
+    if (ec_sdo_request_alloc(req, size)) {
+        ec_sdo_request_clear(req);
+        kfree(req);
+        return NULL;
+    }
+    
+    list_add_tail(&req->list, &sc->sdo_requests);
+    return req; 
+}
+
+/*****************************************************************************/
+
 /** \cond */
 
 EXPORT_SYMBOL(ecrt_slave_config_pdo);
@@ -681,6 +725,7 @@
 EXPORT_SYMBOL(ecrt_slave_config_sdo8);
 EXPORT_SYMBOL(ecrt_slave_config_sdo16);
 EXPORT_SYMBOL(ecrt_slave_config_sdo32);
+EXPORT_SYMBOL(ecrt_slave_config_create_sdo_request);
 
 /** \endcond */