From: Yu-Che Hsieh <[email protected]>

The driver uses a global open count to allow only one userspace client

to open the BT device at a time. This works for a single device, but

also prevents independent BT device instances from being opened

concurrently.

Move the open count into struct bt_bmc so each device instance tracks

its own open state. This preserves the single-open behavior per device

while allowing multiple BT devices to operate independently.

Signed-off-by: Yu-Che Hsieh <[email protected]>
---
 drivers/char/ipmi/bt-bmc.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/drivers/char/ipmi/bt-bmc.c b/drivers/char/ipmi/bt-bmc.c
index f3c67272502f..486ecc0b6815 100644
--- a/drivers/char/ipmi/bt-bmc.c
+++ b/drivers/char/ipmi/bt-bmc.c
@@ -64,10 +64,9 @@ struct bt_bmc {
        wait_queue_head_t       queue;
        struct timer_list       poll_timer;
        struct mutex            mutex;
+       atomic_t                open_count;
 };
 
-static atomic_t open_count = ATOMIC_INIT(0);
-
 static u8 bt_inb(struct bt_bmc *bt_bmc, int reg)
 {
        return readb(bt_bmc->base + reg);
@@ -152,12 +151,12 @@ static int bt_bmc_open(struct inode *inode, struct file 
*file)
 {
        struct bt_bmc *bt_bmc = file_bt_bmc(file);
 
-       if (atomic_inc_return(&open_count) == 1) {
+       if (atomic_inc_return(&bt_bmc->open_count) == 1) {
                clr_b_busy(bt_bmc);
                return 0;
        }
 
-       atomic_dec(&open_count);
+       atomic_dec(&bt_bmc->open_count);
        return -EBUSY;
 }
 
@@ -313,7 +312,7 @@ static int bt_bmc_release(struct inode *inode, struct file 
*file)
 {
        struct bt_bmc *bt_bmc = file_bt_bmc(file);
 
-       atomic_dec(&open_count);
+       atomic_dec(&bt_bmc->open_count);
        set_b_busy(bt_bmc);
        return 0;
 }
@@ -425,6 +424,8 @@ static int bt_bmc_probe(struct platform_device *pdev)
        if (IS_ERR(bt_bmc->base))
                return PTR_ERR(bt_bmc->base);
 
+       atomic_set(&bt_bmc->open_count, 0);
+
        mutex_init(&bt_bmc->mutex);
        init_waitqueue_head(&bt_bmc->queue);
 

-- 
2.34.1




_______________________________________________
Openipmi-developer mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openipmi-developer

Reply via email to