All of lore.kernel.org
 help / color / mirror / Atom feed
From: Damien Le Moal <dlemoal@kernel.org>
To: Ondrej Zary <linux@zary.sk>,
	Sudip Mukherjee <sudipm.mukherjee@gmail.com>
Cc: Christoph Hellwig <hch@lst.de>,
	Sergey Shtylyov <s.shtylyov@omp.ru>, Tim Waugh <tim@cyberelk.net>,
	linux-parport@lists.infradead.org, linux-ide@vger.kernel.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH 3/4] pata_parport: add custom version of wait_after_reset
Date: Tue, 3 Oct 2023 09:55:01 +0900	[thread overview]
Message-ID: <d2fd9a3c-3efd-dbfe-7b2a-dc36989b8379@kernel.org> (raw)
In-Reply-To: <20230930191511.24994-4-linux@zary.sk>

On 10/1/23 04:15, Ondrej Zary wrote:
> Some parallel adapters (e.g. EXP Computer MC-1285B EPP Cable) return
> bogus values when there's no master device present. This can cause
> reset to fail, preventing the lone slave device (such as EXP Computer
> CD-865) from working.
> 
> Add custom version of wait_after_reset that ignores master failure when
> a slave device is present. The custom version is also needed because
> the generic ata_sff_wait_after_reset uses direct port I/O for slave
> device detection.
> 
> Signed-off-by: Ondrej Zary <linux@zary.sk>
> ---
>  drivers/ata/pata_parport/pata_parport.c | 65 ++++++++++++++++++++++++-
>  1 file changed, 64 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/ata/pata_parport/pata_parport.c b/drivers/ata/pata_parport/pata_parport.c
> index cf87bbb52f1f..b3db953e615a 100644
> --- a/drivers/ata/pata_parport/pata_parport.c
> +++ b/drivers/ata/pata_parport/pata_parport.c
> @@ -80,6 +80,69 @@ static bool pata_parport_devchk(struct ata_port *ap, unsigned int device)
>  	return (nsect == 0x55) && (lbal == 0xaa);
>  }
>  
> +static int pata_parport_wait_after_reset(struct ata_link *link,
> +					 unsigned int devmask,
> +					 unsigned long deadline)
> +{
> +	struct ata_port *ap = link->ap;
> +	struct pi_adapter *pi = ap->host->private_data;
> +	unsigned int dev0 = devmask & (1 << 0);
> +	unsigned int dev1 = devmask & (1 << 1);
> +	int rc, ret = 0;
> +
> +	ata_msleep(ap, ATA_WAIT_AFTER_RESET);
> +
> +	/* always check readiness of the master device */
> +	rc = ata_sff_wait_ready(link, deadline);
> +	/* some adapters return bogus values if master device is not present,
> +	 * so don't abort now if a slave device is present
> +	 */

In addition to Sergey's comment, please move this comment inside the "if", or
even better, merge it with the otherwise not very useful "always check
readiness..." comment.

> +	if (rc) {
> +		if (!dev1)
> +			return rc;
> +		ret = -ENODEV;
> +	}
> +
> +	/* if device 1 was found in ata_devchk, wait for register
> +	 * access briefly, then wait for BSY to clear.
> +	 */
> +	if (dev1) {
> +		int i;
> +
> +		pata_parport_dev_select(ap, 1);
> +
> +		/* Wait for register access.  Some ATAPI devices fail
> +		 * to set nsect/lbal after reset, so don't waste too
> +		 * much time on it.  We're gonna wait for !BSY anyway.
> +		 */
> +		for (i = 0; i < 2; i++) {
> +			u8 nsect, lbal;
> +
> +			nsect = pi->proto->read_regr(pi, 0, ATA_REG_NSECT);
> +			lbal = pi->proto->read_regr(pi, 0, ATA_REG_LBAL);
> +			if ((nsect == 1) && (lbal == 1))
> +				break;
> +			ata_msleep(ap, 50);	/* give drive a breather */

Please move the comment on its own line above the sleep call.

> +		}
> +
> +		rc = ata_sff_wait_ready(link, deadline);
> +		if (rc) {
> +			if (rc != -ENODEV)
> +				return rc;
> +			ret = rc;
> +		}
> +	}
> +
> +	/* is all this really necessary? */

I don't know. It is your driver... So either drop this comment, or clearly
explain why this is done.

> +	pata_parport_dev_select(ap, 0);
> +	if (dev1)
> +		pata_parport_dev_select(ap, 1);
> +	if (dev0)
> +		pata_parport_dev_select(ap, 0);

Can you have dev1 && dev0 == true ? This seems like the second if should be an
"else if", but it is not clear what this is doing.

> +
> +	return ret;
> +}
> +
>  static int pata_parport_bus_softreset(struct ata_port *ap, unsigned int devmask,
>  				      unsigned long deadline)
>  {
> @@ -94,7 +157,7 @@ static int pata_parport_bus_softreset(struct ata_port *ap, unsigned int devmask,
>  	ap->last_ctl = ap->ctl;
>  
>  	/* wait the port to become ready */
> -	return ata_sff_wait_after_reset(&ap->link, devmask, deadline);
> +	return pata_parport_wait_after_reset(&ap->link, devmask, deadline);
>  }
>  
>  static int pata_parport_softreset(struct ata_link *link, unsigned int *classes,

-- 
Damien Le Moal
Western Digital Research


  parent reply	other threads:[~2023-10-03  0:55 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-09-30 19:15 [PATCH 0/4] pata_parport: fix EXP Computer CD-865 with MC-1285B EPP cable Ondrej Zary
2023-09-30 19:15 ` [PATCH 1/4] pata_parport: fix pata_parport_devchk Ondrej Zary
2023-10-02 18:43   ` Sergey Shtylyov
2023-10-02 19:08     ` Sergey Shtylyov
2023-10-03 17:07     ` Ondrej Zary
2023-10-03 17:18       ` Sergei Shtylyov
2023-09-30 19:15 ` [PATCH 2/4] pata_parport: implement set_devctl Ondrej Zary
2023-10-02 19:52   ` Sergey Shtylyov
2023-09-30 19:15 ` [PATCH 3/4] pata_parport: add custom version of wait_after_reset Ondrej Zary
2023-10-02 20:48   ` Sergey Shtylyov
2023-10-03 17:20     ` Ondrej Zary
2023-10-03  0:55   ` Damien Le Moal [this message]
2023-10-03 16:55     ` Sergey Shtylyov
2023-10-03 23:44       ` Damien Le Moal
2023-09-30 19:15 ` [PATCH 4/4] pata_parport-fit3: implement IDE command set registers Ondrej Zary
2023-10-02 20:06   ` Sergey Shtylyov
2023-10-03 17:13     ` Ondrej Zary
2023-10-03  0:56   ` Damien Le Moal
2023-10-03  0:34 ` [PATCH 0/4] pata_parport: fix EXP Computer CD-865 with MC-1285B EPP cable Damien Le Moal

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=d2fd9a3c-3efd-dbfe-7b2a-dc36989b8379@kernel.org \
    --to=dlemoal@kernel.org \
    --cc=hch@lst.de \
    --cc=linux-ide@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-parport@lists.infradead.org \
    --cc=linux@zary.sk \
    --cc=s.shtylyov@omp.ru \
    --cc=sudipm.mukherjee@gmail.com \
    --cc=tim@cyberelk.net \
    /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.