> -----Original Message----- > From: Florian Fainelli [mailto:f.faine...@gmail.com] > Sent: Wednesday, March 20, 2019 11:37 AM > To: liweihang <liweih...@hisilicon.com>; Phil Reid > <pr...@electromag.com.au>; netdev@vger.kernel.org > Cc: Andrew Lunn <and...@lunn.ch>; David S. Miller > <da...@davemloft.net>; dongsheng.w...@hxt-semitech.com; > cphe...@gmail.com; clemens.gru...@pqgruber.com; hkallwe...@gmail.com; > n...@nbd.name; harini.kata...@xilinx.com > Subject: Re: regression from: net: phy: marvell: Avoid unnecessary soft reset > > > > On 3/19/2019 7:34 PM, liweihang wrote: > > Hi all, > > > > I've met a similar issue and sent an email to discuss about it before: > > Question about setting speed and duplex failed after auto-negotiation > > disabled on marvell phy > > > > d6ab93364734 net: phy: marvell: Avoid unnecessary soft reset I > > reverted this patch and the auto-negotiation works ok. > > > > Florian, could you please read my previous email and give me some advice? > > If you can copy the patch author on that email the next time that will help > expedite things. > > So the problem seems to come from the fact that unless the BCMR_RESET bit > is written, then m88e1121_config_aneg_rgmii_delays() has no effect, does > that sound like what you are observing? > > Does the following work for you (Phil and yourself)?
Thank you, Florian. But that didn't work for me either. I think the key question is as what Heiner said, some bits need to be preserved. The MII_BMCR contained information of speed and duplex mode, but when we call genphy_soft_reset(), these bits will be cleared. > > diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c index > 3ccba37bd6dd..6a1ea4c2042a 100644 > --- a/drivers/net/phy/marvell.c > +++ b/drivers/net/phy/marvell.c > @@ -448,6 +448,10 @@ static int m88e1121_config_aneg(struct phy_device > *phydev) > err = m88e1121_config_aneg_rgmii_delays(phydev); > if (err < 0) > return err; > + > + err = genphy_soft_reset(phydev); > + if (err < 0) > + return err; > } > > err = marvell_set_polarity(phydev, phydev->mdix_ctrl); >