Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp4934416imu; Tue, 8 Jan 2019 08:41:54 -0800 (PST) X-Google-Smtp-Source: ALg8bN7pfaKnrq4cIar9VxgmgR0cR9hPoVnixHuewALUgXibNwyBxicq1E5caSznXA8416g/XZu/ X-Received: by 2002:a17:902:2862:: with SMTP id e89mr2500365plb.158.1546965714415; Tue, 08 Jan 2019 08:41:54 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1546965714; cv=none; d=google.com; s=arc-20160816; b=gCnncUrlWIJ+OnRdZhrcPVrNaOE8BrWlGteSe0QYCjwM7+Xr9UhEK3Q39d3pU751JW bX2ypKkBVbhHECLlbTlHB2sPe/AokiTxk1TXc3PVB8KZOrN90VKqAPOPEJm9FnaJSHf3 DPvEnHJpFOKev5D+vnK5Ao1XgOpx194iP3jf3jzZhka7eDnSEZcVjdlM5TTUnrK8OH7N mpSF6Yj95/lxmGhEDLW/inH6wVFbS4cxPL8jWsdSbdZMgsFP4TVYioyj0r6cNfFQdJP8 SfBXEyi0EnzONZUEs0J5kt5MpQcNHnJzDuMM7+LihsB+TDPThvBo9iG+E6Yqx3xB/Jis sunA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:message-id:in-reply-to :subject:cc:to:from:date; bh=vG9FQrc+Sp8CDASWr5r9o7kLOLO0gp2NKLlVJF/A9a4=; b=VMAr0WpZNfi8R4b0eHQud46dgXVgDgy+3zkOaVVgMq6IBleF5/XYNYQpp4k7IrJuTo dL3zfOZrCw4S5vEqvpDEFFxAg2ohWJToUYJ0MiLG4M5R9QhoFU99mPFz7dhWDiDP1msu 0+BC2MGxn+Z8WQIEkEqzZRyNFeJwP+N69wgqJdBAY3UqrBUXV0tSbAeasdePFuZRH9Cf ovFiUHSWe2ZbVzuAite99t0GkGdbZRZtfzreGSojNcySZFZJZJ/QCN7OzQwLfXYPF132 FBMyFnrnSh0uNOtsix7DXhRraELXjvqJnEuV0AQwaxzgBXJ2SQ03oMo3Q5OZoDDhaQia P3+Q== ARC-Authentication-Results: i=1; mx.google.com; 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 x33si12443524plb.43.2019.01.08.08.41.39; Tue, 08 Jan 2019 08:41:54 -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; 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 S1728313AbfAHPcF (ORCPT + 99 others); Tue, 8 Jan 2019 10:32:05 -0500 Received: from iolanthe.rowland.org ([192.131.102.54]:53454 "HELO iolanthe.rowland.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1727906AbfAHPcF (ORCPT ); Tue, 8 Jan 2019 10:32:05 -0500 Received: (qmail 1507 invoked by uid 2102); 8 Jan 2019 10:32:04 -0500 Received: from localhost (sendmail-bs@127.0.0.1) by localhost with SMTP; 8 Jan 2019 10:32:04 -0500 Date: Tue, 8 Jan 2019 10:32:04 -0500 (EST) From: Alan Stern X-X-Sender: stern@iolanthe.rowland.org To: Paul Elder cc: laurent.pinchart@ideasonboard.com, , , , , , , Subject: Re: [PATCH v4 5/6] usb: musb: gadget: implement optional explicit status stage In-Reply-To: <20190108054918.GB31873@localhost.localdomain> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, 8 Jan 2019, Paul Elder wrote: > On Sun, Jan 06, 2019 at 03:03:09PM -0500, Alan Stern wrote: > > On Sun, 6 Jan 2019, Paul Elder wrote: > > > > > Implement the mechanism for optional explicit status stage for the MUSB > > > driver. This allows a function driver to specify what to reply for the > > > status stage. The functionality for an implicit status stage is > > > retained. > > > > > > Signed-off-by: Paul Elder > > > v1 Reviewed-by: Laurent Pinchart > > > v1 Acked-by: Bin Liu > > > --- > > > No change from v3 > > > > > > Changes from v2: > > > - update call to usb_gadget_control_complete to include status > > > - since sending STALL from the function driver is now done with > > > usb_ep_set_halt, there is no need for the internal ep0_send_response to > > > take a stall/ack parameter; remove the parameter and make the function > > > only send ack, and remove checking for the status reply in the > > > usb_request for the status stage > > > > > > Changes from v1: > > > - obvious change to implement v2 mechanism laid out by 4/6 of this > > > series (send_response, and musb_g_ep0_send_response function has > > > been removed, call to usb_gadget_control_complete has been added) > > > - ep0_send_response's ack argument has been changed from stall > > > - last_packet flag in ep0_rxstate has been removed, since it is equal to > > > req != NULL > > > > > > drivers/usb/musb/musb_gadget.c | 2 ++ > > > drivers/usb/musb/musb_gadget_ep0.c | 23 +++++++++++++++++++++++ > > > 2 files changed, 25 insertions(+) > > > > > > diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c > > > index d3f33f449445..a7a992ab0c9d 100644 > > > --- a/drivers/usb/musb/musb_gadget.c > > > +++ b/drivers/usb/musb/musb_gadget.c > > > @@ -145,6 +145,8 @@ __acquires(ep->musb->lock) > > > > > > trace_musb_req_gb(req); > > > usb_gadget_giveback_request(&req->ep->end_point, &req->request); > > > + usb_gadget_control_complete(&musb->g, request->explicit_status, > > > + request->status); > > > > I haven't paid much attention to this part of the patch series, not > > knowing much about musb. Still, it's clear that > > usb_gadget_control_complete should be called only for transfers on > > ep0. You need to test the endpoint value. > > Oh oops, yeah, you're right. > > > Another problem: the completion handler may deallocate the request. > > Dereferencing request->expicit_status and request->status would then > > cause errors. Would it be preferable to call > > usb_gadget_control_complete before usb_gadget_giveback_request? If > > it gets done that way then the arguments could be simplified: we could > > pass a pointer to the request instead of the separate explicit_status > > and status values. > > I thought that usb_gadget_control_complete needs to check the status of > the request that was given back. Doesn't that mean that > usb_gadget_giveback_request must be called first? You misunderstand. req->status has already been determined by the time usb_gadget_giveback_request is called. It does not get set by that call. > I was thinking that maybe we could save explicit_status before calling > usb_gadget_giveback_request, and if request is still valid then we can > pull status from it otherwise use 0, but then would that be considered > adding complexity to UDCs that want to implement optional status stage > delay? Or add a wrapper function? > > On the other hand, if we do put usb_gadget_control_complete before > usb_gadget_giveback_request, then the control transfer would complete > before the function driver has a chance to complete, but if the function > driver wanted to intervene/determine the status stage then it would have > gone through the new mechanism that we're making here. So it could be > fine to switch the order. My tests for it work too, so I guess we'll go > with usb_gadget_control_complete before usb_gadget_giveback_request > then. In that case usb_gadget_control_complete doesn't need to check the > status of the request, since there isn't any, right? Wrong -- the status has already been set by that time. Alan Stern