lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Thu, 31 Mar 2022 16:26:47 +0200 From: Andrew Lunn <andrew@...n.ch> To: "huangguangbin (A)" <huangguangbin2@...wei.com> Cc: davem@...emloft.net, kuba@...nel.org, o.rempel@...gutronix.de, netdev@...r.kernel.org, linux-kernel@...r.kernel.org, lipeng321@...wei.com, chenhao288@...ilicon.com Subject: Re: [PATCH] net: phy: genphy_loopback: fix loopback failed when speed is unknown > In this case, as speed and duplex both are unknown, ctl is just set to 0x4000. > However, the follow code sets mask to ~0 for function phy_modify(): > int genphy_loopback(struct phy_device *phydev, bool enable) > { > if (enable) { > ... > phy_modify(phydev, MII_BMCR, ~0, ctl); > ... > } > so all other bits of BMCR will be cleared and just set bit 14, I use phy trace to > prove that: > > $ cat /sys/kernel/debug/tracing/trace > # tracer: nop > # > # entries-in-buffer/entries-written: 923/923 #P:128 > # > # _-----=> irqs-off/BH-disabled > # / _----=> need-resched > # | / _---=> hardirq/softirq > # || / _--=> preempt-depth > # ||| / _-=> migrate-disable > # |||| / delay > # TASK-PID CPU# ||||| TIMESTAMP FUNCTION > # | | | ||||| | | > kworker/u257:2-694 [015] ..... 209.263912: mdio_access: mii-0000:bd:00.1 read phy:0x03 reg:0x00 val:0x1040 > kworker/u257:2-694 [015] ..... 209.263951: mdio_access: mii-0000:bd:00.1 read phy:0x03 reg:0x01 val:0x7989 > kworker/u257:2-694 [015] ..... 209.263990: mdio_access: mii-0000:bd:00.1 read phy:0x03 reg:0x01 val:0x7989 > kworker/u257:2-694 [015] ..... 209.264028: mdio_access: mii-0000:bd:00.1 read phy:0x03 reg:0x09 val:0x0200 > kworker/u257:2-694 [015] ..... 209.264067: mdio_access: mii-0000:bd:00.1 read phy:0x03 reg:0x0a val:0x0000 > ethtool-1148 [007] ..... 209.665693: mdio_access: mii-0000:bd:00.1 read phy:0x03 reg:0x00 val:0x1040 > ethtool-1148 [007] ..... 209.665706: mdio_access: mii-0000:bd:00.1 write phy:0x03 reg:0x00 val:0x1840 > ethtool-1148 [007] ..... 210.588139: mdio_access: mii-0000:bd:00.1 read phy:0x03 reg:0x00 val:0x1840 > ethtool-1148 [007] ..... 210.588152: mdio_access: mii-0000:bd:00.1 write phy:0x03 reg:0x00 val:0x1040 > ethtool-1148 [007] ..... 210.615900: mdio_access: mii-0000:bd:00.1 read phy:0x03 reg:0x00 val:0x1040 > ethtool-1148 [007] ..... 210.615912: mdio_access: mii-0000:bd:00.1 write phy:0x03 reg:0x00 val:0x4000 //here just set bit 14 > > So phy speed will be set to 10M in this case, if previous speed of > device before going down is 10M, loopback test is pass. Only > previous speed is 100M or 1000M, loopback test is failed. O.K. So it should be set into 10M half duplex. But why does this cause it not to loopback packets? Does the PHY you are using not actually support 10 Half? Why does it need to be the same speed as when the link was up? And why does it actually set LSTATUS indicating there is link? Is this a generic problem, all PHYs are like this, or is this specific to the PHY you are using? Maybe this PHY needs its own loopback function because it does something odd? Andrew
Powered by blists - more mailing lists