* [[PATCH net-next] 0/2] Convert mdio wait function to use readx_poll_timeout()
@ 2019-05-19 17:59 Benedikt Spranger
2019-05-19 17:59 ` [[PATCH net-next] 1/2] net: axienet: use readx_poll_timeout() in mdio wait function Benedikt Spranger
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Benedikt Spranger @ 2019-05-19 17:59 UTC (permalink / raw)
To: netdev
Hi,
On loaded systems with a preemptible kernel both functions
axienet_mdio_wait_until_ready() and xemaclite_mdio_wait() may report a
false positive error return.
Convert both functions to use readx_poll_timeout() to handle the
situation in a safe manner.
Regards
Benedikt Spranger
Kurt Kanzenbach (2):
net: axienet: use readx_poll_timeout() in mdio wait function
net: xilinx_emaclite: use readx_poll_timeout() in mdio wait function
drivers/net/ethernet/xilinx/xilinx_axienet.h | 5 +++++
.../net/ethernet/xilinx/xilinx_axienet_mdio.c | 16 ++++++----------
drivers/net/ethernet/xilinx/xilinx_emaclite.c | 16 ++++++----------
3 files changed, 17 insertions(+), 20 deletions(-)
--
2.20.1
^ permalink raw reply [flat|nested] 4+ messages in thread
* [[PATCH net-next] 1/2] net: axienet: use readx_poll_timeout() in mdio wait function
2019-05-19 17:59 [[PATCH net-next] 0/2] Convert mdio wait function to use readx_poll_timeout() Benedikt Spranger
@ 2019-05-19 17:59 ` Benedikt Spranger
2019-05-19 17:59 ` [[PATCH net-next] 2/2] net: xilinx_emaclite: " Benedikt Spranger
2019-05-21 0:01 ` [[PATCH net-next] 0/2] Convert mdio wait function to use readx_poll_timeout() David Miller
2 siblings, 0 replies; 4+ messages in thread
From: Benedikt Spranger @ 2019-05-19 17:59 UTC (permalink / raw)
To: netdev; +Cc: Kurt Kanzenbach
From: Kurt Kanzenbach <kurt@linutronix.de>
On loaded systems with a preemptible kernel the mdio_wait() function may
report an error while everything is working fine:
axienet_mdio_wait_until_ready():
axienet_ior() -> chip not ready
--> interrupt here (other work for some time / chip become ready)
if (time_before_eq(end, jiffies))
--> false positive error report
Replace the current code with readx_poll_timeout() which take care
of the situation.
Signed-off-by: Kurt Kanzenbach <kurt@linutronix.de>
Signed-off-by: Benedikt Spranger <b.spranger@linutronix.de>
---
drivers/net/ethernet/xilinx/xilinx_axienet.h | 5 +++++
.../net/ethernet/xilinx/xilinx_axienet_mdio.c | 16 ++++++----------
2 files changed, 11 insertions(+), 10 deletions(-)
diff --git a/drivers/net/ethernet/xilinx/xilinx_axienet.h b/drivers/net/ethernet/xilinx/xilinx_axienet.h
index c337400485da..011adae32b89 100644
--- a/drivers/net/ethernet/xilinx/xilinx_axienet.h
+++ b/drivers/net/ethernet/xilinx/xilinx_axienet.h
@@ -484,6 +484,11 @@ static inline u32 axienet_ior(struct axienet_local *lp, off_t offset)
return in_be32(lp->regs + offset);
}
+static inline u32 axinet_ior_read_mcr(struct axienet_local *lp)
+{
+ return axienet_ior(lp, XAE_MDIO_MCR_OFFSET);
+}
+
/**
* axienet_iow - Memory mapped Axi Ethernet register write
* @lp: Pointer to axienet local structure
diff --git a/drivers/net/ethernet/xilinx/xilinx_axienet_mdio.c b/drivers/net/ethernet/xilinx/xilinx_axienet_mdio.c
index 757a3b37ae8a..704babdbc8a2 100644
--- a/drivers/net/ethernet/xilinx/xilinx_axienet_mdio.c
+++ b/drivers/net/ethernet/xilinx/xilinx_axienet_mdio.c
@@ -11,6 +11,7 @@
#include <linux/of_address.h>
#include <linux/of_mdio.h>
#include <linux/jiffies.h>
+#include <linux/iopoll.h>
#include "xilinx_axienet.h"
@@ -20,16 +21,11 @@
/* Wait till MDIO interface is ready to accept a new transaction.*/
int axienet_mdio_wait_until_ready(struct axienet_local *lp)
{
- unsigned long end = jiffies + 2;
- while (!(axienet_ior(lp, XAE_MDIO_MCR_OFFSET) &
- XAE_MDIO_MCR_READY_MASK)) {
- if (time_before_eq(end, jiffies)) {
- WARN_ON(1);
- return -ETIMEDOUT;
- }
- udelay(1);
- }
- return 0;
+ u32 val;
+
+ return readx_poll_timeout(axinet_ior_read_mcr, lp,
+ val, val & XAE_MDIO_MCR_READY_MASK,
+ 1, 20000);
}
/**
--
2.20.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [[PATCH net-next] 2/2] net: xilinx_emaclite: use readx_poll_timeout() in mdio wait function
2019-05-19 17:59 [[PATCH net-next] 0/2] Convert mdio wait function to use readx_poll_timeout() Benedikt Spranger
2019-05-19 17:59 ` [[PATCH net-next] 1/2] net: axienet: use readx_poll_timeout() in mdio wait function Benedikt Spranger
@ 2019-05-19 17:59 ` Benedikt Spranger
2019-05-21 0:01 ` [[PATCH net-next] 0/2] Convert mdio wait function to use readx_poll_timeout() David Miller
2 siblings, 0 replies; 4+ messages in thread
From: Benedikt Spranger @ 2019-05-19 17:59 UTC (permalink / raw)
To: netdev; +Cc: Kurt Kanzenbach
From: Kurt Kanzenbach <kurt@linutronix.de>
On loaded systems with a preemptible kernel the mdio_wait() function may
report an error while everything is working fine:
xemaclite_mdio_wait():
xemaclite_readl() -> chip not ready
--> interrupt here (other work for some time / chip become ready)
if (time_before_eq(end, jiffies))
--> false positive error report
Replace the current code with readx_poll_timeout() which takes care
of the situation.
Signed-off-by: Kurt Kanzenbach <kurt@linutronix.de>
Signed-off-by: Benedikt Spranger <b.spranger@linutronix.de>
---
drivers/net/ethernet/xilinx/xilinx_emaclite.c | 16 ++++++----------
1 file changed, 6 insertions(+), 10 deletions(-)
diff --git a/drivers/net/ethernet/xilinx/xilinx_emaclite.c b/drivers/net/ethernet/xilinx/xilinx_emaclite.c
index 6886270da695..c409bab63bd3 100644
--- a/drivers/net/ethernet/xilinx/xilinx_emaclite.c
+++ b/drivers/net/ethernet/xilinx/xilinx_emaclite.c
@@ -27,6 +27,7 @@
#include <linux/of_net.h>
#include <linux/phy.h>
#include <linux/interrupt.h>
+#include <linux/iopoll.h>
#define DRIVER_NAME "xilinx_emaclite"
@@ -714,20 +715,15 @@ static irqreturn_t xemaclite_interrupt(int irq, void *dev_id)
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) {
- if (time_before_eq(end, jiffies)) {
- WARN_ON(1);
- return -ETIMEDOUT;
- }
- msleep(1);
- }
- return 0;
+ return readx_poll_timeout(xemaclite_readl,
+ lp->base_addr + XEL_MDIOCTRL_OFFSET,
+ val, !(val & XEL_MDIOCTRL_MDIOSTS_MASK),
+ 1000, 20000);
}
/**
--
2.20.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [[PATCH net-next] 0/2] Convert mdio wait function to use readx_poll_timeout()
2019-05-19 17:59 [[PATCH net-next] 0/2] Convert mdio wait function to use readx_poll_timeout() Benedikt Spranger
2019-05-19 17:59 ` [[PATCH net-next] 1/2] net: axienet: use readx_poll_timeout() in mdio wait function Benedikt Spranger
2019-05-19 17:59 ` [[PATCH net-next] 2/2] net: xilinx_emaclite: " Benedikt Spranger
@ 2019-05-21 0:01 ` David Miller
2 siblings, 0 replies; 4+ messages in thread
From: David Miller @ 2019-05-21 0:01 UTC (permalink / raw)
To: b.spranger; +Cc: netdev
From: Benedikt Spranger <b.spranger@linutronix.de>
Date: Sun, 19 May 2019 19:59:35 +0200
> On loaded systems with a preemptible kernel both functions
> axienet_mdio_wait_until_ready() and xemaclite_mdio_wait() may report a
> false positive error return.
> Convert both functions to use readx_poll_timeout() to handle the
> situation in a safe manner.
Series applied, thank you.
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2019-05-21 0:01 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-05-19 17:59 [[PATCH net-next] 0/2] Convert mdio wait function to use readx_poll_timeout() Benedikt Spranger
2019-05-19 17:59 ` [[PATCH net-next] 1/2] net: axienet: use readx_poll_timeout() in mdio wait function Benedikt Spranger
2019-05-19 17:59 ` [[PATCH net-next] 2/2] net: xilinx_emaclite: " Benedikt Spranger
2019-05-21 0:01 ` [[PATCH net-next] 0/2] Convert mdio wait function to use readx_poll_timeout() David Miller
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.