Re: [PATCH v2 0/3] USB: serial: return errors from break handling

Corey Minyard
2023-06-06T12:48:15Z

On Tue, Jun 06, 2023 at 01:39:03PM +0200, Johan Hovold wrote:
> On Tue, Jun 06, 2023 at 01:18:19PM +0200, Oliver Neukum wrote:
> > On 04.06.23 14:35, Johan Hovold wrote:
> > > This series starts returning errors from break handling and also uses
> > > that mechanism to report to user space when break signalling is not
> > > supported (e.g. when device or driver support is missing).
>
> > do you eventually want this to be done for all serial devices?
> > That is does cdc-acm need something like this patch?
>
> Looks good to me. If this turns out to confuse userspace we may have to
> turn that -ENOTTY into 0 in the tty layer, but we can still use it to
> avoid the unnecessary wait to "disable" the break state.
>
> > From 16430d9f109f904b2bfbac6e43a939209b6c4bc7 Mon Sep 17 00:00:00 2001
> > From: Oliver Neukum <oneukum@suse.com>
> > Date: Tue, 6 Jun 2023 12:57:00 +0200
> > Subject: [PATCH] usb: cdc-acm: return correct error code on unsupported break
> >
> > Return -ENOTTY if the device says that it doesn't support break
> > so that the upper layers get error reporting right.

Yeah, when I asked for this, I didn't realize that no devices did this,
I thought it was a one-off with this device. There is a distinct
possibility that this will break userland. This sounds like a good
plan.

-corey

> >
> > Signed-off-by: Oliver Neukum <oneukum@suse.com>
>
> Acked-by: Johan Hovold <johan@kernel.org>
>
> > ---
> > drivers/usb/class/cdc-acm.c | 3 +++
> > 1 file changed, 3 insertions(+)
> >
> > diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
> > index 11da5fb284d0..7751f5728716 100644
> > --- a/drivers/usb/class/cdc-acm.c
> > +++ b/drivers/usb/class/cdc-acm.c
> > @@ -892,6 +892,9 @@ static int acm_tty_break_ctl(struct tty_struct *tty, int state)
> > struct acm *acm = tty->driver_data;
> > int retval;
> >
> > + if (!(acm->ctrl_caps & USB_CDC_CAP_BRK))
> > + return -ENOTTY;
> > +
> > retval = acm_send_break(acm, state ? 0xffff : 0);
> > if (retval < 0)
> > dev_dbg(&acm->control->dev,