xref: /dpdk/drivers/net/qede/base/ecore_mng_tlv.c (revision 3126df2237c2ef0e934d4b691ccaddb3ebebf575)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright (c) 2016 - 2018 Cavium Inc.
3  * All rights reserved.
4  * www.cavium.com
5  */
6 
7 #include "bcm_osal.h"
8 #include "ecore.h"
9 #include "ecore_status.h"
10 #include "ecore_mcp.h"
11 #include "ecore_hw.h"
12 #include "reg_addr.h"
13 
14 #define TLV_TYPE(p)	(p[0])
15 #define TLV_LENGTH(p)	(p[1])
16 #define TLV_FLAGS(p)	(p[3])
17 
18 static enum _ecore_status_t
ecore_mfw_get_tlv_group(u8 tlv_type,u8 * tlv_group)19 ecore_mfw_get_tlv_group(u8 tlv_type, u8 *tlv_group)
20 {
21 	switch (tlv_type) {
22 	case DRV_TLV_FEATURE_FLAGS:
23 	case DRV_TLV_LOCAL_ADMIN_ADDR:
24 	case DRV_TLV_ADDITIONAL_MAC_ADDR_1:
25 	case DRV_TLV_ADDITIONAL_MAC_ADDR_2:
26 	case DRV_TLV_OS_DRIVER_STATES:
27 	case DRV_TLV_PXE_BOOT_PROGRESS:
28 	case DRV_TLV_RX_FRAMES_RECEIVED:
29 	case DRV_TLV_RX_BYTES_RECEIVED:
30 	case DRV_TLV_TX_FRAMES_SENT:
31 	case DRV_TLV_TX_BYTES_SENT:
32 		*tlv_group |= ECORE_MFW_TLV_GENERIC;
33 		break;
34 	case DRV_TLV_LSO_MAX_OFFLOAD_SIZE:
35 	case DRV_TLV_LSO_MIN_SEGMENT_COUNT:
36 	case DRV_TLV_PROMISCUOUS_MODE:
37 	case DRV_TLV_TX_DESCRIPTORS_QUEUE_SIZE:
38 	case DRV_TLV_RX_DESCRIPTORS_QUEUE_SIZE:
39 	case DRV_TLV_NUM_OF_NET_QUEUE_VMQ_CFG:
40 	case DRV_TLV_NUM_OFFLOADED_CONNECTIONS_TCP_IPV4:
41 	case DRV_TLV_NUM_OFFLOADED_CONNECTIONS_TCP_IPV6:
42 	case DRV_TLV_TX_DESCRIPTOR_QUEUE_AVG_DEPTH:
43 	case DRV_TLV_RX_DESCRIPTORS_QUEUE_AVG_DEPTH:
44 	case DRV_TLV_IOV_OFFLOAD:
45 	case DRV_TLV_TX_QUEUES_EMPTY:
46 	case DRV_TLV_RX_QUEUES_EMPTY:
47 	case DRV_TLV_TX_QUEUES_FULL:
48 	case DRV_TLV_RX_QUEUES_FULL:
49 		*tlv_group |= ECORE_MFW_TLV_ETH;
50 		break;
51 	case DRV_TLV_SCSI_TO:
52 	case DRV_TLV_R_T_TOV:
53 	case DRV_TLV_R_A_TOV:
54 	case DRV_TLV_E_D_TOV:
55 	case DRV_TLV_CR_TOV:
56 	case DRV_TLV_BOOT_TYPE:
57 	case DRV_TLV_NPIV_STATE:
58 	case DRV_TLV_NUM_OF_NPIV_IDS:
59 	case DRV_TLV_SWITCH_NAME:
60 	case DRV_TLV_SWITCH_PORT_NUM:
61 	case DRV_TLV_SWITCH_PORT_ID:
62 	case DRV_TLV_VENDOR_NAME:
63 	case DRV_TLV_SWITCH_MODEL:
64 	case DRV_TLV_SWITCH_FW_VER:
65 	case DRV_TLV_QOS_PRIORITY_PER_802_1P:
66 	case DRV_TLV_PORT_ALIAS:
67 	case DRV_TLV_PORT_STATE:
68 	case DRV_TLV_FIP_TX_DESCRIPTORS_QUEUE_SIZE:
69 	case DRV_TLV_FCOE_RX_DESCRIPTORS_QUEUE_SIZE:
70 	case DRV_TLV_LINK_FAILURE_COUNT:
71 	case DRV_TLV_FCOE_BOOT_PROGRESS:
72 	case DRV_TLV_RX_BROADCAST_PACKETS:
73 	case DRV_TLV_TX_BROADCAST_PACKETS:
74 	case DRV_TLV_FCOE_TX_DESCRIPTOR_QUEUE_AVG_DEPTH:
75 	case DRV_TLV_FCOE_RX_DESCRIPTORS_QUEUE_AVG_DEPTH:
76 	case DRV_TLV_FCOE_RX_FRAMES_RECEIVED:
77 	case DRV_TLV_FCOE_RX_BYTES_RECEIVED:
78 	case DRV_TLV_FCOE_TX_FRAMES_SENT:
79 	case DRV_TLV_FCOE_TX_BYTES_SENT:
80 	case DRV_TLV_CRC_ERROR_COUNT:
81 	case DRV_TLV_CRC_ERROR_1_RECEIVED_SOURCE_FC_ID:
82 	case DRV_TLV_CRC_ERROR_1_TIMESTAMP:
83 	case DRV_TLV_CRC_ERROR_2_RECEIVED_SOURCE_FC_ID:
84 	case DRV_TLV_CRC_ERROR_2_TIMESTAMP:
85 	case DRV_TLV_CRC_ERROR_3_RECEIVED_SOURCE_FC_ID:
86 	case DRV_TLV_CRC_ERROR_3_TIMESTAMP:
87 	case DRV_TLV_CRC_ERROR_4_RECEIVED_SOURCE_FC_ID:
88 	case DRV_TLV_CRC_ERROR_4_TIMESTAMP:
89 	case DRV_TLV_CRC_ERROR_5_RECEIVED_SOURCE_FC_ID:
90 	case DRV_TLV_CRC_ERROR_5_TIMESTAMP:
91 	case DRV_TLV_LOSS_OF_SYNC_ERROR_COUNT:
92 	case DRV_TLV_LOSS_OF_SIGNAL_ERRORS:
93 	case DRV_TLV_PRIMITIVE_SEQUENCE_PROTOCOL_ERROR_COUNT:
94 	case DRV_TLV_DISPARITY_ERROR_COUNT:
95 	case DRV_TLV_CODE_VIOLATION_ERROR_COUNT:
96 	case DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_1:
97 	case DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_2:
98 	case DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_3:
99 	case DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_4:
100 	case DRV_TLV_LAST_FLOGI_TIMESTAMP:
101 	case DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_1:
102 	case DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_2:
103 	case DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_3:
104 	case DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_4:
105 	case DRV_TLV_LAST_FLOGI_ACC_TIMESTAMP:
106 	case DRV_TLV_LAST_FLOGI_RJT:
107 	case DRV_TLV_LAST_FLOGI_RJT_TIMESTAMP:
108 	case DRV_TLV_FDISCS_SENT_COUNT:
109 	case DRV_TLV_FDISC_ACCS_RECEIVED:
110 	case DRV_TLV_FDISC_RJTS_RECEIVED:
111 	case DRV_TLV_PLOGI_SENT_COUNT:
112 	case DRV_TLV_PLOGI_ACCS_RECEIVED:
113 	case DRV_TLV_PLOGI_RJTS_RECEIVED:
114 	case DRV_TLV_PLOGI_1_SENT_DESTINATION_FC_ID:
115 	case DRV_TLV_PLOGI_1_TIMESTAMP:
116 	case DRV_TLV_PLOGI_2_SENT_DESTINATION_FC_ID:
117 	case DRV_TLV_PLOGI_2_TIMESTAMP:
118 	case DRV_TLV_PLOGI_3_SENT_DESTINATION_FC_ID:
119 	case DRV_TLV_PLOGI_3_TIMESTAMP:
120 	case DRV_TLV_PLOGI_4_SENT_DESTINATION_FC_ID:
121 	case DRV_TLV_PLOGI_4_TIMESTAMP:
122 	case DRV_TLV_PLOGI_5_SENT_DESTINATION_FC_ID:
123 	case DRV_TLV_PLOGI_5_TIMESTAMP:
124 	case DRV_TLV_PLOGI_1_ACC_RECEIVED_SOURCE_FC_ID:
125 	case DRV_TLV_PLOGI_1_ACC_TIMESTAMP:
126 	case DRV_TLV_PLOGI_2_ACC_RECEIVED_SOURCE_FC_ID:
127 	case DRV_TLV_PLOGI_2_ACC_TIMESTAMP:
128 	case DRV_TLV_PLOGI_3_ACC_RECEIVED_SOURCE_FC_ID:
129 	case DRV_TLV_PLOGI_3_ACC_TIMESTAMP:
130 	case DRV_TLV_PLOGI_4_ACC_RECEIVED_SOURCE_FC_ID:
131 	case DRV_TLV_PLOGI_4_ACC_TIMESTAMP:
132 	case DRV_TLV_PLOGI_5_ACC_RECEIVED_SOURCE_FC_ID:
133 	case DRV_TLV_PLOGI_5_ACC_TIMESTAMP:
134 	case DRV_TLV_LOGOS_ISSUED:
135 	case DRV_TLV_LOGO_ACCS_RECEIVED:
136 	case DRV_TLV_LOGO_RJTS_RECEIVED:
137 	case DRV_TLV_LOGO_1_RECEIVED_SOURCE_FC_ID:
138 	case DRV_TLV_LOGO_1_TIMESTAMP:
139 	case DRV_TLV_LOGO_2_RECEIVED_SOURCE_FC_ID:
140 	case DRV_TLV_LOGO_2_TIMESTAMP:
141 	case DRV_TLV_LOGO_3_RECEIVED_SOURCE_FC_ID:
142 	case DRV_TLV_LOGO_3_TIMESTAMP:
143 	case DRV_TLV_LOGO_4_RECEIVED_SOURCE_FC_ID:
144 	case DRV_TLV_LOGO_4_TIMESTAMP:
145 	case DRV_TLV_LOGO_5_RECEIVED_SOURCE_FC_ID:
146 	case DRV_TLV_LOGO_5_TIMESTAMP:
147 	case DRV_TLV_LOGOS_RECEIVED:
148 	case DRV_TLV_ACCS_ISSUED:
149 	case DRV_TLV_PRLIS_ISSUED:
150 	case DRV_TLV_ACCS_RECEIVED:
151 	case DRV_TLV_ABTS_SENT_COUNT:
152 	case DRV_TLV_ABTS_ACCS_RECEIVED:
153 	case DRV_TLV_ABTS_RJTS_RECEIVED:
154 	case DRV_TLV_ABTS_1_SENT_DESTINATION_FC_ID:
155 	case DRV_TLV_ABTS_1_TIMESTAMP:
156 	case DRV_TLV_ABTS_2_SENT_DESTINATION_FC_ID:
157 	case DRV_TLV_ABTS_2_TIMESTAMP:
158 	case DRV_TLV_ABTS_3_SENT_DESTINATION_FC_ID:
159 	case DRV_TLV_ABTS_3_TIMESTAMP:
160 	case DRV_TLV_ABTS_4_SENT_DESTINATION_FC_ID:
161 	case DRV_TLV_ABTS_4_TIMESTAMP:
162 	case DRV_TLV_ABTS_5_SENT_DESTINATION_FC_ID:
163 	case DRV_TLV_ABTS_5_TIMESTAMP:
164 	case DRV_TLV_RSCNS_RECEIVED:
165 	case DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_1:
166 	case DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_2:
167 	case DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_3:
168 	case DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_4:
169 	case DRV_TLV_LUN_RESETS_ISSUED:
170 	case DRV_TLV_ABORT_TASK_SETS_ISSUED:
171 	case DRV_TLV_TPRLOS_SENT:
172 	case DRV_TLV_NOS_SENT_COUNT:
173 	case DRV_TLV_NOS_RECEIVED_COUNT:
174 	case DRV_TLV_OLS_COUNT:
175 	case DRV_TLV_LR_COUNT:
176 	case DRV_TLV_LRR_COUNT:
177 	case DRV_TLV_LIP_SENT_COUNT:
178 	case DRV_TLV_LIP_RECEIVED_COUNT:
179 	case DRV_TLV_EOFA_COUNT:
180 	case DRV_TLV_EOFNI_COUNT:
181 	case DRV_TLV_SCSI_STATUS_CHECK_CONDITION_COUNT:
182 	case DRV_TLV_SCSI_STATUS_CONDITION_MET_COUNT:
183 	case DRV_TLV_SCSI_STATUS_BUSY_COUNT:
184 	case DRV_TLV_SCSI_STATUS_INTERMEDIATE_COUNT:
185 	case DRV_TLV_SCSI_STATUS_INTERMEDIATE_CONDITION_MET_COUNT:
186 	case DRV_TLV_SCSI_STATUS_RESERVATION_CONFLICT_COUNT:
187 	case DRV_TLV_SCSI_STATUS_TASK_SET_FULL_COUNT:
188 	case DRV_TLV_SCSI_STATUS_ACA_ACTIVE_COUNT:
189 	case DRV_TLV_SCSI_STATUS_TASK_ABORTED_COUNT:
190 	case DRV_TLV_SCSI_CHECK_CONDITION_1_RECEIVED_SK_ASC_ASCQ:
191 	case DRV_TLV_SCSI_CHECK_1_TIMESTAMP:
192 	case DRV_TLV_SCSI_CHECK_CONDITION_2_RECEIVED_SK_ASC_ASCQ:
193 	case DRV_TLV_SCSI_CHECK_2_TIMESTAMP:
194 	case DRV_TLV_SCSI_CHECK_CONDITION_3_RECEIVED_SK_ASC_ASCQ:
195 	case DRV_TLV_SCSI_CHECK_3_TIMESTAMP:
196 	case DRV_TLV_SCSI_CHECK_CONDITION_4_RECEIVED_SK_ASC_ASCQ:
197 	case DRV_TLV_SCSI_CHECK_4_TIMESTAMP:
198 	case DRV_TLV_SCSI_CHECK_CONDITION_5_RECEIVED_SK_ASC_ASCQ:
199 	case DRV_TLV_SCSI_CHECK_5_TIMESTAMP:
200 		*tlv_group = ECORE_MFW_TLV_FCOE;
201 		break;
202 	case DRV_TLV_TARGET_LLMNR_ENABLED:
203 	case DRV_TLV_HEADER_DIGEST_FLAG_ENABLED:
204 	case DRV_TLV_DATA_DIGEST_FLAG_ENABLED:
205 	case DRV_TLV_AUTHENTICATION_METHOD:
206 	case DRV_TLV_ISCSI_BOOT_TARGET_PORTAL:
207 	case DRV_TLV_MAX_FRAME_SIZE:
208 	case DRV_TLV_PDU_TX_DESCRIPTORS_QUEUE_SIZE:
209 	case DRV_TLV_PDU_RX_DESCRIPTORS_QUEUE_SIZE:
210 	case DRV_TLV_ISCSI_BOOT_PROGRESS:
211 	case DRV_TLV_PDU_TX_DESCRIPTOR_QUEUE_AVG_DEPTH:
212 	case DRV_TLV_PDU_RX_DESCRIPTORS_QUEUE_AVG_DEPTH:
213 	case DRV_TLV_ISCSI_PDU_RX_FRAMES_RECEIVED:
214 	case DRV_TLV_ISCSI_PDU_RX_BYTES_RECEIVED:
215 	case DRV_TLV_ISCSI_PDU_TX_FRAMES_SENT:
216 	case DRV_TLV_ISCSI_PDU_TX_BYTES_SENT:
217 		*tlv_group |= ECORE_MFW_TLV_ISCSI;
218 		break;
219 	default:
220 		return ECORE_INVAL;
221 	}
222 
223 	return ECORE_SUCCESS;
224 }
225 
226 static int
ecore_mfw_get_gen_tlv_value(struct ecore_drv_tlv_hdr * p_tlv,struct ecore_mfw_tlv_generic * p_drv_buf,u8 ** p_tlv_buf)227 ecore_mfw_get_gen_tlv_value(struct ecore_drv_tlv_hdr *p_tlv,
228 			    struct ecore_mfw_tlv_generic *p_drv_buf,
229 			    u8 **p_tlv_buf)
230 {
231 	switch (p_tlv->tlv_type) {
232 	case DRV_TLV_FEATURE_FLAGS:
233 		if (p_drv_buf->feat_flags_set) {
234 			*p_tlv_buf = (u8 *)&p_drv_buf->feat_flags;
235 			return sizeof(p_drv_buf->feat_flags);
236 		}
237 		break;
238 	case DRV_TLV_LOCAL_ADMIN_ADDR:
239 		if (p_drv_buf->local_mac_set) {
240 			*p_tlv_buf = (u8 *)&p_drv_buf->local_mac;
241 			return sizeof(p_drv_buf->local_mac);
242 		}
243 		break;
244 	case DRV_TLV_ADDITIONAL_MAC_ADDR_1:
245 		if (p_drv_buf->additional_mac1_set) {
246 			*p_tlv_buf = (u8 *)&p_drv_buf->additional_mac1;
247 			return sizeof(p_drv_buf->additional_mac1);
248 		}
249 		break;
250 	case DRV_TLV_ADDITIONAL_MAC_ADDR_2:
251 		if (p_drv_buf->additional_mac2_set) {
252 			*p_tlv_buf = (u8 *)&p_drv_buf->additional_mac2;
253 			return sizeof(p_drv_buf->additional_mac2);
254 		}
255 		break;
256 	case DRV_TLV_OS_DRIVER_STATES:
257 		if (p_drv_buf->drv_state_set) {
258 			*p_tlv_buf = (u8 *)&p_drv_buf->drv_state;
259 			return sizeof(p_drv_buf->drv_state);
260 		}
261 		break;
262 	case DRV_TLV_PXE_BOOT_PROGRESS:
263 		if (p_drv_buf->pxe_progress_set) {
264 			*p_tlv_buf = (u8 *)&p_drv_buf->pxe_progress;
265 			return sizeof(p_drv_buf->pxe_progress);
266 		}
267 		break;
268 	case DRV_TLV_RX_FRAMES_RECEIVED:
269 		if (p_drv_buf->rx_frames_set) {
270 			*p_tlv_buf = (u8 *)&p_drv_buf->rx_frames;
271 			return sizeof(p_drv_buf->rx_frames);
272 		}
273 		break;
274 	case DRV_TLV_RX_BYTES_RECEIVED:
275 		if (p_drv_buf->rx_bytes_set) {
276 			*p_tlv_buf = (u8 *)&p_drv_buf->rx_bytes;
277 			return sizeof(p_drv_buf->rx_bytes);
278 		}
279 		break;
280 	case DRV_TLV_TX_FRAMES_SENT:
281 		if (p_drv_buf->tx_frames_set) {
282 			*p_tlv_buf = (u8 *)&p_drv_buf->tx_frames;
283 			return sizeof(p_drv_buf->tx_frames);
284 		}
285 		break;
286 	case DRV_TLV_TX_BYTES_SENT:
287 		if (p_drv_buf->tx_bytes_set) {
288 			*p_tlv_buf = (u8 *)&p_drv_buf->tx_bytes;
289 			return sizeof(p_drv_buf->tx_bytes);
290 		}
291 		break;
292 	default:
293 		break;
294 	}
295 
296 	return -1;
297 }
298 
299 static int
ecore_mfw_get_eth_tlv_value(struct ecore_drv_tlv_hdr * p_tlv,struct ecore_mfw_tlv_eth * p_drv_buf,u8 ** p_tlv_buf)300 ecore_mfw_get_eth_tlv_value(struct ecore_drv_tlv_hdr *p_tlv,
301 			    struct ecore_mfw_tlv_eth *p_drv_buf,
302 			    u8 **p_tlv_buf)
303 {
304 	switch (p_tlv->tlv_type) {
305 	case DRV_TLV_LSO_MAX_OFFLOAD_SIZE:
306 		if (p_drv_buf->lso_maxoff_size_set) {
307 			*p_tlv_buf = (u8 *)&p_drv_buf->lso_maxoff_size;
308 			return sizeof(p_drv_buf->lso_maxoff_size);
309 		}
310 		break;
311 	case DRV_TLV_LSO_MIN_SEGMENT_COUNT:
312 		if (p_drv_buf->lso_minseg_size_set) {
313 			*p_tlv_buf = (u8 *)&p_drv_buf->lso_minseg_size;
314 			return sizeof(p_drv_buf->lso_minseg_size);
315 		}
316 		break;
317 	case DRV_TLV_PROMISCUOUS_MODE:
318 		if (p_drv_buf->prom_mode_set) {
319 			*p_tlv_buf = (u8 *)&p_drv_buf->prom_mode;
320 			return sizeof(p_drv_buf->prom_mode);
321 		}
322 		break;
323 	case DRV_TLV_TX_DESCRIPTORS_QUEUE_SIZE:
324 		if (p_drv_buf->tx_descr_size_set) {
325 			*p_tlv_buf = (u8 *)&p_drv_buf->tx_descr_size;
326 			return sizeof(p_drv_buf->tx_descr_size);
327 		}
328 		break;
329 	case DRV_TLV_RX_DESCRIPTORS_QUEUE_SIZE:
330 		if (p_drv_buf->rx_descr_size_set) {
331 			*p_tlv_buf = (u8 *)&p_drv_buf->rx_descr_size;
332 			return sizeof(p_drv_buf->rx_descr_size);
333 		}
334 		break;
335 	case DRV_TLV_NUM_OF_NET_QUEUE_VMQ_CFG:
336 		if (p_drv_buf->netq_count_set) {
337 			*p_tlv_buf = (u8 *)&p_drv_buf->netq_count;
338 			return sizeof(p_drv_buf->netq_count);
339 		}
340 		break;
341 	case DRV_TLV_NUM_OFFLOADED_CONNECTIONS_TCP_IPV4:
342 		if (p_drv_buf->tcp4_offloads_set) {
343 			*p_tlv_buf = (u8 *)&p_drv_buf->tcp4_offloads;
344 			return sizeof(p_drv_buf->tcp4_offloads);
345 		}
346 		break;
347 	case DRV_TLV_NUM_OFFLOADED_CONNECTIONS_TCP_IPV6:
348 		if (p_drv_buf->tcp6_offloads_set) {
349 			*p_tlv_buf = (u8 *)&p_drv_buf->tcp6_offloads;
350 			return sizeof(p_drv_buf->tcp6_offloads);
351 		}
352 		break;
353 	case DRV_TLV_TX_DESCRIPTOR_QUEUE_AVG_DEPTH:
354 		if (p_drv_buf->tx_descr_qdepth_set) {
355 			*p_tlv_buf = (u8 *)&p_drv_buf->tx_descr_qdepth;
356 			return sizeof(p_drv_buf->tx_descr_qdepth);
357 		}
358 		break;
359 	case DRV_TLV_RX_DESCRIPTORS_QUEUE_AVG_DEPTH:
360 		if (p_drv_buf->rx_descr_qdepth_set) {
361 			*p_tlv_buf = (u8 *)&p_drv_buf->rx_descr_qdepth;
362 			return sizeof(p_drv_buf->rx_descr_qdepth);
363 		}
364 		break;
365 	case DRV_TLV_IOV_OFFLOAD:
366 		if (p_drv_buf->iov_offload_set) {
367 			*p_tlv_buf = (u8 *)&p_drv_buf->iov_offload;
368 			return sizeof(p_drv_buf->iov_offload);
369 		}
370 		break;
371 	case DRV_TLV_TX_QUEUES_EMPTY:
372 		if (p_drv_buf->txqs_empty_set) {
373 			*p_tlv_buf = (u8 *)&p_drv_buf->txqs_empty;
374 			return sizeof(p_drv_buf->txqs_empty);
375 		}
376 		break;
377 	case DRV_TLV_RX_QUEUES_EMPTY:
378 		if (p_drv_buf->rxqs_empty_set) {
379 			*p_tlv_buf = (u8 *)&p_drv_buf->rxqs_empty;
380 			return sizeof(p_drv_buf->rxqs_empty);
381 		}
382 		break;
383 	case DRV_TLV_TX_QUEUES_FULL:
384 		if (p_drv_buf->num_txqs_full_set) {
385 			*p_tlv_buf = (u8 *)&p_drv_buf->num_txqs_full;
386 			return sizeof(p_drv_buf->num_txqs_full);
387 		}
388 		break;
389 	case DRV_TLV_RX_QUEUES_FULL:
390 		if (p_drv_buf->num_rxqs_full_set) {
391 			*p_tlv_buf = (u8 *)&p_drv_buf->num_rxqs_full;
392 			return sizeof(p_drv_buf->num_rxqs_full);
393 		}
394 		break;
395 	default:
396 		break;
397 	}
398 
399 	return -1;
400 }
401 
402 static int
ecore_mfw_get_fcoe_tlv_value(struct ecore_drv_tlv_hdr * p_tlv,struct ecore_mfw_tlv_fcoe * p_drv_buf,u8 ** p_tlv_buf)403 ecore_mfw_get_fcoe_tlv_value(struct ecore_drv_tlv_hdr *p_tlv,
404 			     struct ecore_mfw_tlv_fcoe *p_drv_buf,
405 			     u8 **p_tlv_buf)
406 {
407 	switch (p_tlv->tlv_type) {
408 	case DRV_TLV_SCSI_TO:
409 		if (p_drv_buf->scsi_timeout_set) {
410 			*p_tlv_buf = (u8 *)&p_drv_buf->scsi_timeout;
411 			return sizeof(p_drv_buf->scsi_timeout);
412 		}
413 		break;
414 	case DRV_TLV_R_T_TOV:
415 		if (p_drv_buf->rt_tov_set) {
416 			*p_tlv_buf = (u8 *)&p_drv_buf->rt_tov;
417 			return sizeof(p_drv_buf->rt_tov);
418 		}
419 		break;
420 	case DRV_TLV_R_A_TOV:
421 		if (p_drv_buf->ra_tov_set) {
422 			*p_tlv_buf = (u8 *)&p_drv_buf->ra_tov;
423 			return sizeof(p_drv_buf->ra_tov);
424 		}
425 		break;
426 	case DRV_TLV_E_D_TOV:
427 		if (p_drv_buf->ed_tov_set) {
428 			*p_tlv_buf = (u8 *)&p_drv_buf->ed_tov;
429 			return sizeof(p_drv_buf->ed_tov);
430 		}
431 		break;
432 	case DRV_TLV_CR_TOV:
433 		if (p_drv_buf->cr_tov_set) {
434 			*p_tlv_buf = (u8 *)&p_drv_buf->cr_tov;
435 			return sizeof(p_drv_buf->cr_tov);
436 		}
437 		break;
438 	case DRV_TLV_BOOT_TYPE:
439 		if (p_drv_buf->boot_type_set) {
440 			*p_tlv_buf = (u8 *)&p_drv_buf->boot_type;
441 			return sizeof(p_drv_buf->boot_type);
442 		}
443 		break;
444 	case DRV_TLV_NPIV_STATE:
445 		if (p_drv_buf->npiv_state_set) {
446 			*p_tlv_buf = (u8 *)&p_drv_buf->npiv_state;
447 			return sizeof(p_drv_buf->npiv_state);
448 		}
449 		break;
450 	case DRV_TLV_NUM_OF_NPIV_IDS:
451 		if (p_drv_buf->num_npiv_ids_set) {
452 			*p_tlv_buf = (u8 *)&p_drv_buf->num_npiv_ids;
453 			return sizeof(p_drv_buf->num_npiv_ids);
454 		}
455 		break;
456 	case DRV_TLV_SWITCH_NAME:
457 		if (p_drv_buf->switch_name_set) {
458 			*p_tlv_buf = (u8 *)&p_drv_buf->switch_name;
459 			return sizeof(p_drv_buf->switch_name);
460 		}
461 		break;
462 	case DRV_TLV_SWITCH_PORT_NUM:
463 		if (p_drv_buf->switch_portnum_set) {
464 			*p_tlv_buf = (u8 *)&p_drv_buf->switch_portnum;
465 			return sizeof(p_drv_buf->switch_portnum);
466 		}
467 		break;
468 	case DRV_TLV_SWITCH_PORT_ID:
469 		if (p_drv_buf->switch_portid_set) {
470 			*p_tlv_buf = (u8 *)&p_drv_buf->switch_portid;
471 			return sizeof(p_drv_buf->switch_portid);
472 		}
473 		break;
474 	case DRV_TLV_VENDOR_NAME:
475 		if (p_drv_buf->vendor_name_set) {
476 			*p_tlv_buf = (u8 *)&p_drv_buf->vendor_name;
477 			return sizeof(p_drv_buf->vendor_name);
478 		}
479 		break;
480 	case DRV_TLV_SWITCH_MODEL:
481 		if (p_drv_buf->switch_model_set) {
482 			*p_tlv_buf = (u8 *)&p_drv_buf->switch_model;
483 			return sizeof(p_drv_buf->switch_model);
484 		}
485 		break;
486 	case DRV_TLV_SWITCH_FW_VER:
487 		if (p_drv_buf->switch_fw_version_set) {
488 			*p_tlv_buf = (u8 *)&p_drv_buf->switch_fw_version;
489 			return sizeof(p_drv_buf->switch_fw_version);
490 		}
491 		break;
492 	case DRV_TLV_QOS_PRIORITY_PER_802_1P:
493 		if (p_drv_buf->qos_pri_set) {
494 			*p_tlv_buf = (u8 *)&p_drv_buf->qos_pri;
495 			return sizeof(p_drv_buf->qos_pri);
496 		}
497 		break;
498 	case DRV_TLV_PORT_ALIAS:
499 		if (p_drv_buf->port_alias_set) {
500 			*p_tlv_buf = (u8 *)&p_drv_buf->port_alias;
501 			return sizeof(p_drv_buf->port_alias);
502 		}
503 		break;
504 	case DRV_TLV_PORT_STATE:
505 		if (p_drv_buf->port_state_set) {
506 			*p_tlv_buf = (u8 *)&p_drv_buf->port_state;
507 			return sizeof(p_drv_buf->port_state);
508 		}
509 		break;
510 	case DRV_TLV_FIP_TX_DESCRIPTORS_QUEUE_SIZE:
511 		if (p_drv_buf->fip_tx_descr_size_set) {
512 			*p_tlv_buf = (u8 *)&p_drv_buf->fip_tx_descr_size;
513 			return sizeof(p_drv_buf->fip_tx_descr_size);
514 		}
515 		break;
516 	case DRV_TLV_FCOE_RX_DESCRIPTORS_QUEUE_SIZE:
517 		if (p_drv_buf->fip_rx_descr_size_set) {
518 			*p_tlv_buf = (u8 *)&p_drv_buf->fip_rx_descr_size;
519 			return sizeof(p_drv_buf->fip_rx_descr_size);
520 		}
521 		break;
522 	case DRV_TLV_LINK_FAILURE_COUNT:
523 		if (p_drv_buf->link_failures_set) {
524 			*p_tlv_buf = (u8 *)&p_drv_buf->link_failures;
525 			return sizeof(p_drv_buf->link_failures);
526 		}
527 		break;
528 	case DRV_TLV_FCOE_BOOT_PROGRESS:
529 		if (p_drv_buf->fcoe_boot_progress_set) {
530 			*p_tlv_buf = (u8 *)&p_drv_buf->fcoe_boot_progress;
531 			return sizeof(p_drv_buf->fcoe_boot_progress);
532 		}
533 		break;
534 	case DRV_TLV_RX_BROADCAST_PACKETS:
535 		if (p_drv_buf->rx_bcast_set) {
536 			*p_tlv_buf = (u8 *)&p_drv_buf->rx_bcast;
537 			return sizeof(p_drv_buf->rx_bcast);
538 		}
539 		break;
540 	case DRV_TLV_TX_BROADCAST_PACKETS:
541 		if (p_drv_buf->tx_bcast_set) {
542 			*p_tlv_buf = (u8 *)&p_drv_buf->tx_bcast;
543 			return sizeof(p_drv_buf->tx_bcast);
544 		}
545 		break;
546 	case DRV_TLV_FCOE_TX_DESCRIPTOR_QUEUE_AVG_DEPTH:
547 		if (p_drv_buf->fcoe_txq_depth_set) {
548 			*p_tlv_buf = (u8 *)&p_drv_buf->fcoe_txq_depth;
549 			return sizeof(p_drv_buf->fcoe_txq_depth);
550 		}
551 		break;
552 	case DRV_TLV_FCOE_RX_DESCRIPTORS_QUEUE_AVG_DEPTH:
553 		if (p_drv_buf->fcoe_rxq_depth_set) {
554 			*p_tlv_buf = (u8 *)&p_drv_buf->fcoe_rxq_depth;
555 			return sizeof(p_drv_buf->fcoe_rxq_depth);
556 		}
557 		break;
558 	case DRV_TLV_FCOE_RX_FRAMES_RECEIVED:
559 		if (p_drv_buf->fcoe_rx_frames_set) {
560 			*p_tlv_buf = (u8 *)&p_drv_buf->fcoe_rx_frames;
561 			return sizeof(p_drv_buf->fcoe_rx_frames);
562 		}
563 		break;
564 	case DRV_TLV_FCOE_RX_BYTES_RECEIVED:
565 		if (p_drv_buf->fcoe_rx_bytes_set) {
566 			*p_tlv_buf = (u8 *)&p_drv_buf->fcoe_rx_bytes;
567 			return sizeof(p_drv_buf->fcoe_rx_bytes);
568 		}
569 		break;
570 	case DRV_TLV_FCOE_TX_FRAMES_SENT:
571 		if (p_drv_buf->fcoe_tx_frames_set) {
572 			*p_tlv_buf = (u8 *)&p_drv_buf->fcoe_tx_frames;
573 			return sizeof(p_drv_buf->fcoe_tx_frames);
574 		}
575 		break;
576 	case DRV_TLV_FCOE_TX_BYTES_SENT:
577 		if (p_drv_buf->fcoe_tx_bytes_set) {
578 			*p_tlv_buf = (u8 *)&p_drv_buf->fcoe_tx_bytes;
579 			return sizeof(p_drv_buf->fcoe_tx_bytes);
580 		}
581 		break;
582 	case DRV_TLV_CRC_ERROR_COUNT:
583 		if (p_drv_buf->crc_count_set) {
584 			*p_tlv_buf = (u8 *)&p_drv_buf->crc_count;
585 			return sizeof(p_drv_buf->crc_count);
586 		}
587 		break;
588 	case DRV_TLV_CRC_ERROR_1_RECEIVED_SOURCE_FC_ID:
589 		if (p_drv_buf->crc_err_src_fcid_set[0]) {
590 			*p_tlv_buf = (u8 *)&p_drv_buf->crc_err_src_fcid[0];
591 			return sizeof(p_drv_buf->crc_err_src_fcid[0]);
592 		}
593 		break;
594 	case DRV_TLV_CRC_ERROR_2_RECEIVED_SOURCE_FC_ID:
595 		if (p_drv_buf->crc_err_src_fcid_set[1]) {
596 			*p_tlv_buf = (u8 *)&p_drv_buf->crc_err_src_fcid[1];
597 			return sizeof(p_drv_buf->crc_err_src_fcid[1]);
598 		}
599 		break;
600 	case DRV_TLV_CRC_ERROR_3_RECEIVED_SOURCE_FC_ID:
601 		if (p_drv_buf->crc_err_src_fcid_set[2]) {
602 			*p_tlv_buf = (u8 *)&p_drv_buf->crc_err_src_fcid[2];
603 			return sizeof(p_drv_buf->crc_err_src_fcid[2]);
604 		}
605 		break;
606 	case DRV_TLV_CRC_ERROR_4_RECEIVED_SOURCE_FC_ID:
607 		if (p_drv_buf->crc_err_src_fcid_set[3]) {
608 			*p_tlv_buf = (u8 *)&p_drv_buf->crc_err_src_fcid[3];
609 			return sizeof(p_drv_buf->crc_err_src_fcid[3]);
610 		}
611 		break;
612 	case DRV_TLV_CRC_ERROR_5_RECEIVED_SOURCE_FC_ID:
613 		if (p_drv_buf->crc_err_src_fcid_set[4]) {
614 			*p_tlv_buf = (u8 *)&p_drv_buf->crc_err_src_fcid[4];
615 			return sizeof(p_drv_buf->crc_err_src_fcid[4]);
616 		}
617 		break;
618 	case DRV_TLV_CRC_ERROR_1_TIMESTAMP:
619 		if (p_drv_buf->crc_err_tstamp_set[0]) {
620 			*p_tlv_buf = (u8 *)&p_drv_buf->crc_err_tstamp[0];
621 			return sizeof(p_drv_buf->crc_err_tstamp[0]);
622 		}
623 		break;
624 	case DRV_TLV_CRC_ERROR_2_TIMESTAMP:
625 		if (p_drv_buf->crc_err_tstamp_set[1]) {
626 			*p_tlv_buf = (u8 *)&p_drv_buf->crc_err_tstamp[1];
627 			return sizeof(p_drv_buf->crc_err_tstamp[1]);
628 		}
629 		break;
630 	case DRV_TLV_CRC_ERROR_3_TIMESTAMP:
631 		if (p_drv_buf->crc_err_tstamp_set[2]) {
632 			*p_tlv_buf = (u8 *)&p_drv_buf->crc_err_tstamp[2];
633 			return sizeof(p_drv_buf->crc_err_tstamp[2]);
634 		}
635 		break;
636 	case DRV_TLV_CRC_ERROR_4_TIMESTAMP:
637 		if (p_drv_buf->crc_err_tstamp_set[3]) {
638 			*p_tlv_buf = (u8 *)&p_drv_buf->crc_err_tstamp[3];
639 			return sizeof(p_drv_buf->crc_err_tstamp[3]);
640 		}
641 		break;
642 	case DRV_TLV_CRC_ERROR_5_TIMESTAMP:
643 		if (p_drv_buf->crc_err_tstamp_set[4]) {
644 			*p_tlv_buf = (u8 *)&p_drv_buf->crc_err_tstamp[4];
645 			return sizeof(p_drv_buf->crc_err_tstamp[4]);
646 		}
647 		break;
648 	case DRV_TLV_LOSS_OF_SYNC_ERROR_COUNT:
649 		if (p_drv_buf->losync_err_set) {
650 			*p_tlv_buf = (u8 *)&p_drv_buf->losync_err;
651 			return sizeof(p_drv_buf->losync_err);
652 		}
653 		break;
654 	case DRV_TLV_LOSS_OF_SIGNAL_ERRORS:
655 		if (p_drv_buf->losig_err_set) {
656 			*p_tlv_buf = (u8 *)&p_drv_buf->losig_err;
657 			return sizeof(p_drv_buf->losig_err);
658 		}
659 		break;
660 	case DRV_TLV_PRIMITIVE_SEQUENCE_PROTOCOL_ERROR_COUNT:
661 		if (p_drv_buf->primtive_err_set) {
662 			*p_tlv_buf = (u8 *)&p_drv_buf->primtive_err;
663 			return sizeof(p_drv_buf->primtive_err);
664 		}
665 		break;
666 	case DRV_TLV_DISPARITY_ERROR_COUNT:
667 		if (p_drv_buf->disparity_err_set) {
668 			*p_tlv_buf = (u8 *)&p_drv_buf->disparity_err;
669 			return sizeof(p_drv_buf->disparity_err);
670 		}
671 		break;
672 	case DRV_TLV_CODE_VIOLATION_ERROR_COUNT:
673 		if (p_drv_buf->code_violation_err_set) {
674 			*p_tlv_buf = (u8 *)&p_drv_buf->code_violation_err;
675 			return sizeof(p_drv_buf->code_violation_err);
676 		}
677 		break;
678 	case DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_1:
679 		if (p_drv_buf->flogi_param_set[0]) {
680 			*p_tlv_buf = (u8 *)&p_drv_buf->flogi_param[0];
681 			return sizeof(p_drv_buf->flogi_param[0]);
682 		}
683 		break;
684 	case DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_2:
685 		if (p_drv_buf->flogi_param_set[1]) {
686 			*p_tlv_buf = (u8 *)&p_drv_buf->flogi_param[1];
687 			return sizeof(p_drv_buf->flogi_param[1]);
688 		}
689 		break;
690 	case DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_3:
691 		if (p_drv_buf->flogi_param_set[2]) {
692 			*p_tlv_buf = (u8 *)&p_drv_buf->flogi_param[2];
693 			return sizeof(p_drv_buf->flogi_param[2]);
694 		}
695 		break;
696 	case DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_4:
697 		if (p_drv_buf->flogi_param_set[3]) {
698 			*p_tlv_buf = (u8 *)&p_drv_buf->flogi_param[3];
699 			return sizeof(p_drv_buf->flogi_param[3]);
700 		}
701 		break;
702 	case DRV_TLV_LAST_FLOGI_TIMESTAMP:
703 		if (p_drv_buf->flogi_tstamp_set) {
704 			*p_tlv_buf = (u8 *)&p_drv_buf->flogi_tstamp;
705 			return sizeof(p_drv_buf->flogi_tstamp);
706 		}
707 		break;
708 	case DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_1:
709 		if (p_drv_buf->flogi_acc_param_set[0]) {
710 			*p_tlv_buf = (u8 *)&p_drv_buf->flogi_acc_param[0];
711 			return sizeof(p_drv_buf->flogi_acc_param[0]);
712 		}
713 		break;
714 	case DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_2:
715 		if (p_drv_buf->flogi_acc_param_set[1]) {
716 			*p_tlv_buf = (u8 *)&p_drv_buf->flogi_acc_param[1];
717 			return sizeof(p_drv_buf->flogi_acc_param[1]);
718 		}
719 		break;
720 	case DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_3:
721 		if (p_drv_buf->flogi_acc_param_set[2]) {
722 			*p_tlv_buf = (u8 *)&p_drv_buf->flogi_acc_param[2];
723 			return sizeof(p_drv_buf->flogi_acc_param[2]);
724 		}
725 		break;
726 	case DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_4:
727 		if (p_drv_buf->flogi_acc_param_set[3]) {
728 			*p_tlv_buf = (u8 *)&p_drv_buf->flogi_acc_param[3];
729 			return sizeof(p_drv_buf->flogi_acc_param[3]);
730 		}
731 		break;
732 	case DRV_TLV_LAST_FLOGI_ACC_TIMESTAMP:
733 		if (p_drv_buf->flogi_acc_tstamp_set) {
734 			*p_tlv_buf = (u8 *)&p_drv_buf->flogi_acc_tstamp;
735 			return sizeof(p_drv_buf->flogi_acc_tstamp);
736 		}
737 		break;
738 	case DRV_TLV_LAST_FLOGI_RJT:
739 		if (p_drv_buf->flogi_rjt_set) {
740 			*p_tlv_buf = (u8 *)&p_drv_buf->flogi_rjt;
741 			return sizeof(p_drv_buf->flogi_rjt);
742 		}
743 		break;
744 	case DRV_TLV_LAST_FLOGI_RJT_TIMESTAMP:
745 		if (p_drv_buf->flogi_rjt_tstamp_set) {
746 			*p_tlv_buf = (u8 *)&p_drv_buf->flogi_rjt_tstamp;
747 			return sizeof(p_drv_buf->flogi_rjt_tstamp);
748 		}
749 		break;
750 	case DRV_TLV_FDISCS_SENT_COUNT:
751 		if (p_drv_buf->fdiscs_set) {
752 			*p_tlv_buf = (u8 *)&p_drv_buf->fdiscs;
753 			return sizeof(p_drv_buf->fdiscs);
754 		}
755 		break;
756 	case DRV_TLV_FDISC_ACCS_RECEIVED:
757 		if (p_drv_buf->fdisc_acc_set) {
758 			*p_tlv_buf = (u8 *)&p_drv_buf->fdisc_acc;
759 			return sizeof(p_drv_buf->fdisc_acc);
760 		}
761 		break;
762 	case DRV_TLV_FDISC_RJTS_RECEIVED:
763 		if (p_drv_buf->fdisc_rjt_set) {
764 			*p_tlv_buf = (u8 *)&p_drv_buf->fdisc_rjt;
765 			return sizeof(p_drv_buf->fdisc_rjt);
766 		}
767 		break;
768 	case DRV_TLV_PLOGI_SENT_COUNT:
769 		if (p_drv_buf->plogi_set) {
770 			*p_tlv_buf = (u8 *)&p_drv_buf->plogi;
771 			return sizeof(p_drv_buf->plogi);
772 		}
773 		break;
774 	case DRV_TLV_PLOGI_ACCS_RECEIVED:
775 		if (p_drv_buf->plogi_acc_set) {
776 			*p_tlv_buf = (u8 *)&p_drv_buf->plogi_acc;
777 			return sizeof(p_drv_buf->plogi_acc);
778 		}
779 		break;
780 	case DRV_TLV_PLOGI_RJTS_RECEIVED:
781 		if (p_drv_buf->plogi_rjt_set) {
782 			*p_tlv_buf = (u8 *)&p_drv_buf->plogi_rjt;
783 			return sizeof(p_drv_buf->plogi_rjt);
784 		}
785 		break;
786 	case DRV_TLV_PLOGI_1_SENT_DESTINATION_FC_ID:
787 		if (p_drv_buf->plogi_dst_fcid_set[0]) {
788 			*p_tlv_buf = (u8 *)&p_drv_buf->plogi_dst_fcid[0];
789 			return sizeof(p_drv_buf->plogi_dst_fcid[0]);
790 		}
791 		break;
792 	case DRV_TLV_PLOGI_2_SENT_DESTINATION_FC_ID:
793 		if (p_drv_buf->plogi_dst_fcid_set[1]) {
794 			*p_tlv_buf = (u8 *)&p_drv_buf->plogi_dst_fcid[1];
795 			return sizeof(p_drv_buf->plogi_dst_fcid[1]);
796 		}
797 		break;
798 	case DRV_TLV_PLOGI_3_SENT_DESTINATION_FC_ID:
799 		if (p_drv_buf->plogi_dst_fcid_set[2]) {
800 			*p_tlv_buf = (u8 *)&p_drv_buf->plogi_dst_fcid[2];
801 			return sizeof(p_drv_buf->plogi_dst_fcid[2]);
802 		}
803 		break;
804 	case DRV_TLV_PLOGI_4_SENT_DESTINATION_FC_ID:
805 		if (p_drv_buf->plogi_dst_fcid_set[3]) {
806 			*p_tlv_buf = (u8 *)&p_drv_buf->plogi_dst_fcid[3];
807 			return sizeof(p_drv_buf->plogi_dst_fcid[3]);
808 		}
809 		break;
810 	case DRV_TLV_PLOGI_5_SENT_DESTINATION_FC_ID:
811 		if (p_drv_buf->plogi_dst_fcid_set[4]) {
812 			*p_tlv_buf = (u8 *)&p_drv_buf->plogi_dst_fcid[4];
813 			return sizeof(p_drv_buf->plogi_dst_fcid[4]);
814 		}
815 		break;
816 	case DRV_TLV_PLOGI_1_TIMESTAMP:
817 		if (p_drv_buf->plogi_tstamp_set[0]) {
818 			*p_tlv_buf = (u8 *)&p_drv_buf->plogi_tstamp[0];
819 			return sizeof(p_drv_buf->plogi_tstamp[0]);
820 		}
821 		break;
822 	case DRV_TLV_PLOGI_2_TIMESTAMP:
823 		if (p_drv_buf->plogi_tstamp_set[1]) {
824 			*p_tlv_buf = (u8 *)&p_drv_buf->plogi_tstamp[1];
825 			return sizeof(p_drv_buf->plogi_tstamp[1]);
826 		}
827 		break;
828 	case DRV_TLV_PLOGI_3_TIMESTAMP:
829 		if (p_drv_buf->plogi_tstamp_set[2]) {
830 			*p_tlv_buf = (u8 *)&p_drv_buf->plogi_tstamp[2];
831 			return sizeof(p_drv_buf->plogi_tstamp[2]);
832 		}
833 		break;
834 	case DRV_TLV_PLOGI_4_TIMESTAMP:
835 		if (p_drv_buf->plogi_tstamp_set[3]) {
836 			*p_tlv_buf = (u8 *)&p_drv_buf->plogi_tstamp[3];
837 			return sizeof(p_drv_buf->plogi_tstamp[3]);
838 		}
839 		break;
840 	case DRV_TLV_PLOGI_5_TIMESTAMP:
841 		if (p_drv_buf->plogi_tstamp_set[4]) {
842 			*p_tlv_buf = (u8 *)&p_drv_buf->plogi_tstamp[4];
843 			return sizeof(p_drv_buf->plogi_tstamp[4]);
844 		}
845 		break;
846 	case DRV_TLV_PLOGI_1_ACC_RECEIVED_SOURCE_FC_ID:
847 		if (p_drv_buf->plogi_acc_src_fcid_set[0]) {
848 			*p_tlv_buf = (u8 *)&p_drv_buf->plogi_acc_src_fcid[0];
849 			return sizeof(p_drv_buf->plogi_acc_src_fcid[0]);
850 		}
851 		break;
852 	case DRV_TLV_PLOGI_2_ACC_RECEIVED_SOURCE_FC_ID:
853 		if (p_drv_buf->plogi_acc_src_fcid_set[1]) {
854 			*p_tlv_buf = (u8 *)&p_drv_buf->plogi_acc_src_fcid[1];
855 			return sizeof(p_drv_buf->plogi_acc_src_fcid[1]);
856 		}
857 		break;
858 	case DRV_TLV_PLOGI_3_ACC_RECEIVED_SOURCE_FC_ID:
859 		if (p_drv_buf->plogi_acc_src_fcid_set[2]) {
860 			*p_tlv_buf = (u8 *)&p_drv_buf->plogi_acc_src_fcid[2];
861 			return sizeof(p_drv_buf->plogi_acc_src_fcid[2]);
862 		}
863 		break;
864 	case DRV_TLV_PLOGI_4_ACC_RECEIVED_SOURCE_FC_ID:
865 		if (p_drv_buf->plogi_acc_src_fcid_set[3]) {
866 			*p_tlv_buf = (u8 *)&p_drv_buf->plogi_acc_src_fcid[3];
867 			return sizeof(p_drv_buf->plogi_acc_src_fcid[3]);
868 		}
869 		break;
870 	case DRV_TLV_PLOGI_5_ACC_RECEIVED_SOURCE_FC_ID:
871 		if (p_drv_buf->plogi_acc_src_fcid_set[4]) {
872 			*p_tlv_buf = (u8 *)&p_drv_buf->plogi_acc_src_fcid[4];
873 			return sizeof(p_drv_buf->plogi_acc_src_fcid[4]);
874 		}
875 		break;
876 	case DRV_TLV_PLOGI_1_ACC_TIMESTAMP:
877 		if (p_drv_buf->plogi_acc_tstamp_set[0]) {
878 			*p_tlv_buf = (u8 *)&p_drv_buf->plogi_acc_tstamp[0];
879 			return sizeof(p_drv_buf->plogi_acc_tstamp[0]);
880 		}
881 		break;
882 	case DRV_TLV_PLOGI_2_ACC_TIMESTAMP:
883 		if (p_drv_buf->plogi_acc_tstamp_set[1]) {
884 			*p_tlv_buf = (u8 *)&p_drv_buf->plogi_acc_tstamp[1];
885 			return sizeof(p_drv_buf->plogi_acc_tstamp[1]);
886 		}
887 		break;
888 	case DRV_TLV_PLOGI_3_ACC_TIMESTAMP:
889 		if (p_drv_buf->plogi_acc_tstamp_set[2]) {
890 			*p_tlv_buf = (u8 *)&p_drv_buf->plogi_acc_tstamp[2];
891 			return sizeof(p_drv_buf->plogi_acc_tstamp[2]);
892 		}
893 		break;
894 	case DRV_TLV_PLOGI_4_ACC_TIMESTAMP:
895 		if (p_drv_buf->plogi_acc_tstamp_set[3]) {
896 			*p_tlv_buf = (u8 *)&p_drv_buf->plogi_acc_tstamp[3];
897 			return sizeof(p_drv_buf->plogi_acc_tstamp[3]);
898 		}
899 		break;
900 	case DRV_TLV_PLOGI_5_ACC_TIMESTAMP:
901 		if (p_drv_buf->plogi_acc_tstamp_set[4]) {
902 			*p_tlv_buf = (u8 *)&p_drv_buf->plogi_acc_tstamp[4];
903 			return sizeof(p_drv_buf->plogi_acc_tstamp[4]);
904 		}
905 		break;
906 	case DRV_TLV_LOGOS_ISSUED:
907 		if (p_drv_buf->tx_plogos_set) {
908 			*p_tlv_buf = (u8 *)&p_drv_buf->tx_plogos;
909 			return sizeof(p_drv_buf->tx_plogos);
910 		}
911 		break;
912 	case DRV_TLV_LOGO_ACCS_RECEIVED:
913 		if (p_drv_buf->plogo_acc_set) {
914 			*p_tlv_buf = (u8 *)&p_drv_buf->plogo_acc;
915 			return sizeof(p_drv_buf->plogo_acc);
916 		}
917 		break;
918 	case DRV_TLV_LOGO_RJTS_RECEIVED:
919 		if (p_drv_buf->plogo_rjt_set) {
920 			*p_tlv_buf = (u8 *)&p_drv_buf->plogo_rjt;
921 			return sizeof(p_drv_buf->plogo_rjt);
922 		}
923 		break;
924 	case DRV_TLV_LOGO_1_RECEIVED_SOURCE_FC_ID:
925 		if (p_drv_buf->plogo_src_fcid_set[0]) {
926 			*p_tlv_buf = (u8 *)&p_drv_buf->plogo_src_fcid[0];
927 			return sizeof(p_drv_buf->plogo_src_fcid[0]);
928 		}
929 		break;
930 	case DRV_TLV_LOGO_2_RECEIVED_SOURCE_FC_ID:
931 		if (p_drv_buf->plogo_src_fcid_set[1]) {
932 			*p_tlv_buf = (u8 *)&p_drv_buf->plogo_src_fcid[1];
933 			return sizeof(p_drv_buf->plogo_src_fcid[1]);
934 		}
935 		break;
936 	case DRV_TLV_LOGO_3_RECEIVED_SOURCE_FC_ID:
937 		if (p_drv_buf->plogo_src_fcid_set[2]) {
938 			*p_tlv_buf = (u8 *)&p_drv_buf->plogo_src_fcid[2];
939 			return sizeof(p_drv_buf->plogo_src_fcid[2]);
940 		}
941 		break;
942 	case DRV_TLV_LOGO_4_RECEIVED_SOURCE_FC_ID:
943 		if (p_drv_buf->plogo_src_fcid_set[3]) {
944 			*p_tlv_buf = (u8 *)&p_drv_buf->plogo_src_fcid[3];
945 			return sizeof(p_drv_buf->plogo_src_fcid[3]);
946 		}
947 		break;
948 	case DRV_TLV_LOGO_5_RECEIVED_SOURCE_FC_ID:
949 		if (p_drv_buf->plogo_src_fcid_set[4]) {
950 			*p_tlv_buf = (u8 *)&p_drv_buf->plogo_src_fcid[4];
951 			return sizeof(p_drv_buf->plogo_src_fcid[4]);
952 		}
953 		break;
954 	case DRV_TLV_LOGO_1_TIMESTAMP:
955 		if (p_drv_buf->plogo_tstamp_set[0]) {
956 			*p_tlv_buf = (u8 *)&p_drv_buf->plogo_tstamp[0];
957 			return sizeof(p_drv_buf->plogo_tstamp[0]);
958 		}
959 		break;
960 	case DRV_TLV_LOGO_2_TIMESTAMP:
961 		if (p_drv_buf->plogo_tstamp_set[1]) {
962 			*p_tlv_buf = (u8 *)&p_drv_buf->plogo_tstamp[1];
963 			return sizeof(p_drv_buf->plogo_tstamp[1]);
964 		}
965 		break;
966 	case DRV_TLV_LOGO_3_TIMESTAMP:
967 		if (p_drv_buf->plogo_tstamp_set[2]) {
968 			*p_tlv_buf = (u8 *)&p_drv_buf->plogo_tstamp[2];
969 			return sizeof(p_drv_buf->plogo_tstamp[2]);
970 		}
971 		break;
972 	case DRV_TLV_LOGO_4_TIMESTAMP:
973 		if (p_drv_buf->plogo_tstamp_set[3]) {
974 			*p_tlv_buf = (u8 *)&p_drv_buf->plogo_tstamp[3];
975 			return sizeof(p_drv_buf->plogo_tstamp[3]);
976 		}
977 		break;
978 	case DRV_TLV_LOGO_5_TIMESTAMP:
979 		if (p_drv_buf->plogo_tstamp_set[4]) {
980 			*p_tlv_buf = (u8 *)&p_drv_buf->plogo_tstamp[4];
981 			return sizeof(p_drv_buf->plogo_tstamp[4]);
982 		}
983 		break;
984 	case DRV_TLV_LOGOS_RECEIVED:
985 		if (p_drv_buf->rx_logos_set) {
986 			*p_tlv_buf = (u8 *)&p_drv_buf->rx_logos;
987 			return sizeof(p_drv_buf->rx_logos);
988 		}
989 		break;
990 	case DRV_TLV_ACCS_ISSUED:
991 		if (p_drv_buf->tx_accs_set) {
992 			*p_tlv_buf = (u8 *)&p_drv_buf->tx_accs;
993 			return sizeof(p_drv_buf->tx_accs);
994 		}
995 		break;
996 	case DRV_TLV_PRLIS_ISSUED:
997 		if (p_drv_buf->tx_prlis_set) {
998 			*p_tlv_buf = (u8 *)&p_drv_buf->tx_prlis;
999 			return sizeof(p_drv_buf->tx_prlis);
1000 		}
1001 		break;
1002 	case DRV_TLV_ACCS_RECEIVED:
1003 		if (p_drv_buf->rx_accs_set) {
1004 			*p_tlv_buf = (u8 *)&p_drv_buf->rx_accs;
1005 			return sizeof(p_drv_buf->rx_accs);
1006 		}
1007 		break;
1008 	case DRV_TLV_ABTS_SENT_COUNT:
1009 		if (p_drv_buf->tx_abts_set) {
1010 			*p_tlv_buf = (u8 *)&p_drv_buf->tx_abts;
1011 			return sizeof(p_drv_buf->tx_abts);
1012 		}
1013 		break;
1014 	case DRV_TLV_ABTS_ACCS_RECEIVED:
1015 		if (p_drv_buf->rx_abts_acc_set) {
1016 			*p_tlv_buf = (u8 *)&p_drv_buf->rx_abts_acc;
1017 			return sizeof(p_drv_buf->rx_abts_acc);
1018 		}
1019 		break;
1020 	case DRV_TLV_ABTS_RJTS_RECEIVED:
1021 		if (p_drv_buf->rx_abts_rjt_set) {
1022 			*p_tlv_buf = (u8 *)&p_drv_buf->rx_abts_rjt;
1023 			return sizeof(p_drv_buf->rx_abts_rjt);
1024 		}
1025 		break;
1026 	case DRV_TLV_ABTS_1_SENT_DESTINATION_FC_ID:
1027 		if (p_drv_buf->abts_dst_fcid_set[0]) {
1028 			*p_tlv_buf = (u8 *)&p_drv_buf->abts_dst_fcid[0];
1029 			return sizeof(p_drv_buf->abts_dst_fcid[0]);
1030 		}
1031 		break;
1032 	case DRV_TLV_ABTS_2_SENT_DESTINATION_FC_ID:
1033 		if (p_drv_buf->abts_dst_fcid_set[1]) {
1034 			*p_tlv_buf = (u8 *)&p_drv_buf->abts_dst_fcid[1];
1035 			return sizeof(p_drv_buf->abts_dst_fcid[1]);
1036 		}
1037 		break;
1038 	case DRV_TLV_ABTS_3_SENT_DESTINATION_FC_ID:
1039 		if (p_drv_buf->abts_dst_fcid_set[2]) {
1040 			*p_tlv_buf = (u8 *)&p_drv_buf->abts_dst_fcid[2];
1041 			return sizeof(p_drv_buf->abts_dst_fcid[2]);
1042 		}
1043 		break;
1044 	case DRV_TLV_ABTS_4_SENT_DESTINATION_FC_ID:
1045 		if (p_drv_buf->abts_dst_fcid_set[3]) {
1046 			*p_tlv_buf = (u8 *)&p_drv_buf->abts_dst_fcid[3];
1047 			return sizeof(p_drv_buf->abts_dst_fcid[3]);
1048 		}
1049 		break;
1050 	case DRV_TLV_ABTS_5_SENT_DESTINATION_FC_ID:
1051 		if (p_drv_buf->abts_dst_fcid_set[4]) {
1052 			*p_tlv_buf = (u8 *)&p_drv_buf->abts_dst_fcid[4];
1053 			return sizeof(p_drv_buf->abts_dst_fcid[4]);
1054 		}
1055 		break;
1056 	case DRV_TLV_ABTS_1_TIMESTAMP:
1057 		if (p_drv_buf->abts_tstamp_set[0]) {
1058 			*p_tlv_buf = (u8 *)&p_drv_buf->abts_tstamp[0];
1059 			return sizeof(p_drv_buf->abts_tstamp[0]);
1060 		}
1061 		break;
1062 	case DRV_TLV_ABTS_2_TIMESTAMP:
1063 		if (p_drv_buf->abts_tstamp_set[1]) {
1064 			*p_tlv_buf = (u8 *)&p_drv_buf->abts_tstamp[1];
1065 			return sizeof(p_drv_buf->abts_tstamp[1]);
1066 		}
1067 		break;
1068 	case DRV_TLV_ABTS_3_TIMESTAMP:
1069 		if (p_drv_buf->abts_tstamp_set[2]) {
1070 			*p_tlv_buf = (u8 *)&p_drv_buf->abts_tstamp[2];
1071 			return sizeof(p_drv_buf->abts_tstamp[2]);
1072 		}
1073 		break;
1074 	case DRV_TLV_ABTS_4_TIMESTAMP:
1075 		if (p_drv_buf->abts_tstamp_set[3]) {
1076 			*p_tlv_buf = (u8 *)&p_drv_buf->abts_tstamp[3];
1077 			return sizeof(p_drv_buf->abts_tstamp[3]);
1078 		}
1079 		break;
1080 	case DRV_TLV_ABTS_5_TIMESTAMP:
1081 		if (p_drv_buf->abts_tstamp_set[4]) {
1082 			*p_tlv_buf = (u8 *)&p_drv_buf->abts_tstamp[4];
1083 			return sizeof(p_drv_buf->abts_tstamp[4]);
1084 		}
1085 		break;
1086 	case DRV_TLV_RSCNS_RECEIVED:
1087 		if (p_drv_buf->rx_rscn_set) {
1088 			*p_tlv_buf = (u8 *)&p_drv_buf->rx_rscn;
1089 			return sizeof(p_drv_buf->rx_rscn);
1090 		}
1091 		break;
1092 	case DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_1:
1093 		if (p_drv_buf->rx_rscn_nport_set[0]) {
1094 			*p_tlv_buf = (u8 *)&p_drv_buf->rx_rscn_nport[0];
1095 			return sizeof(p_drv_buf->rx_rscn_nport[0]);
1096 		}
1097 		break;
1098 	case DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_2:
1099 		if (p_drv_buf->rx_rscn_nport_set[1]) {
1100 			*p_tlv_buf = (u8 *)&p_drv_buf->rx_rscn_nport[1];
1101 			return sizeof(p_drv_buf->rx_rscn_nport[1]);
1102 		}
1103 		break;
1104 	case DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_3:
1105 		if (p_drv_buf->rx_rscn_nport_set[2]) {
1106 			*p_tlv_buf = (u8 *)&p_drv_buf->rx_rscn_nport[2];
1107 			return sizeof(p_drv_buf->rx_rscn_nport[2]);
1108 		}
1109 		break;
1110 	case DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_4:
1111 		if (p_drv_buf->rx_rscn_nport_set[3]) {
1112 			*p_tlv_buf = (u8 *)&p_drv_buf->rx_rscn_nport[3];
1113 			return sizeof(p_drv_buf->rx_rscn_nport[3]);
1114 		}
1115 		break;
1116 	case DRV_TLV_LUN_RESETS_ISSUED:
1117 		if (p_drv_buf->tx_lun_rst_set) {
1118 			*p_tlv_buf = (u8 *)&p_drv_buf->tx_lun_rst;
1119 			return sizeof(p_drv_buf->tx_lun_rst);
1120 		}
1121 		break;
1122 	case DRV_TLV_ABORT_TASK_SETS_ISSUED:
1123 		if (p_drv_buf->abort_task_sets_set) {
1124 			*p_tlv_buf = (u8 *)&p_drv_buf->abort_task_sets;
1125 			return sizeof(p_drv_buf->abort_task_sets);
1126 		}
1127 		break;
1128 	case DRV_TLV_TPRLOS_SENT:
1129 		if (p_drv_buf->tx_tprlos_set) {
1130 			*p_tlv_buf = (u8 *)&p_drv_buf->tx_tprlos;
1131 			return sizeof(p_drv_buf->tx_tprlos);
1132 		}
1133 		break;
1134 	case DRV_TLV_NOS_SENT_COUNT:
1135 		if (p_drv_buf->tx_nos_set) {
1136 			*p_tlv_buf = (u8 *)&p_drv_buf->tx_nos;
1137 			return sizeof(p_drv_buf->tx_nos);
1138 		}
1139 		break;
1140 	case DRV_TLV_NOS_RECEIVED_COUNT:
1141 		if (p_drv_buf->rx_nos_set) {
1142 			*p_tlv_buf = (u8 *)&p_drv_buf->rx_nos;
1143 			return sizeof(p_drv_buf->rx_nos);
1144 		}
1145 		break;
1146 	case DRV_TLV_OLS_COUNT:
1147 		if (p_drv_buf->ols_set) {
1148 			*p_tlv_buf = (u8 *)&p_drv_buf->ols;
1149 			return sizeof(p_drv_buf->ols);
1150 		}
1151 		break;
1152 	case DRV_TLV_LR_COUNT:
1153 		if (p_drv_buf->lr_set) {
1154 			*p_tlv_buf = (u8 *)&p_drv_buf->lr;
1155 			return sizeof(p_drv_buf->lr);
1156 		}
1157 		break;
1158 	case DRV_TLV_LRR_COUNT:
1159 		if (p_drv_buf->lrr_set) {
1160 			*p_tlv_buf = (u8 *)&p_drv_buf->lrr;
1161 			return sizeof(p_drv_buf->lrr);
1162 		}
1163 		break;
1164 	case DRV_TLV_LIP_SENT_COUNT:
1165 		if (p_drv_buf->tx_lip_set) {
1166 			*p_tlv_buf = (u8 *)&p_drv_buf->tx_lip;
1167 			return sizeof(p_drv_buf->tx_lip);
1168 		}
1169 		break;
1170 	case DRV_TLV_LIP_RECEIVED_COUNT:
1171 		if (p_drv_buf->rx_lip_set) {
1172 			*p_tlv_buf = (u8 *)&p_drv_buf->rx_lip;
1173 			return sizeof(p_drv_buf->rx_lip);
1174 		}
1175 		break;
1176 	case DRV_TLV_EOFA_COUNT:
1177 		if (p_drv_buf->eofa_set) {
1178 			*p_tlv_buf = (u8 *)&p_drv_buf->eofa;
1179 			return sizeof(p_drv_buf->eofa);
1180 		}
1181 		break;
1182 	case DRV_TLV_EOFNI_COUNT:
1183 		if (p_drv_buf->eofni_set) {
1184 			*p_tlv_buf = (u8 *)&p_drv_buf->eofni;
1185 			return sizeof(p_drv_buf->eofni);
1186 		}
1187 		break;
1188 	case DRV_TLV_SCSI_STATUS_CHECK_CONDITION_COUNT:
1189 		if (p_drv_buf->scsi_chks_set) {
1190 			*p_tlv_buf = (u8 *)&p_drv_buf->scsi_chks;
1191 			return sizeof(p_drv_buf->scsi_chks);
1192 		}
1193 		break;
1194 	case DRV_TLV_SCSI_STATUS_CONDITION_MET_COUNT:
1195 		if (p_drv_buf->scsi_cond_met_set) {
1196 			*p_tlv_buf = (u8 *)&p_drv_buf->scsi_cond_met;
1197 			return sizeof(p_drv_buf->scsi_cond_met);
1198 		}
1199 		break;
1200 	case DRV_TLV_SCSI_STATUS_BUSY_COUNT:
1201 		if (p_drv_buf->scsi_busy_set) {
1202 			*p_tlv_buf = (u8 *)&p_drv_buf->scsi_busy;
1203 			return sizeof(p_drv_buf->scsi_busy);
1204 		}
1205 		break;
1206 	case DRV_TLV_SCSI_STATUS_INTERMEDIATE_COUNT:
1207 		if (p_drv_buf->scsi_inter_set) {
1208 			*p_tlv_buf = (u8 *)&p_drv_buf->scsi_inter;
1209 			return sizeof(p_drv_buf->scsi_inter);
1210 		}
1211 		break;
1212 	case DRV_TLV_SCSI_STATUS_INTERMEDIATE_CONDITION_MET_COUNT:
1213 		if (p_drv_buf->scsi_inter_cond_met_set) {
1214 			*p_tlv_buf = (u8 *)&p_drv_buf->scsi_inter_cond_met;
1215 			return sizeof(p_drv_buf->scsi_inter_cond_met);
1216 		}
1217 		break;
1218 	case DRV_TLV_SCSI_STATUS_RESERVATION_CONFLICT_COUNT:
1219 		if (p_drv_buf->scsi_rsv_conflicts_set) {
1220 			*p_tlv_buf = (u8 *)&p_drv_buf->scsi_rsv_conflicts;
1221 			return sizeof(p_drv_buf->scsi_rsv_conflicts);
1222 		}
1223 		break;
1224 	case DRV_TLV_SCSI_STATUS_TASK_SET_FULL_COUNT:
1225 		if (p_drv_buf->scsi_tsk_full_set) {
1226 			*p_tlv_buf = (u8 *)&p_drv_buf->scsi_tsk_full;
1227 			return sizeof(p_drv_buf->scsi_tsk_full);
1228 		}
1229 		break;
1230 	case DRV_TLV_SCSI_STATUS_ACA_ACTIVE_COUNT:
1231 		if (p_drv_buf->scsi_aca_active_set) {
1232 			*p_tlv_buf = (u8 *)&p_drv_buf->scsi_aca_active;
1233 			return sizeof(p_drv_buf->scsi_aca_active);
1234 		}
1235 		break;
1236 	case DRV_TLV_SCSI_STATUS_TASK_ABORTED_COUNT:
1237 		if (p_drv_buf->scsi_tsk_abort_set) {
1238 			*p_tlv_buf = (u8 *)&p_drv_buf->scsi_tsk_abort;
1239 			return sizeof(p_drv_buf->scsi_tsk_abort);
1240 		}
1241 		break;
1242 	case DRV_TLV_SCSI_CHECK_CONDITION_1_RECEIVED_SK_ASC_ASCQ:
1243 		if (p_drv_buf->scsi_rx_chk_set[0]) {
1244 			*p_tlv_buf = (u8 *)&p_drv_buf->scsi_rx_chk[0];
1245 			return sizeof(p_drv_buf->scsi_rx_chk[0]);
1246 		}
1247 		break;
1248 	case DRV_TLV_SCSI_CHECK_CONDITION_2_RECEIVED_SK_ASC_ASCQ:
1249 		if (p_drv_buf->scsi_rx_chk_set[1]) {
1250 			*p_tlv_buf = (u8 *)&p_drv_buf->scsi_rx_chk[1];
1251 			return sizeof(p_drv_buf->scsi_rx_chk[1]);
1252 		}
1253 		break;
1254 	case DRV_TLV_SCSI_CHECK_CONDITION_3_RECEIVED_SK_ASC_ASCQ:
1255 		if (p_drv_buf->scsi_rx_chk_set[2]) {
1256 			*p_tlv_buf = (u8 *)&p_drv_buf->scsi_rx_chk[2];
1257 			return sizeof(p_drv_buf->scsi_rx_chk[2]);
1258 		}
1259 		break;
1260 	case DRV_TLV_SCSI_CHECK_CONDITION_4_RECEIVED_SK_ASC_ASCQ:
1261 		if (p_drv_buf->scsi_rx_chk_set[3]) {
1262 			*p_tlv_buf = (u8 *)&p_drv_buf->scsi_rx_chk[3];
1263 			return sizeof(p_drv_buf->scsi_rx_chk[4]);
1264 		}
1265 		break;
1266 	case DRV_TLV_SCSI_CHECK_CONDITION_5_RECEIVED_SK_ASC_ASCQ:
1267 		if (p_drv_buf->scsi_rx_chk_set[4]) {
1268 			*p_tlv_buf = (u8 *)&p_drv_buf->scsi_rx_chk[4];
1269 			return sizeof(p_drv_buf->scsi_rx_chk[4]);
1270 		}
1271 		break;
1272 	case DRV_TLV_SCSI_CHECK_1_TIMESTAMP:
1273 		if (p_drv_buf->scsi_chk_tstamp_set[0]) {
1274 			*p_tlv_buf = (u8 *)&p_drv_buf->scsi_chk_tstamp[0];
1275 			return sizeof(p_drv_buf->scsi_chk_tstamp[0]);
1276 		}
1277 		break;
1278 	case DRV_TLV_SCSI_CHECK_2_TIMESTAMP:
1279 		if (p_drv_buf->scsi_chk_tstamp_set[1]) {
1280 			*p_tlv_buf = (u8 *)&p_drv_buf->scsi_chk_tstamp[1];
1281 			return sizeof(p_drv_buf->scsi_chk_tstamp[1]);
1282 		}
1283 		break;
1284 	case DRV_TLV_SCSI_CHECK_3_TIMESTAMP:
1285 		if (p_drv_buf->scsi_chk_tstamp_set[2]) {
1286 			*p_tlv_buf = (u8 *)&p_drv_buf->scsi_chk_tstamp[2];
1287 			return sizeof(p_drv_buf->scsi_chk_tstamp[2]);
1288 		}
1289 		break;
1290 	case DRV_TLV_SCSI_CHECK_4_TIMESTAMP:
1291 		if (p_drv_buf->scsi_chk_tstamp_set[3]) {
1292 			*p_tlv_buf = (u8 *)&p_drv_buf->scsi_chk_tstamp[3];
1293 			return sizeof(p_drv_buf->scsi_chk_tstamp[3]);
1294 		}
1295 		break;
1296 	case DRV_TLV_SCSI_CHECK_5_TIMESTAMP:
1297 		if (p_drv_buf->scsi_chk_tstamp_set[4]) {
1298 			*p_tlv_buf = (u8 *)&p_drv_buf->scsi_chk_tstamp[4];
1299 			return sizeof(p_drv_buf->scsi_chk_tstamp[4]);
1300 		}
1301 		break;
1302 	default:
1303 		break;
1304 	}
1305 
1306 	return -1;
1307 }
1308 
1309 static int
ecore_mfw_get_iscsi_tlv_value(struct ecore_drv_tlv_hdr * p_tlv,struct ecore_mfw_tlv_iscsi * p_drv_buf,u8 ** p_tlv_buf)1310 ecore_mfw_get_iscsi_tlv_value(struct ecore_drv_tlv_hdr *p_tlv,
1311 			      struct ecore_mfw_tlv_iscsi *p_drv_buf,
1312 			      u8 **p_tlv_buf)
1313 {
1314 	switch (p_tlv->tlv_type) {
1315 	case DRV_TLV_TARGET_LLMNR_ENABLED:
1316 		if (p_drv_buf->target_llmnr_set) {
1317 			*p_tlv_buf = (u8 *)&p_drv_buf->target_llmnr;
1318 			return sizeof(p_drv_buf->target_llmnr);
1319 		}
1320 		break;
1321 	case DRV_TLV_HEADER_DIGEST_FLAG_ENABLED:
1322 		if (p_drv_buf->header_digest_set) {
1323 			*p_tlv_buf = (u8 *)&p_drv_buf->header_digest;
1324 			return sizeof(p_drv_buf->header_digest);
1325 		}
1326 		break;
1327 	case DRV_TLV_DATA_DIGEST_FLAG_ENABLED:
1328 		if (p_drv_buf->data_digest_set) {
1329 			*p_tlv_buf = (u8 *)&p_drv_buf->data_digest;
1330 			return sizeof(p_drv_buf->data_digest);
1331 		}
1332 		break;
1333 	case DRV_TLV_AUTHENTICATION_METHOD:
1334 		if (p_drv_buf->auth_method_set) {
1335 			*p_tlv_buf = (u8 *)&p_drv_buf->auth_method;
1336 			return sizeof(p_drv_buf->auth_method);
1337 		}
1338 		break;
1339 	case DRV_TLV_ISCSI_BOOT_TARGET_PORTAL:
1340 		if (p_drv_buf->boot_taget_portal_set) {
1341 			*p_tlv_buf = (u8 *)&p_drv_buf->boot_taget_portal;
1342 			return sizeof(p_drv_buf->boot_taget_portal);
1343 		}
1344 		break;
1345 	case DRV_TLV_MAX_FRAME_SIZE:
1346 		if (p_drv_buf->frame_size_set) {
1347 			*p_tlv_buf = (u8 *)&p_drv_buf->frame_size;
1348 			return sizeof(p_drv_buf->frame_size);
1349 		}
1350 		break;
1351 	case DRV_TLV_PDU_TX_DESCRIPTORS_QUEUE_SIZE:
1352 		if (p_drv_buf->tx_desc_size_set) {
1353 			*p_tlv_buf = (u8 *)&p_drv_buf->tx_desc_size;
1354 			return sizeof(p_drv_buf->tx_desc_size);
1355 		}
1356 		break;
1357 	case DRV_TLV_PDU_RX_DESCRIPTORS_QUEUE_SIZE:
1358 		if (p_drv_buf->rx_desc_size_set) {
1359 			*p_tlv_buf = (u8 *)&p_drv_buf->rx_desc_size;
1360 			return sizeof(p_drv_buf->rx_desc_size);
1361 		}
1362 		break;
1363 	case DRV_TLV_ISCSI_BOOT_PROGRESS:
1364 		if (p_drv_buf->boot_progress_set) {
1365 			*p_tlv_buf = (u8 *)&p_drv_buf->boot_progress;
1366 			return sizeof(p_drv_buf->boot_progress);
1367 		}
1368 		break;
1369 	case DRV_TLV_PDU_TX_DESCRIPTOR_QUEUE_AVG_DEPTH:
1370 		if (p_drv_buf->tx_desc_qdepth_set) {
1371 			*p_tlv_buf = (u8 *)&p_drv_buf->tx_desc_qdepth;
1372 			return sizeof(p_drv_buf->tx_desc_qdepth);
1373 		}
1374 		break;
1375 	case DRV_TLV_PDU_RX_DESCRIPTORS_QUEUE_AVG_DEPTH:
1376 		if (p_drv_buf->rx_desc_qdepth_set) {
1377 			*p_tlv_buf = (u8 *)&p_drv_buf->rx_desc_qdepth;
1378 			return sizeof(p_drv_buf->rx_desc_qdepth);
1379 		}
1380 		break;
1381 	case DRV_TLV_ISCSI_PDU_RX_FRAMES_RECEIVED:
1382 		if (p_drv_buf->rx_frames_set) {
1383 			*p_tlv_buf = (u8 *)&p_drv_buf->rx_frames;
1384 			return sizeof(p_drv_buf->rx_frames);
1385 		}
1386 		break;
1387 	case DRV_TLV_ISCSI_PDU_RX_BYTES_RECEIVED:
1388 		if (p_drv_buf->rx_bytes_set) {
1389 			*p_tlv_buf = (u8 *)&p_drv_buf->rx_bytes;
1390 			return sizeof(p_drv_buf->rx_bytes);
1391 		}
1392 		break;
1393 	case DRV_TLV_ISCSI_PDU_TX_FRAMES_SENT:
1394 		if (p_drv_buf->tx_frames_set) {
1395 			*p_tlv_buf = (u8 *)&p_drv_buf->tx_frames;
1396 			return sizeof(p_drv_buf->tx_frames);
1397 		}
1398 		break;
1399 	case DRV_TLV_ISCSI_PDU_TX_BYTES_SENT:
1400 		if (p_drv_buf->tx_bytes_set) {
1401 			*p_tlv_buf = (u8 *)&p_drv_buf->tx_bytes;
1402 			return sizeof(p_drv_buf->tx_bytes);
1403 		}
1404 		break;
1405 	default:
1406 		break;
1407 	}
1408 
1409 	return -1;
1410 }
1411 
ecore_mfw_update_tlvs(struct ecore_hwfn * p_hwfn,u8 tlv_group,u8 * p_mfw_buf,u32 size)1412 static enum _ecore_status_t ecore_mfw_update_tlvs(struct ecore_hwfn *p_hwfn,
1413 						  u8 tlv_group, u8 *p_mfw_buf,
1414 						  u32 size)
1415 {
1416 	union ecore_mfw_tlv_data *p_tlv_data;
1417 	struct ecore_drv_tlv_hdr tlv;
1418 	u8 *p_tlv_ptr = OSAL_NULL, *p_temp;
1419 	u32 offset;
1420 	int len;
1421 
1422 	p_tlv_data = OSAL_VZALLOC(p_hwfn->p_dev, sizeof(*p_tlv_data));
1423 	if (!p_tlv_data)
1424 		return ECORE_NOMEM;
1425 
1426 	if (OSAL_MFW_FILL_TLV_DATA(p_hwfn, tlv_group, p_tlv_data)) {
1427 		OSAL_VFREE(p_hwfn->p_dev, p_tlv_data);
1428 		return ECORE_INVAL;
1429 	}
1430 
1431 	offset = 0;
1432 	OSAL_MEMSET(&tlv, 0, sizeof(tlv));
1433 	while (offset < size) {
1434 		p_temp = &p_mfw_buf[offset];
1435 		tlv.tlv_type = TLV_TYPE(p_temp);
1436 		tlv.tlv_length = TLV_LENGTH(p_temp);
1437 		tlv.tlv_flags = TLV_FLAGS(p_temp);
1438 		DP_INFO(p_hwfn, "Type %d length = %d flags = 0x%x\n",
1439 			tlv.tlv_type, tlv.tlv_length, tlv.tlv_flags);
1440 
1441 		offset += sizeof(tlv);
1442 		if (tlv_group == ECORE_MFW_TLV_GENERIC)
1443 			len = ecore_mfw_get_gen_tlv_value(&tlv,
1444 					&p_tlv_data->generic, &p_tlv_ptr);
1445 		else if (tlv_group == ECORE_MFW_TLV_ETH)
1446 			len = ecore_mfw_get_eth_tlv_value(&tlv,
1447 					&p_tlv_data->eth, &p_tlv_ptr);
1448 		else if (tlv_group == ECORE_MFW_TLV_FCOE)
1449 			len = ecore_mfw_get_fcoe_tlv_value(&tlv,
1450 					&p_tlv_data->fcoe, &p_tlv_ptr);
1451 		else
1452 			len = ecore_mfw_get_iscsi_tlv_value(&tlv,
1453 					&p_tlv_data->iscsi, &p_tlv_ptr);
1454 
1455 		if (len > 0) {
1456 			OSAL_WARN(len > 4 * tlv.tlv_length,
1457 				  "Incorrect MFW TLV length");
1458 			len = OSAL_MIN_T(int, len, 4 * tlv.tlv_length);
1459 			tlv.tlv_flags |= ECORE_DRV_TLV_FLAGS_CHANGED;
1460 			/* TODO: Endianness handling? */
1461 			OSAL_MEMCPY(p_mfw_buf, &tlv, sizeof(tlv));
1462 			OSAL_MEMCPY(p_mfw_buf + offset, p_tlv_ptr, len);
1463 		}
1464 
1465 		offset += sizeof(u32) * tlv.tlv_length;
1466 	}
1467 
1468 	OSAL_VFREE(p_hwfn->p_dev, p_tlv_data);
1469 
1470 	return ECORE_SUCCESS;
1471 }
1472 
1473 enum _ecore_status_t
ecore_mfw_process_tlv_req(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt)1474 ecore_mfw_process_tlv_req(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt)
1475 {
1476 	u32 addr, size, offset, resp, param, val;
1477 	u8 tlv_group = 0, id, *p_mfw_buf = OSAL_NULL, *p_temp;
1478 	u32 global_offsize, global_addr;
1479 	enum _ecore_status_t rc;
1480 	struct ecore_drv_tlv_hdr tlv;
1481 
1482 	addr = SECTION_OFFSIZE_ADDR(p_hwfn->mcp_info->public_base,
1483 				    PUBLIC_GLOBAL);
1484 	global_offsize = ecore_rd(p_hwfn, p_ptt, addr);
1485 	global_addr = SECTION_ADDR(global_offsize, 0);
1486 	addr = global_addr + OFFSETOF(struct public_global, data_ptr);
1487 	size = ecore_rd(p_hwfn, p_ptt, global_addr +
1488 			OFFSETOF(struct public_global, data_size));
1489 
1490 	if (!size) {
1491 		DP_NOTICE(p_hwfn, false, "Invalid TLV req size = %d\n", size);
1492 		goto drv_done;
1493 	}
1494 
1495 	p_mfw_buf = (void *)OSAL_VZALLOC(p_hwfn->p_dev, size);
1496 	if (!p_mfw_buf) {
1497 		DP_NOTICE(p_hwfn, false,
1498 			  "Failed allocate memory for p_mfw_buf\n");
1499 		goto drv_done;
1500 	}
1501 
1502 	/* Read the TLV request to local buffer */
1503 	for (offset = 0; offset < size; offset += sizeof(u32)) {
1504 		val = ecore_rd(p_hwfn, p_ptt, addr + offset);
1505 		OSAL_MEMCPY(&p_mfw_buf[offset], &val, sizeof(u32));
1506 	}
1507 
1508 	/* Parse the headers to enumerate the requested TLV groups */
1509 	for (offset = 0; offset < size;
1510 	     offset += sizeof(tlv) + sizeof(u32) * tlv.tlv_length) {
1511 		p_temp = &p_mfw_buf[offset];
1512 		tlv.tlv_type = TLV_TYPE(p_temp);
1513 		tlv.tlv_length = TLV_LENGTH(p_temp);
1514 		if (ecore_mfw_get_tlv_group(tlv.tlv_type, &tlv_group))
1515 			goto drv_done;
1516 	}
1517 
1518 	/* Update the TLV values in the local buffer */
1519 	for (id = ECORE_MFW_TLV_GENERIC; id < ECORE_MFW_TLV_MAX; id <<= 1) {
1520 		if (tlv_group & id) {
1521 			if (ecore_mfw_update_tlvs(p_hwfn, id, p_mfw_buf, size))
1522 				goto drv_done;
1523 		}
1524 	}
1525 
1526 	/* Write the TLV data to shared memory */
1527 	for (offset = 0; offset < size; offset += sizeof(u32)) {
1528 		val = (u32)p_mfw_buf[offset];
1529 		ecore_wr(p_hwfn, p_ptt, addr + offset, val);
1530 		offset += sizeof(u32);
1531 	}
1532 
1533 drv_done:
1534 	rc = ecore_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_GET_TLV_DONE, 0, &resp,
1535 			   &param);
1536 
1537 	OSAL_VFREE(p_hwfn->p_dev, p_mfw_buf);
1538 
1539 	return rc;
1540 }
1541