+++ /dev/null
-From 5a8fa1511bcf9d6bcf04245ccdb61b4d788c0212 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Fri, 17 Sep 2021 16:34:34 +0300
-Subject: net: dsa: hellcreek: be compatible with masters which unregister on
- shutdown
-
-From: Vladimir Oltean <vladimir.oltean@nxp.com>
-
-[ Upstream commit 46baae56e1001a771a5d132aa883cb5605013ae2 ]
-
-Since commit 2f1e8ea726e9 ("net: dsa: link interfaces with the DSA
-master to get rid of lockdep warnings"), DSA gained a requirement which
-it did not fulfill, which is to unlink itself from the DSA master at
-shutdown time.
-
-Since the hellcreek driver was introduced after the bad commit, it has
-never worked with DSA masters which decide to unregister their
-net_device on shutdown, effectively hanging the reboot process.
-
-Hellcreek is a platform device driver, so we probably cannot have the
-oddities of ->shutdown and ->remove getting both called for the exact
-same struct device. But to be in line with the pattern from the other
-device drivers which are on slow buses, implement the same "if this then
-not that" pattern of either running the ->shutdown or the ->remove hook.
-The driver's current ->remove implementation makes that very easy
-because it already zeroes out its device_drvdata on ->remove.
-
-Fixes: e4b27ebc780f ("net: dsa: Add DSA driver for Hirschmann Hellcreek switches")
-Link: https://lore.kernel.org/netdev/20210909095324.12978-1-LinoSanfilippo@gmx.de/
-Reported-by: Lino Sanfilippo <LinoSanfilippo@gmx.de>
-Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
-Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
-Acked-by: Kurt Kanzenbach <kurt@linutronix.de>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/net/dsa/hirschmann/hellcreek.c | 16 ++++++++++++++++
- 1 file changed, 16 insertions(+)
-
-diff --git a/drivers/net/dsa/hirschmann/hellcreek.c b/drivers/net/dsa/hirschmann/hellcreek.c
-index 7062db6a083c..a0f5ec4f4e58 100644
---- a/drivers/net/dsa/hirschmann/hellcreek.c
-+++ b/drivers/net/dsa/hirschmann/hellcreek.c
-@@ -1915,6 +1915,9 @@ static int hellcreek_remove(struct platform_device *pdev)
- {
- struct hellcreek *hellcreek = platform_get_drvdata(pdev);
-
-+ if (!hellcreek)
-+ return 0;
-+
- hellcreek_hwtstamp_free(hellcreek);
- hellcreek_ptp_free(hellcreek);
- dsa_unregister_switch(hellcreek->ds);
-@@ -1923,6 +1926,18 @@ static int hellcreek_remove(struct platform_device *pdev)
- return 0;
- }
-
-+static void hellcreek_shutdown(struct platform_device *pdev)
-+{
-+ struct hellcreek *hellcreek = platform_get_drvdata(pdev);
-+
-+ if (!hellcreek)
-+ return;
-+
-+ dsa_switch_shutdown(hellcreek->ds);
-+
-+ platform_set_drvdata(pdev, NULL);
-+}
-+
- static const struct hellcreek_platform_data de1soc_r1_pdata = {
- .name = "r4c30",
- .num_ports = 4,
-@@ -1945,6 +1960,7 @@ MODULE_DEVICE_TABLE(of, hellcreek_of_match);
- static struct platform_driver hellcreek_driver = {
- .probe = hellcreek_probe,
- .remove = hellcreek_remove,
-+ .shutdown = hellcreek_shutdown,
- .driver = {
- .name = "hellcreek",
- .of_match_table = hellcreek_of_match,
---
-2.33.0
-