diff options
author | Vladimir Oltean <vladimir.oltean@nxp.com> | 2022-07-16 21:53:31 +0300 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2022-07-18 14:44:36 +0300 |
commit | 54367831c5d0ce273d82814f5fcb35c004f6a912 (patch) | |
tree | 46490a81f5ae11e54c7d4dfb0867cf8d9cb40507 /Documentation/networking/dsa | |
parent | 19b3b13c932fc8d613e50e3e92c1944f9fcc02c7 (diff) | |
download | linux-54367831c5d0ce273d82814f5fcb35c004f6a912.tar.xz |
docs: net: dsa: document the shutdown behavior
Document the changes that took place in the DSA core in the blamed
commit.
Fixes: 0650bf52b31f ("net: dsa: be compatible with masters which unregister on shutdown")
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'Documentation/networking/dsa')
-rw-r--r-- | Documentation/networking/dsa/dsa.rst | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/Documentation/networking/dsa/dsa.rst b/Documentation/networking/dsa/dsa.rst index 8691a84c7e85..c04cb4c95b64 100644 --- a/Documentation/networking/dsa/dsa.rst +++ b/Documentation/networking/dsa/dsa.rst @@ -572,6 +572,24 @@ The opposite of registration takes place when calling ``dsa_unregister_switch()` which removes a switch's ports from the port list of the tree. The entire tree is torn down when the first switch unregisters. +It is mandatory for DSA switch drivers to implement the ``shutdown()`` callback +of their respective bus, and call ``dsa_switch_shutdown()`` from it (a minimal +version of the full teardown performed by ``dsa_unregister_switch()``). +The reason is that DSA keeps a reference on the master net device, and if the +driver for the master device decides to unbind on shutdown, DSA's reference +will block that operation from finalizing. + +Either ``dsa_switch_shutdown()`` or ``dsa_unregister_switch()`` must be called, +but not both, and the device driver model permits the bus' ``remove()`` method +to be called even if ``shutdown()`` was already called. Therefore, drivers are +expected to implement a mutual exclusion method between ``remove()`` and +``shutdown()`` by setting their drvdata to NULL after any of these has run, and +checking whether the drvdata is NULL before proceeding to take any action. + +After ``dsa_switch_shutdown()`` or ``dsa_unregister_switch()`` was called, no +further callbacks via the provided ``dsa_switch_ops`` may take place, and the +driver may free the data structures associated with the ``dsa_switch``. + Switch configuration -------------------- |