linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 0/3] fixes for ata port runtime pm support
@ 2011-12-22  6:50 Lin Ming
  2011-12-22  6:50 ` [PATCH v3 1/3] [SCSI]: runtime resume parent for child's system-resume Lin Ming
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Lin Ming @ 2011-12-22  6:50 UTC (permalink / raw)
  To: Jeff Garzik, James Bottomley, Alan Stern, Tejun Heo
  Cc: linux-kernel, linux-ide, linux-scsi, linux-pm

Hi Jeff,

Here are the v3 fixes for ata port runtime pm support.

Could you consider applying these fixes?
Thanks.

Changes in v3:
- Add ata port hibernate callbacks

Changes in v2:
- Drop the patch "[SCSI] sd: fix runtime status check in sd_shutdown".
 It's no longer needed with commit fe6b91f(PM / Driver core: leave
 runtime PM enabled during system shutdown).
- Add Ack from Alan

v1: https://lkml.org/lkml/2011/12/13/443
v2: https://lkml.org/lkml/2011/12/14/516

Lin Ming (3):
      [SCSI]: runtime resume parent for child's system-resume
      ata: update ata port's runtime status during system resume
      ata: add ata port hibernate callbacks

 drivers/ata/libata-core.c |   58 ++++++++++++++++++++++++++++++++++++++++----
 drivers/scsi/scsi_pm.c    |   11 +++++++-
 2 files changed, 62 insertions(+), 7 deletions(-)


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v3 1/3] [SCSI]: runtime resume parent for child's system-resume
  2011-12-22  6:50 [PATCH v3 0/3] fixes for ata port runtime pm support Lin Ming
@ 2011-12-22  6:50 ` Lin Ming
  2011-12-22  6:50 ` [PATCH v3 2/3] ata: update ata port's runtime status during system resume Lin Ming
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Lin Ming @ 2011-12-22  6:50 UTC (permalink / raw)
  To: Jeff Garzik, James Bottomley, Alan Stern, Tejun Heo
  Cc: linux-kernel, linux-ide, linux-scsi, linux-pm

[Patch description from Alan Stern]

If a child device was runtime-suspended when a system suspend began,
then there will be nothing to prevent its parent from
runtime-suspending as soon as it is woken up during the system resume.
Then when the time comes to resume the child, the resume will fail
because the parent is already back at low power.

On the other hand, there are some devices which should remain at low
power across an entire suspend-resume cycle.  The details depend on the
device and the platform.

This suggests that the PM core is not the right place to solve the
problem. One possible solution is for the subsystem or device driver
to call pm_runtime_get_sync(dev->parent) at the start of the
system-resume procedure and pm_runtime_put_sync(dev->parent) at the
end.

Acked-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Lin Ming <ming.m.lin@intel.com>
---
 drivers/scsi/scsi_pm.c |   11 ++++++++++-
 1 files changed, 10 insertions(+), 1 deletions(-)

diff --git a/drivers/scsi/scsi_pm.c b/drivers/scsi/scsi_pm.c
index 62b8fba..aaf5dfa 100644
--- a/drivers/scsi/scsi_pm.c
+++ b/drivers/scsi/scsi_pm.c
@@ -71,8 +71,17 @@ static int scsi_bus_resume_common(struct device *dev)
 {
 	int err = 0;
 
-	if (scsi_is_sdev_device(dev))
+	if (scsi_is_sdev_device(dev)) {
+		/*
+		 * Parent device may have runtime suspended as soon as
+		 * it is woken up during the system resume.
+		 *
+		 * Resume it on behalf of child.
+		 */
+		pm_runtime_get_sync(dev->parent);
 		err = scsi_dev_type_resume(dev);
+		pm_runtime_put_sync(dev->parent);
+	}
 
 	if (err == 0) {
 		pm_runtime_disable(dev);
-- 
1.7.2.5


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v3 2/3] ata: update ata port's runtime status during system resume
  2011-12-22  6:50 [PATCH v3 0/3] fixes for ata port runtime pm support Lin Ming
  2011-12-22  6:50 ` [PATCH v3 1/3] [SCSI]: runtime resume parent for child's system-resume Lin Ming
@ 2011-12-22  6:50 ` Lin Ming
  2011-12-22  6:50 ` [PATCH v3 3/3] ata: add ata port hibernate callbacks Lin Ming
  2012-01-05  1:50 ` [PATCH v3 0/3] fixes for ata port runtime pm support Lin Ming
  3 siblings, 0 replies; 5+ messages in thread
From: Lin Ming @ 2011-12-22  6:50 UTC (permalink / raw)
  To: Jeff Garzik, James Bottomley, Alan Stern, Tejun Heo
  Cc: linux-kernel, linux-ide, linux-scsi, linux-pm

The ata port is brought back to full power state during system resume.
So its runtime PM status will have to be updated to reflect
the actual post-system sleep status.

This also fixes below warning during system suspend/resume.

WARNING: at /work/linux/drivers/ata/libata-eh.c:4034
ata_scsi_port_error_handler+0x89/0x557()

4034         WARN_ON(!(ap->pflags & ATA_PFLAG_SUSPENDED));

Signed-off-by: Lin Ming <ming.m.lin@intel.com>
---
 drivers/ata/libata-core.c |   18 ++++++++++++++++--
 1 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index d55b51e..84aa741 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -5298,7 +5298,7 @@ static int ata_port_suspend(struct device *dev)
 	return ata_port_suspend_common(dev);
 }
 
-static int ata_port_resume(struct device *dev)
+static int ata_port_resume_common(struct device *dev)
 {
 	struct ata_port *ap = to_ata_port(dev);
 	int rc;
@@ -5308,6 +5308,20 @@ static int ata_port_resume(struct device *dev)
 	return rc;
 }
 
+static int ata_port_resume(struct device *dev)
+{
+	int rc;
+
+	rc = ata_port_resume_common(dev);
+	if (!rc) {
+		pm_runtime_disable(dev);
+		pm_runtime_set_active(dev);
+		pm_runtime_enable(dev);
+	}
+
+	return rc;
+}
+
 static int ata_port_runtime_idle(struct device *dev)
 {
 	return pm_runtime_suspend(dev);
@@ -5318,7 +5332,7 @@ static const struct dev_pm_ops ata_port_pm_ops = {
 	.resume = ata_port_resume,
 
 	.runtime_suspend = ata_port_suspend_common,
-	.runtime_resume = ata_port_resume,
+	.runtime_resume = ata_port_resume_common,
 	.runtime_idle = ata_port_runtime_idle,
 };
 
-- 
1.7.2.5


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v3 3/3] ata: add ata port hibernate callbacks
  2011-12-22  6:50 [PATCH v3 0/3] fixes for ata port runtime pm support Lin Ming
  2011-12-22  6:50 ` [PATCH v3 1/3] [SCSI]: runtime resume parent for child's system-resume Lin Ming
  2011-12-22  6:50 ` [PATCH v3 2/3] ata: update ata port's runtime status during system resume Lin Ming
@ 2011-12-22  6:50 ` Lin Ming
  2012-01-05  1:50 ` [PATCH v3 0/3] fixes for ata port runtime pm support Lin Ming
  3 siblings, 0 replies; 5+ messages in thread
From: Lin Ming @ 2011-12-22  6:50 UTC (permalink / raw)
  To: Jeff Garzik, James Bottomley, Alan Stern, Tejun Heo
  Cc: linux-kernel, linux-ide, linux-scsi, linux-pm

Signed-off-by: Lin Ming <ming.m.lin@intel.com>
---
 drivers/ata/libata-core.c |   40 ++++++++++++++++++++++++++++++++++++----
 1 files changed, 36 insertions(+), 4 deletions(-)

diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index 84aa741..8fbcad2 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -5281,12 +5281,24 @@ static int ata_port_request_pm(struct ata_port *ap, pm_message_t mesg,
 
 #define to_ata_port(d) container_of(d, struct ata_port, tdev)
 
-static int ata_port_suspend_common(struct device *dev)
+static int ata_port_suspend_common(struct device *dev, pm_message_t mesg)
 {
 	struct ata_port *ap = to_ata_port(dev);
+	unsigned int ehi_flags = ATA_EHI_QUIET;
 	int rc;
 
-	rc = ata_port_request_pm(ap, PMSG_SUSPEND, 0, ATA_EHI_QUIET, 1);
+	/*
+	 * On some hardware, device fails to respond after spun down
+	 * for suspend.  As the device won't be used before being
+	 * resumed, we don't need to touch the device.  Ask EH to skip
+	 * the usual stuff and proceed directly to suspend.
+	 *
+	 * http://thread.gmane.org/gmane.linux.ide/46764
+	 */
+	if (mesg.event == PM_EVENT_SUSPEND)
+		ehi_flags |= ATA_EHI_NO_AUTOPSY | ATA_EHI_NO_RECOVERY;
+
+	rc = ata_port_request_pm(ap, mesg, 0, ehi_flags, 1);
 	return rc;
 }
 
@@ -5295,7 +5307,23 @@ static int ata_port_suspend(struct device *dev)
 	if (pm_runtime_suspended(dev))
 		return 0;
 
-	return ata_port_suspend_common(dev);
+	return ata_port_suspend_common(dev, PMSG_SUSPEND);
+}
+
+static int ata_port_do_freeze(struct device *dev)
+{
+	if (pm_runtime_suspended(dev))
+		pm_runtime_resume(dev);
+
+	return ata_port_suspend_common(dev, PMSG_FREEZE);
+}
+
+static int ata_port_poweroff(struct device *dev)
+{
+	if (pm_runtime_suspended(dev))
+		return 0;
+
+	return ata_port_suspend_common(dev, PMSG_HIBERNATE);
 }
 
 static int ata_port_resume_common(struct device *dev)
@@ -5330,8 +5358,12 @@ static int ata_port_runtime_idle(struct device *dev)
 static const struct dev_pm_ops ata_port_pm_ops = {
 	.suspend = ata_port_suspend,
 	.resume = ata_port_resume,
+	.freeze = ata_port_do_freeze,
+	.thaw = ata_port_resume,
+	.poweroff = ata_port_poweroff,
+	.restore = ata_port_resume,
 
-	.runtime_suspend = ata_port_suspend_common,
+	.runtime_suspend = ata_port_suspend,
 	.runtime_resume = ata_port_resume_common,
 	.runtime_idle = ata_port_runtime_idle,
 };
-- 
1.7.2.5


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v3 0/3] fixes for ata port runtime pm support
  2011-12-22  6:50 [PATCH v3 0/3] fixes for ata port runtime pm support Lin Ming
                   ` (2 preceding siblings ...)
  2011-12-22  6:50 ` [PATCH v3 3/3] ata: add ata port hibernate callbacks Lin Ming
@ 2012-01-05  1:50 ` Lin Ming
  3 siblings, 0 replies; 5+ messages in thread
From: Lin Ming @ 2012-01-05  1:50 UTC (permalink / raw)
  To: Jeff Garzik, James Bottomley, Alan Stern, Tejun Heo
  Cc: linux-kernel, linux-ide, linux-scsi, linux-pm

On Thu, Dec 22, 2011 at 2:50 PM, Lin Ming <ming.m.lin@intel.com> wrote:
> Hi Jeff,
>
> Here are the v3 fixes for ata port runtime pm support.
>
> Could you consider applying these fixes?

Hi Jeff,

Hope you have a good holiday.

How about these fixes?

Lin Ming

> Thanks.
>
> Changes in v3:
> - Add ata port hibernate callbacks
>
> Changes in v2:
> - Drop the patch "[SCSI] sd: fix runtime status check in sd_shutdown".
>  It's no longer needed with commit fe6b91f(PM / Driver core: leave
>  runtime PM enabled during system shutdown).
> - Add Ack from Alan
>
> v1: https://lkml.org/lkml/2011/12/13/443
> v2: https://lkml.org/lkml/2011/12/14/516
>
> Lin Ming (3):
>      [SCSI]: runtime resume parent for child's system-resume
>      ata: update ata port's runtime status during system resume
>      ata: add ata port hibernate callbacks
>
>  drivers/ata/libata-core.c |   58 ++++++++++++++++++++++++++++++++++++++++----
>  drivers/scsi/scsi_pm.c    |   11 +++++++-
>  2 files changed, 62 insertions(+), 7 deletions(-)
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-pm" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2012-01-05  1:50 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-12-22  6:50 [PATCH v3 0/3] fixes for ata port runtime pm support Lin Ming
2011-12-22  6:50 ` [PATCH v3 1/3] [SCSI]: runtime resume parent for child's system-resume Lin Ming
2011-12-22  6:50 ` [PATCH v3 2/3] ata: update ata port's runtime status during system resume Lin Ming
2011-12-22  6:50 ` [PATCH v3 3/3] ata: add ata port hibernate callbacks Lin Ming
2012-01-05  1:50 ` [PATCH v3 0/3] fixes for ata port runtime pm support Lin Ming

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).