Author: jfv
Date: Thu Aug 15 20:33:17 2013
New Revision: 254382
URL: http://svnweb.freebsd.org/changeset/base/254382

Log:
  MFC r254008 Make the fallback from MSIX to MSI interrupt usage more graceful.

Modified:
  stable/9/sys/dev/e1000/if_em.c
  stable/9/sys/dev/e1000/if_igb.c
  stable/9/sys/dev/ixgbe/ixgbe.c
  stable/9/sys/dev/ixgbe/ixv.c
Directory Properties:
  stable/9/sys/   (props changed)
  stable/9/sys/dev/   (props changed)
  stable/9/sys/dev/e1000/   (props changed)
  stable/9/sys/dev/ixgbe/   (props changed)

Modified: stable/9/sys/dev/e1000/if_em.c
==============================================================================
--- stable/9/sys/dev/e1000/if_em.c      Thu Aug 15 20:28:13 2013        
(r254381)
+++ stable/9/sys/dev/e1000/if_em.c      Thu Aug 15 20:33:17 2013        
(r254382)
@@ -2742,7 +2742,7 @@ static int
 em_setup_msix(struct adapter *adapter)
 {
        device_t dev = adapter->dev;
-       int val = 0;
+       int val;
 
        /*
        ** Setup MSI/X for Hartwell: tests have shown
@@ -2756,17 +2756,17 @@ em_setup_msix(struct adapter *adapter)
                int rid = PCIR_BAR(EM_MSIX_BAR);
                adapter->msix_mem = bus_alloc_resource_any(dev,
                    SYS_RES_MEMORY, &rid, RF_ACTIVE);
-                       if (!adapter->msix_mem) {
+                       if (adapter->msix_mem == NULL) {
                        /* May not be enabled */
                                device_printf(adapter->dev,
                            "Unable to map MSIX table \n");
                        goto msi;
                        }
                val = pci_msix_count(dev); 
-               /* We only need 3 vectors */
-               if (val > 3)
+               /* We only need/want 3 vectors */
+               if (val >= 3)
                        val = 3;
-               if ((val != 3) && (val != 5)) {
+               else {
                        bus_release_resource(dev, SYS_RES_MEMORY,
                            PCIR_BAR(EM_MSIX_BAR), adapter->msix_mem);
                        adapter->msix_mem = NULL;
@@ -2779,14 +2779,13 @@ em_setup_msix(struct adapter *adapter)
                        device_printf(adapter->dev,
                            "Using MSIX interrupts "
                            "with %d vectors\n", val);
+                       return (val);
                }
-
-               return (val);
+               /* Fall through to MSI */
        }
 msi:
-               val = pci_msi_count(dev);
-               if (val == 1 && pci_alloc_msi(dev, &val) == 0) {
-                       adapter->msix = 1;
+               val = 1;
+               if (pci_alloc_msi(dev, &val) == 0) {
                        device_printf(adapter->dev,"Using an MSI interrupt\n");
                return (val);
        } 

Modified: stable/9/sys/dev/e1000/if_igb.c
==============================================================================
--- stable/9/sys/dev/e1000/if_igb.c     Thu Aug 15 20:28:13 2013        
(r254381)
+++ stable/9/sys/dev/e1000/if_igb.c     Thu Aug 15 20:33:17 2013        
(r254382)
@@ -2834,24 +2834,19 @@ igb_setup_msix(struct adapter *adapter)
                goto msi;
 
        /* First try MSI/X */
+       msgs = pci_msix_count(dev); 
+       if (msgs == 0)
+               goto msi;
        rid = PCIR_BAR(IGB_MSIX_BAR);
        adapter->msix_mem = bus_alloc_resource_any(dev,
            SYS_RES_MEMORY, &rid, RF_ACTIVE);
-               if (!adapter->msix_mem) {
+               if (adapter->msix_mem == NULL) {
                /* May not be enabled */
                device_printf(adapter->dev,
                    "Unable to map MSIX table \n");
                goto msi;
        }
 
-       msgs = pci_msix_count(dev); 
-       if (msgs == 0) { /* system has msix disabled */
-               bus_release_resource(dev, SYS_RES_MEMORY,
-                   PCIR_BAR(IGB_MSIX_BAR), adapter->msix_mem);
-               adapter->msix_mem = NULL;
-               goto msi;
-       }
-
        /* Figure out a reasonable auto config value */
        queues = (mp_ncpus > (msgs-1)) ? (msgs-1) : mp_ncpus;
 
@@ -2894,20 +2889,27 @@ igb_setup_msix(struct adapter *adapter)
                    "MSIX Configuration Problem, "
                    "%d vectors configured, but %d queues wanted!\n",
                    msgs, want);
-               return (0);
+               goto msi;
        }
-       if ((msgs) && pci_alloc_msix(dev, &msgs) == 0) {
+       if (pci_alloc_msix(dev, &msgs) == 0) {
                        device_printf(adapter->dev,
                    "Using MSIX interrupts with %d vectors\n", msgs);
                adapter->num_queues = queues;
                return (msgs);
        }
+       /* Fallback to MSI configuration */
 msi:
-               msgs = pci_msi_count(dev);
-       if (msgs == 1 && pci_alloc_msi(dev, &msgs) == 0) {
+               if (adapter->msix_mem != NULL) {
+               bus_release_resource(dev, SYS_RES_MEMORY,
+                   PCIR_BAR(IGB_MSIX_BAR), adapter->msix_mem);
+               adapter->msix_mem = NULL;
+       }
+               msgs = 1;
+       if (pci_alloc_msi(dev, &msgs) == 0) {
                device_printf(adapter->dev," Using MSI interrupt\n");
                return (msgs);
        }
+       /* Default to a legacy interrupt */
        return (0);
 }
 

Modified: stable/9/sys/dev/ixgbe/ixgbe.c
==============================================================================
--- stable/9/sys/dev/ixgbe/ixgbe.c      Thu Aug 15 20:28:13 2013        
(r254381)
+++ stable/9/sys/dev/ixgbe/ixgbe.c      Thu Aug 15 20:33:17 2013        
(r254382)
@@ -2415,29 +2415,24 @@ ixgbe_setup_msix(struct adapter *adapter
                goto msi;
 
        /* First try MSI/X */
+       msgs = pci_msix_count(dev); 
+       if (msgs == 0)
+               goto msi;
        rid = PCIR_BAR(MSIX_82598_BAR);
        adapter->msix_mem = bus_alloc_resource_any(dev,
            SYS_RES_MEMORY, &rid, RF_ACTIVE);
-               if (!adapter->msix_mem) {
+               if (adapter->msix_mem == NULL) {
                rid += 4;       /* 82599 maps in higher BAR */
                adapter->msix_mem = bus_alloc_resource_any(dev,
                    SYS_RES_MEMORY, &rid, RF_ACTIVE);
        }
-               if (!adapter->msix_mem) {
+               if (adapter->msix_mem == NULL) {
                /* May not be enabled */
                device_printf(adapter->dev,
                    "Unable to map MSIX table \n");
                goto msi;
        }
 
-       msgs = pci_msix_count(dev); 
-       if (msgs == 0) { /* system has msix disabled */
-               bus_release_resource(dev, SYS_RES_MEMORY,
-                   rid, adapter->msix_mem);
-               adapter->msix_mem = NULL;
-               goto msi;
-       }
-
        /* Figure out a reasonable auto config value */
        queues = (mp_ncpus > (msgs-1)) ? (msgs-1) : mp_ncpus;
 
@@ -2459,21 +2454,27 @@ ixgbe_setup_msix(struct adapter *adapter
                    "MSIX Configuration Problem, "
                    "%d vectors but %d queues wanted!\n",
                    msgs, want);
-               return (0); /* Will go to Legacy setup */
+               goto msi;
        }
-       if ((msgs) && pci_alloc_msix(dev, &msgs) == 0) {
+       if (pci_alloc_msix(dev, &msgs) == 0) {
                        device_printf(adapter->dev,
                    "Using MSIX interrupts with %d vectors\n", msgs);
                adapter->num_queues = queues;
                return (msgs);
        }
 msi:
-               msgs = pci_msi_count(dev);
-               if (msgs == 1 && pci_alloc_msi(dev, &msgs) == 0)
+               if (adapter->msix_mem != NULL) {
+               bus_release_resource(dev, SYS_RES_MEMORY,
+                   rid, adapter->msix_mem);
+               adapter->msix_mem = NULL;
+       }
+               msgs = 1;
+               if (pci_alloc_msi(dev, &msgs) == 0) {
                        device_printf(adapter->dev,"Using an MSI interrupt\n");
-       else
-                       device_printf(adapter->dev,"Using a Legacy 
interrupt\n");
-       return (msgs);
+               return (msgs);
+       }
+       device_printf(adapter->dev,"Using a Legacy interrupt\n");
+       return (0);
 }
 
 

Modified: stable/9/sys/dev/ixgbe/ixv.c
==============================================================================
--- stable/9/sys/dev/ixgbe/ixv.c        Thu Aug 15 20:28:13 2013        
(r254381)
+++ stable/9/sys/dev/ixgbe/ixv.c        Thu Aug 15 20:33:17 2013        
(r254382)
@@ -1680,37 +1680,35 @@ static int
 ixv_setup_msix(struct adapter *adapter)
 {
        device_t dev = adapter->dev;
-       int rid, vectors, want = 2;
+       int rid, want;
 
 
        /* First try MSI/X */
        rid = PCIR_BAR(3);
        adapter->msix_mem = bus_alloc_resource_any(dev,
            SYS_RES_MEMORY, &rid, RF_ACTIVE);
-               if (!adapter->msix_mem) {
+               if (adapter->msix_mem == NULL) {
                device_printf(adapter->dev,
                    "Unable to map MSIX table \n");
                goto out;
        }
 
-       vectors = pci_msix_count(dev); 
-       if (vectors < 2) {
-               bus_release_resource(dev, SYS_RES_MEMORY,
-                   rid, adapter->msix_mem);
-               adapter->msix_mem = NULL;
-               goto out;
-       }
-
        /*
        ** Want two vectors: one for a queue,
        ** plus an additional for mailbox.
        */
+       want = 2;
        if (pci_alloc_msix(dev, &want) == 0) {
                        device_printf(adapter->dev,
                    "Using MSIX interrupts with %d vectors\n", want);
                return (want);
        }
 out:
+               if (adapter->msix_mem != NULL) {
+               bus_release_resource(dev, SYS_RES_MEMORY,
+                   rid, adapter->msix_mem);
+               adapter->msix_mem = NULL;
+       }
        device_printf(adapter->dev,"MSIX config error\n");
        return (ENXIO);
 }
_______________________________________________
svn-src-stable-9@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-stable-9
To unsubscribe, send any mail to "svn-src-stable-9-unsubscr...@freebsd.org"

Reply via email to