Merge branch 'drm-etnaviv-fixes' of git://git.pengutronix.de/git/lst/linux into drm...
[cascardo/linux.git] / drivers / scsi / ipr.c
index 1f539c2..17d04c7 100644 (file)
@@ -3288,6 +3288,11 @@ static void ipr_worker_thread(struct work_struct *work)
                return;
        }
 
+       if (!ioa_cfg->scan_enabled) {
+               spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+               return;
+       }
+
 restart:
        do {
                did_work = 0;
@@ -10214,6 +10219,7 @@ static int ipr_probe_ioa(struct pci_dev *pdev,
 
                if (!ioa_cfg->reset_work_q) {
                        dev_err(&pdev->dev, "Couldn't register reset workqueue\n");
+                       rc = -ENOMEM;
                        goto out_free_irq;
                }
        } else
@@ -10362,6 +10368,7 @@ static void ipr_remove(struct pci_dev *pdev)
 static int ipr_probe(struct pci_dev *pdev, const struct pci_device_id *dev_id)
 {
        struct ipr_ioa_cfg *ioa_cfg;
+       unsigned long flags;
        int rc, i;
 
        rc = ipr_probe_ioa(pdev, dev_id);
@@ -10403,8 +10410,11 @@ static int ipr_probe(struct pci_dev *pdev, const struct pci_device_id *dev_id)
                __ipr_remove(pdev);
                return rc;
        }
+       spin_lock_irqsave(ioa_cfg->host->host_lock, flags);
+       ioa_cfg->scan_enabled = 1;
+       schedule_work(&ioa_cfg->work_q);
+       spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags);
 
-       scsi_scan_host(ioa_cfg->host);
        ioa_cfg->iopoll_weight = ioa_cfg->chip_cfg->iopoll_weight;
 
        if (ioa_cfg->iopoll_weight && ioa_cfg->sis64 && ioa_cfg->nvectors > 1) {
@@ -10414,7 +10424,8 @@ static int ipr_probe(struct pci_dev *pdev, const struct pci_device_id *dev_id)
                }
        }
 
-       schedule_work(&ioa_cfg->work_q);
+       scsi_scan_host(ioa_cfg->host);
+
        return 0;
 }