提交 901e040a 编写于 作者: T Thomas Falcon 提交者: David S. Miller

ibmvnic: Use common counter for capabilities checks

Two different counters were being used for capabilities
requests and queries. These commands are not called
at the same time so there is no reason a single counter
cannot be used.
Signed-off-by: NThomas Falcon <tlfalcon@linux.vnet.ibm.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 6c267b3d
...@@ -1260,8 +1260,6 @@ static void release_sub_crqs(struct ibmvnic_adapter *adapter) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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 */
} }
......
...@@ -976,11 +976,10 @@ struct ibmvnic_adapter { ...@@ -976,11 +976,10 @@ struct ibmvnic_adapter {
dma_addr_t login_rsp_buf_token; dma_addr_t login_rsp_buf_token;
int login_rsp_buf_sz; int login_rsp_buf_sz;
atomic_t running_cap_queries; atomic_t running_cap_crqs;
struct ibmvnic_sub_crq_queue **tx_scrq; struct ibmvnic_sub_crq_queue **tx_scrq;
struct ibmvnic_sub_crq_queue **rx_scrq; struct ibmvnic_sub_crq_queue **rx_scrq;
int requested_caps;
bool renegotiate; bool renegotiate;
/* rx structs */ /* rx structs */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册