Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752640AbdFLSC2 (ORCPT ); Mon, 12 Jun 2017 14:02:28 -0400 Received: from mail-wr0-f194.google.com ([209.85.128.194]:35172 "EHLO mail-wr0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752054AbdFLSC0 (ORCPT ); Mon, 12 Jun 2017 14:02:26 -0400 From: Tal Shorer To: linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org, gregkh@linuxfoundation.org, balbi@kernel.org, corbet@lwn.net Cc: Tal Shorer Subject: Re: [PATCH 6/8] usb: gadget: f_acm: add an ioctl to get the current line coding Date: Mon, 12 Jun 2017 21:02:14 +0300 Message-Id: <1497290534-7533-1-git-send-email-tal.shorer@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1497288375-3559-7-git-send-email-tal.shorer@gmail.com> References: <1497288375-3559-7-git-send-email-tal.shorer@gmail.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4493 Lines: 128 On Mon, Jun 12, 2017 at 8:26 PM, Tal Shorer wrote: > 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 > --- > @@ -764,10 +783,10 @@ static struct usb_function *acm_alloc_func(struct usb_function_instance *fi) > acm->port.func.free_func = acm_free_func; > > /* initialize port_line_coding with something that makes sense */ > - coding.dwDTERate = cpu_to_le32(9600); > - coding.bCharFormat = USB_CDC_1_STOP_BITS; > - coding.bParityType = USB_CDC_NO_PARITY; > - coding.bDataBits = 8; > + acm->port_line_coding.dwDTERate = cpu_to_le32(9600); > + acm->port_line_coding.bCharFormat = USB_CDC_1_STOP_BITS; > + acm->port_line_coding.bParityType = USB_CDC_NO_PARITY; > + acm->port_line_coding.bDataBits = 8; > > return &acm->port.func; > } This hunk was messed up somehow and will not apply. I can resend a v2 if necessary, but the correct patch is as follows: From: Tal Shorer Subject: [PATCH 6/8] usb: gadget: f_acm: add an ioctl to get the current line coding 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 --- Documentation/ioctl/ioctl-number.txt | 1 + drivers/usb/gadget/function/f_acm.c | 27 +++++++++++++++++++++++---- include/uapi/linux/usb/f_acm.h | 12 ++++++++++++ 3 files changed, 36 insertions(+), 4 deletions(-) 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: +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 b7a1466..5feea7c 100644 --- a/drivers/usb/gadget/function/f_acm.c +++ b/drivers/usb/gadget/function/f_acm.c @@ -19,6 +19,7 @@ #include #include #include +#include #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; @@ -763,6 +763,12 @@ static struct usb_function *acm_alloc_func(struct usb_function_instance *fi) acm->port.func.unbind = acm_unbind; acm->port.func.free_func = acm_free_func; + /* initialize port_line_coding with something that makes sense */ + coding.dwDTERate = cpu_to_le32(9600); + coding.bCharFormat = USB_CDC_1_STOP_BITS; + coding.bParityType = USB_CDC_NO_PARITY; + coding.bDataBits = 8; + return &acm->port.func; } 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 +#include + +/* 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