1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright (c) 2016 - 2018 Cavium Inc.
9 #include "ecore_status.h"
10 #include "ecore_mcp.h"
14 #define TLV_TYPE(p) (p[0])
15 #define TLV_LENGTH(p) (p[1])
16 #define TLV_FLAGS(p) (p[3])
18 static enum _ecore_status_t
19 ecore_mfw_get_tlv_group(u8 tlv_type, u8 *tlv_group)
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;
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;
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;
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;
223 return ECORE_SUCCESS;
227 ecore_mfw_get_gen_tlv_value(struct ecore_drv_tlv_hdr *p_tlv,
228 struct ecore_mfw_tlv_generic *p_drv_buf,
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
300 ecore_mfw_get_eth_tlv_value(struct ecore_drv_tlv_hdr *p_tlv,
301 struct ecore_mfw_tlv_eth *p_drv_buf,
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
403 ecore_mfw_get_fcoe_tlv_value(struct ecore_drv_tlv_hdr *p_tlv,
404 struct ecore_mfw_tlv_fcoe *p_drv_buf,
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
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);
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);
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);
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);
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);
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]);
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]);
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]);
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]);
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);
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]);
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]);
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]);
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]);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
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);
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);
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);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
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);
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);
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);
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);
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);
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);
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);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
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);
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]);
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]);
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]);
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]);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
1310 ecore_mfw_get_iscsi_tlv_value(struct ecore_drv_tlv_hdr *p_tlv,
1311 struct ecore_mfw_tlv_iscsi *p_drv_buf,
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
1412 static enum _ecore_status_t ecore_mfw_update_tlvs(struct ecore_hwfn *p_hwfn,
1413 u8 tlv_group, u8 *p_mfw_buf,
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;
1422 p_tlv_data = OSAL_VZALLOC(p_hwfn->p_dev, sizeof(*p_tlv_data));
1426 if (OSAL_MFW_FILL_TLV_DATA(p_hwfn, tlv_group, p_tlv_data)) {
1427 OSAL_VFREE(p_hwfn->p_dev, p_tlv_data);
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);
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);
1452 len = ecore_mfw_get_iscsi_tlv_value(&tlv,
1453 &p_tlv_data->iscsi, &p_tlv_ptr);
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);
1465 offset += sizeof(u32) * tlv.tlv_length;
1468 OSAL_VFREE(p_hwfn->p_dev, p_tlv_data);
1470 return ECORE_SUCCESS;
1473 enum _ecore_status_t
1474 ecore_mfw_process_tlv_req(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt)
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;
1482 addr = SECTION_OFFSIZE_ADDR(p_hwfn->mcp_info->public_base,
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));
1491 DP_NOTICE(p_hwfn, false, "Invalid TLV req size = %d\n", size);
1495 p_mfw_buf = (void *)OSAL_VZALLOC(p_hwfn->p_dev, size);
1497 DP_NOTICE(p_hwfn, false,
1498 "Failed allocate memory for p_mfw_buf\n");
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));
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))
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))
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);
1534 rc = ecore_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_GET_TLV_DONE, 0, &resp,
1537 OSAL_VFREE(p_hwfn->p_dev, p_mfw_buf);