Commit 519d6487 authored by Xu Liang's avatar Xu Liang Committed by Jakub Kicinski
Browse files

net: phy: mxl-gpy: extend interrupt fix to all impacted variants



The interrupt fix in commit 97a89ed1 should be applied on all variants
of GPY2xx PHY and GPY115C.

Fixes: 97a89ed1 ("net: phy: mxl-gpy: disable interrupts on GPY215 by default")
Signed-off-by: default avatarXu Liang <lxu@maxlinear.com>
Reviewed-by: default avatarSimon Horman <simon.horman@corigine.com>
Link: https://lore.kernel.org/r/20230531074822.39136-1-lxu@maxlinear.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent a60caf03
Loading
Loading
Loading
Loading
+3 −13
Original line number Diff line number Diff line
@@ -274,13 +274,6 @@ static int gpy_config_init(struct phy_device *phydev)
	return ret < 0 ? ret : 0;
}

static bool gpy_has_broken_mdint(struct phy_device *phydev)
{
	/* At least these PHYs are known to have broken interrupt handling */
	return phydev->drv->phy_id == PHY_ID_GPY215B ||
	       phydev->drv->phy_id == PHY_ID_GPY215C;
}

static int gpy_probe(struct phy_device *phydev)
{
	struct device *dev = &phydev->mdio.dev;
@@ -300,8 +293,7 @@ static int gpy_probe(struct phy_device *phydev)
	phydev->priv = priv;
	mutex_init(&priv->mbox_lock);

	if (gpy_has_broken_mdint(phydev) &&
	    !device_property_present(dev, "maxlinear,use-broken-interrupts"))
	if (!device_property_present(dev, "maxlinear,use-broken-interrupts"))
		phydev->dev_flags |= PHY_F_NO_IRQ;

	fw_version = phy_read(phydev, PHY_FWV);
@@ -659,11 +651,9 @@ static irqreturn_t gpy_handle_interrupt(struct phy_device *phydev)
	 * frame. Therefore, polling is the best we can do and won't do any more
	 * harm.
	 * It was observed that this bug happens on link state and link speed
	 * changes on a GPY215B and GYP215C independent of the firmware version
	 * (which doesn't mean that this list is exhaustive).
	 * changes independent of the firmware version.
	 */
	if (gpy_has_broken_mdint(phydev) &&
	    (reg & (PHY_IMASK_LSTC | PHY_IMASK_LSPC))) {
	if (reg & (PHY_IMASK_LSTC | PHY_IMASK_LSPC)) {
		reg = gpy_mbox_read(phydev, REG_GPIO0_OUT);
		if (reg < 0) {
			phy_error(phydev);