| From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
| From: Stanley Chu <stanley.chu@mediatek.com> |
| Date: Mon, 16 Sep 2019 23:56:49 +0800 |
| Subject: FROMGIT: scsi: core: allow auto suspend override by low-level driver |
| |
| Rework from previous work by: |
| Sujit Reddy Thumma <sthumma@codeaurora.org> |
| |
| Until now the scsi mid-layer forbids runtime suspend till userspace enables |
| it. This is mainly to quarantine some disks with broken runtime power |
| management or have high latencies executing suspend resume callbacks. If |
| the userspace doesn't enable the runtime suspend the underlying hardware |
| will be always on even when it is not doing any useful work and thus |
| wasting power. |
| |
| Some low-level drivers for the controllers can efficiently use runtime |
| power management to reduce power consumption and improve battery life. |
| Allow runtime suspend parameters override within the LLD itself instead of |
| waiting for userspace to control the power management. |
| |
| Link: https://lore.kernel.org/r/1568649411-5127-2-git-send-email-stanley.chu@mediatek.com |
| Reviewed-by: Avri Altman <avri.altman@wdc.com> |
| Reviewed-by: Bart Van Assche <bvanassche@acm.org> |
| Signed-off-by: Stanley Chu <stanley.chu@mediatek.com> |
| Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> |
| |
| Bug: 140620770 |
| (cherry picked from commit c74f8056621738f5be9f5d3d7e0caa927b21aef6 |
| https://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi.git misc) |
| Change-Id: Ib0b9e8bec307179187a57fe47cb747416da38db2 |
| Signed-off-by: Todd Kjos <tkjos@google.com> |
| --- |
| drivers/scsi/scsi_sysfs.c | 3 ++- |
| drivers/scsi/sd.c | 4 ++++ |
| include/scsi/scsi_device.h | 3 ++- |
| include/scsi/scsi_host.h | 3 +++ |
| 4 files changed, 11 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c |
| index 6d7362e7367e..fb07b4456514 100644 |
| --- a/drivers/scsi/scsi_sysfs.c |
| +++ b/drivers/scsi/scsi_sysfs.c |
| @@ -1309,7 +1309,8 @@ int scsi_sysfs_add_sdev(struct scsi_device *sdev) |
| device_enable_async_suspend(&sdev->sdev_gendev); |
| scsi_autopm_get_target(starget); |
| pm_runtime_set_active(&sdev->sdev_gendev); |
| - pm_runtime_forbid(&sdev->sdev_gendev); |
| + if (!sdev->rpm_autosuspend) |
| + pm_runtime_forbid(&sdev->sdev_gendev); |
| pm_runtime_enable(&sdev->sdev_gendev); |
| scsi_autopm_put_target(starget); |
| |
| diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c |
| index ebb40160539f..aab4ed891427 100644 |
| --- a/drivers/scsi/sd.c |
| +++ b/drivers/scsi/sd.c |
| @@ -3369,6 +3369,10 @@ static int sd_probe(struct device *dev) |
| } |
| |
| blk_pm_runtime_init(sdp->request_queue, dev); |
| + if (sdp->rpm_autosuspend) { |
| + pm_runtime_set_autosuspend_delay(dev, |
| + sdp->host->hostt->rpm_autosuspend_delay); |
| + } |
| device_add_disk(dev, gd, NULL); |
| if (sdkp->capacity) |
| sd_dif_config_host(sdkp); |
| diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h |
| index 202f4d6a4342..039e289f295e 100644 |
| --- a/include/scsi/scsi_device.h |
| +++ b/include/scsi/scsi_device.h |
| @@ -199,7 +199,8 @@ struct scsi_device { |
| unsigned broken_fua:1; /* Don't set FUA bit */ |
| unsigned lun_in_cdb:1; /* Store LUN bits in CDB[1] */ |
| unsigned unmap_limit_for_ws:1; /* Use the UNMAP limit for WRITE SAME */ |
| - |
| + unsigned rpm_autosuspend:1; /* Enable runtime autosuspend at device |
| + * creation time */ |
| atomic_t disk_events_disable_depth; /* disable depth for disk events */ |
| |
| DECLARE_BITMAP(supported_events, SDEV_EVT_MAXBITS); /* supported events */ |
| diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h |
| index 31e0d6ca1eba..2c3f0c58869b 100644 |
| --- a/include/scsi/scsi_host.h |
| +++ b/include/scsi/scsi_host.h |
| @@ -486,6 +486,9 @@ struct scsi_host_template { |
| */ |
| unsigned int cmd_size; |
| struct scsi_host_cmd_pool *cmd_pool; |
| + |
| + /* Delay for runtime autosuspend */ |
| + int rpm_autosuspend_delay; |
| }; |
| |
| /* |