usb: gadget: f_acm: add support for USB_CDC_REQ_SEND_BREAK
authorMichael Grzeschik <m.grzeschik@pengutronix.de>
Wed, 6 Apr 2022 19:29:14 +0000 (21:29 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 21 Apr 2022 17:20:25 +0000 (19:20 +0200)
Currently the usb side setting of the USB_CDC_REQ_SEND_BREAK control
is not supported. This patch adds the support.

Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
Link: https://lore.kernel.org/r/20220406192914.3302636-1-m.grzeschik@pengutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/gadget/function/f_acm.c

index 349945e..411eb48 100644 (file)
@@ -333,6 +333,8 @@ static void acm_complete_set_line_coding(struct usb_ep *ep,
        }
 }
 
+static int acm_send_break(struct gserial *port, int duration);
+
 static int acm_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl)
 {
        struct f_acm            *acm = func_to_acm(f);
@@ -391,6 +393,14 @@ static int acm_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl)
                acm->port_handshake_bits = w_value;
                break;
 
+       case ((USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8)
+                       | USB_CDC_REQ_SEND_BREAK:
+               if (w_index != acm->ctrl_id)
+                       goto invalid;
+
+               acm_send_break(&acm->port, w_value);
+               break;
+
        default:
 invalid:
                dev_vdbg(&cdev->gadget->dev,