From f8ac3b70ec493b62901db3e23676e2f9035d45bb Mon Sep 17 00:00:00 2001 From: Josh Boyer Date: Wed, 4 Apr 2012 10:48:11 -0400 Subject: [PATCH] Disable runtime PM for hotpluggable ATA ports (rhbz 806676) --- kernel.spec | 11 +- ...ble-runtime-pm-for-hotpluggable-port.patch | 180 ++++++++++++++++++ 2 files changed, 190 insertions(+), 1 deletion(-) create mode 100644 libata-disable-runtime-pm-for-hotpluggable-port.patch diff --git a/kernel.spec b/kernel.spec index 78cce016c..414d61639 100644 --- a/kernel.spec +++ b/kernel.spec @@ -62,7 +62,7 @@ Summary: The Linux kernel # For non-released -rc kernels, this will be appended after the rcX and # gitX tags, so a 3 here would become part of release "0.rcX.gitX.3" # -%global baserelease 2 +%global baserelease 3 %global fedora_build %{baserelease} # base_sublevel is the kernel version we're starting with and patching @@ -739,6 +739,9 @@ Patch21306: shlib_base_randomize.patch #rhbz 806433 Patch21360: uvcvideo-Fix-race-induced-crash-in-uvc_video_clock_update.patch +#rhbz 806676 +Patch21385: libata-disable-runtime-pm-for-hotpluggable-port.patch + Patch21400: unhandled-irqs-switch-to-polling.patch Patch22000: weird-root-dentry-name-debug.patch @@ -1432,6 +1435,9 @@ ApplyPatch highbank-export-clock-functions.patch #rhbz 806433 ApplyPatch uvcvideo-Fix-race-induced-crash-in-uvc_video_clock_update.patch +#rhbz 806676 +ApplyPatch libata-disable-runtime-pm-for-hotpluggable-port.patch + # END OF PATCH APPLICATIONS %endif @@ -2287,6 +2293,9 @@ fi # ||----w | # || || %changelog +* Wed Apr 04 2012 Josh Boyer +- Disable runtime PM for hotpluggable ATA ports (rhbz 806676) + * Tue Apr 03 2012 Justin M. Forbes - 3.4.0-0.rc1.git1.2 - BTRFS use after free patch 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 +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 , + jslaby@suse.cz, cwillu@cwillu.com, jackdachef@gmail.com, + Sergei Shtylyov +To: Jeff Garzik +Original-X-From: linux-ide-owner@vger.kernel.org Tue Mar 13 02:57:43 2012 +Return-path: +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 ) + 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 ); + 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 ); + 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: +X-Mailing-List: linux-ide@vger.kernel.org +Xref: news.gmane.org gmane.linux.ide:51560 gmane.linux.kernel:1266262 +Archived-At: + +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 +Reported-and-tested-by: cwillu@cwillu.com +Reported-and-tested-by: jackdachef@gmail.com +Signed-off-by: Lin Ming +--- + 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 +