mirror of https://gitee.com/openkylin/linux.git
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: Thomas Falcon <tlfalcon@linux.vnet.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
6c267b3dea
commit
901e040aa3
|
@ -1260,8 +1260,6 @@ static void release_sub_crqs(struct ibmvnic_adapter *adapter)
|
|||
}
|
||||
adapter->rx_scrq = NULL;
|
||||
}
|
||||
|
||||
adapter->requested_caps = 0;
|
||||
}
|
||||
|
||||
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 = NULL;
|
||||
}
|
||||
|
||||
adapter->requested_caps = 0;
|
||||
}
|
||||
|
||||
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.number = cpu_to_be64(adapter->req_tx_queues);
|
||||
atomic_inc(&adapter->running_cap_crqs);
|
||||
ibmvnic_send_crq(adapter, &crq);
|
||||
|
||||
crq.request_capability.capability = cpu_to_be16(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);
|
||||
|
||||
crq.request_capability.capability = cpu_to_be16(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);
|
||||
|
||||
crq.request_capability.capability =
|
||||
cpu_to_be16(REQ_TX_ENTRIES_PER_SUBCRQ);
|
||||
crq.request_capability.number =
|
||||
cpu_to_be64(adapter->req_tx_entries_per_subcrq);
|
||||
atomic_inc(&adapter->running_cap_crqs);
|
||||
ibmvnic_send_crq(adapter, &crq);
|
||||
|
||||
crq.request_capability.capability =
|
||||
cpu_to_be16(REQ_RX_ADD_ENTRIES_PER_SUBCRQ);
|
||||
crq.request_capability.number =
|
||||
cpu_to_be64(adapter->req_rx_add_entries_per_subcrq);
|
||||
atomic_inc(&adapter->running_cap_crqs);
|
||||
ibmvnic_send_crq(adapter, &crq);
|
||||
|
||||
crq.request_capability.capability = cpu_to_be16(REQ_MTU);
|
||||
crq.request_capability.number = cpu_to_be64(adapter->req_mtu);
|
||||
atomic_inc(&adapter->running_cap_crqs);
|
||||
ibmvnic_send_crq(adapter, &crq);
|
||||
|
||||
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 =
|
||||
cpu_to_be16(PROMISC_REQUESTED);
|
||||
crq.request_capability.number = cpu_to_be64(1);
|
||||
atomic_inc(&adapter->running_cap_crqs);
|
||||
ibmvnic_send_crq(adapter, &crq);
|
||||
}
|
||||
} else {
|
||||
crq.request_capability.capability =
|
||||
cpu_to_be16(PROMISC_REQUESTED);
|
||||
crq.request_capability.number = cpu_to_be64(0);
|
||||
atomic_inc(&adapter->running_cap_crqs);
|
||||
ibmvnic_send_crq(adapter, &crq);
|
||||
}
|
||||
|
||||
|
@ -1960,112 +1964,112 @@ static void send_cap_queries(struct ibmvnic_adapter *adapter)
|
|||
{
|
||||
union ibmvnic_crq crq;
|
||||
|
||||
atomic_set(&adapter->running_cap_queries, 0);
|
||||
atomic_set(&adapter->running_cap_crqs, 0);
|
||||
memset(&crq, 0, sizeof(crq));
|
||||
crq.query_capability.first = IBMVNIC_CRQ_CMD;
|
||||
crq.query_capability.cmd = QUERY_CAPABILITY;
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
crq.query_capability.capability =
|
||||
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);
|
||||
|
||||
crq.query_capability.capability =
|
||||
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);
|
||||
|
||||
crq.query_capability.capability =
|
||||
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);
|
||||
|
||||
crq.query_capability.capability =
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
crq.query_capability.capability =
|
||||
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);
|
||||
|
||||
crq.query_capability.capability =
|
||||
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);
|
||||
|
||||
crq.query_capability.capability =
|
||||
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);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -2353,6 +2357,7 @@ static void handle_request_cap_rsp(union ibmvnic_crq *crq,
|
|||
u64 *req_value;
|
||||
char *name;
|
||||
|
||||
atomic_dec(&adapter->running_cap_crqs);
|
||||
switch (be16_to_cpu(crq->request_capability_rsp.capability)) {
|
||||
case 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 */
|
||||
if (++adapter->requested_caps == 7) {
|
||||
if (atomic_read(&adapter->running_cap_crqs) == 0) {
|
||||
union ibmvnic_crq newcrq;
|
||||
int buf_sz = sizeof(struct ibmvnic_query_ip_offload_buffer);
|
||||
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;
|
||||
long rc;
|
||||
|
||||
atomic_dec(&adapter->running_cap_queries);
|
||||
atomic_dec(&adapter->running_cap_crqs);
|
||||
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;
|
||||
if (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:
|
||||
if (atomic_read(&adapter->running_cap_queries) == 0)
|
||||
if (atomic_read(&adapter->running_cap_crqs) == 0)
|
||||
init_sub_crqs(adapter, 0);
|
||||
/* We're done querying the capabilities, initialize sub-crqs */
|
||||
}
|
||||
|
|
|
@ -976,11 +976,10 @@ struct ibmvnic_adapter {
|
|||
dma_addr_t login_rsp_buf_token;
|
||||
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 **rx_scrq;
|
||||
int requested_caps;
|
||||
bool renegotiate;
|
||||
|
||||
/* rx structs */
|
||||
|
|
Loading…
Reference in New Issue