lkml.org 
[lkml]   [2009]   [Dec]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 48/58] tty: moxa: rework the locking a bit
    Date
    From: Alan Cox <alan@linux.intel.com>

    Introduce a lock for moxafunc() to protect the cases where were get collisions
    between two function requests at the same time.

    Signed-off-by: Alan Cox <alan@linux.intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
    ---
    drivers/char/moxa.c | 27 ++++++++++++++++++++++-----
    1 files changed, 22 insertions(+), 5 deletions(-)

    diff --git a/drivers/char/moxa.c b/drivers/char/moxa.c
    index d8bcbed..474d936 100644
    --- a/drivers/char/moxa.c
    +++ b/drivers/char/moxa.c
    @@ -248,9 +248,25 @@ static void moxa_wait_finish(void __iomem *ofsAddr)

    static void moxafunc(void __iomem *ofsAddr, u16 cmd, u16 arg)
    {
    + unsigned long flags;
    + spin_lock_irqsave(&moxafunc_lock, flags);
    writew(arg, ofsAddr + FuncArg);
    writew(cmd, ofsAddr + FuncCode);
    moxa_wait_finish(ofsAddr);
    + spin_unlock_irqrestore(&moxafunc_lock, flags);
    +}
    +
    +static int moxafuncret(void __iomem *ofsAddr, u16 cmd, u16 arg)
    +{
    + unsigned long flags;
    + u16 ret;
    + spin_lock_irqsave(&moxafunc_lock, flags);
    + writew(arg, ofsAddr + FuncArg);
    + writew(cmd, ofsAddr + FuncCode);
    + moxa_wait_finish(ofsAddr);
    + ret = readw(ofsAddr + FuncArg);
    + spin_unlock_irqrestore(&moxafunc_lock, flags);
    + return ret;
    }

    static void moxa_low_water_check(void __iomem *ofsAddr)
    @@ -417,6 +433,7 @@ static const struct tty_port_operations moxa_port_ops = {
    static struct tty_driver *moxaDriver;
    static DEFINE_TIMER(moxaTimer, moxa_poll, 0, 0);
    static DEFINE_SPINLOCK(moxa_lock);
    +static DEFINE_SPINLOCK(moxafunc_lock);

    /*
    * HW init
    @@ -1823,10 +1840,12 @@ static int MoxaPortSetTermio(struct moxa_port *port, struct ktermios *termio,
    baud = MoxaPortSetBaud(port, baud);

    if (termio->c_iflag & (IXON | IXOFF | IXANY)) {
    + spin_lock_irq(&moxafunc_lock);
    writeb(termio->c_cc[VSTART], ofsAddr + FuncArg);
    writeb(termio->c_cc[VSTOP], ofsAddr + FuncArg1);
    writeb(FC_SetXonXoff, ofsAddr + FuncCode);
    moxa_wait_finish(ofsAddr);
    + spin_unlock_irqrestore(&moxafunc_lock);

    }
    return baud;
    @@ -1879,12 +1898,10 @@ static int MoxaPortLineStatus(struct moxa_port *port)
    int val;

    ofsAddr = port->tableAddr;
    - if (MOXA_IS_320(port->board)) {
    - moxafunc(ofsAddr, FC_LineStatus, 0);
    - val = readw(ofsAddr + FuncArg);
    - } else {
    + if (MOXA_IS_320(port->board))
    + val = moxafuncret(ofsAddr, FC_LineStatus, 0);
    + else
    val = readw(ofsAddr + FlagStat) >> 4;
    - }
    val &= 0x0B;
    if (val & 8)
    val |= 4;
    --
    1.6.5.5


    \
     
     \ /
      Last update: 2009-12-12 00:37    [W:0.046 / U:30.044 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site