Re: [PATCH] [RFC] usb: dwc2: Run the core connect in dwc2_hcd_init()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Marek,

On 5/14/2020 4:10 AM, Marek Vasut wrote:
> On 4/22/20 4:21 PM, Marek Vasut wrote:
>> On 4/22/20 3:45 PM, Minas Harutyunyan wrote:
>>> Hi,
>>
>> Hi,
>>
>>> On 4/20/2020 4:09 PM, Marek Vasut wrote:
>>>> On 4/17/20 11:00 AM, Minas Harutyunyan wrote:
>>>>> Hi,
>>>>
>>>> Hi,
>>>>
>>>>> On 4/16/2020 6:31 PM, Marek Vasut wrote:
>>>>>> On 4/16/20 3:37 PM, Minas Harutyunyan wrote:
>>>>>
>>> Looks like I found cause of issue. According to your logs GINTMSK set
>>> host masks, at least USB Reset not unmasked which required for device mode.
>>> Why it happen. During dwc2 driver probe first initialized device part
>>> then host part. Because of your g_zero is builtin in Kernel it
>>> immediately bound to dwc2, as result called main device initialization
>>> dwc2_hsotg_core_init_disconnected() which at least set GINTMSK for
>>> device mode. After gadget side initialization done, dwc2 go to host
>>> initialization hcd_init() and reset GINTMSK to host masks. In this case
>>> connecting cable to host will ignore USBReset and stacked. Your initial
>>> patch including call to function dwc2_hsotg_core_init_disconnected(),
>>> which allow to restore device mode masks and on cable connect start
>>> working as device.
>>> First to check my assumption, please build g_zero as module and modprobe
>>> it after dwc2 modprobe will be done. If the tests will pass then will
>>> think how resolve issue with builtin functions.
>>
>> Using g_zero as a module seems to work too, so please proceed.
> 
> Any news on using g_zero as built-in ?
> 
Could you please test with this patch.

diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c
index 12b98b466287..7faf5f8c056d 100644
--- a/drivers/usb/dwc2/gadget.c
+++ b/drivers/usb/dwc2/gadget.c
@@ -4920,12 +4920,6 @@ int dwc2_gadget_init(struct dwc2_hsotg *hsotg)
  					  epnum, 0);
  	}

-	ret = usb_add_gadget_udc(dev, &hsotg->gadget);
-	if (ret) {
-		dwc2_hsotg_ep_free_request(&hsotg->eps_out[0]->ep,
-					   hsotg->ctrl_req);
-		return ret;
-	}
  	dwc2_hsotg_dump(hsotg);

  	return 0;
diff --git a/drivers/usb/dwc2/platform.c b/drivers/usb/dwc2/platform.c
index 8ea4a24637fa..603b85cd8ed3 100644
--- a/drivers/usb/dwc2/platform.c
+++ b/drivers/usb/dwc2/platform.c
@@ -537,6 +537,16 @@ static int dwc2_driver_probe(struct platform_device 
*dev)
  	if (hsotg->dr_mode == USB_DR_MODE_PERIPHERAL)
  		dwc2_lowlevel_hw_disable(hsotg);

+	/* Postponed adding a new gadget to the udc class driver list */
+	if (hsotg->gadget_enabled) {
+		retval = usb_add_gadget_udc(hsotg->dev, &hsotg->gadget);
+		if (retval) {
+			dwc2_hsotg_remove(hsotg);
+			goto error_init;
+		}
+
+	}
+
  	return 0;

  error_init:



Thanks,
Minas




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux