The user can issue USB_F_GET_LINE_CODING to get the current line coding as set by the host (or the default if unset yet).
Signed-off-by: Tal Shorer <tal.sho...@gmail.com> --- Documentation/ioctl/ioctl-number.txt | 1 + drivers/usb/gadget/function/f_acm.c | 19 +++++++++++++++++++ include/uapi/linux/usb/f_acm.h | 12 ++++++++++++ 3 files changed, 32 insertions(+) create mode 100644 include/uapi/linux/usb/f_acm.h diff --git a/Documentation/ioctl/ioctl-number.txt b/Documentation/ioctl/ioctl-number.txt index 1e9fcb4..3d70680 100644 --- a/Documentation/ioctl/ioctl-number.txt +++ b/Documentation/ioctl/ioctl-number.txt @@ -329,6 +329,7 @@ Code Seq#(hex) Include File Comments 0xCA 80-8F uapi/scsi/cxlflash_ioctl.h 0xCB 00-1F CBM serial IEC bus in development: <mailto:michael.kl...@puffin.lb.shuttle.de> +0xCD 10-1F linux/usb/f_acm.h 0xCD 01 linux/reiserfs_fs.h 0xCF 02 fs/cifs/ioctl.c 0xDB 00-0F drivers/char/mwave/mwavepub.h diff --git a/drivers/usb/gadget/function/f_acm.c b/drivers/usb/gadget/function/f_acm.c index 188d314..5feea7c 100644 --- a/drivers/usb/gadget/function/f_acm.c +++ b/drivers/usb/gadget/function/f_acm.c @@ -19,6 +19,7 @@ #include <linux/module.h> #include <linux/device.h> #include <linux/err.h> +#include <uapi/linux/usb/f_acm.h> #include "u_serial.h" @@ -611,6 +612,23 @@ static int acm_send_break(struct gserial *port, int duration) return acm_notify_serial_state(acm); } +static int acm_ioctl(struct gserial *port, unsigned int cmd, unsigned long arg) +{ + struct f_acm *acm = port_to_acm(port); + int ret = -ENOIOCTLCMD; + + switch (cmd) { + case USB_F_ACM_GET_LINE_CODING: + if (copy_to_user((__user void *)arg, &acm->port_line_coding, + sizeof(acm->port_line_coding))) + ret = -EFAULT; + else + ret = 0; + break; + } + return ret; +} + /*-------------------------------------------------------------------------*/ /* ACM function driver setup/binding */ @@ -749,6 +767,7 @@ static struct usb_function *acm_alloc_func(struct usb_function_instance *fi) acm->port.connect = acm_connect; acm->port.disconnect = acm_disconnect; acm->port.send_break = acm_send_break; + acm->port.ioctl = acm_ioctl; acm->port.func.name = "acm"; acm->port.func.strings = acm_strings; diff --git a/include/uapi/linux/usb/f_acm.h b/include/uapi/linux/usb/f_acm.h new file mode 100644 index 0000000..51f96f0 --- /dev/null +++ b/include/uapi/linux/usb/f_acm.h @@ -0,0 +1,12 @@ +/* f_acm.h -- Header file for USB CDC-ACM gadget function */ + +#ifndef __UAPI_LINUX_USB_F_ACM_H +#define __UAPI_LINUX_USB_F_ACM_H + +#include <linux/usb/cdc.h> +#include <linux/ioctl.h> + +/* The 0xCD code is also used by reiserfs. we use 0x10-0x1F range */ +#define USB_F_ACM_GET_LINE_CODING _IOR(0xCD, 0x10, struct usb_cdc_line_coding) + +#endif /* __UAPI_LINUX_USB_F_ACM_H */ -- 2.7.4 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html