All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alexandre Belloni <alexandre.belloni@bootlin.com>
To: Steen Hegelund <steen.hegelund@microchip.com>
Cc: netdev@vger.kernel.org, davem@davemloft.net
Subject: Re: [PATCH net] mscc: Register poll timeout should be wall time not attempts
Date: Thu, 20 Dec 2018 11:29:44 +0100	[thread overview]
Message-ID: <20181220102944.GA2188@piout.net> (raw)
In-Reply-To: <20181220090816.12764-1-steen.hegelund@microchip.com>

On 20/12/2018 10:08:16+0100, Steen Hegelund wrote:
> When doing indirect access in the Ocelot chip, a command is setup,
> issued and then we need to poll until the result is ready. The polling
> timeout is specified in milliseconds in the datasheet and not in
> register access attempts.
> 
> Signed-off-by: Steen Hegelund <steen.hegelund@microchip.com>
Acked-by: Alexandre Belloni <alexandre.belloni@bootlin.com>

> ---
>  drivers/net/ethernet/mscc/ocelot.c | 55 +++++++++++++++---------------
>  1 file changed, 27 insertions(+), 28 deletions(-)
> 
> diff --git a/drivers/net/ethernet/mscc/ocelot.c b/drivers/net/ethernet/mscc/ocelot.c
> index 3238b9ee42f3..debe74e4a041 100644
> --- a/drivers/net/ethernet/mscc/ocelot.c
> +++ b/drivers/net/ethernet/mscc/ocelot.c
> @@ -15,6 +15,7 @@
>  #include <linux/netdevice.h>
>  #include <linux/phy.h>
>  #include <linux/skbuff.h>
> +#include <linux/iopoll.h>
>  #include <net/arp.h>
>  #include <net/netevent.h>
>  #include <net/rtnetlink.h>
> @@ -22,6 +23,9 @@
>  
>  #include "ocelot.h"
>  
> +#define TABLE_UPDATE_SLEEP_US 10
> +#define TABLE_UPDATE_TIMEOUT_US 100000
> +
>  /* MAC table entry types.
>   * ENTRYTYPE_NORMAL is subject to aging.
>   * ENTRYTYPE_LOCKED is not subject to aging.
> @@ -41,23 +45,20 @@ struct ocelot_mact_entry {
>  	enum macaccess_entry_type type;
>  };
>  
> -static inline int ocelot_mact_wait_for_completion(struct ocelot *ocelot)
> +static inline u32 ocelot_mact_read_macaccess(struct ocelot *ocelot)
>  {
> -	unsigned int val, timeout = 10;
> -
> -	/* Wait for the issued mac table command to be completed, or timeout.
> -	 * When the command read from  ANA_TABLES_MACACCESS is
> -	 * MACACCESS_CMD_IDLE, the issued command completed successfully.
> -	 */
> -	do {
> -		val = ocelot_read(ocelot, ANA_TABLES_MACACCESS);
> -		val &= ANA_TABLES_MACACCESS_MAC_TABLE_CMD_M;
> -	} while (val != MACACCESS_CMD_IDLE && timeout--);
> +	return ocelot_read(ocelot, ANA_TABLES_MACACCESS);
> +}
>  
> -	if (!timeout)
> -		return -ETIMEDOUT;
> +static inline int ocelot_mact_wait_for_completion(struct ocelot *ocelot)
> +{
> +	u32 val;
>  
> -	return 0;
> +	return readx_poll_timeout(ocelot_mact_read_macaccess,
> +		ocelot, val,
> +		(val & ANA_TABLES_MACACCESS_MAC_TABLE_CMD_M) ==
> +		MACACCESS_CMD_IDLE,
> +		TABLE_UPDATE_SLEEP_US, TABLE_UPDATE_TIMEOUT_US);
>  }
>  
>  static void ocelot_mact_select(struct ocelot *ocelot,
> @@ -129,23 +130,21 @@ static void ocelot_mact_init(struct ocelot *ocelot)
>  	ocelot_write(ocelot, MACACCESS_CMD_INIT, ANA_TABLES_MACACCESS);
>  }
>  
> -static inline int ocelot_vlant_wait_for_completion(struct ocelot *ocelot)
> +static inline u32 ocelot_vlant_read_vlanaccess(struct ocelot *ocelot)
>  {
> -	unsigned int val, timeout = 10;
> -
> -	/* Wait for the issued vlan table command to be completed, or timeout.
> -	 * When the command read from ANA_TABLES_VLANACCESS is
> -	 * VLANACCESS_CMD_IDLE, the issued command completed successfully.
> -	 */
> -	do {
> -		val = ocelot_read(ocelot, ANA_TABLES_VLANACCESS);
> -		val &= ANA_TABLES_VLANACCESS_VLAN_TBL_CMD_M;
> -	} while (val != ANA_TABLES_VLANACCESS_CMD_IDLE && timeout--);
> +	return ocelot_read(ocelot, ANA_TABLES_VLANACCESS);
> +}
>  
> -	if (!timeout)
> -		return -ETIMEDOUT;
> +static inline int ocelot_vlant_wait_for_completion(struct ocelot *ocelot)
> +{
> +	u32 val;
>  
> -	return 0;
> +	return readx_poll_timeout(ocelot_vlant_read_vlanaccess,
> +		ocelot,
> +		val,
> +		(val & ANA_TABLES_VLANACCESS_VLAN_TBL_CMD_M) ==
> +		ANA_TABLES_VLANACCESS_CMD_IDLE,
> +		TABLE_UPDATE_SLEEP_US, TABLE_UPDATE_TIMEOUT_US);
>  }
>  
>  static int ocelot_vlant_set_mask(struct ocelot *ocelot, u16 vid, u32 mask)
> -- 
> 2.20.1
> 

-- 
Alexandre Belloni, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

  reply	other threads:[~2018-12-20 10:29 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-12-20  9:08 [PATCH net] mscc: Register poll timeout should be wall time not attempts Steen Hegelund
2018-12-20 10:29 ` Alexandre Belloni [this message]
2018-12-20 10:31 ` Andrew Lunn
2018-12-20 11:11   ` Steen Hegelund
2018-12-20 11:31     ` Andrew Lunn

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20181220102944.GA2188@piout.net \
    --to=alexandre.belloni@bootlin.com \
    --cc=davem@davemloft.net \
    --cc=netdev@vger.kernel.org \
    --cc=steen.hegelund@microchip.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.