mirror of
https://github.com/torvalds/linux.git
synced 2026-03-08 04:04:43 +01:00
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: 06feac1540 ("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>
This commit is contained in:
parent
101bacb303
commit
147792c395
1 changed files with 8 additions and 0 deletions
|
|
@ -273,6 +273,14 @@ static int prueth_emac_common_start(struct prueth *prueth)
|
|||
if (ret)
|
||||
goto disable_class;
|
||||
|
||||
/* Reset link state to force reconfiguration in
|
||||
* emac_adjust_link(). Without this, if the link was already up
|
||||
* before restart, emac_adjust_link() won't detect any state
|
||||
* change and will skip critical configuration like writing
|
||||
* speed to firmware.
|
||||
*/
|
||||
emac->link = 0;
|
||||
|
||||
mutex_lock(&emac->ndev->phydev->lock);
|
||||
emac_adjust_link(emac->ndev);
|
||||
mutex_unlock(&emac->ndev->phydev->lock);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue