Subject: Re: linux-next: manual merge of the usb tree with the usb.current tree

From: Roger Quadros <[email-masked]>
Date: Sun, 28 May 2023 18:48:12 +0300

Hi Greg,

On 28/05/2023 17:28, Greg KH wrote:
> On Mon, May 15, 2023 at 02:01:08PM +0300, Roger Quadros wrote:
>> Hi Stephen,
>>
>> On 15/05/2023 05:35, Stephen Rothwell wrote:
>>> Hi all,
>>>
>>> Today's linux-next merge of the usb tree got a conflict in:
>>>
>>>   drivers/usb/dwc3/gadget.c
>>>
>>> between commit:
>>>
>>>   c8540870af4c ("usb: dwc3: gadget: Improve dwc3_gadget_suspend() and dwc3_gadget_resume()")
>>>
>>> from the usb.current tree and commit:
>>>
>>>   813f44d57e19 ("usb: dwc3: gadget: Bail out in pullup if soft reset timeout happens")
>>>
>>> from the usb tree.
>>>
>>> I fixed it up (I think - see below) and can carry the fix as
>>> necessary. This is now fixed as far as linux-next is concerned, but any
>>> non trivial conflicts should be mentioned to your upstream maintainer
>>> when your tree is submitted for merging.  You may also want to consider
>>> cooperating with the maintainer of the conflicting tree to minimise any
>>> particularly complex conflicts.
>>>
>>
>>> diff --cc drivers/usb/dwc3/gadget.c
>>> index d831f5acf7b5,5965796bc5d5..000000000000
>>> --- a/drivers/usb/dwc3/gadget.c
>>> +++ b/drivers/usb/dwc3/gadget.c
>>> @@@ -2700,21 -2699,6 +2700,26 @@@ static int dwc3_gadget_soft_disconnect(
>>>   	return ret;
>>>   }
>>>   
>>>  +static int dwc3_gadget_soft_connect(struct dwc3 *dwc)
>>>  +{
>>> ++	int	ret;
>>> ++
>>>  +	/*
>>>  +	 * In the Synopsys DWC_usb31 1.90a programming guide section
>>>  +	 * 4.1.9, it specifies that for a reconnect after a
>>>  +	 * device-initiated disconnect requires a core soft reset
>>>  +	 * (DCTL.CSftRst) before enabling the run/stop bit.
>>>  +	 */
>>>  +	dwc3_core_soft_reset(dwc);
>>
>> Please drop above call to dwc3_core_soft_reset().
>>
>>> ++	ret = dwc3_core_soft_reset(dwc);
>>> ++	if (ret)
>>> ++		return ret;
>>>  +
>>>  +	dwc3_event_buffers_setup(dwc);
>>>  +	__dwc3_gadget_start(dwc);
>>>  +	return dwc3_gadget_run_stop(dwc, true);
>>>  +}
>>>  +
>>>   static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on)
>>>   {
>>>   	struct dwc3		*dwc = gadget_to_dwc(g);
>>
> 
> Can you verify I got this right in my usb-next branch now?

No, the end result is not correct.

Please apply the below patch to fix it. Thanks.

-- 
cheers,
-roger

diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 7d59e0f43fda..578804dc29ca 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -2702,13 +2702,17 @@ static int dwc3_gadget_soft_disconnect(struct dwc3 *dwc)
 
 static int dwc3_gadget_soft_connect(struct dwc3 *dwc)
 {
+	int ret;
+
 	/*
 	 * In the Synopsys DWC_usb31 1.90a programming guide section
 	 * 4.1.9, it specifies that for a reconnect after a
 	 * device-initiated disconnect requires a core soft reset
 	 * (DCTL.CSftRst) before enabling the run/stop bit.
 	 */
-	dwc3_core_soft_reset(dwc);
+	ret = dwc3_core_soft_reset(dwc);
+	if (ret)
+		return ret;
 
 	dwc3_event_buffers_setup(dwc);
 	__dwc3_gadget_start(dwc);
@@ -2753,25 +2757,11 @@ static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on)
 
 	synchronize_irq(dwc->irq_gadget);
 
-	if (!is_on) {
+	if (!is_on)
 		ret = dwc3_gadget_soft_disconnect(dwc);
-	} else {
-		/*
-		 * In the Synopsys DWC_usb31 1.90a programming guide section
-		 * 4.1.9, it specifies that for a reconnect after a
-		 * device-initiated disconnect requires a core soft reset
-		 * (DCTL.CSftRst) before enabling the run/stop bit.
-		 */
-		ret = dwc3_core_soft_reset(dwc);
-		if (ret)
-			goto done;
-
-		dwc3_event_buffers_setup(dwc);
-		__dwc3_gadget_start(dwc);
-		ret = dwc3_gadget_run_stop(dwc, true);
-	}
+	else
+		ret = dwc3_gadget_soft_connect(dwc);
 
-done:
 	pm_runtime_put(dwc->dev);
 
 	return ret;