On 8/22/24 11:11 AM, Zixun LI wrote:
Hi,
Hi,
On Thu, Aug 22, 2024 at 1:26 AM Marek Vasut <ma...@denx.de> wrote:
Would it be possible to fix up the g_dnl ?
g_dnl's interface is pretty different from usb_ether, I can't find a
way to access
usb_gadget struct in g_dnl_register().
Can you change the g_dnl_register() prototype and pass he structure in ?
I suspect it should be available in the commands which register g_dnl ?
Meanwhile it can be fixed in udc core, by doing gadget_driver bind
after udc start,
in addition to keeping the controller in disconnected state.
diff --git a/drivers/usb/gadget/udc/udc-core.c
b/drivers/usb/gadget/udc/udc-core.c
index 6bb419ae2a..b917a79892 100644
--- a/drivers/usb/gadget/udc/udc-core.c
+++ b/drivers/usb/gadget/udc/udc-core.c
@@ -300,15 +300,17 @@ static int udc_bind_to_driver(struct usb_udc
*udc, struct usb_gadget_driver *dri
usb_gadget_udc_set_speed(udc, driver->speed);
- ret = driver->bind(udc->gadget);
- if (ret)
- goto err1;
ret = usb_gadget_udc_start(udc);
if (ret) {
- driver->unbind(udc->gadget);
goto err1;
}
- usb_gadget_connect(udc->gadget);
+
+ /* Keep pullup disabled until interrupt is available */
+ usb_gadget_disconnect(udc->gadget);
This is no good, this is a workaround, let's not do this.
+ ret = driver->bind(udc->gadget);
+ if (ret)
+ goto err1;
return 0;
err1:
[...]