Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4a3c390c authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull libata fixes from Tejun Heo:
 "The AHCI MSI handling change in rc1 was a bit broken and caused disk
  probing failures on some machines.  These three patches should fix the
  issues"

David Howells comments:
 "My test machine fell foul of this using a PCIe M.2-attached SSD card.
  The patches fix it for me"

* 'for-4.9-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata:
  ahci: fix the single MSI-X case in ahci_init_one
  ahci: fix nvec check
  ahci: only try to use multi-MSI mode if there is more than 1 port
parents 9c953d63 0ce57f8a
Loading
Loading
Loading
Loading
+22 −19
Original line number Diff line number Diff line
@@ -1418,6 +1418,7 @@ 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.
	 */
	if (n_ports > 1) {
		nvec = pci_alloc_irq_vectors(pdev, n_ports, INT_MAX,
				PCI_IRQ_MSIX | PCI_IRQ_MSI);
		if (nvec > 0) {
@@ -1428,19 +1429,21 @@ static int ahci_init_msi(struct pci_dev *pdev, unsigned int n_ports,
			}

			/*
		 * Fallback to single MSI mode if the controller enforced MRSM
		 * mode.
			 * Fallback to single MSI mode if the controller
			 * enforced MRSM mode.
			 */
		printk(KERN_INFO "ahci: MRSM is on, fallback to single MSI\n");
			printk(KERN_INFO
				"ahci: MRSM is on, fallback to single MSI\n");
			pci_free_irq_vectors(pdev);
		}

		/*
	 * -ENOSPC indicated we don't have enough vectors.  Don't bother trying
	 * a single vectors for any other error:
		 * -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
@@ -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;