Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 868a4215 authored by Stas Sergeev's avatar Stas Sergeev Committed by David S. Miller
Browse files

net: phy: fixed_phy: handle link-down case



fixed_phy_register() currently hardcodes the fixed PHY link to 1, and
expects to find a "speed" parameter to provide correct information
towards the fixed PHY consumer.

In a subsequent change, where we allow "managed" (e.g: (RS)GMII in-band
status auto-negotiation) fixed PHYs, none of these parameters can be
provided since they will be auto-negotiated, hence, we just provide a
zero-initialized fixed_phy_status to fixed_phy_register() which makes it
fail when we call fixed_phy_update_regs() since status.speed = 0 which
makes us hit the "default" label and error out.

Without this change, we would also see potentially inconsistent
speed/duplex parameters for fixed PHYs when the link is DOWN.

CC: netdev@vger.kernel.org
CC: linux-kernel@vger.kernel.org
Signed-off-by: default avatarStas Sergeev <stsp@users.sourceforge.net>
[florian: add more background to why this is correct and desirable]
Signed-off-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d2eac98f
Loading
Loading
Loading
Loading
+5 −3
Original line number Original line Diff line number Diff line
@@ -52,6 +52,10 @@ static int fixed_phy_update_regs(struct fixed_phy *fp)
	u16 lpagb = 0;
	u16 lpagb = 0;
	u16 lpa = 0;
	u16 lpa = 0;


	if (!fp->status.link)
		goto done;
	bmsr |= BMSR_LSTATUS | BMSR_ANEGCOMPLETE;

	if (fp->status.duplex) {
	if (fp->status.duplex) {
		bmcr |= BMCR_FULLDPLX;
		bmcr |= BMCR_FULLDPLX;


@@ -96,15 +100,13 @@ static int fixed_phy_update_regs(struct fixed_phy *fp)
		}
		}
	}
	}


	if (fp->status.link)
		bmsr |= BMSR_LSTATUS | BMSR_ANEGCOMPLETE;

	if (fp->status.pause)
	if (fp->status.pause)
		lpa |= LPA_PAUSE_CAP;
		lpa |= LPA_PAUSE_CAP;


	if (fp->status.asym_pause)
	if (fp->status.asym_pause)
		lpa |= LPA_PAUSE_ASYM;
		lpa |= LPA_PAUSE_ASYM;


done:
	fp->regs[MII_PHYSID1] = 0;
	fp->regs[MII_PHYSID1] = 0;
	fp->regs[MII_PHYSID2] = 0;
	fp->regs[MII_PHYSID2] = 0;