public inbox for linux-pm@vger.kernel.org
 help / color / mirror / Atom feed
From: Pavel Machek <pavel@suse.cz>
To: Alan Stern <stern@rowland.harvard.edu>
Cc: kernel list <linux-kernel@vger.kernel.org>,
	Linux-pm mailing list <linux-pm@lists.osdl.org>,
	James.Bottomley@HansenPartnership.com, teheo@novell.com,
	oneukum@suse.de
Subject: Re: Power management for SCSI
Date: Thu, 14 Aug 2008 17:56:49 +0200	[thread overview]
Message-ID: <20080814155649.GA6046@elf.ucw.cz> (raw)
In-Reply-To: <20080814130812.GC2262@elf.ucw.cz>

Hi!

> > > Add support for autosuspend/autoresume. Lowlevel driver can use it to
> > > spin the disk down and power down its SATA link, to turn off the USB
> > > interface, etc.
> > > 
> > > Spinning down the disk is useful - saves ~0.5W here. Powering down
> > > SATA controller is even better -- should save ~1W.
> > > 
> > > Now, I guess the patch will need to be split to small pieces for
> > > merge... I tried to rearrange it so that the documentation and hooks
> > > go before stuff that needs the hooks, and before Kconfig enabler. If
> > > it looks reasonably good, I'll split it into smaller pieces.
> > 
> > James had a number of objections to my original patch; you can read 
> > them here:
> > 
> > https://lists.linux-foundation.org/pipermail/linux-pm/2008-March/016849.html
> > 
> > I haven't had time yet to work on an improved version.
> 
> Ok, I see, "its done at the wrong level" sounds pretty serious.
> 
> First the general comments/questions:
...
> #2. As you say in the comment, the thing we're trying to power down is
> #the link.  In most SCSI implementations, the link has a rather complex
> #relationship to the target, what we want to do in
> #periodic_autosuspend_scan() is run over the devices on each link, and
> #if
> #they're not busy suspend the link?  What's probably needed is a set of
> #adjunct helpers for the transport classes to do this.
> 
> So the host suspend/resume stuff should go into struct
> scsi_transport_template?

Is this step in the right direction? Moved autosuspend from
scsi_host_template to scsi_transport_template...

							Pavel

diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
index e4864d9..2b8cf09 100644
--- a/drivers/ata/ahci.c
+++ b/drivers/ata/ahci.c
@@ -320,14 +320,14 @@ static struct device_attribute *ahci_sde
 };
 
 struct pci_dev *my_pdev;
-int autosuspend_enabled = 0;	/* HERE */
+int autosuspend_enabled = 1;	/* HERE */
 
 struct sleep_disabled_reason ahci_active = {
         "ahci"
 };
 
 /* The host and its devices are all idle so we can autosuspend */
-static int autosuspend(struct Scsi_Host *host)
+int ahci_autosuspend(struct Scsi_Host *host)
 {
 	if (my_pdev && autosuspend_enabled) {
 		printk("ahci: should autosuspend\n");
@@ -340,7 +340,7 @@ static int autosuspend(struct Scsi_Host 
 }
 
 /* The host needs to be autoresumed */
-static int autoresume(struct Scsi_Host *host)
+int ahci_autoresume(struct Scsi_Host *host)
 {
 	if (my_pdev && autosuspend_enabled) {
 		printk("ahci: should autoresume\n");
@@ -360,8 +360,8 @@ static struct scsi_host_template ahci_sh
 	.sg_tablesize		= AHCI_MAX_SG,
 	.dma_boundary		= AHCI_DMA_BOUNDARY,
 	.shost_attrs		= ahci_shost_attrs,
-	.autosuspend		= autosuspend,
-	.autoresume		= autoresume,
+//	.autosuspend		= autosuspend,
+//	.autoresume		= autoresume,
 	.sdev_attrs		= ahci_sdev_attrs,
 };
 
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c
index b9d3ba4..d3526a0 100644
--- a/drivers/ata/libata-scsi.c
+++ b/drivers/ata/libata-scsi.c
@@ -103,6 +103,9 @@ static const u8 def_control_mpage[CONTRO
 	0, 30	/* extended self test time, see 05-359r1 */
 };
 
+int ahci_autosuspend(struct Scsi_Host *host);
+int ahci_autoresume(struct Scsi_Host *host);
+
 /*
  * libata transport template.  libata doesn't do real transport stuff.
  * It just needs the eh_timed_out hook.
@@ -111,6 +114,8 @@ static struct scsi_transport_template at
 	.eh_strategy_handler	= ata_scsi_error,
 	.eh_timed_out		= ata_scsi_timed_out,
 	.user_scan		= ata_scsi_user_scan,
+	.autosuspend		= ahci_autosuspend,
+	.autoresume		= ahci_autoresume,
 };
 
 
diff --git a/drivers/scsi/scsi_pm.c b/drivers/scsi/scsi_pm.c
index 5ef69c4..d2de371 100644
--- a/drivers/scsi/scsi_pm.c
+++ b/drivers/scsi/scsi_pm.c
@@ -10,6 +10,7 @@ #define DEBUG
 #include <scsi/scsi.h>
 #include <scsi/scsi_device.h>
 #include <scsi/scsi_host.h>
+#include <scsi/scsi_transport.h>
 
 #include <linux/delay.h>
 
@@ -50,8 +51,8 @@ void scsi_autosuspend_host(struct Scsi_H
 	if (shost->pm_usage_cnt <= 0 && !shost->is_suspended &&
 			shost->shost_state == SHOST_RUNNING) {
 		WARN_ON(shost->host_busy);
-		if (!shost->hostt->autosuspend ||
-				shost->hostt->autosuspend(shost) == 0) {
+		if (!shost->transportt->autosuspend ||
+				shost->transportt->autosuspend(shost) == 0) {
 			shost->is_suspended = 1;
 			shost_dbg(shost, "suspended\n");
 		}
@@ -82,10 +83,10 @@ int scsi_autoresume_host(struct Scsi_Hos
 	mutex_lock(&shost->pm_mutex);
 	++shost->pm_usage_cnt;
 	if (shost->is_suspended) {
-		if (shost->hostt->autoresume &&
+		if (shost->transportt->autoresume &&
 				(shost->shost_state == SHOST_RUNNING ||
 				 shost->shost_state == SHOST_RECOVERY))
-			status = shost->hostt->autoresume(shost);
+			status = shost->transportt->autoresume(shost);
 		if (status == 0) {
 			shost->is_suspended = 0;
 			shost_dbg(shost, "resumed\n");
diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c
index ef64fd8..c96f11f 100644
--- a/drivers/usb/storage/scsiglue.c
+++ b/drivers/usb/storage/scsiglue.c
@@ -499,10 +499,6 @@ struct scsi_host_template usb_stor_host_
 	.eh_device_reset_handler =	device_reset,
 	.eh_bus_reset_handler =		bus_reset,
 
-	/* dynamic power management */
-	.autosuspend =			autosuspend,
-	.autoresume =			autoresume,
-
 	/* queue commands only, only one command per LUN */
 	.can_queue =			1,
 	.cmd_per_lun =			1,
diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h
index b60445f..0f30451 100644
--- a/include/scsi/scsi_host.h
+++ b/include/scsi/scsi_host.h
@@ -176,21 +176,6 @@ #endif
 	int (* eh_bus_reset_handler)(struct scsi_cmnd *);
 	int (* eh_host_reset_handler)(struct scsi_cmnd *);
 
-	/*
-	 * Power management routines.  These are optional; you should
-	 * implement them if you want your LLD to perform dynamic Power
-	 * Management.  The autosuspend method will be called whenever
-	 * all the devices below a host have been suspended (are in an
-	 * idle state), at which time the host adapter can safely be
-	 * autosuspended.  The autoresume method will be called whenever
-	 * a suspended host must be resumed for one of its devices to
-	 * carry out a command.  Both routines are always called in a
-	 * process context with interrupts enabled.
-	 *
-	 * Status: OPTIONAL
-	 */
-	int (* autosuspend)(struct Scsi_Host *);
-	int (* autoresume)(struct Scsi_Host *);
 
 	/*
 	 * Before the mid layer attempts to scan for a new device where none
diff --git a/include/scsi/scsi_transport.h b/include/scsi/scsi_transport.h
index 490bd13..15c7886 100644
--- a/include/scsi/scsi_transport.h
+++ b/include/scsi/scsi_transport.h
@@ -77,6 +77,22 @@ struct scsi_transport_template {
 	 * request for target drivers.
 	 */
 	int (* tsk_mgmt_response)(struct Scsi_Host *, u64, u64, int);
+
+	/*
+	 * Power management routines.  These are optional; you should
+	 * implement them if you want your LLD to perform dynamic Power
+	 * Management.  The autosuspend method will be called whenever
+	 * all the devices below a host have been suspended (are in an
+	 * idle state), at which time the host adapter can safely be
+	 * autosuspended.  The autoresume method will be called whenever
+	 * a suspended host must be resumed for one of its devices to
+	 * carry out a command.  Both routines are always called in a
+	 * process context with interrupts enabled.
+	 *
+	 * Status: OPTIONAL
+	 */
+	int (* autosuspend)(struct Scsi_Host *);
+	int (* autoresume)(struct Scsi_Host *);
 };
 
 #define transport_class_to_shost(tc) \


-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html

  reply	other threads:[~2008-08-14 15:56 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-08-13  9:50 Power management for SCSI Pavel Machek
2008-08-13 14:31 ` Alan Stern
2008-08-13 14:47   ` Oliver Neukum
2008-08-13 14:59     ` Alan Stern
2008-08-13 15:21       ` Oliver Neukum
2008-08-13 15:44         ` Alan Stern
2008-08-13 16:14           ` Stefan Richter
2008-08-13 16:23             ` Alan Stern
2008-08-13 16:21           ` [linux-pm] " Oliver Neukum
2008-08-13 19:34             ` Alan Stern
2008-08-14  6:08               ` Oliver Neukum
2008-08-14 15:40                 ` Alan Stern
2008-08-14 13:50             ` Pavel Machek
2008-08-14 14:08               ` Oliver Neukum
2008-08-14 15:47                 ` Alan Stern
2008-08-14 21:43                   ` Oliver Neukum
2008-08-14 22:25                     ` Alan Stern
2008-08-15  7:16                       ` Oliver Neukum
2008-08-15 15:25                         ` Alan Stern
2008-08-15 15:56                           ` Oliver Neukum
2008-08-16  5:24                             ` Greg KH
2008-08-19 13:33                           ` [linux-pm] " Oliver Neukum
2008-08-19 15:28                             ` Alan Stern
2008-08-19 23:22                               ` Stefan Richter
2008-08-22 10:52                               ` Pavel Machek
2008-08-22 22:14                                 ` Alan Stern
2008-08-25 12:50                               ` Oliver Neukum
2008-08-25 14:45                                 ` Alan Stern
2008-08-25 15:05                                   ` Oliver Neukum
2008-08-25 16:18                                     ` Alan Stern
2008-08-25 17:34                                       ` Oliver Neukum
2008-08-25 18:39                                         ` Alan Stern
2008-08-13 15:24       ` Oliver Neukum
2008-08-13 15:44         ` Stefan Richter
2008-08-13 16:25           ` Oliver Neukum
2008-08-13 19:37             ` Alan Stern
2008-08-13 19:42               ` James Bottomley
2008-08-13 20:16                 ` Alan Stern
2008-08-13 20:03               ` Leisner, Martin
2008-08-13 20:38                 ` [linux-pm] " Alan Stern
2008-08-19 21:08                   ` Leisner, Martin
2008-08-13 15:46         ` Alan Stern
2008-08-14 13:08   ` Pavel Machek
2008-08-14 15:56     ` Pavel Machek [this message]
2008-08-14 22:11     ` Stefan Richter
2008-08-19  7:38   ` Pavel Machek
2008-08-19  7:50     ` [linux-pm] " Oliver Neukum
2008-08-19 14:32     ` Alan Stern

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20080814155649.GA6046@elf.ucw.cz \
    --to=pavel@suse.cz \
    --cc=James.Bottomley@HansenPartnership.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@lists.osdl.org \
    --cc=oneukum@suse.de \
    --cc=stern@rowland.harvard.edu \
    --cc=teheo@novell.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox