From 1d6d12675971955ce09be0e91f143b65e91cf1a3 Mon Sep 17 00:00:00 2001
From: Florian Pose <fp@igh-essen.com>
Date: Wed, 29 Jul 2009 09:19:53 +0000
Subject: [PATCH] Re-added callback data pointer, because it is necessary for
 some applications.

---
 examples/dc_rtai/dc_rtai_sample.c | 14 +++++++++-----
 examples/mini/mini.c              | 12 +++++++-----
 examples/rtai/rtai_sample.c       | 14 +++++++++-----
 include/ecrt.h                    |  6 ++++--
 master/cdev.c                     |  2 +-
 master/master.c                   | 23 ++++++++++++++++-------
 master/master.h                   | 14 ++++++++------
 7 files changed, 54 insertions(+), 31 deletions(-)

diff --git a/examples/dc_rtai/dc_rtai_sample.c b/examples/dc_rtai/dc_rtai_sample.c
index 94f4c1ca..5e40a480 100644
--- a/examples/dc_rtai/dc_rtai_sample.c
+++ b/examples/dc_rtai/dc_rtai_sample.c
@@ -238,24 +238,28 @@ void run(long data)
 
 /*****************************************************************************/
 
-void send_callback(ec_master_t *master)
+void send_callback(void *cb_data)
 {
+    ec_master_t *m = (ec_master_t *) cb_data;
+
     // too close to the next real time cycle: deny access...
     if (get_cycles() - t_last_cycle <= t_critical) {
         rt_sem_wait(&master_sem);
-        ecrt_master_send_ext(master);
+        ecrt_master_send_ext(m);
         rt_sem_signal(&master_sem);
     }
 }
 
 /*****************************************************************************/
 
-void receive_callback(ec_master_t *master)
+void receive_callback(void *cb_data)
 {
+    ec_master_t *m = (ec_master_t *) cb_data;
+
     // too close to the next real time cycle: deny access...
     if (get_cycles() - t_last_cycle <= t_critical) {
         rt_sem_wait(&master_sem);
-        ecrt_master_receive(master);
+        ecrt_master_receive(m);
         rt_sem_signal(&master_sem);
     }
 }
@@ -281,7 +285,7 @@ int __init init_mod(void)
         goto out_return;
     }
 
-    ecrt_master_callbacks(master, send_callback, receive_callback);
+    ecrt_master_callbacks(master, send_callback, receive_callback, master);
 
     printk(KERN_INFO PFX "Registering domain...\n");
     if (!(domain1 = ecrt_master_create_domain(master))) {
diff --git a/examples/mini/mini.c b/examples/mini/mini.c
index f5bd27c1..69d96e25 100644
--- a/examples/mini/mini.c
+++ b/examples/mini/mini.c
@@ -354,19 +354,21 @@ void cyclic_task(unsigned long data)
 
 /*****************************************************************************/
 
-void send_callback(ec_master_t *master)
+void send_callback(void *cb_data)
 {
+    ec_master_t *m = (ec_master_t *) cb_data;
     down(&master_sem);
-    ecrt_master_send_ext(master);
+    ecrt_master_send_ext(m);
     up(&master_sem);
 }
 
 /*****************************************************************************/
 
-void receive_callback(ec_master_t *master)
+void receive_callback(void *cb_data)
 {
+    ec_master_t *m = (ec_master_t *) cb_data;
     down(&master_sem);
-    ecrt_master_receive(master);
+    ecrt_master_receive(m);
     up(&master_sem);
 }
 
@@ -392,7 +394,7 @@ int __init init_mini_module(void)
     }
 
     init_MUTEX(&master_sem);
-    ecrt_master_callbacks(master, send_callback, receive_callback);
+    ecrt_master_callbacks(master, send_callback, receive_callback, master);
 
     printk(KERN_INFO PFX "Registering domain...\n");
     if (!(domain1 = ecrt_master_create_domain(master))) {
diff --git a/examples/rtai/rtai_sample.c b/examples/rtai/rtai_sample.c
index 2b804dd9..eb31b78c 100644
--- a/examples/rtai/rtai_sample.c
+++ b/examples/rtai/rtai_sample.c
@@ -243,24 +243,28 @@ void run(long data)
 
 /*****************************************************************************/
 
-void send_callback(ec_master_t *master)
+void send_callback(void *cb_data)
 {
+    ec_master_t *m = (ec_master_t *) cb_data;
+
     // too close to the next real time cycle: deny access...
     if (get_cycles() - t_last_cycle <= t_critical) {
         rt_sem_wait(&master_sem);
-        ecrt_master_send_ext(master);
+        ecrt_master_send_ext(m);
         rt_sem_signal(&master_sem);
     }
 }
 
 /*****************************************************************************/
 
-void receive_callback(ec_master_t *master)
+void receive_callback(void *cb_data)
 {
+    ec_master_t *m = (ec_master_t *) cb_data;
+
     // too close to the next real time cycle: deny access...
     if (get_cycles() - t_last_cycle <= t_critical) {
         rt_sem_wait(&master_sem);
-        ecrt_master_receive(master);
+        ecrt_master_receive(m);
         rt_sem_signal(&master_sem);
     }
 }
@@ -288,7 +292,7 @@ int __init init_mod(void)
         goto out_return;
     }
 
-    ecrt_master_callbacks(master, send_callback, receive_callback);
+    ecrt_master_callbacks(master, send_callback, receive_callback, master);
 
     printk(KERN_INFO PFX "Registering domain...\n");
     if (!(domain1 = ecrt_master_create_domain(master))) {
diff --git a/include/ecrt.h b/include/ecrt.h
index 259d9f44..1c269d9b 100644
--- a/include/ecrt.h
+++ b/include/ecrt.h
@@ -477,8 +477,10 @@ int ecrt_master_reserve(
  */
 void ecrt_master_callbacks(
         ec_master_t *master, /**< EtherCAT master */
-        void (*send_cb)(ec_master_t *), /**< Datagram sending callback. */
-        void (*receive_cb)(ec_master_t *) /**< Receive callback. */
+        void (*send_cb)(void *), /**< Datagram sending callback. */
+        void (*receive_cb)(void *), /**< Receive callback. */
+        void *cb_data /**< Arbitraty pointer passed to the callback functions.
+                       */
         );
 
 #endif /* __KERNEL__ */
diff --git a/master/cdev.c b/master/cdev.c
index 57e7bf33..0acf642d 100644
--- a/master/cdev.c
+++ b/master/cdev.c
@@ -1622,7 +1622,7 @@ int ec_cdev_ioctl_activate(
     }
 
     ecrt_master_callbacks(master, ec_master_internal_send_cb,
-            ec_master_internal_receive_cb);
+            ec_master_internal_receive_cb, master);
 
     ret = ecrt_master_activate(master);
     if (ret < 0)
diff --git a/master/master.c b/master/master.c
index cf7e442f..952c1e16 100644
--- a/master/master.c
+++ b/master/master.c
@@ -168,8 +168,10 @@ int ec_master_init(ec_master_t *master, /**< EtherCAT master */
     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 @@ void ec_master_clear_domains(ec_master_t *master)
 /** 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 @@ void ec_master_internal_send_cb(
 /** 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 @@ int ec_master_enter_idle_phase(
 
     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 @@ int ec_master_enter_operation_phase(ec_master_t *master /**< EtherCAT master */)
     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 @@ void ec_master_leave_operation_phase(ec_master_t *master
     
     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 @@ static int ec_master_eoe_thread(void *priv_data)
             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 @@ static int ec_master_eoe_thread(void *priv_data)
             }
             // (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 @@ int ecrt_master_activate(ec_master_t *master)
 
     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 @@ ec_slave_config_t *ecrt_master_slave_config(ec_master_t *master,
 /*****************************************************************************/
 
 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;
 }
 
 /*****************************************************************************/
diff --git a/master/master.h b/master/master.h
index f5832d2e..225ccbb0 100644
--- a/master/master.h
+++ b/master/master.h
@@ -166,12 +166,14 @@ struct ec_master {
 
     struct semaphore io_sem; /**< Semaphore used in \a IDLE phase. */
 
-    void (*send_cb)(ec_master_t *); /**< Current send datagrams callback. */
-    void (*receive_cb)(ec_master_t *); /**< Current receive datagrams callback. */
-    void (*app_send_cb)(ec_master_t *); /**< Application's send datagrams
+    void (*send_cb)(void *); /**< Current send datagrams callback. */
+    void (*receive_cb)(void *); /**< Current receive datagrams callback. */
+    void *cb_data; /**< Current callback data. */
+    void (*app_send_cb)(void *); /**< Application's send datagrams
                                           callback. */
-    void (*app_receive_cb)(ec_master_t *); /**< Application's receive datagrams
+    void (*app_receive_cb)(void *); /**< Application's receive datagrams
                                       callback. */
+    void *app_cb_data; /**< Application callback data. */
 
     struct list_head sii_requests; /**< SII write requests. */
     wait_queue_head_t sii_queue; /**< Wait queue for SII
@@ -247,8 +249,8 @@ ec_slave_config_t *ecrt_master_slave_config_err(ec_master_t *, uint16_t,
 
 void ec_master_calc_dc(ec_master_t *);
 
-void ec_master_internal_send_cb(ec_master_t *);
-void ec_master_internal_receive_cb(ec_master_t *);
+void ec_master_internal_send_cb(void *);
+void ec_master_internal_receive_cb(void *);
 
 /*****************************************************************************/
 
-- 
GitLab