From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753298AbdJaNZN (ORCPT ); Tue, 31 Oct 2017 09:25:13 -0400 Received: from mga02.intel.com ([134.134.136.20]:27431 "EHLO mga02.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751269AbdJaNZL (ORCPT ); Tue, 31 Oct 2017 09:25:11 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.44,324,1505804400"; d="asc'?scan'208";a="1237710194" From: Felipe Balbi To: Roger Quadros Cc: Dylan.Howey@tennantco.com, linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, Roger Quadros , "# v4 . 13+" Subject: Re: [PATCH] usb: dwc3: gadget: Fix .udc_set_speed() In-Reply-To: <1509454904-4966-1-git-send-email-rogerq@ti.com> References: <1509454904-4966-1-git-send-email-rogerq@ti.com> Date: Tue, 31 Oct 2017 15:24:56 +0200 Message-ID: <87a807cuvr.fsf@linux.intel.com> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha512; protocol="application/pgp-signature" Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org --=-=-= Content-Type: text/plain Content-Transfer-Encoding: quoted-printable Roger Quadros writes: > UDC core calls .udc_set_speed() with the speed parameter > containing the maximum speed supported by the gadget function > driver. This might very well be more or less than that > supported by the dwc3 controller driver. > > Select the lesser of the 2 speeds so both are operating > within limits. > > This fixes PHY Erratic errors and 2 second enumeration delay on > TI's AM437x platforms. > > Fixes: 7d8d0639565f ("usb: dwc3: gadget: implement ->udc_set_speed()") > Cc: # v4.13+ > Reported-by: Dylan Howey > Signed-off-by: Roger Quadros > --- > drivers/usb/dwc3/gadget.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c > index f064f15..9f27ec0 100644 > --- a/drivers/usb/dwc3/gadget.c > +++ b/drivers/usb/dwc3/gadget.c > @@ -2008,6 +2008,8 @@ static void dwc3_gadget_set_speed(struct usb_gadget= *g, > unsigned long flags; > u32 reg; >=20=20 > + speed =3D min(g->max_speed, speed); should we do that in udc core itself? @@ -1080,8 +1080,12 @@ static inline void usb_gadget_udc_stop(struct usb_ud= c *udc) static inline void usb_gadget_udc_set_speed(struct usb_udc *udc, enum usb_device_speed speed) { =2D if (udc->gadget->ops->udc_set_speed) =2D udc->gadget->ops->udc_set_speed(udc->gadget, speed); + if (udc->gadget->ops->udc_set_speed) { + enum usb_device_speed s; + + s =3D min(speed, udc->gadget->max_speed); + udc->gadget->ops->udc_set_speed(udc->gadget, s); + } } =20 /** then the fix applies for all UDCs. =2D-=20 balbi --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQIzBAEBCgAdFiEElLzh7wn96CXwjh2IzL64meEamQYFAln4eagACgkQzL64meEa mQb9zhAAmSvUMx/NR2Wb9SLSBy5HXG4xGxkHyB6xpRwwLwMYPiOV7/RX0GAfjp2u HCNezIAomidauOdvFJwdDqVmfDRrjN6lJuORMfTNr+d9Mo3zaabK5XcZ02VI5PsC 1GQdzy5pR/hgsJJrKq4D5XfRjtVaKMRH0rstghRwZo88WQpFLXrXt3h3VLM+wHQG fetZPJg4TAfpFglkfG/Y2WSUQ6SQcY+6MBxdGLRpl+ZKsYLaXx20d5DxjVSvEJYN LUPnk4txQNerOL8FjOtr78FnfFQPOv1LZEQHJN2Si+qEFEf3jUOrrk1GlyWUOQzX 67x7z1Ij9qqYoPd5LSqYl6BRnTLyNZ/utfhj5ossHhipu2707ahwQ1KwkmUOvtaO CM0ffk4QkOA8dIhB/G2pfIn5fNcf7KwUgJu0SXc3sjEqnNCqcv9cfc+jN5nEiA2z 7Qw6kYu3qmz7vkGHYG7h40RR4clWiwpiE/2UaWPmfMFvmRbpBJV6DVZs0KDLjAG4 FLbj8oC6sI2MauM4XHetgwM+OIeCzLic09CzLemVhRhGSkuekFh58AQoqmYNvqCN sAPQGexdiIkSaCLcKo0B2B7U/zsYIRy5rwGnKQhrDjuoYXdVu98cMKYU1A37zbh4 Etq3T32KzKsdpflLRumgy8YAHFyYXKs9i3eY7Tdo/wyuT7iA6Fc= =ZuAy -----END PGP SIGNATURE----- --=-=-=--