
On Wed, Feb 24, 2021 at 05:40:42PM +0100, Michael Walle wrote:
Because we probe the master ourselves (and fail if there is no master), it is not possible that we don't have a master device.
There is one catch though: device removal. We don't support that. It wasn't supported neither before this patch. Because the master device was only set in .pre_probe(), if a device was removed master_dev was a dangling pointer and transmitting a frame cause a panic. I don't see a good solution without having some sort of notify machanism when a udevice is removed.
Signed-off-by: Michael Walle michael@walle.cc
Ha, this is a tough one. So the DSA master is not a parent of the DSA switch, instead the SPI bus/whatever is. Additionally, the checks for NULL are pointless, because the master is not NULL, just deallocated.
In Linux we solved this by using device links: https://github.com/torvalds/linux/commit/07b90056cb15ff9877dca0d8f1b6583d105...
However it doesn't seem like we have such a generic dependency graph between udevices in U-Boot, do we? I could just find device_reparent, which is definitely not what we want.
My best guess as to how to solve the DSA master removal scenario would be to: (a) scatter all DSA callbacks with device_probe(master), so even if it was unbound, it will be rebound. (b) introduce DSA specific code in eth_pre_remove and a DSA-specific pointer in eth_pdata to manually call device_remove for an attached DSA switch, if that exists.
Other ideas are welcome, of course.