From: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
To: Johan Hovold <johan@kernel.org>
Cc: Corentin Labbe <clabbe@baylibre.com>,
gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org,
linux-usb@vger.kernel.org, david@ixit.cz
Subject: Re: [PATCH v8 1/2] usb: serial: add support for CH348
Date: Tue, 15 Jul 2025 23:20:33 +0200 [thread overview]
Message-ID: <CAFBinCAUNNfOp4qvn2p8AETossePv2aL7jBkFxVZV_XzzULgVg@mail.gmail.com> (raw)
In-Reply-To: <aCHHfY2FkVW2j0ML@hovoldconsulting.com>
Hi Johan,
I'm excluding comments that are clear to me in this reply.
On Mon, May 12, 2025 at 12:03 PM Johan Hovold <johan@kernel.org> wrote:
[...]
> > + if (ret) {
> > + dev_err(&port->serial->dev->dev,
> > + "Failed to configure UART_MCR, err=%d\n", ret);
> > + return ret;
> > + }
>
> The read urbs should be submitted at first open and stopped at last
> close to avoid wasting resources when no one is using the device.
>
> I know we have a few drivers that do not do this currently, but it
> shouldn't be that hard to get this right from the start.
If you're aware of an easy approach or you can recommend an existing
driver that implements the desired behavior then please let me know.
The speciality about ch348 is that all ports share the RX/TX URBs.
My current idea is to implement this using a ref count (for the number
of open ports) and mutex for locking.
[...]
> > + /*
> > + * Writing larger buffers can take longer than the
> > + * hardware allows before discarding the write buffer.
> > + * Limit the transfer size in such cases.
> > + * These values have been found by empirical testing.
> > + */
> > + max_bytes = 128;
>
> This is a potential buffer overflow if a (malicious) device has
> endpoints smaller than this (use min()).
For endpoints smaller than CH348_TX_HDRSIZE we'll also be in trouble.
Validating against CH348_TX_HDRSIZE size here doesn't make much sense
to me (as we'd never be able to progress). I think I should validate
it in ch348_attach() instead - what do you think?
> > + else
> > + /*
> > + * Only ingest as many bytes as we can transfer with
> > + * one URB at a time keeping the TX header in mind.
> > + */
> > + max_bytes = hw_tx_port->bulk_out_size - CH348_TX_HDRSIZE;
> > +
> > + count = kfifo_out_locked(&port->write_fifo, rxt->data,
> > + max_bytes, &port->lock);
> > + if (count)
> > + break;
> > + }
>
> With this implementation writing data continuously to one port will
> starve the others.
>
> The vendor implementation appears to write to more than one port in
> parallel and track THRE per port which would avoid the starvation issue
> and should also be much more efficient.
>
> Just track THRE per port and only submit the write urb when it the
> transmitter is empty or when it becomes empty.
I'm trying as you suggest:
- submit the URB synchronously for port N
- submit the URB synchronously for port N + 1
- ...
This seems to work (using usb_bulk_msg). What doesn't work is
submitting URBs in parallel (this is what the vendor driver prevents
as well).
[...]
> > + if (!wait_for_completion_timeout(&ch348->txbuf_completion,
> > + msecs_to_jiffies(CH348_CMD_TIMEOUT)))
> > + dev_err_console(port,
> > + "Failed to wait for TX buffer to be fully written out\n");
>
> This would also avoid blocking for extended periods of time on the
> system work queue.
I'm moving this to a timer instead.
If you have any comments on the (new) TX logic then please let me know.
[...]
> You should implement dtr_rts() as well.
This will be the first time we need the "package type" information as
CH348Q only supports CTS/RTS on the first four ports, for the last
four the signals aren't routed outside the package.
I need to see if I have other hardware with CTS/RTS pins to test this.
If not: can we omit hardware flow control in the first upstream
version?
Best regards,
Martin
next prev parent reply other threads:[~2025-07-15 21:20 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-04 13:58 [PATCH v8 0/2] usb: serial: add support for CH348 Corentin Labbe
2025-02-04 13:58 ` [PATCH v8 1/2] " Corentin Labbe
2025-03-20 12:56 ` David Heidelberg
2025-05-12 10:03 ` Johan Hovold
2025-07-15 21:20 ` Martin Blumenstingl [this message]
2025-07-16 7:44 ` Greg KH
2025-07-16 8:28 ` Martin Blumenstingl
2025-07-16 8:57 ` Greg KH
2025-07-16 9:31 ` Martin Blumenstingl
2025-07-16 10:00 ` Greg KH
2025-07-16 11:24 ` Martin Blumenstingl
2025-07-25 10:14 ` Johan Hovold
2025-07-25 10:07 ` Johan Hovold
2025-07-26 14:54 ` Martin Blumenstingl
2025-07-29 9:43 ` Johan Hovold
2025-07-29 20:45 ` Martin Blumenstingl
2025-08-04 12:32 ` Johan Hovold
2025-08-04 21:35 ` Martin Blumenstingl
2025-08-27 10:07 ` Johan Hovold
2025-02-04 13:58 ` [PATCH v8 2/2] usb: serial: add Martin and myself as maintainers of CH348 Corentin Labbe
2025-03-30 1:24 ` [PATCH v8 1/2] usb: serial: add support for CH348 Nicolas Frattaroli
2025-03-30 22:11 ` David Heidelberg
[not found] ` <CA+j61XMwrtRJhGiJu_T5tt3g14fseOqvOJZLbb2bQGduSJsmxQ@mail.gmail.com>
2025-05-04 21:26 ` [PATCH v8 0/2] " Martin Blumenstingl
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CAFBinCAUNNfOp4qvn2p8AETossePv2aL7jBkFxVZV_XzzULgVg@mail.gmail.com \
--to=martin.blumenstingl@googlemail.com \
--cc=clabbe@baylibre.com \
--cc=david@ixit.cz \
--cc=gregkh@linuxfoundation.org \
--cc=johan@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).