On Mon, May 8, 2017 at 10:34 PM, David Miller <da...@davemloft.net> wrote: > From: Alexandru Ardelean <ardeleana...@gmail.com> > Date: Mon, 8 May 2017 14:31:18 +0300 > >> Looking at xgmac_wait_until_done() and xgmac_wait_until_free() >> functions, they seem to have turned out completely identical. >> >> Though, judging from the git history it seems they >> initially weren't. >> >> Remove xgmac_wait_until_free() in favor of xgmac_wait_until_done(). >> >> Signed-off-by: Alexandru Ardelean <ardeleana...@gmail.com> > > This situation got created by the commit below, I wonder if it > is even correct. > > Certainly the original author of this code intended the MDIO > _data_ rather than the _status_ register to be polled. > > Otherwise, why in the world have two functions which are in > every other regard identical?
[ Removed shaohui....@nxp.com email from thread ; seems email addr no longer valid ]. I should have added an RFC tag. Thing is, we just use this driver, so, I can't offer much input here. I was debugging [a while ago] some other issue related to this and stumbled over this. I haven't seem any obvious issues yet, to suggest one thing or or the other [regarding polling status or data registers]. I would have liked some input from some NXP/Freescale people on this email list. Or maybe I could forward this to more people that contribute the NXP eco-system. If you have any suggestions, please advise and I'll adapt. Thanks Alex > > commit 26eee0210ad72a29eb4a70b34320bda266f91a0d > Author: Shaohui Xie <shaohui....@freescale.com> > Date: Mon Mar 16 18:55:50 2015 +0800 > > net/fsl: fix a bug in xgmac_mdio > > There is a bug in xgmac_wait_until_done() which mdio_stat should be used > instead of mdio_data when checking if busy bit is cleared. > > Signed-off-by: Shaohui Xie <shaohui....@freescale.com> > Signed-off-by: David S. Miller <da...@davemloft.net> > > diff --git a/drivers/net/ethernet/freescale/xgmac_mdio.c > b/drivers/net/ethernet/freescale/xgmac_mdio.c > index 3a83bc2..5f691f2 100644 > --- a/drivers/net/ethernet/freescale/xgmac_mdio.c > +++ b/drivers/net/ethernet/freescale/xgmac_mdio.c > @@ -79,7 +79,7 @@ static int xgmac_wait_until_done(struct device *dev, > > /* Wait till the MDIO write is complete */ > timeout = TIMEOUT; > - while ((ioread32be(®s->mdio_data) & MDIO_DATA_BSY) && timeout) { > + while ((ioread32be(®s->mdio_stat) & MDIO_STAT_BSY) && timeout) { > cpu_relax(); > timeout--; > }