On 27.08.2019 10:29, shenjian (K) wrote: > > > 在 2019/8/27 13:51, Heiner Kallweit 写道: >> On 27.08.2019 04:47, Jian Shen wrote: >>> Some ethernet drivers may call phy_start() and phy_stop() from >>> ndo_open and ndo_close() respectively. >>> >>> When network cable is unconnected, and operate like below: >>> step 1: ifconfig ethX up -> ndo_open -> phy_start ->start >>> autoneg, and phy is no link. >>> step 2: ifconfig ethX down -> ndo_close -> phy_stop -> just stop >>> phy state machine. >>> step 3: plugin the network cable, and autoneg complete, then >>> LED for link status will be on. >>> step 4: ethtool ethX --> see the result of "Link detected" is no. >>> >> Step 3 and 4 seem to be unrelated to the actual issue. >> With which MAC + PHY driver did you observe this? >> > Thanks Heiner, > > I tested this on HNS3 driver, with two phy, Marvell 88E1512 and RTL8211. > > Step 3 and Step 4 is just to describe that the LED of link shows link up, > but the port information shows no link. > ethtool refers to the link at MAC level. Therefore default implementation ethtool_op_get_link just returns the result of netif_carrier_ok(). Also using PHY link status if interface is down doesn't really make sense: - phylib state machine isn't running, therefore PHY status doesn't get updated - often MAC drivers shut down parts of the MAC on ndo_close, this typically makes the internal MDIO bus unaccessible So just remove steps 3 and 4. The patch itself is fine with me.
> >>> This patch forces phy suspend even phydev->link is off. >>> >>> Signed-off-by: Jian Shen <shenjia...@huawei.com> >>> --- >>> drivers/net/phy/phy.c | 2 +- >>> 1 file changed, 1 insertion(+), 1 deletion(-) >>> >>> diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c >>> index f3adea9..0acd5b4 100644 >>> --- a/drivers/net/phy/phy.c >>> +++ b/drivers/net/phy/phy.c >>> @@ -911,8 +911,8 @@ void phy_state_machine(struct work_struct *work) >>> if (phydev->link) { >>> phydev->link = 0; >>> phy_link_down(phydev, true); >>> - do_suspend = true; >>> } >>> + do_suspend = true; >>> break; >>> } >>> >>> >> Heiner >> >> > >