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

Commit 901e040a authored by Thomas Falcon's avatar Thomas Falcon Committed by David S. Miller
Browse files

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: default avatarThomas Falcon <tlfalcon@linux.vnet.ibm.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 6c267b3d
Loading
Loading
Loading
Loading
+38 −33
Original line number Original line Diff line number Diff line
@@ -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 */
}
}
+1 −2
Original line number Original line Diff line number Diff line
@@ -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 */