|
@@ -7,6 +7,7 @@
|
|
|
|
|
|
#include <linux/pm_runtime.h>
|
|
|
#include <linux/export.h>
|
|
|
+#include <linux/async.h>
|
|
|
|
|
|
#include <scsi/scsi.h>
|
|
|
#include <scsi/scsi_device.h>
|
|
@@ -92,6 +93,19 @@ static int scsi_bus_resume_common(struct device *dev)
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
+static int scsi_bus_prepare(struct device *dev)
|
|
|
+{
|
|
|
+ if (scsi_is_sdev_device(dev)) {
|
|
|
+ /* sd probing uses async_schedule. Wait until it finishes. */
|
|
|
+ async_synchronize_full();
|
|
|
+
|
|
|
+ } else if (scsi_is_host_device(dev)) {
|
|
|
+ /* Wait until async scanning is finished */
|
|
|
+ scsi_complete_async_scans();
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static int scsi_bus_suspend(struct device *dev)
|
|
|
{
|
|
|
return scsi_bus_suspend_common(dev, PMSG_SUSPEND);
|
|
@@ -110,6 +124,7 @@ static int scsi_bus_poweroff(struct device *dev)
|
|
|
#else /* CONFIG_PM_SLEEP */
|
|
|
|
|
|
#define scsi_bus_resume_common NULL
|
|
|
+#define scsi_bus_prepare NULL
|
|
|
#define scsi_bus_suspend NULL
|
|
|
#define scsi_bus_freeze NULL
|
|
|
#define scsi_bus_poweroff NULL
|
|
@@ -218,6 +233,7 @@ void scsi_autopm_put_host(struct Scsi_Host *shost)
|
|
|
#endif /* CONFIG_PM_RUNTIME */
|
|
|
|
|
|
const struct dev_pm_ops scsi_bus_pm_ops = {
|
|
|
+ .prepare = scsi_bus_prepare,
|
|
|
.suspend = scsi_bus_suspend,
|
|
|
.resume = scsi_bus_resume_common,
|
|
|
.freeze = scsi_bus_freeze,
|