Skip to content
/ linux Public

Commit ff4d5a3

Browse files
danish-tigregkh
authored andcommitted
net: ti: icssg-prueth: Fix ping failure after offload mode setup when link speed is not 1G
[ Upstream commit 147792c ] When both eth interfaces with links up are added to a bridge or hsr interface, ping fails if the link speed is not 1Gbps (e.g., 100Mbps). The issue is seen because when switching to offload (bridge/hsr) mode, prueth_emac_restart() restarts the firmware and clears DRAM with memset_io(), setting all memory to 0. This includes PORT_LINK_SPEED_OFFSET which firmware reads for link speed. The value 0 corresponds to FW_LINK_SPEED_1G (0x00), so for 1Gbps links the default value is correct and ping works. For 100Mbps links, the firmware needs FW_LINK_SPEED_100M (0x01) but gets 0 instead, causing ping to fail. The function emac_adjust_link() is called to reconfigure, but it detects no state change (emac->link is still 1, speed/duplex match PHY) so new_state remains false and icssg_config_set_speed() is never called to correct the firmware speed value. The fix resets emac->link to 0 before calling emac_adjust_link() in prueth_emac_common_start(). This forces new_state=true, ensuring icssg_config_set_speed() is called to write the correct speed value to firmware memory. Fixes: 06feac1 ("net: ti: icssg-prueth: Fix emac link speed handling") Signed-off-by: MD Danish Anwar <danishanwar@ti.com> Link: https://patch.msgid.link/20260226102356.2141871-1-danishanwar@ti.com Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent 2d9f57e commit ff4d5a3

File tree

1 file changed

+8
-0
lines changed

1 file changed

+8
-0
lines changed

drivers/net/ethernet/ti/icssg/icssg_prueth.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,14 @@ static int prueth_emac_common_start(struct prueth *prueth)
307307
if (ret)
308308
goto disable_class;
309309

310+
/* Reset link state to force reconfiguration in
311+
* emac_adjust_link(). Without this, if the link was already up
312+
* before restart, emac_adjust_link() won't detect any state
313+
* change and will skip critical configuration like writing
314+
* speed to firmware.
315+
*/
316+
emac->link = 0;
317+
310318
mutex_lock(&emac->ndev->phydev->lock);
311319
emac_adjust_link(emac->ndev);
312320
mutex_unlock(&emac->ndev->phydev->lock);

0 commit comments

Comments
 (0)