net: enetc: fix the incorrect clearing of IF_MODE bits
[ Upstream commit 325fd36ae76a6d089983b2d2eccb41237d35b221 ] The enetc phylink .mac_config handler intends to clear the IFMODE field (bits 1:0) of the PM0_IF_MODE register, but incorrectly clears all the other fields instead. For normal operation, the bug was inconsequential, due to the fact that we write the PM0_IF_MODE register in two stages, first in phylink .mac_config (which incorrectly cleared out a bunch of stuff), then we update the speed and duplex to the correct values in phylink .mac_link_up. Judging by the code (not tested), it looks like maybe loopback mode was broken, since this is one of the settings in PM0_IF_MODE which is incorrectly cleared. Fixes: c76a97218dcb ("net: enetc: force the RGMII speed and duplex instead of operating in inband mode") Reported-by: Pavel Machek (CIP) <pavel@denx.de> Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
5ee40530b0
commit
b22c5e2c8e
@@ -504,8 +504,7 @@ static void enetc_mac_config(struct enetc_hw *hw, phy_interface_t phy_mode)
|
|||||||
|
|
||||||
if (phy_interface_mode_is_rgmii(phy_mode)) {
|
if (phy_interface_mode_is_rgmii(phy_mode)) {
|
||||||
val = enetc_port_rd(hw, ENETC_PM0_IF_MODE);
|
val = enetc_port_rd(hw, ENETC_PM0_IF_MODE);
|
||||||
val &= ~ENETC_PM0_IFM_EN_AUTO;
|
val &= ~(ENETC_PM0_IFM_EN_AUTO | ENETC_PM0_IFM_IFMODE_MASK);
|
||||||
val &= ENETC_PM0_IFM_IFMODE_MASK;
|
|
||||||
val |= ENETC_PM0_IFM_IFMODE_GMII | ENETC_PM0_IFM_RG;
|
val |= ENETC_PM0_IFM_IFMODE_GMII | ENETC_PM0_IFM_RG;
|
||||||
enetc_port_wr(hw, ENETC_PM0_IF_MODE, val);
|
enetc_port_wr(hw, ENETC_PM0_IF_MODE, val);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user