be2net: refactor code that decides adapter->num_rx_queues

The code has been refactored to not set num_rx_qs inside be_enable_msix().
num_rx_qs is now set at the time of queue creation based on the number of
available msix vectors.

Signed-off-by: Sathya Perla <sathya.perla@emulex.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Sathya Perla 2011-03-21 20:49:25 +00:00 committed by David S. Miller
parent 311fddc756
commit ac6a0c4aab
2 changed files with 39 additions and 35 deletions

View File

@ -84,7 +84,8 @@ static inline char *nic_name(struct pci_dev *pdev)
#define MCC_CQ_LEN 256
#define MAX_RSS_QS 4 /* BE limit is 4 queues/port */
#define BE_MAX_MSIX_VECTORS (MAX_RSS_QS + 1 + 1)/* RSS qs + 1 def Rx + Tx */
#define MAX_RX_QS (MAX_RSS_QS + 1) /* RSS qs + 1 def Rx */
#define BE_MAX_MSIX_VECTORS (MAX_RX_QS + 1)/* RX + TX */
#define BE_NAPI_WEIGHT 64
#define MAX_RX_POST BE_NAPI_WEIGHT /* Frags posted at a time */
#define RX_FRAGS_REFILL_WM (RX_Q_LEN - MAX_RX_POST)
@ -276,7 +277,7 @@ struct be_adapter {
spinlock_t mcc_cq_lock;
struct msix_entry msix_entries[BE_MAX_MSIX_VECTORS];
bool msix_enabled;
u32 num_msix_vec;
bool isr_registered;
/* TX Rings */
@ -287,7 +288,7 @@ struct be_adapter {
u32 cache_line_break[8];
/* Rx rings */
struct be_rx_obj rx_obj[MAX_RSS_QS + 1]; /* one default non-rss Q */
struct be_rx_obj rx_obj[MAX_RX_QS];
u32 num_rx_qs;
u32 big_page_size; /* Compounded page size shared by rx wrbs */
@ -351,6 +352,7 @@ struct be_adapter {
extern const struct ethtool_ops be_ethtool_ops;
#define msix_enabled(adapter) (adapter->num_msix_vec > 0)
#define tx_stats(adapter) (&adapter->tx_stats)
#define rx_stats(rxo) (&rxo->stats)

View File

@ -1567,12 +1567,31 @@ static void be_rx_queues_destroy(struct be_adapter *adapter)
}
}
static u32 be_num_rxqs_want(struct be_adapter *adapter)
{
if (multi_rxq && (adapter->function_caps & BE_FUNCTION_CAPS_RSS) &&
!adapter->sriov_enabled && !(adapter->function_mode & 0x400)) {
return 1 + MAX_RSS_QS; /* one default non-RSS queue */
} else {
dev_warn(&adapter->pdev->dev,
"No support for multiple RX queues\n");
return 1;
}
}
static int be_rx_queues_create(struct be_adapter *adapter)
{
struct be_queue_info *eq, *q, *cq;
struct be_rx_obj *rxo;
int rc, i;
adapter->num_rx_qs = min(be_num_rxqs_want(adapter),
msix_enabled(adapter) ?
adapter->num_msix_vec - 1 : 1);
if (adapter->num_rx_qs != MAX_RX_QS)
dev_warn(&adapter->pdev->dev,
"Can create only %d RX queues", adapter->num_rx_qs);
adapter->big_page_size = (1 << get_order(rx_frag_size)) * PAGE_SIZE;
for_all_rx_queues(adapter, rxo, i) {
rxo->adapter = adapter;
@ -1878,51 +1897,35 @@ reschedule:
static void be_msix_disable(struct be_adapter *adapter)
{
if (adapter->msix_enabled) {
if (msix_enabled(adapter)) {
pci_disable_msix(adapter->pdev);
adapter->msix_enabled = false;
}
}
static int be_num_rxqs_get(struct be_adapter *adapter)
{
if (multi_rxq && (adapter->function_caps & BE_FUNCTION_CAPS_RSS) &&
!adapter->sriov_enabled && !(adapter->function_mode & 0x400)) {
return 1 + MAX_RSS_QS; /* one default non-RSS queue */
} else {
dev_warn(&adapter->pdev->dev,
"No support for multiple RX queues\n");
return 1;
adapter->num_msix_vec = 0;
}
}
static void be_msix_enable(struct be_adapter *adapter)
{
#define BE_MIN_MSIX_VECTORS (1 + 1) /* Rx + Tx */
int i, status;
int i, status, num_vec;
adapter->num_rx_qs = be_num_rxqs_get(adapter);
num_vec = be_num_rxqs_want(adapter) + 1;
for (i = 0; i < (adapter->num_rx_qs + 1); i++)
for (i = 0; i < num_vec; i++)
adapter->msix_entries[i].entry = i;
status = pci_enable_msix(adapter->pdev, adapter->msix_entries,
adapter->num_rx_qs + 1);
status = pci_enable_msix(adapter->pdev, adapter->msix_entries, num_vec);
if (status == 0) {
goto done;
} else if (status >= BE_MIN_MSIX_VECTORS) {
num_vec = status;
if (pci_enable_msix(adapter->pdev, adapter->msix_entries,
status) == 0) {
adapter->num_rx_qs = status - 1;
dev_warn(&adapter->pdev->dev,
"Could alloc only %d MSIx vectors. "
"Using %d RX Qs\n", status, adapter->num_rx_qs);
num_vec) == 0)
goto done;
}
}
return;
done:
adapter->msix_enabled = true;
adapter->num_msix_vec = num_vec;
return;
}
static void be_sriov_enable(struct be_adapter *adapter)
@ -2003,8 +2006,7 @@ err_msix:
err:
dev_warn(&adapter->pdev->dev,
"MSIX Request IRQ failed - err %d\n", status);
pci_disable_msix(adapter->pdev);
adapter->msix_enabled = false;
be_msix_disable(adapter);
return status;
}
@ -2013,7 +2015,7 @@ static int be_irq_register(struct be_adapter *adapter)
struct net_device *netdev = adapter->netdev;
int status;
if (adapter->msix_enabled) {
if (msix_enabled(adapter)) {
status = be_msix_register(adapter);
if (status == 0)
goto done;
@ -2046,7 +2048,7 @@ static void be_irq_unregister(struct be_adapter *adapter)
return;
/* INTx */
if (!adapter->msix_enabled) {
if (!msix_enabled(adapter)) {
free_irq(netdev->irq, adapter);
goto done;
}
@ -2088,7 +2090,7 @@ static int be_close(struct net_device *netdev)
be_cq_notify(adapter, rxo->cq.id, false, 0);
}
if (adapter->msix_enabled) {
if (msix_enabled(adapter)) {
vec = be_msix_vec_get(adapter, tx_eq);
synchronize_irq(vec);
@ -2261,7 +2263,7 @@ static int be_setup(struct be_adapter *adapter)
BE_IF_FLAGS_PASS_L3L4_ERRORS;
en_flags |= BE_IF_FLAGS_PASS_L3L4_ERRORS;
if (be_multi_rxq(adapter)) {
if (adapter->function_caps & BE_FUNCTION_CAPS_RSS) {
cap_flags |= BE_IF_FLAGS_RSS;
en_flags |= BE_IF_FLAGS_RSS;
}