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] [thread-next>] [day] [month] [year] [list]
Message-ID: <4F78BF08.2090709@suse.cz>
Date:	Sun, 01 Apr 2012 22:48:08 +0200
From:	Jiri Slaby <jslaby@...e.cz>
To:	Lin Ming <ming.m.lin@...el.com>
CC:	Jeff Garzik <jgarzik@...ox.com>, linux-ide@...r.kernel.org,
	lkml <linux-kernel@...r.kernel.org>,
	Jiri Slaby <jirislaby@...il.com>, cwillu@...llu.com,
	jackdachef@...il.com, Sergei Shtylyov <sshtylyov@...sta.com>,
	Linus Torvalds <torvalds@...ux-foundation.org>
Subject: Re: [PATCH v2] libata: disable runtime pm for hotpluggable port

On 03/13/2012 02:57 AM, Lin Ming wrote:
> Currently, hotplug doesn't work if port is already runtime suspended.
> For now, we simply disable runtime pm for hotpluggable port.
> Later, we should add runtime pm support for hotpluggable port too.
> 
> Bug report:
> https://lkml.org/lkml/2012/2/19/70
> 
> v2:
> - Use bit 2 and 3 for flags ATA_FLAG_EXTERNAL and ATA_FLAG_PLUGGABLE.
> 
> TODO: add similar hotpluggable port check for controllers other than
> AHCI.

Any updates on this? The patches which introduced the bug are in -rc1
now. Unlike this patch.

> Reported-and-tested-by: Jiri Slaby <jslaby@...e.cz>
> Reported-and-tested-by: cwillu@...llu.com
> Reported-and-tested-by: jackdachef@...il.com
> Signed-off-by: Lin Ming <ming.m.lin@...el.com>
> ---
>  drivers/ata/ahci.c             |    3 +++
>  drivers/ata/ahci.h             |    3 +++
>  drivers/ata/libahci.c          |   20 ++++++++++++++++++++
>  drivers/ata/libata-transport.c |    6 ++++--
>  include/linux/libata.h         |    2 ++
>  5 files changed, 32 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
> index d07bf03..02e93ff 100644
> --- a/drivers/ata/ahci.c
> +++ b/drivers/ata/ahci.c
> @@ -1145,6 +1145,9 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
>  	if (hpriv->cap & HOST_CAP_PMP)
>  		pi.flags |= ATA_FLAG_PMP;
>  
> +	if (hpriv->cap & HOST_CAP_SXS)
> +		pi.flags |= ATA_FLAG_EXTERNAL;
> +
>  	ahci_set_em_messages(hpriv, &pi);
>  
>  	if (ahci_broken_system_poweroff(pdev)) {
> diff --git a/drivers/ata/ahci.h b/drivers/ata/ahci.h
> index b175000..92f7172 100644
> --- a/drivers/ata/ahci.h
> +++ b/drivers/ata/ahci.h
> @@ -172,6 +172,9 @@ enum {
>  	PORT_CMD_ALPE		= (1 << 26), /* Aggressive Link PM enable */
>  	PORT_CMD_ATAPI		= (1 << 24), /* Device is ATAPI */
>  	PORT_CMD_FBSCP		= (1 << 22), /* FBS Capable Port */
> +	PORT_CMD_ESP		= (1 << 21), /* External SATA Port */
> +	PORT_CMD_MPSP		= (1 << 19), /* Mechanical Presence Switch Attached to Port */
> +	PORT_CMD_HPCP		= (1 << 18), /* Hot Plug Capable Port */
>  	PORT_CMD_PMP		= (1 << 17), /* PMP attached */
>  	PORT_CMD_LIST_ON	= (1 << 15), /* cmd list DMA engine running */
>  	PORT_CMD_FIS_ON		= (1 << 14), /* FIS DMA engine running */
> diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c
> index a72bfd0..7d72d3c 100644
> --- a/drivers/ata/libahci.c
> +++ b/drivers/ata/libahci.c
> @@ -1097,6 +1097,23 @@ static void ahci_port_init(struct device *dev, struct ata_port *ap,
>  	writel(1 << port_no, mmio + HOST_IRQ_STAT);
>  }
>  
> +static bool ahci_port_pluggable(struct ata_port *ap)
> +{
> +	void __iomem *port_mmio = ahci_port_base(ap);
> +	u32 cmd;
> +
> +	cmd = readl(port_mmio + PORT_CMD);
> +
> +	if ((ap->flags & ATA_FLAG_EXTERNAL) &&
> +	    (cmd & PORT_CMD_ESP))
> +		return true;
> +
> +	if (cmd & (PORT_CMD_MPSP | PORT_CMD_HPCP))
> +		return true;
> +
> +	return false;
> +}
> +
>  void ahci_init_controller(struct ata_host *host)
>  {
>  	struct ahci_host_priv *hpriv = host->private_data;
> @@ -1112,6 +1129,9 @@ void ahci_init_controller(struct ata_host *host)
>  		if (ata_port_is_dummy(ap))
>  			continue;
>  
> +		if (ahci_port_pluggable(ap))
> +			ap->flags |= ATA_FLAG_PLUGGABLE;
> +
>  		ahci_port_init(host->dev, ap, i, mmio, port_mmio);
>  	}
>  
> diff --git a/drivers/ata/libata-transport.c b/drivers/ata/libata-transport.c
> index 74aaee3..a7166b9 100644
> --- a/drivers/ata/libata-transport.c
> +++ b/drivers/ata/libata-transport.c
> @@ -292,8 +292,10 @@ int ata_tport_add(struct device *parent,
>  	}
>  
>  	device_enable_async_suspend(dev);
> -	pm_runtime_set_active(dev);
> -	pm_runtime_enable(dev);
> +	if (!(ap->flags & ATA_FLAG_PLUGGABLE)) {
> +		pm_runtime_set_active(dev);
> +		pm_runtime_enable(dev);
> +	}
>  
>  	transport_add_device(dev);
>  	transport_configure_device(dev);
> diff --git a/include/linux/libata.h b/include/linux/libata.h
> index cafc09a..f46961d 100644
> --- a/include/linux/libata.h
> +++ b/include/linux/libata.h
> @@ -187,6 +187,8 @@ enum {
>  	ATA_FLAG_SLAVE_POSS	= (1 << 0), /* host supports slave dev */
>  					    /* (doesn't imply presence) */
>  	ATA_FLAG_SATA		= (1 << 1),
> +	ATA_FLAG_EXTERNAL	= (1 << 2), /* Controller supports external SATA */
> +	ATA_FLAG_PLUGGABLE	= (1 << 3), /* Port is hotpluggable */
>  	ATA_FLAG_NO_ATAPI	= (1 << 6), /* No ATAPI support */
>  	ATA_FLAG_PIO_DMA	= (1 << 7), /* PIO cmds via DMA */
>  	ATA_FLAG_PIO_LBA48	= (1 << 8), /* Host DMA engine is LBA28 only */
> 
-- 
js
suse labs

--
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