
Hi Marek,
On 12/12/2022 17:46, Marek Vasut wrote:
On 12/12/22 16:29, Niel Fourie wrote:
Split out _usb_eth_start() from _usb_eth_init() and usb_eth_stop() from _usb_eth_halt(). Now _usb_eth_init() only initialises and registers the gadget device, which _usb_eth_halt() reverses, and together are used for probing and removing the device. The _usb_eth_start() and _usb_eth_stop() functions connect and disconnect the gadget as expected by the start()/stop() callbacks.
Previously the gadget device was probed on every start() and removed on every stop(), which is inconsistent with other DM_ETH drivers. For non-DM gadget drivers the old behaviour has been retained.
Does this mean the udevice pointer and associated private date are retained during the entire operation of the USB gadget , i.e. even between stop/start cycles ?
In the DM_ETH case, yes. The drivers/devices remain registered the whole time between _usb_eth_init() and _usb_eth_halt(), and the need for revalidating the private data pointer falls away as was done in my previous patch.
I tested this on imx8mp with the dwc3 gadget driver, and the data structures, specifically the private data, remained intact from probe() until remove(). I also tested that probing again after removal works as expected.
I tested the non-DM_ETH case on an iMX6 Phytec Mira (pcm058) which uses the ci_udc.c driver, which appears to not support DM_ETH yet. In that case the gadget drivers get registered/unregistered in usb_eth_init()/usb_eth_halt().
The legacy non-DM_ETH implementation uses init()/halt() similarly to start()/stop() in the DM_ETH implementation, but had no further equivalent for probe()/remove() in struct eth_device. When the Ethernet gadget was ported to DM_ETH, this difference most likely lead to the existing implementation.
I unfortunately did not have other devices on hand to test against, so I am hoping that there are no other surprises.
Best regards, Niel Fourie