19d26e4fcSRobert Mustacchi /******************************************************************************
29d26e4fcSRobert Mustacchi 
3*df36e06dSRobert Mustacchi   Copyright (c) 2013-2018, Intel Corporation
49d26e4fcSRobert Mustacchi   All rights reserved.
59d26e4fcSRobert Mustacchi 
69d26e4fcSRobert Mustacchi   Redistribution and use in source and binary forms, with or without
79d26e4fcSRobert Mustacchi   modification, are permitted provided that the following conditions are met:
89d26e4fcSRobert Mustacchi 
99d26e4fcSRobert Mustacchi    1. Redistributions of source code must retain the above copyright notice,
109d26e4fcSRobert Mustacchi       this list of conditions and the following disclaimer.
119d26e4fcSRobert Mustacchi 
129d26e4fcSRobert Mustacchi    2. Redistributions in binary form must reproduce the above copyright
139d26e4fcSRobert Mustacchi       notice, this list of conditions and the following disclaimer in the
149d26e4fcSRobert Mustacchi       documentation and/or other materials provided with the distribution.
159d26e4fcSRobert Mustacchi 
169d26e4fcSRobert Mustacchi    3. Neither the name of the Intel Corporation nor the names of its
179d26e4fcSRobert Mustacchi       contributors may be used to endorse or promote products derived from
189d26e4fcSRobert Mustacchi       this software without specific prior written permission.
199d26e4fcSRobert Mustacchi 
209d26e4fcSRobert Mustacchi   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
219d26e4fcSRobert Mustacchi   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
229d26e4fcSRobert Mustacchi   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
239d26e4fcSRobert Mustacchi   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
249d26e4fcSRobert Mustacchi   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
259d26e4fcSRobert Mustacchi   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
269d26e4fcSRobert Mustacchi   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
279d26e4fcSRobert Mustacchi   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
289d26e4fcSRobert Mustacchi   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
299d26e4fcSRobert Mustacchi   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
309d26e4fcSRobert Mustacchi   POSSIBILITY OF SUCH DAMAGE.
319d26e4fcSRobert Mustacchi 
329d26e4fcSRobert Mustacchi ******************************************************************************/
333d75a287SRobert Mustacchi /*$FreeBSD$*/
349d26e4fcSRobert Mustacchi 
359d26e4fcSRobert Mustacchi #include "i40e_type.h"
369d26e4fcSRobert Mustacchi #include "i40e_adminq.h"
379d26e4fcSRobert Mustacchi #include "i40e_prototype.h"
3893f1cac5SPaul Winder #include "virtchnl.h"
399d26e4fcSRobert Mustacchi 
409d26e4fcSRobert Mustacchi 
419d26e4fcSRobert Mustacchi /**
429d26e4fcSRobert Mustacchi  * i40e_set_mac_type - Sets MAC type
439d26e4fcSRobert Mustacchi  * @hw: pointer to the HW structure
449d26e4fcSRobert Mustacchi  *
459d26e4fcSRobert Mustacchi  * This function sets the mac type of the adapter based on the
469d26e4fcSRobert Mustacchi  * vendor ID and device ID stored in the hw structure.
479d26e4fcSRobert Mustacchi  **/
i40e_set_mac_type(struct i40e_hw * hw)48*df36e06dSRobert Mustacchi enum i40e_status_code i40e_set_mac_type(struct i40e_hw *hw)
499d26e4fcSRobert Mustacchi {
509d26e4fcSRobert Mustacchi 	enum i40e_status_code status = I40E_SUCCESS;
519d26e4fcSRobert Mustacchi 
529d26e4fcSRobert Mustacchi 	DEBUGFUNC("i40e_set_mac_type\n");
539d26e4fcSRobert Mustacchi 
549d26e4fcSRobert Mustacchi 	if (hw->vendor_id == I40E_INTEL_VENDOR_ID) {
559d26e4fcSRobert Mustacchi 		switch (hw->device_id) {
569d26e4fcSRobert Mustacchi 		case I40E_DEV_ID_SFP_XL710:
579d26e4fcSRobert Mustacchi 		case I40E_DEV_ID_QEMU:
589d26e4fcSRobert Mustacchi 		case I40E_DEV_ID_KX_B:
599d26e4fcSRobert Mustacchi 		case I40E_DEV_ID_KX_C:
609d26e4fcSRobert Mustacchi 		case I40E_DEV_ID_QSFP_A:
619d26e4fcSRobert Mustacchi 		case I40E_DEV_ID_QSFP_B:
629d26e4fcSRobert Mustacchi 		case I40E_DEV_ID_QSFP_C:
639d26e4fcSRobert Mustacchi 		case I40E_DEV_ID_10G_BASE_T:
649d26e4fcSRobert Mustacchi 		case I40E_DEV_ID_10G_BASE_T4:
65*df36e06dSRobert Mustacchi 		case I40E_DEV_ID_10G_BASE_T_BC:
66*df36e06dSRobert Mustacchi 		case I40E_DEV_ID_10G_B:
67*df36e06dSRobert Mustacchi 		case I40E_DEV_ID_10G_SFP:
68*df36e06dSRobert Mustacchi 		case I40E_DEV_ID_5G_BASE_T_BC:
699d26e4fcSRobert Mustacchi 		case I40E_DEV_ID_20G_KR2:
709d26e4fcSRobert Mustacchi 		case I40E_DEV_ID_20G_KR2_A:
713d75a287SRobert Mustacchi 		case I40E_DEV_ID_25G_B:
723d75a287SRobert Mustacchi 		case I40E_DEV_ID_25G_SFP28:
73*df36e06dSRobert Mustacchi 		case I40E_DEV_ID_X710_N3000:
74*df36e06dSRobert Mustacchi 		case I40E_DEV_ID_XXV710_N3000:
759d26e4fcSRobert Mustacchi 			hw->mac.type = I40E_MAC_XL710;
769d26e4fcSRobert Mustacchi 			break;
773d75a287SRobert Mustacchi 		case I40E_DEV_ID_KX_X722:
783d75a287SRobert Mustacchi 		case I40E_DEV_ID_QSFP_X722:
799d26e4fcSRobert Mustacchi 		case I40E_DEV_ID_SFP_X722:
809d26e4fcSRobert Mustacchi 		case I40E_DEV_ID_1G_BASE_T_X722:
819d26e4fcSRobert Mustacchi 		case I40E_DEV_ID_10G_BASE_T_X722:
823d75a287SRobert Mustacchi 		case I40E_DEV_ID_SFP_I_X722:
839d26e4fcSRobert Mustacchi 			hw->mac.type = I40E_MAC_X722;
849d26e4fcSRobert Mustacchi 			break;
85*df36e06dSRobert Mustacchi 		case I40E_DEV_ID_X722_VF:
86*df36e06dSRobert Mustacchi 			hw->mac.type = I40E_MAC_X722_VF;
87*df36e06dSRobert Mustacchi 			break;
88*df36e06dSRobert Mustacchi 		case I40E_DEV_ID_VF:
89*df36e06dSRobert Mustacchi 		case I40E_DEV_ID_VF_HV:
90*df36e06dSRobert Mustacchi 		case I40E_DEV_ID_ADAPTIVE_VF:
91*df36e06dSRobert Mustacchi 			hw->mac.type = I40E_MAC_VF;
92*df36e06dSRobert Mustacchi 			break;
939d26e4fcSRobert Mustacchi 		default:
949d26e4fcSRobert Mustacchi 			hw->mac.type = I40E_MAC_GENERIC;
959d26e4fcSRobert Mustacchi 			break;
969d26e4fcSRobert Mustacchi 		}
979d26e4fcSRobert Mustacchi 	} else {
989d26e4fcSRobert Mustacchi 		status = I40E_ERR_DEVICE_NOT_SUPPORTED;
999d26e4fcSRobert Mustacchi 	}
1009d26e4fcSRobert Mustacchi 
1019d26e4fcSRobert Mustacchi 	DEBUGOUT2("i40e_set_mac_type found mac: %d, returns: %d\n",
1029d26e4fcSRobert Mustacchi 		  hw->mac.type, status);
1039d26e4fcSRobert Mustacchi 	return status;
1049d26e4fcSRobert Mustacchi }
1059d26e4fcSRobert Mustacchi 
1069d26e4fcSRobert Mustacchi /**
1079d26e4fcSRobert Mustacchi  * i40e_aq_str - convert AQ err code to a string
1089d26e4fcSRobert Mustacchi  * @hw: pointer to the HW structure
1099d26e4fcSRobert Mustacchi  * @aq_err: the AQ error code to convert
1109d26e4fcSRobert Mustacchi  **/
i40e_aq_str(struct i40e_hw * hw,enum i40e_admin_queue_err aq_err)1113d75a287SRobert Mustacchi const char *i40e_aq_str(struct i40e_hw *hw, enum i40e_admin_queue_err aq_err)
1129d26e4fcSRobert Mustacchi {
1139d26e4fcSRobert Mustacchi 	switch (aq_err) {
1149d26e4fcSRobert Mustacchi 	case I40E_AQ_RC_OK:
1159d26e4fcSRobert Mustacchi 		return "OK";
1169d26e4fcSRobert Mustacchi 	case I40E_AQ_RC_EPERM:
1179d26e4fcSRobert Mustacchi 		return "I40E_AQ_RC_EPERM";
1189d26e4fcSRobert Mustacchi 	case I40E_AQ_RC_ENOENT:
1199d26e4fcSRobert Mustacchi 		return "I40E_AQ_RC_ENOENT";
1209d26e4fcSRobert Mustacchi 	case I40E_AQ_RC_ESRCH:
1219d26e4fcSRobert Mustacchi 		return "I40E_AQ_RC_ESRCH";
1229d26e4fcSRobert Mustacchi 	case I40E_AQ_RC_EINTR:
1239d26e4fcSRobert Mustacchi 		return "I40E_AQ_RC_EINTR";
1249d26e4fcSRobert Mustacchi 	case I40E_AQ_RC_EIO:
1259d26e4fcSRobert Mustacchi 		return "I40E_AQ_RC_EIO";
1269d26e4fcSRobert Mustacchi 	case I40E_AQ_RC_ENXIO:
1279d26e4fcSRobert Mustacchi 		return "I40E_AQ_RC_ENXIO";
1289d26e4fcSRobert Mustacchi 	case I40E_AQ_RC_E2BIG:
1299d26e4fcSRobert Mustacchi 		return "I40E_AQ_RC_E2BIG";
1309d26e4fcSRobert Mustacchi 	case I40E_AQ_RC_EAGAIN:
1319d26e4fcSRobert Mustacchi 		return "I40E_AQ_RC_EAGAIN";
1329d26e4fcSRobert Mustacchi 	case I40E_AQ_RC_ENOMEM:
1339d26e4fcSRobert Mustacchi 		return "I40E_AQ_RC_ENOMEM";
1349d26e4fcSRobert Mustacchi 	case I40E_AQ_RC_EACCES:
1359d26e4fcSRobert Mustacchi 		return "I40E_AQ_RC_EACCES";
1369d26e4fcSRobert Mustacchi 	case I40E_AQ_RC_EFAULT:
1379d26e4fcSRobert Mustacchi 		return "I40E_AQ_RC_EFAULT";
1389d26e4fcSRobert Mustacchi 	case I40E_AQ_RC_EBUSY:
1399d26e4fcSRobert Mustacchi 		return "I40E_AQ_RC_EBUSY";
1409d26e4fcSRobert Mustacchi 	case I40E_AQ_RC_EEXIST:
1419d26e4fcSRobert Mustacchi 		return "I40E_AQ_RC_EEXIST";
1429d26e4fcSRobert Mustacchi 	case I40E_AQ_RC_EINVAL:
1439d26e4fcSRobert Mustacchi 		return "I40E_AQ_RC_EINVAL";
1449d26e4fcSRobert Mustacchi 	case I40E_AQ_RC_ENOTTY:
1459d26e4fcSRobert Mustacchi 		return "I40E_AQ_RC_ENOTTY";
1469d26e4fcSRobert Mustacchi 	case I40E_AQ_RC_ENOSPC:
1479d26e4fcSRobert Mustacchi 		return "I40E_AQ_RC_ENOSPC";
1489d26e4fcSRobert Mustacchi 	case I40E_AQ_RC_ENOSYS:
1499d26e4fcSRobert Mustacchi 		return "I40E_AQ_RC_ENOSYS";
1509d26e4fcSRobert Mustacchi 	case I40E_AQ_RC_ERANGE:
1519d26e4fcSRobert Mustacchi 		return "I40E_AQ_RC_ERANGE";
1529d26e4fcSRobert Mustacchi 	case I40E_AQ_RC_EFLUSHED:
1539d26e4fcSRobert Mustacchi 		return "I40E_AQ_RC_EFLUSHED";
1549d26e4fcSRobert Mustacchi 	case I40E_AQ_RC_BAD_ADDR:
1559d26e4fcSRobert Mustacchi 		return "I40E_AQ_RC_BAD_ADDR";
1569d26e4fcSRobert Mustacchi 	case I40E_AQ_RC_EMODE:
1579d26e4fcSRobert Mustacchi 		return "I40E_AQ_RC_EMODE";
1589d26e4fcSRobert Mustacchi 	case I40E_AQ_RC_EFBIG:
1599d26e4fcSRobert Mustacchi 		return "I40E_AQ_RC_EFBIG";
1609d26e4fcSRobert Mustacchi 	}
1619d26e4fcSRobert Mustacchi 
1629d26e4fcSRobert Mustacchi 	snprintf(hw->err_str, sizeof(hw->err_str), "%d", aq_err);
1639d26e4fcSRobert Mustacchi 	return hw->err_str;
1649d26e4fcSRobert Mustacchi }
1659d26e4fcSRobert Mustacchi 
1669d26e4fcSRobert Mustacchi /**
1679d26e4fcSRobert Mustacchi  * i40e_stat_str - convert status err code to a string
1689d26e4fcSRobert Mustacchi  * @hw: pointer to the HW structure
1699d26e4fcSRobert Mustacchi  * @stat_err: the status error code to convert
1709d26e4fcSRobert Mustacchi  **/
i40e_stat_str(struct i40e_hw * hw,enum i40e_status_code stat_err)1713d75a287SRobert Mustacchi const char *i40e_stat_str(struct i40e_hw *hw, enum i40e_status_code stat_err)
1729d26e4fcSRobert Mustacchi {
1739d26e4fcSRobert Mustacchi 	switch (stat_err) {
1749d26e4fcSRobert Mustacchi 	case I40E_SUCCESS:
1759d26e4fcSRobert Mustacchi 		return "OK";
1769d26e4fcSRobert Mustacchi 	case I40E_ERR_NVM:
1779d26e4fcSRobert Mustacchi 		return "I40E_ERR_NVM";
1789d26e4fcSRobert Mustacchi 	case I40E_ERR_NVM_CHECKSUM:
1799d26e4fcSRobert Mustacchi 		return "I40E_ERR_NVM_CHECKSUM";
1809d26e4fcSRobert Mustacchi 	case I40E_ERR_PHY:
1819d26e4fcSRobert Mustacchi 		return "I40E_ERR_PHY";
1829d26e4fcSRobert Mustacchi 	case I40E_ERR_CONFIG:
1839d26e4fcSRobert Mustacchi 		return "I40E_ERR_CONFIG";
1849d26e4fcSRobert Mustacchi 	case I40E_ERR_PARAM:
1859d26e4fcSRobert Mustacchi 		return "I40E_ERR_PARAM";
1869d26e4fcSRobert Mustacchi 	case I40E_ERR_MAC_TYPE:
1879d26e4fcSRobert Mustacchi 		return "I40E_ERR_MAC_TYPE";
1889d26e4fcSRobert Mustacchi 	case I40E_ERR_UNKNOWN_PHY:
1899d26e4fcSRobert Mustacchi 		return "I40E_ERR_UNKNOWN_PHY";
1909d26e4fcSRobert Mustacchi 	case I40E_ERR_LINK_SETUP:
1919d26e4fcSRobert Mustacchi 		return "I40E_ERR_LINK_SETUP";
1929d26e4fcSRobert Mustacchi 	case I40E_ERR_ADAPTER_STOPPED:
1939d26e4fcSRobert Mustacchi 		return "I40E_ERR_ADAPTER_STOPPED";
1949d26e4fcSRobert Mustacchi 	case I40E_ERR_INVALID_MAC_ADDR:
1959d26e4fcSRobert Mustacchi 		return "I40E_ERR_INVALID_MAC_ADDR";
1969d26e4fcSRobert Mustacchi 	case I40E_ERR_DEVICE_NOT_SUPPORTED:
1979d26e4fcSRobert Mustacchi 		return "I40E_ERR_DEVICE_NOT_SUPPORTED";
1989d26e4fcSRobert Mustacchi 	case I40E_ERR_MASTER_REQUESTS_PENDING:
1999d26e4fcSRobert Mustacchi 		return "I40E_ERR_MASTER_REQUESTS_PENDING";
2009d26e4fcSRobert Mustacchi 	case I40E_ERR_INVALID_LINK_SETTINGS:
2019d26e4fcSRobert Mustacchi 		return "I40E_ERR_INVALID_LINK_SETTINGS";
2029d26e4fcSRobert Mustacchi 	case I40E_ERR_AUTONEG_NOT_COMPLETE:
2039d26e4fcSRobert Mustacchi 		return "I40E_ERR_AUTONEG_NOT_COMPLETE";
2049d26e4fcSRobert Mustacchi 	case I40E_ERR_RESET_FAILED:
2059d26e4fcSRobert Mustacchi 		return "I40E_ERR_RESET_FAILED";
2069d26e4fcSRobert Mustacchi 	case I40E_ERR_SWFW_SYNC:
2079d26e4fcSRobert Mustacchi 		return "I40E_ERR_SWFW_SYNC";
2089d26e4fcSRobert Mustacchi 	case I40E_ERR_NO_AVAILABLE_VSI:
2099d26e4fcSRobert Mustacchi 		return "I40E_ERR_NO_AVAILABLE_VSI";
2109d26e4fcSRobert Mustacchi 	case I40E_ERR_NO_MEMORY:
2119d26e4fcSRobert Mustacchi 		return "I40E_ERR_NO_MEMORY";
2129d26e4fcSRobert Mustacchi 	case I40E_ERR_BAD_PTR:
2139d26e4fcSRobert Mustacchi 		return "I40E_ERR_BAD_PTR";
2149d26e4fcSRobert Mustacchi 	case I40E_ERR_RING_FULL:
2159d26e4fcSRobert Mustacchi 		return "I40E_ERR_RING_FULL";
2169d26e4fcSRobert Mustacchi 	case I40E_ERR_INVALID_PD_ID:
2179d26e4fcSRobert Mustacchi 		return "I40E_ERR_INVALID_PD_ID";
2189d26e4fcSRobert Mustacchi 	case I40E_ERR_INVALID_QP_ID:
2199d26e4fcSRobert Mustacchi 		return "I40E_ERR_INVALID_QP_ID";
2209d26e4fcSRobert Mustacchi 	case I40E_ERR_INVALID_CQ_ID:
2219d26e4fcSRobert Mustacchi 		return "I40E_ERR_INVALID_CQ_ID";
2229d26e4fcSRobert Mustacchi 	case I40E_ERR_INVALID_CEQ_ID:
2239d26e4fcSRobert Mustacchi 		return "I40E_ERR_INVALID_CEQ_ID";
2249d26e4fcSRobert Mustacchi 	case I40E_ERR_INVALID_AEQ_ID:
2259d26e4fcSRobert Mustacchi 		return "I40E_ERR_INVALID_AEQ_ID";
2269d26e4fcSRobert Mustacchi 	case I40E_ERR_INVALID_SIZE:
2279d26e4fcSRobert Mustacchi 		return "I40E_ERR_INVALID_SIZE";
2289d26e4fcSRobert Mustacchi 	case I40E_ERR_INVALID_ARP_INDEX:
2299d26e4fcSRobert Mustacchi 		return "I40E_ERR_INVALID_ARP_INDEX";
2309d26e4fcSRobert Mustacchi 	case I40E_ERR_INVALID_FPM_FUNC_ID:
2319d26e4fcSRobert Mustacchi 		return "I40E_ERR_INVALID_FPM_FUNC_ID";
2329d26e4fcSRobert Mustacchi 	case I40E_ERR_QP_INVALID_MSG_SIZE:
2339d26e4fcSRobert Mustacchi 		return "I40E_ERR_QP_INVALID_MSG_SIZE";
2349d26e4fcSRobert Mustacchi 	case I40E_ERR_QP_TOOMANY_WRS_POSTED:
2359d26e4fcSRobert Mustacchi 		return "I40E_ERR_QP_TOOMANY_WRS_POSTED";
2369d26e4fcSRobert Mustacchi 	case I40E_ERR_INVALID_FRAG_COUNT:
2379d26e4fcSRobert Mustacchi 		return "I40E_ERR_INVALID_FRAG_COUNT";
2389d26e4fcSRobert Mustacchi 	case I40E_ERR_QUEUE_EMPTY:
2399d26e4fcSRobert Mustacchi 		return "I40E_ERR_QUEUE_EMPTY";
2409d26e4fcSRobert Mustacchi 	case I40E_ERR_INVALID_ALIGNMENT:
2419d26e4fcSRobert Mustacchi 		return "I40E_ERR_INVALID_ALIGNMENT";
2429d26e4fcSRobert Mustacchi 	case I40E_ERR_FLUSHED_QUEUE:
2439d26e4fcSRobert Mustacchi 		return "I40E_ERR_FLUSHED_QUEUE";
2449d26e4fcSRobert Mustacchi 	case I40E_ERR_INVALID_PUSH_PAGE_INDEX:
2459d26e4fcSRobert Mustacchi 		return "I40E_ERR_INVALID_PUSH_PAGE_INDEX";
2469d26e4fcSRobert Mustacchi 	case I40E_ERR_INVALID_IMM_DATA_SIZE:
2479d26e4fcSRobert Mustacchi 		return "I40E_ERR_INVALID_IMM_DATA_SIZE";
2489d26e4fcSRobert Mustacchi 	case I40E_ERR_TIMEOUT:
2499d26e4fcSRobert Mustacchi 		return "I40E_ERR_TIMEOUT";
2509d26e4fcSRobert Mustacchi 	case I40E_ERR_OPCODE_MISMATCH:
2519d26e4fcSRobert Mustacchi 		return "I40E_ERR_OPCODE_MISMATCH";
2529d26e4fcSRobert Mustacchi 	case I40E_ERR_CQP_COMPL_ERROR:
2539d26e4fcSRobert Mustacchi 		return "I40E_ERR_CQP_COMPL_ERROR";
2549d26e4fcSRobert Mustacchi 	case I40E_ERR_INVALID_VF_ID:
2559d26e4fcSRobert Mustacchi 		return "I40E_ERR_INVALID_VF_ID";
2569d26e4fcSRobert Mustacchi 	case I40E_ERR_INVALID_HMCFN_ID:
2579d26e4fcSRobert Mustacchi 		return "I40E_ERR_INVALID_HMCFN_ID";
2589d26e4fcSRobert Mustacchi 	case I40E_ERR_BACKING_PAGE_ERROR:
2599d26e4fcSRobert Mustacchi 		return "I40E_ERR_BACKING_PAGE_ERROR";
2609d26e4fcSRobert Mustacchi 	case I40E_ERR_NO_PBLCHUNKS_AVAILABLE:
2619d26e4fcSRobert Mustacchi 		return "I40E_ERR_NO_PBLCHUNKS_AVAILABLE";
2629d26e4fcSRobert Mustacchi 	case I40E_ERR_INVALID_PBLE_INDEX:
2639d26e4fcSRobert Mustacchi 		return "I40E_ERR_INVALID_PBLE_INDEX";
2649d26e4fcSRobert Mustacchi 	case I40E_ERR_INVALID_SD_INDEX:
2659d26e4fcSRobert Mustacchi 		return "I40E_ERR_INVALID_SD_INDEX";
2669d26e4fcSRobert Mustacchi 	case I40E_ERR_INVALID_PAGE_DESC_INDEX:
2679d26e4fcSRobert Mustacchi 		return "I40E_ERR_INVALID_PAGE_DESC_INDEX";
2689d26e4fcSRobert Mustacchi 	case I40E_ERR_INVALID_SD_TYPE:
2699d26e4fcSRobert Mustacchi 		return "I40E_ERR_INVALID_SD_TYPE";
2709d26e4fcSRobert Mustacchi 	case I40E_ERR_MEMCPY_FAILED:
2719d26e4fcSRobert Mustacchi 		return "I40E_ERR_MEMCPY_FAILED";
2729d26e4fcSRobert Mustacchi 	case I40E_ERR_INVALID_HMC_OBJ_INDEX:
2739d26e4fcSRobert Mustacchi 		return "I40E_ERR_INVALID_HMC_OBJ_INDEX";
2749d26e4fcSRobert Mustacchi 	case I40E_ERR_INVALID_HMC_OBJ_COUNT:
2759d26e4fcSRobert Mustacchi 		return "I40E_ERR_INVALID_HMC_OBJ_COUNT";
2769d26e4fcSRobert Mustacchi 	case I40E_ERR_INVALID_SRQ_ARM_LIMIT:
2779d26e4fcSRobert Mustacchi 		return "I40E_ERR_INVALID_SRQ_ARM_LIMIT";
2789d26e4fcSRobert Mustacchi 	case I40E_ERR_SRQ_ENABLED:
2799d26e4fcSRobert Mustacchi 		return "I40E_ERR_SRQ_ENABLED";
2809d26e4fcSRobert Mustacchi 	case I40E_ERR_ADMIN_QUEUE_ERROR:
2819d26e4fcSRobert Mustacchi 		return "I40E_ERR_ADMIN_QUEUE_ERROR";
2829d26e4fcSRobert Mustacchi 	case I40E_ERR_ADMIN_QUEUE_TIMEOUT:
2839d26e4fcSRobert Mustacchi 		return "I40E_ERR_ADMIN_QUEUE_TIMEOUT";
2849d26e4fcSRobert Mustacchi 	case I40E_ERR_BUF_TOO_SHORT:
2859d26e4fcSRobert Mustacchi 		return "I40E_ERR_BUF_TOO_SHORT";
2869d26e4fcSRobert Mustacchi 	case I40E_ERR_ADMIN_QUEUE_FULL:
2879d26e4fcSRobert Mustacchi 		return "I40E_ERR_ADMIN_QUEUE_FULL";
2889d26e4fcSRobert Mustacchi 	case I40E_ERR_ADMIN_QUEUE_NO_WORK:
2899d26e4fcSRobert Mustacchi 		return "I40E_ERR_ADMIN_QUEUE_NO_WORK";
2909d26e4fcSRobert Mustacchi 	case I40E_ERR_BAD_IWARP_CQE:
2919d26e4fcSRobert Mustacchi 		return "I40E_ERR_BAD_IWARP_CQE";
2929d26e4fcSRobert Mustacchi 	case I40E_ERR_NVM_BLANK_MODE:
2939d26e4fcSRobert Mustacchi 		return "I40E_ERR_NVM_BLANK_MODE";
2949d26e4fcSRobert Mustacchi 	case I40E_ERR_NOT_IMPLEMENTED:
2959d26e4fcSRobert Mustacchi 		return "I40E_ERR_NOT_IMPLEMENTED";
2969d26e4fcSRobert Mustacchi 	case I40E_ERR_PE_DOORBELL_NOT_ENABLED:
2979d26e4fcSRobert Mustacchi 		return "I40E_ERR_PE_DOORBELL_NOT_ENABLED";
2989d26e4fcSRobert Mustacchi 	case I40E_ERR_DIAG_TEST_FAILED:
2999d26e4fcSRobert Mustacchi 		return "I40E_ERR_DIAG_TEST_FAILED";
3009d26e4fcSRobert Mustacchi 	case I40E_ERR_NOT_READY:
3019d26e4fcSRobert Mustacchi 		return "I40E_ERR_NOT_READY";
3029d26e4fcSRobert Mustacchi 	case I40E_NOT_SUPPORTED:
3039d26e4fcSRobert Mustacchi 		return "I40E_NOT_SUPPORTED";
3049d26e4fcSRobert Mustacchi 	case I40E_ERR_FIRMWARE_API_VERSION:
3059d26e4fcSRobert Mustacchi 		return "I40E_ERR_FIRMWARE_API_VERSION";
30693f1cac5SPaul Winder 	case I40E_ERR_ADMIN_QUEUE_CRITICAL_ERROR:
30793f1cac5SPaul Winder 		return "I40E_ERR_ADMIN_QUEUE_CRITICAL_ERROR";
3089d26e4fcSRobert Mustacchi 	}
3099d26e4fcSRobert Mustacchi 
3109d26e4fcSRobert Mustacchi 	snprintf(hw->err_str, sizeof(hw->err_str), "%d", stat_err);
3119d26e4fcSRobert Mustacchi 	return hw->err_str;
3129d26e4fcSRobert Mustacchi }
3139d26e4fcSRobert Mustacchi 
3149d26e4fcSRobert Mustacchi /**
3159d26e4fcSRobert Mustacchi  * i40e_debug_aq
3169d26e4fcSRobert Mustacchi  * @hw: debug mask related to admin queue
3179d26e4fcSRobert Mustacchi  * @mask: debug mask
3189d26e4fcSRobert Mustacchi  * @desc: pointer to admin queue descriptor
3199d26e4fcSRobert Mustacchi  * @buffer: pointer to command buffer
3209d26e4fcSRobert Mustacchi  * @buf_len: max length of buffer
3219d26e4fcSRobert Mustacchi  *
3229d26e4fcSRobert Mustacchi  * Dumps debug log about adminq command with descriptor contents.
3239d26e4fcSRobert Mustacchi  **/
i40e_debug_aq(struct i40e_hw * hw,enum i40e_debug_mask mask,void * desc,void * buffer,u16 buf_len)3249d26e4fcSRobert Mustacchi void i40e_debug_aq(struct i40e_hw *hw, enum i40e_debug_mask mask, void *desc,
3259d26e4fcSRobert Mustacchi 		   void *buffer, u16 buf_len)
3269d26e4fcSRobert Mustacchi {
3279d26e4fcSRobert Mustacchi 	struct i40e_aq_desc *aq_desc = (struct i40e_aq_desc *)desc;
328*df36e06dSRobert Mustacchi 	u32 effective_mask = hw->debug_mask & mask;
3299d26e4fcSRobert Mustacchi 	u8 *buf = (u8 *)buffer;
33093f1cac5SPaul Winder 	u16 len;
331*df36e06dSRobert Mustacchi 	u16 i;
3329d26e4fcSRobert Mustacchi 
333*df36e06dSRobert Mustacchi 	if (!effective_mask || !desc)
3349d26e4fcSRobert Mustacchi 		return;
3359d26e4fcSRobert Mustacchi 
33693f1cac5SPaul Winder 	len = LE16_TO_CPU(aq_desc->datalen);
33793f1cac5SPaul Winder 
338*df36e06dSRobert Mustacchi 	i40e_debug(hw, mask & I40E_DEBUG_AQ_DESCRIPTOR,
3399d26e4fcSRobert Mustacchi 		   "AQ CMD: opcode 0x%04X, flags 0x%04X, datalen 0x%04X, retval 0x%04X\n",
3409d26e4fcSRobert Mustacchi 		   LE16_TO_CPU(aq_desc->opcode),
3419d26e4fcSRobert Mustacchi 		   LE16_TO_CPU(aq_desc->flags),
3429d26e4fcSRobert Mustacchi 		   LE16_TO_CPU(aq_desc->datalen),
3439d26e4fcSRobert Mustacchi 		   LE16_TO_CPU(aq_desc->retval));
344*df36e06dSRobert Mustacchi 	i40e_debug(hw, mask & I40E_DEBUG_AQ_DESCRIPTOR,
345*df36e06dSRobert Mustacchi 		   "\tcookie (h,l) 0x%08X 0x%08X\n",
3469d26e4fcSRobert Mustacchi 		   LE32_TO_CPU(aq_desc->cookie_high),
3479d26e4fcSRobert Mustacchi 		   LE32_TO_CPU(aq_desc->cookie_low));
348*df36e06dSRobert Mustacchi 	i40e_debug(hw, mask & I40E_DEBUG_AQ_DESCRIPTOR,
349*df36e06dSRobert Mustacchi 		   "\tparam (0,1)  0x%08X 0x%08X\n",
3509d26e4fcSRobert Mustacchi 		   LE32_TO_CPU(aq_desc->params.internal.param0),
3519d26e4fcSRobert Mustacchi 		   LE32_TO_CPU(aq_desc->params.internal.param1));
352*df36e06dSRobert Mustacchi 	i40e_debug(hw, mask & I40E_DEBUG_AQ_DESCRIPTOR,
353*df36e06dSRobert Mustacchi 		   "\taddr (h,l)   0x%08X 0x%08X\n",
3549d26e4fcSRobert Mustacchi 		   LE32_TO_CPU(aq_desc->params.external.addr_high),
3559d26e4fcSRobert Mustacchi 		   LE32_TO_CPU(aq_desc->params.external.addr_low));
3569d26e4fcSRobert Mustacchi 
357*df36e06dSRobert Mustacchi 	if (buffer && (buf_len != 0) && (len != 0) &&
358*df36e06dSRobert Mustacchi 	    (effective_mask & I40E_DEBUG_AQ_DESC_BUFFER)) {
3599d26e4fcSRobert Mustacchi 		i40e_debug(hw, mask, "AQ CMD Buffer:\n");
3609d26e4fcSRobert Mustacchi 		if (buf_len < len)
3619d26e4fcSRobert Mustacchi 			len = buf_len;
3629d26e4fcSRobert Mustacchi 		/* write the full 16-byte chunks */
3639d26e4fcSRobert Mustacchi 		for (i = 0; i < (len - 16); i += 16)
3649d26e4fcSRobert Mustacchi 			i40e_debug(hw, mask,
3659d26e4fcSRobert Mustacchi 				   "\t0x%04X  %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n",
3669d26e4fcSRobert Mustacchi 				   i, buf[i], buf[i+1], buf[i+2], buf[i+3],
3679d26e4fcSRobert Mustacchi 				   buf[i+4], buf[i+5], buf[i+6], buf[i+7],
3689d26e4fcSRobert Mustacchi 				   buf[i+8], buf[i+9], buf[i+10], buf[i+11],
3699d26e4fcSRobert Mustacchi 				   buf[i+12], buf[i+13], buf[i+14], buf[i+15]);
3703d75a287SRobert Mustacchi 		/* the most we could have left is 16 bytes, pad with zeros */
3719d26e4fcSRobert Mustacchi 		if (i < len) {
3723d75a287SRobert Mustacchi 			char d_buf[16];
3733d75a287SRobert Mustacchi 			int j, i_sav;
3749d26e4fcSRobert Mustacchi 
3753d75a287SRobert Mustacchi 			i_sav = i;
3769d26e4fcSRobert Mustacchi 			memset(d_buf, 0, sizeof(d_buf));
3773d75a287SRobert Mustacchi 			for (j = 0; i < len; j++, i++)
3783d75a287SRobert Mustacchi 				d_buf[j] = buf[i];
3793d75a287SRobert Mustacchi 			i40e_debug(hw, mask,
3803d75a287SRobert Mustacchi 				   "\t0x%04X  %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n",
3813d75a287SRobert Mustacchi 				   i_sav, d_buf[0], d_buf[1], d_buf[2], d_buf[3],
3823d75a287SRobert Mustacchi 				   d_buf[4], d_buf[5], d_buf[6], d_buf[7],
3833d75a287SRobert Mustacchi 				   d_buf[8], d_buf[9], d_buf[10], d_buf[11],
3843d75a287SRobert Mustacchi 				   d_buf[12], d_buf[13], d_buf[14], d_buf[15]);
3859d26e4fcSRobert Mustacchi 		}
3869d26e4fcSRobert Mustacchi 	}
3879d26e4fcSRobert Mustacchi }
3889d26e4fcSRobert Mustacchi 
3899d26e4fcSRobert Mustacchi /**
3909d26e4fcSRobert Mustacchi  * i40e_check_asq_alive
3919d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
3929d26e4fcSRobert Mustacchi  *
3939d26e4fcSRobert Mustacchi  * Returns TRUE if Queue is enabled else FALSE.
3949d26e4fcSRobert Mustacchi  **/
i40e_check_asq_alive(struct i40e_hw * hw)3959d26e4fcSRobert Mustacchi bool i40e_check_asq_alive(struct i40e_hw *hw)
3969d26e4fcSRobert Mustacchi {
397*df36e06dSRobert Mustacchi 	if (hw->aq.asq.len) {
398*df36e06dSRobert Mustacchi 		if (!i40e_is_vf(hw))
399*df36e06dSRobert Mustacchi 			return !!(rd32(hw, hw->aq.asq.len) &
400*df36e06dSRobert Mustacchi 				I40E_PF_ATQLEN_ATQENABLE_MASK);
401*df36e06dSRobert Mustacchi 		else
402*df36e06dSRobert Mustacchi 			return !!(rd32(hw, hw->aq.asq.len) &
403*df36e06dSRobert Mustacchi 				I40E_VF_ATQLEN1_ATQENABLE_MASK);
404*df36e06dSRobert Mustacchi 	}
4059d26e4fcSRobert Mustacchi 	return FALSE;
4069d26e4fcSRobert Mustacchi }
4079d26e4fcSRobert Mustacchi 
4089d26e4fcSRobert Mustacchi /**
4099d26e4fcSRobert Mustacchi  * i40e_aq_queue_shutdown
4109d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
4119d26e4fcSRobert Mustacchi  * @unloading: is the driver unloading itself
4129d26e4fcSRobert Mustacchi  *
4139d26e4fcSRobert Mustacchi  * Tell the Firmware that we're shutting down the AdminQ and whether
4149d26e4fcSRobert Mustacchi  * or not the driver is unloading as well.
4159d26e4fcSRobert Mustacchi  **/
i40e_aq_queue_shutdown(struct i40e_hw * hw,bool unloading)4169d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_queue_shutdown(struct i40e_hw *hw,
4179d26e4fcSRobert Mustacchi 					     bool unloading)
4189d26e4fcSRobert Mustacchi {
4199d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
4209d26e4fcSRobert Mustacchi 	struct i40e_aqc_queue_shutdown *cmd =
4219d26e4fcSRobert Mustacchi 		(struct i40e_aqc_queue_shutdown *)&desc.params.raw;
4229d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
4239d26e4fcSRobert Mustacchi 
4249d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
4259d26e4fcSRobert Mustacchi 					  i40e_aqc_opc_queue_shutdown);
4269d26e4fcSRobert Mustacchi 
4279d26e4fcSRobert Mustacchi 	if (unloading)
4289d26e4fcSRobert Mustacchi 		cmd->driver_unloading = CPU_TO_LE32(I40E_AQ_DRIVER_UNLOADING);
4299d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
4309d26e4fcSRobert Mustacchi 
4319d26e4fcSRobert Mustacchi 	return status;
4329d26e4fcSRobert Mustacchi }
4339d26e4fcSRobert Mustacchi 
4349d26e4fcSRobert Mustacchi /**
4359d26e4fcSRobert Mustacchi  * i40e_aq_get_set_rss_lut
4369d26e4fcSRobert Mustacchi  * @hw: pointer to the hardware structure
4379d26e4fcSRobert Mustacchi  * @vsi_id: vsi fw index
4389d26e4fcSRobert Mustacchi  * @pf_lut: for PF table set TRUE, for VSI table set FALSE
4399d26e4fcSRobert Mustacchi  * @lut: pointer to the lut buffer provided by the caller
4409d26e4fcSRobert Mustacchi  * @lut_size: size of the lut buffer
4419d26e4fcSRobert Mustacchi  * @set: set TRUE to set the table, FALSE to get the table
4429d26e4fcSRobert Mustacchi  *
4439d26e4fcSRobert Mustacchi  * Internal function to get or set RSS look up table
4449d26e4fcSRobert Mustacchi  **/
i40e_aq_get_set_rss_lut(struct i40e_hw * hw,u16 vsi_id,bool pf_lut,u8 * lut,u16 lut_size,bool set)4459d26e4fcSRobert Mustacchi static enum i40e_status_code i40e_aq_get_set_rss_lut(struct i40e_hw *hw,
4469d26e4fcSRobert Mustacchi 						     u16 vsi_id, bool pf_lut,
4479d26e4fcSRobert Mustacchi 						     u8 *lut, u16 lut_size,
4489d26e4fcSRobert Mustacchi 						     bool set)
4499d26e4fcSRobert Mustacchi {
4509d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
4519d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
4529d26e4fcSRobert Mustacchi 	struct i40e_aqc_get_set_rss_lut *cmd_resp =
4539d26e4fcSRobert Mustacchi 		   (struct i40e_aqc_get_set_rss_lut *)&desc.params.raw;
4549d26e4fcSRobert Mustacchi 
4559d26e4fcSRobert Mustacchi 	if (set)
4569d26e4fcSRobert Mustacchi 		i40e_fill_default_direct_cmd_desc(&desc,
4579d26e4fcSRobert Mustacchi 						  i40e_aqc_opc_set_rss_lut);
4589d26e4fcSRobert Mustacchi 	else
4599d26e4fcSRobert Mustacchi 		i40e_fill_default_direct_cmd_desc(&desc,
4609d26e4fcSRobert Mustacchi 						  i40e_aqc_opc_get_rss_lut);
4619d26e4fcSRobert Mustacchi 
4629d26e4fcSRobert Mustacchi 	/* Indirect command */
4639d26e4fcSRobert Mustacchi 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
4649d26e4fcSRobert Mustacchi 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
4659d26e4fcSRobert Mustacchi 
4669d26e4fcSRobert Mustacchi 	cmd_resp->vsi_id =
4679d26e4fcSRobert Mustacchi 			CPU_TO_LE16((u16)((vsi_id <<
4689d26e4fcSRobert Mustacchi 					  I40E_AQC_SET_RSS_LUT_VSI_ID_SHIFT) &
4699d26e4fcSRobert Mustacchi 					  I40E_AQC_SET_RSS_LUT_VSI_ID_MASK));
4709d26e4fcSRobert Mustacchi 	cmd_resp->vsi_id |= CPU_TO_LE16((u16)I40E_AQC_SET_RSS_LUT_VSI_VALID);
4719d26e4fcSRobert Mustacchi 
4729d26e4fcSRobert Mustacchi 	if (pf_lut)
4739d26e4fcSRobert Mustacchi 		cmd_resp->flags |= CPU_TO_LE16((u16)
4749d26e4fcSRobert Mustacchi 					((I40E_AQC_SET_RSS_LUT_TABLE_TYPE_PF <<
4759d26e4fcSRobert Mustacchi 					I40E_AQC_SET_RSS_LUT_TABLE_TYPE_SHIFT) &
4769d26e4fcSRobert Mustacchi 					I40E_AQC_SET_RSS_LUT_TABLE_TYPE_MASK));
4779d26e4fcSRobert Mustacchi 	else
4789d26e4fcSRobert Mustacchi 		cmd_resp->flags |= CPU_TO_LE16((u16)
4799d26e4fcSRobert Mustacchi 					((I40E_AQC_SET_RSS_LUT_TABLE_TYPE_VSI <<
4809d26e4fcSRobert Mustacchi 					I40E_AQC_SET_RSS_LUT_TABLE_TYPE_SHIFT) &
4819d26e4fcSRobert Mustacchi 					I40E_AQC_SET_RSS_LUT_TABLE_TYPE_MASK));
4829d26e4fcSRobert Mustacchi 
4839d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, lut, lut_size, NULL);
4849d26e4fcSRobert Mustacchi 
4859d26e4fcSRobert Mustacchi 	return status;
4869d26e4fcSRobert Mustacchi }
4879d26e4fcSRobert Mustacchi 
4889d26e4fcSRobert Mustacchi /**
4899d26e4fcSRobert Mustacchi  * i40e_aq_get_rss_lut
4909d26e4fcSRobert Mustacchi  * @hw: pointer to the hardware structure
4919d26e4fcSRobert Mustacchi  * @vsi_id: vsi fw index
4929d26e4fcSRobert Mustacchi  * @pf_lut: for PF table set TRUE, for VSI table set FALSE
4939d26e4fcSRobert Mustacchi  * @lut: pointer to the lut buffer provided by the caller
4949d26e4fcSRobert Mustacchi  * @lut_size: size of the lut buffer
4959d26e4fcSRobert Mustacchi  *
4969d26e4fcSRobert Mustacchi  * get the RSS lookup table, PF or VSI type
4979d26e4fcSRobert Mustacchi  **/
i40e_aq_get_rss_lut(struct i40e_hw * hw,u16 vsi_id,bool pf_lut,u8 * lut,u16 lut_size)4989d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_get_rss_lut(struct i40e_hw *hw, u16 vsi_id,
4999d26e4fcSRobert Mustacchi 					  bool pf_lut, u8 *lut, u16 lut_size)
5009d26e4fcSRobert Mustacchi {
5019d26e4fcSRobert Mustacchi 	return i40e_aq_get_set_rss_lut(hw, vsi_id, pf_lut, lut, lut_size,
5029d26e4fcSRobert Mustacchi 				       FALSE);
5039d26e4fcSRobert Mustacchi }
5049d26e4fcSRobert Mustacchi 
5059d26e4fcSRobert Mustacchi /**
5069d26e4fcSRobert Mustacchi  * i40e_aq_set_rss_lut
5079d26e4fcSRobert Mustacchi  * @hw: pointer to the hardware structure
5089d26e4fcSRobert Mustacchi  * @vsi_id: vsi fw index
5099d26e4fcSRobert Mustacchi  * @pf_lut: for PF table set TRUE, for VSI table set FALSE
5109d26e4fcSRobert Mustacchi  * @lut: pointer to the lut buffer provided by the caller
5119d26e4fcSRobert Mustacchi  * @lut_size: size of the lut buffer
5129d26e4fcSRobert Mustacchi  *
5139d26e4fcSRobert Mustacchi  * set the RSS lookup table, PF or VSI type
5149d26e4fcSRobert Mustacchi  **/
i40e_aq_set_rss_lut(struct i40e_hw * hw,u16 vsi_id,bool pf_lut,u8 * lut,u16 lut_size)5159d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_set_rss_lut(struct i40e_hw *hw, u16 vsi_id,
5169d26e4fcSRobert Mustacchi 					  bool pf_lut, u8 *lut, u16 lut_size)
5179d26e4fcSRobert Mustacchi {
5189d26e4fcSRobert Mustacchi 	return i40e_aq_get_set_rss_lut(hw, vsi_id, pf_lut, lut, lut_size, TRUE);
5199d26e4fcSRobert Mustacchi }
5209d26e4fcSRobert Mustacchi 
5219d26e4fcSRobert Mustacchi /**
5229d26e4fcSRobert Mustacchi  * i40e_aq_get_set_rss_key
5239d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
5249d26e4fcSRobert Mustacchi  * @vsi_id: vsi fw index
5259d26e4fcSRobert Mustacchi  * @key: pointer to key info struct
5269d26e4fcSRobert Mustacchi  * @set: set TRUE to set the key, FALSE to get the key
5279d26e4fcSRobert Mustacchi  *
5289d26e4fcSRobert Mustacchi  * get the RSS key per VSI
5299d26e4fcSRobert Mustacchi  **/
i40e_aq_get_set_rss_key(struct i40e_hw * hw,u16 vsi_id,struct i40e_aqc_get_set_rss_key_data * key,bool set)5309d26e4fcSRobert Mustacchi static enum i40e_status_code i40e_aq_get_set_rss_key(struct i40e_hw *hw,
5319d26e4fcSRobert Mustacchi 				      u16 vsi_id,
5329d26e4fcSRobert Mustacchi 				      struct i40e_aqc_get_set_rss_key_data *key,
5339d26e4fcSRobert Mustacchi 				      bool set)
5349d26e4fcSRobert Mustacchi {
5359d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
5369d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
5379d26e4fcSRobert Mustacchi 	struct i40e_aqc_get_set_rss_key *cmd_resp =
5389d26e4fcSRobert Mustacchi 			(struct i40e_aqc_get_set_rss_key *)&desc.params.raw;
5399d26e4fcSRobert Mustacchi 	u16 key_size = sizeof(struct i40e_aqc_get_set_rss_key_data);
5409d26e4fcSRobert Mustacchi 
5419d26e4fcSRobert Mustacchi 	if (set)
5429d26e4fcSRobert Mustacchi 		i40e_fill_default_direct_cmd_desc(&desc,
5439d26e4fcSRobert Mustacchi 						  i40e_aqc_opc_set_rss_key);
5449d26e4fcSRobert Mustacchi 	else
5459d26e4fcSRobert Mustacchi 		i40e_fill_default_direct_cmd_desc(&desc,
5469d26e4fcSRobert Mustacchi 						  i40e_aqc_opc_get_rss_key);
5479d26e4fcSRobert Mustacchi 
5489d26e4fcSRobert Mustacchi 	/* Indirect command */
5499d26e4fcSRobert Mustacchi 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
5509d26e4fcSRobert Mustacchi 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
5519d26e4fcSRobert Mustacchi 
5529d26e4fcSRobert Mustacchi 	cmd_resp->vsi_id =
5539d26e4fcSRobert Mustacchi 			CPU_TO_LE16((u16)((vsi_id <<
5549d26e4fcSRobert Mustacchi 					  I40E_AQC_SET_RSS_KEY_VSI_ID_SHIFT) &
5559d26e4fcSRobert Mustacchi 					  I40E_AQC_SET_RSS_KEY_VSI_ID_MASK));
5569d26e4fcSRobert Mustacchi 	cmd_resp->vsi_id |= CPU_TO_LE16((u16)I40E_AQC_SET_RSS_KEY_VSI_VALID);
5579d26e4fcSRobert Mustacchi 
5589d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, key, key_size, NULL);
5599d26e4fcSRobert Mustacchi 
5609d26e4fcSRobert Mustacchi 	return status;
5619d26e4fcSRobert Mustacchi }
5629d26e4fcSRobert Mustacchi 
5639d26e4fcSRobert Mustacchi /**
5649d26e4fcSRobert Mustacchi  * i40e_aq_get_rss_key
5659d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
5669d26e4fcSRobert Mustacchi  * @vsi_id: vsi fw index
5679d26e4fcSRobert Mustacchi  * @key: pointer to key info struct
5689d26e4fcSRobert Mustacchi  *
5699d26e4fcSRobert Mustacchi  **/
i40e_aq_get_rss_key(struct i40e_hw * hw,u16 vsi_id,struct i40e_aqc_get_set_rss_key_data * key)5709d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_get_rss_key(struct i40e_hw *hw,
5719d26e4fcSRobert Mustacchi 				      u16 vsi_id,
5729d26e4fcSRobert Mustacchi 				      struct i40e_aqc_get_set_rss_key_data *key)
5739d26e4fcSRobert Mustacchi {
5749d26e4fcSRobert Mustacchi 	return i40e_aq_get_set_rss_key(hw, vsi_id, key, FALSE);
5759d26e4fcSRobert Mustacchi }
5769d26e4fcSRobert Mustacchi 
5779d26e4fcSRobert Mustacchi /**
5789d26e4fcSRobert Mustacchi  * i40e_aq_set_rss_key
5799d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
5809d26e4fcSRobert Mustacchi  * @vsi_id: vsi fw index
5819d26e4fcSRobert Mustacchi  * @key: pointer to key info struct
5829d26e4fcSRobert Mustacchi  *
5839d26e4fcSRobert Mustacchi  * set the RSS key per VSI
5849d26e4fcSRobert Mustacchi  **/
i40e_aq_set_rss_key(struct i40e_hw * hw,u16 vsi_id,struct i40e_aqc_get_set_rss_key_data * key)5859d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_set_rss_key(struct i40e_hw *hw,
5869d26e4fcSRobert Mustacchi 				      u16 vsi_id,
5879d26e4fcSRobert Mustacchi 				      struct i40e_aqc_get_set_rss_key_data *key)
5889d26e4fcSRobert Mustacchi {
5899d26e4fcSRobert Mustacchi 	return i40e_aq_get_set_rss_key(hw, vsi_id, key, TRUE);
5909d26e4fcSRobert Mustacchi }
5919d26e4fcSRobert Mustacchi 
5929d26e4fcSRobert Mustacchi /* The i40e_ptype_lookup table is used to convert from the 8-bit ptype in the
5939d26e4fcSRobert Mustacchi  * hardware to a bit-field that can be used by SW to more easily determine the
5949d26e4fcSRobert Mustacchi  * packet type.
5959d26e4fcSRobert Mustacchi  *
5969d26e4fcSRobert Mustacchi  * Macros are used to shorten the table lines and make this table human
5979d26e4fcSRobert Mustacchi  * readable.
5989d26e4fcSRobert Mustacchi  *
5999d26e4fcSRobert Mustacchi  * We store the PTYPE in the top byte of the bit field - this is just so that
6009d26e4fcSRobert Mustacchi  * we can check that the table doesn't have a row missing, as the index into
6019d26e4fcSRobert Mustacchi  * the table should be the PTYPE.
6029d26e4fcSRobert Mustacchi  *
6039d26e4fcSRobert Mustacchi  * Typical work flow:
6049d26e4fcSRobert Mustacchi  *
6059d26e4fcSRobert Mustacchi  * IF NOT i40e_ptype_lookup[ptype].known
6069d26e4fcSRobert Mustacchi  * THEN
6079d26e4fcSRobert Mustacchi  *      Packet is unknown
6089d26e4fcSRobert Mustacchi  * ELSE IF i40e_ptype_lookup[ptype].outer_ip == I40E_RX_PTYPE_OUTER_IP
6099d26e4fcSRobert Mustacchi  *      Use the rest of the fields to look at the tunnels, inner protocols, etc
6109d26e4fcSRobert Mustacchi  * ELSE
6119d26e4fcSRobert Mustacchi  *      Use the enum i40e_rx_l2_ptype to decode the packet type
6129d26e4fcSRobert Mustacchi  * ENDIF
6139d26e4fcSRobert Mustacchi  */
6149d26e4fcSRobert Mustacchi 
6159d26e4fcSRobert Mustacchi /* macro to make the table lines short */
6169d26e4fcSRobert Mustacchi #define I40E_PTT(PTYPE, OUTER_IP, OUTER_IP_VER, OUTER_FRAG, T, TE, TEF, I, PL)\
6179d26e4fcSRobert Mustacchi 	{	PTYPE, \
6189d26e4fcSRobert Mustacchi 		1, \
6199d26e4fcSRobert Mustacchi 		I40E_RX_PTYPE_OUTER_##OUTER_IP, \
6209d26e4fcSRobert Mustacchi 		I40E_RX_PTYPE_OUTER_##OUTER_IP_VER, \
6219d26e4fcSRobert Mustacchi 		I40E_RX_PTYPE_##OUTER_FRAG, \
6229d26e4fcSRobert Mustacchi 		I40E_RX_PTYPE_TUNNEL_##T, \
6239d26e4fcSRobert Mustacchi 		I40E_RX_PTYPE_TUNNEL_END_##TE, \
6249d26e4fcSRobert Mustacchi 		I40E_RX_PTYPE_##TEF, \
6259d26e4fcSRobert Mustacchi 		I40E_RX_PTYPE_INNER_PROT_##I, \
6269d26e4fcSRobert Mustacchi 		I40E_RX_PTYPE_PAYLOAD_LAYER_##PL }
6279d26e4fcSRobert Mustacchi 
6289d26e4fcSRobert Mustacchi #define I40E_PTT_UNUSED_ENTRY(PTYPE) \
6299d26e4fcSRobert Mustacchi 		{ PTYPE, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
6309d26e4fcSRobert Mustacchi 
6319d26e4fcSRobert Mustacchi /* shorter macros makes the table fit but are terse */
6329d26e4fcSRobert Mustacchi #define I40E_RX_PTYPE_NOF		I40E_RX_PTYPE_NOT_FRAG
6339d26e4fcSRobert Mustacchi #define I40E_RX_PTYPE_FRG		I40E_RX_PTYPE_FRAG
6349d26e4fcSRobert Mustacchi #define I40E_RX_PTYPE_INNER_PROT_TS	I40E_RX_PTYPE_INNER_PROT_TIMESYNC
6359d26e4fcSRobert Mustacchi 
6369d26e4fcSRobert Mustacchi /* Lookup table mapping the HW PTYPE to the bit field for decoding */
6379d26e4fcSRobert Mustacchi struct i40e_rx_ptype_decoded i40e_ptype_lookup[] = {
6389d26e4fcSRobert Mustacchi 	/* L2 Packet types */
6399d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(0),
6409d26e4fcSRobert Mustacchi 	I40E_PTT(1,  L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
6419d26e4fcSRobert Mustacchi 	I40E_PTT(2,  L2, NONE, NOF, NONE, NONE, NOF, TS,   PAY2),
6429d26e4fcSRobert Mustacchi 	I40E_PTT(3,  L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
6439d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(4),
6449d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(5),
6459d26e4fcSRobert Mustacchi 	I40E_PTT(6,  L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
6469d26e4fcSRobert Mustacchi 	I40E_PTT(7,  L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
6479d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(8),
6489d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(9),
6499d26e4fcSRobert Mustacchi 	I40E_PTT(10, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
6509d26e4fcSRobert Mustacchi 	I40E_PTT(11, L2, NONE, NOF, NONE, NONE, NOF, NONE, NONE),
6519d26e4fcSRobert Mustacchi 	I40E_PTT(12, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
6529d26e4fcSRobert Mustacchi 	I40E_PTT(13, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
6539d26e4fcSRobert Mustacchi 	I40E_PTT(14, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
6549d26e4fcSRobert Mustacchi 	I40E_PTT(15, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
6559d26e4fcSRobert Mustacchi 	I40E_PTT(16, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
6569d26e4fcSRobert Mustacchi 	I40E_PTT(17, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
6579d26e4fcSRobert Mustacchi 	I40E_PTT(18, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
6589d26e4fcSRobert Mustacchi 	I40E_PTT(19, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
6599d26e4fcSRobert Mustacchi 	I40E_PTT(20, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
6609d26e4fcSRobert Mustacchi 	I40E_PTT(21, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
6619d26e4fcSRobert Mustacchi 
6629d26e4fcSRobert Mustacchi 	/* Non Tunneled IPv4 */
6639d26e4fcSRobert Mustacchi 	I40E_PTT(22, IP, IPV4, FRG, NONE, NONE, NOF, NONE, PAY3),
6649d26e4fcSRobert Mustacchi 	I40E_PTT(23, IP, IPV4, NOF, NONE, NONE, NOF, NONE, PAY3),
6659d26e4fcSRobert Mustacchi 	I40E_PTT(24, IP, IPV4, NOF, NONE, NONE, NOF, UDP,  PAY4),
6669d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(25),
6679d26e4fcSRobert Mustacchi 	I40E_PTT(26, IP, IPV4, NOF, NONE, NONE, NOF, TCP,  PAY4),
6689d26e4fcSRobert Mustacchi 	I40E_PTT(27, IP, IPV4, NOF, NONE, NONE, NOF, SCTP, PAY4),
6699d26e4fcSRobert Mustacchi 	I40E_PTT(28, IP, IPV4, NOF, NONE, NONE, NOF, ICMP, PAY4),
6709d26e4fcSRobert Mustacchi 
6719d26e4fcSRobert Mustacchi 	/* IPv4 --> IPv4 */
6729d26e4fcSRobert Mustacchi 	I40E_PTT(29, IP, IPV4, NOF, IP_IP, IPV4, FRG, NONE, PAY3),
6739d26e4fcSRobert Mustacchi 	I40E_PTT(30, IP, IPV4, NOF, IP_IP, IPV4, NOF, NONE, PAY3),
6749d26e4fcSRobert Mustacchi 	I40E_PTT(31, IP, IPV4, NOF, IP_IP, IPV4, NOF, UDP,  PAY4),
6759d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(32),
6769d26e4fcSRobert Mustacchi 	I40E_PTT(33, IP, IPV4, NOF, IP_IP, IPV4, NOF, TCP,  PAY4),
6779d26e4fcSRobert Mustacchi 	I40E_PTT(34, IP, IPV4, NOF, IP_IP, IPV4, NOF, SCTP, PAY4),
6789d26e4fcSRobert Mustacchi 	I40E_PTT(35, IP, IPV4, NOF, IP_IP, IPV4, NOF, ICMP, PAY4),
6799d26e4fcSRobert Mustacchi 
6809d26e4fcSRobert Mustacchi 	/* IPv4 --> IPv6 */
6819d26e4fcSRobert Mustacchi 	I40E_PTT(36, IP, IPV4, NOF, IP_IP, IPV6, FRG, NONE, PAY3),
6829d26e4fcSRobert Mustacchi 	I40E_PTT(37, IP, IPV4, NOF, IP_IP, IPV6, NOF, NONE, PAY3),
6839d26e4fcSRobert Mustacchi 	I40E_PTT(38, IP, IPV4, NOF, IP_IP, IPV6, NOF, UDP,  PAY4),
6849d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(39),
6859d26e4fcSRobert Mustacchi 	I40E_PTT(40, IP, IPV4, NOF, IP_IP, IPV6, NOF, TCP,  PAY4),
6869d26e4fcSRobert Mustacchi 	I40E_PTT(41, IP, IPV4, NOF, IP_IP, IPV6, NOF, SCTP, PAY4),
6879d26e4fcSRobert Mustacchi 	I40E_PTT(42, IP, IPV4, NOF, IP_IP, IPV6, NOF, ICMP, PAY4),
6889d26e4fcSRobert Mustacchi 
6899d26e4fcSRobert Mustacchi 	/* IPv4 --> GRE/NAT */
6909d26e4fcSRobert Mustacchi 	I40E_PTT(43, IP, IPV4, NOF, IP_GRENAT, NONE, NOF, NONE, PAY3),
6919d26e4fcSRobert Mustacchi 
6929d26e4fcSRobert Mustacchi 	/* IPv4 --> GRE/NAT --> IPv4 */
6939d26e4fcSRobert Mustacchi 	I40E_PTT(44, IP, IPV4, NOF, IP_GRENAT, IPV4, FRG, NONE, PAY3),
6949d26e4fcSRobert Mustacchi 	I40E_PTT(45, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, NONE, PAY3),
6959d26e4fcSRobert Mustacchi 	I40E_PTT(46, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, UDP,  PAY4),
6969d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(47),
6979d26e4fcSRobert Mustacchi 	I40E_PTT(48, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, TCP,  PAY4),
6989d26e4fcSRobert Mustacchi 	I40E_PTT(49, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, SCTP, PAY4),
6999d26e4fcSRobert Mustacchi 	I40E_PTT(50, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, ICMP, PAY4),
7009d26e4fcSRobert Mustacchi 
7019d26e4fcSRobert Mustacchi 	/* IPv4 --> GRE/NAT --> IPv6 */
7029d26e4fcSRobert Mustacchi 	I40E_PTT(51, IP, IPV4, NOF, IP_GRENAT, IPV6, FRG, NONE, PAY3),
7039d26e4fcSRobert Mustacchi 	I40E_PTT(52, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, NONE, PAY3),
7049d26e4fcSRobert Mustacchi 	I40E_PTT(53, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, UDP,  PAY4),
7059d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(54),
7069d26e4fcSRobert Mustacchi 	I40E_PTT(55, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, TCP,  PAY4),
7079d26e4fcSRobert Mustacchi 	I40E_PTT(56, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, SCTP, PAY4),
7089d26e4fcSRobert Mustacchi 	I40E_PTT(57, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, ICMP, PAY4),
7099d26e4fcSRobert Mustacchi 
7109d26e4fcSRobert Mustacchi 	/* IPv4 --> GRE/NAT --> MAC */
7119d26e4fcSRobert Mustacchi 	I40E_PTT(58, IP, IPV4, NOF, IP_GRENAT_MAC, NONE, NOF, NONE, PAY3),
7129d26e4fcSRobert Mustacchi 
7139d26e4fcSRobert Mustacchi 	/* IPv4 --> GRE/NAT --> MAC --> IPv4 */
7149d26e4fcSRobert Mustacchi 	I40E_PTT(59, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, FRG, NONE, PAY3),
7159d26e4fcSRobert Mustacchi 	I40E_PTT(60, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, NONE, PAY3),
7169d26e4fcSRobert Mustacchi 	I40E_PTT(61, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, UDP,  PAY4),
7179d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(62),
7189d26e4fcSRobert Mustacchi 	I40E_PTT(63, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, TCP,  PAY4),
7199d26e4fcSRobert Mustacchi 	I40E_PTT(64, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, SCTP, PAY4),
7209d26e4fcSRobert Mustacchi 	I40E_PTT(65, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, ICMP, PAY4),
7219d26e4fcSRobert Mustacchi 
7229d26e4fcSRobert Mustacchi 	/* IPv4 --> GRE/NAT -> MAC --> IPv6 */
7239d26e4fcSRobert Mustacchi 	I40E_PTT(66, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, FRG, NONE, PAY3),
7249d26e4fcSRobert Mustacchi 	I40E_PTT(67, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, NONE, PAY3),
7259d26e4fcSRobert Mustacchi 	I40E_PTT(68, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, UDP,  PAY4),
7269d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(69),
7279d26e4fcSRobert Mustacchi 	I40E_PTT(70, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, TCP,  PAY4),
7289d26e4fcSRobert Mustacchi 	I40E_PTT(71, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, SCTP, PAY4),
7299d26e4fcSRobert Mustacchi 	I40E_PTT(72, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, ICMP, PAY4),
7309d26e4fcSRobert Mustacchi 
7319d26e4fcSRobert Mustacchi 	/* IPv4 --> GRE/NAT --> MAC/VLAN */
7329d26e4fcSRobert Mustacchi 	I40E_PTT(73, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, NONE, NOF, NONE, PAY3),
7339d26e4fcSRobert Mustacchi 
7349d26e4fcSRobert Mustacchi 	/* IPv4 ---> GRE/NAT -> MAC/VLAN --> IPv4 */
7359d26e4fcSRobert Mustacchi 	I40E_PTT(74, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, FRG, NONE, PAY3),
7369d26e4fcSRobert Mustacchi 	I40E_PTT(75, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, NONE, PAY3),
7379d26e4fcSRobert Mustacchi 	I40E_PTT(76, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, UDP,  PAY4),
7389d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(77),
7399d26e4fcSRobert Mustacchi 	I40E_PTT(78, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, TCP,  PAY4),
7409d26e4fcSRobert Mustacchi 	I40E_PTT(79, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, SCTP, PAY4),
7419d26e4fcSRobert Mustacchi 	I40E_PTT(80, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, ICMP, PAY4),
7429d26e4fcSRobert Mustacchi 
7439d26e4fcSRobert Mustacchi 	/* IPv4 -> GRE/NAT -> MAC/VLAN --> IPv6 */
7449d26e4fcSRobert Mustacchi 	I40E_PTT(81, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, FRG, NONE, PAY3),
7459d26e4fcSRobert Mustacchi 	I40E_PTT(82, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, NONE, PAY3),
7469d26e4fcSRobert Mustacchi 	I40E_PTT(83, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, UDP,  PAY4),
7479d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(84),
7489d26e4fcSRobert Mustacchi 	I40E_PTT(85, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, TCP,  PAY4),
7499d26e4fcSRobert Mustacchi 	I40E_PTT(86, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, SCTP, PAY4),
7509d26e4fcSRobert Mustacchi 	I40E_PTT(87, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, ICMP, PAY4),
7519d26e4fcSRobert Mustacchi 
7529d26e4fcSRobert Mustacchi 	/* Non Tunneled IPv6 */
7539d26e4fcSRobert Mustacchi 	I40E_PTT(88, IP, IPV6, FRG, NONE, NONE, NOF, NONE, PAY3),
7549d26e4fcSRobert Mustacchi 	I40E_PTT(89, IP, IPV6, NOF, NONE, NONE, NOF, NONE, PAY3),
7559d26e4fcSRobert Mustacchi 	I40E_PTT(90, IP, IPV6, NOF, NONE, NONE, NOF, UDP,  PAY4),
7569d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(91),
7579d26e4fcSRobert Mustacchi 	I40E_PTT(92, IP, IPV6, NOF, NONE, NONE, NOF, TCP,  PAY4),
7589d26e4fcSRobert Mustacchi 	I40E_PTT(93, IP, IPV6, NOF, NONE, NONE, NOF, SCTP, PAY4),
7599d26e4fcSRobert Mustacchi 	I40E_PTT(94, IP, IPV6, NOF, NONE, NONE, NOF, ICMP, PAY4),
7609d26e4fcSRobert Mustacchi 
7619d26e4fcSRobert Mustacchi 	/* IPv6 --> IPv4 */
7629d26e4fcSRobert Mustacchi 	I40E_PTT(95,  IP, IPV6, NOF, IP_IP, IPV4, FRG, NONE, PAY3),
7639d26e4fcSRobert Mustacchi 	I40E_PTT(96,  IP, IPV6, NOF, IP_IP, IPV4, NOF, NONE, PAY3),
7649d26e4fcSRobert Mustacchi 	I40E_PTT(97,  IP, IPV6, NOF, IP_IP, IPV4, NOF, UDP,  PAY4),
7659d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(98),
7669d26e4fcSRobert Mustacchi 	I40E_PTT(99,  IP, IPV6, NOF, IP_IP, IPV4, NOF, TCP,  PAY4),
7679d26e4fcSRobert Mustacchi 	I40E_PTT(100, IP, IPV6, NOF, IP_IP, IPV4, NOF, SCTP, PAY4),
7689d26e4fcSRobert Mustacchi 	I40E_PTT(101, IP, IPV6, NOF, IP_IP, IPV4, NOF, ICMP, PAY4),
7699d26e4fcSRobert Mustacchi 
7709d26e4fcSRobert Mustacchi 	/* IPv6 --> IPv6 */
7719d26e4fcSRobert Mustacchi 	I40E_PTT(102, IP, IPV6, NOF, IP_IP, IPV6, FRG, NONE, PAY3),
7729d26e4fcSRobert Mustacchi 	I40E_PTT(103, IP, IPV6, NOF, IP_IP, IPV6, NOF, NONE, PAY3),
7739d26e4fcSRobert Mustacchi 	I40E_PTT(104, IP, IPV6, NOF, IP_IP, IPV6, NOF, UDP,  PAY4),
7749d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(105),
7759d26e4fcSRobert Mustacchi 	I40E_PTT(106, IP, IPV6, NOF, IP_IP, IPV6, NOF, TCP,  PAY4),
7769d26e4fcSRobert Mustacchi 	I40E_PTT(107, IP, IPV6, NOF, IP_IP, IPV6, NOF, SCTP, PAY4),
7779d26e4fcSRobert Mustacchi 	I40E_PTT(108, IP, IPV6, NOF, IP_IP, IPV6, NOF, ICMP, PAY4),
7789d26e4fcSRobert Mustacchi 
7799d26e4fcSRobert Mustacchi 	/* IPv6 --> GRE/NAT */
7809d26e4fcSRobert Mustacchi 	I40E_PTT(109, IP, IPV6, NOF, IP_GRENAT, NONE, NOF, NONE, PAY3),
7819d26e4fcSRobert Mustacchi 
7829d26e4fcSRobert Mustacchi 	/* IPv6 --> GRE/NAT -> IPv4 */
7839d26e4fcSRobert Mustacchi 	I40E_PTT(110, IP, IPV6, NOF, IP_GRENAT, IPV4, FRG, NONE, PAY3),
7849d26e4fcSRobert Mustacchi 	I40E_PTT(111, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, NONE, PAY3),
7859d26e4fcSRobert Mustacchi 	I40E_PTT(112, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, UDP,  PAY4),
7869d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(113),
7879d26e4fcSRobert Mustacchi 	I40E_PTT(114, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, TCP,  PAY4),
7889d26e4fcSRobert Mustacchi 	I40E_PTT(115, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, SCTP, PAY4),
7899d26e4fcSRobert Mustacchi 	I40E_PTT(116, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, ICMP, PAY4),
7909d26e4fcSRobert Mustacchi 
7919d26e4fcSRobert Mustacchi 	/* IPv6 --> GRE/NAT -> IPv6 */
7929d26e4fcSRobert Mustacchi 	I40E_PTT(117, IP, IPV6, NOF, IP_GRENAT, IPV6, FRG, NONE, PAY3),
7939d26e4fcSRobert Mustacchi 	I40E_PTT(118, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, NONE, PAY3),
7949d26e4fcSRobert Mustacchi 	I40E_PTT(119, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, UDP,  PAY4),
7959d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(120),
7969d26e4fcSRobert Mustacchi 	I40E_PTT(121, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, TCP,  PAY4),
7979d26e4fcSRobert Mustacchi 	I40E_PTT(122, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, SCTP, PAY4),
7989d26e4fcSRobert Mustacchi 	I40E_PTT(123, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, ICMP, PAY4),
7999d26e4fcSRobert Mustacchi 
8009d26e4fcSRobert Mustacchi 	/* IPv6 --> GRE/NAT -> MAC */
8019d26e4fcSRobert Mustacchi 	I40E_PTT(124, IP, IPV6, NOF, IP_GRENAT_MAC, NONE, NOF, NONE, PAY3),
8029d26e4fcSRobert Mustacchi 
8039d26e4fcSRobert Mustacchi 	/* IPv6 --> GRE/NAT -> MAC -> IPv4 */
8049d26e4fcSRobert Mustacchi 	I40E_PTT(125, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, FRG, NONE, PAY3),
8059d26e4fcSRobert Mustacchi 	I40E_PTT(126, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, NONE, PAY3),
8069d26e4fcSRobert Mustacchi 	I40E_PTT(127, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, UDP,  PAY4),
8079d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(128),
8089d26e4fcSRobert Mustacchi 	I40E_PTT(129, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, TCP,  PAY4),
8099d26e4fcSRobert Mustacchi 	I40E_PTT(130, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, SCTP, PAY4),
8109d26e4fcSRobert Mustacchi 	I40E_PTT(131, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, ICMP, PAY4),
8119d26e4fcSRobert Mustacchi 
8129d26e4fcSRobert Mustacchi 	/* IPv6 --> GRE/NAT -> MAC -> IPv6 */
8139d26e4fcSRobert Mustacchi 	I40E_PTT(132, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, FRG, NONE, PAY3),
8149d26e4fcSRobert Mustacchi 	I40E_PTT(133, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, NONE, PAY3),
8159d26e4fcSRobert Mustacchi 	I40E_PTT(134, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, UDP,  PAY4),
8169d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(135),
8179d26e4fcSRobert Mustacchi 	I40E_PTT(136, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, TCP,  PAY4),
8189d26e4fcSRobert Mustacchi 	I40E_PTT(137, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, SCTP, PAY4),
8199d26e4fcSRobert Mustacchi 	I40E_PTT(138, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, ICMP, PAY4),
8209d26e4fcSRobert Mustacchi 
8219d26e4fcSRobert Mustacchi 	/* IPv6 --> GRE/NAT -> MAC/VLAN */
8229d26e4fcSRobert Mustacchi 	I40E_PTT(139, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, NONE, NOF, NONE, PAY3),
8239d26e4fcSRobert Mustacchi 
8249d26e4fcSRobert Mustacchi 	/* IPv6 --> GRE/NAT -> MAC/VLAN --> IPv4 */
8259d26e4fcSRobert Mustacchi 	I40E_PTT(140, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, FRG, NONE, PAY3),
8269d26e4fcSRobert Mustacchi 	I40E_PTT(141, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, NONE, PAY3),
8279d26e4fcSRobert Mustacchi 	I40E_PTT(142, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, UDP,  PAY4),
8289d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(143),
8299d26e4fcSRobert Mustacchi 	I40E_PTT(144, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, TCP,  PAY4),
8309d26e4fcSRobert Mustacchi 	I40E_PTT(145, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, SCTP, PAY4),
8319d26e4fcSRobert Mustacchi 	I40E_PTT(146, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, ICMP, PAY4),
8329d26e4fcSRobert Mustacchi 
8339d26e4fcSRobert Mustacchi 	/* IPv6 --> GRE/NAT -> MAC/VLAN --> IPv6 */
8349d26e4fcSRobert Mustacchi 	I40E_PTT(147, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, FRG, NONE, PAY3),
8359d26e4fcSRobert Mustacchi 	I40E_PTT(148, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, NONE, PAY3),
8369d26e4fcSRobert Mustacchi 	I40E_PTT(149, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, UDP,  PAY4),
8379d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(150),
8389d26e4fcSRobert Mustacchi 	I40E_PTT(151, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, TCP,  PAY4),
8399d26e4fcSRobert Mustacchi 	I40E_PTT(152, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, SCTP, PAY4),
8409d26e4fcSRobert Mustacchi 	I40E_PTT(153, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, ICMP, PAY4),
8419d26e4fcSRobert Mustacchi 
8429d26e4fcSRobert Mustacchi 	/* unused entries */
8439d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(154),
8449d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(155),
8459d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(156),
8469d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(157),
8479d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(158),
8489d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(159),
8499d26e4fcSRobert Mustacchi 
8509d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(160),
8519d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(161),
8529d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(162),
8539d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(163),
8549d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(164),
8559d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(165),
8569d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(166),
8579d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(167),
8589d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(168),
8599d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(169),
8609d26e4fcSRobert Mustacchi 
8619d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(170),
8629d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(171),
8639d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(172),
8649d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(173),
8659d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(174),
8669d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(175),
8679d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(176),
8689d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(177),
8699d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(178),
8709d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(179),
8719d26e4fcSRobert Mustacchi 
8729d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(180),
8739d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(181),
8749d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(182),
8759d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(183),
8769d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(184),
8779d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(185),
8789d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(186),
8799d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(187),
8809d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(188),
8819d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(189),
8829d26e4fcSRobert Mustacchi 
8839d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(190),
8849d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(191),
8859d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(192),
8869d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(193),
8879d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(194),
8889d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(195),
8899d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(196),
8909d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(197),
8919d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(198),
8929d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(199),
8939d26e4fcSRobert Mustacchi 
8949d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(200),
8959d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(201),
8969d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(202),
8979d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(203),
8989d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(204),
8999d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(205),
9009d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(206),
9019d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(207),
9029d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(208),
9039d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(209),
9049d26e4fcSRobert Mustacchi 
9059d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(210),
9069d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(211),
9079d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(212),
9089d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(213),
9099d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(214),
9109d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(215),
9119d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(216),
9129d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(217),
9139d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(218),
9149d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(219),
9159d26e4fcSRobert Mustacchi 
9169d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(220),
9179d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(221),
9189d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(222),
9199d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(223),
9209d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(224),
9219d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(225),
9229d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(226),
9239d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(227),
9249d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(228),
9259d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(229),
9269d26e4fcSRobert Mustacchi 
9279d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(230),
9289d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(231),
9299d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(232),
9309d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(233),
9319d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(234),
9329d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(235),
9339d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(236),
9349d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(237),
9359d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(238),
9369d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(239),
9379d26e4fcSRobert Mustacchi 
9389d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(240),
9399d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(241),
9409d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(242),
9419d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(243),
9429d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(244),
9439d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(245),
9449d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(246),
9459d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(247),
9469d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(248),
9479d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(249),
9489d26e4fcSRobert Mustacchi 
9499d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(250),
9509d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(251),
9519d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(252),
9529d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(253),
9539d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(254),
9549d26e4fcSRobert Mustacchi 	I40E_PTT_UNUSED_ENTRY(255)
9559d26e4fcSRobert Mustacchi };
9569d26e4fcSRobert Mustacchi 
9579d26e4fcSRobert Mustacchi 
9589d26e4fcSRobert Mustacchi /**
9599d26e4fcSRobert Mustacchi  * i40e_validate_mac_addr - Validate unicast MAC address
9609d26e4fcSRobert Mustacchi  * @mac_addr: pointer to MAC address
9619d26e4fcSRobert Mustacchi  *
9629d26e4fcSRobert Mustacchi  * Tests a MAC address to ensure it is a valid Individual Address
9639d26e4fcSRobert Mustacchi  **/
i40e_validate_mac_addr(u8 * mac_addr)9649d26e4fcSRobert Mustacchi enum i40e_status_code i40e_validate_mac_addr(u8 *mac_addr)
9659d26e4fcSRobert Mustacchi {
9669d26e4fcSRobert Mustacchi 	enum i40e_status_code status = I40E_SUCCESS;
9679d26e4fcSRobert Mustacchi 
9689d26e4fcSRobert Mustacchi 	DEBUGFUNC("i40e_validate_mac_addr");
9699d26e4fcSRobert Mustacchi 
9709d26e4fcSRobert Mustacchi 	/* Broadcast addresses ARE multicast addresses
9719d26e4fcSRobert Mustacchi 	 * Make sure it is not a multicast address
9729d26e4fcSRobert Mustacchi 	 * Reject the zero address
9739d26e4fcSRobert Mustacchi 	 */
9749d26e4fcSRobert Mustacchi 	if (I40E_IS_MULTICAST(mac_addr) ||
9759d26e4fcSRobert Mustacchi 	    (mac_addr[0] == 0 && mac_addr[1] == 0 && mac_addr[2] == 0 &&
9769d26e4fcSRobert Mustacchi 	      mac_addr[3] == 0 && mac_addr[4] == 0 && mac_addr[5] == 0))
9779d26e4fcSRobert Mustacchi 		status = I40E_ERR_INVALID_MAC_ADDR;
9789d26e4fcSRobert Mustacchi 
9799d26e4fcSRobert Mustacchi 	return status;
9809d26e4fcSRobert Mustacchi }
9819d26e4fcSRobert Mustacchi 
9829d26e4fcSRobert Mustacchi /**
9839d26e4fcSRobert Mustacchi  * i40e_init_shared_code - Initialize the shared code
9849d26e4fcSRobert Mustacchi  * @hw: pointer to hardware structure
9859d26e4fcSRobert Mustacchi  *
9869d26e4fcSRobert Mustacchi  * This assigns the MAC type and PHY code and inits the NVM.
9879d26e4fcSRobert Mustacchi  * Does not touch the hardware. This function must be called prior to any
9889d26e4fcSRobert Mustacchi  * other function in the shared code. The i40e_hw structure should be
9899d26e4fcSRobert Mustacchi  * memset to 0 prior to calling this function.  The following fields in
9909d26e4fcSRobert Mustacchi  * hw structure should be filled in prior to calling this function:
9919d26e4fcSRobert Mustacchi  * hw_addr, back, device_id, vendor_id, subsystem_device_id,
9929d26e4fcSRobert Mustacchi  * subsystem_vendor_id, and revision_id
9939d26e4fcSRobert Mustacchi  **/
i40e_init_shared_code(struct i40e_hw * hw)9949d26e4fcSRobert Mustacchi enum i40e_status_code i40e_init_shared_code(struct i40e_hw *hw)
9959d26e4fcSRobert Mustacchi {
9969d26e4fcSRobert Mustacchi 	enum i40e_status_code status = I40E_SUCCESS;
9979d26e4fcSRobert Mustacchi 	u32 port, ari, func_rid;
9989d26e4fcSRobert Mustacchi 
9999d26e4fcSRobert Mustacchi 	DEBUGFUNC("i40e_init_shared_code");
10009d26e4fcSRobert Mustacchi 
10019d26e4fcSRobert Mustacchi 	i40e_set_mac_type(hw);
10029d26e4fcSRobert Mustacchi 
10039d26e4fcSRobert Mustacchi 	switch (hw->mac.type) {
10049d26e4fcSRobert Mustacchi 	case I40E_MAC_XL710:
10059d26e4fcSRobert Mustacchi 	case I40E_MAC_X722:
10069d26e4fcSRobert Mustacchi 		break;
10079d26e4fcSRobert Mustacchi 	default:
10089d26e4fcSRobert Mustacchi 		return I40E_ERR_DEVICE_NOT_SUPPORTED;
10099d26e4fcSRobert Mustacchi 	}
10109d26e4fcSRobert Mustacchi 
10119d26e4fcSRobert Mustacchi 	hw->phy.get_link_info = TRUE;
10129d26e4fcSRobert Mustacchi 
10139d26e4fcSRobert Mustacchi 	/* Determine port number and PF number*/
10149d26e4fcSRobert Mustacchi 	port = (rd32(hw, I40E_PFGEN_PORTNUM) & I40E_PFGEN_PORTNUM_PORT_NUM_MASK)
10159d26e4fcSRobert Mustacchi 					   >> I40E_PFGEN_PORTNUM_PORT_NUM_SHIFT;
10169d26e4fcSRobert Mustacchi 	hw->port = (u8)port;
10179d26e4fcSRobert Mustacchi 	ari = (rd32(hw, I40E_GLPCI_CAPSUP) & I40E_GLPCI_CAPSUP_ARI_EN_MASK) >>
10189d26e4fcSRobert Mustacchi 						 I40E_GLPCI_CAPSUP_ARI_EN_SHIFT;
10199d26e4fcSRobert Mustacchi 	func_rid = rd32(hw, I40E_PF_FUNC_RID);
10209d26e4fcSRobert Mustacchi 	if (ari)
10219d26e4fcSRobert Mustacchi 		hw->pf_id = (u8)(func_rid & 0xff);
10229d26e4fcSRobert Mustacchi 	else
10239d26e4fcSRobert Mustacchi 		hw->pf_id = (u8)(func_rid & 0x7);
10249d26e4fcSRobert Mustacchi 
1025*df36e06dSRobert Mustacchi 	/* NVMUpdate features structure initialization */
1026*df36e06dSRobert Mustacchi 	hw->nvmupd_features.major = I40E_NVMUPD_FEATURES_API_VER_MAJOR;
1027*df36e06dSRobert Mustacchi 	hw->nvmupd_features.minor = I40E_NVMUPD_FEATURES_API_VER_MINOR;
1028*df36e06dSRobert Mustacchi 	hw->nvmupd_features.size = sizeof(hw->nvmupd_features);
1029*df36e06dSRobert Mustacchi 	i40e_memset(hw->nvmupd_features.features, 0x0,
1030*df36e06dSRobert Mustacchi 		    I40E_NVMUPD_FEATURES_API_FEATURES_ARRAY_LEN *
1031*df36e06dSRobert Mustacchi 		    sizeof(*hw->nvmupd_features.features),
1032*df36e06dSRobert Mustacchi 		    I40E_NONDMA_MEM);
1033*df36e06dSRobert Mustacchi 
1034*df36e06dSRobert Mustacchi 	/* No features supported at the moment */
1035*df36e06dSRobert Mustacchi 	hw->nvmupd_features.features[0] = 0;
10363d75a287SRobert Mustacchi 
10379d26e4fcSRobert Mustacchi 	status = i40e_init_nvm(hw);
10389d26e4fcSRobert Mustacchi 	return status;
10399d26e4fcSRobert Mustacchi }
10409d26e4fcSRobert Mustacchi 
10419d26e4fcSRobert Mustacchi /**
10429d26e4fcSRobert Mustacchi  * i40e_aq_mac_address_read - Retrieve the MAC addresses
10439d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
10449d26e4fcSRobert Mustacchi  * @flags: a return indicator of what addresses were added to the addr store
10459d26e4fcSRobert Mustacchi  * @addrs: the requestor's mac addr store
10469d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
10479d26e4fcSRobert Mustacchi  **/
i40e_aq_mac_address_read(struct i40e_hw * hw,u16 * flags,struct i40e_aqc_mac_address_read_data * addrs,struct i40e_asq_cmd_details * cmd_details)10489d26e4fcSRobert Mustacchi static enum i40e_status_code i40e_aq_mac_address_read(struct i40e_hw *hw,
10499d26e4fcSRobert Mustacchi 				   u16 *flags,
10509d26e4fcSRobert Mustacchi 				   struct i40e_aqc_mac_address_read_data *addrs,
10519d26e4fcSRobert Mustacchi 				   struct i40e_asq_cmd_details *cmd_details)
10529d26e4fcSRobert Mustacchi {
10539d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
10549d26e4fcSRobert Mustacchi 	struct i40e_aqc_mac_address_read *cmd_data =
10559d26e4fcSRobert Mustacchi 		(struct i40e_aqc_mac_address_read *)&desc.params.raw;
10569d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
10579d26e4fcSRobert Mustacchi 
10589d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_mac_address_read);
10599d26e4fcSRobert Mustacchi 	desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF);
10609d26e4fcSRobert Mustacchi 
10619d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, addrs,
10629d26e4fcSRobert Mustacchi 				       sizeof(*addrs), cmd_details);
10639d26e4fcSRobert Mustacchi 	*flags = LE16_TO_CPU(cmd_data->command_flags);
10649d26e4fcSRobert Mustacchi 
10659d26e4fcSRobert Mustacchi 	return status;
10669d26e4fcSRobert Mustacchi }
10679d26e4fcSRobert Mustacchi 
10689d26e4fcSRobert Mustacchi /**
10699d26e4fcSRobert Mustacchi  * i40e_aq_mac_address_write - Change the MAC addresses
10709d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
10719d26e4fcSRobert Mustacchi  * @flags: indicates which MAC to be written
10729d26e4fcSRobert Mustacchi  * @mac_addr: address to write
10739d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
10749d26e4fcSRobert Mustacchi  **/
i40e_aq_mac_address_write(struct i40e_hw * hw,u16 flags,u8 * mac_addr,struct i40e_asq_cmd_details * cmd_details)10759d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_mac_address_write(struct i40e_hw *hw,
10769d26e4fcSRobert Mustacchi 				    u16 flags, u8 *mac_addr,
10779d26e4fcSRobert Mustacchi 				    struct i40e_asq_cmd_details *cmd_details)
10789d26e4fcSRobert Mustacchi {
10799d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
10809d26e4fcSRobert Mustacchi 	struct i40e_aqc_mac_address_write *cmd_data =
10819d26e4fcSRobert Mustacchi 		(struct i40e_aqc_mac_address_write *)&desc.params.raw;
10829d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
10839d26e4fcSRobert Mustacchi 
10849d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
10859d26e4fcSRobert Mustacchi 					  i40e_aqc_opc_mac_address_write);
10869d26e4fcSRobert Mustacchi 	cmd_data->command_flags = CPU_TO_LE16(flags);
10879d26e4fcSRobert Mustacchi 	cmd_data->mac_sah = CPU_TO_LE16((u16)mac_addr[0] << 8 | mac_addr[1]);
10889d26e4fcSRobert Mustacchi 	cmd_data->mac_sal = CPU_TO_LE32(((u32)mac_addr[2] << 24) |
10899d26e4fcSRobert Mustacchi 					((u32)mac_addr[3] << 16) |
10909d26e4fcSRobert Mustacchi 					((u32)mac_addr[4] << 8) |
10919d26e4fcSRobert Mustacchi 					mac_addr[5]);
10929d26e4fcSRobert Mustacchi 
10939d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
10949d26e4fcSRobert Mustacchi 
10959d26e4fcSRobert Mustacchi 	return status;
10969d26e4fcSRobert Mustacchi }
10979d26e4fcSRobert Mustacchi 
10989d26e4fcSRobert Mustacchi /**
10999d26e4fcSRobert Mustacchi  * i40e_get_mac_addr - get MAC address
11009d26e4fcSRobert Mustacchi  * @hw: pointer to the HW structure
11019d26e4fcSRobert Mustacchi  * @mac_addr: pointer to MAC address
11029d26e4fcSRobert Mustacchi  *
11039d26e4fcSRobert Mustacchi  * Reads the adapter's MAC address from register
11049d26e4fcSRobert Mustacchi  **/
i40e_get_mac_addr(struct i40e_hw * hw,u8 * mac_addr)11059d26e4fcSRobert Mustacchi enum i40e_status_code i40e_get_mac_addr(struct i40e_hw *hw, u8 *mac_addr)
11069d26e4fcSRobert Mustacchi {
11079d26e4fcSRobert Mustacchi 	struct i40e_aqc_mac_address_read_data addrs;
11089d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
11099d26e4fcSRobert Mustacchi 	u16 flags = 0;
11109d26e4fcSRobert Mustacchi 
11119d26e4fcSRobert Mustacchi 	status = i40e_aq_mac_address_read(hw, &flags, &addrs, NULL);
11129d26e4fcSRobert Mustacchi 
11139d26e4fcSRobert Mustacchi 	if (flags & I40E_AQC_LAN_ADDR_VALID)
11143d75a287SRobert Mustacchi 		i40e_memcpy(mac_addr, &addrs.pf_lan_mac, sizeof(addrs.pf_lan_mac),
11153d75a287SRobert Mustacchi 			I40E_NONDMA_TO_NONDMA);
11169d26e4fcSRobert Mustacchi 
11179d26e4fcSRobert Mustacchi 	return status;
11189d26e4fcSRobert Mustacchi }
11199d26e4fcSRobert Mustacchi 
11209d26e4fcSRobert Mustacchi /**
11219d26e4fcSRobert Mustacchi  * i40e_get_port_mac_addr - get Port MAC address
11229d26e4fcSRobert Mustacchi  * @hw: pointer to the HW structure
11239d26e4fcSRobert Mustacchi  * @mac_addr: pointer to Port MAC address
11249d26e4fcSRobert Mustacchi  *
11259d26e4fcSRobert Mustacchi  * Reads the adapter's Port MAC address
11269d26e4fcSRobert Mustacchi  **/
i40e_get_port_mac_addr(struct i40e_hw * hw,u8 * mac_addr)11279d26e4fcSRobert Mustacchi enum i40e_status_code i40e_get_port_mac_addr(struct i40e_hw *hw, u8 *mac_addr)
11289d26e4fcSRobert Mustacchi {
11299d26e4fcSRobert Mustacchi 	struct i40e_aqc_mac_address_read_data addrs;
11309d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
11319d26e4fcSRobert Mustacchi 	u16 flags = 0;
11329d26e4fcSRobert Mustacchi 
11339d26e4fcSRobert Mustacchi 	status = i40e_aq_mac_address_read(hw, &flags, &addrs, NULL);
11349d26e4fcSRobert Mustacchi 	if (status)
11359d26e4fcSRobert Mustacchi 		return status;
11369d26e4fcSRobert Mustacchi 
11379d26e4fcSRobert Mustacchi 	if (flags & I40E_AQC_PORT_ADDR_VALID)
11383d75a287SRobert Mustacchi 		i40e_memcpy(mac_addr, &addrs.port_mac, sizeof(addrs.port_mac),
11393d75a287SRobert Mustacchi 			I40E_NONDMA_TO_NONDMA);
11409d26e4fcSRobert Mustacchi 	else
11419d26e4fcSRobert Mustacchi 		status = I40E_ERR_INVALID_MAC_ADDR;
11429d26e4fcSRobert Mustacchi 
11439d26e4fcSRobert Mustacchi 	return status;
11449d26e4fcSRobert Mustacchi }
11459d26e4fcSRobert Mustacchi 
11469d26e4fcSRobert Mustacchi /**
11479d26e4fcSRobert Mustacchi  * i40e_pre_tx_queue_cfg - pre tx queue configure
11489d26e4fcSRobert Mustacchi  * @hw: pointer to the HW structure
11499d26e4fcSRobert Mustacchi  * @queue: target pf queue index
11509d26e4fcSRobert Mustacchi  * @enable: state change request
11519d26e4fcSRobert Mustacchi  *
11529d26e4fcSRobert Mustacchi  * Handles hw requirement to indicate intention to enable
11539d26e4fcSRobert Mustacchi  * or disable target queue.
11549d26e4fcSRobert Mustacchi  **/
i40e_pre_tx_queue_cfg(struct i40e_hw * hw,u32 queue,bool enable)11559d26e4fcSRobert Mustacchi void i40e_pre_tx_queue_cfg(struct i40e_hw *hw, u32 queue, bool enable)
11569d26e4fcSRobert Mustacchi {
11579d26e4fcSRobert Mustacchi 	u32 abs_queue_idx = hw->func_caps.base_queue + queue;
11589d26e4fcSRobert Mustacchi 	u32 reg_block = 0;
11599d26e4fcSRobert Mustacchi 	u32 reg_val;
11609d26e4fcSRobert Mustacchi 
11619d26e4fcSRobert Mustacchi 	if (abs_queue_idx >= 128) {
11629d26e4fcSRobert Mustacchi 		reg_block = abs_queue_idx / 128;
11639d26e4fcSRobert Mustacchi 		abs_queue_idx %= 128;
11649d26e4fcSRobert Mustacchi 	}
11659d26e4fcSRobert Mustacchi 
11669d26e4fcSRobert Mustacchi 	reg_val = rd32(hw, I40E_GLLAN_TXPRE_QDIS(reg_block));
11679d26e4fcSRobert Mustacchi 	reg_val &= ~I40E_GLLAN_TXPRE_QDIS_QINDX_MASK;
11689d26e4fcSRobert Mustacchi 	reg_val |= (abs_queue_idx << I40E_GLLAN_TXPRE_QDIS_QINDX_SHIFT);
11699d26e4fcSRobert Mustacchi 
11709d26e4fcSRobert Mustacchi 	if (enable)
11719d26e4fcSRobert Mustacchi 		reg_val |= I40E_GLLAN_TXPRE_QDIS_CLEAR_QDIS_MASK;
11729d26e4fcSRobert Mustacchi 	else
11739d26e4fcSRobert Mustacchi 		reg_val |= I40E_GLLAN_TXPRE_QDIS_SET_QDIS_MASK;
11749d26e4fcSRobert Mustacchi 
11759d26e4fcSRobert Mustacchi 	wr32(hw, I40E_GLLAN_TXPRE_QDIS(reg_block), reg_val);
11769d26e4fcSRobert Mustacchi }
11779d26e4fcSRobert Mustacchi 
11789d26e4fcSRobert Mustacchi /**
11799d26e4fcSRobert Mustacchi  *  i40e_read_pba_string - Reads part number string from EEPROM
11809d26e4fcSRobert Mustacchi  *  @hw: pointer to hardware structure
11819d26e4fcSRobert Mustacchi  *  @pba_num: stores the part number string from the EEPROM
11829d26e4fcSRobert Mustacchi  *  @pba_num_size: part number string buffer length
11839d26e4fcSRobert Mustacchi  *
11849d26e4fcSRobert Mustacchi  *  Reads the part number string from the EEPROM.
11859d26e4fcSRobert Mustacchi  **/
i40e_read_pba_string(struct i40e_hw * hw,u8 * pba_num,u32 pba_num_size)11869d26e4fcSRobert Mustacchi enum i40e_status_code i40e_read_pba_string(struct i40e_hw *hw, u8 *pba_num,
11879d26e4fcSRobert Mustacchi 					    u32 pba_num_size)
11889d26e4fcSRobert Mustacchi {
11899d26e4fcSRobert Mustacchi 	enum i40e_status_code status = I40E_SUCCESS;
11909d26e4fcSRobert Mustacchi 	u16 pba_word = 0;
11919d26e4fcSRobert Mustacchi 	u16 pba_size = 0;
11929d26e4fcSRobert Mustacchi 	u16 pba_ptr = 0;
11939d26e4fcSRobert Mustacchi 	u16 i = 0;
11949d26e4fcSRobert Mustacchi 
11959d26e4fcSRobert Mustacchi 	status = i40e_read_nvm_word(hw, I40E_SR_PBA_FLAGS, &pba_word);
11969d26e4fcSRobert Mustacchi 	if ((status != I40E_SUCCESS) || (pba_word != 0xFAFA)) {
11979d26e4fcSRobert Mustacchi 		DEBUGOUT("Failed to read PBA flags or flag is invalid.\n");
11989d26e4fcSRobert Mustacchi 		return status;
11999d26e4fcSRobert Mustacchi 	}
12009d26e4fcSRobert Mustacchi 
12019d26e4fcSRobert Mustacchi 	status = i40e_read_nvm_word(hw, I40E_SR_PBA_BLOCK_PTR, &pba_ptr);
12029d26e4fcSRobert Mustacchi 	if (status != I40E_SUCCESS) {
12039d26e4fcSRobert Mustacchi 		DEBUGOUT("Failed to read PBA Block pointer.\n");
12049d26e4fcSRobert Mustacchi 		return status;
12059d26e4fcSRobert Mustacchi 	}
12069d26e4fcSRobert Mustacchi 
12079d26e4fcSRobert Mustacchi 	status = i40e_read_nvm_word(hw, pba_ptr, &pba_size);
12089d26e4fcSRobert Mustacchi 	if (status != I40E_SUCCESS) {
12099d26e4fcSRobert Mustacchi 		DEBUGOUT("Failed to read PBA Block size.\n");
12109d26e4fcSRobert Mustacchi 		return status;
12119d26e4fcSRobert Mustacchi 	}
12129d26e4fcSRobert Mustacchi 
12139d26e4fcSRobert Mustacchi 	/* Subtract one to get PBA word count (PBA Size word is included in
12149d26e4fcSRobert Mustacchi 	 * total size)
12159d26e4fcSRobert Mustacchi 	 */
12169d26e4fcSRobert Mustacchi 	pba_size--;
12179d26e4fcSRobert Mustacchi 	if (pba_num_size < (((u32)pba_size * 2) + 1)) {
12189d26e4fcSRobert Mustacchi 		DEBUGOUT("Buffer to small for PBA data.\n");
12199d26e4fcSRobert Mustacchi 		return I40E_ERR_PARAM;
12209d26e4fcSRobert Mustacchi 	}
12219d26e4fcSRobert Mustacchi 
12229d26e4fcSRobert Mustacchi 	for (i = 0; i < pba_size; i++) {
12239d26e4fcSRobert Mustacchi 		status = i40e_read_nvm_word(hw, (pba_ptr + 1) + i, &pba_word);
12249d26e4fcSRobert Mustacchi 		if (status != I40E_SUCCESS) {
12259d26e4fcSRobert Mustacchi 			DEBUGOUT1("Failed to read PBA Block word %d.\n", i);
12269d26e4fcSRobert Mustacchi 			return status;
12279d26e4fcSRobert Mustacchi 		}
12289d26e4fcSRobert Mustacchi 
12299d26e4fcSRobert Mustacchi 		pba_num[(i * 2)] = (pba_word >> 8) & 0xFF;
12309d26e4fcSRobert Mustacchi 		pba_num[(i * 2) + 1] = pba_word & 0xFF;
12319d26e4fcSRobert Mustacchi 	}
12329d26e4fcSRobert Mustacchi 	pba_num[(pba_size * 2)] = '\0';
12339d26e4fcSRobert Mustacchi 
12349d26e4fcSRobert Mustacchi 	return status;
12359d26e4fcSRobert Mustacchi }
12369d26e4fcSRobert Mustacchi 
12379d26e4fcSRobert Mustacchi /**
12389d26e4fcSRobert Mustacchi  * i40e_get_media_type - Gets media type
12399d26e4fcSRobert Mustacchi  * @hw: pointer to the hardware structure
12409d26e4fcSRobert Mustacchi  **/
i40e_get_media_type(struct i40e_hw * hw)12419d26e4fcSRobert Mustacchi static enum i40e_media_type i40e_get_media_type(struct i40e_hw *hw)
12429d26e4fcSRobert Mustacchi {
12439d26e4fcSRobert Mustacchi 	enum i40e_media_type media;
12449d26e4fcSRobert Mustacchi 
12459d26e4fcSRobert Mustacchi 	switch (hw->phy.link_info.phy_type) {
12469d26e4fcSRobert Mustacchi 	case I40E_PHY_TYPE_10GBASE_SR:
12479d26e4fcSRobert Mustacchi 	case I40E_PHY_TYPE_10GBASE_LR:
12489d26e4fcSRobert Mustacchi 	case I40E_PHY_TYPE_1000BASE_SX:
12499d26e4fcSRobert Mustacchi 	case I40E_PHY_TYPE_1000BASE_LX:
12509d26e4fcSRobert Mustacchi 	case I40E_PHY_TYPE_40GBASE_SR4:
12519d26e4fcSRobert Mustacchi 	case I40E_PHY_TYPE_40GBASE_LR4:
12523d75a287SRobert Mustacchi 	case I40E_PHY_TYPE_25GBASE_LR:
12533d75a287SRobert Mustacchi 	case I40E_PHY_TYPE_25GBASE_SR:
12549d26e4fcSRobert Mustacchi 		media = I40E_MEDIA_TYPE_FIBER;
12559d26e4fcSRobert Mustacchi 		break;
12569d26e4fcSRobert Mustacchi 	case I40E_PHY_TYPE_100BASE_TX:
12579d26e4fcSRobert Mustacchi 	case I40E_PHY_TYPE_1000BASE_T:
1258*df36e06dSRobert Mustacchi 	case I40E_PHY_TYPE_2_5GBASE_T:
1259*df36e06dSRobert Mustacchi 	case I40E_PHY_TYPE_5GBASE_T:
12609d26e4fcSRobert Mustacchi 	case I40E_PHY_TYPE_10GBASE_T:
12619d26e4fcSRobert Mustacchi 		media = I40E_MEDIA_TYPE_BASET;
12629d26e4fcSRobert Mustacchi 		break;
12639d26e4fcSRobert Mustacchi 	case I40E_PHY_TYPE_10GBASE_CR1_CU:
12649d26e4fcSRobert Mustacchi 	case I40E_PHY_TYPE_40GBASE_CR4_CU:
12659d26e4fcSRobert Mustacchi 	case I40E_PHY_TYPE_10GBASE_CR1:
12669d26e4fcSRobert Mustacchi 	case I40E_PHY_TYPE_40GBASE_CR4:
12679d26e4fcSRobert Mustacchi 	case I40E_PHY_TYPE_10GBASE_SFPP_CU:
12689d26e4fcSRobert Mustacchi 	case I40E_PHY_TYPE_40GBASE_AOC:
12699d26e4fcSRobert Mustacchi 	case I40E_PHY_TYPE_10GBASE_AOC:
12703d75a287SRobert Mustacchi 	case I40E_PHY_TYPE_25GBASE_CR:
127193f1cac5SPaul Winder 	case I40E_PHY_TYPE_25GBASE_AOC:
127293f1cac5SPaul Winder 	case I40E_PHY_TYPE_25GBASE_ACC:
12739d26e4fcSRobert Mustacchi 		media = I40E_MEDIA_TYPE_DA;
12749d26e4fcSRobert Mustacchi 		break;
12759d26e4fcSRobert Mustacchi 	case I40E_PHY_TYPE_1000BASE_KX:
12769d26e4fcSRobert Mustacchi 	case I40E_PHY_TYPE_10GBASE_KX4:
12779d26e4fcSRobert Mustacchi 	case I40E_PHY_TYPE_10GBASE_KR:
12789d26e4fcSRobert Mustacchi 	case I40E_PHY_TYPE_40GBASE_KR4:
12799d26e4fcSRobert Mustacchi 	case I40E_PHY_TYPE_20GBASE_KR2:
12803d75a287SRobert Mustacchi 	case I40E_PHY_TYPE_25GBASE_KR:
12819d26e4fcSRobert Mustacchi 		media = I40E_MEDIA_TYPE_BACKPLANE;
12829d26e4fcSRobert Mustacchi 		break;
12839d26e4fcSRobert Mustacchi 	case I40E_PHY_TYPE_SGMII:
12849d26e4fcSRobert Mustacchi 	case I40E_PHY_TYPE_XAUI:
12859d26e4fcSRobert Mustacchi 	case I40E_PHY_TYPE_XFI:
12869d26e4fcSRobert Mustacchi 	case I40E_PHY_TYPE_XLAUI:
12879d26e4fcSRobert Mustacchi 	case I40E_PHY_TYPE_XLPPI:
12889d26e4fcSRobert Mustacchi 	default:
12899d26e4fcSRobert Mustacchi 		media = I40E_MEDIA_TYPE_UNKNOWN;
12909d26e4fcSRobert Mustacchi 		break;
12919d26e4fcSRobert Mustacchi 	}
12929d26e4fcSRobert Mustacchi 
12939d26e4fcSRobert Mustacchi 	return media;
12949d26e4fcSRobert Mustacchi }
12959d26e4fcSRobert Mustacchi 
1296*df36e06dSRobert Mustacchi /**
1297*df36e06dSRobert Mustacchi  * i40e_poll_globr - Poll for Global Reset completion
1298*df36e06dSRobert Mustacchi  * @hw: pointer to the hardware structure
1299*df36e06dSRobert Mustacchi  * @retry_limit: how many times to retry before failure
1300*df36e06dSRobert Mustacchi  **/
i40e_poll_globr(struct i40e_hw * hw,u32 retry_limit)1301*df36e06dSRobert Mustacchi static enum i40e_status_code i40e_poll_globr(struct i40e_hw *hw,
1302*df36e06dSRobert Mustacchi 					     u32 retry_limit)
1303*df36e06dSRobert Mustacchi {
1304*df36e06dSRobert Mustacchi 	u32 cnt, reg = 0;
1305*df36e06dSRobert Mustacchi 
1306*df36e06dSRobert Mustacchi 	for (cnt = 0; cnt < retry_limit; cnt++) {
1307*df36e06dSRobert Mustacchi 		reg = rd32(hw, I40E_GLGEN_RSTAT);
1308*df36e06dSRobert Mustacchi 		if (!(reg & I40E_GLGEN_RSTAT_DEVSTATE_MASK))
1309*df36e06dSRobert Mustacchi 			return I40E_SUCCESS;
1310*df36e06dSRobert Mustacchi 		i40e_msec_delay(100);
1311*df36e06dSRobert Mustacchi 	}
1312*df36e06dSRobert Mustacchi 
1313*df36e06dSRobert Mustacchi 	DEBUGOUT("Global reset failed.\n");
1314*df36e06dSRobert Mustacchi 	DEBUGOUT1("I40E_GLGEN_RSTAT = 0x%x\n", reg);
1315*df36e06dSRobert Mustacchi 
1316*df36e06dSRobert Mustacchi 	return I40E_ERR_RESET_FAILED;
1317*df36e06dSRobert Mustacchi }
1318*df36e06dSRobert Mustacchi 
13199d26e4fcSRobert Mustacchi #define I40E_PF_RESET_WAIT_COUNT	200
13209d26e4fcSRobert Mustacchi /**
13219d26e4fcSRobert Mustacchi  * i40e_pf_reset - Reset the PF
13229d26e4fcSRobert Mustacchi  * @hw: pointer to the hardware structure
13239d26e4fcSRobert Mustacchi  *
13249d26e4fcSRobert Mustacchi  * Assuming someone else has triggered a global reset,
13259d26e4fcSRobert Mustacchi  * assure the global reset is complete and then reset the PF
13269d26e4fcSRobert Mustacchi  **/
i40e_pf_reset(struct i40e_hw * hw)13279d26e4fcSRobert Mustacchi enum i40e_status_code i40e_pf_reset(struct i40e_hw *hw)
13289d26e4fcSRobert Mustacchi {
13299d26e4fcSRobert Mustacchi 	u32 cnt = 0;
13309d26e4fcSRobert Mustacchi 	u32 cnt1 = 0;
13319d26e4fcSRobert Mustacchi 	u32 reg = 0;
13329d26e4fcSRobert Mustacchi 	u32 grst_del;
13339d26e4fcSRobert Mustacchi 
13349d26e4fcSRobert Mustacchi 	/* Poll for Global Reset steady state in case of recent GRST.
13359d26e4fcSRobert Mustacchi 	 * The grst delay value is in 100ms units, and we'll wait a
13369d26e4fcSRobert Mustacchi 	 * couple counts longer to be sure we don't just miss the end.
13379d26e4fcSRobert Mustacchi 	 */
13389d26e4fcSRobert Mustacchi 	grst_del = (rd32(hw, I40E_GLGEN_RSTCTL) &
13399d26e4fcSRobert Mustacchi 			I40E_GLGEN_RSTCTL_GRSTDEL_MASK) >>
13409d26e4fcSRobert Mustacchi 			I40E_GLGEN_RSTCTL_GRSTDEL_SHIFT;
13413d75a287SRobert Mustacchi 
1342*df36e06dSRobert Mustacchi 	grst_del = min(grst_del * 20, 160U);
13433d75a287SRobert Mustacchi 
13443d75a287SRobert Mustacchi 	for (cnt = 0; cnt < grst_del; cnt++) {
13459d26e4fcSRobert Mustacchi 		reg = rd32(hw, I40E_GLGEN_RSTAT);
13469d26e4fcSRobert Mustacchi 		if (!(reg & I40E_GLGEN_RSTAT_DEVSTATE_MASK))
13479d26e4fcSRobert Mustacchi 			break;
13489d26e4fcSRobert Mustacchi 		i40e_msec_delay(100);
13499d26e4fcSRobert Mustacchi 	}
13509d26e4fcSRobert Mustacchi 	if (reg & I40E_GLGEN_RSTAT_DEVSTATE_MASK) {
13519d26e4fcSRobert Mustacchi 		DEBUGOUT("Global reset polling failed to complete.\n");
13529d26e4fcSRobert Mustacchi 		return I40E_ERR_RESET_FAILED;
13539d26e4fcSRobert Mustacchi 	}
13549d26e4fcSRobert Mustacchi 
13559d26e4fcSRobert Mustacchi 	/* Now Wait for the FW to be ready */
13569d26e4fcSRobert Mustacchi 	for (cnt1 = 0; cnt1 < I40E_PF_RESET_WAIT_COUNT; cnt1++) {
13579d26e4fcSRobert Mustacchi 		reg = rd32(hw, I40E_GLNVM_ULD);
13589d26e4fcSRobert Mustacchi 		reg &= (I40E_GLNVM_ULD_CONF_CORE_DONE_MASK |
13599d26e4fcSRobert Mustacchi 			I40E_GLNVM_ULD_CONF_GLOBAL_DONE_MASK);
13609d26e4fcSRobert Mustacchi 		if (reg == (I40E_GLNVM_ULD_CONF_CORE_DONE_MASK |
13619d26e4fcSRobert Mustacchi 			    I40E_GLNVM_ULD_CONF_GLOBAL_DONE_MASK)) {
13629d26e4fcSRobert Mustacchi 			DEBUGOUT1("Core and Global modules ready %d\n", cnt1);
13639d26e4fcSRobert Mustacchi 			break;
13649d26e4fcSRobert Mustacchi 		}
13659d26e4fcSRobert Mustacchi 		i40e_msec_delay(10);
13669d26e4fcSRobert Mustacchi 	}
13679d26e4fcSRobert Mustacchi 	if (!(reg & (I40E_GLNVM_ULD_CONF_CORE_DONE_MASK |
13689d26e4fcSRobert Mustacchi 		     I40E_GLNVM_ULD_CONF_GLOBAL_DONE_MASK))) {
13699d26e4fcSRobert Mustacchi 		DEBUGOUT("wait for FW Reset complete timedout\n");
13709d26e4fcSRobert Mustacchi 		DEBUGOUT1("I40E_GLNVM_ULD = 0x%x\n", reg);
13719d26e4fcSRobert Mustacchi 		return I40E_ERR_RESET_FAILED;
13729d26e4fcSRobert Mustacchi 	}
13739d26e4fcSRobert Mustacchi 
13749d26e4fcSRobert Mustacchi 	/* If there was a Global Reset in progress when we got here,
13759d26e4fcSRobert Mustacchi 	 * we don't need to do the PF Reset
13769d26e4fcSRobert Mustacchi 	 */
13779d26e4fcSRobert Mustacchi 	if (!cnt) {
137893f1cac5SPaul Winder 		u32 reg2 = 0;
137993f1cac5SPaul Winder 
13809d26e4fcSRobert Mustacchi 		reg = rd32(hw, I40E_PFGEN_CTRL);
13819d26e4fcSRobert Mustacchi 		wr32(hw, I40E_PFGEN_CTRL,
13829d26e4fcSRobert Mustacchi 		     (reg | I40E_PFGEN_CTRL_PFSWR_MASK));
13839d26e4fcSRobert Mustacchi 		for (cnt = 0; cnt < I40E_PF_RESET_WAIT_COUNT; cnt++) {
13849d26e4fcSRobert Mustacchi 			reg = rd32(hw, I40E_PFGEN_CTRL);
13859d26e4fcSRobert Mustacchi 			if (!(reg & I40E_PFGEN_CTRL_PFSWR_MASK))
13869d26e4fcSRobert Mustacchi 				break;
138793f1cac5SPaul Winder 			reg2 = rd32(hw, I40E_GLGEN_RSTAT);
1388*df36e06dSRobert Mustacchi 			if (reg2 & I40E_GLGEN_RSTAT_DEVSTATE_MASK)
1389*df36e06dSRobert Mustacchi 				break;
13909d26e4fcSRobert Mustacchi 			i40e_msec_delay(1);
13919d26e4fcSRobert Mustacchi 		}
1392*df36e06dSRobert Mustacchi 		if (reg2 & I40E_GLGEN_RSTAT_DEVSTATE_MASK) {
1393*df36e06dSRobert Mustacchi 			if (i40e_poll_globr(hw, grst_del) != I40E_SUCCESS)
1394*df36e06dSRobert Mustacchi 				return I40E_ERR_RESET_FAILED;
1395*df36e06dSRobert Mustacchi 		} else if (reg & I40E_PFGEN_CTRL_PFSWR_MASK) {
13969d26e4fcSRobert Mustacchi 			DEBUGOUT("PF reset polling failed to complete.\n");
13979d26e4fcSRobert Mustacchi 			return I40E_ERR_RESET_FAILED;
13989d26e4fcSRobert Mustacchi 		}
13999d26e4fcSRobert Mustacchi 	}
14009d26e4fcSRobert Mustacchi 
14019d26e4fcSRobert Mustacchi 	i40e_clear_pxe_mode(hw);
14029d26e4fcSRobert Mustacchi 
14039d26e4fcSRobert Mustacchi 
14049d26e4fcSRobert Mustacchi 	return I40E_SUCCESS;
14059d26e4fcSRobert Mustacchi }
14069d26e4fcSRobert Mustacchi 
14079d26e4fcSRobert Mustacchi /**
14089d26e4fcSRobert Mustacchi  * i40e_clear_hw - clear out any left over hw state
14099d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
14109d26e4fcSRobert Mustacchi  *
14119d26e4fcSRobert Mustacchi  * Clear queues and interrupts, typically called at init time,
14129d26e4fcSRobert Mustacchi  * but after the capabilities have been found so we know how many
14139d26e4fcSRobert Mustacchi  * queues and msix vectors have been allocated.
14149d26e4fcSRobert Mustacchi  **/
i40e_clear_hw(struct i40e_hw * hw)14159d26e4fcSRobert Mustacchi void i40e_clear_hw(struct i40e_hw *hw)
14169d26e4fcSRobert Mustacchi {
14179d26e4fcSRobert Mustacchi 	u32 num_queues, base_queue;
14189d26e4fcSRobert Mustacchi 	u32 num_pf_int;
14199d26e4fcSRobert Mustacchi 	u32 num_vf_int;
14209d26e4fcSRobert Mustacchi 	u32 num_vfs;
14219d26e4fcSRobert Mustacchi 	u32 i, j;
14229d26e4fcSRobert Mustacchi 	u32 val;
14239d26e4fcSRobert Mustacchi 	u32 eol = 0x7ff;
14249d26e4fcSRobert Mustacchi 
14259d26e4fcSRobert Mustacchi 	/* get number of interrupts, queues, and vfs */
14269d26e4fcSRobert Mustacchi 	val = rd32(hw, I40E_GLPCI_CNF2);
14279d26e4fcSRobert Mustacchi 	num_pf_int = (val & I40E_GLPCI_CNF2_MSI_X_PF_N_MASK) >>
14289d26e4fcSRobert Mustacchi 			I40E_GLPCI_CNF2_MSI_X_PF_N_SHIFT;
14299d26e4fcSRobert Mustacchi 	num_vf_int = (val & I40E_GLPCI_CNF2_MSI_X_VF_N_MASK) >>
14309d26e4fcSRobert Mustacchi 			I40E_GLPCI_CNF2_MSI_X_VF_N_SHIFT;
14319d26e4fcSRobert Mustacchi 
14329d26e4fcSRobert Mustacchi 	val = rd32(hw, I40E_PFLAN_QALLOC);
14339d26e4fcSRobert Mustacchi 	base_queue = (val & I40E_PFLAN_QALLOC_FIRSTQ_MASK) >>
14349d26e4fcSRobert Mustacchi 			I40E_PFLAN_QALLOC_FIRSTQ_SHIFT;
14359d26e4fcSRobert Mustacchi 	j = (val & I40E_PFLAN_QALLOC_LASTQ_MASK) >>
14369d26e4fcSRobert Mustacchi 			I40E_PFLAN_QALLOC_LASTQ_SHIFT;
14379d26e4fcSRobert Mustacchi 	if (val & I40E_PFLAN_QALLOC_VALID_MASK)
14389d26e4fcSRobert Mustacchi 		num_queues = (j - base_queue) + 1;
14399d26e4fcSRobert Mustacchi 	else
14409d26e4fcSRobert Mustacchi 		num_queues = 0;
14419d26e4fcSRobert Mustacchi 
14429d26e4fcSRobert Mustacchi 	val = rd32(hw, I40E_PF_VT_PFALLOC);
14439d26e4fcSRobert Mustacchi 	i = (val & I40E_PF_VT_PFALLOC_FIRSTVF_MASK) >>
14449d26e4fcSRobert Mustacchi 			I40E_PF_VT_PFALLOC_FIRSTVF_SHIFT;
14459d26e4fcSRobert Mustacchi 	j = (val & I40E_PF_VT_PFALLOC_LASTVF_MASK) >>
14469d26e4fcSRobert Mustacchi 			I40E_PF_VT_PFALLOC_LASTVF_SHIFT;
14479d26e4fcSRobert Mustacchi 	if (val & I40E_PF_VT_PFALLOC_VALID_MASK)
14489d26e4fcSRobert Mustacchi 		num_vfs = (j - i) + 1;
14499d26e4fcSRobert Mustacchi 	else
14509d26e4fcSRobert Mustacchi 		num_vfs = 0;
14519d26e4fcSRobert Mustacchi 
14529d26e4fcSRobert Mustacchi 	/* stop all the interrupts */
14539d26e4fcSRobert Mustacchi 	wr32(hw, I40E_PFINT_ICR0_ENA, 0);
14549d26e4fcSRobert Mustacchi 	val = 0x3 << I40E_PFINT_DYN_CTLN_ITR_INDX_SHIFT;
14559d26e4fcSRobert Mustacchi 	for (i = 0; i < num_pf_int - 2; i++)
14569d26e4fcSRobert Mustacchi 		wr32(hw, I40E_PFINT_DYN_CTLN(i), val);
14579d26e4fcSRobert Mustacchi 
14589d26e4fcSRobert Mustacchi 	/* Set the FIRSTQ_INDX field to 0x7FF in PFINT_LNKLSTx */
14599d26e4fcSRobert Mustacchi 	val = eol << I40E_PFINT_LNKLST0_FIRSTQ_INDX_SHIFT;
14609d26e4fcSRobert Mustacchi 	wr32(hw, I40E_PFINT_LNKLST0, val);
14619d26e4fcSRobert Mustacchi 	for (i = 0; i < num_pf_int - 2; i++)
14629d26e4fcSRobert Mustacchi 		wr32(hw, I40E_PFINT_LNKLSTN(i), val);
14639d26e4fcSRobert Mustacchi 	val = eol << I40E_VPINT_LNKLST0_FIRSTQ_INDX_SHIFT;
14649d26e4fcSRobert Mustacchi 	for (i = 0; i < num_vfs; i++)
14659d26e4fcSRobert Mustacchi 		wr32(hw, I40E_VPINT_LNKLST0(i), val);
14669d26e4fcSRobert Mustacchi 	for (i = 0; i < num_vf_int - 2; i++)
14679d26e4fcSRobert Mustacchi 		wr32(hw, I40E_VPINT_LNKLSTN(i), val);
14689d26e4fcSRobert Mustacchi 
14699d26e4fcSRobert Mustacchi 	/* warn the HW of the coming Tx disables */
14709d26e4fcSRobert Mustacchi 	for (i = 0; i < num_queues; i++) {
14719d26e4fcSRobert Mustacchi 		u32 abs_queue_idx = base_queue + i;
14729d26e4fcSRobert Mustacchi 		u32 reg_block = 0;
14739d26e4fcSRobert Mustacchi 
14749d26e4fcSRobert Mustacchi 		if (abs_queue_idx >= 128) {
14759d26e4fcSRobert Mustacchi 			reg_block = abs_queue_idx / 128;
14769d26e4fcSRobert Mustacchi 			abs_queue_idx %= 128;
14779d26e4fcSRobert Mustacchi 		}
14789d26e4fcSRobert Mustacchi 
14799d26e4fcSRobert Mustacchi 		val = rd32(hw, I40E_GLLAN_TXPRE_QDIS(reg_block));
14809d26e4fcSRobert Mustacchi 		val &= ~I40E_GLLAN_TXPRE_QDIS_QINDX_MASK;
14819d26e4fcSRobert Mustacchi 		val |= (abs_queue_idx << I40E_GLLAN_TXPRE_QDIS_QINDX_SHIFT);
14829d26e4fcSRobert Mustacchi 		val |= I40E_GLLAN_TXPRE_QDIS_SET_QDIS_MASK;
14839d26e4fcSRobert Mustacchi 
14849d26e4fcSRobert Mustacchi 		wr32(hw, I40E_GLLAN_TXPRE_QDIS(reg_block), val);
14859d26e4fcSRobert Mustacchi 	}
14869d26e4fcSRobert Mustacchi 	i40e_usec_delay(400);
14879d26e4fcSRobert Mustacchi 
14889d26e4fcSRobert Mustacchi 	/* stop all the queues */
14899d26e4fcSRobert Mustacchi 	for (i = 0; i < num_queues; i++) {
14909d26e4fcSRobert Mustacchi 		wr32(hw, I40E_QINT_TQCTL(i), 0);
14919d26e4fcSRobert Mustacchi 		wr32(hw, I40E_QTX_ENA(i), 0);
14929d26e4fcSRobert Mustacchi 		wr32(hw, I40E_QINT_RQCTL(i), 0);
14939d26e4fcSRobert Mustacchi 		wr32(hw, I40E_QRX_ENA(i), 0);
14949d26e4fcSRobert Mustacchi 	}
14959d26e4fcSRobert Mustacchi 
14969d26e4fcSRobert Mustacchi 	/* short wait for all queue disables to settle */
14979d26e4fcSRobert Mustacchi 	i40e_usec_delay(50);
14989d26e4fcSRobert Mustacchi }
14999d26e4fcSRobert Mustacchi 
15009d26e4fcSRobert Mustacchi /**
15019d26e4fcSRobert Mustacchi  * i40e_clear_pxe_mode - clear pxe operations mode
15029d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
15039d26e4fcSRobert Mustacchi  *
15049d26e4fcSRobert Mustacchi  * Make sure all PXE mode settings are cleared, including things
15059d26e4fcSRobert Mustacchi  * like descriptor fetch/write-back mode.
15069d26e4fcSRobert Mustacchi  **/
i40e_clear_pxe_mode(struct i40e_hw * hw)15079d26e4fcSRobert Mustacchi void i40e_clear_pxe_mode(struct i40e_hw *hw)
15089d26e4fcSRobert Mustacchi {
15099d26e4fcSRobert Mustacchi 	if (i40e_check_asq_alive(hw))
15109d26e4fcSRobert Mustacchi 		i40e_aq_clear_pxe_mode(hw, NULL);
15119d26e4fcSRobert Mustacchi }
15129d26e4fcSRobert Mustacchi 
15139d26e4fcSRobert Mustacchi /**
15149d26e4fcSRobert Mustacchi  * i40e_led_is_mine - helper to find matching led
15159d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
15169d26e4fcSRobert Mustacchi  * @idx: index into GPIO registers
15179d26e4fcSRobert Mustacchi  *
15189d26e4fcSRobert Mustacchi  * returns: 0 if no match, otherwise the value of the GPIO_CTL register
15199d26e4fcSRobert Mustacchi  */
i40e_led_is_mine(struct i40e_hw * hw,int idx)15209d26e4fcSRobert Mustacchi static u32 i40e_led_is_mine(struct i40e_hw *hw, int idx)
15219d26e4fcSRobert Mustacchi {
15229d26e4fcSRobert Mustacchi 	u32 gpio_val = 0;
15239d26e4fcSRobert Mustacchi 	u32 port;
15249d26e4fcSRobert Mustacchi 
1525*df36e06dSRobert Mustacchi 	if (!I40E_IS_X710TL_DEVICE(hw->device_id) &&
1526*df36e06dSRobert Mustacchi 	    !hw->func_caps.led[idx])
15279d26e4fcSRobert Mustacchi 		return 0;
15289d26e4fcSRobert Mustacchi 	gpio_val = rd32(hw, I40E_GLGEN_GPIO_CTL(idx));
15299d26e4fcSRobert Mustacchi 	port = (gpio_val & I40E_GLGEN_GPIO_CTL_PRT_NUM_MASK) >>
15309d26e4fcSRobert Mustacchi 		I40E_GLGEN_GPIO_CTL_PRT_NUM_SHIFT;
15319d26e4fcSRobert Mustacchi 
15329d26e4fcSRobert Mustacchi 	/* if PRT_NUM_NA is 1 then this LED is not port specific, OR
15339d26e4fcSRobert Mustacchi 	 * if it is not our port then ignore
15349d26e4fcSRobert Mustacchi 	 */
15359d26e4fcSRobert Mustacchi 	if ((gpio_val & I40E_GLGEN_GPIO_CTL_PRT_NUM_NA_MASK) ||
15369d26e4fcSRobert Mustacchi 	    (port != hw->port))
15379d26e4fcSRobert Mustacchi 		return 0;
15389d26e4fcSRobert Mustacchi 
15399d26e4fcSRobert Mustacchi 	return gpio_val;
15409d26e4fcSRobert Mustacchi }
15419d26e4fcSRobert Mustacchi 
15429d26e4fcSRobert Mustacchi #define I40E_COMBINED_ACTIVITY 0xA
15439d26e4fcSRobert Mustacchi #define I40E_FILTER_ACTIVITY 0xE
15449d26e4fcSRobert Mustacchi #define I40E_LINK_ACTIVITY 0xC
15459d26e4fcSRobert Mustacchi #define I40E_MAC_ACTIVITY 0xD
1546*df36e06dSRobert Mustacchi #define I40E_FW_LED BIT(4)
1547*df36e06dSRobert Mustacchi #define I40E_LED_MODE_VALID (I40E_GLGEN_GPIO_CTL_LED_MODE_MASK >> \
1548*df36e06dSRobert Mustacchi 			     I40E_GLGEN_GPIO_CTL_LED_MODE_SHIFT)
1549*df36e06dSRobert Mustacchi 
15509d26e4fcSRobert Mustacchi #define I40E_LED0 22
15519d26e4fcSRobert Mustacchi 
1552*df36e06dSRobert Mustacchi #define I40E_PIN_FUNC_SDP 0x0
1553*df36e06dSRobert Mustacchi #define I40E_PIN_FUNC_LED 0x1
1554*df36e06dSRobert Mustacchi 
15559d26e4fcSRobert Mustacchi /**
15569d26e4fcSRobert Mustacchi  * i40e_led_get - return current on/off mode
15579d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
15589d26e4fcSRobert Mustacchi  *
15599d26e4fcSRobert Mustacchi  * The value returned is the 'mode' field as defined in the
15609d26e4fcSRobert Mustacchi  * GPIO register definitions: 0x0 = off, 0xf = on, and other
15619d26e4fcSRobert Mustacchi  * values are variations of possible behaviors relating to
15629d26e4fcSRobert Mustacchi  * blink, link, and wire.
15639d26e4fcSRobert Mustacchi  **/
i40e_led_get(struct i40e_hw * hw)15649d26e4fcSRobert Mustacchi u32 i40e_led_get(struct i40e_hw *hw)
15659d26e4fcSRobert Mustacchi {
15669d26e4fcSRobert Mustacchi 	u32 current_mode = 0;
15679d26e4fcSRobert Mustacchi 	u32 mode = 0;
15689d26e4fcSRobert Mustacchi 	int i;
15699d26e4fcSRobert Mustacchi 
15709d26e4fcSRobert Mustacchi 	/* as per the documentation GPIO 22-29 are the LED
15719d26e4fcSRobert Mustacchi 	 * GPIO pins named LED0..LED7
15729d26e4fcSRobert Mustacchi 	 */
15739d26e4fcSRobert Mustacchi 	for (i = I40E_LED0; i <= I40E_GLGEN_GPIO_CTL_MAX_INDEX; i++) {
15749d26e4fcSRobert Mustacchi 		u32 gpio_val = i40e_led_is_mine(hw, i);
15759d26e4fcSRobert Mustacchi 
15769d26e4fcSRobert Mustacchi 		if (!gpio_val)
15779d26e4fcSRobert Mustacchi 			continue;
15789d26e4fcSRobert Mustacchi 
15799d26e4fcSRobert Mustacchi 		/* ignore gpio LED src mode entries related to the activity
15809d26e4fcSRobert Mustacchi 		 *  LEDs
15819d26e4fcSRobert Mustacchi 		 */
15829d26e4fcSRobert Mustacchi 		current_mode = ((gpio_val & I40E_GLGEN_GPIO_CTL_LED_MODE_MASK)
15839d26e4fcSRobert Mustacchi 				>> I40E_GLGEN_GPIO_CTL_LED_MODE_SHIFT);
15849d26e4fcSRobert Mustacchi 		switch (current_mode) {
15859d26e4fcSRobert Mustacchi 		case I40E_COMBINED_ACTIVITY:
15869d26e4fcSRobert Mustacchi 		case I40E_FILTER_ACTIVITY:
15879d26e4fcSRobert Mustacchi 		case I40E_MAC_ACTIVITY:
158893f1cac5SPaul Winder 		case I40E_LINK_ACTIVITY:
15899d26e4fcSRobert Mustacchi 			continue;
15909d26e4fcSRobert Mustacchi 		default:
15919d26e4fcSRobert Mustacchi 			break;
15929d26e4fcSRobert Mustacchi 		}
15939d26e4fcSRobert Mustacchi 
15949d26e4fcSRobert Mustacchi 		mode = (gpio_val & I40E_GLGEN_GPIO_CTL_LED_MODE_MASK) >>
15959d26e4fcSRobert Mustacchi 			I40E_GLGEN_GPIO_CTL_LED_MODE_SHIFT;
15969d26e4fcSRobert Mustacchi 		break;
15979d26e4fcSRobert Mustacchi 	}
15989d26e4fcSRobert Mustacchi 
15999d26e4fcSRobert Mustacchi 	return mode;
16009d26e4fcSRobert Mustacchi }
16019d26e4fcSRobert Mustacchi 
16029d26e4fcSRobert Mustacchi /**
16039d26e4fcSRobert Mustacchi  * i40e_led_set - set new on/off mode
16049d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
16059d26e4fcSRobert Mustacchi  * @mode: 0=off, 0xf=on (else see manual for mode details)
16069d26e4fcSRobert Mustacchi  * @blink: TRUE if the LED should blink when on, FALSE if steady
16079d26e4fcSRobert Mustacchi  *
16089d26e4fcSRobert Mustacchi  * if this function is used to turn on the blink it should
16099d26e4fcSRobert Mustacchi  * be used to disable the blink when restoring the original state.
16109d26e4fcSRobert Mustacchi  **/
i40e_led_set(struct i40e_hw * hw,u32 mode,bool blink)16119d26e4fcSRobert Mustacchi void i40e_led_set(struct i40e_hw *hw, u32 mode, bool blink)
16129d26e4fcSRobert Mustacchi {
16139d26e4fcSRobert Mustacchi 	u32 current_mode = 0;
16149d26e4fcSRobert Mustacchi 	int i;
16159d26e4fcSRobert Mustacchi 
1616*df36e06dSRobert Mustacchi 	if (mode & ~I40E_LED_MODE_VALID) {
16179d26e4fcSRobert Mustacchi 		DEBUGOUT1("invalid mode passed in %X\n", mode);
1618*df36e06dSRobert Mustacchi 		return;
1619*df36e06dSRobert Mustacchi 	}
16209d26e4fcSRobert Mustacchi 
16219d26e4fcSRobert Mustacchi 	/* as per the documentation GPIO 22-29 are the LED
16229d26e4fcSRobert Mustacchi 	 * GPIO pins named LED0..LED7
16239d26e4fcSRobert Mustacchi 	 */
16249d26e4fcSRobert Mustacchi 	for (i = I40E_LED0; i <= I40E_GLGEN_GPIO_CTL_MAX_INDEX; i++) {
16259d26e4fcSRobert Mustacchi 		u32 gpio_val = i40e_led_is_mine(hw, i);
16269d26e4fcSRobert Mustacchi 
16279d26e4fcSRobert Mustacchi 		if (!gpio_val)
16289d26e4fcSRobert Mustacchi 			continue;
16299d26e4fcSRobert Mustacchi 
16309d26e4fcSRobert Mustacchi 		/* ignore gpio LED src mode entries related to the activity
16319d26e4fcSRobert Mustacchi 		 * LEDs
16329d26e4fcSRobert Mustacchi 		 */
16339d26e4fcSRobert Mustacchi 		current_mode = ((gpio_val & I40E_GLGEN_GPIO_CTL_LED_MODE_MASK)
16349d26e4fcSRobert Mustacchi 				>> I40E_GLGEN_GPIO_CTL_LED_MODE_SHIFT);
16359d26e4fcSRobert Mustacchi 		switch (current_mode) {
16369d26e4fcSRobert Mustacchi 		case I40E_COMBINED_ACTIVITY:
16379d26e4fcSRobert Mustacchi 		case I40E_FILTER_ACTIVITY:
16389d26e4fcSRobert Mustacchi 		case I40E_MAC_ACTIVITY:
163993f1cac5SPaul Winder 		case I40E_LINK_ACTIVITY:
16409d26e4fcSRobert Mustacchi 			continue;
16419d26e4fcSRobert Mustacchi 		default:
16429d26e4fcSRobert Mustacchi 			break;
16439d26e4fcSRobert Mustacchi 		}
16449d26e4fcSRobert Mustacchi 
1645*df36e06dSRobert Mustacchi 		if (I40E_IS_X710TL_DEVICE(hw->device_id)) {
1646*df36e06dSRobert Mustacchi 			u32 pin_func = 0;
1647*df36e06dSRobert Mustacchi 
1648*df36e06dSRobert Mustacchi 			if (mode & I40E_FW_LED)
1649*df36e06dSRobert Mustacchi 				pin_func = I40E_PIN_FUNC_SDP;
1650*df36e06dSRobert Mustacchi 			else
1651*df36e06dSRobert Mustacchi 				pin_func = I40E_PIN_FUNC_LED;
1652*df36e06dSRobert Mustacchi 
1653*df36e06dSRobert Mustacchi 			gpio_val &= ~I40E_GLGEN_GPIO_CTL_PIN_FUNC_MASK;
1654*df36e06dSRobert Mustacchi 			gpio_val |= ((pin_func <<
1655*df36e06dSRobert Mustacchi 				     I40E_GLGEN_GPIO_CTL_PIN_FUNC_SHIFT) &
1656*df36e06dSRobert Mustacchi 				     I40E_GLGEN_GPIO_CTL_PIN_FUNC_MASK);
1657*df36e06dSRobert Mustacchi 		}
16589d26e4fcSRobert Mustacchi 		gpio_val &= ~I40E_GLGEN_GPIO_CTL_LED_MODE_MASK;
16599d26e4fcSRobert Mustacchi 		/* this & is a bit of paranoia, but serves as a range check */
16609d26e4fcSRobert Mustacchi 		gpio_val |= ((mode << I40E_GLGEN_GPIO_CTL_LED_MODE_SHIFT) &
16619d26e4fcSRobert Mustacchi 			     I40E_GLGEN_GPIO_CTL_LED_MODE_MASK);
16629d26e4fcSRobert Mustacchi 
16639d26e4fcSRobert Mustacchi 		if (blink)
16649d26e4fcSRobert Mustacchi 			gpio_val |= BIT(I40E_GLGEN_GPIO_CTL_LED_BLINK_SHIFT);
16659d26e4fcSRobert Mustacchi 		else
16669d26e4fcSRobert Mustacchi 			gpio_val &= ~BIT(I40E_GLGEN_GPIO_CTL_LED_BLINK_SHIFT);
16679d26e4fcSRobert Mustacchi 
16689d26e4fcSRobert Mustacchi 		wr32(hw, I40E_GLGEN_GPIO_CTL(i), gpio_val);
16699d26e4fcSRobert Mustacchi 		break;
16709d26e4fcSRobert Mustacchi 	}
16719d26e4fcSRobert Mustacchi }
16729d26e4fcSRobert Mustacchi 
16739d26e4fcSRobert Mustacchi /* Admin command wrappers */
16749d26e4fcSRobert Mustacchi 
16759d26e4fcSRobert Mustacchi /**
16769d26e4fcSRobert Mustacchi  * i40e_aq_get_phy_capabilities
16779d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
16789d26e4fcSRobert Mustacchi  * @abilities: structure for PHY capabilities to be filled
16799d26e4fcSRobert Mustacchi  * @qualified_modules: report Qualified Modules
16809d26e4fcSRobert Mustacchi  * @report_init: report init capabilities (active are default)
16819d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
16829d26e4fcSRobert Mustacchi  *
16839d26e4fcSRobert Mustacchi  * Returns the various PHY abilities supported on the Port.
16849d26e4fcSRobert Mustacchi  **/
i40e_aq_get_phy_capabilities(struct i40e_hw * hw,bool qualified_modules,bool report_init,struct i40e_aq_get_phy_abilities_resp * abilities,struct i40e_asq_cmd_details * cmd_details)16859d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_get_phy_capabilities(struct i40e_hw *hw,
16869d26e4fcSRobert Mustacchi 			bool qualified_modules, bool report_init,
16879d26e4fcSRobert Mustacchi 			struct i40e_aq_get_phy_abilities_resp *abilities,
16889d26e4fcSRobert Mustacchi 			struct i40e_asq_cmd_details *cmd_details)
16899d26e4fcSRobert Mustacchi {
16909d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
16919d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
169293f1cac5SPaul Winder 	u16 max_delay = I40E_MAX_PHY_TIMEOUT, total_delay = 0;
16939d26e4fcSRobert Mustacchi 	u16 abilities_size = sizeof(struct i40e_aq_get_phy_abilities_resp);
16949d26e4fcSRobert Mustacchi 
16959d26e4fcSRobert Mustacchi 	if (!abilities)
16969d26e4fcSRobert Mustacchi 		return I40E_ERR_PARAM;
16979d26e4fcSRobert Mustacchi 
169893f1cac5SPaul Winder 	do {
169993f1cac5SPaul Winder 		i40e_fill_default_direct_cmd_desc(&desc,
170093f1cac5SPaul Winder 					       i40e_aqc_opc_get_phy_abilities);
17019d26e4fcSRobert Mustacchi 
170293f1cac5SPaul Winder 		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
170393f1cac5SPaul Winder 		if (abilities_size > I40E_AQ_LARGE_BUF)
170493f1cac5SPaul Winder 			desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
17059d26e4fcSRobert Mustacchi 
170693f1cac5SPaul Winder 		if (qualified_modules)
170793f1cac5SPaul Winder 			desc.params.external.param0 |=
17089d26e4fcSRobert Mustacchi 			CPU_TO_LE32(I40E_AQ_PHY_REPORT_QUALIFIED_MODULES);
17099d26e4fcSRobert Mustacchi 
171093f1cac5SPaul Winder 		if (report_init)
171193f1cac5SPaul Winder 			desc.params.external.param0 |=
17129d26e4fcSRobert Mustacchi 			CPU_TO_LE32(I40E_AQ_PHY_REPORT_INITIAL_VALUES);
17139d26e4fcSRobert Mustacchi 
171493f1cac5SPaul Winder 		status = i40e_asq_send_command(hw, &desc, abilities,
171593f1cac5SPaul Winder 					       abilities_size, cmd_details);
17169d26e4fcSRobert Mustacchi 
1717*df36e06dSRobert Mustacchi 		switch (hw->aq.asq_last_status) {
1718*df36e06dSRobert Mustacchi 		case I40E_AQ_RC_EIO:
171993f1cac5SPaul Winder 			status = I40E_ERR_UNKNOWN_PHY;
172093f1cac5SPaul Winder 			break;
1721*df36e06dSRobert Mustacchi 		case I40E_AQ_RC_EAGAIN:
172293f1cac5SPaul Winder 			i40e_msec_delay(1);
172393f1cac5SPaul Winder 			total_delay++;
172493f1cac5SPaul Winder 			status = I40E_ERR_TIMEOUT;
1725*df36e06dSRobert Mustacchi 			break;
1726*df36e06dSRobert Mustacchi 		/* also covers I40E_AQ_RC_OK */
1727*df36e06dSRobert Mustacchi 		default:
1728*df36e06dSRobert Mustacchi 			break;
172993f1cac5SPaul Winder 		}
1730*df36e06dSRobert Mustacchi 
1731*df36e06dSRobert Mustacchi 	} while ((hw->aq.asq_last_status == I40E_AQ_RC_EAGAIN) &&
1732*df36e06dSRobert Mustacchi 		(total_delay < max_delay));
173393f1cac5SPaul Winder 
173493f1cac5SPaul Winder 	if (status != I40E_SUCCESS)
173593f1cac5SPaul Winder 		return status;
17369d26e4fcSRobert Mustacchi 
17373d75a287SRobert Mustacchi 	if (report_init) {
173893f1cac5SPaul Winder 		if (hw->mac.type ==  I40E_MAC_XL710 &&
173993f1cac5SPaul Winder 		    hw->aq.api_maj_ver == I40E_FW_API_VERSION_MAJOR &&
174093f1cac5SPaul Winder 		    hw->aq.api_min_ver >= I40E_MINOR_VER_GET_LINK_INFO_XL710) {
174193f1cac5SPaul Winder 			status = i40e_aq_get_link_info(hw, TRUE, NULL, NULL);
174293f1cac5SPaul Winder 		} else {
174393f1cac5SPaul Winder 			hw->phy.phy_types = LE32_TO_CPU(abilities->phy_type);
174493f1cac5SPaul Winder 			hw->phy.phy_types |=
174593f1cac5SPaul Winder 					((u64)abilities->phy_type_ext << 32);
174693f1cac5SPaul Winder 		}
17473d75a287SRobert Mustacchi 	}
17483d75a287SRobert Mustacchi 
17499d26e4fcSRobert Mustacchi 	return status;
17509d26e4fcSRobert Mustacchi }
17519d26e4fcSRobert Mustacchi 
17529d26e4fcSRobert Mustacchi /**
17539d26e4fcSRobert Mustacchi  * i40e_aq_set_phy_config
17549d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
17559d26e4fcSRobert Mustacchi  * @config: structure with PHY configuration to be set
17569d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
17579d26e4fcSRobert Mustacchi  *
17589d26e4fcSRobert Mustacchi  * Set the various PHY configuration parameters
17599d26e4fcSRobert Mustacchi  * supported on the Port.One or more of the Set PHY config parameters may be
17609d26e4fcSRobert Mustacchi  * ignored in an MFP mode as the PF may not have the privilege to set some
17619d26e4fcSRobert Mustacchi  * of the PHY Config parameters. This status will be indicated by the
17629d26e4fcSRobert Mustacchi  * command response.
17639d26e4fcSRobert Mustacchi  **/
i40e_aq_set_phy_config(struct i40e_hw * hw,struct i40e_aq_set_phy_config * config,struct i40e_asq_cmd_details * cmd_details)17649d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_set_phy_config(struct i40e_hw *hw,
17659d26e4fcSRobert Mustacchi 				struct i40e_aq_set_phy_config *config,
17669d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
17679d26e4fcSRobert Mustacchi {
17689d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
17699d26e4fcSRobert Mustacchi 	struct i40e_aq_set_phy_config *cmd =
17709d26e4fcSRobert Mustacchi 		(struct i40e_aq_set_phy_config *)&desc.params.raw;
17719d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
17729d26e4fcSRobert Mustacchi 
17739d26e4fcSRobert Mustacchi 	if (!config)
17749d26e4fcSRobert Mustacchi 		return I40E_ERR_PARAM;
17759d26e4fcSRobert Mustacchi 
17769d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
17779d26e4fcSRobert Mustacchi 					  i40e_aqc_opc_set_phy_config);
17789d26e4fcSRobert Mustacchi 
17799d26e4fcSRobert Mustacchi 	*cmd = *config;
17809d26e4fcSRobert Mustacchi 
17819d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
17829d26e4fcSRobert Mustacchi 
17839d26e4fcSRobert Mustacchi 	return status;
17849d26e4fcSRobert Mustacchi }
17859d26e4fcSRobert Mustacchi 
17869d26e4fcSRobert Mustacchi /**
17879d26e4fcSRobert Mustacchi  * i40e_set_fc
17889d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
178993f1cac5SPaul Winder  * @aq_failures: buffer to return AdminQ failure information
179093f1cac5SPaul Winder  * @atomic_restart: whether to enable atomic link restart
17919d26e4fcSRobert Mustacchi  *
17929d26e4fcSRobert Mustacchi  * Set the requested flow control mode using set_phy_config.
17939d26e4fcSRobert Mustacchi  **/
i40e_set_fc(struct i40e_hw * hw,u8 * aq_failures,bool atomic_restart)17949d26e4fcSRobert Mustacchi enum i40e_status_code i40e_set_fc(struct i40e_hw *hw, u8 *aq_failures,
17959d26e4fcSRobert Mustacchi 				  bool atomic_restart)
17969d26e4fcSRobert Mustacchi {
17979d26e4fcSRobert Mustacchi 	enum i40e_fc_mode fc_mode = hw->fc.requested_mode;
17989d26e4fcSRobert Mustacchi 	struct i40e_aq_get_phy_abilities_resp abilities;
17999d26e4fcSRobert Mustacchi 	struct i40e_aq_set_phy_config config;
18009d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
18019d26e4fcSRobert Mustacchi 	u8 pause_mask = 0x0;
18029d26e4fcSRobert Mustacchi 
18039d26e4fcSRobert Mustacchi 	*aq_failures = 0x0;
18049d26e4fcSRobert Mustacchi 
18059d26e4fcSRobert Mustacchi 	switch (fc_mode) {
18069d26e4fcSRobert Mustacchi 	case I40E_FC_FULL:
18079d26e4fcSRobert Mustacchi 		pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_TX;
18089d26e4fcSRobert Mustacchi 		pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_RX;
18099d26e4fcSRobert Mustacchi 		break;
18109d26e4fcSRobert Mustacchi 	case I40E_FC_RX_PAUSE:
18119d26e4fcSRobert Mustacchi 		pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_RX;
18129d26e4fcSRobert Mustacchi 		break;
18139d26e4fcSRobert Mustacchi 	case I40E_FC_TX_PAUSE:
18149d26e4fcSRobert Mustacchi 		pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_TX;
18159d26e4fcSRobert Mustacchi 		break;
18169d26e4fcSRobert Mustacchi 	default:
18179d26e4fcSRobert Mustacchi 		break;
18189d26e4fcSRobert Mustacchi 	}
18199d26e4fcSRobert Mustacchi 
18209d26e4fcSRobert Mustacchi 	/* Get the current phy config */
18219d26e4fcSRobert Mustacchi 	status = i40e_aq_get_phy_capabilities(hw, FALSE, false, &abilities,
18229d26e4fcSRobert Mustacchi 					      NULL);
18239d26e4fcSRobert Mustacchi 	if (status) {
18249d26e4fcSRobert Mustacchi 		*aq_failures |= I40E_SET_FC_AQ_FAIL_GET;
18259d26e4fcSRobert Mustacchi 		return status;
18269d26e4fcSRobert Mustacchi 	}
18279d26e4fcSRobert Mustacchi 
18289d26e4fcSRobert Mustacchi 	memset(&config, 0, sizeof(config));
18299d26e4fcSRobert Mustacchi 	/* clear the old pause settings */
18309d26e4fcSRobert Mustacchi 	config.abilities = abilities.abilities & ~(I40E_AQ_PHY_FLAG_PAUSE_TX) &
18319d26e4fcSRobert Mustacchi 			   ~(I40E_AQ_PHY_FLAG_PAUSE_RX);
18329d26e4fcSRobert Mustacchi 	/* set the new abilities */
18339d26e4fcSRobert Mustacchi 	config.abilities |= pause_mask;
18349d26e4fcSRobert Mustacchi 	/* If the abilities have changed, then set the new config */
18359d26e4fcSRobert Mustacchi 	if (config.abilities != abilities.abilities) {
18369d26e4fcSRobert Mustacchi 		/* Auto restart link so settings take effect */
18379d26e4fcSRobert Mustacchi 		if (atomic_restart)
18389d26e4fcSRobert Mustacchi 			config.abilities |= I40E_AQ_PHY_ENABLE_ATOMIC_LINK;
18399d26e4fcSRobert Mustacchi 		/* Copy over all the old settings */
18409d26e4fcSRobert Mustacchi 		config.phy_type = abilities.phy_type;
18413d75a287SRobert Mustacchi 		config.phy_type_ext = abilities.phy_type_ext;
18429d26e4fcSRobert Mustacchi 		config.link_speed = abilities.link_speed;
18439d26e4fcSRobert Mustacchi 		config.eee_capability = abilities.eee_capability;
18449d26e4fcSRobert Mustacchi 		config.eeer = abilities.eeer_val;
18459d26e4fcSRobert Mustacchi 		config.low_power_ctrl = abilities.d3_lpan;
184611a00484SPaul Winder 		config.fec_config = abilities.fec_cfg_curr_mod_ext_info &
184711a00484SPaul Winder 				    I40E_AQ_PHY_FEC_CONFIG_MASK;
18489d26e4fcSRobert Mustacchi 		status = i40e_aq_set_phy_config(hw, &config, NULL);
18499d26e4fcSRobert Mustacchi 
18509d26e4fcSRobert Mustacchi 		if (status)
18519d26e4fcSRobert Mustacchi 			*aq_failures |= I40E_SET_FC_AQ_FAIL_SET;
18529d26e4fcSRobert Mustacchi 	}
18539d26e4fcSRobert Mustacchi 	/* Update the link info */
18549d26e4fcSRobert Mustacchi 	status = i40e_update_link_info(hw);
18559d26e4fcSRobert Mustacchi 	if (status) {
18569d26e4fcSRobert Mustacchi 		/* Wait a little bit (on 40G cards it sometimes takes a really
18579d26e4fcSRobert Mustacchi 		 * long time for link to come back from the atomic reset)
18589d26e4fcSRobert Mustacchi 		 * and try once more
18599d26e4fcSRobert Mustacchi 		 */
18609d26e4fcSRobert Mustacchi 		i40e_msec_delay(1000);
18619d26e4fcSRobert Mustacchi 		status = i40e_update_link_info(hw);
18629d26e4fcSRobert Mustacchi 	}
18639d26e4fcSRobert Mustacchi 	if (status)
18649d26e4fcSRobert Mustacchi 		*aq_failures |= I40E_SET_FC_AQ_FAIL_UPDATE;
18659d26e4fcSRobert Mustacchi 
18669d26e4fcSRobert Mustacchi 	return status;
18679d26e4fcSRobert Mustacchi }
18689d26e4fcSRobert Mustacchi 
18699d26e4fcSRobert Mustacchi /**
18709d26e4fcSRobert Mustacchi  * i40e_aq_set_mac_config
18719d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
18729d26e4fcSRobert Mustacchi  * @max_frame_size: Maximum Frame Size to be supported by the port
18739d26e4fcSRobert Mustacchi  * @crc_en: Tell HW to append a CRC to outgoing frames
18749d26e4fcSRobert Mustacchi  * @pacing: Pacing configurations
1875*df36e06dSRobert Mustacchi  * @auto_drop_blocking_packets: Tell HW to drop packets if TC queue is blocked
18769d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
18779d26e4fcSRobert Mustacchi  *
18789d26e4fcSRobert Mustacchi  * Configure MAC settings for frame size, jumbo frame support and the
18799d26e4fcSRobert Mustacchi  * addition of a CRC by the hardware.
18809d26e4fcSRobert Mustacchi  **/
i40e_aq_set_mac_config(struct i40e_hw * hw,u16 max_frame_size,bool crc_en,u16 pacing,bool auto_drop_blocking_packets,struct i40e_asq_cmd_details * cmd_details)18819d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_set_mac_config(struct i40e_hw *hw,
18829d26e4fcSRobert Mustacchi 				u16 max_frame_size,
18839d26e4fcSRobert Mustacchi 				bool crc_en, u16 pacing,
1884*df36e06dSRobert Mustacchi 				bool auto_drop_blocking_packets,
18859d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
18869d26e4fcSRobert Mustacchi {
18879d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
18889d26e4fcSRobert Mustacchi 	struct i40e_aq_set_mac_config *cmd =
18899d26e4fcSRobert Mustacchi 		(struct i40e_aq_set_mac_config *)&desc.params.raw;
18909d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
18919d26e4fcSRobert Mustacchi 
18929d26e4fcSRobert Mustacchi 	if (max_frame_size == 0)
18939d26e4fcSRobert Mustacchi 		return I40E_ERR_PARAM;
18949d26e4fcSRobert Mustacchi 
18959d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
18969d26e4fcSRobert Mustacchi 					  i40e_aqc_opc_set_mac_config);
18979d26e4fcSRobert Mustacchi 
18989d26e4fcSRobert Mustacchi 	cmd->max_frame_size = CPU_TO_LE16(max_frame_size);
18999d26e4fcSRobert Mustacchi 	cmd->params = ((u8)pacing & 0x0F) << 3;
19009d26e4fcSRobert Mustacchi 	if (crc_en)
19019d26e4fcSRobert Mustacchi 		cmd->params |= I40E_AQ_SET_MAC_CONFIG_CRC_EN;
19029d26e4fcSRobert Mustacchi 
1903*df36e06dSRobert Mustacchi 	if (auto_drop_blocking_packets) {
1904*df36e06dSRobert Mustacchi 		if (hw->flags & I40E_HW_FLAG_DROP_MODE)
1905*df36e06dSRobert Mustacchi 			cmd->params |=
1906*df36e06dSRobert Mustacchi 				I40E_AQ_SET_MAC_CONFIG_DROP_BLOCKING_PACKET_EN;
1907*df36e06dSRobert Mustacchi 		else
1908*df36e06dSRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_ALL,
1909*df36e06dSRobert Mustacchi 				   "This FW api version does not support drop mode.\n");
1910*df36e06dSRobert Mustacchi 	}
1911*df36e06dSRobert Mustacchi 
1912*df36e06dSRobert Mustacchi #define I40E_AQ_SET_MAC_CONFIG_FC_DEFAULT_THRESHOLD	0x7FFF
1913*df36e06dSRobert Mustacchi 	cmd->fc_refresh_threshold =
1914*df36e06dSRobert Mustacchi 		CPU_TO_LE16(I40E_AQ_SET_MAC_CONFIG_FC_DEFAULT_THRESHOLD);
1915*df36e06dSRobert Mustacchi 
19169d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
19179d26e4fcSRobert Mustacchi 
19189d26e4fcSRobert Mustacchi 	return status;
19199d26e4fcSRobert Mustacchi }
19209d26e4fcSRobert Mustacchi 
19219d26e4fcSRobert Mustacchi /**
19229d26e4fcSRobert Mustacchi  * i40e_aq_clear_pxe_mode
19239d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
19249d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
19259d26e4fcSRobert Mustacchi  *
19269d26e4fcSRobert Mustacchi  * Tell the firmware that the driver is taking over from PXE
19279d26e4fcSRobert Mustacchi  **/
i40e_aq_clear_pxe_mode(struct i40e_hw * hw,struct i40e_asq_cmd_details * cmd_details)19289d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_clear_pxe_mode(struct i40e_hw *hw,
19299d26e4fcSRobert Mustacchi 			struct i40e_asq_cmd_details *cmd_details)
19309d26e4fcSRobert Mustacchi {
19319d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
19329d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
19339d26e4fcSRobert Mustacchi 	struct i40e_aqc_clear_pxe *cmd =
19349d26e4fcSRobert Mustacchi 		(struct i40e_aqc_clear_pxe *)&desc.params.raw;
19359d26e4fcSRobert Mustacchi 
19369d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
19379d26e4fcSRobert Mustacchi 					  i40e_aqc_opc_clear_pxe_mode);
19389d26e4fcSRobert Mustacchi 
19399d26e4fcSRobert Mustacchi 	cmd->rx_cnt = 0x2;
19409d26e4fcSRobert Mustacchi 
19419d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
19429d26e4fcSRobert Mustacchi 
19439d26e4fcSRobert Mustacchi 	wr32(hw, I40E_GLLAN_RCTL_0, 0x1);
19449d26e4fcSRobert Mustacchi 
19459d26e4fcSRobert Mustacchi 	return status;
19469d26e4fcSRobert Mustacchi }
19479d26e4fcSRobert Mustacchi 
19489d26e4fcSRobert Mustacchi /**
19499d26e4fcSRobert Mustacchi  * i40e_aq_set_link_restart_an
19509d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
19519d26e4fcSRobert Mustacchi  * @enable_link: if TRUE: enable link, if FALSE: disable link
19529d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
19539d26e4fcSRobert Mustacchi  *
19549d26e4fcSRobert Mustacchi  * Sets up the link and restarts the Auto-Negotiation over the link.
19559d26e4fcSRobert Mustacchi  **/
i40e_aq_set_link_restart_an(struct i40e_hw * hw,bool enable_link,struct i40e_asq_cmd_details * cmd_details)19569d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_set_link_restart_an(struct i40e_hw *hw,
19579d26e4fcSRobert Mustacchi 		bool enable_link, struct i40e_asq_cmd_details *cmd_details)
19589d26e4fcSRobert Mustacchi {
19599d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
19609d26e4fcSRobert Mustacchi 	struct i40e_aqc_set_link_restart_an *cmd =
19619d26e4fcSRobert Mustacchi 		(struct i40e_aqc_set_link_restart_an *)&desc.params.raw;
19629d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
19639d26e4fcSRobert Mustacchi 
19649d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
19659d26e4fcSRobert Mustacchi 					  i40e_aqc_opc_set_link_restart_an);
19669d26e4fcSRobert Mustacchi 
19679d26e4fcSRobert Mustacchi 	cmd->command = I40E_AQ_PHY_RESTART_AN;
19689d26e4fcSRobert Mustacchi 	if (enable_link)
19699d26e4fcSRobert Mustacchi 		cmd->command |= I40E_AQ_PHY_LINK_ENABLE;
19709d26e4fcSRobert Mustacchi 	else
19719d26e4fcSRobert Mustacchi 		cmd->command &= ~I40E_AQ_PHY_LINK_ENABLE;
19729d26e4fcSRobert Mustacchi 
19739d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
19749d26e4fcSRobert Mustacchi 
19759d26e4fcSRobert Mustacchi 	return status;
19769d26e4fcSRobert Mustacchi }
19779d26e4fcSRobert Mustacchi 
19789d26e4fcSRobert Mustacchi /**
19799d26e4fcSRobert Mustacchi  * i40e_aq_get_link_info
19809d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
19819d26e4fcSRobert Mustacchi  * @enable_lse: enable/disable LinkStatusEvent reporting
19829d26e4fcSRobert Mustacchi  * @link: pointer to link status structure - optional
19839d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
19849d26e4fcSRobert Mustacchi  *
19859d26e4fcSRobert Mustacchi  * Returns the link status of the adapter.
19869d26e4fcSRobert Mustacchi  **/
i40e_aq_get_link_info(struct i40e_hw * hw,bool enable_lse,struct i40e_link_status * link,struct i40e_asq_cmd_details * cmd_details)19879d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_get_link_info(struct i40e_hw *hw,
19889d26e4fcSRobert Mustacchi 				bool enable_lse, struct i40e_link_status *link,
19899d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
19909d26e4fcSRobert Mustacchi {
19919d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
19929d26e4fcSRobert Mustacchi 	struct i40e_aqc_get_link_status *resp =
19939d26e4fcSRobert Mustacchi 		(struct i40e_aqc_get_link_status *)&desc.params.raw;
19949d26e4fcSRobert Mustacchi 	struct i40e_link_status *hw_link_info = &hw->phy.link_info;
19959d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
19969d26e4fcSRobert Mustacchi 	bool tx_pause, rx_pause;
19979d26e4fcSRobert Mustacchi 	u16 command_flags;
19989d26e4fcSRobert Mustacchi 
19999d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_link_status);
20009d26e4fcSRobert Mustacchi 
20019d26e4fcSRobert Mustacchi 	if (enable_lse)
20029d26e4fcSRobert Mustacchi 		command_flags = I40E_AQ_LSE_ENABLE;
20039d26e4fcSRobert Mustacchi 	else
20049d26e4fcSRobert Mustacchi 		command_flags = I40E_AQ_LSE_DISABLE;
20059d26e4fcSRobert Mustacchi 	resp->command_flags = CPU_TO_LE16(command_flags);
20069d26e4fcSRobert Mustacchi 
20079d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
20089d26e4fcSRobert Mustacchi 
20099d26e4fcSRobert Mustacchi 	if (status != I40E_SUCCESS)
20109d26e4fcSRobert Mustacchi 		goto aq_get_link_info_exit;
20119d26e4fcSRobert Mustacchi 
20129d26e4fcSRobert Mustacchi 	/* save off old link status information */
20139d26e4fcSRobert Mustacchi 	i40e_memcpy(&hw->phy.link_info_old, hw_link_info,
20149d26e4fcSRobert Mustacchi 		    sizeof(*hw_link_info), I40E_NONDMA_TO_NONDMA);
20159d26e4fcSRobert Mustacchi 
20169d26e4fcSRobert Mustacchi 	/* update link status */
20179d26e4fcSRobert Mustacchi 	hw_link_info->phy_type = (enum i40e_aq_phy_type)resp->phy_type;
20189d26e4fcSRobert Mustacchi 	hw->phy.media_type = i40e_get_media_type(hw);
20199d26e4fcSRobert Mustacchi 	hw_link_info->link_speed = (enum i40e_aq_link_speed)resp->link_speed;
20209d26e4fcSRobert Mustacchi 	hw_link_info->link_info = resp->link_info;
20219d26e4fcSRobert Mustacchi 	hw_link_info->an_info = resp->an_info;
202211a00484SPaul Winder 	hw_link_info->fec_info = resp->config & (I40E_AQ_CONFIG_FEC_KR_ENA |
202311a00484SPaul Winder 						 I40E_AQ_CONFIG_FEC_RS_ENA);
20249d26e4fcSRobert Mustacchi 	hw_link_info->ext_info = resp->ext_info;
202593f1cac5SPaul Winder 	hw_link_info->loopback = resp->loopback & I40E_AQ_LOOPBACK_MASK;
20269d26e4fcSRobert Mustacchi 	hw_link_info->max_frame_size = LE16_TO_CPU(resp->max_frame_size);
20279d26e4fcSRobert Mustacchi 	hw_link_info->pacing = resp->config & I40E_AQ_CONFIG_PACING_MASK;
20289d26e4fcSRobert Mustacchi 
20299d26e4fcSRobert Mustacchi 	/* update fc info */
20309d26e4fcSRobert Mustacchi 	tx_pause = !!(resp->an_info & I40E_AQ_LINK_PAUSE_TX);
20319d26e4fcSRobert Mustacchi 	rx_pause = !!(resp->an_info & I40E_AQ_LINK_PAUSE_RX);
20329d26e4fcSRobert Mustacchi 	if (tx_pause & rx_pause)
20339d26e4fcSRobert Mustacchi 		hw->fc.current_mode = I40E_FC_FULL;
20349d26e4fcSRobert Mustacchi 	else if (tx_pause)
20359d26e4fcSRobert Mustacchi 		hw->fc.current_mode = I40E_FC_TX_PAUSE;
20369d26e4fcSRobert Mustacchi 	else if (rx_pause)
20379d26e4fcSRobert Mustacchi 		hw->fc.current_mode = I40E_FC_RX_PAUSE;
20389d26e4fcSRobert Mustacchi 	else
20399d26e4fcSRobert Mustacchi 		hw->fc.current_mode = I40E_FC_NONE;
20409d26e4fcSRobert Mustacchi 
20419d26e4fcSRobert Mustacchi 	if (resp->config & I40E_AQ_CONFIG_CRC_ENA)
20429d26e4fcSRobert Mustacchi 		hw_link_info->crc_enable = TRUE;
20439d26e4fcSRobert Mustacchi 	else
20449d26e4fcSRobert Mustacchi 		hw_link_info->crc_enable = FALSE;
20459d26e4fcSRobert Mustacchi 
20463d75a287SRobert Mustacchi 	if (resp->command_flags & CPU_TO_LE16(I40E_AQ_LSE_IS_ENABLED))
20479d26e4fcSRobert Mustacchi 		hw_link_info->lse_enable = TRUE;
20489d26e4fcSRobert Mustacchi 	else
20499d26e4fcSRobert Mustacchi 		hw_link_info->lse_enable = FALSE;
20509d26e4fcSRobert Mustacchi 
20513d75a287SRobert Mustacchi 	if ((hw->mac.type == I40E_MAC_XL710) &&
20523d75a287SRobert Mustacchi 	    (hw->aq.fw_maj_ver < 4 || (hw->aq.fw_maj_ver == 4 &&
20539d26e4fcSRobert Mustacchi 	     hw->aq.fw_min_ver < 40)) && hw_link_info->phy_type == 0xE)
20549d26e4fcSRobert Mustacchi 		hw_link_info->phy_type = I40E_PHY_TYPE_10GBASE_SFPP_CU;
20559d26e4fcSRobert Mustacchi 
2056*df36e06dSRobert Mustacchi 	if (hw->flags & I40E_HW_FLAG_AQ_PHY_ACCESS_CAPABLE &&
2057*df36e06dSRobert Mustacchi 	    hw->mac.type != I40E_MAC_X722) {
205893f1cac5SPaul Winder 		__le32 tmp;
205993f1cac5SPaul Winder 
206093f1cac5SPaul Winder 		i40e_memcpy(&tmp, resp->link_type, sizeof(tmp),
206193f1cac5SPaul Winder 			    I40E_NONDMA_TO_NONDMA);
206293f1cac5SPaul Winder 		hw->phy.phy_types = LE32_TO_CPU(tmp);
206393f1cac5SPaul Winder 		hw->phy.phy_types |= ((u64)resp->link_type_ext << 32);
206493f1cac5SPaul Winder 	}
206593f1cac5SPaul Winder 
20669d26e4fcSRobert Mustacchi 	/* save link status information */
20679d26e4fcSRobert Mustacchi 	if (link)
20689d26e4fcSRobert Mustacchi 		i40e_memcpy(link, hw_link_info, sizeof(*hw_link_info),
20699d26e4fcSRobert Mustacchi 			    I40E_NONDMA_TO_NONDMA);
20709d26e4fcSRobert Mustacchi 
20719d26e4fcSRobert Mustacchi 	/* flag cleared so helper functions don't call AQ again */
20729d26e4fcSRobert Mustacchi 	hw->phy.get_link_info = FALSE;
20739d26e4fcSRobert Mustacchi 
20749d26e4fcSRobert Mustacchi aq_get_link_info_exit:
20759d26e4fcSRobert Mustacchi 	return status;
20769d26e4fcSRobert Mustacchi }
20779d26e4fcSRobert Mustacchi 
20789d26e4fcSRobert Mustacchi /**
20799d26e4fcSRobert Mustacchi  * i40e_aq_set_phy_int_mask
20809d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
20819d26e4fcSRobert Mustacchi  * @mask: interrupt mask to be set
20829d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
20839d26e4fcSRobert Mustacchi  *
20849d26e4fcSRobert Mustacchi  * Set link interrupt mask.
20859d26e4fcSRobert Mustacchi  **/
i40e_aq_set_phy_int_mask(struct i40e_hw * hw,u16 mask,struct i40e_asq_cmd_details * cmd_details)20869d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_set_phy_int_mask(struct i40e_hw *hw,
20879d26e4fcSRobert Mustacchi 				u16 mask,
20889d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
20899d26e4fcSRobert Mustacchi {
20909d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
20919d26e4fcSRobert Mustacchi 	struct i40e_aqc_set_phy_int_mask *cmd =
20929d26e4fcSRobert Mustacchi 		(struct i40e_aqc_set_phy_int_mask *)&desc.params.raw;
20939d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
20949d26e4fcSRobert Mustacchi 
20959d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
20969d26e4fcSRobert Mustacchi 					  i40e_aqc_opc_set_phy_int_mask);
20979d26e4fcSRobert Mustacchi 
20989d26e4fcSRobert Mustacchi 	cmd->event_mask = CPU_TO_LE16(mask);
20999d26e4fcSRobert Mustacchi 
21009d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
21019d26e4fcSRobert Mustacchi 
21029d26e4fcSRobert Mustacchi 	return status;
21039d26e4fcSRobert Mustacchi }
21049d26e4fcSRobert Mustacchi 
21059d26e4fcSRobert Mustacchi /**
21069d26e4fcSRobert Mustacchi  * i40e_aq_get_local_advt_reg
21079d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
21089d26e4fcSRobert Mustacchi  * @advt_reg: local AN advertisement register value
21099d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
21109d26e4fcSRobert Mustacchi  *
21119d26e4fcSRobert Mustacchi  * Get the Local AN advertisement register value.
21129d26e4fcSRobert Mustacchi  **/
i40e_aq_get_local_advt_reg(struct i40e_hw * hw,u64 * advt_reg,struct i40e_asq_cmd_details * cmd_details)21139d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_get_local_advt_reg(struct i40e_hw *hw,
21149d26e4fcSRobert Mustacchi 				u64 *advt_reg,
21159d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
21169d26e4fcSRobert Mustacchi {
21179d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
21189d26e4fcSRobert Mustacchi 	struct i40e_aqc_an_advt_reg *resp =
21199d26e4fcSRobert Mustacchi 		(struct i40e_aqc_an_advt_reg *)&desc.params.raw;
21209d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
21219d26e4fcSRobert Mustacchi 
21229d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
21239d26e4fcSRobert Mustacchi 					  i40e_aqc_opc_get_local_advt_reg);
21249d26e4fcSRobert Mustacchi 
21259d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
21269d26e4fcSRobert Mustacchi 
21279d26e4fcSRobert Mustacchi 	if (status != I40E_SUCCESS)
21289d26e4fcSRobert Mustacchi 		goto aq_get_local_advt_reg_exit;
21299d26e4fcSRobert Mustacchi 
21309d26e4fcSRobert Mustacchi 	*advt_reg = (u64)(LE16_TO_CPU(resp->local_an_reg1)) << 32;
21319d26e4fcSRobert Mustacchi 	*advt_reg |= LE32_TO_CPU(resp->local_an_reg0);
21329d26e4fcSRobert Mustacchi 
21339d26e4fcSRobert Mustacchi aq_get_local_advt_reg_exit:
21349d26e4fcSRobert Mustacchi 	return status;
21359d26e4fcSRobert Mustacchi }
21369d26e4fcSRobert Mustacchi 
21379d26e4fcSRobert Mustacchi /**
21389d26e4fcSRobert Mustacchi  * i40e_aq_set_local_advt_reg
21399d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
21409d26e4fcSRobert Mustacchi  * @advt_reg: local AN advertisement register value
21419d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
21429d26e4fcSRobert Mustacchi  *
21439d26e4fcSRobert Mustacchi  * Get the Local AN advertisement register value.
21449d26e4fcSRobert Mustacchi  **/
i40e_aq_set_local_advt_reg(struct i40e_hw * hw,u64 advt_reg,struct i40e_asq_cmd_details * cmd_details)21459d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_set_local_advt_reg(struct i40e_hw *hw,
21469d26e4fcSRobert Mustacchi 				u64 advt_reg,
21479d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
21489d26e4fcSRobert Mustacchi {
21499d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
21509d26e4fcSRobert Mustacchi 	struct i40e_aqc_an_advt_reg *cmd =
21519d26e4fcSRobert Mustacchi 		(struct i40e_aqc_an_advt_reg *)&desc.params.raw;
21529d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
21539d26e4fcSRobert Mustacchi 
21549d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
21559d26e4fcSRobert Mustacchi 					  i40e_aqc_opc_get_local_advt_reg);
21569d26e4fcSRobert Mustacchi 
21579d26e4fcSRobert Mustacchi 	cmd->local_an_reg0 = CPU_TO_LE32(I40E_LO_DWORD(advt_reg));
21589d26e4fcSRobert Mustacchi 	cmd->local_an_reg1 = CPU_TO_LE16(I40E_HI_DWORD(advt_reg));
21599d26e4fcSRobert Mustacchi 
21609d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
21619d26e4fcSRobert Mustacchi 
21629d26e4fcSRobert Mustacchi 	return status;
21639d26e4fcSRobert Mustacchi }
21649d26e4fcSRobert Mustacchi 
21659d26e4fcSRobert Mustacchi /**
21669d26e4fcSRobert Mustacchi  * i40e_aq_get_partner_advt
21679d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
21689d26e4fcSRobert Mustacchi  * @advt_reg: AN partner advertisement register value
21699d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
21709d26e4fcSRobert Mustacchi  *
21719d26e4fcSRobert Mustacchi  * Get the link partner AN advertisement register value.
21729d26e4fcSRobert Mustacchi  **/
i40e_aq_get_partner_advt(struct i40e_hw * hw,u64 * advt_reg,struct i40e_asq_cmd_details * cmd_details)21739d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_get_partner_advt(struct i40e_hw *hw,
21749d26e4fcSRobert Mustacchi 				u64 *advt_reg,
21759d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
21769d26e4fcSRobert Mustacchi {
21779d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
21789d26e4fcSRobert Mustacchi 	struct i40e_aqc_an_advt_reg *resp =
21799d26e4fcSRobert Mustacchi 		(struct i40e_aqc_an_advt_reg *)&desc.params.raw;
21809d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
21819d26e4fcSRobert Mustacchi 
21829d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
21839d26e4fcSRobert Mustacchi 					  i40e_aqc_opc_get_partner_advt);
21849d26e4fcSRobert Mustacchi 
21859d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
21869d26e4fcSRobert Mustacchi 
21879d26e4fcSRobert Mustacchi 	if (status != I40E_SUCCESS)
21889d26e4fcSRobert Mustacchi 		goto aq_get_partner_advt_exit;
21899d26e4fcSRobert Mustacchi 
21909d26e4fcSRobert Mustacchi 	*advt_reg = (u64)(LE16_TO_CPU(resp->local_an_reg1)) << 32;
21919d26e4fcSRobert Mustacchi 	*advt_reg |= LE32_TO_CPU(resp->local_an_reg0);
21929d26e4fcSRobert Mustacchi 
21939d26e4fcSRobert Mustacchi aq_get_partner_advt_exit:
21949d26e4fcSRobert Mustacchi 	return status;
21959d26e4fcSRobert Mustacchi }
21969d26e4fcSRobert Mustacchi 
21979d26e4fcSRobert Mustacchi /**
21989d26e4fcSRobert Mustacchi  * i40e_aq_set_lb_modes
21999d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
22009d26e4fcSRobert Mustacchi  * @lb_modes: loopback mode to be set
22019d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
22029d26e4fcSRobert Mustacchi  *
22039d26e4fcSRobert Mustacchi  * Sets loopback modes.
22049d26e4fcSRobert Mustacchi  **/
220593f1cac5SPaul Winder enum i40e_status_code
i40e_aq_set_lb_modes(struct i40e_hw * hw,u8 lb_level,u8 lb_type,u8 speed,struct i40e_asq_cmd_details * cmd_details)220693f1cac5SPaul Winder i40e_aq_set_lb_modes(struct i40e_hw *hw, u8 lb_level, u8 lb_type, u8 speed,
220793f1cac5SPaul Winder 		     struct i40e_asq_cmd_details *cmd_details)
22089d26e4fcSRobert Mustacchi {
22099d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
22109d26e4fcSRobert Mustacchi 	struct i40e_aqc_set_lb_mode *cmd =
22119d26e4fcSRobert Mustacchi 		(struct i40e_aqc_set_lb_mode *)&desc.params.raw;
22129d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
22139d26e4fcSRobert Mustacchi 
22149d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
22159d26e4fcSRobert Mustacchi 					  i40e_aqc_opc_set_lb_modes);
22169d26e4fcSRobert Mustacchi 
221793f1cac5SPaul Winder 	cmd->lb_level = lb_level;
221893f1cac5SPaul Winder 	cmd->lb_type = lb_type;
221993f1cac5SPaul Winder 	cmd->speed = speed;
222093f1cac5SPaul Winder 	if (speed)
222193f1cac5SPaul Winder 		cmd->force_speed = 1;
22229d26e4fcSRobert Mustacchi 
22239d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
22249d26e4fcSRobert Mustacchi 
22259d26e4fcSRobert Mustacchi 	return status;
22269d26e4fcSRobert Mustacchi }
22279d26e4fcSRobert Mustacchi 
22289d26e4fcSRobert Mustacchi /**
22299d26e4fcSRobert Mustacchi  * i40e_aq_set_phy_debug
22309d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
22319d26e4fcSRobert Mustacchi  * @cmd_flags: debug command flags
22329d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
22339d26e4fcSRobert Mustacchi  *
22349d26e4fcSRobert Mustacchi  * Reset the external PHY.
22359d26e4fcSRobert Mustacchi  **/
i40e_aq_set_phy_debug(struct i40e_hw * hw,u8 cmd_flags,struct i40e_asq_cmd_details * cmd_details)22369d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_set_phy_debug(struct i40e_hw *hw, u8 cmd_flags,
22379d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
22389d26e4fcSRobert Mustacchi {
22399d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
22409d26e4fcSRobert Mustacchi 	struct i40e_aqc_set_phy_debug *cmd =
22419d26e4fcSRobert Mustacchi 		(struct i40e_aqc_set_phy_debug *)&desc.params.raw;
22429d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
22439d26e4fcSRobert Mustacchi 
22449d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
22459d26e4fcSRobert Mustacchi 					  i40e_aqc_opc_set_phy_debug);
22469d26e4fcSRobert Mustacchi 
22479d26e4fcSRobert Mustacchi 	cmd->command_flags = cmd_flags;
22489d26e4fcSRobert Mustacchi 
22499d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
22509d26e4fcSRobert Mustacchi 
22519d26e4fcSRobert Mustacchi 	return status;
22529d26e4fcSRobert Mustacchi }
22539d26e4fcSRobert Mustacchi 
22549d26e4fcSRobert Mustacchi /**
22559d26e4fcSRobert Mustacchi  * i40e_aq_add_vsi
22569d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
22579d26e4fcSRobert Mustacchi  * @vsi_ctx: pointer to a vsi context struct
22589d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
22599d26e4fcSRobert Mustacchi  *
22609d26e4fcSRobert Mustacchi  * Add a VSI context to the hardware.
22619d26e4fcSRobert Mustacchi **/
i40e_aq_add_vsi(struct i40e_hw * hw,struct i40e_vsi_context * vsi_ctx,struct i40e_asq_cmd_details * cmd_details)22629d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_add_vsi(struct i40e_hw *hw,
22639d26e4fcSRobert Mustacchi 				struct i40e_vsi_context *vsi_ctx,
22649d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
22659d26e4fcSRobert Mustacchi {
22669d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
22679d26e4fcSRobert Mustacchi 	struct i40e_aqc_add_get_update_vsi *cmd =
22689d26e4fcSRobert Mustacchi 		(struct i40e_aqc_add_get_update_vsi *)&desc.params.raw;
22699d26e4fcSRobert Mustacchi 	struct i40e_aqc_add_get_update_vsi_completion *resp =
22709d26e4fcSRobert Mustacchi 		(struct i40e_aqc_add_get_update_vsi_completion *)
22719d26e4fcSRobert Mustacchi 		&desc.params.raw;
22729d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
22739d26e4fcSRobert Mustacchi 
22749d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
22759d26e4fcSRobert Mustacchi 					  i40e_aqc_opc_add_vsi);
22769d26e4fcSRobert Mustacchi 
22779d26e4fcSRobert Mustacchi 	cmd->uplink_seid = CPU_TO_LE16(vsi_ctx->uplink_seid);
22789d26e4fcSRobert Mustacchi 	cmd->connection_type = vsi_ctx->connection_type;
22799d26e4fcSRobert Mustacchi 	cmd->vf_id = vsi_ctx->vf_num;
22809d26e4fcSRobert Mustacchi 	cmd->vsi_flags = CPU_TO_LE16(vsi_ctx->flags);
22819d26e4fcSRobert Mustacchi 
22829d26e4fcSRobert Mustacchi 	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
22839d26e4fcSRobert Mustacchi 
22849d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info,
2285*df36e06dSRobert Mustacchi 				       sizeof(vsi_ctx->info), cmd_details);
22869d26e4fcSRobert Mustacchi 
22879d26e4fcSRobert Mustacchi 	if (status != I40E_SUCCESS)
22889d26e4fcSRobert Mustacchi 		goto aq_add_vsi_exit;
22899d26e4fcSRobert Mustacchi 
22909d26e4fcSRobert Mustacchi 	vsi_ctx->seid = LE16_TO_CPU(resp->seid);
22919d26e4fcSRobert Mustacchi 	vsi_ctx->vsi_number = LE16_TO_CPU(resp->vsi_number);
22929d26e4fcSRobert Mustacchi 	vsi_ctx->vsis_allocated = LE16_TO_CPU(resp->vsi_used);
22939d26e4fcSRobert Mustacchi 	vsi_ctx->vsis_unallocated = LE16_TO_CPU(resp->vsi_free);
22949d26e4fcSRobert Mustacchi 
22959d26e4fcSRobert Mustacchi aq_add_vsi_exit:
22969d26e4fcSRobert Mustacchi 	return status;
22979d26e4fcSRobert Mustacchi }
22989d26e4fcSRobert Mustacchi 
22999d26e4fcSRobert Mustacchi /**
23009d26e4fcSRobert Mustacchi  * i40e_aq_set_default_vsi
23019d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
23029d26e4fcSRobert Mustacchi  * @seid: vsi number
23039d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
23049d26e4fcSRobert Mustacchi  **/
i40e_aq_set_default_vsi(struct i40e_hw * hw,u16 seid,struct i40e_asq_cmd_details * cmd_details)23059d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_set_default_vsi(struct i40e_hw *hw,
23069d26e4fcSRobert Mustacchi 				u16 seid,
23079d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
23089d26e4fcSRobert Mustacchi {
23099d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
23109d26e4fcSRobert Mustacchi 	struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
23119d26e4fcSRobert Mustacchi 		(struct i40e_aqc_set_vsi_promiscuous_modes *)
23129d26e4fcSRobert Mustacchi 		&desc.params.raw;
23139d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
23149d26e4fcSRobert Mustacchi 
23159d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
23169d26e4fcSRobert Mustacchi 					i40e_aqc_opc_set_vsi_promiscuous_modes);
23179d26e4fcSRobert Mustacchi 
23189d26e4fcSRobert Mustacchi 	cmd->promiscuous_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_DEFAULT);
23199d26e4fcSRobert Mustacchi 	cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_DEFAULT);
23209d26e4fcSRobert Mustacchi 	cmd->seid = CPU_TO_LE16(seid);
23219d26e4fcSRobert Mustacchi 
23229d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
23239d26e4fcSRobert Mustacchi 
23249d26e4fcSRobert Mustacchi 	return status;
23259d26e4fcSRobert Mustacchi }
23269d26e4fcSRobert Mustacchi 
23273d75a287SRobert Mustacchi /**
23283d75a287SRobert Mustacchi  * i40e_aq_clear_default_vsi
23293d75a287SRobert Mustacchi  * @hw: pointer to the hw struct
23303d75a287SRobert Mustacchi  * @seid: vsi number
23313d75a287SRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
23323d75a287SRobert Mustacchi  **/
i40e_aq_clear_default_vsi(struct i40e_hw * hw,u16 seid,struct i40e_asq_cmd_details * cmd_details)23333d75a287SRobert Mustacchi enum i40e_status_code i40e_aq_clear_default_vsi(struct i40e_hw *hw,
23343d75a287SRobert Mustacchi 				u16 seid,
23353d75a287SRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
23363d75a287SRobert Mustacchi {
23373d75a287SRobert Mustacchi 	struct i40e_aq_desc desc;
23383d75a287SRobert Mustacchi 	struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
23393d75a287SRobert Mustacchi 		(struct i40e_aqc_set_vsi_promiscuous_modes *)
23403d75a287SRobert Mustacchi 		&desc.params.raw;
23413d75a287SRobert Mustacchi 	enum i40e_status_code status;
23423d75a287SRobert Mustacchi 
23433d75a287SRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
23443d75a287SRobert Mustacchi 					i40e_aqc_opc_set_vsi_promiscuous_modes);
23453d75a287SRobert Mustacchi 
23463d75a287SRobert Mustacchi 	cmd->promiscuous_flags = CPU_TO_LE16(0);
23473d75a287SRobert Mustacchi 	cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_DEFAULT);
23483d75a287SRobert Mustacchi 	cmd->seid = CPU_TO_LE16(seid);
23493d75a287SRobert Mustacchi 
23503d75a287SRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
23513d75a287SRobert Mustacchi 
23523d75a287SRobert Mustacchi 	return status;
23533d75a287SRobert Mustacchi }
23543d75a287SRobert Mustacchi 
23559d26e4fcSRobert Mustacchi /**
23569d26e4fcSRobert Mustacchi  * i40e_aq_set_vsi_unicast_promiscuous
23579d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
23589d26e4fcSRobert Mustacchi  * @seid: vsi number
23599d26e4fcSRobert Mustacchi  * @set: set unicast promiscuous enable/disable
23609d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
23613d75a287SRobert Mustacchi  * @rx_only_promisc: flag to decide if egress traffic gets mirrored in promisc
23629d26e4fcSRobert Mustacchi  **/
i40e_aq_set_vsi_unicast_promiscuous(struct i40e_hw * hw,u16 seid,bool set,struct i40e_asq_cmd_details * cmd_details,bool rx_only_promisc)23639d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_set_vsi_unicast_promiscuous(struct i40e_hw *hw,
23649d26e4fcSRobert Mustacchi 				u16 seid, bool set,
23653d75a287SRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details,
23663d75a287SRobert Mustacchi 				bool rx_only_promisc)
23679d26e4fcSRobert Mustacchi {
23689d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
23699d26e4fcSRobert Mustacchi 	struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
23709d26e4fcSRobert Mustacchi 		(struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
23719d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
23729d26e4fcSRobert Mustacchi 	u16 flags = 0;
23739d26e4fcSRobert Mustacchi 
23749d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
23759d26e4fcSRobert Mustacchi 					i40e_aqc_opc_set_vsi_promiscuous_modes);
23769d26e4fcSRobert Mustacchi 
23773d75a287SRobert Mustacchi 	if (set) {
23789d26e4fcSRobert Mustacchi 		flags |= I40E_AQC_SET_VSI_PROMISC_UNICAST;
23793d75a287SRobert Mustacchi 		if (rx_only_promisc &&
23803d75a287SRobert Mustacchi 		    (((hw->aq.api_maj_ver == 1) && (hw->aq.api_min_ver >= 5)) ||
23813d75a287SRobert Mustacchi 		     (hw->aq.api_maj_ver > 1)))
23823d75a287SRobert Mustacchi 			flags |= I40E_AQC_SET_VSI_PROMISC_TX;
23833d75a287SRobert Mustacchi 	}
23849d26e4fcSRobert Mustacchi 
23859d26e4fcSRobert Mustacchi 	cmd->promiscuous_flags = CPU_TO_LE16(flags);
23869d26e4fcSRobert Mustacchi 
23879d26e4fcSRobert Mustacchi 	cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_UNICAST);
23883d75a287SRobert Mustacchi 	if (((hw->aq.api_maj_ver >= 1) && (hw->aq.api_min_ver >= 5)) ||
23893d75a287SRobert Mustacchi 	     (hw->aq.api_maj_ver > 1))
23903d75a287SRobert Mustacchi 		cmd->valid_flags |= CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_TX);
23919d26e4fcSRobert Mustacchi 
23929d26e4fcSRobert Mustacchi 	cmd->seid = CPU_TO_LE16(seid);
23939d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
23949d26e4fcSRobert Mustacchi 
23959d26e4fcSRobert Mustacchi 	return status;
23969d26e4fcSRobert Mustacchi }
23979d26e4fcSRobert Mustacchi 
23989d26e4fcSRobert Mustacchi /**
23999d26e4fcSRobert Mustacchi  * i40e_aq_set_vsi_multicast_promiscuous
24009d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
24019d26e4fcSRobert Mustacchi  * @seid: vsi number
24029d26e4fcSRobert Mustacchi  * @set: set multicast promiscuous enable/disable
24039d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
24049d26e4fcSRobert Mustacchi  **/
i40e_aq_set_vsi_multicast_promiscuous(struct i40e_hw * hw,u16 seid,bool set,struct i40e_asq_cmd_details * cmd_details)24059d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_set_vsi_multicast_promiscuous(struct i40e_hw *hw,
24069d26e4fcSRobert Mustacchi 				u16 seid, bool set, struct i40e_asq_cmd_details *cmd_details)
24079d26e4fcSRobert Mustacchi {
24089d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
24099d26e4fcSRobert Mustacchi 	struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
24109d26e4fcSRobert Mustacchi 		(struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
24119d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
24129d26e4fcSRobert Mustacchi 	u16 flags = 0;
24139d26e4fcSRobert Mustacchi 
24149d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
24159d26e4fcSRobert Mustacchi 					i40e_aqc_opc_set_vsi_promiscuous_modes);
24169d26e4fcSRobert Mustacchi 
24179d26e4fcSRobert Mustacchi 	if (set)
24189d26e4fcSRobert Mustacchi 		flags |= I40E_AQC_SET_VSI_PROMISC_MULTICAST;
24199d26e4fcSRobert Mustacchi 
24209d26e4fcSRobert Mustacchi 	cmd->promiscuous_flags = CPU_TO_LE16(flags);
24219d26e4fcSRobert Mustacchi 
24229d26e4fcSRobert Mustacchi 	cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_MULTICAST);
24239d26e4fcSRobert Mustacchi 
24249d26e4fcSRobert Mustacchi 	cmd->seid = CPU_TO_LE16(seid);
24259d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
24269d26e4fcSRobert Mustacchi 
24279d26e4fcSRobert Mustacchi 	return status;
24289d26e4fcSRobert Mustacchi }
24299d26e4fcSRobert Mustacchi 
2430*df36e06dSRobert Mustacchi /**
2431*df36e06dSRobert Mustacchi * i40e_aq_set_vsi_full_promiscuous
2432*df36e06dSRobert Mustacchi * @hw: pointer to the hw struct
2433*df36e06dSRobert Mustacchi * @seid: VSI number
2434*df36e06dSRobert Mustacchi * @set: set promiscuous enable/disable
2435*df36e06dSRobert Mustacchi * @cmd_details: pointer to command details structure or NULL
2436*df36e06dSRobert Mustacchi **/
i40e_aq_set_vsi_full_promiscuous(struct i40e_hw * hw,u16 seid,bool set,struct i40e_asq_cmd_details * cmd_details)2437*df36e06dSRobert Mustacchi enum i40e_status_code i40e_aq_set_vsi_full_promiscuous(struct i40e_hw *hw,
2438*df36e06dSRobert Mustacchi 				u16 seid, bool set,
2439*df36e06dSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
2440*df36e06dSRobert Mustacchi {
2441*df36e06dSRobert Mustacchi 	struct i40e_aq_desc desc;
2442*df36e06dSRobert Mustacchi 	struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2443*df36e06dSRobert Mustacchi 		(struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2444*df36e06dSRobert Mustacchi 	enum i40e_status_code status;
2445*df36e06dSRobert Mustacchi 	u16 flags = 0;
2446*df36e06dSRobert Mustacchi 
2447*df36e06dSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
2448*df36e06dSRobert Mustacchi 		i40e_aqc_opc_set_vsi_promiscuous_modes);
2449*df36e06dSRobert Mustacchi 
2450*df36e06dSRobert Mustacchi 	if (set)
2451*df36e06dSRobert Mustacchi 		flags = I40E_AQC_SET_VSI_PROMISC_UNICAST   |
2452*df36e06dSRobert Mustacchi 			I40E_AQC_SET_VSI_PROMISC_MULTICAST |
2453*df36e06dSRobert Mustacchi 			I40E_AQC_SET_VSI_PROMISC_BROADCAST;
2454*df36e06dSRobert Mustacchi 
2455*df36e06dSRobert Mustacchi 	cmd->promiscuous_flags = CPU_TO_LE16(flags);
2456*df36e06dSRobert Mustacchi 
2457*df36e06dSRobert Mustacchi 	cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_UNICAST   |
2458*df36e06dSRobert Mustacchi 				       I40E_AQC_SET_VSI_PROMISC_MULTICAST |
2459*df36e06dSRobert Mustacchi 				       I40E_AQC_SET_VSI_PROMISC_BROADCAST);
2460*df36e06dSRobert Mustacchi 
2461*df36e06dSRobert Mustacchi 	cmd->seid = CPU_TO_LE16(seid);
2462*df36e06dSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2463*df36e06dSRobert Mustacchi 
2464*df36e06dSRobert Mustacchi 	return status;
2465*df36e06dSRobert Mustacchi }
2466*df36e06dSRobert Mustacchi 
24679d26e4fcSRobert Mustacchi /**
24689d26e4fcSRobert Mustacchi  * i40e_aq_set_vsi_mc_promisc_on_vlan
24699d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
24709d26e4fcSRobert Mustacchi  * @seid: vsi number
24719d26e4fcSRobert Mustacchi  * @enable: set MAC L2 layer unicast promiscuous enable/disable for a given VLAN
24729d26e4fcSRobert Mustacchi  * @vid: The VLAN tag filter - capture any multicast packet with this VLAN tag
24739d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
24749d26e4fcSRobert Mustacchi  **/
i40e_aq_set_vsi_mc_promisc_on_vlan(struct i40e_hw * hw,u16 seid,bool enable,u16 vid,struct i40e_asq_cmd_details * cmd_details)24759d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_set_vsi_mc_promisc_on_vlan(struct i40e_hw *hw,
24769d26e4fcSRobert Mustacchi 				u16 seid, bool enable, u16 vid,
24779d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
24789d26e4fcSRobert Mustacchi {
24799d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
24809d26e4fcSRobert Mustacchi 	struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
24819d26e4fcSRobert Mustacchi 		(struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
24829d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
24839d26e4fcSRobert Mustacchi 	u16 flags = 0;
24849d26e4fcSRobert Mustacchi 
24859d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
24869d26e4fcSRobert Mustacchi 					i40e_aqc_opc_set_vsi_promiscuous_modes);
24879d26e4fcSRobert Mustacchi 
24889d26e4fcSRobert Mustacchi 	if (enable)
24899d26e4fcSRobert Mustacchi 		flags |= I40E_AQC_SET_VSI_PROMISC_MULTICAST;
24909d26e4fcSRobert Mustacchi 
24919d26e4fcSRobert Mustacchi 	cmd->promiscuous_flags = CPU_TO_LE16(flags);
24929d26e4fcSRobert Mustacchi 	cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_MULTICAST);
24939d26e4fcSRobert Mustacchi 	cmd->seid = CPU_TO_LE16(seid);
24949d26e4fcSRobert Mustacchi 	cmd->vlan_tag = CPU_TO_LE16(vid | I40E_AQC_SET_VSI_VLAN_VALID);
24959d26e4fcSRobert Mustacchi 
24969d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
24979d26e4fcSRobert Mustacchi 
24989d26e4fcSRobert Mustacchi 	return status;
24999d26e4fcSRobert Mustacchi }
25009d26e4fcSRobert Mustacchi 
25019d26e4fcSRobert Mustacchi /**
25029d26e4fcSRobert Mustacchi  * i40e_aq_set_vsi_uc_promisc_on_vlan
25039d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
25049d26e4fcSRobert Mustacchi  * @seid: vsi number
25059d26e4fcSRobert Mustacchi  * @enable: set MAC L2 layer unicast promiscuous enable/disable for a given VLAN
25069d26e4fcSRobert Mustacchi  * @vid: The VLAN tag filter - capture any unicast packet with this VLAN tag
25079d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
25089d26e4fcSRobert Mustacchi  **/
i40e_aq_set_vsi_uc_promisc_on_vlan(struct i40e_hw * hw,u16 seid,bool enable,u16 vid,struct i40e_asq_cmd_details * cmd_details)25099d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_set_vsi_uc_promisc_on_vlan(struct i40e_hw *hw,
25109d26e4fcSRobert Mustacchi 				u16 seid, bool enable, u16 vid,
25119d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
25129d26e4fcSRobert Mustacchi {
25139d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
25149d26e4fcSRobert Mustacchi 	struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
25159d26e4fcSRobert Mustacchi 		(struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
25169d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
25179d26e4fcSRobert Mustacchi 	u16 flags = 0;
25189d26e4fcSRobert Mustacchi 
25199d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
25209d26e4fcSRobert Mustacchi 					i40e_aqc_opc_set_vsi_promiscuous_modes);
25219d26e4fcSRobert Mustacchi 
25229d26e4fcSRobert Mustacchi 	if (enable)
25239d26e4fcSRobert Mustacchi 		flags |= I40E_AQC_SET_VSI_PROMISC_UNICAST;
25249d26e4fcSRobert Mustacchi 
25259d26e4fcSRobert Mustacchi 	cmd->promiscuous_flags = CPU_TO_LE16(flags);
25269d26e4fcSRobert Mustacchi 	cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_UNICAST);
25279d26e4fcSRobert Mustacchi 	cmd->seid = CPU_TO_LE16(seid);
25289d26e4fcSRobert Mustacchi 	cmd->vlan_tag = CPU_TO_LE16(vid | I40E_AQC_SET_VSI_VLAN_VALID);
25299d26e4fcSRobert Mustacchi 
25309d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
25319d26e4fcSRobert Mustacchi 
25329d26e4fcSRobert Mustacchi 	return status;
25339d26e4fcSRobert Mustacchi }
25349d26e4fcSRobert Mustacchi 
25353d75a287SRobert Mustacchi /**
25363d75a287SRobert Mustacchi  * i40e_aq_set_vsi_bc_promisc_on_vlan
25373d75a287SRobert Mustacchi  * @hw: pointer to the hw struct
25383d75a287SRobert Mustacchi  * @seid: vsi number
25393d75a287SRobert Mustacchi  * @enable: set broadcast promiscuous enable/disable for a given VLAN
25403d75a287SRobert Mustacchi  * @vid: The VLAN tag filter - capture any broadcast packet with this VLAN tag
25413d75a287SRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
25423d75a287SRobert Mustacchi  **/
i40e_aq_set_vsi_bc_promisc_on_vlan(struct i40e_hw * hw,u16 seid,bool enable,u16 vid,struct i40e_asq_cmd_details * cmd_details)25433d75a287SRobert Mustacchi enum i40e_status_code i40e_aq_set_vsi_bc_promisc_on_vlan(struct i40e_hw *hw,
25443d75a287SRobert Mustacchi 				u16 seid, bool enable, u16 vid,
25453d75a287SRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
25463d75a287SRobert Mustacchi {
25473d75a287SRobert Mustacchi 	struct i40e_aq_desc desc;
25483d75a287SRobert Mustacchi 	struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
25493d75a287SRobert Mustacchi 		(struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
25503d75a287SRobert Mustacchi 	enum i40e_status_code status;
25513d75a287SRobert Mustacchi 	u16 flags = 0;
25523d75a287SRobert Mustacchi 
25533d75a287SRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
25543d75a287SRobert Mustacchi 					i40e_aqc_opc_set_vsi_promiscuous_modes);
25553d75a287SRobert Mustacchi 
25563d75a287SRobert Mustacchi 	if (enable)
25573d75a287SRobert Mustacchi 		flags |= I40E_AQC_SET_VSI_PROMISC_BROADCAST;
25583d75a287SRobert Mustacchi 
25593d75a287SRobert Mustacchi 	cmd->promiscuous_flags = CPU_TO_LE16(flags);
25603d75a287SRobert Mustacchi 	cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_BROADCAST);
25613d75a287SRobert Mustacchi 	cmd->seid = CPU_TO_LE16(seid);
25623d75a287SRobert Mustacchi 	cmd->vlan_tag = CPU_TO_LE16(vid | I40E_AQC_SET_VSI_VLAN_VALID);
25633d75a287SRobert Mustacchi 
25643d75a287SRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
25653d75a287SRobert Mustacchi 
25663d75a287SRobert Mustacchi 	return status;
25673d75a287SRobert Mustacchi }
25683d75a287SRobert Mustacchi 
25699d26e4fcSRobert Mustacchi /**
25709d26e4fcSRobert Mustacchi  * i40e_aq_set_vsi_broadcast
25719d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
25729d26e4fcSRobert Mustacchi  * @seid: vsi number
25739d26e4fcSRobert Mustacchi  * @set_filter: TRUE to set filter, FALSE to clear filter
25749d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
25759d26e4fcSRobert Mustacchi  *
25769d26e4fcSRobert Mustacchi  * Set or clear the broadcast promiscuous flag (filter) for a given VSI.
25779d26e4fcSRobert Mustacchi  **/
i40e_aq_set_vsi_broadcast(struct i40e_hw * hw,u16 seid,bool set_filter,struct i40e_asq_cmd_details * cmd_details)25789d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_set_vsi_broadcast(struct i40e_hw *hw,
25799d26e4fcSRobert Mustacchi 				u16 seid, bool set_filter,
25809d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
25819d26e4fcSRobert Mustacchi {
25829d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
25839d26e4fcSRobert Mustacchi 	struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
25849d26e4fcSRobert Mustacchi 		(struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
25859d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
25869d26e4fcSRobert Mustacchi 
25879d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
25889d26e4fcSRobert Mustacchi 					i40e_aqc_opc_set_vsi_promiscuous_modes);
25899d26e4fcSRobert Mustacchi 
25909d26e4fcSRobert Mustacchi 	if (set_filter)
25919d26e4fcSRobert Mustacchi 		cmd->promiscuous_flags
25929d26e4fcSRobert Mustacchi 			    |= CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_BROADCAST);
25939d26e4fcSRobert Mustacchi 	else
25949d26e4fcSRobert Mustacchi 		cmd->promiscuous_flags
25959d26e4fcSRobert Mustacchi 			    &= CPU_TO_LE16(~I40E_AQC_SET_VSI_PROMISC_BROADCAST);
25969d26e4fcSRobert Mustacchi 
25979d26e4fcSRobert Mustacchi 	cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_BROADCAST);
25989d26e4fcSRobert Mustacchi 	cmd->seid = CPU_TO_LE16(seid);
25999d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
26009d26e4fcSRobert Mustacchi 
26019d26e4fcSRobert Mustacchi 	return status;
26029d26e4fcSRobert Mustacchi }
26039d26e4fcSRobert Mustacchi 
26043d75a287SRobert Mustacchi /**
26053d75a287SRobert Mustacchi  * i40e_aq_set_vsi_vlan_promisc - control the VLAN promiscuous setting
26063d75a287SRobert Mustacchi  * @hw: pointer to the hw struct
26073d75a287SRobert Mustacchi  * @seid: vsi number
26083d75a287SRobert Mustacchi  * @enable: set MAC L2 layer unicast promiscuous enable/disable for a given VLAN
26093d75a287SRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
26103d75a287SRobert Mustacchi  **/
i40e_aq_set_vsi_vlan_promisc(struct i40e_hw * hw,u16 seid,bool enable,struct i40e_asq_cmd_details * cmd_details)26113d75a287SRobert Mustacchi enum i40e_status_code i40e_aq_set_vsi_vlan_promisc(struct i40e_hw *hw,
26123d75a287SRobert Mustacchi 				u16 seid, bool enable,
26133d75a287SRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
26143d75a287SRobert Mustacchi {
26153d75a287SRobert Mustacchi 	struct i40e_aq_desc desc;
26163d75a287SRobert Mustacchi 	struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
26173d75a287SRobert Mustacchi 		(struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
26183d75a287SRobert Mustacchi 	enum i40e_status_code status;
26193d75a287SRobert Mustacchi 	u16 flags = 0;
26203d75a287SRobert Mustacchi 
26213d75a287SRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
26223d75a287SRobert Mustacchi 					i40e_aqc_opc_set_vsi_promiscuous_modes);
26233d75a287SRobert Mustacchi 	if (enable)
26243d75a287SRobert Mustacchi 		flags |= I40E_AQC_SET_VSI_PROMISC_VLAN;
26253d75a287SRobert Mustacchi 
26263d75a287SRobert Mustacchi 	cmd->promiscuous_flags = CPU_TO_LE16(flags);
26273d75a287SRobert Mustacchi 	cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_VLAN);
26283d75a287SRobert Mustacchi 	cmd->seid = CPU_TO_LE16(seid);
26293d75a287SRobert Mustacchi 
26303d75a287SRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
26313d75a287SRobert Mustacchi 
26323d75a287SRobert Mustacchi 	return status;
26333d75a287SRobert Mustacchi }
26343d75a287SRobert Mustacchi 
26359d26e4fcSRobert Mustacchi /**
26369d26e4fcSRobert Mustacchi  * i40e_get_vsi_params - get VSI configuration info
26379d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
26389d26e4fcSRobert Mustacchi  * @vsi_ctx: pointer to a vsi context struct
26399d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
26409d26e4fcSRobert Mustacchi  **/
i40e_aq_get_vsi_params(struct i40e_hw * hw,struct i40e_vsi_context * vsi_ctx,struct i40e_asq_cmd_details * cmd_details)26419d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_get_vsi_params(struct i40e_hw *hw,
26429d26e4fcSRobert Mustacchi 				struct i40e_vsi_context *vsi_ctx,
26439d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
26449d26e4fcSRobert Mustacchi {
26459d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
26469d26e4fcSRobert Mustacchi 	struct i40e_aqc_add_get_update_vsi *cmd =
26479d26e4fcSRobert Mustacchi 		(struct i40e_aqc_add_get_update_vsi *)&desc.params.raw;
26489d26e4fcSRobert Mustacchi 	struct i40e_aqc_add_get_update_vsi_completion *resp =
26499d26e4fcSRobert Mustacchi 		(struct i40e_aqc_add_get_update_vsi_completion *)
26509d26e4fcSRobert Mustacchi 		&desc.params.raw;
26519d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
26529d26e4fcSRobert Mustacchi 
26539d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
26549d26e4fcSRobert Mustacchi 					  i40e_aqc_opc_get_vsi_parameters);
26559d26e4fcSRobert Mustacchi 
26569d26e4fcSRobert Mustacchi 	cmd->uplink_seid = CPU_TO_LE16(vsi_ctx->seid);
26579d26e4fcSRobert Mustacchi 
26589d26e4fcSRobert Mustacchi 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
26599d26e4fcSRobert Mustacchi 
26609d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info,
26619d26e4fcSRobert Mustacchi 				    sizeof(vsi_ctx->info), NULL);
26629d26e4fcSRobert Mustacchi 
26639d26e4fcSRobert Mustacchi 	if (status != I40E_SUCCESS)
26649d26e4fcSRobert Mustacchi 		goto aq_get_vsi_params_exit;
26659d26e4fcSRobert Mustacchi 
26669d26e4fcSRobert Mustacchi 	vsi_ctx->seid = LE16_TO_CPU(resp->seid);
26679d26e4fcSRobert Mustacchi 	vsi_ctx->vsi_number = LE16_TO_CPU(resp->vsi_number);
26689d26e4fcSRobert Mustacchi 	vsi_ctx->vsis_allocated = LE16_TO_CPU(resp->vsi_used);
26699d26e4fcSRobert Mustacchi 	vsi_ctx->vsis_unallocated = LE16_TO_CPU(resp->vsi_free);
26709d26e4fcSRobert Mustacchi 
26719d26e4fcSRobert Mustacchi aq_get_vsi_params_exit:
26729d26e4fcSRobert Mustacchi 	return status;
26739d26e4fcSRobert Mustacchi }
26749d26e4fcSRobert Mustacchi 
26759d26e4fcSRobert Mustacchi /**
26769d26e4fcSRobert Mustacchi  * i40e_aq_update_vsi_params
26779d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
26789d26e4fcSRobert Mustacchi  * @vsi_ctx: pointer to a vsi context struct
26799d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
26809d26e4fcSRobert Mustacchi  *
26819d26e4fcSRobert Mustacchi  * Update a VSI context.
26829d26e4fcSRobert Mustacchi  **/
i40e_aq_update_vsi_params(struct i40e_hw * hw,struct i40e_vsi_context * vsi_ctx,struct i40e_asq_cmd_details * cmd_details)26839d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_update_vsi_params(struct i40e_hw *hw,
26849d26e4fcSRobert Mustacchi 				struct i40e_vsi_context *vsi_ctx,
26859d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
26869d26e4fcSRobert Mustacchi {
26879d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
26889d26e4fcSRobert Mustacchi 	struct i40e_aqc_add_get_update_vsi *cmd =
26899d26e4fcSRobert Mustacchi 		(struct i40e_aqc_add_get_update_vsi *)&desc.params.raw;
26903d75a287SRobert Mustacchi 	struct i40e_aqc_add_get_update_vsi_completion *resp =
26913d75a287SRobert Mustacchi 		(struct i40e_aqc_add_get_update_vsi_completion *)
26923d75a287SRobert Mustacchi 		&desc.params.raw;
26939d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
26949d26e4fcSRobert Mustacchi 
26959d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
26969d26e4fcSRobert Mustacchi 					  i40e_aqc_opc_update_vsi_parameters);
26979d26e4fcSRobert Mustacchi 	cmd->uplink_seid = CPU_TO_LE16(vsi_ctx->seid);
26989d26e4fcSRobert Mustacchi 
26999d26e4fcSRobert Mustacchi 	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
27009d26e4fcSRobert Mustacchi 
27019d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info,
2702*df36e06dSRobert Mustacchi 				       sizeof(vsi_ctx->info), cmd_details);
27039d26e4fcSRobert Mustacchi 
27043d75a287SRobert Mustacchi 	vsi_ctx->vsis_allocated = LE16_TO_CPU(resp->vsi_used);
27053d75a287SRobert Mustacchi 	vsi_ctx->vsis_unallocated = LE16_TO_CPU(resp->vsi_free);
27063d75a287SRobert Mustacchi 
27079d26e4fcSRobert Mustacchi 	return status;
27089d26e4fcSRobert Mustacchi }
27099d26e4fcSRobert Mustacchi 
27109d26e4fcSRobert Mustacchi /**
27119d26e4fcSRobert Mustacchi  * i40e_aq_get_switch_config
27129d26e4fcSRobert Mustacchi  * @hw: pointer to the hardware structure
27139d26e4fcSRobert Mustacchi  * @buf: pointer to the result buffer
27149d26e4fcSRobert Mustacchi  * @buf_size: length of input buffer
27159d26e4fcSRobert Mustacchi  * @start_seid: seid to start for the report, 0 == beginning
27169d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
27179d26e4fcSRobert Mustacchi  *
27189d26e4fcSRobert Mustacchi  * Fill the buf with switch configuration returned from AdminQ command
27199d26e4fcSRobert Mustacchi  **/
i40e_aq_get_switch_config(struct i40e_hw * hw,struct i40e_aqc_get_switch_config_resp * buf,u16 buf_size,u16 * start_seid,struct i40e_asq_cmd_details * cmd_details)27209d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_get_switch_config(struct i40e_hw *hw,
27219d26e4fcSRobert Mustacchi 				struct i40e_aqc_get_switch_config_resp *buf,
27229d26e4fcSRobert Mustacchi 				u16 buf_size, u16 *start_seid,
27239d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
27249d26e4fcSRobert Mustacchi {
27259d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
27269d26e4fcSRobert Mustacchi 	struct i40e_aqc_switch_seid *scfg =
27279d26e4fcSRobert Mustacchi 		(struct i40e_aqc_switch_seid *)&desc.params.raw;
27289d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
27299d26e4fcSRobert Mustacchi 
27309d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
27319d26e4fcSRobert Mustacchi 					  i40e_aqc_opc_get_switch_config);
27329d26e4fcSRobert Mustacchi 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
27339d26e4fcSRobert Mustacchi 	if (buf_size > I40E_AQ_LARGE_BUF)
27349d26e4fcSRobert Mustacchi 		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
27359d26e4fcSRobert Mustacchi 	scfg->seid = CPU_TO_LE16(*start_seid);
27369d26e4fcSRobert Mustacchi 
27379d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, buf, buf_size, cmd_details);
27389d26e4fcSRobert Mustacchi 	*start_seid = LE16_TO_CPU(scfg->seid);
27399d26e4fcSRobert Mustacchi 
27409d26e4fcSRobert Mustacchi 	return status;
27419d26e4fcSRobert Mustacchi }
27429d26e4fcSRobert Mustacchi 
27433d75a287SRobert Mustacchi /**
27443d75a287SRobert Mustacchi  * i40e_aq_set_switch_config
27453d75a287SRobert Mustacchi  * @hw: pointer to the hardware structure
27463d75a287SRobert Mustacchi  * @flags: bit flag values to set
274793f1cac5SPaul Winder  * @mode: cloud filter mode
27483d75a287SRobert Mustacchi  * @valid_flags: which bit flags to set
27493d75a287SRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
27503d75a287SRobert Mustacchi  *
27513d75a287SRobert Mustacchi  * Set switch configuration bits
27523d75a287SRobert Mustacchi  **/
i40e_aq_set_switch_config(struct i40e_hw * hw,u16 flags,u16 valid_flags,u8 mode,struct i40e_asq_cmd_details * cmd_details)27533d75a287SRobert Mustacchi enum i40e_status_code i40e_aq_set_switch_config(struct i40e_hw *hw,
275493f1cac5SPaul Winder 				u16 flags, u16 valid_flags, u8 mode,
27553d75a287SRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
27563d75a287SRobert Mustacchi {
27573d75a287SRobert Mustacchi 	struct i40e_aq_desc desc;
27583d75a287SRobert Mustacchi 	struct i40e_aqc_set_switch_config *scfg =
27593d75a287SRobert Mustacchi 		(struct i40e_aqc_set_switch_config *)&desc.params.raw;
27603d75a287SRobert Mustacchi 	enum i40e_status_code status;
27613d75a287SRobert Mustacchi 
27623d75a287SRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
27633d75a287SRobert Mustacchi 					  i40e_aqc_opc_set_switch_config);
27643d75a287SRobert Mustacchi 	scfg->flags = CPU_TO_LE16(flags);
27653d75a287SRobert Mustacchi 	scfg->valid_flags = CPU_TO_LE16(valid_flags);
276693f1cac5SPaul Winder 	scfg->mode = mode;
276793f1cac5SPaul Winder 	if (hw->flags & I40E_HW_FLAG_802_1AD_CAPABLE) {
276893f1cac5SPaul Winder 		scfg->switch_tag = CPU_TO_LE16(hw->switch_tag);
276993f1cac5SPaul Winder 		scfg->first_tag = CPU_TO_LE16(hw->first_tag);
277093f1cac5SPaul Winder 		scfg->second_tag = CPU_TO_LE16(hw->second_tag);
277193f1cac5SPaul Winder 	}
27723d75a287SRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
27733d75a287SRobert Mustacchi 
27743d75a287SRobert Mustacchi 	return status;
27753d75a287SRobert Mustacchi }
27763d75a287SRobert Mustacchi 
27779d26e4fcSRobert Mustacchi /**
27789d26e4fcSRobert Mustacchi  * i40e_aq_get_firmware_version
27799d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
27809d26e4fcSRobert Mustacchi  * @fw_major_version: firmware major version
27819d26e4fcSRobert Mustacchi  * @fw_minor_version: firmware minor version
27829d26e4fcSRobert Mustacchi  * @fw_build: firmware build number
27839d26e4fcSRobert Mustacchi  * @api_major_version: major queue version
27849d26e4fcSRobert Mustacchi  * @api_minor_version: minor queue version
27859d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
27869d26e4fcSRobert Mustacchi  *
27879d26e4fcSRobert Mustacchi  * Get the firmware version from the admin queue commands
27889d26e4fcSRobert Mustacchi  **/
i40e_aq_get_firmware_version(struct i40e_hw * hw,u16 * fw_major_version,u16 * fw_minor_version,u32 * fw_build,u16 * api_major_version,u16 * api_minor_version,struct i40e_asq_cmd_details * cmd_details)27899d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_get_firmware_version(struct i40e_hw *hw,
27909d26e4fcSRobert Mustacchi 				u16 *fw_major_version, u16 *fw_minor_version,
27919d26e4fcSRobert Mustacchi 				u32 *fw_build,
27929d26e4fcSRobert Mustacchi 				u16 *api_major_version, u16 *api_minor_version,
27939d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
27949d26e4fcSRobert Mustacchi {
27959d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
27969d26e4fcSRobert Mustacchi 	struct i40e_aqc_get_version *resp =
27979d26e4fcSRobert Mustacchi 		(struct i40e_aqc_get_version *)&desc.params.raw;
27989d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
27999d26e4fcSRobert Mustacchi 
28009d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_version);
28019d26e4fcSRobert Mustacchi 
28029d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
28039d26e4fcSRobert Mustacchi 
28049d26e4fcSRobert Mustacchi 	if (status == I40E_SUCCESS) {
28059d26e4fcSRobert Mustacchi 		if (fw_major_version != NULL)
28069d26e4fcSRobert Mustacchi 			*fw_major_version = LE16_TO_CPU(resp->fw_major);
28079d26e4fcSRobert Mustacchi 		if (fw_minor_version != NULL)
28089d26e4fcSRobert Mustacchi 			*fw_minor_version = LE16_TO_CPU(resp->fw_minor);
28099d26e4fcSRobert Mustacchi 		if (fw_build != NULL)
28109d26e4fcSRobert Mustacchi 			*fw_build = LE32_TO_CPU(resp->fw_build);
28119d26e4fcSRobert Mustacchi 		if (api_major_version != NULL)
28129d26e4fcSRobert Mustacchi 			*api_major_version = LE16_TO_CPU(resp->api_major);
28139d26e4fcSRobert Mustacchi 		if (api_minor_version != NULL)
28149d26e4fcSRobert Mustacchi 			*api_minor_version = LE16_TO_CPU(resp->api_minor);
28159d26e4fcSRobert Mustacchi 
28169d26e4fcSRobert Mustacchi 		/* A workaround to fix the API version in SW */
28179d26e4fcSRobert Mustacchi 		if (api_major_version && api_minor_version &&
28189d26e4fcSRobert Mustacchi 		    fw_major_version && fw_minor_version &&
28199d26e4fcSRobert Mustacchi 		    ((*api_major_version == 1) && (*api_minor_version == 1)) &&
28209d26e4fcSRobert Mustacchi 		    (((*fw_major_version == 4) && (*fw_minor_version >= 2)) ||
28219d26e4fcSRobert Mustacchi 		     (*fw_major_version > 4)))
28229d26e4fcSRobert Mustacchi 			*api_minor_version = 2;
28239d26e4fcSRobert Mustacchi 	}
28249d26e4fcSRobert Mustacchi 
28259d26e4fcSRobert Mustacchi 	return status;
28269d26e4fcSRobert Mustacchi }
28279d26e4fcSRobert Mustacchi 
28289d26e4fcSRobert Mustacchi /**
28299d26e4fcSRobert Mustacchi  * i40e_aq_send_driver_version
28309d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
28319d26e4fcSRobert Mustacchi  * @dv: driver's major, minor version
28329d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
28339d26e4fcSRobert Mustacchi  *
28349d26e4fcSRobert Mustacchi  * Send the driver version to the firmware
28359d26e4fcSRobert Mustacchi  **/
i40e_aq_send_driver_version(struct i40e_hw * hw,struct i40e_driver_version * dv,struct i40e_asq_cmd_details * cmd_details)28369d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_send_driver_version(struct i40e_hw *hw,
28379d26e4fcSRobert Mustacchi 				struct i40e_driver_version *dv,
28389d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
28399d26e4fcSRobert Mustacchi {
28409d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
28419d26e4fcSRobert Mustacchi 	struct i40e_aqc_driver_version *cmd =
28429d26e4fcSRobert Mustacchi 		(struct i40e_aqc_driver_version *)&desc.params.raw;
28439d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
28449d26e4fcSRobert Mustacchi 	u16 len;
28459d26e4fcSRobert Mustacchi 
28469d26e4fcSRobert Mustacchi 	if (dv == NULL)
28479d26e4fcSRobert Mustacchi 		return I40E_ERR_PARAM;
28489d26e4fcSRobert Mustacchi 
28499d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_driver_version);
28509d26e4fcSRobert Mustacchi 
28519d26e4fcSRobert Mustacchi 	desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD);
28529d26e4fcSRobert Mustacchi 	cmd->driver_major_ver = dv->major_version;
28539d26e4fcSRobert Mustacchi 	cmd->driver_minor_ver = dv->minor_version;
28549d26e4fcSRobert Mustacchi 	cmd->driver_build_ver = dv->build_version;
28559d26e4fcSRobert Mustacchi 	cmd->driver_subbuild_ver = dv->subbuild_version;
28569d26e4fcSRobert Mustacchi 
28579d26e4fcSRobert Mustacchi 	len = 0;
28589d26e4fcSRobert Mustacchi 	while (len < sizeof(dv->driver_string) &&
28599d26e4fcSRobert Mustacchi 	       (dv->driver_string[len] < 0x80) &&
28609d26e4fcSRobert Mustacchi 	       dv->driver_string[len])
28619d26e4fcSRobert Mustacchi 		len++;
28629d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, dv->driver_string,
28639d26e4fcSRobert Mustacchi 				       len, cmd_details);
28649d26e4fcSRobert Mustacchi 
28659d26e4fcSRobert Mustacchi 	return status;
28669d26e4fcSRobert Mustacchi }
28679d26e4fcSRobert Mustacchi 
28689d26e4fcSRobert Mustacchi /**
28699d26e4fcSRobert Mustacchi  * i40e_get_link_status - get status of the HW network link
28709d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
28719d26e4fcSRobert Mustacchi  * @link_up: pointer to bool (TRUE/FALSE = linkup/linkdown)
28729d26e4fcSRobert Mustacchi  *
28739d26e4fcSRobert Mustacchi  * Variable link_up TRUE if link is up, FALSE if link is down.
28749d26e4fcSRobert Mustacchi  * The variable link_up is invalid if returned value of status != I40E_SUCCESS
28759d26e4fcSRobert Mustacchi  *
28769d26e4fcSRobert Mustacchi  * Side effect: LinkStatusEvent reporting becomes enabled
28779d26e4fcSRobert Mustacchi  **/
i40e_get_link_status(struct i40e_hw * hw,bool * link_up)28789d26e4fcSRobert Mustacchi enum i40e_status_code i40e_get_link_status(struct i40e_hw *hw, bool *link_up)
28799d26e4fcSRobert Mustacchi {
28809d26e4fcSRobert Mustacchi 	enum i40e_status_code status = I40E_SUCCESS;
28819d26e4fcSRobert Mustacchi 
28829d26e4fcSRobert Mustacchi 	if (hw->phy.get_link_info) {
28839d26e4fcSRobert Mustacchi 		status = i40e_update_link_info(hw);
28849d26e4fcSRobert Mustacchi 
28859d26e4fcSRobert Mustacchi 		if (status != I40E_SUCCESS)
28869d26e4fcSRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_LINK, "get link failed: status %d\n",
28879d26e4fcSRobert Mustacchi 				   status);
28889d26e4fcSRobert Mustacchi 	}
28899d26e4fcSRobert Mustacchi 
28909d26e4fcSRobert Mustacchi 	*link_up = hw->phy.link_info.link_info & I40E_AQ_LINK_UP;
28919d26e4fcSRobert Mustacchi 
28929d26e4fcSRobert Mustacchi 	return status;
28939d26e4fcSRobert Mustacchi }
28949d26e4fcSRobert Mustacchi 
28959d26e4fcSRobert Mustacchi /**
28969d26e4fcSRobert Mustacchi  * i40e_updatelink_status - update status of the HW network link
28979d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
28989d26e4fcSRobert Mustacchi  **/
i40e_update_link_info(struct i40e_hw * hw)28999d26e4fcSRobert Mustacchi enum i40e_status_code i40e_update_link_info(struct i40e_hw *hw)
29009d26e4fcSRobert Mustacchi {
29019d26e4fcSRobert Mustacchi 	struct i40e_aq_get_phy_abilities_resp abilities;
29029d26e4fcSRobert Mustacchi 	enum i40e_status_code status = I40E_SUCCESS;
29039d26e4fcSRobert Mustacchi 
29049d26e4fcSRobert Mustacchi 	status = i40e_aq_get_link_info(hw, TRUE, NULL, NULL);
29059d26e4fcSRobert Mustacchi 	if (status)
29069d26e4fcSRobert Mustacchi 		return status;
29079d26e4fcSRobert Mustacchi 
29083d75a287SRobert Mustacchi 	/* extra checking needed to ensure link info to user is timely */
29093d75a287SRobert Mustacchi 	if ((hw->phy.link_info.link_info & I40E_AQ_MEDIA_AVAILABLE) &&
29103d75a287SRobert Mustacchi 	    ((hw->phy.link_info.link_info & I40E_AQ_LINK_UP) ||
29113d75a287SRobert Mustacchi 	     !(hw->phy.link_info_old.link_info & I40E_AQ_LINK_UP))) {
29123d75a287SRobert Mustacchi 		status = i40e_aq_get_phy_capabilities(hw, FALSE, false,
29133d75a287SRobert Mustacchi 						      &abilities, NULL);
29143d75a287SRobert Mustacchi 		if (status)
29153d75a287SRobert Mustacchi 			return status;
29169d26e4fcSRobert Mustacchi 
2917*df36e06dSRobert Mustacchi 		if (abilities.fec_cfg_curr_mod_ext_info &
2918*df36e06dSRobert Mustacchi 		    I40E_AQ_ENABLE_FEC_AUTO)
2919*df36e06dSRobert Mustacchi 			hw->phy.link_info.req_fec_info =
2920*df36e06dSRobert Mustacchi 				(I40E_AQ_REQUEST_FEC_KR |
2921*df36e06dSRobert Mustacchi 				 I40E_AQ_REQUEST_FEC_RS);
2922*df36e06dSRobert Mustacchi 		else
2923*df36e06dSRobert Mustacchi 			hw->phy.link_info.req_fec_info =
2924*df36e06dSRobert Mustacchi 				abilities.fec_cfg_curr_mod_ext_info &
2925*df36e06dSRobert Mustacchi 				(I40E_AQ_REQUEST_FEC_KR |
2926*df36e06dSRobert Mustacchi 				 I40E_AQ_REQUEST_FEC_RS);
292793f1cac5SPaul Winder 
29283d75a287SRobert Mustacchi 		i40e_memcpy(hw->phy.link_info.module_type, &abilities.module_type,
29293d75a287SRobert Mustacchi 			sizeof(hw->phy.link_info.module_type), I40E_NONDMA_TO_NONDMA);
29303d75a287SRobert Mustacchi 	}
29319d26e4fcSRobert Mustacchi 	return status;
29329d26e4fcSRobert Mustacchi }
29339d26e4fcSRobert Mustacchi 
29349d26e4fcSRobert Mustacchi 
29359d26e4fcSRobert Mustacchi /**
29369d26e4fcSRobert Mustacchi  * i40e_get_link_speed
29379d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
29389d26e4fcSRobert Mustacchi  *
29399d26e4fcSRobert Mustacchi  * Returns the link speed of the adapter.
29409d26e4fcSRobert Mustacchi  **/
i40e_get_link_speed(struct i40e_hw * hw)29419d26e4fcSRobert Mustacchi enum i40e_aq_link_speed i40e_get_link_speed(struct i40e_hw *hw)
29429d26e4fcSRobert Mustacchi {
29439d26e4fcSRobert Mustacchi 	enum i40e_aq_link_speed speed = I40E_LINK_SPEED_UNKNOWN;
29449d26e4fcSRobert Mustacchi 	enum i40e_status_code status = I40E_SUCCESS;
29459d26e4fcSRobert Mustacchi 
29469d26e4fcSRobert Mustacchi 	if (hw->phy.get_link_info) {
29479d26e4fcSRobert Mustacchi 		status = i40e_aq_get_link_info(hw, TRUE, NULL, NULL);
29489d26e4fcSRobert Mustacchi 
29499d26e4fcSRobert Mustacchi 		if (status != I40E_SUCCESS)
29509d26e4fcSRobert Mustacchi 			goto i40e_link_speed_exit;
29519d26e4fcSRobert Mustacchi 	}
29529d26e4fcSRobert Mustacchi 
29539d26e4fcSRobert Mustacchi 	speed = hw->phy.link_info.link_speed;
29549d26e4fcSRobert Mustacchi 
29559d26e4fcSRobert Mustacchi i40e_link_speed_exit:
29569d26e4fcSRobert Mustacchi 	return speed;
29579d26e4fcSRobert Mustacchi }
29589d26e4fcSRobert Mustacchi 
29599d26e4fcSRobert Mustacchi /**
29609d26e4fcSRobert Mustacchi  * i40e_aq_add_veb - Insert a VEB between the VSI and the MAC
29619d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
29629d26e4fcSRobert Mustacchi  * @uplink_seid: the MAC or other gizmo SEID
29639d26e4fcSRobert Mustacchi  * @downlink_seid: the VSI SEID
29649d26e4fcSRobert Mustacchi  * @enabled_tc: bitmap of TCs to be enabled
29659d26e4fcSRobert Mustacchi  * @default_port: TRUE for default port VSI, FALSE for control port
29669d26e4fcSRobert Mustacchi  * @veb_seid: pointer to where to put the resulting VEB SEID
29673d75a287SRobert Mustacchi  * @enable_stats: TRUE to turn on VEB stats
29689d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
29699d26e4fcSRobert Mustacchi  *
29709d26e4fcSRobert Mustacchi  * This asks the FW to add a VEB between the uplink and downlink
29719d26e4fcSRobert Mustacchi  * elements.  If the uplink SEID is 0, this will be a floating VEB.
29729d26e4fcSRobert Mustacchi  **/
i40e_aq_add_veb(struct i40e_hw * hw,u16 uplink_seid,u16 downlink_seid,u8 enabled_tc,bool default_port,u16 * veb_seid,bool enable_stats,struct i40e_asq_cmd_details * cmd_details)29739d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_add_veb(struct i40e_hw *hw, u16 uplink_seid,
29749d26e4fcSRobert Mustacchi 				u16 downlink_seid, u8 enabled_tc,
29753d75a287SRobert Mustacchi 				bool default_port, u16 *veb_seid,
29763d75a287SRobert Mustacchi 				bool enable_stats,
29779d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
29789d26e4fcSRobert Mustacchi {
29799d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
29809d26e4fcSRobert Mustacchi 	struct i40e_aqc_add_veb *cmd =
29819d26e4fcSRobert Mustacchi 		(struct i40e_aqc_add_veb *)&desc.params.raw;
29829d26e4fcSRobert Mustacchi 	struct i40e_aqc_add_veb_completion *resp =
29839d26e4fcSRobert Mustacchi 		(struct i40e_aqc_add_veb_completion *)&desc.params.raw;
29849d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
29859d26e4fcSRobert Mustacchi 	u16 veb_flags = 0;
29869d26e4fcSRobert Mustacchi 
29879d26e4fcSRobert Mustacchi 	/* SEIDs need to either both be set or both be 0 for floating VEB */
29889d26e4fcSRobert Mustacchi 	if (!!uplink_seid != !!downlink_seid)
29899d26e4fcSRobert Mustacchi 		return I40E_ERR_PARAM;
29909d26e4fcSRobert Mustacchi 
29919d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_veb);
29929d26e4fcSRobert Mustacchi 
29939d26e4fcSRobert Mustacchi 	cmd->uplink_seid = CPU_TO_LE16(uplink_seid);
29949d26e4fcSRobert Mustacchi 	cmd->downlink_seid = CPU_TO_LE16(downlink_seid);
29959d26e4fcSRobert Mustacchi 	cmd->enable_tcs = enabled_tc;
29969d26e4fcSRobert Mustacchi 	if (!uplink_seid)
29979d26e4fcSRobert Mustacchi 		veb_flags |= I40E_AQC_ADD_VEB_FLOATING;
29989d26e4fcSRobert Mustacchi 	if (default_port)
29999d26e4fcSRobert Mustacchi 		veb_flags |= I40E_AQC_ADD_VEB_PORT_TYPE_DEFAULT;
30009d26e4fcSRobert Mustacchi 	else
30019d26e4fcSRobert Mustacchi 		veb_flags |= I40E_AQC_ADD_VEB_PORT_TYPE_DATA;
30029d26e4fcSRobert Mustacchi 
30033d75a287SRobert Mustacchi 	/* reverse logic here: set the bitflag to disable the stats */
30043d75a287SRobert Mustacchi 	if (!enable_stats)
30053d75a287SRobert Mustacchi 		veb_flags |= I40E_AQC_ADD_VEB_ENABLE_DISABLE_STATS;
30069d26e4fcSRobert Mustacchi 
30079d26e4fcSRobert Mustacchi 	cmd->veb_flags = CPU_TO_LE16(veb_flags);
30089d26e4fcSRobert Mustacchi 
30099d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
30109d26e4fcSRobert Mustacchi 
30119d26e4fcSRobert Mustacchi 	if (!status && veb_seid)
30129d26e4fcSRobert Mustacchi 		*veb_seid = LE16_TO_CPU(resp->veb_seid);
30139d26e4fcSRobert Mustacchi 
30149d26e4fcSRobert Mustacchi 	return status;
30159d26e4fcSRobert Mustacchi }
30169d26e4fcSRobert Mustacchi 
30179d26e4fcSRobert Mustacchi /**
30189d26e4fcSRobert Mustacchi  * i40e_aq_get_veb_parameters - Retrieve VEB parameters
30199d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
30209d26e4fcSRobert Mustacchi  * @veb_seid: the SEID of the VEB to query
30219d26e4fcSRobert Mustacchi  * @switch_id: the uplink switch id
30229d26e4fcSRobert Mustacchi  * @floating: set to TRUE if the VEB is floating
30239d26e4fcSRobert Mustacchi  * @statistic_index: index of the stats counter block for this VEB
30249d26e4fcSRobert Mustacchi  * @vebs_used: number of VEB's used by function
30259d26e4fcSRobert Mustacchi  * @vebs_free: total VEB's not reserved by any function
30269d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
30279d26e4fcSRobert Mustacchi  *
30289d26e4fcSRobert Mustacchi  * This retrieves the parameters for a particular VEB, specified by
30299d26e4fcSRobert Mustacchi  * uplink_seid, and returns them to the caller.
30309d26e4fcSRobert Mustacchi  **/
i40e_aq_get_veb_parameters(struct i40e_hw * hw,u16 veb_seid,u16 * switch_id,bool * floating,u16 * statistic_index,u16 * vebs_used,u16 * vebs_free,struct i40e_asq_cmd_details * cmd_details)30319d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_get_veb_parameters(struct i40e_hw *hw,
30329d26e4fcSRobert Mustacchi 				u16 veb_seid, u16 *switch_id,
30339d26e4fcSRobert Mustacchi 				bool *floating, u16 *statistic_index,
30349d26e4fcSRobert Mustacchi 				u16 *vebs_used, u16 *vebs_free,
30359d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
30369d26e4fcSRobert Mustacchi {
30379d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
30389d26e4fcSRobert Mustacchi 	struct i40e_aqc_get_veb_parameters_completion *cmd_resp =
30399d26e4fcSRobert Mustacchi 		(struct i40e_aqc_get_veb_parameters_completion *)
30409d26e4fcSRobert Mustacchi 		&desc.params.raw;
30419d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
30429d26e4fcSRobert Mustacchi 
30439d26e4fcSRobert Mustacchi 	if (veb_seid == 0)
30449d26e4fcSRobert Mustacchi 		return I40E_ERR_PARAM;
30459d26e4fcSRobert Mustacchi 
30469d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
30479d26e4fcSRobert Mustacchi 					  i40e_aqc_opc_get_veb_parameters);
30489d26e4fcSRobert Mustacchi 	cmd_resp->seid = CPU_TO_LE16(veb_seid);
30499d26e4fcSRobert Mustacchi 
30509d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
30519d26e4fcSRobert Mustacchi 	if (status)
30529d26e4fcSRobert Mustacchi 		goto get_veb_exit;
30539d26e4fcSRobert Mustacchi 
30549d26e4fcSRobert Mustacchi 	if (switch_id)
30559d26e4fcSRobert Mustacchi 		*switch_id = LE16_TO_CPU(cmd_resp->switch_id);
30569d26e4fcSRobert Mustacchi 	if (statistic_index)
30579d26e4fcSRobert Mustacchi 		*statistic_index = LE16_TO_CPU(cmd_resp->statistic_index);
30589d26e4fcSRobert Mustacchi 	if (vebs_used)
30599d26e4fcSRobert Mustacchi 		*vebs_used = LE16_TO_CPU(cmd_resp->vebs_used);
30609d26e4fcSRobert Mustacchi 	if (vebs_free)
30619d26e4fcSRobert Mustacchi 		*vebs_free = LE16_TO_CPU(cmd_resp->vebs_free);
30629d26e4fcSRobert Mustacchi 	if (floating) {
30639d26e4fcSRobert Mustacchi 		u16 flags = LE16_TO_CPU(cmd_resp->veb_flags);
30649d26e4fcSRobert Mustacchi 
30659d26e4fcSRobert Mustacchi 		if (flags & I40E_AQC_ADD_VEB_FLOATING)
30669d26e4fcSRobert Mustacchi 			*floating = TRUE;
30679d26e4fcSRobert Mustacchi 		else
30689d26e4fcSRobert Mustacchi 			*floating = FALSE;
30699d26e4fcSRobert Mustacchi 	}
30709d26e4fcSRobert Mustacchi 
30719d26e4fcSRobert Mustacchi get_veb_exit:
30729d26e4fcSRobert Mustacchi 	return status;
30739d26e4fcSRobert Mustacchi }
30749d26e4fcSRobert Mustacchi 
30759d26e4fcSRobert Mustacchi /**
30769d26e4fcSRobert Mustacchi  * i40e_aq_add_macvlan
30779d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
30789d26e4fcSRobert Mustacchi  * @seid: VSI for the mac address
30799d26e4fcSRobert Mustacchi  * @mv_list: list of macvlans to be added
30809d26e4fcSRobert Mustacchi  * @count: length of the list
30819d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
30829d26e4fcSRobert Mustacchi  *
30839d26e4fcSRobert Mustacchi  * Add MAC/VLAN addresses to the HW filtering
30849d26e4fcSRobert Mustacchi  **/
i40e_aq_add_macvlan(struct i40e_hw * hw,u16 seid,struct i40e_aqc_add_macvlan_element_data * mv_list,u16 count,struct i40e_asq_cmd_details * cmd_details)30859d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_add_macvlan(struct i40e_hw *hw, u16 seid,
30869d26e4fcSRobert Mustacchi 			struct i40e_aqc_add_macvlan_element_data *mv_list,
30879d26e4fcSRobert Mustacchi 			u16 count, struct i40e_asq_cmd_details *cmd_details)
30889d26e4fcSRobert Mustacchi {
30899d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
30909d26e4fcSRobert Mustacchi 	struct i40e_aqc_macvlan *cmd =
30919d26e4fcSRobert Mustacchi 		(struct i40e_aqc_macvlan *)&desc.params.raw;
30929d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
30939d26e4fcSRobert Mustacchi 	u16 buf_size;
30943d75a287SRobert Mustacchi 	int i;
30959d26e4fcSRobert Mustacchi 
30969d26e4fcSRobert Mustacchi 	if (count == 0 || !mv_list || !hw)
30979d26e4fcSRobert Mustacchi 		return I40E_ERR_PARAM;
30989d26e4fcSRobert Mustacchi 
30999d26e4fcSRobert Mustacchi 	buf_size = count * sizeof(*mv_list);
31009d26e4fcSRobert Mustacchi 
31019d26e4fcSRobert Mustacchi 	/* prep the rest of the request */
31029d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_macvlan);
31039d26e4fcSRobert Mustacchi 	cmd->num_addresses = CPU_TO_LE16(count);
31049d26e4fcSRobert Mustacchi 	cmd->seid[0] = CPU_TO_LE16(I40E_AQC_MACVLAN_CMD_SEID_VALID | seid);
31059d26e4fcSRobert Mustacchi 	cmd->seid[1] = 0;
31069d26e4fcSRobert Mustacchi 	cmd->seid[2] = 0;
31079d26e4fcSRobert Mustacchi 
31083d75a287SRobert Mustacchi 	for (i = 0; i < count; i++)
31093d75a287SRobert Mustacchi 		if (I40E_IS_MULTICAST(mv_list[i].mac_addr))
31103d75a287SRobert Mustacchi 			mv_list[i].flags |=
31113d75a287SRobert Mustacchi 			    CPU_TO_LE16(I40E_AQC_MACVLAN_ADD_USE_SHARED_MAC);
31123d75a287SRobert Mustacchi 
31139d26e4fcSRobert Mustacchi 	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
31149d26e4fcSRobert Mustacchi 	if (buf_size > I40E_AQ_LARGE_BUF)
31159d26e4fcSRobert Mustacchi 		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
31169d26e4fcSRobert Mustacchi 
31179d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, mv_list, buf_size,
31183d75a287SRobert Mustacchi 				       cmd_details);
31199d26e4fcSRobert Mustacchi 
31209d26e4fcSRobert Mustacchi 	return status;
31219d26e4fcSRobert Mustacchi }
31229d26e4fcSRobert Mustacchi 
31239d26e4fcSRobert Mustacchi /**
31249d26e4fcSRobert Mustacchi  * i40e_aq_remove_macvlan
31259d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
31269d26e4fcSRobert Mustacchi  * @seid: VSI for the mac address
31279d26e4fcSRobert Mustacchi  * @mv_list: list of macvlans to be removed
31289d26e4fcSRobert Mustacchi  * @count: length of the list
31299d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
31309d26e4fcSRobert Mustacchi  *
31319d26e4fcSRobert Mustacchi  * Remove MAC/VLAN addresses from the HW filtering
31329d26e4fcSRobert Mustacchi  **/
i40e_aq_remove_macvlan(struct i40e_hw * hw,u16 seid,struct i40e_aqc_remove_macvlan_element_data * mv_list,u16 count,struct i40e_asq_cmd_details * cmd_details)31339d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_remove_macvlan(struct i40e_hw *hw, u16 seid,
31349d26e4fcSRobert Mustacchi 			struct i40e_aqc_remove_macvlan_element_data *mv_list,
31359d26e4fcSRobert Mustacchi 			u16 count, struct i40e_asq_cmd_details *cmd_details)
31369d26e4fcSRobert Mustacchi {
31379d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
31389d26e4fcSRobert Mustacchi 	struct i40e_aqc_macvlan *cmd =
31399d26e4fcSRobert Mustacchi 		(struct i40e_aqc_macvlan *)&desc.params.raw;
31409d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
31419d26e4fcSRobert Mustacchi 	u16 buf_size;
31429d26e4fcSRobert Mustacchi 
31439d26e4fcSRobert Mustacchi 	if (count == 0 || !mv_list || !hw)
31449d26e4fcSRobert Mustacchi 		return I40E_ERR_PARAM;
31459d26e4fcSRobert Mustacchi 
31469d26e4fcSRobert Mustacchi 	buf_size = count * sizeof(*mv_list);
31479d26e4fcSRobert Mustacchi 
31489d26e4fcSRobert Mustacchi 	/* prep the rest of the request */
31499d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_remove_macvlan);
31509d26e4fcSRobert Mustacchi 	cmd->num_addresses = CPU_TO_LE16(count);
31519d26e4fcSRobert Mustacchi 	cmd->seid[0] = CPU_TO_LE16(I40E_AQC_MACVLAN_CMD_SEID_VALID | seid);
31529d26e4fcSRobert Mustacchi 	cmd->seid[1] = 0;
31539d26e4fcSRobert Mustacchi 	cmd->seid[2] = 0;
31549d26e4fcSRobert Mustacchi 
31559d26e4fcSRobert Mustacchi 	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
31569d26e4fcSRobert Mustacchi 	if (buf_size > I40E_AQ_LARGE_BUF)
31579d26e4fcSRobert Mustacchi 		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
31589d26e4fcSRobert Mustacchi 
31599d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, mv_list, buf_size,
31609d26e4fcSRobert Mustacchi 				       cmd_details);
31619d26e4fcSRobert Mustacchi 
31629d26e4fcSRobert Mustacchi 	return status;
31639d26e4fcSRobert Mustacchi }
31649d26e4fcSRobert Mustacchi 
31653d75a287SRobert Mustacchi /**
31663d75a287SRobert Mustacchi  * i40e_mirrorrule_op - Internal helper function to add/delete mirror rule
31673d75a287SRobert Mustacchi  * @hw: pointer to the hw struct
31683d75a287SRobert Mustacchi  * @opcode: AQ opcode for add or delete mirror rule
31693d75a287SRobert Mustacchi  * @sw_seid: Switch SEID (to which rule refers)
31703d75a287SRobert Mustacchi  * @rule_type: Rule Type (ingress/egress/VLAN)
31713d75a287SRobert Mustacchi  * @id: Destination VSI SEID or Rule ID
31723d75a287SRobert Mustacchi  * @count: length of the list
31733d75a287SRobert Mustacchi  * @mr_list: list of mirrored VSI SEIDs or VLAN IDs
31743d75a287SRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
31753d75a287SRobert Mustacchi  * @rule_id: Rule ID returned from FW
317693f1cac5SPaul Winder  * @rules_used: Number of rules used in internal switch
317793f1cac5SPaul Winder  * @rules_free: Number of rules free in internal switch
31783d75a287SRobert Mustacchi  *
31793d75a287SRobert Mustacchi  * Add/Delete a mirror rule to a specific switch. Mirror rules are supported for
31803d75a287SRobert Mustacchi  * VEBs/VEPA elements only
31813d75a287SRobert Mustacchi  **/
i40e_mirrorrule_op(struct i40e_hw * hw,u16 opcode,u16 sw_seid,u16 rule_type,u16 id,u16 count,__le16 * mr_list,struct i40e_asq_cmd_details * cmd_details,u16 * rule_id,u16 * rules_used,u16 * rules_free)31823d75a287SRobert Mustacchi static enum i40e_status_code i40e_mirrorrule_op(struct i40e_hw *hw,
31833d75a287SRobert Mustacchi 			u16 opcode, u16 sw_seid, u16 rule_type, u16 id,
31843d75a287SRobert Mustacchi 			u16 count, __le16 *mr_list,
31853d75a287SRobert Mustacchi 			struct i40e_asq_cmd_details *cmd_details,
31863d75a287SRobert Mustacchi 			u16 *rule_id, u16 *rules_used, u16 *rules_free)
31873d75a287SRobert Mustacchi {
31883d75a287SRobert Mustacchi 	struct i40e_aq_desc desc;
31893d75a287SRobert Mustacchi 	struct i40e_aqc_add_delete_mirror_rule *cmd =
31903d75a287SRobert Mustacchi 		(struct i40e_aqc_add_delete_mirror_rule *)&desc.params.raw;
31913d75a287SRobert Mustacchi 	struct i40e_aqc_add_delete_mirror_rule_completion *resp =
31923d75a287SRobert Mustacchi 	(struct i40e_aqc_add_delete_mirror_rule_completion *)&desc.params.raw;
31933d75a287SRobert Mustacchi 	enum i40e_status_code status;
31943d75a287SRobert Mustacchi 	u16 buf_size;
31953d75a287SRobert Mustacchi 
31963d75a287SRobert Mustacchi 	buf_size = count * sizeof(*mr_list);
31973d75a287SRobert Mustacchi 
31983d75a287SRobert Mustacchi 	/* prep the rest of the request */
31993d75a287SRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, opcode);
32003d75a287SRobert Mustacchi 	cmd->seid = CPU_TO_LE16(sw_seid);
32013d75a287SRobert Mustacchi 	cmd->rule_type = CPU_TO_LE16(rule_type &
32023d75a287SRobert Mustacchi 				     I40E_AQC_MIRROR_RULE_TYPE_MASK);
32033d75a287SRobert Mustacchi 	cmd->num_entries = CPU_TO_LE16(count);
32043d75a287SRobert Mustacchi 	/* Dest VSI for add, rule_id for delete */
32053d75a287SRobert Mustacchi 	cmd->destination = CPU_TO_LE16(id);
32063d75a287SRobert Mustacchi 	if (mr_list) {
32073d75a287SRobert Mustacchi 		desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF |
32083d75a287SRobert Mustacchi 						I40E_AQ_FLAG_RD));
32093d75a287SRobert Mustacchi 		if (buf_size > I40E_AQ_LARGE_BUF)
32103d75a287SRobert Mustacchi 			desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
32113d75a287SRobert Mustacchi 	}
32123d75a287SRobert Mustacchi 
32133d75a287SRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, mr_list, buf_size,
32143d75a287SRobert Mustacchi 				       cmd_details);
32153d75a287SRobert Mustacchi 	if (status == I40E_SUCCESS ||
32163d75a287SRobert Mustacchi 	    hw->aq.asq_last_status == I40E_AQ_RC_ENOSPC) {
32173d75a287SRobert Mustacchi 		if (rule_id)
32183d75a287SRobert Mustacchi 			*rule_id = LE16_TO_CPU(resp->rule_id);
32193d75a287SRobert Mustacchi 		if (rules_used)
32203d75a287SRobert Mustacchi 			*rules_used = LE16_TO_CPU(resp->mirror_rules_used);
32213d75a287SRobert Mustacchi 		if (rules_free)
32223d75a287SRobert Mustacchi 			*rules_free = LE16_TO_CPU(resp->mirror_rules_free);
32233d75a287SRobert Mustacchi 	}
32243d75a287SRobert Mustacchi 	return status;
32253d75a287SRobert Mustacchi }
32263d75a287SRobert Mustacchi 
32273d75a287SRobert Mustacchi /**
32283d75a287SRobert Mustacchi  * i40e_aq_add_mirrorrule - add a mirror rule
32293d75a287SRobert Mustacchi  * @hw: pointer to the hw struct
32303d75a287SRobert Mustacchi  * @sw_seid: Switch SEID (to which rule refers)
32313d75a287SRobert Mustacchi  * @rule_type: Rule Type (ingress/egress/VLAN)
32323d75a287SRobert Mustacchi  * @dest_vsi: SEID of VSI to which packets will be mirrored
32333d75a287SRobert Mustacchi  * @count: length of the list
32343d75a287SRobert Mustacchi  * @mr_list: list of mirrored VSI SEIDs or VLAN IDs
32353d75a287SRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
32363d75a287SRobert Mustacchi  * @rule_id: Rule ID returned from FW
323793f1cac5SPaul Winder  * @rules_used: Number of rules used in internal switch
323893f1cac5SPaul Winder  * @rules_free: Number of rules free in internal switch
32393d75a287SRobert Mustacchi  *
32403d75a287SRobert Mustacchi  * Add mirror rule. Mirror rules are supported for VEBs or VEPA elements only
32413d75a287SRobert Mustacchi  **/
i40e_aq_add_mirrorrule(struct i40e_hw * hw,u16 sw_seid,u16 rule_type,u16 dest_vsi,u16 count,__le16 * mr_list,struct i40e_asq_cmd_details * cmd_details,u16 * rule_id,u16 * rules_used,u16 * rules_free)32423d75a287SRobert Mustacchi enum i40e_status_code i40e_aq_add_mirrorrule(struct i40e_hw *hw, u16 sw_seid,
32433d75a287SRobert Mustacchi 			u16 rule_type, u16 dest_vsi, u16 count, __le16 *mr_list,
32443d75a287SRobert Mustacchi 			struct i40e_asq_cmd_details *cmd_details,
32453d75a287SRobert Mustacchi 			u16 *rule_id, u16 *rules_used, u16 *rules_free)
32463d75a287SRobert Mustacchi {
32473d75a287SRobert Mustacchi 	if (!(rule_type == I40E_AQC_MIRROR_RULE_TYPE_ALL_INGRESS ||
32483d75a287SRobert Mustacchi 	    rule_type == I40E_AQC_MIRROR_RULE_TYPE_ALL_EGRESS)) {
32493d75a287SRobert Mustacchi 		if (count == 0 || !mr_list)
32503d75a287SRobert Mustacchi 			return I40E_ERR_PARAM;
32513d75a287SRobert Mustacchi 	}
32523d75a287SRobert Mustacchi 
32533d75a287SRobert Mustacchi 	return i40e_mirrorrule_op(hw, i40e_aqc_opc_add_mirror_rule, sw_seid,
32543d75a287SRobert Mustacchi 				  rule_type, dest_vsi, count, mr_list,
32553d75a287SRobert Mustacchi 				  cmd_details, rule_id, rules_used, rules_free);
32563d75a287SRobert Mustacchi }
32573d75a287SRobert Mustacchi 
32583d75a287SRobert Mustacchi /**
32593d75a287SRobert Mustacchi  * i40e_aq_delete_mirrorrule - delete a mirror rule
32603d75a287SRobert Mustacchi  * @hw: pointer to the hw struct
32613d75a287SRobert Mustacchi  * @sw_seid: Switch SEID (to which rule refers)
32623d75a287SRobert Mustacchi  * @rule_type: Rule Type (ingress/egress/VLAN)
32633d75a287SRobert Mustacchi  * @count: length of the list
32643d75a287SRobert Mustacchi  * @rule_id: Rule ID that is returned in the receive desc as part of
32653d75a287SRobert Mustacchi  *		add_mirrorrule.
32663d75a287SRobert Mustacchi  * @mr_list: list of mirrored VLAN IDs to be removed
32673d75a287SRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
326893f1cac5SPaul Winder  * @rules_used: Number of rules used in internal switch
326993f1cac5SPaul Winder  * @rules_free: Number of rules free in internal switch
32703d75a287SRobert Mustacchi  *
32713d75a287SRobert Mustacchi  * Delete a mirror rule. Mirror rules are supported for VEBs/VEPA elements only
32723d75a287SRobert Mustacchi  **/
i40e_aq_delete_mirrorrule(struct i40e_hw * hw,u16 sw_seid,u16 rule_type,u16 rule_id,u16 count,__le16 * mr_list,struct i40e_asq_cmd_details * cmd_details,u16 * rules_used,u16 * rules_free)32733d75a287SRobert Mustacchi enum i40e_status_code i40e_aq_delete_mirrorrule(struct i40e_hw *hw, u16 sw_seid,
32743d75a287SRobert Mustacchi 			u16 rule_type, u16 rule_id, u16 count, __le16 *mr_list,
32753d75a287SRobert Mustacchi 			struct i40e_asq_cmd_details *cmd_details,
32763d75a287SRobert Mustacchi 			u16 *rules_used, u16 *rules_free)
32773d75a287SRobert Mustacchi {
32783d75a287SRobert Mustacchi 	/* Rule ID has to be valid except rule_type: INGRESS VLAN mirroring */
32793d75a287SRobert Mustacchi 	if (rule_type == I40E_AQC_MIRROR_RULE_TYPE_VLAN) {
32803d75a287SRobert Mustacchi 		/* count and mr_list shall be valid for rule_type INGRESS VLAN
32813d75a287SRobert Mustacchi 		 * mirroring. For other rule_type, count and rule_type should
32823d75a287SRobert Mustacchi 		 * not matter.
32833d75a287SRobert Mustacchi 		 */
32843d75a287SRobert Mustacchi 		if (count == 0 || !mr_list)
32853d75a287SRobert Mustacchi 			return I40E_ERR_PARAM;
32863d75a287SRobert Mustacchi 	}
32873d75a287SRobert Mustacchi 
32883d75a287SRobert Mustacchi 	return i40e_mirrorrule_op(hw, i40e_aqc_opc_delete_mirror_rule, sw_seid,
32893d75a287SRobert Mustacchi 				  rule_type, rule_id, count, mr_list,
32903d75a287SRobert Mustacchi 				  cmd_details, NULL, rules_used, rules_free);
32913d75a287SRobert Mustacchi }
32923d75a287SRobert Mustacchi 
32939d26e4fcSRobert Mustacchi /**
32949d26e4fcSRobert Mustacchi  * i40e_aq_add_vlan - Add VLAN ids to the HW filtering
32959d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
32969d26e4fcSRobert Mustacchi  * @seid: VSI for the vlan filters
32979d26e4fcSRobert Mustacchi  * @v_list: list of vlan filters to be added
32989d26e4fcSRobert Mustacchi  * @count: length of the list
32999d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
33009d26e4fcSRobert Mustacchi  **/
i40e_aq_add_vlan(struct i40e_hw * hw,u16 seid,struct i40e_aqc_add_remove_vlan_element_data * v_list,u8 count,struct i40e_asq_cmd_details * cmd_details)33019d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_add_vlan(struct i40e_hw *hw, u16 seid,
33029d26e4fcSRobert Mustacchi 			struct i40e_aqc_add_remove_vlan_element_data *v_list,
33039d26e4fcSRobert Mustacchi 			u8 count, struct i40e_asq_cmd_details *cmd_details)
33049d26e4fcSRobert Mustacchi {
33059d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
33069d26e4fcSRobert Mustacchi 	struct i40e_aqc_macvlan *cmd =
33079d26e4fcSRobert Mustacchi 		(struct i40e_aqc_macvlan *)&desc.params.raw;
33089d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
33099d26e4fcSRobert Mustacchi 	u16 buf_size;
33109d26e4fcSRobert Mustacchi 
33119d26e4fcSRobert Mustacchi 	if (count == 0 || !v_list || !hw)
33129d26e4fcSRobert Mustacchi 		return I40E_ERR_PARAM;
33139d26e4fcSRobert Mustacchi 
33149d26e4fcSRobert Mustacchi 	buf_size = count * sizeof(*v_list);
33159d26e4fcSRobert Mustacchi 
33169d26e4fcSRobert Mustacchi 	/* prep the rest of the request */
33179d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_vlan);
33189d26e4fcSRobert Mustacchi 	cmd->num_addresses = CPU_TO_LE16(count);
33199d26e4fcSRobert Mustacchi 	cmd->seid[0] = CPU_TO_LE16(seid | I40E_AQC_MACVLAN_CMD_SEID_VALID);
33209d26e4fcSRobert Mustacchi 	cmd->seid[1] = 0;
33219d26e4fcSRobert Mustacchi 	cmd->seid[2] = 0;
33229d26e4fcSRobert Mustacchi 
33239d26e4fcSRobert Mustacchi 	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
33249d26e4fcSRobert Mustacchi 	if (buf_size > I40E_AQ_LARGE_BUF)
33259d26e4fcSRobert Mustacchi 		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
33269d26e4fcSRobert Mustacchi 
33279d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, v_list, buf_size,
33289d26e4fcSRobert Mustacchi 				       cmd_details);
33299d26e4fcSRobert Mustacchi 
33309d26e4fcSRobert Mustacchi 	return status;
33319d26e4fcSRobert Mustacchi }
33329d26e4fcSRobert Mustacchi 
33339d26e4fcSRobert Mustacchi /**
33349d26e4fcSRobert Mustacchi  * i40e_aq_remove_vlan - Remove VLANs from the HW filtering
33359d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
33369d26e4fcSRobert Mustacchi  * @seid: VSI for the vlan filters
33379d26e4fcSRobert Mustacchi  * @v_list: list of macvlans to be removed
33389d26e4fcSRobert Mustacchi  * @count: length of the list
33399d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
33409d26e4fcSRobert Mustacchi  **/
i40e_aq_remove_vlan(struct i40e_hw * hw,u16 seid,struct i40e_aqc_add_remove_vlan_element_data * v_list,u8 count,struct i40e_asq_cmd_details * cmd_details)33419d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_remove_vlan(struct i40e_hw *hw, u16 seid,
33429d26e4fcSRobert Mustacchi 			struct i40e_aqc_add_remove_vlan_element_data *v_list,
33439d26e4fcSRobert Mustacchi 			u8 count, struct i40e_asq_cmd_details *cmd_details)
33449d26e4fcSRobert Mustacchi {
33459d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
33469d26e4fcSRobert Mustacchi 	struct i40e_aqc_macvlan *cmd =
33479d26e4fcSRobert Mustacchi 		(struct i40e_aqc_macvlan *)&desc.params.raw;
33489d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
33499d26e4fcSRobert Mustacchi 	u16 buf_size;
33509d26e4fcSRobert Mustacchi 
33519d26e4fcSRobert Mustacchi 	if (count == 0 || !v_list || !hw)
33529d26e4fcSRobert Mustacchi 		return I40E_ERR_PARAM;
33539d26e4fcSRobert Mustacchi 
33549d26e4fcSRobert Mustacchi 	buf_size = count * sizeof(*v_list);
33559d26e4fcSRobert Mustacchi 
33569d26e4fcSRobert Mustacchi 	/* prep the rest of the request */
33579d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_remove_vlan);
33589d26e4fcSRobert Mustacchi 	cmd->num_addresses = CPU_TO_LE16(count);
33599d26e4fcSRobert Mustacchi 	cmd->seid[0] = CPU_TO_LE16(seid | I40E_AQC_MACVLAN_CMD_SEID_VALID);
33609d26e4fcSRobert Mustacchi 	cmd->seid[1] = 0;
33619d26e4fcSRobert Mustacchi 	cmd->seid[2] = 0;
33629d26e4fcSRobert Mustacchi 
33639d26e4fcSRobert Mustacchi 	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
33649d26e4fcSRobert Mustacchi 	if (buf_size > I40E_AQ_LARGE_BUF)
33659d26e4fcSRobert Mustacchi 		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
33669d26e4fcSRobert Mustacchi 
33679d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, v_list, buf_size,
33689d26e4fcSRobert Mustacchi 				       cmd_details);
33699d26e4fcSRobert Mustacchi 
33709d26e4fcSRobert Mustacchi 	return status;
33719d26e4fcSRobert Mustacchi }
33729d26e4fcSRobert Mustacchi 
33739d26e4fcSRobert Mustacchi /**
33749d26e4fcSRobert Mustacchi  * i40e_aq_send_msg_to_vf
33759d26e4fcSRobert Mustacchi  * @hw: pointer to the hardware structure
33769d26e4fcSRobert Mustacchi  * @vfid: vf id to send msg
33779d26e4fcSRobert Mustacchi  * @v_opcode: opcodes for VF-PF communication
33789d26e4fcSRobert Mustacchi  * @v_retval: return error code
33799d26e4fcSRobert Mustacchi  * @msg: pointer to the msg buffer
33809d26e4fcSRobert Mustacchi  * @msglen: msg length
33819d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details
33829d26e4fcSRobert Mustacchi  *
33839d26e4fcSRobert Mustacchi  * send msg to vf
33849d26e4fcSRobert Mustacchi  **/
i40e_aq_send_msg_to_vf(struct i40e_hw * hw,u16 vfid,u32 v_opcode,u32 v_retval,u8 * msg,u16 msglen,struct i40e_asq_cmd_details * cmd_details)33859d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_send_msg_to_vf(struct i40e_hw *hw, u16 vfid,
33869d26e4fcSRobert Mustacchi 				u32 v_opcode, u32 v_retval, u8 *msg, u16 msglen,
33879d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
33889d26e4fcSRobert Mustacchi {
33899d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
33909d26e4fcSRobert Mustacchi 	struct i40e_aqc_pf_vf_message *cmd =
33919d26e4fcSRobert Mustacchi 		(struct i40e_aqc_pf_vf_message *)&desc.params.raw;
33929d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
33939d26e4fcSRobert Mustacchi 
33949d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_send_msg_to_vf);
33959d26e4fcSRobert Mustacchi 	cmd->id = CPU_TO_LE32(vfid);
33969d26e4fcSRobert Mustacchi 	desc.cookie_high = CPU_TO_LE32(v_opcode);
33979d26e4fcSRobert Mustacchi 	desc.cookie_low = CPU_TO_LE32(v_retval);
33989d26e4fcSRobert Mustacchi 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_SI);
33999d26e4fcSRobert Mustacchi 	if (msglen) {
34009d26e4fcSRobert Mustacchi 		desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF |
34019d26e4fcSRobert Mustacchi 						I40E_AQ_FLAG_RD));
34029d26e4fcSRobert Mustacchi 		if (msglen > I40E_AQ_LARGE_BUF)
34039d26e4fcSRobert Mustacchi 			desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
34049d26e4fcSRobert Mustacchi 		desc.datalen = CPU_TO_LE16(msglen);
34059d26e4fcSRobert Mustacchi 	}
34069d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, msg, msglen, cmd_details);
34079d26e4fcSRobert Mustacchi 
34089d26e4fcSRobert Mustacchi 	return status;
34099d26e4fcSRobert Mustacchi }
34109d26e4fcSRobert Mustacchi 
34119d26e4fcSRobert Mustacchi /**
34129d26e4fcSRobert Mustacchi  * i40e_aq_debug_read_register
34139d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
34149d26e4fcSRobert Mustacchi  * @reg_addr: register address
34159d26e4fcSRobert Mustacchi  * @reg_val: register value
34169d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
34179d26e4fcSRobert Mustacchi  *
34189d26e4fcSRobert Mustacchi  * Read the register using the admin queue commands
34199d26e4fcSRobert Mustacchi  **/
i40e_aq_debug_read_register(struct i40e_hw * hw,u32 reg_addr,u64 * reg_val,struct i40e_asq_cmd_details * cmd_details)34209d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_debug_read_register(struct i40e_hw *hw,
34219d26e4fcSRobert Mustacchi 				u32 reg_addr, u64 *reg_val,
34229d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
34239d26e4fcSRobert Mustacchi {
34249d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
34259d26e4fcSRobert Mustacchi 	struct i40e_aqc_debug_reg_read_write *cmd_resp =
34269d26e4fcSRobert Mustacchi 		(struct i40e_aqc_debug_reg_read_write *)&desc.params.raw;
34279d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
34289d26e4fcSRobert Mustacchi 
34299d26e4fcSRobert Mustacchi 	if (reg_val == NULL)
34309d26e4fcSRobert Mustacchi 		return I40E_ERR_PARAM;
34319d26e4fcSRobert Mustacchi 
34329d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_debug_read_reg);
34339d26e4fcSRobert Mustacchi 
34349d26e4fcSRobert Mustacchi 	cmd_resp->address = CPU_TO_LE32(reg_addr);
34359d26e4fcSRobert Mustacchi 
34369d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
34379d26e4fcSRobert Mustacchi 
34389d26e4fcSRobert Mustacchi 	if (status == I40E_SUCCESS) {
34399d26e4fcSRobert Mustacchi 		*reg_val = ((u64)LE32_TO_CPU(cmd_resp->value_high) << 32) |
34409d26e4fcSRobert Mustacchi 			   (u64)LE32_TO_CPU(cmd_resp->value_low);
34419d26e4fcSRobert Mustacchi 	}
34429d26e4fcSRobert Mustacchi 
34439d26e4fcSRobert Mustacchi 	return status;
34449d26e4fcSRobert Mustacchi }
34459d26e4fcSRobert Mustacchi 
34469d26e4fcSRobert Mustacchi /**
34479d26e4fcSRobert Mustacchi  * i40e_aq_debug_write_register
34489d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
34499d26e4fcSRobert Mustacchi  * @reg_addr: register address
34509d26e4fcSRobert Mustacchi  * @reg_val: register value
34519d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
34529d26e4fcSRobert Mustacchi  *
34539d26e4fcSRobert Mustacchi  * Write to a register using the admin queue commands
34549d26e4fcSRobert Mustacchi  **/
i40e_aq_debug_write_register(struct i40e_hw * hw,u32 reg_addr,u64 reg_val,struct i40e_asq_cmd_details * cmd_details)34559d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_debug_write_register(struct i40e_hw *hw,
34569d26e4fcSRobert Mustacchi 				u32 reg_addr, u64 reg_val,
34579d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
34589d26e4fcSRobert Mustacchi {
34599d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
34609d26e4fcSRobert Mustacchi 	struct i40e_aqc_debug_reg_read_write *cmd =
34619d26e4fcSRobert Mustacchi 		(struct i40e_aqc_debug_reg_read_write *)&desc.params.raw;
34629d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
34639d26e4fcSRobert Mustacchi 
34649d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_debug_write_reg);
34659d26e4fcSRobert Mustacchi 
34669d26e4fcSRobert Mustacchi 	cmd->address = CPU_TO_LE32(reg_addr);
34679d26e4fcSRobert Mustacchi 	cmd->value_high = CPU_TO_LE32((u32)(reg_val >> 32));
34689d26e4fcSRobert Mustacchi 	cmd->value_low = CPU_TO_LE32((u32)(reg_val & 0xFFFFFFFF));
34699d26e4fcSRobert Mustacchi 
34709d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
34719d26e4fcSRobert Mustacchi 
34729d26e4fcSRobert Mustacchi 	return status;
34739d26e4fcSRobert Mustacchi }
34749d26e4fcSRobert Mustacchi 
34759d26e4fcSRobert Mustacchi /**
34769d26e4fcSRobert Mustacchi  * i40e_aq_request_resource
34779d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
34789d26e4fcSRobert Mustacchi  * @resource: resource id
34799d26e4fcSRobert Mustacchi  * @access: access type
34809d26e4fcSRobert Mustacchi  * @sdp_number: resource number
34819d26e4fcSRobert Mustacchi  * @timeout: the maximum time in ms that the driver may hold the resource
34829d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
34839d26e4fcSRobert Mustacchi  *
34849d26e4fcSRobert Mustacchi  * requests common resource using the admin queue commands
34859d26e4fcSRobert Mustacchi  **/
i40e_aq_request_resource(struct i40e_hw * hw,enum i40e_aq_resources_ids resource,enum i40e_aq_resource_access_type access,u8 sdp_number,u64 * timeout,struct i40e_asq_cmd_details * cmd_details)34869d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_request_resource(struct i40e_hw *hw,
34879d26e4fcSRobert Mustacchi 				enum i40e_aq_resources_ids resource,
34889d26e4fcSRobert Mustacchi 				enum i40e_aq_resource_access_type access,
34899d26e4fcSRobert Mustacchi 				u8 sdp_number, u64 *timeout,
34909d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
34919d26e4fcSRobert Mustacchi {
34929d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
34939d26e4fcSRobert Mustacchi 	struct i40e_aqc_request_resource *cmd_resp =
34949d26e4fcSRobert Mustacchi 		(struct i40e_aqc_request_resource *)&desc.params.raw;
34959d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
34969d26e4fcSRobert Mustacchi 
34979d26e4fcSRobert Mustacchi 	DEBUGFUNC("i40e_aq_request_resource");
34989d26e4fcSRobert Mustacchi 
34999d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_request_resource);
35009d26e4fcSRobert Mustacchi 
35019d26e4fcSRobert Mustacchi 	cmd_resp->resource_id = CPU_TO_LE16(resource);
35029d26e4fcSRobert Mustacchi 	cmd_resp->access_type = CPU_TO_LE16(access);
35039d26e4fcSRobert Mustacchi 	cmd_resp->resource_number = CPU_TO_LE32(sdp_number);
35049d26e4fcSRobert Mustacchi 
35059d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
35069d26e4fcSRobert Mustacchi 	/* The completion specifies the maximum time in ms that the driver
35079d26e4fcSRobert Mustacchi 	 * may hold the resource in the Timeout field.
35089d26e4fcSRobert Mustacchi 	 * If the resource is held by someone else, the command completes with
35099d26e4fcSRobert Mustacchi 	 * busy return value and the timeout field indicates the maximum time
35109d26e4fcSRobert Mustacchi 	 * the current owner of the resource has to free it.
35119d26e4fcSRobert Mustacchi 	 */
35129d26e4fcSRobert Mustacchi 	if (status == I40E_SUCCESS || hw->aq.asq_last_status == I40E_AQ_RC_EBUSY)
35139d26e4fcSRobert Mustacchi 		*timeout = LE32_TO_CPU(cmd_resp->timeout);
35149d26e4fcSRobert Mustacchi 
35159d26e4fcSRobert Mustacchi 	return status;
35169d26e4fcSRobert Mustacchi }
35179d26e4fcSRobert Mustacchi 
35189d26e4fcSRobert Mustacchi /**
35199d26e4fcSRobert Mustacchi  * i40e_aq_release_resource
35209d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
35219d26e4fcSRobert Mustacchi  * @resource: resource id
35229d26e4fcSRobert Mustacchi  * @sdp_number: resource number
35239d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
35249d26e4fcSRobert Mustacchi  *
35259d26e4fcSRobert Mustacchi  * release common resource using the admin queue commands
35269d26e4fcSRobert Mustacchi  **/
i40e_aq_release_resource(struct i40e_hw * hw,enum i40e_aq_resources_ids resource,u8 sdp_number,struct i40e_asq_cmd_details * cmd_details)35279d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_release_resource(struct i40e_hw *hw,
35289d26e4fcSRobert Mustacchi 				enum i40e_aq_resources_ids resource,
35299d26e4fcSRobert Mustacchi 				u8 sdp_number,
35309d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
35319d26e4fcSRobert Mustacchi {
35329d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
35339d26e4fcSRobert Mustacchi 	struct i40e_aqc_request_resource *cmd =
35349d26e4fcSRobert Mustacchi 		(struct i40e_aqc_request_resource *)&desc.params.raw;
35359d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
35369d26e4fcSRobert Mustacchi 
35379d26e4fcSRobert Mustacchi 	DEBUGFUNC("i40e_aq_release_resource");
35389d26e4fcSRobert Mustacchi 
35399d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_release_resource);
35409d26e4fcSRobert Mustacchi 
35419d26e4fcSRobert Mustacchi 	cmd->resource_id = CPU_TO_LE16(resource);
35429d26e4fcSRobert Mustacchi 	cmd->resource_number = CPU_TO_LE32(sdp_number);
35439d26e4fcSRobert Mustacchi 
35449d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
35459d26e4fcSRobert Mustacchi 
35469d26e4fcSRobert Mustacchi 	return status;
35479d26e4fcSRobert Mustacchi }
35489d26e4fcSRobert Mustacchi 
35499d26e4fcSRobert Mustacchi /**
35509d26e4fcSRobert Mustacchi  * i40e_aq_read_nvm
35519d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
35529d26e4fcSRobert Mustacchi  * @module_pointer: module pointer location in words from the NVM beginning
35539d26e4fcSRobert Mustacchi  * @offset: byte offset from the module beginning
35549d26e4fcSRobert Mustacchi  * @length: length of the section to be read (in bytes from the offset)
35559d26e4fcSRobert Mustacchi  * @data: command buffer (size [bytes] = length)
35569d26e4fcSRobert Mustacchi  * @last_command: tells if this is the last command in a series
35579d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
35589d26e4fcSRobert Mustacchi  *
35599d26e4fcSRobert Mustacchi  * Read the NVM using the admin queue commands
35609d26e4fcSRobert Mustacchi  **/
i40e_aq_read_nvm(struct i40e_hw * hw,u8 module_pointer,u32 offset,u16 length,void * data,bool last_command,struct i40e_asq_cmd_details * cmd_details)35619d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_read_nvm(struct i40e_hw *hw, u8 module_pointer,
35629d26e4fcSRobert Mustacchi 				u32 offset, u16 length, void *data,
35639d26e4fcSRobert Mustacchi 				bool last_command,
35649d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
35659d26e4fcSRobert Mustacchi {
35669d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
35679d26e4fcSRobert Mustacchi 	struct i40e_aqc_nvm_update *cmd =
35689d26e4fcSRobert Mustacchi 		(struct i40e_aqc_nvm_update *)&desc.params.raw;
35699d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
35709d26e4fcSRobert Mustacchi 
35719d26e4fcSRobert Mustacchi 	DEBUGFUNC("i40e_aq_read_nvm");
35729d26e4fcSRobert Mustacchi 
35739d26e4fcSRobert Mustacchi 	/* In offset the highest byte must be zeroed. */
35749d26e4fcSRobert Mustacchi 	if (offset & 0xFF000000) {
35759d26e4fcSRobert Mustacchi 		status = I40E_ERR_PARAM;
35769d26e4fcSRobert Mustacchi 		goto i40e_aq_read_nvm_exit;
35779d26e4fcSRobert Mustacchi 	}
35789d26e4fcSRobert Mustacchi 
35799d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_read);
35809d26e4fcSRobert Mustacchi 
35819d26e4fcSRobert Mustacchi 	/* If this is the last command in a series, set the proper flag. */
35829d26e4fcSRobert Mustacchi 	if (last_command)
35839d26e4fcSRobert Mustacchi 		cmd->command_flags |= I40E_AQ_NVM_LAST_CMD;
35849d26e4fcSRobert Mustacchi 	cmd->module_pointer = module_pointer;
35859d26e4fcSRobert Mustacchi 	cmd->offset = CPU_TO_LE32(offset);
35869d26e4fcSRobert Mustacchi 	cmd->length = CPU_TO_LE16(length);
35879d26e4fcSRobert Mustacchi 
35889d26e4fcSRobert Mustacchi 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
35899d26e4fcSRobert Mustacchi 	if (length > I40E_AQ_LARGE_BUF)
35909d26e4fcSRobert Mustacchi 		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
35919d26e4fcSRobert Mustacchi 
35929d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, data, length, cmd_details);
35939d26e4fcSRobert Mustacchi 
35949d26e4fcSRobert Mustacchi i40e_aq_read_nvm_exit:
35959d26e4fcSRobert Mustacchi 	return status;
35969d26e4fcSRobert Mustacchi }
35979d26e4fcSRobert Mustacchi 
35989d26e4fcSRobert Mustacchi /**
35999d26e4fcSRobert Mustacchi  * i40e_aq_read_nvm_config - read an nvm config block
36009d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
36019d26e4fcSRobert Mustacchi  * @cmd_flags: NVM access admin command bits
36029d26e4fcSRobert Mustacchi  * @field_id: field or feature id
36039d26e4fcSRobert Mustacchi  * @data: buffer for result
36049d26e4fcSRobert Mustacchi  * @buf_size: buffer size
36059d26e4fcSRobert Mustacchi  * @element_count: pointer to count of elements read by FW
36069d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
36079d26e4fcSRobert Mustacchi  **/
i40e_aq_read_nvm_config(struct i40e_hw * hw,u8 cmd_flags,u32 field_id,void * data,u16 buf_size,u16 * element_count,struct i40e_asq_cmd_details * cmd_details)36089d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_read_nvm_config(struct i40e_hw *hw,
36099d26e4fcSRobert Mustacchi 				u8 cmd_flags, u32 field_id, void *data,
36109d26e4fcSRobert Mustacchi 				u16 buf_size, u16 *element_count,
36119d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
36129d26e4fcSRobert Mustacchi {
36139d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
36149d26e4fcSRobert Mustacchi 	struct i40e_aqc_nvm_config_read *cmd =
36159d26e4fcSRobert Mustacchi 		(struct i40e_aqc_nvm_config_read *)&desc.params.raw;
36169d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
36179d26e4fcSRobert Mustacchi 
36189d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_config_read);
36199d26e4fcSRobert Mustacchi 	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF));
36209d26e4fcSRobert Mustacchi 	if (buf_size > I40E_AQ_LARGE_BUF)
36219d26e4fcSRobert Mustacchi 		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
36229d26e4fcSRobert Mustacchi 
36239d26e4fcSRobert Mustacchi 	cmd->cmd_flags = CPU_TO_LE16(cmd_flags);
36249d26e4fcSRobert Mustacchi 	cmd->element_id = CPU_TO_LE16((u16)(0xffff & field_id));
36259d26e4fcSRobert Mustacchi 	if (cmd_flags & I40E_AQ_ANVM_FEATURE_OR_IMMEDIATE_MASK)
36269d26e4fcSRobert Mustacchi 		cmd->element_id_msw = CPU_TO_LE16((u16)(field_id >> 16));
36279d26e4fcSRobert Mustacchi 	else
36289d26e4fcSRobert Mustacchi 		cmd->element_id_msw = 0;
36299d26e4fcSRobert Mustacchi 
36309d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, data, buf_size, cmd_details);
36319d26e4fcSRobert Mustacchi 
36329d26e4fcSRobert Mustacchi 	if (!status && element_count)
36339d26e4fcSRobert Mustacchi 		*element_count = LE16_TO_CPU(cmd->element_count);
36349d26e4fcSRobert Mustacchi 
36359d26e4fcSRobert Mustacchi 	return status;
36369d26e4fcSRobert Mustacchi }
36379d26e4fcSRobert Mustacchi 
36389d26e4fcSRobert Mustacchi /**
36399d26e4fcSRobert Mustacchi  * i40e_aq_write_nvm_config - write an nvm config block
36409d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
36419d26e4fcSRobert Mustacchi  * @cmd_flags: NVM access admin command bits
36429d26e4fcSRobert Mustacchi  * @data: buffer for result
36439d26e4fcSRobert Mustacchi  * @buf_size: buffer size
36449d26e4fcSRobert Mustacchi  * @element_count: count of elements to be written
36459d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
36469d26e4fcSRobert Mustacchi  **/
i40e_aq_write_nvm_config(struct i40e_hw * hw,u8 cmd_flags,void * data,u16 buf_size,u16 element_count,struct i40e_asq_cmd_details * cmd_details)36479d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_write_nvm_config(struct i40e_hw *hw,
36489d26e4fcSRobert Mustacchi 				u8 cmd_flags, void *data, u16 buf_size,
36499d26e4fcSRobert Mustacchi 				u16 element_count,
36509d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
36519d26e4fcSRobert Mustacchi {
36529d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
36539d26e4fcSRobert Mustacchi 	struct i40e_aqc_nvm_config_write *cmd =
36549d26e4fcSRobert Mustacchi 		(struct i40e_aqc_nvm_config_write *)&desc.params.raw;
36559d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
36569d26e4fcSRobert Mustacchi 
36579d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_config_write);
36589d26e4fcSRobert Mustacchi 	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
36599d26e4fcSRobert Mustacchi 	if (buf_size > I40E_AQ_LARGE_BUF)
36609d26e4fcSRobert Mustacchi 		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
36619d26e4fcSRobert Mustacchi 
36629d26e4fcSRobert Mustacchi 	cmd->element_count = CPU_TO_LE16(element_count);
36639d26e4fcSRobert Mustacchi 	cmd->cmd_flags = CPU_TO_LE16(cmd_flags);
36649d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, data, buf_size, cmd_details);
36659d26e4fcSRobert Mustacchi 
36669d26e4fcSRobert Mustacchi 	return status;
36679d26e4fcSRobert Mustacchi }
36689d26e4fcSRobert Mustacchi 
36699d26e4fcSRobert Mustacchi /**
36709d26e4fcSRobert Mustacchi  * i40e_aq_oem_post_update - triggers an OEM specific flow after update
36719d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
367293f1cac5SPaul Winder  * @buff: buffer for result
367393f1cac5SPaul Winder  * @buff_size: buffer size
36749d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
36759d26e4fcSRobert Mustacchi  **/
i40e_aq_oem_post_update(struct i40e_hw * hw,void * buff,u16 buff_size,struct i40e_asq_cmd_details * cmd_details)36769d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_oem_post_update(struct i40e_hw *hw,
36779d26e4fcSRobert Mustacchi 				void *buff, u16 buff_size,
36789d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
36799d26e4fcSRobert Mustacchi {
36809d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
36819d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
36829d26e4fcSRobert Mustacchi 
36839d26e4fcSRobert Mustacchi 
36849d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_oem_post_update);
36859d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
36869d26e4fcSRobert Mustacchi 	if (status && LE16_TO_CPU(desc.retval) == I40E_AQ_RC_ESRCH)
36879d26e4fcSRobert Mustacchi 		status = I40E_ERR_NOT_IMPLEMENTED;
36889d26e4fcSRobert Mustacchi 
36899d26e4fcSRobert Mustacchi 	return status;
36909d26e4fcSRobert Mustacchi }
36919d26e4fcSRobert Mustacchi 
36929d26e4fcSRobert Mustacchi /**
36939d26e4fcSRobert Mustacchi  * i40e_aq_erase_nvm
36949d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
36959d26e4fcSRobert Mustacchi  * @module_pointer: module pointer location in words from the NVM beginning
36969d26e4fcSRobert Mustacchi  * @offset: offset in the module (expressed in 4 KB from module's beginning)
36979d26e4fcSRobert Mustacchi  * @length: length of the section to be erased (expressed in 4 KB)
36989d26e4fcSRobert Mustacchi  * @last_command: tells if this is the last command in a series
36999d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
37009d26e4fcSRobert Mustacchi  *
37019d26e4fcSRobert Mustacchi  * Erase the NVM sector using the admin queue commands
37029d26e4fcSRobert Mustacchi  **/
i40e_aq_erase_nvm(struct i40e_hw * hw,u8 module_pointer,u32 offset,u16 length,bool last_command,struct i40e_asq_cmd_details * cmd_details)37039d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_erase_nvm(struct i40e_hw *hw, u8 module_pointer,
37049d26e4fcSRobert Mustacchi 				u32 offset, u16 length, bool last_command,
37059d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
37069d26e4fcSRobert Mustacchi {
37079d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
37089d26e4fcSRobert Mustacchi 	struct i40e_aqc_nvm_update *cmd =
37099d26e4fcSRobert Mustacchi 		(struct i40e_aqc_nvm_update *)&desc.params.raw;
37109d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
37119d26e4fcSRobert Mustacchi 
37129d26e4fcSRobert Mustacchi 	DEBUGFUNC("i40e_aq_erase_nvm");
37139d26e4fcSRobert Mustacchi 
37149d26e4fcSRobert Mustacchi 	/* In offset the highest byte must be zeroed. */
37159d26e4fcSRobert Mustacchi 	if (offset & 0xFF000000) {
37169d26e4fcSRobert Mustacchi 		status = I40E_ERR_PARAM;
37179d26e4fcSRobert Mustacchi 		goto i40e_aq_erase_nvm_exit;
37189d26e4fcSRobert Mustacchi 	}
37199d26e4fcSRobert Mustacchi 
37209d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_erase);
37219d26e4fcSRobert Mustacchi 
37229d26e4fcSRobert Mustacchi 	/* If this is the last command in a series, set the proper flag. */
37239d26e4fcSRobert Mustacchi 	if (last_command)
37249d26e4fcSRobert Mustacchi 		cmd->command_flags |= I40E_AQ_NVM_LAST_CMD;
37259d26e4fcSRobert Mustacchi 	cmd->module_pointer = module_pointer;
37269d26e4fcSRobert Mustacchi 	cmd->offset = CPU_TO_LE32(offset);
37279d26e4fcSRobert Mustacchi 	cmd->length = CPU_TO_LE16(length);
37289d26e4fcSRobert Mustacchi 
37299d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
37309d26e4fcSRobert Mustacchi 
37319d26e4fcSRobert Mustacchi i40e_aq_erase_nvm_exit:
37329d26e4fcSRobert Mustacchi 	return status;
37339d26e4fcSRobert Mustacchi }
37349d26e4fcSRobert Mustacchi 
37359d26e4fcSRobert Mustacchi /**
37369d26e4fcSRobert Mustacchi  * i40e_parse_discover_capabilities
37379d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
37389d26e4fcSRobert Mustacchi  * @buff: pointer to a buffer containing device/function capability records
37399d26e4fcSRobert Mustacchi  * @cap_count: number of capability records in the list
37409d26e4fcSRobert Mustacchi  * @list_type_opc: type of capabilities list to parse
37419d26e4fcSRobert Mustacchi  *
37429d26e4fcSRobert Mustacchi  * Parse the device/function capabilities list.
37439d26e4fcSRobert Mustacchi  **/
i40e_parse_discover_capabilities(struct i40e_hw * hw,void * buff,u32 cap_count,enum i40e_admin_queue_opc list_type_opc)37449d26e4fcSRobert Mustacchi static void i40e_parse_discover_capabilities(struct i40e_hw *hw, void *buff,
37459d26e4fcSRobert Mustacchi 				     u32 cap_count,
37469d26e4fcSRobert Mustacchi 				     enum i40e_admin_queue_opc list_type_opc)
37479d26e4fcSRobert Mustacchi {
37489d26e4fcSRobert Mustacchi 	struct i40e_aqc_list_capabilities_element_resp *cap;
37499d26e4fcSRobert Mustacchi 	u32 valid_functions, num_functions;
37509d26e4fcSRobert Mustacchi 	u32 number, logical_id, phys_id;
37519d26e4fcSRobert Mustacchi 	struct i40e_hw_capabilities *p;
375293f1cac5SPaul Winder 	enum i40e_status_code status;
375393f1cac5SPaul Winder 	u16 id, ocp_cfg_word0;
37549d26e4fcSRobert Mustacchi 	u8 major_rev;
37559d26e4fcSRobert Mustacchi 	u32 i = 0;
37569d26e4fcSRobert Mustacchi 
37579d26e4fcSRobert Mustacchi 	cap = (struct i40e_aqc_list_capabilities_element_resp *) buff;
37589d26e4fcSRobert Mustacchi 
37599d26e4fcSRobert Mustacchi 	if (list_type_opc == i40e_aqc_opc_list_dev_capabilities)
37609d26e4fcSRobert Mustacchi 		p = (struct i40e_hw_capabilities *)&hw->dev_caps;
37619d26e4fcSRobert Mustacchi 	else if (list_type_opc == i40e_aqc_opc_list_func_capabilities)
37629d26e4fcSRobert Mustacchi 		p = (struct i40e_hw_capabilities *)&hw->func_caps;
37639d26e4fcSRobert Mustacchi 	else
37649d26e4fcSRobert Mustacchi 		return;
37659d26e4fcSRobert Mustacchi 
37669d26e4fcSRobert Mustacchi 	for (i = 0; i < cap_count; i++, cap++) {
37679d26e4fcSRobert Mustacchi 		id = LE16_TO_CPU(cap->id);
37689d26e4fcSRobert Mustacchi 		number = LE32_TO_CPU(cap->number);
37699d26e4fcSRobert Mustacchi 		logical_id = LE32_TO_CPU(cap->logical_id);
37709d26e4fcSRobert Mustacchi 		phys_id = LE32_TO_CPU(cap->phys_id);
37719d26e4fcSRobert Mustacchi 		major_rev = cap->major_rev;
37729d26e4fcSRobert Mustacchi 
37739d26e4fcSRobert Mustacchi 		switch (id) {
37743d75a287SRobert Mustacchi 		case I40E_AQ_CAP_ID_SWITCH_MODE:
37759d26e4fcSRobert Mustacchi 			p->switch_mode = number;
37763d75a287SRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_INIT,
37773d75a287SRobert Mustacchi 				   "HW Capability: Switch mode = %d\n",
37783d75a287SRobert Mustacchi 				   p->switch_mode);
37799d26e4fcSRobert Mustacchi 			break;
37803d75a287SRobert Mustacchi 		case I40E_AQ_CAP_ID_MNG_MODE:
37819d26e4fcSRobert Mustacchi 			p->management_mode = number;
37823d75a287SRobert Mustacchi 			if (major_rev > 1) {
37833d75a287SRobert Mustacchi 				p->mng_protocols_over_mctp = logical_id;
37843d75a287SRobert Mustacchi 				i40e_debug(hw, I40E_DEBUG_INIT,
37853d75a287SRobert Mustacchi 					   "HW Capability: Protocols over MCTP = %d\n",
37863d75a287SRobert Mustacchi 					   p->mng_protocols_over_mctp);
37873d75a287SRobert Mustacchi 			} else {
37883d75a287SRobert Mustacchi 				p->mng_protocols_over_mctp = 0;
37893d75a287SRobert Mustacchi 			}
37903d75a287SRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_INIT,
37913d75a287SRobert Mustacchi 				   "HW Capability: Management Mode = %d\n",
37923d75a287SRobert Mustacchi 				   p->management_mode);
37939d26e4fcSRobert Mustacchi 			break;
37943d75a287SRobert Mustacchi 		case I40E_AQ_CAP_ID_NPAR_ACTIVE:
37959d26e4fcSRobert Mustacchi 			p->npar_enable = number;
37963d75a287SRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_INIT,
37973d75a287SRobert Mustacchi 				   "HW Capability: NPAR enable = %d\n",
37983d75a287SRobert Mustacchi 				   p->npar_enable);
37999d26e4fcSRobert Mustacchi 			break;
38003d75a287SRobert Mustacchi 		case I40E_AQ_CAP_ID_OS2BMC_CAP:
38019d26e4fcSRobert Mustacchi 			p->os2bmc = number;
38023d75a287SRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_INIT,
38033d75a287SRobert Mustacchi 				   "HW Capability: OS2BMC = %d\n", p->os2bmc);
38049d26e4fcSRobert Mustacchi 			break;
38053d75a287SRobert Mustacchi 		case I40E_AQ_CAP_ID_FUNCTIONS_VALID:
38069d26e4fcSRobert Mustacchi 			p->valid_functions = number;
38073d75a287SRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_INIT,
38083d75a287SRobert Mustacchi 				   "HW Capability: Valid Functions = %d\n",
38093d75a287SRobert Mustacchi 				   p->valid_functions);
38109d26e4fcSRobert Mustacchi 			break;
38113d75a287SRobert Mustacchi 		case I40E_AQ_CAP_ID_SRIOV:
38129d26e4fcSRobert Mustacchi 			if (number == 1)
38139d26e4fcSRobert Mustacchi 				p->sr_iov_1_1 = TRUE;
38143d75a287SRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_INIT,
38153d75a287SRobert Mustacchi 				   "HW Capability: SR-IOV = %d\n",
38163d75a287SRobert Mustacchi 				   p->sr_iov_1_1);
38179d26e4fcSRobert Mustacchi 			break;
38183d75a287SRobert Mustacchi 		case I40E_AQ_CAP_ID_VF:
38199d26e4fcSRobert Mustacchi 			p->num_vfs = number;
38209d26e4fcSRobert Mustacchi 			p->vf_base_id = logical_id;
38213d75a287SRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_INIT,
38223d75a287SRobert Mustacchi 				   "HW Capability: VF count = %d\n",
38233d75a287SRobert Mustacchi 				   p->num_vfs);
38243d75a287SRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_INIT,
38253d75a287SRobert Mustacchi 				   "HW Capability: VF base_id = %d\n",
38263d75a287SRobert Mustacchi 				   p->vf_base_id);
38279d26e4fcSRobert Mustacchi 			break;
38283d75a287SRobert Mustacchi 		case I40E_AQ_CAP_ID_VMDQ:
38299d26e4fcSRobert Mustacchi 			if (number == 1)
38309d26e4fcSRobert Mustacchi 				p->vmdq = TRUE;
38313d75a287SRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_INIT,
38323d75a287SRobert Mustacchi 				   "HW Capability: VMDQ = %d\n", p->vmdq);
38339d26e4fcSRobert Mustacchi 			break;
38343d75a287SRobert Mustacchi 		case I40E_AQ_CAP_ID_8021QBG:
38359d26e4fcSRobert Mustacchi 			if (number == 1)
38369d26e4fcSRobert Mustacchi 				p->evb_802_1_qbg = TRUE;
38373d75a287SRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_INIT,
38383d75a287SRobert Mustacchi 				   "HW Capability: 802.1Qbg = %d\n", number);
38399d26e4fcSRobert Mustacchi 			break;
38403d75a287SRobert Mustacchi 		case I40E_AQ_CAP_ID_8021QBR:
38419d26e4fcSRobert Mustacchi 			if (number == 1)
38429d26e4fcSRobert Mustacchi 				p->evb_802_1_qbh = TRUE;
38433d75a287SRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_INIT,
38443d75a287SRobert Mustacchi 				   "HW Capability: 802.1Qbh = %d\n", number);
38459d26e4fcSRobert Mustacchi 			break;
38463d75a287SRobert Mustacchi 		case I40E_AQ_CAP_ID_VSI:
38479d26e4fcSRobert Mustacchi 			p->num_vsis = number;
38483d75a287SRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_INIT,
38493d75a287SRobert Mustacchi 				   "HW Capability: VSI count = %d\n",
38503d75a287SRobert Mustacchi 				   p->num_vsis);
38519d26e4fcSRobert Mustacchi 			break;
38523d75a287SRobert Mustacchi 		case I40E_AQ_CAP_ID_DCB:
38539d26e4fcSRobert Mustacchi 			if (number == 1) {
38549d26e4fcSRobert Mustacchi 				p->dcb = TRUE;
38559d26e4fcSRobert Mustacchi 				p->enabled_tcmap = logical_id;
38569d26e4fcSRobert Mustacchi 				p->maxtc = phys_id;
38579d26e4fcSRobert Mustacchi 			}
38583d75a287SRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_INIT,
38593d75a287SRobert Mustacchi 				   "HW Capability: DCB = %d\n", p->dcb);
38603d75a287SRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_INIT,
38613d75a287SRobert Mustacchi 				   "HW Capability: TC Mapping = %d\n",
38623d75a287SRobert Mustacchi 				   logical_id);
38633d75a287SRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_INIT,
38643d75a287SRobert Mustacchi 				   "HW Capability: TC Max = %d\n", p->maxtc);
38659d26e4fcSRobert Mustacchi 			break;
38663d75a287SRobert Mustacchi 		case I40E_AQ_CAP_ID_FCOE:
38679d26e4fcSRobert Mustacchi 			if (number == 1)
38689d26e4fcSRobert Mustacchi 				p->fcoe = TRUE;
38693d75a287SRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_INIT,
38703d75a287SRobert Mustacchi 				   "HW Capability: FCOE = %d\n", p->fcoe);
38719d26e4fcSRobert Mustacchi 			break;
38723d75a287SRobert Mustacchi 		case I40E_AQ_CAP_ID_ISCSI:
38739d26e4fcSRobert Mustacchi 			if (number == 1)
38749d26e4fcSRobert Mustacchi 				p->iscsi = TRUE;
38753d75a287SRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_INIT,
38763d75a287SRobert Mustacchi 				   "HW Capability: iSCSI = %d\n", p->iscsi);
38779d26e4fcSRobert Mustacchi 			break;
38783d75a287SRobert Mustacchi 		case I40E_AQ_CAP_ID_RSS:
38799d26e4fcSRobert Mustacchi 			p->rss = TRUE;
38809d26e4fcSRobert Mustacchi 			p->rss_table_size = number;
38819d26e4fcSRobert Mustacchi 			p->rss_table_entry_width = logical_id;
38823d75a287SRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_INIT,
38833d75a287SRobert Mustacchi 				   "HW Capability: RSS = %d\n", p->rss);
38843d75a287SRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_INIT,
38853d75a287SRobert Mustacchi 				   "HW Capability: RSS table size = %d\n",
38863d75a287SRobert Mustacchi 				   p->rss_table_size);
38873d75a287SRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_INIT,
38883d75a287SRobert Mustacchi 				   "HW Capability: RSS table width = %d\n",
38893d75a287SRobert Mustacchi 				   p->rss_table_entry_width);
38909d26e4fcSRobert Mustacchi 			break;
38913d75a287SRobert Mustacchi 		case I40E_AQ_CAP_ID_RXQ:
38929d26e4fcSRobert Mustacchi 			p->num_rx_qp = number;
38939d26e4fcSRobert Mustacchi 			p->base_queue = phys_id;
38943d75a287SRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_INIT,
38953d75a287SRobert Mustacchi 				   "HW Capability: Rx QP = %d\n", number);
38963d75a287SRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_INIT,
38973d75a287SRobert Mustacchi 				   "HW Capability: base_queue = %d\n",
38983d75a287SRobert Mustacchi 				   p->base_queue);
38999d26e4fcSRobert Mustacchi 			break;
39003d75a287SRobert Mustacchi 		case I40E_AQ_CAP_ID_TXQ:
39019d26e4fcSRobert Mustacchi 			p->num_tx_qp = number;
39029d26e4fcSRobert Mustacchi 			p->base_queue = phys_id;
39033d75a287SRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_INIT,
39043d75a287SRobert Mustacchi 				   "HW Capability: Tx QP = %d\n", number);
39053d75a287SRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_INIT,
39063d75a287SRobert Mustacchi 				   "HW Capability: base_queue = %d\n",
39073d75a287SRobert Mustacchi 				   p->base_queue);
39089d26e4fcSRobert Mustacchi 			break;
39093d75a287SRobert Mustacchi 		case I40E_AQ_CAP_ID_MSIX:
39109d26e4fcSRobert Mustacchi 			p->num_msix_vectors = number;
39113d75a287SRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_INIT,
39123d75a287SRobert Mustacchi 				   "HW Capability: MSIX vector count = %d\n",
39133d75a287SRobert Mustacchi 				   p->num_msix_vectors);
39149d26e4fcSRobert Mustacchi 			break;
39153d75a287SRobert Mustacchi 		case I40E_AQ_CAP_ID_VF_MSIX:
39169d26e4fcSRobert Mustacchi 			p->num_msix_vectors_vf = number;
39173d75a287SRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_INIT,
39183d75a287SRobert Mustacchi 				   "HW Capability: MSIX VF vector count = %d\n",
39193d75a287SRobert Mustacchi 				   p->num_msix_vectors_vf);
39209d26e4fcSRobert Mustacchi 			break;
39213d75a287SRobert Mustacchi 		case I40E_AQ_CAP_ID_FLEX10:
39229d26e4fcSRobert Mustacchi 			if (major_rev == 1) {
39239d26e4fcSRobert Mustacchi 				if (number == 1) {
39249d26e4fcSRobert Mustacchi 					p->flex10_enable = TRUE;
39259d26e4fcSRobert Mustacchi 					p->flex10_capable = TRUE;
39269d26e4fcSRobert Mustacchi 				}
39279d26e4fcSRobert Mustacchi 			} else {
39289d26e4fcSRobert Mustacchi 				/* Capability revision >= 2 */
39299d26e4fcSRobert Mustacchi 				if (number & 1)
39309d26e4fcSRobert Mustacchi 					p->flex10_enable = TRUE;
39319d26e4fcSRobert Mustacchi 				if (number & 2)
39329d26e4fcSRobert Mustacchi 					p->flex10_capable = TRUE;
39339d26e4fcSRobert Mustacchi 			}
39349d26e4fcSRobert Mustacchi 			p->flex10_mode = logical_id;
39359d26e4fcSRobert Mustacchi 			p->flex10_status = phys_id;
39363d75a287SRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_INIT,
39373d75a287SRobert Mustacchi 				   "HW Capability: Flex10 mode = %d\n",
39383d75a287SRobert Mustacchi 				   p->flex10_mode);
39393d75a287SRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_INIT,
39403d75a287SRobert Mustacchi 				   "HW Capability: Flex10 status = %d\n",
39413d75a287SRobert Mustacchi 				   p->flex10_status);
39429d26e4fcSRobert Mustacchi 			break;
39433d75a287SRobert Mustacchi 		case I40E_AQ_CAP_ID_CEM:
39449d26e4fcSRobert Mustacchi 			if (number == 1)
39459d26e4fcSRobert Mustacchi 				p->mgmt_cem = TRUE;
39463d75a287SRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_INIT,
39473d75a287SRobert Mustacchi 				   "HW Capability: CEM = %d\n", p->mgmt_cem);
39489d26e4fcSRobert Mustacchi 			break;
39493d75a287SRobert Mustacchi 		case I40E_AQ_CAP_ID_IWARP:
39509d26e4fcSRobert Mustacchi 			if (number == 1)
39519d26e4fcSRobert Mustacchi 				p->iwarp = TRUE;
39523d75a287SRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_INIT,
39533d75a287SRobert Mustacchi 				   "HW Capability: iWARP = %d\n", p->iwarp);
39549d26e4fcSRobert Mustacchi 			break;
39553d75a287SRobert Mustacchi 		case I40E_AQ_CAP_ID_LED:
39569d26e4fcSRobert Mustacchi 			if (phys_id < I40E_HW_CAP_MAX_GPIO)
39579d26e4fcSRobert Mustacchi 				p->led[phys_id] = TRUE;
39583d75a287SRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_INIT,
39593d75a287SRobert Mustacchi 				   "HW Capability: LED - PIN %d\n", phys_id);
39609d26e4fcSRobert Mustacchi 			break;
39613d75a287SRobert Mustacchi 		case I40E_AQ_CAP_ID_SDP:
39629d26e4fcSRobert Mustacchi 			if (phys_id < I40E_HW_CAP_MAX_GPIO)
39639d26e4fcSRobert Mustacchi 				p->sdp[phys_id] = TRUE;
39643d75a287SRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_INIT,
39653d75a287SRobert Mustacchi 				   "HW Capability: SDP - PIN %d\n", phys_id);
39669d26e4fcSRobert Mustacchi 			break;
39673d75a287SRobert Mustacchi 		case I40E_AQ_CAP_ID_MDIO:
39689d26e4fcSRobert Mustacchi 			if (number == 1) {
39699d26e4fcSRobert Mustacchi 				p->mdio_port_num = phys_id;
39709d26e4fcSRobert Mustacchi 				p->mdio_port_mode = logical_id;
39719d26e4fcSRobert Mustacchi 			}
39723d75a287SRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_INIT,
39733d75a287SRobert Mustacchi 				   "HW Capability: MDIO port number = %d\n",
39743d75a287SRobert Mustacchi 				   p->mdio_port_num);
39753d75a287SRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_INIT,
39763d75a287SRobert Mustacchi 				   "HW Capability: MDIO port mode = %d\n",
39773d75a287SRobert Mustacchi 				   p->mdio_port_mode);
39789d26e4fcSRobert Mustacchi 			break;
39793d75a287SRobert Mustacchi 		case I40E_AQ_CAP_ID_1588:
39809d26e4fcSRobert Mustacchi 			if (number == 1)
39819d26e4fcSRobert Mustacchi 				p->ieee_1588 = TRUE;
39823d75a287SRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_INIT,
39833d75a287SRobert Mustacchi 				   "HW Capability: IEEE 1588 = %d\n",
39843d75a287SRobert Mustacchi 				   p->ieee_1588);
39859d26e4fcSRobert Mustacchi 			break;
39863d75a287SRobert Mustacchi 		case I40E_AQ_CAP_ID_FLOW_DIRECTOR:
39879d26e4fcSRobert Mustacchi 			p->fd = TRUE;
39889d26e4fcSRobert Mustacchi 			p->fd_filters_guaranteed = number;
39899d26e4fcSRobert Mustacchi 			p->fd_filters_best_effort = logical_id;
39903d75a287SRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_INIT,
39913d75a287SRobert Mustacchi 				   "HW Capability: Flow Director = 1\n");
39923d75a287SRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_INIT,
39933d75a287SRobert Mustacchi 				   "HW Capability: Guaranteed FD filters = %d\n",
39943d75a287SRobert Mustacchi 				   p->fd_filters_guaranteed);
39959d26e4fcSRobert Mustacchi 			break;
39963d75a287SRobert Mustacchi 		case I40E_AQ_CAP_ID_WSR_PROT:
39979d26e4fcSRobert Mustacchi 			p->wr_csr_prot = (u64)number;
39989d26e4fcSRobert Mustacchi 			p->wr_csr_prot |= (u64)logical_id << 32;
39993d75a287SRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_INIT,
40003d75a287SRobert Mustacchi 				   "HW Capability: wr_csr_prot = 0x%llX\n\n",
40013d75a287SRobert Mustacchi 				   (p->wr_csr_prot & 0xffff));
40023d75a287SRobert Mustacchi 			break;
40033d75a287SRobert Mustacchi 		case I40E_AQ_CAP_ID_NVM_MGMT:
40043d75a287SRobert Mustacchi 			if (number & I40E_NVM_MGMT_SEC_REV_DISABLED)
40053d75a287SRobert Mustacchi 				p->sec_rev_disabled = TRUE;
40063d75a287SRobert Mustacchi 			if (number & I40E_NVM_MGMT_UPDATE_DISABLED)
40073d75a287SRobert Mustacchi 				p->update_disabled = TRUE;
40083d75a287SRobert Mustacchi 			break;
40093d75a287SRobert Mustacchi 		case I40E_AQ_CAP_ID_WOL_AND_PROXY:
40103d75a287SRobert Mustacchi 			hw->num_wol_proxy_filters = (u16)number;
40113d75a287SRobert Mustacchi 			hw->wol_proxy_vsi_seid = (u16)logical_id;
40123d75a287SRobert Mustacchi 			p->apm_wol_support = phys_id & I40E_WOL_SUPPORT_MASK;
40133d75a287SRobert Mustacchi 			if (phys_id & I40E_ACPI_PROGRAMMING_METHOD_MASK)
40143d75a287SRobert Mustacchi 				p->acpi_prog_method = I40E_ACPI_PROGRAMMING_METHOD_AQC_FPK;
40153d75a287SRobert Mustacchi 			else
40163d75a287SRobert Mustacchi 				p->acpi_prog_method = I40E_ACPI_PROGRAMMING_METHOD_HW_FVL;
40173d75a287SRobert Mustacchi 			p->proxy_support = (phys_id & I40E_PROXY_SUPPORT_MASK) ? 1 : 0;
40183d75a287SRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_INIT,
40193d75a287SRobert Mustacchi 				   "HW Capability: WOL proxy filters = %d\n",
40203d75a287SRobert Mustacchi 				   hw->num_wol_proxy_filters);
40219d26e4fcSRobert Mustacchi 			break;
40229d26e4fcSRobert Mustacchi 		default:
40239d26e4fcSRobert Mustacchi 			break;
40249d26e4fcSRobert Mustacchi 		}
40259d26e4fcSRobert Mustacchi 	}
40269d26e4fcSRobert Mustacchi 
40279d26e4fcSRobert Mustacchi 	if (p->fcoe)
40289d26e4fcSRobert Mustacchi 		i40e_debug(hw, I40E_DEBUG_ALL, "device is FCoE capable\n");
40299d26e4fcSRobert Mustacchi 
40309d26e4fcSRobert Mustacchi 	/* Always disable FCoE if compiled without the I40E_FCOE_ENA flag */
40319d26e4fcSRobert Mustacchi 	p->fcoe = FALSE;
40329d26e4fcSRobert Mustacchi 
4033341c5f49SJohn Levon 	valid_functions = p->valid_functions;
4034341c5f49SJohn Levon 	num_functions = 0;
4035341c5f49SJohn Levon 	while (valid_functions) {
4036341c5f49SJohn Levon 		if (valid_functions & 1)
4037341c5f49SJohn Levon 			num_functions++;
4038341c5f49SJohn Levon 		valid_functions >>= 1;
4039341c5f49SJohn Levon 	}
4040341c5f49SJohn Levon 
40419d26e4fcSRobert Mustacchi 	/* count the enabled ports (aka the "not disabled" ports) */
40429d26e4fcSRobert Mustacchi 	hw->num_ports = 0;
40439d26e4fcSRobert Mustacchi 	for (i = 0; i < 4; i++) {
4044f0c1c263SMarcel Telka 		u32 port_cfg_reg = I40E_PRTGEN_STATUS + (4 * i);
40459d26e4fcSRobert Mustacchi 		u64 port_cfg = 0;
40469d26e4fcSRobert Mustacchi 
40479d26e4fcSRobert Mustacchi 		/* use AQ read to get the physical register offset instead
40489d26e4fcSRobert Mustacchi 		 * of the port relative offset
40499d26e4fcSRobert Mustacchi 		 */
4050f0c1c263SMarcel Telka 		status = i40e_aq_debug_read_register(hw, port_cfg_reg, &port_cfg, NULL);
4051f0c1c263SMarcel Telka 		if ((status == I40E_SUCCESS) &&
4052f0c1c263SMarcel Telka 		    (port_cfg & I40E_PRTGEN_STATUS_PORT_VALID_MASK))
40539d26e4fcSRobert Mustacchi 			hw->num_ports++;
40549d26e4fcSRobert Mustacchi 	}
40559d26e4fcSRobert Mustacchi 
405693f1cac5SPaul Winder 	/* OCP cards case: if a mezz is removed the ethernet port is at
405793f1cac5SPaul Winder 	 * disabled state in PRTGEN_CNF register. Additional NVM read is
405893f1cac5SPaul Winder 	 * needed in order to check if we are dealing with OCP card.
405993f1cac5SPaul Winder 	 * Those cards have 4 PFs at minimum, so using PRTGEN_CNF for counting
406093f1cac5SPaul Winder 	 * physical ports results in wrong partition id calculation and thus
406193f1cac5SPaul Winder 	 * not supporting WoL.
4062341c5f49SJohn Levon 	 *
4063341c5f49SJohn Levon 	 * Porting note: the above comment is no longer directly relevant: we
4064341c5f49SJohn Levon 	 * read PRTGEN_STATUS instead now, as PRTGEN_CNF was not reliable for
4065341c5f49SJohn Levon 	 * these parts.  In addition, the claim about having 4 PFs is not
4066341c5f49SJohn Levon 	 * correct.  For example, an X557-T2 is a dual port mezz card. Forcing
4067341c5f49SJohn Levon 	 * ports to four here will cause ->num_partitions to be zero.
4068341c5f49SJohn Levon 	 *
4069341c5f49SJohn Levon 	 * On the presumption that the hard-coded value is meaningful in some
4070341c5f49SJohn Levon 	 * cases, though, we'll take the minimal approach of ensuring that we
4071341c5f49SJohn Levon 	 * never have more ports than functions.
407293f1cac5SPaul Winder 	 */
407393f1cac5SPaul Winder 	if (hw->mac.type == I40E_MAC_X722) {
407493f1cac5SPaul Winder 		if (i40e_acquire_nvm(hw, I40E_RESOURCE_READ) == I40E_SUCCESS) {
407593f1cac5SPaul Winder 			status = i40e_aq_read_nvm(hw, I40E_SR_EMP_MODULE_PTR,
407693f1cac5SPaul Winder 						  2 * I40E_SR_OCP_CFG_WORD0,
407793f1cac5SPaul Winder 						  sizeof(ocp_cfg_word0),
407893f1cac5SPaul Winder 						  &ocp_cfg_word0, TRUE, NULL);
4079341c5f49SJohn Levon #ifdef __sun__
4080341c5f49SJohn Levon 			if (status == I40E_SUCCESS &&
4081341c5f49SJohn Levon 			    (ocp_cfg_word0 & I40E_SR_OCP_ENABLED)) {
4082341c5f49SJohn Levon 				hw->num_ports = 4;
4083341c5f49SJohn Levon 				if (hw->num_ports > num_functions) {
4084341c5f49SJohn Levon 					hw->num_ports = num_functions;
4085341c5f49SJohn Levon 					DEBUGOUT1("clamped 4 OCP ports to %d\n",
4086341c5f49SJohn Levon 					    (int)hw->num_ports);
4087341c5f49SJohn Levon 				}
4088341c5f49SJohn Levon 			}
4089341c5f49SJohn Levon #else
409093f1cac5SPaul Winder 			if (status == I40E_SUCCESS &&
409193f1cac5SPaul Winder 			    (ocp_cfg_word0 & I40E_SR_OCP_ENABLED))
409293f1cac5SPaul Winder 				hw->num_ports = 4;
4093341c5f49SJohn Levon #endif
409493f1cac5SPaul Winder 			i40e_release_nvm(hw);
409593f1cac5SPaul Winder 		}
409693f1cac5SPaul Winder 	}
409793f1cac5SPaul Winder 
40989d26e4fcSRobert Mustacchi 	/* partition id is 1-based, and functions are evenly spread
40999d26e4fcSRobert Mustacchi 	 * across the ports as partitions
41009d26e4fcSRobert Mustacchi 	 */
41013d75a287SRobert Mustacchi 	if (hw->num_ports != 0) {
41023d75a287SRobert Mustacchi 		hw->partition_id = (hw->pf_id / hw->num_ports) + 1;
41033d75a287SRobert Mustacchi 		hw->num_partitions = num_functions / hw->num_ports;
41043d75a287SRobert Mustacchi 	}
41059d26e4fcSRobert Mustacchi 
4106341c5f49SJohn Levon 	VERIFY(hw->num_partitions > 0);
4107341c5f49SJohn Levon 
41089d26e4fcSRobert Mustacchi 	/* additional HW specific goodies that might
41099d26e4fcSRobert Mustacchi 	 * someday be HW version specific
41109d26e4fcSRobert Mustacchi 	 */
41119d26e4fcSRobert Mustacchi 	p->rx_buf_chain_len = I40E_MAX_CHAINED_RX_BUFFERS;
41129d26e4fcSRobert Mustacchi }
41139d26e4fcSRobert Mustacchi 
41149d26e4fcSRobert Mustacchi /**
41159d26e4fcSRobert Mustacchi  * i40e_aq_discover_capabilities
41169d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
41179d26e4fcSRobert Mustacchi  * @buff: a virtual buffer to hold the capabilities
41189d26e4fcSRobert Mustacchi  * @buff_size: Size of the virtual buffer
41199d26e4fcSRobert Mustacchi  * @data_size: Size of the returned data, or buff size needed if AQ err==ENOMEM
41209d26e4fcSRobert Mustacchi  * @list_type_opc: capabilities type to discover - pass in the command opcode
41219d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
41229d26e4fcSRobert Mustacchi  *
41239d26e4fcSRobert Mustacchi  * Get the device capabilities descriptions from the firmware
41249d26e4fcSRobert Mustacchi  **/
i40e_aq_discover_capabilities(struct i40e_hw * hw,void * buff,u16 buff_size,u16 * data_size,enum i40e_admin_queue_opc list_type_opc,struct i40e_asq_cmd_details * cmd_details)41259d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_discover_capabilities(struct i40e_hw *hw,
41269d26e4fcSRobert Mustacchi 				void *buff, u16 buff_size, u16 *data_size,
41279d26e4fcSRobert Mustacchi 				enum i40e_admin_queue_opc list_type_opc,
41289d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
41299d26e4fcSRobert Mustacchi {
41309d26e4fcSRobert Mustacchi 	struct i40e_aqc_list_capabilites *cmd;
41319d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
41329d26e4fcSRobert Mustacchi 	enum i40e_status_code status = I40E_SUCCESS;
41339d26e4fcSRobert Mustacchi 
41349d26e4fcSRobert Mustacchi 	cmd = (struct i40e_aqc_list_capabilites *)&desc.params.raw;
41359d26e4fcSRobert Mustacchi 
41369d26e4fcSRobert Mustacchi 	if (list_type_opc != i40e_aqc_opc_list_func_capabilities &&
41379d26e4fcSRobert Mustacchi 		list_type_opc != i40e_aqc_opc_list_dev_capabilities) {
41389d26e4fcSRobert Mustacchi 		status = I40E_ERR_PARAM;
41399d26e4fcSRobert Mustacchi 		goto exit;
41409d26e4fcSRobert Mustacchi 	}
41419d26e4fcSRobert Mustacchi 
41429d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, list_type_opc);
41439d26e4fcSRobert Mustacchi 
41449d26e4fcSRobert Mustacchi 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
41459d26e4fcSRobert Mustacchi 	if (buff_size > I40E_AQ_LARGE_BUF)
41469d26e4fcSRobert Mustacchi 		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
41479d26e4fcSRobert Mustacchi 
41489d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
41499d26e4fcSRobert Mustacchi 	*data_size = LE16_TO_CPU(desc.datalen);
41509d26e4fcSRobert Mustacchi 
41519d26e4fcSRobert Mustacchi 	if (status)
41529d26e4fcSRobert Mustacchi 		goto exit;
41539d26e4fcSRobert Mustacchi 
41549d26e4fcSRobert Mustacchi 	i40e_parse_discover_capabilities(hw, buff, LE32_TO_CPU(cmd->count),
41559d26e4fcSRobert Mustacchi 					 list_type_opc);
41569d26e4fcSRobert Mustacchi 
41579d26e4fcSRobert Mustacchi exit:
41589d26e4fcSRobert Mustacchi 	return status;
41599d26e4fcSRobert Mustacchi }
41609d26e4fcSRobert Mustacchi 
41619d26e4fcSRobert Mustacchi /**
41629d26e4fcSRobert Mustacchi  * i40e_aq_update_nvm
41639d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
41649d26e4fcSRobert Mustacchi  * @module_pointer: module pointer location in words from the NVM beginning
41659d26e4fcSRobert Mustacchi  * @offset: byte offset from the module beginning
41669d26e4fcSRobert Mustacchi  * @length: length of the section to be written (in bytes from the offset)
41679d26e4fcSRobert Mustacchi  * @data: command buffer (size [bytes] = length)
41689d26e4fcSRobert Mustacchi  * @last_command: tells if this is the last command in a series
416993f1cac5SPaul Winder  * @preservation_flags: Preservation mode flags
41709d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
41719d26e4fcSRobert Mustacchi  *
41729d26e4fcSRobert Mustacchi  * Update the NVM using the admin queue commands
41739d26e4fcSRobert Mustacchi  **/
i40e_aq_update_nvm(struct i40e_hw * hw,u8 module_pointer,u32 offset,u16 length,void * data,bool last_command,u8 preservation_flags,struct i40e_asq_cmd_details * cmd_details)41749d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_update_nvm(struct i40e_hw *hw, u8 module_pointer,
41759d26e4fcSRobert Mustacchi 				u32 offset, u16 length, void *data,
417693f1cac5SPaul Winder 				bool last_command, u8 preservation_flags,
41779d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
41789d26e4fcSRobert Mustacchi {
41799d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
41809d26e4fcSRobert Mustacchi 	struct i40e_aqc_nvm_update *cmd =
41819d26e4fcSRobert Mustacchi 		(struct i40e_aqc_nvm_update *)&desc.params.raw;
41829d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
41839d26e4fcSRobert Mustacchi 
41849d26e4fcSRobert Mustacchi 	DEBUGFUNC("i40e_aq_update_nvm");
41859d26e4fcSRobert Mustacchi 
41869d26e4fcSRobert Mustacchi 	/* In offset the highest byte must be zeroed. */
41879d26e4fcSRobert Mustacchi 	if (offset & 0xFF000000) {
41889d26e4fcSRobert Mustacchi 		status = I40E_ERR_PARAM;
41899d26e4fcSRobert Mustacchi 		goto i40e_aq_update_nvm_exit;
41909d26e4fcSRobert Mustacchi 	}
41919d26e4fcSRobert Mustacchi 
41929d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_update);
41939d26e4fcSRobert Mustacchi 
41949d26e4fcSRobert Mustacchi 	/* If this is the last command in a series, set the proper flag. */
41959d26e4fcSRobert Mustacchi 	if (last_command)
41969d26e4fcSRobert Mustacchi 		cmd->command_flags |= I40E_AQ_NVM_LAST_CMD;
419793f1cac5SPaul Winder 	if (hw->mac.type == I40E_MAC_X722) {
419893f1cac5SPaul Winder 		if (preservation_flags == I40E_NVM_PRESERVATION_FLAGS_SELECTED)
419993f1cac5SPaul Winder 			cmd->command_flags |=
420093f1cac5SPaul Winder 				(I40E_AQ_NVM_PRESERVATION_FLAGS_SELECTED <<
420193f1cac5SPaul Winder 				 I40E_AQ_NVM_PRESERVATION_FLAGS_SHIFT);
420293f1cac5SPaul Winder 		else if (preservation_flags == I40E_NVM_PRESERVATION_FLAGS_ALL)
420393f1cac5SPaul Winder 			cmd->command_flags |=
420493f1cac5SPaul Winder 				(I40E_AQ_NVM_PRESERVATION_FLAGS_ALL <<
420593f1cac5SPaul Winder 				 I40E_AQ_NVM_PRESERVATION_FLAGS_SHIFT);
420693f1cac5SPaul Winder 	}
42079d26e4fcSRobert Mustacchi 	cmd->module_pointer = module_pointer;
42089d26e4fcSRobert Mustacchi 	cmd->offset = CPU_TO_LE32(offset);
42099d26e4fcSRobert Mustacchi 	cmd->length = CPU_TO_LE16(length);
42109d26e4fcSRobert Mustacchi 
42119d26e4fcSRobert Mustacchi 	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
42129d26e4fcSRobert Mustacchi 	if (length > I40E_AQ_LARGE_BUF)
42139d26e4fcSRobert Mustacchi 		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
42149d26e4fcSRobert Mustacchi 
42159d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, data, length, cmd_details);
42169d26e4fcSRobert Mustacchi 
42179d26e4fcSRobert Mustacchi i40e_aq_update_nvm_exit:
42189d26e4fcSRobert Mustacchi 	return status;
42199d26e4fcSRobert Mustacchi }
42209d26e4fcSRobert Mustacchi 
422193f1cac5SPaul Winder /**
422293f1cac5SPaul Winder  * i40e_aq_nvm_progress
422393f1cac5SPaul Winder  * @hw: pointer to the hw struct
422493f1cac5SPaul Winder  * @progress: pointer to progress returned from AQ
422593f1cac5SPaul Winder  * @cmd_details: pointer to command details structure or NULL
422693f1cac5SPaul Winder  *
422793f1cac5SPaul Winder  * Gets progress of flash rearrangement process
422893f1cac5SPaul Winder  **/
i40e_aq_nvm_progress(struct i40e_hw * hw,u8 * progress,struct i40e_asq_cmd_details * cmd_details)422993f1cac5SPaul Winder enum i40e_status_code i40e_aq_nvm_progress(struct i40e_hw *hw, u8 *progress,
423093f1cac5SPaul Winder 				struct i40e_asq_cmd_details *cmd_details)
423193f1cac5SPaul Winder {
423293f1cac5SPaul Winder 	enum i40e_status_code status;
423393f1cac5SPaul Winder 	struct i40e_aq_desc desc;
423493f1cac5SPaul Winder 
423593f1cac5SPaul Winder 	DEBUGFUNC("i40e_aq_nvm_progress");
423693f1cac5SPaul Winder 
423793f1cac5SPaul Winder 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_progress);
423893f1cac5SPaul Winder 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
423993f1cac5SPaul Winder 	*progress = desc.params.raw[0];
424093f1cac5SPaul Winder 	return status;
424193f1cac5SPaul Winder }
424293f1cac5SPaul Winder 
42439d26e4fcSRobert Mustacchi /**
42449d26e4fcSRobert Mustacchi  * i40e_aq_get_lldp_mib
42459d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
42469d26e4fcSRobert Mustacchi  * @bridge_type: type of bridge requested
42479d26e4fcSRobert Mustacchi  * @mib_type: Local, Remote or both Local and Remote MIBs
42489d26e4fcSRobert Mustacchi  * @buff: pointer to a user supplied buffer to store the MIB block
42499d26e4fcSRobert Mustacchi  * @buff_size: size of the buffer (in bytes)
42509d26e4fcSRobert Mustacchi  * @local_len : length of the returned Local LLDP MIB
42519d26e4fcSRobert Mustacchi  * @remote_len: length of the returned Remote LLDP MIB
42529d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
42539d26e4fcSRobert Mustacchi  *
42549d26e4fcSRobert Mustacchi  * Requests the complete LLDP MIB (entire packet).
42559d26e4fcSRobert Mustacchi  **/
i40e_aq_get_lldp_mib(struct i40e_hw * hw,u8 bridge_type,u8 mib_type,void * buff,u16 buff_size,u16 * local_len,u16 * remote_len,struct i40e_asq_cmd_details * cmd_details)42569d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_get_lldp_mib(struct i40e_hw *hw, u8 bridge_type,
42579d26e4fcSRobert Mustacchi 				u8 mib_type, void *buff, u16 buff_size,
42589d26e4fcSRobert Mustacchi 				u16 *local_len, u16 *remote_len,
42599d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
42609d26e4fcSRobert Mustacchi {
42619d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
42629d26e4fcSRobert Mustacchi 	struct i40e_aqc_lldp_get_mib *cmd =
42639d26e4fcSRobert Mustacchi 		(struct i40e_aqc_lldp_get_mib *)&desc.params.raw;
42649d26e4fcSRobert Mustacchi 	struct i40e_aqc_lldp_get_mib *resp =
42659d26e4fcSRobert Mustacchi 		(struct i40e_aqc_lldp_get_mib *)&desc.params.raw;
42669d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
42679d26e4fcSRobert Mustacchi 
42689d26e4fcSRobert Mustacchi 	if (buff_size == 0 || !buff)
42699d26e4fcSRobert Mustacchi 		return I40E_ERR_PARAM;
42709d26e4fcSRobert Mustacchi 
42719d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_get_mib);
42729d26e4fcSRobert Mustacchi 	/* Indirect Command */
42739d26e4fcSRobert Mustacchi 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
42749d26e4fcSRobert Mustacchi 
42759d26e4fcSRobert Mustacchi 	cmd->type = mib_type & I40E_AQ_LLDP_MIB_TYPE_MASK;
42769d26e4fcSRobert Mustacchi 	cmd->type |= ((bridge_type << I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT) &
42779d26e4fcSRobert Mustacchi 		       I40E_AQ_LLDP_BRIDGE_TYPE_MASK);
42789d26e4fcSRobert Mustacchi 
42799d26e4fcSRobert Mustacchi 	desc.datalen = CPU_TO_LE16(buff_size);
42809d26e4fcSRobert Mustacchi 
42819d26e4fcSRobert Mustacchi 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
42829d26e4fcSRobert Mustacchi 	if (buff_size > I40E_AQ_LARGE_BUF)
42839d26e4fcSRobert Mustacchi 		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
42849d26e4fcSRobert Mustacchi 
42859d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
42869d26e4fcSRobert Mustacchi 	if (!status) {
42879d26e4fcSRobert Mustacchi 		if (local_len != NULL)
42889d26e4fcSRobert Mustacchi 			*local_len = LE16_TO_CPU(resp->local_len);
42899d26e4fcSRobert Mustacchi 		if (remote_len != NULL)
42909d26e4fcSRobert Mustacchi 			*remote_len = LE16_TO_CPU(resp->remote_len);
42919d26e4fcSRobert Mustacchi 	}
42929d26e4fcSRobert Mustacchi 
42939d26e4fcSRobert Mustacchi 	return status;
42949d26e4fcSRobert Mustacchi }
42959d26e4fcSRobert Mustacchi 
42969d26e4fcSRobert Mustacchi  /**
42979d26e4fcSRobert Mustacchi  * i40e_aq_set_lldp_mib - Set the LLDP MIB
42989d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
42999d26e4fcSRobert Mustacchi  * @mib_type: Local, Remote or both Local and Remote MIBs
43009d26e4fcSRobert Mustacchi  * @buff: pointer to a user supplied buffer to store the MIB block
43019d26e4fcSRobert Mustacchi  * @buff_size: size of the buffer (in bytes)
43029d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
43039d26e4fcSRobert Mustacchi  *
43049d26e4fcSRobert Mustacchi  * Set the LLDP MIB.
43059d26e4fcSRobert Mustacchi  **/
i40e_aq_set_lldp_mib(struct i40e_hw * hw,u8 mib_type,void * buff,u16 buff_size,struct i40e_asq_cmd_details * cmd_details)43069d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_set_lldp_mib(struct i40e_hw *hw,
43079d26e4fcSRobert Mustacchi 				u8 mib_type, void *buff, u16 buff_size,
43089d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
43099d26e4fcSRobert Mustacchi {
43109d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
43119d26e4fcSRobert Mustacchi 	struct i40e_aqc_lldp_set_local_mib *cmd =
43129d26e4fcSRobert Mustacchi 		(struct i40e_aqc_lldp_set_local_mib *)&desc.params.raw;
43139d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
43149d26e4fcSRobert Mustacchi 
43159d26e4fcSRobert Mustacchi 	if (buff_size == 0 || !buff)
43169d26e4fcSRobert Mustacchi 		return I40E_ERR_PARAM;
43179d26e4fcSRobert Mustacchi 
43189d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
43199d26e4fcSRobert Mustacchi 				i40e_aqc_opc_lldp_set_local_mib);
43209d26e4fcSRobert Mustacchi 	/* Indirect Command */
43219d26e4fcSRobert Mustacchi 	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
43229d26e4fcSRobert Mustacchi 	if (buff_size > I40E_AQ_LARGE_BUF)
43239d26e4fcSRobert Mustacchi 		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
43249d26e4fcSRobert Mustacchi 	desc.datalen = CPU_TO_LE16(buff_size);
43259d26e4fcSRobert Mustacchi 
43269d26e4fcSRobert Mustacchi 	cmd->type = mib_type;
43279d26e4fcSRobert Mustacchi 	cmd->length = CPU_TO_LE16(buff_size);
4328*df36e06dSRobert Mustacchi 	cmd->address_high = CPU_TO_LE32(I40E_HI_DWORD((u64)buff));
4329*df36e06dSRobert Mustacchi 	cmd->address_low =  CPU_TO_LE32(I40E_LO_DWORD((u64)buff));
43309d26e4fcSRobert Mustacchi 
43319d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
43329d26e4fcSRobert Mustacchi 	return status;
43339d26e4fcSRobert Mustacchi }
43349d26e4fcSRobert Mustacchi 
43359d26e4fcSRobert Mustacchi /**
43369d26e4fcSRobert Mustacchi  * i40e_aq_cfg_lldp_mib_change_event
43379d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
43389d26e4fcSRobert Mustacchi  * @enable_update: Enable or Disable event posting
43399d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
43409d26e4fcSRobert Mustacchi  *
43419d26e4fcSRobert Mustacchi  * Enable or Disable posting of an event on ARQ when LLDP MIB
43429d26e4fcSRobert Mustacchi  * associated with the interface changes
43439d26e4fcSRobert Mustacchi  **/
i40e_aq_cfg_lldp_mib_change_event(struct i40e_hw * hw,bool enable_update,struct i40e_asq_cmd_details * cmd_details)43449d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_cfg_lldp_mib_change_event(struct i40e_hw *hw,
43459d26e4fcSRobert Mustacchi 				bool enable_update,
43469d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
43479d26e4fcSRobert Mustacchi {
43489d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
43499d26e4fcSRobert Mustacchi 	struct i40e_aqc_lldp_update_mib *cmd =
43509d26e4fcSRobert Mustacchi 		(struct i40e_aqc_lldp_update_mib *)&desc.params.raw;
43519d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
43529d26e4fcSRobert Mustacchi 
43539d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_update_mib);
43549d26e4fcSRobert Mustacchi 
43559d26e4fcSRobert Mustacchi 	if (!enable_update)
43569d26e4fcSRobert Mustacchi 		cmd->command |= I40E_AQ_LLDP_MIB_UPDATE_DISABLE;
43579d26e4fcSRobert Mustacchi 
43589d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
43599d26e4fcSRobert Mustacchi 
43609d26e4fcSRobert Mustacchi 	return status;
43619d26e4fcSRobert Mustacchi }
43629d26e4fcSRobert Mustacchi 
43639d26e4fcSRobert Mustacchi /**
4364*df36e06dSRobert Mustacchi  * i40e_aq_restore_lldp
43659d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
4366*df36e06dSRobert Mustacchi  * @setting: pointer to factory setting variable or NULL
4367*df36e06dSRobert Mustacchi  * @restore: True if factory settings should be restored
43689d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
43699d26e4fcSRobert Mustacchi  *
4370*df36e06dSRobert Mustacchi  * Restore LLDP Agent factory settings if @restore set to True. In other case
4371*df36e06dSRobert Mustacchi  * only returns factory setting in AQ response.
43729d26e4fcSRobert Mustacchi  **/
4373*df36e06dSRobert Mustacchi enum i40e_status_code
i40e_aq_restore_lldp(struct i40e_hw * hw,u8 * setting,bool restore,struct i40e_asq_cmd_details * cmd_details)4374*df36e06dSRobert Mustacchi i40e_aq_restore_lldp(struct i40e_hw *hw, u8 *setting, bool restore,
4375*df36e06dSRobert Mustacchi 		     struct i40e_asq_cmd_details *cmd_details)
43769d26e4fcSRobert Mustacchi {
43779d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
4378*df36e06dSRobert Mustacchi 	struct i40e_aqc_lldp_restore *cmd =
4379*df36e06dSRobert Mustacchi 		(struct i40e_aqc_lldp_restore *)&desc.params.raw;
43809d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
43819d26e4fcSRobert Mustacchi 
4382*df36e06dSRobert Mustacchi 	if (!(hw->flags & I40E_HW_FLAG_FW_LLDP_PERSISTENT)) {
4383*df36e06dSRobert Mustacchi 		i40e_debug(hw, I40E_DEBUG_ALL,
4384*df36e06dSRobert Mustacchi 			   "Restore LLDP not supported by current FW version.\n");
4385*df36e06dSRobert Mustacchi 		return I40E_ERR_DEVICE_NOT_SUPPORTED;
43869d26e4fcSRobert Mustacchi 	}
43879d26e4fcSRobert Mustacchi 
4388*df36e06dSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_restore);
43899d26e4fcSRobert Mustacchi 
4390*df36e06dSRobert Mustacchi 	if (restore)
4391*df36e06dSRobert Mustacchi 		cmd->command |= I40E_AQ_LLDP_AGENT_RESTORE;
43929d26e4fcSRobert Mustacchi 
4393*df36e06dSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
43949d26e4fcSRobert Mustacchi 
4395*df36e06dSRobert Mustacchi 	if (setting)
4396*df36e06dSRobert Mustacchi 		*setting = cmd->command & 1;
43979d26e4fcSRobert Mustacchi 
43989d26e4fcSRobert Mustacchi 	return status;
43999d26e4fcSRobert Mustacchi }
44009d26e4fcSRobert Mustacchi 
44019d26e4fcSRobert Mustacchi /**
44029d26e4fcSRobert Mustacchi  * i40e_aq_stop_lldp
44039d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
44049d26e4fcSRobert Mustacchi  * @shutdown_agent: True if LLDP Agent needs to be Shutdown
4405*df36e06dSRobert Mustacchi  * @persist: True if stop of LLDP should be persistent across power cycles
44069d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
44079d26e4fcSRobert Mustacchi  *
44089d26e4fcSRobert Mustacchi  * Stop or Shutdown the embedded LLDP Agent
44099d26e4fcSRobert Mustacchi  **/
i40e_aq_stop_lldp(struct i40e_hw * hw,bool shutdown_agent,bool persist,struct i40e_asq_cmd_details * cmd_details)44109d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_stop_lldp(struct i40e_hw *hw, bool shutdown_agent,
4411*df36e06dSRobert Mustacchi 				bool persist,
44129d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
44139d26e4fcSRobert Mustacchi {
44149d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
44159d26e4fcSRobert Mustacchi 	struct i40e_aqc_lldp_stop *cmd =
44169d26e4fcSRobert Mustacchi 		(struct i40e_aqc_lldp_stop *)&desc.params.raw;
44179d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
44189d26e4fcSRobert Mustacchi 
44199d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_stop);
44209d26e4fcSRobert Mustacchi 
44219d26e4fcSRobert Mustacchi 	if (shutdown_agent)
44229d26e4fcSRobert Mustacchi 		cmd->command |= I40E_AQ_LLDP_AGENT_SHUTDOWN;
44239d26e4fcSRobert Mustacchi 
4424*df36e06dSRobert Mustacchi 	if (persist) {
4425*df36e06dSRobert Mustacchi 		if (hw->flags & I40E_HW_FLAG_FW_LLDP_PERSISTENT)
4426*df36e06dSRobert Mustacchi 			cmd->command |= I40E_AQ_LLDP_AGENT_STOP_PERSIST;
4427*df36e06dSRobert Mustacchi 		else
4428*df36e06dSRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_ALL,
4429*df36e06dSRobert Mustacchi 				   "Persistent Stop LLDP not supported by current FW version.\n");
4430*df36e06dSRobert Mustacchi 	}
4431*df36e06dSRobert Mustacchi 
44329d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
44339d26e4fcSRobert Mustacchi 
44349d26e4fcSRobert Mustacchi 	return status;
44359d26e4fcSRobert Mustacchi }
44369d26e4fcSRobert Mustacchi 
44379d26e4fcSRobert Mustacchi /**
44389d26e4fcSRobert Mustacchi  * i40e_aq_start_lldp
44399d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
4440*df36e06dSRobert Mustacchi  * @persist: True if start of LLDP should be persistent across power cycles
44419d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
44429d26e4fcSRobert Mustacchi  *
44439d26e4fcSRobert Mustacchi  * Start the embedded LLDP Agent on all ports.
44449d26e4fcSRobert Mustacchi  **/
i40e_aq_start_lldp(struct i40e_hw * hw,bool persist,struct i40e_asq_cmd_details * cmd_details)44459d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_start_lldp(struct i40e_hw *hw,
4446*df36e06dSRobert Mustacchi 				bool persist,
44479d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
44489d26e4fcSRobert Mustacchi {
44499d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
44509d26e4fcSRobert Mustacchi 	struct i40e_aqc_lldp_start *cmd =
44519d26e4fcSRobert Mustacchi 		(struct i40e_aqc_lldp_start *)&desc.params.raw;
44529d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
44539d26e4fcSRobert Mustacchi 
44549d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_start);
44559d26e4fcSRobert Mustacchi 
44569d26e4fcSRobert Mustacchi 	cmd->command = I40E_AQ_LLDP_AGENT_START;
4457*df36e06dSRobert Mustacchi 
4458*df36e06dSRobert Mustacchi 	if (persist) {
4459*df36e06dSRobert Mustacchi 		if (hw->flags & I40E_HW_FLAG_FW_LLDP_PERSISTENT)
4460*df36e06dSRobert Mustacchi 			cmd->command |= I40E_AQ_LLDP_AGENT_START_PERSIST;
4461*df36e06dSRobert Mustacchi 		else
4462*df36e06dSRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_ALL,
4463*df36e06dSRobert Mustacchi 				   "Persistent Start LLDP not supported by current FW version.\n");
4464*df36e06dSRobert Mustacchi 	}
4465*df36e06dSRobert Mustacchi 
446693f1cac5SPaul Winder 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
446793f1cac5SPaul Winder 
446893f1cac5SPaul Winder 	return status;
446993f1cac5SPaul Winder }
447093f1cac5SPaul Winder 
447193f1cac5SPaul Winder /**
447293f1cac5SPaul Winder  * i40e_aq_set_dcb_parameters
447393f1cac5SPaul Winder  * @hw: pointer to the hw struct
447493f1cac5SPaul Winder  * @cmd_details: pointer to command details structure or NULL
447593f1cac5SPaul Winder  * @dcb_enable: True if DCB configuration needs to be applied
447693f1cac5SPaul Winder  *
447793f1cac5SPaul Winder  **/
447893f1cac5SPaul Winder enum i40e_status_code
i40e_aq_set_dcb_parameters(struct i40e_hw * hw,bool dcb_enable,struct i40e_asq_cmd_details * cmd_details)447993f1cac5SPaul Winder i40e_aq_set_dcb_parameters(struct i40e_hw *hw, bool dcb_enable,
448093f1cac5SPaul Winder 			   struct i40e_asq_cmd_details *cmd_details)
448193f1cac5SPaul Winder {
448293f1cac5SPaul Winder 	struct i40e_aq_desc desc;
448393f1cac5SPaul Winder 	struct i40e_aqc_set_dcb_parameters *cmd =
448493f1cac5SPaul Winder 		(struct i40e_aqc_set_dcb_parameters *)&desc.params.raw;
448593f1cac5SPaul Winder 	enum i40e_status_code status;
448693f1cac5SPaul Winder 
4487*df36e06dSRobert Mustacchi 	if (!(hw->flags & I40E_HW_FLAG_FW_LLDP_STOPPABLE))
448893f1cac5SPaul Winder 		return I40E_ERR_DEVICE_NOT_SUPPORTED;
448993f1cac5SPaul Winder 
449093f1cac5SPaul Winder 	i40e_fill_default_direct_cmd_desc(&desc,
449193f1cac5SPaul Winder 					  i40e_aqc_opc_set_dcb_parameters);
44929d26e4fcSRobert Mustacchi 
449393f1cac5SPaul Winder 	if (dcb_enable) {
449493f1cac5SPaul Winder 		cmd->valid_flags = I40E_DCB_VALID;
449593f1cac5SPaul Winder 		cmd->command = I40E_AQ_DCB_SET_AGENT;
449693f1cac5SPaul Winder 	}
44979d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
44989d26e4fcSRobert Mustacchi 
44999d26e4fcSRobert Mustacchi 	return status;
45009d26e4fcSRobert Mustacchi }
45019d26e4fcSRobert Mustacchi 
45029d26e4fcSRobert Mustacchi /**
45039d26e4fcSRobert Mustacchi  * i40e_aq_get_cee_dcb_config
45049d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
45059d26e4fcSRobert Mustacchi  * @buff: response buffer that stores CEE operational configuration
45069d26e4fcSRobert Mustacchi  * @buff_size: size of the buffer passed
45079d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
45089d26e4fcSRobert Mustacchi  *
45099d26e4fcSRobert Mustacchi  * Get CEE DCBX mode operational configuration from firmware
45109d26e4fcSRobert Mustacchi  **/
i40e_aq_get_cee_dcb_config(struct i40e_hw * hw,void * buff,u16 buff_size,struct i40e_asq_cmd_details * cmd_details)45119d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_get_cee_dcb_config(struct i40e_hw *hw,
45129d26e4fcSRobert Mustacchi 				void *buff, u16 buff_size,
45139d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
45149d26e4fcSRobert Mustacchi {
45159d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
45169d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
45179d26e4fcSRobert Mustacchi 
45189d26e4fcSRobert Mustacchi 	if (buff_size == 0 || !buff)
45199d26e4fcSRobert Mustacchi 		return I40E_ERR_PARAM;
45209d26e4fcSRobert Mustacchi 
45219d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_cee_dcb_cfg);
45229d26e4fcSRobert Mustacchi 
45239d26e4fcSRobert Mustacchi 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
45249d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, (void *)buff, buff_size,
45259d26e4fcSRobert Mustacchi 				       cmd_details);
45269d26e4fcSRobert Mustacchi 
45279d26e4fcSRobert Mustacchi 	return status;
45289d26e4fcSRobert Mustacchi }
45299d26e4fcSRobert Mustacchi 
45309d26e4fcSRobert Mustacchi /**
45319d26e4fcSRobert Mustacchi  * i40e_aq_start_stop_dcbx - Start/Stop DCBx service in FW
45329d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
45339d26e4fcSRobert Mustacchi  * @start_agent: True if DCBx Agent needs to be Started
45349d26e4fcSRobert Mustacchi  *				False if DCBx Agent needs to be Stopped
45359d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
45369d26e4fcSRobert Mustacchi  *
45379d26e4fcSRobert Mustacchi  * Start/Stop the embedded dcbx Agent
45389d26e4fcSRobert Mustacchi  **/
i40e_aq_start_stop_dcbx(struct i40e_hw * hw,bool start_agent,struct i40e_asq_cmd_details * cmd_details)45399d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_start_stop_dcbx(struct i40e_hw *hw,
45409d26e4fcSRobert Mustacchi 				bool start_agent,
45419d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
45429d26e4fcSRobert Mustacchi {
45439d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
45449d26e4fcSRobert Mustacchi 	struct i40e_aqc_lldp_stop_start_specific_agent *cmd =
45459d26e4fcSRobert Mustacchi 		(struct i40e_aqc_lldp_stop_start_specific_agent *)
45469d26e4fcSRobert Mustacchi 				&desc.params.raw;
45479d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
45489d26e4fcSRobert Mustacchi 
45499d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
45509d26e4fcSRobert Mustacchi 				i40e_aqc_opc_lldp_stop_start_spec_agent);
45519d26e4fcSRobert Mustacchi 
45529d26e4fcSRobert Mustacchi 	if (start_agent)
45539d26e4fcSRobert Mustacchi 		cmd->command = I40E_AQC_START_SPECIFIC_AGENT_MASK;
45549d26e4fcSRobert Mustacchi 
45559d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
45569d26e4fcSRobert Mustacchi 
45579d26e4fcSRobert Mustacchi 	return status;
45589d26e4fcSRobert Mustacchi }
45599d26e4fcSRobert Mustacchi 
45609d26e4fcSRobert Mustacchi /**
45619d26e4fcSRobert Mustacchi  * i40e_aq_add_udp_tunnel
45629d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
4563*df36e06dSRobert Mustacchi  * @udp_port: the UDP port to add in Host byte order
45649d26e4fcSRobert Mustacchi  * @protocol_index: protocol index type
45659d26e4fcSRobert Mustacchi  * @filter_index: pointer to filter index
45669d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
4567*df36e06dSRobert Mustacchi  *
4568*df36e06dSRobert Mustacchi  * Note: Firmware expects the udp_port value to be in Little Endian format,
4569*df36e06dSRobert Mustacchi  * and this function will call CPU_TO_LE16 to convert from Host byte order to
4570*df36e06dSRobert Mustacchi  * Little Endian order.
45719d26e4fcSRobert Mustacchi  **/
i40e_aq_add_udp_tunnel(struct i40e_hw * hw,u16 udp_port,u8 protocol_index,u8 * filter_index,struct i40e_asq_cmd_details * cmd_details)45729d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_add_udp_tunnel(struct i40e_hw *hw,
45739d26e4fcSRobert Mustacchi 				u16 udp_port, u8 protocol_index,
45749d26e4fcSRobert Mustacchi 				u8 *filter_index,
45759d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
45769d26e4fcSRobert Mustacchi {
45779d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
45789d26e4fcSRobert Mustacchi 	struct i40e_aqc_add_udp_tunnel *cmd =
45799d26e4fcSRobert Mustacchi 		(struct i40e_aqc_add_udp_tunnel *)&desc.params.raw;
45809d26e4fcSRobert Mustacchi 	struct i40e_aqc_del_udp_tunnel_completion *resp =
45819d26e4fcSRobert Mustacchi 		(struct i40e_aqc_del_udp_tunnel_completion *)&desc.params.raw;
45829d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
45839d26e4fcSRobert Mustacchi 
45849d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_udp_tunnel);
45859d26e4fcSRobert Mustacchi 
45869d26e4fcSRobert Mustacchi 	cmd->udp_port = CPU_TO_LE16(udp_port);
45879d26e4fcSRobert Mustacchi 	cmd->protocol_type = protocol_index;
45889d26e4fcSRobert Mustacchi 
45899d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
45909d26e4fcSRobert Mustacchi 
45919d26e4fcSRobert Mustacchi 	if (!status && filter_index)
45929d26e4fcSRobert Mustacchi 		*filter_index = resp->index;
45939d26e4fcSRobert Mustacchi 
45949d26e4fcSRobert Mustacchi 	return status;
45959d26e4fcSRobert Mustacchi }
45969d26e4fcSRobert Mustacchi 
45979d26e4fcSRobert Mustacchi /**
45989d26e4fcSRobert Mustacchi  * i40e_aq_del_udp_tunnel
45999d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
46009d26e4fcSRobert Mustacchi  * @index: filter index
46019d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
46029d26e4fcSRobert Mustacchi  **/
i40e_aq_del_udp_tunnel(struct i40e_hw * hw,u8 index,struct i40e_asq_cmd_details * cmd_details)46039d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_del_udp_tunnel(struct i40e_hw *hw, u8 index,
46049d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
46059d26e4fcSRobert Mustacchi {
46069d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
46079d26e4fcSRobert Mustacchi 	struct i40e_aqc_remove_udp_tunnel *cmd =
46089d26e4fcSRobert Mustacchi 		(struct i40e_aqc_remove_udp_tunnel *)&desc.params.raw;
46099d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
46109d26e4fcSRobert Mustacchi 
46119d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_del_udp_tunnel);
46129d26e4fcSRobert Mustacchi 
46139d26e4fcSRobert Mustacchi 	cmd->index = index;
46149d26e4fcSRobert Mustacchi 
46159d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
46169d26e4fcSRobert Mustacchi 
46179d26e4fcSRobert Mustacchi 	return status;
46189d26e4fcSRobert Mustacchi }
46199d26e4fcSRobert Mustacchi 
46209d26e4fcSRobert Mustacchi /**
46219d26e4fcSRobert Mustacchi  * i40e_aq_get_switch_resource_alloc (0x0204)
46229d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
46239d26e4fcSRobert Mustacchi  * @num_entries: pointer to u8 to store the number of resource entries returned
46249d26e4fcSRobert Mustacchi  * @buf: pointer to a user supplied buffer.  This buffer must be large enough
46259d26e4fcSRobert Mustacchi  *        to store the resource information for all resource types.  Each
46269d26e4fcSRobert Mustacchi  *        resource type is a i40e_aqc_switch_resource_alloc_data structure.
46279d26e4fcSRobert Mustacchi  * @count: size, in bytes, of the buffer provided
46289d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
46299d26e4fcSRobert Mustacchi  *
46309d26e4fcSRobert Mustacchi  * Query the resources allocated to a function.
46319d26e4fcSRobert Mustacchi  **/
i40e_aq_get_switch_resource_alloc(struct i40e_hw * hw,u8 * num_entries,struct i40e_aqc_switch_resource_alloc_element_resp * buf,u16 count,struct i40e_asq_cmd_details * cmd_details)46329d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_get_switch_resource_alloc(struct i40e_hw *hw,
46339d26e4fcSRobert Mustacchi 			u8 *num_entries,
46349d26e4fcSRobert Mustacchi 			struct i40e_aqc_switch_resource_alloc_element_resp *buf,
46359d26e4fcSRobert Mustacchi 			u16 count,
46369d26e4fcSRobert Mustacchi 			struct i40e_asq_cmd_details *cmd_details)
46379d26e4fcSRobert Mustacchi {
46389d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
46399d26e4fcSRobert Mustacchi 	struct i40e_aqc_get_switch_resource_alloc *cmd_resp =
46409d26e4fcSRobert Mustacchi 		(struct i40e_aqc_get_switch_resource_alloc *)&desc.params.raw;
46419d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
46429d26e4fcSRobert Mustacchi 	u16 length = count * sizeof(*buf);
46439d26e4fcSRobert Mustacchi 
46449d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
46459d26e4fcSRobert Mustacchi 					i40e_aqc_opc_get_switch_resource_alloc);
46469d26e4fcSRobert Mustacchi 
46479d26e4fcSRobert Mustacchi 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
46489d26e4fcSRobert Mustacchi 	if (length > I40E_AQ_LARGE_BUF)
46499d26e4fcSRobert Mustacchi 		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
46509d26e4fcSRobert Mustacchi 
46519d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, buf, length, cmd_details);
46529d26e4fcSRobert Mustacchi 
46539d26e4fcSRobert Mustacchi 	if (!status && num_entries)
46549d26e4fcSRobert Mustacchi 		*num_entries = cmd_resp->num_entries;
46559d26e4fcSRobert Mustacchi 
46569d26e4fcSRobert Mustacchi 	return status;
46579d26e4fcSRobert Mustacchi }
46589d26e4fcSRobert Mustacchi 
46599d26e4fcSRobert Mustacchi /**
46609d26e4fcSRobert Mustacchi  * i40e_aq_delete_element - Delete switch element
46619d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
46629d26e4fcSRobert Mustacchi  * @seid: the SEID to delete from the switch
46639d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
46649d26e4fcSRobert Mustacchi  *
46659d26e4fcSRobert Mustacchi  * This deletes a switch element from the switch.
46669d26e4fcSRobert Mustacchi  **/
i40e_aq_delete_element(struct i40e_hw * hw,u16 seid,struct i40e_asq_cmd_details * cmd_details)46679d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_delete_element(struct i40e_hw *hw, u16 seid,
46689d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
46699d26e4fcSRobert Mustacchi {
46709d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
46719d26e4fcSRobert Mustacchi 	struct i40e_aqc_switch_seid *cmd =
46729d26e4fcSRobert Mustacchi 		(struct i40e_aqc_switch_seid *)&desc.params.raw;
46739d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
46749d26e4fcSRobert Mustacchi 
46759d26e4fcSRobert Mustacchi 	if (seid == 0)
46769d26e4fcSRobert Mustacchi 		return I40E_ERR_PARAM;
46779d26e4fcSRobert Mustacchi 
46789d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_delete_element);
46799d26e4fcSRobert Mustacchi 
46809d26e4fcSRobert Mustacchi 	cmd->seid = CPU_TO_LE16(seid);
46819d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
46829d26e4fcSRobert Mustacchi 
46839d26e4fcSRobert Mustacchi 	return status;
46849d26e4fcSRobert Mustacchi }
46859d26e4fcSRobert Mustacchi 
46869d26e4fcSRobert Mustacchi /**
46873d75a287SRobert Mustacchi  * i40e_aq_add_pvirt - Instantiate a Port Virtualizer on a port
46889d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
46899d26e4fcSRobert Mustacchi  * @flags: component flags
46909d26e4fcSRobert Mustacchi  * @mac_seid: uplink seid (MAC SEID)
46919d26e4fcSRobert Mustacchi  * @vsi_seid: connected vsi seid
46929d26e4fcSRobert Mustacchi  * @ret_seid: seid of create pv component
46939d26e4fcSRobert Mustacchi  *
46949d26e4fcSRobert Mustacchi  * This instantiates an i40e port virtualizer with specified flags.
46959d26e4fcSRobert Mustacchi  * Depending on specified flags the port virtualizer can act as a
46969d26e4fcSRobert Mustacchi  * 802.1Qbr port virtualizer or a 802.1Qbg S-component.
46979d26e4fcSRobert Mustacchi  */
i40e_aq_add_pvirt(struct i40e_hw * hw,u16 flags,u16 mac_seid,u16 vsi_seid,u16 * ret_seid)46989d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_add_pvirt(struct i40e_hw *hw, u16 flags,
46999d26e4fcSRobert Mustacchi 				       u16 mac_seid, u16 vsi_seid,
47009d26e4fcSRobert Mustacchi 				       u16 *ret_seid)
47019d26e4fcSRobert Mustacchi {
47029d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
47039d26e4fcSRobert Mustacchi 	struct i40e_aqc_add_update_pv *cmd =
47049d26e4fcSRobert Mustacchi 		(struct i40e_aqc_add_update_pv *)&desc.params.raw;
47059d26e4fcSRobert Mustacchi 	struct i40e_aqc_add_update_pv_completion *resp =
47069d26e4fcSRobert Mustacchi 		(struct i40e_aqc_add_update_pv_completion *)&desc.params.raw;
47079d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
47089d26e4fcSRobert Mustacchi 
47099d26e4fcSRobert Mustacchi 	if (vsi_seid == 0)
47109d26e4fcSRobert Mustacchi 		return I40E_ERR_PARAM;
47119d26e4fcSRobert Mustacchi 
47129d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_pv);
47139d26e4fcSRobert Mustacchi 	cmd->command_flags = CPU_TO_LE16(flags);
47149d26e4fcSRobert Mustacchi 	cmd->uplink_seid = CPU_TO_LE16(mac_seid);
47159d26e4fcSRobert Mustacchi 	cmd->connected_seid = CPU_TO_LE16(vsi_seid);
47169d26e4fcSRobert Mustacchi 
47179d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
47189d26e4fcSRobert Mustacchi 	if (!status && ret_seid)
47199d26e4fcSRobert Mustacchi 		*ret_seid = LE16_TO_CPU(resp->pv_seid);
47209d26e4fcSRobert Mustacchi 
47219d26e4fcSRobert Mustacchi 	return status;
47229d26e4fcSRobert Mustacchi }
47239d26e4fcSRobert Mustacchi 
47249d26e4fcSRobert Mustacchi /**
47259d26e4fcSRobert Mustacchi  * i40e_aq_add_tag - Add an S/E-tag
47269d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
47279d26e4fcSRobert Mustacchi  * @direct_to_queue: should s-tag direct flow to a specific queue
47289d26e4fcSRobert Mustacchi  * @vsi_seid: VSI SEID to use this tag
47299d26e4fcSRobert Mustacchi  * @tag: value of the tag
47309d26e4fcSRobert Mustacchi  * @queue_num: queue number, only valid is direct_to_queue is TRUE
47319d26e4fcSRobert Mustacchi  * @tags_used: return value, number of tags in use by this PF
47329d26e4fcSRobert Mustacchi  * @tags_free: return value, number of unallocated tags
47339d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
47349d26e4fcSRobert Mustacchi  *
47359d26e4fcSRobert Mustacchi  * This associates an S- or E-tag to a VSI in the switch complex.  It returns
47369d26e4fcSRobert Mustacchi  * the number of tags allocated by the PF, and the number of unallocated
47379d26e4fcSRobert Mustacchi  * tags available.
47389d26e4fcSRobert Mustacchi  **/
i40e_aq_add_tag(struct i40e_hw * hw,bool direct_to_queue,u16 vsi_seid,u16 tag,u16 queue_num,u16 * tags_used,u16 * tags_free,struct i40e_asq_cmd_details * cmd_details)47399d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_add_tag(struct i40e_hw *hw, bool direct_to_queue,
47409d26e4fcSRobert Mustacchi 				u16 vsi_seid, u16 tag, u16 queue_num,
47419d26e4fcSRobert Mustacchi 				u16 *tags_used, u16 *tags_free,
47429d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
47439d26e4fcSRobert Mustacchi {
47449d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
47459d26e4fcSRobert Mustacchi 	struct i40e_aqc_add_tag *cmd =
47469d26e4fcSRobert Mustacchi 		(struct i40e_aqc_add_tag *)&desc.params.raw;
47479d26e4fcSRobert Mustacchi 	struct i40e_aqc_add_remove_tag_completion *resp =
47489d26e4fcSRobert Mustacchi 		(struct i40e_aqc_add_remove_tag_completion *)&desc.params.raw;
47499d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
47509d26e4fcSRobert Mustacchi 
47519d26e4fcSRobert Mustacchi 	if (vsi_seid == 0)
47529d26e4fcSRobert Mustacchi 		return I40E_ERR_PARAM;
47539d26e4fcSRobert Mustacchi 
47549d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_tag);
47559d26e4fcSRobert Mustacchi 
47569d26e4fcSRobert Mustacchi 	cmd->seid = CPU_TO_LE16(vsi_seid);
47579d26e4fcSRobert Mustacchi 	cmd->tag = CPU_TO_LE16(tag);
47589d26e4fcSRobert Mustacchi 	if (direct_to_queue) {
47599d26e4fcSRobert Mustacchi 		cmd->flags = CPU_TO_LE16(I40E_AQC_ADD_TAG_FLAG_TO_QUEUE);
47609d26e4fcSRobert Mustacchi 		cmd->queue_number = CPU_TO_LE16(queue_num);
47619d26e4fcSRobert Mustacchi 	}
47629d26e4fcSRobert Mustacchi 
47639d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
47649d26e4fcSRobert Mustacchi 
47659d26e4fcSRobert Mustacchi 	if (!status) {
47669d26e4fcSRobert Mustacchi 		if (tags_used != NULL)
47679d26e4fcSRobert Mustacchi 			*tags_used = LE16_TO_CPU(resp->tags_used);
47689d26e4fcSRobert Mustacchi 		if (tags_free != NULL)
47699d26e4fcSRobert Mustacchi 			*tags_free = LE16_TO_CPU(resp->tags_free);
47709d26e4fcSRobert Mustacchi 	}
47719d26e4fcSRobert Mustacchi 
47729d26e4fcSRobert Mustacchi 	return status;
47739d26e4fcSRobert Mustacchi }
47749d26e4fcSRobert Mustacchi 
47759d26e4fcSRobert Mustacchi /**
47769d26e4fcSRobert Mustacchi  * i40e_aq_remove_tag - Remove an S- or E-tag
47779d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
47789d26e4fcSRobert Mustacchi  * @vsi_seid: VSI SEID this tag is associated with
47799d26e4fcSRobert Mustacchi  * @tag: value of the S-tag to delete
47809d26e4fcSRobert Mustacchi  * @tags_used: return value, number of tags in use by this PF
47819d26e4fcSRobert Mustacchi  * @tags_free: return value, number of unallocated tags
47829d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
47839d26e4fcSRobert Mustacchi  *
47849d26e4fcSRobert Mustacchi  * This deletes an S- or E-tag from a VSI in the switch complex.  It returns
47859d26e4fcSRobert Mustacchi  * the number of tags allocated by the PF, and the number of unallocated
47869d26e4fcSRobert Mustacchi  * tags available.
47879d26e4fcSRobert Mustacchi  **/
i40e_aq_remove_tag(struct i40e_hw * hw,u16 vsi_seid,u16 tag,u16 * tags_used,u16 * tags_free,struct i40e_asq_cmd_details * cmd_details)47889d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_remove_tag(struct i40e_hw *hw, u16 vsi_seid,
47899d26e4fcSRobert Mustacchi 				u16 tag, u16 *tags_used, u16 *tags_free,
47909d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
47919d26e4fcSRobert Mustacchi {
47929d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
47939d26e4fcSRobert Mustacchi 	struct i40e_aqc_remove_tag *cmd =
47949d26e4fcSRobert Mustacchi 		(struct i40e_aqc_remove_tag *)&desc.params.raw;
47959d26e4fcSRobert Mustacchi 	struct i40e_aqc_add_remove_tag_completion *resp =
47969d26e4fcSRobert Mustacchi 		(struct i40e_aqc_add_remove_tag_completion *)&desc.params.raw;
47979d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
47989d26e4fcSRobert Mustacchi 
47999d26e4fcSRobert Mustacchi 	if (vsi_seid == 0)
48009d26e4fcSRobert Mustacchi 		return I40E_ERR_PARAM;
48019d26e4fcSRobert Mustacchi 
48029d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_remove_tag);
48039d26e4fcSRobert Mustacchi 
48049d26e4fcSRobert Mustacchi 	cmd->seid = CPU_TO_LE16(vsi_seid);
48059d26e4fcSRobert Mustacchi 	cmd->tag = CPU_TO_LE16(tag);
48069d26e4fcSRobert Mustacchi 
48079d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
48089d26e4fcSRobert Mustacchi 
48099d26e4fcSRobert Mustacchi 	if (!status) {
48109d26e4fcSRobert Mustacchi 		if (tags_used != NULL)
48119d26e4fcSRobert Mustacchi 			*tags_used = LE16_TO_CPU(resp->tags_used);
48129d26e4fcSRobert Mustacchi 		if (tags_free != NULL)
48139d26e4fcSRobert Mustacchi 			*tags_free = LE16_TO_CPU(resp->tags_free);
48149d26e4fcSRobert Mustacchi 	}
48159d26e4fcSRobert Mustacchi 
48169d26e4fcSRobert Mustacchi 	return status;
48179d26e4fcSRobert Mustacchi }
48189d26e4fcSRobert Mustacchi 
48199d26e4fcSRobert Mustacchi /**
48209d26e4fcSRobert Mustacchi  * i40e_aq_add_mcast_etag - Add a multicast E-tag
48219d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
48229d26e4fcSRobert Mustacchi  * @pv_seid: Port Virtualizer of this SEID to associate E-tag with
48239d26e4fcSRobert Mustacchi  * @etag: value of E-tag to add
48249d26e4fcSRobert Mustacchi  * @num_tags_in_buf: number of unicast E-tags in indirect buffer
48259d26e4fcSRobert Mustacchi  * @buf: address of indirect buffer
48269d26e4fcSRobert Mustacchi  * @tags_used: return value, number of E-tags in use by this port
48279d26e4fcSRobert Mustacchi  * @tags_free: return value, number of unallocated M-tags
48289d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
48299d26e4fcSRobert Mustacchi  *
48309d26e4fcSRobert Mustacchi  * This associates a multicast E-tag to a port virtualizer.  It will return
48319d26e4fcSRobert Mustacchi  * the number of tags allocated by the PF, and the number of unallocated
48329d26e4fcSRobert Mustacchi  * tags available.
48339d26e4fcSRobert Mustacchi  *
48349d26e4fcSRobert Mustacchi  * The indirect buffer pointed to by buf is a list of 2-byte E-tags,
48359d26e4fcSRobert Mustacchi  * num_tags_in_buf long.
48369d26e4fcSRobert Mustacchi  **/
i40e_aq_add_mcast_etag(struct i40e_hw * hw,u16 pv_seid,u16 etag,u8 num_tags_in_buf,void * buf,u16 * tags_used,u16 * tags_free,struct i40e_asq_cmd_details * cmd_details)48379d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_add_mcast_etag(struct i40e_hw *hw, u16 pv_seid,
48389d26e4fcSRobert Mustacchi 				u16 etag, u8 num_tags_in_buf, void *buf,
48399d26e4fcSRobert Mustacchi 				u16 *tags_used, u16 *tags_free,
48409d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
48419d26e4fcSRobert Mustacchi {
48429d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
48439d26e4fcSRobert Mustacchi 	struct i40e_aqc_add_remove_mcast_etag *cmd =
48449d26e4fcSRobert Mustacchi 		(struct i40e_aqc_add_remove_mcast_etag *)&desc.params.raw;
48459d26e4fcSRobert Mustacchi 	struct i40e_aqc_add_remove_mcast_etag_completion *resp =
48469d26e4fcSRobert Mustacchi 	   (struct i40e_aqc_add_remove_mcast_etag_completion *)&desc.params.raw;
48479d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
48489d26e4fcSRobert Mustacchi 	u16 length = sizeof(u16) * num_tags_in_buf;
48499d26e4fcSRobert Mustacchi 
48509d26e4fcSRobert Mustacchi 	if ((pv_seid == 0) || (buf == NULL) || (num_tags_in_buf == 0))
48519d26e4fcSRobert Mustacchi 		return I40E_ERR_PARAM;
48529d26e4fcSRobert Mustacchi 
48539d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
48549d26e4fcSRobert Mustacchi 					  i40e_aqc_opc_add_multicast_etag);
48559d26e4fcSRobert Mustacchi 
48569d26e4fcSRobert Mustacchi 	cmd->pv_seid = CPU_TO_LE16(pv_seid);
48579d26e4fcSRobert Mustacchi 	cmd->etag = CPU_TO_LE16(etag);
48589d26e4fcSRobert Mustacchi 	cmd->num_unicast_etags = num_tags_in_buf;
48599d26e4fcSRobert Mustacchi 
48609d26e4fcSRobert Mustacchi 	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
48619d26e4fcSRobert Mustacchi 
48629d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, buf, length, cmd_details);
48639d26e4fcSRobert Mustacchi 
48649d26e4fcSRobert Mustacchi 	if (!status) {
48659d26e4fcSRobert Mustacchi 		if (tags_used != NULL)
48669d26e4fcSRobert Mustacchi 			*tags_used = LE16_TO_CPU(resp->mcast_etags_used);
48679d26e4fcSRobert Mustacchi 		if (tags_free != NULL)
48689d26e4fcSRobert Mustacchi 			*tags_free = LE16_TO_CPU(resp->mcast_etags_free);
48699d26e4fcSRobert Mustacchi 	}
48709d26e4fcSRobert Mustacchi 
48719d26e4fcSRobert Mustacchi 	return status;
48729d26e4fcSRobert Mustacchi }
48739d26e4fcSRobert Mustacchi 
48749d26e4fcSRobert Mustacchi /**
48759d26e4fcSRobert Mustacchi  * i40e_aq_remove_mcast_etag - Remove a multicast E-tag
48769d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
48779d26e4fcSRobert Mustacchi  * @pv_seid: Port Virtualizer SEID this M-tag is associated with
48789d26e4fcSRobert Mustacchi  * @etag: value of the E-tag to remove
48799d26e4fcSRobert Mustacchi  * @tags_used: return value, number of tags in use by this port
48809d26e4fcSRobert Mustacchi  * @tags_free: return value, number of unallocated tags
48819d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
48829d26e4fcSRobert Mustacchi  *
48839d26e4fcSRobert Mustacchi  * This deletes an E-tag from the port virtualizer.  It will return
48849d26e4fcSRobert Mustacchi  * the number of tags allocated by the port, and the number of unallocated
48859d26e4fcSRobert Mustacchi  * tags available.
48869d26e4fcSRobert Mustacchi  **/
i40e_aq_remove_mcast_etag(struct i40e_hw * hw,u16 pv_seid,u16 etag,u16 * tags_used,u16 * tags_free,struct i40e_asq_cmd_details * cmd_details)48879d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_remove_mcast_etag(struct i40e_hw *hw, u16 pv_seid,
48889d26e4fcSRobert Mustacchi 				u16 etag, u16 *tags_used, u16 *tags_free,
48899d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
48909d26e4fcSRobert Mustacchi {
48919d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
48929d26e4fcSRobert Mustacchi 	struct i40e_aqc_add_remove_mcast_etag *cmd =
48939d26e4fcSRobert Mustacchi 		(struct i40e_aqc_add_remove_mcast_etag *)&desc.params.raw;
48949d26e4fcSRobert Mustacchi 	struct i40e_aqc_add_remove_mcast_etag_completion *resp =
48959d26e4fcSRobert Mustacchi 	   (struct i40e_aqc_add_remove_mcast_etag_completion *)&desc.params.raw;
48969d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
48979d26e4fcSRobert Mustacchi 
48989d26e4fcSRobert Mustacchi 
48999d26e4fcSRobert Mustacchi 	if (pv_seid == 0)
49009d26e4fcSRobert Mustacchi 		return I40E_ERR_PARAM;
49019d26e4fcSRobert Mustacchi 
49029d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
49039d26e4fcSRobert Mustacchi 					  i40e_aqc_opc_remove_multicast_etag);
49049d26e4fcSRobert Mustacchi 
49059d26e4fcSRobert Mustacchi 	cmd->pv_seid = CPU_TO_LE16(pv_seid);
49069d26e4fcSRobert Mustacchi 	cmd->etag = CPU_TO_LE16(etag);
49079d26e4fcSRobert Mustacchi 
49089d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
49099d26e4fcSRobert Mustacchi 
49109d26e4fcSRobert Mustacchi 	if (!status) {
49119d26e4fcSRobert Mustacchi 		if (tags_used != NULL)
49129d26e4fcSRobert Mustacchi 			*tags_used = LE16_TO_CPU(resp->mcast_etags_used);
49139d26e4fcSRobert Mustacchi 		if (tags_free != NULL)
49149d26e4fcSRobert Mustacchi 			*tags_free = LE16_TO_CPU(resp->mcast_etags_free);
49159d26e4fcSRobert Mustacchi 	}
49169d26e4fcSRobert Mustacchi 
49179d26e4fcSRobert Mustacchi 	return status;
49189d26e4fcSRobert Mustacchi }
49199d26e4fcSRobert Mustacchi 
49209d26e4fcSRobert Mustacchi /**
49219d26e4fcSRobert Mustacchi  * i40e_aq_update_tag - Update an S/E-tag
49229d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
49239d26e4fcSRobert Mustacchi  * @vsi_seid: VSI SEID using this S-tag
49249d26e4fcSRobert Mustacchi  * @old_tag: old tag value
49259d26e4fcSRobert Mustacchi  * @new_tag: new tag value
49269d26e4fcSRobert Mustacchi  * @tags_used: return value, number of tags in use by this PF
49279d26e4fcSRobert Mustacchi  * @tags_free: return value, number of unallocated tags
49289d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
49299d26e4fcSRobert Mustacchi  *
49309d26e4fcSRobert Mustacchi  * This updates the value of the tag currently attached to this VSI
49319d26e4fcSRobert Mustacchi  * in the switch complex.  It will return the number of tags allocated
49329d26e4fcSRobert Mustacchi  * by the PF, and the number of unallocated tags available.
49339d26e4fcSRobert Mustacchi  **/
i40e_aq_update_tag(struct i40e_hw * hw,u16 vsi_seid,u16 old_tag,u16 new_tag,u16 * tags_used,u16 * tags_free,struct i40e_asq_cmd_details * cmd_details)49349d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_update_tag(struct i40e_hw *hw, u16 vsi_seid,
49359d26e4fcSRobert Mustacchi 				u16 old_tag, u16 new_tag, u16 *tags_used,
49369d26e4fcSRobert Mustacchi 				u16 *tags_free,
49379d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
49389d26e4fcSRobert Mustacchi {
49399d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
49409d26e4fcSRobert Mustacchi 	struct i40e_aqc_update_tag *cmd =
49419d26e4fcSRobert Mustacchi 		(struct i40e_aqc_update_tag *)&desc.params.raw;
49429d26e4fcSRobert Mustacchi 	struct i40e_aqc_update_tag_completion *resp =
49439d26e4fcSRobert Mustacchi 		(struct i40e_aqc_update_tag_completion *)&desc.params.raw;
49449d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
49459d26e4fcSRobert Mustacchi 
49469d26e4fcSRobert Mustacchi 	if (vsi_seid == 0)
49479d26e4fcSRobert Mustacchi 		return I40E_ERR_PARAM;
49489d26e4fcSRobert Mustacchi 
49499d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_update_tag);
49509d26e4fcSRobert Mustacchi 
49519d26e4fcSRobert Mustacchi 	cmd->seid = CPU_TO_LE16(vsi_seid);
49529d26e4fcSRobert Mustacchi 	cmd->old_tag = CPU_TO_LE16(old_tag);
49539d26e4fcSRobert Mustacchi 	cmd->new_tag = CPU_TO_LE16(new_tag);
49549d26e4fcSRobert Mustacchi 
49559d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
49569d26e4fcSRobert Mustacchi 
49579d26e4fcSRobert Mustacchi 	if (!status) {
49589d26e4fcSRobert Mustacchi 		if (tags_used != NULL)
49599d26e4fcSRobert Mustacchi 			*tags_used = LE16_TO_CPU(resp->tags_used);
49609d26e4fcSRobert Mustacchi 		if (tags_free != NULL)
49619d26e4fcSRobert Mustacchi 			*tags_free = LE16_TO_CPU(resp->tags_free);
49629d26e4fcSRobert Mustacchi 	}
49639d26e4fcSRobert Mustacchi 
49649d26e4fcSRobert Mustacchi 	return status;
49659d26e4fcSRobert Mustacchi }
49669d26e4fcSRobert Mustacchi 
49679d26e4fcSRobert Mustacchi /**
49689d26e4fcSRobert Mustacchi  * i40e_aq_dcb_ignore_pfc - Ignore PFC for given TCs
49699d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
49709d26e4fcSRobert Mustacchi  * @tcmap: TC map for request/release any ignore PFC condition
49719d26e4fcSRobert Mustacchi  * @request: request or release ignore PFC condition
49729d26e4fcSRobert Mustacchi  * @tcmap_ret: return TCs for which PFC is currently ignored
49739d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
49749d26e4fcSRobert Mustacchi  *
49759d26e4fcSRobert Mustacchi  * This sends out request/release to ignore PFC condition for a TC.
49769d26e4fcSRobert Mustacchi  * It will return the TCs for which PFC is currently ignored.
49779d26e4fcSRobert Mustacchi  **/
i40e_aq_dcb_ignore_pfc(struct i40e_hw * hw,u8 tcmap,bool request,u8 * tcmap_ret,struct i40e_asq_cmd_details * cmd_details)49789d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_dcb_ignore_pfc(struct i40e_hw *hw, u8 tcmap,
49799d26e4fcSRobert Mustacchi 				bool request, u8 *tcmap_ret,
49809d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
49819d26e4fcSRobert Mustacchi {
49829d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
49839d26e4fcSRobert Mustacchi 	struct i40e_aqc_pfc_ignore *cmd_resp =
49849d26e4fcSRobert Mustacchi 		(struct i40e_aqc_pfc_ignore *)&desc.params.raw;
49859d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
49869d26e4fcSRobert Mustacchi 
49879d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_dcb_ignore_pfc);
49889d26e4fcSRobert Mustacchi 
49899d26e4fcSRobert Mustacchi 	if (request)
49909d26e4fcSRobert Mustacchi 		cmd_resp->command_flags = I40E_AQC_PFC_IGNORE_SET;
49919d26e4fcSRobert Mustacchi 
49929d26e4fcSRobert Mustacchi 	cmd_resp->tc_bitmap = tcmap;
49939d26e4fcSRobert Mustacchi 
49949d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
49959d26e4fcSRobert Mustacchi 
49969d26e4fcSRobert Mustacchi 	if (!status) {
49979d26e4fcSRobert Mustacchi 		if (tcmap_ret != NULL)
49989d26e4fcSRobert Mustacchi 			*tcmap_ret = cmd_resp->tc_bitmap;
49999d26e4fcSRobert Mustacchi 	}
50009d26e4fcSRobert Mustacchi 
50019d26e4fcSRobert Mustacchi 	return status;
50029d26e4fcSRobert Mustacchi }
50039d26e4fcSRobert Mustacchi 
50049d26e4fcSRobert Mustacchi /**
50059d26e4fcSRobert Mustacchi  * i40e_aq_dcb_updated - DCB Updated Command
50069d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
50079d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
50089d26e4fcSRobert Mustacchi  *
50099d26e4fcSRobert Mustacchi  * When LLDP is handled in PF this command is used by the PF
50109d26e4fcSRobert Mustacchi  * to notify EMP that a DCB setting is modified.
50119d26e4fcSRobert Mustacchi  * When LLDP is handled in EMP this command is used by the PF
50129d26e4fcSRobert Mustacchi  * to notify EMP whenever one of the following parameters get
50139d26e4fcSRobert Mustacchi  * modified:
50149d26e4fcSRobert Mustacchi  *   - PFCLinkDelayAllowance in PRTDCB_GENC.PFCLDA
50159d26e4fcSRobert Mustacchi  *   - PCIRTT in PRTDCB_GENC.PCIRTT
50169d26e4fcSRobert Mustacchi  *   - Maximum Frame Size for non-FCoE TCs set by PRTDCB_TDPUC.MAX_TXFRAME.
50179d26e4fcSRobert Mustacchi  * EMP will return when the shared RPB settings have been
50189d26e4fcSRobert Mustacchi  * recomputed and modified. The retval field in the descriptor
50199d26e4fcSRobert Mustacchi  * will be set to 0 when RPB is modified.
50209d26e4fcSRobert Mustacchi  **/
i40e_aq_dcb_updated(struct i40e_hw * hw,struct i40e_asq_cmd_details * cmd_details)50219d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_dcb_updated(struct i40e_hw *hw,
50229d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
50239d26e4fcSRobert Mustacchi {
50249d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
50259d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
50269d26e4fcSRobert Mustacchi 
50279d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_dcb_updated);
50289d26e4fcSRobert Mustacchi 
50299d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
50309d26e4fcSRobert Mustacchi 
50319d26e4fcSRobert Mustacchi 	return status;
50329d26e4fcSRobert Mustacchi }
50339d26e4fcSRobert Mustacchi 
50349d26e4fcSRobert Mustacchi /**
50359d26e4fcSRobert Mustacchi  * i40e_aq_add_statistics - Add a statistics block to a VLAN in a switch.
50369d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
50379d26e4fcSRobert Mustacchi  * @seid: defines the SEID of the switch for which the stats are requested
50389d26e4fcSRobert Mustacchi  * @vlan_id: the VLAN ID for which the statistics are requested
50399d26e4fcSRobert Mustacchi  * @stat_index: index of the statistics counters block assigned to this VLAN
50409d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
50419d26e4fcSRobert Mustacchi  *
50429d26e4fcSRobert Mustacchi  * XL710 supports 128 smonVlanStats counters.This command is used to
50439d26e4fcSRobert Mustacchi  * allocate a set of smonVlanStats counters to a specific VLAN in a specific
50449d26e4fcSRobert Mustacchi  * switch.
50459d26e4fcSRobert Mustacchi  **/
i40e_aq_add_statistics(struct i40e_hw * hw,u16 seid,u16 vlan_id,u16 * stat_index,struct i40e_asq_cmd_details * cmd_details)50469d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_add_statistics(struct i40e_hw *hw, u16 seid,
50479d26e4fcSRobert Mustacchi 				u16 vlan_id, u16 *stat_index,
50489d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
50499d26e4fcSRobert Mustacchi {
50509d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
50519d26e4fcSRobert Mustacchi 	struct i40e_aqc_add_remove_statistics *cmd_resp =
50529d26e4fcSRobert Mustacchi 		(struct i40e_aqc_add_remove_statistics *)&desc.params.raw;
50539d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
50549d26e4fcSRobert Mustacchi 
50559d26e4fcSRobert Mustacchi 	if ((seid == 0) || (stat_index == NULL))
50569d26e4fcSRobert Mustacchi 		return I40E_ERR_PARAM;
50579d26e4fcSRobert Mustacchi 
50589d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_statistics);
50599d26e4fcSRobert Mustacchi 
50609d26e4fcSRobert Mustacchi 	cmd_resp->seid = CPU_TO_LE16(seid);
50619d26e4fcSRobert Mustacchi 	cmd_resp->vlan = CPU_TO_LE16(vlan_id);
50629d26e4fcSRobert Mustacchi 
50639d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
50649d26e4fcSRobert Mustacchi 
50659d26e4fcSRobert Mustacchi 	if (!status && stat_index)
50669d26e4fcSRobert Mustacchi 		*stat_index = LE16_TO_CPU(cmd_resp->stat_index);
50679d26e4fcSRobert Mustacchi 
50689d26e4fcSRobert Mustacchi 	return status;
50699d26e4fcSRobert Mustacchi }
50709d26e4fcSRobert Mustacchi 
50719d26e4fcSRobert Mustacchi /**
50729d26e4fcSRobert Mustacchi  * i40e_aq_remove_statistics - Remove a statistics block to a VLAN in a switch.
50739d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
50749d26e4fcSRobert Mustacchi  * @seid: defines the SEID of the switch for which the stats are requested
50759d26e4fcSRobert Mustacchi  * @vlan_id: the VLAN ID for which the statistics are requested
50769d26e4fcSRobert Mustacchi  * @stat_index: index of the statistics counters block assigned to this VLAN
50779d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
50789d26e4fcSRobert Mustacchi  *
50799d26e4fcSRobert Mustacchi  * XL710 supports 128 smonVlanStats counters.This command is used to
50809d26e4fcSRobert Mustacchi  * deallocate a set of smonVlanStats counters to a specific VLAN in a specific
50819d26e4fcSRobert Mustacchi  * switch.
50829d26e4fcSRobert Mustacchi  **/
i40e_aq_remove_statistics(struct i40e_hw * hw,u16 seid,u16 vlan_id,u16 stat_index,struct i40e_asq_cmd_details * cmd_details)50839d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_remove_statistics(struct i40e_hw *hw, u16 seid,
50849d26e4fcSRobert Mustacchi 				u16 vlan_id, u16 stat_index,
50859d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
50869d26e4fcSRobert Mustacchi {
50879d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
50889d26e4fcSRobert Mustacchi 	struct i40e_aqc_add_remove_statistics *cmd =
50899d26e4fcSRobert Mustacchi 		(struct i40e_aqc_add_remove_statistics *)&desc.params.raw;
50909d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
50919d26e4fcSRobert Mustacchi 
50929d26e4fcSRobert Mustacchi 	if (seid == 0)
50939d26e4fcSRobert Mustacchi 		return I40E_ERR_PARAM;
50949d26e4fcSRobert Mustacchi 
50959d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
50969d26e4fcSRobert Mustacchi 					  i40e_aqc_opc_remove_statistics);
50979d26e4fcSRobert Mustacchi 
50989d26e4fcSRobert Mustacchi 	cmd->seid = CPU_TO_LE16(seid);
50999d26e4fcSRobert Mustacchi 	cmd->vlan  = CPU_TO_LE16(vlan_id);
51009d26e4fcSRobert Mustacchi 	cmd->stat_index = CPU_TO_LE16(stat_index);
51019d26e4fcSRobert Mustacchi 
51029d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
51039d26e4fcSRobert Mustacchi 
51049d26e4fcSRobert Mustacchi 	return status;
51059d26e4fcSRobert Mustacchi }
51069d26e4fcSRobert Mustacchi 
51079d26e4fcSRobert Mustacchi /**
51089d26e4fcSRobert Mustacchi  * i40e_aq_set_port_parameters - set physical port parameters.
51099d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
51109d26e4fcSRobert Mustacchi  * @bad_frame_vsi: defines the VSI to which bad frames are forwarded
51119d26e4fcSRobert Mustacchi  * @save_bad_pac: if set packets with errors are forwarded to the bad frames VSI
51129d26e4fcSRobert Mustacchi  * @pad_short_pac: if set transmit packets smaller than 60 bytes are padded
51139d26e4fcSRobert Mustacchi  * @double_vlan: if set double VLAN is enabled
51149d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
51159d26e4fcSRobert Mustacchi  **/
i40e_aq_set_port_parameters(struct i40e_hw * hw,u16 bad_frame_vsi,bool save_bad_pac,bool pad_short_pac,bool double_vlan,struct i40e_asq_cmd_details * cmd_details)51169d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_set_port_parameters(struct i40e_hw *hw,
51179d26e4fcSRobert Mustacchi 				u16 bad_frame_vsi, bool save_bad_pac,
51189d26e4fcSRobert Mustacchi 				bool pad_short_pac, bool double_vlan,
51199d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
51209d26e4fcSRobert Mustacchi {
51219d26e4fcSRobert Mustacchi 	struct i40e_aqc_set_port_parameters *cmd;
51229d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
51239d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
51249d26e4fcSRobert Mustacchi 	u16 command_flags = 0;
51259d26e4fcSRobert Mustacchi 
51269d26e4fcSRobert Mustacchi 	cmd = (struct i40e_aqc_set_port_parameters *)&desc.params.raw;
51279d26e4fcSRobert Mustacchi 
51289d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
51299d26e4fcSRobert Mustacchi 					  i40e_aqc_opc_set_port_parameters);
51309d26e4fcSRobert Mustacchi 
51319d26e4fcSRobert Mustacchi 	cmd->bad_frame_vsi = CPU_TO_LE16(bad_frame_vsi);
51329d26e4fcSRobert Mustacchi 	if (save_bad_pac)
51339d26e4fcSRobert Mustacchi 		command_flags |= I40E_AQ_SET_P_PARAMS_SAVE_BAD_PACKETS;
51349d26e4fcSRobert Mustacchi 	if (pad_short_pac)
51359d26e4fcSRobert Mustacchi 		command_flags |= I40E_AQ_SET_P_PARAMS_PAD_SHORT_PACKETS;
51369d26e4fcSRobert Mustacchi 	if (double_vlan)
51379d26e4fcSRobert Mustacchi 		command_flags |= I40E_AQ_SET_P_PARAMS_DOUBLE_VLAN_ENA;
51389d26e4fcSRobert Mustacchi 	cmd->command_flags = CPU_TO_LE16(command_flags);
51399d26e4fcSRobert Mustacchi 
51409d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
51419d26e4fcSRobert Mustacchi 
51429d26e4fcSRobert Mustacchi 	return status;
51439d26e4fcSRobert Mustacchi }
51449d26e4fcSRobert Mustacchi 
51459d26e4fcSRobert Mustacchi /**
51469d26e4fcSRobert Mustacchi  * i40e_aq_tx_sched_cmd - generic Tx scheduler AQ command handler
51479d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
51489d26e4fcSRobert Mustacchi  * @seid: seid for the physical port/switching component/vsi
51499d26e4fcSRobert Mustacchi  * @buff: Indirect buffer to hold data parameters and response
51509d26e4fcSRobert Mustacchi  * @buff_size: Indirect buffer size
51519d26e4fcSRobert Mustacchi  * @opcode: Tx scheduler AQ command opcode
51529d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
51539d26e4fcSRobert Mustacchi  *
51549d26e4fcSRobert Mustacchi  * Generic command handler for Tx scheduler AQ commands
51559d26e4fcSRobert Mustacchi  **/
i40e_aq_tx_sched_cmd(struct i40e_hw * hw,u16 seid,void * buff,u16 buff_size,enum i40e_admin_queue_opc opcode,struct i40e_asq_cmd_details * cmd_details)51569d26e4fcSRobert Mustacchi static enum i40e_status_code i40e_aq_tx_sched_cmd(struct i40e_hw *hw, u16 seid,
51579d26e4fcSRobert Mustacchi 				void *buff, u16 buff_size,
51589d26e4fcSRobert Mustacchi 				 enum i40e_admin_queue_opc opcode,
51599d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
51609d26e4fcSRobert Mustacchi {
51619d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
51629d26e4fcSRobert Mustacchi 	struct i40e_aqc_tx_sched_ind *cmd =
51639d26e4fcSRobert Mustacchi 		(struct i40e_aqc_tx_sched_ind *)&desc.params.raw;
51649d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
51659d26e4fcSRobert Mustacchi 	bool cmd_param_flag = FALSE;
51669d26e4fcSRobert Mustacchi 
51679d26e4fcSRobert Mustacchi 	switch (opcode) {
51689d26e4fcSRobert Mustacchi 	case i40e_aqc_opc_configure_vsi_ets_sla_bw_limit:
51699d26e4fcSRobert Mustacchi 	case i40e_aqc_opc_configure_vsi_tc_bw:
51709d26e4fcSRobert Mustacchi 	case i40e_aqc_opc_enable_switching_comp_ets:
51719d26e4fcSRobert Mustacchi 	case i40e_aqc_opc_modify_switching_comp_ets:
51729d26e4fcSRobert Mustacchi 	case i40e_aqc_opc_disable_switching_comp_ets:
51739d26e4fcSRobert Mustacchi 	case i40e_aqc_opc_configure_switching_comp_ets_bw_limit:
51749d26e4fcSRobert Mustacchi 	case i40e_aqc_opc_configure_switching_comp_bw_config:
51759d26e4fcSRobert Mustacchi 		cmd_param_flag = TRUE;
51769d26e4fcSRobert Mustacchi 		break;
51779d26e4fcSRobert Mustacchi 	case i40e_aqc_opc_query_vsi_bw_config:
51789d26e4fcSRobert Mustacchi 	case i40e_aqc_opc_query_vsi_ets_sla_config:
51799d26e4fcSRobert Mustacchi 	case i40e_aqc_opc_query_switching_comp_ets_config:
51809d26e4fcSRobert Mustacchi 	case i40e_aqc_opc_query_port_ets_config:
51819d26e4fcSRobert Mustacchi 	case i40e_aqc_opc_query_switching_comp_bw_config:
51829d26e4fcSRobert Mustacchi 		cmd_param_flag = FALSE;
51839d26e4fcSRobert Mustacchi 		break;
51849d26e4fcSRobert Mustacchi 	default:
51859d26e4fcSRobert Mustacchi 		return I40E_ERR_PARAM;
51869d26e4fcSRobert Mustacchi 	}
51879d26e4fcSRobert Mustacchi 
51889d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, opcode);
51899d26e4fcSRobert Mustacchi 
51909d26e4fcSRobert Mustacchi 	/* Indirect command */
51919d26e4fcSRobert Mustacchi 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
51929d26e4fcSRobert Mustacchi 	if (cmd_param_flag)
51939d26e4fcSRobert Mustacchi 		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
51949d26e4fcSRobert Mustacchi 	if (buff_size > I40E_AQ_LARGE_BUF)
51959d26e4fcSRobert Mustacchi 		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
51969d26e4fcSRobert Mustacchi 
51979d26e4fcSRobert Mustacchi 	desc.datalen = CPU_TO_LE16(buff_size);
51989d26e4fcSRobert Mustacchi 
51999d26e4fcSRobert Mustacchi 	cmd->vsi_seid = CPU_TO_LE16(seid);
52009d26e4fcSRobert Mustacchi 
52019d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
52029d26e4fcSRobert Mustacchi 
52039d26e4fcSRobert Mustacchi 	return status;
52049d26e4fcSRobert Mustacchi }
52059d26e4fcSRobert Mustacchi 
52069d26e4fcSRobert Mustacchi /**
52079d26e4fcSRobert Mustacchi  * i40e_aq_config_vsi_bw_limit - Configure VSI BW Limit
52089d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
52099d26e4fcSRobert Mustacchi  * @seid: VSI seid
52109d26e4fcSRobert Mustacchi  * @credit: BW limit credits (0 = disabled)
52119d26e4fcSRobert Mustacchi  * @max_credit: Max BW limit credits
52129d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
52139d26e4fcSRobert Mustacchi  **/
i40e_aq_config_vsi_bw_limit(struct i40e_hw * hw,u16 seid,u16 credit,u8 max_credit,struct i40e_asq_cmd_details * cmd_details)52149d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_config_vsi_bw_limit(struct i40e_hw *hw,
52159d26e4fcSRobert Mustacchi 				u16 seid, u16 credit, u8 max_credit,
52169d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
52179d26e4fcSRobert Mustacchi {
52189d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
52199d26e4fcSRobert Mustacchi 	struct i40e_aqc_configure_vsi_bw_limit *cmd =
52209d26e4fcSRobert Mustacchi 		(struct i40e_aqc_configure_vsi_bw_limit *)&desc.params.raw;
52219d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
52229d26e4fcSRobert Mustacchi 
52239d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
52249d26e4fcSRobert Mustacchi 					  i40e_aqc_opc_configure_vsi_bw_limit);
52259d26e4fcSRobert Mustacchi 
52269d26e4fcSRobert Mustacchi 	cmd->vsi_seid = CPU_TO_LE16(seid);
52279d26e4fcSRobert Mustacchi 	cmd->credit = CPU_TO_LE16(credit);
52289d26e4fcSRobert Mustacchi 	cmd->max_credit = max_credit;
52299d26e4fcSRobert Mustacchi 
52309d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
52319d26e4fcSRobert Mustacchi 
52329d26e4fcSRobert Mustacchi 	return status;
52339d26e4fcSRobert Mustacchi }
52349d26e4fcSRobert Mustacchi 
52359d26e4fcSRobert Mustacchi /**
52369d26e4fcSRobert Mustacchi  * i40e_aq_config_switch_comp_bw_limit - Configure Switching component BW Limit
52379d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
52389d26e4fcSRobert Mustacchi  * @seid: switching component seid
52399d26e4fcSRobert Mustacchi  * @credit: BW limit credits (0 = disabled)
52409d26e4fcSRobert Mustacchi  * @max_bw: Max BW limit credits
52419d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
52429d26e4fcSRobert Mustacchi  **/
i40e_aq_config_switch_comp_bw_limit(struct i40e_hw * hw,u16 seid,u16 credit,u8 max_bw,struct i40e_asq_cmd_details * cmd_details)52439d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_config_switch_comp_bw_limit(struct i40e_hw *hw,
52449d26e4fcSRobert Mustacchi 				u16 seid, u16 credit, u8 max_bw,
52459d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
52469d26e4fcSRobert Mustacchi {
52479d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
52489d26e4fcSRobert Mustacchi 	struct i40e_aqc_configure_switching_comp_bw_limit *cmd =
52499d26e4fcSRobert Mustacchi 	  (struct i40e_aqc_configure_switching_comp_bw_limit *)&desc.params.raw;
52509d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
52519d26e4fcSRobert Mustacchi 
52529d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
52539d26e4fcSRobert Mustacchi 				i40e_aqc_opc_configure_switching_comp_bw_limit);
52549d26e4fcSRobert Mustacchi 
52559d26e4fcSRobert Mustacchi 	cmd->seid = CPU_TO_LE16(seid);
52569d26e4fcSRobert Mustacchi 	cmd->credit = CPU_TO_LE16(credit);
52579d26e4fcSRobert Mustacchi 	cmd->max_bw = max_bw;
52589d26e4fcSRobert Mustacchi 
52599d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
52609d26e4fcSRobert Mustacchi 
52619d26e4fcSRobert Mustacchi 	return status;
52629d26e4fcSRobert Mustacchi }
52639d26e4fcSRobert Mustacchi 
52649d26e4fcSRobert Mustacchi /**
52659d26e4fcSRobert Mustacchi  * i40e_aq_config_vsi_ets_sla_bw_limit - Config VSI BW Limit per TC
52669d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
52679d26e4fcSRobert Mustacchi  * @seid: VSI seid
52689d26e4fcSRobert Mustacchi  * @bw_data: Buffer holding enabled TCs, per TC BW limit/credits
52699d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
52709d26e4fcSRobert Mustacchi  **/
i40e_aq_config_vsi_ets_sla_bw_limit(struct i40e_hw * hw,u16 seid,struct i40e_aqc_configure_vsi_ets_sla_bw_data * bw_data,struct i40e_asq_cmd_details * cmd_details)52719d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_config_vsi_ets_sla_bw_limit(struct i40e_hw *hw,
52729d26e4fcSRobert Mustacchi 			u16 seid,
52739d26e4fcSRobert Mustacchi 			struct i40e_aqc_configure_vsi_ets_sla_bw_data *bw_data,
52749d26e4fcSRobert Mustacchi 			struct i40e_asq_cmd_details *cmd_details)
52759d26e4fcSRobert Mustacchi {
52769d26e4fcSRobert Mustacchi 	return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
52779d26e4fcSRobert Mustacchi 				    i40e_aqc_opc_configure_vsi_ets_sla_bw_limit,
52789d26e4fcSRobert Mustacchi 				    cmd_details);
52799d26e4fcSRobert Mustacchi }
52809d26e4fcSRobert Mustacchi 
52819d26e4fcSRobert Mustacchi /**
52829d26e4fcSRobert Mustacchi  * i40e_aq_config_vsi_tc_bw - Config VSI BW Allocation per TC
52839d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
52849d26e4fcSRobert Mustacchi  * @seid: VSI seid
52859d26e4fcSRobert Mustacchi  * @bw_data: Buffer holding enabled TCs, relative TC BW limit/credits
52869d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
52879d26e4fcSRobert Mustacchi  **/
i40e_aq_config_vsi_tc_bw(struct i40e_hw * hw,u16 seid,struct i40e_aqc_configure_vsi_tc_bw_data * bw_data,struct i40e_asq_cmd_details * cmd_details)52889d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_config_vsi_tc_bw(struct i40e_hw *hw,
52899d26e4fcSRobert Mustacchi 			u16 seid,
52909d26e4fcSRobert Mustacchi 			struct i40e_aqc_configure_vsi_tc_bw_data *bw_data,
52919d26e4fcSRobert Mustacchi 			struct i40e_asq_cmd_details *cmd_details)
52929d26e4fcSRobert Mustacchi {
52939d26e4fcSRobert Mustacchi 	return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
52949d26e4fcSRobert Mustacchi 				    i40e_aqc_opc_configure_vsi_tc_bw,
52959d26e4fcSRobert Mustacchi 				    cmd_details);
52969d26e4fcSRobert Mustacchi }
52979d26e4fcSRobert Mustacchi 
52989d26e4fcSRobert Mustacchi /**
52999d26e4fcSRobert Mustacchi  * i40e_aq_config_switch_comp_ets_bw_limit - Config Switch comp BW Limit per TC
53009d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
53019d26e4fcSRobert Mustacchi  * @seid: seid of the switching component
53029d26e4fcSRobert Mustacchi  * @bw_data: Buffer holding enabled TCs, per TC BW limit/credits
53039d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
53049d26e4fcSRobert Mustacchi  **/
i40e_aq_config_switch_comp_ets_bw_limit(struct i40e_hw * hw,u16 seid,struct i40e_aqc_configure_switching_comp_ets_bw_limit_data * bw_data,struct i40e_asq_cmd_details * cmd_details)53059d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_config_switch_comp_ets_bw_limit(
53069d26e4fcSRobert Mustacchi 	struct i40e_hw *hw, u16 seid,
53079d26e4fcSRobert Mustacchi 	struct i40e_aqc_configure_switching_comp_ets_bw_limit_data *bw_data,
53089d26e4fcSRobert Mustacchi 	struct i40e_asq_cmd_details *cmd_details)
53099d26e4fcSRobert Mustacchi {
53109d26e4fcSRobert Mustacchi 	return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
53119d26e4fcSRobert Mustacchi 			    i40e_aqc_opc_configure_switching_comp_ets_bw_limit,
53129d26e4fcSRobert Mustacchi 			    cmd_details);
53139d26e4fcSRobert Mustacchi }
53149d26e4fcSRobert Mustacchi 
53159d26e4fcSRobert Mustacchi /**
53169d26e4fcSRobert Mustacchi  * i40e_aq_query_vsi_bw_config - Query VSI BW configuration
53179d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
53189d26e4fcSRobert Mustacchi  * @seid: seid of the VSI
53199d26e4fcSRobert Mustacchi  * @bw_data: Buffer to hold VSI BW configuration
53209d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
53219d26e4fcSRobert Mustacchi  **/
i40e_aq_query_vsi_bw_config(struct i40e_hw * hw,u16 seid,struct i40e_aqc_query_vsi_bw_config_resp * bw_data,struct i40e_asq_cmd_details * cmd_details)53229d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_query_vsi_bw_config(struct i40e_hw *hw,
53239d26e4fcSRobert Mustacchi 			u16 seid,
53249d26e4fcSRobert Mustacchi 			struct i40e_aqc_query_vsi_bw_config_resp *bw_data,
53259d26e4fcSRobert Mustacchi 			struct i40e_asq_cmd_details *cmd_details)
53269d26e4fcSRobert Mustacchi {
53279d26e4fcSRobert Mustacchi 	return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
53289d26e4fcSRobert Mustacchi 				    i40e_aqc_opc_query_vsi_bw_config,
53299d26e4fcSRobert Mustacchi 				    cmd_details);
53309d26e4fcSRobert Mustacchi }
53319d26e4fcSRobert Mustacchi 
53329d26e4fcSRobert Mustacchi /**
53339d26e4fcSRobert Mustacchi  * i40e_aq_query_vsi_ets_sla_config - Query VSI BW configuration per TC
53349d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
53359d26e4fcSRobert Mustacchi  * @seid: seid of the VSI
53369d26e4fcSRobert Mustacchi  * @bw_data: Buffer to hold VSI BW configuration per TC
53379d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
53389d26e4fcSRobert Mustacchi  **/
i40e_aq_query_vsi_ets_sla_config(struct i40e_hw * hw,u16 seid,struct i40e_aqc_query_vsi_ets_sla_config_resp * bw_data,struct i40e_asq_cmd_details * cmd_details)53399d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_query_vsi_ets_sla_config(struct i40e_hw *hw,
53409d26e4fcSRobert Mustacchi 			u16 seid,
53419d26e4fcSRobert Mustacchi 			struct i40e_aqc_query_vsi_ets_sla_config_resp *bw_data,
53429d26e4fcSRobert Mustacchi 			struct i40e_asq_cmd_details *cmd_details)
53439d26e4fcSRobert Mustacchi {
53449d26e4fcSRobert Mustacchi 	return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
53459d26e4fcSRobert Mustacchi 				    i40e_aqc_opc_query_vsi_ets_sla_config,
53469d26e4fcSRobert Mustacchi 				    cmd_details);
53479d26e4fcSRobert Mustacchi }
53489d26e4fcSRobert Mustacchi 
53499d26e4fcSRobert Mustacchi /**
53509d26e4fcSRobert Mustacchi  * i40e_aq_query_switch_comp_ets_config - Query Switch comp BW config per TC
53519d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
53529d26e4fcSRobert Mustacchi  * @seid: seid of the switching component
53539d26e4fcSRobert Mustacchi  * @bw_data: Buffer to hold switching component's per TC BW config
53549d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
53559d26e4fcSRobert Mustacchi  **/
i40e_aq_query_switch_comp_ets_config(struct i40e_hw * hw,u16 seid,struct i40e_aqc_query_switching_comp_ets_config_resp * bw_data,struct i40e_asq_cmd_details * cmd_details)53569d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_query_switch_comp_ets_config(struct i40e_hw *hw,
53579d26e4fcSRobert Mustacchi 		u16 seid,
53589d26e4fcSRobert Mustacchi 		struct i40e_aqc_query_switching_comp_ets_config_resp *bw_data,
53599d26e4fcSRobert Mustacchi 		struct i40e_asq_cmd_details *cmd_details)
53609d26e4fcSRobert Mustacchi {
53619d26e4fcSRobert Mustacchi 	return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
53629d26e4fcSRobert Mustacchi 				   i40e_aqc_opc_query_switching_comp_ets_config,
53639d26e4fcSRobert Mustacchi 				   cmd_details);
53649d26e4fcSRobert Mustacchi }
53659d26e4fcSRobert Mustacchi 
53669d26e4fcSRobert Mustacchi /**
53679d26e4fcSRobert Mustacchi  * i40e_aq_query_port_ets_config - Query Physical Port ETS configuration
53689d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
53699d26e4fcSRobert Mustacchi  * @seid: seid of the VSI or switching component connected to Physical Port
53709d26e4fcSRobert Mustacchi  * @bw_data: Buffer to hold current ETS configuration for the Physical Port
53719d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
53729d26e4fcSRobert Mustacchi  **/
i40e_aq_query_port_ets_config(struct i40e_hw * hw,u16 seid,struct i40e_aqc_query_port_ets_config_resp * bw_data,struct i40e_asq_cmd_details * cmd_details)53739d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_query_port_ets_config(struct i40e_hw *hw,
53749d26e4fcSRobert Mustacchi 			u16 seid,
53759d26e4fcSRobert Mustacchi 			struct i40e_aqc_query_port_ets_config_resp *bw_data,
53769d26e4fcSRobert Mustacchi 			struct i40e_asq_cmd_details *cmd_details)
53779d26e4fcSRobert Mustacchi {
53789d26e4fcSRobert Mustacchi 	return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
53799d26e4fcSRobert Mustacchi 				    i40e_aqc_opc_query_port_ets_config,
53809d26e4fcSRobert Mustacchi 				    cmd_details);
53819d26e4fcSRobert Mustacchi }
53829d26e4fcSRobert Mustacchi 
53839d26e4fcSRobert Mustacchi /**
53849d26e4fcSRobert Mustacchi  * i40e_aq_query_switch_comp_bw_config - Query Switch comp BW configuration
53859d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
53869d26e4fcSRobert Mustacchi  * @seid: seid of the switching component
53879d26e4fcSRobert Mustacchi  * @bw_data: Buffer to hold switching component's BW configuration
53889d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
53899d26e4fcSRobert Mustacchi  **/
i40e_aq_query_switch_comp_bw_config(struct i40e_hw * hw,u16 seid,struct i40e_aqc_query_switching_comp_bw_config_resp * bw_data,struct i40e_asq_cmd_details * cmd_details)53909d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_query_switch_comp_bw_config(struct i40e_hw *hw,
53919d26e4fcSRobert Mustacchi 		u16 seid,
53929d26e4fcSRobert Mustacchi 		struct i40e_aqc_query_switching_comp_bw_config_resp *bw_data,
53939d26e4fcSRobert Mustacchi 		struct i40e_asq_cmd_details *cmd_details)
53949d26e4fcSRobert Mustacchi {
53959d26e4fcSRobert Mustacchi 	return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
53969d26e4fcSRobert Mustacchi 				    i40e_aqc_opc_query_switching_comp_bw_config,
53979d26e4fcSRobert Mustacchi 				    cmd_details);
53989d26e4fcSRobert Mustacchi }
53999d26e4fcSRobert Mustacchi 
54009d26e4fcSRobert Mustacchi /**
54019d26e4fcSRobert Mustacchi  * i40e_validate_filter_settings
54029d26e4fcSRobert Mustacchi  * @hw: pointer to the hardware structure
54039d26e4fcSRobert Mustacchi  * @settings: Filter control settings
54049d26e4fcSRobert Mustacchi  *
54059d26e4fcSRobert Mustacchi  * Check and validate the filter control settings passed.
54069d26e4fcSRobert Mustacchi  * The function checks for the valid filter/context sizes being
54079d26e4fcSRobert Mustacchi  * passed for FCoE and PE.
54089d26e4fcSRobert Mustacchi  *
54099d26e4fcSRobert Mustacchi  * Returns I40E_SUCCESS if the values passed are valid and within
54109d26e4fcSRobert Mustacchi  * range else returns an error.
54119d26e4fcSRobert Mustacchi  **/
i40e_validate_filter_settings(struct i40e_hw * hw,struct i40e_filter_control_settings * settings)54129d26e4fcSRobert Mustacchi static enum i40e_status_code i40e_validate_filter_settings(struct i40e_hw *hw,
54139d26e4fcSRobert Mustacchi 				struct i40e_filter_control_settings *settings)
54149d26e4fcSRobert Mustacchi {
54159d26e4fcSRobert Mustacchi 	u32 fcoe_cntx_size, fcoe_filt_size;
54169d26e4fcSRobert Mustacchi 	u32 pe_cntx_size, pe_filt_size;
54179d26e4fcSRobert Mustacchi 	u32 fcoe_fmax;
54189d26e4fcSRobert Mustacchi 
54199d26e4fcSRobert Mustacchi 	u32 val;
54209d26e4fcSRobert Mustacchi 
54219d26e4fcSRobert Mustacchi 	/* Validate FCoE settings passed */
54229d26e4fcSRobert Mustacchi 	switch (settings->fcoe_filt_num) {
54239d26e4fcSRobert Mustacchi 	case I40E_HASH_FILTER_SIZE_1K:
54249d26e4fcSRobert Mustacchi 	case I40E_HASH_FILTER_SIZE_2K:
54259d26e4fcSRobert Mustacchi 	case I40E_HASH_FILTER_SIZE_4K:
54269d26e4fcSRobert Mustacchi 	case I40E_HASH_FILTER_SIZE_8K:
54279d26e4fcSRobert Mustacchi 	case I40E_HASH_FILTER_SIZE_16K:
54289d26e4fcSRobert Mustacchi 	case I40E_HASH_FILTER_SIZE_32K:
54299d26e4fcSRobert Mustacchi 		fcoe_filt_size = I40E_HASH_FILTER_BASE_SIZE;
54309d26e4fcSRobert Mustacchi 		fcoe_filt_size <<= (u32)settings->fcoe_filt_num;
54319d26e4fcSRobert Mustacchi 		break;
54329d26e4fcSRobert Mustacchi 	default:
54339d26e4fcSRobert Mustacchi 		return I40E_ERR_PARAM;
54349d26e4fcSRobert Mustacchi 	}
54359d26e4fcSRobert Mustacchi 
54369d26e4fcSRobert Mustacchi 	switch (settings->fcoe_cntx_num) {
54379d26e4fcSRobert Mustacchi 	case I40E_DMA_CNTX_SIZE_512:
54389d26e4fcSRobert Mustacchi 	case I40E_DMA_CNTX_SIZE_1K:
54399d26e4fcSRobert Mustacchi 	case I40E_DMA_CNTX_SIZE_2K:
54409d26e4fcSRobert Mustacchi 	case I40E_DMA_CNTX_SIZE_4K:
54419d26e4fcSRobert Mustacchi 		fcoe_cntx_size = I40E_DMA_CNTX_BASE_SIZE;
54429d26e4fcSRobert Mustacchi 		fcoe_cntx_size <<= (u32)settings->fcoe_cntx_num;
54439d26e4fcSRobert Mustacchi 		break;
54449d26e4fcSRobert Mustacchi 	default:
54459d26e4fcSRobert Mustacchi 		return I40E_ERR_PARAM;
54469d26e4fcSRobert Mustacchi 	}
54479d26e4fcSRobert Mustacchi 
54489d26e4fcSRobert Mustacchi 	/* Validate PE settings passed */
54499d26e4fcSRobert Mustacchi 	switch (settings->pe_filt_num) {
54509d26e4fcSRobert Mustacchi 	case I40E_HASH_FILTER_SIZE_1K:
54519d26e4fcSRobert Mustacchi 	case I40E_HASH_FILTER_SIZE_2K:
54529d26e4fcSRobert Mustacchi 	case I40E_HASH_FILTER_SIZE_4K:
54539d26e4fcSRobert Mustacchi 	case I40E_HASH_FILTER_SIZE_8K:
54549d26e4fcSRobert Mustacchi 	case I40E_HASH_FILTER_SIZE_16K:
54559d26e4fcSRobert Mustacchi 	case I40E_HASH_FILTER_SIZE_32K:
54569d26e4fcSRobert Mustacchi 	case I40E_HASH_FILTER_SIZE_64K:
54579d26e4fcSRobert Mustacchi 	case I40E_HASH_FILTER_SIZE_128K:
54589d26e4fcSRobert Mustacchi 	case I40E_HASH_FILTER_SIZE_256K:
54599d26e4fcSRobert Mustacchi 	case I40E_HASH_FILTER_SIZE_512K:
54609d26e4fcSRobert Mustacchi 	case I40E_HASH_FILTER_SIZE_1M:
54619d26e4fcSRobert Mustacchi 		pe_filt_size = I40E_HASH_FILTER_BASE_SIZE;
54629d26e4fcSRobert Mustacchi 		pe_filt_size <<= (u32)settings->pe_filt_num;
54639d26e4fcSRobert Mustacchi 		break;
54649d26e4fcSRobert Mustacchi 	default:
54659d26e4fcSRobert Mustacchi 		return I40E_ERR_PARAM;
54669d26e4fcSRobert Mustacchi 	}
54679d26e4fcSRobert Mustacchi 
54689d26e4fcSRobert Mustacchi 	switch (settings->pe_cntx_num) {
54699d26e4fcSRobert Mustacchi 	case I40E_DMA_CNTX_SIZE_512:
54709d26e4fcSRobert Mustacchi 	case I40E_DMA_CNTX_SIZE_1K:
54719d26e4fcSRobert Mustacchi 	case I40E_DMA_CNTX_SIZE_2K:
54729d26e4fcSRobert Mustacchi 	case I40E_DMA_CNTX_SIZE_4K:
54739d26e4fcSRobert Mustacchi 	case I40E_DMA_CNTX_SIZE_8K:
54749d26e4fcSRobert Mustacchi 	case I40E_DMA_CNTX_SIZE_16K:
54759d26e4fcSRobert Mustacchi 	case I40E_DMA_CNTX_SIZE_32K:
54769d26e4fcSRobert Mustacchi 	case I40E_DMA_CNTX_SIZE_64K:
54779d26e4fcSRobert Mustacchi 	case I40E_DMA_CNTX_SIZE_128K:
54789d26e4fcSRobert Mustacchi 	case I40E_DMA_CNTX_SIZE_256K:
54799d26e4fcSRobert Mustacchi 		pe_cntx_size = I40E_DMA_CNTX_BASE_SIZE;
54809d26e4fcSRobert Mustacchi 		pe_cntx_size <<= (u32)settings->pe_cntx_num;
54819d26e4fcSRobert Mustacchi 		break;
54829d26e4fcSRobert Mustacchi 	default:
54839d26e4fcSRobert Mustacchi 		return I40E_ERR_PARAM;
54849d26e4fcSRobert Mustacchi 	}
54859d26e4fcSRobert Mustacchi 
54869d26e4fcSRobert Mustacchi 	/* FCHSIZE + FCDSIZE should not be greater than PMFCOEFMAX */
54879d26e4fcSRobert Mustacchi 	val = rd32(hw, I40E_GLHMC_FCOEFMAX);
54889d26e4fcSRobert Mustacchi 	fcoe_fmax = (val & I40E_GLHMC_FCOEFMAX_PMFCOEFMAX_MASK)
54899d26e4fcSRobert Mustacchi 		     >> I40E_GLHMC_FCOEFMAX_PMFCOEFMAX_SHIFT;
54909d26e4fcSRobert Mustacchi 	if (fcoe_filt_size + fcoe_cntx_size >  fcoe_fmax)
54919d26e4fcSRobert Mustacchi 		return I40E_ERR_INVALID_SIZE;
54929d26e4fcSRobert Mustacchi 
54939d26e4fcSRobert Mustacchi 	return I40E_SUCCESS;
54949d26e4fcSRobert Mustacchi }
54959d26e4fcSRobert Mustacchi 
54969d26e4fcSRobert Mustacchi /**
54979d26e4fcSRobert Mustacchi  * i40e_set_filter_control
54989d26e4fcSRobert Mustacchi  * @hw: pointer to the hardware structure
54999d26e4fcSRobert Mustacchi  * @settings: Filter control settings
55009d26e4fcSRobert Mustacchi  *
55019d26e4fcSRobert Mustacchi  * Set the Queue Filters for PE/FCoE and enable filters required
55029d26e4fcSRobert Mustacchi  * for a single PF. It is expected that these settings are programmed
55039d26e4fcSRobert Mustacchi  * at the driver initialization time.
55049d26e4fcSRobert Mustacchi  **/
i40e_set_filter_control(struct i40e_hw * hw,struct i40e_filter_control_settings * settings)55059d26e4fcSRobert Mustacchi enum i40e_status_code i40e_set_filter_control(struct i40e_hw *hw,
55069d26e4fcSRobert Mustacchi 				struct i40e_filter_control_settings *settings)
55079d26e4fcSRobert Mustacchi {
55089d26e4fcSRobert Mustacchi 	enum i40e_status_code ret = I40E_SUCCESS;
55099d26e4fcSRobert Mustacchi 	u32 hash_lut_size = 0;
55109d26e4fcSRobert Mustacchi 	u32 val;
55119d26e4fcSRobert Mustacchi 
55129d26e4fcSRobert Mustacchi 	if (!settings)
55139d26e4fcSRobert Mustacchi 		return I40E_ERR_PARAM;
55149d26e4fcSRobert Mustacchi 
55159d26e4fcSRobert Mustacchi 	/* Validate the input settings */
55169d26e4fcSRobert Mustacchi 	ret = i40e_validate_filter_settings(hw, settings);
55179d26e4fcSRobert Mustacchi 	if (ret)
55189d26e4fcSRobert Mustacchi 		return ret;
55199d26e4fcSRobert Mustacchi 
55209d26e4fcSRobert Mustacchi 	/* Read the PF Queue Filter control register */
55213d75a287SRobert Mustacchi 	val = i40e_read_rx_ctl(hw, I40E_PFQF_CTL_0);
55229d26e4fcSRobert Mustacchi 
55239d26e4fcSRobert Mustacchi 	/* Program required PE hash buckets for the PF */
55249d26e4fcSRobert Mustacchi 	val &= ~I40E_PFQF_CTL_0_PEHSIZE_MASK;
55259d26e4fcSRobert Mustacchi 	val |= ((u32)settings->pe_filt_num << I40E_PFQF_CTL_0_PEHSIZE_SHIFT) &
55269d26e4fcSRobert Mustacchi 		I40E_PFQF_CTL_0_PEHSIZE_MASK;
55279d26e4fcSRobert Mustacchi 	/* Program required PE contexts for the PF */
55289d26e4fcSRobert Mustacchi 	val &= ~I40E_PFQF_CTL_0_PEDSIZE_MASK;
55299d26e4fcSRobert Mustacchi 	val |= ((u32)settings->pe_cntx_num << I40E_PFQF_CTL_0_PEDSIZE_SHIFT) &
55309d26e4fcSRobert Mustacchi 		I40E_PFQF_CTL_0_PEDSIZE_MASK;
55319d26e4fcSRobert Mustacchi 
55329d26e4fcSRobert Mustacchi 	/* Program required FCoE hash buckets for the PF */
55339d26e4fcSRobert Mustacchi 	val &= ~I40E_PFQF_CTL_0_PFFCHSIZE_MASK;
55349d26e4fcSRobert Mustacchi 	val |= ((u32)settings->fcoe_filt_num <<
55359d26e4fcSRobert Mustacchi 			I40E_PFQF_CTL_0_PFFCHSIZE_SHIFT) &
55369d26e4fcSRobert Mustacchi 		I40E_PFQF_CTL_0_PFFCHSIZE_MASK;
55379d26e4fcSRobert Mustacchi 	/* Program required FCoE DDP contexts for the PF */
55389d26e4fcSRobert Mustacchi 	val &= ~I40E_PFQF_CTL_0_PFFCDSIZE_MASK;
55399d26e4fcSRobert Mustacchi 	val |= ((u32)settings->fcoe_cntx_num <<
55409d26e4fcSRobert Mustacchi 			I40E_PFQF_CTL_0_PFFCDSIZE_SHIFT) &
55419d26e4fcSRobert Mustacchi 		I40E_PFQF_CTL_0_PFFCDSIZE_MASK;
55429d26e4fcSRobert Mustacchi 
55439d26e4fcSRobert Mustacchi 	/* Program Hash LUT size for the PF */
55449d26e4fcSRobert Mustacchi 	val &= ~I40E_PFQF_CTL_0_HASHLUTSIZE_MASK;
55459d26e4fcSRobert Mustacchi 	if (settings->hash_lut_size == I40E_HASH_LUT_SIZE_512)
55469d26e4fcSRobert Mustacchi 		hash_lut_size = 1;
55479d26e4fcSRobert Mustacchi 	val |= (hash_lut_size << I40E_PFQF_CTL_0_HASHLUTSIZE_SHIFT) &
55489d26e4fcSRobert Mustacchi 		I40E_PFQF_CTL_0_HASHLUTSIZE_MASK;
55499d26e4fcSRobert Mustacchi 
55509d26e4fcSRobert Mustacchi 	/* Enable FDIR, Ethertype and MACVLAN filters for PF and VFs */
55519d26e4fcSRobert Mustacchi 	if (settings->enable_fdir)
55529d26e4fcSRobert Mustacchi 		val |= I40E_PFQF_CTL_0_FD_ENA_MASK;
55539d26e4fcSRobert Mustacchi 	if (settings->enable_ethtype)
55549d26e4fcSRobert Mustacchi 		val |= I40E_PFQF_CTL_0_ETYPE_ENA_MASK;
55559d26e4fcSRobert Mustacchi 	if (settings->enable_macvlan)
55569d26e4fcSRobert Mustacchi 		val |= I40E_PFQF_CTL_0_MACVLAN_ENA_MASK;
55579d26e4fcSRobert Mustacchi 
55583d75a287SRobert Mustacchi 	i40e_write_rx_ctl(hw, I40E_PFQF_CTL_0, val);
55599d26e4fcSRobert Mustacchi 
55609d26e4fcSRobert Mustacchi 	return I40E_SUCCESS;
55619d26e4fcSRobert Mustacchi }
55629d26e4fcSRobert Mustacchi 
55639d26e4fcSRobert Mustacchi /**
55649d26e4fcSRobert Mustacchi  * i40e_aq_add_rem_control_packet_filter - Add or Remove Control Packet Filter
55659d26e4fcSRobert Mustacchi  * @hw: pointer to the hw struct
55669d26e4fcSRobert Mustacchi  * @mac_addr: MAC address to use in the filter
55679d26e4fcSRobert Mustacchi  * @ethtype: Ethertype to use in the filter
55689d26e4fcSRobert Mustacchi  * @flags: Flags that needs to be applied to the filter
55699d26e4fcSRobert Mustacchi  * @vsi_seid: seid of the control VSI
55709d26e4fcSRobert Mustacchi  * @queue: VSI queue number to send the packet to
55719d26e4fcSRobert Mustacchi  * @is_add: Add control packet filter if True else remove
55729d26e4fcSRobert Mustacchi  * @stats: Structure to hold information on control filter counts
55739d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
55749d26e4fcSRobert Mustacchi  *
55759d26e4fcSRobert Mustacchi  * This command will Add or Remove control packet filter for a control VSI.
55769d26e4fcSRobert Mustacchi  * In return it will update the total number of perfect filter count in
55779d26e4fcSRobert Mustacchi  * the stats member.
55789d26e4fcSRobert Mustacchi  **/
i40e_aq_add_rem_control_packet_filter(struct i40e_hw * hw,u8 * mac_addr,u16 ethtype,u16 flags,u16 vsi_seid,u16 queue,bool is_add,struct i40e_control_filter_stats * stats,struct i40e_asq_cmd_details * cmd_details)55799d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_add_rem_control_packet_filter(struct i40e_hw *hw,
55809d26e4fcSRobert Mustacchi 				u8 *mac_addr, u16 ethtype, u16 flags,
55819d26e4fcSRobert Mustacchi 				u16 vsi_seid, u16 queue, bool is_add,
55829d26e4fcSRobert Mustacchi 				struct i40e_control_filter_stats *stats,
55839d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
55849d26e4fcSRobert Mustacchi {
55859d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
55869d26e4fcSRobert Mustacchi 	struct i40e_aqc_add_remove_control_packet_filter *cmd =
55879d26e4fcSRobert Mustacchi 		(struct i40e_aqc_add_remove_control_packet_filter *)
55889d26e4fcSRobert Mustacchi 		&desc.params.raw;
55899d26e4fcSRobert Mustacchi 	struct i40e_aqc_add_remove_control_packet_filter_completion *resp =
55909d26e4fcSRobert Mustacchi 		(struct i40e_aqc_add_remove_control_packet_filter_completion *)
55919d26e4fcSRobert Mustacchi 		&desc.params.raw;
55929d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
55939d26e4fcSRobert Mustacchi 
55949d26e4fcSRobert Mustacchi 	if (vsi_seid == 0)
55959d26e4fcSRobert Mustacchi 		return I40E_ERR_PARAM;
55969d26e4fcSRobert Mustacchi 
55979d26e4fcSRobert Mustacchi 	if (is_add) {
55989d26e4fcSRobert Mustacchi 		i40e_fill_default_direct_cmd_desc(&desc,
55999d26e4fcSRobert Mustacchi 				i40e_aqc_opc_add_control_packet_filter);
56009d26e4fcSRobert Mustacchi 		cmd->queue = CPU_TO_LE16(queue);
56019d26e4fcSRobert Mustacchi 	} else {
56029d26e4fcSRobert Mustacchi 		i40e_fill_default_direct_cmd_desc(&desc,
56039d26e4fcSRobert Mustacchi 				i40e_aqc_opc_remove_control_packet_filter);
56049d26e4fcSRobert Mustacchi 	}
56059d26e4fcSRobert Mustacchi 
56069d26e4fcSRobert Mustacchi 	if (mac_addr)
560793f1cac5SPaul Winder 		i40e_memcpy(cmd->mac, mac_addr, ETH_ALEN,
56089d26e4fcSRobert Mustacchi 			    I40E_NONDMA_TO_NONDMA);
56099d26e4fcSRobert Mustacchi 
56109d26e4fcSRobert Mustacchi 	cmd->etype = CPU_TO_LE16(ethtype);
56119d26e4fcSRobert Mustacchi 	cmd->flags = CPU_TO_LE16(flags);
56129d26e4fcSRobert Mustacchi 	cmd->seid = CPU_TO_LE16(vsi_seid);
56139d26e4fcSRobert Mustacchi 
56149d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
56159d26e4fcSRobert Mustacchi 
56169d26e4fcSRobert Mustacchi 	if (!status && stats) {
56179d26e4fcSRobert Mustacchi 		stats->mac_etype_used = LE16_TO_CPU(resp->mac_etype_used);
56189d26e4fcSRobert Mustacchi 		stats->etype_used = LE16_TO_CPU(resp->etype_used);
56199d26e4fcSRobert Mustacchi 		stats->mac_etype_free = LE16_TO_CPU(resp->mac_etype_free);
56209d26e4fcSRobert Mustacchi 		stats->etype_free = LE16_TO_CPU(resp->etype_free);
56219d26e4fcSRobert Mustacchi 	}
56229d26e4fcSRobert Mustacchi 
56239d26e4fcSRobert Mustacchi 	return status;
56249d26e4fcSRobert Mustacchi }
56259d26e4fcSRobert Mustacchi 
56263d75a287SRobert Mustacchi /**
56273d75a287SRobert Mustacchi  * i40e_add_filter_to_drop_tx_flow_control_frames- filter to drop flow control
56283d75a287SRobert Mustacchi  * @hw: pointer to the hw struct
56293d75a287SRobert Mustacchi  * @seid: VSI seid to add ethertype filter from
56303d75a287SRobert Mustacchi  **/
i40e_add_filter_to_drop_tx_flow_control_frames(struct i40e_hw * hw,u16 seid)56313d75a287SRobert Mustacchi void i40e_add_filter_to_drop_tx_flow_control_frames(struct i40e_hw *hw,
56323d75a287SRobert Mustacchi 						    u16 seid)
56333d75a287SRobert Mustacchi {
563493f1cac5SPaul Winder #define I40E_FLOW_CONTROL_ETHTYPE 0x8808
56353d75a287SRobert Mustacchi 	u16 flag = I40E_AQC_ADD_CONTROL_PACKET_FLAGS_IGNORE_MAC |
56363d75a287SRobert Mustacchi 		   I40E_AQC_ADD_CONTROL_PACKET_FLAGS_DROP |
56373d75a287SRobert Mustacchi 		   I40E_AQC_ADD_CONTROL_PACKET_FLAGS_TX;
56383d75a287SRobert Mustacchi 	u16 ethtype = I40E_FLOW_CONTROL_ETHTYPE;
56393d75a287SRobert Mustacchi 	enum i40e_status_code status;
56403d75a287SRobert Mustacchi 
56413d75a287SRobert Mustacchi 	status = i40e_aq_add_rem_control_packet_filter(hw, NULL, ethtype, flag,
56423d75a287SRobert Mustacchi 						       seid, 0, TRUE, NULL,
56433d75a287SRobert Mustacchi 						       NULL);
56443d75a287SRobert Mustacchi 	if (status)
56453d75a287SRobert Mustacchi 		DEBUGOUT("Ethtype Filter Add failed: Error pruning Tx flow control frames\n");
56463d75a287SRobert Mustacchi }
56473d75a287SRobert Mustacchi 
56483d75a287SRobert Mustacchi /**
56493d75a287SRobert Mustacchi  * i40e_fix_up_geneve_vni - adjust Geneve VNI for HW issue
56503d75a287SRobert Mustacchi  * @filters: list of cloud filters
56513d75a287SRobert Mustacchi  * @filter_count: length of list
56523d75a287SRobert Mustacchi  *
56533d75a287SRobert Mustacchi  * There's an issue in the device where the Geneve VNI layout needs
56543d75a287SRobert Mustacchi  * to be shifted 1 byte over from the VxLAN VNI
56553d75a287SRobert Mustacchi  **/
i40e_fix_up_geneve_vni(struct i40e_aqc_cloud_filters_element_data * filters,u8 filter_count)56563d75a287SRobert Mustacchi static void i40e_fix_up_geneve_vni(
5657*df36e06dSRobert Mustacchi 	struct i40e_aqc_cloud_filters_element_data *filters,
56583d75a287SRobert Mustacchi 	u8 filter_count)
56593d75a287SRobert Mustacchi {
5660*df36e06dSRobert Mustacchi 	struct i40e_aqc_cloud_filters_element_data *f = filters;
56613d75a287SRobert Mustacchi 	int i;
56623d75a287SRobert Mustacchi 
56633d75a287SRobert Mustacchi 	for (i = 0; i < filter_count; i++) {
56643d75a287SRobert Mustacchi 		u16 tnl_type;
56653d75a287SRobert Mustacchi 		u32 ti;
56663d75a287SRobert Mustacchi 
56673d75a287SRobert Mustacchi 		tnl_type = (LE16_TO_CPU(f[i].flags) &
56683d75a287SRobert Mustacchi 			   I40E_AQC_ADD_CLOUD_TNL_TYPE_MASK) >>
56693d75a287SRobert Mustacchi 			   I40E_AQC_ADD_CLOUD_TNL_TYPE_SHIFT;
56703d75a287SRobert Mustacchi 		if (tnl_type == I40E_AQC_ADD_CLOUD_TNL_TYPE_GENEVE) {
56713d75a287SRobert Mustacchi 			ti = LE32_TO_CPU(f[i].tenant_id);
56723d75a287SRobert Mustacchi 			f[i].tenant_id = CPU_TO_LE32(ti << 8);
56733d75a287SRobert Mustacchi 		}
56743d75a287SRobert Mustacchi 	}
56753d75a287SRobert Mustacchi }
56763d75a287SRobert Mustacchi 
56779d26e4fcSRobert Mustacchi /**
56789d26e4fcSRobert Mustacchi  * i40e_aq_add_cloud_filters
56799d26e4fcSRobert Mustacchi  * @hw: pointer to the hardware structure
56809d26e4fcSRobert Mustacchi  * @seid: VSI seid to add cloud filters from
56819d26e4fcSRobert Mustacchi  * @filters: Buffer which contains the filters to be added
56829d26e4fcSRobert Mustacchi  * @filter_count: number of filters contained in the buffer
56839d26e4fcSRobert Mustacchi  *
56849d26e4fcSRobert Mustacchi  * Set the cloud filters for a given VSI.  The contents of the
5685*df36e06dSRobert Mustacchi  * i40e_aqc_cloud_filters_element_data are filled
56869d26e4fcSRobert Mustacchi  * in by the caller of the function.
56879d26e4fcSRobert Mustacchi  *
56889d26e4fcSRobert Mustacchi  **/
i40e_aq_add_cloud_filters(struct i40e_hw * hw,u16 seid,struct i40e_aqc_cloud_filters_element_data * filters,u8 filter_count)56899d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_add_cloud_filters(struct i40e_hw *hw,
56909d26e4fcSRobert Mustacchi 	u16 seid,
5691*df36e06dSRobert Mustacchi 	struct i40e_aqc_cloud_filters_element_data *filters,
56929d26e4fcSRobert Mustacchi 	u8 filter_count)
56939d26e4fcSRobert Mustacchi {
56949d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
56959d26e4fcSRobert Mustacchi 	struct i40e_aqc_add_remove_cloud_filters *cmd =
56969d26e4fcSRobert Mustacchi 	(struct i40e_aqc_add_remove_cloud_filters *)&desc.params.raw;
56979d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
56983d75a287SRobert Mustacchi 	u16 buff_len;
56999d26e4fcSRobert Mustacchi 
57009d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
57019d26e4fcSRobert Mustacchi 					  i40e_aqc_opc_add_cloud_filters);
57029d26e4fcSRobert Mustacchi 
57039d26e4fcSRobert Mustacchi 	buff_len = filter_count * sizeof(*filters);
57049d26e4fcSRobert Mustacchi 	desc.datalen = CPU_TO_LE16(buff_len);
57059d26e4fcSRobert Mustacchi 	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
57069d26e4fcSRobert Mustacchi 	cmd->num_filters = filter_count;
57079d26e4fcSRobert Mustacchi 	cmd->seid = CPU_TO_LE16(seid);
57089d26e4fcSRobert Mustacchi 
57093d75a287SRobert Mustacchi 	i40e_fix_up_geneve_vni(filters, filter_count);
57103d75a287SRobert Mustacchi 
57119d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, filters, buff_len, NULL);
57129d26e4fcSRobert Mustacchi 
57139d26e4fcSRobert Mustacchi 	return status;
57149d26e4fcSRobert Mustacchi }
57159d26e4fcSRobert Mustacchi 
57169d26e4fcSRobert Mustacchi /**
5717*df36e06dSRobert Mustacchi  * i40e_aq_add_cloud_filters_bb
5718*df36e06dSRobert Mustacchi  * @hw: pointer to the hardware structure
5719*df36e06dSRobert Mustacchi  * @seid: VSI seid to add cloud filters from
5720*df36e06dSRobert Mustacchi  * @filters: Buffer which contains the filters in big buffer to be added
5721*df36e06dSRobert Mustacchi  * @filter_count: number of filters contained in the buffer
5722*df36e06dSRobert Mustacchi  *
5723*df36e06dSRobert Mustacchi  * Set the cloud filters for a given VSI.  The contents of the
5724*df36e06dSRobert Mustacchi  * i40e_aqc_cloud_filters_element_bb are filled in by the caller of the
5725*df36e06dSRobert Mustacchi  * the function.
5726*df36e06dSRobert Mustacchi  *
5727*df36e06dSRobert Mustacchi  **/
5728*df36e06dSRobert Mustacchi enum i40e_status_code
i40e_aq_add_cloud_filters_bb(struct i40e_hw * hw,u16 seid,struct i40e_aqc_cloud_filters_element_bb * filters,u8 filter_count)5729*df36e06dSRobert Mustacchi i40e_aq_add_cloud_filters_bb(struct i40e_hw *hw, u16 seid,
5730*df36e06dSRobert Mustacchi 			     struct i40e_aqc_cloud_filters_element_bb *filters,
5731*df36e06dSRobert Mustacchi 			     u8 filter_count)
5732*df36e06dSRobert Mustacchi {
5733*df36e06dSRobert Mustacchi 	struct i40e_aq_desc desc;
5734*df36e06dSRobert Mustacchi 	struct i40e_aqc_add_remove_cloud_filters *cmd =
5735*df36e06dSRobert Mustacchi 	(struct i40e_aqc_add_remove_cloud_filters *)&desc.params.raw;
5736*df36e06dSRobert Mustacchi 	enum i40e_status_code status;
5737*df36e06dSRobert Mustacchi 	u16 buff_len;
5738*df36e06dSRobert Mustacchi 	int i;
5739*df36e06dSRobert Mustacchi 
5740*df36e06dSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
5741*df36e06dSRobert Mustacchi 					  i40e_aqc_opc_add_cloud_filters);
5742*df36e06dSRobert Mustacchi 
5743*df36e06dSRobert Mustacchi 	buff_len = filter_count * sizeof(*filters);
5744*df36e06dSRobert Mustacchi 	desc.datalen = CPU_TO_LE16(buff_len);
5745*df36e06dSRobert Mustacchi 	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
5746*df36e06dSRobert Mustacchi 	cmd->num_filters = filter_count;
5747*df36e06dSRobert Mustacchi 	cmd->seid = CPU_TO_LE16(seid);
5748*df36e06dSRobert Mustacchi 	cmd->big_buffer_flag = I40E_AQC_ADD_CLOUD_CMD_BB;
5749*df36e06dSRobert Mustacchi 
5750*df36e06dSRobert Mustacchi 	for (i = 0; i < filter_count; i++) {
5751*df36e06dSRobert Mustacchi 		u16 tnl_type;
5752*df36e06dSRobert Mustacchi 		u32 ti;
5753*df36e06dSRobert Mustacchi 
5754*df36e06dSRobert Mustacchi 		tnl_type = (LE16_TO_CPU(filters[i].element.flags) &
5755*df36e06dSRobert Mustacchi 			   I40E_AQC_ADD_CLOUD_TNL_TYPE_MASK) >>
5756*df36e06dSRobert Mustacchi 			   I40E_AQC_ADD_CLOUD_TNL_TYPE_SHIFT;
5757*df36e06dSRobert Mustacchi 
5758*df36e06dSRobert Mustacchi 		/* Due to hardware eccentricities, the VNI for Geneve is shifted
5759*df36e06dSRobert Mustacchi 		 * one more byte further than normally used for Tenant ID in
5760*df36e06dSRobert Mustacchi 		 * other tunnel types.
5761*df36e06dSRobert Mustacchi 		 */
5762*df36e06dSRobert Mustacchi 		if (tnl_type == I40E_AQC_ADD_CLOUD_TNL_TYPE_GENEVE) {
5763*df36e06dSRobert Mustacchi 			ti = LE32_TO_CPU(filters[i].element.tenant_id);
5764*df36e06dSRobert Mustacchi 			filters[i].element.tenant_id = CPU_TO_LE32(ti << 8);
5765*df36e06dSRobert Mustacchi 		}
5766*df36e06dSRobert Mustacchi 	}
5767*df36e06dSRobert Mustacchi 
5768*df36e06dSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, filters, buff_len, NULL);
5769*df36e06dSRobert Mustacchi 
5770*df36e06dSRobert Mustacchi 	return status;
5771*df36e06dSRobert Mustacchi }
5772*df36e06dSRobert Mustacchi 
5773*df36e06dSRobert Mustacchi /**
5774*df36e06dSRobert Mustacchi  * i40e_aq_rem_cloud_filters
57759d26e4fcSRobert Mustacchi  * @hw: pointer to the hardware structure
57769d26e4fcSRobert Mustacchi  * @seid: VSI seid to remove cloud filters from
57779d26e4fcSRobert Mustacchi  * @filters: Buffer which contains the filters to be removed
57789d26e4fcSRobert Mustacchi  * @filter_count: number of filters contained in the buffer
57799d26e4fcSRobert Mustacchi  *
57809d26e4fcSRobert Mustacchi  * Remove the cloud filters for a given VSI.  The contents of the
5781*df36e06dSRobert Mustacchi  * i40e_aqc_cloud_filters_element_data are filled in by the caller
5782*df36e06dSRobert Mustacchi  * of the function.
57839d26e4fcSRobert Mustacchi  *
57849d26e4fcSRobert Mustacchi  **/
5785*df36e06dSRobert Mustacchi enum i40e_status_code
i40e_aq_rem_cloud_filters(struct i40e_hw * hw,u16 seid,struct i40e_aqc_cloud_filters_element_data * filters,u8 filter_count)5786*df36e06dSRobert Mustacchi i40e_aq_rem_cloud_filters(struct i40e_hw *hw, u16 seid,
5787*df36e06dSRobert Mustacchi 			  struct i40e_aqc_cloud_filters_element_data *filters,
5788*df36e06dSRobert Mustacchi 			  u8 filter_count)
57899d26e4fcSRobert Mustacchi {
57909d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
57919d26e4fcSRobert Mustacchi 	struct i40e_aqc_add_remove_cloud_filters *cmd =
57929d26e4fcSRobert Mustacchi 	(struct i40e_aqc_add_remove_cloud_filters *)&desc.params.raw;
57939d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
57949d26e4fcSRobert Mustacchi 	u16 buff_len;
57959d26e4fcSRobert Mustacchi 
57969d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
57979d26e4fcSRobert Mustacchi 					  i40e_aqc_opc_remove_cloud_filters);
57989d26e4fcSRobert Mustacchi 
57999d26e4fcSRobert Mustacchi 	buff_len = filter_count * sizeof(*filters);
58009d26e4fcSRobert Mustacchi 	desc.datalen = CPU_TO_LE16(buff_len);
58019d26e4fcSRobert Mustacchi 	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
58029d26e4fcSRobert Mustacchi 	cmd->num_filters = filter_count;
58039d26e4fcSRobert Mustacchi 	cmd->seid = CPU_TO_LE16(seid);
58049d26e4fcSRobert Mustacchi 
58053d75a287SRobert Mustacchi 	i40e_fix_up_geneve_vni(filters, filter_count);
58063d75a287SRobert Mustacchi 
58079d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, filters, buff_len, NULL);
58089d26e4fcSRobert Mustacchi 
58099d26e4fcSRobert Mustacchi 	return status;
58109d26e4fcSRobert Mustacchi }
58119d26e4fcSRobert Mustacchi 
5812*df36e06dSRobert Mustacchi /**
5813*df36e06dSRobert Mustacchi  * i40e_aq_rem_cloud_filters_bb
5814*df36e06dSRobert Mustacchi  * @hw: pointer to the hardware structure
5815*df36e06dSRobert Mustacchi  * @seid: VSI seid to remove cloud filters from
5816*df36e06dSRobert Mustacchi  * @filters: Buffer which contains the filters in big buffer to be removed
5817*df36e06dSRobert Mustacchi  * @filter_count: number of filters contained in the buffer
5818*df36e06dSRobert Mustacchi  *
5819*df36e06dSRobert Mustacchi  * Remove the big buffer cloud filters for a given VSI.  The contents of the
5820*df36e06dSRobert Mustacchi  * i40e_aqc_cloud_filters_element_bb are filled in by the caller of the
5821*df36e06dSRobert Mustacchi  * function.
5822*df36e06dSRobert Mustacchi  *
5823*df36e06dSRobert Mustacchi  **/
5824*df36e06dSRobert Mustacchi enum i40e_status_code
i40e_aq_rem_cloud_filters_bb(struct i40e_hw * hw,u16 seid,struct i40e_aqc_cloud_filters_element_bb * filters,u8 filter_count)5825*df36e06dSRobert Mustacchi i40e_aq_rem_cloud_filters_bb(struct i40e_hw *hw, u16 seid,
5826*df36e06dSRobert Mustacchi 			     struct i40e_aqc_cloud_filters_element_bb *filters,
5827*df36e06dSRobert Mustacchi 			     u8 filter_count)
5828*df36e06dSRobert Mustacchi {
5829*df36e06dSRobert Mustacchi 	struct i40e_aq_desc desc;
5830*df36e06dSRobert Mustacchi 	struct i40e_aqc_add_remove_cloud_filters *cmd =
5831*df36e06dSRobert Mustacchi 	(struct i40e_aqc_add_remove_cloud_filters *)&desc.params.raw;
5832*df36e06dSRobert Mustacchi 	enum i40e_status_code status;
5833*df36e06dSRobert Mustacchi 	u16 buff_len;
5834*df36e06dSRobert Mustacchi 	int i;
5835*df36e06dSRobert Mustacchi 
5836*df36e06dSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
5837*df36e06dSRobert Mustacchi 					  i40e_aqc_opc_remove_cloud_filters);
5838*df36e06dSRobert Mustacchi 
5839*df36e06dSRobert Mustacchi 	buff_len = filter_count * sizeof(*filters);
5840*df36e06dSRobert Mustacchi 	desc.datalen = CPU_TO_LE16(buff_len);
5841*df36e06dSRobert Mustacchi 	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
5842*df36e06dSRobert Mustacchi 	cmd->num_filters = filter_count;
5843*df36e06dSRobert Mustacchi 	cmd->seid = CPU_TO_LE16(seid);
5844*df36e06dSRobert Mustacchi 	cmd->big_buffer_flag = I40E_AQC_ADD_CLOUD_CMD_BB;
5845*df36e06dSRobert Mustacchi 
5846*df36e06dSRobert Mustacchi 	for (i = 0; i < filter_count; i++) {
5847*df36e06dSRobert Mustacchi 		u16 tnl_type;
5848*df36e06dSRobert Mustacchi 		u32 ti;
5849*df36e06dSRobert Mustacchi 
5850*df36e06dSRobert Mustacchi 		tnl_type = (LE16_TO_CPU(filters[i].element.flags) &
5851*df36e06dSRobert Mustacchi 			   I40E_AQC_ADD_CLOUD_TNL_TYPE_MASK) >>
5852*df36e06dSRobert Mustacchi 			   I40E_AQC_ADD_CLOUD_TNL_TYPE_SHIFT;
5853*df36e06dSRobert Mustacchi 
5854*df36e06dSRobert Mustacchi 		/* Due to hardware eccentricities, the VNI for Geneve is shifted
5855*df36e06dSRobert Mustacchi 		 * one more byte further than normally used for Tenant ID in
5856*df36e06dSRobert Mustacchi 		 * other tunnel types.
5857*df36e06dSRobert Mustacchi 		 */
5858*df36e06dSRobert Mustacchi 		if (tnl_type == I40E_AQC_ADD_CLOUD_TNL_TYPE_GENEVE) {
5859*df36e06dSRobert Mustacchi 			ti = LE32_TO_CPU(filters[i].element.tenant_id);
5860*df36e06dSRobert Mustacchi 			filters[i].element.tenant_id = CPU_TO_LE32(ti << 8);
5861*df36e06dSRobert Mustacchi 		}
5862*df36e06dSRobert Mustacchi 	}
5863*df36e06dSRobert Mustacchi 
5864*df36e06dSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, filters, buff_len, NULL);
5865*df36e06dSRobert Mustacchi 
5866*df36e06dSRobert Mustacchi 	return status;
5867*df36e06dSRobert Mustacchi }
5868*df36e06dSRobert Mustacchi 
5869*df36e06dSRobert Mustacchi /**
5870*df36e06dSRobert Mustacchi  * i40e_aq_replace_cloud_filters - Replace cloud filter command
5871*df36e06dSRobert Mustacchi  * @hw: pointer to the hw struct
5872*df36e06dSRobert Mustacchi  * @filters: pointer to the i40e_aqc_replace_cloud_filter_cmd struct
5873*df36e06dSRobert Mustacchi  * @cmd_buf: pointer to the i40e_aqc_replace_cloud_filter_cmd_buf struct
5874*df36e06dSRobert Mustacchi  *
5875*df36e06dSRobert Mustacchi  **/
5876*df36e06dSRobert Mustacchi enum
i40e_aq_replace_cloud_filters(struct i40e_hw * hw,struct i40e_aqc_replace_cloud_filters_cmd * filters,struct i40e_aqc_replace_cloud_filters_cmd_buf * cmd_buf)5877*df36e06dSRobert Mustacchi i40e_status_code i40e_aq_replace_cloud_filters(struct i40e_hw *hw,
5878*df36e06dSRobert Mustacchi 	struct i40e_aqc_replace_cloud_filters_cmd *filters,
5879*df36e06dSRobert Mustacchi 	struct i40e_aqc_replace_cloud_filters_cmd_buf *cmd_buf)
5880*df36e06dSRobert Mustacchi {
5881*df36e06dSRobert Mustacchi 	struct i40e_aq_desc desc;
5882*df36e06dSRobert Mustacchi 	struct i40e_aqc_replace_cloud_filters_cmd *cmd =
5883*df36e06dSRobert Mustacchi 		(struct i40e_aqc_replace_cloud_filters_cmd *)&desc.params.raw;
5884*df36e06dSRobert Mustacchi 	enum i40e_status_code status = I40E_SUCCESS;
5885*df36e06dSRobert Mustacchi 	int i = 0;
5886*df36e06dSRobert Mustacchi 
5887*df36e06dSRobert Mustacchi 	/* X722 doesn't support this command */
5888*df36e06dSRobert Mustacchi 	if (hw->mac.type == I40E_MAC_X722)
5889*df36e06dSRobert Mustacchi 		return I40E_ERR_DEVICE_NOT_SUPPORTED;
5890*df36e06dSRobert Mustacchi 
5891*df36e06dSRobert Mustacchi 	/* need FW version greater than 6.00 */
5892*df36e06dSRobert Mustacchi 	if (hw->aq.fw_maj_ver < 6)
5893*df36e06dSRobert Mustacchi 		return I40E_NOT_SUPPORTED;
5894*df36e06dSRobert Mustacchi 
5895*df36e06dSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
5896*df36e06dSRobert Mustacchi 					  i40e_aqc_opc_replace_cloud_filters);
5897*df36e06dSRobert Mustacchi 
5898*df36e06dSRobert Mustacchi 	desc.datalen = CPU_TO_LE16(32);
5899*df36e06dSRobert Mustacchi 	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
5900*df36e06dSRobert Mustacchi 	cmd->old_filter_type = filters->old_filter_type;
5901*df36e06dSRobert Mustacchi 	cmd->new_filter_type = filters->new_filter_type;
5902*df36e06dSRobert Mustacchi 	cmd->valid_flags = filters->valid_flags;
5903*df36e06dSRobert Mustacchi 	cmd->tr_bit = filters->tr_bit;
5904*df36e06dSRobert Mustacchi 	cmd->tr_bit2 = filters->tr_bit2;
5905*df36e06dSRobert Mustacchi 
5906*df36e06dSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, cmd_buf,
5907*df36e06dSRobert Mustacchi 		sizeof(struct i40e_aqc_replace_cloud_filters_cmd_buf),  NULL);
5908*df36e06dSRobert Mustacchi 
5909*df36e06dSRobert Mustacchi 	/* for get cloud filters command */
5910*df36e06dSRobert Mustacchi 	for (i = 0; i < 32; i += 4) {
5911*df36e06dSRobert Mustacchi 		cmd_buf->filters[i / 4].filter_type = cmd_buf->data[i];
5912*df36e06dSRobert Mustacchi 		cmd_buf->filters[i / 4].input[0] = cmd_buf->data[i + 1];
5913*df36e06dSRobert Mustacchi 		cmd_buf->filters[i / 4].input[1] = cmd_buf->data[i + 2];
5914*df36e06dSRobert Mustacchi 		cmd_buf->filters[i / 4].input[2] = cmd_buf->data[i + 3];
5915*df36e06dSRobert Mustacchi 	}
5916*df36e06dSRobert Mustacchi 
5917*df36e06dSRobert Mustacchi 	return status;
5918*df36e06dSRobert Mustacchi }
5919*df36e06dSRobert Mustacchi 
5920*df36e06dSRobert Mustacchi 
59219d26e4fcSRobert Mustacchi /**
59229d26e4fcSRobert Mustacchi  * i40e_aq_alternate_write
59239d26e4fcSRobert Mustacchi  * @hw: pointer to the hardware structure
59249d26e4fcSRobert Mustacchi  * @reg_addr0: address of first dword to be read
59259d26e4fcSRobert Mustacchi  * @reg_val0: value to be written under 'reg_addr0'
59269d26e4fcSRobert Mustacchi  * @reg_addr1: address of second dword to be read
59279d26e4fcSRobert Mustacchi  * @reg_val1: value to be written under 'reg_addr1'
59289d26e4fcSRobert Mustacchi  *
59299d26e4fcSRobert Mustacchi  * Write one or two dwords to alternate structure. Fields are indicated
59309d26e4fcSRobert Mustacchi  * by 'reg_addr0' and 'reg_addr1' register numbers.
59319d26e4fcSRobert Mustacchi  *
59329d26e4fcSRobert Mustacchi  **/
i40e_aq_alternate_write(struct i40e_hw * hw,u32 reg_addr0,u32 reg_val0,u32 reg_addr1,u32 reg_val1)59339d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_alternate_write(struct i40e_hw *hw,
59349d26e4fcSRobert Mustacchi 				u32 reg_addr0, u32 reg_val0,
59359d26e4fcSRobert Mustacchi 				u32 reg_addr1, u32 reg_val1)
59369d26e4fcSRobert Mustacchi {
59379d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
59389d26e4fcSRobert Mustacchi 	struct i40e_aqc_alternate_write *cmd_resp =
59399d26e4fcSRobert Mustacchi 		(struct i40e_aqc_alternate_write *)&desc.params.raw;
59409d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
59419d26e4fcSRobert Mustacchi 
59429d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_alternate_write);
59439d26e4fcSRobert Mustacchi 	cmd_resp->address0 = CPU_TO_LE32(reg_addr0);
59449d26e4fcSRobert Mustacchi 	cmd_resp->address1 = CPU_TO_LE32(reg_addr1);
59459d26e4fcSRobert Mustacchi 	cmd_resp->data0 = CPU_TO_LE32(reg_val0);
59469d26e4fcSRobert Mustacchi 	cmd_resp->data1 = CPU_TO_LE32(reg_val1);
59479d26e4fcSRobert Mustacchi 
59489d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
59499d26e4fcSRobert Mustacchi 
59509d26e4fcSRobert Mustacchi 	return status;
59519d26e4fcSRobert Mustacchi }
59529d26e4fcSRobert Mustacchi 
59539d26e4fcSRobert Mustacchi /**
59549d26e4fcSRobert Mustacchi  * i40e_aq_alternate_write_indirect
59559d26e4fcSRobert Mustacchi  * @hw: pointer to the hardware structure
59569d26e4fcSRobert Mustacchi  * @addr: address of a first register to be modified
59579d26e4fcSRobert Mustacchi  * @dw_count: number of alternate structure fields to write
59589d26e4fcSRobert Mustacchi  * @buffer: pointer to the command buffer
59599d26e4fcSRobert Mustacchi  *
59609d26e4fcSRobert Mustacchi  * Write 'dw_count' dwords from 'buffer' to alternate structure
59619d26e4fcSRobert Mustacchi  * starting at 'addr'.
59629d26e4fcSRobert Mustacchi  *
59639d26e4fcSRobert Mustacchi  **/
i40e_aq_alternate_write_indirect(struct i40e_hw * hw,u32 addr,u32 dw_count,void * buffer)59649d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_alternate_write_indirect(struct i40e_hw *hw,
59659d26e4fcSRobert Mustacchi 				u32 addr, u32 dw_count, void *buffer)
59669d26e4fcSRobert Mustacchi {
59679d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
59689d26e4fcSRobert Mustacchi 	struct i40e_aqc_alternate_ind_write *cmd_resp =
59699d26e4fcSRobert Mustacchi 		(struct i40e_aqc_alternate_ind_write *)&desc.params.raw;
59709d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
59719d26e4fcSRobert Mustacchi 
59729d26e4fcSRobert Mustacchi 	if (buffer == NULL)
59739d26e4fcSRobert Mustacchi 		return I40E_ERR_PARAM;
59749d26e4fcSRobert Mustacchi 
59759d26e4fcSRobert Mustacchi 	/* Indirect command */
59769d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
59779d26e4fcSRobert Mustacchi 					 i40e_aqc_opc_alternate_write_indirect);
59789d26e4fcSRobert Mustacchi 
59799d26e4fcSRobert Mustacchi 	desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_RD);
59809d26e4fcSRobert Mustacchi 	desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF);
59819d26e4fcSRobert Mustacchi 	if (dw_count > (I40E_AQ_LARGE_BUF/4))
59829d26e4fcSRobert Mustacchi 		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
59839d26e4fcSRobert Mustacchi 
59849d26e4fcSRobert Mustacchi 	cmd_resp->address = CPU_TO_LE32(addr);
59859d26e4fcSRobert Mustacchi 	cmd_resp->length = CPU_TO_LE32(dw_count);
59869d26e4fcSRobert Mustacchi 
59879d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, buffer,
59889d26e4fcSRobert Mustacchi 				       I40E_LO_DWORD(4*dw_count), NULL);
59899d26e4fcSRobert Mustacchi 
59909d26e4fcSRobert Mustacchi 	return status;
59919d26e4fcSRobert Mustacchi }
59929d26e4fcSRobert Mustacchi 
59939d26e4fcSRobert Mustacchi /**
59949d26e4fcSRobert Mustacchi  * i40e_aq_alternate_read
59959d26e4fcSRobert Mustacchi  * @hw: pointer to the hardware structure
59969d26e4fcSRobert Mustacchi  * @reg_addr0: address of first dword to be read
59979d26e4fcSRobert Mustacchi  * @reg_val0: pointer for data read from 'reg_addr0'
59989d26e4fcSRobert Mustacchi  * @reg_addr1: address of second dword to be read
59999d26e4fcSRobert Mustacchi  * @reg_val1: pointer for data read from 'reg_addr1'
60009d26e4fcSRobert Mustacchi  *
60019d26e4fcSRobert Mustacchi  * Read one or two dwords from alternate structure. Fields are indicated
60029d26e4fcSRobert Mustacchi  * by 'reg_addr0' and 'reg_addr1' register numbers. If 'reg_val1' pointer
60039d26e4fcSRobert Mustacchi  * is not passed then only register at 'reg_addr0' is read.
60049d26e4fcSRobert Mustacchi  *
60059d26e4fcSRobert Mustacchi  **/
i40e_aq_alternate_read(struct i40e_hw * hw,u32 reg_addr0,u32 * reg_val0,u32 reg_addr1,u32 * reg_val1)60069d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_alternate_read(struct i40e_hw *hw,
60079d26e4fcSRobert Mustacchi 				u32 reg_addr0, u32 *reg_val0,
60089d26e4fcSRobert Mustacchi 				u32 reg_addr1, u32 *reg_val1)
60099d26e4fcSRobert Mustacchi {
60109d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
60119d26e4fcSRobert Mustacchi 	struct i40e_aqc_alternate_write *cmd_resp =
60129d26e4fcSRobert Mustacchi 		(struct i40e_aqc_alternate_write *)&desc.params.raw;
60139d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
60149d26e4fcSRobert Mustacchi 
60159d26e4fcSRobert Mustacchi 	if (reg_val0 == NULL)
60169d26e4fcSRobert Mustacchi 		return I40E_ERR_PARAM;
60179d26e4fcSRobert Mustacchi 
60189d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_alternate_read);
60199d26e4fcSRobert Mustacchi 	cmd_resp->address0 = CPU_TO_LE32(reg_addr0);
60209d26e4fcSRobert Mustacchi 	cmd_resp->address1 = CPU_TO_LE32(reg_addr1);
60219d26e4fcSRobert Mustacchi 
60229d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
60239d26e4fcSRobert Mustacchi 
60249d26e4fcSRobert Mustacchi 	if (status == I40E_SUCCESS) {
60259d26e4fcSRobert Mustacchi 		*reg_val0 = LE32_TO_CPU(cmd_resp->data0);
60269d26e4fcSRobert Mustacchi 
60279d26e4fcSRobert Mustacchi 		if (reg_val1 != NULL)
60289d26e4fcSRobert Mustacchi 			*reg_val1 = LE32_TO_CPU(cmd_resp->data1);
60299d26e4fcSRobert Mustacchi 	}
60309d26e4fcSRobert Mustacchi 
60319d26e4fcSRobert Mustacchi 	return status;
60329d26e4fcSRobert Mustacchi }
60339d26e4fcSRobert Mustacchi 
60349d26e4fcSRobert Mustacchi /**
60359d26e4fcSRobert Mustacchi  * i40e_aq_alternate_read_indirect
60369d26e4fcSRobert Mustacchi  * @hw: pointer to the hardware structure
60379d26e4fcSRobert Mustacchi  * @addr: address of the alternate structure field
60389d26e4fcSRobert Mustacchi  * @dw_count: number of alternate structure fields to read
60399d26e4fcSRobert Mustacchi  * @buffer: pointer to the command buffer
60409d26e4fcSRobert Mustacchi  *
60419d26e4fcSRobert Mustacchi  * Read 'dw_count' dwords from alternate structure starting at 'addr' and
60429d26e4fcSRobert Mustacchi  * place them in 'buffer'. The buffer should be allocated by caller.
60439d26e4fcSRobert Mustacchi  *
60449d26e4fcSRobert Mustacchi  **/
i40e_aq_alternate_read_indirect(struct i40e_hw * hw,u32 addr,u32 dw_count,void * buffer)60459d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_alternate_read_indirect(struct i40e_hw *hw,
60469d26e4fcSRobert Mustacchi 				u32 addr, u32 dw_count, void *buffer)
60479d26e4fcSRobert Mustacchi {
60489d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
60499d26e4fcSRobert Mustacchi 	struct i40e_aqc_alternate_ind_write *cmd_resp =
60509d26e4fcSRobert Mustacchi 		(struct i40e_aqc_alternate_ind_write *)&desc.params.raw;
60519d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
60529d26e4fcSRobert Mustacchi 
60539d26e4fcSRobert Mustacchi 	if (buffer == NULL)
60549d26e4fcSRobert Mustacchi 		return I40E_ERR_PARAM;
60559d26e4fcSRobert Mustacchi 
60569d26e4fcSRobert Mustacchi 	/* Indirect command */
60579d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
60589d26e4fcSRobert Mustacchi 		i40e_aqc_opc_alternate_read_indirect);
60599d26e4fcSRobert Mustacchi 
60609d26e4fcSRobert Mustacchi 	desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_RD);
60619d26e4fcSRobert Mustacchi 	desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF);
60629d26e4fcSRobert Mustacchi 	if (dw_count > (I40E_AQ_LARGE_BUF/4))
60639d26e4fcSRobert Mustacchi 		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
60649d26e4fcSRobert Mustacchi 
60659d26e4fcSRobert Mustacchi 	cmd_resp->address = CPU_TO_LE32(addr);
60669d26e4fcSRobert Mustacchi 	cmd_resp->length = CPU_TO_LE32(dw_count);
60679d26e4fcSRobert Mustacchi 
60689d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, buffer,
60699d26e4fcSRobert Mustacchi 				       I40E_LO_DWORD(4*dw_count), NULL);
60709d26e4fcSRobert Mustacchi 
60719d26e4fcSRobert Mustacchi 	return status;
60729d26e4fcSRobert Mustacchi }
60739d26e4fcSRobert Mustacchi 
60749d26e4fcSRobert Mustacchi /**
60759d26e4fcSRobert Mustacchi  *  i40e_aq_alternate_clear
60769d26e4fcSRobert Mustacchi  *  @hw: pointer to the HW structure.
60779d26e4fcSRobert Mustacchi  *
60789d26e4fcSRobert Mustacchi  *  Clear the alternate structures of the port from which the function
60799d26e4fcSRobert Mustacchi  *  is called.
60809d26e4fcSRobert Mustacchi  *
60819d26e4fcSRobert Mustacchi  **/
i40e_aq_alternate_clear(struct i40e_hw * hw)60829d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_alternate_clear(struct i40e_hw *hw)
60839d26e4fcSRobert Mustacchi {
60849d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
60859d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
60869d26e4fcSRobert Mustacchi 
60879d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
60889d26e4fcSRobert Mustacchi 					  i40e_aqc_opc_alternate_clear_port);
60899d26e4fcSRobert Mustacchi 
60909d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
60919d26e4fcSRobert Mustacchi 
60929d26e4fcSRobert Mustacchi 	return status;
60939d26e4fcSRobert Mustacchi }
60949d26e4fcSRobert Mustacchi 
60959d26e4fcSRobert Mustacchi /**
60969d26e4fcSRobert Mustacchi  *  i40e_aq_alternate_write_done
60979d26e4fcSRobert Mustacchi  *  @hw: pointer to the HW structure.
60989d26e4fcSRobert Mustacchi  *  @bios_mode: indicates whether the command is executed by UEFI or legacy BIOS
60999d26e4fcSRobert Mustacchi  *  @reset_needed: indicates the SW should trigger GLOBAL reset
61009d26e4fcSRobert Mustacchi  *
61019d26e4fcSRobert Mustacchi  *  Indicates to the FW that alternate structures have been changed.
61029d26e4fcSRobert Mustacchi  *
61039d26e4fcSRobert Mustacchi  **/
i40e_aq_alternate_write_done(struct i40e_hw * hw,u8 bios_mode,bool * reset_needed)61049d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_alternate_write_done(struct i40e_hw *hw,
61059d26e4fcSRobert Mustacchi 		u8 bios_mode, bool *reset_needed)
61069d26e4fcSRobert Mustacchi {
61079d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
61089d26e4fcSRobert Mustacchi 	struct i40e_aqc_alternate_write_done *cmd =
61099d26e4fcSRobert Mustacchi 		(struct i40e_aqc_alternate_write_done *)&desc.params.raw;
61109d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
61119d26e4fcSRobert Mustacchi 
61129d26e4fcSRobert Mustacchi 	if (reset_needed == NULL)
61139d26e4fcSRobert Mustacchi 		return I40E_ERR_PARAM;
61149d26e4fcSRobert Mustacchi 
61159d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
61169d26e4fcSRobert Mustacchi 					  i40e_aqc_opc_alternate_write_done);
61179d26e4fcSRobert Mustacchi 
61189d26e4fcSRobert Mustacchi 	cmd->cmd_flags = CPU_TO_LE16(bios_mode);
61199d26e4fcSRobert Mustacchi 
61209d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
61219d26e4fcSRobert Mustacchi 	if (!status && reset_needed)
61229d26e4fcSRobert Mustacchi 		*reset_needed = ((LE16_TO_CPU(cmd->cmd_flags) &
61239d26e4fcSRobert Mustacchi 				 I40E_AQ_ALTERNATE_RESET_NEEDED) != 0);
61249d26e4fcSRobert Mustacchi 
61259d26e4fcSRobert Mustacchi 	return status;
61269d26e4fcSRobert Mustacchi }
61279d26e4fcSRobert Mustacchi 
61289d26e4fcSRobert Mustacchi /**
61299d26e4fcSRobert Mustacchi  *  i40e_aq_set_oem_mode
61309d26e4fcSRobert Mustacchi  *  @hw: pointer to the HW structure.
61319d26e4fcSRobert Mustacchi  *  @oem_mode: the OEM mode to be used
61329d26e4fcSRobert Mustacchi  *
61339d26e4fcSRobert Mustacchi  *  Sets the device to a specific operating mode. Currently the only supported
61349d26e4fcSRobert Mustacchi  *  mode is no_clp, which causes FW to refrain from using Alternate RAM.
61359d26e4fcSRobert Mustacchi  *
61369d26e4fcSRobert Mustacchi  **/
i40e_aq_set_oem_mode(struct i40e_hw * hw,u8 oem_mode)61379d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_set_oem_mode(struct i40e_hw *hw,
61389d26e4fcSRobert Mustacchi 		u8 oem_mode)
61399d26e4fcSRobert Mustacchi {
61409d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
61419d26e4fcSRobert Mustacchi 	struct i40e_aqc_alternate_write_done *cmd =
61429d26e4fcSRobert Mustacchi 		(struct i40e_aqc_alternate_write_done *)&desc.params.raw;
61439d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
61449d26e4fcSRobert Mustacchi 
61459d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
61469d26e4fcSRobert Mustacchi 					  i40e_aqc_opc_alternate_set_mode);
61479d26e4fcSRobert Mustacchi 
61489d26e4fcSRobert Mustacchi 	cmd->cmd_flags = CPU_TO_LE16(oem_mode);
61499d26e4fcSRobert Mustacchi 
61509d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
61519d26e4fcSRobert Mustacchi 
61529d26e4fcSRobert Mustacchi 	return status;
61539d26e4fcSRobert Mustacchi }
61549d26e4fcSRobert Mustacchi 
61559d26e4fcSRobert Mustacchi /**
61569d26e4fcSRobert Mustacchi  * i40e_aq_resume_port_tx
61579d26e4fcSRobert Mustacchi  * @hw: pointer to the hardware structure
61589d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
61599d26e4fcSRobert Mustacchi  *
61609d26e4fcSRobert Mustacchi  * Resume port's Tx traffic
61619d26e4fcSRobert Mustacchi  **/
i40e_aq_resume_port_tx(struct i40e_hw * hw,struct i40e_asq_cmd_details * cmd_details)61629d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_resume_port_tx(struct i40e_hw *hw,
61639d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
61649d26e4fcSRobert Mustacchi {
61659d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
61669d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
61679d26e4fcSRobert Mustacchi 
61689d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_resume_port_tx);
61699d26e4fcSRobert Mustacchi 
61709d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
61719d26e4fcSRobert Mustacchi 
61729d26e4fcSRobert Mustacchi 	return status;
61739d26e4fcSRobert Mustacchi }
61749d26e4fcSRobert Mustacchi 
61759d26e4fcSRobert Mustacchi /**
61769d26e4fcSRobert Mustacchi  * i40e_set_pci_config_data - store PCI bus info
61779d26e4fcSRobert Mustacchi  * @hw: pointer to hardware structure
61789d26e4fcSRobert Mustacchi  * @link_status: the link status word from PCI config space
61799d26e4fcSRobert Mustacchi  *
61809d26e4fcSRobert Mustacchi  * Stores the PCI bus info (speed, width, type) within the i40e_hw structure
61819d26e4fcSRobert Mustacchi  **/
i40e_set_pci_config_data(struct i40e_hw * hw,u16 link_status)61829d26e4fcSRobert Mustacchi void i40e_set_pci_config_data(struct i40e_hw *hw, u16 link_status)
61839d26e4fcSRobert Mustacchi {
61849d26e4fcSRobert Mustacchi 	hw->bus.type = i40e_bus_type_pci_express;
61859d26e4fcSRobert Mustacchi 
61869d26e4fcSRobert Mustacchi 	switch (link_status & I40E_PCI_LINK_WIDTH) {
61879d26e4fcSRobert Mustacchi 	case I40E_PCI_LINK_WIDTH_1:
61889d26e4fcSRobert Mustacchi 		hw->bus.width = i40e_bus_width_pcie_x1;
61899d26e4fcSRobert Mustacchi 		break;
61909d26e4fcSRobert Mustacchi 	case I40E_PCI_LINK_WIDTH_2:
61919d26e4fcSRobert Mustacchi 		hw->bus.width = i40e_bus_width_pcie_x2;
61929d26e4fcSRobert Mustacchi 		break;
61939d26e4fcSRobert Mustacchi 	case I40E_PCI_LINK_WIDTH_4:
61949d26e4fcSRobert Mustacchi 		hw->bus.width = i40e_bus_width_pcie_x4;
61959d26e4fcSRobert Mustacchi 		break;
61969d26e4fcSRobert Mustacchi 	case I40E_PCI_LINK_WIDTH_8:
61979d26e4fcSRobert Mustacchi 		hw->bus.width = i40e_bus_width_pcie_x8;
61989d26e4fcSRobert Mustacchi 		break;
61999d26e4fcSRobert Mustacchi 	default:
62009d26e4fcSRobert Mustacchi 		hw->bus.width = i40e_bus_width_unknown;
62019d26e4fcSRobert Mustacchi 		break;
62029d26e4fcSRobert Mustacchi 	}
62039d26e4fcSRobert Mustacchi 
62049d26e4fcSRobert Mustacchi 	switch (link_status & I40E_PCI_LINK_SPEED) {
62059d26e4fcSRobert Mustacchi 	case I40E_PCI_LINK_SPEED_2500:
62069d26e4fcSRobert Mustacchi 		hw->bus.speed = i40e_bus_speed_2500;
62079d26e4fcSRobert Mustacchi 		break;
62089d26e4fcSRobert Mustacchi 	case I40E_PCI_LINK_SPEED_5000:
62099d26e4fcSRobert Mustacchi 		hw->bus.speed = i40e_bus_speed_5000;
62109d26e4fcSRobert Mustacchi 		break;
62119d26e4fcSRobert Mustacchi 	case I40E_PCI_LINK_SPEED_8000:
62129d26e4fcSRobert Mustacchi 		hw->bus.speed = i40e_bus_speed_8000;
62139d26e4fcSRobert Mustacchi 		break;
62149d26e4fcSRobert Mustacchi 	default:
62159d26e4fcSRobert Mustacchi 		hw->bus.speed = i40e_bus_speed_unknown;
62169d26e4fcSRobert Mustacchi 		break;
62179d26e4fcSRobert Mustacchi 	}
62189d26e4fcSRobert Mustacchi }
62199d26e4fcSRobert Mustacchi 
62209d26e4fcSRobert Mustacchi /**
62219d26e4fcSRobert Mustacchi  * i40e_aq_debug_dump
62229d26e4fcSRobert Mustacchi  * @hw: pointer to the hardware structure
62239d26e4fcSRobert Mustacchi  * @cluster_id: specific cluster to dump
62249d26e4fcSRobert Mustacchi  * @table_id: table id within cluster
62259d26e4fcSRobert Mustacchi  * @start_index: index of line in the block to read
62269d26e4fcSRobert Mustacchi  * @buff_size: dump buffer size
62279d26e4fcSRobert Mustacchi  * @buff: dump buffer
62289d26e4fcSRobert Mustacchi  * @ret_buff_size: actual buffer size returned
62299d26e4fcSRobert Mustacchi  * @ret_next_table: next block to read
62309d26e4fcSRobert Mustacchi  * @ret_next_index: next index to read
623193f1cac5SPaul Winder  * @cmd_details: pointer to command details structure or NULL
62329d26e4fcSRobert Mustacchi  *
62339d26e4fcSRobert Mustacchi  * Dump internal FW/HW data for debug purposes.
62349d26e4fcSRobert Mustacchi  *
62359d26e4fcSRobert Mustacchi  **/
i40e_aq_debug_dump(struct i40e_hw * hw,u8 cluster_id,u8 table_id,u32 start_index,u16 buff_size,void * buff,u16 * ret_buff_size,u8 * ret_next_table,u32 * ret_next_index,struct i40e_asq_cmd_details * cmd_details)62369d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_debug_dump(struct i40e_hw *hw, u8 cluster_id,
62379d26e4fcSRobert Mustacchi 				u8 table_id, u32 start_index, u16 buff_size,
62389d26e4fcSRobert Mustacchi 				void *buff, u16 *ret_buff_size,
62399d26e4fcSRobert Mustacchi 				u8 *ret_next_table, u32 *ret_next_index,
62409d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
62419d26e4fcSRobert Mustacchi {
62429d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
62439d26e4fcSRobert Mustacchi 	struct i40e_aqc_debug_dump_internals *cmd =
62449d26e4fcSRobert Mustacchi 		(struct i40e_aqc_debug_dump_internals *)&desc.params.raw;
62459d26e4fcSRobert Mustacchi 	struct i40e_aqc_debug_dump_internals *resp =
62469d26e4fcSRobert Mustacchi 		(struct i40e_aqc_debug_dump_internals *)&desc.params.raw;
62479d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
62489d26e4fcSRobert Mustacchi 
62499d26e4fcSRobert Mustacchi 	if (buff_size == 0 || !buff)
62509d26e4fcSRobert Mustacchi 		return I40E_ERR_PARAM;
62519d26e4fcSRobert Mustacchi 
62529d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
62539d26e4fcSRobert Mustacchi 					  i40e_aqc_opc_debug_dump_internals);
62549d26e4fcSRobert Mustacchi 	/* Indirect Command */
62559d26e4fcSRobert Mustacchi 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
62569d26e4fcSRobert Mustacchi 	if (buff_size > I40E_AQ_LARGE_BUF)
62579d26e4fcSRobert Mustacchi 		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
62589d26e4fcSRobert Mustacchi 
62599d26e4fcSRobert Mustacchi 	cmd->cluster_id = cluster_id;
62609d26e4fcSRobert Mustacchi 	cmd->table_id = table_id;
62619d26e4fcSRobert Mustacchi 	cmd->idx = CPU_TO_LE32(start_index);
62629d26e4fcSRobert Mustacchi 
62639d26e4fcSRobert Mustacchi 	desc.datalen = CPU_TO_LE16(buff_size);
62649d26e4fcSRobert Mustacchi 
62659d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
62669d26e4fcSRobert Mustacchi 	if (!status) {
62679d26e4fcSRobert Mustacchi 		if (ret_buff_size != NULL)
62689d26e4fcSRobert Mustacchi 			*ret_buff_size = LE16_TO_CPU(desc.datalen);
62699d26e4fcSRobert Mustacchi 		if (ret_next_table != NULL)
62709d26e4fcSRobert Mustacchi 			*ret_next_table = resp->table_id;
62719d26e4fcSRobert Mustacchi 		if (ret_next_index != NULL)
62729d26e4fcSRobert Mustacchi 			*ret_next_index = LE32_TO_CPU(resp->idx);
62739d26e4fcSRobert Mustacchi 	}
62749d26e4fcSRobert Mustacchi 
62759d26e4fcSRobert Mustacchi 	return status;
62769d26e4fcSRobert Mustacchi }
62779d26e4fcSRobert Mustacchi 
6278*df36e06dSRobert Mustacchi 
6279*df36e06dSRobert Mustacchi /**
6280*df36e06dSRobert Mustacchi  * i40e_enable_eee
6281*df36e06dSRobert Mustacchi  * @hw: pointer to the hardware structure
6282*df36e06dSRobert Mustacchi  * @enable: state of Energy Efficient Ethernet mode to be set
6283*df36e06dSRobert Mustacchi  *
6284*df36e06dSRobert Mustacchi  * Enables or disables Energy Efficient Ethernet (EEE) mode
6285*df36e06dSRobert Mustacchi  * accordingly to @enable parameter.
6286*df36e06dSRobert Mustacchi  **/
i40e_enable_eee(struct i40e_hw * hw,bool enable)6287*df36e06dSRobert Mustacchi enum i40e_status_code i40e_enable_eee(struct i40e_hw *hw, bool enable)
6288*df36e06dSRobert Mustacchi {
6289*df36e06dSRobert Mustacchi 	struct i40e_aq_get_phy_abilities_resp abilities;
6290*df36e06dSRobert Mustacchi 	struct i40e_aq_set_phy_config config;
6291*df36e06dSRobert Mustacchi 	enum i40e_status_code status;
6292*df36e06dSRobert Mustacchi 	__le16 eee_capability;
6293*df36e06dSRobert Mustacchi 
6294*df36e06dSRobert Mustacchi 	/* Get initial PHY capabilities */
6295*df36e06dSRobert Mustacchi 	status = i40e_aq_get_phy_capabilities(hw, FALSE, TRUE, &abilities,
6296*df36e06dSRobert Mustacchi 					      NULL);
6297*df36e06dSRobert Mustacchi 	if (status)
6298*df36e06dSRobert Mustacchi 		goto err;
6299*df36e06dSRobert Mustacchi 
6300*df36e06dSRobert Mustacchi 	/* Check whether NIC configuration is compatible with Energy Efficient
6301*df36e06dSRobert Mustacchi 	 * Ethernet (EEE) mode.
6302*df36e06dSRobert Mustacchi 	 */
6303*df36e06dSRobert Mustacchi 	if (abilities.eee_capability == 0) {
6304*df36e06dSRobert Mustacchi 		status = I40E_ERR_CONFIG;
6305*df36e06dSRobert Mustacchi 		goto err;
6306*df36e06dSRobert Mustacchi 	}
6307*df36e06dSRobert Mustacchi 
6308*df36e06dSRobert Mustacchi 	/* Cache initial EEE capability */
6309*df36e06dSRobert Mustacchi 	eee_capability = abilities.eee_capability;
6310*df36e06dSRobert Mustacchi 
6311*df36e06dSRobert Mustacchi 	/* Get current configuration */
6312*df36e06dSRobert Mustacchi 	status = i40e_aq_get_phy_capabilities(hw, FALSE, false, &abilities,
6313*df36e06dSRobert Mustacchi 					      NULL);
6314*df36e06dSRobert Mustacchi 	if (status)
6315*df36e06dSRobert Mustacchi 		goto err;
6316*df36e06dSRobert Mustacchi 
6317*df36e06dSRobert Mustacchi 	/* Cache current configuration */
6318*df36e06dSRobert Mustacchi 	config.phy_type = abilities.phy_type;
6319*df36e06dSRobert Mustacchi 	config.phy_type_ext = abilities.phy_type_ext;
6320*df36e06dSRobert Mustacchi 	config.link_speed = abilities.link_speed;
6321*df36e06dSRobert Mustacchi 	config.abilities = abilities.abilities |
6322*df36e06dSRobert Mustacchi 			   I40E_AQ_PHY_ENABLE_ATOMIC_LINK;
6323*df36e06dSRobert Mustacchi 	config.eeer = abilities.eeer_val;
6324*df36e06dSRobert Mustacchi 	config.low_power_ctrl = abilities.d3_lpan;
6325*df36e06dSRobert Mustacchi 	config.fec_config = abilities.fec_cfg_curr_mod_ext_info &
6326*df36e06dSRobert Mustacchi 			    I40E_AQ_PHY_FEC_CONFIG_MASK;
6327*df36e06dSRobert Mustacchi 
6328*df36e06dSRobert Mustacchi 	/* Set desired EEE state */
6329*df36e06dSRobert Mustacchi 	if (enable) {
6330*df36e06dSRobert Mustacchi 		config.eee_capability = eee_capability;
6331*df36e06dSRobert Mustacchi 		config.eeer |= I40E_PRTPM_EEER_TX_LPI_EN_MASK;
6332*df36e06dSRobert Mustacchi 	} else {
6333*df36e06dSRobert Mustacchi 		config.eee_capability = 0;
6334*df36e06dSRobert Mustacchi 		config.eeer &= ~I40E_PRTPM_EEER_TX_LPI_EN_MASK;
6335*df36e06dSRobert Mustacchi 	}
6336*df36e06dSRobert Mustacchi 
6337*df36e06dSRobert Mustacchi 	/* Save modified config */
6338*df36e06dSRobert Mustacchi 	status = i40e_aq_set_phy_config(hw, &config, NULL);
6339*df36e06dSRobert Mustacchi err:
6340*df36e06dSRobert Mustacchi 	return status;
6341*df36e06dSRobert Mustacchi }
6342*df36e06dSRobert Mustacchi 
63439d26e4fcSRobert Mustacchi /**
63449d26e4fcSRobert Mustacchi  * i40e_read_bw_from_alt_ram
63459d26e4fcSRobert Mustacchi  * @hw: pointer to the hardware structure
63469d26e4fcSRobert Mustacchi  * @max_bw: pointer for max_bw read
63479d26e4fcSRobert Mustacchi  * @min_bw: pointer for min_bw read
63489d26e4fcSRobert Mustacchi  * @min_valid: pointer for bool that is TRUE if min_bw is a valid value
63499d26e4fcSRobert Mustacchi  * @max_valid: pointer for bool that is TRUE if max_bw is a valid value
63509d26e4fcSRobert Mustacchi  *
63519d26e4fcSRobert Mustacchi  * Read bw from the alternate ram for the given pf
63529d26e4fcSRobert Mustacchi  **/
i40e_read_bw_from_alt_ram(struct i40e_hw * hw,u32 * max_bw,u32 * min_bw,bool * min_valid,bool * max_valid)63539d26e4fcSRobert Mustacchi enum i40e_status_code i40e_read_bw_from_alt_ram(struct i40e_hw *hw,
63549d26e4fcSRobert Mustacchi 					u32 *max_bw, u32 *min_bw,
63559d26e4fcSRobert Mustacchi 					bool *min_valid, bool *max_valid)
63569d26e4fcSRobert Mustacchi {
63579d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
63589d26e4fcSRobert Mustacchi 	u32 max_bw_addr, min_bw_addr;
63599d26e4fcSRobert Mustacchi 
63609d26e4fcSRobert Mustacchi 	/* Calculate the address of the min/max bw registers */
63619d26e4fcSRobert Mustacchi 	max_bw_addr = I40E_ALT_STRUCT_FIRST_PF_OFFSET +
63629d26e4fcSRobert Mustacchi 		      I40E_ALT_STRUCT_MAX_BW_OFFSET +
63639d26e4fcSRobert Mustacchi 		      (I40E_ALT_STRUCT_DWORDS_PER_PF * hw->pf_id);
63649d26e4fcSRobert Mustacchi 	min_bw_addr = I40E_ALT_STRUCT_FIRST_PF_OFFSET +
63659d26e4fcSRobert Mustacchi 		      I40E_ALT_STRUCT_MIN_BW_OFFSET +
63669d26e4fcSRobert Mustacchi 		      (I40E_ALT_STRUCT_DWORDS_PER_PF * hw->pf_id);
63679d26e4fcSRobert Mustacchi 
63689d26e4fcSRobert Mustacchi 	/* Read the bandwidths from alt ram */
63699d26e4fcSRobert Mustacchi 	status = i40e_aq_alternate_read(hw, max_bw_addr, max_bw,
63709d26e4fcSRobert Mustacchi 					min_bw_addr, min_bw);
63719d26e4fcSRobert Mustacchi 
63729d26e4fcSRobert Mustacchi 	if (*min_bw & I40E_ALT_BW_VALID_MASK)
63739d26e4fcSRobert Mustacchi 		*min_valid = TRUE;
63749d26e4fcSRobert Mustacchi 	else
63759d26e4fcSRobert Mustacchi 		*min_valid = FALSE;
63769d26e4fcSRobert Mustacchi 
63779d26e4fcSRobert Mustacchi 	if (*max_bw & I40E_ALT_BW_VALID_MASK)
63789d26e4fcSRobert Mustacchi 		*max_valid = TRUE;
63799d26e4fcSRobert Mustacchi 	else
63809d26e4fcSRobert Mustacchi 		*max_valid = FALSE;
63819d26e4fcSRobert Mustacchi 
63829d26e4fcSRobert Mustacchi 	return status;
63839d26e4fcSRobert Mustacchi }
63849d26e4fcSRobert Mustacchi 
63859d26e4fcSRobert Mustacchi /**
63869d26e4fcSRobert Mustacchi  * i40e_aq_configure_partition_bw
63879d26e4fcSRobert Mustacchi  * @hw: pointer to the hardware structure
63889d26e4fcSRobert Mustacchi  * @bw_data: Buffer holding valid pfs and bw limits
63899d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details
63909d26e4fcSRobert Mustacchi  *
63919d26e4fcSRobert Mustacchi  * Configure partitions guaranteed/max bw
63929d26e4fcSRobert Mustacchi  **/
i40e_aq_configure_partition_bw(struct i40e_hw * hw,struct i40e_aqc_configure_partition_bw_data * bw_data,struct i40e_asq_cmd_details * cmd_details)63939d26e4fcSRobert Mustacchi enum i40e_status_code i40e_aq_configure_partition_bw(struct i40e_hw *hw,
63949d26e4fcSRobert Mustacchi 			struct i40e_aqc_configure_partition_bw_data *bw_data,
63959d26e4fcSRobert Mustacchi 			struct i40e_asq_cmd_details *cmd_details)
63969d26e4fcSRobert Mustacchi {
63979d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
63989d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
63999d26e4fcSRobert Mustacchi 	u16 bwd_size = sizeof(*bw_data);
64009d26e4fcSRobert Mustacchi 
64019d26e4fcSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
64029d26e4fcSRobert Mustacchi 				i40e_aqc_opc_configure_partition_bw);
64039d26e4fcSRobert Mustacchi 
64049d26e4fcSRobert Mustacchi 	/* Indirect command */
64059d26e4fcSRobert Mustacchi 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
64069d26e4fcSRobert Mustacchi 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
64079d26e4fcSRobert Mustacchi 
64089d26e4fcSRobert Mustacchi 	desc.datalen = CPU_TO_LE16(bwd_size);
64099d26e4fcSRobert Mustacchi 
64109d26e4fcSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, bw_data, bwd_size, cmd_details);
64119d26e4fcSRobert Mustacchi 
64129d26e4fcSRobert Mustacchi 	return status;
64139d26e4fcSRobert Mustacchi }
64149d26e4fcSRobert Mustacchi 
64153d75a287SRobert Mustacchi /**
64163d75a287SRobert Mustacchi  * i40e_read_phy_register_clause22
64173d75a287SRobert Mustacchi  * @hw: pointer to the HW structure
64183d75a287SRobert Mustacchi  * @reg: register address in the page
641993f1cac5SPaul Winder  * @phy_addr: PHY address on MDIO interface
64203d75a287SRobert Mustacchi  * @value: PHY register value
64213d75a287SRobert Mustacchi  *
64223d75a287SRobert Mustacchi  * Reads specified PHY register value
64233d75a287SRobert Mustacchi  **/
i40e_read_phy_register_clause22(struct i40e_hw * hw,u16 reg,u8 phy_addr,u16 * value)64243d75a287SRobert Mustacchi enum i40e_status_code i40e_read_phy_register_clause22(struct i40e_hw *hw,
64253d75a287SRobert Mustacchi 					u16 reg, u8 phy_addr, u16 *value)
64263d75a287SRobert Mustacchi {
64273d75a287SRobert Mustacchi 	enum i40e_status_code status = I40E_ERR_TIMEOUT;
64283d75a287SRobert Mustacchi 	u8 port_num = (u8)hw->func_caps.mdio_port_num;
64293d75a287SRobert Mustacchi 	u32 command = 0;
64303d75a287SRobert Mustacchi 	u16 retry = 1000;
64313d75a287SRobert Mustacchi 
64323d75a287SRobert Mustacchi 	command = (reg << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
64333d75a287SRobert Mustacchi 		  (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
64343d75a287SRobert Mustacchi 		  (I40E_MDIO_CLAUSE22_OPCODE_READ_MASK) |
64353d75a287SRobert Mustacchi 		  (I40E_MDIO_CLAUSE22_STCODE_MASK) |
64363d75a287SRobert Mustacchi 		  (I40E_GLGEN_MSCA_MDICMD_MASK);
64373d75a287SRobert Mustacchi 	wr32(hw, I40E_GLGEN_MSCA(port_num), command);
64383d75a287SRobert Mustacchi 	do {
64393d75a287SRobert Mustacchi 		command = rd32(hw, I40E_GLGEN_MSCA(port_num));
64403d75a287SRobert Mustacchi 		if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
64413d75a287SRobert Mustacchi 			status = I40E_SUCCESS;
64423d75a287SRobert Mustacchi 			break;
64433d75a287SRobert Mustacchi 		}
64443d75a287SRobert Mustacchi 		i40e_usec_delay(10);
64453d75a287SRobert Mustacchi 		retry--;
64463d75a287SRobert Mustacchi 	} while (retry);
64473d75a287SRobert Mustacchi 
64483d75a287SRobert Mustacchi 	if (status) {
64493d75a287SRobert Mustacchi 		i40e_debug(hw, I40E_DEBUG_PHY,
64503d75a287SRobert Mustacchi 			   "PHY: Can't write command to external PHY.\n");
64513d75a287SRobert Mustacchi 	} else {
64523d75a287SRobert Mustacchi 		command = rd32(hw, I40E_GLGEN_MSRWD(port_num));
64533d75a287SRobert Mustacchi 		*value = (command & I40E_GLGEN_MSRWD_MDIRDDATA_MASK) >>
64543d75a287SRobert Mustacchi 			 I40E_GLGEN_MSRWD_MDIRDDATA_SHIFT;
64553d75a287SRobert Mustacchi 	}
64563d75a287SRobert Mustacchi 
64573d75a287SRobert Mustacchi 	return status;
64583d75a287SRobert Mustacchi }
64593d75a287SRobert Mustacchi 
64603d75a287SRobert Mustacchi /**
64613d75a287SRobert Mustacchi  * i40e_write_phy_register_clause22
64623d75a287SRobert Mustacchi  * @hw: pointer to the HW structure
64633d75a287SRobert Mustacchi  * @reg: register address in the page
646493f1cac5SPaul Winder  * @phy_addr: PHY address on MDIO interface
64653d75a287SRobert Mustacchi  * @value: PHY register value
64663d75a287SRobert Mustacchi  *
64673d75a287SRobert Mustacchi  * Writes specified PHY register value
64683d75a287SRobert Mustacchi  **/
i40e_write_phy_register_clause22(struct i40e_hw * hw,u16 reg,u8 phy_addr,u16 value)64693d75a287SRobert Mustacchi enum i40e_status_code i40e_write_phy_register_clause22(struct i40e_hw *hw,
64703d75a287SRobert Mustacchi 					u16 reg, u8 phy_addr, u16 value)
64713d75a287SRobert Mustacchi {
64723d75a287SRobert Mustacchi 	enum i40e_status_code status = I40E_ERR_TIMEOUT;
64733d75a287SRobert Mustacchi 	u8 port_num = (u8)hw->func_caps.mdio_port_num;
64743d75a287SRobert Mustacchi 	u32 command  = 0;
64753d75a287SRobert Mustacchi 	u16 retry = 1000;
64763d75a287SRobert Mustacchi 
64773d75a287SRobert Mustacchi 	command = value << I40E_GLGEN_MSRWD_MDIWRDATA_SHIFT;
64783d75a287SRobert Mustacchi 	wr32(hw, I40E_GLGEN_MSRWD(port_num), command);
64793d75a287SRobert Mustacchi 
64803d75a287SRobert Mustacchi 	command = (reg << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
64813d75a287SRobert Mustacchi 		  (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
64823d75a287SRobert Mustacchi 		  (I40E_MDIO_CLAUSE22_OPCODE_WRITE_MASK) |
64833d75a287SRobert Mustacchi 		  (I40E_MDIO_CLAUSE22_STCODE_MASK) |
64843d75a287SRobert Mustacchi 		  (I40E_GLGEN_MSCA_MDICMD_MASK);
64853d75a287SRobert Mustacchi 
64863d75a287SRobert Mustacchi 	wr32(hw, I40E_GLGEN_MSCA(port_num), command);
64873d75a287SRobert Mustacchi 	do {
64883d75a287SRobert Mustacchi 		command = rd32(hw, I40E_GLGEN_MSCA(port_num));
64893d75a287SRobert Mustacchi 		if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
64903d75a287SRobert Mustacchi 			status = I40E_SUCCESS;
64913d75a287SRobert Mustacchi 			break;
64923d75a287SRobert Mustacchi 		}
64933d75a287SRobert Mustacchi 		i40e_usec_delay(10);
64943d75a287SRobert Mustacchi 		retry--;
64953d75a287SRobert Mustacchi 	} while (retry);
64963d75a287SRobert Mustacchi 
64973d75a287SRobert Mustacchi 	return status;
64983d75a287SRobert Mustacchi }
64993d75a287SRobert Mustacchi 
65003d75a287SRobert Mustacchi /**
65013d75a287SRobert Mustacchi  * i40e_read_phy_register_clause45
65023d75a287SRobert Mustacchi  * @hw: pointer to the HW structure
65033d75a287SRobert Mustacchi  * @page: registers page number
65043d75a287SRobert Mustacchi  * @reg: register address in the page
650593f1cac5SPaul Winder  * @phy_addr: PHY address on MDIO interface
65063d75a287SRobert Mustacchi  * @value: PHY register value
65073d75a287SRobert Mustacchi  *
65083d75a287SRobert Mustacchi  * Reads specified PHY register value
65093d75a287SRobert Mustacchi  **/
i40e_read_phy_register_clause45(struct i40e_hw * hw,u8 page,u16 reg,u8 phy_addr,u16 * value)65103d75a287SRobert Mustacchi enum i40e_status_code i40e_read_phy_register_clause45(struct i40e_hw *hw,
65113d75a287SRobert Mustacchi 				u8 page, u16 reg, u8 phy_addr, u16 *value)
65123d75a287SRobert Mustacchi {
65133d75a287SRobert Mustacchi 	enum i40e_status_code status = I40E_ERR_TIMEOUT;
65143d75a287SRobert Mustacchi 	u32 command  = 0;
65153d75a287SRobert Mustacchi 	u16 retry = 1000;
65163d75a287SRobert Mustacchi 	u8 port_num = (u8)hw->func_caps.mdio_port_num;
65173d75a287SRobert Mustacchi 
65183d75a287SRobert Mustacchi 	command = (reg << I40E_GLGEN_MSCA_MDIADD_SHIFT) |
65193d75a287SRobert Mustacchi 		  (page << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
65203d75a287SRobert Mustacchi 		  (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
65213d75a287SRobert Mustacchi 		  (I40E_MDIO_CLAUSE45_OPCODE_ADDRESS_MASK) |
65223d75a287SRobert Mustacchi 		  (I40E_MDIO_CLAUSE45_STCODE_MASK) |
65233d75a287SRobert Mustacchi 		  (I40E_GLGEN_MSCA_MDICMD_MASK) |
65243d75a287SRobert Mustacchi 		  (I40E_GLGEN_MSCA_MDIINPROGEN_MASK);
65253d75a287SRobert Mustacchi 	wr32(hw, I40E_GLGEN_MSCA(port_num), command);
65263d75a287SRobert Mustacchi 	do {
65273d75a287SRobert Mustacchi 		command = rd32(hw, I40E_GLGEN_MSCA(port_num));
65283d75a287SRobert Mustacchi 		if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
65293d75a287SRobert Mustacchi 			status = I40E_SUCCESS;
65303d75a287SRobert Mustacchi 			break;
65313d75a287SRobert Mustacchi 		}
65323d75a287SRobert Mustacchi 		i40e_usec_delay(10);
65333d75a287SRobert Mustacchi 		retry--;
65343d75a287SRobert Mustacchi 	} while (retry);
65353d75a287SRobert Mustacchi 
65363d75a287SRobert Mustacchi 	if (status) {
65373d75a287SRobert Mustacchi 		i40e_debug(hw, I40E_DEBUG_PHY,
65383d75a287SRobert Mustacchi 			   "PHY: Can't write command to external PHY.\n");
65393d75a287SRobert Mustacchi 		goto phy_read_end;
65403d75a287SRobert Mustacchi 	}
65413d75a287SRobert Mustacchi 
65423d75a287SRobert Mustacchi 	command = (page << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
65433d75a287SRobert Mustacchi 		  (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
65443d75a287SRobert Mustacchi 		  (I40E_MDIO_CLAUSE45_OPCODE_READ_MASK) |
65453d75a287SRobert Mustacchi 		  (I40E_MDIO_CLAUSE45_STCODE_MASK) |
65463d75a287SRobert Mustacchi 		  (I40E_GLGEN_MSCA_MDICMD_MASK) |
65473d75a287SRobert Mustacchi 		  (I40E_GLGEN_MSCA_MDIINPROGEN_MASK);
65483d75a287SRobert Mustacchi 	status = I40E_ERR_TIMEOUT;
65493d75a287SRobert Mustacchi 	retry = 1000;
65503d75a287SRobert Mustacchi 	wr32(hw, I40E_GLGEN_MSCA(port_num), command);
65513d75a287SRobert Mustacchi 	do {
65523d75a287SRobert Mustacchi 		command = rd32(hw, I40E_GLGEN_MSCA(port_num));
65533d75a287SRobert Mustacchi 		if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
65543d75a287SRobert Mustacchi 			status = I40E_SUCCESS;
65553d75a287SRobert Mustacchi 			break;
65563d75a287SRobert Mustacchi 		}
65573d75a287SRobert Mustacchi 		i40e_usec_delay(10);
65583d75a287SRobert Mustacchi 		retry--;
65593d75a287SRobert Mustacchi 	} while (retry);
65603d75a287SRobert Mustacchi 
65613d75a287SRobert Mustacchi 	if (!status) {
65623d75a287SRobert Mustacchi 		command = rd32(hw, I40E_GLGEN_MSRWD(port_num));
65633d75a287SRobert Mustacchi 		*value = (command & I40E_GLGEN_MSRWD_MDIRDDATA_MASK) >>
65643d75a287SRobert Mustacchi 			 I40E_GLGEN_MSRWD_MDIRDDATA_SHIFT;
65653d75a287SRobert Mustacchi 	} else {
65663d75a287SRobert Mustacchi 		i40e_debug(hw, I40E_DEBUG_PHY,
65673d75a287SRobert Mustacchi 			   "PHY: Can't read register value from external PHY.\n");
65683d75a287SRobert Mustacchi 	}
65693d75a287SRobert Mustacchi 
65703d75a287SRobert Mustacchi phy_read_end:
65713d75a287SRobert Mustacchi 	return status;
65723d75a287SRobert Mustacchi }
65733d75a287SRobert Mustacchi 
65743d75a287SRobert Mustacchi /**
65753d75a287SRobert Mustacchi  * i40e_write_phy_register_clause45
65763d75a287SRobert Mustacchi  * @hw: pointer to the HW structure
65773d75a287SRobert Mustacchi  * @page: registers page number
65783d75a287SRobert Mustacchi  * @reg: register address in the page
657993f1cac5SPaul Winder  * @phy_addr: PHY address on MDIO interface
65803d75a287SRobert Mustacchi  * @value: PHY register value
65813d75a287SRobert Mustacchi  *
65823d75a287SRobert Mustacchi  * Writes value to specified PHY register
65833d75a287SRobert Mustacchi  **/
i40e_write_phy_register_clause45(struct i40e_hw * hw,u8 page,u16 reg,u8 phy_addr,u16 value)65843d75a287SRobert Mustacchi enum i40e_status_code i40e_write_phy_register_clause45(struct i40e_hw *hw,
65853d75a287SRobert Mustacchi 				u8 page, u16 reg, u8 phy_addr, u16 value)
65863d75a287SRobert Mustacchi {
65873d75a287SRobert Mustacchi 	enum i40e_status_code status = I40E_ERR_TIMEOUT;
65883d75a287SRobert Mustacchi 	u32 command  = 0;
65893d75a287SRobert Mustacchi 	u16 retry = 1000;
65903d75a287SRobert Mustacchi 	u8 port_num = (u8)hw->func_caps.mdio_port_num;
65913d75a287SRobert Mustacchi 
65923d75a287SRobert Mustacchi 	command = (reg << I40E_GLGEN_MSCA_MDIADD_SHIFT) |
65933d75a287SRobert Mustacchi 		  (page << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
65943d75a287SRobert Mustacchi 		  (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
65953d75a287SRobert Mustacchi 		  (I40E_MDIO_CLAUSE45_OPCODE_ADDRESS_MASK) |
65963d75a287SRobert Mustacchi 		  (I40E_MDIO_CLAUSE45_STCODE_MASK) |
65973d75a287SRobert Mustacchi 		  (I40E_GLGEN_MSCA_MDICMD_MASK) |
65983d75a287SRobert Mustacchi 		  (I40E_GLGEN_MSCA_MDIINPROGEN_MASK);
65993d75a287SRobert Mustacchi 	wr32(hw, I40E_GLGEN_MSCA(port_num), command);
66003d75a287SRobert Mustacchi 	do {
66013d75a287SRobert Mustacchi 		command = rd32(hw, I40E_GLGEN_MSCA(port_num));
66023d75a287SRobert Mustacchi 		if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
66033d75a287SRobert Mustacchi 			status = I40E_SUCCESS;
66043d75a287SRobert Mustacchi 			break;
66053d75a287SRobert Mustacchi 		}
66063d75a287SRobert Mustacchi 		i40e_usec_delay(10);
66073d75a287SRobert Mustacchi 		retry--;
66083d75a287SRobert Mustacchi 	} while (retry);
66093d75a287SRobert Mustacchi 	if (status) {
66103d75a287SRobert Mustacchi 		i40e_debug(hw, I40E_DEBUG_PHY,
66113d75a287SRobert Mustacchi 			   "PHY: Can't write command to external PHY.\n");
66123d75a287SRobert Mustacchi 		goto phy_write_end;
66133d75a287SRobert Mustacchi 	}
66143d75a287SRobert Mustacchi 
66153d75a287SRobert Mustacchi 	command = value << I40E_GLGEN_MSRWD_MDIWRDATA_SHIFT;
66163d75a287SRobert Mustacchi 	wr32(hw, I40E_GLGEN_MSRWD(port_num), command);
66173d75a287SRobert Mustacchi 
66183d75a287SRobert Mustacchi 	command = (page << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
66193d75a287SRobert Mustacchi 		  (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
66203d75a287SRobert Mustacchi 		  (I40E_MDIO_CLAUSE45_OPCODE_WRITE_MASK) |
66213d75a287SRobert Mustacchi 		  (I40E_MDIO_CLAUSE45_STCODE_MASK) |
66223d75a287SRobert Mustacchi 		  (I40E_GLGEN_MSCA_MDICMD_MASK) |
66233d75a287SRobert Mustacchi 		  (I40E_GLGEN_MSCA_MDIINPROGEN_MASK);
66243d75a287SRobert Mustacchi 	status = I40E_ERR_TIMEOUT;
66253d75a287SRobert Mustacchi 	retry = 1000;
66263d75a287SRobert Mustacchi 	wr32(hw, I40E_GLGEN_MSCA(port_num), command);
66273d75a287SRobert Mustacchi 	do {
66283d75a287SRobert Mustacchi 		command = rd32(hw, I40E_GLGEN_MSCA(port_num));
66293d75a287SRobert Mustacchi 		if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
66303d75a287SRobert Mustacchi 			status = I40E_SUCCESS;
66313d75a287SRobert Mustacchi 			break;
66323d75a287SRobert Mustacchi 		}
66333d75a287SRobert Mustacchi 		i40e_usec_delay(10);
66343d75a287SRobert Mustacchi 		retry--;
66353d75a287SRobert Mustacchi 	} while (retry);
66363d75a287SRobert Mustacchi 
66373d75a287SRobert Mustacchi phy_write_end:
66383d75a287SRobert Mustacchi 	return status;
66393d75a287SRobert Mustacchi }
66403d75a287SRobert Mustacchi 
66413d75a287SRobert Mustacchi /**
66423d75a287SRobert Mustacchi  * i40e_write_phy_register
66433d75a287SRobert Mustacchi  * @hw: pointer to the HW structure
66443d75a287SRobert Mustacchi  * @page: registers page number
66453d75a287SRobert Mustacchi  * @reg: register address in the page
664693f1cac5SPaul Winder  * @phy_addr: PHY address on MDIO interface
66473d75a287SRobert Mustacchi  * @value: PHY register value
66483d75a287SRobert Mustacchi  *
66493d75a287SRobert Mustacchi  * Writes value to specified PHY register
66503d75a287SRobert Mustacchi  **/
i40e_write_phy_register(struct i40e_hw * hw,u8 page,u16 reg,u8 phy_addr,u16 value)66513d75a287SRobert Mustacchi enum i40e_status_code i40e_write_phy_register(struct i40e_hw *hw,
66523d75a287SRobert Mustacchi 				u8 page, u16 reg, u8 phy_addr, u16 value)
66533d75a287SRobert Mustacchi {
66543d75a287SRobert Mustacchi 	enum i40e_status_code status;
66553d75a287SRobert Mustacchi 
66563d75a287SRobert Mustacchi 	switch (hw->device_id) {
66573d75a287SRobert Mustacchi 	case I40E_DEV_ID_1G_BASE_T_X722:
66583d75a287SRobert Mustacchi 		status = i40e_write_phy_register_clause22(hw,
66593d75a287SRobert Mustacchi 			reg, phy_addr, value);
66603d75a287SRobert Mustacchi 		break;
66613d75a287SRobert Mustacchi 	case I40E_DEV_ID_10G_BASE_T:
66623d75a287SRobert Mustacchi 	case I40E_DEV_ID_10G_BASE_T4:
6663*df36e06dSRobert Mustacchi 	case I40E_DEV_ID_10G_BASE_T_BC:
6664*df36e06dSRobert Mustacchi 	case I40E_DEV_ID_5G_BASE_T_BC:
66653d75a287SRobert Mustacchi 	case I40E_DEV_ID_10G_BASE_T_X722:
66663d75a287SRobert Mustacchi 	case I40E_DEV_ID_25G_B:
66673d75a287SRobert Mustacchi 	case I40E_DEV_ID_25G_SFP28:
66683d75a287SRobert Mustacchi 		status = i40e_write_phy_register_clause45(hw,
66693d75a287SRobert Mustacchi 			page, reg, phy_addr, value);
66703d75a287SRobert Mustacchi 		break;
66713d75a287SRobert Mustacchi 	default:
66723d75a287SRobert Mustacchi 		status = I40E_ERR_UNKNOWN_PHY;
66733d75a287SRobert Mustacchi 		break;
66743d75a287SRobert Mustacchi 	}
66753d75a287SRobert Mustacchi 
66763d75a287SRobert Mustacchi 	return status;
66773d75a287SRobert Mustacchi }
66783d75a287SRobert Mustacchi 
66793d75a287SRobert Mustacchi /**
66803d75a287SRobert Mustacchi  * i40e_read_phy_register
66813d75a287SRobert Mustacchi  * @hw: pointer to the HW structure
66823d75a287SRobert Mustacchi  * @page: registers page number
66833d75a287SRobert Mustacchi  * @reg: register address in the page
668493f1cac5SPaul Winder  * @phy_addr: PHY address on MDIO interface
66853d75a287SRobert Mustacchi  * @value: PHY register value
66863d75a287SRobert Mustacchi  *
66873d75a287SRobert Mustacchi  * Reads specified PHY register value
66883d75a287SRobert Mustacchi  **/
i40e_read_phy_register(struct i40e_hw * hw,u8 page,u16 reg,u8 phy_addr,u16 * value)66893d75a287SRobert Mustacchi enum i40e_status_code i40e_read_phy_register(struct i40e_hw *hw,
66903d75a287SRobert Mustacchi 				u8 page, u16 reg, u8 phy_addr, u16 *value)
66913d75a287SRobert Mustacchi {
66923d75a287SRobert Mustacchi 	enum i40e_status_code status;
66933d75a287SRobert Mustacchi 
66943d75a287SRobert Mustacchi 	switch (hw->device_id) {
66953d75a287SRobert Mustacchi 	case I40E_DEV_ID_1G_BASE_T_X722:
66963d75a287SRobert Mustacchi 		status = i40e_read_phy_register_clause22(hw, reg, phy_addr,
66973d75a287SRobert Mustacchi 							 value);
66983d75a287SRobert Mustacchi 		break;
66993d75a287SRobert Mustacchi 	case I40E_DEV_ID_10G_BASE_T:
67003d75a287SRobert Mustacchi 	case I40E_DEV_ID_10G_BASE_T4:
6701*df36e06dSRobert Mustacchi 	case I40E_DEV_ID_10G_BASE_T_BC:
6702*df36e06dSRobert Mustacchi 	case I40E_DEV_ID_5G_BASE_T_BC:
67033d75a287SRobert Mustacchi 	case I40E_DEV_ID_10G_BASE_T_X722:
67043d75a287SRobert Mustacchi 	case I40E_DEV_ID_25G_B:
67053d75a287SRobert Mustacchi 	case I40E_DEV_ID_25G_SFP28:
67063d75a287SRobert Mustacchi 		status = i40e_read_phy_register_clause45(hw, page, reg,
67073d75a287SRobert Mustacchi 							 phy_addr, value);
67083d75a287SRobert Mustacchi 		break;
67093d75a287SRobert Mustacchi 	default:
67103d75a287SRobert Mustacchi 		status = I40E_ERR_UNKNOWN_PHY;
67113d75a287SRobert Mustacchi 		break;
67123d75a287SRobert Mustacchi 	}
67133d75a287SRobert Mustacchi 
67143d75a287SRobert Mustacchi 	return status;
67153d75a287SRobert Mustacchi }
67163d75a287SRobert Mustacchi 
67173d75a287SRobert Mustacchi /**
67183d75a287SRobert Mustacchi  * i40e_get_phy_address
67193d75a287SRobert Mustacchi  * @hw: pointer to the HW structure
67203d75a287SRobert Mustacchi  * @dev_num: PHY port num that address we want
67213d75a287SRobert Mustacchi  *
67223d75a287SRobert Mustacchi  * Gets PHY address for current port
67233d75a287SRobert Mustacchi  **/
i40e_get_phy_address(struct i40e_hw * hw,u8 dev_num)67243d75a287SRobert Mustacchi u8 i40e_get_phy_address(struct i40e_hw *hw, u8 dev_num)
67253d75a287SRobert Mustacchi {
67263d75a287SRobert Mustacchi 	u8 port_num = (u8)hw->func_caps.mdio_port_num;
67273d75a287SRobert Mustacchi 	u32 reg_val = rd32(hw, I40E_GLGEN_MDIO_I2C_SEL(port_num));
67283d75a287SRobert Mustacchi 
67293d75a287SRobert Mustacchi 	return (u8)(reg_val >> ((dev_num + 1) * 5)) & 0x1f;
67303d75a287SRobert Mustacchi }
67313d75a287SRobert Mustacchi 
67323d75a287SRobert Mustacchi /**
67333d75a287SRobert Mustacchi  * i40e_blink_phy_led
67343d75a287SRobert Mustacchi  * @hw: pointer to the HW structure
67353d75a287SRobert Mustacchi  * @time: time how long led will blinks in secs
67363d75a287SRobert Mustacchi  * @interval: gap between LED on and off in msecs
67373d75a287SRobert Mustacchi  *
67383d75a287SRobert Mustacchi  * Blinks PHY link LED
67393d75a287SRobert Mustacchi  **/
i40e_blink_phy_link_led(struct i40e_hw * hw,u32 time,u32 interval)67403d75a287SRobert Mustacchi enum i40e_status_code i40e_blink_phy_link_led(struct i40e_hw *hw,
67413d75a287SRobert Mustacchi 					      u32 time, u32 interval)
67423d75a287SRobert Mustacchi {
67433d75a287SRobert Mustacchi 	enum i40e_status_code status = I40E_SUCCESS;
67443d75a287SRobert Mustacchi 	u32 i;
67453d75a287SRobert Mustacchi 	u16 led_ctl = 0;
67463d75a287SRobert Mustacchi 	u16 gpio_led_port;
67473d75a287SRobert Mustacchi 	u16 led_reg;
67483d75a287SRobert Mustacchi 	u16 led_addr = I40E_PHY_LED_PROV_REG_1;
67493d75a287SRobert Mustacchi 	u8 phy_addr = 0;
67503d75a287SRobert Mustacchi 	u8 port_num;
67513d75a287SRobert Mustacchi 
67523d75a287SRobert Mustacchi 	i = rd32(hw, I40E_PFGEN_PORTNUM);
67533d75a287SRobert Mustacchi 	port_num = (u8)(i & I40E_PFGEN_PORTNUM_PORT_NUM_MASK);
67543d75a287SRobert Mustacchi 	phy_addr = i40e_get_phy_address(hw, port_num);
67553d75a287SRobert Mustacchi 
67563d75a287SRobert Mustacchi 	for (gpio_led_port = 0; gpio_led_port < 3; gpio_led_port++,
67573d75a287SRobert Mustacchi 	     led_addr++) {
67583d75a287SRobert Mustacchi 		status = i40e_read_phy_register_clause45(hw,
67593d75a287SRobert Mustacchi 							 I40E_PHY_COM_REG_PAGE,
67603d75a287SRobert Mustacchi 							 led_addr, phy_addr,
67613d75a287SRobert Mustacchi 							 &led_reg);
67623d75a287SRobert Mustacchi 		if (status)
67633d75a287SRobert Mustacchi 			goto phy_blinking_end;
67643d75a287SRobert Mustacchi 		led_ctl = led_reg;
67653d75a287SRobert Mustacchi 		if (led_reg & I40E_PHY_LED_LINK_MODE_MASK) {
67663d75a287SRobert Mustacchi 			led_reg = 0;
67673d75a287SRobert Mustacchi 			status = i40e_write_phy_register_clause45(hw,
67683d75a287SRobert Mustacchi 							 I40E_PHY_COM_REG_PAGE,
67693d75a287SRobert Mustacchi 							 led_addr, phy_addr,
67703d75a287SRobert Mustacchi 							 led_reg);
67713d75a287SRobert Mustacchi 			if (status)
67723d75a287SRobert Mustacchi 				goto phy_blinking_end;
67733d75a287SRobert Mustacchi 			break;
67743d75a287SRobert Mustacchi 		}
67753d75a287SRobert Mustacchi 	}
67763d75a287SRobert Mustacchi 
67773d75a287SRobert Mustacchi 	if (time > 0 && interval > 0) {
67783d75a287SRobert Mustacchi 		for (i = 0; i < time * 1000; i += interval) {
67793d75a287SRobert Mustacchi 			status = i40e_read_phy_register_clause45(hw,
67803d75a287SRobert Mustacchi 						I40E_PHY_COM_REG_PAGE,
67813d75a287SRobert Mustacchi 						led_addr, phy_addr, &led_reg);
67823d75a287SRobert Mustacchi 			if (status)
67833d75a287SRobert Mustacchi 				goto restore_config;
67843d75a287SRobert Mustacchi 			if (led_reg & I40E_PHY_LED_MANUAL_ON)
67853d75a287SRobert Mustacchi 				led_reg = 0;
67863d75a287SRobert Mustacchi 			else
67873d75a287SRobert Mustacchi 				led_reg = I40E_PHY_LED_MANUAL_ON;
67883d75a287SRobert Mustacchi 			status = i40e_write_phy_register_clause45(hw,
67893d75a287SRobert Mustacchi 						I40E_PHY_COM_REG_PAGE,
67903d75a287SRobert Mustacchi 						led_addr, phy_addr, led_reg);
67913d75a287SRobert Mustacchi 			if (status)
67923d75a287SRobert Mustacchi 				goto restore_config;
67933d75a287SRobert Mustacchi 			i40e_msec_delay(interval);
67943d75a287SRobert Mustacchi 		}
67953d75a287SRobert Mustacchi 	}
67963d75a287SRobert Mustacchi 
67973d75a287SRobert Mustacchi restore_config:
67983d75a287SRobert Mustacchi 	status = i40e_write_phy_register_clause45(hw,
67993d75a287SRobert Mustacchi 						  I40E_PHY_COM_REG_PAGE,
68003d75a287SRobert Mustacchi 						  led_addr, phy_addr, led_ctl);
68013d75a287SRobert Mustacchi 
68023d75a287SRobert Mustacchi phy_blinking_end:
68033d75a287SRobert Mustacchi 	return status;
68043d75a287SRobert Mustacchi }
68053d75a287SRobert Mustacchi 
680693f1cac5SPaul Winder /**
680793f1cac5SPaul Winder  * i40e_led_get_reg - read LED register
680893f1cac5SPaul Winder  * @hw: pointer to the HW structure
680993f1cac5SPaul Winder  * @led_addr: LED register address
681093f1cac5SPaul Winder  * @reg_val: read register value
681193f1cac5SPaul Winder  **/
i40e_led_get_reg(struct i40e_hw * hw,u16 led_addr,u32 * reg_val)6812*df36e06dSRobert Mustacchi enum i40e_status_code i40e_led_get_reg(struct i40e_hw *hw, u16 led_addr,
6813*df36e06dSRobert Mustacchi 				       u32 *reg_val)
681493f1cac5SPaul Winder {
681593f1cac5SPaul Winder 	enum i40e_status_code status;
681693f1cac5SPaul Winder 	u8 phy_addr = 0;
681793f1cac5SPaul Winder 
681893f1cac5SPaul Winder 	*reg_val = 0;
681993f1cac5SPaul Winder 	if (hw->flags & I40E_HW_FLAG_AQ_PHY_ACCESS_CAPABLE) {
682093f1cac5SPaul Winder 		status = i40e_aq_get_phy_register(hw,
682193f1cac5SPaul Winder 						I40E_AQ_PHY_REG_ACCESS_EXTERNAL,
6822*df36e06dSRobert Mustacchi 						I40E_PHY_COM_REG_PAGE, TRUE,
682393f1cac5SPaul Winder 						I40E_PHY_LED_PROV_REG_1,
682493f1cac5SPaul Winder 						reg_val, NULL);
682593f1cac5SPaul Winder 	} else {
682693f1cac5SPaul Winder 		phy_addr = i40e_get_phy_address(hw, hw->port);
682793f1cac5SPaul Winder 		status = i40e_read_phy_register_clause45(hw,
682893f1cac5SPaul Winder 							 I40E_PHY_COM_REG_PAGE,
682993f1cac5SPaul Winder 							 led_addr, phy_addr,
683093f1cac5SPaul Winder 							 (u16 *)reg_val);
683193f1cac5SPaul Winder 	}
683293f1cac5SPaul Winder 	return status;
683393f1cac5SPaul Winder }
683493f1cac5SPaul Winder 
683593f1cac5SPaul Winder /**
683693f1cac5SPaul Winder  * i40e_led_set_reg - write LED register
683793f1cac5SPaul Winder  * @hw: pointer to the HW structure
683893f1cac5SPaul Winder  * @led_addr: LED register address
683993f1cac5SPaul Winder  * @reg_val: register value to write
684093f1cac5SPaul Winder  **/
i40e_led_set_reg(struct i40e_hw * hw,u16 led_addr,u32 reg_val)6841*df36e06dSRobert Mustacchi enum i40e_status_code i40e_led_set_reg(struct i40e_hw *hw, u16 led_addr,
6842*df36e06dSRobert Mustacchi 				       u32 reg_val)
684393f1cac5SPaul Winder {
684493f1cac5SPaul Winder 	enum i40e_status_code status;
684593f1cac5SPaul Winder 	u8 phy_addr = 0;
684693f1cac5SPaul Winder 
684793f1cac5SPaul Winder 	if (hw->flags & I40E_HW_FLAG_AQ_PHY_ACCESS_CAPABLE) {
684893f1cac5SPaul Winder 		status = i40e_aq_set_phy_register(hw,
684993f1cac5SPaul Winder 						I40E_AQ_PHY_REG_ACCESS_EXTERNAL,
6850*df36e06dSRobert Mustacchi 						I40E_PHY_COM_REG_PAGE, TRUE,
685193f1cac5SPaul Winder 						I40E_PHY_LED_PROV_REG_1,
685293f1cac5SPaul Winder 						reg_val, NULL);
685393f1cac5SPaul Winder 	} else {
685493f1cac5SPaul Winder 		phy_addr = i40e_get_phy_address(hw, hw->port);
685593f1cac5SPaul Winder 		status = i40e_write_phy_register_clause45(hw,
685693f1cac5SPaul Winder 							  I40E_PHY_COM_REG_PAGE,
685793f1cac5SPaul Winder 							  led_addr, phy_addr,
685893f1cac5SPaul Winder 							  (u16)reg_val);
685993f1cac5SPaul Winder 	}
686093f1cac5SPaul Winder 
686193f1cac5SPaul Winder 	return status;
686293f1cac5SPaul Winder }
686393f1cac5SPaul Winder 
68643d75a287SRobert Mustacchi /**
68653d75a287SRobert Mustacchi  * i40e_led_get_phy - return current on/off mode
68663d75a287SRobert Mustacchi  * @hw: pointer to the hw struct
68673d75a287SRobert Mustacchi  * @led_addr: address of led register to use
68683d75a287SRobert Mustacchi  * @val: original value of register to use
68693d75a287SRobert Mustacchi  *
68703d75a287SRobert Mustacchi  **/
i40e_led_get_phy(struct i40e_hw * hw,u16 * led_addr,u16 * val)68713d75a287SRobert Mustacchi enum i40e_status_code i40e_led_get_phy(struct i40e_hw *hw, u16 *led_addr,
68723d75a287SRobert Mustacchi 				       u16 *val)
68733d75a287SRobert Mustacchi {
68743d75a287SRobert Mustacchi 	enum i40e_status_code status = I40E_SUCCESS;
68753d75a287SRobert Mustacchi 	u16 gpio_led_port;
687693f1cac5SPaul Winder 	u32 reg_val_aq;
687793f1cac5SPaul Winder 	u16 temp_addr;
68783d75a287SRobert Mustacchi 	u8 phy_addr = 0;
68793d75a287SRobert Mustacchi 	u16 reg_val;
68803d75a287SRobert Mustacchi 
688193f1cac5SPaul Winder 	if (hw->flags & I40E_HW_FLAG_AQ_PHY_ACCESS_CAPABLE) {
688293f1cac5SPaul Winder 		status = i40e_aq_get_phy_register(hw,
688393f1cac5SPaul Winder 						I40E_AQ_PHY_REG_ACCESS_EXTERNAL,
6884*df36e06dSRobert Mustacchi 						I40E_PHY_COM_REG_PAGE, TRUE,
688593f1cac5SPaul Winder 						I40E_PHY_LED_PROV_REG_1,
688693f1cac5SPaul Winder 						&reg_val_aq, NULL);
688793f1cac5SPaul Winder 		if (status == I40E_SUCCESS)
688893f1cac5SPaul Winder 			*val = (u16)reg_val_aq;
688993f1cac5SPaul Winder 		return status;
689093f1cac5SPaul Winder 	}
68913d75a287SRobert Mustacchi 	temp_addr = I40E_PHY_LED_PROV_REG_1;
689293f1cac5SPaul Winder 	phy_addr = i40e_get_phy_address(hw, hw->port);
68933d75a287SRobert Mustacchi 	for (gpio_led_port = 0; gpio_led_port < 3; gpio_led_port++,
68943d75a287SRobert Mustacchi 	     temp_addr++) {
68953d75a287SRobert Mustacchi 		status = i40e_read_phy_register_clause45(hw,
68963d75a287SRobert Mustacchi 							 I40E_PHY_COM_REG_PAGE,
68973d75a287SRobert Mustacchi 							 temp_addr, phy_addr,
68983d75a287SRobert Mustacchi 							 &reg_val);
68993d75a287SRobert Mustacchi 		if (status)
69003d75a287SRobert Mustacchi 			return status;
69013d75a287SRobert Mustacchi 		*val = reg_val;
69023d75a287SRobert Mustacchi 		if (reg_val & I40E_PHY_LED_LINK_MODE_MASK) {
69033d75a287SRobert Mustacchi 			*led_addr = temp_addr;
69043d75a287SRobert Mustacchi 			break;
69053d75a287SRobert Mustacchi 		}
69063d75a287SRobert Mustacchi 	}
69073d75a287SRobert Mustacchi 	return status;
69083d75a287SRobert Mustacchi }
69093d75a287SRobert Mustacchi 
69103d75a287SRobert Mustacchi /**
69113d75a287SRobert Mustacchi  * i40e_led_set_phy
69123d75a287SRobert Mustacchi  * @hw: pointer to the HW structure
69133d75a287SRobert Mustacchi  * @on: TRUE or FALSE
691493f1cac5SPaul Winder  * @led_addr: address of led register to use
69153d75a287SRobert Mustacchi  * @mode: original val plus bit for set or ignore
691693f1cac5SPaul Winder  *
69173d75a287SRobert Mustacchi  * Set led's on or off when controlled by the PHY
69183d75a287SRobert Mustacchi  *
69193d75a287SRobert Mustacchi  **/
i40e_led_set_phy(struct i40e_hw * hw,bool on,u16 led_addr,u32 mode)69203d75a287SRobert Mustacchi enum i40e_status_code i40e_led_set_phy(struct i40e_hw *hw, bool on,
69213d75a287SRobert Mustacchi 				       u16 led_addr, u32 mode)
69223d75a287SRobert Mustacchi {
69233d75a287SRobert Mustacchi 	enum i40e_status_code status = I40E_SUCCESS;
692493f1cac5SPaul Winder 	u32 led_ctl = 0;
692593f1cac5SPaul Winder 	u32 led_reg = 0;
69263d75a287SRobert Mustacchi 
692793f1cac5SPaul Winder 	status = i40e_led_get_reg(hw, led_addr, &led_reg);
69283d75a287SRobert Mustacchi 	if (status)
69293d75a287SRobert Mustacchi 		return status;
69303d75a287SRobert Mustacchi 	led_ctl = led_reg;
69313d75a287SRobert Mustacchi 	if (led_reg & I40E_PHY_LED_LINK_MODE_MASK) {
69323d75a287SRobert Mustacchi 		led_reg = 0;
693393f1cac5SPaul Winder 		status = i40e_led_set_reg(hw, led_addr, led_reg);
69343d75a287SRobert Mustacchi 		if (status)
69353d75a287SRobert Mustacchi 			return status;
69363d75a287SRobert Mustacchi 	}
693793f1cac5SPaul Winder 	status = i40e_led_get_reg(hw, led_addr, &led_reg);
69383d75a287SRobert Mustacchi 	if (status)
69393d75a287SRobert Mustacchi 		goto restore_config;
69403d75a287SRobert Mustacchi 	if (on)
69413d75a287SRobert Mustacchi 		led_reg = I40E_PHY_LED_MANUAL_ON;
69423d75a287SRobert Mustacchi 	else
69433d75a287SRobert Mustacchi 		led_reg = 0;
694493f1cac5SPaul Winder 	status = i40e_led_set_reg(hw, led_addr, led_reg);
69453d75a287SRobert Mustacchi 	if (status)
69463d75a287SRobert Mustacchi 		goto restore_config;
69473d75a287SRobert Mustacchi 	if (mode & I40E_PHY_LED_MODE_ORIG) {
69483d75a287SRobert Mustacchi 		led_ctl = (mode & I40E_PHY_LED_MODE_MASK);
694993f1cac5SPaul Winder 		status = i40e_led_set_reg(hw, led_addr, led_ctl);
69503d75a287SRobert Mustacchi 	}
69513d75a287SRobert Mustacchi 	return status;
695293f1cac5SPaul Winder 
69533d75a287SRobert Mustacchi restore_config:
695493f1cac5SPaul Winder 	status = i40e_led_set_reg(hw, led_addr, led_ctl);
69553d75a287SRobert Mustacchi 	return status;
69563d75a287SRobert Mustacchi }
69573d75a287SRobert Mustacchi 
6958*df36e06dSRobert Mustacchi /**
6959*df36e06dSRobert Mustacchi  * i40e_get_phy_lpi_status - read LPI status from PHY or MAC register
6960*df36e06dSRobert Mustacchi  * @hw: pointer to the hw struct
6961*df36e06dSRobert Mustacchi  * @stat: pointer to structure with status of rx and tx lpi
6962*df36e06dSRobert Mustacchi  *
6963*df36e06dSRobert Mustacchi  * Read LPI state directly from external PHY register or from MAC
6964*df36e06dSRobert Mustacchi  * register, depending on device ID and current link speed.
6965*df36e06dSRobert Mustacchi  */
i40e_get_phy_lpi_status(struct i40e_hw * hw,struct i40e_hw_port_stats * stat)6966*df36e06dSRobert Mustacchi enum i40e_status_code i40e_get_phy_lpi_status(struct i40e_hw *hw,
6967*df36e06dSRobert Mustacchi 					      struct i40e_hw_port_stats *stat)
6968*df36e06dSRobert Mustacchi {
6969*df36e06dSRobert Mustacchi 	enum i40e_status_code ret = I40E_SUCCESS;
6970*df36e06dSRobert Mustacchi 	u32 val;
6971*df36e06dSRobert Mustacchi 
6972*df36e06dSRobert Mustacchi 	stat->rx_lpi_status = 0;
6973*df36e06dSRobert Mustacchi 	stat->tx_lpi_status = 0;
6974*df36e06dSRobert Mustacchi 
6975*df36e06dSRobert Mustacchi 	if ((hw->device_id == I40E_DEV_ID_10G_BASE_T_BC ||
6976*df36e06dSRobert Mustacchi 	     hw->device_id == I40E_DEV_ID_5G_BASE_T_BC) &&
6977*df36e06dSRobert Mustacchi 	    (hw->phy.link_info.link_speed == I40E_LINK_SPEED_2_5GB ||
6978*df36e06dSRobert Mustacchi 	     hw->phy.link_info.link_speed == I40E_LINK_SPEED_5GB)) {
6979*df36e06dSRobert Mustacchi 		ret = i40e_aq_get_phy_register(hw,
6980*df36e06dSRobert Mustacchi 					       I40E_AQ_PHY_REG_ACCESS_EXTERNAL,
6981*df36e06dSRobert Mustacchi 					       I40E_BCM_PHY_PCS_STATUS1_PAGE,
6982*df36e06dSRobert Mustacchi 					       TRUE,
6983*df36e06dSRobert Mustacchi 					       I40E_BCM_PHY_PCS_STATUS1_REG,
6984*df36e06dSRobert Mustacchi 					       &val, NULL);
6985*df36e06dSRobert Mustacchi 
6986*df36e06dSRobert Mustacchi 		if (ret != I40E_SUCCESS)
6987*df36e06dSRobert Mustacchi 			return ret;
6988*df36e06dSRobert Mustacchi 
6989*df36e06dSRobert Mustacchi 		stat->rx_lpi_status = !!(val & I40E_BCM_PHY_PCS_STATUS1_RX_LPI);
6990*df36e06dSRobert Mustacchi 		stat->tx_lpi_status = !!(val & I40E_BCM_PHY_PCS_STATUS1_TX_LPI);
6991*df36e06dSRobert Mustacchi 
6992*df36e06dSRobert Mustacchi 		return ret;
6993*df36e06dSRobert Mustacchi 	}
6994*df36e06dSRobert Mustacchi 
6995*df36e06dSRobert Mustacchi 	val = rd32(hw, I40E_PRTPM_EEE_STAT);
6996*df36e06dSRobert Mustacchi 	stat->rx_lpi_status = (val & I40E_PRTPM_EEE_STAT_RX_LPI_STATUS_MASK) >>
6997*df36e06dSRobert Mustacchi 			       I40E_PRTPM_EEE_STAT_RX_LPI_STATUS_SHIFT;
6998*df36e06dSRobert Mustacchi 	stat->tx_lpi_status = (val & I40E_PRTPM_EEE_STAT_TX_LPI_STATUS_MASK) >>
6999*df36e06dSRobert Mustacchi 			       I40E_PRTPM_EEE_STAT_TX_LPI_STATUS_SHIFT;
7000*df36e06dSRobert Mustacchi 
7001*df36e06dSRobert Mustacchi 	return ret;
7002*df36e06dSRobert Mustacchi }
7003*df36e06dSRobert Mustacchi 
7004*df36e06dSRobert Mustacchi /**
7005*df36e06dSRobert Mustacchi  * i40e_get_lpi_counters - read LPI counters from EEE statistics
7006*df36e06dSRobert Mustacchi  * @hw: pointer to the hw struct
7007*df36e06dSRobert Mustacchi  * @tx_counter: pointer to memory for TX LPI counter
7008*df36e06dSRobert Mustacchi  * @rx_counter: pointer to memory for RX LPI counter
7009*df36e06dSRobert Mustacchi  * @is_clear:   returns TRUE if counters are clear after read
7010*df36e06dSRobert Mustacchi  *
7011*df36e06dSRobert Mustacchi  * Read Low Power Idle (LPI) mode counters from Energy Efficient
7012*df36e06dSRobert Mustacchi  * Ethernet (EEE) statistics.
7013*df36e06dSRobert Mustacchi  **/
i40e_get_lpi_counters(struct i40e_hw * hw,u32 * tx_counter,u32 * rx_counter,bool * is_clear)7014*df36e06dSRobert Mustacchi enum i40e_status_code i40e_get_lpi_counters(struct i40e_hw *hw,
7015*df36e06dSRobert Mustacchi 					    u32 *tx_counter, u32 *rx_counter,
7016*df36e06dSRobert Mustacchi 					    bool *is_clear)
7017*df36e06dSRobert Mustacchi {
7018*df36e06dSRobert Mustacchi 	/* only X710-T*L requires special handling of counters
7019*df36e06dSRobert Mustacchi 	 * for other devices we just read the MAC registers
7020*df36e06dSRobert Mustacchi 	 */
7021*df36e06dSRobert Mustacchi 	if ((hw->device_id == I40E_DEV_ID_10G_BASE_T_BC ||
7022*df36e06dSRobert Mustacchi 	     hw->device_id == I40E_DEV_ID_5G_BASE_T_BC) &&
7023*df36e06dSRobert Mustacchi 	     hw->phy.link_info.link_speed != I40E_LINK_SPEED_1GB) {
7024*df36e06dSRobert Mustacchi 		enum i40e_status_code retval;
7025*df36e06dSRobert Mustacchi 		u32 cmd_status;
7026*df36e06dSRobert Mustacchi 
7027*df36e06dSRobert Mustacchi 		*is_clear = FALSE;
7028*df36e06dSRobert Mustacchi 		retval = i40e_aq_run_phy_activity(hw,
7029*df36e06dSRobert Mustacchi 				I40E_AQ_RUN_PHY_ACT_ID_USR_DFND,
7030*df36e06dSRobert Mustacchi 				I40E_AQ_RUN_PHY_ACT_DNL_OPCODE_GET_EEE_STAT,
7031*df36e06dSRobert Mustacchi 				&cmd_status, tx_counter, rx_counter, NULL);
7032*df36e06dSRobert Mustacchi 
7033*df36e06dSRobert Mustacchi 		if (!retval && cmd_status != I40E_AQ_RUN_PHY_ACT_CMD_STAT_SUCC)
7034*df36e06dSRobert Mustacchi 			retval = I40E_ERR_ADMIN_QUEUE_ERROR;
7035*df36e06dSRobert Mustacchi 
7036*df36e06dSRobert Mustacchi 		return retval;
7037*df36e06dSRobert Mustacchi 	}
7038*df36e06dSRobert Mustacchi 
7039*df36e06dSRobert Mustacchi 	*is_clear = TRUE;
7040*df36e06dSRobert Mustacchi 	*tx_counter = rd32(hw, I40E_PRTPM_TLPIC);
7041*df36e06dSRobert Mustacchi 	*rx_counter = rd32(hw, I40E_PRTPM_RLPIC);
7042*df36e06dSRobert Mustacchi 
7043*df36e06dSRobert Mustacchi 	return I40E_SUCCESS;
7044*df36e06dSRobert Mustacchi }
7045*df36e06dSRobert Mustacchi 
7046*df36e06dSRobert Mustacchi /**
7047*df36e06dSRobert Mustacchi  * i40e_get_lpi_duration - read LPI time duration from EEE statistics
7048*df36e06dSRobert Mustacchi  * @hw: pointer to the hw struct
7049*df36e06dSRobert Mustacchi  * @stat: pointer to structure with status of rx and tx lpi
7050*df36e06dSRobert Mustacchi  * @tx_duration: pointer to memory for TX LPI time duration
7051*df36e06dSRobert Mustacchi  * @rx_duration: pointer to memory for RX LPI time duration
7052*df36e06dSRobert Mustacchi  *
7053*df36e06dSRobert Mustacchi  * Read Low Power Idle (LPI) mode time duration from Energy Efficient
7054*df36e06dSRobert Mustacchi  * Ethernet (EEE) statistics.
7055*df36e06dSRobert Mustacchi  */
i40e_get_lpi_duration(struct i40e_hw * hw,struct i40e_hw_port_stats * stat,u64 * tx_duration,u64 * rx_duration)7056*df36e06dSRobert Mustacchi enum i40e_status_code i40e_get_lpi_duration(struct i40e_hw *hw,
7057*df36e06dSRobert Mustacchi 					    struct i40e_hw_port_stats *stat,
7058*df36e06dSRobert Mustacchi 					    u64 *tx_duration, u64 *rx_duration)
7059*df36e06dSRobert Mustacchi {
7060*df36e06dSRobert Mustacchi 	u32 tx_time_dur, rx_time_dur;
7061*df36e06dSRobert Mustacchi 	enum i40e_status_code retval;
7062*df36e06dSRobert Mustacchi 	u32 cmd_status;
7063*df36e06dSRobert Mustacchi 
7064*df36e06dSRobert Mustacchi 	if (hw->device_id != I40E_DEV_ID_10G_BASE_T_BC &&
7065*df36e06dSRobert Mustacchi 	    hw->device_id != I40E_DEV_ID_5G_BASE_T_BC)
7066*df36e06dSRobert Mustacchi 		return I40E_ERR_NOT_IMPLEMENTED;
7067*df36e06dSRobert Mustacchi 
7068*df36e06dSRobert Mustacchi 	retval = i40e_aq_run_phy_activity
7069*df36e06dSRobert Mustacchi 		(hw, I40E_AQ_RUN_PHY_ACT_ID_USR_DFND,
7070*df36e06dSRobert Mustacchi 		I40E_AQ_RUN_PHY_ACT_DNL_OPCODE_GET_EEE_DUR,
7071*df36e06dSRobert Mustacchi 		&cmd_status, &tx_time_dur, &rx_time_dur, NULL);
7072*df36e06dSRobert Mustacchi 
7073*df36e06dSRobert Mustacchi 	if (retval)
7074*df36e06dSRobert Mustacchi 		return retval;
7075*df36e06dSRobert Mustacchi 	if ((cmd_status & I40E_AQ_RUN_PHY_ACT_CMD_STAT_MASK) !=
7076*df36e06dSRobert Mustacchi 	    I40E_AQ_RUN_PHY_ACT_CMD_STAT_SUCC)
7077*df36e06dSRobert Mustacchi 		return I40E_ERR_ADMIN_QUEUE_ERROR;
7078*df36e06dSRobert Mustacchi 
7079*df36e06dSRobert Mustacchi 	if (hw->phy.link_info.link_speed == I40E_LINK_SPEED_1GB &&
7080*df36e06dSRobert Mustacchi 	    !tx_time_dur && !rx_time_dur &&
7081*df36e06dSRobert Mustacchi 	    stat->tx_lpi_status && stat->rx_lpi_status) {
7082*df36e06dSRobert Mustacchi 		retval = i40e_aq_run_phy_activity
7083*df36e06dSRobert Mustacchi 			(hw, I40E_AQ_RUN_PHY_ACT_ID_USR_DFND,
7084*df36e06dSRobert Mustacchi 			I40E_AQ_RUN_PHY_ACT_DNL_OPCODE_GET_EEE_STAT_DUR,
7085*df36e06dSRobert Mustacchi 			&cmd_status,
7086*df36e06dSRobert Mustacchi 			&tx_time_dur, &rx_time_dur, NULL);
7087*df36e06dSRobert Mustacchi 
7088*df36e06dSRobert Mustacchi 		if (retval)
7089*df36e06dSRobert Mustacchi 			return retval;
7090*df36e06dSRobert Mustacchi 		if ((cmd_status & I40E_AQ_RUN_PHY_ACT_CMD_STAT_MASK) !=
7091*df36e06dSRobert Mustacchi 		    I40E_AQ_RUN_PHY_ACT_CMD_STAT_SUCC)
7092*df36e06dSRobert Mustacchi 			return I40E_ERR_ADMIN_QUEUE_ERROR;
7093*df36e06dSRobert Mustacchi 		tx_time_dur = 0;
7094*df36e06dSRobert Mustacchi 		rx_time_dur = 0;
7095*df36e06dSRobert Mustacchi 	}
7096*df36e06dSRobert Mustacchi 
7097*df36e06dSRobert Mustacchi 	*tx_duration = tx_time_dur;
7098*df36e06dSRobert Mustacchi 	*rx_duration = rx_time_dur;
7099*df36e06dSRobert Mustacchi 
7100*df36e06dSRobert Mustacchi 	return retval;
7101*df36e06dSRobert Mustacchi }
7102*df36e06dSRobert Mustacchi 
7103*df36e06dSRobert Mustacchi /**
7104*df36e06dSRobert Mustacchi  * i40e_lpi_stat_update - update LPI counters with values relative to offset
7105*df36e06dSRobert Mustacchi  * @hw: pointer to the hw struct
7106*df36e06dSRobert Mustacchi  * @offset_loaded: flag indicating need of writing current value to offset
7107*df36e06dSRobert Mustacchi  * @tx_offset: pointer to offset of TX LPI counter
7108*df36e06dSRobert Mustacchi  * @tx_stat: pointer to value of TX LPI counter
7109*df36e06dSRobert Mustacchi  * @rx_offset: pointer to offset of RX LPI counter
7110*df36e06dSRobert Mustacchi  * @rx_stat: pointer to value of RX LPI counter
7111*df36e06dSRobert Mustacchi  *
7112*df36e06dSRobert Mustacchi  * Update Low Power Idle (LPI) mode counters while having regard to passed
7113*df36e06dSRobert Mustacchi  * offsets.
7114*df36e06dSRobert Mustacchi  **/
i40e_lpi_stat_update(struct i40e_hw * hw,bool offset_loaded,u64 * tx_offset,u64 * tx_stat,u64 * rx_offset,u64 * rx_stat)7115*df36e06dSRobert Mustacchi enum i40e_status_code i40e_lpi_stat_update(struct i40e_hw *hw,
7116*df36e06dSRobert Mustacchi 					   bool offset_loaded, u64 *tx_offset,
7117*df36e06dSRobert Mustacchi 					   u64 *tx_stat, u64 *rx_offset,
7118*df36e06dSRobert Mustacchi 					   u64 *rx_stat)
7119*df36e06dSRobert Mustacchi {
7120*df36e06dSRobert Mustacchi 	enum i40e_status_code retval;
7121*df36e06dSRobert Mustacchi 	u32 tx_counter, rx_counter;
7122*df36e06dSRobert Mustacchi 	bool is_clear;
7123*df36e06dSRobert Mustacchi 
7124*df36e06dSRobert Mustacchi 	retval = i40e_get_lpi_counters(hw, &tx_counter, &rx_counter, &is_clear);
7125*df36e06dSRobert Mustacchi 	if (retval)
7126*df36e06dSRobert Mustacchi 		goto err;
7127*df36e06dSRobert Mustacchi 
7128*df36e06dSRobert Mustacchi 	if (is_clear) {
7129*df36e06dSRobert Mustacchi 		*tx_stat += tx_counter;
7130*df36e06dSRobert Mustacchi 		*rx_stat += rx_counter;
7131*df36e06dSRobert Mustacchi 	} else {
7132*df36e06dSRobert Mustacchi 		if (!offset_loaded) {
7133*df36e06dSRobert Mustacchi 			*tx_offset = tx_counter;
7134*df36e06dSRobert Mustacchi 			*rx_offset = rx_counter;
7135*df36e06dSRobert Mustacchi 		}
7136*df36e06dSRobert Mustacchi 
7137*df36e06dSRobert Mustacchi 		*tx_stat = (tx_counter >= *tx_offset) ?
7138*df36e06dSRobert Mustacchi 			(u32)(tx_counter - *tx_offset) :
7139*df36e06dSRobert Mustacchi 			(u32)((tx_counter + BIT_ULL(32)) - *tx_offset);
7140*df36e06dSRobert Mustacchi 		*rx_stat = (rx_counter >= *rx_offset) ?
7141*df36e06dSRobert Mustacchi 			(u32)(rx_counter - *rx_offset) :
7142*df36e06dSRobert Mustacchi 			(u32)((rx_counter + BIT_ULL(32)) - *rx_offset);
7143*df36e06dSRobert Mustacchi 	}
7144*df36e06dSRobert Mustacchi err:
7145*df36e06dSRobert Mustacchi 	return retval;
7146*df36e06dSRobert Mustacchi }
7147*df36e06dSRobert Mustacchi 
7148396505afSPaul Winder /**
7149396505afSPaul Winder  * i40e_aq_rx_ctl_read_register - use FW to read from an Rx control register
7150396505afSPaul Winder  * @hw: pointer to the hw struct
7151396505afSPaul Winder  * @reg_addr: register address
7152396505afSPaul Winder  * @reg_val: ptr to register value
7153396505afSPaul Winder  * @cmd_details: pointer to command details structure or NULL
7154396505afSPaul Winder  *
7155396505afSPaul Winder  * Use the firmware to read the Rx control register,
7156396505afSPaul Winder  * especially useful if the Rx unit is under heavy pressure
7157396505afSPaul Winder  **/
i40e_aq_rx_ctl_read_register(struct i40e_hw * hw,u32 reg_addr,u32 * reg_val,struct i40e_asq_cmd_details * cmd_details)7158396505afSPaul Winder enum i40e_status_code i40e_aq_rx_ctl_read_register(struct i40e_hw *hw,
7159396505afSPaul Winder 				u32 reg_addr, u32 *reg_val,
7160396505afSPaul Winder 				struct i40e_asq_cmd_details *cmd_details)
7161396505afSPaul Winder {
7162396505afSPaul Winder 	struct i40e_aq_desc desc;
7163396505afSPaul Winder 	struct i40e_aqc_rx_ctl_reg_read_write *cmd_resp =
7164396505afSPaul Winder 		(struct i40e_aqc_rx_ctl_reg_read_write *)&desc.params.raw;
7165396505afSPaul Winder 	enum i40e_status_code status;
7166396505afSPaul Winder 
7167396505afSPaul Winder 	if (reg_val == NULL)
7168396505afSPaul Winder 		return I40E_ERR_PARAM;
7169396505afSPaul Winder 
7170396505afSPaul Winder 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_rx_ctl_reg_read);
7171396505afSPaul Winder 
7172396505afSPaul Winder 	cmd_resp->address = CPU_TO_LE32(reg_addr);
7173396505afSPaul Winder 
7174396505afSPaul Winder 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
7175396505afSPaul Winder 
7176396505afSPaul Winder 	if (status == I40E_SUCCESS)
7177396505afSPaul Winder 		*reg_val = LE32_TO_CPU(cmd_resp->value);
7178396505afSPaul Winder 
7179396505afSPaul Winder 	return status;
7180396505afSPaul Winder }
7181396505afSPaul Winder 
7182396505afSPaul Winder /**
7183396505afSPaul Winder  * i40e_read_rx_ctl - read from an Rx control register
7184396505afSPaul Winder  * @hw: pointer to the hw struct
7185396505afSPaul Winder  * @reg_addr: register address
7186396505afSPaul Winder  **/
i40e_read_rx_ctl(struct i40e_hw * hw,u32 reg_addr)7187396505afSPaul Winder u32 i40e_read_rx_ctl(struct i40e_hw *hw, u32 reg_addr)
7188396505afSPaul Winder {
7189396505afSPaul Winder 	enum i40e_status_code status = I40E_SUCCESS;
7190396505afSPaul Winder 	bool use_register;
7191396505afSPaul Winder 	int retry = 5;
7192396505afSPaul Winder 	u32 val = 0;
7193396505afSPaul Winder 
719493f1cac5SPaul Winder 	use_register = (((hw->aq.api_maj_ver == 1) &&
719593f1cac5SPaul Winder 			(hw->aq.api_min_ver < 5)) ||
719693f1cac5SPaul Winder 			(hw->mac.type == I40E_MAC_X722));
7197396505afSPaul Winder 	if (!use_register) {
7198396505afSPaul Winder do_retry:
7199396505afSPaul Winder 		status = i40e_aq_rx_ctl_read_register(hw, reg_addr, &val, NULL);
7200396505afSPaul Winder 		if (hw->aq.asq_last_status == I40E_AQ_RC_EAGAIN && retry) {
7201396505afSPaul Winder 			i40e_msec_delay(1);
7202396505afSPaul Winder 			retry--;
7203396505afSPaul Winder 			goto do_retry;
7204396505afSPaul Winder 		}
7205396505afSPaul Winder 	}
7206396505afSPaul Winder 
7207396505afSPaul Winder 	/* if the AQ access failed, try the old-fashioned way */
7208396505afSPaul Winder 	if (status || use_register)
7209396505afSPaul Winder 		val = rd32(hw, reg_addr);
7210396505afSPaul Winder 
7211396505afSPaul Winder 	return val;
7212396505afSPaul Winder }
7213396505afSPaul Winder 
7214396505afSPaul Winder /**
7215396505afSPaul Winder  * i40e_aq_rx_ctl_write_register
7216396505afSPaul Winder  * @hw: pointer to the hw struct
7217396505afSPaul Winder  * @reg_addr: register address
7218396505afSPaul Winder  * @reg_val: register value
7219396505afSPaul Winder  * @cmd_details: pointer to command details structure or NULL
7220396505afSPaul Winder  *
7221396505afSPaul Winder  * Use the firmware to write to an Rx control register,
7222396505afSPaul Winder  * especially useful if the Rx unit is under heavy pressure
7223396505afSPaul Winder  **/
i40e_aq_rx_ctl_write_register(struct i40e_hw * hw,u32 reg_addr,u32 reg_val,struct i40e_asq_cmd_details * cmd_details)7224396505afSPaul Winder enum i40e_status_code i40e_aq_rx_ctl_write_register(struct i40e_hw *hw,
7225396505afSPaul Winder 				u32 reg_addr, u32 reg_val,
7226396505afSPaul Winder 				struct i40e_asq_cmd_details *cmd_details)
7227396505afSPaul Winder {
7228396505afSPaul Winder 	struct i40e_aq_desc desc;
7229396505afSPaul Winder 	struct i40e_aqc_rx_ctl_reg_read_write *cmd =
7230396505afSPaul Winder 		(struct i40e_aqc_rx_ctl_reg_read_write *)&desc.params.raw;
7231396505afSPaul Winder 	enum i40e_status_code status;
7232396505afSPaul Winder 
7233396505afSPaul Winder 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_rx_ctl_reg_write);
7234396505afSPaul Winder 
7235396505afSPaul Winder 	cmd->address = CPU_TO_LE32(reg_addr);
7236396505afSPaul Winder 	cmd->value = CPU_TO_LE32(reg_val);
7237396505afSPaul Winder 
7238396505afSPaul Winder 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
7239396505afSPaul Winder 
7240396505afSPaul Winder 	return status;
7241396505afSPaul Winder }
7242396505afSPaul Winder 
7243396505afSPaul Winder /**
7244396505afSPaul Winder  * i40e_write_rx_ctl - write to an Rx control register
7245396505afSPaul Winder  * @hw: pointer to the hw struct
7246396505afSPaul Winder  * @reg_addr: register address
7247396505afSPaul Winder  * @reg_val: register value
7248396505afSPaul Winder  **/
i40e_write_rx_ctl(struct i40e_hw * hw,u32 reg_addr,u32 reg_val)7249396505afSPaul Winder void i40e_write_rx_ctl(struct i40e_hw *hw, u32 reg_addr, u32 reg_val)
7250396505afSPaul Winder {
7251396505afSPaul Winder 	enum i40e_status_code status = I40E_SUCCESS;
7252396505afSPaul Winder 	bool use_register;
7253396505afSPaul Winder 	int retry = 5;
7254396505afSPaul Winder 
725593f1cac5SPaul Winder 	use_register = (((hw->aq.api_maj_ver == 1) &&
725693f1cac5SPaul Winder 			(hw->aq.api_min_ver < 5)) ||
725793f1cac5SPaul Winder 			(hw->mac.type == I40E_MAC_X722));
7258396505afSPaul Winder 	if (!use_register) {
7259396505afSPaul Winder do_retry:
7260396505afSPaul Winder 		status = i40e_aq_rx_ctl_write_register(hw, reg_addr,
7261396505afSPaul Winder 						       reg_val, NULL);
7262396505afSPaul Winder 		if (hw->aq.asq_last_status == I40E_AQ_RC_EAGAIN && retry) {
7263396505afSPaul Winder 			i40e_msec_delay(1);
7264396505afSPaul Winder 			retry--;
7265396505afSPaul Winder 			goto do_retry;
7266396505afSPaul Winder 		}
7267396505afSPaul Winder 	}
7268396505afSPaul Winder 
7269396505afSPaul Winder 	/* if the AQ access failed, try the old-fashioned way */
7270396505afSPaul Winder 	if (status || use_register)
7271396505afSPaul Winder 		wr32(hw, reg_addr, reg_val);
7272396505afSPaul Winder }
7273396505afSPaul Winder 
7274*df36e06dSRobert Mustacchi /**
7275*df36e06dSRobert Mustacchi  * i40e_mdio_if_number_selection - MDIO I/F number selection
7276*df36e06dSRobert Mustacchi  * @hw: pointer to the hw struct
7277*df36e06dSRobert Mustacchi  * @set_mdio: use MDIO I/F number specified by mdio_num
7278*df36e06dSRobert Mustacchi  * @mdio_num: MDIO I/F number
7279*df36e06dSRobert Mustacchi  * @cmd: pointer to PHY Register command structure
7280*df36e06dSRobert Mustacchi  **/
7281*df36e06dSRobert Mustacchi static void
i40e_mdio_if_number_selection(struct i40e_hw * hw,bool set_mdio,u8 mdio_num,struct i40e_aqc_phy_register_access * cmd)7282*df36e06dSRobert Mustacchi i40e_mdio_if_number_selection(struct i40e_hw *hw, bool set_mdio, u8 mdio_num,
7283*df36e06dSRobert Mustacchi 			      struct i40e_aqc_phy_register_access *cmd)
7284*df36e06dSRobert Mustacchi {
7285*df36e06dSRobert Mustacchi 	if (set_mdio && cmd->phy_interface == I40E_AQ_PHY_REG_ACCESS_EXTERNAL) {
7286*df36e06dSRobert Mustacchi 		if (hw->flags & I40E_HW_FLAG_AQ_PHY_ACCESS_EXTENDED)
7287*df36e06dSRobert Mustacchi 			cmd->cmd_flags |=
7288*df36e06dSRobert Mustacchi 				I40E_AQ_PHY_REG_ACCESS_SET_MDIO_IF_NUMBER |
7289*df36e06dSRobert Mustacchi 				((mdio_num <<
7290*df36e06dSRobert Mustacchi 				I40E_AQ_PHY_REG_ACCESS_MDIO_IF_NUMBER_SHIFT) &
7291*df36e06dSRobert Mustacchi 				I40E_AQ_PHY_REG_ACCESS_MDIO_IF_NUMBER_MASK);
7292*df36e06dSRobert Mustacchi 		else
7293*df36e06dSRobert Mustacchi 			i40e_debug(hw, I40E_DEBUG_PHY,
7294*df36e06dSRobert Mustacchi 				   "MDIO I/F number selection not supported by current FW version.\n");
7295*df36e06dSRobert Mustacchi 	}
7296*df36e06dSRobert Mustacchi }
7297286d309cSRobert Mustacchi 
7298286d309cSRobert Mustacchi /**
7299*df36e06dSRobert Mustacchi  * i40e_aq_set_phy_register_ext
7300286d309cSRobert Mustacchi  * @hw: pointer to the hw struct
7301286d309cSRobert Mustacchi  * @phy_select: select which phy should be accessed
7302286d309cSRobert Mustacchi  * @dev_addr: PHY device address
7303*df36e06dSRobert Mustacchi  * @page_change: enable auto page change
7304*df36e06dSRobert Mustacchi  * @set_mdio: use MDIO I/F number specified by mdio_num
7305*df36e06dSRobert Mustacchi  * @mdio_num: MDIO I/F number
7306286d309cSRobert Mustacchi  * @reg_addr: PHY register address
7307286d309cSRobert Mustacchi  * @reg_val: new register value
7308286d309cSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
7309286d309cSRobert Mustacchi  *
7310286d309cSRobert Mustacchi  * Write the external PHY register.
7311*df36e06dSRobert Mustacchi  * NOTE: In common cases MDIO I/F number should not be changed, thats why you
7312*df36e06dSRobert Mustacchi  * may use simple wrapper i40e_aq_set_phy_register.
7313286d309cSRobert Mustacchi  **/
7314*df36e06dSRobert Mustacchi enum i40e_status_code
i40e_aq_set_phy_register_ext(struct i40e_hw * hw,u8 phy_select,u8 dev_addr,bool page_change,bool set_mdio,u8 mdio_num,u32 reg_addr,u32 reg_val,struct i40e_asq_cmd_details * cmd_details)7315*df36e06dSRobert Mustacchi i40e_aq_set_phy_register_ext(struct i40e_hw *hw,
7316*df36e06dSRobert Mustacchi 			     u8 phy_select, u8 dev_addr, bool page_change,
7317*df36e06dSRobert Mustacchi 			     bool set_mdio, u8 mdio_num,
7318*df36e06dSRobert Mustacchi 			     u32 reg_addr, u32 reg_val,
7319*df36e06dSRobert Mustacchi 			     struct i40e_asq_cmd_details *cmd_details)
7320286d309cSRobert Mustacchi {
7321286d309cSRobert Mustacchi 	struct i40e_aq_desc desc;
7322286d309cSRobert Mustacchi 	struct i40e_aqc_phy_register_access *cmd =
7323286d309cSRobert Mustacchi 		(struct i40e_aqc_phy_register_access *)&desc.params.raw;
7324286d309cSRobert Mustacchi 	enum i40e_status_code status;
7325286d309cSRobert Mustacchi 
7326286d309cSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
7327286d309cSRobert Mustacchi 					  i40e_aqc_opc_set_phy_register);
7328286d309cSRobert Mustacchi 
7329286d309cSRobert Mustacchi 	cmd->phy_interface = phy_select;
7330286d309cSRobert Mustacchi 	cmd->dev_addres = dev_addr;
7331*df36e06dSRobert Mustacchi 	cmd->reg_address = CPU_TO_LE32(reg_addr);
7332*df36e06dSRobert Mustacchi 	cmd->reg_value = CPU_TO_LE32(reg_val);
7333*df36e06dSRobert Mustacchi 
7334*df36e06dSRobert Mustacchi 	if (!page_change)
7335*df36e06dSRobert Mustacchi 		cmd->cmd_flags = I40E_AQ_PHY_REG_ACCESS_DONT_CHANGE_QSFP_PAGE;
7336*df36e06dSRobert Mustacchi 
7337*df36e06dSRobert Mustacchi 	i40e_mdio_if_number_selection(hw, set_mdio, mdio_num, cmd);
7338286d309cSRobert Mustacchi 
7339286d309cSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
7340286d309cSRobert Mustacchi 
7341286d309cSRobert Mustacchi 	return status;
7342286d309cSRobert Mustacchi }
7343286d309cSRobert Mustacchi 
7344286d309cSRobert Mustacchi /**
7345*df36e06dSRobert Mustacchi  * i40e_aq_get_phy_register_ext
7346286d309cSRobert Mustacchi  * @hw: pointer to the hw struct
7347286d309cSRobert Mustacchi  * @phy_select: select which phy should be accessed
7348286d309cSRobert Mustacchi  * @dev_addr: PHY device address
7349*df36e06dSRobert Mustacchi  * @page_change: enable auto page change
7350*df36e06dSRobert Mustacchi  * @set_mdio: use MDIO I/F number specified by mdio_num
7351*df36e06dSRobert Mustacchi  * @mdio_num: MDIO I/F number
7352286d309cSRobert Mustacchi  * @reg_addr: PHY register address
7353286d309cSRobert Mustacchi  * @reg_val: read register value
7354286d309cSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
7355286d309cSRobert Mustacchi  *
7356286d309cSRobert Mustacchi  * Read the external PHY register.
7357*df36e06dSRobert Mustacchi  * NOTE: In common cases MDIO I/F number should not be changed, thats why you
7358*df36e06dSRobert Mustacchi  * may use simple wrapper i40e_aq_get_phy_register.
7359286d309cSRobert Mustacchi  **/
7360*df36e06dSRobert Mustacchi enum i40e_status_code
i40e_aq_get_phy_register_ext(struct i40e_hw * hw,u8 phy_select,u8 dev_addr,bool page_change,bool set_mdio,u8 mdio_num,u32 reg_addr,u32 * reg_val,struct i40e_asq_cmd_details * cmd_details)7361*df36e06dSRobert Mustacchi i40e_aq_get_phy_register_ext(struct i40e_hw *hw,
7362*df36e06dSRobert Mustacchi 			     u8 phy_select, u8 dev_addr, bool page_change,
7363*df36e06dSRobert Mustacchi 			     bool set_mdio, u8 mdio_num,
7364*df36e06dSRobert Mustacchi 			     u32 reg_addr, u32 *reg_val,
7365*df36e06dSRobert Mustacchi 			     struct i40e_asq_cmd_details *cmd_details)
7366286d309cSRobert Mustacchi {
7367286d309cSRobert Mustacchi 	struct i40e_aq_desc desc;
7368286d309cSRobert Mustacchi 	struct i40e_aqc_phy_register_access *cmd =
7369286d309cSRobert Mustacchi 		(struct i40e_aqc_phy_register_access *)&desc.params.raw;
7370286d309cSRobert Mustacchi 	enum i40e_status_code status;
7371286d309cSRobert Mustacchi 
7372286d309cSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
7373286d309cSRobert Mustacchi 					  i40e_aqc_opc_get_phy_register);
7374286d309cSRobert Mustacchi 
7375286d309cSRobert Mustacchi 	cmd->phy_interface = phy_select;
7376286d309cSRobert Mustacchi 	cmd->dev_addres = dev_addr;
7377*df36e06dSRobert Mustacchi 	cmd->reg_address = CPU_TO_LE32(reg_addr);
7378*df36e06dSRobert Mustacchi 
7379*df36e06dSRobert Mustacchi 	if (!page_change)
7380*df36e06dSRobert Mustacchi 		cmd->cmd_flags = I40E_AQ_PHY_REG_ACCESS_DONT_CHANGE_QSFP_PAGE;
7381*df36e06dSRobert Mustacchi 
7382*df36e06dSRobert Mustacchi 	i40e_mdio_if_number_selection(hw, set_mdio, mdio_num, cmd);
7383286d309cSRobert Mustacchi 
7384286d309cSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
7385286d309cSRobert Mustacchi 	if (!status)
7386*df36e06dSRobert Mustacchi 		*reg_val = LE32_TO_CPU(cmd->reg_value);
7387*df36e06dSRobert Mustacchi 
7388*df36e06dSRobert Mustacchi 	return status;
7389*df36e06dSRobert Mustacchi }
7390*df36e06dSRobert Mustacchi 
7391*df36e06dSRobert Mustacchi /**
7392*df36e06dSRobert Mustacchi  * i40e_aq_run_phy_activity
7393*df36e06dSRobert Mustacchi  * @hw: pointer to the hw struct
7394*df36e06dSRobert Mustacchi  * @activity_id: ID of DNL activity to run
7395*df36e06dSRobert Mustacchi  * @dnl_opcode: opcode passed to DNL script
7396*df36e06dSRobert Mustacchi  * @cmd_status: pointer to memory to write return value of DNL script
7397*df36e06dSRobert Mustacchi  * @data0: pointer to memory for first 4 bytes of data returned by DNL script
7398*df36e06dSRobert Mustacchi  * @data1: pointer to memory for last 4 bytes of data returned by DNL script
7399*df36e06dSRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
7400*df36e06dSRobert Mustacchi  *
7401*df36e06dSRobert Mustacchi  * Run DNL admin command.
7402*df36e06dSRobert Mustacchi  **/
7403*df36e06dSRobert Mustacchi enum i40e_status_code
i40e_aq_run_phy_activity(struct i40e_hw * hw,u16 activity_id,u32 dnl_opcode,u32 * cmd_status,u32 * data0,u32 * data1,struct i40e_asq_cmd_details * cmd_details)7404*df36e06dSRobert Mustacchi i40e_aq_run_phy_activity(struct i40e_hw *hw, u16 activity_id, u32 dnl_opcode,
7405*df36e06dSRobert Mustacchi 			 u32 *cmd_status, u32 *data0, u32 *data1,
7406*df36e06dSRobert Mustacchi 			 struct i40e_asq_cmd_details *cmd_details)
7407*df36e06dSRobert Mustacchi {
7408*df36e06dSRobert Mustacchi 	struct i40e_aqc_run_phy_activity *cmd;
7409*df36e06dSRobert Mustacchi 	enum i40e_status_code retval;
7410*df36e06dSRobert Mustacchi 	struct i40e_aq_desc desc;
7411*df36e06dSRobert Mustacchi 
7412*df36e06dSRobert Mustacchi 	cmd = (struct i40e_aqc_run_phy_activity *)&desc.params.raw;
7413*df36e06dSRobert Mustacchi 
7414*df36e06dSRobert Mustacchi 	if (!cmd_status || !data0 || !data1) {
7415*df36e06dSRobert Mustacchi 		retval = I40E_ERR_PARAM;
7416*df36e06dSRobert Mustacchi 		goto err;
7417*df36e06dSRobert Mustacchi 	}
7418*df36e06dSRobert Mustacchi 
7419*df36e06dSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
7420*df36e06dSRobert Mustacchi 					  i40e_aqc_opc_run_phy_activity);
7421*df36e06dSRobert Mustacchi 
7422*df36e06dSRobert Mustacchi 	cmd->activity_id = CPU_TO_LE16(activity_id);
7423*df36e06dSRobert Mustacchi 	cmd->params.cmd.dnl_opcode = CPU_TO_LE32(dnl_opcode);
7424*df36e06dSRobert Mustacchi 
7425*df36e06dSRobert Mustacchi 	retval = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
7426*df36e06dSRobert Mustacchi 	if (retval)
7427*df36e06dSRobert Mustacchi 		goto err;
7428*df36e06dSRobert Mustacchi 
7429*df36e06dSRobert Mustacchi 	*cmd_status = LE32_TO_CPU(cmd->params.resp.cmd_status);
7430*df36e06dSRobert Mustacchi 	*data0 = LE32_TO_CPU(cmd->params.resp.data0);
7431*df36e06dSRobert Mustacchi 	*data1 = LE32_TO_CPU(cmd->params.resp.data1);
7432*df36e06dSRobert Mustacchi err:
7433*df36e06dSRobert Mustacchi 	return retval;
7434*df36e06dSRobert Mustacchi }
7435*df36e06dSRobert Mustacchi 
7436*df36e06dSRobert Mustacchi 
7437*df36e06dSRobert Mustacchi /**
7438*df36e06dSRobert Mustacchi  * i40e_aq_send_msg_to_pf
7439*df36e06dSRobert Mustacchi  * @hw: pointer to the hardware structure
7440*df36e06dSRobert Mustacchi  * @v_opcode: opcodes for VF-PF communication
7441*df36e06dSRobert Mustacchi  * @v_retval: return error code
7442*df36e06dSRobert Mustacchi  * @msg: pointer to the msg buffer
7443*df36e06dSRobert Mustacchi  * @msglen: msg length
7444*df36e06dSRobert Mustacchi  * @cmd_details: pointer to command details
7445*df36e06dSRobert Mustacchi  *
7446*df36e06dSRobert Mustacchi  * Send message to PF driver using admin queue. By default, this message
7447*df36e06dSRobert Mustacchi  * is sent asynchronously, i.e. i40e_asq_send_command() does not wait for
7448*df36e06dSRobert Mustacchi  * completion before returning.
7449*df36e06dSRobert Mustacchi  **/
i40e_aq_send_msg_to_pf(struct i40e_hw * hw,enum virtchnl_ops v_opcode,enum i40e_status_code v_retval,u8 * msg,u16 msglen,struct i40e_asq_cmd_details * cmd_details)7450*df36e06dSRobert Mustacchi enum i40e_status_code i40e_aq_send_msg_to_pf(struct i40e_hw *hw,
7451*df36e06dSRobert Mustacchi 				enum virtchnl_ops v_opcode,
7452*df36e06dSRobert Mustacchi 				enum i40e_status_code v_retval,
7453*df36e06dSRobert Mustacchi 				u8 *msg, u16 msglen,
7454*df36e06dSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
7455*df36e06dSRobert Mustacchi {
7456*df36e06dSRobert Mustacchi 	struct i40e_aq_desc desc;
7457*df36e06dSRobert Mustacchi 	struct i40e_asq_cmd_details details;
7458*df36e06dSRobert Mustacchi 	enum i40e_status_code status;
7459286d309cSRobert Mustacchi 
7460*df36e06dSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_send_msg_to_pf);
7461*df36e06dSRobert Mustacchi 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_SI);
7462*df36e06dSRobert Mustacchi 	desc.cookie_high = CPU_TO_LE32(v_opcode);
7463*df36e06dSRobert Mustacchi 	desc.cookie_low = CPU_TO_LE32(v_retval);
7464*df36e06dSRobert Mustacchi 	if (msglen) {
7465*df36e06dSRobert Mustacchi 		desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF
7466*df36e06dSRobert Mustacchi 						| I40E_AQ_FLAG_RD));
7467*df36e06dSRobert Mustacchi 		if (msglen > I40E_AQ_LARGE_BUF)
7468*df36e06dSRobert Mustacchi 			desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
7469*df36e06dSRobert Mustacchi 		desc.datalen = CPU_TO_LE16(msglen);
7470*df36e06dSRobert Mustacchi 	}
7471*df36e06dSRobert Mustacchi 	if (!cmd_details) {
7472*df36e06dSRobert Mustacchi 		i40e_memset(&details, 0, sizeof(details), I40E_NONDMA_MEM);
7473*df36e06dSRobert Mustacchi 		details.async = TRUE;
7474*df36e06dSRobert Mustacchi 		cmd_details = &details;
7475*df36e06dSRobert Mustacchi 	}
7476*df36e06dSRobert Mustacchi 	status = i40e_asq_send_command(hw, (struct i40e_aq_desc *)&desc, msg,
7477*df36e06dSRobert Mustacchi 				       msglen, cmd_details);
7478286d309cSRobert Mustacchi 	return status;
7479286d309cSRobert Mustacchi }
7480286d309cSRobert Mustacchi 
7481*df36e06dSRobert Mustacchi /**
7482*df36e06dSRobert Mustacchi  * i40e_vf_parse_hw_config
7483*df36e06dSRobert Mustacchi  * @hw: pointer to the hardware structure
7484*df36e06dSRobert Mustacchi  * @msg: pointer to the virtual channel VF resource structure
7485*df36e06dSRobert Mustacchi  *
7486*df36e06dSRobert Mustacchi  * Given a VF resource message from the PF, populate the hw struct
7487*df36e06dSRobert Mustacchi  * with appropriate information.
7488*df36e06dSRobert Mustacchi  **/
i40e_vf_parse_hw_config(struct i40e_hw * hw,struct virtchnl_vf_resource * msg)7489*df36e06dSRobert Mustacchi void i40e_vf_parse_hw_config(struct i40e_hw *hw,
7490*df36e06dSRobert Mustacchi 			     struct virtchnl_vf_resource *msg)
7491*df36e06dSRobert Mustacchi {
7492*df36e06dSRobert Mustacchi 	struct virtchnl_vsi_resource *vsi_res;
7493*df36e06dSRobert Mustacchi 	int i;
7494*df36e06dSRobert Mustacchi 
7495*df36e06dSRobert Mustacchi 	vsi_res = &msg->vsi_res[0];
7496*df36e06dSRobert Mustacchi 
7497*df36e06dSRobert Mustacchi 	hw->dev_caps.num_vsis = msg->num_vsis;
7498*df36e06dSRobert Mustacchi 	hw->dev_caps.num_rx_qp = msg->num_queue_pairs;
7499*df36e06dSRobert Mustacchi 	hw->dev_caps.num_tx_qp = msg->num_queue_pairs;
7500*df36e06dSRobert Mustacchi 	hw->dev_caps.num_msix_vectors_vf = msg->max_vectors;
7501*df36e06dSRobert Mustacchi 	hw->dev_caps.dcb = msg->vf_cap_flags &
7502*df36e06dSRobert Mustacchi 			   VIRTCHNL_VF_OFFLOAD_L2;
7503*df36e06dSRobert Mustacchi 	hw->dev_caps.iwarp = (msg->vf_cap_flags &
7504*df36e06dSRobert Mustacchi 			      VIRTCHNL_VF_OFFLOAD_IWARP) ? 1 : 0;
7505*df36e06dSRobert Mustacchi 	for (i = 0; i < msg->num_vsis; i++) {
7506*df36e06dSRobert Mustacchi 		if (vsi_res->vsi_type == VIRTCHNL_VSI_SRIOV) {
7507*df36e06dSRobert Mustacchi 			i40e_memcpy(hw->mac.perm_addr,
7508*df36e06dSRobert Mustacchi 				    vsi_res->default_mac_addr,
7509*df36e06dSRobert Mustacchi 				    ETH_ALEN,
7510*df36e06dSRobert Mustacchi 				    I40E_NONDMA_TO_NONDMA);
7511*df36e06dSRobert Mustacchi 			i40e_memcpy(hw->mac.addr, vsi_res->default_mac_addr,
7512*df36e06dSRobert Mustacchi 				    ETH_ALEN,
7513*df36e06dSRobert Mustacchi 				    I40E_NONDMA_TO_NONDMA);
7514*df36e06dSRobert Mustacchi 		}
7515*df36e06dSRobert Mustacchi 		vsi_res++;
7516*df36e06dSRobert Mustacchi 	}
7517*df36e06dSRobert Mustacchi }
7518*df36e06dSRobert Mustacchi 
7519*df36e06dSRobert Mustacchi /**
7520*df36e06dSRobert Mustacchi  * i40e_vf_reset
7521*df36e06dSRobert Mustacchi  * @hw: pointer to the hardware structure
7522*df36e06dSRobert Mustacchi  *
7523*df36e06dSRobert Mustacchi  * Send a VF_RESET message to the PF. Does not wait for response from PF
7524*df36e06dSRobert Mustacchi  * as none will be forthcoming. Immediately after calling this function,
7525*df36e06dSRobert Mustacchi  * the admin queue should be shut down and (optionally) reinitialized.
7526*df36e06dSRobert Mustacchi  **/
i40e_vf_reset(struct i40e_hw * hw)7527*df36e06dSRobert Mustacchi enum i40e_status_code i40e_vf_reset(struct i40e_hw *hw)
7528*df36e06dSRobert Mustacchi {
7529*df36e06dSRobert Mustacchi 	return i40e_aq_send_msg_to_pf(hw, VIRTCHNL_OP_RESET_VF,
7530*df36e06dSRobert Mustacchi 				      I40E_SUCCESS, NULL, 0, NULL);
7531*df36e06dSRobert Mustacchi }
7532*df36e06dSRobert Mustacchi 
75339d26e4fcSRobert Mustacchi /**
75343d75a287SRobert Mustacchi  * i40e_aq_set_arp_proxy_config
75353d75a287SRobert Mustacchi  * @hw: pointer to the HW structure
753693f1cac5SPaul Winder  * @proxy_config: pointer to proxy config command table struct
75379d26e4fcSRobert Mustacchi  * @cmd_details: pointer to command details
75389d26e4fcSRobert Mustacchi  *
75393d75a287SRobert Mustacchi  * Set ARP offload parameters from pre-populated
75403d75a287SRobert Mustacchi  * i40e_aqc_arp_proxy_data struct
75419d26e4fcSRobert Mustacchi  **/
i40e_aq_set_arp_proxy_config(struct i40e_hw * hw,struct i40e_aqc_arp_proxy_data * proxy_config,struct i40e_asq_cmd_details * cmd_details)75423d75a287SRobert Mustacchi enum i40e_status_code i40e_aq_set_arp_proxy_config(struct i40e_hw *hw,
75433d75a287SRobert Mustacchi 				struct i40e_aqc_arp_proxy_data *proxy_config,
75449d26e4fcSRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
75459d26e4fcSRobert Mustacchi {
75469d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
75479d26e4fcSRobert Mustacchi 	enum i40e_status_code status;
75489d26e4fcSRobert Mustacchi 
75493d75a287SRobert Mustacchi 	if (!proxy_config)
75503d75a287SRobert Mustacchi 		return I40E_ERR_PARAM;
75513d75a287SRobert Mustacchi 
75523d75a287SRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_set_proxy_config);
75533d75a287SRobert Mustacchi 
7554*df36e06dSRobert Mustacchi 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
7555*df36e06dSRobert Mustacchi 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
75563d75a287SRobert Mustacchi 	desc.params.external.addr_high =
7557*df36e06dSRobert Mustacchi 				  CPU_TO_LE32(I40E_HI_DWORD((u64)proxy_config));
75583d75a287SRobert Mustacchi 	desc.params.external.addr_low =
7559*df36e06dSRobert Mustacchi 				  CPU_TO_LE32(I40E_LO_DWORD((u64)proxy_config));
7560*df36e06dSRobert Mustacchi 	desc.datalen = CPU_TO_LE16(sizeof(struct i40e_aqc_arp_proxy_data));
75613d75a287SRobert Mustacchi 
75623d75a287SRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, proxy_config,
75633d75a287SRobert Mustacchi 				       sizeof(struct i40e_aqc_arp_proxy_data),
75643d75a287SRobert Mustacchi 				       cmd_details);
75653d75a287SRobert Mustacchi 
75669d26e4fcSRobert Mustacchi 	return status;
75679d26e4fcSRobert Mustacchi }
75689d26e4fcSRobert Mustacchi 
75699d26e4fcSRobert Mustacchi /**
75703d75a287SRobert Mustacchi  * i40e_aq_opc_set_ns_proxy_table_entry
75713d75a287SRobert Mustacchi  * @hw: pointer to the HW structure
75723d75a287SRobert Mustacchi  * @ns_proxy_table_entry: pointer to NS table entry command struct
75733d75a287SRobert Mustacchi  * @cmd_details: pointer to command details
75749d26e4fcSRobert Mustacchi  *
75753d75a287SRobert Mustacchi  * Set IPv6 Neighbor Solicitation (NS) protocol offload parameters
75763d75a287SRobert Mustacchi  * from pre-populated i40e_aqc_ns_proxy_data struct
75779d26e4fcSRobert Mustacchi  **/
i40e_aq_set_ns_proxy_table_entry(struct i40e_hw * hw,struct i40e_aqc_ns_proxy_data * ns_proxy_table_entry,struct i40e_asq_cmd_details * cmd_details)75783d75a287SRobert Mustacchi enum i40e_status_code i40e_aq_set_ns_proxy_table_entry(struct i40e_hw *hw,
75793d75a287SRobert Mustacchi 			struct i40e_aqc_ns_proxy_data *ns_proxy_table_entry,
75803d75a287SRobert Mustacchi 			struct i40e_asq_cmd_details *cmd_details)
75819d26e4fcSRobert Mustacchi {
75823d75a287SRobert Mustacchi 	struct i40e_aq_desc desc;
75833d75a287SRobert Mustacchi 	enum i40e_status_code status;
75849d26e4fcSRobert Mustacchi 
75853d75a287SRobert Mustacchi 	if (!ns_proxy_table_entry)
75863d75a287SRobert Mustacchi 		return I40E_ERR_PARAM;
75873d75a287SRobert Mustacchi 
75883d75a287SRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
75893d75a287SRobert Mustacchi 				i40e_aqc_opc_set_ns_proxy_table_entry);
75903d75a287SRobert Mustacchi 
7591*df36e06dSRobert Mustacchi 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
7592*df36e06dSRobert Mustacchi 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
75933d75a287SRobert Mustacchi 	desc.params.external.addr_high =
7594*df36e06dSRobert Mustacchi 		CPU_TO_LE32(I40E_HI_DWORD((u64)ns_proxy_table_entry));
75953d75a287SRobert Mustacchi 	desc.params.external.addr_low =
7596*df36e06dSRobert Mustacchi 		CPU_TO_LE32(I40E_LO_DWORD((u64)ns_proxy_table_entry));
7597*df36e06dSRobert Mustacchi 	desc.datalen = CPU_TO_LE16(sizeof(struct i40e_aqc_ns_proxy_data));
75983d75a287SRobert Mustacchi 
75993d75a287SRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, ns_proxy_table_entry,
76003d75a287SRobert Mustacchi 				       sizeof(struct i40e_aqc_ns_proxy_data),
76013d75a287SRobert Mustacchi 				       cmd_details);
76023d75a287SRobert Mustacchi 
76033d75a287SRobert Mustacchi 	return status;
76043d75a287SRobert Mustacchi }
76053d75a287SRobert Mustacchi 
76063d75a287SRobert Mustacchi /**
76073d75a287SRobert Mustacchi  * i40e_aq_set_clear_wol_filter
76083d75a287SRobert Mustacchi  * @hw: pointer to the hw struct
76093d75a287SRobert Mustacchi  * @filter_index: index of filter to modify (0-7)
76103d75a287SRobert Mustacchi  * @filter: buffer containing filter to be set
76113d75a287SRobert Mustacchi  * @set_filter: TRUE to set filter, FALSE to clear filter
76123d75a287SRobert Mustacchi  * @no_wol_tco: if TRUE, pass through packets cannot cause wake-up
76133d75a287SRobert Mustacchi  *		if FALSE, pass through packets may cause wake-up
76143d75a287SRobert Mustacchi  * @filter_valid: TRUE if filter action is valid
76153d75a287SRobert Mustacchi  * @no_wol_tco_valid: TRUE if no WoL in TCO traffic action valid
76163d75a287SRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
76173d75a287SRobert Mustacchi  *
76183d75a287SRobert Mustacchi  * Set or clear WoL filter for port attached to the PF
76193d75a287SRobert Mustacchi  **/
i40e_aq_set_clear_wol_filter(struct i40e_hw * hw,u8 filter_index,struct i40e_aqc_set_wol_filter_data * filter,bool set_filter,bool no_wol_tco,bool filter_valid,bool no_wol_tco_valid,struct i40e_asq_cmd_details * cmd_details)76203d75a287SRobert Mustacchi enum i40e_status_code i40e_aq_set_clear_wol_filter(struct i40e_hw *hw,
76213d75a287SRobert Mustacchi 				u8 filter_index,
76223d75a287SRobert Mustacchi 				struct i40e_aqc_set_wol_filter_data *filter,
76233d75a287SRobert Mustacchi 				bool set_filter, bool no_wol_tco,
76243d75a287SRobert Mustacchi 				bool filter_valid, bool no_wol_tco_valid,
76253d75a287SRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
76263d75a287SRobert Mustacchi {
76273d75a287SRobert Mustacchi 	struct i40e_aq_desc desc;
76283d75a287SRobert Mustacchi 	struct i40e_aqc_set_wol_filter *cmd =
76293d75a287SRobert Mustacchi 		(struct i40e_aqc_set_wol_filter *)&desc.params.raw;
76303d75a287SRobert Mustacchi 	enum i40e_status_code status;
76313d75a287SRobert Mustacchi 	u16 cmd_flags = 0;
76323d75a287SRobert Mustacchi 	u16 valid_flags = 0;
76333d75a287SRobert Mustacchi 	u16 buff_len = 0;
76343d75a287SRobert Mustacchi 
76353d75a287SRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_set_wol_filter);
76363d75a287SRobert Mustacchi 
76373d75a287SRobert Mustacchi 	if (filter_index >= I40E_AQC_MAX_NUM_WOL_FILTERS)
76383d75a287SRobert Mustacchi 		return  I40E_ERR_PARAM;
76393d75a287SRobert Mustacchi 	cmd->filter_index = CPU_TO_LE16(filter_index);
76403d75a287SRobert Mustacchi 
76413d75a287SRobert Mustacchi 	if (set_filter) {
76423d75a287SRobert Mustacchi 		if (!filter)
76433d75a287SRobert Mustacchi 			return  I40E_ERR_PARAM;
7644*df36e06dSRobert Mustacchi 
76453d75a287SRobert Mustacchi 		cmd_flags |= I40E_AQC_SET_WOL_FILTER;
7646*df36e06dSRobert Mustacchi 		cmd_flags |= I40E_AQC_SET_WOL_FILTER_WOL_PRESERVE_ON_PFR;
76479d26e4fcSRobert Mustacchi 	}
7648*df36e06dSRobert Mustacchi 
76493d75a287SRobert Mustacchi 	if (no_wol_tco)
76503d75a287SRobert Mustacchi 		cmd_flags |= I40E_AQC_SET_WOL_FILTER_NO_TCO_WOL;
76513d75a287SRobert Mustacchi 	cmd->cmd_flags = CPU_TO_LE16(cmd_flags);
76523d75a287SRobert Mustacchi 
76533d75a287SRobert Mustacchi 	if (filter_valid)
76543d75a287SRobert Mustacchi 		valid_flags |= I40E_AQC_SET_WOL_FILTER_ACTION_VALID;
76553d75a287SRobert Mustacchi 	if (no_wol_tco_valid)
76563d75a287SRobert Mustacchi 		valid_flags |= I40E_AQC_SET_WOL_FILTER_NO_TCO_ACTION_VALID;
76573d75a287SRobert Mustacchi 	cmd->valid_flags = CPU_TO_LE16(valid_flags);
76583d75a287SRobert Mustacchi 
7659*df36e06dSRobert Mustacchi 	buff_len = sizeof(*filter);
7660*df36e06dSRobert Mustacchi 	desc.datalen = CPU_TO_LE16(buff_len);
7661*df36e06dSRobert Mustacchi 
7662*df36e06dSRobert Mustacchi 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
7663*df36e06dSRobert Mustacchi 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
7664*df36e06dSRobert Mustacchi 
7665*df36e06dSRobert Mustacchi 	cmd->address_high = CPU_TO_LE32(I40E_HI_DWORD((u64)filter));
7666*df36e06dSRobert Mustacchi 	cmd->address_low = CPU_TO_LE32(I40E_LO_DWORD((u64)filter));
76673d75a287SRobert Mustacchi 
76683d75a287SRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, filter,
76693d75a287SRobert Mustacchi 				       buff_len, cmd_details);
76703d75a287SRobert Mustacchi 
76713d75a287SRobert Mustacchi 	return status;
76729d26e4fcSRobert Mustacchi }
76739d26e4fcSRobert Mustacchi 
76749d26e4fcSRobert Mustacchi /**
76753d75a287SRobert Mustacchi  * i40e_aq_get_wake_event_reason
76763d75a287SRobert Mustacchi  * @hw: pointer to the hw struct
76773d75a287SRobert Mustacchi  * @wake_reason: return value, index of matching filter
76783d75a287SRobert Mustacchi  * @cmd_details: pointer to command details structure or NULL
76799d26e4fcSRobert Mustacchi  *
76803d75a287SRobert Mustacchi  * Get information for the reason of a Wake Up event
76819d26e4fcSRobert Mustacchi  **/
i40e_aq_get_wake_event_reason(struct i40e_hw * hw,u16 * wake_reason,struct i40e_asq_cmd_details * cmd_details)76823d75a287SRobert Mustacchi enum i40e_status_code i40e_aq_get_wake_event_reason(struct i40e_hw *hw,
76833d75a287SRobert Mustacchi 				u16 *wake_reason,
76843d75a287SRobert Mustacchi 				struct i40e_asq_cmd_details *cmd_details)
76859d26e4fcSRobert Mustacchi {
76863d75a287SRobert Mustacchi 	struct i40e_aq_desc desc;
76873d75a287SRobert Mustacchi 	struct i40e_aqc_get_wake_reason_completion *resp =
76883d75a287SRobert Mustacchi 		(struct i40e_aqc_get_wake_reason_completion *)&desc.params.raw;
76893d75a287SRobert Mustacchi 	enum i40e_status_code status;
76903d75a287SRobert Mustacchi 
76913d75a287SRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_wake_reason);
76923d75a287SRobert Mustacchi 
76933d75a287SRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
76943d75a287SRobert Mustacchi 
76953d75a287SRobert Mustacchi 	if (status == I40E_SUCCESS)
76963d75a287SRobert Mustacchi 		*wake_reason = LE16_TO_CPU(resp->wake_reason);
76973d75a287SRobert Mustacchi 
76983d75a287SRobert Mustacchi 	return status;
76999d26e4fcSRobert Mustacchi }
77003d75a287SRobert Mustacchi 
7701*df36e06dSRobert Mustacchi /**
7702*df36e06dSRobert Mustacchi * i40e_aq_clear_all_wol_filters
7703*df36e06dSRobert Mustacchi * @hw: pointer to the hw struct
7704*df36e06dSRobert Mustacchi * @cmd_details: pointer to command details structure or NULL
7705*df36e06dSRobert Mustacchi *
7706*df36e06dSRobert Mustacchi * Get information for the reason of a Wake Up event
7707*df36e06dSRobert Mustacchi **/
i40e_aq_clear_all_wol_filters(struct i40e_hw * hw,struct i40e_asq_cmd_details * cmd_details)7708*df36e06dSRobert Mustacchi enum i40e_status_code i40e_aq_clear_all_wol_filters(struct i40e_hw *hw,
7709*df36e06dSRobert Mustacchi 	struct i40e_asq_cmd_details *cmd_details)
7710*df36e06dSRobert Mustacchi {
7711*df36e06dSRobert Mustacchi 	struct i40e_aq_desc desc;
7712*df36e06dSRobert Mustacchi 	enum i40e_status_code status;
7713*df36e06dSRobert Mustacchi 
7714*df36e06dSRobert Mustacchi 	i40e_fill_default_direct_cmd_desc(&desc,
7715*df36e06dSRobert Mustacchi 					  i40e_aqc_opc_clear_all_wol_filters);
7716*df36e06dSRobert Mustacchi 
7717*df36e06dSRobert Mustacchi 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
7718*df36e06dSRobert Mustacchi 
7719*df36e06dSRobert Mustacchi 	return status;
7720*df36e06dSRobert Mustacchi }
7721*df36e06dSRobert Mustacchi 
7722