summaryrefslogtreecommitdiffstats
path: root/libata-disable-runtime-pm-for-hotpluggable-port.patch
diff options
context:
space:
mode:
authorJosh Boyer <jwboyer@redhat.com>2012-04-04 10:48:11 -0400
committerJosh Boyer <jwboyer@redhat.com>2012-04-04 10:48:11 -0400
commitf8ac3b70ec493b62901db3e23676e2f9035d45bb (patch)
tree96333f9735ac7af1116964f0de83bbe6f8a94911 /libata-disable-runtime-pm-for-hotpluggable-port.patch
parent28582472ab25c8190b0466fc1c2e5ee08648b9d1 (diff)
downloadkernel-f8ac3b70ec493b62901db3e23676e2f9035d45bb.tar.gz
kernel-f8ac3b70ec493b62901db3e23676e2f9035d45bb.tar.xz
kernel-f8ac3b70ec493b62901db3e23676e2f9035d45bb.zip
Disable runtime PM for hotpluggable ATA ports (rhbz 806676)
Diffstat (limited to 'libata-disable-runtime-pm-for-hotpluggable-port.patch')
-rw-r--r--libata-disable-runtime-pm-for-hotpluggable-port.patch180
1 files changed, 180 insertions, 0 deletions
diff --git a/libata-disable-runtime-pm-for-hotpluggable-port.patch b/libata-disable-runtime-pm-for-hotpluggable-port.patch
new file mode 100644
index 000000000..06020fdde
--- /dev/null
+++ b/libata-disable-runtime-pm-for-hotpluggable-port.patch
@@ -0,0 +1,180 @@
+Path: news.gmane.org!not-for-mail
+From: Lin Ming <ming.m.lin@intel.com>
+Newsgroups: gmane.linux.ide,gmane.linux.kernel
+Subject: [PATCH v2] libata: disable runtime pm for hotpluggable port
+Date: Tue, 13 Mar 2012 09:57:37 +0800
+Lines: 131
+Approved: news@gmane.org
+Message-ID: <1331603857.3436.24.camel@minggr>
+NNTP-Posting-Host: plane.gmane.org
+Mime-Version: 1.0
+Content-Type: text/plain; charset="UTF-8"
+Content-Transfer-Encoding: 7bit
+X-Trace: dough.gmane.org 1331603865 12388 80.91.229.3 (13 Mar 2012 01:57:45 GMT)
+X-Complaints-To: usenet@dough.gmane.org
+NNTP-Posting-Date: Tue, 13 Mar 2012 01:57:45 +0000 (UTC)
+Cc: linux-ide@vger.kernel.org, lkml <linux-kernel@vger.kernel.org>,
+ jslaby@suse.cz, cwillu@cwillu.com, jackdachef@gmail.com,
+ Sergei Shtylyov <sshtylyov@mvista.com>
+To: Jeff Garzik <jgarzik@pobox.com>
+Original-X-From: linux-ide-owner@vger.kernel.org Tue Mar 13 02:57:43 2012
+Return-path: <linux-ide-owner@vger.kernel.org>
+Envelope-to: lnx-linux-ide@plane.gmane.org
+Original-Received: from vger.kernel.org ([209.132.180.67])
+ by plane.gmane.org with esmtp (Exim 4.69)
+ (envelope-from <linux-ide-owner@vger.kernel.org>)
+ id 1S7Gze-0005pE-Sg
+ for lnx-linux-ide@plane.gmane.org; Tue, 13 Mar 2012 02:57:43 +0100
+Original-Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand
+ id S1754650Ab2CMB5l (ORCPT <rfc822;lnx-linux-ide@m.gmane.org>);
+ Mon, 12 Mar 2012 21:57:41 -0400
+Original-Received: from mga14.intel.com ([143.182.124.37]:15186 "EHLO mga14.intel.com"
+ rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP
+ id S1754582Ab2CMB5k (ORCPT <rfc822;linux-ide@vger.kernel.org>);
+ Mon, 12 Mar 2012 21:57:40 -0400
+Original-Received: from azsmga002.ch.intel.com ([10.2.17.35])
+ by azsmga102.ch.intel.com with ESMTP; 12 Mar 2012 18:57:39 -0700
+X-ExtLoop1: 1
+X-IronPort-AV: E=Sophos;i="4.71,315,1320652800";
+ d="scan'208";a="76719701"
+Original-Received: from minggr.sh.intel.com (HELO [10.239.36.45]) ([10.239.36.45])
+ by AZSMGA002.ch.intel.com with ESMTP; 12 Mar 2012 18:57:38 -0700
+X-Mailer: Evolution 2.30.3
+Original-Sender: linux-ide-owner@vger.kernel.org
+Precedence: bulk
+List-ID: <linux-ide.vger.kernel.org>
+X-Mailing-List: linux-ide@vger.kernel.org
+Xref: news.gmane.org gmane.linux.ide:51560 gmane.linux.kernel:1266262
+Archived-At: <http://permalink.gmane.org/gmane.linux.ide/51560>
+
+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.
+
+Reported-and-tested-by: Jiri Slaby <jslaby@suse.cz>
+Reported-and-tested-by: cwillu@cwillu.com
+Reported-and-tested-by: jackdachef@gmail.com
+Signed-off-by: Lin Ming <ming.m.lin@intel.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 */
+--
+1.7.2.5
+
+
+
+--
+To unsubscribe from this list: send the line "unsubscribe linux-ide" in
+the body of a message to majordomo@vger.kernel.org
+More majordomo info at http://vger.kernel.org/majordomo-info.html
+