[PATCH 4/4] net: dsa: remove master santiy check

Vladimir Oltean olteanv at gmail.com
Wed Feb 24 18:11:11 CET 2021


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 at 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/07b90056cb15ff9877dca0d8f1b6583d1051f724

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.


More information about the U-Boot mailing list