Tejun Heo wrote:
Implement helpers to build SATA ->set_powersave() and HIPS timer, and
use them to implement sata_std_set_powersave() and
sata_std_hips_timer_fn() for standard SATA link powersave using
SControl register.
Depending on controller capability, the following modes are supported.
none: no powersave
HIPS: host-initiated partial/slumber (both or either one)
DIPS: device-initiated partial/slumber (both or either one)
static: link off by writing 0x4 to DET
HIPS/static: HIPS + static
DIPS/static; DIPS + static
Timeouts for HIPS can be modified using module parameters -
libata.partial_timeout and libata.slumber_timeout. Setting timeout to
zero disables the powersave mode.
Signed-off-by: Tejun Heo <htejun@xxxxxxxxx>
---
drivers/scsi/libata-core.c | 280 ++++++++++++++++++++++++++++++++++++++++++++
include/linux/libata.h | 10 ++
2 files changed, 290 insertions(+), 0 deletions(-)
e19c560ab7e8fa9b20ed5ec3233fb75e0daceb63
diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c
index 1658cd1..9890387 100644
--- a/drivers/scsi/libata-core.c
+++ b/drivers/scsi/libata-core.c
@@ -71,6 +71,7 @@ static unsigned int ata_dev_set_xfermode
static void ata_dev_xfermask(struct ata_device *dev);
static int ata_param_set_powersave(const char *val, struct kernel_param *kp);
+static int ata_param_set_hips_timeout(const char *val, struct kernel_param *kp);
static DEFINE_MUTEX(ata_all_ports_mutex);
static LIST_HEAD(ata_all_ports);
@@ -102,6 +103,18 @@ module_param_call(powersave, ata_param_s
MODULE_PARM_DESC(powersave, "Powersave mode (0=none, 1=HIPS, 2=DIPS, "
"3=static, 4=HIPS/static, 5=DIPS/static)");
+static unsigned long libata_partial_timeout = 100;
+module_param_call(partial_timeout, ata_param_set_hips_timeout, param_get_ulong,
+ &libata_partial_timeout, 0644);
+MODULE_PARM_DESC(hips_timeout, "Host-initiated partial powersave timeout "
+ "(milliseconds, default 100, 0 to disable)");
+
+static unsigned long libata_slumber_timeout = 3000;
+module_param_call(slumber_timeout, ata_param_set_hips_timeout, param_get_ulong,
+ &libata_slumber_timeout, 0644);
+MODULE_PARM_DESC(slumber_timeout, "Host-initiated slumber powersave timeout "
+ "(milliseconds, default 3000, 0 to disable)");
+
Should be a per-controller variable, not a global libata module parm.
So NAK on interface, ACK on implementation behind the interface.
Jeff
-
: send the line "unsubscribe linux-ide" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html