diff options
author | Bart Van Assche <bvanassche@acm.org> | 2021-10-06 14:54:51 -0700 |
---|---|---|
committer | Martin K. Petersen <martin.petersen@oracle.com> | 2021-10-16 21:08:39 -0400 |
commit | a19a93e4c6a98c9c0f2f5a6db76846f10d7d1f85 (patch) | |
tree | 49b351875df809b8a6d9267a58ef728d8f16eb58 /drivers/scsi/scsi_scan.c | |
parent | a4bcbf71914b0cc44151a5238e4a8afa8e3319cd (diff) | |
download | lwn-a19a93e4c6a98c9c0f2f5a6db76846f10d7d1f85.tar.gz lwn-a19a93e4c6a98c9c0f2f5a6db76846f10d7d1f85.zip |
scsi: core: pm: Rely on the device driver core for async power management
Instead of implementing asynchronous resume support in the SCSI core, rely
on the device driver core for resuming SCSI devices asynchronously.
Instead of only supporting asynchronous resumes, also support asynchronous
suspends.
Link: https://lore.kernel.org/r/20211006215453.3318929-2-bvanassche@acm.org
Cc: Alan Stern <stern@rowland.harvard.edu>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Hannes Reinecke <hare@suse.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Martin Kepplinger <martin.kepplinger@puri.sm>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Diffstat (limited to 'drivers/scsi/scsi_scan.c')
-rw-r--r-- | drivers/scsi/scsi_scan.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c index 0d0381df25f7..c86152f9c47a 100644 --- a/drivers/scsi/scsi_scan.c +++ b/drivers/scsi/scsi_scan.c @@ -123,6 +123,22 @@ struct async_scan_data { }; /** + * scsi_enable_async_suspend - Enable async suspend and resume + */ +void scsi_enable_async_suspend(struct device *dev) +{ + /* + * If a user has disabled async probing a likely reason is due to a + * storage enclosure that does not inject staggered spin-ups. For + * safety, make resume synchronous as well in that case. + */ + if (strncmp(scsi_scan_type, "async", 5) != 0) + return; + /* Enable asynchronous suspend and resume. */ + device_enable_async_suspend(dev); +} + +/** * scsi_complete_async_scans - Wait for asynchronous scans to complete * * When this function returns, any host which started scanning before @@ -454,6 +470,7 @@ static struct scsi_target *scsi_alloc_target(struct device *parent, dev_set_name(dev, "target%d:%d:%d", shost->host_no, channel, id); dev->bus = &scsi_bus_type; dev->type = &scsi_target_type; + scsi_enable_async_suspend(dev); starget->id = id; starget->channel = channel; starget->can_queue = 0; |