Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

net: ti: icssg-prueth: Fix ping failure after offload mode setup when link speed is not 1G

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: 06feac15406f ("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>

authored by

MD Danish Anwar and committed by
Jakub Kicinski
147792c3 101bacb3

+8
+8
drivers/net/ethernet/ti/icssg/icssg_prueth.c
··· 273 273 if (ret) 274 274 goto disable_class; 275 275 276 + /* Reset link state to force reconfiguration in 277 + * emac_adjust_link(). Without this, if the link was already up 278 + * before restart, emac_adjust_link() won't detect any state 279 + * change and will skip critical configuration like writing 280 + * speed to firmware. 281 + */ 282 + emac->link = 0; 283 + 276 284 mutex_lock(&emac->ndev->phydev->lock); 277 285 emac_adjust_link(emac->ndev); 278 286 mutex_unlock(&emac->ndev->phydev->lock);