[Fwd: [PATCH 1/2 #upstream] libata: udpate ata_dev_try_classify() arguments]

Tim Gardner tim.gardner at canonical.com
Tue Aug 21 16:57:38 UTC 2007


Edward,

I suggest you keep an eye  on the progress of these patches. We can
cherry-pick them after they have been vetted by upstream, preferably
2.6.22 stable.

rtg

Edward Amsden wrote:
> This is the the first of two patches for kernel bug #8784, launchpad bug
> #126849. This patch was created by Tejun Heo of the linux kernel
> development team. It will be committed to kernel 2.6.23. The patch has
> been tested against kernel 2.6.22, and along with path 2/2 solves the
> issues with ICHx chipsets not recognizing ATA/SATA drives with the
> ata_piix module.
> 
> 
> ------------------------------------------------------------------------
> 
> Subject:
> [PATCH 1/2 #upstream] libata: udpate ata_dev_try_classify() arguments
> From:
> Tejun Heo <htejun at gmail.com>
> Date:
> Wed, 8 Aug 2007 14:37:39 +0900
> To:
> Jeff Garzik <jeff at garzik.org>, linux-ide at vger.kernel.org, Alan Cox
> <alan at lxorguk.ukuu.org.uk>, amsden_linux at earthlink.net
> 
> To:
> Jeff Garzik <jeff at garzik.org>, linux-ide at vger.kernel.org, Alan Cox
> <alan at lxorguk.ukuu.org.uk>, amsden_linux at earthlink.net
> 
> 
> Make ata_dev_try_classify() take a pointer to ata_device instead of
> ata_port/port_number combination for consistency and add @present
> argument.  @present indicates whether the device seems present during
> reset.  It's the result of TF access during softreset and link
> onlineness during hardreset.  @present will be used to improve
> diagnostic failure handling.
> 
> Signed-off-by: Tejun Heo <htejun at gmail.com>
> ---
>  drivers/ata/libata-core.c |   31 +++++++++++++++++--------------
>  drivers/ata/pata_scc.c    |    6 ++++--
>  drivers/ata/sata_mv.c     |    2 +-
>  include/linux/libata.h    |    3 ++-
>  4 files changed, 24 insertions(+), 18 deletions(-)
> 
> Index: work/drivers/ata/libata-core.c
> ===================================================================
> --- work.orig/drivers/ata/libata-core.c
> +++ work/drivers/ata/libata-core.c
> @@ -696,8 +696,8 @@ unsigned int ata_dev_classify(const stru
>  
>  /**
>   *	ata_dev_try_classify - Parse returned ATA device signature
> - *	@ap: ATA channel to examine
> - *	@device: Device to examine (starting at zero)
> + *	@dev: ATA device to classify (starting at zero)
> + *	@present: device seems present
>   *	@r_err: Value of error register on completion
>   *
>   *	After an event -- SRST, E.D.D., or SATA COMRESET -- occurs,
> @@ -715,15 +715,15 @@ unsigned int ata_dev_classify(const stru
>   *	RETURNS:
>   *	Device type - %ATA_DEV_ATA, %ATA_DEV_ATAPI or %ATA_DEV_NONE.
>   */
> -
> -unsigned int
> -ata_dev_try_classify(struct ata_port *ap, unsigned int device, u8 *r_err)
> +unsigned int ata_dev_try_classify(struct ata_device *dev, int present,
> +				  u8 *r_err)
>  {
> +	struct ata_port *ap = dev->ap;
>  	struct ata_taskfile tf;
>  	unsigned int class;
>  	u8 err;
>  
> -	ap->ops->dev_select(ap, device);
> +	ap->ops->dev_select(ap, dev->devno);
>  
>  	memset(&tf, 0, sizeof(tf));
>  
> @@ -733,12 +733,12 @@ ata_dev_try_classify(struct ata_port *ap
>  		*r_err = err;
>  
>  	/* see if device passed diags: if master then continue and warn later */
> -	if (err == 0 && device == 0)
> +	if (err == 0 && dev->devno == 0)
>  		/* diagnostic fail : do nothing _YET_ */
> -		ap->device[device].horkage |= ATA_HORKAGE_DIAGNOSTIC;
> +		dev->horkage |= ATA_HORKAGE_DIAGNOSTIC;
>  	else if (err == 1)
>  		/* do nothing */ ;
> -	else if ((device == 0) && (err == 0x81))
> +	else if ((dev->devno == 0) && (err == 0x81))
>  		/* do nothing */ ;
>  	else
>  		return ATA_DEV_NONE;
> @@ -3176,9 +3176,10 @@ void ata_bus_reset(struct ata_port *ap)
>  	/*
>  	 * determine by signature whether we have ATA or ATAPI devices
>  	 */
> -	ap->device[0].class = ata_dev_try_classify(ap, 0, &err);
> +	ap->device[0].class = ata_dev_try_classify(&ap->device[0], dev0, &err);
>  	if ((slave_possible) && (err != 0x81))
> -		ap->device[1].class = ata_dev_try_classify(ap, 1, &err);
> +		ap->device[1].class = ata_dev_try_classify(&ap->device[1],
> +							   dev1, &err);
>  
>  	/* is double-select really necessary? */
>  	if (ap->device[1].class != ATA_DEV_NONE)
> @@ -3415,9 +3416,11 @@ int ata_std_softreset(struct ata_port *a
>  	}
>  
>  	/* determine by signature whether we have ATA or ATAPI devices */
> -	classes[0] = ata_dev_try_classify(ap, 0, &err);
> +	classes[0] = ata_dev_try_classify(&ap->device[0],
> +					  devmask & (1 << 0), &err);
>  	if (slave_possible && err != 0x81)
> -		classes[1] = ata_dev_try_classify(ap, 1, &err);
> +		classes[1] = ata_dev_try_classify(&ap->device[1],
> +						  devmask & (1 << 1), &err);
>  
>   out:
>  	DPRINTK("EXIT, classes[0]=%u [1]=%u\n", classes[0], classes[1]);
> @@ -3535,7 +3538,7 @@ int sata_std_hardreset(struct ata_port *
>  
>  	ap->ops->dev_select(ap, 0);	/* probably unnecessary */
>  
> -	*class = ata_dev_try_classify(ap, 0, NULL);
> +	*class = ata_dev_try_classify(ap->device, 1, NULL);
>  
>  	DPRINTK("EXIT, class=%u\n", *class);
>  	return 0;
> Index: work/drivers/ata/pata_scc.c
> ===================================================================
> --- work.orig/drivers/ata/pata_scc.c
> +++ work/drivers/ata/pata_scc.c
> @@ -636,9 +636,11 @@ static int scc_std_softreset (struct ata
>  	}
>  
>  	/* determine by signature whether we have ATA or ATAPI devices */
> -	classes[0] = ata_dev_try_classify(ap, 0, &err);
> +	classes[0] = ata_dev_try_classify(&ap->device[0],
> +					  devmask & (1 << 0), &err);
>  	if (slave_possible && err != 0x81)
> -		classes[1] = ata_dev_try_classify(ap, 1, &err);
> +		classes[1] = ata_dev_try_classify(&ap->device[1],
> +						  devmask & (1 << 1), &err);
>  
>   out:
>  	DPRINTK("EXIT, classes[0]=%u [1]=%u\n", classes[0], classes[1]);
> Index: work/drivers/ata/sata_mv.c
> ===================================================================
> --- work.orig/drivers/ata/sata_mv.c
> +++ work/drivers/ata/sata_mv.c
> @@ -2233,7 +2233,7 @@ comreset_retry:
>  	 */
>  
>  	/* finally, read device signature from TF registers */
> -	*class = ata_dev_try_classify(ap, 0, NULL);
> +	*class = ata_dev_try_classify(ap->device, 1, NULL);
>  
>  	writelfl(0, port_mmio + EDMA_ERR_IRQ_CAUSE_OFS);
>  
> Index: work/include/linux/libata.h
> ===================================================================
> --- work.orig/include/linux/libata.h
> +++ work/include/linux/libata.h
> @@ -764,7 +764,8 @@ extern void ata_port_queue_task(struct a
>  extern u32 ata_wait_register(void __iomem *reg, u32 mask, u32 val,
>  			     unsigned long interval_msec,
>  			     unsigned long timeout_msec);
> -extern unsigned int ata_dev_try_classify(struct ata_port *, unsigned int, u8 *);
> +extern unsigned int ata_dev_try_classify(struct ata_device *dev, int present,
> +					 u8 *r_err);
>  
>  /*
>   * Default driver ops implementations
> 


-- 
Tim Gardner tim.gardner at ubuntu.com




More information about the kernel-team mailing list