master/master.c
changeset 1513 60ca68d853b8
parent 1507 68e89abadd19
child 1516 e3b09f847512
--- a/master/master.c	Tue Jul 28 16:06:21 2009 +0000
+++ b/master/master.c	Wed Jul 29 09:19:53 2009 +0000
@@ -168,8 +168,10 @@
     init_MUTEX(&master->io_sem);
     master->send_cb = NULL;
     master->receive_cb = NULL;
+    master->cb_data = NULL;
     master->app_send_cb = NULL;
     master->app_receive_cb = NULL;
+    master->app_cb_data = NULL;
 
     INIT_LIST_HEAD(&master->sii_requests);
     init_waitqueue_head(&master->sii_queue);
@@ -382,9 +384,10 @@
 /** Internal sending callback.
  */
 void ec_master_internal_send_cb(
-        ec_master_t *master /**< EtherCAT master. */
-        )
-{
+        void *cb_data /**< Callback data. */
+        )
+{
+    ec_master_t *master = (ec_master_t *) cb_data;
     down(&master->io_sem);
     ecrt_master_send_ext(master);
     up(&master->io_sem);
@@ -395,9 +398,10 @@
 /** Internal receiving callback.
  */
 void ec_master_internal_receive_cb(
-        ec_master_t *master /**< EtherCAT master. */
-        )
-{
+        void *cb_data /**< Callback data. */
+        )
+{
+    ec_master_t *master = (ec_master_t *) cb_data;
     down(&master->io_sem);
     ecrt_master_receive(master);
     up(&master->io_sem);
@@ -473,6 +477,7 @@
 
     master->send_cb = ec_master_internal_send_cb;
     master->receive_cb = ec_master_internal_receive_cb;
+    master->cb_data = master;
 
     master->phase = EC_IDLE;
     ret = ec_master_thread_start(master, ec_master_idle_thread,
@@ -574,6 +579,7 @@
     master->phase = EC_OPERATION;
     master->app_send_cb = NULL;
     master->app_receive_cb = NULL;
+    master->app_cb_data = NULL;
     return ret;
     
 out_allow:
@@ -606,6 +612,7 @@
     
     master->send_cb = ec_master_internal_send_cb;
     master->receive_cb = ec_master_internal_receive_cb;
+    master->cb_data = master;
     
     down(&master->master_sem);
     ec_master_clear_domains(master);
@@ -1130,7 +1137,7 @@
             goto schedule;
 
         // receive datagrams
-        master->receive_cb(master);
+        master->receive_cb(master->cb_data);
 
         // actual EoE processing
         sth_to_send = 0;
@@ -1150,7 +1157,7 @@
             }
             // (try to) send datagrams
             down(&master->ext_queue_sem);
-            master->send_cb(master);
+            master->send_cb(master->cb_data);
             up(&master->ext_queue_sem);
         }
 
@@ -1659,6 +1666,7 @@
 
     master->send_cb = master->app_send_cb;
     master->receive_cb = master->app_receive_cb;
+    master->cb_data = master->app_cb_data;
     
     ret = ec_master_thread_start(master, ec_master_operation_thread,
                 "EtherCAT-OP");
@@ -1836,15 +1844,16 @@
 /*****************************************************************************/
 
 void ecrt_master_callbacks(ec_master_t *master,
-        void (*send_cb)(ec_master_t *), void (*receive_cb)(ec_master_t *))
+        void (*send_cb)(void *), void (*receive_cb)(void *), void *cb_data)
 {
     if (master->debug_level)
         EC_DBG("ecrt_master_callbacks(master = 0x%x, send_cb = 0x%x, "
-                " receive_cb = 0x%x)\n", (u32) master, (u32) send_cb,
-                (u32) receive_cb);
+                " receive_cb = 0x%x, cb_data = 0x%x)\n", (u32) master,
+                (u32) send_cb, (u32) receive_cb, (u32) cb_data);
 
     master->app_send_cb = send_cb;
     master->app_receive_cb = receive_cb;
+    master->app_cb_data = cb_data;
 }
 
 /*****************************************************************************/