From patchwork Thu Oct 26 20:01:12 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: andrey.konovalov@linux.dev X-Patchwork-Id: 158673 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:d641:0:b0:403:3b70:6f57 with SMTP id cy1csp136404vqb; Thu, 26 Oct 2023 13:02:08 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFNoKKw7vV4/OjKJFg9uurkr03YhA9ZO9TdI55D+CgG9eEPrGHesrmy/VprVrMVCc/oBZJL X-Received: by 2002:a1f:ab4b:0:b0:495:ec90:997e with SMTP id u72-20020a1fab4b000000b00495ec90997emr1026161vke.7.1698350528056; Thu, 26 Oct 2023 13:02:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1698350528; cv=none; d=google.com; s=arc-20160816; b=Zhw7UxwXcGhzj+7zLFgkpeziStEnKIbc14Phq1ObX4IOFkL+Yy58Fhx/1BymdXv/gT AMpZPe14c+veN5KwCcAJofzsF23Eu2iHv1QSsZBpoQiYxc5ovizrH12cYBLSQZjy1x2C Cmfd774R1gByBN1hJyfjWfdwSVvvhtVXDBQeFlWDxkItaWFbg8+MdFXwS9ozEw92cA1y LPreGwbRaFm2fRsJyLO+RY2frtG5grMhPZ/rFHPhE72B6bYxIrLBpga/5Hhc7OP4Pydi kt3N+LiqRFopYDaQJtSgdnxgDAE/6sd4gkCbTX7xeFgdWduUEPWHIuY/B/oCyasUCZQO ZD+g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=w9sbKYXZtIyf/ohQE3Edg07I3no4RCuR4cZPauSieZc=; fh=swjxqjQ9hhASm8GoxkZi+6BQ9X7UYEMXc0fZW0c9whc=; b=UIwrEBMeybIKp18Xl26ueKVz0Th+qZ56SKHES2Ow9wmc/MmhDXOsxBFLi/MBrN1/Jk YRMKlVd1QXPvs1CSrfITbx5HDoslwvnzQAahJcSDq7Qbg1z+L8YUjVplvm+0s5IpYUfp DvmQIaq2Me2XMFwjLSjCCMWsP9flHknJGp0r1kPzb/Uppu+A5IS1F68fIwGY+v5JIA8R +NbWu8V5CaieJ9DJBb6whcoXcRJuTQAWWPZ4Or+cHTKAAGENwvtKVAdPv0BwWRCH8QwX 1avGVeyPM/fLkuWl3WxECWF9FQuENW4O79m4OzdsAP+ittV+TJGxAMU7uje7gz+FUxMU 3OPQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linux.dev header.s=key1 header.b=Q6YJK2jt; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.35 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linux.dev Received: from groat.vger.email (groat.vger.email. [23.128.96.35]) by mx.google.com with ESMTPS id r185-20020a1fdac2000000b0049d2cea68cbsi529953vkg.271.2023.10.26.13.02.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Oct 2023 13:02:08 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.35 as permitted sender) client-ip=23.128.96.35; Authentication-Results: mx.google.com; dkim=pass header.i=@linux.dev header.s=key1 header.b=Q6YJK2jt; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.35 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linux.dev Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by groat.vger.email (Postfix) with ESMTP id DEE168038D81; Thu, 26 Oct 2023 13:02:04 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at groat.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231889AbjJZUBb (ORCPT + 26 others); Thu, 26 Oct 2023 16:01:31 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39250 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229991AbjJZUB1 (ORCPT ); Thu, 26 Oct 2023 16:01:27 -0400 Received: from out-184.mta0.migadu.com (out-184.mta0.migadu.com [IPv6:2001:41d0:1004:224b::b8]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E5F24B9 for ; Thu, 26 Oct 2023 13:01:24 -0700 (PDT) X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1698350482; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=w9sbKYXZtIyf/ohQE3Edg07I3no4RCuR4cZPauSieZc=; b=Q6YJK2jt8aNtYlz8aXpbXEWd2kqMpPtQi5xuwpIHAqyuf9aFF60iI469yR9sXN+U5jAsl1 Mtp7c9Vc5whZ4u38LKe46DBzYaXVhRTQQCFXcC/gDZVPwZarUGe2TcuOM0l9txxgRMmVIq drqS5ay+gubC+PaR89dnjZTdhkwB61U= From: andrey.konovalov@linux.dev To: Greg Kroah-Hartman Cc: Andrey Konovalov , Alan Stern , Felipe Balbi , linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 1/3] usb: raw-gadget: properly handle interrupted requests Date: Thu, 26 Oct 2023 22:01:12 +0200 Message-Id: <0db45b1d7cc466e3d4d1ab353f61d63c977fbbc5.1698350424.git.andreyknvl@gmail.com> MIME-Version: 1.0 X-Migadu-Flow: FLOW_OUT X-Spam-Status: No, score=-0.8 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on groat.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (groat.vger.email [0.0.0.0]); Thu, 26 Oct 2023 13:02:05 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1780828385608254235 X-GMAIL-MSGID: 1780849603580826719 From: Andrey Konovalov Currently, if a USB request that was queued by Raw Gadget is interrupted (via a signal), wait_for_completion_interruptible returns -ERESTARTSYS. Raw Gadget then attempts to propagate this value to userspace as a return value from its ioctls. However, when -ERESTARTSYS is returned by a syscall handler, the kernel internally restarts the syscall. This doesn't allow userspace applications to interrupt requests queued by Raw Gadget (which is required when the emulated device is asked to switch altsettings). It also violates the implied interface of Raw Gadget that a single ioctl must only queue a single USB request. Instead, make Raw Gadget do what GadgetFS does: check whether the request was interrupted (dequeued with status == -ECONNRESET) and report -EINTR to userspace. Fixes: f2c2e717642c ("usb: gadget: add raw-gadget interface") Signed-off-by: Andrey Konovalov --- drivers/usb/gadget/legacy/raw_gadget.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/drivers/usb/gadget/legacy/raw_gadget.c b/drivers/usb/gadget/legacy/raw_gadget.c index b9ecc55a2ce2..ce9e87f84911 100644 --- a/drivers/usb/gadget/legacy/raw_gadget.c +++ b/drivers/usb/gadget/legacy/raw_gadget.c @@ -674,12 +674,12 @@ static int raw_process_ep0_io(struct raw_dev *dev, struct usb_raw_ep_io *io, if (WARN_ON(in && dev->ep0_out_pending)) { ret = -ENODEV; dev->state = STATE_DEV_FAILED; - goto out_done; + goto out_unlock; } if (WARN_ON(!in && dev->ep0_in_pending)) { ret = -ENODEV; dev->state = STATE_DEV_FAILED; - goto out_done; + goto out_unlock; } dev->req->buf = data; @@ -694,7 +694,7 @@ static int raw_process_ep0_io(struct raw_dev *dev, struct usb_raw_ep_io *io, "fail, usb_ep_queue returned %d\n", ret); spin_lock_irqsave(&dev->lock, flags); dev->state = STATE_DEV_FAILED; - goto out_done; + goto out_queue_failed; } ret = wait_for_completion_interruptible(&dev->ep0_done); @@ -703,13 +703,16 @@ static int raw_process_ep0_io(struct raw_dev *dev, struct usb_raw_ep_io *io, usb_ep_dequeue(dev->gadget->ep0, dev->req); wait_for_completion(&dev->ep0_done); spin_lock_irqsave(&dev->lock, flags); - goto out_done; + if (dev->ep0_status == -ECONNRESET) + dev->ep0_status = -EINTR; + goto out_interrupted; } spin_lock_irqsave(&dev->lock, flags); - ret = dev->ep0_status; -out_done: +out_interrupted: + ret = dev->ep0_status; +out_queue_failed: dev->ep0_urb_queued = false; out_unlock: spin_unlock_irqrestore(&dev->lock, flags); @@ -1078,7 +1081,7 @@ static int raw_process_ep_io(struct raw_dev *dev, struct usb_raw_ep_io *io, "fail, usb_ep_queue returned %d\n", ret); spin_lock_irqsave(&dev->lock, flags); dev->state = STATE_DEV_FAILED; - goto out_done; + goto out_queue_failed; } ret = wait_for_completion_interruptible(&done); @@ -1087,13 +1090,16 @@ static int raw_process_ep_io(struct raw_dev *dev, struct usb_raw_ep_io *io, usb_ep_dequeue(ep->ep, ep->req); wait_for_completion(&done); spin_lock_irqsave(&dev->lock, flags); - goto out_done; + if (ep->status == -ECONNRESET) + ep->status = -EINTR; + goto out_interrupted; } spin_lock_irqsave(&dev->lock, flags); - ret = ep->status; -out_done: +out_interrupted: + ret = ep->status; +out_queue_failed: ep->urb_queued = false; out_unlock: spin_unlock_irqrestore(&dev->lock, flags); From patchwork Thu Oct 26 20:01:13 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: andrey.konovalov@linux.dev X-Patchwork-Id: 158672 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:d641:0:b0:403:3b70:6f57 with SMTP id cy1csp135993vqb; Thu, 26 Oct 2023 13:01:38 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEEvXcxTr/Vs8vCgToPoMGuMcf6OtkxdCHFlCl4c5mkrp3Wh6FlWSWir2gGBR2Jzi1I58kz X-Received: by 2002:a05:6902:1083:b0:d9d:39af:2feb with SMTP id v3-20020a056902108300b00d9d39af2febmr484293ybu.50.1698350498177; Thu, 26 Oct 2023 13:01:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1698350498; cv=none; d=google.com; s=arc-20160816; b=Dz/fdvNFdq1qLQdNwEyNwMmW6GbH9cE1p7Y93q8ZfB3bfgY69bFGL1u6JRHkbPBUy3 BfD2elEIx6weazd8NKsi9RBSCiByEIXZ+XcLR7orRTKpZ9SjaEoCAN6XhkODqAda/oWa w9biQfM0hGJdg3IevgpazZCWMJYdQn0NlSxXyXhn9R21PsrVKnvp+NJKymrlQTL7hCSH nhw35Oq+Zwklfno0SFpIczDoGSuN2EJI0di6yn/cdKK79fQ3OZGSe6FTF6xNxcHVNEbj 79Yzzsg2UAkvKzDDYbrWfOQ7CYM2S4ol2XH11YWyBaCMr+wGoQiC+vxvCWLCOFMsTl3N 8alA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=i2fWBBG9mLsogb4ThmIrsmZJLekVVeeZs1stUDz5bLY=; fh=swjxqjQ9hhASm8GoxkZi+6BQ9X7UYEMXc0fZW0c9whc=; b=NtpynsY49UzczRzQCQmeLH7KnyBmDB27/c/+RpJl9Z6GmIxlHNifnNNmchzwKFApWy Wv7vCX8HSGgeMmY6bTDAt3sTTEaPIKOTvvu/OqjGYaJ4KHPZFH8iEXTAvC7YP+SN6NrI sj55iNrDQsE9Ult0KogSnhsG+mg8ARpwAmIqLg86jnRWOki8cl3y65rrAHpBbYLP+N12 4KiEq4UMZ2TbypU1m9vnfclSUj7aDTPvFvyjnoAjMwRrdg3FwuNY02aW6JxbOAkB5orY PL8jhsgdsZ4TKcl2wcy1DMDdeYJIiO3ai4z0perTmTCI1+phNnmDmN4f/CkghZTZ6sOz G/ow== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linux.dev header.s=key1 header.b=aggK5mRY; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.32 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linux.dev Received: from agentk.vger.email (agentk.vger.email. [23.128.96.32]) by mx.google.com with ESMTPS id g10-20020a25b10a000000b00da0adab33c8si208553ybj.466.2023.10.26.13.01.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Oct 2023 13:01:38 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.32 as permitted sender) client-ip=23.128.96.32; Authentication-Results: mx.google.com; dkim=pass header.i=@linux.dev header.s=key1 header.b=aggK5mRY; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.32 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linux.dev Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by agentk.vger.email (Postfix) with ESMTP id 90FE881BE2D3; Thu, 26 Oct 2023 13:01:35 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at agentk.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231701AbjJZUB3 (ORCPT + 26 others); Thu, 26 Oct 2023 16:01:29 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39242 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229501AbjJZUB1 (ORCPT ); Thu, 26 Oct 2023 16:01:27 -0400 Received: from out-188.mta0.migadu.com (out-188.mta0.migadu.com [IPv6:2001:41d0:1004:224b::bc]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1433BC0 for ; Thu, 26 Oct 2023 13:01:25 -0700 (PDT) X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1698350483; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=i2fWBBG9mLsogb4ThmIrsmZJLekVVeeZs1stUDz5bLY=; b=aggK5mRYNgfUFifJAY6PRh8UPuM4z6Xtj3PW/t5bGjwxdH0d2b88z3eQ04wjdZNzx8+X7+ pp2Lo/wHupV12uFZ5T97mtTvwIi9LO814iRGBsuURqZ/lhC1GtSS5BYEx+l4Y9srIl1Hrm coM2+KKYuNpZtBh3w08FwqxN4x/sPSk= From: andrey.konovalov@linux.dev To: Greg Kroah-Hartman Cc: Andrey Konovalov , Alan Stern , Felipe Balbi , linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 2/3] usb: raw-gadget: don't disable device if usb_ep_queue fails Date: Thu, 26 Oct 2023 22:01:13 +0200 Message-Id: <3c5df3dddb67623b4aeb11c5546370363e65d8e2.1698350424.git.andreyknvl@gmail.com> In-Reply-To: <0db45b1d7cc466e3d4d1ab353f61d63c977fbbc5.1698350424.git.andreyknvl@gmail.com> References: <0db45b1d7cc466e3d4d1ab353f61d63c977fbbc5.1698350424.git.andreyknvl@gmail.com> MIME-Version: 1.0 X-Migadu-Flow: FLOW_OUT X-Spam-Status: No, score=-0.8 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on agentk.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (agentk.vger.email [0.0.0.0]); Thu, 26 Oct 2023 13:01:35 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1780849572008315509 X-GMAIL-MSGID: 1780849572008315509 From: Andrey Konovalov During device operation, the host might decide to reset a device emulated via Raw Gadget. In this case, if the device emulation code has endpoint requests queued, usb_ep_queue will fail with -ESHUTDOWN. Currently, this disables the Raw Gadget device and makes the emulation code unable to proceed. Do not disable the Raw Gadget device if usb_ep_queue fails. Signed-off-by: Andrey Konovalov --- drivers/usb/gadget/legacy/raw_gadget.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/drivers/usb/gadget/legacy/raw_gadget.c b/drivers/usb/gadget/legacy/raw_gadget.c index ce9e87f84911..daac1f078516 100644 --- a/drivers/usb/gadget/legacy/raw_gadget.c +++ b/drivers/usb/gadget/legacy/raw_gadget.c @@ -693,7 +693,6 @@ static int raw_process_ep0_io(struct raw_dev *dev, struct usb_raw_ep_io *io, dev_err(&dev->gadget->dev, "fail, usb_ep_queue returned %d\n", ret); spin_lock_irqsave(&dev->lock, flags); - dev->state = STATE_DEV_FAILED; goto out_queue_failed; } @@ -1080,7 +1079,6 @@ static int raw_process_ep_io(struct raw_dev *dev, struct usb_raw_ep_io *io, dev_err(&dev->gadget->dev, "fail, usb_ep_queue returned %d\n", ret); spin_lock_irqsave(&dev->lock, flags); - dev->state = STATE_DEV_FAILED; goto out_queue_failed; } From patchwork Thu Oct 26 20:01:14 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: andrey.konovalov@linux.dev X-Patchwork-Id: 158674 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:d641:0:b0:403:3b70:6f57 with SMTP id cy1csp136443vqb; Thu, 26 Oct 2023 13:02:11 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGq6vEkTZNf8FpwXKKxvzqeFg1HYJGjiQEY9i5i+txXUNuB1X7DEmHqy5UXo2v1TQU5Mi5Y X-Received: by 2002:a05:6214:27ca:b0:66d:6311:f91f with SMTP id ge10-20020a05621427ca00b0066d6311f91fmr644428qvb.45.1698350530994; Thu, 26 Oct 2023 13:02:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1698350530; cv=none; d=google.com; s=arc-20160816; b=JZRCMhmoF9uZWwxYuYAC+b5dYCcadj/rC0Poa9LG200Dgf1/l/YKGOZhY6xX8NaWBI e0oDo4OnJbvUqeiE2cEUypNpYNbFBlhlC5oJGIhxlMVsz29c9IcrYyNPoOeYIIf2GMqh r31U1lyS/QMrSu09lVedtQIqiEF/X2whfkC/zRfaqIr4gpG9MmvPL0eGWhu1lul10kag t0IsRzZcFYKN4fIeTdbrwOfCQY8Bj4Qkc71VeoXKt/behU7tgQJxk5PayRdspuoEUJQe TEBERCl9B9nqU4iA2WT1G07CBv3zLrjEzLWCs9Yz9XpmfVQYOkcc7V0jcMKRM2tHaDdc PwZw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=rChh14RoKqHyNTtLO4oEGTir1WUGyXt9ry5A85Vdpuk=; fh=swjxqjQ9hhASm8GoxkZi+6BQ9X7UYEMXc0fZW0c9whc=; b=KBLxlvgjQVfQ/wJgF25NuNL57QC1t9sf+kzjxdyEDt6h1FV0FKNtjsowIuDYdNZriy Jr0pJvemeZyRg6PyBz7ZycDhg0uBvq9iwiI2S0qbtfZQjKMWFGnxosmIG19yxlsFGcYf HM/33jUciiicgx3T7KRtnqrBjPNDCzBmVXZ1Q7hCmW8pHGfXRFeLVzCctypTGyo72tX5 bMR0+9L2q9BDtZCr4TLR4QXHHwb55yfEVBialln7RugPvwFogT3cgogc18AVGm5wxKQi djTfSJlTl22N0Npeuj/B40Q2xCLDJ1Py2wmJ4uLeRKh5s39C6p+8vSU4EGl3PbuVR9B0 kDyw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linux.dev header.s=key1 header.b=VGYbP43i; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:3 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linux.dev Received: from lipwig.vger.email (lipwig.vger.email. [2620:137:e000::3:3]) by mx.google.com with ESMTPS id kr20-20020a0562142b9400b0065b16b39ce6si95964qvb.207.2023.10.26.13.02.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Oct 2023 13:02:10 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:3 as permitted sender) client-ip=2620:137:e000::3:3; Authentication-Results: mx.google.com; dkim=pass header.i=@linux.dev header.s=key1 header.b=VGYbP43i; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:3 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linux.dev Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by lipwig.vger.email (Postfix) with ESMTP id 245578291112; Thu, 26 Oct 2023 13:02:08 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at lipwig.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344696AbjJZUBe (ORCPT + 26 others); Thu, 26 Oct 2023 16:01:34 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39260 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230330AbjJZUB2 (ORCPT ); Thu, 26 Oct 2023 16:01:28 -0400 Received: from out-170.mta0.migadu.com (out-170.mta0.migadu.com [IPv6:2001:41d0:1004:224b::aa]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5B372129 for ; Thu, 26 Oct 2023 13:01:25 -0700 (PDT) X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1698350483; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=rChh14RoKqHyNTtLO4oEGTir1WUGyXt9ry5A85Vdpuk=; b=VGYbP43i8J4IsipMVD+zeMt0fHoJnBYRw/yKfBwEDSHLF165mZk657fUGAW6Z6z7F1+H0W L/HFADJLtTzn+GsE1YxiJyBXy1pXgyb20osxW+e5iFmf36OGuuCM7hUZ61svAzlchTfN6U PZAeo7JpU0FDob/uVbpy0QFzmiAh050= From: andrey.konovalov@linux.dev To: Greg Kroah-Hartman Cc: Andrey Konovalov , Alan Stern , Felipe Balbi , linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 3/3] usb: raw-gadget: report suspend, resume, reset, and disconnect events Date: Thu, 26 Oct 2023 22:01:14 +0200 Message-Id: In-Reply-To: <0db45b1d7cc466e3d4d1ab353f61d63c977fbbc5.1698350424.git.andreyknvl@gmail.com> References: <0db45b1d7cc466e3d4d1ab353f61d63c977fbbc5.1698350424.git.andreyknvl@gmail.com> MIME-Version: 1.0 X-Migadu-Flow: FLOW_OUT X-Spam-Status: No, score=-0.8 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lipwig.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (lipwig.vger.email [0.0.0.0]); Thu, 26 Oct 2023 13:02:08 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1780849606046125170 X-GMAIL-MSGID: 1780849606046125170 From: Andrey Konovalov Update USB_RAW_IOCTL_EVENT_FETCH to also report suspend, resume, reset, and disconnect events. This allows the code that emulates a USB device via Raw Gadget to handle these events. For example, the device can restart enumeration when it gets reset. Also do not print a WARNING when the event queue overflows. With these new events being queued, the queue might overflow if the device emulation code stops fetching events. Also print debug messages when a non-control event is received. Signed-off-by: Andrey Konovalov --- Changes v1->v2: - Don't print another error message if event queue overflows: each caller already prints one if event queueing fails. --- drivers/usb/gadget/legacy/raw_gadget.c | 52 ++++++++++++++++++++++---- include/uapi/linux/usb/raw_gadget.h | 14 ++++++- 2 files changed, 56 insertions(+), 10 deletions(-) diff --git a/drivers/usb/gadget/legacy/raw_gadget.c b/drivers/usb/gadget/legacy/raw_gadget.c index daac1f078516..399fca32a8ac 100644 --- a/drivers/usb/gadget/legacy/raw_gadget.c +++ b/drivers/usb/gadget/legacy/raw_gadget.c @@ -65,7 +65,7 @@ static int raw_event_queue_add(struct raw_event_queue *queue, struct usb_raw_event *event; spin_lock_irqsave(&queue->lock, flags); - if (WARN_ON(queue->size >= RAW_EVENT_QUEUE_SIZE)) { + if (queue->size >= RAW_EVENT_QUEUE_SIZE) { spin_unlock_irqrestore(&queue->lock, flags); return -ENOMEM; } @@ -311,9 +311,10 @@ static int gadget_bind(struct usb_gadget *gadget, dev->eps_num = i; spin_unlock_irqrestore(&dev->lock, flags); + dev_dbg(&gadget->dev, "gadget connected\n"); ret = raw_queue_event(dev, USB_RAW_EVENT_CONNECT, 0, NULL); if (ret < 0) { - dev_err(&gadget->dev, "failed to queue event\n"); + dev_err(&gadget->dev, "failed to queue connect event\n"); set_gadget_data(gadget, NULL); return ret; } @@ -358,7 +359,7 @@ static int gadget_setup(struct usb_gadget *gadget, ret = raw_queue_event(dev, USB_RAW_EVENT_CONTROL, sizeof(*ctrl), ctrl); if (ret < 0) - dev_err(&gadget->dev, "failed to queue event\n"); + dev_err(&gadget->dev, "failed to queue control event\n"); goto out; out_unlock: @@ -377,11 +378,46 @@ static int gadget_setup(struct usb_gadget *gadget, return ret; } -/* These are currently unused but present in case UDC driver requires them. */ -static void gadget_disconnect(struct usb_gadget *gadget) { } -static void gadget_suspend(struct usb_gadget *gadget) { } -static void gadget_resume(struct usb_gadget *gadget) { } -static void gadget_reset(struct usb_gadget *gadget) { } +static void gadget_disconnect(struct usb_gadget *gadget) +{ + struct raw_dev *dev = get_gadget_data(gadget); + int ret; + + dev_dbg(&gadget->dev, "gadget disconnected\n"); + ret = raw_queue_event(dev, USB_RAW_EVENT_DISCONNECT, 0, NULL); + if (ret < 0) + dev_err(&gadget->dev, "failed to queue disconnect event\n"); +} +static void gadget_suspend(struct usb_gadget *gadget) +{ + struct raw_dev *dev = get_gadget_data(gadget); + int ret; + + dev_dbg(&gadget->dev, "gadget suspended\n"); + ret = raw_queue_event(dev, USB_RAW_EVENT_SUSPEND, 0, NULL); + if (ret < 0) + dev_err(&gadget->dev, "failed to queue suspend event\n"); +} +static void gadget_resume(struct usb_gadget *gadget) +{ + struct raw_dev *dev = get_gadget_data(gadget); + int ret; + + dev_dbg(&gadget->dev, "gadget resumed\n"); + ret = raw_queue_event(dev, USB_RAW_EVENT_RESUME, 0, NULL); + if (ret < 0) + dev_err(&gadget->dev, "failed to queue resume event\n"); +} +static void gadget_reset(struct usb_gadget *gadget) +{ + struct raw_dev *dev = get_gadget_data(gadget); + int ret; + + dev_dbg(&gadget->dev, "gadget reset\n"); + ret = raw_queue_event(dev, USB_RAW_EVENT_RESET, 0, NULL); + if (ret < 0) + dev_err(&gadget->dev, "failed to queue reset event\n"); +} /*----------------------------------------------------------------------*/ diff --git a/include/uapi/linux/usb/raw_gadget.h b/include/uapi/linux/usb/raw_gadget.h index c7d2199134d7..f0224a8dc858 100644 --- a/include/uapi/linux/usb/raw_gadget.h +++ b/include/uapi/linux/usb/raw_gadget.h @@ -44,6 +44,16 @@ enum usb_raw_event_type { /* This event is queued when a new control request arrived to ep0. */ USB_RAW_EVENT_CONTROL = 2, + /* + * These events are queued when the gadget driver is suspended, + * resumed, reset, or disconnected. Note that some UDCs (e.g. dwc2) + * report a disconnect event instead of a reset. + */ + USB_RAW_EVENT_SUSPEND = 3, + USB_RAW_EVENT_RESUME = 4, + USB_RAW_EVENT_RESET = 5, + USB_RAW_EVENT_DISCONNECT = 6, + /* The list might grow in the future. */ }; @@ -54,8 +64,8 @@ enum usb_raw_event_type { * actual length of the fetched event data. * @data: A buffer to store the fetched event data. * - * Currently the fetched data buffer is empty for USB_RAW_EVENT_CONNECT, - * and contains struct usb_ctrlrequest for USB_RAW_EVENT_CONTROL. + * The fetched event data buffer contains struct usb_ctrlrequest for + * USB_RAW_EVENT_CONTROL and is empty for other events. */ struct usb_raw_event { __u32 type;