diff mbox series

[2/4] ata: libata-sata: Introduce struct sata_deb_timing

Message ID 20220323081740.540006-3-damien.lemoal@opensource.wdc.com
State New
Headers show
Series Remove link debounce delays by default | expand

Commit Message

Damien Le Moal March 23, 2022, 8:17 a.m. UTC
The SATA interval, duration and timeout debounce timing parameters
(sata_deb_timing_normal, sata_deb_timing_hotplug and
sata_deb_timing_long) are defined as an array of 3 unsigned long
integers. The entries are referenced directly without any index macro
indicating the name of the field being accessed.

Introduce struct sata_deb_timing to more clearly define the values and
their use. The interface of the sata_ehc_deb_timing(),
sata_link_hardreset() and sata_link_debounce() functions is modified to
take this new structure as argument.

Signed-off-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
---
 drivers/ata/ahci.c          |  7 +++---
 drivers/ata/ahci_qoriq.c    |  5 ++--
 drivers/ata/ahci_xgene.c    |  3 ++-
 drivers/ata/libahci.c       |  5 ++--
 drivers/ata/libata-core.c   |  5 ++--
 drivers/ata/libata-pmp.c    |  2 +-
 drivers/ata/libata-sata.c   | 47 ++++++++++++++++++++++++++-----------
 drivers/ata/libata-sff.c    |  6 ++---
 drivers/ata/sata_highbank.c |  4 ++--
 drivers/ata/sata_mv.c       |  8 +++----
 drivers/ata/sata_nv.c       |  2 +-
 drivers/ata/sata_sil24.c    |  2 +-
 include/linux/libata.h      | 38 +++++++++++++++++++-----------
 13 files changed, 80 insertions(+), 54 deletions(-)

Comments

Paul Menzel March 23, 2022, 2:09 p.m. UTC | #1
Dear Damien,


Am 23.03.22 um 09:17 schrieb Damien Le Moal:
> The SATA interval, duration and timeout debounce timing parameters
> (sata_deb_timing_normal, sata_deb_timing_hotplug and
> sata_deb_timing_long) are defined as an array of 3 unsigned long
> integers. The entries are referenced directly without any index macro
> indicating the name of the field being accessed.

> Introduce struct sata_deb_timing to more clearly define the values and
> their use. The interface of the sata_ehc_deb_timing(),
> sata_link_hardreset() and sata_link_debounce() functions is modified to
> take this new structure as argument.
> 
> Signed-off-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
> ---
>   drivers/ata/ahci.c          |  7 +++---
>   drivers/ata/ahci_qoriq.c    |  5 ++--
>   drivers/ata/ahci_xgene.c    |  3 ++-
>   drivers/ata/libahci.c       |  5 ++--
>   drivers/ata/libata-core.c   |  5 ++--
>   drivers/ata/libata-pmp.c    |  2 +-
>   drivers/ata/libata-sata.c   | 47 ++++++++++++++++++++++++++-----------
>   drivers/ata/libata-sff.c    |  6 ++---
>   drivers/ata/sata_highbank.c |  4 ++--
>   drivers/ata/sata_mv.c       |  8 +++----
>   drivers/ata/sata_nv.c       |  2 +-
>   drivers/ata/sata_sil24.c    |  2 +-
>   include/linux/libata.h      | 38 +++++++++++++++++++-----------
>   13 files changed, 80 insertions(+), 54 deletions(-)
> 
> diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
> index 84456c05e845..ccf94e8a3056 100644
> --- a/drivers/ata/ahci.c
> +++ b/drivers/ata/ahci.c
> @@ -787,7 +787,6 @@ static int ahci_p5wdh_hardreset(struct ata_link *link, unsigned int *class,
>   static int ahci_avn_hardreset(struct ata_link *link, unsigned int *class,
>   			      unsigned long deadline)
>   {
> -	const unsigned long *timing = sata_ehc_deb_timing(&link->eh_context);
>   	struct ata_port *ap = link->ap;
>   	struct ahci_port_priv *pp = ap->private_data;
>   	struct ahci_host_priv *hpriv = ap->host->private_data;
> @@ -811,8 +810,10 @@ static int ahci_avn_hardreset(struct ata_link *link, unsigned int *class,
>   		tf.status = ATA_BUSY;
>   		ata_tf_to_fis(&tf, 0, 0, d2h_fis);
>   
> -		rc = sata_link_hardreset(link, timing, deadline, &online,
> -				ahci_check_ready);
> +		rc = sata_link_hardreset(link,
> +					 sata_ehc_deb_timing(&link->eh_context),
> +					 deadline, &online,
> +					 ahci_check_ready);
>   
>   		if (sata_scr_read(link, SCR_STATUS, &sstatus) != 0 ||
>   				(sstatus & 0xf) != 1)
> diff --git a/drivers/ata/ahci_qoriq.c b/drivers/ata/ahci_qoriq.c
> index 6cd61842ad48..a5eeedadf0c9 100644
> --- a/drivers/ata/ahci_qoriq.c
> +++ b/drivers/ata/ahci_qoriq.c
> @@ -90,7 +90,6 @@ MODULE_DEVICE_TABLE(acpi, ahci_qoriq_acpi_match);
>   static int ahci_qoriq_hardreset(struct ata_link *link, unsigned int *class,
>   			  unsigned long deadline)
>   {
> -	const unsigned long *timing = sata_ehc_deb_timing(&link->eh_context);
>   	void __iomem *port_mmio = ahci_port_base(link->ap);
>   	u32 px_cmd, px_is, px_val;
>   	struct ata_port *ap = link->ap;
> @@ -126,8 +125,8 @@ static int ahci_qoriq_hardreset(struct ata_link *link, unsigned int *class,
>   	tf.status = ATA_BUSY;
>   	ata_tf_to_fis(&tf, 0, 0, d2h_fis);
>   
> -	rc = sata_link_hardreset(link, timing, deadline, &online,
> -				 ahci_check_ready);
> +	rc = sata_link_hardreset(link, sata_ehc_deb_timing(&link->eh_context),
> +				 deadline, &online, ahci_check_ready);
>   
>   	/* restore the PxCMD and PxIS on ls1021 */
>   	if (ls1021a_workaround) {
> diff --git a/drivers/ata/ahci_xgene.c b/drivers/ata/ahci_xgene.c
> index 7bb5db17f864..8d1598232e92 100644
> --- a/drivers/ata/ahci_xgene.c
> +++ b/drivers/ata/ahci_xgene.c
> @@ -350,7 +350,8 @@ static void xgene_ahci_set_phy_cfg(struct xgene_ahci_context *ctx, int channel)
>   static int xgene_ahci_do_hardreset(struct ata_link *link,
>   				   unsigned long deadline, bool *online)
>   {
> -	const unsigned long *timing = sata_ehc_deb_timing(&link->eh_context);
> +	const struct sata_deb_timing *timing =
> +		sata_ehc_deb_timing(&link->eh_context);
>   	struct ata_port *ap = link->ap;
>   	struct ahci_host_priv *hpriv = ap->host->private_data;
>   	struct xgene_ahci_context *ctx = hpriv->plat_data;
> diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c
> index cf8c7fd59ada..0ac3b382fa52 100644
> --- a/drivers/ata/libahci.c
> +++ b/drivers/ata/libahci.c
> @@ -1549,7 +1549,6 @@ static int ahci_pmp_retry_softreset(struct ata_link *link, unsigned int *class,
>   int ahci_do_hardreset(struct ata_link *link, unsigned int *class,
>   		      unsigned long deadline, bool *online)
>   {
> -	const unsigned long *timing = sata_ehc_deb_timing(&link->eh_context);
>   	struct ata_port *ap = link->ap;
>   	struct ahci_port_priv *pp = ap->private_data;
>   	struct ahci_host_priv *hpriv = ap->host->private_data;
> @@ -1564,8 +1563,8 @@ int ahci_do_hardreset(struct ata_link *link, unsigned int *class,
>   	tf.status = ATA_BUSY;
>   	ata_tf_to_fis(&tf, 0, 0, d2h_fis);
>   
> -	rc = sata_link_hardreset(link, timing, deadline, online,
> -				 ahci_check_ready);
> +	rc = sata_link_hardreset(link, sata_ehc_deb_timing(&link->eh_context),
> +				 deadline, online, ahci_check_ready);
>   
>   	hpriv->start_engine(ap);
>   
> diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
> index 1bdb6e78f0ed..ffad7c1afb64 100644
> --- a/drivers/ata/libata-core.c
> +++ b/drivers/ata/libata-core.c
> @@ -3616,12 +3616,13 @@ EXPORT_SYMBOL_GPL(ata_std_prereset);
>   int sata_std_hardreset(struct ata_link *link, unsigned int *class,
>   		       unsigned long deadline)
>   {
> -	const unsigned long *timing = sata_ehc_deb_timing(&link->eh_context);
>   	bool online;
>   	int rc;
>   
>   	/* do hardreset */
> -	rc = sata_link_hardreset(link, timing, deadline, &online, NULL);
> +	rc = sata_link_hardreset(link, sata_ehc_deb_timing(&link->eh_context),
> +				 deadline, &online, NULL);
> +
>   	return online ? -EAGAIN : rc;
>   }
>   EXPORT_SYMBOL_GPL(sata_std_hardreset);
> diff --git a/drivers/ata/libata-pmp.c b/drivers/ata/libata-pmp.c
> index e2e9cbd405fa..1ea472ddbe3f 100644
> --- a/drivers/ata/libata-pmp.c
> +++ b/drivers/ata/libata-pmp.c
> @@ -851,7 +851,7 @@ static int sata_pmp_eh_handle_disabled_links(struct ata_port *ap)
>   		/* Some PMPs require hardreset sequence to get
>   		 * SError.N working.
>   		 */
> -		sata_link_hardreset(link, sata_deb_timing_normal,
> +		sata_link_hardreset(link, &sata_deb_timing_normal,
>   				ata_deadline(jiffies, ATA_TMOUT_INTERNAL_QUICK),
>   				NULL, NULL);
>   
> diff --git a/drivers/ata/libata-sata.c b/drivers/ata/libata-sata.c
> index 86f1475e5bca..be46833d77a6 100644
> --- a/drivers/ata/libata-sata.c
> +++ b/drivers/ata/libata-sata.c
> @@ -16,12 +16,31 @@
>   #include "libata.h"
>   #include "libata-transport.h"
>   
> -/* debounce timing parameters in msecs { interval, duration, timeout } */
> -const unsigned long sata_deb_timing_normal[]		= {   5,  100, 2000 };
> +/*
> + * Debounce timing parameters in msecs.
> + */
> +const struct sata_deb_timing sata_deb_timing_normal =
> +{
> +	.interval	= 5,

I find it always useful to append the unit to the variable name: 
`interval_ms`.


The rest looks good.


Kind regards,

Paul


> +	.duration	= 100,
> +	.timeout	= 2000
> +};
>   EXPORT_SYMBOL_GPL(sata_deb_timing_normal);
> -const unsigned long sata_deb_timing_hotplug[]		= {  25,  500, 2000 };
> +
> +const struct sata_deb_timing sata_deb_timing_hotplug =
> +{
> +	.interval	= 25,
> +	.duration	= 500,
> +	.timeout	= 2000
> +};
>   EXPORT_SYMBOL_GPL(sata_deb_timing_hotplug);
> -const unsigned long sata_deb_timing_long[]		= { 100, 2000, 5000 };
> +
> +const struct sata_deb_timing sata_deb_timing_long =
> +{
> +	.interval	= 100,
> +	.duration	= 2000,
> +	.timeout	= 5000
> +};
>   EXPORT_SYMBOL_GPL(sata_deb_timing_long);
>   
>   /**
> @@ -211,7 +230,7 @@ EXPORT_SYMBOL_GPL(ata_tf_from_fis);
>   /**
>    *	sata_link_debounce - debounce SATA phy status
>    *	@link: ATA link to debounce SATA phy status for
> - *	@params: timing parameters { interval, duration, timeout } in msec
> + *	@timing: debounce timing
>    *	@deadline: deadline jiffies for the operation
>    *
>    *	Make sure SStatus of @link reaches stable state, determined by
> @@ -230,16 +249,15 @@ EXPORT_SYMBOL_GPL(ata_tf_from_fis);
>    *	RETURNS:
>    *	0 on success, -errno on failure.
>    */
> -int sata_link_debounce(struct ata_link *link, const unsigned long *params,
> +int sata_link_debounce(struct ata_link *link,
> +		       const struct sata_deb_timing *timing,
>   		       unsigned long deadline)
>   {
> -	unsigned long interval = params[0];
> -	unsigned long duration = params[1];
>   	unsigned long last_jiffies, t;
>   	u32 last, cur;
>   	int rc;
>   
> -	t = ata_deadline(jiffies, params[2]);
> +	t = ata_deadline(jiffies, timing->timeout);
>   	if (time_before(t, deadline))
>   		deadline = t;
>   
> @@ -251,7 +269,7 @@ int sata_link_debounce(struct ata_link *link, const unsigned long *params,
>   	last_jiffies = jiffies;
>   
>   	while (1) {
> -		ata_msleep(link->ap, interval);
> +		ata_msleep(link->ap, timing->interval);
>   		if ((rc = sata_scr_read(link, SCR_STATUS, &cur)))
>   			return rc;
>   		cur &= 0xf;
> @@ -261,7 +279,7 @@ int sata_link_debounce(struct ata_link *link, const unsigned long *params,
>   			if (cur == 1 && time_before(jiffies, deadline))
>   				continue;
>   			if (time_after(jiffies,
> -				       ata_deadline(last_jiffies, duration)))
> +				ata_deadline(last_jiffies, timing->duration)))
>   				return 0;
>   			continue;
>   		}
> @@ -280,7 +298,7 @@ int sata_link_debounce(struct ata_link *link, const unsigned long *params,
>   EXPORT_SYMBOL_GPL(sata_link_debounce);
>   
>   static int __sata_link_resume(struct ata_link *link,
> -			      const unsigned long *timing,
> +			      const struct sata_deb_timing *timing,
>   			      unsigned long deadline)
>   {
>   	int tries = ATA_LINK_RESUME_TRIES;
> @@ -511,7 +529,7 @@ EXPORT_SYMBOL_GPL(sata_set_spd);
>   /**
>    *	sata_link_hardreset - reset link via SATA phy reset
>    *	@link: link to reset
> - *	@timing: timing parameters { interval, duration, timeout } in msec
> + *	@timing: debounce timing parameters
>    *	@deadline: deadline jiffies for the operation
>    *	@online: optional out parameter indicating link onlineness
>    *	@check_ready: optional callback to check link readiness
> @@ -532,7 +550,8 @@ EXPORT_SYMBOL_GPL(sata_set_spd);
>    *	RETURNS:
>    *	0 on success, -errno otherwise.
>    */
> -int sata_link_hardreset(struct ata_link *link, const unsigned long *timing,
> +int sata_link_hardreset(struct ata_link *link,
> +			const struct sata_deb_timing *timing,
>   			unsigned long deadline,
>   			bool *online, int (*check_ready)(struct ata_link *))
>   {
> diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c
> index b3be7a8f5bea..ffd085b09abc 100644
> --- a/drivers/ata/libata-sff.c
> +++ b/drivers/ata/libata-sff.c
> @@ -2030,13 +2030,11 @@ EXPORT_SYMBOL_GPL(ata_sff_softreset);
>   int sata_sff_hardreset(struct ata_link *link, unsigned int *class,
>   		       unsigned long deadline)
>   {
> -	struct ata_eh_context *ehc = &link->eh_context;
> -	const unsigned long *timing = sata_ehc_deb_timing(ehc);
>   	bool online;
>   	int rc;
>   
> -	rc = sata_link_hardreset(link, timing, deadline, &online,
> -				 ata_sff_check_ready);
> +	rc = sata_link_hardreset(link, sata_ehc_deb_timing(&link->eh_context),
> +				 deadline, &online, ata_sff_check_ready);
>   	if (online)
>   		*class = ata_sff_dev_classify(link->device, 1, NULL);
>   
> diff --git a/drivers/ata/sata_highbank.c b/drivers/ata/sata_highbank.c
> index dfbf9493e451..16da571e8083 100644
> --- a/drivers/ata/sata_highbank.c
> +++ b/drivers/ata/sata_highbank.c
> @@ -385,7 +385,7 @@ static int highbank_initialize_phys(struct device *dev, void __iomem *addr)
>   static int ahci_highbank_hardreset(struct ata_link *link, unsigned int *class,
>   				unsigned long deadline)
>   {
> -	static const unsigned long timing[] = { 5, 100, 500};
> +	const struct sata_deb_timing timing = { 5, 100, 500};
>   	struct ata_port *ap = link->ap;
>   	struct ahci_port_priv *pp = ap->private_data;
>   	struct ahci_host_priv *hpriv = ap->host->private_data;
> @@ -405,7 +405,7 @@ static int ahci_highbank_hardreset(struct ata_link *link, unsigned int *class,
>   
>   	do {
>   		highbank_cphy_disable_overrides(link->ap->port_no);
> -		rc = sata_link_hardreset(link, timing, deadline, &online, NULL);
> +		rc = sata_link_hardreset(link, &timing, deadline, &online, NULL);
>   		highbank_cphy_override_lane(link->ap->port_no);
>   
>   		/* If the status is 1, we are connected, but the link did not
> diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c
> index de5bd02cad44..8ad0f3776c48 100644
> --- a/drivers/ata/sata_mv.c
> +++ b/drivers/ata/sata_mv.c
> @@ -3633,11 +3633,9 @@ static int mv_hardreset(struct ata_link *link, unsigned int *class,
>   
>   	/* Workaround for errata FEr SATA#10 (part 2) */
>   	do {
> -		const unsigned long *timing =
> -				sata_ehc_deb_timing(&link->eh_context);
> -
> -		rc = sata_link_hardreset(link, timing, deadline + extra,
> -					 &online, NULL);
> +		rc = sata_link_hardreset(link,
> +					 sata_ehc_deb_timing(&link->eh_context),
> +					 deadline + extra, &online, NULL);
>   		rc = online ? -EAGAIN : rc;
>   		if (rc)
>   			return rc;
> diff --git a/drivers/ata/sata_nv.c b/drivers/ata/sata_nv.c
> index b5f27eac86b1..5c8db8f8c47f 100644
> --- a/drivers/ata/sata_nv.c
> +++ b/drivers/ata/sata_nv.c
> @@ -1526,7 +1526,7 @@ static int nv_hardreset(struct ata_link *link, unsigned int *class,
>   	 */
>   	if (!(link->ap->pflags & ATA_PFLAG_LOADING) &&
>   	    !ata_dev_enabled(link->device))
> -		sata_link_hardreset(link, sata_deb_timing_hotplug, deadline,
> +		sata_link_hardreset(link, &sata_deb_timing_hotplug, deadline,
>   				    NULL, NULL);
>   	else {
>   		int rc;
> diff --git a/drivers/ata/sata_sil24.c b/drivers/ata/sata_sil24.c
> index 2fef6ce93f07..4c4ff67bf06a 100644
> --- a/drivers/ata/sata_sil24.c
> +++ b/drivers/ata/sata_sil24.c
> @@ -735,7 +735,7 @@ static int sil24_hardreset(struct ata_link *link, unsigned int *class,
>   	/* SStatus oscillates between zero and valid status after
>   	 * DEV_RST, debounce it.
>   	 */
> -	rc = sata_link_debounce(link, sata_deb_timing_long, deadline);
> +	rc = sata_link_debounce(link, &sata_deb_timing_long, deadline);
>   	if (rc) {
>   		reason = "PHY debouncing failed";
>   		goto err;
> diff --git a/include/linux/libata.h b/include/linux/libata.h
> index e89d612326f6..166263d9bbc7 100644
> --- a/include/linux/libata.h
> +++ b/include/linux/libata.h
> @@ -1150,17 +1150,26 @@ extern void ata_scsi_cmd_error_handler(struct Scsi_Host *host, struct ata_port *
>    * SATA specific code - drivers/ata/libata-sata.c
>    */
>   #ifdef CONFIG_SATA_HOST
> -extern const unsigned long sata_deb_timing_normal[];
> -extern const unsigned long sata_deb_timing_hotplug[];
> -extern const unsigned long sata_deb_timing_long[];
>   
> -static inline const unsigned long *
> +/*
> + * Debounce timing parameters in msecs.
> + */
> +struct sata_deb_timing {
> +	unsigned long interval;
> +	unsigned long duration;
> +	unsigned long timeout;
> +};
> +
> +extern const struct sata_deb_timing sata_deb_timing_normal;
> +extern const struct sata_deb_timing sata_deb_timing_hotplug;
> +extern const struct sata_deb_timing sata_deb_timing_long;
> +
> +static inline const struct sata_deb_timing *
>   sata_ehc_deb_timing(struct ata_eh_context *ehc)
>   {
>   	if (ehc->i.flags & ATA_EHI_HOTPLUGGED)
> -		return sata_deb_timing_hotplug;
> -	else
> -		return sata_deb_timing_normal;
> +		return &sata_deb_timing_hotplug;
> +	return &sata_deb_timing_normal;
>   }
>   
>   extern int sata_scr_valid(struct ata_link *link);
> @@ -1169,12 +1178,13 @@ extern int sata_scr_write(struct ata_link *link, int reg, u32 val);
>   extern int sata_scr_write_flush(struct ata_link *link, int reg, u32 val);
>   extern int sata_set_spd(struct ata_link *link);
>   extern int sata_link_hardreset(struct ata_link *link,
> -			const unsigned long *timing, unsigned long deadline,
> -			bool *online, int (*check_ready)(struct ata_link *));
> +			       const struct sata_deb_timing *timing,
> +			       unsigned long deadline, bool *online,
> +			       int (*check_ready)(struct ata_link *));
>   extern int sata_link_resume(struct ata_link *link, unsigned long deadline);
>   extern void ata_eh_analyze_ncq_error(struct ata_link *link);
>   #else
> -static inline const unsigned long *
> +static inline const struct sata_deb_timing *
>   sata_ehc_deb_timing(struct ata_eh_context *ehc)
>   {
>   	return NULL;
> @@ -1194,9 +1204,8 @@ static inline int sata_scr_write_flush(struct ata_link *link, int reg, u32 val)
>   }
>   static inline int sata_set_spd(struct ata_link *link) { return -EOPNOTSUPP; }
>   static inline int sata_link_hardreset(struct ata_link *link,
> -				      const unsigned long *timing,
> -				      unsigned long deadline,
> -				      bool *online,
> +				      const struct sata_deb_timing *timing,
> +				      unsigned long deadline, bool *online,
>   				      int (*check_ready)(struct ata_link *))
>   {
>   	if (online)
> @@ -1211,7 +1220,8 @@ static inline int sata_link_resume(struct ata_link *link,
>   static inline void ata_eh_analyze_ncq_error(struct ata_link *link) { }
>   #endif
>   extern int sata_link_debounce(struct ata_link *link,
> -			const unsigned long *params, unsigned long deadline);
> +			      const struct sata_deb_timing *timing,
> +			      unsigned long deadline);
>   extern int sata_link_scr_lpm(struct ata_link *link, enum ata_lpm_policy policy,
>   			     bool spm_wakeup);
>   extern int ata_slave_link_init(struct ata_port *ap);
Damien Le Moal March 23, 2022, 11:51 p.m. UTC | #2
On 3/23/22 23:09, Paul Menzel wrote:
>> diff --git a/drivers/ata/libata-sata.c b/drivers/ata/libata-sata.c
>> index 86f1475e5bca..be46833d77a6 100644
>> --- a/drivers/ata/libata-sata.c
>> +++ b/drivers/ata/libata-sata.c
>> @@ -16,12 +16,31 @@
>>   #include "libata.h"
>>   #include "libata-transport.h"
>>   
>> -/* debounce timing parameters in msecs { interval, duration, timeout } */
>> -const unsigned long sata_deb_timing_normal[]		= {   5,  100, 2000 };
>> +/*
>> + * Debounce timing parameters in msecs.
>> + */
>> +const struct sata_deb_timing sata_deb_timing_normal =
>> +{
>> +	.interval	= 5,
> 
> I find it always useful to append the unit to the variable name: 
> `interval_ms`.

Yes, we can do that.
diff mbox series

Patch

diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
index 84456c05e845..ccf94e8a3056 100644
--- a/drivers/ata/ahci.c
+++ b/drivers/ata/ahci.c
@@ -787,7 +787,6 @@  static int ahci_p5wdh_hardreset(struct ata_link *link, unsigned int *class,
 static int ahci_avn_hardreset(struct ata_link *link, unsigned int *class,
 			      unsigned long deadline)
 {
-	const unsigned long *timing = sata_ehc_deb_timing(&link->eh_context);
 	struct ata_port *ap = link->ap;
 	struct ahci_port_priv *pp = ap->private_data;
 	struct ahci_host_priv *hpriv = ap->host->private_data;
@@ -811,8 +810,10 @@  static int ahci_avn_hardreset(struct ata_link *link, unsigned int *class,
 		tf.status = ATA_BUSY;
 		ata_tf_to_fis(&tf, 0, 0, d2h_fis);
 
-		rc = sata_link_hardreset(link, timing, deadline, &online,
-				ahci_check_ready);
+		rc = sata_link_hardreset(link,
+					 sata_ehc_deb_timing(&link->eh_context),
+					 deadline, &online,
+					 ahci_check_ready);
 
 		if (sata_scr_read(link, SCR_STATUS, &sstatus) != 0 ||
 				(sstatus & 0xf) != 1)
diff --git a/drivers/ata/ahci_qoriq.c b/drivers/ata/ahci_qoriq.c
index 6cd61842ad48..a5eeedadf0c9 100644
--- a/drivers/ata/ahci_qoriq.c
+++ b/drivers/ata/ahci_qoriq.c
@@ -90,7 +90,6 @@  MODULE_DEVICE_TABLE(acpi, ahci_qoriq_acpi_match);
 static int ahci_qoriq_hardreset(struct ata_link *link, unsigned int *class,
 			  unsigned long deadline)
 {
-	const unsigned long *timing = sata_ehc_deb_timing(&link->eh_context);
 	void __iomem *port_mmio = ahci_port_base(link->ap);
 	u32 px_cmd, px_is, px_val;
 	struct ata_port *ap = link->ap;
@@ -126,8 +125,8 @@  static int ahci_qoriq_hardreset(struct ata_link *link, unsigned int *class,
 	tf.status = ATA_BUSY;
 	ata_tf_to_fis(&tf, 0, 0, d2h_fis);
 
-	rc = sata_link_hardreset(link, timing, deadline, &online,
-				 ahci_check_ready);
+	rc = sata_link_hardreset(link, sata_ehc_deb_timing(&link->eh_context),
+				 deadline, &online, ahci_check_ready);
 
 	/* restore the PxCMD and PxIS on ls1021 */
 	if (ls1021a_workaround) {
diff --git a/drivers/ata/ahci_xgene.c b/drivers/ata/ahci_xgene.c
index 7bb5db17f864..8d1598232e92 100644
--- a/drivers/ata/ahci_xgene.c
+++ b/drivers/ata/ahci_xgene.c
@@ -350,7 +350,8 @@  static void xgene_ahci_set_phy_cfg(struct xgene_ahci_context *ctx, int channel)
 static int xgene_ahci_do_hardreset(struct ata_link *link,
 				   unsigned long deadline, bool *online)
 {
-	const unsigned long *timing = sata_ehc_deb_timing(&link->eh_context);
+	const struct sata_deb_timing *timing =
+		sata_ehc_deb_timing(&link->eh_context);
 	struct ata_port *ap = link->ap;
 	struct ahci_host_priv *hpriv = ap->host->private_data;
 	struct xgene_ahci_context *ctx = hpriv->plat_data;
diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c
index cf8c7fd59ada..0ac3b382fa52 100644
--- a/drivers/ata/libahci.c
+++ b/drivers/ata/libahci.c
@@ -1549,7 +1549,6 @@  static int ahci_pmp_retry_softreset(struct ata_link *link, unsigned int *class,
 int ahci_do_hardreset(struct ata_link *link, unsigned int *class,
 		      unsigned long deadline, bool *online)
 {
-	const unsigned long *timing = sata_ehc_deb_timing(&link->eh_context);
 	struct ata_port *ap = link->ap;
 	struct ahci_port_priv *pp = ap->private_data;
 	struct ahci_host_priv *hpriv = ap->host->private_data;
@@ -1564,8 +1563,8 @@  int ahci_do_hardreset(struct ata_link *link, unsigned int *class,
 	tf.status = ATA_BUSY;
 	ata_tf_to_fis(&tf, 0, 0, d2h_fis);
 
-	rc = sata_link_hardreset(link, timing, deadline, online,
-				 ahci_check_ready);
+	rc = sata_link_hardreset(link, sata_ehc_deb_timing(&link->eh_context),
+				 deadline, online, ahci_check_ready);
 
 	hpriv->start_engine(ap);
 
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index 1bdb6e78f0ed..ffad7c1afb64 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -3616,12 +3616,13 @@  EXPORT_SYMBOL_GPL(ata_std_prereset);
 int sata_std_hardreset(struct ata_link *link, unsigned int *class,
 		       unsigned long deadline)
 {
-	const unsigned long *timing = sata_ehc_deb_timing(&link->eh_context);
 	bool online;
 	int rc;
 
 	/* do hardreset */
-	rc = sata_link_hardreset(link, timing, deadline, &online, NULL);
+	rc = sata_link_hardreset(link, sata_ehc_deb_timing(&link->eh_context),
+				 deadline, &online, NULL);
+
 	return online ? -EAGAIN : rc;
 }
 EXPORT_SYMBOL_GPL(sata_std_hardreset);
diff --git a/drivers/ata/libata-pmp.c b/drivers/ata/libata-pmp.c
index e2e9cbd405fa..1ea472ddbe3f 100644
--- a/drivers/ata/libata-pmp.c
+++ b/drivers/ata/libata-pmp.c
@@ -851,7 +851,7 @@  static int sata_pmp_eh_handle_disabled_links(struct ata_port *ap)
 		/* Some PMPs require hardreset sequence to get
 		 * SError.N working.
 		 */
-		sata_link_hardreset(link, sata_deb_timing_normal,
+		sata_link_hardreset(link, &sata_deb_timing_normal,
 				ata_deadline(jiffies, ATA_TMOUT_INTERNAL_QUICK),
 				NULL, NULL);
 
diff --git a/drivers/ata/libata-sata.c b/drivers/ata/libata-sata.c
index 86f1475e5bca..be46833d77a6 100644
--- a/drivers/ata/libata-sata.c
+++ b/drivers/ata/libata-sata.c
@@ -16,12 +16,31 @@ 
 #include "libata.h"
 #include "libata-transport.h"
 
-/* debounce timing parameters in msecs { interval, duration, timeout } */
-const unsigned long sata_deb_timing_normal[]		= {   5,  100, 2000 };
+/*
+ * Debounce timing parameters in msecs.
+ */
+const struct sata_deb_timing sata_deb_timing_normal =
+{
+	.interval	= 5,
+	.duration	= 100,
+	.timeout	= 2000
+};
 EXPORT_SYMBOL_GPL(sata_deb_timing_normal);
-const unsigned long sata_deb_timing_hotplug[]		= {  25,  500, 2000 };
+
+const struct sata_deb_timing sata_deb_timing_hotplug =
+{
+	.interval	= 25,
+	.duration	= 500,
+	.timeout	= 2000
+};
 EXPORT_SYMBOL_GPL(sata_deb_timing_hotplug);
-const unsigned long sata_deb_timing_long[]		= { 100, 2000, 5000 };
+
+const struct sata_deb_timing sata_deb_timing_long =
+{
+	.interval	= 100,
+	.duration	= 2000,
+	.timeout	= 5000
+};
 EXPORT_SYMBOL_GPL(sata_deb_timing_long);
 
 /**
@@ -211,7 +230,7 @@  EXPORT_SYMBOL_GPL(ata_tf_from_fis);
 /**
  *	sata_link_debounce - debounce SATA phy status
  *	@link: ATA link to debounce SATA phy status for
- *	@params: timing parameters { interval, duration, timeout } in msec
+ *	@timing: debounce timing
  *	@deadline: deadline jiffies for the operation
  *
  *	Make sure SStatus of @link reaches stable state, determined by
@@ -230,16 +249,15 @@  EXPORT_SYMBOL_GPL(ata_tf_from_fis);
  *	RETURNS:
  *	0 on success, -errno on failure.
  */
-int sata_link_debounce(struct ata_link *link, const unsigned long *params,
+int sata_link_debounce(struct ata_link *link,
+		       const struct sata_deb_timing *timing,
 		       unsigned long deadline)
 {
-	unsigned long interval = params[0];
-	unsigned long duration = params[1];
 	unsigned long last_jiffies, t;
 	u32 last, cur;
 	int rc;
 
-	t = ata_deadline(jiffies, params[2]);
+	t = ata_deadline(jiffies, timing->timeout);
 	if (time_before(t, deadline))
 		deadline = t;
 
@@ -251,7 +269,7 @@  int sata_link_debounce(struct ata_link *link, const unsigned long *params,
 	last_jiffies = jiffies;
 
 	while (1) {
-		ata_msleep(link->ap, interval);
+		ata_msleep(link->ap, timing->interval);
 		if ((rc = sata_scr_read(link, SCR_STATUS, &cur)))
 			return rc;
 		cur &= 0xf;
@@ -261,7 +279,7 @@  int sata_link_debounce(struct ata_link *link, const unsigned long *params,
 			if (cur == 1 && time_before(jiffies, deadline))
 				continue;
 			if (time_after(jiffies,
-				       ata_deadline(last_jiffies, duration)))
+				ata_deadline(last_jiffies, timing->duration)))
 				return 0;
 			continue;
 		}
@@ -280,7 +298,7 @@  int sata_link_debounce(struct ata_link *link, const unsigned long *params,
 EXPORT_SYMBOL_GPL(sata_link_debounce);
 
 static int __sata_link_resume(struct ata_link *link,
-			      const unsigned long *timing,
+			      const struct sata_deb_timing *timing,
 			      unsigned long deadline)
 {
 	int tries = ATA_LINK_RESUME_TRIES;
@@ -511,7 +529,7 @@  EXPORT_SYMBOL_GPL(sata_set_spd);
 /**
  *	sata_link_hardreset - reset link via SATA phy reset
  *	@link: link to reset
- *	@timing: timing parameters { interval, duration, timeout } in msec
+ *	@timing: debounce timing parameters
  *	@deadline: deadline jiffies for the operation
  *	@online: optional out parameter indicating link onlineness
  *	@check_ready: optional callback to check link readiness
@@ -532,7 +550,8 @@  EXPORT_SYMBOL_GPL(sata_set_spd);
  *	RETURNS:
  *	0 on success, -errno otherwise.
  */
-int sata_link_hardreset(struct ata_link *link, const unsigned long *timing,
+int sata_link_hardreset(struct ata_link *link,
+			const struct sata_deb_timing *timing,
 			unsigned long deadline,
 			bool *online, int (*check_ready)(struct ata_link *))
 {
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c
index b3be7a8f5bea..ffd085b09abc 100644
--- a/drivers/ata/libata-sff.c
+++ b/drivers/ata/libata-sff.c
@@ -2030,13 +2030,11 @@  EXPORT_SYMBOL_GPL(ata_sff_softreset);
 int sata_sff_hardreset(struct ata_link *link, unsigned int *class,
 		       unsigned long deadline)
 {
-	struct ata_eh_context *ehc = &link->eh_context;
-	const unsigned long *timing = sata_ehc_deb_timing(ehc);
 	bool online;
 	int rc;
 
-	rc = sata_link_hardreset(link, timing, deadline, &online,
-				 ata_sff_check_ready);
+	rc = sata_link_hardreset(link, sata_ehc_deb_timing(&link->eh_context),
+				 deadline, &online, ata_sff_check_ready);
 	if (online)
 		*class = ata_sff_dev_classify(link->device, 1, NULL);
 
diff --git a/drivers/ata/sata_highbank.c b/drivers/ata/sata_highbank.c
index dfbf9493e451..16da571e8083 100644
--- a/drivers/ata/sata_highbank.c
+++ b/drivers/ata/sata_highbank.c
@@ -385,7 +385,7 @@  static int highbank_initialize_phys(struct device *dev, void __iomem *addr)
 static int ahci_highbank_hardreset(struct ata_link *link, unsigned int *class,
 				unsigned long deadline)
 {
-	static const unsigned long timing[] = { 5, 100, 500};
+	const struct sata_deb_timing timing = { 5, 100, 500};
 	struct ata_port *ap = link->ap;
 	struct ahci_port_priv *pp = ap->private_data;
 	struct ahci_host_priv *hpriv = ap->host->private_data;
@@ -405,7 +405,7 @@  static int ahci_highbank_hardreset(struct ata_link *link, unsigned int *class,
 
 	do {
 		highbank_cphy_disable_overrides(link->ap->port_no);
-		rc = sata_link_hardreset(link, timing, deadline, &online, NULL);
+		rc = sata_link_hardreset(link, &timing, deadline, &online, NULL);
 		highbank_cphy_override_lane(link->ap->port_no);
 
 		/* If the status is 1, we are connected, but the link did not
diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c
index de5bd02cad44..8ad0f3776c48 100644
--- a/drivers/ata/sata_mv.c
+++ b/drivers/ata/sata_mv.c
@@ -3633,11 +3633,9 @@  static int mv_hardreset(struct ata_link *link, unsigned int *class,
 
 	/* Workaround for errata FEr SATA#10 (part 2) */
 	do {
-		const unsigned long *timing =
-				sata_ehc_deb_timing(&link->eh_context);
-
-		rc = sata_link_hardreset(link, timing, deadline + extra,
-					 &online, NULL);
+		rc = sata_link_hardreset(link,
+					 sata_ehc_deb_timing(&link->eh_context),
+					 deadline + extra, &online, NULL);
 		rc = online ? -EAGAIN : rc;
 		if (rc)
 			return rc;
diff --git a/drivers/ata/sata_nv.c b/drivers/ata/sata_nv.c
index b5f27eac86b1..5c8db8f8c47f 100644
--- a/drivers/ata/sata_nv.c
+++ b/drivers/ata/sata_nv.c
@@ -1526,7 +1526,7 @@  static int nv_hardreset(struct ata_link *link, unsigned int *class,
 	 */
 	if (!(link->ap->pflags & ATA_PFLAG_LOADING) &&
 	    !ata_dev_enabled(link->device))
-		sata_link_hardreset(link, sata_deb_timing_hotplug, deadline,
+		sata_link_hardreset(link, &sata_deb_timing_hotplug, deadline,
 				    NULL, NULL);
 	else {
 		int rc;
diff --git a/drivers/ata/sata_sil24.c b/drivers/ata/sata_sil24.c
index 2fef6ce93f07..4c4ff67bf06a 100644
--- a/drivers/ata/sata_sil24.c
+++ b/drivers/ata/sata_sil24.c
@@ -735,7 +735,7 @@  static int sil24_hardreset(struct ata_link *link, unsigned int *class,
 	/* SStatus oscillates between zero and valid status after
 	 * DEV_RST, debounce it.
 	 */
-	rc = sata_link_debounce(link, sata_deb_timing_long, deadline);
+	rc = sata_link_debounce(link, &sata_deb_timing_long, deadline);
 	if (rc) {
 		reason = "PHY debouncing failed";
 		goto err;
diff --git a/include/linux/libata.h b/include/linux/libata.h
index e89d612326f6..166263d9bbc7 100644
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
@@ -1150,17 +1150,26 @@  extern void ata_scsi_cmd_error_handler(struct Scsi_Host *host, struct ata_port *
  * SATA specific code - drivers/ata/libata-sata.c
  */
 #ifdef CONFIG_SATA_HOST
-extern const unsigned long sata_deb_timing_normal[];
-extern const unsigned long sata_deb_timing_hotplug[];
-extern const unsigned long sata_deb_timing_long[];
 
-static inline const unsigned long *
+/*
+ * Debounce timing parameters in msecs.
+ */
+struct sata_deb_timing {
+	unsigned long interval;
+	unsigned long duration;
+	unsigned long timeout;
+};
+
+extern const struct sata_deb_timing sata_deb_timing_normal;
+extern const struct sata_deb_timing sata_deb_timing_hotplug;
+extern const struct sata_deb_timing sata_deb_timing_long;
+
+static inline const struct sata_deb_timing *
 sata_ehc_deb_timing(struct ata_eh_context *ehc)
 {
 	if (ehc->i.flags & ATA_EHI_HOTPLUGGED)
-		return sata_deb_timing_hotplug;
-	else
-		return sata_deb_timing_normal;
+		return &sata_deb_timing_hotplug;
+	return &sata_deb_timing_normal;
 }
 
 extern int sata_scr_valid(struct ata_link *link);
@@ -1169,12 +1178,13 @@  extern int sata_scr_write(struct ata_link *link, int reg, u32 val);
 extern int sata_scr_write_flush(struct ata_link *link, int reg, u32 val);
 extern int sata_set_spd(struct ata_link *link);
 extern int sata_link_hardreset(struct ata_link *link,
-			const unsigned long *timing, unsigned long deadline,
-			bool *online, int (*check_ready)(struct ata_link *));
+			       const struct sata_deb_timing *timing,
+			       unsigned long deadline, bool *online,
+			       int (*check_ready)(struct ata_link *));
 extern int sata_link_resume(struct ata_link *link, unsigned long deadline);
 extern void ata_eh_analyze_ncq_error(struct ata_link *link);
 #else
-static inline const unsigned long *
+static inline const struct sata_deb_timing *
 sata_ehc_deb_timing(struct ata_eh_context *ehc)
 {
 	return NULL;
@@ -1194,9 +1204,8 @@  static inline int sata_scr_write_flush(struct ata_link *link, int reg, u32 val)
 }
 static inline int sata_set_spd(struct ata_link *link) { return -EOPNOTSUPP; }
 static inline int sata_link_hardreset(struct ata_link *link,
-				      const unsigned long *timing,
-				      unsigned long deadline,
-				      bool *online,
+				      const struct sata_deb_timing *timing,
+				      unsigned long deadline, bool *online,
 				      int (*check_ready)(struct ata_link *))
 {
 	if (online)
@@ -1211,7 +1220,8 @@  static inline int sata_link_resume(struct ata_link *link,
 static inline void ata_eh_analyze_ncq_error(struct ata_link *link) { }
 #endif
 extern int sata_link_debounce(struct ata_link *link,
-			const unsigned long *params, unsigned long deadline);
+			      const struct sata_deb_timing *timing,
+			      unsigned long deadline);
 extern int sata_link_scr_lpm(struct ata_link *link, enum ata_lpm_policy policy,
 			     bool spm_wakeup);
 extern int ata_slave_link_init(struct ata_port *ap);