Leonardo Pappagallo wrote:
> Hi Jan
> 
> 
>>In particular, in my program I need to know what is cycle number.
>>
>>Hmm, this is not yet exported, but it would be easy to add. Do you
>>depend on the absolute, global value? Otherwise, maintaining your own
>>counter would, of course, already work.
> 
> 
> 
> I need the absolute, global value, it is included into SOF frame
> 
> 
> 
> Thanks
> 

I just applied the attached patch to SVN. It should also work for your
older release, just try

    patch -p1 -i waitoncycle_ex.patch

in the RTnet root directory. The usage is as follows:

    struct rtmac_waitinfo waitinfo;

    waitinfo.type = RTMAC_WAIT_ON_DEFAULT;
    rt_dev_ioctl(tdma_device, RTMAC_RTIOC_WAITONCYCLE_EX, &waitinfo);

    cycle_number = waitinfo.cycle_no;

I haven't tested it yet, so I depend on YOU to let me know if it works.

Jan
Index: stack/include/rtmac.h
===================================================================
--- stack/include/rtmac.h	(Revision 939)
+++ stack/include/rtmac.h	(Arbeitskopie)
@@ -3,7 +3,7 @@
  *  include/rtmac.h
  *
  *  rtmac - real-time networking media access control subsystem
- *  Copyright (C) 2004 Jan Kiszka <[EMAIL PROTECTED]>
+ *  Copyright (C) 2004, 2005 Jan Kiszka <[EMAIL PROTECTED]>
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -28,21 +28,34 @@
 
 
 /* sub-classes: RTDM_CLASS_RTMAC */
-#define RTDM_SUBCLASS_TDMA      0
-#define RTDM_SUBCLASS_UNMANAGED 1
+#define RTDM_SUBCLASS_TDMA          0
+#define RTDM_SUBCLASS_UNMANAGED     1
 
-#define RTIOC_TYPE_RTMAC        RTDM_CLASS_RTMAC
-    
-/* RTmac Discipline IOCTLs */
-#define RTMAC_RTIOC_TIMEOFFSET  _IOR(RTIOC_TYPE_RTMAC, 0x00, __s64)
-#define RTMAC_RTIOC_WAITONCYCLE _IOW(RTIOC_TYPE_RTMAC, 0x01, int)
+#define RTIOC_TYPE_RTMAC            RTDM_CLASS_RTMAC
 
+
 /* Common Cycle Types */
-#define RTMAC_WAIT_ON_DEFAULT   0x00
-#define RTMAC_WAIT_ON_XMIT      0x01
+#define RTMAC_WAIT_ON_DEFAULT       0x00
+#define RTMAC_WAIT_ON_XMIT          0x01
 
 /* TDMA-specific Cycle Types */
-#define TDMA_WAIT_ON_SYNC       0x10
-#define TDMA_WAIT_ON_SOF        TDMA_WAIT_ON_SYNC /* legacy support */
+#define TDMA_WAIT_ON_SYNC           0x10
+#define TDMA_WAIT_ON_SOF            TDMA_WAIT_ON_SYNC /* legacy support */
 
+
+/* RTMAC_RTIOC_WAITONCYCLE_EX control and status data */
+struct rtmac_waitinfo {
+    unsigned int    type;
+    size_t          ext_size;
+    unsigned long   cycle_no;
+    char            ext[0];
+};
+
+
+/* RTmac Discipline IOCTLs */
+#define RTMAC_RTIOC_TIMEOFFSET      _IOR(RTIOC_TYPE_RTMAC, 0x00, __s64)
+#define RTMAC_RTIOC_WAITONCYCLE     _IOW(RTIOC_TYPE_RTMAC, 0x01, unsigned int)
+#define RTMAC_RTIOC_WAITONCYCLE_EX  _IOWR(RTIOC_TYPE_RTMAC, 0x02, \
+                                          struct rtmac_waitinfo)
+
 #endif /* __RTMAC_H_ */
Index: stack/rtmac/tdma/tdma_dev.c
===================================================================
--- stack/rtmac/tdma/tdma_dev.c	(Revision 939)
+++ stack/rtmac/tdma/tdma_dev.c	(Arbeitskopie)
@@ -63,12 +63,28 @@
 }
 
 
+static int wait_on_sync(struct tdma_dev_ctx *tdma_ctx,
+                        rtdm_event_t *sync_event)
+{
+    int ret;
+
+
+    RTDM_EXECUTE_ATOMICALLY(
+        tdma_ctx->cycle_waiter = rtdm_task_current();
+        ret = rtdm_event_wait(sync_event);
+        tdma_ctx->cycle_waiter = NULL;
+    );
+    return ret;
+}
+
+
 static int tdma_dev_ioctl(struct rtdm_dev_context *context,
                           rtdm_user_info_t *user_info, int request, void *arg)
 {
     struct tdma_dev_ctx *ctx = (struct tdma_dev_ctx *)context->dev_private;
     struct tdma_priv    *tdma;
     nanosecs_t          offset;
+    unsigned int        type;
     rtdm_lockctx_t      lock_ctx;
     int                 ret;
 
@@ -99,14 +115,40 @@
                 ((int)arg != TDMA_WAIT_ON_SYNC))
                 return -EINVAL;
 
-            RTDM_EXECUTE_ATOMICALLY(
-                ctx->cycle_waiter = rtdm_task_current();
-                ret = rtdm_event_wait(&tdma->sync_event);
-                ctx->cycle_waiter = NULL;
-            );
+            return wait_on_sync(ctx, &tdma->sync_event);
 
-            return ret;
+        case RTMAC_RTIOC_WAITONCYCLE_EX:
+            if (!rtdm_in_rt_context())
+                return -EACCES;
 
+            if (user_info) {
+                if (!rtdm_rw_user_ok(user_info, arg,
+                                     sizeof(struct rtmac_waitinfo)) ||
+                    rtdm_copy_from_user(user_info, &type, arg,
+                                        sizeof(unsigned int)))
+                    return -EFAULT;
+            } else
+                type = ((struct rtmac_waitinfo *)arg)->type;
+
+            if ((type != RTMAC_WAIT_ON_DEFAULT) &&
+                (type != TDMA_WAIT_ON_SYNC))
+                return -EINVAL;
+
+            ret = wait_on_sync(ctx, &tdma->sync_event);
+            if (ret)
+                return ret;
+
+            if (user_info) {
+                if (rtdm_copy_to_user(user_info, &tdma->current_cycle,
+                        &((struct rtmac_waitinfo *)arg)->cycle_no,
+                        sizeof(unsigned long)))
+                    return -EFAULT;
+            } else
+                ((struct rtmac_waitinfo *)arg)->cycle_no =
+                    tdma->current_cycle;
+
+            return 0;
+
         default:
             return -ENOTTY;
     }

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to