Thread (11 messages) 11 messages, 6 authors, 2018-11-05

[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 between
reading
quoted
the XEL_MDIOCTRL_OFFSET register and checking for the timeout.  In such a
case,
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.c
b/drivers/net/ethernet/xilinx/xilinx_emaclite.c
quoted
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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help