aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2016-10-18 03:00:52 -0400
committerTejun Heo <tj@kernel.org>2016-10-19 13:18:16 -0400
commit17a51f12cfbd2814fd35966a069b242569c53e27 (patch)
treeac00dfa3303d195b0dd8929d3f6c9c585b021351
parent1001354ca34179f3db924eb66672442a173147dc (diff)
ahci: only try to use multi-MSI mode if there is more than 1 port
We should only try to allocate multiple MSI or MSI-X vectors if the device actually has multiple ports. Otherwise pci_alloc_irq_vectors will return a single vector due to n_ports = 1, in which case we shouldn't set the AHCI_HFLAG_MULTI_MSI flag. Signed-off-by: Christoph Hellwig <hch@lst.de> Fixes: 0b9e2988 ("ahci: use pci_alloc_irq_vectors") Reported-by: Emmanuel Benisty <benisty.e@gmail.com> Tested-by: Emmanuel Benisty <benisty.e@gmail.com> Signed-off-by: Tejun Heo <tj@kernel.org>
-rw-r--r--drivers/ata/ahci.c31
1 files changed, 17 insertions, 14 deletions
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
index ba5f11cebee2..ed311a040fed 100644
--- a/drivers/ata/ahci.c
+++ b/drivers/ata/ahci.c
@@ -1418,21 +1418,24 @@ static int ahci_init_msi(struct pci_dev *pdev, unsigned int n_ports,
1418 * Message mode could be enforced. In this case assume that advantage 1418 * Message mode could be enforced. In this case assume that advantage
1419 * of multipe MSIs is negated and use single MSI mode instead. 1419 * of multipe MSIs is negated and use single MSI mode instead.
1420 */ 1420 */
1421 nvec = pci_alloc_irq_vectors(pdev, n_ports, INT_MAX, 1421 if (n_ports > 1) {
1422 PCI_IRQ_MSIX | PCI_IRQ_MSI); 1422 nvec = pci_alloc_irq_vectors(pdev, n_ports, INT_MAX,
1423 if (nvec > 0) { 1423 PCI_IRQ_MSIX | PCI_IRQ_MSI);
1424 if (!(readl(hpriv->mmio + HOST_CTL) & HOST_MRSM)) { 1424 if (nvec > 0) {
1425 hpriv->get_irq_vector = ahci_get_irq_vector; 1425 if (!(readl(hpriv->mmio + HOST_CTL) & HOST_MRSM)) {
1426 hpriv->flags |= AHCI_HFLAG_MULTI_MSI; 1426 hpriv->get_irq_vector = ahci_get_irq_vector;
1427 return nvec; 1427 hpriv->flags |= AHCI_HFLAG_MULTI_MSI;
1428 } 1428 return nvec;
1429 }
1429 1430
1430 /* 1431 /*
1431 * Fallback to single MSI mode if the controller enforced MRSM 1432 * Fallback to single MSI mode if the controller
1432 * mode. 1433 * enforced MRSM mode.
1433 */ 1434 */
1434 printk(KERN_INFO "ahci: MRSM is on, fallback to single MSI\n"); 1435 printk(KERN_INFO
1435 pci_free_irq_vectors(pdev); 1436 "ahci: MRSM is on, fallback to single MSI\n");
1437 pci_free_irq_vectors(pdev);
1438 }
1436 } 1439 }
1437 1440
1438 /* 1441 /*