diff options
Diffstat (limited to 'drivers/scsi/hosts.c')
| -rw-r--r-- | drivers/scsi/hosts.c | 14 |
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); | |||
| 156 | void scsi_remove_host(struct Scsi_Host *shost) | 157 | void 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 | ||
