lkml.org 
[lkml]   [2020]   [Jun]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 4.4 37/60] tty: n_gsm: Fix waking up upper tty layer when room available
    Date
    From: Gregory CLEMENT <gregory.clement@bootlin.com>

    [ Upstream commit 01dbb362f0a114fbce19c8abe4cd6f4710e934d5 ]

    Warn the upper layer when n_gms is ready to receive data
    again. Without this the associated virtual tty remains blocked
    indefinitely.

    Fixes: e1eaea46bb40 ("tty: n_gsm line discipline")
    Signed-off-by: Gregory CLEMENT <gregory.clement@bootlin.com>
    Link: https://lore.kernel.org/r/20200512115323.1447922-4-gregory.clement@bootlin.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/tty/n_gsm.c | 26 ++++++++++++++++++++++----
    1 file changed, 22 insertions(+), 4 deletions(-)

    diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c
    index 08aaf993221e..0020de4fe66f 100644
    --- a/drivers/tty/n_gsm.c
    +++ b/drivers/tty/n_gsm.c
    @@ -681,7 +681,7 @@ static struct gsm_msg *gsm_data_alloc(struct gsm_mux *gsm, u8 addr, int len,
    * FIXME: lock against link layer control transmissions
    */

    -static void gsm_data_kick(struct gsm_mux *gsm)
    +static void gsm_data_kick(struct gsm_mux *gsm, struct gsm_dlci *dlci)
    {
    struct gsm_msg *msg, *nmsg;
    int len;
    @@ -713,6 +713,24 @@ static void gsm_data_kick(struct gsm_mux *gsm)

    list_del(&msg->list);
    kfree(msg);
    +
    + if (dlci) {
    + tty_port_tty_wakeup(&dlci->port);
    + } else {
    + int i = 0;
    +
    + for (i = 0; i < NUM_DLCI; i++) {
    + struct gsm_dlci *dlci;
    +
    + dlci = gsm->dlci[i];
    + if (dlci == NULL) {
    + i++;
    + continue;
    + }
    +
    + tty_port_tty_wakeup(&dlci->port);
    + }
    + }
    }
    }

    @@ -764,7 +782,7 @@ static void __gsm_data_queue(struct gsm_dlci *dlci, struct gsm_msg *msg)
    /* Add to the actual output queue */
    list_add_tail(&msg->list, &gsm->tx_list);
    gsm->tx_bytes += msg->len;
    - gsm_data_kick(gsm);
    + gsm_data_kick(gsm, dlci);
    }

    /**
    @@ -1225,7 +1243,7 @@ static void gsm_control_message(struct gsm_mux *gsm, unsigned int command,
    gsm_control_reply(gsm, CMD_FCON, NULL, 0);
    /* Kick the link in case it is idling */
    spin_lock_irqsave(&gsm->tx_lock, flags);
    - gsm_data_kick(gsm);
    + gsm_data_kick(gsm, NULL);
    spin_unlock_irqrestore(&gsm->tx_lock, flags);
    break;
    case CMD_FCOFF:
    @@ -2423,7 +2441,7 @@ static void gsmld_write_wakeup(struct tty_struct *tty)
    /* Queue poll */
    clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
    spin_lock_irqsave(&gsm->tx_lock, flags);
    - gsm_data_kick(gsm);
    + gsm_data_kick(gsm, NULL);
    if (gsm->tx_bytes < TX_THRESH_LO) {
    gsm_dlci_data_sweep(gsm);
    }
    --
    2.25.1
    \
     
     \ /
      Last update: 2020-06-18 03:37    [W:2.887 / U:0.000 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site