diff options
author | Hubert Feurstein <h.feurstein@gmail.com> | 2013-02-21 17:13:40 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2013-02-22 09:22:51 +0100 |
commit | c1722ac266847363c2a49b3c87f3b19f46f45ce6 (patch) | |
tree | dc44f0bd5e2976d846c53753ef2202ea9cf62f92 /drivers | |
parent | 0f27e5d8de5eb9da1614b2cf2ceab5b1f451462b (diff) | |
download | barebox-c1722ac266847363c2a49b3c87f3b19f46f45ce6.tar.gz barebox-c1722ac266847363c2a49b3c87f3b19f46f45ce6.tar.xz |
net: fec_imx: ensure constant timeout in fec_halt
Signed-off-by: Hubert Feurstein <h.feurstein@gmail.com>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/fec_imx.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/drivers/net/fec_imx.c b/drivers/net/fec_imx.c index 28ecbd9c65..bc0478529f 100644 --- a/drivers/net/fec_imx.c +++ b/drivers/net/fec_imx.c @@ -431,15 +431,20 @@ static int fec_open(struct eth_device *edev) static void fec_halt(struct eth_device *dev) { struct fec_priv *fec = (struct fec_priv *)dev->priv; - int counter = 0xffff; + uint64_t tmo; /* issue graceful stop command to the FEC transmitter if necessary */ writel(readl(fec->regs + FEC_X_CNTRL) | FEC_ECNTRL_RESET, fec->regs + FEC_X_CNTRL); /* wait for graceful stop to register */ - while ((counter--) && (!(readl(fec->regs + FEC_IEVENT) & FEC_IEVENT_GRA))) - ; /* FIXME ensure time */ + tmo = get_time_ns(); + while (!(readl(fec->regs + FEC_IEVENT) & FEC_IEVENT_GRA)) { + if (is_timeout(tmo, 1 * SECOND)) { + dev_err(&dev->dev, "graceful stop timeout\n"); + break; + } + } /* Disable SmartDMA tasks */ fec_tx_task_disable(fec); |