usb: cdc-acm: return correct error code on unsupported break
authorOliver Neukum <oneukum@suse.com>
Thu, 7 Dec 2023 13:26:30 +0000 (14:26 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 15 Dec 2023 12:52:47 +0000 (13:52 +0100)
In ACM support for sending breaks to devices is optional.
If a device says that it doenot support sending breaks,
the host must respect that.
Given the number of optional features providing tty operations
for each combination is not practical and errors need to be
returned dynamically if unsupported features are requested.

In case a device does not support break, we want the tty layer
to treat that like it treats drivers that statically cannot
support sending a break. It ignores the inability and does nothing.
This patch uses EOPNOTSUPP to indicate that.

Signed-off-by: Oliver Neukum <oneukum@suse.com>
Fixes: 9e98966c7bb94 ("tty: rework break handling")
Link: https://lore.kernel.org/r/20231207132639.18250-1-oneukum@suse.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/tty_io.c
drivers/usb/class/cdc-acm.c

index 06414e43e0b53359348c7906bbb7a6acca8161f0..96617f9af819dc19c95c78a483cedd9806b205da 100644 (file)
@@ -2489,6 +2489,9 @@ static int send_break(struct tty_struct *tty, unsigned int duration)
        if (!retval) {
                msleep_interruptible(duration);
                retval = tty->ops->break_ctl(tty, 0);
+       } else if (retval == -EOPNOTSUPP) {
+               /* some drivers can tell only dynamically */
+               retval = 0;
        }
        tty_write_unlock(tty);
 
index a1f4e1ead97ff4b6457e885a816b24478382ae27..0e7439dba8fe8c727be5e9ed8e9417053fc60b8c 100644 (file)
@@ -916,6 +916,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 -EOPNOTSUPP;
+
        retval = acm_send_break(acm, state ? 0xffff : 0);
        if (retval < 0)
                dev_dbg(&acm->control->dev,