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