[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <478f871a-583d-01f1-9cc5-2eea56d8c2a7@huawei.com>
Date: Tue, 12 May 2020 20:48:21 +0800
From: Yonglong Liu <liuyonglong@...wei.com>
To: Andrew Lunn <andrew@...n.ch>,
Heiner Kallweit <hkallweit1@...il.com>,
"David S. Miller" <davem@...emloft.net>
CC: <netdev@...r.kernel.org>,
"linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org>,
<linuxarm@...wei.com>, Salil Mehta <salil.mehta@...wei.com>
Subject: [question] net: phy: rtl8211f: link speed shows 1000Mb/s but actual
link speed in phy is 100Mb/s
I use two devices, both support 1000M speed, they are directly connected
with a network cable. Two devices enable autoneg, and then do the following
test repeatedly:
ifconfig eth5 down
ifconfig eth5 up
sleep $((RANDOM%6))
ifconfig eth5 down
ifconfig eth5 up
sleep 10
With low probability, one device A link up with 100Mb/s, the other B link up with
1000Mb/s(the actual link speed read from phy is 100Mb/s), and the network can
not work.
device A:
Settings for eth5:
Supported ports: [ TP ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Supported pause frame use: Symmetric Receive-only
Supports auto-negotiation: Yes
Supported FEC modes: Not reported
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Advertised pause frame use: Symmetric
Advertised auto-negotiation: Yes
Advertised FEC modes: Not reported
Link partner advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
Link partner advertised pause frame use: Symmetric
Link partner advertised auto-negotiation: Yes
Link partner advertised FEC modes: Not reported
Speed: 100Mb/s
Duplex: Full
Port: MII
PHYAD: 3
Transceiver: internal
Auto-negotiation: on
Current message level: 0x00000036 (54)
probe link ifdown ifup
Link detected: yes
The regs value read from mdio are:
reg 9 = 0x200
reg a = 0
device B:
Settings for eth5:
Supported ports: [ TP ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Supported pause frame use: Symmetric Receive-only
Supports auto-negotiation: Yes
Supported FEC modes: Not reported
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Advertised pause frame use: Symmetric
Advertised auto-negotiation: Yes
Advertised FEC modes: Not reported
Link partner advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Link partner advertised pause frame use: Symmetric
Link partner advertised auto-negotiation: Yes
Link partner advertised FEC modes: Not reported
Speed: 1000Mb/s
Duplex: Full
Port: MII
PHYAD: 3
Transceiver: internal
Auto-negotiation: on
Current message level: 0x00000036 (54)
probe link ifdown ifup
Link detected: yes
The regs value read from mdio are:
reg 9 = 0
reg a = 0x800
I had talk to the FAE of rtl8211f, they said if negotiation failed with 1000Mb/s,
rtl8211f will change reg 9 to 0, than try to negotiation with 100Mb/s.
The problem happened as:
ifconfig eth5 up -> phy_start -> phy_start_aneg -> phy_modify_changed(MII_CTRL1000)
(this time both A and B, reg 9 = 0x200) -> wait for link up -> (B: reg 9 changed to 0)
-> link up.
I think this is the bug of the rtl8211f itself, any one have an idea to avoid this bug?
When link up, update phydev->advertising before notify the eth driver, is this method
suitable? (phydev->advertising is config from user, if user just set one speed 1000M,
it's hard to )
Powered by blists - more mailing lists