svn commit: r306897 - head/sys/arm/nvidia

Oleksandr Tymoshenko gonzo at FreeBSD.org
Sun Oct 9 04:29:44 UTC 2016


Author: gonzo
Date: Sun Oct  9 04:29:42 2016
New Revision: 306897
URL: https://svnweb.freebsd.org/changeset/base/306897

Log:
  Fix MSI allocation for NVidia Tegra
  
  - Fix range check
  - Due to checking found value in for(;;) condition irq after loop was
      always + 1 from actually found slot and wrong entry was marked as
      used which lead to returning slot 0 for all requests.

Modified:
  head/sys/arm/nvidia/tegra_pcie.c

Modified: head/sys/arm/nvidia/tegra_pcie.c
==============================================================================
--- head/sys/arm/nvidia/tegra_pcie.c	Sun Oct  9 03:20:58 2016	(r306896)
+++ head/sys/arm/nvidia/tegra_pcie.c	Sun Oct  9 04:29:42 2016	(r306897)
@@ -710,7 +710,7 @@ tegra_pcib_msi_alloc_msi(device_t dev, d
 	mtx_lock(&sc->mtx);
 
 	found = false;
-	for (irq = 0; irq < TEGRA_PCIB_MAX_MSI && !found; irq++) {
+	for (irq = 0; (irq + count - 1) < TEGRA_PCIB_MAX_MSI; irq++) {
 		/* Start on an aligned interrupt */
 		if ((irq & (maxcount - 1)) != 0)
 			continue;
@@ -719,20 +719,17 @@ tegra_pcib_msi_alloc_msi(device_t dev, d
 		found = true;
 
 		/* Check this range is valid */
-		for (end_irq = irq; end_irq != irq + count - 1; end_irq++) {
-			/* No free interrupts */
-			if (end_irq == (TEGRA_PCIB_MAX_MSI - 1)) {
-				found = false;
-				break;
-			}
-
+		for (end_irq = irq; end_irq < irq + count; end_irq++) {
 			/* This is already used */
-			if ((sc->isrcs[irq].flags & TEGRA_FLAG_MSI_USED) ==
+			if ((sc->isrcs[end_irq].flags & TEGRA_FLAG_MSI_USED) ==
 			    TEGRA_FLAG_MSI_USED) {
 				found = false;
 				break;
 			}
 		}
+
+		if (found)
+			break;
 	}
 
 	/* Not enough interrupts were found */


More information about the svn-src-head mailing list