diff options
author | Christoph Hellwig <hch@lst.de> | 2016-10-18 03:00:52 -0400 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2016-10-19 13:18:16 -0400 |
commit | 17a51f12cfbd2814fd35966a069b242569c53e27 (patch) | |
tree | ac00dfa3303d195b0dd8929d3f6c9c585b021351 | |
parent | 1001354ca34179f3db924eb66672442a173147dc (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.c | 31 |
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 | /* |