Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 5 Nov 2016 11:01:56 +0000 (UTC)
From:      Michal Meloun <mmel@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r308337 - stable/11/sys/arm/nvidia
Message-ID:  <201611051101.uA5B1urO048793@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mmel
Date: Sat Nov  5 11:01:56 2016
New Revision: 308337
URL: https://svnweb.freebsd.org/changeset/base/308337

Log:
  MFC r306897,r306898:
  
    r306897:
      Fix MSI allocation for NVidia Tegra
    r306898:
      Fix release MSI method for NVidia Tegra PCI controller

Modified:
  stable/11/sys/arm/nvidia/tegra_pcie.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/arm/nvidia/tegra_pcie.c
==============================================================================
--- stable/11/sys/arm/nvidia/tegra_pcie.c	Sat Nov  5 11:00:19 2016	(r308336)
+++ stable/11/sys/arm/nvidia/tegra_pcie.c	Sat Nov  5 11:01:56 2016	(r308337)
@@ -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 */
@@ -765,15 +762,15 @@ tegra_pcib_msi_release_msi(device_t dev,
 	sc = device_get_softc(dev);
 	mtx_lock(&sc->mtx);
 	for (i = 0; i < count; i++) {
-		ti = (struct tegra_pcib_irqsrc *)isrc;
+		ti = (struct tegra_pcib_irqsrc *)isrc[i];
 
 		KASSERT((ti->flags & TEGRA_FLAG_MSI_USED) == TEGRA_FLAG_MSI_USED,
 		    ("%s: Trying to release an unused MSI-X interrupt",
 		    __func__));
 
 		ti->flags &= ~TEGRA_FLAG_MSI_USED;
-		mtx_unlock(&sc->mtx);
 	}
+	mtx_unlock(&sc->mtx);
 	return (0);
 }
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201611051101.uA5B1urO048793>