* [PATCH 1/2] net: arc_emac: remove delay from mdio polling loop
@ 2014-05-19 20:34 Beniamino Galvani
2014-05-19 20:35 ` [PATCH 2/2] net: arc_emac: disable interrupts Beniamino Galvani
0 siblings, 1 reply; 3+ messages in thread
From: Beniamino Galvani @ 2014-05-19 20:34 UTC (permalink / raw)
To: barebox
Avoid unneeded delay when waiting for the completion of a mdio
operation and return as soon as possible.
Signed-off-by: Beniamino Galvani <b.galvani@gmail.com>
---
drivers/net/arc_emac.c | 19 ++++++-------------
1 file changed, 6 insertions(+), 13 deletions(-)
diff --git a/drivers/net/arc_emac.c b/drivers/net/arc_emac.c
index 3f6f814..23df3fd 100644
--- a/drivers/net/arc_emac.c
+++ b/drivers/net/arc_emac.c
@@ -17,6 +17,7 @@
*/
#include <asm/mmu.h>
+#include <clock.h>
#include <common.h>
#include <net.h>
#include <io.h>
@@ -342,26 +343,18 @@ static int arc_emac_set_ethaddr(struct eth_device *edev, unsigned char *mac)
return 0;
}
-/* Number of seconds we wait for "MDIO complete" flag to appear */
-#define ARC_MDIO_COMPLETE_POLL_COUNT 1
-
static int arc_mdio_complete_wait(struct arc_emac_priv *priv)
{
- unsigned int i;
-
- for (i = 0; i < ARC_MDIO_COMPLETE_POLL_COUNT * 40; i++) {
- unsigned int status = arc_reg_get(priv, R_STATUS);
-
- status &= MDIO_MASK;
+ uint64_t start = get_time_ns();
- if (status) {
+ while (!is_timeout(start, 1000 * MSECOND)) {
+ if (arc_reg_get(priv, R_STATUS) & MDIO_MASK) {
/* Reset "MDIO complete" flag */
- arc_reg_set(priv, R_STATUS, status);
+ arc_reg_set(priv, R_STATUS, MDIO_MASK);
return 0;
}
-
- mdelay(25);
}
+
return -ETIMEDOUT;
}
--
1.7.10.4
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH 2/2] net: arc_emac: disable interrupts
2014-05-19 20:34 [PATCH 1/2] net: arc_emac: remove delay from mdio polling loop Beniamino Galvani
@ 2014-05-19 20:35 ` Beniamino Galvani
2014-05-20 5:48 ` Sascha Hauer
0 siblings, 1 reply; 3+ messages in thread
From: Beniamino Galvani @ 2014-05-19 20:35 UTC (permalink / raw)
To: barebox
The driver doesn't use interrupts and Linux driver crashes when emac
interrupts are enabled at boot: keep them disabled.
Signed-off-by: Beniamino Galvani <b.galvani@gmail.com>
---
drivers/net/arc_emac.c | 9 +++------
1 file changed, 3 insertions(+), 6 deletions(-)
diff --git a/drivers/net/arc_emac.c b/drivers/net/arc_emac.c
index 23df3fd..8b74ea5 100644
--- a/drivers/net/arc_emac.c
+++ b/drivers/net/arc_emac.c
@@ -210,9 +210,6 @@ static int arc_emac_open(struct eth_device *edev)
arc_reg_set(priv, R_RX_RING, (unsigned int)priv->rxbd);
arc_reg_set(priv, R_TX_RING, (unsigned int)priv->txbd);
- /* Enable interrupts */
- arc_reg_set(priv, R_ENABLE, RXINT_MASK | ERR_MASK);
-
/* Set CONTROL */
arc_reg_set(priv, R_CTRL,
(RX_BD_NUM << 24) | /* RX BD table length */
@@ -317,9 +314,6 @@ static void arc_emac_halt(struct eth_device *edev)
{
struct arc_emac_priv *priv = edev->priv;
- /* Disable interrupts */
- arc_reg_clr(priv, R_ENABLE, RXINT_MASK | ERR_MASK);
-
/* Disable EMAC */
arc_reg_clr(priv, R_CTRL, EN_MASK);
}
@@ -440,6 +434,9 @@ static int arc_emac_probe(struct device_d *dev)
/* Set poll rate so that it polls every 1 ms */
arc_reg_set(priv, R_POLLRATE, clock_frequency / 1000000);
+ /* Disable interrupts */
+ arc_reg_set(priv, R_ENABLE, 0);
+
mdiobus_register(miibus);
eth_register(edev);
--
1.7.10.4
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH 2/2] net: arc_emac: disable interrupts
2014-05-19 20:35 ` [PATCH 2/2] net: arc_emac: disable interrupts Beniamino Galvani
@ 2014-05-20 5:48 ` Sascha Hauer
0 siblings, 0 replies; 3+ messages in thread
From: Sascha Hauer @ 2014-05-20 5:48 UTC (permalink / raw)
To: Beniamino Galvani; +Cc: barebox
On Mon, May 19, 2014 at 10:35:00PM +0200, Beniamino Galvani wrote:
> The driver doesn't use interrupts and Linux driver crashes when emac
> interrupts are enabled at boot: keep them disabled.
This is the right thing to do in barebox, so applied.
However, the Linux driver should not crash in this case.
Sascha
>
> Signed-off-by: Beniamino Galvani <b.galvani@gmail.com>
> ---
> drivers/net/arc_emac.c | 9 +++------
> 1 file changed, 3 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/net/arc_emac.c b/drivers/net/arc_emac.c
> index 23df3fd..8b74ea5 100644
> --- a/drivers/net/arc_emac.c
> +++ b/drivers/net/arc_emac.c
> @@ -210,9 +210,6 @@ static int arc_emac_open(struct eth_device *edev)
> arc_reg_set(priv, R_RX_RING, (unsigned int)priv->rxbd);
> arc_reg_set(priv, R_TX_RING, (unsigned int)priv->txbd);
>
> - /* Enable interrupts */
> - arc_reg_set(priv, R_ENABLE, RXINT_MASK | ERR_MASK);
> -
> /* Set CONTROL */
> arc_reg_set(priv, R_CTRL,
> (RX_BD_NUM << 24) | /* RX BD table length */
> @@ -317,9 +314,6 @@ static void arc_emac_halt(struct eth_device *edev)
> {
> struct arc_emac_priv *priv = edev->priv;
>
> - /* Disable interrupts */
> - arc_reg_clr(priv, R_ENABLE, RXINT_MASK | ERR_MASK);
> -
> /* Disable EMAC */
> arc_reg_clr(priv, R_CTRL, EN_MASK);
> }
> @@ -440,6 +434,9 @@ static int arc_emac_probe(struct device_d *dev)
> /* Set poll rate so that it polls every 1 ms */
> arc_reg_set(priv, R_POLLRATE, clock_frequency / 1000000);
>
> + /* Disable interrupts */
> + arc_reg_set(priv, R_ENABLE, 0);
> +
> mdiobus_register(miibus);
> eth_register(edev);
>
> --
> 1.7.10.4
>
>
> _______________________________________________
> barebox mailing list
> barebox@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/barebox
>
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2014-05-20 5:48 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-05-19 20:34 [PATCH 1/2] net: arc_emac: remove delay from mdio polling loop Beniamino Galvani
2014-05-19 20:35 ` [PATCH 2/2] net: arc_emac: disable interrupts Beniamino Galvani
2014-05-20 5:48 ` Sascha Hauer
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox