[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <529F14A8.3020109@freebox.fr>
Date: Wed, 04 Dec 2013 12:40:24 +0100
From: Nicolas Schichan <nschichan@...ebox.fr>
To: Russell King - ARM Linux <linux@....linux.org.uk>,
Leigh Brown <leigh@...inno.co.uk>
CC: Sebastian Hesselbarth <sebastian.hesselbarth@...il.com>,
Jason Cooper <jason@...edaemon.net>, netdev@...r.kernel.org,
LKML <linux-kernel@...r.kernel.org>,
Florian Fainelli <florian@...nwrt.org>,
"David S. Miller" <davem@...emloft.net>,
linux-arm-kernel@...ts.infradead.org
Subject: Re: Spurious timeouts in mvmdio
On 12/04/2013 12:42 AM, Russell King - ARM Linux wrote:
>> This will make it correct when using interrupts but it will make the
>> loop wait one jiffie longer than it should when polling.
>
> Alternatively, code it like this instead.
>
> drivers/net/ethernet/marvell/mvmdio.c | 32 +++++++++++++++-----------------
> 1 files changed, 15 insertions(+), 17 deletions(-)
>
> diff --git a/drivers/net/ethernet/marvell/mvmdio.c b/drivers/net/ethernet/marvell/mvmdio.c
> index 7354960b583b..a6f59831fc5b 100644
> --- a/drivers/net/ethernet/marvell/mvmdio.c
> +++ b/drivers/net/ethernet/marvell/mvmdio.c
> @@ -76,31 +76,29 @@ static int orion_mdio_wait_ready(struct mii_bus *bus)
> {
> struct orion_mdio_dev *dev = bus->priv;
> unsigned long timeout = usecs_to_jiffies(MVMDIO_SMI_TIMEOUT);
> - unsigned long end = jiffies + timeout;
> - int timedout = 0;
>
> - while (1) {
> - if (orion_mdio_smi_is_done(dev))
> + if (dev->err_interrupt > 0) {
> + if (wait_event_timeout(dev->smi_busy_wait,
> + orion_mdio_smi_is_done(dev),
> + 1 + timeout))
> return 0;
> - else if (timedout)
> - break;
> + } else {
> + unsigned long end = jiffies + timeout;
>
> - if (dev->err_interrupt <= 0) {
> - usleep_range(MVMDIO_SMI_POLL_INTERVAL_MIN,
> - MVMDIO_SMI_POLL_INTERVAL_MAX);
> + while (1) {
> + if (orion_mdio_smi_is_done(dev))
> + return 0;
>
> if (time_is_before_jiffies(end))
> - ++timedout;
> - } else {
> - wait_event_timeout(dev->smi_busy_wait,
> - orion_mdio_smi_is_done(dev),
> - timeout);
> -
> - ++timedout;
> - }
> + break;
> +
> + usleep_range(MVMDIO_SMI_POLL_INTERVAL_MIN,
> + MVMDIO_SMI_POLL_INTERVAL_MAX);
> + }
> }
>
> dev_err(bus->parent, "Timeout: SMI busy for too long\n");
> +
> return -ETIMEDOUT;
> }
Hi Russell,
I have just tested your patch on MV88F6281 and MV88F6282 both in polling and
irq mode and it works just fine.
I had a similar patch almost ready to submit but you were faster than me.
Feel free to add my:
Tested-by: Nicolas Schichan <nschichan@...ebox.fr>
Thanks,
--
Nicolas Schichan
Freebox SAS
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists