lkml.org 
[lkml]   [2013]   [Dec]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: Spurious timeouts in mvmdio
On 12/04/2013 12:42 AM, Russell King - ARM Linux wrote:
> 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 did not find any commit for this in 3.13-rc4.

Would you prefer I submit my attempt at refactoring the
orion_mdio_wait_ready() code ?

Regards,

--
Nicolas Schichan
Freebox SAS


\
 
 \ /
  Last update: 2013-12-16 19:41    [W:0.074 / U:0.240 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site