[SRU][F][PULL][PATCH v2 06/23] Revert "UBUNTU: SAUCE: Fix intermittent OOB link up issue"
Asmaa Mnebhi
asmaa at nvidia.com
Fri Jul 9 19:08:13 UTC 2021
BugLink: https://bugs.launchpad.net/bugs/1934923
This reverts commit a354f8cd7c1e1e7c89a314c1ffc8c724e52758fc.
Signed-off-by: Asmaa Mnebhi <asmaa at nvidia.com>
---
.../mellanox/mlxbf_gige/mlxbf_gige_main.c | 39 ++++++++++++++-----
.../mellanox/mlxbf_gige/mlxbf_gige_mdio.c | 4 +-
2 files changed, 31 insertions(+), 12 deletions(-)
diff --git a/drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_main.c b/drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_main.c
index 63ea74ad5ee5..85a7ce19a6ff 100644
--- a/drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_main.c
+++ b/drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_main.c
@@ -21,7 +21,7 @@
#include "mlxbf_gige_regs.h"
#define DRV_NAME "mlxbf_gige"
-#define DRV_VERSION "1.14"
+#define DRV_VERSION "1.10"
static void mlxbf_gige_set_mac_rx_filter(struct mlxbf_gige *priv,
unsigned int index, u64 dmac)
@@ -862,18 +862,34 @@ static int mlxbf_gige_clean_port(struct mlxbf_gige *priv)
return err;
}
-static int mlxbf_gige_phy_disable_interrupt(struct phy_device *phydev)
+static int mlxbf_gige_phy_enable_interrupt(struct phy_device *phydev)
{
int err = 0;
- phydev->interrupts = PHY_INTERRUPT_DISABLED;
- if (phydev->drv->config_intr)
- err = phydev->drv->config_intr(phydev);
+ if (phydev->drv->ack_interrupt)
+ err = phydev->drv->ack_interrupt(phydev);
if (err < 0)
return err;
+ phydev->interrupts = PHY_INTERRUPT_ENABLED;
+ if (phydev->drv->config_intr)
+ err = phydev->drv->config_intr(phydev);
+
+ return err;
+}
+
+static int mlxbf_gige_phy_disable_interrupt(struct phy_device *phydev)
+{
+ int err = 0;
+
if (phydev->drv->ack_interrupt)
err = phydev->drv->ack_interrupt(phydev);
+ if (err < 0)
+ return err;
+
+ phydev->interrupts = PHY_INTERRUPT_DISABLED;
+ if (phydev->drv->config_intr)
+ err = phydev->drv->config_intr(phydev);
return err;
}
@@ -899,10 +915,15 @@ static int mlxbf_gige_open(struct net_device *netdev)
if (err)
return err;
- phydev->irq = priv->phy_irq;
- mlxbf_gige_mdio_enable_phy_int(priv);
-
phy_start(phydev);
+ /* Always make sure interrupts are enabled since phy_start calls
+ * __phy_resume which may reset the PHY interrupt control reg.
+ * __phy_resume only reenables the interrupts if
+ * phydev->irq != IRQ_IGNORE_INTERRUPT.
+ */
+ err = mlxbf_gige_phy_enable_interrupt(phydev);
+ if (err)
+ return err;
netif_napi_add(netdev, &priv->napi, mlxbf_gige_poll, NAPI_POLL_WEIGHT);
napi_enable(&priv->napi);
@@ -1271,8 +1292,6 @@ static int mlxbf_gige_remove(struct platform_device *pdev)
struct mlxbf_gige *priv = platform_get_drvdata(pdev);
unregister_netdev(priv->netdev);
- priv->netdev->phydev->irq = PHY_IGNORE_INTERRUPT;
- mlxbf_gige_phy_disable_interrupt(priv->netdev->phydev);
phy_disconnect(priv->netdev->phydev);
mlxbf_gige_mdio_remove(priv);
platform_set_drvdata(pdev, NULL);
diff --git a/drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_mdio.c b/drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_mdio.c
index 4b063330ec28..636e19cf7050 100644
--- a/drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_mdio.c
+++ b/drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_mdio.c
@@ -161,7 +161,7 @@ static void mlxbf_gige_mdio_disable_phy_int(struct mlxbf_gige *priv)
spin_unlock_irqrestore(&priv->gpio_lock, flags);
}
-void mlxbf_gige_mdio_enable_phy_int(struct mlxbf_gige *priv)
+static void mlxbf_gige_mdio_enable_phy_int(struct mlxbf_gige *priv)
{
unsigned long flags;
u32 val;
@@ -258,7 +258,7 @@ int mlxbf_gige_mdio_probe(struct platform_device *pdev, struct mlxbf_gige *priv)
phy_int_gpio = MLXBF_GIGE_GPIO12_BIT;
priv->phy_int_gpio_mask = BIT(phy_int_gpio);
- mlxbf_gige_mdio_disable_phy_int(priv);
+ mlxbf_gige_mdio_enable_phy_int(priv);
priv->mdiobus = devm_mdiobus_alloc(dev);
if (!priv->mdiobus) {
--
2.30.1
More information about the kernel-team
mailing list