diff options
-rw-r--r-- | drivers/rpmsg/imx_rpmsg_tty.c | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/drivers/rpmsg/imx_rpmsg_tty.c b/drivers/rpmsg/imx_rpmsg_tty.c index 14904c7d517e..47c0dd17fa61 100644 --- a/drivers/rpmsg/imx_rpmsg_tty.c +++ b/drivers/rpmsg/imx_rpmsg_tty.c @@ -39,9 +39,16 @@ static struct rpmsgtty_port rpmsg_tty_port; static void rpmsg_tty_cb(struct rpmsg_channel *rpdev, void *data, int len, void *priv, u32 src) { - int space; - unsigned char *cbuf; + int copied; struct rpmsgtty_port *cport = &rpmsg_tty_port; + struct tty_struct *tty = tty_port_tty_get(&cport->port); + + /* no one left to give data to, so sleep */ + if (tty == NULL) { + dev_dbg(&rpdev->dev, "waiting for readers, discard len %d\n", + len); + return; + } /* flush the recv-ed none-zero data to tty node */ if (len == 0) @@ -49,18 +56,15 @@ static void rpmsg_tty_cb(struct rpmsg_channel *rpdev, void *data, int len, dev_dbg(&rpdev->dev, "msg(<- src 0x%x) len %d\n", src, len); - print_hex_dump(KERN_DEBUG, __func__, DUMP_PREFIX_NONE, 16, 1, - data, len, true); + print_hex_dump_debug(__func__, DUMP_PREFIX_NONE, 16, 1, + data, len, true); spin_lock_bh(&cport->rx_lock); - space = tty_prepare_flip_string(&cport->port, &cbuf, len); - if (space <= 0) { - dev_err(&rpdev->dev, "No memory for tty_prepare_flip_string\n"); - spin_unlock_bh(&cport->rx_lock); - return; + copied = tty_insert_flip_string(&cport->port, data, len); + if (copied != len) { + dev_err_ratelimited(&rpdev->dev, "RX copy to tty layer failed\n"); } - memcpy(cbuf, data, len); tty_flip_buffer_push(&cport->port); spin_unlock_bh(&cport->rx_lock); } |