Message ID | 20131203234209.GW16735@n2100.arm.linux.org.uk (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
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@freebox.fr> Thanks,
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,
On Mon, Dec 16, 2013 at 07:07:28PM +0100, Nicolas Schichan wrote: > 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 ? It's up to Jason.
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; }