189214fe9SHaiyue Wang /* SPDX-License-Identifier: BSD-3-Clause
27815caa6SQi Zhang * Copyright(c) 2001-2021 Intel Corporation
389214fe9SHaiyue Wang */
489214fe9SHaiyue Wang
589214fe9SHaiyue Wang #include "iavf_type.h"
689214fe9SHaiyue Wang #include "iavf_adminq.h"
789214fe9SHaiyue Wang #include "iavf_prototype.h"
889214fe9SHaiyue Wang #include "virtchnl.h"
989214fe9SHaiyue Wang
1089214fe9SHaiyue Wang /**
1189214fe9SHaiyue Wang * iavf_set_mac_type - Sets MAC type
1289214fe9SHaiyue Wang * @hw: pointer to the HW structure
1389214fe9SHaiyue Wang *
1489214fe9SHaiyue Wang * This function sets the mac type of the adapter based on the
1589214fe9SHaiyue Wang * vendor ID and device ID stored in the hw structure.
1689214fe9SHaiyue Wang **/
iavf_set_mac_type(struct iavf_hw * hw)1789214fe9SHaiyue Wang enum iavf_status iavf_set_mac_type(struct iavf_hw *hw)
1889214fe9SHaiyue Wang {
1989214fe9SHaiyue Wang enum iavf_status status = IAVF_SUCCESS;
2089214fe9SHaiyue Wang
2189214fe9SHaiyue Wang DEBUGFUNC("iavf_set_mac_type\n");
2289214fe9SHaiyue Wang
2389214fe9SHaiyue Wang if (hw->vendor_id == IAVF_INTEL_VENDOR_ID) {
2489214fe9SHaiyue Wang switch (hw->device_id) {
2589214fe9SHaiyue Wang case IAVF_DEV_ID_X722_VF:
2689214fe9SHaiyue Wang hw->mac.type = IAVF_MAC_X722_VF;
2789214fe9SHaiyue Wang break;
2889214fe9SHaiyue Wang case IAVF_DEV_ID_VF:
2989214fe9SHaiyue Wang case IAVF_DEV_ID_VF_HV:
30*03b7b90aSWenjing Qiao hw->mac.type = IAVF_MAC_XL710;
31*03b7b90aSWenjing Qiao break;
3289214fe9SHaiyue Wang case IAVF_DEV_ID_ADAPTIVE_VF:
3389214fe9SHaiyue Wang hw->mac.type = IAVF_MAC_VF;
3489214fe9SHaiyue Wang break;
3589214fe9SHaiyue Wang default:
3689214fe9SHaiyue Wang hw->mac.type = IAVF_MAC_GENERIC;
3789214fe9SHaiyue Wang break;
3889214fe9SHaiyue Wang }
3989214fe9SHaiyue Wang } else {
4089214fe9SHaiyue Wang status = IAVF_ERR_DEVICE_NOT_SUPPORTED;
4189214fe9SHaiyue Wang }
4289214fe9SHaiyue Wang
4389214fe9SHaiyue Wang DEBUGOUT2("iavf_set_mac_type found mac: %d, returns: %d\n",
4489214fe9SHaiyue Wang hw->mac.type, status);
4589214fe9SHaiyue Wang return status;
4689214fe9SHaiyue Wang }
4789214fe9SHaiyue Wang
4889214fe9SHaiyue Wang /**
4989214fe9SHaiyue Wang * iavf_aq_str - convert AQ err code to a string
5089214fe9SHaiyue Wang * @hw: pointer to the HW structure
5189214fe9SHaiyue Wang * @aq_err: the AQ error code to convert
5289214fe9SHaiyue Wang **/
iavf_aq_str(struct iavf_hw * hw,enum iavf_admin_queue_err aq_err)5389214fe9SHaiyue Wang const char *iavf_aq_str(struct iavf_hw *hw, enum iavf_admin_queue_err aq_err)
5489214fe9SHaiyue Wang {
5589214fe9SHaiyue Wang switch (aq_err) {
5689214fe9SHaiyue Wang case IAVF_AQ_RC_OK:
5789214fe9SHaiyue Wang return "OK";
5889214fe9SHaiyue Wang case IAVF_AQ_RC_EPERM:
5989214fe9SHaiyue Wang return "IAVF_AQ_RC_EPERM";
6089214fe9SHaiyue Wang case IAVF_AQ_RC_ENOENT:
6189214fe9SHaiyue Wang return "IAVF_AQ_RC_ENOENT";
6289214fe9SHaiyue Wang case IAVF_AQ_RC_ESRCH:
6389214fe9SHaiyue Wang return "IAVF_AQ_RC_ESRCH";
6489214fe9SHaiyue Wang case IAVF_AQ_RC_EINTR:
6589214fe9SHaiyue Wang return "IAVF_AQ_RC_EINTR";
6689214fe9SHaiyue Wang case IAVF_AQ_RC_EIO:
6789214fe9SHaiyue Wang return "IAVF_AQ_RC_EIO";
6889214fe9SHaiyue Wang case IAVF_AQ_RC_ENXIO:
6989214fe9SHaiyue Wang return "IAVF_AQ_RC_ENXIO";
7089214fe9SHaiyue Wang case IAVF_AQ_RC_E2BIG:
7189214fe9SHaiyue Wang return "IAVF_AQ_RC_E2BIG";
7289214fe9SHaiyue Wang case IAVF_AQ_RC_EAGAIN:
7389214fe9SHaiyue Wang return "IAVF_AQ_RC_EAGAIN";
7489214fe9SHaiyue Wang case IAVF_AQ_RC_ENOMEM:
7589214fe9SHaiyue Wang return "IAVF_AQ_RC_ENOMEM";
7689214fe9SHaiyue Wang case IAVF_AQ_RC_EACCES:
7789214fe9SHaiyue Wang return "IAVF_AQ_RC_EACCES";
7889214fe9SHaiyue Wang case IAVF_AQ_RC_EFAULT:
7989214fe9SHaiyue Wang return "IAVF_AQ_RC_EFAULT";
8089214fe9SHaiyue Wang case IAVF_AQ_RC_EBUSY:
8189214fe9SHaiyue Wang return "IAVF_AQ_RC_EBUSY";
8289214fe9SHaiyue Wang case IAVF_AQ_RC_EEXIST:
8389214fe9SHaiyue Wang return "IAVF_AQ_RC_EEXIST";
8489214fe9SHaiyue Wang case IAVF_AQ_RC_EINVAL:
8589214fe9SHaiyue Wang return "IAVF_AQ_RC_EINVAL";
8689214fe9SHaiyue Wang case IAVF_AQ_RC_ENOTTY:
8789214fe9SHaiyue Wang return "IAVF_AQ_RC_ENOTTY";
8889214fe9SHaiyue Wang case IAVF_AQ_RC_ENOSPC:
8989214fe9SHaiyue Wang return "IAVF_AQ_RC_ENOSPC";
9089214fe9SHaiyue Wang case IAVF_AQ_RC_ENOSYS:
9189214fe9SHaiyue Wang return "IAVF_AQ_RC_ENOSYS";
9289214fe9SHaiyue Wang case IAVF_AQ_RC_ERANGE:
9389214fe9SHaiyue Wang return "IAVF_AQ_RC_ERANGE";
9489214fe9SHaiyue Wang case IAVF_AQ_RC_EFLUSHED:
9589214fe9SHaiyue Wang return "IAVF_AQ_RC_EFLUSHED";
9689214fe9SHaiyue Wang case IAVF_AQ_RC_BAD_ADDR:
9789214fe9SHaiyue Wang return "IAVF_AQ_RC_BAD_ADDR";
9889214fe9SHaiyue Wang case IAVF_AQ_RC_EMODE:
9989214fe9SHaiyue Wang return "IAVF_AQ_RC_EMODE";
10089214fe9SHaiyue Wang case IAVF_AQ_RC_EFBIG:
10189214fe9SHaiyue Wang return "IAVF_AQ_RC_EFBIG";
10289214fe9SHaiyue Wang }
10389214fe9SHaiyue Wang
10489214fe9SHaiyue Wang snprintf(hw->err_str, sizeof(hw->err_str), "%d", aq_err);
10589214fe9SHaiyue Wang return hw->err_str;
10689214fe9SHaiyue Wang }
10789214fe9SHaiyue Wang
10889214fe9SHaiyue Wang /**
10989214fe9SHaiyue Wang * iavf_stat_str - convert status err code to a string
11089214fe9SHaiyue Wang * @hw: pointer to the HW structure
11189214fe9SHaiyue Wang * @stat_err: the status error code to convert
11289214fe9SHaiyue Wang **/
iavf_stat_str(struct iavf_hw * hw,enum iavf_status stat_err)11389214fe9SHaiyue Wang const char *iavf_stat_str(struct iavf_hw *hw, enum iavf_status stat_err)
11489214fe9SHaiyue Wang {
11589214fe9SHaiyue Wang switch (stat_err) {
11689214fe9SHaiyue Wang case IAVF_SUCCESS:
11789214fe9SHaiyue Wang return "OK";
11889214fe9SHaiyue Wang case IAVF_ERR_NVM:
11989214fe9SHaiyue Wang return "IAVF_ERR_NVM";
12089214fe9SHaiyue Wang case IAVF_ERR_NVM_CHECKSUM:
12189214fe9SHaiyue Wang return "IAVF_ERR_NVM_CHECKSUM";
12289214fe9SHaiyue Wang case IAVF_ERR_PHY:
12389214fe9SHaiyue Wang return "IAVF_ERR_PHY";
12489214fe9SHaiyue Wang case IAVF_ERR_CONFIG:
12589214fe9SHaiyue Wang return "IAVF_ERR_CONFIG";
12689214fe9SHaiyue Wang case IAVF_ERR_PARAM:
12789214fe9SHaiyue Wang return "IAVF_ERR_PARAM";
12889214fe9SHaiyue Wang case IAVF_ERR_MAC_TYPE:
12989214fe9SHaiyue Wang return "IAVF_ERR_MAC_TYPE";
13089214fe9SHaiyue Wang case IAVF_ERR_UNKNOWN_PHY:
13189214fe9SHaiyue Wang return "IAVF_ERR_UNKNOWN_PHY";
13289214fe9SHaiyue Wang case IAVF_ERR_LINK_SETUP:
13389214fe9SHaiyue Wang return "IAVF_ERR_LINK_SETUP";
13489214fe9SHaiyue Wang case IAVF_ERR_ADAPTER_STOPPED:
13589214fe9SHaiyue Wang return "IAVF_ERR_ADAPTER_STOPPED";
13689214fe9SHaiyue Wang case IAVF_ERR_INVALID_MAC_ADDR:
13789214fe9SHaiyue Wang return "IAVF_ERR_INVALID_MAC_ADDR";
13889214fe9SHaiyue Wang case IAVF_ERR_DEVICE_NOT_SUPPORTED:
13989214fe9SHaiyue Wang return "IAVF_ERR_DEVICE_NOT_SUPPORTED";
14089214fe9SHaiyue Wang case IAVF_ERR_MASTER_REQUESTS_PENDING:
14189214fe9SHaiyue Wang return "IAVF_ERR_MASTER_REQUESTS_PENDING";
14289214fe9SHaiyue Wang case IAVF_ERR_INVALID_LINK_SETTINGS:
14389214fe9SHaiyue Wang return "IAVF_ERR_INVALID_LINK_SETTINGS";
14489214fe9SHaiyue Wang case IAVF_ERR_AUTONEG_NOT_COMPLETE:
14589214fe9SHaiyue Wang return "IAVF_ERR_AUTONEG_NOT_COMPLETE";
14689214fe9SHaiyue Wang case IAVF_ERR_RESET_FAILED:
14789214fe9SHaiyue Wang return "IAVF_ERR_RESET_FAILED";
14889214fe9SHaiyue Wang case IAVF_ERR_SWFW_SYNC:
14989214fe9SHaiyue Wang return "IAVF_ERR_SWFW_SYNC";
15089214fe9SHaiyue Wang case IAVF_ERR_NO_AVAILABLE_VSI:
15189214fe9SHaiyue Wang return "IAVF_ERR_NO_AVAILABLE_VSI";
15289214fe9SHaiyue Wang case IAVF_ERR_NO_MEMORY:
15389214fe9SHaiyue Wang return "IAVF_ERR_NO_MEMORY";
15489214fe9SHaiyue Wang case IAVF_ERR_BAD_PTR:
15589214fe9SHaiyue Wang return "IAVF_ERR_BAD_PTR";
15689214fe9SHaiyue Wang case IAVF_ERR_RING_FULL:
15789214fe9SHaiyue Wang return "IAVF_ERR_RING_FULL";
15889214fe9SHaiyue Wang case IAVF_ERR_INVALID_PD_ID:
15989214fe9SHaiyue Wang return "IAVF_ERR_INVALID_PD_ID";
16089214fe9SHaiyue Wang case IAVF_ERR_INVALID_QP_ID:
16189214fe9SHaiyue Wang return "IAVF_ERR_INVALID_QP_ID";
16289214fe9SHaiyue Wang case IAVF_ERR_INVALID_CQ_ID:
16389214fe9SHaiyue Wang return "IAVF_ERR_INVALID_CQ_ID";
16489214fe9SHaiyue Wang case IAVF_ERR_INVALID_CEQ_ID:
16589214fe9SHaiyue Wang return "IAVF_ERR_INVALID_CEQ_ID";
16689214fe9SHaiyue Wang case IAVF_ERR_INVALID_AEQ_ID:
16789214fe9SHaiyue Wang return "IAVF_ERR_INVALID_AEQ_ID";
16889214fe9SHaiyue Wang case IAVF_ERR_INVALID_SIZE:
16989214fe9SHaiyue Wang return "IAVF_ERR_INVALID_SIZE";
17089214fe9SHaiyue Wang case IAVF_ERR_INVALID_ARP_INDEX:
17189214fe9SHaiyue Wang return "IAVF_ERR_INVALID_ARP_INDEX";
17289214fe9SHaiyue Wang case IAVF_ERR_INVALID_FPM_FUNC_ID:
17389214fe9SHaiyue Wang return "IAVF_ERR_INVALID_FPM_FUNC_ID";
17489214fe9SHaiyue Wang case IAVF_ERR_QP_INVALID_MSG_SIZE:
17589214fe9SHaiyue Wang return "IAVF_ERR_QP_INVALID_MSG_SIZE";
17689214fe9SHaiyue Wang case IAVF_ERR_QP_TOOMANY_WRS_POSTED:
17789214fe9SHaiyue Wang return "IAVF_ERR_QP_TOOMANY_WRS_POSTED";
17889214fe9SHaiyue Wang case IAVF_ERR_INVALID_FRAG_COUNT:
17989214fe9SHaiyue Wang return "IAVF_ERR_INVALID_FRAG_COUNT";
18089214fe9SHaiyue Wang case IAVF_ERR_QUEUE_EMPTY:
18189214fe9SHaiyue Wang return "IAVF_ERR_QUEUE_EMPTY";
18289214fe9SHaiyue Wang case IAVF_ERR_INVALID_ALIGNMENT:
18389214fe9SHaiyue Wang return "IAVF_ERR_INVALID_ALIGNMENT";
18489214fe9SHaiyue Wang case IAVF_ERR_FLUSHED_QUEUE:
18589214fe9SHaiyue Wang return "IAVF_ERR_FLUSHED_QUEUE";
18689214fe9SHaiyue Wang case IAVF_ERR_INVALID_PUSH_PAGE_INDEX:
18789214fe9SHaiyue Wang return "IAVF_ERR_INVALID_PUSH_PAGE_INDEX";
18889214fe9SHaiyue Wang case IAVF_ERR_INVALID_IMM_DATA_SIZE:
18989214fe9SHaiyue Wang return "IAVF_ERR_INVALID_IMM_DATA_SIZE";
19089214fe9SHaiyue Wang case IAVF_ERR_TIMEOUT:
19189214fe9SHaiyue Wang return "IAVF_ERR_TIMEOUT";
19289214fe9SHaiyue Wang case IAVF_ERR_OPCODE_MISMATCH:
19389214fe9SHaiyue Wang return "IAVF_ERR_OPCODE_MISMATCH";
19489214fe9SHaiyue Wang case IAVF_ERR_CQP_COMPL_ERROR:
19589214fe9SHaiyue Wang return "IAVF_ERR_CQP_COMPL_ERROR";
19689214fe9SHaiyue Wang case IAVF_ERR_INVALID_VF_ID:
19789214fe9SHaiyue Wang return "IAVF_ERR_INVALID_VF_ID";
19889214fe9SHaiyue Wang case IAVF_ERR_INVALID_HMCFN_ID:
19989214fe9SHaiyue Wang return "IAVF_ERR_INVALID_HMCFN_ID";
20089214fe9SHaiyue Wang case IAVF_ERR_BACKING_PAGE_ERROR:
20189214fe9SHaiyue Wang return "IAVF_ERR_BACKING_PAGE_ERROR";
20289214fe9SHaiyue Wang case IAVF_ERR_NO_PBLCHUNKS_AVAILABLE:
20389214fe9SHaiyue Wang return "IAVF_ERR_NO_PBLCHUNKS_AVAILABLE";
20489214fe9SHaiyue Wang case IAVF_ERR_INVALID_PBLE_INDEX:
20589214fe9SHaiyue Wang return "IAVF_ERR_INVALID_PBLE_INDEX";
20689214fe9SHaiyue Wang case IAVF_ERR_INVALID_SD_INDEX:
20789214fe9SHaiyue Wang return "IAVF_ERR_INVALID_SD_INDEX";
20889214fe9SHaiyue Wang case IAVF_ERR_INVALID_PAGE_DESC_INDEX:
20989214fe9SHaiyue Wang return "IAVF_ERR_INVALID_PAGE_DESC_INDEX";
21089214fe9SHaiyue Wang case IAVF_ERR_INVALID_SD_TYPE:
21189214fe9SHaiyue Wang return "IAVF_ERR_INVALID_SD_TYPE";
21289214fe9SHaiyue Wang case IAVF_ERR_MEMCPY_FAILED:
21389214fe9SHaiyue Wang return "IAVF_ERR_MEMCPY_FAILED";
21489214fe9SHaiyue Wang case IAVF_ERR_INVALID_HMC_OBJ_INDEX:
21589214fe9SHaiyue Wang return "IAVF_ERR_INVALID_HMC_OBJ_INDEX";
21689214fe9SHaiyue Wang case IAVF_ERR_INVALID_HMC_OBJ_COUNT:
21789214fe9SHaiyue Wang return "IAVF_ERR_INVALID_HMC_OBJ_COUNT";
21889214fe9SHaiyue Wang case IAVF_ERR_INVALID_SRQ_ARM_LIMIT:
21989214fe9SHaiyue Wang return "IAVF_ERR_INVALID_SRQ_ARM_LIMIT";
22089214fe9SHaiyue Wang case IAVF_ERR_SRQ_ENABLED:
22189214fe9SHaiyue Wang return "IAVF_ERR_SRQ_ENABLED";
22289214fe9SHaiyue Wang case IAVF_ERR_ADMIN_QUEUE_ERROR:
22389214fe9SHaiyue Wang return "IAVF_ERR_ADMIN_QUEUE_ERROR";
22489214fe9SHaiyue Wang case IAVF_ERR_ADMIN_QUEUE_TIMEOUT:
22589214fe9SHaiyue Wang return "IAVF_ERR_ADMIN_QUEUE_TIMEOUT";
22689214fe9SHaiyue Wang case IAVF_ERR_BUF_TOO_SHORT:
22789214fe9SHaiyue Wang return "IAVF_ERR_BUF_TOO_SHORT";
22889214fe9SHaiyue Wang case IAVF_ERR_ADMIN_QUEUE_FULL:
22989214fe9SHaiyue Wang return "IAVF_ERR_ADMIN_QUEUE_FULL";
23089214fe9SHaiyue Wang case IAVF_ERR_ADMIN_QUEUE_NO_WORK:
23189214fe9SHaiyue Wang return "IAVF_ERR_ADMIN_QUEUE_NO_WORK";
23289214fe9SHaiyue Wang case IAVF_ERR_BAD_IWARP_CQE:
23389214fe9SHaiyue Wang return "IAVF_ERR_BAD_IWARP_CQE";
23489214fe9SHaiyue Wang case IAVF_ERR_NVM_BLANK_MODE:
23589214fe9SHaiyue Wang return "IAVF_ERR_NVM_BLANK_MODE";
23689214fe9SHaiyue Wang case IAVF_ERR_NOT_IMPLEMENTED:
23789214fe9SHaiyue Wang return "IAVF_ERR_NOT_IMPLEMENTED";
23889214fe9SHaiyue Wang case IAVF_ERR_PE_DOORBELL_NOT_ENABLED:
23989214fe9SHaiyue Wang return "IAVF_ERR_PE_DOORBELL_NOT_ENABLED";
24089214fe9SHaiyue Wang case IAVF_ERR_DIAG_TEST_FAILED:
24189214fe9SHaiyue Wang return "IAVF_ERR_DIAG_TEST_FAILED";
24289214fe9SHaiyue Wang case IAVF_ERR_NOT_READY:
24389214fe9SHaiyue Wang return "IAVF_ERR_NOT_READY";
24489214fe9SHaiyue Wang case IAVF_NOT_SUPPORTED:
24589214fe9SHaiyue Wang return "IAVF_NOT_SUPPORTED";
24689214fe9SHaiyue Wang case IAVF_ERR_FIRMWARE_API_VERSION:
24789214fe9SHaiyue Wang return "IAVF_ERR_FIRMWARE_API_VERSION";
24889214fe9SHaiyue Wang case IAVF_ERR_ADMIN_QUEUE_CRITICAL_ERROR:
24989214fe9SHaiyue Wang return "IAVF_ERR_ADMIN_QUEUE_CRITICAL_ERROR";
25089214fe9SHaiyue Wang }
25189214fe9SHaiyue Wang
25289214fe9SHaiyue Wang snprintf(hw->err_str, sizeof(hw->err_str), "%d", stat_err);
25389214fe9SHaiyue Wang return hw->err_str;
25489214fe9SHaiyue Wang }
25589214fe9SHaiyue Wang
25689214fe9SHaiyue Wang /**
25789214fe9SHaiyue Wang * iavf_debug_aq
25889214fe9SHaiyue Wang * @hw: debug mask related to admin queue
25989214fe9SHaiyue Wang * @mask: debug mask
26089214fe9SHaiyue Wang * @desc: pointer to admin queue descriptor
26189214fe9SHaiyue Wang * @buffer: pointer to command buffer
26289214fe9SHaiyue Wang * @buf_len: max length of buffer
26389214fe9SHaiyue Wang *
26489214fe9SHaiyue Wang * Dumps debug log about adminq command with descriptor contents.
26589214fe9SHaiyue Wang **/
iavf_debug_aq(struct iavf_hw * hw,enum iavf_debug_mask mask,void * desc,void * buffer,u16 buf_len)26689214fe9SHaiyue Wang void iavf_debug_aq(struct iavf_hw *hw, enum iavf_debug_mask mask, void *desc,
26789214fe9SHaiyue Wang void *buffer, u16 buf_len)
26889214fe9SHaiyue Wang {
26989214fe9SHaiyue Wang struct iavf_aq_desc *aq_desc = (struct iavf_aq_desc *)desc;
27089214fe9SHaiyue Wang u8 *buf = (u8 *)buffer;
27189214fe9SHaiyue Wang u16 len;
27289214fe9SHaiyue Wang u16 i = 0;
27389214fe9SHaiyue Wang
27489214fe9SHaiyue Wang if ((!(mask & hw->debug_mask)) || (desc == NULL))
27589214fe9SHaiyue Wang return;
27689214fe9SHaiyue Wang
27789214fe9SHaiyue Wang len = LE16_TO_CPU(aq_desc->datalen);
27889214fe9SHaiyue Wang
27989214fe9SHaiyue Wang iavf_debug(hw, mask,
28089214fe9SHaiyue Wang "AQ CMD: opcode 0x%04X, flags 0x%04X, datalen 0x%04X, retval 0x%04X\n",
28189214fe9SHaiyue Wang LE16_TO_CPU(aq_desc->opcode),
28289214fe9SHaiyue Wang LE16_TO_CPU(aq_desc->flags),
28389214fe9SHaiyue Wang LE16_TO_CPU(aq_desc->datalen),
28489214fe9SHaiyue Wang LE16_TO_CPU(aq_desc->retval));
28589214fe9SHaiyue Wang iavf_debug(hw, mask, "\tcookie (h,l) 0x%08X 0x%08X\n",
28689214fe9SHaiyue Wang LE32_TO_CPU(aq_desc->cookie_high),
28789214fe9SHaiyue Wang LE32_TO_CPU(aq_desc->cookie_low));
28889214fe9SHaiyue Wang iavf_debug(hw, mask, "\tparam (0,1) 0x%08X 0x%08X\n",
28989214fe9SHaiyue Wang LE32_TO_CPU(aq_desc->params.internal.param0),
29089214fe9SHaiyue Wang LE32_TO_CPU(aq_desc->params.internal.param1));
29189214fe9SHaiyue Wang iavf_debug(hw, mask, "\taddr (h,l) 0x%08X 0x%08X\n",
29289214fe9SHaiyue Wang LE32_TO_CPU(aq_desc->params.external.addr_high),
29389214fe9SHaiyue Wang LE32_TO_CPU(aq_desc->params.external.addr_low));
29489214fe9SHaiyue Wang
29589214fe9SHaiyue Wang if ((buffer != NULL) && (aq_desc->datalen != 0)) {
29689214fe9SHaiyue Wang iavf_debug(hw, mask, "AQ CMD Buffer:\n");
29789214fe9SHaiyue Wang if (buf_len < len)
29889214fe9SHaiyue Wang len = buf_len;
29989214fe9SHaiyue Wang /* write the full 16-byte chunks */
30089214fe9SHaiyue Wang for (i = 0; i < (len - 16); i += 16)
30189214fe9SHaiyue Wang iavf_debug(hw, mask,
30289214fe9SHaiyue Wang "\t0x%04X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n",
30389214fe9SHaiyue Wang i, buf[i], buf[i+1], buf[i+2], buf[i+3],
30489214fe9SHaiyue Wang buf[i+4], buf[i+5], buf[i+6], buf[i+7],
30589214fe9SHaiyue Wang buf[i+8], buf[i+9], buf[i+10], buf[i+11],
30689214fe9SHaiyue Wang buf[i+12], buf[i+13], buf[i+14], buf[i+15]);
30789214fe9SHaiyue Wang /* the most we could have left is 16 bytes, pad with zeros */
30889214fe9SHaiyue Wang if (i < len) {
30989214fe9SHaiyue Wang char d_buf[16];
31089214fe9SHaiyue Wang int j, i_sav;
31189214fe9SHaiyue Wang
31289214fe9SHaiyue Wang i_sav = i;
31389214fe9SHaiyue Wang memset(d_buf, 0, sizeof(d_buf));
31489214fe9SHaiyue Wang for (j = 0; i < len; j++, i++)
31589214fe9SHaiyue Wang d_buf[j] = buf[i];
31689214fe9SHaiyue Wang iavf_debug(hw, mask,
31789214fe9SHaiyue Wang "\t0x%04X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n",
31889214fe9SHaiyue Wang i_sav, d_buf[0], d_buf[1], d_buf[2], d_buf[3],
31989214fe9SHaiyue Wang d_buf[4], d_buf[5], d_buf[6], d_buf[7],
32089214fe9SHaiyue Wang d_buf[8], d_buf[9], d_buf[10], d_buf[11],
32189214fe9SHaiyue Wang d_buf[12], d_buf[13], d_buf[14], d_buf[15]);
32289214fe9SHaiyue Wang }
32389214fe9SHaiyue Wang }
32489214fe9SHaiyue Wang }
32589214fe9SHaiyue Wang
32689214fe9SHaiyue Wang /**
32789214fe9SHaiyue Wang * iavf_check_asq_alive
32889214fe9SHaiyue Wang * @hw: pointer to the hw struct
32989214fe9SHaiyue Wang *
33089214fe9SHaiyue Wang * Returns true if Queue is enabled else false.
33189214fe9SHaiyue Wang **/
iavf_check_asq_alive(struct iavf_hw * hw)33289214fe9SHaiyue Wang bool iavf_check_asq_alive(struct iavf_hw *hw)
33389214fe9SHaiyue Wang {
33489214fe9SHaiyue Wang if (hw->aq.asq.len)
33589214fe9SHaiyue Wang return !!(rd32(hw, hw->aq.asq.len) &
33689214fe9SHaiyue Wang IAVF_VF_ATQLEN1_ATQENABLE_MASK);
33789214fe9SHaiyue Wang else
33889214fe9SHaiyue Wang return false;
33989214fe9SHaiyue Wang }
34089214fe9SHaiyue Wang
34189214fe9SHaiyue Wang /**
34289214fe9SHaiyue Wang * iavf_aq_queue_shutdown
34389214fe9SHaiyue Wang * @hw: pointer to the hw struct
34489214fe9SHaiyue Wang * @unloading: is the driver unloading itself
34589214fe9SHaiyue Wang *
34689214fe9SHaiyue Wang * Tell the Firmware that we're shutting down the AdminQ and whether
34789214fe9SHaiyue Wang * or not the driver is unloading as well.
34889214fe9SHaiyue Wang **/
iavf_aq_queue_shutdown(struct iavf_hw * hw,bool unloading)34989214fe9SHaiyue Wang enum iavf_status iavf_aq_queue_shutdown(struct iavf_hw *hw,
35089214fe9SHaiyue Wang bool unloading)
35189214fe9SHaiyue Wang {
35289214fe9SHaiyue Wang struct iavf_aq_desc desc;
35389214fe9SHaiyue Wang struct iavf_aqc_queue_shutdown *cmd =
35489214fe9SHaiyue Wang (struct iavf_aqc_queue_shutdown *)&desc.params.raw;
35589214fe9SHaiyue Wang enum iavf_status status;
35689214fe9SHaiyue Wang
35789214fe9SHaiyue Wang iavf_fill_default_direct_cmd_desc(&desc,
35889214fe9SHaiyue Wang iavf_aqc_opc_queue_shutdown);
35989214fe9SHaiyue Wang
36089214fe9SHaiyue Wang if (unloading)
36189214fe9SHaiyue Wang cmd->driver_unloading = CPU_TO_LE32(IAVF_AQ_DRIVER_UNLOADING);
36289214fe9SHaiyue Wang status = iavf_asq_send_command(hw, &desc, NULL, 0, NULL);
36389214fe9SHaiyue Wang
36489214fe9SHaiyue Wang return status;
36589214fe9SHaiyue Wang }
36689214fe9SHaiyue Wang
36789214fe9SHaiyue Wang /**
36889214fe9SHaiyue Wang * iavf_aq_get_set_rss_lut
36989214fe9SHaiyue Wang * @hw: pointer to the hardware structure
37089214fe9SHaiyue Wang * @vsi_id: vsi fw index
37189214fe9SHaiyue Wang * @pf_lut: for PF table set true, for VSI table set false
37289214fe9SHaiyue Wang * @lut: pointer to the lut buffer provided by the caller
37389214fe9SHaiyue Wang * @lut_size: size of the lut buffer
37489214fe9SHaiyue Wang * @set: set true to set the table, false to get the table
37589214fe9SHaiyue Wang *
37689214fe9SHaiyue Wang * Internal function to get or set RSS look up table
37789214fe9SHaiyue Wang **/
iavf_aq_get_set_rss_lut(struct iavf_hw * hw,u16 vsi_id,bool pf_lut,u8 * lut,u16 lut_size,bool set)37889214fe9SHaiyue Wang STATIC enum iavf_status iavf_aq_get_set_rss_lut(struct iavf_hw *hw,
37989214fe9SHaiyue Wang u16 vsi_id, bool pf_lut,
38089214fe9SHaiyue Wang u8 *lut, u16 lut_size,
38189214fe9SHaiyue Wang bool set)
38289214fe9SHaiyue Wang {
38389214fe9SHaiyue Wang enum iavf_status status;
38489214fe9SHaiyue Wang struct iavf_aq_desc desc;
38589214fe9SHaiyue Wang struct iavf_aqc_get_set_rss_lut *cmd_resp =
38689214fe9SHaiyue Wang (struct iavf_aqc_get_set_rss_lut *)&desc.params.raw;
38789214fe9SHaiyue Wang
38889214fe9SHaiyue Wang if (set)
38989214fe9SHaiyue Wang iavf_fill_default_direct_cmd_desc(&desc,
39089214fe9SHaiyue Wang iavf_aqc_opc_set_rss_lut);
39189214fe9SHaiyue Wang else
39289214fe9SHaiyue Wang iavf_fill_default_direct_cmd_desc(&desc,
39389214fe9SHaiyue Wang iavf_aqc_opc_get_rss_lut);
39489214fe9SHaiyue Wang
39589214fe9SHaiyue Wang /* Indirect command */
39689214fe9SHaiyue Wang desc.flags |= CPU_TO_LE16((u16)IAVF_AQ_FLAG_BUF);
39789214fe9SHaiyue Wang desc.flags |= CPU_TO_LE16((u16)IAVF_AQ_FLAG_RD);
39889214fe9SHaiyue Wang
39989214fe9SHaiyue Wang cmd_resp->vsi_id =
40089214fe9SHaiyue Wang CPU_TO_LE16((u16)((vsi_id <<
40189214fe9SHaiyue Wang IAVF_AQC_SET_RSS_LUT_VSI_ID_SHIFT) &
40289214fe9SHaiyue Wang IAVF_AQC_SET_RSS_LUT_VSI_ID_MASK));
40389214fe9SHaiyue Wang cmd_resp->vsi_id |= CPU_TO_LE16((u16)IAVF_AQC_SET_RSS_LUT_VSI_VALID);
40489214fe9SHaiyue Wang
40589214fe9SHaiyue Wang if (pf_lut)
40689214fe9SHaiyue Wang cmd_resp->flags |= CPU_TO_LE16((u16)
40789214fe9SHaiyue Wang ((IAVF_AQC_SET_RSS_LUT_TABLE_TYPE_PF <<
40889214fe9SHaiyue Wang IAVF_AQC_SET_RSS_LUT_TABLE_TYPE_SHIFT) &
40989214fe9SHaiyue Wang IAVF_AQC_SET_RSS_LUT_TABLE_TYPE_MASK));
41089214fe9SHaiyue Wang else
41189214fe9SHaiyue Wang cmd_resp->flags |= CPU_TO_LE16((u16)
41289214fe9SHaiyue Wang ((IAVF_AQC_SET_RSS_LUT_TABLE_TYPE_VSI <<
41389214fe9SHaiyue Wang IAVF_AQC_SET_RSS_LUT_TABLE_TYPE_SHIFT) &
41489214fe9SHaiyue Wang IAVF_AQC_SET_RSS_LUT_TABLE_TYPE_MASK));
41589214fe9SHaiyue Wang
41689214fe9SHaiyue Wang status = iavf_asq_send_command(hw, &desc, lut, lut_size, NULL);
41789214fe9SHaiyue Wang
41889214fe9SHaiyue Wang return status;
41989214fe9SHaiyue Wang }
42089214fe9SHaiyue Wang
42189214fe9SHaiyue Wang /**
42289214fe9SHaiyue Wang * iavf_aq_get_rss_lut
42389214fe9SHaiyue Wang * @hw: pointer to the hardware structure
42489214fe9SHaiyue Wang * @vsi_id: vsi fw index
42589214fe9SHaiyue Wang * @pf_lut: for PF table set true, for VSI table set false
42689214fe9SHaiyue Wang * @lut: pointer to the lut buffer provided by the caller
42789214fe9SHaiyue Wang * @lut_size: size of the lut buffer
42889214fe9SHaiyue Wang *
42989214fe9SHaiyue Wang * get the RSS lookup table, PF or VSI type
43089214fe9SHaiyue Wang **/
iavf_aq_get_rss_lut(struct iavf_hw * hw,u16 vsi_id,bool pf_lut,u8 * lut,u16 lut_size)43189214fe9SHaiyue Wang enum iavf_status iavf_aq_get_rss_lut(struct iavf_hw *hw, u16 vsi_id,
43289214fe9SHaiyue Wang bool pf_lut, u8 *lut, u16 lut_size)
43389214fe9SHaiyue Wang {
43489214fe9SHaiyue Wang return iavf_aq_get_set_rss_lut(hw, vsi_id, pf_lut, lut, lut_size,
43589214fe9SHaiyue Wang false);
43689214fe9SHaiyue Wang }
43789214fe9SHaiyue Wang
43889214fe9SHaiyue Wang /**
43989214fe9SHaiyue Wang * iavf_aq_set_rss_lut
44089214fe9SHaiyue Wang * @hw: pointer to the hardware structure
44189214fe9SHaiyue Wang * @vsi_id: vsi fw index
44289214fe9SHaiyue Wang * @pf_lut: for PF table set true, for VSI table set false
44389214fe9SHaiyue Wang * @lut: pointer to the lut buffer provided by the caller
44489214fe9SHaiyue Wang * @lut_size: size of the lut buffer
44589214fe9SHaiyue Wang *
44689214fe9SHaiyue Wang * set the RSS lookup table, PF or VSI type
44789214fe9SHaiyue Wang **/
iavf_aq_set_rss_lut(struct iavf_hw * hw,u16 vsi_id,bool pf_lut,u8 * lut,u16 lut_size)44889214fe9SHaiyue Wang enum iavf_status iavf_aq_set_rss_lut(struct iavf_hw *hw, u16 vsi_id,
44989214fe9SHaiyue Wang bool pf_lut, u8 *lut, u16 lut_size)
45089214fe9SHaiyue Wang {
45189214fe9SHaiyue Wang return iavf_aq_get_set_rss_lut(hw, vsi_id, pf_lut, lut, lut_size, true);
45289214fe9SHaiyue Wang }
45389214fe9SHaiyue Wang
45489214fe9SHaiyue Wang /**
45589214fe9SHaiyue Wang * iavf_aq_get_set_rss_key
45689214fe9SHaiyue Wang * @hw: pointer to the hw struct
45789214fe9SHaiyue Wang * @vsi_id: vsi fw index
45889214fe9SHaiyue Wang * @key: pointer to key info struct
45989214fe9SHaiyue Wang * @set: set true to set the key, false to get the key
46089214fe9SHaiyue Wang *
46189214fe9SHaiyue Wang * get the RSS key per VSI
46289214fe9SHaiyue Wang **/
iavf_aq_get_set_rss_key(struct iavf_hw * hw,u16 vsi_id,struct iavf_aqc_get_set_rss_key_data * key,bool set)46389214fe9SHaiyue Wang STATIC enum iavf_status iavf_aq_get_set_rss_key(struct iavf_hw *hw,
46489214fe9SHaiyue Wang u16 vsi_id,
46589214fe9SHaiyue Wang struct iavf_aqc_get_set_rss_key_data *key,
46689214fe9SHaiyue Wang bool set)
46789214fe9SHaiyue Wang {
46889214fe9SHaiyue Wang enum iavf_status status;
46989214fe9SHaiyue Wang struct iavf_aq_desc desc;
47089214fe9SHaiyue Wang struct iavf_aqc_get_set_rss_key *cmd_resp =
47189214fe9SHaiyue Wang (struct iavf_aqc_get_set_rss_key *)&desc.params.raw;
47289214fe9SHaiyue Wang u16 key_size = sizeof(struct iavf_aqc_get_set_rss_key_data);
47389214fe9SHaiyue Wang
47489214fe9SHaiyue Wang if (set)
47589214fe9SHaiyue Wang iavf_fill_default_direct_cmd_desc(&desc,
47689214fe9SHaiyue Wang iavf_aqc_opc_set_rss_key);
47789214fe9SHaiyue Wang else
47889214fe9SHaiyue Wang iavf_fill_default_direct_cmd_desc(&desc,
47989214fe9SHaiyue Wang iavf_aqc_opc_get_rss_key);
48089214fe9SHaiyue Wang
48189214fe9SHaiyue Wang /* Indirect command */
48289214fe9SHaiyue Wang desc.flags |= CPU_TO_LE16((u16)IAVF_AQ_FLAG_BUF);
48389214fe9SHaiyue Wang desc.flags |= CPU_TO_LE16((u16)IAVF_AQ_FLAG_RD);
48489214fe9SHaiyue Wang
48589214fe9SHaiyue Wang cmd_resp->vsi_id =
48689214fe9SHaiyue Wang CPU_TO_LE16((u16)((vsi_id <<
48789214fe9SHaiyue Wang IAVF_AQC_SET_RSS_KEY_VSI_ID_SHIFT) &
48889214fe9SHaiyue Wang IAVF_AQC_SET_RSS_KEY_VSI_ID_MASK));
48989214fe9SHaiyue Wang cmd_resp->vsi_id |= CPU_TO_LE16((u16)IAVF_AQC_SET_RSS_KEY_VSI_VALID);
49089214fe9SHaiyue Wang
49189214fe9SHaiyue Wang status = iavf_asq_send_command(hw, &desc, key, key_size, NULL);
49289214fe9SHaiyue Wang
49389214fe9SHaiyue Wang return status;
49489214fe9SHaiyue Wang }
49589214fe9SHaiyue Wang
49689214fe9SHaiyue Wang /**
49789214fe9SHaiyue Wang * iavf_aq_get_rss_key
49889214fe9SHaiyue Wang * @hw: pointer to the hw struct
49989214fe9SHaiyue Wang * @vsi_id: vsi fw index
50089214fe9SHaiyue Wang * @key: pointer to key info struct
50189214fe9SHaiyue Wang *
50289214fe9SHaiyue Wang **/
iavf_aq_get_rss_key(struct iavf_hw * hw,u16 vsi_id,struct iavf_aqc_get_set_rss_key_data * key)50389214fe9SHaiyue Wang enum iavf_status iavf_aq_get_rss_key(struct iavf_hw *hw,
50489214fe9SHaiyue Wang u16 vsi_id,
50589214fe9SHaiyue Wang struct iavf_aqc_get_set_rss_key_data *key)
50689214fe9SHaiyue Wang {
50789214fe9SHaiyue Wang return iavf_aq_get_set_rss_key(hw, vsi_id, key, false);
50889214fe9SHaiyue Wang }
50989214fe9SHaiyue Wang
51089214fe9SHaiyue Wang /**
51189214fe9SHaiyue Wang * iavf_aq_set_rss_key
51289214fe9SHaiyue Wang * @hw: pointer to the hw struct
51389214fe9SHaiyue Wang * @vsi_id: vsi fw index
51489214fe9SHaiyue Wang * @key: pointer to key info struct
51589214fe9SHaiyue Wang *
51689214fe9SHaiyue Wang * set the RSS key per VSI
51789214fe9SHaiyue Wang **/
iavf_aq_set_rss_key(struct iavf_hw * hw,u16 vsi_id,struct iavf_aqc_get_set_rss_key_data * key)51889214fe9SHaiyue Wang enum iavf_status iavf_aq_set_rss_key(struct iavf_hw *hw,
51989214fe9SHaiyue Wang u16 vsi_id,
52089214fe9SHaiyue Wang struct iavf_aqc_get_set_rss_key_data *key)
52189214fe9SHaiyue Wang {
52289214fe9SHaiyue Wang return iavf_aq_get_set_rss_key(hw, vsi_id, key, true);
52389214fe9SHaiyue Wang }
52489214fe9SHaiyue Wang
52589214fe9SHaiyue Wang /* The iavf_ptype_lookup table is used to convert from the 8-bit ptype in the
52689214fe9SHaiyue Wang * hardware to a bit-field that can be used by SW to more easily determine the
52789214fe9SHaiyue Wang * packet type.
52889214fe9SHaiyue Wang *
52989214fe9SHaiyue Wang * Macros are used to shorten the table lines and make this table human
53089214fe9SHaiyue Wang * readable.
53189214fe9SHaiyue Wang *
53289214fe9SHaiyue Wang * We store the PTYPE in the top byte of the bit field - this is just so that
53389214fe9SHaiyue Wang * we can check that the table doesn't have a row missing, as the index into
53489214fe9SHaiyue Wang * the table should be the PTYPE.
53589214fe9SHaiyue Wang *
53689214fe9SHaiyue Wang * Typical work flow:
53789214fe9SHaiyue Wang *
53889214fe9SHaiyue Wang * IF NOT iavf_ptype_lookup[ptype].known
53989214fe9SHaiyue Wang * THEN
54089214fe9SHaiyue Wang * Packet is unknown
54189214fe9SHaiyue Wang * ELSE IF iavf_ptype_lookup[ptype].outer_ip == IAVF_RX_PTYPE_OUTER_IP
54289214fe9SHaiyue Wang * Use the rest of the fields to look at the tunnels, inner protocols, etc
54389214fe9SHaiyue Wang * ELSE
54489214fe9SHaiyue Wang * Use the enum iavf_rx_l2_ptype to decode the packet type
54589214fe9SHaiyue Wang * ENDIF
54689214fe9SHaiyue Wang */
54789214fe9SHaiyue Wang
54889214fe9SHaiyue Wang /* macro to make the table lines short */
54989214fe9SHaiyue Wang #define IAVF_PTT(PTYPE, OUTER_IP, OUTER_IP_VER, OUTER_FRAG, T, TE, TEF, I, PL)\
55089214fe9SHaiyue Wang { PTYPE, \
55189214fe9SHaiyue Wang 1, \
55289214fe9SHaiyue Wang IAVF_RX_PTYPE_OUTER_##OUTER_IP, \
55389214fe9SHaiyue Wang IAVF_RX_PTYPE_OUTER_##OUTER_IP_VER, \
55489214fe9SHaiyue Wang IAVF_RX_PTYPE_##OUTER_FRAG, \
55589214fe9SHaiyue Wang IAVF_RX_PTYPE_TUNNEL_##T, \
55689214fe9SHaiyue Wang IAVF_RX_PTYPE_TUNNEL_END_##TE, \
55789214fe9SHaiyue Wang IAVF_RX_PTYPE_##TEF, \
55889214fe9SHaiyue Wang IAVF_RX_PTYPE_INNER_PROT_##I, \
55989214fe9SHaiyue Wang IAVF_RX_PTYPE_PAYLOAD_LAYER_##PL }
56089214fe9SHaiyue Wang
56189214fe9SHaiyue Wang #define IAVF_PTT_UNUSED_ENTRY(PTYPE) \
56289214fe9SHaiyue Wang { PTYPE, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
56389214fe9SHaiyue Wang
56489214fe9SHaiyue Wang /* shorter macros makes the table fit but are terse */
56589214fe9SHaiyue Wang #define IAVF_RX_PTYPE_NOF IAVF_RX_PTYPE_NOT_FRAG
56689214fe9SHaiyue Wang #define IAVF_RX_PTYPE_FRG IAVF_RX_PTYPE_FRAG
56789214fe9SHaiyue Wang #define IAVF_RX_PTYPE_INNER_PROT_TS IAVF_RX_PTYPE_INNER_PROT_TIMESYNC
56889214fe9SHaiyue Wang
56989214fe9SHaiyue Wang /* Lookup table mapping the HW PTYPE to the bit field for decoding */
57089214fe9SHaiyue Wang struct iavf_rx_ptype_decoded iavf_ptype_lookup[] = {
57189214fe9SHaiyue Wang /* L2 Packet types */
57289214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(0),
57389214fe9SHaiyue Wang IAVF_PTT(1, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
57489214fe9SHaiyue Wang IAVF_PTT(2, L2, NONE, NOF, NONE, NONE, NOF, TS, PAY2),
57589214fe9SHaiyue Wang IAVF_PTT(3, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
57689214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(4),
57789214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(5),
57889214fe9SHaiyue Wang IAVF_PTT(6, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
57989214fe9SHaiyue Wang IAVF_PTT(7, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
58089214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(8),
58189214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(9),
58289214fe9SHaiyue Wang IAVF_PTT(10, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
58389214fe9SHaiyue Wang IAVF_PTT(11, L2, NONE, NOF, NONE, NONE, NOF, NONE, NONE),
58489214fe9SHaiyue Wang IAVF_PTT(12, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
58589214fe9SHaiyue Wang IAVF_PTT(13, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
58689214fe9SHaiyue Wang IAVF_PTT(14, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
58789214fe9SHaiyue Wang IAVF_PTT(15, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
58889214fe9SHaiyue Wang IAVF_PTT(16, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
58989214fe9SHaiyue Wang IAVF_PTT(17, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
59089214fe9SHaiyue Wang IAVF_PTT(18, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
59189214fe9SHaiyue Wang IAVF_PTT(19, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
59289214fe9SHaiyue Wang IAVF_PTT(20, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
59389214fe9SHaiyue Wang IAVF_PTT(21, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
59489214fe9SHaiyue Wang
59589214fe9SHaiyue Wang /* Non Tunneled IPv4 */
59689214fe9SHaiyue Wang IAVF_PTT(22, IP, IPV4, FRG, NONE, NONE, NOF, NONE, PAY3),
59789214fe9SHaiyue Wang IAVF_PTT(23, IP, IPV4, NOF, NONE, NONE, NOF, NONE, PAY3),
59889214fe9SHaiyue Wang IAVF_PTT(24, IP, IPV4, NOF, NONE, NONE, NOF, UDP, PAY4),
59989214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(25),
60089214fe9SHaiyue Wang IAVF_PTT(26, IP, IPV4, NOF, NONE, NONE, NOF, TCP, PAY4),
60189214fe9SHaiyue Wang IAVF_PTT(27, IP, IPV4, NOF, NONE, NONE, NOF, SCTP, PAY4),
60289214fe9SHaiyue Wang IAVF_PTT(28, IP, IPV4, NOF, NONE, NONE, NOF, ICMP, PAY4),
60389214fe9SHaiyue Wang
60489214fe9SHaiyue Wang /* IPv4 --> IPv4 */
60589214fe9SHaiyue Wang IAVF_PTT(29, IP, IPV4, NOF, IP_IP, IPV4, FRG, NONE, PAY3),
60689214fe9SHaiyue Wang IAVF_PTT(30, IP, IPV4, NOF, IP_IP, IPV4, NOF, NONE, PAY3),
60789214fe9SHaiyue Wang IAVF_PTT(31, IP, IPV4, NOF, IP_IP, IPV4, NOF, UDP, PAY4),
60889214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(32),
60989214fe9SHaiyue Wang IAVF_PTT(33, IP, IPV4, NOF, IP_IP, IPV4, NOF, TCP, PAY4),
61089214fe9SHaiyue Wang IAVF_PTT(34, IP, IPV4, NOF, IP_IP, IPV4, NOF, SCTP, PAY4),
61189214fe9SHaiyue Wang IAVF_PTT(35, IP, IPV4, NOF, IP_IP, IPV4, NOF, ICMP, PAY4),
61289214fe9SHaiyue Wang
61389214fe9SHaiyue Wang /* IPv4 --> IPv6 */
61489214fe9SHaiyue Wang IAVF_PTT(36, IP, IPV4, NOF, IP_IP, IPV6, FRG, NONE, PAY3),
61589214fe9SHaiyue Wang IAVF_PTT(37, IP, IPV4, NOF, IP_IP, IPV6, NOF, NONE, PAY3),
61689214fe9SHaiyue Wang IAVF_PTT(38, IP, IPV4, NOF, IP_IP, IPV6, NOF, UDP, PAY4),
61789214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(39),
61889214fe9SHaiyue Wang IAVF_PTT(40, IP, IPV4, NOF, IP_IP, IPV6, NOF, TCP, PAY4),
61989214fe9SHaiyue Wang IAVF_PTT(41, IP, IPV4, NOF, IP_IP, IPV6, NOF, SCTP, PAY4),
62089214fe9SHaiyue Wang IAVF_PTT(42, IP, IPV4, NOF, IP_IP, IPV6, NOF, ICMP, PAY4),
62189214fe9SHaiyue Wang
62289214fe9SHaiyue Wang /* IPv4 --> GRE/NAT */
62389214fe9SHaiyue Wang IAVF_PTT(43, IP, IPV4, NOF, IP_GRENAT, NONE, NOF, NONE, PAY3),
62489214fe9SHaiyue Wang
62589214fe9SHaiyue Wang /* IPv4 --> GRE/NAT --> IPv4 */
62689214fe9SHaiyue Wang IAVF_PTT(44, IP, IPV4, NOF, IP_GRENAT, IPV4, FRG, NONE, PAY3),
62789214fe9SHaiyue Wang IAVF_PTT(45, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, NONE, PAY3),
62889214fe9SHaiyue Wang IAVF_PTT(46, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, UDP, PAY4),
62989214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(47),
63089214fe9SHaiyue Wang IAVF_PTT(48, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, TCP, PAY4),
63189214fe9SHaiyue Wang IAVF_PTT(49, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, SCTP, PAY4),
63289214fe9SHaiyue Wang IAVF_PTT(50, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, ICMP, PAY4),
63389214fe9SHaiyue Wang
63489214fe9SHaiyue Wang /* IPv4 --> GRE/NAT --> IPv6 */
63589214fe9SHaiyue Wang IAVF_PTT(51, IP, IPV4, NOF, IP_GRENAT, IPV6, FRG, NONE, PAY3),
63689214fe9SHaiyue Wang IAVF_PTT(52, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, NONE, PAY3),
63789214fe9SHaiyue Wang IAVF_PTT(53, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, UDP, PAY4),
63889214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(54),
63989214fe9SHaiyue Wang IAVF_PTT(55, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, TCP, PAY4),
64089214fe9SHaiyue Wang IAVF_PTT(56, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, SCTP, PAY4),
64189214fe9SHaiyue Wang IAVF_PTT(57, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, ICMP, PAY4),
64289214fe9SHaiyue Wang
64389214fe9SHaiyue Wang /* IPv4 --> GRE/NAT --> MAC */
64489214fe9SHaiyue Wang IAVF_PTT(58, IP, IPV4, NOF, IP_GRENAT_MAC, NONE, NOF, NONE, PAY3),
64589214fe9SHaiyue Wang
64689214fe9SHaiyue Wang /* IPv4 --> GRE/NAT --> MAC --> IPv4 */
64789214fe9SHaiyue Wang IAVF_PTT(59, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, FRG, NONE, PAY3),
64889214fe9SHaiyue Wang IAVF_PTT(60, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, NONE, PAY3),
64989214fe9SHaiyue Wang IAVF_PTT(61, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, UDP, PAY4),
65089214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(62),
65189214fe9SHaiyue Wang IAVF_PTT(63, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, TCP, PAY4),
65289214fe9SHaiyue Wang IAVF_PTT(64, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, SCTP, PAY4),
65389214fe9SHaiyue Wang IAVF_PTT(65, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, ICMP, PAY4),
65489214fe9SHaiyue Wang
65589214fe9SHaiyue Wang /* IPv4 --> GRE/NAT -> MAC --> IPv6 */
65689214fe9SHaiyue Wang IAVF_PTT(66, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, FRG, NONE, PAY3),
65789214fe9SHaiyue Wang IAVF_PTT(67, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, NONE, PAY3),
65889214fe9SHaiyue Wang IAVF_PTT(68, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, UDP, PAY4),
65989214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(69),
66089214fe9SHaiyue Wang IAVF_PTT(70, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, TCP, PAY4),
66189214fe9SHaiyue Wang IAVF_PTT(71, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, SCTP, PAY4),
66289214fe9SHaiyue Wang IAVF_PTT(72, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, ICMP, PAY4),
66389214fe9SHaiyue Wang
66489214fe9SHaiyue Wang /* IPv4 --> GRE/NAT --> MAC/VLAN */
66589214fe9SHaiyue Wang IAVF_PTT(73, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, NONE, NOF, NONE, PAY3),
66689214fe9SHaiyue Wang
66789214fe9SHaiyue Wang /* IPv4 ---> GRE/NAT -> MAC/VLAN --> IPv4 */
66889214fe9SHaiyue Wang IAVF_PTT(74, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, FRG, NONE, PAY3),
66989214fe9SHaiyue Wang IAVF_PTT(75, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, NONE, PAY3),
67089214fe9SHaiyue Wang IAVF_PTT(76, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, UDP, PAY4),
67189214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(77),
67289214fe9SHaiyue Wang IAVF_PTT(78, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, TCP, PAY4),
67389214fe9SHaiyue Wang IAVF_PTT(79, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, SCTP, PAY4),
67489214fe9SHaiyue Wang IAVF_PTT(80, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, ICMP, PAY4),
67589214fe9SHaiyue Wang
67689214fe9SHaiyue Wang /* IPv4 -> GRE/NAT -> MAC/VLAN --> IPv6 */
67789214fe9SHaiyue Wang IAVF_PTT(81, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, FRG, NONE, PAY3),
67889214fe9SHaiyue Wang IAVF_PTT(82, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, NONE, PAY3),
67989214fe9SHaiyue Wang IAVF_PTT(83, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, UDP, PAY4),
68089214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(84),
68189214fe9SHaiyue Wang IAVF_PTT(85, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, TCP, PAY4),
68289214fe9SHaiyue Wang IAVF_PTT(86, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, SCTP, PAY4),
68389214fe9SHaiyue Wang IAVF_PTT(87, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, ICMP, PAY4),
68489214fe9SHaiyue Wang
68589214fe9SHaiyue Wang /* Non Tunneled IPv6 */
68689214fe9SHaiyue Wang IAVF_PTT(88, IP, IPV6, FRG, NONE, NONE, NOF, NONE, PAY3),
68789214fe9SHaiyue Wang IAVF_PTT(89, IP, IPV6, NOF, NONE, NONE, NOF, NONE, PAY3),
68889214fe9SHaiyue Wang IAVF_PTT(90, IP, IPV6, NOF, NONE, NONE, NOF, UDP, PAY4),
68989214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(91),
69089214fe9SHaiyue Wang IAVF_PTT(92, IP, IPV6, NOF, NONE, NONE, NOF, TCP, PAY4),
69189214fe9SHaiyue Wang IAVF_PTT(93, IP, IPV6, NOF, NONE, NONE, NOF, SCTP, PAY4),
69289214fe9SHaiyue Wang IAVF_PTT(94, IP, IPV6, NOF, NONE, NONE, NOF, ICMP, PAY4),
69389214fe9SHaiyue Wang
69489214fe9SHaiyue Wang /* IPv6 --> IPv4 */
69589214fe9SHaiyue Wang IAVF_PTT(95, IP, IPV6, NOF, IP_IP, IPV4, FRG, NONE, PAY3),
69689214fe9SHaiyue Wang IAVF_PTT(96, IP, IPV6, NOF, IP_IP, IPV4, NOF, NONE, PAY3),
69789214fe9SHaiyue Wang IAVF_PTT(97, IP, IPV6, NOF, IP_IP, IPV4, NOF, UDP, PAY4),
69889214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(98),
69989214fe9SHaiyue Wang IAVF_PTT(99, IP, IPV6, NOF, IP_IP, IPV4, NOF, TCP, PAY4),
70089214fe9SHaiyue Wang IAVF_PTT(100, IP, IPV6, NOF, IP_IP, IPV4, NOF, SCTP, PAY4),
70189214fe9SHaiyue Wang IAVF_PTT(101, IP, IPV6, NOF, IP_IP, IPV4, NOF, ICMP, PAY4),
70289214fe9SHaiyue Wang
70389214fe9SHaiyue Wang /* IPv6 --> IPv6 */
70489214fe9SHaiyue Wang IAVF_PTT(102, IP, IPV6, NOF, IP_IP, IPV6, FRG, NONE, PAY3),
70589214fe9SHaiyue Wang IAVF_PTT(103, IP, IPV6, NOF, IP_IP, IPV6, NOF, NONE, PAY3),
70689214fe9SHaiyue Wang IAVF_PTT(104, IP, IPV6, NOF, IP_IP, IPV6, NOF, UDP, PAY4),
70789214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(105),
70889214fe9SHaiyue Wang IAVF_PTT(106, IP, IPV6, NOF, IP_IP, IPV6, NOF, TCP, PAY4),
70989214fe9SHaiyue Wang IAVF_PTT(107, IP, IPV6, NOF, IP_IP, IPV6, NOF, SCTP, PAY4),
71089214fe9SHaiyue Wang IAVF_PTT(108, IP, IPV6, NOF, IP_IP, IPV6, NOF, ICMP, PAY4),
71189214fe9SHaiyue Wang
71289214fe9SHaiyue Wang /* IPv6 --> GRE/NAT */
71389214fe9SHaiyue Wang IAVF_PTT(109, IP, IPV6, NOF, IP_GRENAT, NONE, NOF, NONE, PAY3),
71489214fe9SHaiyue Wang
71589214fe9SHaiyue Wang /* IPv6 --> GRE/NAT -> IPv4 */
71689214fe9SHaiyue Wang IAVF_PTT(110, IP, IPV6, NOF, IP_GRENAT, IPV4, FRG, NONE, PAY3),
71789214fe9SHaiyue Wang IAVF_PTT(111, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, NONE, PAY3),
71889214fe9SHaiyue Wang IAVF_PTT(112, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, UDP, PAY4),
71989214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(113),
72089214fe9SHaiyue Wang IAVF_PTT(114, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, TCP, PAY4),
72189214fe9SHaiyue Wang IAVF_PTT(115, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, SCTP, PAY4),
72289214fe9SHaiyue Wang IAVF_PTT(116, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, ICMP, PAY4),
72389214fe9SHaiyue Wang
72489214fe9SHaiyue Wang /* IPv6 --> GRE/NAT -> IPv6 */
72589214fe9SHaiyue Wang IAVF_PTT(117, IP, IPV6, NOF, IP_GRENAT, IPV6, FRG, NONE, PAY3),
72689214fe9SHaiyue Wang IAVF_PTT(118, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, NONE, PAY3),
72789214fe9SHaiyue Wang IAVF_PTT(119, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, UDP, PAY4),
72889214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(120),
72989214fe9SHaiyue Wang IAVF_PTT(121, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, TCP, PAY4),
73089214fe9SHaiyue Wang IAVF_PTT(122, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, SCTP, PAY4),
73189214fe9SHaiyue Wang IAVF_PTT(123, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, ICMP, PAY4),
73289214fe9SHaiyue Wang
73389214fe9SHaiyue Wang /* IPv6 --> GRE/NAT -> MAC */
73489214fe9SHaiyue Wang IAVF_PTT(124, IP, IPV6, NOF, IP_GRENAT_MAC, NONE, NOF, NONE, PAY3),
73589214fe9SHaiyue Wang
73689214fe9SHaiyue Wang /* IPv6 --> GRE/NAT -> MAC -> IPv4 */
73789214fe9SHaiyue Wang IAVF_PTT(125, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, FRG, NONE, PAY3),
73889214fe9SHaiyue Wang IAVF_PTT(126, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, NONE, PAY3),
73989214fe9SHaiyue Wang IAVF_PTT(127, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, UDP, PAY4),
74089214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(128),
74189214fe9SHaiyue Wang IAVF_PTT(129, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, TCP, PAY4),
74289214fe9SHaiyue Wang IAVF_PTT(130, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, SCTP, PAY4),
74389214fe9SHaiyue Wang IAVF_PTT(131, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, ICMP, PAY4),
74489214fe9SHaiyue Wang
74589214fe9SHaiyue Wang /* IPv6 --> GRE/NAT -> MAC -> IPv6 */
74689214fe9SHaiyue Wang IAVF_PTT(132, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, FRG, NONE, PAY3),
74789214fe9SHaiyue Wang IAVF_PTT(133, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, NONE, PAY3),
74889214fe9SHaiyue Wang IAVF_PTT(134, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, UDP, PAY4),
74989214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(135),
75089214fe9SHaiyue Wang IAVF_PTT(136, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, TCP, PAY4),
75189214fe9SHaiyue Wang IAVF_PTT(137, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, SCTP, PAY4),
75289214fe9SHaiyue Wang IAVF_PTT(138, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, ICMP, PAY4),
75389214fe9SHaiyue Wang
75489214fe9SHaiyue Wang /* IPv6 --> GRE/NAT -> MAC/VLAN */
75589214fe9SHaiyue Wang IAVF_PTT(139, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, NONE, NOF, NONE, PAY3),
75689214fe9SHaiyue Wang
75789214fe9SHaiyue Wang /* IPv6 --> GRE/NAT -> MAC/VLAN --> IPv4 */
75889214fe9SHaiyue Wang IAVF_PTT(140, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, FRG, NONE, PAY3),
75989214fe9SHaiyue Wang IAVF_PTT(141, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, NONE, PAY3),
76089214fe9SHaiyue Wang IAVF_PTT(142, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, UDP, PAY4),
76189214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(143),
76289214fe9SHaiyue Wang IAVF_PTT(144, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, TCP, PAY4),
76389214fe9SHaiyue Wang IAVF_PTT(145, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, SCTP, PAY4),
76489214fe9SHaiyue Wang IAVF_PTT(146, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, ICMP, PAY4),
76589214fe9SHaiyue Wang
76689214fe9SHaiyue Wang /* IPv6 --> GRE/NAT -> MAC/VLAN --> IPv6 */
76789214fe9SHaiyue Wang IAVF_PTT(147, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, FRG, NONE, PAY3),
76889214fe9SHaiyue Wang IAVF_PTT(148, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, NONE, PAY3),
76989214fe9SHaiyue Wang IAVF_PTT(149, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, UDP, PAY4),
77089214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(150),
77189214fe9SHaiyue Wang IAVF_PTT(151, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, TCP, PAY4),
77289214fe9SHaiyue Wang IAVF_PTT(152, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, SCTP, PAY4),
77389214fe9SHaiyue Wang IAVF_PTT(153, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, ICMP, PAY4),
77489214fe9SHaiyue Wang
77589214fe9SHaiyue Wang /* unused entries */
77689214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(154),
77789214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(155),
77889214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(156),
77989214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(157),
78089214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(158),
78189214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(159),
78289214fe9SHaiyue Wang
78389214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(160),
78489214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(161),
78589214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(162),
78689214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(163),
78789214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(164),
78889214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(165),
78989214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(166),
79089214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(167),
79189214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(168),
79289214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(169),
79389214fe9SHaiyue Wang
79489214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(170),
79589214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(171),
79689214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(172),
79789214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(173),
79889214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(174),
79989214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(175),
80089214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(176),
80189214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(177),
80289214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(178),
80389214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(179),
80489214fe9SHaiyue Wang
80589214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(180),
80689214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(181),
80789214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(182),
80889214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(183),
80989214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(184),
81089214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(185),
81189214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(186),
81289214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(187),
81389214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(188),
81489214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(189),
81589214fe9SHaiyue Wang
81689214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(190),
81789214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(191),
81889214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(192),
81989214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(193),
82089214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(194),
82189214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(195),
82289214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(196),
82389214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(197),
82489214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(198),
82589214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(199),
82689214fe9SHaiyue Wang
82789214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(200),
82889214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(201),
82989214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(202),
83089214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(203),
83189214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(204),
83289214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(205),
83389214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(206),
83489214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(207),
83589214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(208),
83689214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(209),
83789214fe9SHaiyue Wang
83889214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(210),
83989214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(211),
84089214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(212),
84189214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(213),
84289214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(214),
84389214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(215),
84489214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(216),
84589214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(217),
84689214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(218),
84789214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(219),
84889214fe9SHaiyue Wang
84989214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(220),
85089214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(221),
85189214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(222),
85289214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(223),
85389214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(224),
85489214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(225),
85589214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(226),
85689214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(227),
85789214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(228),
85889214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(229),
85989214fe9SHaiyue Wang
86089214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(230),
86189214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(231),
86289214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(232),
86389214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(233),
86489214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(234),
86589214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(235),
86689214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(236),
86789214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(237),
86889214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(238),
86989214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(239),
87089214fe9SHaiyue Wang
87189214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(240),
87289214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(241),
87389214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(242),
87489214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(243),
87589214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(244),
87689214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(245),
87789214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(246),
87889214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(247),
87989214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(248),
88089214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(249),
88189214fe9SHaiyue Wang
88289214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(250),
88389214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(251),
88489214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(252),
88589214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(253),
88689214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(254),
88789214fe9SHaiyue Wang IAVF_PTT_UNUSED_ENTRY(255)
88889214fe9SHaiyue Wang };
88989214fe9SHaiyue Wang
89089214fe9SHaiyue Wang /**
89189214fe9SHaiyue Wang * iavf_validate_mac_addr - Validate unicast MAC address
89289214fe9SHaiyue Wang * @mac_addr: pointer to MAC address
89389214fe9SHaiyue Wang *
89489214fe9SHaiyue Wang * Tests a MAC address to ensure it is a valid Individual Address
89589214fe9SHaiyue Wang **/
iavf_validate_mac_addr(u8 * mac_addr)89689214fe9SHaiyue Wang enum iavf_status iavf_validate_mac_addr(u8 *mac_addr)
89789214fe9SHaiyue Wang {
89889214fe9SHaiyue Wang enum iavf_status status = IAVF_SUCCESS;
89989214fe9SHaiyue Wang
90089214fe9SHaiyue Wang DEBUGFUNC("iavf_validate_mac_addr");
90189214fe9SHaiyue Wang
90289214fe9SHaiyue Wang /* Broadcast addresses ARE multicast addresses
90389214fe9SHaiyue Wang * Make sure it is not a multicast address
90489214fe9SHaiyue Wang * Reject the zero address
90589214fe9SHaiyue Wang */
90689214fe9SHaiyue Wang if (IAVF_IS_MULTICAST(mac_addr) ||
90789214fe9SHaiyue Wang (mac_addr[0] == 0 && mac_addr[1] == 0 && mac_addr[2] == 0 &&
90889214fe9SHaiyue Wang mac_addr[3] == 0 && mac_addr[4] == 0 && mac_addr[5] == 0))
90989214fe9SHaiyue Wang status = IAVF_ERR_INVALID_MAC_ADDR;
91089214fe9SHaiyue Wang
91189214fe9SHaiyue Wang return status;
91289214fe9SHaiyue Wang }
91389214fe9SHaiyue Wang
91489214fe9SHaiyue Wang /**
91589214fe9SHaiyue Wang * iavf_aq_send_msg_to_pf
91689214fe9SHaiyue Wang * @hw: pointer to the hardware structure
91789214fe9SHaiyue Wang * @v_opcode: opcodes for VF-PF communication
91889214fe9SHaiyue Wang * @v_retval: return error code
91989214fe9SHaiyue Wang * @msg: pointer to the msg buffer
92089214fe9SHaiyue Wang * @msglen: msg length
92189214fe9SHaiyue Wang * @cmd_details: pointer to command details
92289214fe9SHaiyue Wang *
92389214fe9SHaiyue Wang * Send message to PF driver using admin queue. By default, this message
92489214fe9SHaiyue Wang * is sent asynchronously, i.e. iavf_asq_send_command() does not wait for
92589214fe9SHaiyue Wang * completion before returning.
92689214fe9SHaiyue Wang **/
iavf_aq_send_msg_to_pf(struct iavf_hw * hw,enum virtchnl_ops v_opcode,enum iavf_status v_retval,u8 * msg,u16 msglen,struct iavf_asq_cmd_details * cmd_details)92789214fe9SHaiyue Wang enum iavf_status iavf_aq_send_msg_to_pf(struct iavf_hw *hw,
92889214fe9SHaiyue Wang enum virtchnl_ops v_opcode,
92989214fe9SHaiyue Wang enum iavf_status v_retval,
93089214fe9SHaiyue Wang u8 *msg, u16 msglen,
93189214fe9SHaiyue Wang struct iavf_asq_cmd_details *cmd_details)
93289214fe9SHaiyue Wang {
93389214fe9SHaiyue Wang struct iavf_aq_desc desc;
93489214fe9SHaiyue Wang struct iavf_asq_cmd_details details;
93589214fe9SHaiyue Wang enum iavf_status status;
93689214fe9SHaiyue Wang
93789214fe9SHaiyue Wang iavf_fill_default_direct_cmd_desc(&desc, iavf_aqc_opc_send_msg_to_pf);
93889214fe9SHaiyue Wang desc.flags |= CPU_TO_LE16((u16)IAVF_AQ_FLAG_SI);
93989214fe9SHaiyue Wang desc.cookie_high = CPU_TO_LE32(v_opcode);
94089214fe9SHaiyue Wang desc.cookie_low = CPU_TO_LE32(v_retval);
94189214fe9SHaiyue Wang if (msglen) {
94289214fe9SHaiyue Wang desc.flags |= CPU_TO_LE16((u16)(IAVF_AQ_FLAG_BUF
94389214fe9SHaiyue Wang | IAVF_AQ_FLAG_RD));
94489214fe9SHaiyue Wang if (msglen > IAVF_AQ_LARGE_BUF)
94589214fe9SHaiyue Wang desc.flags |= CPU_TO_LE16((u16)IAVF_AQ_FLAG_LB);
94689214fe9SHaiyue Wang desc.datalen = CPU_TO_LE16(msglen);
94789214fe9SHaiyue Wang }
94889214fe9SHaiyue Wang if (!cmd_details) {
94989214fe9SHaiyue Wang iavf_memset(&details, 0, sizeof(details), IAVF_NONDMA_MEM);
95089214fe9SHaiyue Wang details.async = true;
95189214fe9SHaiyue Wang cmd_details = &details;
95289214fe9SHaiyue Wang }
95389214fe9SHaiyue Wang status = iavf_asq_send_command(hw, (struct iavf_aq_desc *)&desc, msg,
95489214fe9SHaiyue Wang msglen, cmd_details);
95589214fe9SHaiyue Wang return status;
95689214fe9SHaiyue Wang }
95789214fe9SHaiyue Wang
95889214fe9SHaiyue Wang /**
95989214fe9SHaiyue Wang * iavf_vf_parse_hw_config
96089214fe9SHaiyue Wang * @hw: pointer to the hardware structure
96189214fe9SHaiyue Wang * @msg: pointer to the virtual channel VF resource structure
96289214fe9SHaiyue Wang *
96389214fe9SHaiyue Wang * Given a VF resource message from the PF, populate the hw struct
96489214fe9SHaiyue Wang * with appropriate information.
96589214fe9SHaiyue Wang **/
iavf_vf_parse_hw_config(struct iavf_hw * hw,struct virtchnl_vf_resource * msg)96689214fe9SHaiyue Wang void iavf_vf_parse_hw_config(struct iavf_hw *hw,
96789214fe9SHaiyue Wang struct virtchnl_vf_resource *msg)
96889214fe9SHaiyue Wang {
96989214fe9SHaiyue Wang struct virtchnl_vsi_resource *vsi_res;
97089214fe9SHaiyue Wang int i;
97189214fe9SHaiyue Wang
97289214fe9SHaiyue Wang vsi_res = &msg->vsi_res[0];
97389214fe9SHaiyue Wang
97489214fe9SHaiyue Wang hw->dev_caps.num_vsis = msg->num_vsis;
97589214fe9SHaiyue Wang hw->dev_caps.num_rx_qp = msg->num_queue_pairs;
97689214fe9SHaiyue Wang hw->dev_caps.num_tx_qp = msg->num_queue_pairs;
97789214fe9SHaiyue Wang hw->dev_caps.num_msix_vectors_vf = msg->max_vectors;
97889214fe9SHaiyue Wang hw->dev_caps.dcb = msg->vf_cap_flags &
97989214fe9SHaiyue Wang VIRTCHNL_VF_OFFLOAD_L2;
98039ced0c8SQi Zhang hw->dev_caps.max_mtu = msg->max_mtu;
98189214fe9SHaiyue Wang for (i = 0; i < msg->num_vsis; i++) {
98289214fe9SHaiyue Wang if (vsi_res->vsi_type == VIRTCHNL_VSI_SRIOV) {
98389214fe9SHaiyue Wang iavf_memcpy(hw->mac.perm_addr,
98489214fe9SHaiyue Wang vsi_res->default_mac_addr,
98589214fe9SHaiyue Wang ETH_ALEN,
98689214fe9SHaiyue Wang IAVF_NONDMA_TO_NONDMA);
98789214fe9SHaiyue Wang iavf_memcpy(hw->mac.addr, vsi_res->default_mac_addr,
98889214fe9SHaiyue Wang ETH_ALEN,
98989214fe9SHaiyue Wang IAVF_NONDMA_TO_NONDMA);
99089214fe9SHaiyue Wang }
99189214fe9SHaiyue Wang vsi_res++;
99289214fe9SHaiyue Wang }
99389214fe9SHaiyue Wang }
99489214fe9SHaiyue Wang
99589214fe9SHaiyue Wang /**
99689214fe9SHaiyue Wang * iavf_vf_reset
99789214fe9SHaiyue Wang * @hw: pointer to the hardware structure
99889214fe9SHaiyue Wang *
99989214fe9SHaiyue Wang * Send a VF_RESET message to the PF. Does not wait for response from PF
100089214fe9SHaiyue Wang * as none will be forthcoming. Immediately after calling this function,
100189214fe9SHaiyue Wang * the admin queue should be shut down and (optionally) reinitialized.
100289214fe9SHaiyue Wang **/
iavf_vf_reset(struct iavf_hw * hw)100389214fe9SHaiyue Wang enum iavf_status iavf_vf_reset(struct iavf_hw *hw)
100489214fe9SHaiyue Wang {
100589214fe9SHaiyue Wang return iavf_aq_send_msg_to_pf(hw, VIRTCHNL_OP_RESET_VF,
100689214fe9SHaiyue Wang IAVF_SUCCESS, NULL, 0, NULL);
100789214fe9SHaiyue Wang }
100889214fe9SHaiyue Wang
100989214fe9SHaiyue Wang /**
101089214fe9SHaiyue Wang * iavf_aq_clear_all_wol_filters
101189214fe9SHaiyue Wang * @hw: pointer to the hw struct
101289214fe9SHaiyue Wang * @cmd_details: pointer to command details structure or NULL
101389214fe9SHaiyue Wang *
101489214fe9SHaiyue Wang * Get information for the reason of a Wake Up event
101589214fe9SHaiyue Wang **/
iavf_aq_clear_all_wol_filters(struct iavf_hw * hw,struct iavf_asq_cmd_details * cmd_details)101689214fe9SHaiyue Wang enum iavf_status iavf_aq_clear_all_wol_filters(struct iavf_hw *hw,
101789214fe9SHaiyue Wang struct iavf_asq_cmd_details *cmd_details)
101889214fe9SHaiyue Wang {
101989214fe9SHaiyue Wang struct iavf_aq_desc desc;
102089214fe9SHaiyue Wang enum iavf_status status;
102189214fe9SHaiyue Wang
102289214fe9SHaiyue Wang iavf_fill_default_direct_cmd_desc(&desc,
102389214fe9SHaiyue Wang iavf_aqc_opc_clear_all_wol_filters);
102489214fe9SHaiyue Wang
102589214fe9SHaiyue Wang status = iavf_asq_send_command(hw, &desc, NULL, 0, cmd_details);
102689214fe9SHaiyue Wang
102789214fe9SHaiyue Wang return status;
102889214fe9SHaiyue Wang }
1029