]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
be2net: Fix to fail probe if MSI-X enable fails for a VF
authorSomnath Kotur <somnath.kotur@emulex.com>
Thu, 2 May 2013 03:37:08 +0000 (03:37 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 2 May 2013 20:43:34 +0000 (16:43 -0400)
As per SPEC, INTx mode is not supported on VFs. So if enable_msix fails,
then just fail probe. Also bail out of be_open if irq_register fails.

Signed-off-by: Somnath Kotur <somnath.kotur@emulex.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/emulex/benet/be_main.c

index e6b5c4cd8c0c53eaf67a8bf0817b7f30ec232396..6c52a60dcdb769b9fb52ea3ba8050dd413432102 100644 (file)
@@ -2390,7 +2390,7 @@ static uint be_num_rss_want(struct be_adapter *adapter)
        return num;
 }
 
-static void be_msix_enable(struct be_adapter *adapter)
+static int be_msix_enable(struct be_adapter *adapter)
 {
 #define BE_MIN_MSIX_VECTORS            1
        int i, status, num_vec, num_roce_vec = 0;
@@ -2415,13 +2415,17 @@ static void be_msix_enable(struct be_adapter *adapter)
                goto done;
        } else if (status >= BE_MIN_MSIX_VECTORS) {
                num_vec = status;
-               if (pci_enable_msix(adapter->pdev, adapter->msix_entries,
-                               num_vec) == 0)
+               status = pci_enable_msix(adapter->pdev, adapter->msix_entries,
+                                        num_vec);
+               if (!status)
                        goto done;
        }
 
        dev_warn(dev, "MSIx enable failed\n");
-       return;
+       /* INTx is not supported in VFs, so fail probe if enable_msix fails */
+       if (!be_physfn(adapter))
+               return status;
+       return 0;
 done:
        if (be_roce_supported(adapter)) {
                if (num_vec > num_roce_vec) {
@@ -2435,7 +2439,7 @@ done:
        } else
                adapter->num_msix_vec = num_vec;
        dev_info(dev, "enabled %d MSI-x vector(s)\n", adapter->num_msix_vec);
-       return;
+       return 0;
 }
 
 static inline int be_msix_vec_get(struct be_adapter *adapter,
@@ -2646,7 +2650,9 @@ static int be_open(struct net_device *netdev)
        if (status)
                goto err;
 
-       be_irq_register(adapter);
+       status = be_irq_register(adapter);
+       if (status)
+               goto err;
 
        for_all_rx_queues(adapter, rxo, i)
                be_cq_notify(adapter, rxo->cq.id, true, 0);
@@ -3116,7 +3122,9 @@ static int be_setup(struct be_adapter *adapter)
        if (status)
                goto err;
 
-       be_msix_enable(adapter);
+       status = be_msix_enable(adapter);
+       if (status)
+               goto err;
 
        status = be_evt_queues_create(adapter);
        if (status)