Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1ac218c8 authored by Vladislav Zolotarov's avatar Vladislav Zolotarov Committed by David S. Miller
Browse files

bnx2x: Fixed MSI-X enabling flow



Try to enable less MSI-X vectors if initial request has failed.

Author: Dmitry Kravkov <dmitry@broadcom.com>
Signed-off-by: default avatarDmitry Kravkov <dmitry@broadcom.com>
Signed-off-by: default avatarVladislav Zolotarov <vladz@broadcom.com>
Signed-off-by: default avatarEilon Greenstein <eilong@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent dea7aab1
Loading
Loading
Loading
Loading
+13 −5
Original line number Diff line number Diff line
@@ -24,16 +24,25 @@
#define BCM_VLAN			1
#endif

#define BNX2X_MULTI_QUEUE

#define BNX2X_NEW_NAPI



#if defined(CONFIG_CNIC) || defined(CONFIG_CNIC_MODULE)
#define BCM_CNIC 1
#include "cnic_if.h"
#endif

#define BNX2X_MULTI_QUEUE

#define BNX2X_NEW_NAPI


#ifdef BCM_CNIC
#define BNX2X_MIN_MSIX_VEC_CNT 3
#define BNX2X_MSIX_VEC_FP_START 2
#else
#define BNX2X_MIN_MSIX_VEC_CNT 2
#define BNX2X_MSIX_VEC_FP_START 1
#endif

#include <linux/mdio.h>
#include "bnx2x_reg.h"
@@ -862,7 +871,6 @@ struct bnx2x {
#endif
#define INT_MODE_INTx			1
#define INT_MODE_MSI			2
#define INT_MODE_MSIX			3

	int			tx_ring_size;

+25 −3
Original line number Diff line number Diff line
@@ -7418,7 +7418,31 @@ static int bnx2x_enable_msix(struct bnx2x *bp)

	rc = pci_enable_msix(bp->pdev, &bp->msix_table[0],
			     BNX2X_NUM_QUEUES(bp) + offset);

	/*
	 * reconfigure number of tx/rx queues according to available
	 * MSI-X vectors
	 */
	if (rc >= BNX2X_MIN_MSIX_VEC_CNT) {
		/* vectors available for FP */
		int fp_vec = rc - BNX2X_MSIX_VEC_FP_START;

		DP(NETIF_MSG_IFUP,
		   "Trying to use less MSI-X vectors: %d\n", rc);

		rc = pci_enable_msix(bp->pdev, &bp->msix_table[0], rc);

		if (rc) {
			DP(NETIF_MSG_IFUP,
			   "MSI-X is not attainable  rc %d\n", rc);
			return rc;
		}

		bp->num_queues = min(bp->num_queues, fp_vec);

		DP(NETIF_MSG_IFUP, "New queue configuration set: %d\n",
				  bp->num_queues);
	} else if (rc) {
		DP(NETIF_MSG_IFUP, "MSI-X is not attainable  rc %d\n", rc);
		return rc;
	}
@@ -7841,8 +7865,6 @@ static int bnx2x_set_num_queues(struct bnx2x *bp)
		bp->num_queues = 1;
		DP(NETIF_MSG_IFUP, "set number of queues to 1\n");
		break;

	case INT_MODE_MSIX:
	default:
		/* Set number of queues according to bp->multi_mode value */
		bnx2x_set_num_queues_msix(bp);