Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp2282854imu; Sun, 16 Dec 2018 22:05:26 -0800 (PST) X-Google-Smtp-Source: AFSGD/UFTA4Nk33pFXtwx9bOnYx39cECc7mowNTKF0gQoIVnYinTjQlgyFRuyVHdzouj1CIjZkA8 X-Received: by 2002:a63:9a52:: with SMTP id e18mr11090573pgo.14.1545026726377; Sun, 16 Dec 2018 22:05:26 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1545026726; cv=none; d=google.com; s=arc-20160816; b=ZIhS1R2XxxDOZJ7Mk9j06c24NFscjVPly/207YAikkqIlVkdWCytucWF8u/RlwHd1P 9e8lNh8M7YBsukFHHHp8ptiqIWeHTuJLVUbql/3j6pJCMEzEbgHPrJ1z1EGnuoEYjYgL OwqImFR7fyw+4WGQ55yf0Spru9rMumpjnfbnAcZfh5DybPl0bAQdhl3plV2hUFsGN7jq elsJtfiYkSwVhfHTdGCA4ibv1CVhFWME7JkCElEtT9g4m6IYwCpW8bNOErbOsekIYJXr fJZ6tyKgFavoWHfIBLsq9SW79w5SmQlU3zXEhm5ZyI5AhI1PPJwb8kHvl1TRL0cp3GyD uX7Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=COAhTOEfKz0eQ5+aFRZsYv1BGssBIKHQblmr9Z5Zu+Q=; b=wjXhjZv2Cp+iffzPaDjH3vCgE//uivR0SdSYGqn2O/Nk420xPqNcyT1SzUuCSU9AN4 NkPfqN5Zct1Gf8spIDiyk67dqjBNsHtia/jwfVzW1tZ07O7NvWF3eo4QwJ9O5ibFfiX0 YQLyf3+qPojhLlcLGNvmc6IIr9XV5d1YMdHo2by/DvGLkRp4L/dItF12bdz/mJ34BwfQ pWRPZLetsa9tWxaIYmRYD2M6NYSz79ZgYVXMHMntW6h4FuZKMyent1v2YIDIpe/N8XRR /JBkQ964pcwNyQVHnqhcz59JACEnuzsQLatNY/O//8+LkdXRZxe+T8TtYmYFEtcffx6b 1WcA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass (test mode) header.i=@ideasonboard.com header.s=mail header.b=QkAoR53j; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id q24si10150403pgi.334.2018.12.16.22.05.11; Sun, 16 Dec 2018 22:05:26 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass (test mode) header.i=@ideasonboard.com header.s=mail header.b=QkAoR53j; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731520AbeLQGC4 (ORCPT + 99 others); Mon, 17 Dec 2018 01:02:56 -0500 Received: from perceval.ideasonboard.com ([213.167.242.64]:53906 "EHLO perceval.ideasonboard.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731478AbeLQGCz (ORCPT ); Mon, 17 Dec 2018 01:02:55 -0500 Received: from localhost.localdomain (unknown [96.44.9.229]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id C6F8AE48; Mon, 17 Dec 2018 07:02:51 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1545026573; bh=4tXR+uF+7/R95wTp2Ni92/O/j0WtRUdj/irsNJBOZac=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=QkAoR53j1S4sHudfBdBklw6RG1GQSxn0wzYZyLbAeW7Plzfw2cWsswigU8PTqmPSO Wo4sowNPbawZVyH9DGDiWjkNfASROPN+c5V2rcITCOFBbfaFixB6vmmwCBtMekZawP qtr7l8W4hxpUAu9dsg1HZJ3E5j61VjOCS8A6Qg30= From: Paul Elder To: laurent.pinchart@ideasonboard.com, kieran.bingham@ideasonboard.com Cc: Paul Elder , b-liu@ti.com, stern@rowland.harvard.edu, rogerq@ti.com, balbi@kernel.org, gregkh@linuxfoundation.org, linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 3/6] usb: gadget: uvc: package setup and data for control OUT requests Date: Mon, 17 Dec 2018 01:02:13 -0500 Message-Id: <20181217060216.26368-4-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20181217060216.26368-1-paul.elder@ideasonboard.com> References: <20181217060216.26368-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Since "usb: gadget: uvc: enqueue uvc_request_data in setup handler for control OUT requests" it is no longer necessary for userspace to call ioctl UVCIOC_SEND_RESPONSE in response to receiving a UVC_EVENT_SETUP from the uvc function driver for a control OUT request. This change means that for control OUT userspace will receive a UVC_EVENT_SETUP and not do anything with it. This is a waste of a pair of context switches, so we put the setup and data stage data into a single UVC_EVENT_DATA to give to userspace. Previously struct uvc_request_data had 60 bytes allocated for data, and since uvc data at most is 34 bytes in UVC 1.1 and 48 bytes in UVC 1.5, we can afford to cut out 8 bytes to store the setup control. Since the setup control is discarded after the handling of the setup stage, it must be saved in struct uvc_device during the setup handler in order for the data stage handler to be able to read it and send it to userspace. Signed-off-by: Paul Elder Reviewed-by: Laurent Pinchart --- No change from v1 drivers/usb/gadget/function/f_uvc.c | 3 +++ drivers/usb/gadget/function/uvc.h | 1 + include/uapi/linux/usb/g_uvc.h | 3 ++- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/usb/gadget/function/f_uvc.c b/drivers/usb/gadget/function/f_uvc.c index 772c99c297fc..d08957124e42 100644 --- a/drivers/usb/gadget/function/f_uvc.c +++ b/drivers/usb/gadget/function/f_uvc.c @@ -215,6 +215,8 @@ uvc_function_ep0_complete(struct usb_ep *ep, struct usb_request *req) v4l2_event.type = UVC_EVENT_DATA; uvc_event->data.length = req->actual; memcpy(&uvc_event->data.data, req->buf, req->actual); + memcpy(&uvc_event->data.setup, &uvc->control_setup, + sizeof(uvc_event->data.setup)); v4l2_event_queue(&uvc->vdev, &v4l2_event); } } @@ -238,6 +240,7 @@ uvc_function_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl) */ uvc->event_setup_out = !(ctrl->bRequestType & USB_DIR_IN); uvc->event_length = le16_to_cpu(ctrl->wLength); + memcpy(&uvc->control_setup, ctrl, sizeof(uvc->control_setup)); if (uvc->event_setup_out) { struct usb_request *req = uvc->control_req; diff --git a/drivers/usb/gadget/function/uvc.h b/drivers/usb/gadget/function/uvc.h index 671020c8a836..1d89b1df4ba0 100644 --- a/drivers/usb/gadget/function/uvc.h +++ b/drivers/usb/gadget/function/uvc.h @@ -163,6 +163,7 @@ struct uvc_device { unsigned int control_intf; struct usb_ep *control_ep; struct usb_request *control_req; + struct usb_ctrlrequest control_setup; void *control_buf; unsigned int streaming_intf; diff --git a/include/uapi/linux/usb/g_uvc.h b/include/uapi/linux/usb/g_uvc.h index 6698c3263ae8..10fbb4382925 100644 --- a/include/uapi/linux/usb/g_uvc.h +++ b/include/uapi/linux/usb/g_uvc.h @@ -24,7 +24,8 @@ struct uvc_request_data { __s32 length; - __u8 data[60]; + struct usb_ctrlrequest setup; + __u8 data[52]; }; struct uvc_event { -- 2.19.2