lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Date:	Tue, 15 Mar 2011 19:02:50 +0100
From:	Stefan Bader <stefan.bader@...onical.com>
To:	Tejun Heo <tj@...nel.org>
CC:	Linux Kernel Mailing List <linux-kernel@...r.kernel.org>,
	linux-ide@...r.kernel.org, Jeff Garzik <jgarzik@...ox.com>,
	Andy Whitcroft <apw@...onical.com>
Subject: Re: Some hints needed how to handle SATA ALPM failures

On 03/11/2011 12:01 PM, Tejun Heo wrote:
> On Fri, Mar 11, 2011 at 11:27:54AM +0100, Stefan Bader wrote:
>>> Yes, it is an Nvidia MCP67 in ahci mode. I can relay the question about
>>> medium_power and yes we can try patches. If not the reporter, I can prepare
>>> kernels and ask for testing.
>>> One question in general would be whether (if it cannot be said for sure which
>>> controller is good or not) it may be a good idea to add some whitelisting for
>>> those known to work and disable (or limit the mode) for the unknown.
> 
> Does the following patch resolve the issue?
> 

A test kernel with this patch applied was just verified to be resolving the
issue by one of our affected users.

-Stefan

> Thanks.
> 
> diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
> index b8d96ce..da75ec3 100644
> --- a/drivers/ata/ahci.c
> +++ b/drivers/ata/ahci.c
> @@ -150,7 +150,7 @@ static const struct ata_port_info ahci_port_info[] = {
>  	{
>  		AHCI_HFLAGS	(AHCI_HFLAG_NO_FPDMA_AA | AHCI_HFLAG_NO_PMP |
>  				 AHCI_HFLAG_YES_NCQ),
> -		.flags		= AHCI_FLAG_COMMON,
> +		.flags		= AHCI_FLAG_COMMON | ATA_FLAG_NO_DIPM,
>  		.pio_mask	= ATA_PIO4,
>  		.udma_mask	= ATA_UDMA6,
>  		.port_ops	= &ahci_ops,
> diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
> index 17a6378..3021b95 100644
> --- a/drivers/ata/libata-eh.c
> +++ b/drivers/ata/libata-eh.c
> @@ -3276,6 +3276,7 @@ static int ata_eh_set_lpm(struct ata_link *link, enum ata_lpm_policy policy,
>  	struct ata_eh_context *ehc = &link->eh_context;
>  	struct ata_device *dev, *link_dev = NULL, *lpm_dev = NULL;
>  	enum ata_lpm_policy old_policy = link->lpm_policy;
> +	bool no_dipm = ap->flags & ATA_FLAG_NO_DIPM;
>  	unsigned int hints = ATA_LPM_EMPTY | ATA_LPM_HIPM;
>  	unsigned int err_mask;
>  	int rc;
> @@ -3292,7 +3293,7 @@ static int ata_eh_set_lpm(struct ata_link *link, enum ata_lpm_policy policy,
>  	 */
>  	ata_for_each_dev(dev, link, ENABLED) {
>  		bool hipm = ata_id_has_hipm(dev->id);
> -		bool dipm = ata_id_has_dipm(dev->id);
> +		bool dipm = ata_id_has_dipm(dev->id) && !no_dipm;
>  
>  		/* find the first enabled and LPM enabled devices */
>  		if (!link_dev)
> @@ -3349,7 +3350,8 @@ static int ata_eh_set_lpm(struct ata_link *link, enum ata_lpm_policy policy,
>  
>  	/* host config updated, enable DIPM if transitioning to MIN_POWER */
>  	ata_for_each_dev(dev, link, ENABLED) {
> -		if (policy == ATA_LPM_MIN_POWER && ata_id_has_dipm(dev->id)) {
> +		if (policy == ATA_LPM_MIN_POWER && !no_dipm &&
> +		    ata_id_has_dipm(dev->id)) {
>  			err_mask = ata_dev_set_feature(dev,
>  					SETFEATURES_SATA_ENABLE, SATA_DIPM);
>  			if (err_mask && err_mask != AC_ERR_DEV) {
> diff --git a/include/linux/libata.h b/include/linux/libata.h
> index c9c5d7a..3ad1eeb 100644
> --- a/include/linux/libata.h
> +++ b/include/linux/libata.h
> @@ -137,8 +137,6 @@ enum {
>  	ATA_DFLAG_ACPI_PENDING	= (1 << 5), /* ACPI resume action pending */
>  	ATA_DFLAG_ACPI_FAILED	= (1 << 6), /* ACPI on devcfg has failed */
>  	ATA_DFLAG_AN		= (1 << 7), /* AN configured */
> -	ATA_DFLAG_HIPM		= (1 << 8), /* device supports HIPM */
> -	ATA_DFLAG_DIPM		= (1 << 9), /* device supports DIPM */
>  	ATA_DFLAG_DMADIR	= (1 << 10), /* device requires DMADIR */
>  	ATA_DFLAG_CFG_MASK	= (1 << 12) - 1,
>  
> @@ -203,6 +201,7 @@ enum {
>  					      * management */
>  	ATA_FLAG_SW_ACTIVITY	= (1 << 22), /* driver supports sw activity
>  					      * led */
> +	ATA_FLAG_NO_DIPM	= (1 << 23), /* host not happy with DIPM */
>  
>  	/* bits 24:31 of ap->flags are reserved for LLD specific flags */
>  

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ