lkml.org 
[lkml]   [2021]   [Nov]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 11/19] mxser: extract TX empty check from mxser_wait_until_sent()
    Date
    And move it to new mxser_tx_empty(), because:
    1) it simplifies the code (esp. the locking), and
    2) serial_core needs such a hook anyway, so have it ready.

    Signed-off-by: Jiri Slaby <jslaby@suse.cz>
    ---
    drivers/tty/mxser.c | 20 +++++++++++++-------
    1 file changed, 13 insertions(+), 7 deletions(-)

    diff --git a/drivers/tty/mxser.c b/drivers/tty/mxser.c
    index 6ab8899ada9c..fb26670b5a0b 100644
    --- a/drivers/tty/mxser.c
    +++ b/drivers/tty/mxser.c
    @@ -1402,6 +1402,18 @@ static void mxser_set_termios(struct tty_struct *tty, struct ktermios *old_termi
    }
    }

    +static bool mxser_tx_empty(struct mxser_port *info)
    +{
    + unsigned long flags;
    + u8 lsr;
    +
    + spin_lock_irqsave(&info->slock, flags);
    + lsr = inb(info->ioaddr + UART_LSR);
    + spin_unlock_irqrestore(&info->slock, flags);
    +
    + return !(lsr & UART_LSR_TEMT);
    +}
    +
    /*
    * mxser_wait_until_sent() --- wait until the transmitter is empty
    */
    @@ -1409,8 +1421,6 @@ static void mxser_wait_until_sent(struct tty_struct *tty, int timeout)
    {
    struct mxser_port *info = tty->driver_data;
    unsigned long orig_jiffies, char_time;
    - unsigned long flags;
    - int lsr;

    if (info->type == PORT_UNKNOWN)
    return;
    @@ -1445,17 +1455,13 @@ static void mxser_wait_until_sent(struct tty_struct *tty, int timeout)
    if (!timeout || timeout > 2 * info->timeout)
    timeout = 2 * info->timeout;

    - spin_lock_irqsave(&info->slock, flags);
    - while (!((lsr = inb(info->ioaddr + UART_LSR)) & UART_LSR_TEMT)) {
    - spin_unlock_irqrestore(&info->slock, flags);
    + while (mxser_tx_empty(info)) {
    schedule_timeout_interruptible(char_time);
    - spin_lock_irqsave(&info->slock, flags);
    if (signal_pending(current))
    break;
    if (timeout && time_after(jiffies, orig_jiffies + timeout))
    break;
    }
    - spin_unlock_irqrestore(&info->slock, flags);
    set_current_state(TASK_RUNNING);
    }

    --
    2.33.1
    \
     
     \ /
      Last update: 2021-11-18 08:32    [W:4.550 / U:0.356 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site