162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/* Copyright(c) 2013 - 2018 Intel Corporation. */
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#include "iavf_type.h"
562306a36Sopenharmony_ci#include "iavf_adminq.h"
662306a36Sopenharmony_ci#include "iavf_prototype.h"
762306a36Sopenharmony_ci#include <linux/avf/virtchnl.h>
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci/**
1062306a36Sopenharmony_ci * iavf_set_mac_type - Sets MAC type
1162306a36Sopenharmony_ci * @hw: pointer to the HW structure
1262306a36Sopenharmony_ci *
1362306a36Sopenharmony_ci * This function sets the mac type of the adapter based on the
1462306a36Sopenharmony_ci * vendor ID and device ID stored in the hw structure.
1562306a36Sopenharmony_ci **/
1662306a36Sopenharmony_cienum iavf_status iavf_set_mac_type(struct iavf_hw *hw)
1762306a36Sopenharmony_ci{
1862306a36Sopenharmony_ci	enum iavf_status status = 0;
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci	if (hw->vendor_id == PCI_VENDOR_ID_INTEL) {
2162306a36Sopenharmony_ci		switch (hw->device_id) {
2262306a36Sopenharmony_ci		case IAVF_DEV_ID_X722_VF:
2362306a36Sopenharmony_ci			hw->mac.type = IAVF_MAC_X722_VF;
2462306a36Sopenharmony_ci			break;
2562306a36Sopenharmony_ci		case IAVF_DEV_ID_VF:
2662306a36Sopenharmony_ci		case IAVF_DEV_ID_VF_HV:
2762306a36Sopenharmony_ci		case IAVF_DEV_ID_ADAPTIVE_VF:
2862306a36Sopenharmony_ci			hw->mac.type = IAVF_MAC_VF;
2962306a36Sopenharmony_ci			break;
3062306a36Sopenharmony_ci		default:
3162306a36Sopenharmony_ci			hw->mac.type = IAVF_MAC_GENERIC;
3262306a36Sopenharmony_ci			break;
3362306a36Sopenharmony_ci		}
3462306a36Sopenharmony_ci	} else {
3562306a36Sopenharmony_ci		status = IAVF_ERR_DEVICE_NOT_SUPPORTED;
3662306a36Sopenharmony_ci	}
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci	return status;
3962306a36Sopenharmony_ci}
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci/**
4262306a36Sopenharmony_ci * iavf_aq_str - convert AQ err code to a string
4362306a36Sopenharmony_ci * @hw: pointer to the HW structure
4462306a36Sopenharmony_ci * @aq_err: the AQ error code to convert
4562306a36Sopenharmony_ci **/
4662306a36Sopenharmony_ciconst char *iavf_aq_str(struct iavf_hw *hw, enum iavf_admin_queue_err aq_err)
4762306a36Sopenharmony_ci{
4862306a36Sopenharmony_ci	switch (aq_err) {
4962306a36Sopenharmony_ci	case IAVF_AQ_RC_OK:
5062306a36Sopenharmony_ci		return "OK";
5162306a36Sopenharmony_ci	case IAVF_AQ_RC_EPERM:
5262306a36Sopenharmony_ci		return "IAVF_AQ_RC_EPERM";
5362306a36Sopenharmony_ci	case IAVF_AQ_RC_ENOENT:
5462306a36Sopenharmony_ci		return "IAVF_AQ_RC_ENOENT";
5562306a36Sopenharmony_ci	case IAVF_AQ_RC_ESRCH:
5662306a36Sopenharmony_ci		return "IAVF_AQ_RC_ESRCH";
5762306a36Sopenharmony_ci	case IAVF_AQ_RC_EINTR:
5862306a36Sopenharmony_ci		return "IAVF_AQ_RC_EINTR";
5962306a36Sopenharmony_ci	case IAVF_AQ_RC_EIO:
6062306a36Sopenharmony_ci		return "IAVF_AQ_RC_EIO";
6162306a36Sopenharmony_ci	case IAVF_AQ_RC_ENXIO:
6262306a36Sopenharmony_ci		return "IAVF_AQ_RC_ENXIO";
6362306a36Sopenharmony_ci	case IAVF_AQ_RC_E2BIG:
6462306a36Sopenharmony_ci		return "IAVF_AQ_RC_E2BIG";
6562306a36Sopenharmony_ci	case IAVF_AQ_RC_EAGAIN:
6662306a36Sopenharmony_ci		return "IAVF_AQ_RC_EAGAIN";
6762306a36Sopenharmony_ci	case IAVF_AQ_RC_ENOMEM:
6862306a36Sopenharmony_ci		return "IAVF_AQ_RC_ENOMEM";
6962306a36Sopenharmony_ci	case IAVF_AQ_RC_EACCES:
7062306a36Sopenharmony_ci		return "IAVF_AQ_RC_EACCES";
7162306a36Sopenharmony_ci	case IAVF_AQ_RC_EFAULT:
7262306a36Sopenharmony_ci		return "IAVF_AQ_RC_EFAULT";
7362306a36Sopenharmony_ci	case IAVF_AQ_RC_EBUSY:
7462306a36Sopenharmony_ci		return "IAVF_AQ_RC_EBUSY";
7562306a36Sopenharmony_ci	case IAVF_AQ_RC_EEXIST:
7662306a36Sopenharmony_ci		return "IAVF_AQ_RC_EEXIST";
7762306a36Sopenharmony_ci	case IAVF_AQ_RC_EINVAL:
7862306a36Sopenharmony_ci		return "IAVF_AQ_RC_EINVAL";
7962306a36Sopenharmony_ci	case IAVF_AQ_RC_ENOTTY:
8062306a36Sopenharmony_ci		return "IAVF_AQ_RC_ENOTTY";
8162306a36Sopenharmony_ci	case IAVF_AQ_RC_ENOSPC:
8262306a36Sopenharmony_ci		return "IAVF_AQ_RC_ENOSPC";
8362306a36Sopenharmony_ci	case IAVF_AQ_RC_ENOSYS:
8462306a36Sopenharmony_ci		return "IAVF_AQ_RC_ENOSYS";
8562306a36Sopenharmony_ci	case IAVF_AQ_RC_ERANGE:
8662306a36Sopenharmony_ci		return "IAVF_AQ_RC_ERANGE";
8762306a36Sopenharmony_ci	case IAVF_AQ_RC_EFLUSHED:
8862306a36Sopenharmony_ci		return "IAVF_AQ_RC_EFLUSHED";
8962306a36Sopenharmony_ci	case IAVF_AQ_RC_BAD_ADDR:
9062306a36Sopenharmony_ci		return "IAVF_AQ_RC_BAD_ADDR";
9162306a36Sopenharmony_ci	case IAVF_AQ_RC_EMODE:
9262306a36Sopenharmony_ci		return "IAVF_AQ_RC_EMODE";
9362306a36Sopenharmony_ci	case IAVF_AQ_RC_EFBIG:
9462306a36Sopenharmony_ci		return "IAVF_AQ_RC_EFBIG";
9562306a36Sopenharmony_ci	}
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci	snprintf(hw->err_str, sizeof(hw->err_str), "%d", aq_err);
9862306a36Sopenharmony_ci	return hw->err_str;
9962306a36Sopenharmony_ci}
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ci/**
10262306a36Sopenharmony_ci * iavf_stat_str - convert status err code to a string
10362306a36Sopenharmony_ci * @hw: pointer to the HW structure
10462306a36Sopenharmony_ci * @stat_err: the status error code to convert
10562306a36Sopenharmony_ci **/
10662306a36Sopenharmony_ciconst char *iavf_stat_str(struct iavf_hw *hw, enum iavf_status stat_err)
10762306a36Sopenharmony_ci{
10862306a36Sopenharmony_ci	switch (stat_err) {
10962306a36Sopenharmony_ci	case 0:
11062306a36Sopenharmony_ci		return "OK";
11162306a36Sopenharmony_ci	case IAVF_ERR_NVM:
11262306a36Sopenharmony_ci		return "IAVF_ERR_NVM";
11362306a36Sopenharmony_ci	case IAVF_ERR_NVM_CHECKSUM:
11462306a36Sopenharmony_ci		return "IAVF_ERR_NVM_CHECKSUM";
11562306a36Sopenharmony_ci	case IAVF_ERR_PHY:
11662306a36Sopenharmony_ci		return "IAVF_ERR_PHY";
11762306a36Sopenharmony_ci	case IAVF_ERR_CONFIG:
11862306a36Sopenharmony_ci		return "IAVF_ERR_CONFIG";
11962306a36Sopenharmony_ci	case IAVF_ERR_PARAM:
12062306a36Sopenharmony_ci		return "IAVF_ERR_PARAM";
12162306a36Sopenharmony_ci	case IAVF_ERR_MAC_TYPE:
12262306a36Sopenharmony_ci		return "IAVF_ERR_MAC_TYPE";
12362306a36Sopenharmony_ci	case IAVF_ERR_UNKNOWN_PHY:
12462306a36Sopenharmony_ci		return "IAVF_ERR_UNKNOWN_PHY";
12562306a36Sopenharmony_ci	case IAVF_ERR_LINK_SETUP:
12662306a36Sopenharmony_ci		return "IAVF_ERR_LINK_SETUP";
12762306a36Sopenharmony_ci	case IAVF_ERR_ADAPTER_STOPPED:
12862306a36Sopenharmony_ci		return "IAVF_ERR_ADAPTER_STOPPED";
12962306a36Sopenharmony_ci	case IAVF_ERR_INVALID_MAC_ADDR:
13062306a36Sopenharmony_ci		return "IAVF_ERR_INVALID_MAC_ADDR";
13162306a36Sopenharmony_ci	case IAVF_ERR_DEVICE_NOT_SUPPORTED:
13262306a36Sopenharmony_ci		return "IAVF_ERR_DEVICE_NOT_SUPPORTED";
13362306a36Sopenharmony_ci	case IAVF_ERR_PRIMARY_REQUESTS_PENDING:
13462306a36Sopenharmony_ci		return "IAVF_ERR_PRIMARY_REQUESTS_PENDING";
13562306a36Sopenharmony_ci	case IAVF_ERR_INVALID_LINK_SETTINGS:
13662306a36Sopenharmony_ci		return "IAVF_ERR_INVALID_LINK_SETTINGS";
13762306a36Sopenharmony_ci	case IAVF_ERR_AUTONEG_NOT_COMPLETE:
13862306a36Sopenharmony_ci		return "IAVF_ERR_AUTONEG_NOT_COMPLETE";
13962306a36Sopenharmony_ci	case IAVF_ERR_RESET_FAILED:
14062306a36Sopenharmony_ci		return "IAVF_ERR_RESET_FAILED";
14162306a36Sopenharmony_ci	case IAVF_ERR_SWFW_SYNC:
14262306a36Sopenharmony_ci		return "IAVF_ERR_SWFW_SYNC";
14362306a36Sopenharmony_ci	case IAVF_ERR_NO_AVAILABLE_VSI:
14462306a36Sopenharmony_ci		return "IAVF_ERR_NO_AVAILABLE_VSI";
14562306a36Sopenharmony_ci	case IAVF_ERR_NO_MEMORY:
14662306a36Sopenharmony_ci		return "IAVF_ERR_NO_MEMORY";
14762306a36Sopenharmony_ci	case IAVF_ERR_BAD_PTR:
14862306a36Sopenharmony_ci		return "IAVF_ERR_BAD_PTR";
14962306a36Sopenharmony_ci	case IAVF_ERR_RING_FULL:
15062306a36Sopenharmony_ci		return "IAVF_ERR_RING_FULL";
15162306a36Sopenharmony_ci	case IAVF_ERR_INVALID_PD_ID:
15262306a36Sopenharmony_ci		return "IAVF_ERR_INVALID_PD_ID";
15362306a36Sopenharmony_ci	case IAVF_ERR_INVALID_QP_ID:
15462306a36Sopenharmony_ci		return "IAVF_ERR_INVALID_QP_ID";
15562306a36Sopenharmony_ci	case IAVF_ERR_INVALID_CQ_ID:
15662306a36Sopenharmony_ci		return "IAVF_ERR_INVALID_CQ_ID";
15762306a36Sopenharmony_ci	case IAVF_ERR_INVALID_CEQ_ID:
15862306a36Sopenharmony_ci		return "IAVF_ERR_INVALID_CEQ_ID";
15962306a36Sopenharmony_ci	case IAVF_ERR_INVALID_AEQ_ID:
16062306a36Sopenharmony_ci		return "IAVF_ERR_INVALID_AEQ_ID";
16162306a36Sopenharmony_ci	case IAVF_ERR_INVALID_SIZE:
16262306a36Sopenharmony_ci		return "IAVF_ERR_INVALID_SIZE";
16362306a36Sopenharmony_ci	case IAVF_ERR_INVALID_ARP_INDEX:
16462306a36Sopenharmony_ci		return "IAVF_ERR_INVALID_ARP_INDEX";
16562306a36Sopenharmony_ci	case IAVF_ERR_INVALID_FPM_FUNC_ID:
16662306a36Sopenharmony_ci		return "IAVF_ERR_INVALID_FPM_FUNC_ID";
16762306a36Sopenharmony_ci	case IAVF_ERR_QP_INVALID_MSG_SIZE:
16862306a36Sopenharmony_ci		return "IAVF_ERR_QP_INVALID_MSG_SIZE";
16962306a36Sopenharmony_ci	case IAVF_ERR_QP_TOOMANY_WRS_POSTED:
17062306a36Sopenharmony_ci		return "IAVF_ERR_QP_TOOMANY_WRS_POSTED";
17162306a36Sopenharmony_ci	case IAVF_ERR_INVALID_FRAG_COUNT:
17262306a36Sopenharmony_ci		return "IAVF_ERR_INVALID_FRAG_COUNT";
17362306a36Sopenharmony_ci	case IAVF_ERR_QUEUE_EMPTY:
17462306a36Sopenharmony_ci		return "IAVF_ERR_QUEUE_EMPTY";
17562306a36Sopenharmony_ci	case IAVF_ERR_INVALID_ALIGNMENT:
17662306a36Sopenharmony_ci		return "IAVF_ERR_INVALID_ALIGNMENT";
17762306a36Sopenharmony_ci	case IAVF_ERR_FLUSHED_QUEUE:
17862306a36Sopenharmony_ci		return "IAVF_ERR_FLUSHED_QUEUE";
17962306a36Sopenharmony_ci	case IAVF_ERR_INVALID_PUSH_PAGE_INDEX:
18062306a36Sopenharmony_ci		return "IAVF_ERR_INVALID_PUSH_PAGE_INDEX";
18162306a36Sopenharmony_ci	case IAVF_ERR_INVALID_IMM_DATA_SIZE:
18262306a36Sopenharmony_ci		return "IAVF_ERR_INVALID_IMM_DATA_SIZE";
18362306a36Sopenharmony_ci	case IAVF_ERR_TIMEOUT:
18462306a36Sopenharmony_ci		return "IAVF_ERR_TIMEOUT";
18562306a36Sopenharmony_ci	case IAVF_ERR_OPCODE_MISMATCH:
18662306a36Sopenharmony_ci		return "IAVF_ERR_OPCODE_MISMATCH";
18762306a36Sopenharmony_ci	case IAVF_ERR_CQP_COMPL_ERROR:
18862306a36Sopenharmony_ci		return "IAVF_ERR_CQP_COMPL_ERROR";
18962306a36Sopenharmony_ci	case IAVF_ERR_INVALID_VF_ID:
19062306a36Sopenharmony_ci		return "IAVF_ERR_INVALID_VF_ID";
19162306a36Sopenharmony_ci	case IAVF_ERR_INVALID_HMCFN_ID:
19262306a36Sopenharmony_ci		return "IAVF_ERR_INVALID_HMCFN_ID";
19362306a36Sopenharmony_ci	case IAVF_ERR_BACKING_PAGE_ERROR:
19462306a36Sopenharmony_ci		return "IAVF_ERR_BACKING_PAGE_ERROR";
19562306a36Sopenharmony_ci	case IAVF_ERR_NO_PBLCHUNKS_AVAILABLE:
19662306a36Sopenharmony_ci		return "IAVF_ERR_NO_PBLCHUNKS_AVAILABLE";
19762306a36Sopenharmony_ci	case IAVF_ERR_INVALID_PBLE_INDEX:
19862306a36Sopenharmony_ci		return "IAVF_ERR_INVALID_PBLE_INDEX";
19962306a36Sopenharmony_ci	case IAVF_ERR_INVALID_SD_INDEX:
20062306a36Sopenharmony_ci		return "IAVF_ERR_INVALID_SD_INDEX";
20162306a36Sopenharmony_ci	case IAVF_ERR_INVALID_PAGE_DESC_INDEX:
20262306a36Sopenharmony_ci		return "IAVF_ERR_INVALID_PAGE_DESC_INDEX";
20362306a36Sopenharmony_ci	case IAVF_ERR_INVALID_SD_TYPE:
20462306a36Sopenharmony_ci		return "IAVF_ERR_INVALID_SD_TYPE";
20562306a36Sopenharmony_ci	case IAVF_ERR_MEMCPY_FAILED:
20662306a36Sopenharmony_ci		return "IAVF_ERR_MEMCPY_FAILED";
20762306a36Sopenharmony_ci	case IAVF_ERR_INVALID_HMC_OBJ_INDEX:
20862306a36Sopenharmony_ci		return "IAVF_ERR_INVALID_HMC_OBJ_INDEX";
20962306a36Sopenharmony_ci	case IAVF_ERR_INVALID_HMC_OBJ_COUNT:
21062306a36Sopenharmony_ci		return "IAVF_ERR_INVALID_HMC_OBJ_COUNT";
21162306a36Sopenharmony_ci	case IAVF_ERR_INVALID_SRQ_ARM_LIMIT:
21262306a36Sopenharmony_ci		return "IAVF_ERR_INVALID_SRQ_ARM_LIMIT";
21362306a36Sopenharmony_ci	case IAVF_ERR_SRQ_ENABLED:
21462306a36Sopenharmony_ci		return "IAVF_ERR_SRQ_ENABLED";
21562306a36Sopenharmony_ci	case IAVF_ERR_ADMIN_QUEUE_ERROR:
21662306a36Sopenharmony_ci		return "IAVF_ERR_ADMIN_QUEUE_ERROR";
21762306a36Sopenharmony_ci	case IAVF_ERR_ADMIN_QUEUE_TIMEOUT:
21862306a36Sopenharmony_ci		return "IAVF_ERR_ADMIN_QUEUE_TIMEOUT";
21962306a36Sopenharmony_ci	case IAVF_ERR_BUF_TOO_SHORT:
22062306a36Sopenharmony_ci		return "IAVF_ERR_BUF_TOO_SHORT";
22162306a36Sopenharmony_ci	case IAVF_ERR_ADMIN_QUEUE_FULL:
22262306a36Sopenharmony_ci		return "IAVF_ERR_ADMIN_QUEUE_FULL";
22362306a36Sopenharmony_ci	case IAVF_ERR_ADMIN_QUEUE_NO_WORK:
22462306a36Sopenharmony_ci		return "IAVF_ERR_ADMIN_QUEUE_NO_WORK";
22562306a36Sopenharmony_ci	case IAVF_ERR_BAD_RDMA_CQE:
22662306a36Sopenharmony_ci		return "IAVF_ERR_BAD_RDMA_CQE";
22762306a36Sopenharmony_ci	case IAVF_ERR_NVM_BLANK_MODE:
22862306a36Sopenharmony_ci		return "IAVF_ERR_NVM_BLANK_MODE";
22962306a36Sopenharmony_ci	case IAVF_ERR_NOT_IMPLEMENTED:
23062306a36Sopenharmony_ci		return "IAVF_ERR_NOT_IMPLEMENTED";
23162306a36Sopenharmony_ci	case IAVF_ERR_PE_DOORBELL_NOT_ENABLED:
23262306a36Sopenharmony_ci		return "IAVF_ERR_PE_DOORBELL_NOT_ENABLED";
23362306a36Sopenharmony_ci	case IAVF_ERR_DIAG_TEST_FAILED:
23462306a36Sopenharmony_ci		return "IAVF_ERR_DIAG_TEST_FAILED";
23562306a36Sopenharmony_ci	case IAVF_ERR_NOT_READY:
23662306a36Sopenharmony_ci		return "IAVF_ERR_NOT_READY";
23762306a36Sopenharmony_ci	case IAVF_NOT_SUPPORTED:
23862306a36Sopenharmony_ci		return "IAVF_NOT_SUPPORTED";
23962306a36Sopenharmony_ci	case IAVF_ERR_FIRMWARE_API_VERSION:
24062306a36Sopenharmony_ci		return "IAVF_ERR_FIRMWARE_API_VERSION";
24162306a36Sopenharmony_ci	case IAVF_ERR_ADMIN_QUEUE_CRITICAL_ERROR:
24262306a36Sopenharmony_ci		return "IAVF_ERR_ADMIN_QUEUE_CRITICAL_ERROR";
24362306a36Sopenharmony_ci	}
24462306a36Sopenharmony_ci
24562306a36Sopenharmony_ci	snprintf(hw->err_str, sizeof(hw->err_str), "%d", stat_err);
24662306a36Sopenharmony_ci	return hw->err_str;
24762306a36Sopenharmony_ci}
24862306a36Sopenharmony_ci
24962306a36Sopenharmony_ci/**
25062306a36Sopenharmony_ci * iavf_debug_aq
25162306a36Sopenharmony_ci * @hw: debug mask related to admin queue
25262306a36Sopenharmony_ci * @mask: debug mask
25362306a36Sopenharmony_ci * @desc: pointer to admin queue descriptor
25462306a36Sopenharmony_ci * @buffer: pointer to command buffer
25562306a36Sopenharmony_ci * @buf_len: max length of buffer
25662306a36Sopenharmony_ci *
25762306a36Sopenharmony_ci * Dumps debug log about adminq command with descriptor contents.
25862306a36Sopenharmony_ci **/
25962306a36Sopenharmony_civoid iavf_debug_aq(struct iavf_hw *hw, enum iavf_debug_mask mask, void *desc,
26062306a36Sopenharmony_ci		   void *buffer, u16 buf_len)
26162306a36Sopenharmony_ci{
26262306a36Sopenharmony_ci	struct iavf_aq_desc *aq_desc = (struct iavf_aq_desc *)desc;
26362306a36Sopenharmony_ci	u8 *buf = (u8 *)buffer;
26462306a36Sopenharmony_ci
26562306a36Sopenharmony_ci	if ((!(mask & hw->debug_mask)) || !desc)
26662306a36Sopenharmony_ci		return;
26762306a36Sopenharmony_ci
26862306a36Sopenharmony_ci	iavf_debug(hw, mask,
26962306a36Sopenharmony_ci		   "AQ CMD: opcode 0x%04X, flags 0x%04X, datalen 0x%04X, retval 0x%04X\n",
27062306a36Sopenharmony_ci		   le16_to_cpu(aq_desc->opcode),
27162306a36Sopenharmony_ci		   le16_to_cpu(aq_desc->flags),
27262306a36Sopenharmony_ci		   le16_to_cpu(aq_desc->datalen),
27362306a36Sopenharmony_ci		   le16_to_cpu(aq_desc->retval));
27462306a36Sopenharmony_ci	iavf_debug(hw, mask, "\tcookie (h,l) 0x%08X 0x%08X\n",
27562306a36Sopenharmony_ci		   le32_to_cpu(aq_desc->cookie_high),
27662306a36Sopenharmony_ci		   le32_to_cpu(aq_desc->cookie_low));
27762306a36Sopenharmony_ci	iavf_debug(hw, mask, "\tparam (0,1)  0x%08X 0x%08X\n",
27862306a36Sopenharmony_ci		   le32_to_cpu(aq_desc->params.internal.param0),
27962306a36Sopenharmony_ci		   le32_to_cpu(aq_desc->params.internal.param1));
28062306a36Sopenharmony_ci	iavf_debug(hw, mask, "\taddr (h,l)   0x%08X 0x%08X\n",
28162306a36Sopenharmony_ci		   le32_to_cpu(aq_desc->params.external.addr_high),
28262306a36Sopenharmony_ci		   le32_to_cpu(aq_desc->params.external.addr_low));
28362306a36Sopenharmony_ci
28462306a36Sopenharmony_ci	if (buffer && aq_desc->datalen) {
28562306a36Sopenharmony_ci		u16 len = le16_to_cpu(aq_desc->datalen);
28662306a36Sopenharmony_ci
28762306a36Sopenharmony_ci		iavf_debug(hw, mask, "AQ CMD Buffer:\n");
28862306a36Sopenharmony_ci		if (buf_len < len)
28962306a36Sopenharmony_ci			len = buf_len;
29062306a36Sopenharmony_ci		/* write the full 16-byte chunks */
29162306a36Sopenharmony_ci		if (hw->debug_mask & mask) {
29262306a36Sopenharmony_ci			char prefix[27];
29362306a36Sopenharmony_ci
29462306a36Sopenharmony_ci			snprintf(prefix, sizeof(prefix),
29562306a36Sopenharmony_ci				 "iavf %02x:%02x.%x: \t0x",
29662306a36Sopenharmony_ci				 hw->bus.bus_id,
29762306a36Sopenharmony_ci				 hw->bus.device,
29862306a36Sopenharmony_ci				 hw->bus.func);
29962306a36Sopenharmony_ci
30062306a36Sopenharmony_ci			print_hex_dump(KERN_INFO, prefix, DUMP_PREFIX_OFFSET,
30162306a36Sopenharmony_ci				       16, 1, buf, len, false);
30262306a36Sopenharmony_ci		}
30362306a36Sopenharmony_ci	}
30462306a36Sopenharmony_ci}
30562306a36Sopenharmony_ci
30662306a36Sopenharmony_ci/**
30762306a36Sopenharmony_ci * iavf_check_asq_alive
30862306a36Sopenharmony_ci * @hw: pointer to the hw struct
30962306a36Sopenharmony_ci *
31062306a36Sopenharmony_ci * Returns true if Queue is enabled else false.
31162306a36Sopenharmony_ci **/
31262306a36Sopenharmony_cibool iavf_check_asq_alive(struct iavf_hw *hw)
31362306a36Sopenharmony_ci{
31462306a36Sopenharmony_ci	if (hw->aq.asq.len)
31562306a36Sopenharmony_ci		return !!(rd32(hw, hw->aq.asq.len) &
31662306a36Sopenharmony_ci			  IAVF_VF_ATQLEN1_ATQENABLE_MASK);
31762306a36Sopenharmony_ci	else
31862306a36Sopenharmony_ci		return false;
31962306a36Sopenharmony_ci}
32062306a36Sopenharmony_ci
32162306a36Sopenharmony_ci/**
32262306a36Sopenharmony_ci * iavf_aq_queue_shutdown
32362306a36Sopenharmony_ci * @hw: pointer to the hw struct
32462306a36Sopenharmony_ci * @unloading: is the driver unloading itself
32562306a36Sopenharmony_ci *
32662306a36Sopenharmony_ci * Tell the Firmware that we're shutting down the AdminQ and whether
32762306a36Sopenharmony_ci * or not the driver is unloading as well.
32862306a36Sopenharmony_ci **/
32962306a36Sopenharmony_cienum iavf_status iavf_aq_queue_shutdown(struct iavf_hw *hw, bool unloading)
33062306a36Sopenharmony_ci{
33162306a36Sopenharmony_ci	struct iavf_aq_desc desc;
33262306a36Sopenharmony_ci	struct iavf_aqc_queue_shutdown *cmd =
33362306a36Sopenharmony_ci		(struct iavf_aqc_queue_shutdown *)&desc.params.raw;
33462306a36Sopenharmony_ci	enum iavf_status status;
33562306a36Sopenharmony_ci
33662306a36Sopenharmony_ci	iavf_fill_default_direct_cmd_desc(&desc, iavf_aqc_opc_queue_shutdown);
33762306a36Sopenharmony_ci
33862306a36Sopenharmony_ci	if (unloading)
33962306a36Sopenharmony_ci		cmd->driver_unloading = cpu_to_le32(IAVF_AQ_DRIVER_UNLOADING);
34062306a36Sopenharmony_ci	status = iavf_asq_send_command(hw, &desc, NULL, 0, NULL);
34162306a36Sopenharmony_ci
34262306a36Sopenharmony_ci	return status;
34362306a36Sopenharmony_ci}
34462306a36Sopenharmony_ci
34562306a36Sopenharmony_ci/**
34662306a36Sopenharmony_ci * iavf_aq_get_set_rss_lut
34762306a36Sopenharmony_ci * @hw: pointer to the hardware structure
34862306a36Sopenharmony_ci * @vsi_id: vsi fw index
34962306a36Sopenharmony_ci * @pf_lut: for PF table set true, for VSI table set false
35062306a36Sopenharmony_ci * @lut: pointer to the lut buffer provided by the caller
35162306a36Sopenharmony_ci * @lut_size: size of the lut buffer
35262306a36Sopenharmony_ci * @set: set true to set the table, false to get the table
35362306a36Sopenharmony_ci *
35462306a36Sopenharmony_ci * Internal function to get or set RSS look up table
35562306a36Sopenharmony_ci **/
35662306a36Sopenharmony_cistatic enum iavf_status iavf_aq_get_set_rss_lut(struct iavf_hw *hw,
35762306a36Sopenharmony_ci						u16 vsi_id, bool pf_lut,
35862306a36Sopenharmony_ci						u8 *lut, u16 lut_size,
35962306a36Sopenharmony_ci						bool set)
36062306a36Sopenharmony_ci{
36162306a36Sopenharmony_ci	enum iavf_status status;
36262306a36Sopenharmony_ci	struct iavf_aq_desc desc;
36362306a36Sopenharmony_ci	struct iavf_aqc_get_set_rss_lut *cmd_resp =
36462306a36Sopenharmony_ci		   (struct iavf_aqc_get_set_rss_lut *)&desc.params.raw;
36562306a36Sopenharmony_ci
36662306a36Sopenharmony_ci	if (set)
36762306a36Sopenharmony_ci		iavf_fill_default_direct_cmd_desc(&desc,
36862306a36Sopenharmony_ci						  iavf_aqc_opc_set_rss_lut);
36962306a36Sopenharmony_ci	else
37062306a36Sopenharmony_ci		iavf_fill_default_direct_cmd_desc(&desc,
37162306a36Sopenharmony_ci						  iavf_aqc_opc_get_rss_lut);
37262306a36Sopenharmony_ci
37362306a36Sopenharmony_ci	/* Indirect command */
37462306a36Sopenharmony_ci	desc.flags |= cpu_to_le16((u16)IAVF_AQ_FLAG_BUF);
37562306a36Sopenharmony_ci	desc.flags |= cpu_to_le16((u16)IAVF_AQ_FLAG_RD);
37662306a36Sopenharmony_ci
37762306a36Sopenharmony_ci	cmd_resp->vsi_id =
37862306a36Sopenharmony_ci			cpu_to_le16((u16)((vsi_id <<
37962306a36Sopenharmony_ci					  IAVF_AQC_SET_RSS_LUT_VSI_ID_SHIFT) &
38062306a36Sopenharmony_ci					  IAVF_AQC_SET_RSS_LUT_VSI_ID_MASK));
38162306a36Sopenharmony_ci	cmd_resp->vsi_id |= cpu_to_le16((u16)IAVF_AQC_SET_RSS_LUT_VSI_VALID);
38262306a36Sopenharmony_ci
38362306a36Sopenharmony_ci	if (pf_lut)
38462306a36Sopenharmony_ci		cmd_resp->flags |= cpu_to_le16((u16)
38562306a36Sopenharmony_ci					((IAVF_AQC_SET_RSS_LUT_TABLE_TYPE_PF <<
38662306a36Sopenharmony_ci					IAVF_AQC_SET_RSS_LUT_TABLE_TYPE_SHIFT) &
38762306a36Sopenharmony_ci					IAVF_AQC_SET_RSS_LUT_TABLE_TYPE_MASK));
38862306a36Sopenharmony_ci	else
38962306a36Sopenharmony_ci		cmd_resp->flags |= cpu_to_le16((u16)
39062306a36Sopenharmony_ci					((IAVF_AQC_SET_RSS_LUT_TABLE_TYPE_VSI <<
39162306a36Sopenharmony_ci					IAVF_AQC_SET_RSS_LUT_TABLE_TYPE_SHIFT) &
39262306a36Sopenharmony_ci					IAVF_AQC_SET_RSS_LUT_TABLE_TYPE_MASK));
39362306a36Sopenharmony_ci
39462306a36Sopenharmony_ci	status = iavf_asq_send_command(hw, &desc, lut, lut_size, NULL);
39562306a36Sopenharmony_ci
39662306a36Sopenharmony_ci	return status;
39762306a36Sopenharmony_ci}
39862306a36Sopenharmony_ci
39962306a36Sopenharmony_ci/**
40062306a36Sopenharmony_ci * iavf_aq_set_rss_lut
40162306a36Sopenharmony_ci * @hw: pointer to the hardware structure
40262306a36Sopenharmony_ci * @vsi_id: vsi fw index
40362306a36Sopenharmony_ci * @pf_lut: for PF table set true, for VSI table set false
40462306a36Sopenharmony_ci * @lut: pointer to the lut buffer provided by the caller
40562306a36Sopenharmony_ci * @lut_size: size of the lut buffer
40662306a36Sopenharmony_ci *
40762306a36Sopenharmony_ci * set the RSS lookup table, PF or VSI type
40862306a36Sopenharmony_ci **/
40962306a36Sopenharmony_cienum iavf_status iavf_aq_set_rss_lut(struct iavf_hw *hw, u16 vsi_id,
41062306a36Sopenharmony_ci				     bool pf_lut, u8 *lut, u16 lut_size)
41162306a36Sopenharmony_ci{
41262306a36Sopenharmony_ci	return iavf_aq_get_set_rss_lut(hw, vsi_id, pf_lut, lut, lut_size, true);
41362306a36Sopenharmony_ci}
41462306a36Sopenharmony_ci
41562306a36Sopenharmony_ci/**
41662306a36Sopenharmony_ci * iavf_aq_get_set_rss_key
41762306a36Sopenharmony_ci * @hw: pointer to the hw struct
41862306a36Sopenharmony_ci * @vsi_id: vsi fw index
41962306a36Sopenharmony_ci * @key: pointer to key info struct
42062306a36Sopenharmony_ci * @set: set true to set the key, false to get the key
42162306a36Sopenharmony_ci *
42262306a36Sopenharmony_ci * get the RSS key per VSI
42362306a36Sopenharmony_ci **/
42462306a36Sopenharmony_cistatic enum
42562306a36Sopenharmony_ciiavf_status iavf_aq_get_set_rss_key(struct iavf_hw *hw, u16 vsi_id,
42662306a36Sopenharmony_ci				    struct iavf_aqc_get_set_rss_key_data *key,
42762306a36Sopenharmony_ci				    bool set)
42862306a36Sopenharmony_ci{
42962306a36Sopenharmony_ci	enum iavf_status status;
43062306a36Sopenharmony_ci	struct iavf_aq_desc desc;
43162306a36Sopenharmony_ci	struct iavf_aqc_get_set_rss_key *cmd_resp =
43262306a36Sopenharmony_ci			(struct iavf_aqc_get_set_rss_key *)&desc.params.raw;
43362306a36Sopenharmony_ci	u16 key_size = sizeof(struct iavf_aqc_get_set_rss_key_data);
43462306a36Sopenharmony_ci
43562306a36Sopenharmony_ci	if (set)
43662306a36Sopenharmony_ci		iavf_fill_default_direct_cmd_desc(&desc,
43762306a36Sopenharmony_ci						  iavf_aqc_opc_set_rss_key);
43862306a36Sopenharmony_ci	else
43962306a36Sopenharmony_ci		iavf_fill_default_direct_cmd_desc(&desc,
44062306a36Sopenharmony_ci						  iavf_aqc_opc_get_rss_key);
44162306a36Sopenharmony_ci
44262306a36Sopenharmony_ci	/* Indirect command */
44362306a36Sopenharmony_ci	desc.flags |= cpu_to_le16((u16)IAVF_AQ_FLAG_BUF);
44462306a36Sopenharmony_ci	desc.flags |= cpu_to_le16((u16)IAVF_AQ_FLAG_RD);
44562306a36Sopenharmony_ci
44662306a36Sopenharmony_ci	cmd_resp->vsi_id =
44762306a36Sopenharmony_ci			cpu_to_le16((u16)((vsi_id <<
44862306a36Sopenharmony_ci					  IAVF_AQC_SET_RSS_KEY_VSI_ID_SHIFT) &
44962306a36Sopenharmony_ci					  IAVF_AQC_SET_RSS_KEY_VSI_ID_MASK));
45062306a36Sopenharmony_ci	cmd_resp->vsi_id |= cpu_to_le16((u16)IAVF_AQC_SET_RSS_KEY_VSI_VALID);
45162306a36Sopenharmony_ci
45262306a36Sopenharmony_ci	status = iavf_asq_send_command(hw, &desc, key, key_size, NULL);
45362306a36Sopenharmony_ci
45462306a36Sopenharmony_ci	return status;
45562306a36Sopenharmony_ci}
45662306a36Sopenharmony_ci
45762306a36Sopenharmony_ci/**
45862306a36Sopenharmony_ci * iavf_aq_set_rss_key
45962306a36Sopenharmony_ci * @hw: pointer to the hw struct
46062306a36Sopenharmony_ci * @vsi_id: vsi fw index
46162306a36Sopenharmony_ci * @key: pointer to key info struct
46262306a36Sopenharmony_ci *
46362306a36Sopenharmony_ci * set the RSS key per VSI
46462306a36Sopenharmony_ci **/
46562306a36Sopenharmony_cienum iavf_status iavf_aq_set_rss_key(struct iavf_hw *hw, u16 vsi_id,
46662306a36Sopenharmony_ci				     struct iavf_aqc_get_set_rss_key_data *key)
46762306a36Sopenharmony_ci{
46862306a36Sopenharmony_ci	return iavf_aq_get_set_rss_key(hw, vsi_id, key, true);
46962306a36Sopenharmony_ci}
47062306a36Sopenharmony_ci
47162306a36Sopenharmony_ci/* The iavf_ptype_lookup table is used to convert from the 8-bit ptype in the
47262306a36Sopenharmony_ci * hardware to a bit-field that can be used by SW to more easily determine the
47362306a36Sopenharmony_ci * packet type.
47462306a36Sopenharmony_ci *
47562306a36Sopenharmony_ci * Macros are used to shorten the table lines and make this table human
47662306a36Sopenharmony_ci * readable.
47762306a36Sopenharmony_ci *
47862306a36Sopenharmony_ci * We store the PTYPE in the top byte of the bit field - this is just so that
47962306a36Sopenharmony_ci * we can check that the table doesn't have a row missing, as the index into
48062306a36Sopenharmony_ci * the table should be the PTYPE.
48162306a36Sopenharmony_ci *
48262306a36Sopenharmony_ci * Typical work flow:
48362306a36Sopenharmony_ci *
48462306a36Sopenharmony_ci * IF NOT iavf_ptype_lookup[ptype].known
48562306a36Sopenharmony_ci * THEN
48662306a36Sopenharmony_ci *      Packet is unknown
48762306a36Sopenharmony_ci * ELSE IF iavf_ptype_lookup[ptype].outer_ip == IAVF_RX_PTYPE_OUTER_IP
48862306a36Sopenharmony_ci *      Use the rest of the fields to look at the tunnels, inner protocols, etc
48962306a36Sopenharmony_ci * ELSE
49062306a36Sopenharmony_ci *      Use the enum iavf_rx_l2_ptype to decode the packet type
49162306a36Sopenharmony_ci * ENDIF
49262306a36Sopenharmony_ci */
49362306a36Sopenharmony_ci
49462306a36Sopenharmony_ci/* macro to make the table lines short, use explicit indexing with [PTYPE] */
49562306a36Sopenharmony_ci#define IAVF_PTT(PTYPE, OUTER_IP, OUTER_IP_VER, OUTER_FRAG, T, TE, TEF, I, PL)\
49662306a36Sopenharmony_ci	[PTYPE] = { \
49762306a36Sopenharmony_ci		1, \
49862306a36Sopenharmony_ci		IAVF_RX_PTYPE_OUTER_##OUTER_IP, \
49962306a36Sopenharmony_ci		IAVF_RX_PTYPE_OUTER_##OUTER_IP_VER, \
50062306a36Sopenharmony_ci		IAVF_RX_PTYPE_##OUTER_FRAG, \
50162306a36Sopenharmony_ci		IAVF_RX_PTYPE_TUNNEL_##T, \
50262306a36Sopenharmony_ci		IAVF_RX_PTYPE_TUNNEL_END_##TE, \
50362306a36Sopenharmony_ci		IAVF_RX_PTYPE_##TEF, \
50462306a36Sopenharmony_ci		IAVF_RX_PTYPE_INNER_PROT_##I, \
50562306a36Sopenharmony_ci		IAVF_RX_PTYPE_PAYLOAD_LAYER_##PL }
50662306a36Sopenharmony_ci
50762306a36Sopenharmony_ci#define IAVF_PTT_UNUSED_ENTRY(PTYPE) [PTYPE] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 }
50862306a36Sopenharmony_ci
50962306a36Sopenharmony_ci/* shorter macros makes the table fit but are terse */
51062306a36Sopenharmony_ci#define IAVF_RX_PTYPE_NOF		IAVF_RX_PTYPE_NOT_FRAG
51162306a36Sopenharmony_ci#define IAVF_RX_PTYPE_FRG		IAVF_RX_PTYPE_FRAG
51262306a36Sopenharmony_ci#define IAVF_RX_PTYPE_INNER_PROT_TS	IAVF_RX_PTYPE_INNER_PROT_TIMESYNC
51362306a36Sopenharmony_ci
51462306a36Sopenharmony_ci/* Lookup table mapping the 8-bit HW PTYPE to the bit field for decoding */
51562306a36Sopenharmony_cistruct iavf_rx_ptype_decoded iavf_ptype_lookup[BIT(8)] = {
51662306a36Sopenharmony_ci	/* L2 Packet types */
51762306a36Sopenharmony_ci	IAVF_PTT_UNUSED_ENTRY(0),
51862306a36Sopenharmony_ci	IAVF_PTT(1,  L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
51962306a36Sopenharmony_ci	IAVF_PTT(2,  L2, NONE, NOF, NONE, NONE, NOF, TS,   PAY2),
52062306a36Sopenharmony_ci	IAVF_PTT(3,  L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
52162306a36Sopenharmony_ci	IAVF_PTT_UNUSED_ENTRY(4),
52262306a36Sopenharmony_ci	IAVF_PTT_UNUSED_ENTRY(5),
52362306a36Sopenharmony_ci	IAVF_PTT(6,  L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
52462306a36Sopenharmony_ci	IAVF_PTT(7,  L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
52562306a36Sopenharmony_ci	IAVF_PTT_UNUSED_ENTRY(8),
52662306a36Sopenharmony_ci	IAVF_PTT_UNUSED_ENTRY(9),
52762306a36Sopenharmony_ci	IAVF_PTT(10, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
52862306a36Sopenharmony_ci	IAVF_PTT(11, L2, NONE, NOF, NONE, NONE, NOF, NONE, NONE),
52962306a36Sopenharmony_ci	IAVF_PTT(12, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
53062306a36Sopenharmony_ci	IAVF_PTT(13, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
53162306a36Sopenharmony_ci	IAVF_PTT(14, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
53262306a36Sopenharmony_ci	IAVF_PTT(15, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
53362306a36Sopenharmony_ci	IAVF_PTT(16, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
53462306a36Sopenharmony_ci	IAVF_PTT(17, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
53562306a36Sopenharmony_ci	IAVF_PTT(18, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
53662306a36Sopenharmony_ci	IAVF_PTT(19, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
53762306a36Sopenharmony_ci	IAVF_PTT(20, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
53862306a36Sopenharmony_ci	IAVF_PTT(21, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
53962306a36Sopenharmony_ci
54062306a36Sopenharmony_ci	/* Non Tunneled IPv4 */
54162306a36Sopenharmony_ci	IAVF_PTT(22, IP, IPV4, FRG, NONE, NONE, NOF, NONE, PAY3),
54262306a36Sopenharmony_ci	IAVF_PTT(23, IP, IPV4, NOF, NONE, NONE, NOF, NONE, PAY3),
54362306a36Sopenharmony_ci	IAVF_PTT(24, IP, IPV4, NOF, NONE, NONE, NOF, UDP,  PAY4),
54462306a36Sopenharmony_ci	IAVF_PTT_UNUSED_ENTRY(25),
54562306a36Sopenharmony_ci	IAVF_PTT(26, IP, IPV4, NOF, NONE, NONE, NOF, TCP,  PAY4),
54662306a36Sopenharmony_ci	IAVF_PTT(27, IP, IPV4, NOF, NONE, NONE, NOF, SCTP, PAY4),
54762306a36Sopenharmony_ci	IAVF_PTT(28, IP, IPV4, NOF, NONE, NONE, NOF, ICMP, PAY4),
54862306a36Sopenharmony_ci
54962306a36Sopenharmony_ci	/* IPv4 --> IPv4 */
55062306a36Sopenharmony_ci	IAVF_PTT(29, IP, IPV4, NOF, IP_IP, IPV4, FRG, NONE, PAY3),
55162306a36Sopenharmony_ci	IAVF_PTT(30, IP, IPV4, NOF, IP_IP, IPV4, NOF, NONE, PAY3),
55262306a36Sopenharmony_ci	IAVF_PTT(31, IP, IPV4, NOF, IP_IP, IPV4, NOF, UDP,  PAY4),
55362306a36Sopenharmony_ci	IAVF_PTT_UNUSED_ENTRY(32),
55462306a36Sopenharmony_ci	IAVF_PTT(33, IP, IPV4, NOF, IP_IP, IPV4, NOF, TCP,  PAY4),
55562306a36Sopenharmony_ci	IAVF_PTT(34, IP, IPV4, NOF, IP_IP, IPV4, NOF, SCTP, PAY4),
55662306a36Sopenharmony_ci	IAVF_PTT(35, IP, IPV4, NOF, IP_IP, IPV4, NOF, ICMP, PAY4),
55762306a36Sopenharmony_ci
55862306a36Sopenharmony_ci	/* IPv4 --> IPv6 */
55962306a36Sopenharmony_ci	IAVF_PTT(36, IP, IPV4, NOF, IP_IP, IPV6, FRG, NONE, PAY3),
56062306a36Sopenharmony_ci	IAVF_PTT(37, IP, IPV4, NOF, IP_IP, IPV6, NOF, NONE, PAY3),
56162306a36Sopenharmony_ci	IAVF_PTT(38, IP, IPV4, NOF, IP_IP, IPV6, NOF, UDP,  PAY4),
56262306a36Sopenharmony_ci	IAVF_PTT_UNUSED_ENTRY(39),
56362306a36Sopenharmony_ci	IAVF_PTT(40, IP, IPV4, NOF, IP_IP, IPV6, NOF, TCP,  PAY4),
56462306a36Sopenharmony_ci	IAVF_PTT(41, IP, IPV4, NOF, IP_IP, IPV6, NOF, SCTP, PAY4),
56562306a36Sopenharmony_ci	IAVF_PTT(42, IP, IPV4, NOF, IP_IP, IPV6, NOF, ICMP, PAY4),
56662306a36Sopenharmony_ci
56762306a36Sopenharmony_ci	/* IPv4 --> GRE/NAT */
56862306a36Sopenharmony_ci	IAVF_PTT(43, IP, IPV4, NOF, IP_GRENAT, NONE, NOF, NONE, PAY3),
56962306a36Sopenharmony_ci
57062306a36Sopenharmony_ci	/* IPv4 --> GRE/NAT --> IPv4 */
57162306a36Sopenharmony_ci	IAVF_PTT(44, IP, IPV4, NOF, IP_GRENAT, IPV4, FRG, NONE, PAY3),
57262306a36Sopenharmony_ci	IAVF_PTT(45, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, NONE, PAY3),
57362306a36Sopenharmony_ci	IAVF_PTT(46, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, UDP,  PAY4),
57462306a36Sopenharmony_ci	IAVF_PTT_UNUSED_ENTRY(47),
57562306a36Sopenharmony_ci	IAVF_PTT(48, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, TCP,  PAY4),
57662306a36Sopenharmony_ci	IAVF_PTT(49, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, SCTP, PAY4),
57762306a36Sopenharmony_ci	IAVF_PTT(50, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, ICMP, PAY4),
57862306a36Sopenharmony_ci
57962306a36Sopenharmony_ci	/* IPv4 --> GRE/NAT --> IPv6 */
58062306a36Sopenharmony_ci	IAVF_PTT(51, IP, IPV4, NOF, IP_GRENAT, IPV6, FRG, NONE, PAY3),
58162306a36Sopenharmony_ci	IAVF_PTT(52, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, NONE, PAY3),
58262306a36Sopenharmony_ci	IAVF_PTT(53, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, UDP,  PAY4),
58362306a36Sopenharmony_ci	IAVF_PTT_UNUSED_ENTRY(54),
58462306a36Sopenharmony_ci	IAVF_PTT(55, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, TCP,  PAY4),
58562306a36Sopenharmony_ci	IAVF_PTT(56, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, SCTP, PAY4),
58662306a36Sopenharmony_ci	IAVF_PTT(57, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, ICMP, PAY4),
58762306a36Sopenharmony_ci
58862306a36Sopenharmony_ci	/* IPv4 --> GRE/NAT --> MAC */
58962306a36Sopenharmony_ci	IAVF_PTT(58, IP, IPV4, NOF, IP_GRENAT_MAC, NONE, NOF, NONE, PAY3),
59062306a36Sopenharmony_ci
59162306a36Sopenharmony_ci	/* IPv4 --> GRE/NAT --> MAC --> IPv4 */
59262306a36Sopenharmony_ci	IAVF_PTT(59, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, FRG, NONE, PAY3),
59362306a36Sopenharmony_ci	IAVF_PTT(60, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, NONE, PAY3),
59462306a36Sopenharmony_ci	IAVF_PTT(61, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, UDP,  PAY4),
59562306a36Sopenharmony_ci	IAVF_PTT_UNUSED_ENTRY(62),
59662306a36Sopenharmony_ci	IAVF_PTT(63, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, TCP,  PAY4),
59762306a36Sopenharmony_ci	IAVF_PTT(64, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, SCTP, PAY4),
59862306a36Sopenharmony_ci	IAVF_PTT(65, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, ICMP, PAY4),
59962306a36Sopenharmony_ci
60062306a36Sopenharmony_ci	/* IPv4 --> GRE/NAT -> MAC --> IPv6 */
60162306a36Sopenharmony_ci	IAVF_PTT(66, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, FRG, NONE, PAY3),
60262306a36Sopenharmony_ci	IAVF_PTT(67, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, NONE, PAY3),
60362306a36Sopenharmony_ci	IAVF_PTT(68, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, UDP,  PAY4),
60462306a36Sopenharmony_ci	IAVF_PTT_UNUSED_ENTRY(69),
60562306a36Sopenharmony_ci	IAVF_PTT(70, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, TCP,  PAY4),
60662306a36Sopenharmony_ci	IAVF_PTT(71, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, SCTP, PAY4),
60762306a36Sopenharmony_ci	IAVF_PTT(72, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, ICMP, PAY4),
60862306a36Sopenharmony_ci
60962306a36Sopenharmony_ci	/* IPv4 --> GRE/NAT --> MAC/VLAN */
61062306a36Sopenharmony_ci	IAVF_PTT(73, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, NONE, NOF, NONE, PAY3),
61162306a36Sopenharmony_ci
61262306a36Sopenharmony_ci	/* IPv4 ---> GRE/NAT -> MAC/VLAN --> IPv4 */
61362306a36Sopenharmony_ci	IAVF_PTT(74, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, FRG, NONE, PAY3),
61462306a36Sopenharmony_ci	IAVF_PTT(75, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, NONE, PAY3),
61562306a36Sopenharmony_ci	IAVF_PTT(76, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, UDP,  PAY4),
61662306a36Sopenharmony_ci	IAVF_PTT_UNUSED_ENTRY(77),
61762306a36Sopenharmony_ci	IAVF_PTT(78, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, TCP,  PAY4),
61862306a36Sopenharmony_ci	IAVF_PTT(79, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, SCTP, PAY4),
61962306a36Sopenharmony_ci	IAVF_PTT(80, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, ICMP, PAY4),
62062306a36Sopenharmony_ci
62162306a36Sopenharmony_ci	/* IPv4 -> GRE/NAT -> MAC/VLAN --> IPv6 */
62262306a36Sopenharmony_ci	IAVF_PTT(81, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, FRG, NONE, PAY3),
62362306a36Sopenharmony_ci	IAVF_PTT(82, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, NONE, PAY3),
62462306a36Sopenharmony_ci	IAVF_PTT(83, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, UDP,  PAY4),
62562306a36Sopenharmony_ci	IAVF_PTT_UNUSED_ENTRY(84),
62662306a36Sopenharmony_ci	IAVF_PTT(85, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, TCP,  PAY4),
62762306a36Sopenharmony_ci	IAVF_PTT(86, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, SCTP, PAY4),
62862306a36Sopenharmony_ci	IAVF_PTT(87, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, ICMP, PAY4),
62962306a36Sopenharmony_ci
63062306a36Sopenharmony_ci	/* Non Tunneled IPv6 */
63162306a36Sopenharmony_ci	IAVF_PTT(88, IP, IPV6, FRG, NONE, NONE, NOF, NONE, PAY3),
63262306a36Sopenharmony_ci	IAVF_PTT(89, IP, IPV6, NOF, NONE, NONE, NOF, NONE, PAY3),
63362306a36Sopenharmony_ci	IAVF_PTT(90, IP, IPV6, NOF, NONE, NONE, NOF, UDP,  PAY4),
63462306a36Sopenharmony_ci	IAVF_PTT_UNUSED_ENTRY(91),
63562306a36Sopenharmony_ci	IAVF_PTT(92, IP, IPV6, NOF, NONE, NONE, NOF, TCP,  PAY4),
63662306a36Sopenharmony_ci	IAVF_PTT(93, IP, IPV6, NOF, NONE, NONE, NOF, SCTP, PAY4),
63762306a36Sopenharmony_ci	IAVF_PTT(94, IP, IPV6, NOF, NONE, NONE, NOF, ICMP, PAY4),
63862306a36Sopenharmony_ci
63962306a36Sopenharmony_ci	/* IPv6 --> IPv4 */
64062306a36Sopenharmony_ci	IAVF_PTT(95,  IP, IPV6, NOF, IP_IP, IPV4, FRG, NONE, PAY3),
64162306a36Sopenharmony_ci	IAVF_PTT(96,  IP, IPV6, NOF, IP_IP, IPV4, NOF, NONE, PAY3),
64262306a36Sopenharmony_ci	IAVF_PTT(97,  IP, IPV6, NOF, IP_IP, IPV4, NOF, UDP,  PAY4),
64362306a36Sopenharmony_ci	IAVF_PTT_UNUSED_ENTRY(98),
64462306a36Sopenharmony_ci	IAVF_PTT(99,  IP, IPV6, NOF, IP_IP, IPV4, NOF, TCP,  PAY4),
64562306a36Sopenharmony_ci	IAVF_PTT(100, IP, IPV6, NOF, IP_IP, IPV4, NOF, SCTP, PAY4),
64662306a36Sopenharmony_ci	IAVF_PTT(101, IP, IPV6, NOF, IP_IP, IPV4, NOF, ICMP, PAY4),
64762306a36Sopenharmony_ci
64862306a36Sopenharmony_ci	/* IPv6 --> IPv6 */
64962306a36Sopenharmony_ci	IAVF_PTT(102, IP, IPV6, NOF, IP_IP, IPV6, FRG, NONE, PAY3),
65062306a36Sopenharmony_ci	IAVF_PTT(103, IP, IPV6, NOF, IP_IP, IPV6, NOF, NONE, PAY3),
65162306a36Sopenharmony_ci	IAVF_PTT(104, IP, IPV6, NOF, IP_IP, IPV6, NOF, UDP,  PAY4),
65262306a36Sopenharmony_ci	IAVF_PTT_UNUSED_ENTRY(105),
65362306a36Sopenharmony_ci	IAVF_PTT(106, IP, IPV6, NOF, IP_IP, IPV6, NOF, TCP,  PAY4),
65462306a36Sopenharmony_ci	IAVF_PTT(107, IP, IPV6, NOF, IP_IP, IPV6, NOF, SCTP, PAY4),
65562306a36Sopenharmony_ci	IAVF_PTT(108, IP, IPV6, NOF, IP_IP, IPV6, NOF, ICMP, PAY4),
65662306a36Sopenharmony_ci
65762306a36Sopenharmony_ci	/* IPv6 --> GRE/NAT */
65862306a36Sopenharmony_ci	IAVF_PTT(109, IP, IPV6, NOF, IP_GRENAT, NONE, NOF, NONE, PAY3),
65962306a36Sopenharmony_ci
66062306a36Sopenharmony_ci	/* IPv6 --> GRE/NAT -> IPv4 */
66162306a36Sopenharmony_ci	IAVF_PTT(110, IP, IPV6, NOF, IP_GRENAT, IPV4, FRG, NONE, PAY3),
66262306a36Sopenharmony_ci	IAVF_PTT(111, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, NONE, PAY3),
66362306a36Sopenharmony_ci	IAVF_PTT(112, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, UDP,  PAY4),
66462306a36Sopenharmony_ci	IAVF_PTT_UNUSED_ENTRY(113),
66562306a36Sopenharmony_ci	IAVF_PTT(114, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, TCP,  PAY4),
66662306a36Sopenharmony_ci	IAVF_PTT(115, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, SCTP, PAY4),
66762306a36Sopenharmony_ci	IAVF_PTT(116, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, ICMP, PAY4),
66862306a36Sopenharmony_ci
66962306a36Sopenharmony_ci	/* IPv6 --> GRE/NAT -> IPv6 */
67062306a36Sopenharmony_ci	IAVF_PTT(117, IP, IPV6, NOF, IP_GRENAT, IPV6, FRG, NONE, PAY3),
67162306a36Sopenharmony_ci	IAVF_PTT(118, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, NONE, PAY3),
67262306a36Sopenharmony_ci	IAVF_PTT(119, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, UDP,  PAY4),
67362306a36Sopenharmony_ci	IAVF_PTT_UNUSED_ENTRY(120),
67462306a36Sopenharmony_ci	IAVF_PTT(121, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, TCP,  PAY4),
67562306a36Sopenharmony_ci	IAVF_PTT(122, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, SCTP, PAY4),
67662306a36Sopenharmony_ci	IAVF_PTT(123, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, ICMP, PAY4),
67762306a36Sopenharmony_ci
67862306a36Sopenharmony_ci	/* IPv6 --> GRE/NAT -> MAC */
67962306a36Sopenharmony_ci	IAVF_PTT(124, IP, IPV6, NOF, IP_GRENAT_MAC, NONE, NOF, NONE, PAY3),
68062306a36Sopenharmony_ci
68162306a36Sopenharmony_ci	/* IPv6 --> GRE/NAT -> MAC -> IPv4 */
68262306a36Sopenharmony_ci	IAVF_PTT(125, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, FRG, NONE, PAY3),
68362306a36Sopenharmony_ci	IAVF_PTT(126, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, NONE, PAY3),
68462306a36Sopenharmony_ci	IAVF_PTT(127, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, UDP,  PAY4),
68562306a36Sopenharmony_ci	IAVF_PTT_UNUSED_ENTRY(128),
68662306a36Sopenharmony_ci	IAVF_PTT(129, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, TCP,  PAY4),
68762306a36Sopenharmony_ci	IAVF_PTT(130, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, SCTP, PAY4),
68862306a36Sopenharmony_ci	IAVF_PTT(131, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, ICMP, PAY4),
68962306a36Sopenharmony_ci
69062306a36Sopenharmony_ci	/* IPv6 --> GRE/NAT -> MAC -> IPv6 */
69162306a36Sopenharmony_ci	IAVF_PTT(132, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, FRG, NONE, PAY3),
69262306a36Sopenharmony_ci	IAVF_PTT(133, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, NONE, PAY3),
69362306a36Sopenharmony_ci	IAVF_PTT(134, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, UDP,  PAY4),
69462306a36Sopenharmony_ci	IAVF_PTT_UNUSED_ENTRY(135),
69562306a36Sopenharmony_ci	IAVF_PTT(136, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, TCP,  PAY4),
69662306a36Sopenharmony_ci	IAVF_PTT(137, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, SCTP, PAY4),
69762306a36Sopenharmony_ci	IAVF_PTT(138, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, ICMP, PAY4),
69862306a36Sopenharmony_ci
69962306a36Sopenharmony_ci	/* IPv6 --> GRE/NAT -> MAC/VLAN */
70062306a36Sopenharmony_ci	IAVF_PTT(139, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, NONE, NOF, NONE, PAY3),
70162306a36Sopenharmony_ci
70262306a36Sopenharmony_ci	/* IPv6 --> GRE/NAT -> MAC/VLAN --> IPv4 */
70362306a36Sopenharmony_ci	IAVF_PTT(140, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, FRG, NONE, PAY3),
70462306a36Sopenharmony_ci	IAVF_PTT(141, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, NONE, PAY3),
70562306a36Sopenharmony_ci	IAVF_PTT(142, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, UDP,  PAY4),
70662306a36Sopenharmony_ci	IAVF_PTT_UNUSED_ENTRY(143),
70762306a36Sopenharmony_ci	IAVF_PTT(144, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, TCP,  PAY4),
70862306a36Sopenharmony_ci	IAVF_PTT(145, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, SCTP, PAY4),
70962306a36Sopenharmony_ci	IAVF_PTT(146, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, ICMP, PAY4),
71062306a36Sopenharmony_ci
71162306a36Sopenharmony_ci	/* IPv6 --> GRE/NAT -> MAC/VLAN --> IPv6 */
71262306a36Sopenharmony_ci	IAVF_PTT(147, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, FRG, NONE, PAY3),
71362306a36Sopenharmony_ci	IAVF_PTT(148, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, NONE, PAY3),
71462306a36Sopenharmony_ci	IAVF_PTT(149, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, UDP,  PAY4),
71562306a36Sopenharmony_ci	IAVF_PTT_UNUSED_ENTRY(150),
71662306a36Sopenharmony_ci	IAVF_PTT(151, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, TCP,  PAY4),
71762306a36Sopenharmony_ci	IAVF_PTT(152, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, SCTP, PAY4),
71862306a36Sopenharmony_ci	IAVF_PTT(153, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, ICMP, PAY4),
71962306a36Sopenharmony_ci
72062306a36Sopenharmony_ci	/* unused entries */
72162306a36Sopenharmony_ci	[154 ... 255] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 }
72262306a36Sopenharmony_ci};
72362306a36Sopenharmony_ci
72462306a36Sopenharmony_ci/**
72562306a36Sopenharmony_ci * iavf_aq_send_msg_to_pf
72662306a36Sopenharmony_ci * @hw: pointer to the hardware structure
72762306a36Sopenharmony_ci * @v_opcode: opcodes for VF-PF communication
72862306a36Sopenharmony_ci * @v_retval: return error code
72962306a36Sopenharmony_ci * @msg: pointer to the msg buffer
73062306a36Sopenharmony_ci * @msglen: msg length
73162306a36Sopenharmony_ci * @cmd_details: pointer to command details
73262306a36Sopenharmony_ci *
73362306a36Sopenharmony_ci * Send message to PF driver using admin queue. By default, this message
73462306a36Sopenharmony_ci * is sent asynchronously, i.e. iavf_asq_send_command() does not wait for
73562306a36Sopenharmony_ci * completion before returning.
73662306a36Sopenharmony_ci **/
73762306a36Sopenharmony_cienum iavf_status iavf_aq_send_msg_to_pf(struct iavf_hw *hw,
73862306a36Sopenharmony_ci					enum virtchnl_ops v_opcode,
73962306a36Sopenharmony_ci					enum iavf_status v_retval,
74062306a36Sopenharmony_ci					u8 *msg, u16 msglen,
74162306a36Sopenharmony_ci					struct iavf_asq_cmd_details *cmd_details)
74262306a36Sopenharmony_ci{
74362306a36Sopenharmony_ci	struct iavf_asq_cmd_details details;
74462306a36Sopenharmony_ci	struct iavf_aq_desc desc;
74562306a36Sopenharmony_ci	enum iavf_status status;
74662306a36Sopenharmony_ci
74762306a36Sopenharmony_ci	iavf_fill_default_direct_cmd_desc(&desc, iavf_aqc_opc_send_msg_to_pf);
74862306a36Sopenharmony_ci	desc.flags |= cpu_to_le16((u16)IAVF_AQ_FLAG_SI);
74962306a36Sopenharmony_ci	desc.cookie_high = cpu_to_le32(v_opcode);
75062306a36Sopenharmony_ci	desc.cookie_low = cpu_to_le32(v_retval);
75162306a36Sopenharmony_ci	if (msglen) {
75262306a36Sopenharmony_ci		desc.flags |= cpu_to_le16((u16)(IAVF_AQ_FLAG_BUF
75362306a36Sopenharmony_ci						| IAVF_AQ_FLAG_RD));
75462306a36Sopenharmony_ci		if (msglen > IAVF_AQ_LARGE_BUF)
75562306a36Sopenharmony_ci			desc.flags |= cpu_to_le16((u16)IAVF_AQ_FLAG_LB);
75662306a36Sopenharmony_ci		desc.datalen = cpu_to_le16(msglen);
75762306a36Sopenharmony_ci	}
75862306a36Sopenharmony_ci	if (!cmd_details) {
75962306a36Sopenharmony_ci		memset(&details, 0, sizeof(details));
76062306a36Sopenharmony_ci		details.async = true;
76162306a36Sopenharmony_ci		cmd_details = &details;
76262306a36Sopenharmony_ci	}
76362306a36Sopenharmony_ci	status = iavf_asq_send_command(hw, &desc, msg, msglen, cmd_details);
76462306a36Sopenharmony_ci	return status;
76562306a36Sopenharmony_ci}
76662306a36Sopenharmony_ci
76762306a36Sopenharmony_ci/**
76862306a36Sopenharmony_ci * iavf_vf_parse_hw_config
76962306a36Sopenharmony_ci * @hw: pointer to the hardware structure
77062306a36Sopenharmony_ci * @msg: pointer to the virtual channel VF resource structure
77162306a36Sopenharmony_ci *
77262306a36Sopenharmony_ci * Given a VF resource message from the PF, populate the hw struct
77362306a36Sopenharmony_ci * with appropriate information.
77462306a36Sopenharmony_ci **/
77562306a36Sopenharmony_civoid iavf_vf_parse_hw_config(struct iavf_hw *hw,
77662306a36Sopenharmony_ci			     struct virtchnl_vf_resource *msg)
77762306a36Sopenharmony_ci{
77862306a36Sopenharmony_ci	struct virtchnl_vsi_resource *vsi_res;
77962306a36Sopenharmony_ci	int i;
78062306a36Sopenharmony_ci
78162306a36Sopenharmony_ci	vsi_res = &msg->vsi_res[0];
78262306a36Sopenharmony_ci
78362306a36Sopenharmony_ci	hw->dev_caps.num_vsis = msg->num_vsis;
78462306a36Sopenharmony_ci	hw->dev_caps.num_rx_qp = msg->num_queue_pairs;
78562306a36Sopenharmony_ci	hw->dev_caps.num_tx_qp = msg->num_queue_pairs;
78662306a36Sopenharmony_ci	hw->dev_caps.num_msix_vectors_vf = msg->max_vectors;
78762306a36Sopenharmony_ci	hw->dev_caps.dcb = msg->vf_cap_flags &
78862306a36Sopenharmony_ci			   VIRTCHNL_VF_OFFLOAD_L2;
78962306a36Sopenharmony_ci	hw->dev_caps.fcoe = 0;
79062306a36Sopenharmony_ci	for (i = 0; i < msg->num_vsis; i++) {
79162306a36Sopenharmony_ci		if (vsi_res->vsi_type == VIRTCHNL_VSI_SRIOV) {
79262306a36Sopenharmony_ci			ether_addr_copy(hw->mac.perm_addr,
79362306a36Sopenharmony_ci					vsi_res->default_mac_addr);
79462306a36Sopenharmony_ci			ether_addr_copy(hw->mac.addr,
79562306a36Sopenharmony_ci					vsi_res->default_mac_addr);
79662306a36Sopenharmony_ci		}
79762306a36Sopenharmony_ci		vsi_res++;
79862306a36Sopenharmony_ci	}
79962306a36Sopenharmony_ci}
800