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

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

ibmvnic: Update TX pool cleaning routine



Update routine that cleans up any outstanding transmits that
have not received completions when the device needs to close.
Introduces a helper function that cleans one TX pool to make
code more readable.

Signed-off-by: default avatarThomas Falcon <tlfalcon@linux.vnet.ibm.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 86b61a5f
Loading
Loading
Loading
Loading
+24 −16
Original line number Diff line number Diff line
@@ -1128,35 +1128,43 @@ static void clean_rx_pools(struct ibmvnic_adapter *adapter)
	}
}

static void clean_tx_pools(struct ibmvnic_adapter *adapter)
static void clean_one_tx_pool(struct ibmvnic_adapter *adapter,
			      struct ibmvnic_tx_pool *tx_pool)
{
	struct ibmvnic_tx_pool *tx_pool;
	struct ibmvnic_tx_buff *tx_buff;
	u64 tx_entries;
	int tx_scrqs;
	int i, j;
	int i;

	if (!adapter->tx_pool)
	if (!tx_pool && !tx_pool->tx_buff)
		return;

	tx_scrqs = be32_to_cpu(adapter->login_rsp_buf->num_txsubm_subcrqs);
	tx_entries = adapter->req_tx_entries_per_subcrq;
	tx_entries = tx_pool->num_buffers;

	/* Free any remaining skbs in the tx buffer pools */
	for (i = 0; i < tx_scrqs; i++) {
		tx_pool = &adapter->tx_pool[i];
		if (!tx_pool && !tx_pool->tx_buff)
			continue;

		netdev_dbg(adapter->netdev, "Cleaning tx_pool[%d]\n", i);
		for (j = 0; j < tx_entries; j++) {
			tx_buff = &tx_pool->tx_buff[j];
	for (i = 0; i < tx_entries; i++) {
		tx_buff = &tx_pool->tx_buff[i];
		if (tx_buff && tx_buff->skb) {
			dev_kfree_skb_any(tx_buff->skb);
			tx_buff->skb = NULL;
		}
	}
}

static void clean_tx_pools(struct ibmvnic_adapter *adapter)
{
	int tx_scrqs;
	int i;

	if (!adapter->tx_pool || !adapter->tso_pool)
		return;

	tx_scrqs = be32_to_cpu(adapter->login_rsp_buf->num_txsubm_subcrqs);

	/* Free any remaining skbs in the tx buffer pools */
	for (i = 0; i < tx_scrqs; i++) {
		netdev_dbg(adapter->netdev, "Cleaning tx_pool[%d]\n", i);
		clean_one_tx_pool(adapter, &adapter->tx_pool[i]);
		clean_one_tx_pool(adapter, &adapter->tso_pool[i]);
	}
}

static void ibmvnic_cleanup(struct net_device *netdev)