|
@@ -1260,8 +1260,6 @@ static void release_sub_crqs(struct ibmvnic_adapter *adapter)
|
|
}
|
|
}
|
|
adapter->rx_scrq = NULL;
|
|
adapter->rx_scrq = NULL;
|
|
}
|
|
}
|
|
-
|
|
|
|
- adapter->requested_caps = 0;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
static void release_sub_crqs_no_irqs(struct ibmvnic_adapter *adapter)
|
|
static void release_sub_crqs_no_irqs(struct ibmvnic_adapter *adapter)
|
|
@@ -1283,8 +1281,6 @@ static void release_sub_crqs_no_irqs(struct ibmvnic_adapter *adapter)
|
|
adapter->rx_scrq[i]);
|
|
adapter->rx_scrq[i]);
|
|
adapter->rx_scrq = NULL;
|
|
adapter->rx_scrq = NULL;
|
|
}
|
|
}
|
|
-
|
|
|
|
- adapter->requested_caps = 0;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
static int disable_scrq_irq(struct ibmvnic_adapter *adapter,
|
|
static int disable_scrq_irq(struct ibmvnic_adapter *adapter,
|
|
@@ -1572,30 +1568,36 @@ static void init_sub_crqs(struct ibmvnic_adapter *adapter, int retry)
|
|
|
|
|
|
crq.request_capability.capability = cpu_to_be16(REQ_TX_QUEUES);
|
|
crq.request_capability.capability = cpu_to_be16(REQ_TX_QUEUES);
|
|
crq.request_capability.number = cpu_to_be64(adapter->req_tx_queues);
|
|
crq.request_capability.number = cpu_to_be64(adapter->req_tx_queues);
|
|
|
|
+ atomic_inc(&adapter->running_cap_crqs);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
|
|
|
|
crq.request_capability.capability = cpu_to_be16(REQ_RX_QUEUES);
|
|
crq.request_capability.capability = cpu_to_be16(REQ_RX_QUEUES);
|
|
crq.request_capability.number = cpu_to_be64(adapter->req_rx_queues);
|
|
crq.request_capability.number = cpu_to_be64(adapter->req_rx_queues);
|
|
|
|
+ atomic_inc(&adapter->running_cap_crqs);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
|
|
|
|
crq.request_capability.capability = cpu_to_be16(REQ_RX_ADD_QUEUES);
|
|
crq.request_capability.capability = cpu_to_be16(REQ_RX_ADD_QUEUES);
|
|
crq.request_capability.number = cpu_to_be64(adapter->req_rx_add_queues);
|
|
crq.request_capability.number = cpu_to_be64(adapter->req_rx_add_queues);
|
|
|
|
+ atomic_inc(&adapter->running_cap_crqs);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
|
|
|
|
crq.request_capability.capability =
|
|
crq.request_capability.capability =
|
|
cpu_to_be16(REQ_TX_ENTRIES_PER_SUBCRQ);
|
|
cpu_to_be16(REQ_TX_ENTRIES_PER_SUBCRQ);
|
|
crq.request_capability.number =
|
|
crq.request_capability.number =
|
|
cpu_to_be64(adapter->req_tx_entries_per_subcrq);
|
|
cpu_to_be64(adapter->req_tx_entries_per_subcrq);
|
|
|
|
+ atomic_inc(&adapter->running_cap_crqs);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
|
|
|
|
crq.request_capability.capability =
|
|
crq.request_capability.capability =
|
|
cpu_to_be16(REQ_RX_ADD_ENTRIES_PER_SUBCRQ);
|
|
cpu_to_be16(REQ_RX_ADD_ENTRIES_PER_SUBCRQ);
|
|
crq.request_capability.number =
|
|
crq.request_capability.number =
|
|
cpu_to_be64(adapter->req_rx_add_entries_per_subcrq);
|
|
cpu_to_be64(adapter->req_rx_add_entries_per_subcrq);
|
|
|
|
+ atomic_inc(&adapter->running_cap_crqs);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
|
|
|
|
crq.request_capability.capability = cpu_to_be16(REQ_MTU);
|
|
crq.request_capability.capability = cpu_to_be16(REQ_MTU);
|
|
crq.request_capability.number = cpu_to_be64(adapter->req_mtu);
|
|
crq.request_capability.number = cpu_to_be64(adapter->req_mtu);
|
|
|
|
+ atomic_inc(&adapter->running_cap_crqs);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
|
|
|
|
if (adapter->netdev->flags & IFF_PROMISC) {
|
|
if (adapter->netdev->flags & IFF_PROMISC) {
|
|
@@ -1603,12 +1605,14 @@ static void init_sub_crqs(struct ibmvnic_adapter *adapter, int retry)
|
|
crq.request_capability.capability =
|
|
crq.request_capability.capability =
|
|
cpu_to_be16(PROMISC_REQUESTED);
|
|
cpu_to_be16(PROMISC_REQUESTED);
|
|
crq.request_capability.number = cpu_to_be64(1);
|
|
crq.request_capability.number = cpu_to_be64(1);
|
|
|
|
+ atomic_inc(&adapter->running_cap_crqs);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
crq.request_capability.capability =
|
|
crq.request_capability.capability =
|
|
cpu_to_be16(PROMISC_REQUESTED);
|
|
cpu_to_be16(PROMISC_REQUESTED);
|
|
crq.request_capability.number = cpu_to_be64(0);
|
|
crq.request_capability.number = cpu_to_be64(0);
|
|
|
|
+ atomic_inc(&adapter->running_cap_crqs);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1960,112 +1964,112 @@ static void send_cap_queries(struct ibmvnic_adapter *adapter)
|
|
{
|
|
{
|
|
union ibmvnic_crq crq;
|
|
union ibmvnic_crq crq;
|
|
|
|
|
|
- atomic_set(&adapter->running_cap_queries, 0);
|
|
|
|
|
|
+ atomic_set(&adapter->running_cap_crqs, 0);
|
|
memset(&crq, 0, sizeof(crq));
|
|
memset(&crq, 0, sizeof(crq));
|
|
crq.query_capability.first = IBMVNIC_CRQ_CMD;
|
|
crq.query_capability.first = IBMVNIC_CRQ_CMD;
|
|
crq.query_capability.cmd = QUERY_CAPABILITY;
|
|
crq.query_capability.cmd = QUERY_CAPABILITY;
|
|
|
|
|
|
crq.query_capability.capability = cpu_to_be16(MIN_TX_QUEUES);
|
|
crq.query_capability.capability = cpu_to_be16(MIN_TX_QUEUES);
|
|
- atomic_inc(&adapter->running_cap_queries);
|
|
|
|
|
|
+ atomic_inc(&adapter->running_cap_crqs);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
|
|
|
|
crq.query_capability.capability = cpu_to_be16(MIN_RX_QUEUES);
|
|
crq.query_capability.capability = cpu_to_be16(MIN_RX_QUEUES);
|
|
- atomic_inc(&adapter->running_cap_queries);
|
|
|
|
|
|
+ atomic_inc(&adapter->running_cap_crqs);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
|
|
|
|
crq.query_capability.capability = cpu_to_be16(MIN_RX_ADD_QUEUES);
|
|
crq.query_capability.capability = cpu_to_be16(MIN_RX_ADD_QUEUES);
|
|
- atomic_inc(&adapter->running_cap_queries);
|
|
|
|
|
|
+ atomic_inc(&adapter->running_cap_crqs);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
|
|
|
|
crq.query_capability.capability = cpu_to_be16(MAX_TX_QUEUES);
|
|
crq.query_capability.capability = cpu_to_be16(MAX_TX_QUEUES);
|
|
- atomic_inc(&adapter->running_cap_queries);
|
|
|
|
|
|
+ atomic_inc(&adapter->running_cap_crqs);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
|
|
|
|
crq.query_capability.capability = cpu_to_be16(MAX_RX_QUEUES);
|
|
crq.query_capability.capability = cpu_to_be16(MAX_RX_QUEUES);
|
|
- atomic_inc(&adapter->running_cap_queries);
|
|
|
|
|
|
+ atomic_inc(&adapter->running_cap_crqs);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
|
|
|
|
crq.query_capability.capability = cpu_to_be16(MAX_RX_ADD_QUEUES);
|
|
crq.query_capability.capability = cpu_to_be16(MAX_RX_ADD_QUEUES);
|
|
- atomic_inc(&adapter->running_cap_queries);
|
|
|
|
|
|
+ atomic_inc(&adapter->running_cap_crqs);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
|
|
|
|
crq.query_capability.capability =
|
|
crq.query_capability.capability =
|
|
cpu_to_be16(MIN_TX_ENTRIES_PER_SUBCRQ);
|
|
cpu_to_be16(MIN_TX_ENTRIES_PER_SUBCRQ);
|
|
- atomic_inc(&adapter->running_cap_queries);
|
|
|
|
|
|
+ atomic_inc(&adapter->running_cap_crqs);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
|
|
|
|
crq.query_capability.capability =
|
|
crq.query_capability.capability =
|
|
cpu_to_be16(MIN_RX_ADD_ENTRIES_PER_SUBCRQ);
|
|
cpu_to_be16(MIN_RX_ADD_ENTRIES_PER_SUBCRQ);
|
|
- atomic_inc(&adapter->running_cap_queries);
|
|
|
|
|
|
+ atomic_inc(&adapter->running_cap_crqs);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
|
|
|
|
crq.query_capability.capability =
|
|
crq.query_capability.capability =
|
|
cpu_to_be16(MAX_TX_ENTRIES_PER_SUBCRQ);
|
|
cpu_to_be16(MAX_TX_ENTRIES_PER_SUBCRQ);
|
|
- atomic_inc(&adapter->running_cap_queries);
|
|
|
|
|
|
+ atomic_inc(&adapter->running_cap_crqs);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
|
|
|
|
crq.query_capability.capability =
|
|
crq.query_capability.capability =
|
|
cpu_to_be16(MAX_RX_ADD_ENTRIES_PER_SUBCRQ);
|
|
cpu_to_be16(MAX_RX_ADD_ENTRIES_PER_SUBCRQ);
|
|
- atomic_inc(&adapter->running_cap_queries);
|
|
|
|
|
|
+ atomic_inc(&adapter->running_cap_crqs);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
|
|
|
|
crq.query_capability.capability = cpu_to_be16(TCP_IP_OFFLOAD);
|
|
crq.query_capability.capability = cpu_to_be16(TCP_IP_OFFLOAD);
|
|
- atomic_inc(&adapter->running_cap_queries);
|
|
|
|
|
|
+ atomic_inc(&adapter->running_cap_crqs);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
|
|
|
|
crq.query_capability.capability = cpu_to_be16(PROMISC_SUPPORTED);
|
|
crq.query_capability.capability = cpu_to_be16(PROMISC_SUPPORTED);
|
|
- atomic_inc(&adapter->running_cap_queries);
|
|
|
|
|
|
+ atomic_inc(&adapter->running_cap_crqs);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
|
|
|
|
crq.query_capability.capability = cpu_to_be16(MIN_MTU);
|
|
crq.query_capability.capability = cpu_to_be16(MIN_MTU);
|
|
- atomic_inc(&adapter->running_cap_queries);
|
|
|
|
|
|
+ atomic_inc(&adapter->running_cap_crqs);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
|
|
|
|
crq.query_capability.capability = cpu_to_be16(MAX_MTU);
|
|
crq.query_capability.capability = cpu_to_be16(MAX_MTU);
|
|
- atomic_inc(&adapter->running_cap_queries);
|
|
|
|
|
|
+ atomic_inc(&adapter->running_cap_crqs);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
|
|
|
|
crq.query_capability.capability = cpu_to_be16(MAX_MULTICAST_FILTERS);
|
|
crq.query_capability.capability = cpu_to_be16(MAX_MULTICAST_FILTERS);
|
|
- atomic_inc(&adapter->running_cap_queries);
|
|
|
|
|
|
+ atomic_inc(&adapter->running_cap_crqs);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
|
|
|
|
crq.query_capability.capability = cpu_to_be16(VLAN_HEADER_INSERTION);
|
|
crq.query_capability.capability = cpu_to_be16(VLAN_HEADER_INSERTION);
|
|
- atomic_inc(&adapter->running_cap_queries);
|
|
|
|
|
|
+ atomic_inc(&adapter->running_cap_crqs);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
|
|
|
|
crq.query_capability.capability = cpu_to_be16(MAX_TX_SG_ENTRIES);
|
|
crq.query_capability.capability = cpu_to_be16(MAX_TX_SG_ENTRIES);
|
|
- atomic_inc(&adapter->running_cap_queries);
|
|
|
|
|
|
+ atomic_inc(&adapter->running_cap_crqs);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
|
|
|
|
crq.query_capability.capability = cpu_to_be16(RX_SG_SUPPORTED);
|
|
crq.query_capability.capability = cpu_to_be16(RX_SG_SUPPORTED);
|
|
- atomic_inc(&adapter->running_cap_queries);
|
|
|
|
|
|
+ atomic_inc(&adapter->running_cap_crqs);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
|
|
|
|
crq.query_capability.capability = cpu_to_be16(OPT_TX_COMP_SUB_QUEUES);
|
|
crq.query_capability.capability = cpu_to_be16(OPT_TX_COMP_SUB_QUEUES);
|
|
- atomic_inc(&adapter->running_cap_queries);
|
|
|
|
|
|
+ atomic_inc(&adapter->running_cap_crqs);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
|
|
|
|
crq.query_capability.capability = cpu_to_be16(OPT_RX_COMP_QUEUES);
|
|
crq.query_capability.capability = cpu_to_be16(OPT_RX_COMP_QUEUES);
|
|
- atomic_inc(&adapter->running_cap_queries);
|
|
|
|
|
|
+ atomic_inc(&adapter->running_cap_crqs);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
|
|
|
|
crq.query_capability.capability =
|
|
crq.query_capability.capability =
|
|
cpu_to_be16(OPT_RX_BUFADD_Q_PER_RX_COMP_Q);
|
|
cpu_to_be16(OPT_RX_BUFADD_Q_PER_RX_COMP_Q);
|
|
- atomic_inc(&adapter->running_cap_queries);
|
|
|
|
|
|
+ atomic_inc(&adapter->running_cap_crqs);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
|
|
|
|
crq.query_capability.capability =
|
|
crq.query_capability.capability =
|
|
cpu_to_be16(OPT_TX_ENTRIES_PER_SUBCRQ);
|
|
cpu_to_be16(OPT_TX_ENTRIES_PER_SUBCRQ);
|
|
- atomic_inc(&adapter->running_cap_queries);
|
|
|
|
|
|
+ atomic_inc(&adapter->running_cap_crqs);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
|
|
|
|
crq.query_capability.capability =
|
|
crq.query_capability.capability =
|
|
cpu_to_be16(OPT_RXBA_ENTRIES_PER_SUBCRQ);
|
|
cpu_to_be16(OPT_RXBA_ENTRIES_PER_SUBCRQ);
|
|
- atomic_inc(&adapter->running_cap_queries);
|
|
|
|
|
|
+ atomic_inc(&adapter->running_cap_crqs);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
|
|
|
|
crq.query_capability.capability = cpu_to_be16(TX_RX_DESC_REQ);
|
|
crq.query_capability.capability = cpu_to_be16(TX_RX_DESC_REQ);
|
|
- atomic_inc(&adapter->running_cap_queries);
|
|
|
|
|
|
+ atomic_inc(&adapter->running_cap_crqs);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
ibmvnic_send_crq(adapter, &crq);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -2353,6 +2357,7 @@ static void handle_request_cap_rsp(union ibmvnic_crq *crq,
|
|
u64 *req_value;
|
|
u64 *req_value;
|
|
char *name;
|
|
char *name;
|
|
|
|
|
|
|
|
+ atomic_dec(&adapter->running_cap_crqs);
|
|
switch (be16_to_cpu(crq->request_capability_rsp.capability)) {
|
|
switch (be16_to_cpu(crq->request_capability_rsp.capability)) {
|
|
case REQ_TX_QUEUES:
|
|
case REQ_TX_QUEUES:
|
|
req_value = &adapter->req_tx_queues;
|
|
req_value = &adapter->req_tx_queues;
|
|
@@ -2407,7 +2412,7 @@ static void handle_request_cap_rsp(union ibmvnic_crq *crq,
|
|
}
|
|
}
|
|
|
|
|
|
/* Done receiving requested capabilities, query IP offload support */
|
|
/* Done receiving requested capabilities, query IP offload support */
|
|
- if (++adapter->requested_caps == 7) {
|
|
|
|
|
|
+ if (atomic_read(&adapter->running_cap_crqs) == 0) {
|
|
union ibmvnic_crq newcrq;
|
|
union ibmvnic_crq newcrq;
|
|
int buf_sz = sizeof(struct ibmvnic_query_ip_offload_buffer);
|
|
int buf_sz = sizeof(struct ibmvnic_query_ip_offload_buffer);
|
|
struct ibmvnic_query_ip_offload_buffer *ip_offload_buf =
|
|
struct ibmvnic_query_ip_offload_buffer *ip_offload_buf =
|
|
@@ -2548,9 +2553,9 @@ static void handle_query_cap_rsp(union ibmvnic_crq *crq,
|
|
struct device *dev = &adapter->vdev->dev;
|
|
struct device *dev = &adapter->vdev->dev;
|
|
long rc;
|
|
long rc;
|
|
|
|
|
|
- atomic_dec(&adapter->running_cap_queries);
|
|
|
|
|
|
+ atomic_dec(&adapter->running_cap_crqs);
|
|
netdev_dbg(netdev, "Outstanding queries: %d\n",
|
|
netdev_dbg(netdev, "Outstanding queries: %d\n",
|
|
- atomic_read(&adapter->running_cap_queries));
|
|
|
|
|
|
+ atomic_read(&adapter->running_cap_crqs));
|
|
rc = crq->query_capability.rc.code;
|
|
rc = crq->query_capability.rc.code;
|
|
if (rc) {
|
|
if (rc) {
|
|
dev_err(dev, "Error %ld in QUERY_CAP_RSP\n", rc);
|
|
dev_err(dev, "Error %ld in QUERY_CAP_RSP\n", rc);
|
|
@@ -2708,7 +2713,7 @@ static void handle_query_cap_rsp(union ibmvnic_crq *crq,
|
|
}
|
|
}
|
|
|
|
|
|
out:
|
|
out:
|
|
- if (atomic_read(&adapter->running_cap_queries) == 0)
|
|
|
|
|
|
+ if (atomic_read(&adapter->running_cap_crqs) == 0)
|
|
init_sub_crqs(adapter, 0);
|
|
init_sub_crqs(adapter, 0);
|
|
/* We're done querying the capabilities, initialize sub-crqs */
|
|
/* We're done querying the capabilities, initialize sub-crqs */
|
|
}
|
|
}
|