Summary
On qcom-next the IQ-9075 EVK ethernet port (23040000.ethernet, QCA8081 PHY, phy-mode = "2500base-x") never gets a link against a 1G link partner: ethtool end0 shows Advertised link modes: 2500baseT/Full only, so autonegotiation with a 10/100/1000 switch cannot succeed. qcom-6.18.y on the same board autonegotiates 1Gbps/Full a few seconds after boot.
Downstream report: qualcomm-linux/meta-qcom#3200. That report had two parts; the first (missing at24/qca808x kernel modules in images that don't install every module) is a meta-qcom packaging bug fixed by qualcomm-linux/meta-qcom#3208 and affects 6.18 and 7.x alike. This issue is about the second part, which is kernel side and 7.x only.
Affected trees
| tree |
commit |
result |
qcom-6.18.y |
b6e015a3cb19 (tag qcom-6.18.y-20260914) |
link up, autoneg 1Gbps/Full |
qcom-next 7.2 |
d49c33864d06 (tag qcom-next-7.2-20260826) |
NO-CARRIER, advertises 2500baseT only |
qcom-next 7.3-rc2 |
8f69c5810aa3 (tag qcom-next-7.3-rc2-20260921, proposed in qualcomm-linux/meta-qcom#3203) |
same PHY/MAC code as 7.2, not booted yet |
Same board, same nodistro image apart from the kernel, same test sequence. Independent of the boot firmware: reproduced with the Qualcomm UEFI stack, the TF-A/FIP open-firmware flow and the U-Boot SPL flow.
Root cause
qcom-6.18.y carries
3f4a09a1ad2f FROMLIST: net: phy: qcom: qca808x: Add .get_rate_matching support
merged via #252. It returns RATE_MATCH_PAUSE for PHY_INTERFACE_MODE_2500BASEX, so phylink stops restricting the PHY's advertisement to link modes reachable over a fixed 2500BASE-X SerDes; its commit message shows exactly this before/after. That commit is not in qcom-next 7.2 nor in the 7.3-rc2 tag, and nothing equivalent is. git merge-tree shows it cherry-picks with zero conflicts onto both.
Upstream it was rejected (netdev, changes-requested, no v2 posted): https://lore.kernel.org/netdev/20250914-qca808x_rate_match-v1-1-0f9e6a331c3b@oss.qualcomm.com/
Russell King's point: the QCA8081 does not rate-match, it switches its SerDes between SGMII (<= 1G) and 2500BASE-X, so the patch only makes ethtool claim the lower speeds. It works in practice on 6.18 because dwmac-qcom-ethqos already reprograms the SerDes per negotiated speed (ethqos_fix_mac_speed_sgmii + ethqos_pcs_set_inband), and Mohd Ayaan Anwar (@ayaan-anwar) confirmed 1G and 2.5G both worked in the thread.
The upstream-acceptable fix he pointed at is on the MAC side: dwmac-qcom-ethqos should register plat->get_interfaces advertising both SGMII and 2500BASE-X, so phylink validates both and lets the PHY negotiate all speeds. That hook exists in stmmac since ca732e990fc8 ("net: stmmac: add get_interfaces() platform method", in 7.2 and 7.3) and is used by dwmac-intel, dwmac-rk and dwmac-spacemit, but dwmac-qcom-ethqos never sets it. A prototype of that was reported working for 1G and 2.5G in the same thread; nothing has been posted since.
Evidence
qcom-next 7.2, autoneg:
end0: PHY [stmmac-0:1c] driver [Qualcomm QCA8081] (irq=POLL)
end0: configuring for phy/2500base-x link mode
# ethtool end0
Advertised link modes: 2500baseT/Full
Auto-negotiation: on
Link detected: no
# ethtool -r end0 -> still no carrier after 25 s
# ethtool -s end0 speed 1000 duplex full autoneg off
end0: Link is Up - 1Gbps/Full - flow control off -> forcing the speed is the only way; DHCP and ping then work
qcom-6.18.y, same board:
end0: configuring for phy/2500base-x link mode
end0: Link is Up - 1Gbps/Full - flow control off -> 3 s later, no intervention
# ethtool end0
Advertised link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full
1000baseT/Full 2500baseT/Full
Speed: 1000Mb/s Auto-negotiation: on Link detected: yes
Workaround until fixed: ethtool -s end0 speed 1000 duplex full autoneg off.
Note: meta-qcom CI does not catch this because qcom-linux-testkit's ethEnsureLinkUpWithFallback forces 1000/full when autoneg fails; the 7.2 CI logs end with Auto-negotiation: off.
Ask
cc Mohd Ayaan Anwar (@ayaan-anwar) (author of the patch / #252), Salendarsingh Gaud (@sgaud-quic) (merged #252), Shiraz Hashim (@shashim-quic)
Send a v2 and have it in qcom-next.
Summary
On
qcom-nextthe IQ-9075 EVK ethernet port (23040000.ethernet, QCA8081 PHY,phy-mode = "2500base-x") never gets a link against a 1G link partner:ethtool end0showsAdvertised link modes: 2500baseT/Fullonly, so autonegotiation with a 10/100/1000 switch cannot succeed.qcom-6.18.yon the same board autonegotiates 1Gbps/Full a few seconds after boot.Downstream report: qualcomm-linux/meta-qcom#3200. That report had two parts; the first (missing
at24/qca808xkernel modules in images that don't install every module) is a meta-qcom packaging bug fixed by qualcomm-linux/meta-qcom#3208 and affects 6.18 and 7.x alike. This issue is about the second part, which is kernel side and 7.x only.Affected trees
qcom-6.18.yb6e015a3cb19(tagqcom-6.18.y-20260914)qcom-next7.2d49c33864d06(tagqcom-next-7.2-20260826)qcom-next7.3-rc28f69c5810aa3(tagqcom-next-7.3-rc2-20260921, proposed in qualcomm-linux/meta-qcom#3203)Same board, same nodistro image apart from the kernel, same test sequence. Independent of the boot firmware: reproduced with the Qualcomm UEFI stack, the TF-A/FIP open-firmware flow and the U-Boot SPL flow.
Root cause
qcom-6.18.ycarriesmerged via #252. It returns
RATE_MATCH_PAUSEforPHY_INTERFACE_MODE_2500BASEX, so phylink stops restricting the PHY's advertisement to link modes reachable over a fixed 2500BASE-X SerDes; its commit message shows exactly this before/after. That commit is not inqcom-next7.2 nor in the 7.3-rc2 tag, and nothing equivalent is.git merge-treeshows it cherry-picks with zero conflicts onto both.Upstream it was rejected (netdev, changes-requested, no v2 posted): https://lore.kernel.org/netdev/20250914-qca808x_rate_match-v1-1-0f9e6a331c3b@oss.qualcomm.com/
Russell King's point: the QCA8081 does not rate-match, it switches its SerDes between SGMII (<= 1G) and 2500BASE-X, so the patch only makes ethtool claim the lower speeds. It works in practice on 6.18 because
dwmac-qcom-ethqosalready reprograms the SerDes per negotiated speed (ethqos_fix_mac_speed_sgmii+ethqos_pcs_set_inband), and Mohd Ayaan Anwar (@ayaan-anwar) confirmed 1G and 2.5G both worked in the thread.The upstream-acceptable fix he pointed at is on the MAC side:
dwmac-qcom-ethqosshould registerplat->get_interfacesadvertising both SGMII and 2500BASE-X, so phylink validates both and lets the PHY negotiate all speeds. That hook exists in stmmac sinceca732e990fc8("net: stmmac: add get_interfaces() platform method", in 7.2 and 7.3) and is used by dwmac-intel, dwmac-rk and dwmac-spacemit, but dwmac-qcom-ethqos never sets it. A prototype of that was reported working for 1G and 2.5G in the same thread; nothing has been posted since.Evidence
qcom-next 7.2, autoneg:
qcom-6.18.y, same board:
Workaround until fixed:
ethtool -s end0 speed 1000 duplex full autoneg off.Note: meta-qcom CI does not catch this because qcom-linux-testkit's
ethEnsureLinkUpWithFallbackforces 1000/full when autoneg fails; the 7.2 CI logs end withAuto-negotiation: off.Ask
cc Mohd Ayaan Anwar (@ayaan-anwar) (author of the patch / #252), Salendarsingh Gaud (@sgaud-quic) (merged #252), Shiraz Hashim (@shashim-quic)
Send a v2 and have it in qcom-next.