summaryrefslogtreecommitdiffstats
path: root/drivers/scsi/hosts.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/hosts.c')
-rw-r--r--drivers/scsi/hosts.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c
index 6660fa92ffa1..8a8f803439e1 100644
--- a/drivers/scsi/hosts.c
+++ b/drivers/scsi/hosts.c
@@ -32,6 +32,7 @@
32#include <linux/completion.h> 32#include <linux/completion.h>
33#include <linux/transport_class.h> 33#include <linux/transport_class.h>
34#include <linux/platform_device.h> 34#include <linux/platform_device.h>
35#include <linux/pm_runtime.h>
35 36
36#include <scsi/scsi_device.h> 37#include <scsi/scsi_device.h>
37#include <scsi/scsi_host.h> 38#include <scsi/scsi_host.h>
@@ -156,6 +157,7 @@ EXPORT_SYMBOL(scsi_host_set_state);
156void scsi_remove_host(struct Scsi_Host *shost) 157void scsi_remove_host(struct Scsi_Host *shost)
157{ 158{
158 unsigned long flags; 159 unsigned long flags;
160
159 mutex_lock(&shost->scan_mutex); 161 mutex_lock(&shost->scan_mutex);
160 spin_lock_irqsave(shost->host_lock, flags); 162 spin_lock_irqsave(shost->host_lock, flags);
161 if (scsi_host_set_state(shost, SHOST_CANCEL)) 163 if (scsi_host_set_state(shost, SHOST_CANCEL))
@@ -165,6 +167,8 @@ void scsi_remove_host(struct Scsi_Host *shost)
165 return; 167 return;
166 } 168 }
167 spin_unlock_irqrestore(shost->host_lock, flags); 169 spin_unlock_irqrestore(shost->host_lock, flags);
170
171 scsi_autopm_get_host(shost);
168 scsi_forget_host(shost); 172 scsi_forget_host(shost);
169 mutex_unlock(&shost->scan_mutex); 173 mutex_unlock(&shost->scan_mutex);
170 scsi_proc_host_rm(shost); 174 scsi_proc_host_rm(shost);
@@ -216,12 +220,14 @@ int scsi_add_host_with_dma(struct Scsi_Host *shost, struct device *dev,
216 shost->shost_gendev.parent = dev ? dev : &platform_bus; 220 shost->shost_gendev.parent = dev ? dev : &platform_bus;
217 shost->dma_dev = dma_dev; 221 shost->dma_dev = dma_dev;
218 222
219 device_enable_async_suspend(&shost->shost_gendev);
220
221 error = device_add(&shost->shost_gendev); 223 error = device_add(&shost->shost_gendev);
222 if (error) 224 if (error)
223 goto out; 225 goto out;
224 226
227 pm_runtime_set_active(&shost->shost_gendev);
228 pm_runtime_enable(&shost->shost_gendev);
229 device_enable_async_suspend(&shost->shost_gendev);
230
225 scsi_host_set_state(shost, SHOST_RUNNING); 231 scsi_host_set_state(shost, SHOST_RUNNING);
226 get_device(shost->shost_gendev.parent); 232 get_device(shost->shost_gendev.parent);
227 233
@@ -325,7 +331,6 @@ struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *sht, int privsize)
325{ 331{
326 struct Scsi_Host *shost; 332 struct Scsi_Host *shost;
327 gfp_t gfp_mask = GFP_KERNEL; 333 gfp_t gfp_mask = GFP_KERNEL;
328 int rval;
329 334
330 if (sht->unchecked_isa_dma && privsize) 335 if (sht->unchecked_isa_dma && privsize)
331 gfp_mask |= __GFP_DMA; 336 gfp_mask |= __GFP_DMA;
@@ -420,7 +425,8 @@ struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *sht, int privsize)
420 shost->ehandler = kthread_run(scsi_error_handler, shost, 425 shost->ehandler = kthread_run(scsi_error_handler, shost,
421 "scsi_eh_%d", shost->host_no); 426 "scsi_eh_%d", shost->host_no);
422 if (IS_ERR(shost->ehandler)) { 427 if (IS_ERR(shost->ehandler)) {
423 rval = PTR_ERR(shost->ehandler); 428 printk(KERN_WARNING "scsi%d: error handler thread failed to spawn, error = %ld\n",
429 shost->host_no, PTR_ERR(shost->ehandler));
424 goto fail_kfree; 430 goto fail_kfree;
425 } 431 }
426 432