lkml.org 
[lkml]   [2012]   [Feb]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH] tty: the briq panel isn't a tty, make it use its own locking
    Date
    From: Alan Cox <alan@linux.intel.com>

    The driver appears to be terminall broken, if nobody is maintaining it then
    perhaps it should go into staging and the out-tray.

    (Fixed bug noted by Jiri)

    Signed-off-by: Alan Cox <alan@linux.intel.com>
    ---

    drivers/char/briq_panel.c | 26 +++++++-------------------
    1 files changed, 7 insertions(+), 19 deletions(-)


    diff --git a/drivers/char/briq_panel.c b/drivers/char/briq_panel.c
    index 095ab90..3335d07 100644
    --- a/drivers/char/briq_panel.c
    +++ b/drivers/char/briq_panel.c
    @@ -20,6 +20,7 @@
    #include <linux/mm.h>
    #include <linux/init.h>

    +#include <asm/bitops.h>
    #include <asm/uaccess.h>
    #include <asm/io.h>
    #include <asm/prom.h>
    @@ -30,7 +31,7 @@
    #define BRIQ_PANEL_VER "1.1 (04/20/2002)"
    #define BRIQ_PANEL_MSG0 "Loading Linux"

    -static int vfd_is_open;
    +static unsigned long vfd_is_open;
    static unsigned char vfd[40];
    static int vfd_cursor;
    static unsigned char ledpb, led;
    @@ -66,37 +67,27 @@ static void set_led(char state)

    static int briq_panel_open(struct inode *ino, struct file *filep)
    {
    - tty_lock();
    - /* enforce single access, vfd_is_open is protected by BKL */
    - if (vfd_is_open) {
    - tty_unlock();
    + /* enforce single open */
    + if (test_and_set_bit(0, &vfd_is_open))
    return -EBUSY;
    }
    - vfd_is_open = 1;
    -
    - tty_unlock();
    return 0;
    }

    static int briq_panel_release(struct inode *ino, struct file *filep)
    {
    - if (!vfd_is_open)
    - return -ENODEV;
    -
    - vfd_is_open = 0;
    -
    + clear_bit(0, &vfd_is_open);
    return 0;
    }

    +/* Note that single open doesn't mean single threaded read or write so all
    + this code is unsafe */
    static ssize_t briq_panel_read(struct file *file, char __user *buf, size_t count,
    loff_t *ppos)
    {
    unsigned short c;
    unsigned char cp;

    - if (!vfd_is_open)
    - return -ENODEV;
    -
    c = (inb(BRIQ_PANEL_LED_IOPORT) & 0x000c) | (ledpb & 0x0003);
    set_led(' ');
    /* upper button released */
    @@ -137,9 +128,6 @@ static ssize_t briq_panel_write(struct file *file, const char __user *buf, size_
    size_t indx = len;
    int i, esc = 0;

    - if (!vfd_is_open)
    - return -EBUSY;
    -
    for (;;) {
    char c;
    if (!indx)


    \
     
     \ /
      Last update: 2012-02-23 14:27    [W:0.026 / U:0.132 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site