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);
 }
 
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to