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