[PATCH 2/2] net: xilinx_emaclite: recheck condition after timeout in mdio_wait()
From: Radhey Shyam Pandey <hidden>
Date: 2018-10-30 12:58:46
Also in:
lkml, netdev
<snip>
On Tue, Oct 30, 2018 at 10:31:39AM +0100, Kurt Kanzenbach wrote:quoted
The function could report a false positive if it gets preempted betweenreadingquoted
the XEL_MDIOCTRL_OFFSET register and checking for the timeout. In such acase,quoted
the condition has to be rechecked to avoid false positives. Therefore, check for expected condition even after the timeout occurred. Signed-off-by: Kurt Kanzenbach <kurt@linutronix.de> --- drivers/net/ethernet/xilinx/xilinx_emaclite.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-)diff --git a/drivers/net/ethernet/xilinx/xilinx_emaclite.cb/drivers/net/ethernet/xilinx/xilinx_emaclite.cquoted
index 639e3e99af46..957d03085bd0 100644--- a/drivers/net/ethernet/xilinx/xilinx_emaclite.c +++ b/drivers/net/ethernet/xilinx/xilinx_emaclite.c@@ -714,19 +714,29 @@ static irqreturn_t xemaclite_interrupt(int irq, void*dev_id)quoted
static int xemaclite_mdio_wait(struct net_local *lp) { unsigned long end = jiffies + 2; + u32 val; /* wait for the MDIO interface to not be busy or timeout * after some time. */ - while (xemaclite_readl(lp->base_addr + XEL_MDIOCTRL_OFFSET) & - XEL_MDIOCTRL_MDIOSTS_MASK) { + while (1) { + val = xemaclite_readl(lp->base_addr +XEL_MDIOCTRL_OFFSET); Hi Kurt It looks like readx_poll_timeout() should work here.
Yes, valid point. readx_poll_timeout API repoll addr after timeout. Reusing it would simplify the flow.
Andrew