net: sparx5: fix error handling in sparx5_port_open()
authorLiu Jian <liujian56@huawei.com>
Thu, 17 Nov 2022 12:59:18 +0000 (20:59 +0800)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 22 Nov 2022 10:41:49 +0000 (11:41 +0100)
If phylink_of_phy_connect() fails, the port should be disabled.
If sparx5_serdes_set()/phy_power_on() fails, the port should be
disabled and the phylink should be stopped and disconnected.

Fixes: 946e7fd5053a ("net: sparx5: add port module support")
Fixes: f3cad2611a77 ("net: sparx5: add hostmode with phylink support")
Signed-off-by: Liu Jian <liujian56@huawei.com>
Tested-by: Bjarni Jonasson <bjarni.jonasson@microchip.com>
Reviewed-by: Steen Hegelund <steen.hegelund@microchip.com>
Link: https://lore.kernel.org/r/20221117125918.203997-1-liujian56@huawei.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/microchip/sparx5/sparx5_netdev.c

index 19516ccad5338c511c8e2ea132cb55681034a468..d078156581d547174255b267e41c4e005976f3c6 100644 (file)
@@ -104,7 +104,7 @@ static int sparx5_port_open(struct net_device *ndev)
        err = phylink_of_phy_connect(port->phylink, port->of_node, 0);
        if (err) {
                netdev_err(ndev, "Could not attach to PHY\n");
-               return err;
+               goto err_connect;
        }
 
        phylink_start(port->phylink);
@@ -116,10 +116,20 @@ static int sparx5_port_open(struct net_device *ndev)
                        err = sparx5_serdes_set(port->sparx5, port, &port->conf);
                else
                        err = phy_power_on(port->serdes);
-               if (err)
+               if (err) {
                        netdev_err(ndev, "%s failed\n", __func__);
+                       goto out_power;
+               }
        }
 
+       return 0;
+
+out_power:
+       phylink_stop(port->phylink);
+       phylink_disconnect_phy(port->phylink);
+err_connect:
+       sparx5_port_enable(port, false);
+
        return err;
 }