From 881e935abcd33e152b7b1aa6fc358f6638cbb1f5 Mon Sep 17 00:00:00 2001
From: Florian Pose <fp@igh-essen.com>
Date: Tue, 19 Sep 2006 14:08:31 +0000
Subject: [PATCH] Allow only one open() on XML device.

---
 master/xmldev.c | 21 +++++++++++++++++++++
 master/xmldev.h |  3 +++
 2 files changed, 24 insertions(+)

diff --git a/master/xmldev.c b/master/xmldev.c
index 58bae23b..17c8ae75 100644
--- a/master/xmldev.c
+++ b/master/xmldev.c
@@ -74,6 +74,7 @@ int ec_xmldev_init(ec_xmldev_t *xmldev, /**< EtherCAT XML device */
                    dev_t dev_num /**< device number */
                    )
 {
+    atomic_set(&xmldev->available, 1);
     cdev_init(&xmldev->cdev, &fops);
     xmldev->cdev.owner = THIS_MODULE;
     if (cdev_add(&xmldev->cdev,
@@ -97,11 +98,29 @@ void ec_xmldev_clear(ec_xmldev_t *xmldev /**< EtherCAT XML device */)
 
 /*****************************************************************************/
 
+int ec_xmldev_request(ec_xmldev_t *xmldev,
+                      uint32_t vendor_id,
+                      uint32_t product_code
+                      )
+{
+    return 1;
+}
+
+/******************************************************************************
+ * file_operations
+ *****************************************************************************/
+
 int ecxmldev_open(struct inode *inode, struct file *filp)
 {
     ec_xmldev_t *xmldev;
 
     xmldev = container_of(inode->i_cdev, ec_xmldev_t, cdev);
+
+    if (!atomic_dec_and_test(&xmldev->available)) {
+        atomic_inc(&xmldev->available);
+        return -EBUSY;
+    }
+
     filp->private_data = xmldev;
 
     EC_DBG("File opened.\n");
@@ -113,6 +132,8 @@ int ecxmldev_open(struct inode *inode, struct file *filp)
 
 int ecxmldev_release(struct inode *inode, struct file *filp)
 {
+    ec_xmldev_t *xmldev = container_of(inode->i_cdev, ec_xmldev_t, cdev);
+    atomic_inc(&xmldev->available);
     EC_DBG("File closed.\n");
     return 0;
 }
diff --git a/master/xmldev.h b/master/xmldev.h
index 9b8ea775..2d70c9c5 100644
--- a/master/xmldev.h
+++ b/master/xmldev.h
@@ -57,6 +57,7 @@ typedef struct
 {
     ec_master_t *master; /**< master owning the device */
     struct cdev cdev; /**< character device */
+    atomic_t available; /**< allow only one open() */
 }
 ec_xmldev_t;
 
@@ -65,6 +66,8 @@ ec_xmldev_t;
 int ec_xmldev_init(ec_xmldev_t *, ec_master_t *, dev_t);
 void ec_xmldev_clear(ec_xmldev_t *);
 
+int ec_xmldev_request(ec_xmldev_t *, uint32_t, uint32_t);
+
 /*****************************************************************************/
 
 #endif
-- 
GitLab