1ab81e23cSAlexander Lobakin // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
2663eacd8SAlexander Lobakin /* Copyright (c) 2019-2020 Marvell International Ltd. */
3ab81e23cSAlexander Lobakin 
42528c389SSudarsana Reddy Kalluru #include <linux/types.h>
52528c389SSudarsana Reddy Kalluru #include <asm/byteorder.h>
62528c389SSudarsana Reddy Kalluru #include <linux/bug.h>
72528c389SSudarsana Reddy Kalluru #include <linux/errno.h>
82528c389SSudarsana Reddy Kalluru #include <linux/kernel.h>
92528c389SSudarsana Reddy Kalluru #include <linux/slab.h>
102528c389SSudarsana Reddy Kalluru #include <linux/string.h>
112528c389SSudarsana Reddy Kalluru #include <linux/vmalloc.h>
122528c389SSudarsana Reddy Kalluru #include "qed.h"
132528c389SSudarsana Reddy Kalluru #include "qed_hw.h"
142528c389SSudarsana Reddy Kalluru #include "qed_mcp.h"
152528c389SSudarsana Reddy Kalluru #include "qed_reg_addr.h"
162528c389SSudarsana Reddy Kalluru 
172528c389SSudarsana Reddy Kalluru #define TLV_TYPE(p)     (p[0])
182528c389SSudarsana Reddy Kalluru #define TLV_LENGTH(p)   (p[1])
192528c389SSudarsana Reddy Kalluru #define TLV_FLAGS(p)    (p[3])
202528c389SSudarsana Reddy Kalluru 
212528c389SSudarsana Reddy Kalluru #define QED_TLV_DATA_MAX (14)
222528c389SSudarsana Reddy Kalluru struct qed_tlv_parsed_buf {
232528c389SSudarsana Reddy Kalluru 	/* To be filled with the address to set in Value field */
242528c389SSudarsana Reddy Kalluru 	void *p_val;
252528c389SSudarsana Reddy Kalluru 
262528c389SSudarsana Reddy Kalluru 	/* To be used internally in case the value has to be modified */
272528c389SSudarsana Reddy Kalluru 	u8 data[QED_TLV_DATA_MAX];
282528c389SSudarsana Reddy Kalluru };
292528c389SSudarsana Reddy Kalluru 
qed_mfw_get_tlv_group(u8 tlv_type,u8 * tlv_group)302528c389SSudarsana Reddy Kalluru static int qed_mfw_get_tlv_group(u8 tlv_type, u8 *tlv_group)
312528c389SSudarsana Reddy Kalluru {
322528c389SSudarsana Reddy Kalluru 	switch (tlv_type) {
332528c389SSudarsana Reddy Kalluru 	case DRV_TLV_FEATURE_FLAGS:
342528c389SSudarsana Reddy Kalluru 	case DRV_TLV_LOCAL_ADMIN_ADDR:
352528c389SSudarsana Reddy Kalluru 	case DRV_TLV_ADDITIONAL_MAC_ADDR_1:
362528c389SSudarsana Reddy Kalluru 	case DRV_TLV_ADDITIONAL_MAC_ADDR_2:
372528c389SSudarsana Reddy Kalluru 	case DRV_TLV_OS_DRIVER_STATES:
382528c389SSudarsana Reddy Kalluru 	case DRV_TLV_PXE_BOOT_PROGRESS:
392528c389SSudarsana Reddy Kalluru 	case DRV_TLV_RX_FRAMES_RECEIVED:
402528c389SSudarsana Reddy Kalluru 	case DRV_TLV_RX_BYTES_RECEIVED:
412528c389SSudarsana Reddy Kalluru 	case DRV_TLV_TX_FRAMES_SENT:
422528c389SSudarsana Reddy Kalluru 	case DRV_TLV_TX_BYTES_SENT:
432528c389SSudarsana Reddy Kalluru 	case DRV_TLV_NPIV_ENABLED:
442528c389SSudarsana Reddy Kalluru 	case DRV_TLV_PCIE_BUS_RX_UTILIZATION:
452528c389SSudarsana Reddy Kalluru 	case DRV_TLV_PCIE_BUS_TX_UTILIZATION:
462528c389SSudarsana Reddy Kalluru 	case DRV_TLV_DEVICE_CPU_CORES_UTILIZATION:
472528c389SSudarsana Reddy Kalluru 	case DRV_TLV_LAST_VALID_DCC_TLV_RECEIVED:
482528c389SSudarsana Reddy Kalluru 	case DRV_TLV_NCSI_RX_BYTES_RECEIVED:
492528c389SSudarsana Reddy Kalluru 	case DRV_TLV_NCSI_TX_BYTES_SENT:
502528c389SSudarsana Reddy Kalluru 		*tlv_group |= QED_MFW_TLV_GENERIC;
512528c389SSudarsana Reddy Kalluru 		break;
522528c389SSudarsana Reddy Kalluru 	case DRV_TLV_LSO_MAX_OFFLOAD_SIZE:
532528c389SSudarsana Reddy Kalluru 	case DRV_TLV_LSO_MIN_SEGMENT_COUNT:
542528c389SSudarsana Reddy Kalluru 	case DRV_TLV_PROMISCUOUS_MODE:
552528c389SSudarsana Reddy Kalluru 	case DRV_TLV_TX_DESCRIPTORS_QUEUE_SIZE:
562528c389SSudarsana Reddy Kalluru 	case DRV_TLV_RX_DESCRIPTORS_QUEUE_SIZE:
572528c389SSudarsana Reddy Kalluru 	case DRV_TLV_NUM_OF_NET_QUEUE_VMQ_CFG:
582528c389SSudarsana Reddy Kalluru 	case DRV_TLV_NUM_OFFLOADED_CONNECTIONS_TCP_IPV4:
592528c389SSudarsana Reddy Kalluru 	case DRV_TLV_NUM_OFFLOADED_CONNECTIONS_TCP_IPV6:
602528c389SSudarsana Reddy Kalluru 	case DRV_TLV_TX_DESCRIPTOR_QUEUE_AVG_DEPTH:
612528c389SSudarsana Reddy Kalluru 	case DRV_TLV_RX_DESCRIPTORS_QUEUE_AVG_DEPTH:
622528c389SSudarsana Reddy Kalluru 	case DRV_TLV_IOV_OFFLOAD:
632528c389SSudarsana Reddy Kalluru 	case DRV_TLV_TX_QUEUES_EMPTY:
642528c389SSudarsana Reddy Kalluru 	case DRV_TLV_RX_QUEUES_EMPTY:
652528c389SSudarsana Reddy Kalluru 	case DRV_TLV_TX_QUEUES_FULL:
662528c389SSudarsana Reddy Kalluru 	case DRV_TLV_RX_QUEUES_FULL:
672528c389SSudarsana Reddy Kalluru 		*tlv_group |= QED_MFW_TLV_ETH;
682528c389SSudarsana Reddy Kalluru 		break;
69f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SCSI_TO:
70f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_R_T_TOV:
71f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_R_A_TOV:
72f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_E_D_TOV:
73f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_CR_TOV:
74f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_BOOT_TYPE:
75f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_NPIV_STATE:
76f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_NUM_OF_NPIV_IDS:
77f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SWITCH_NAME:
78f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SWITCH_PORT_NUM:
79f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SWITCH_PORT_ID:
80f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_VENDOR_NAME:
81f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SWITCH_MODEL:
82f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SWITCH_FW_VER:
83f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_QOS_PRIORITY_PER_802_1P:
84f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PORT_ALIAS:
85f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PORT_STATE:
86f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_FIP_TX_DESCRIPTORS_QUEUE_SIZE:
87f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_FCOE_RX_DESCRIPTORS_QUEUE_SIZE:
88f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LINK_FAILURE_COUNT:
89f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_FCOE_BOOT_PROGRESS:
90f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_RX_BROADCAST_PACKETS:
91f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_TX_BROADCAST_PACKETS:
92f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_FCOE_TX_DESCRIPTOR_QUEUE_AVG_DEPTH:
93f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_FCOE_RX_DESCRIPTORS_QUEUE_AVG_DEPTH:
94f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_FCOE_RX_FRAMES_RECEIVED:
95f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_FCOE_RX_BYTES_RECEIVED:
96f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_FCOE_TX_FRAMES_SENT:
97f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_FCOE_TX_BYTES_SENT:
98f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_CRC_ERROR_COUNT:
99f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_CRC_ERROR_1_RECEIVED_SOURCE_FC_ID:
100f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_CRC_ERROR_1_TIMESTAMP:
101f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_CRC_ERROR_2_RECEIVED_SOURCE_FC_ID:
102f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_CRC_ERROR_2_TIMESTAMP:
103f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_CRC_ERROR_3_RECEIVED_SOURCE_FC_ID:
104f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_CRC_ERROR_3_TIMESTAMP:
105f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_CRC_ERROR_4_RECEIVED_SOURCE_FC_ID:
106f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_CRC_ERROR_4_TIMESTAMP:
107f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_CRC_ERROR_5_RECEIVED_SOURCE_FC_ID:
108f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_CRC_ERROR_5_TIMESTAMP:
109f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LOSS_OF_SYNC_ERROR_COUNT:
110f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LOSS_OF_SIGNAL_ERRORS:
111f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PRIMITIVE_SEQUENCE_PROTOCOL_ERROR_COUNT:
112f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_DISPARITY_ERROR_COUNT:
113f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_CODE_VIOLATION_ERROR_COUNT:
114f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_1:
115f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_2:
116f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_3:
117f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_4:
118f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LAST_FLOGI_TIMESTAMP:
119f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_1:
120f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_2:
121f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_3:
122f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_4:
123f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LAST_FLOGI_ACC_TIMESTAMP:
124f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LAST_FLOGI_RJT:
125f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LAST_FLOGI_RJT_TIMESTAMP:
126f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_FDISCS_SENT_COUNT:
127f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_FDISC_ACCS_RECEIVED:
128f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_FDISC_RJTS_RECEIVED:
129f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_SENT_COUNT:
130f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_ACCS_RECEIVED:
131f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_RJTS_RECEIVED:
132f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_1_SENT_DESTINATION_FC_ID:
133f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_1_TIMESTAMP:
134f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_2_SENT_DESTINATION_FC_ID:
135f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_2_TIMESTAMP:
136f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_3_SENT_DESTINATION_FC_ID:
137f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_3_TIMESTAMP:
138f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_4_SENT_DESTINATION_FC_ID:
139f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_4_TIMESTAMP:
140f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_5_SENT_DESTINATION_FC_ID:
141f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_5_TIMESTAMP:
142f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_1_ACC_RECEIVED_SOURCE_FC_ID:
143f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_1_ACC_TIMESTAMP:
144f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_2_ACC_RECEIVED_SOURCE_FC_ID:
145f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_2_ACC_TIMESTAMP:
146f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_3_ACC_RECEIVED_SOURCE_FC_ID:
147f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_3_ACC_TIMESTAMP:
148f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_4_ACC_RECEIVED_SOURCE_FC_ID:
149f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_4_ACC_TIMESTAMP:
150f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_5_ACC_RECEIVED_SOURCE_FC_ID:
151f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_5_ACC_TIMESTAMP:
152f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LOGOS_ISSUED:
153f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LOGO_ACCS_RECEIVED:
154f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LOGO_RJTS_RECEIVED:
155f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LOGO_1_RECEIVED_SOURCE_FC_ID:
156f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LOGO_1_TIMESTAMP:
157f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LOGO_2_RECEIVED_SOURCE_FC_ID:
158f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LOGO_2_TIMESTAMP:
159f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LOGO_3_RECEIVED_SOURCE_FC_ID:
160f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LOGO_3_TIMESTAMP:
161f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LOGO_4_RECEIVED_SOURCE_FC_ID:
162f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LOGO_4_TIMESTAMP:
163f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LOGO_5_RECEIVED_SOURCE_FC_ID:
164f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LOGO_5_TIMESTAMP:
165f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LOGOS_RECEIVED:
166f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_ACCS_ISSUED:
167f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PRLIS_ISSUED:
168f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_ACCS_RECEIVED:
169f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_ABTS_SENT_COUNT:
170f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_ABTS_ACCS_RECEIVED:
171f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_ABTS_RJTS_RECEIVED:
172f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_ABTS_1_SENT_DESTINATION_FC_ID:
173f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_ABTS_1_TIMESTAMP:
174f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_ABTS_2_SENT_DESTINATION_FC_ID:
175f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_ABTS_2_TIMESTAMP:
176f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_ABTS_3_SENT_DESTINATION_FC_ID:
177f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_ABTS_3_TIMESTAMP:
178f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_ABTS_4_SENT_DESTINATION_FC_ID:
179f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_ABTS_4_TIMESTAMP:
180f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_ABTS_5_SENT_DESTINATION_FC_ID:
181f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_ABTS_5_TIMESTAMP:
182f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_RSCNS_RECEIVED:
183f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_1:
184f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_2:
185f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_3:
186f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_4:
187f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LUN_RESETS_ISSUED:
188f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_ABORT_TASK_SETS_ISSUED:
189f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_TPRLOS_SENT:
190f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_NOS_SENT_COUNT:
191f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_NOS_RECEIVED_COUNT:
192f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_OLS_COUNT:
193f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LR_COUNT:
194f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LRR_COUNT:
195f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LIP_SENT_COUNT:
196f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LIP_RECEIVED_COUNT:
197f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_EOFA_COUNT:
198f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_EOFNI_COUNT:
199f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SCSI_STATUS_CHECK_CONDITION_COUNT:
200f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SCSI_STATUS_CONDITION_MET_COUNT:
201f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SCSI_STATUS_BUSY_COUNT:
202f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SCSI_STATUS_INTERMEDIATE_COUNT:
203f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SCSI_STATUS_INTERMEDIATE_CONDITION_MET_COUNT:
204f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SCSI_STATUS_RESERVATION_CONFLICT_COUNT:
205f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SCSI_STATUS_TASK_SET_FULL_COUNT:
206f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SCSI_STATUS_ACA_ACTIVE_COUNT:
207f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SCSI_STATUS_TASK_ABORTED_COUNT:
208f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SCSI_CHECK_CONDITION_1_RECEIVED_SK_ASC_ASCQ:
209f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SCSI_CHECK_1_TIMESTAMP:
210f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SCSI_CHECK_CONDITION_2_RECEIVED_SK_ASC_ASCQ:
211f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SCSI_CHECK_2_TIMESTAMP:
212f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SCSI_CHECK_CONDITION_3_RECEIVED_SK_ASC_ASCQ:
213f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SCSI_CHECK_3_TIMESTAMP:
214f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SCSI_CHECK_CONDITION_4_RECEIVED_SK_ASC_ASCQ:
215f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SCSI_CHECK_4_TIMESTAMP:
216f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SCSI_CHECK_CONDITION_5_RECEIVED_SK_ASC_ASCQ:
217f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SCSI_CHECK_5_TIMESTAMP:
218f240b688SSudarsana Reddy Kalluru 		*tlv_group = QED_MFW_TLV_FCOE;
219f240b688SSudarsana Reddy Kalluru 		break;
22077a509e4SSudarsana Reddy Kalluru 	case DRV_TLV_TARGET_LLMNR_ENABLED:
22177a509e4SSudarsana Reddy Kalluru 	case DRV_TLV_HEADER_DIGEST_FLAG_ENABLED:
22277a509e4SSudarsana Reddy Kalluru 	case DRV_TLV_DATA_DIGEST_FLAG_ENABLED:
22377a509e4SSudarsana Reddy Kalluru 	case DRV_TLV_AUTHENTICATION_METHOD:
22477a509e4SSudarsana Reddy Kalluru 	case DRV_TLV_ISCSI_BOOT_TARGET_PORTAL:
22577a509e4SSudarsana Reddy Kalluru 	case DRV_TLV_MAX_FRAME_SIZE:
22677a509e4SSudarsana Reddy Kalluru 	case DRV_TLV_PDU_TX_DESCRIPTORS_QUEUE_SIZE:
22777a509e4SSudarsana Reddy Kalluru 	case DRV_TLV_PDU_RX_DESCRIPTORS_QUEUE_SIZE:
22877a509e4SSudarsana Reddy Kalluru 	case DRV_TLV_ISCSI_BOOT_PROGRESS:
22977a509e4SSudarsana Reddy Kalluru 	case DRV_TLV_PDU_TX_DESCRIPTOR_QUEUE_AVG_DEPTH:
23077a509e4SSudarsana Reddy Kalluru 	case DRV_TLV_PDU_RX_DESCRIPTORS_QUEUE_AVG_DEPTH:
23177a509e4SSudarsana Reddy Kalluru 	case DRV_TLV_ISCSI_PDU_RX_FRAMES_RECEIVED:
23277a509e4SSudarsana Reddy Kalluru 	case DRV_TLV_ISCSI_PDU_RX_BYTES_RECEIVED:
23377a509e4SSudarsana Reddy Kalluru 	case DRV_TLV_ISCSI_PDU_TX_FRAMES_SENT:
23477a509e4SSudarsana Reddy Kalluru 	case DRV_TLV_ISCSI_PDU_TX_BYTES_SENT:
23577a509e4SSudarsana Reddy Kalluru 		*tlv_group |= QED_MFW_TLV_ISCSI;
23677a509e4SSudarsana Reddy Kalluru 		break;
2372528c389SSudarsana Reddy Kalluru 	default:
2382528c389SSudarsana Reddy Kalluru 		return -EINVAL;
2392528c389SSudarsana Reddy Kalluru 	}
2402528c389SSudarsana Reddy Kalluru 
2412528c389SSudarsana Reddy Kalluru 	return 0;
2422528c389SSudarsana Reddy Kalluru }
2432528c389SSudarsana Reddy Kalluru 
2442528c389SSudarsana Reddy Kalluru /* Returns size of the data buffer or, -1 in case TLV data is not available. */
2452528c389SSudarsana Reddy Kalluru static int
qed_mfw_get_gen_tlv_value(struct qed_drv_tlv_hdr * p_tlv,struct qed_mfw_tlv_generic * p_drv_buf,struct qed_tlv_parsed_buf * p_buf)2462528c389SSudarsana Reddy Kalluru qed_mfw_get_gen_tlv_value(struct qed_drv_tlv_hdr *p_tlv,
2472528c389SSudarsana Reddy Kalluru 			  struct qed_mfw_tlv_generic *p_drv_buf,
2482528c389SSudarsana Reddy Kalluru 			  struct qed_tlv_parsed_buf *p_buf)
2492528c389SSudarsana Reddy Kalluru {
2502528c389SSudarsana Reddy Kalluru 	switch (p_tlv->tlv_type) {
2512528c389SSudarsana Reddy Kalluru 	case DRV_TLV_FEATURE_FLAGS:
2522528c389SSudarsana Reddy Kalluru 		if (p_drv_buf->flags.b_set) {
2532528c389SSudarsana Reddy Kalluru 			memset(p_buf->data, 0, sizeof(u8) * QED_TLV_DATA_MAX);
2542528c389SSudarsana Reddy Kalluru 			p_buf->data[0] = p_drv_buf->flags.ipv4_csum_offload ?
2552528c389SSudarsana Reddy Kalluru 			    1 : 0;
2562528c389SSudarsana Reddy Kalluru 			p_buf->data[0] |= (p_drv_buf->flags.lso_supported ?
2572528c389SSudarsana Reddy Kalluru 					   1 : 0) << 1;
2582528c389SSudarsana Reddy Kalluru 			p_buf->p_val = p_buf->data;
2592528c389SSudarsana Reddy Kalluru 			return QED_MFW_TLV_FLAGS_SIZE;
2602528c389SSudarsana Reddy Kalluru 		}
2612528c389SSudarsana Reddy Kalluru 		break;
2622528c389SSudarsana Reddy Kalluru 
2632528c389SSudarsana Reddy Kalluru 	case DRV_TLV_LOCAL_ADMIN_ADDR:
2642528c389SSudarsana Reddy Kalluru 	case DRV_TLV_ADDITIONAL_MAC_ADDR_1:
2652528c389SSudarsana Reddy Kalluru 	case DRV_TLV_ADDITIONAL_MAC_ADDR_2:
2662528c389SSudarsana Reddy Kalluru 		{
2672528c389SSudarsana Reddy Kalluru 			int idx = p_tlv->tlv_type - DRV_TLV_LOCAL_ADMIN_ADDR;
2682528c389SSudarsana Reddy Kalluru 
2692528c389SSudarsana Reddy Kalluru 			if (p_drv_buf->mac_set[idx]) {
2702528c389SSudarsana Reddy Kalluru 				p_buf->p_val = p_drv_buf->mac[idx];
2712528c389SSudarsana Reddy Kalluru 				return ETH_ALEN;
2722528c389SSudarsana Reddy Kalluru 			}
2732528c389SSudarsana Reddy Kalluru 			break;
2742528c389SSudarsana Reddy Kalluru 		}
2752528c389SSudarsana Reddy Kalluru 
2762528c389SSudarsana Reddy Kalluru 	case DRV_TLV_RX_FRAMES_RECEIVED:
2772528c389SSudarsana Reddy Kalluru 		if (p_drv_buf->rx_frames_set) {
2782528c389SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->rx_frames;
2792528c389SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->rx_frames);
2802528c389SSudarsana Reddy Kalluru 		}
2812528c389SSudarsana Reddy Kalluru 		break;
2822528c389SSudarsana Reddy Kalluru 	case DRV_TLV_RX_BYTES_RECEIVED:
2832528c389SSudarsana Reddy Kalluru 		if (p_drv_buf->rx_bytes_set) {
2842528c389SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->rx_bytes;
2852528c389SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->rx_bytes);
2862528c389SSudarsana Reddy Kalluru 		}
2872528c389SSudarsana Reddy Kalluru 		break;
2882528c389SSudarsana Reddy Kalluru 	case DRV_TLV_TX_FRAMES_SENT:
2892528c389SSudarsana Reddy Kalluru 		if (p_drv_buf->tx_frames_set) {
2902528c389SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->tx_frames;
2912528c389SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->tx_frames);
2922528c389SSudarsana Reddy Kalluru 		}
2932528c389SSudarsana Reddy Kalluru 		break;
2942528c389SSudarsana Reddy Kalluru 	case DRV_TLV_TX_BYTES_SENT:
2952528c389SSudarsana Reddy Kalluru 		if (p_drv_buf->tx_bytes_set) {
2962528c389SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->tx_bytes;
2972528c389SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->tx_bytes);
2982528c389SSudarsana Reddy Kalluru 		}
2992528c389SSudarsana Reddy Kalluru 		break;
3002528c389SSudarsana Reddy Kalluru 	default:
3012528c389SSudarsana Reddy Kalluru 		break;
3022528c389SSudarsana Reddy Kalluru 	}
3032528c389SSudarsana Reddy Kalluru 
3042528c389SSudarsana Reddy Kalluru 	return -1;
3052528c389SSudarsana Reddy Kalluru }
3062528c389SSudarsana Reddy Kalluru 
3072528c389SSudarsana Reddy Kalluru static int
qed_mfw_get_eth_tlv_value(struct qed_drv_tlv_hdr * p_tlv,struct qed_mfw_tlv_eth * p_drv_buf,struct qed_tlv_parsed_buf * p_buf)3082528c389SSudarsana Reddy Kalluru qed_mfw_get_eth_tlv_value(struct qed_drv_tlv_hdr *p_tlv,
3092528c389SSudarsana Reddy Kalluru 			  struct qed_mfw_tlv_eth *p_drv_buf,
3102528c389SSudarsana Reddy Kalluru 			  struct qed_tlv_parsed_buf *p_buf)
3112528c389SSudarsana Reddy Kalluru {
3122528c389SSudarsana Reddy Kalluru 	switch (p_tlv->tlv_type) {
3132528c389SSudarsana Reddy Kalluru 	case DRV_TLV_LSO_MAX_OFFLOAD_SIZE:
3142528c389SSudarsana Reddy Kalluru 		if (p_drv_buf->lso_maxoff_size_set) {
3152528c389SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->lso_maxoff_size;
3162528c389SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->lso_maxoff_size);
3172528c389SSudarsana Reddy Kalluru 		}
3182528c389SSudarsana Reddy Kalluru 		break;
3192528c389SSudarsana Reddy Kalluru 	case DRV_TLV_LSO_MIN_SEGMENT_COUNT:
3202528c389SSudarsana Reddy Kalluru 		if (p_drv_buf->lso_minseg_size_set) {
3212528c389SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->lso_minseg_size;
3222528c389SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->lso_minseg_size);
3232528c389SSudarsana Reddy Kalluru 		}
3242528c389SSudarsana Reddy Kalluru 		break;
3252528c389SSudarsana Reddy Kalluru 	case DRV_TLV_PROMISCUOUS_MODE:
3262528c389SSudarsana Reddy Kalluru 		if (p_drv_buf->prom_mode_set) {
3272528c389SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->prom_mode;
3282528c389SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->prom_mode);
3292528c389SSudarsana Reddy Kalluru 		}
3302528c389SSudarsana Reddy Kalluru 		break;
3312528c389SSudarsana Reddy Kalluru 	case DRV_TLV_TX_DESCRIPTORS_QUEUE_SIZE:
3322528c389SSudarsana Reddy Kalluru 		if (p_drv_buf->tx_descr_size_set) {
3332528c389SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->tx_descr_size;
3342528c389SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->tx_descr_size);
3352528c389SSudarsana Reddy Kalluru 		}
3362528c389SSudarsana Reddy Kalluru 		break;
3372528c389SSudarsana Reddy Kalluru 	case DRV_TLV_RX_DESCRIPTORS_QUEUE_SIZE:
3382528c389SSudarsana Reddy Kalluru 		if (p_drv_buf->rx_descr_size_set) {
3392528c389SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->rx_descr_size;
3402528c389SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->rx_descr_size);
3412528c389SSudarsana Reddy Kalluru 		}
3422528c389SSudarsana Reddy Kalluru 		break;
3432528c389SSudarsana Reddy Kalluru 	case DRV_TLV_NUM_OF_NET_QUEUE_VMQ_CFG:
3442528c389SSudarsana Reddy Kalluru 		if (p_drv_buf->netq_count_set) {
3452528c389SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->netq_count;
3462528c389SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->netq_count);
3472528c389SSudarsana Reddy Kalluru 		}
3482528c389SSudarsana Reddy Kalluru 		break;
3492528c389SSudarsana Reddy Kalluru 	case DRV_TLV_NUM_OFFLOADED_CONNECTIONS_TCP_IPV4:
3502528c389SSudarsana Reddy Kalluru 		if (p_drv_buf->tcp4_offloads_set) {
3512528c389SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->tcp4_offloads;
3522528c389SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->tcp4_offloads);
3532528c389SSudarsana Reddy Kalluru 		}
3542528c389SSudarsana Reddy Kalluru 		break;
3552528c389SSudarsana Reddy Kalluru 	case DRV_TLV_NUM_OFFLOADED_CONNECTIONS_TCP_IPV6:
3562528c389SSudarsana Reddy Kalluru 		if (p_drv_buf->tcp6_offloads_set) {
3572528c389SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->tcp6_offloads;
3582528c389SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->tcp6_offloads);
3592528c389SSudarsana Reddy Kalluru 		}
3602528c389SSudarsana Reddy Kalluru 		break;
3612528c389SSudarsana Reddy Kalluru 	case DRV_TLV_TX_DESCRIPTOR_QUEUE_AVG_DEPTH:
3622528c389SSudarsana Reddy Kalluru 		if (p_drv_buf->tx_descr_qdepth_set) {
3632528c389SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->tx_descr_qdepth;
3642528c389SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->tx_descr_qdepth);
3652528c389SSudarsana Reddy Kalluru 		}
3662528c389SSudarsana Reddy Kalluru 		break;
3672528c389SSudarsana Reddy Kalluru 	case DRV_TLV_RX_DESCRIPTORS_QUEUE_AVG_DEPTH:
3682528c389SSudarsana Reddy Kalluru 		if (p_drv_buf->rx_descr_qdepth_set) {
3692528c389SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->rx_descr_qdepth;
3702528c389SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->rx_descr_qdepth);
3712528c389SSudarsana Reddy Kalluru 		}
3722528c389SSudarsana Reddy Kalluru 		break;
3732528c389SSudarsana Reddy Kalluru 	case DRV_TLV_IOV_OFFLOAD:
3742528c389SSudarsana Reddy Kalluru 		if (p_drv_buf->iov_offload_set) {
3752528c389SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->iov_offload;
3762528c389SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->iov_offload);
3772528c389SSudarsana Reddy Kalluru 		}
3782528c389SSudarsana Reddy Kalluru 		break;
3792528c389SSudarsana Reddy Kalluru 	case DRV_TLV_TX_QUEUES_EMPTY:
3802528c389SSudarsana Reddy Kalluru 		if (p_drv_buf->txqs_empty_set) {
3812528c389SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->txqs_empty;
3822528c389SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->txqs_empty);
3832528c389SSudarsana Reddy Kalluru 		}
3842528c389SSudarsana Reddy Kalluru 		break;
3852528c389SSudarsana Reddy Kalluru 	case DRV_TLV_RX_QUEUES_EMPTY:
3862528c389SSudarsana Reddy Kalluru 		if (p_drv_buf->rxqs_empty_set) {
3872528c389SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->rxqs_empty;
3882528c389SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->rxqs_empty);
3892528c389SSudarsana Reddy Kalluru 		}
3902528c389SSudarsana Reddy Kalluru 		break;
3912528c389SSudarsana Reddy Kalluru 	case DRV_TLV_TX_QUEUES_FULL:
3922528c389SSudarsana Reddy Kalluru 		if (p_drv_buf->num_txqs_full_set) {
3932528c389SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->num_txqs_full;
3942528c389SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->num_txqs_full);
3952528c389SSudarsana Reddy Kalluru 		}
3962528c389SSudarsana Reddy Kalluru 		break;
3972528c389SSudarsana Reddy Kalluru 	case DRV_TLV_RX_QUEUES_FULL:
3982528c389SSudarsana Reddy Kalluru 		if (p_drv_buf->num_rxqs_full_set) {
3992528c389SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->num_rxqs_full;
4002528c389SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->num_rxqs_full);
4012528c389SSudarsana Reddy Kalluru 		}
4022528c389SSudarsana Reddy Kalluru 		break;
4032528c389SSudarsana Reddy Kalluru 	default:
4042528c389SSudarsana Reddy Kalluru 		break;
4052528c389SSudarsana Reddy Kalluru 	}
4062528c389SSudarsana Reddy Kalluru 
4072528c389SSudarsana Reddy Kalluru 	return -1;
4082528c389SSudarsana Reddy Kalluru }
4092528c389SSudarsana Reddy Kalluru 
410f240b688SSudarsana Reddy Kalluru static int
qed_mfw_get_tlv_time_value(struct qed_mfw_tlv_time * p_time,struct qed_tlv_parsed_buf * p_buf)411f240b688SSudarsana Reddy Kalluru qed_mfw_get_tlv_time_value(struct qed_mfw_tlv_time *p_time,
412f240b688SSudarsana Reddy Kalluru 			   struct qed_tlv_parsed_buf *p_buf)
413f240b688SSudarsana Reddy Kalluru {
414f240b688SSudarsana Reddy Kalluru 	if (!p_time->b_set)
415f240b688SSudarsana Reddy Kalluru 		return -1;
416f240b688SSudarsana Reddy Kalluru 
417f240b688SSudarsana Reddy Kalluru 	/* Validate numbers */
418f240b688SSudarsana Reddy Kalluru 	if (p_time->month > 12)
419f240b688SSudarsana Reddy Kalluru 		p_time->month = 0;
420f240b688SSudarsana Reddy Kalluru 	if (p_time->day > 31)
421f240b688SSudarsana Reddy Kalluru 		p_time->day = 0;
422f240b688SSudarsana Reddy Kalluru 	if (p_time->hour > 23)
423f240b688SSudarsana Reddy Kalluru 		p_time->hour = 0;
424f240b688SSudarsana Reddy Kalluru 	if (p_time->min > 59)
425*470efd68SDaniil Tatianin 		p_time->min = 0;
426f240b688SSudarsana Reddy Kalluru 	if (p_time->msec > 999)
427f240b688SSudarsana Reddy Kalluru 		p_time->msec = 0;
428f240b688SSudarsana Reddy Kalluru 	if (p_time->usec > 999)
429f240b688SSudarsana Reddy Kalluru 		p_time->usec = 0;
430f240b688SSudarsana Reddy Kalluru 
431f240b688SSudarsana Reddy Kalluru 	memset(p_buf->data, 0, sizeof(u8) * QED_TLV_DATA_MAX);
432f240b688SSudarsana Reddy Kalluru 	snprintf(p_buf->data, 14, "%d%d%d%d%d%d",
433f240b688SSudarsana Reddy Kalluru 		 p_time->month, p_time->day,
434f240b688SSudarsana Reddy Kalluru 		 p_time->hour, p_time->min, p_time->msec, p_time->usec);
435f240b688SSudarsana Reddy Kalluru 
436f240b688SSudarsana Reddy Kalluru 	p_buf->p_val = p_buf->data;
437f240b688SSudarsana Reddy Kalluru 
438f240b688SSudarsana Reddy Kalluru 	return QED_MFW_TLV_TIME_SIZE;
439f240b688SSudarsana Reddy Kalluru }
440f240b688SSudarsana Reddy Kalluru 
441f240b688SSudarsana Reddy Kalluru static int
qed_mfw_get_fcoe_tlv_value(struct qed_drv_tlv_hdr * p_tlv,struct qed_mfw_tlv_fcoe * p_drv_buf,struct qed_tlv_parsed_buf * p_buf)442f240b688SSudarsana Reddy Kalluru qed_mfw_get_fcoe_tlv_value(struct qed_drv_tlv_hdr *p_tlv,
443f240b688SSudarsana Reddy Kalluru 			   struct qed_mfw_tlv_fcoe *p_drv_buf,
444f240b688SSudarsana Reddy Kalluru 			   struct qed_tlv_parsed_buf *p_buf)
445f240b688SSudarsana Reddy Kalluru {
446f240b688SSudarsana Reddy Kalluru 	struct qed_mfw_tlv_time *p_time;
447f240b688SSudarsana Reddy Kalluru 	u8 idx;
448f240b688SSudarsana Reddy Kalluru 
449f240b688SSudarsana Reddy Kalluru 	switch (p_tlv->tlv_type) {
450f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SCSI_TO:
451f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->scsi_timeout_set) {
452f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->scsi_timeout;
453f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->scsi_timeout);
454f240b688SSudarsana Reddy Kalluru 		}
455f240b688SSudarsana Reddy Kalluru 		break;
456f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_R_T_TOV:
457f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->rt_tov_set) {
458f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->rt_tov;
459f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->rt_tov);
460f240b688SSudarsana Reddy Kalluru 		}
461f240b688SSudarsana Reddy Kalluru 		break;
462f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_R_A_TOV:
463f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->ra_tov_set) {
464f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->ra_tov;
465f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->ra_tov);
466f240b688SSudarsana Reddy Kalluru 		}
467f240b688SSudarsana Reddy Kalluru 		break;
468f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_E_D_TOV:
469f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->ed_tov_set) {
470f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->ed_tov;
471f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->ed_tov);
472f240b688SSudarsana Reddy Kalluru 		}
473f240b688SSudarsana Reddy Kalluru 		break;
474f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_CR_TOV:
475f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->cr_tov_set) {
476f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->cr_tov;
477f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->cr_tov);
478f240b688SSudarsana Reddy Kalluru 		}
479f240b688SSudarsana Reddy Kalluru 		break;
480f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_BOOT_TYPE:
481f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->boot_type_set) {
482f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->boot_type;
483f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->boot_type);
484f240b688SSudarsana Reddy Kalluru 		}
485f240b688SSudarsana Reddy Kalluru 		break;
486f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_NPIV_STATE:
487f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->npiv_state_set) {
488f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->npiv_state;
489f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->npiv_state);
490f240b688SSudarsana Reddy Kalluru 		}
491f240b688SSudarsana Reddy Kalluru 		break;
492f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_NUM_OF_NPIV_IDS:
493f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->num_npiv_ids_set) {
494f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->num_npiv_ids;
495f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->num_npiv_ids);
496f240b688SSudarsana Reddy Kalluru 		}
497f240b688SSudarsana Reddy Kalluru 		break;
498f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SWITCH_NAME:
499f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->switch_name_set) {
500f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->switch_name;
501f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->switch_name);
502f240b688SSudarsana Reddy Kalluru 		}
503f240b688SSudarsana Reddy Kalluru 		break;
504f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SWITCH_PORT_NUM:
505f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->switch_portnum_set) {
506f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->switch_portnum;
507f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->switch_portnum);
508f240b688SSudarsana Reddy Kalluru 		}
509f240b688SSudarsana Reddy Kalluru 		break;
510f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SWITCH_PORT_ID:
511f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->switch_portid_set) {
512f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->switch_portid;
513f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->switch_portid);
514f240b688SSudarsana Reddy Kalluru 		}
515f240b688SSudarsana Reddy Kalluru 		break;
516f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_VENDOR_NAME:
517f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->vendor_name_set) {
518f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->vendor_name;
519f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->vendor_name);
520f240b688SSudarsana Reddy Kalluru 		}
521f240b688SSudarsana Reddy Kalluru 		break;
522f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SWITCH_MODEL:
523f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->switch_model_set) {
524f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->switch_model;
525f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->switch_model);
526f240b688SSudarsana Reddy Kalluru 		}
527f240b688SSudarsana Reddy Kalluru 		break;
528f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SWITCH_FW_VER:
529f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->switch_fw_version_set) {
530f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->switch_fw_version;
531f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->switch_fw_version);
532f240b688SSudarsana Reddy Kalluru 		}
533f240b688SSudarsana Reddy Kalluru 		break;
534f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_QOS_PRIORITY_PER_802_1P:
535f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->qos_pri_set) {
536f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->qos_pri;
537f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->qos_pri);
538f240b688SSudarsana Reddy Kalluru 		}
539f240b688SSudarsana Reddy Kalluru 		break;
540f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PORT_ALIAS:
541f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->port_alias_set) {
542f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->port_alias;
543f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->port_alias);
544f240b688SSudarsana Reddy Kalluru 		}
545f240b688SSudarsana Reddy Kalluru 		break;
546f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PORT_STATE:
547f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->port_state_set) {
548f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->port_state;
549f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->port_state);
550f240b688SSudarsana Reddy Kalluru 		}
551f240b688SSudarsana Reddy Kalluru 		break;
552f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_FIP_TX_DESCRIPTORS_QUEUE_SIZE:
553f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->fip_tx_descr_size_set) {
554f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->fip_tx_descr_size;
555f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->fip_tx_descr_size);
556f240b688SSudarsana Reddy Kalluru 		}
557f240b688SSudarsana Reddy Kalluru 		break;
558f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_FCOE_RX_DESCRIPTORS_QUEUE_SIZE:
559f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->fip_rx_descr_size_set) {
560f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->fip_rx_descr_size;
561f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->fip_rx_descr_size);
562f240b688SSudarsana Reddy Kalluru 		}
563f240b688SSudarsana Reddy Kalluru 		break;
564f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LINK_FAILURE_COUNT:
565f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->link_failures_set) {
566f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->link_failures;
567f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->link_failures);
568f240b688SSudarsana Reddy Kalluru 		}
569f240b688SSudarsana Reddy Kalluru 		break;
570f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_FCOE_BOOT_PROGRESS:
571f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->fcoe_boot_progress_set) {
572f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->fcoe_boot_progress;
573f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->fcoe_boot_progress);
574f240b688SSudarsana Reddy Kalluru 		}
575f240b688SSudarsana Reddy Kalluru 		break;
576f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_RX_BROADCAST_PACKETS:
577f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->rx_bcast_set) {
578f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->rx_bcast;
579f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->rx_bcast);
580f240b688SSudarsana Reddy Kalluru 		}
581f240b688SSudarsana Reddy Kalluru 		break;
582f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_TX_BROADCAST_PACKETS:
583f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->tx_bcast_set) {
584f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->tx_bcast;
585f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->tx_bcast);
586f240b688SSudarsana Reddy Kalluru 		}
587f240b688SSudarsana Reddy Kalluru 		break;
588f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_FCOE_TX_DESCRIPTOR_QUEUE_AVG_DEPTH:
589f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->fcoe_txq_depth_set) {
590f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->fcoe_txq_depth;
591f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->fcoe_txq_depth);
592f240b688SSudarsana Reddy Kalluru 		}
593f240b688SSudarsana Reddy Kalluru 		break;
594f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_FCOE_RX_DESCRIPTORS_QUEUE_AVG_DEPTH:
595f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->fcoe_rxq_depth_set) {
596f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->fcoe_rxq_depth;
597f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->fcoe_rxq_depth);
598f240b688SSudarsana Reddy Kalluru 		}
599f240b688SSudarsana Reddy Kalluru 		break;
600f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_FCOE_RX_FRAMES_RECEIVED:
601f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->fcoe_rx_frames_set) {
602f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->fcoe_rx_frames;
603f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->fcoe_rx_frames);
604f240b688SSudarsana Reddy Kalluru 		}
605f240b688SSudarsana Reddy Kalluru 		break;
606f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_FCOE_RX_BYTES_RECEIVED:
607f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->fcoe_rx_bytes_set) {
608f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->fcoe_rx_bytes;
609f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->fcoe_rx_bytes);
610f240b688SSudarsana Reddy Kalluru 		}
611f240b688SSudarsana Reddy Kalluru 		break;
612f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_FCOE_TX_FRAMES_SENT:
613f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->fcoe_tx_frames_set) {
614f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->fcoe_tx_frames;
615f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->fcoe_tx_frames);
616f240b688SSudarsana Reddy Kalluru 		}
617f240b688SSudarsana Reddy Kalluru 		break;
618f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_FCOE_TX_BYTES_SENT:
619f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->fcoe_tx_bytes_set) {
620f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->fcoe_tx_bytes;
621f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->fcoe_tx_bytes);
622f240b688SSudarsana Reddy Kalluru 		}
623f240b688SSudarsana Reddy Kalluru 		break;
624f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_CRC_ERROR_COUNT:
625f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->crc_count_set) {
626f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->crc_count;
627f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->crc_count);
628f240b688SSudarsana Reddy Kalluru 		}
629f240b688SSudarsana Reddy Kalluru 		break;
630f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_CRC_ERROR_1_RECEIVED_SOURCE_FC_ID:
631f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_CRC_ERROR_2_RECEIVED_SOURCE_FC_ID:
632f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_CRC_ERROR_3_RECEIVED_SOURCE_FC_ID:
633f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_CRC_ERROR_4_RECEIVED_SOURCE_FC_ID:
634f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_CRC_ERROR_5_RECEIVED_SOURCE_FC_ID:
635f240b688SSudarsana Reddy Kalluru 		idx = (p_tlv->tlv_type -
636f240b688SSudarsana Reddy Kalluru 		       DRV_TLV_CRC_ERROR_1_RECEIVED_SOURCE_FC_ID) / 2;
637f240b688SSudarsana Reddy Kalluru 
638f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->crc_err_src_fcid_set[idx]) {
639f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->crc_err_src_fcid[idx];
640f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->crc_err_src_fcid[idx]);
641f240b688SSudarsana Reddy Kalluru 		}
642f240b688SSudarsana Reddy Kalluru 		break;
643f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_CRC_ERROR_1_TIMESTAMP:
644f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_CRC_ERROR_2_TIMESTAMP:
645f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_CRC_ERROR_3_TIMESTAMP:
646f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_CRC_ERROR_4_TIMESTAMP:
647f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_CRC_ERROR_5_TIMESTAMP:
648f240b688SSudarsana Reddy Kalluru 		idx = (p_tlv->tlv_type - DRV_TLV_CRC_ERROR_1_TIMESTAMP) / 2;
649f240b688SSudarsana Reddy Kalluru 
650f240b688SSudarsana Reddy Kalluru 		return qed_mfw_get_tlv_time_value(&p_drv_buf->crc_err[idx],
651f240b688SSudarsana Reddy Kalluru 						  p_buf);
652f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LOSS_OF_SYNC_ERROR_COUNT:
653f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->losync_err_set) {
654f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->losync_err;
655f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->losync_err);
656f240b688SSudarsana Reddy Kalluru 		}
657f240b688SSudarsana Reddy Kalluru 		break;
658f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LOSS_OF_SIGNAL_ERRORS:
659f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->losig_err_set) {
660f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->losig_err;
661f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->losig_err);
662f240b688SSudarsana Reddy Kalluru 		}
663f240b688SSudarsana Reddy Kalluru 		break;
664f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PRIMITIVE_SEQUENCE_PROTOCOL_ERROR_COUNT:
665f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->primtive_err_set) {
666f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->primtive_err;
667f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->primtive_err);
668f240b688SSudarsana Reddy Kalluru 		}
669f240b688SSudarsana Reddy Kalluru 		break;
670f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_DISPARITY_ERROR_COUNT:
671f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->disparity_err_set) {
672f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->disparity_err;
673f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->disparity_err);
674f240b688SSudarsana Reddy Kalluru 		}
675f240b688SSudarsana Reddy Kalluru 		break;
676f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_CODE_VIOLATION_ERROR_COUNT:
677f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->code_violation_err_set) {
678f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->code_violation_err;
679f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->code_violation_err);
680f240b688SSudarsana Reddy Kalluru 		}
681f240b688SSudarsana Reddy Kalluru 		break;
682f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_1:
683f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_2:
684f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_3:
685f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_4:
686f240b688SSudarsana Reddy Kalluru 		idx = p_tlv->tlv_type -
687f240b688SSudarsana Reddy Kalluru 			DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_1;
688f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->flogi_param_set[idx]) {
689f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->flogi_param[idx];
690f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->flogi_param[idx]);
691f240b688SSudarsana Reddy Kalluru 		}
692f240b688SSudarsana Reddy Kalluru 		break;
693f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LAST_FLOGI_TIMESTAMP:
694f240b688SSudarsana Reddy Kalluru 		return qed_mfw_get_tlv_time_value(&p_drv_buf->flogi_tstamp,
695f240b688SSudarsana Reddy Kalluru 						  p_buf);
696f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_1:
697f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_2:
698f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_3:
699f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_4:
700f240b688SSudarsana Reddy Kalluru 		idx = p_tlv->tlv_type -
701f240b688SSudarsana Reddy Kalluru 			DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_1;
702f240b688SSudarsana Reddy Kalluru 
703f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->flogi_acc_param_set[idx]) {
704f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->flogi_acc_param[idx];
705f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->flogi_acc_param[idx]);
706f240b688SSudarsana Reddy Kalluru 		}
707f240b688SSudarsana Reddy Kalluru 		break;
708f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LAST_FLOGI_ACC_TIMESTAMP:
709f240b688SSudarsana Reddy Kalluru 		return qed_mfw_get_tlv_time_value(&p_drv_buf->flogi_acc_tstamp,
710f240b688SSudarsana Reddy Kalluru 						  p_buf);
711f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LAST_FLOGI_RJT:
712f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->flogi_rjt_set) {
713f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->flogi_rjt;
714f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->flogi_rjt);
715f240b688SSudarsana Reddy Kalluru 		}
716f240b688SSudarsana Reddy Kalluru 		break;
717f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LAST_FLOGI_RJT_TIMESTAMP:
718f240b688SSudarsana Reddy Kalluru 		return qed_mfw_get_tlv_time_value(&p_drv_buf->flogi_rjt_tstamp,
719f240b688SSudarsana Reddy Kalluru 						  p_buf);
720f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_FDISCS_SENT_COUNT:
721f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->fdiscs_set) {
722f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->fdiscs;
723f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->fdiscs);
724f240b688SSudarsana Reddy Kalluru 		}
725f240b688SSudarsana Reddy Kalluru 		break;
726f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_FDISC_ACCS_RECEIVED:
727f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->fdisc_acc_set) {
728f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->fdisc_acc;
729f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->fdisc_acc);
730f240b688SSudarsana Reddy Kalluru 		}
731f240b688SSudarsana Reddy Kalluru 		break;
732f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_FDISC_RJTS_RECEIVED:
733f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->fdisc_rjt_set) {
734f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->fdisc_rjt;
735f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->fdisc_rjt);
736f240b688SSudarsana Reddy Kalluru 		}
737f240b688SSudarsana Reddy Kalluru 		break;
738f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_SENT_COUNT:
739f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->plogi_set) {
740f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->plogi;
741f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->plogi);
742f240b688SSudarsana Reddy Kalluru 		}
743f240b688SSudarsana Reddy Kalluru 		break;
744f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_ACCS_RECEIVED:
745f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->plogi_acc_set) {
746f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->plogi_acc;
747f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->plogi_acc);
748f240b688SSudarsana Reddy Kalluru 		}
749f240b688SSudarsana Reddy Kalluru 		break;
750f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_RJTS_RECEIVED:
751f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->plogi_rjt_set) {
752f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->plogi_rjt;
753f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->plogi_rjt);
754f240b688SSudarsana Reddy Kalluru 		}
755f240b688SSudarsana Reddy Kalluru 		break;
756f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_1_SENT_DESTINATION_FC_ID:
757f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_2_SENT_DESTINATION_FC_ID:
758f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_3_SENT_DESTINATION_FC_ID:
759f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_4_SENT_DESTINATION_FC_ID:
760f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_5_SENT_DESTINATION_FC_ID:
761f240b688SSudarsana Reddy Kalluru 		idx = (p_tlv->tlv_type -
762f240b688SSudarsana Reddy Kalluru 		       DRV_TLV_PLOGI_1_SENT_DESTINATION_FC_ID) / 2;
763f240b688SSudarsana Reddy Kalluru 
764f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->plogi_dst_fcid_set[idx]) {
765f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->plogi_dst_fcid[idx];
766f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->plogi_dst_fcid[idx]);
767f240b688SSudarsana Reddy Kalluru 		}
768f240b688SSudarsana Reddy Kalluru 		break;
769f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_1_TIMESTAMP:
770f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_2_TIMESTAMP:
771f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_3_TIMESTAMP:
772f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_4_TIMESTAMP:
773f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_5_TIMESTAMP:
774f240b688SSudarsana Reddy Kalluru 		idx = (p_tlv->tlv_type - DRV_TLV_PLOGI_1_TIMESTAMP) / 2;
775f240b688SSudarsana Reddy Kalluru 
776f240b688SSudarsana Reddy Kalluru 		return qed_mfw_get_tlv_time_value(&p_drv_buf->plogi_tstamp[idx],
777f240b688SSudarsana Reddy Kalluru 						  p_buf);
778f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_1_ACC_RECEIVED_SOURCE_FC_ID:
779f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_2_ACC_RECEIVED_SOURCE_FC_ID:
780f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_3_ACC_RECEIVED_SOURCE_FC_ID:
781f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_4_ACC_RECEIVED_SOURCE_FC_ID:
782f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_5_ACC_RECEIVED_SOURCE_FC_ID:
783f240b688SSudarsana Reddy Kalluru 		idx = (p_tlv->tlv_type -
784f240b688SSudarsana Reddy Kalluru 		       DRV_TLV_PLOGI_1_ACC_RECEIVED_SOURCE_FC_ID) / 2;
785f240b688SSudarsana Reddy Kalluru 
786f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->plogi_acc_src_fcid_set[idx]) {
787f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->plogi_acc_src_fcid[idx];
788f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->plogi_acc_src_fcid[idx]);
789f240b688SSudarsana Reddy Kalluru 		}
790f240b688SSudarsana Reddy Kalluru 		break;
791f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_1_ACC_TIMESTAMP:
792f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_2_ACC_TIMESTAMP:
793f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_3_ACC_TIMESTAMP:
794f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_4_ACC_TIMESTAMP:
795f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PLOGI_5_ACC_TIMESTAMP:
796f240b688SSudarsana Reddy Kalluru 		idx = (p_tlv->tlv_type - DRV_TLV_PLOGI_1_ACC_TIMESTAMP) / 2;
797f240b688SSudarsana Reddy Kalluru 		p_time = &p_drv_buf->plogi_acc_tstamp[idx];
798f240b688SSudarsana Reddy Kalluru 
799f240b688SSudarsana Reddy Kalluru 		return qed_mfw_get_tlv_time_value(p_time, p_buf);
800f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LOGOS_ISSUED:
801f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->tx_plogos_set) {
802f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->tx_plogos;
803f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->tx_plogos);
804f240b688SSudarsana Reddy Kalluru 		}
805f240b688SSudarsana Reddy Kalluru 		break;
806f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LOGO_ACCS_RECEIVED:
807f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->plogo_acc_set) {
808f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->plogo_acc;
809f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->plogo_acc);
810f240b688SSudarsana Reddy Kalluru 		}
811f240b688SSudarsana Reddy Kalluru 		break;
812f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LOGO_RJTS_RECEIVED:
813f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->plogo_rjt_set) {
814f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->plogo_rjt;
815f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->plogo_rjt);
816f240b688SSudarsana Reddy Kalluru 		}
817f240b688SSudarsana Reddy Kalluru 		break;
818f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LOGO_1_RECEIVED_SOURCE_FC_ID:
819f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LOGO_2_RECEIVED_SOURCE_FC_ID:
820f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LOGO_3_RECEIVED_SOURCE_FC_ID:
821f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LOGO_4_RECEIVED_SOURCE_FC_ID:
822f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LOGO_5_RECEIVED_SOURCE_FC_ID:
823f240b688SSudarsana Reddy Kalluru 		idx = (p_tlv->tlv_type - DRV_TLV_LOGO_1_RECEIVED_SOURCE_FC_ID) /
824f240b688SSudarsana Reddy Kalluru 			2;
825f240b688SSudarsana Reddy Kalluru 
826f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->plogo_src_fcid_set[idx]) {
827f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->plogo_src_fcid[idx];
828f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->plogo_src_fcid[idx]);
829f240b688SSudarsana Reddy Kalluru 		}
830f240b688SSudarsana Reddy Kalluru 		break;
831f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LOGO_1_TIMESTAMP:
832f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LOGO_2_TIMESTAMP:
833f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LOGO_3_TIMESTAMP:
834f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LOGO_4_TIMESTAMP:
835f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LOGO_5_TIMESTAMP:
836f240b688SSudarsana Reddy Kalluru 		idx = (p_tlv->tlv_type - DRV_TLV_LOGO_1_TIMESTAMP) / 2;
837f240b688SSudarsana Reddy Kalluru 
838f240b688SSudarsana Reddy Kalluru 		return qed_mfw_get_tlv_time_value(&p_drv_buf->plogo_tstamp[idx],
839f240b688SSudarsana Reddy Kalluru 						  p_buf);
840f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LOGOS_RECEIVED:
841f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->rx_logos_set) {
842f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->rx_logos;
843f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->rx_logos);
844f240b688SSudarsana Reddy Kalluru 		}
845f240b688SSudarsana Reddy Kalluru 		break;
846f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_ACCS_ISSUED:
847f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->tx_accs_set) {
848f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->tx_accs;
849f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->tx_accs);
850f240b688SSudarsana Reddy Kalluru 		}
851f240b688SSudarsana Reddy Kalluru 		break;
852f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_PRLIS_ISSUED:
853f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->tx_prlis_set) {
854f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->tx_prlis;
855f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->tx_prlis);
856f240b688SSudarsana Reddy Kalluru 		}
857f240b688SSudarsana Reddy Kalluru 		break;
858f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_ACCS_RECEIVED:
859f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->rx_accs_set) {
860f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->rx_accs;
861f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->rx_accs);
862f240b688SSudarsana Reddy Kalluru 		}
863f240b688SSudarsana Reddy Kalluru 		break;
864f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_ABTS_SENT_COUNT:
865f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->tx_abts_set) {
866f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->tx_abts;
867f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->tx_abts);
868f240b688SSudarsana Reddy Kalluru 		}
869f240b688SSudarsana Reddy Kalluru 		break;
870f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_ABTS_ACCS_RECEIVED:
871f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->rx_abts_acc_set) {
872f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->rx_abts_acc;
873f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->rx_abts_acc);
874f240b688SSudarsana Reddy Kalluru 		}
875f240b688SSudarsana Reddy Kalluru 		break;
876f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_ABTS_RJTS_RECEIVED:
877f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->rx_abts_rjt_set) {
878f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->rx_abts_rjt;
879f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->rx_abts_rjt);
880f240b688SSudarsana Reddy Kalluru 		}
881f240b688SSudarsana Reddy Kalluru 		break;
882f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_ABTS_1_SENT_DESTINATION_FC_ID:
883f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_ABTS_2_SENT_DESTINATION_FC_ID:
884f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_ABTS_3_SENT_DESTINATION_FC_ID:
885f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_ABTS_4_SENT_DESTINATION_FC_ID:
886f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_ABTS_5_SENT_DESTINATION_FC_ID:
887f240b688SSudarsana Reddy Kalluru 		idx = (p_tlv->tlv_type -
888f240b688SSudarsana Reddy Kalluru 		       DRV_TLV_ABTS_1_SENT_DESTINATION_FC_ID) / 2;
889f240b688SSudarsana Reddy Kalluru 
890f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->abts_dst_fcid_set[idx]) {
891f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->abts_dst_fcid[idx];
892f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->abts_dst_fcid[idx]);
893f240b688SSudarsana Reddy Kalluru 		}
894f240b688SSudarsana Reddy Kalluru 		break;
895f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_ABTS_1_TIMESTAMP:
896f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_ABTS_2_TIMESTAMP:
897f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_ABTS_3_TIMESTAMP:
898f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_ABTS_4_TIMESTAMP:
899f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_ABTS_5_TIMESTAMP:
900f240b688SSudarsana Reddy Kalluru 		idx = (p_tlv->tlv_type - DRV_TLV_ABTS_1_TIMESTAMP) / 2;
901f240b688SSudarsana Reddy Kalluru 
902f240b688SSudarsana Reddy Kalluru 		return qed_mfw_get_tlv_time_value(&p_drv_buf->abts_tstamp[idx],
903f240b688SSudarsana Reddy Kalluru 						  p_buf);
904f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_RSCNS_RECEIVED:
905f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->rx_rscn_set) {
906f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->rx_rscn;
907f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->rx_rscn);
908f240b688SSudarsana Reddy Kalluru 		}
909f240b688SSudarsana Reddy Kalluru 		break;
910f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_1:
911f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_2:
912f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_3:
913f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_4:
914f240b688SSudarsana Reddy Kalluru 		idx = p_tlv->tlv_type - DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_1;
915f240b688SSudarsana Reddy Kalluru 
916f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->rx_rscn_nport_set[idx]) {
917f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->rx_rscn_nport[idx];
918f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->rx_rscn_nport[idx]);
919f240b688SSudarsana Reddy Kalluru 		}
920f240b688SSudarsana Reddy Kalluru 		break;
921f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LUN_RESETS_ISSUED:
922f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->tx_lun_rst_set) {
923f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->tx_lun_rst;
924f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->tx_lun_rst);
925f240b688SSudarsana Reddy Kalluru 		}
926f240b688SSudarsana Reddy Kalluru 		break;
927f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_ABORT_TASK_SETS_ISSUED:
928f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->abort_task_sets_set) {
929f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->abort_task_sets;
930f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->abort_task_sets);
931f240b688SSudarsana Reddy Kalluru 		}
932f240b688SSudarsana Reddy Kalluru 		break;
933f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_TPRLOS_SENT:
934f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->tx_tprlos_set) {
935f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->tx_tprlos;
936f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->tx_tprlos);
937f240b688SSudarsana Reddy Kalluru 		}
938f240b688SSudarsana Reddy Kalluru 		break;
939f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_NOS_SENT_COUNT:
940f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->tx_nos_set) {
941f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->tx_nos;
942f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->tx_nos);
943f240b688SSudarsana Reddy Kalluru 		}
944f240b688SSudarsana Reddy Kalluru 		break;
945f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_NOS_RECEIVED_COUNT:
946f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->rx_nos_set) {
947f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->rx_nos;
948f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->rx_nos);
949f240b688SSudarsana Reddy Kalluru 		}
950f240b688SSudarsana Reddy Kalluru 		break;
951f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_OLS_COUNT:
952f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->ols_set) {
953f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->ols;
954f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->ols);
955f240b688SSudarsana Reddy Kalluru 		}
956f240b688SSudarsana Reddy Kalluru 		break;
957f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LR_COUNT:
958f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->lr_set) {
959f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->lr;
960f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->lr);
961f240b688SSudarsana Reddy Kalluru 		}
962f240b688SSudarsana Reddy Kalluru 		break;
963f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LRR_COUNT:
964f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->lrr_set) {
965f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->lrr;
966f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->lrr);
967f240b688SSudarsana Reddy Kalluru 		}
968f240b688SSudarsana Reddy Kalluru 		break;
969f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LIP_SENT_COUNT:
970f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->tx_lip_set) {
971f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->tx_lip;
972f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->tx_lip);
973f240b688SSudarsana Reddy Kalluru 		}
974f240b688SSudarsana Reddy Kalluru 		break;
975f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_LIP_RECEIVED_COUNT:
976f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->rx_lip_set) {
977f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->rx_lip;
978f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->rx_lip);
979f240b688SSudarsana Reddy Kalluru 		}
980f240b688SSudarsana Reddy Kalluru 		break;
981f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_EOFA_COUNT:
982f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->eofa_set) {
983f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->eofa;
984f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->eofa);
985f240b688SSudarsana Reddy Kalluru 		}
986f240b688SSudarsana Reddy Kalluru 		break;
987f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_EOFNI_COUNT:
988f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->eofni_set) {
989f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->eofni;
990f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->eofni);
991f240b688SSudarsana Reddy Kalluru 		}
992f240b688SSudarsana Reddy Kalluru 		break;
993f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SCSI_STATUS_CHECK_CONDITION_COUNT:
994f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->scsi_chks_set) {
995f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->scsi_chks;
996f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->scsi_chks);
997f240b688SSudarsana Reddy Kalluru 		}
998f240b688SSudarsana Reddy Kalluru 		break;
999f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SCSI_STATUS_CONDITION_MET_COUNT:
1000f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->scsi_cond_met_set) {
1001f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->scsi_cond_met;
1002f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->scsi_cond_met);
1003f240b688SSudarsana Reddy Kalluru 		}
1004f240b688SSudarsana Reddy Kalluru 		break;
1005f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SCSI_STATUS_BUSY_COUNT:
1006f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->scsi_busy_set) {
1007f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->scsi_busy;
1008f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->scsi_busy);
1009f240b688SSudarsana Reddy Kalluru 		}
1010f240b688SSudarsana Reddy Kalluru 		break;
1011f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SCSI_STATUS_INTERMEDIATE_COUNT:
1012f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->scsi_inter_set) {
1013f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->scsi_inter;
1014f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->scsi_inter);
1015f240b688SSudarsana Reddy Kalluru 		}
1016f240b688SSudarsana Reddy Kalluru 		break;
1017f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SCSI_STATUS_INTERMEDIATE_CONDITION_MET_COUNT:
1018f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->scsi_inter_cond_met_set) {
1019f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->scsi_inter_cond_met;
1020f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->scsi_inter_cond_met);
1021f240b688SSudarsana Reddy Kalluru 		}
1022f240b688SSudarsana Reddy Kalluru 		break;
1023f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SCSI_STATUS_RESERVATION_CONFLICT_COUNT:
1024f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->scsi_rsv_conflicts_set) {
1025f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->scsi_rsv_conflicts;
1026f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->scsi_rsv_conflicts);
1027f240b688SSudarsana Reddy Kalluru 		}
1028f240b688SSudarsana Reddy Kalluru 		break;
1029f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SCSI_STATUS_TASK_SET_FULL_COUNT:
1030f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->scsi_tsk_full_set) {
1031f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->scsi_tsk_full;
1032f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->scsi_tsk_full);
1033f240b688SSudarsana Reddy Kalluru 		}
1034f240b688SSudarsana Reddy Kalluru 		break;
1035f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SCSI_STATUS_ACA_ACTIVE_COUNT:
1036f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->scsi_aca_active_set) {
1037f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->scsi_aca_active;
1038f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->scsi_aca_active);
1039f240b688SSudarsana Reddy Kalluru 		}
1040f240b688SSudarsana Reddy Kalluru 		break;
1041f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SCSI_STATUS_TASK_ABORTED_COUNT:
1042f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->scsi_tsk_abort_set) {
1043f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->scsi_tsk_abort;
1044f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->scsi_tsk_abort);
1045f240b688SSudarsana Reddy Kalluru 		}
1046f240b688SSudarsana Reddy Kalluru 		break;
1047f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SCSI_CHECK_CONDITION_1_RECEIVED_SK_ASC_ASCQ:
1048f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SCSI_CHECK_CONDITION_2_RECEIVED_SK_ASC_ASCQ:
1049f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SCSI_CHECK_CONDITION_3_RECEIVED_SK_ASC_ASCQ:
1050f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SCSI_CHECK_CONDITION_4_RECEIVED_SK_ASC_ASCQ:
1051f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SCSI_CHECK_CONDITION_5_RECEIVED_SK_ASC_ASCQ:
1052f240b688SSudarsana Reddy Kalluru 		idx = (p_tlv->tlv_type -
1053f240b688SSudarsana Reddy Kalluru 		       DRV_TLV_SCSI_CHECK_CONDITION_1_RECEIVED_SK_ASC_ASCQ) / 2;
1054f240b688SSudarsana Reddy Kalluru 
1055f240b688SSudarsana Reddy Kalluru 		if (p_drv_buf->scsi_rx_chk_set[idx]) {
1056f240b688SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->scsi_rx_chk[idx];
1057f240b688SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->scsi_rx_chk[idx]);
1058f240b688SSudarsana Reddy Kalluru 		}
1059f240b688SSudarsana Reddy Kalluru 		break;
1060f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SCSI_CHECK_1_TIMESTAMP:
1061f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SCSI_CHECK_2_TIMESTAMP:
1062f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SCSI_CHECK_3_TIMESTAMP:
1063f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SCSI_CHECK_4_TIMESTAMP:
1064f240b688SSudarsana Reddy Kalluru 	case DRV_TLV_SCSI_CHECK_5_TIMESTAMP:
1065f240b688SSudarsana Reddy Kalluru 		idx = (p_tlv->tlv_type - DRV_TLV_SCSI_CHECK_1_TIMESTAMP) / 2;
1066f240b688SSudarsana Reddy Kalluru 		p_time = &p_drv_buf->scsi_chk_tstamp[idx];
1067f240b688SSudarsana Reddy Kalluru 
1068f240b688SSudarsana Reddy Kalluru 		return qed_mfw_get_tlv_time_value(p_time, p_buf);
1069f240b688SSudarsana Reddy Kalluru 	default:
1070f240b688SSudarsana Reddy Kalluru 		break;
1071f240b688SSudarsana Reddy Kalluru 	}
1072f240b688SSudarsana Reddy Kalluru 
1073f240b688SSudarsana Reddy Kalluru 	return -1;
1074f240b688SSudarsana Reddy Kalluru }
1075f240b688SSudarsana Reddy Kalluru 
107677a509e4SSudarsana Reddy Kalluru static int
qed_mfw_get_iscsi_tlv_value(struct qed_drv_tlv_hdr * p_tlv,struct qed_mfw_tlv_iscsi * p_drv_buf,struct qed_tlv_parsed_buf * p_buf)107777a509e4SSudarsana Reddy Kalluru qed_mfw_get_iscsi_tlv_value(struct qed_drv_tlv_hdr *p_tlv,
107877a509e4SSudarsana Reddy Kalluru 			    struct qed_mfw_tlv_iscsi *p_drv_buf,
107977a509e4SSudarsana Reddy Kalluru 			    struct qed_tlv_parsed_buf *p_buf)
108077a509e4SSudarsana Reddy Kalluru {
108177a509e4SSudarsana Reddy Kalluru 	switch (p_tlv->tlv_type) {
108277a509e4SSudarsana Reddy Kalluru 	case DRV_TLV_TARGET_LLMNR_ENABLED:
108377a509e4SSudarsana Reddy Kalluru 		if (p_drv_buf->target_llmnr_set) {
108477a509e4SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->target_llmnr;
108577a509e4SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->target_llmnr);
108677a509e4SSudarsana Reddy Kalluru 		}
108777a509e4SSudarsana Reddy Kalluru 		break;
108877a509e4SSudarsana Reddy Kalluru 	case DRV_TLV_HEADER_DIGEST_FLAG_ENABLED:
108977a509e4SSudarsana Reddy Kalluru 		if (p_drv_buf->header_digest_set) {
109077a509e4SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->header_digest;
109177a509e4SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->header_digest);
109277a509e4SSudarsana Reddy Kalluru 		}
109377a509e4SSudarsana Reddy Kalluru 		break;
109477a509e4SSudarsana Reddy Kalluru 	case DRV_TLV_DATA_DIGEST_FLAG_ENABLED:
109577a509e4SSudarsana Reddy Kalluru 		if (p_drv_buf->data_digest_set) {
109677a509e4SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->data_digest;
109777a509e4SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->data_digest);
109877a509e4SSudarsana Reddy Kalluru 		}
109977a509e4SSudarsana Reddy Kalluru 		break;
110077a509e4SSudarsana Reddy Kalluru 	case DRV_TLV_AUTHENTICATION_METHOD:
110177a509e4SSudarsana Reddy Kalluru 		if (p_drv_buf->auth_method_set) {
110277a509e4SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->auth_method;
110377a509e4SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->auth_method);
110477a509e4SSudarsana Reddy Kalluru 		}
110577a509e4SSudarsana Reddy Kalluru 		break;
110677a509e4SSudarsana Reddy Kalluru 	case DRV_TLV_ISCSI_BOOT_TARGET_PORTAL:
110777a509e4SSudarsana Reddy Kalluru 		if (p_drv_buf->boot_taget_portal_set) {
110877a509e4SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->boot_taget_portal;
110977a509e4SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->boot_taget_portal);
111077a509e4SSudarsana Reddy Kalluru 		}
111177a509e4SSudarsana Reddy Kalluru 		break;
111277a509e4SSudarsana Reddy Kalluru 	case DRV_TLV_MAX_FRAME_SIZE:
111377a509e4SSudarsana Reddy Kalluru 		if (p_drv_buf->frame_size_set) {
111477a509e4SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->frame_size;
111577a509e4SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->frame_size);
111677a509e4SSudarsana Reddy Kalluru 		}
111777a509e4SSudarsana Reddy Kalluru 		break;
111877a509e4SSudarsana Reddy Kalluru 	case DRV_TLV_PDU_TX_DESCRIPTORS_QUEUE_SIZE:
111977a509e4SSudarsana Reddy Kalluru 		if (p_drv_buf->tx_desc_size_set) {
112077a509e4SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->tx_desc_size;
112177a509e4SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->tx_desc_size);
112277a509e4SSudarsana Reddy Kalluru 		}
112377a509e4SSudarsana Reddy Kalluru 		break;
112477a509e4SSudarsana Reddy Kalluru 	case DRV_TLV_PDU_RX_DESCRIPTORS_QUEUE_SIZE:
112577a509e4SSudarsana Reddy Kalluru 		if (p_drv_buf->rx_desc_size_set) {
112677a509e4SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->rx_desc_size;
112777a509e4SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->rx_desc_size);
112877a509e4SSudarsana Reddy Kalluru 		}
112977a509e4SSudarsana Reddy Kalluru 		break;
113077a509e4SSudarsana Reddy Kalluru 	case DRV_TLV_ISCSI_BOOT_PROGRESS:
113177a509e4SSudarsana Reddy Kalluru 		if (p_drv_buf->boot_progress_set) {
113277a509e4SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->boot_progress;
113377a509e4SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->boot_progress);
113477a509e4SSudarsana Reddy Kalluru 		}
113577a509e4SSudarsana Reddy Kalluru 		break;
113677a509e4SSudarsana Reddy Kalluru 	case DRV_TLV_PDU_TX_DESCRIPTOR_QUEUE_AVG_DEPTH:
113777a509e4SSudarsana Reddy Kalluru 		if (p_drv_buf->tx_desc_qdepth_set) {
113877a509e4SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->tx_desc_qdepth;
113977a509e4SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->tx_desc_qdepth);
114077a509e4SSudarsana Reddy Kalluru 		}
114177a509e4SSudarsana Reddy Kalluru 		break;
114277a509e4SSudarsana Reddy Kalluru 	case DRV_TLV_PDU_RX_DESCRIPTORS_QUEUE_AVG_DEPTH:
114377a509e4SSudarsana Reddy Kalluru 		if (p_drv_buf->rx_desc_qdepth_set) {
114477a509e4SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->rx_desc_qdepth;
114577a509e4SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->rx_desc_qdepth);
114677a509e4SSudarsana Reddy Kalluru 		}
114777a509e4SSudarsana Reddy Kalluru 		break;
114877a509e4SSudarsana Reddy Kalluru 	case DRV_TLV_ISCSI_PDU_RX_FRAMES_RECEIVED:
114977a509e4SSudarsana Reddy Kalluru 		if (p_drv_buf->rx_frames_set) {
115077a509e4SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->rx_frames;
115177a509e4SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->rx_frames);
115277a509e4SSudarsana Reddy Kalluru 		}
115377a509e4SSudarsana Reddy Kalluru 		break;
115477a509e4SSudarsana Reddy Kalluru 	case DRV_TLV_ISCSI_PDU_RX_BYTES_RECEIVED:
115577a509e4SSudarsana Reddy Kalluru 		if (p_drv_buf->rx_bytes_set) {
115677a509e4SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->rx_bytes;
115777a509e4SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->rx_bytes);
115877a509e4SSudarsana Reddy Kalluru 		}
115977a509e4SSudarsana Reddy Kalluru 		break;
116077a509e4SSudarsana Reddy Kalluru 	case DRV_TLV_ISCSI_PDU_TX_FRAMES_SENT:
116177a509e4SSudarsana Reddy Kalluru 		if (p_drv_buf->tx_frames_set) {
116277a509e4SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->tx_frames;
116377a509e4SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->tx_frames);
116477a509e4SSudarsana Reddy Kalluru 		}
116577a509e4SSudarsana Reddy Kalluru 		break;
116677a509e4SSudarsana Reddy Kalluru 	case DRV_TLV_ISCSI_PDU_TX_BYTES_SENT:
116777a509e4SSudarsana Reddy Kalluru 		if (p_drv_buf->tx_bytes_set) {
116877a509e4SSudarsana Reddy Kalluru 			p_buf->p_val = &p_drv_buf->tx_bytes;
116977a509e4SSudarsana Reddy Kalluru 			return sizeof(p_drv_buf->tx_bytes);
117077a509e4SSudarsana Reddy Kalluru 		}
117177a509e4SSudarsana Reddy Kalluru 		break;
117277a509e4SSudarsana Reddy Kalluru 	default:
117377a509e4SSudarsana Reddy Kalluru 		break;
117477a509e4SSudarsana Reddy Kalluru 	}
117577a509e4SSudarsana Reddy Kalluru 
117677a509e4SSudarsana Reddy Kalluru 	return -1;
117777a509e4SSudarsana Reddy Kalluru }
117877a509e4SSudarsana Reddy Kalluru 
qed_mfw_update_tlvs(struct qed_hwfn * p_hwfn,u8 tlv_group,u8 * p_mfw_buf,u32 size)11792528c389SSudarsana Reddy Kalluru static int qed_mfw_update_tlvs(struct qed_hwfn *p_hwfn,
11802528c389SSudarsana Reddy Kalluru 			       u8 tlv_group, u8 *p_mfw_buf, u32 size)
11812528c389SSudarsana Reddy Kalluru {
11822528c389SSudarsana Reddy Kalluru 	union qed_mfw_tlv_data *p_tlv_data;
11832528c389SSudarsana Reddy Kalluru 	struct qed_tlv_parsed_buf buffer;
11842528c389SSudarsana Reddy Kalluru 	struct qed_drv_tlv_hdr tlv;
11852528c389SSudarsana Reddy Kalluru 	int len = 0;
11862528c389SSudarsana Reddy Kalluru 	u32 offset;
11872528c389SSudarsana Reddy Kalluru 	u8 *p_tlv;
11882528c389SSudarsana Reddy Kalluru 
11892528c389SSudarsana Reddy Kalluru 	p_tlv_data = vzalloc(sizeof(*p_tlv_data));
11902528c389SSudarsana Reddy Kalluru 	if (!p_tlv_data)
11912528c389SSudarsana Reddy Kalluru 		return -ENOMEM;
11922528c389SSudarsana Reddy Kalluru 
11932528c389SSudarsana Reddy Kalluru 	if (qed_mfw_fill_tlv_data(p_hwfn, tlv_group, p_tlv_data)) {
11942528c389SSudarsana Reddy Kalluru 		vfree(p_tlv_data);
11952528c389SSudarsana Reddy Kalluru 		return -EINVAL;
11962528c389SSudarsana Reddy Kalluru 	}
11972528c389SSudarsana Reddy Kalluru 
11982528c389SSudarsana Reddy Kalluru 	memset(&tlv, 0, sizeof(tlv));
11992528c389SSudarsana Reddy Kalluru 	for (offset = 0; offset < size;
12002528c389SSudarsana Reddy Kalluru 	     offset += sizeof(tlv) + sizeof(u32) * tlv.tlv_length) {
12012528c389SSudarsana Reddy Kalluru 		p_tlv = &p_mfw_buf[offset];
12022528c389SSudarsana Reddy Kalluru 		tlv.tlv_type = TLV_TYPE(p_tlv);
12032528c389SSudarsana Reddy Kalluru 		tlv.tlv_length = TLV_LENGTH(p_tlv);
12042528c389SSudarsana Reddy Kalluru 		tlv.tlv_flags = TLV_FLAGS(p_tlv);
12052528c389SSudarsana Reddy Kalluru 
12062528c389SSudarsana Reddy Kalluru 		DP_VERBOSE(p_hwfn, QED_MSG_SP,
12072528c389SSudarsana Reddy Kalluru 			   "Type %d length = %d flags = 0x%x\n", tlv.tlv_type,
12082528c389SSudarsana Reddy Kalluru 			   tlv.tlv_length, tlv.tlv_flags);
12092528c389SSudarsana Reddy Kalluru 
12102528c389SSudarsana Reddy Kalluru 		if (tlv_group == QED_MFW_TLV_GENERIC)
12112528c389SSudarsana Reddy Kalluru 			len = qed_mfw_get_gen_tlv_value(&tlv,
12122528c389SSudarsana Reddy Kalluru 							&p_tlv_data->generic,
12132528c389SSudarsana Reddy Kalluru 							&buffer);
12142528c389SSudarsana Reddy Kalluru 		else if (tlv_group == QED_MFW_TLV_ETH)
12152528c389SSudarsana Reddy Kalluru 			len = qed_mfw_get_eth_tlv_value(&tlv,
12162528c389SSudarsana Reddy Kalluru 							&p_tlv_data->eth,
12172528c389SSudarsana Reddy Kalluru 							&buffer);
1218f240b688SSudarsana Reddy Kalluru 		else if (tlv_group == QED_MFW_TLV_FCOE)
1219f240b688SSudarsana Reddy Kalluru 			len = qed_mfw_get_fcoe_tlv_value(&tlv,
1220f240b688SSudarsana Reddy Kalluru 							 &p_tlv_data->fcoe,
1221f240b688SSudarsana Reddy Kalluru 							 &buffer);
122277a509e4SSudarsana Reddy Kalluru 		else
122377a509e4SSudarsana Reddy Kalluru 			len = qed_mfw_get_iscsi_tlv_value(&tlv,
122477a509e4SSudarsana Reddy Kalluru 							  &p_tlv_data->iscsi,
122577a509e4SSudarsana Reddy Kalluru 							  &buffer);
12262528c389SSudarsana Reddy Kalluru 
12272528c389SSudarsana Reddy Kalluru 		if (len > 0) {
12282528c389SSudarsana Reddy Kalluru 			WARN(len > 4 * tlv.tlv_length,
12292528c389SSudarsana Reddy Kalluru 			     "Incorrect MFW TLV length %d, it shouldn't be greater than %d\n",
12302528c389SSudarsana Reddy Kalluru 			     len, 4 * tlv.tlv_length);
12312528c389SSudarsana Reddy Kalluru 			len = min_t(int, len, 4 * tlv.tlv_length);
12322528c389SSudarsana Reddy Kalluru 			tlv.tlv_flags |= QED_DRV_TLV_FLAGS_CHANGED;
12332528c389SSudarsana Reddy Kalluru 			TLV_FLAGS(p_tlv) = tlv.tlv_flags;
12342528c389SSudarsana Reddy Kalluru 			memcpy(p_mfw_buf + offset + sizeof(tlv),
12352528c389SSudarsana Reddy Kalluru 			       buffer.p_val, len);
12362528c389SSudarsana Reddy Kalluru 		}
12372528c389SSudarsana Reddy Kalluru 	}
12382528c389SSudarsana Reddy Kalluru 
12392528c389SSudarsana Reddy Kalluru 	vfree(p_tlv_data);
12402528c389SSudarsana Reddy Kalluru 
12412528c389SSudarsana Reddy Kalluru 	return 0;
12422528c389SSudarsana Reddy Kalluru }
12432528c389SSudarsana Reddy Kalluru 
qed_mfw_process_tlv_req(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt)12442528c389SSudarsana Reddy Kalluru int qed_mfw_process_tlv_req(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt)
12452528c389SSudarsana Reddy Kalluru {
12462528c389SSudarsana Reddy Kalluru 	u32 addr, size, offset, resp, param, val, global_offsize, global_addr;
12472528c389SSudarsana Reddy Kalluru 	u8 tlv_group = 0, id, *p_mfw_buf = NULL, *p_temp;
12482528c389SSudarsana Reddy Kalluru 	struct qed_drv_tlv_hdr tlv;
12492528c389SSudarsana Reddy Kalluru 	int rc;
12502528c389SSudarsana Reddy Kalluru 
12512528c389SSudarsana Reddy Kalluru 	addr = SECTION_OFFSIZE_ADDR(p_hwfn->mcp_info->public_base,
12522528c389SSudarsana Reddy Kalluru 				    PUBLIC_GLOBAL);
12532528c389SSudarsana Reddy Kalluru 	global_offsize = qed_rd(p_hwfn, p_ptt, addr);
12542528c389SSudarsana Reddy Kalluru 	global_addr = SECTION_ADDR(global_offsize, 0);
12552528c389SSudarsana Reddy Kalluru 	addr = global_addr + offsetof(struct public_global, data_ptr);
12562528c389SSudarsana Reddy Kalluru 	addr = qed_rd(p_hwfn, p_ptt, addr);
12572528c389SSudarsana Reddy Kalluru 	size = qed_rd(p_hwfn, p_ptt, global_addr +
12582528c389SSudarsana Reddy Kalluru 		      offsetof(struct public_global, data_size));
12592528c389SSudarsana Reddy Kalluru 
12602528c389SSudarsana Reddy Kalluru 	if (!size) {
12612528c389SSudarsana Reddy Kalluru 		DP_NOTICE(p_hwfn, "Invalid TLV req size = %d\n", size);
12622528c389SSudarsana Reddy Kalluru 		goto drv_done;
12632528c389SSudarsana Reddy Kalluru 	}
12642528c389SSudarsana Reddy Kalluru 
12652528c389SSudarsana Reddy Kalluru 	p_mfw_buf = vzalloc(size);
12662528c389SSudarsana Reddy Kalluru 	if (!p_mfw_buf) {
12672528c389SSudarsana Reddy Kalluru 		DP_NOTICE(p_hwfn, "Failed allocate memory for p_mfw_buf\n");
12682528c389SSudarsana Reddy Kalluru 		goto drv_done;
12692528c389SSudarsana Reddy Kalluru 	}
12702528c389SSudarsana Reddy Kalluru 
12712528c389SSudarsana Reddy Kalluru 	/* Read the TLV request to local buffer. MFW represents the TLV in
12722528c389SSudarsana Reddy Kalluru 	 * little endian format and mcp returns it bigendian format. Hence
12732528c389SSudarsana Reddy Kalluru 	 * driver need to convert data to little endian first and then do the
12742528c389SSudarsana Reddy Kalluru 	 * memcpy (casting) to preserve the MFW TLV format in the driver buffer.
12752528c389SSudarsana Reddy Kalluru 	 *
12762528c389SSudarsana Reddy Kalluru 	 */
12772528c389SSudarsana Reddy Kalluru 	for (offset = 0; offset < size; offset += sizeof(u32)) {
12782528c389SSudarsana Reddy Kalluru 		val = qed_rd(p_hwfn, p_ptt, addr + offset);
12795ab90341SAlexander Lobakin 		val = be32_to_cpu((__force __be32)val);
12802528c389SSudarsana Reddy Kalluru 		memcpy(&p_mfw_buf[offset], &val, sizeof(u32));
12812528c389SSudarsana Reddy Kalluru 	}
12822528c389SSudarsana Reddy Kalluru 
12832528c389SSudarsana Reddy Kalluru 	/* Parse the headers to enumerate the requested TLV groups */
12842528c389SSudarsana Reddy Kalluru 	for (offset = 0; offset < size;
12852528c389SSudarsana Reddy Kalluru 	     offset += sizeof(tlv) + sizeof(u32) * tlv.tlv_length) {
12862528c389SSudarsana Reddy Kalluru 		p_temp = &p_mfw_buf[offset];
12872528c389SSudarsana Reddy Kalluru 		tlv.tlv_type = TLV_TYPE(p_temp);
12882528c389SSudarsana Reddy Kalluru 		tlv.tlv_length = TLV_LENGTH(p_temp);
12892528c389SSudarsana Reddy Kalluru 		if (qed_mfw_get_tlv_group(tlv.tlv_type, &tlv_group))
12902528c389SSudarsana Reddy Kalluru 			DP_VERBOSE(p_hwfn, NETIF_MSG_DRV,
12912528c389SSudarsana Reddy Kalluru 				   "Un recognized TLV %d\n", tlv.tlv_type);
12922528c389SSudarsana Reddy Kalluru 	}
12932528c389SSudarsana Reddy Kalluru 
12942528c389SSudarsana Reddy Kalluru 	/* Sanitize the TLV groups according to personality */
12952528c389SSudarsana Reddy Kalluru 	if ((tlv_group & QED_MFW_TLV_ETH) && !QED_IS_L2_PERSONALITY(p_hwfn)) {
12962528c389SSudarsana Reddy Kalluru 		DP_VERBOSE(p_hwfn, QED_MSG_SP,
12972528c389SSudarsana Reddy Kalluru 			   "Skipping L2 TLVs for non-L2 function\n");
12982528c389SSudarsana Reddy Kalluru 		tlv_group &= ~QED_MFW_TLV_ETH;
12992528c389SSudarsana Reddy Kalluru 	}
13002528c389SSudarsana Reddy Kalluru 
1301f240b688SSudarsana Reddy Kalluru 	if ((tlv_group & QED_MFW_TLV_FCOE) &&
1302f240b688SSudarsana Reddy Kalluru 	    p_hwfn->hw_info.personality != QED_PCI_FCOE) {
1303f240b688SSudarsana Reddy Kalluru 		DP_VERBOSE(p_hwfn, QED_MSG_SP,
1304f240b688SSudarsana Reddy Kalluru 			   "Skipping FCoE TLVs for non-FCoE function\n");
1305f240b688SSudarsana Reddy Kalluru 		tlv_group &= ~QED_MFW_TLV_FCOE;
1306f240b688SSudarsana Reddy Kalluru 	}
1307f240b688SSudarsana Reddy Kalluru 
130877a509e4SSudarsana Reddy Kalluru 	if ((tlv_group & QED_MFW_TLV_ISCSI) &&
1309897e87a1SShai Malin 	    p_hwfn->hw_info.personality != QED_PCI_ISCSI &&
1310897e87a1SShai Malin 		p_hwfn->hw_info.personality != QED_PCI_NVMETCP) {
131177a509e4SSudarsana Reddy Kalluru 		DP_VERBOSE(p_hwfn, QED_MSG_SP,
131277a509e4SSudarsana Reddy Kalluru 			   "Skipping iSCSI TLVs for non-iSCSI function\n");
131377a509e4SSudarsana Reddy Kalluru 		tlv_group &= ~QED_MFW_TLV_ISCSI;
131477a509e4SSudarsana Reddy Kalluru 	}
131577a509e4SSudarsana Reddy Kalluru 
13162528c389SSudarsana Reddy Kalluru 	/* Update the TLV values in the local buffer */
13172528c389SSudarsana Reddy Kalluru 	for (id = QED_MFW_TLV_GENERIC; id < QED_MFW_TLV_MAX; id <<= 1) {
13182528c389SSudarsana Reddy Kalluru 		if (tlv_group & id)
13192528c389SSudarsana Reddy Kalluru 			if (qed_mfw_update_tlvs(p_hwfn, id, p_mfw_buf, size))
13202528c389SSudarsana Reddy Kalluru 				goto drv_done;
13212528c389SSudarsana Reddy Kalluru 	}
13222528c389SSudarsana Reddy Kalluru 
13232528c389SSudarsana Reddy Kalluru 	/* Write the TLV data to shared memory. The stream of 4 bytes first need
13242528c389SSudarsana Reddy Kalluru 	 * to be mem-copied to u32 element to make it as LSB format. And then
13252528c389SSudarsana Reddy Kalluru 	 * converted to big endian as required by mcp-write.
13262528c389SSudarsana Reddy Kalluru 	 */
13272528c389SSudarsana Reddy Kalluru 	for (offset = 0; offset < size; offset += sizeof(u32)) {
13282528c389SSudarsana Reddy Kalluru 		memcpy(&val, &p_mfw_buf[offset], sizeof(u32));
13295ab90341SAlexander Lobakin 		val = (__force u32)cpu_to_be32(val);
13302528c389SSudarsana Reddy Kalluru 		qed_wr(p_hwfn, p_ptt, addr + offset, val);
13312528c389SSudarsana Reddy Kalluru 	}
13322528c389SSudarsana Reddy Kalluru 
13332528c389SSudarsana Reddy Kalluru drv_done:
13342528c389SSudarsana Reddy Kalluru 	rc = qed_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_GET_TLV_DONE, 0, &resp,
13352528c389SSudarsana Reddy Kalluru 			 &param);
13362528c389SSudarsana Reddy Kalluru 
13372528c389SSudarsana Reddy Kalluru 	vfree(p_mfw_buf);
13382528c389SSudarsana Reddy Kalluru 
13392528c389SSudarsana Reddy Kalluru 	return rc;
13402528c389SSudarsana Reddy Kalluru }
1341