@@ -539,6 +539,19 @@ static void mlxbf_gige_shutdown(struct platform_device *pdev)
{
struct mlxbf_gige *priv = platform_get_drvdata(pdev);
+ /* The Vitesse PHY is stuck in a non working state during the reboot test.
+ * The only way to recover was to toggle the PHY hard reset signal.
+ * Unfortunately, software does not have a way to toggle the PHY hard reset.
+ * We found that suspending the PHY before reboot might prevent the PHY
+ * from entering this stuck state.
+ *
+ * Note that dev_close() calls phy_suspend() but the vitesse PHY does
+ * not define the suspend function. This is why we need to explicitly call
+ * it here.
+ */
+ if (priv->hw_version == MLXBF_GIGE_BLUEFIELD3)
+ genphy_suspend(priv->netdev->phydev);
+
rtnl_lock();
netif_device_detach(priv->netdev);