From patchwork Tue Jul 3 18:23:32 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jerry Zhang X-Patchwork-Id: 10504941 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 7FFF6601D3 for ; Tue, 3 Jul 2018 18:23:51 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 700AF1FF7F for ; Tue, 3 Jul 2018 18:23:51 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 6493A205F8; Tue, 3 Jul 2018 18:23:51 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.8 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 032C11FF7F for ; Tue, 3 Jul 2018 18:23:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934512AbeGCSXr (ORCPT ); Tue, 3 Jul 2018 14:23:47 -0400 Received: from mail-pl0-f68.google.com ([209.85.160.68]:33094 "EHLO mail-pl0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934491AbeGCSXp (ORCPT ); Tue, 3 Jul 2018 14:23:45 -0400 Received: by mail-pl0-f68.google.com with SMTP id 6-v6so1426172plb.0 for ; Tue, 03 Jul 2018 11:23:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=KGAdQzUo7B3pSyl8+RKCu46oOmcEwvCG8jojWXs8h0c=; b=Uzq4D9Jx6Sl+hqUBwQT5ilBSZXil0VW0/sHbbOLimM7N62Ms/vZGzOZe7wmBvl4PiY MW8m9HXd1EhSTrQgF6Ea5Fn9MBmzKk4Gl6Y2PB/9SwTqDcoQfSq4BfKmtKY73q/5Aluj 9Z0V6SKDBM78IsdYoUnoyrBkRhaYNUhx1WGKD5KB47GiXLuUAXW9hepUEpzg4F/PjGR1 K5ydfjaiHMMW4OhSNqqQB3BWqk/QM3itxozfQdAXTFzIg7RzwYgr9uFSW1cByfBRvXY6 iOZ7XvuaaENWakg8xsm5Jh+A0qzkNPHtJjRcD9sow4b5vrUTRUBpm1v5aPYQVpj7Lk9d S96g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=KGAdQzUo7B3pSyl8+RKCu46oOmcEwvCG8jojWXs8h0c=; b=RWqirmF4XYmxTLckIVBQL570OH85fTKA4V3SuaiZje8NMUCQTUOHN05mSKXirLfi14 LqJQdc3bYYkkYJ3e3IbOTee/Tlik+2lj2ogp4v/GTyDF3TsOO7QV/51T2bjPpeRxvejw RsEuwuMZaGsa96i3Zo0fRrpNxab/R9+FRn+R3H0+TcbXUsoVr957Dq+Vi2UvDuR/2e3F yJXRZXYNHNBBUgZU6LQQTV475SvNrheNd1IuiiS7meFwnh26qvAuZJH5WscY2kbM9xMZ LXDdZsZExb8njUftkcZmJb0Nf9uXIMMIfOi9udFbbygVawcFwDUIO1Kg5UyUrjXTRtPw 22AQ== X-Gm-Message-State: APt69E2gTkF9iJHclQj0rPClg3xzCWdHXO9NMlkZzew5JBqTdzXif7zm wTsasACrthA+9T4I1z86jdpPkCiOQ1o= X-Google-Smtp-Source: ADUXVKIhs/Pe41s/i0auq195C/pJfkdf8B/XyQkr803eez1e8oijy9XJkrSInUkVqFV7xW2cPQLYUQ== X-Received: by 2002:a17:902:bf43:: with SMTP id u3-v6mr31137301pls.322.1530642224933; Tue, 03 Jul 2018 11:23:44 -0700 (PDT) Received: from zhangjerry.mtv.corp.google.com ([2620:0:1000:1611:ee20:2649:babf:1d14]) by smtp.gmail.com with ESMTPSA id j21-v6sm3052992pfn.121.2018.07.03.11.23.44 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 Jul 2018 11:23:44 -0700 (PDT) From: Jerry Zhang To: Felipe Balbi , Greg Kroah-Hartman Cc: linux-usb@vger.kernel.org, zhangjerry@google.com, jerryxzha@gmail.com, android-kernel-team@google.com Subject: [PATCH 2/3] usb: gadget: f_fs: Add FUNCTIONFS_CONTROL_ONLY flag Date: Tue, 3 Jul 2018 11:23:32 -0700 Message-Id: <20180703182333.47964-2-zhangjerry@google.com> X-Mailer: git-send-email 2.18.0.399.gad0ab374a1-goog In-Reply-To: <20180703182333.47964-1-zhangjerry@google.com> References: <20180703182333.47964-1-zhangjerry@google.com> Sender: linux-usb-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-usb@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This flag allows users to directly specify when they want a ffs instance to be used for handling control requests only via the configfs control_config/ group. When the flag is set, user must set *none* of the speed descriptor flags and provide no speeds in the descriptor. This ensures that it cannot be mixed up with a normal function. Signed-off-by: Jerry Zhang --- drivers/usb/gadget/function/f_fs.c | 22 +++++++++++----------- include/uapi/linux/usb/functionfs.h | 1 + 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c index a6868f936c78..ddec3606c0e1 100644 --- a/drivers/usb/gadget/function/f_fs.c +++ b/drivers/usb/gadget/function/f_fs.c @@ -339,11 +339,6 @@ static ssize_t ffs_ep0_write(struct file *file, const char __user *buf, case FFS_READ_DESCRIPTORS: case FFS_READ_STRINGS: /* Copy data */ - if (unlikely(len < 16)) { - ret = -EINVAL; - break; - } - data = ffs_prepare_buffer(buf, len); if (IS_ERR(data)) { ret = PTR_ERR(data); @@ -2393,10 +2388,19 @@ static int __ffs_data_got_descs(struct ffs_data *ffs, FUNCTIONFS_VIRTUAL_ADDR | FUNCTIONFS_EVENTFD | FUNCTIONFS_ALL_CTRL_RECIP | - FUNCTIONFS_CONFIG0_SETUP)) { + FUNCTIONFS_CONFIG0_SETUP | + FUNCTIONFS_CONTROL_ONLY)) { ret = -ENOSYS; goto error; } + if ((bool) (flags & (FUNCTIONFS_HAS_FS_DESC | + FUNCTIONFS_HAS_HS_DESC | + FUNCTIONFS_HAS_SS_DESC)) == + (bool) (flags & FUNCTIONFS_CONTROL_ONLY)) { + pr_err("Must have at least one speed descriptor " + "or CONTROL_ONLY (but not both)\n"); + goto error; + } data += 12; len -= 12; break; @@ -2476,7 +2480,7 @@ static int __ffs_data_got_descs(struct ffs_data *ffs, len -= ret; } - if (raw_descs == data || len) { + if (len) { ret = -EINVAL; goto error; } @@ -3030,10 +3034,6 @@ static int _ffs_func_bind(struct usb_configuration *c, ENTER(); - /* Has descriptors only for speeds gadget does not support */ - if (unlikely(!(full | high | super))) - return -ENOTSUPP; - /* Allocate a single chunk, less management later on */ vlabuf = kzalloc(vla_group_size(d), GFP_KERNEL); if (unlikely(!vlabuf)) diff --git a/include/uapi/linux/usb/functionfs.h b/include/uapi/linux/usb/functionfs.h index d77ee6b65328..25e55f485a6e 100644 --- a/include/uapi/linux/usb/functionfs.h +++ b/include/uapi/linux/usb/functionfs.h @@ -24,6 +24,7 @@ enum functionfs_flags { FUNCTIONFS_EVENTFD = 32, FUNCTIONFS_ALL_CTRL_RECIP = 64, FUNCTIONFS_CONFIG0_SETUP = 128, + FUNCTIONFS_CONTROL_ONLY = 256, }; /* Descriptor of an non-audio endpoint */