aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/ata/ahci.c3
-rw-r--r--drivers/ata/libata-core.c9
-rw-r--r--include/linux/libata.h1
3 files changed, 13 insertions, 0 deletions
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
index 7f701cbe14ab..96039671e3b9 100644
--- a/drivers/ata/ahci.c
+++ b/drivers/ata/ahci.c
@@ -2660,6 +2660,9 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
2660 host->iomap = pcim_iomap_table(pdev); 2660 host->iomap = pcim_iomap_table(pdev);
2661 host->private_data = hpriv; 2661 host->private_data = hpriv;
2662 2662
2663 if (!(hpriv->cap & HOST_CAP_SSS))
2664 host->flags |= ATA_HOST_PARALLEL_SCAN;
2665
2663 if (pi.flags & ATA_FLAG_EM) 2666 if (pi.flags & ATA_FLAG_EM)
2664 ahci_reset_em(host); 2667 ahci_reset_em(host);
2665 2668
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index c507a9ac78f4..f810078fafcc 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -5920,6 +5920,15 @@ static void async_port_probe(void *data, async_cookie_t cookie)
5920{ 5920{
5921 int rc; 5921 int rc;
5922 struct ata_port *ap = data; 5922 struct ata_port *ap = data;
5923
5924 /*
5925 * If we're not allowed to scan this host in parallel,
5926 * we need to wait until all previous scans have completed
5927 * before going further.
5928 */
5929 if (!(ap->host->flags & ATA_HOST_PARALLEL_SCAN))
5930 async_synchronize_cookie(cookie);
5931
5923 /* probe */ 5932 /* probe */
5924 if (ap->ops->error_handler) { 5933 if (ap->ops->error_handler) {
5925 struct ata_eh_info *ehi = &ap->link.eh_info; 5934 struct ata_eh_info *ehi = &ap->link.eh_info;
diff --git a/include/linux/libata.h b/include/linux/libata.h
index 4f7c8fb4d3fe..b6b8a7f3ec66 100644
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
@@ -239,6 +239,7 @@ enum {
239 /* host set flags */ 239 /* host set flags */
240 ATA_HOST_SIMPLEX = (1 << 0), /* Host is simplex, one DMA channel per host only */ 240 ATA_HOST_SIMPLEX = (1 << 0), /* Host is simplex, one DMA channel per host only */
241 ATA_HOST_STARTED = (1 << 1), /* Host started */ 241 ATA_HOST_STARTED = (1 << 1), /* Host started */
242 ATA_HOST_PARALLEL_SCAN = (1 << 2), /* Ports on this host can be scanned in parallel */
242 243
243 /* bits 24:31 of host->flags are reserved for LLD specific flags */ 244 /* bits 24:31 of host->flags are reserved for LLD specific flags */
244 245