Re: [PATCH 2/2] tty: add rpmsg driver
From: Fabien DESSENNE
Date: Fri Apr 05 2019 - 08:50:48 EST
Hi Johan,
On 03/04/2019 10:44 AM, Johan Hovold wrote:
> On Thu, Mar 21, 2019 at 04:47:19PM +0100, Fabien Dessenne wrote:
>> This driver exposes a standard tty interface on top of the rpmsg
>> framework through the "rpmsg-tty-channel" rpmsg service.
>>
>> This driver supports multi-instances, offering a /dev/ttyRPMSGx entry
>> per rpmsg endpoint.
>>
>> Signed-off-by: Arnaud Pouliquen <arnaud.pouliquen@xxxxxx>
>> Signed-off-by: Fabien Dessenne <fabien.dessenne@xxxxxx>
>> ---
>> drivers/tty/Kconfig | 9 ++
>> drivers/tty/Makefile | 1 +
>> drivers/tty/rpmsg_tty.c | 309 ++++++++++++++++++++++++++++++++++++++++++++++++
>> 3 files changed, 319 insertions(+)
>> create mode 100644 drivers/tty/rpmsg_tty.c
>> +static int rpmsg_tty_write(struct tty_struct *tty, const unsigned char *buf,
>> + int total)
>> +{
>> + int count, ret = 0;
>> + const unsigned char *tbuf;
>> + struct rpmsg_tty_port *cport = idr_find(&tty_idr, tty->index);
>> + struct rpmsg_device *rpdev;
>> + int msg_size;
>> +
>> + if (!cport) {
>> + dev_err(tty->dev, "cannot get cport\n");
>> + return -ENODEV;
>> + }
>> +
>> + rpdev = cport->rpdev;
>> +
>> + dev_dbg(&rpdev->dev, "%s: send message from tty->index = %d\n",
>> + __func__, tty->index);
>> +
>> + if (!buf) {
>> + dev_err(&rpdev->dev, "buf shouldn't be null.\n");
>> + return -ENOMEM;
>> + }
>> +
>> + msg_size = rpmsg_get_buf_payload_size(rpdev->ept);
>> + if (msg_size < 0)
>> + return msg_size;
>> +
>> + count = total;
>> + tbuf = buf;
>> + do {
>> + /* send a message to our remote processor */
>> + ret = rpmsg_send(rpdev->ept, (void *)tbuf,
>> + min(count, msg_size));
> Just a drive-by comment; it looks like rpmsg_send() may block, but
> the tty-driver write() callback must never sleep.
OK, I will use rpmsg_trysend() which does not block.
BR,
Fabien
>
>> + if (ret) {
>> + dev_err(&rpdev->dev, "rpmsg_send failed: %d\n", ret);
>> + return ret;
>> + }
>> +
>> + if (count > msg_size) {
>> + count -= msg_size;
>> + tbuf += msg_size;
>> + } else {
>> + count = 0;
>> + }
>> + } while (count > 0);
>> +
>> + return total;
>> +}
> Johan