diff options
Diffstat (limited to 'drivers/ata/ahci.c')
| -rw-r--r-- | drivers/ata/ahci.c | 41 | 
1 files changed, 22 insertions, 19 deletions
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index ba5f11cebee2..9669fc7c19df 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c @@ -1418,31 +1418,34 @@ static int ahci_init_msi(struct pci_dev *pdev, unsigned int n_ports,  	 * Message mode could be enforced. In this case assume that advantage  	 * of multipe MSIs is negated and use single MSI mode instead.  	 */ -	nvec = pci_alloc_irq_vectors(pdev, n_ports, INT_MAX, -			PCI_IRQ_MSIX | PCI_IRQ_MSI); -	if (nvec > 0) { -		if (!(readl(hpriv->mmio + HOST_CTL) & HOST_MRSM)) { -			hpriv->get_irq_vector = ahci_get_irq_vector; -			hpriv->flags |= AHCI_HFLAG_MULTI_MSI; -			return nvec; +	if (n_ports > 1) { +		nvec = pci_alloc_irq_vectors(pdev, n_ports, INT_MAX, +				PCI_IRQ_MSIX | PCI_IRQ_MSI); +		if (nvec > 0) { +			if (!(readl(hpriv->mmio + HOST_CTL) & HOST_MRSM)) { +				hpriv->get_irq_vector = ahci_get_irq_vector; +				hpriv->flags |= AHCI_HFLAG_MULTI_MSI; +				return nvec; +			} + +			/* +			 * Fallback to single MSI mode if the controller +			 * enforced MRSM mode. +			 */ +			printk(KERN_INFO +				"ahci: MRSM is on, fallback to single MSI\n"); +			pci_free_irq_vectors(pdev);  		}  		/* -		 * Fallback to single MSI mode if the controller enforced MRSM -		 * mode. +		 * -ENOSPC indicated we don't have enough vectors.  Don't bother +		 * trying a single vectors for any other error:  		 */ -		printk(KERN_INFO "ahci: MRSM is on, fallback to single MSI\n"); -		pci_free_irq_vectors(pdev); +		if (nvec < 0 && nvec != -ENOSPC) +			return nvec;  	}  	/* -	 * -ENOSPC indicated we don't have enough vectors.  Don't bother trying -	 * a single vectors for any other error: -	 */ -	if (nvec < 0 && nvec != -ENOSPC) -		return nvec; - -	/*  	 * If the host is not capable of supporting per-port vectors, fall  	 * back to single MSI before finally attempting single MSI-X.  	 */ @@ -1617,7 +1620,7 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)  		/* legacy intx interrupts */  		pci_intx(pdev, 1);  	} -	hpriv->irq = pdev->irq; +	hpriv->irq = pci_irq_vector(pdev, 0);  	if (!(hpriv->cap & HOST_CAP_SSS) || ahci_ignore_sss)  		host->flags |= ATA_HOST_PARALLEL_SCAN;  | 

