rswitch: Fix renesas_eth_sw_remove() implementation
authorYoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Tue, 10 Oct 2023 12:48:57 +0000 (21:48 +0900)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 12 Oct 2023 09:22:21 +0000 (11:22 +0200)
Fix functions calling order and a condition in renesas_eth_sw_remove().
Otherwise, kernel NULL pointer dereference happens from phy_stop() if
a net device opens.

Fixes: 3590918b5d07 ("net: ethernet: renesas: Add support for "Ethernet Switch"")
Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/renesas/rswitch.c

index fc01ad3..4d7c482 100644 (file)
@@ -1964,15 +1964,17 @@ static void rswitch_deinit(struct rswitch_private *priv)
        rswitch_gwca_hw_deinit(priv);
        rcar_gen4_ptp_unregister(priv->ptp_priv);
 
-       for (i = 0; i < RSWITCH_NUM_PORTS; i++) {
+       rswitch_for_each_enabled_port(priv, i) {
                struct rswitch_device *rdev = priv->rdev[i];
 
-               phy_exit(priv->rdev[i]->serdes);
-               rswitch_ether_port_deinit_one(rdev);
                unregister_netdev(rdev->ndev);
-               rswitch_device_free(priv, i);
+               rswitch_ether_port_deinit_one(rdev);
+               phy_exit(priv->rdev[i]->serdes);
        }
 
+       for (i = 0; i < RSWITCH_NUM_PORTS; i++)
+               rswitch_device_free(priv, i);
+
        rswitch_gwca_ts_queue_free(priv);
        rswitch_gwca_linkfix_free(priv);