phy: fixed link 1000 or 100 set with autoneg off

From: Jia, Fang
Date: Mon Oct 23 2023 - 03:03:36 EST


Hi Experts,

We use NXP LS1046 board and face an issue about the eth interface speed.

1) Scenario

we set fixed link 1000Mb/s in device tree.

However, after we set the auto-neg off, then the eth1's speed changed to 10M and Duplex changed to Half.
The value of /sys/class/net/eth1/speed is 10 and /sys/class/net/eth1/duplex is half

2) Log is as following.

# ifconfig eth1 up
# ethtool eth1
Settings for eth1:
Supported ports: [ MII ]
Supported link modes: 1000baseT/Full
Supported pause frame use: Symmetric Receive-only
Supports auto-negotiation: Yes

Supported FEC modes: Not reported

Advertised link modes: 1000baseT/Full
Advertised pause frame use: Symmetric Receive-only

Advertised auto-negotiation: Yes
Advertised FEC modes: Not reported
Speed: 1000Mb/s
Duplex: Full
Port: MII
PHYAD: 1
Transceiver: internal
Auto-negotiation: on
Supports Wake-on: d
Wake-on: d
Current message level: 0xffffffff (-1)
drv probe link timer ifdown ifup rx_err tx_err tx_queued intr tx_done rx_status pktdata hw wol 0xffff8000
Link detected: yes

# ethtool -s eth1 autoneg off
# ethtool eth1
Settings for eth1:
Supported ports: [ MII ]
Supported link modes: 1000baseT/Full
Supported pause frame use: Symmetric Receive-only
Supports auto-negotiation: Yes
Supported FEC modes: Not reported
Advertised link modes: 1000baseT/Full
Advertised pause frame use: Symmetric Receive-only
Advertised auto-negotiation: No
Advertised FEC modes: Not reported
Speed: 10Mb/s
Duplex: Half
Port: MII
PHYAD: 1
Transceiver: internal
Auto-negotiation: off
Supports Wake-on: d
Wake-on: d
Current message level: 0xffffffff (-1)
drv probe link timer ifdown ifup rx_err tx_err tx_queued intr tx_done rx_status pktdata hw wol 0xffff8000
Link detected: yes

3) After code tracing, we found that:

phy_state_machine()
state PHY_RUNNING: phy_check_link_status()
phy_read_status()
genphy_read_status()
genphy_read_status_fixed()

In genphy_read_status_fixed(), the speed and duplex changed.
It seems like the bmcr value is always 0x1000 from swphy_read_reg().

After revert the commit 726097d6d6d(net: phy: improve auto-neg emulation in swphy), then the Speed and Duplex shown comes back to 1000M and Full.

Could you please take a look it ? Can we revert this commit, is there any side impact ?

Best Regards,
Fang