2 * Copyright (c) 2016 - 2018 QLogic Corporation.
6 * See LICENSE.qede_pmd for copyright and licensing details.
11 #include "ecore_status.h"
12 #include "ecore_mcp.h"
16 #define TLV_TYPE(p) (p[0])
17 #define TLV_LENGTH(p) (p[1])
18 #define TLV_FLAGS(p) (p[3])
20 static enum _ecore_status_t
21 ecore_mfw_get_tlv_group(u8 tlv_type, u8 *tlv_group)
24 case DRV_TLV_FEATURE_FLAGS:
25 case DRV_TLV_LOCAL_ADMIN_ADDR:
26 case DRV_TLV_ADDITIONAL_MAC_ADDR_1:
27 case DRV_TLV_ADDITIONAL_MAC_ADDR_2:
28 case DRV_TLV_OS_DRIVER_STATES:
29 case DRV_TLV_PXE_BOOT_PROGRESS:
30 case DRV_TLV_RX_FRAMES_RECEIVED:
31 case DRV_TLV_RX_BYTES_RECEIVED:
32 case DRV_TLV_TX_FRAMES_SENT:
33 case DRV_TLV_TX_BYTES_SENT:
34 *tlv_group |= ECORE_MFW_TLV_GENERIC;
36 case DRV_TLV_LSO_MAX_OFFLOAD_SIZE:
37 case DRV_TLV_LSO_MIN_SEGMENT_COUNT:
38 case DRV_TLV_PROMISCUOUS_MODE:
39 case DRV_TLV_TX_DESCRIPTORS_QUEUE_SIZE:
40 case DRV_TLV_RX_DESCRIPTORS_QUEUE_SIZE:
41 case DRV_TLV_NUM_OF_NET_QUEUE_VMQ_CFG:
42 case DRV_TLV_NUM_OFFLOADED_CONNECTIONS_TCP_IPV4:
43 case DRV_TLV_NUM_OFFLOADED_CONNECTIONS_TCP_IPV6:
44 case DRV_TLV_TX_DESCRIPTOR_QUEUE_AVG_DEPTH:
45 case DRV_TLV_RX_DESCRIPTORS_QUEUE_AVG_DEPTH:
46 case DRV_TLV_IOV_OFFLOAD:
47 case DRV_TLV_TX_QUEUES_EMPTY:
48 case DRV_TLV_RX_QUEUES_EMPTY:
49 case DRV_TLV_TX_QUEUES_FULL:
50 case DRV_TLV_RX_QUEUES_FULL:
51 *tlv_group |= ECORE_MFW_TLV_ETH;
58 case DRV_TLV_BOOT_TYPE:
59 case DRV_TLV_NPIV_STATE:
60 case DRV_TLV_NUM_OF_NPIV_IDS:
61 case DRV_TLV_SWITCH_NAME:
62 case DRV_TLV_SWITCH_PORT_NUM:
63 case DRV_TLV_SWITCH_PORT_ID:
64 case DRV_TLV_VENDOR_NAME:
65 case DRV_TLV_SWITCH_MODEL:
66 case DRV_TLV_SWITCH_FW_VER:
67 case DRV_TLV_QOS_PRIORITY_PER_802_1P:
68 case DRV_TLV_PORT_ALIAS:
69 case DRV_TLV_PORT_STATE:
70 case DRV_TLV_FIP_TX_DESCRIPTORS_QUEUE_SIZE:
71 case DRV_TLV_FCOE_RX_DESCRIPTORS_QUEUE_SIZE:
72 case DRV_TLV_LINK_FAILURE_COUNT:
73 case DRV_TLV_FCOE_BOOT_PROGRESS:
74 case DRV_TLV_RX_BROADCAST_PACKETS:
75 case DRV_TLV_TX_BROADCAST_PACKETS:
76 case DRV_TLV_FCOE_TX_DESCRIPTOR_QUEUE_AVG_DEPTH:
77 case DRV_TLV_FCOE_RX_DESCRIPTORS_QUEUE_AVG_DEPTH:
78 case DRV_TLV_FCOE_RX_FRAMES_RECEIVED:
79 case DRV_TLV_FCOE_RX_BYTES_RECEIVED:
80 case DRV_TLV_FCOE_TX_FRAMES_SENT:
81 case DRV_TLV_FCOE_TX_BYTES_SENT:
82 case DRV_TLV_CRC_ERROR_COUNT:
83 case DRV_TLV_CRC_ERROR_1_RECEIVED_SOURCE_FC_ID:
84 case DRV_TLV_CRC_ERROR_1_TIMESTAMP:
85 case DRV_TLV_CRC_ERROR_2_RECEIVED_SOURCE_FC_ID:
86 case DRV_TLV_CRC_ERROR_2_TIMESTAMP:
87 case DRV_TLV_CRC_ERROR_3_RECEIVED_SOURCE_FC_ID:
88 case DRV_TLV_CRC_ERROR_3_TIMESTAMP:
89 case DRV_TLV_CRC_ERROR_4_RECEIVED_SOURCE_FC_ID:
90 case DRV_TLV_CRC_ERROR_4_TIMESTAMP:
91 case DRV_TLV_CRC_ERROR_5_RECEIVED_SOURCE_FC_ID:
92 case DRV_TLV_CRC_ERROR_5_TIMESTAMP:
93 case DRV_TLV_LOSS_OF_SYNC_ERROR_COUNT:
94 case DRV_TLV_LOSS_OF_SIGNAL_ERRORS:
95 case DRV_TLV_PRIMITIVE_SEQUENCE_PROTOCOL_ERROR_COUNT:
96 case DRV_TLV_DISPARITY_ERROR_COUNT:
97 case DRV_TLV_CODE_VIOLATION_ERROR_COUNT:
98 case DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_1:
99 case DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_2:
100 case DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_3:
101 case DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_4:
102 case DRV_TLV_LAST_FLOGI_TIMESTAMP:
103 case DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_1:
104 case DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_2:
105 case DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_3:
106 case DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_4:
107 case DRV_TLV_LAST_FLOGI_ACC_TIMESTAMP:
108 case DRV_TLV_LAST_FLOGI_RJT:
109 case DRV_TLV_LAST_FLOGI_RJT_TIMESTAMP:
110 case DRV_TLV_FDISCS_SENT_COUNT:
111 case DRV_TLV_FDISC_ACCS_RECEIVED:
112 case DRV_TLV_FDISC_RJTS_RECEIVED:
113 case DRV_TLV_PLOGI_SENT_COUNT:
114 case DRV_TLV_PLOGI_ACCS_RECEIVED:
115 case DRV_TLV_PLOGI_RJTS_RECEIVED:
116 case DRV_TLV_PLOGI_1_SENT_DESTINATION_FC_ID:
117 case DRV_TLV_PLOGI_1_TIMESTAMP:
118 case DRV_TLV_PLOGI_2_SENT_DESTINATION_FC_ID:
119 case DRV_TLV_PLOGI_2_TIMESTAMP:
120 case DRV_TLV_PLOGI_3_SENT_DESTINATION_FC_ID:
121 case DRV_TLV_PLOGI_3_TIMESTAMP:
122 case DRV_TLV_PLOGI_4_SENT_DESTINATION_FC_ID:
123 case DRV_TLV_PLOGI_4_TIMESTAMP:
124 case DRV_TLV_PLOGI_5_SENT_DESTINATION_FC_ID:
125 case DRV_TLV_PLOGI_5_TIMESTAMP:
126 case DRV_TLV_PLOGI_1_ACC_RECEIVED_SOURCE_FC_ID:
127 case DRV_TLV_PLOGI_1_ACC_TIMESTAMP:
128 case DRV_TLV_PLOGI_2_ACC_RECEIVED_SOURCE_FC_ID:
129 case DRV_TLV_PLOGI_2_ACC_TIMESTAMP:
130 case DRV_TLV_PLOGI_3_ACC_RECEIVED_SOURCE_FC_ID:
131 case DRV_TLV_PLOGI_3_ACC_TIMESTAMP:
132 case DRV_TLV_PLOGI_4_ACC_RECEIVED_SOURCE_FC_ID:
133 case DRV_TLV_PLOGI_4_ACC_TIMESTAMP:
134 case DRV_TLV_PLOGI_5_ACC_RECEIVED_SOURCE_FC_ID:
135 case DRV_TLV_PLOGI_5_ACC_TIMESTAMP:
136 case DRV_TLV_LOGOS_ISSUED:
137 case DRV_TLV_LOGO_ACCS_RECEIVED:
138 case DRV_TLV_LOGO_RJTS_RECEIVED:
139 case DRV_TLV_LOGO_1_RECEIVED_SOURCE_FC_ID:
140 case DRV_TLV_LOGO_1_TIMESTAMP:
141 case DRV_TLV_LOGO_2_RECEIVED_SOURCE_FC_ID:
142 case DRV_TLV_LOGO_2_TIMESTAMP:
143 case DRV_TLV_LOGO_3_RECEIVED_SOURCE_FC_ID:
144 case DRV_TLV_LOGO_3_TIMESTAMP:
145 case DRV_TLV_LOGO_4_RECEIVED_SOURCE_FC_ID:
146 case DRV_TLV_LOGO_4_TIMESTAMP:
147 case DRV_TLV_LOGO_5_RECEIVED_SOURCE_FC_ID:
148 case DRV_TLV_LOGO_5_TIMESTAMP:
149 case DRV_TLV_LOGOS_RECEIVED:
150 case DRV_TLV_ACCS_ISSUED:
151 case DRV_TLV_PRLIS_ISSUED:
152 case DRV_TLV_ACCS_RECEIVED:
153 case DRV_TLV_ABTS_SENT_COUNT:
154 case DRV_TLV_ABTS_ACCS_RECEIVED:
155 case DRV_TLV_ABTS_RJTS_RECEIVED:
156 case DRV_TLV_ABTS_1_SENT_DESTINATION_FC_ID:
157 case DRV_TLV_ABTS_1_TIMESTAMP:
158 case DRV_TLV_ABTS_2_SENT_DESTINATION_FC_ID:
159 case DRV_TLV_ABTS_2_TIMESTAMP:
160 case DRV_TLV_ABTS_3_SENT_DESTINATION_FC_ID:
161 case DRV_TLV_ABTS_3_TIMESTAMP:
162 case DRV_TLV_ABTS_4_SENT_DESTINATION_FC_ID:
163 case DRV_TLV_ABTS_4_TIMESTAMP:
164 case DRV_TLV_ABTS_5_SENT_DESTINATION_FC_ID:
165 case DRV_TLV_ABTS_5_TIMESTAMP:
166 case DRV_TLV_RSCNS_RECEIVED:
167 case DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_1:
168 case DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_2:
169 case DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_3:
170 case DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_4:
171 case DRV_TLV_LUN_RESETS_ISSUED:
172 case DRV_TLV_ABORT_TASK_SETS_ISSUED:
173 case DRV_TLV_TPRLOS_SENT:
174 case DRV_TLV_NOS_SENT_COUNT:
175 case DRV_TLV_NOS_RECEIVED_COUNT:
176 case DRV_TLV_OLS_COUNT:
177 case DRV_TLV_LR_COUNT:
178 case DRV_TLV_LRR_COUNT:
179 case DRV_TLV_LIP_SENT_COUNT:
180 case DRV_TLV_LIP_RECEIVED_COUNT:
181 case DRV_TLV_EOFA_COUNT:
182 case DRV_TLV_EOFNI_COUNT:
183 case DRV_TLV_SCSI_STATUS_CHECK_CONDITION_COUNT:
184 case DRV_TLV_SCSI_STATUS_CONDITION_MET_COUNT:
185 case DRV_TLV_SCSI_STATUS_BUSY_COUNT:
186 case DRV_TLV_SCSI_STATUS_INTERMEDIATE_COUNT:
187 case DRV_TLV_SCSI_STATUS_INTERMEDIATE_CONDITION_MET_COUNT:
188 case DRV_TLV_SCSI_STATUS_RESERVATION_CONFLICT_COUNT:
189 case DRV_TLV_SCSI_STATUS_TASK_SET_FULL_COUNT:
190 case DRV_TLV_SCSI_STATUS_ACA_ACTIVE_COUNT:
191 case DRV_TLV_SCSI_STATUS_TASK_ABORTED_COUNT:
192 case DRV_TLV_SCSI_CHECK_CONDITION_1_RECEIVED_SK_ASC_ASCQ:
193 case DRV_TLV_SCSI_CHECK_1_TIMESTAMP:
194 case DRV_TLV_SCSI_CHECK_CONDITION_2_RECEIVED_SK_ASC_ASCQ:
195 case DRV_TLV_SCSI_CHECK_2_TIMESTAMP:
196 case DRV_TLV_SCSI_CHECK_CONDITION_3_RECEIVED_SK_ASC_ASCQ:
197 case DRV_TLV_SCSI_CHECK_3_TIMESTAMP:
198 case DRV_TLV_SCSI_CHECK_CONDITION_4_RECEIVED_SK_ASC_ASCQ:
199 case DRV_TLV_SCSI_CHECK_4_TIMESTAMP:
200 case DRV_TLV_SCSI_CHECK_CONDITION_5_RECEIVED_SK_ASC_ASCQ:
201 case DRV_TLV_SCSI_CHECK_5_TIMESTAMP:
202 *tlv_group = ECORE_MFW_TLV_FCOE;
204 case DRV_TLV_TARGET_LLMNR_ENABLED:
205 case DRV_TLV_HEADER_DIGEST_FLAG_ENABLED:
206 case DRV_TLV_DATA_DIGEST_FLAG_ENABLED:
207 case DRV_TLV_AUTHENTICATION_METHOD:
208 case DRV_TLV_ISCSI_BOOT_TARGET_PORTAL:
209 case DRV_TLV_MAX_FRAME_SIZE:
210 case DRV_TLV_PDU_TX_DESCRIPTORS_QUEUE_SIZE:
211 case DRV_TLV_PDU_RX_DESCRIPTORS_QUEUE_SIZE:
212 case DRV_TLV_ISCSI_BOOT_PROGRESS:
213 case DRV_TLV_PDU_TX_DESCRIPTOR_QUEUE_AVG_DEPTH:
214 case DRV_TLV_PDU_RX_DESCRIPTORS_QUEUE_AVG_DEPTH:
215 case DRV_TLV_ISCSI_PDU_RX_FRAMES_RECEIVED:
216 case DRV_TLV_ISCSI_PDU_RX_BYTES_RECEIVED:
217 case DRV_TLV_ISCSI_PDU_TX_FRAMES_SENT:
218 case DRV_TLV_ISCSI_PDU_TX_BYTES_SENT:
219 *tlv_group |= ECORE_MFW_TLV_ISCSI;
225 return ECORE_SUCCESS;
229 ecore_mfw_get_gen_tlv_value(struct ecore_drv_tlv_hdr *p_tlv,
230 struct ecore_mfw_tlv_generic *p_drv_buf,
233 switch (p_tlv->tlv_type) {
234 case DRV_TLV_FEATURE_FLAGS:
235 if (p_drv_buf->feat_flags_set) {
236 *p_tlv_buf = (u8 *)&p_drv_buf->feat_flags;
237 return sizeof(p_drv_buf->feat_flags);
240 case DRV_TLV_LOCAL_ADMIN_ADDR:
241 if (p_drv_buf->local_mac_set) {
242 *p_tlv_buf = (u8 *)&p_drv_buf->local_mac;
243 return sizeof(p_drv_buf->local_mac);
246 case DRV_TLV_ADDITIONAL_MAC_ADDR_1:
247 if (p_drv_buf->additional_mac1_set) {
248 *p_tlv_buf = (u8 *)&p_drv_buf->additional_mac1;
249 return sizeof(p_drv_buf->additional_mac1);
252 case DRV_TLV_ADDITIONAL_MAC_ADDR_2:
253 if (p_drv_buf->additional_mac2_set) {
254 *p_tlv_buf = (u8 *)&p_drv_buf->additional_mac2;
255 return sizeof(p_drv_buf->additional_mac2);
258 case DRV_TLV_OS_DRIVER_STATES:
259 if (p_drv_buf->drv_state_set) {
260 *p_tlv_buf = (u8 *)&p_drv_buf->drv_state;
261 return sizeof(p_drv_buf->drv_state);
264 case DRV_TLV_PXE_BOOT_PROGRESS:
265 if (p_drv_buf->pxe_progress_set) {
266 *p_tlv_buf = (u8 *)&p_drv_buf->pxe_progress;
267 return sizeof(p_drv_buf->pxe_progress);
270 case DRV_TLV_RX_FRAMES_RECEIVED:
271 if (p_drv_buf->rx_frames_set) {
272 *p_tlv_buf = (u8 *)&p_drv_buf->rx_frames;
273 return sizeof(p_drv_buf->rx_frames);
276 case DRV_TLV_RX_BYTES_RECEIVED:
277 if (p_drv_buf->rx_bytes_set) {
278 *p_tlv_buf = (u8 *)&p_drv_buf->rx_bytes;
279 return sizeof(p_drv_buf->rx_bytes);
282 case DRV_TLV_TX_FRAMES_SENT:
283 if (p_drv_buf->tx_frames_set) {
284 *p_tlv_buf = (u8 *)&p_drv_buf->tx_frames;
285 return sizeof(p_drv_buf->tx_frames);
288 case DRV_TLV_TX_BYTES_SENT:
289 if (p_drv_buf->tx_bytes_set) {
290 *p_tlv_buf = (u8 *)&p_drv_buf->tx_bytes;
291 return sizeof(p_drv_buf->tx_bytes);
302 ecore_mfw_get_eth_tlv_value(struct ecore_drv_tlv_hdr *p_tlv,
303 struct ecore_mfw_tlv_eth *p_drv_buf,
306 switch (p_tlv->tlv_type) {
307 case DRV_TLV_LSO_MAX_OFFLOAD_SIZE:
308 if (p_drv_buf->lso_maxoff_size_set) {
309 *p_tlv_buf = (u8 *)&p_drv_buf->lso_maxoff_size;
310 return sizeof(p_drv_buf->lso_maxoff_size);
313 case DRV_TLV_LSO_MIN_SEGMENT_COUNT:
314 if (p_drv_buf->lso_minseg_size_set) {
315 *p_tlv_buf = (u8 *)&p_drv_buf->lso_minseg_size;
316 return sizeof(p_drv_buf->lso_minseg_size);
319 case DRV_TLV_PROMISCUOUS_MODE:
320 if (p_drv_buf->prom_mode_set) {
321 *p_tlv_buf = (u8 *)&p_drv_buf->prom_mode;
322 return sizeof(p_drv_buf->prom_mode);
325 case DRV_TLV_TX_DESCRIPTORS_QUEUE_SIZE:
326 if (p_drv_buf->tx_descr_size_set) {
327 *p_tlv_buf = (u8 *)&p_drv_buf->tx_descr_size;
328 return sizeof(p_drv_buf->tx_descr_size);
331 case DRV_TLV_RX_DESCRIPTORS_QUEUE_SIZE:
332 if (p_drv_buf->rx_descr_size_set) {
333 *p_tlv_buf = (u8 *)&p_drv_buf->rx_descr_size;
334 return sizeof(p_drv_buf->rx_descr_size);
337 case DRV_TLV_NUM_OF_NET_QUEUE_VMQ_CFG:
338 if (p_drv_buf->netq_count_set) {
339 *p_tlv_buf = (u8 *)&p_drv_buf->netq_count;
340 return sizeof(p_drv_buf->netq_count);
343 case DRV_TLV_NUM_OFFLOADED_CONNECTIONS_TCP_IPV4:
344 if (p_drv_buf->tcp4_offloads_set) {
345 *p_tlv_buf = (u8 *)&p_drv_buf->tcp4_offloads;
346 return sizeof(p_drv_buf->tcp4_offloads);
349 case DRV_TLV_NUM_OFFLOADED_CONNECTIONS_TCP_IPV6:
350 if (p_drv_buf->tcp6_offloads_set) {
351 *p_tlv_buf = (u8 *)&p_drv_buf->tcp6_offloads;
352 return sizeof(p_drv_buf->tcp6_offloads);
355 case DRV_TLV_TX_DESCRIPTOR_QUEUE_AVG_DEPTH:
356 if (p_drv_buf->tx_descr_qdepth_set) {
357 *p_tlv_buf = (u8 *)&p_drv_buf->tx_descr_qdepth;
358 return sizeof(p_drv_buf->tx_descr_qdepth);
361 case DRV_TLV_RX_DESCRIPTORS_QUEUE_AVG_DEPTH:
362 if (p_drv_buf->rx_descr_qdepth_set) {
363 *p_tlv_buf = (u8 *)&p_drv_buf->rx_descr_qdepth;
364 return sizeof(p_drv_buf->rx_descr_qdepth);
367 case DRV_TLV_IOV_OFFLOAD:
368 if (p_drv_buf->iov_offload_set) {
369 *p_tlv_buf = (u8 *)&p_drv_buf->iov_offload;
370 return sizeof(p_drv_buf->iov_offload);
373 case DRV_TLV_TX_QUEUES_EMPTY:
374 if (p_drv_buf->txqs_empty_set) {
375 *p_tlv_buf = (u8 *)&p_drv_buf->txqs_empty;
376 return sizeof(p_drv_buf->txqs_empty);
379 case DRV_TLV_RX_QUEUES_EMPTY:
380 if (p_drv_buf->rxqs_empty_set) {
381 *p_tlv_buf = (u8 *)&p_drv_buf->rxqs_empty;
382 return sizeof(p_drv_buf->rxqs_empty);
385 case DRV_TLV_TX_QUEUES_FULL:
386 if (p_drv_buf->num_txqs_full_set) {
387 *p_tlv_buf = (u8 *)&p_drv_buf->num_txqs_full;
388 return sizeof(p_drv_buf->num_txqs_full);
391 case DRV_TLV_RX_QUEUES_FULL:
392 if (p_drv_buf->num_rxqs_full_set) {
393 *p_tlv_buf = (u8 *)&p_drv_buf->num_rxqs_full;
394 return sizeof(p_drv_buf->num_rxqs_full);
405 ecore_mfw_get_fcoe_tlv_value(struct ecore_drv_tlv_hdr *p_tlv,
406 struct ecore_mfw_tlv_fcoe *p_drv_buf,
409 switch (p_tlv->tlv_type) {
410 case DRV_TLV_SCSI_TO:
411 if (p_drv_buf->scsi_timeout_set) {
412 *p_tlv_buf = (u8 *)&p_drv_buf->scsi_timeout;
413 return sizeof(p_drv_buf->scsi_timeout);
416 case DRV_TLV_R_T_TOV:
417 if (p_drv_buf->rt_tov_set) {
418 *p_tlv_buf = (u8 *)&p_drv_buf->rt_tov;
419 return sizeof(p_drv_buf->rt_tov);
422 case DRV_TLV_R_A_TOV:
423 if (p_drv_buf->ra_tov_set) {
424 *p_tlv_buf = (u8 *)&p_drv_buf->ra_tov;
425 return sizeof(p_drv_buf->ra_tov);
428 case DRV_TLV_E_D_TOV:
429 if (p_drv_buf->ed_tov_set) {
430 *p_tlv_buf = (u8 *)&p_drv_buf->ed_tov;
431 return sizeof(p_drv_buf->ed_tov);
435 if (p_drv_buf->cr_tov_set) {
436 *p_tlv_buf = (u8 *)&p_drv_buf->cr_tov;
437 return sizeof(p_drv_buf->cr_tov);
440 case DRV_TLV_BOOT_TYPE:
441 if (p_drv_buf->boot_type_set) {
442 *p_tlv_buf = (u8 *)&p_drv_buf->boot_type;
443 return sizeof(p_drv_buf->boot_type);
446 case DRV_TLV_NPIV_STATE:
447 if (p_drv_buf->npiv_state_set) {
448 *p_tlv_buf = (u8 *)&p_drv_buf->npiv_state;
449 return sizeof(p_drv_buf->npiv_state);
452 case DRV_TLV_NUM_OF_NPIV_IDS:
453 if (p_drv_buf->num_npiv_ids_set) {
454 *p_tlv_buf = (u8 *)&p_drv_buf->num_npiv_ids;
455 return sizeof(p_drv_buf->num_npiv_ids);
458 case DRV_TLV_SWITCH_NAME:
459 if (p_drv_buf->switch_name_set) {
460 *p_tlv_buf = (u8 *)&p_drv_buf->switch_name;
461 return sizeof(p_drv_buf->switch_name);
464 case DRV_TLV_SWITCH_PORT_NUM:
465 if (p_drv_buf->switch_portnum_set) {
466 *p_tlv_buf = (u8 *)&p_drv_buf->switch_portnum;
467 return sizeof(p_drv_buf->switch_portnum);
470 case DRV_TLV_SWITCH_PORT_ID:
471 if (p_drv_buf->switch_portid_set) {
472 *p_tlv_buf = (u8 *)&p_drv_buf->switch_portid;
473 return sizeof(p_drv_buf->switch_portid);
476 case DRV_TLV_VENDOR_NAME:
477 if (p_drv_buf->vendor_name_set) {
478 *p_tlv_buf = (u8 *)&p_drv_buf->vendor_name;
479 return sizeof(p_drv_buf->vendor_name);
482 case DRV_TLV_SWITCH_MODEL:
483 if (p_drv_buf->switch_model_set) {
484 *p_tlv_buf = (u8 *)&p_drv_buf->switch_model;
485 return sizeof(p_drv_buf->switch_model);
488 case DRV_TLV_SWITCH_FW_VER:
489 if (p_drv_buf->switch_fw_version_set) {
490 *p_tlv_buf = (u8 *)&p_drv_buf->switch_fw_version;
491 return sizeof(p_drv_buf->switch_fw_version);
494 case DRV_TLV_QOS_PRIORITY_PER_802_1P:
495 if (p_drv_buf->qos_pri_set) {
496 *p_tlv_buf = (u8 *)&p_drv_buf->qos_pri;
497 return sizeof(p_drv_buf->qos_pri);
500 case DRV_TLV_PORT_ALIAS:
501 if (p_drv_buf->port_alias_set) {
502 *p_tlv_buf = (u8 *)&p_drv_buf->port_alias;
503 return sizeof(p_drv_buf->port_alias);
506 case DRV_TLV_PORT_STATE:
507 if (p_drv_buf->port_state_set) {
508 *p_tlv_buf = (u8 *)&p_drv_buf->port_state;
509 return sizeof(p_drv_buf->port_state);
512 case DRV_TLV_FIP_TX_DESCRIPTORS_QUEUE_SIZE:
513 if (p_drv_buf->fip_tx_descr_size_set) {
514 *p_tlv_buf = (u8 *)&p_drv_buf->fip_tx_descr_size;
515 return sizeof(p_drv_buf->fip_tx_descr_size);
518 case DRV_TLV_FCOE_RX_DESCRIPTORS_QUEUE_SIZE:
519 if (p_drv_buf->fip_rx_descr_size_set) {
520 *p_tlv_buf = (u8 *)&p_drv_buf->fip_rx_descr_size;
521 return sizeof(p_drv_buf->fip_rx_descr_size);
524 case DRV_TLV_LINK_FAILURE_COUNT:
525 if (p_drv_buf->link_failures_set) {
526 *p_tlv_buf = (u8 *)&p_drv_buf->link_failures;
527 return sizeof(p_drv_buf->link_failures);
530 case DRV_TLV_FCOE_BOOT_PROGRESS:
531 if (p_drv_buf->fcoe_boot_progress_set) {
532 *p_tlv_buf = (u8 *)&p_drv_buf->fcoe_boot_progress;
533 return sizeof(p_drv_buf->fcoe_boot_progress);
536 case DRV_TLV_RX_BROADCAST_PACKETS:
537 if (p_drv_buf->rx_bcast_set) {
538 *p_tlv_buf = (u8 *)&p_drv_buf->rx_bcast;
539 return sizeof(p_drv_buf->rx_bcast);
542 case DRV_TLV_TX_BROADCAST_PACKETS:
543 if (p_drv_buf->tx_bcast_set) {
544 *p_tlv_buf = (u8 *)&p_drv_buf->tx_bcast;
545 return sizeof(p_drv_buf->tx_bcast);
548 case DRV_TLV_FCOE_TX_DESCRIPTOR_QUEUE_AVG_DEPTH:
549 if (p_drv_buf->fcoe_txq_depth_set) {
550 *p_tlv_buf = (u8 *)&p_drv_buf->fcoe_txq_depth;
551 return sizeof(p_drv_buf->fcoe_txq_depth);
554 case DRV_TLV_FCOE_RX_DESCRIPTORS_QUEUE_AVG_DEPTH:
555 if (p_drv_buf->fcoe_rxq_depth_set) {
556 *p_tlv_buf = (u8 *)&p_drv_buf->fcoe_rxq_depth;
557 return sizeof(p_drv_buf->fcoe_rxq_depth);
560 case DRV_TLV_FCOE_RX_FRAMES_RECEIVED:
561 if (p_drv_buf->fcoe_rx_frames_set) {
562 *p_tlv_buf = (u8 *)&p_drv_buf->fcoe_rx_frames;
563 return sizeof(p_drv_buf->fcoe_rx_frames);
566 case DRV_TLV_FCOE_RX_BYTES_RECEIVED:
567 if (p_drv_buf->fcoe_rx_bytes_set) {
568 *p_tlv_buf = (u8 *)&p_drv_buf->fcoe_rx_bytes;
569 return sizeof(p_drv_buf->fcoe_rx_bytes);
572 case DRV_TLV_FCOE_TX_FRAMES_SENT:
573 if (p_drv_buf->fcoe_tx_frames_set) {
574 *p_tlv_buf = (u8 *)&p_drv_buf->fcoe_tx_frames;
575 return sizeof(p_drv_buf->fcoe_tx_frames);
578 case DRV_TLV_FCOE_TX_BYTES_SENT:
579 if (p_drv_buf->fcoe_tx_bytes_set) {
580 *p_tlv_buf = (u8 *)&p_drv_buf->fcoe_tx_bytes;
581 return sizeof(p_drv_buf->fcoe_tx_bytes);
584 case DRV_TLV_CRC_ERROR_COUNT:
585 if (p_drv_buf->crc_count_set) {
586 *p_tlv_buf = (u8 *)&p_drv_buf->crc_count;
587 return sizeof(p_drv_buf->crc_count);
590 case DRV_TLV_CRC_ERROR_1_RECEIVED_SOURCE_FC_ID:
591 if (p_drv_buf->crc_err_src_fcid_set[0]) {
592 *p_tlv_buf = (u8 *)&p_drv_buf->crc_err_src_fcid[0];
593 return sizeof(p_drv_buf->crc_err_src_fcid[0]);
596 case DRV_TLV_CRC_ERROR_2_RECEIVED_SOURCE_FC_ID:
597 if (p_drv_buf->crc_err_src_fcid_set[1]) {
598 *p_tlv_buf = (u8 *)&p_drv_buf->crc_err_src_fcid[1];
599 return sizeof(p_drv_buf->crc_err_src_fcid[1]);
602 case DRV_TLV_CRC_ERROR_3_RECEIVED_SOURCE_FC_ID:
603 if (p_drv_buf->crc_err_src_fcid_set[2]) {
604 *p_tlv_buf = (u8 *)&p_drv_buf->crc_err_src_fcid[2];
605 return sizeof(p_drv_buf->crc_err_src_fcid[2]);
608 case DRV_TLV_CRC_ERROR_4_RECEIVED_SOURCE_FC_ID:
609 if (p_drv_buf->crc_err_src_fcid_set[3]) {
610 *p_tlv_buf = (u8 *)&p_drv_buf->crc_err_src_fcid[3];
611 return sizeof(p_drv_buf->crc_err_src_fcid[3]);
614 case DRV_TLV_CRC_ERROR_5_RECEIVED_SOURCE_FC_ID:
615 if (p_drv_buf->crc_err_src_fcid_set[4]) {
616 *p_tlv_buf = (u8 *)&p_drv_buf->crc_err_src_fcid[4];
617 return sizeof(p_drv_buf->crc_err_src_fcid[4]);
620 case DRV_TLV_CRC_ERROR_1_TIMESTAMP:
621 if (p_drv_buf->crc_err_tstamp_set[0]) {
622 *p_tlv_buf = (u8 *)&p_drv_buf->crc_err_tstamp[0];
623 return sizeof(p_drv_buf->crc_err_tstamp[0]);
626 case DRV_TLV_CRC_ERROR_2_TIMESTAMP:
627 if (p_drv_buf->crc_err_tstamp_set[1]) {
628 *p_tlv_buf = (u8 *)&p_drv_buf->crc_err_tstamp[1];
629 return sizeof(p_drv_buf->crc_err_tstamp[1]);
632 case DRV_TLV_CRC_ERROR_3_TIMESTAMP:
633 if (p_drv_buf->crc_err_tstamp_set[2]) {
634 *p_tlv_buf = (u8 *)&p_drv_buf->crc_err_tstamp[2];
635 return sizeof(p_drv_buf->crc_err_tstamp[2]);
638 case DRV_TLV_CRC_ERROR_4_TIMESTAMP:
639 if (p_drv_buf->crc_err_tstamp_set[3]) {
640 *p_tlv_buf = (u8 *)&p_drv_buf->crc_err_tstamp[3];
641 return sizeof(p_drv_buf->crc_err_tstamp[3]);
644 case DRV_TLV_CRC_ERROR_5_TIMESTAMP:
645 if (p_drv_buf->crc_err_tstamp_set[4]) {
646 *p_tlv_buf = (u8 *)&p_drv_buf->crc_err_tstamp[4];
647 return sizeof(p_drv_buf->crc_err_tstamp[4]);
650 case DRV_TLV_LOSS_OF_SYNC_ERROR_COUNT:
651 if (p_drv_buf->losync_err_set) {
652 *p_tlv_buf = (u8 *)&p_drv_buf->losync_err;
653 return sizeof(p_drv_buf->losync_err);
656 case DRV_TLV_LOSS_OF_SIGNAL_ERRORS:
657 if (p_drv_buf->losig_err_set) {
658 *p_tlv_buf = (u8 *)&p_drv_buf->losig_err;
659 return sizeof(p_drv_buf->losig_err);
662 case DRV_TLV_PRIMITIVE_SEQUENCE_PROTOCOL_ERROR_COUNT:
663 if (p_drv_buf->primtive_err_set) {
664 *p_tlv_buf = (u8 *)&p_drv_buf->primtive_err;
665 return sizeof(p_drv_buf->primtive_err);
668 case DRV_TLV_DISPARITY_ERROR_COUNT:
669 if (p_drv_buf->disparity_err_set) {
670 *p_tlv_buf = (u8 *)&p_drv_buf->disparity_err;
671 return sizeof(p_drv_buf->disparity_err);
674 case DRV_TLV_CODE_VIOLATION_ERROR_COUNT:
675 if (p_drv_buf->code_violation_err_set) {
676 *p_tlv_buf = (u8 *)&p_drv_buf->code_violation_err;
677 return sizeof(p_drv_buf->code_violation_err);
680 case DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_1:
681 if (p_drv_buf->flogi_param_set[0]) {
682 *p_tlv_buf = (u8 *)&p_drv_buf->flogi_param[0];
683 return sizeof(p_drv_buf->flogi_param[0]);
686 case DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_2:
687 if (p_drv_buf->flogi_param_set[1]) {
688 *p_tlv_buf = (u8 *)&p_drv_buf->flogi_param[1];
689 return sizeof(p_drv_buf->flogi_param[1]);
692 case DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_3:
693 if (p_drv_buf->flogi_param_set[2]) {
694 *p_tlv_buf = (u8 *)&p_drv_buf->flogi_param[2];
695 return sizeof(p_drv_buf->flogi_param[2]);
698 case DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_4:
699 if (p_drv_buf->flogi_param_set[3]) {
700 *p_tlv_buf = (u8 *)&p_drv_buf->flogi_param[3];
701 return sizeof(p_drv_buf->flogi_param[3]);
704 case DRV_TLV_LAST_FLOGI_TIMESTAMP:
705 if (p_drv_buf->flogi_tstamp_set) {
706 *p_tlv_buf = (u8 *)&p_drv_buf->flogi_tstamp;
707 return sizeof(p_drv_buf->flogi_tstamp);
710 case DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_1:
711 if (p_drv_buf->flogi_acc_param_set[0]) {
712 *p_tlv_buf = (u8 *)&p_drv_buf->flogi_acc_param[0];
713 return sizeof(p_drv_buf->flogi_acc_param[0]);
716 case DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_2:
717 if (p_drv_buf->flogi_acc_param_set[1]) {
718 *p_tlv_buf = (u8 *)&p_drv_buf->flogi_acc_param[1];
719 return sizeof(p_drv_buf->flogi_acc_param[1]);
722 case DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_3:
723 if (p_drv_buf->flogi_acc_param_set[2]) {
724 *p_tlv_buf = (u8 *)&p_drv_buf->flogi_acc_param[2];
725 return sizeof(p_drv_buf->flogi_acc_param[2]);
728 case DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_4:
729 if (p_drv_buf->flogi_acc_param_set[3]) {
730 *p_tlv_buf = (u8 *)&p_drv_buf->flogi_acc_param[3];
731 return sizeof(p_drv_buf->flogi_acc_param[3]);
734 case DRV_TLV_LAST_FLOGI_ACC_TIMESTAMP:
735 if (p_drv_buf->flogi_acc_tstamp_set) {
736 *p_tlv_buf = (u8 *)&p_drv_buf->flogi_acc_tstamp;
737 return sizeof(p_drv_buf->flogi_acc_tstamp);
740 case DRV_TLV_LAST_FLOGI_RJT:
741 if (p_drv_buf->flogi_rjt_set) {
742 *p_tlv_buf = (u8 *)&p_drv_buf->flogi_rjt;
743 return sizeof(p_drv_buf->flogi_rjt);
746 case DRV_TLV_LAST_FLOGI_RJT_TIMESTAMP:
747 if (p_drv_buf->flogi_rjt_tstamp_set) {
748 *p_tlv_buf = (u8 *)&p_drv_buf->flogi_rjt_tstamp;
749 return sizeof(p_drv_buf->flogi_rjt_tstamp);
752 case DRV_TLV_FDISCS_SENT_COUNT:
753 if (p_drv_buf->fdiscs_set) {
754 *p_tlv_buf = (u8 *)&p_drv_buf->fdiscs;
755 return sizeof(p_drv_buf->fdiscs);
758 case DRV_TLV_FDISC_ACCS_RECEIVED:
759 if (p_drv_buf->fdisc_acc_set) {
760 *p_tlv_buf = (u8 *)&p_drv_buf->fdisc_acc;
761 return sizeof(p_drv_buf->fdisc_acc);
764 case DRV_TLV_FDISC_RJTS_RECEIVED:
765 if (p_drv_buf->fdisc_rjt_set) {
766 *p_tlv_buf = (u8 *)&p_drv_buf->fdisc_rjt;
767 return sizeof(p_drv_buf->fdisc_rjt);
770 case DRV_TLV_PLOGI_SENT_COUNT:
771 if (p_drv_buf->plogi_set) {
772 *p_tlv_buf = (u8 *)&p_drv_buf->plogi;
773 return sizeof(p_drv_buf->plogi);
776 case DRV_TLV_PLOGI_ACCS_RECEIVED:
777 if (p_drv_buf->plogi_acc_set) {
778 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_acc;
779 return sizeof(p_drv_buf->plogi_acc);
782 case DRV_TLV_PLOGI_RJTS_RECEIVED:
783 if (p_drv_buf->plogi_rjt_set) {
784 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_rjt;
785 return sizeof(p_drv_buf->plogi_rjt);
788 case DRV_TLV_PLOGI_1_SENT_DESTINATION_FC_ID:
789 if (p_drv_buf->plogi_dst_fcid_set[0]) {
790 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_dst_fcid[0];
791 return sizeof(p_drv_buf->plogi_dst_fcid[0]);
794 case DRV_TLV_PLOGI_2_SENT_DESTINATION_FC_ID:
795 if (p_drv_buf->plogi_dst_fcid_set[1]) {
796 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_dst_fcid[1];
797 return sizeof(p_drv_buf->plogi_dst_fcid[1]);
800 case DRV_TLV_PLOGI_3_SENT_DESTINATION_FC_ID:
801 if (p_drv_buf->plogi_dst_fcid_set[2]) {
802 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_dst_fcid[2];
803 return sizeof(p_drv_buf->plogi_dst_fcid[2]);
806 case DRV_TLV_PLOGI_4_SENT_DESTINATION_FC_ID:
807 if (p_drv_buf->plogi_dst_fcid_set[3]) {
808 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_dst_fcid[3];
809 return sizeof(p_drv_buf->plogi_dst_fcid[3]);
812 case DRV_TLV_PLOGI_5_SENT_DESTINATION_FC_ID:
813 if (p_drv_buf->plogi_dst_fcid_set[4]) {
814 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_dst_fcid[4];
815 return sizeof(p_drv_buf->plogi_dst_fcid[4]);
818 case DRV_TLV_PLOGI_1_TIMESTAMP:
819 if (p_drv_buf->plogi_tstamp_set[0]) {
820 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_tstamp[0];
821 return sizeof(p_drv_buf->plogi_tstamp[0]);
824 case DRV_TLV_PLOGI_2_TIMESTAMP:
825 if (p_drv_buf->plogi_tstamp_set[1]) {
826 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_tstamp[1];
827 return sizeof(p_drv_buf->plogi_tstamp[1]);
830 case DRV_TLV_PLOGI_3_TIMESTAMP:
831 if (p_drv_buf->plogi_tstamp_set[2]) {
832 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_tstamp[2];
833 return sizeof(p_drv_buf->plogi_tstamp[2]);
836 case DRV_TLV_PLOGI_4_TIMESTAMP:
837 if (p_drv_buf->plogi_tstamp_set[3]) {
838 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_tstamp[3];
839 return sizeof(p_drv_buf->plogi_tstamp[3]);
842 case DRV_TLV_PLOGI_5_TIMESTAMP:
843 if (p_drv_buf->plogi_tstamp_set[4]) {
844 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_tstamp[4];
845 return sizeof(p_drv_buf->plogi_tstamp[4]);
848 case DRV_TLV_PLOGI_1_ACC_RECEIVED_SOURCE_FC_ID:
849 if (p_drv_buf->plogi_acc_src_fcid_set[0]) {
850 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_acc_src_fcid[0];
851 return sizeof(p_drv_buf->plogi_acc_src_fcid[0]);
854 case DRV_TLV_PLOGI_2_ACC_RECEIVED_SOURCE_FC_ID:
855 if (p_drv_buf->plogi_acc_src_fcid_set[1]) {
856 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_acc_src_fcid[1];
857 return sizeof(p_drv_buf->plogi_acc_src_fcid[1]);
860 case DRV_TLV_PLOGI_3_ACC_RECEIVED_SOURCE_FC_ID:
861 if (p_drv_buf->plogi_acc_src_fcid_set[2]) {
862 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_acc_src_fcid[2];
863 return sizeof(p_drv_buf->plogi_acc_src_fcid[2]);
866 case DRV_TLV_PLOGI_4_ACC_RECEIVED_SOURCE_FC_ID:
867 if (p_drv_buf->plogi_acc_src_fcid_set[3]) {
868 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_acc_src_fcid[3];
869 return sizeof(p_drv_buf->plogi_acc_src_fcid[3]);
872 case DRV_TLV_PLOGI_5_ACC_RECEIVED_SOURCE_FC_ID:
873 if (p_drv_buf->plogi_acc_src_fcid_set[4]) {
874 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_acc_src_fcid[4];
875 return sizeof(p_drv_buf->plogi_acc_src_fcid[4]);
878 case DRV_TLV_PLOGI_1_ACC_TIMESTAMP:
879 if (p_drv_buf->plogi_acc_tstamp_set[0]) {
880 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_acc_tstamp[0];
881 return sizeof(p_drv_buf->plogi_acc_tstamp[0]);
884 case DRV_TLV_PLOGI_2_ACC_TIMESTAMP:
885 if (p_drv_buf->plogi_acc_tstamp_set[1]) {
886 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_acc_tstamp[1];
887 return sizeof(p_drv_buf->plogi_acc_tstamp[1]);
890 case DRV_TLV_PLOGI_3_ACC_TIMESTAMP:
891 if (p_drv_buf->plogi_acc_tstamp_set[2]) {
892 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_acc_tstamp[2];
893 return sizeof(p_drv_buf->plogi_acc_tstamp[2]);
896 case DRV_TLV_PLOGI_4_ACC_TIMESTAMP:
897 if (p_drv_buf->plogi_acc_tstamp_set[3]) {
898 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_acc_tstamp[3];
899 return sizeof(p_drv_buf->plogi_acc_tstamp[3]);
902 case DRV_TLV_PLOGI_5_ACC_TIMESTAMP:
903 if (p_drv_buf->plogi_acc_tstamp_set[4]) {
904 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_acc_tstamp[4];
905 return sizeof(p_drv_buf->plogi_acc_tstamp[4]);
908 case DRV_TLV_LOGOS_ISSUED:
909 if (p_drv_buf->tx_plogos_set) {
910 *p_tlv_buf = (u8 *)&p_drv_buf->tx_plogos;
911 return sizeof(p_drv_buf->tx_plogos);
914 case DRV_TLV_LOGO_ACCS_RECEIVED:
915 if (p_drv_buf->plogo_acc_set) {
916 *p_tlv_buf = (u8 *)&p_drv_buf->plogo_acc;
917 return sizeof(p_drv_buf->plogo_acc);
920 case DRV_TLV_LOGO_RJTS_RECEIVED:
921 if (p_drv_buf->plogo_rjt_set) {
922 *p_tlv_buf = (u8 *)&p_drv_buf->plogo_rjt;
923 return sizeof(p_drv_buf->plogo_rjt);
926 case DRV_TLV_LOGO_1_RECEIVED_SOURCE_FC_ID:
927 if (p_drv_buf->plogo_src_fcid_set[0]) {
928 *p_tlv_buf = (u8 *)&p_drv_buf->plogo_src_fcid[0];
929 return sizeof(p_drv_buf->plogo_src_fcid[0]);
932 case DRV_TLV_LOGO_2_RECEIVED_SOURCE_FC_ID:
933 if (p_drv_buf->plogo_src_fcid_set[1]) {
934 *p_tlv_buf = (u8 *)&p_drv_buf->plogo_src_fcid[1];
935 return sizeof(p_drv_buf->plogo_src_fcid[1]);
938 case DRV_TLV_LOGO_3_RECEIVED_SOURCE_FC_ID:
939 if (p_drv_buf->plogo_src_fcid_set[2]) {
940 *p_tlv_buf = (u8 *)&p_drv_buf->plogo_src_fcid[2];
941 return sizeof(p_drv_buf->plogo_src_fcid[2]);
944 case DRV_TLV_LOGO_4_RECEIVED_SOURCE_FC_ID:
945 if (p_drv_buf->plogo_src_fcid_set[3]) {
946 *p_tlv_buf = (u8 *)&p_drv_buf->plogo_src_fcid[3];
947 return sizeof(p_drv_buf->plogo_src_fcid[3]);
950 case DRV_TLV_LOGO_5_RECEIVED_SOURCE_FC_ID:
951 if (p_drv_buf->plogo_src_fcid_set[4]) {
952 *p_tlv_buf = (u8 *)&p_drv_buf->plogo_src_fcid[4];
953 return sizeof(p_drv_buf->plogo_src_fcid[4]);
956 case DRV_TLV_LOGO_1_TIMESTAMP:
957 if (p_drv_buf->plogo_tstamp_set[0]) {
958 *p_tlv_buf = (u8 *)&p_drv_buf->plogo_tstamp[0];
959 return sizeof(p_drv_buf->plogo_tstamp[0]);
962 case DRV_TLV_LOGO_2_TIMESTAMP:
963 if (p_drv_buf->plogo_tstamp_set[1]) {
964 *p_tlv_buf = (u8 *)&p_drv_buf->plogo_tstamp[1];
965 return sizeof(p_drv_buf->plogo_tstamp[1]);
968 case DRV_TLV_LOGO_3_TIMESTAMP:
969 if (p_drv_buf->plogo_tstamp_set[2]) {
970 *p_tlv_buf = (u8 *)&p_drv_buf->plogo_tstamp[2];
971 return sizeof(p_drv_buf->plogo_tstamp[2]);
974 case DRV_TLV_LOGO_4_TIMESTAMP:
975 if (p_drv_buf->plogo_tstamp_set[3]) {
976 *p_tlv_buf = (u8 *)&p_drv_buf->plogo_tstamp[3];
977 return sizeof(p_drv_buf->plogo_tstamp[3]);
980 case DRV_TLV_LOGO_5_TIMESTAMP:
981 if (p_drv_buf->plogo_tstamp_set[4]) {
982 *p_tlv_buf = (u8 *)&p_drv_buf->plogo_tstamp[4];
983 return sizeof(p_drv_buf->plogo_tstamp[4]);
986 case DRV_TLV_LOGOS_RECEIVED:
987 if (p_drv_buf->rx_logos_set) {
988 *p_tlv_buf = (u8 *)&p_drv_buf->rx_logos;
989 return sizeof(p_drv_buf->rx_logos);
992 case DRV_TLV_ACCS_ISSUED:
993 if (p_drv_buf->tx_accs_set) {
994 *p_tlv_buf = (u8 *)&p_drv_buf->tx_accs;
995 return sizeof(p_drv_buf->tx_accs);
998 case DRV_TLV_PRLIS_ISSUED:
999 if (p_drv_buf->tx_prlis_set) {
1000 *p_tlv_buf = (u8 *)&p_drv_buf->tx_prlis;
1001 return sizeof(p_drv_buf->tx_prlis);
1004 case DRV_TLV_ACCS_RECEIVED:
1005 if (p_drv_buf->rx_accs_set) {
1006 *p_tlv_buf = (u8 *)&p_drv_buf->rx_accs;
1007 return sizeof(p_drv_buf->rx_accs);
1010 case DRV_TLV_ABTS_SENT_COUNT:
1011 if (p_drv_buf->tx_abts_set) {
1012 *p_tlv_buf = (u8 *)&p_drv_buf->tx_abts;
1013 return sizeof(p_drv_buf->tx_abts);
1016 case DRV_TLV_ABTS_ACCS_RECEIVED:
1017 if (p_drv_buf->rx_abts_acc_set) {
1018 *p_tlv_buf = (u8 *)&p_drv_buf->rx_abts_acc;
1019 return sizeof(p_drv_buf->rx_abts_acc);
1022 case DRV_TLV_ABTS_RJTS_RECEIVED:
1023 if (p_drv_buf->rx_abts_rjt_set) {
1024 *p_tlv_buf = (u8 *)&p_drv_buf->rx_abts_rjt;
1025 return sizeof(p_drv_buf->rx_abts_rjt);
1028 case DRV_TLV_ABTS_1_SENT_DESTINATION_FC_ID:
1029 if (p_drv_buf->abts_dst_fcid_set[0]) {
1030 *p_tlv_buf = (u8 *)&p_drv_buf->abts_dst_fcid[0];
1031 return sizeof(p_drv_buf->abts_dst_fcid[0]);
1034 case DRV_TLV_ABTS_2_SENT_DESTINATION_FC_ID:
1035 if (p_drv_buf->abts_dst_fcid_set[1]) {
1036 *p_tlv_buf = (u8 *)&p_drv_buf->abts_dst_fcid[1];
1037 return sizeof(p_drv_buf->abts_dst_fcid[1]);
1040 case DRV_TLV_ABTS_3_SENT_DESTINATION_FC_ID:
1041 if (p_drv_buf->abts_dst_fcid_set[2]) {
1042 *p_tlv_buf = (u8 *)&p_drv_buf->abts_dst_fcid[2];
1043 return sizeof(p_drv_buf->abts_dst_fcid[2]);
1046 case DRV_TLV_ABTS_4_SENT_DESTINATION_FC_ID:
1047 if (p_drv_buf->abts_dst_fcid_set[3]) {
1048 *p_tlv_buf = (u8 *)&p_drv_buf->abts_dst_fcid[3];
1049 return sizeof(p_drv_buf->abts_dst_fcid[3]);
1052 case DRV_TLV_ABTS_5_SENT_DESTINATION_FC_ID:
1053 if (p_drv_buf->abts_dst_fcid_set[4]) {
1054 *p_tlv_buf = (u8 *)&p_drv_buf->abts_dst_fcid[4];
1055 return sizeof(p_drv_buf->abts_dst_fcid[4]);
1058 case DRV_TLV_ABTS_1_TIMESTAMP:
1059 if (p_drv_buf->abts_tstamp_set[0]) {
1060 *p_tlv_buf = (u8 *)&p_drv_buf->abts_tstamp[0];
1061 return sizeof(p_drv_buf->abts_tstamp[0]);
1064 case DRV_TLV_ABTS_2_TIMESTAMP:
1065 if (p_drv_buf->abts_tstamp_set[1]) {
1066 *p_tlv_buf = (u8 *)&p_drv_buf->abts_tstamp[1];
1067 return sizeof(p_drv_buf->abts_tstamp[1]);
1070 case DRV_TLV_ABTS_3_TIMESTAMP:
1071 if (p_drv_buf->abts_tstamp_set[2]) {
1072 *p_tlv_buf = (u8 *)&p_drv_buf->abts_tstamp[2];
1073 return sizeof(p_drv_buf->abts_tstamp[2]);
1076 case DRV_TLV_ABTS_4_TIMESTAMP:
1077 if (p_drv_buf->abts_tstamp_set[3]) {
1078 *p_tlv_buf = (u8 *)&p_drv_buf->abts_tstamp[3];
1079 return sizeof(p_drv_buf->abts_tstamp[3]);
1082 case DRV_TLV_ABTS_5_TIMESTAMP:
1083 if (p_drv_buf->abts_tstamp_set[4]) {
1084 *p_tlv_buf = (u8 *)&p_drv_buf->abts_tstamp[4];
1085 return sizeof(p_drv_buf->abts_tstamp[4]);
1088 case DRV_TLV_RSCNS_RECEIVED:
1089 if (p_drv_buf->rx_rscn_set) {
1090 *p_tlv_buf = (u8 *)&p_drv_buf->rx_rscn;
1091 return sizeof(p_drv_buf->rx_rscn);
1094 case DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_1:
1095 if (p_drv_buf->rx_rscn_nport_set[0]) {
1096 *p_tlv_buf = (u8 *)&p_drv_buf->rx_rscn_nport[0];
1097 return sizeof(p_drv_buf->rx_rscn_nport[0]);
1100 case DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_2:
1101 if (p_drv_buf->rx_rscn_nport_set[1]) {
1102 *p_tlv_buf = (u8 *)&p_drv_buf->rx_rscn_nport[1];
1103 return sizeof(p_drv_buf->rx_rscn_nport[1]);
1106 case DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_3:
1107 if (p_drv_buf->rx_rscn_nport_set[2]) {
1108 *p_tlv_buf = (u8 *)&p_drv_buf->rx_rscn_nport[2];
1109 return sizeof(p_drv_buf->rx_rscn_nport[2]);
1112 case DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_4:
1113 if (p_drv_buf->rx_rscn_nport_set[3]) {
1114 *p_tlv_buf = (u8 *)&p_drv_buf->rx_rscn_nport[3];
1115 return sizeof(p_drv_buf->rx_rscn_nport[3]);
1118 case DRV_TLV_LUN_RESETS_ISSUED:
1119 if (p_drv_buf->tx_lun_rst_set) {
1120 *p_tlv_buf = (u8 *)&p_drv_buf->tx_lun_rst;
1121 return sizeof(p_drv_buf->tx_lun_rst);
1124 case DRV_TLV_ABORT_TASK_SETS_ISSUED:
1125 if (p_drv_buf->abort_task_sets_set) {
1126 *p_tlv_buf = (u8 *)&p_drv_buf->abort_task_sets;
1127 return sizeof(p_drv_buf->abort_task_sets);
1130 case DRV_TLV_TPRLOS_SENT:
1131 if (p_drv_buf->tx_tprlos_set) {
1132 *p_tlv_buf = (u8 *)&p_drv_buf->tx_tprlos;
1133 return sizeof(p_drv_buf->tx_tprlos);
1136 case DRV_TLV_NOS_SENT_COUNT:
1137 if (p_drv_buf->tx_nos_set) {
1138 *p_tlv_buf = (u8 *)&p_drv_buf->tx_nos;
1139 return sizeof(p_drv_buf->tx_nos);
1142 case DRV_TLV_NOS_RECEIVED_COUNT:
1143 if (p_drv_buf->rx_nos_set) {
1144 *p_tlv_buf = (u8 *)&p_drv_buf->rx_nos;
1145 return sizeof(p_drv_buf->rx_nos);
1148 case DRV_TLV_OLS_COUNT:
1149 if (p_drv_buf->ols_set) {
1150 *p_tlv_buf = (u8 *)&p_drv_buf->ols;
1151 return sizeof(p_drv_buf->ols);
1154 case DRV_TLV_LR_COUNT:
1155 if (p_drv_buf->lr_set) {
1156 *p_tlv_buf = (u8 *)&p_drv_buf->lr;
1157 return sizeof(p_drv_buf->lr);
1160 case DRV_TLV_LRR_COUNT:
1161 if (p_drv_buf->lrr_set) {
1162 *p_tlv_buf = (u8 *)&p_drv_buf->lrr;
1163 return sizeof(p_drv_buf->lrr);
1166 case DRV_TLV_LIP_SENT_COUNT:
1167 if (p_drv_buf->tx_lip_set) {
1168 *p_tlv_buf = (u8 *)&p_drv_buf->tx_lip;
1169 return sizeof(p_drv_buf->tx_lip);
1172 case DRV_TLV_LIP_RECEIVED_COUNT:
1173 if (p_drv_buf->rx_lip_set) {
1174 *p_tlv_buf = (u8 *)&p_drv_buf->rx_lip;
1175 return sizeof(p_drv_buf->rx_lip);
1178 case DRV_TLV_EOFA_COUNT:
1179 if (p_drv_buf->eofa_set) {
1180 *p_tlv_buf = (u8 *)&p_drv_buf->eofa;
1181 return sizeof(p_drv_buf->eofa);
1184 case DRV_TLV_EOFNI_COUNT:
1185 if (p_drv_buf->eofni_set) {
1186 *p_tlv_buf = (u8 *)&p_drv_buf->eofni;
1187 return sizeof(p_drv_buf->eofni);
1190 case DRV_TLV_SCSI_STATUS_CHECK_CONDITION_COUNT:
1191 if (p_drv_buf->scsi_chks_set) {
1192 *p_tlv_buf = (u8 *)&p_drv_buf->scsi_chks;
1193 return sizeof(p_drv_buf->scsi_chks);
1196 case DRV_TLV_SCSI_STATUS_CONDITION_MET_COUNT:
1197 if (p_drv_buf->scsi_cond_met_set) {
1198 *p_tlv_buf = (u8 *)&p_drv_buf->scsi_cond_met;
1199 return sizeof(p_drv_buf->scsi_cond_met);
1202 case DRV_TLV_SCSI_STATUS_BUSY_COUNT:
1203 if (p_drv_buf->scsi_busy_set) {
1204 *p_tlv_buf = (u8 *)&p_drv_buf->scsi_busy;
1205 return sizeof(p_drv_buf->scsi_busy);
1208 case DRV_TLV_SCSI_STATUS_INTERMEDIATE_COUNT:
1209 if (p_drv_buf->scsi_inter_set) {
1210 *p_tlv_buf = (u8 *)&p_drv_buf->scsi_inter;
1211 return sizeof(p_drv_buf->scsi_inter);
1214 case DRV_TLV_SCSI_STATUS_INTERMEDIATE_CONDITION_MET_COUNT:
1215 if (p_drv_buf->scsi_inter_cond_met_set) {
1216 *p_tlv_buf = (u8 *)&p_drv_buf->scsi_inter_cond_met;
1217 return sizeof(p_drv_buf->scsi_inter_cond_met);
1220 case DRV_TLV_SCSI_STATUS_RESERVATION_CONFLICT_COUNT:
1221 if (p_drv_buf->scsi_rsv_conflicts_set) {
1222 *p_tlv_buf = (u8 *)&p_drv_buf->scsi_rsv_conflicts;
1223 return sizeof(p_drv_buf->scsi_rsv_conflicts);
1226 case DRV_TLV_SCSI_STATUS_TASK_SET_FULL_COUNT:
1227 if (p_drv_buf->scsi_tsk_full_set) {
1228 *p_tlv_buf = (u8 *)&p_drv_buf->scsi_tsk_full;
1229 return sizeof(p_drv_buf->scsi_tsk_full);
1232 case DRV_TLV_SCSI_STATUS_ACA_ACTIVE_COUNT:
1233 if (p_drv_buf->scsi_aca_active_set) {
1234 *p_tlv_buf = (u8 *)&p_drv_buf->scsi_aca_active;
1235 return sizeof(p_drv_buf->scsi_aca_active);
1238 case DRV_TLV_SCSI_STATUS_TASK_ABORTED_COUNT:
1239 if (p_drv_buf->scsi_tsk_abort_set) {
1240 *p_tlv_buf = (u8 *)&p_drv_buf->scsi_tsk_abort;
1241 return sizeof(p_drv_buf->scsi_tsk_abort);
1244 case DRV_TLV_SCSI_CHECK_CONDITION_1_RECEIVED_SK_ASC_ASCQ:
1245 if (p_drv_buf->scsi_rx_chk_set[0]) {
1246 *p_tlv_buf = (u8 *)&p_drv_buf->scsi_rx_chk[0];
1247 return sizeof(p_drv_buf->scsi_rx_chk[0]);
1250 case DRV_TLV_SCSI_CHECK_CONDITION_2_RECEIVED_SK_ASC_ASCQ:
1251 if (p_drv_buf->scsi_rx_chk_set[1]) {
1252 *p_tlv_buf = (u8 *)&p_drv_buf->scsi_rx_chk[1];
1253 return sizeof(p_drv_buf->scsi_rx_chk[1]);
1256 case DRV_TLV_SCSI_CHECK_CONDITION_3_RECEIVED_SK_ASC_ASCQ:
1257 if (p_drv_buf->scsi_rx_chk_set[2]) {
1258 *p_tlv_buf = (u8 *)&p_drv_buf->scsi_rx_chk[2];
1259 return sizeof(p_drv_buf->scsi_rx_chk[2]);
1262 case DRV_TLV_SCSI_CHECK_CONDITION_4_RECEIVED_SK_ASC_ASCQ:
1263 if (p_drv_buf->scsi_rx_chk_set[3]) {
1264 *p_tlv_buf = (u8 *)&p_drv_buf->scsi_rx_chk[3];
1265 return sizeof(p_drv_buf->scsi_rx_chk[4]);
1268 case DRV_TLV_SCSI_CHECK_CONDITION_5_RECEIVED_SK_ASC_ASCQ:
1269 if (p_drv_buf->scsi_rx_chk_set[4]) {
1270 *p_tlv_buf = (u8 *)&p_drv_buf->scsi_rx_chk[4];
1271 return sizeof(p_drv_buf->scsi_rx_chk[4]);
1274 case DRV_TLV_SCSI_CHECK_1_TIMESTAMP:
1275 if (p_drv_buf->scsi_chk_tstamp_set[0]) {
1276 *p_tlv_buf = (u8 *)&p_drv_buf->scsi_chk_tstamp[0];
1277 return sizeof(p_drv_buf->scsi_chk_tstamp[0]);
1280 case DRV_TLV_SCSI_CHECK_2_TIMESTAMP:
1281 if (p_drv_buf->scsi_chk_tstamp_set[1]) {
1282 *p_tlv_buf = (u8 *)&p_drv_buf->scsi_chk_tstamp[1];
1283 return sizeof(p_drv_buf->scsi_chk_tstamp[1]);
1286 case DRV_TLV_SCSI_CHECK_3_TIMESTAMP:
1287 if (p_drv_buf->scsi_chk_tstamp_set[2]) {
1288 *p_tlv_buf = (u8 *)&p_drv_buf->scsi_chk_tstamp[2];
1289 return sizeof(p_drv_buf->scsi_chk_tstamp[2]);
1292 case DRV_TLV_SCSI_CHECK_4_TIMESTAMP:
1293 if (p_drv_buf->scsi_chk_tstamp_set[3]) {
1294 *p_tlv_buf = (u8 *)&p_drv_buf->scsi_chk_tstamp[3];
1295 return sizeof(p_drv_buf->scsi_chk_tstamp[3]);
1298 case DRV_TLV_SCSI_CHECK_5_TIMESTAMP:
1299 if (p_drv_buf->scsi_chk_tstamp_set[4]) {
1300 *p_tlv_buf = (u8 *)&p_drv_buf->scsi_chk_tstamp[4];
1301 return sizeof(p_drv_buf->scsi_chk_tstamp[4]);
1312 ecore_mfw_get_iscsi_tlv_value(struct ecore_drv_tlv_hdr *p_tlv,
1313 struct ecore_mfw_tlv_iscsi *p_drv_buf,
1316 switch (p_tlv->tlv_type) {
1317 case DRV_TLV_TARGET_LLMNR_ENABLED:
1318 if (p_drv_buf->target_llmnr_set) {
1319 *p_tlv_buf = (u8 *)&p_drv_buf->target_llmnr;
1320 return sizeof(p_drv_buf->target_llmnr);
1323 case DRV_TLV_HEADER_DIGEST_FLAG_ENABLED:
1324 if (p_drv_buf->header_digest_set) {
1325 *p_tlv_buf = (u8 *)&p_drv_buf->header_digest;
1326 return sizeof(p_drv_buf->header_digest);
1329 case DRV_TLV_DATA_DIGEST_FLAG_ENABLED:
1330 if (p_drv_buf->data_digest_set) {
1331 *p_tlv_buf = (u8 *)&p_drv_buf->data_digest;
1332 return sizeof(p_drv_buf->data_digest);
1335 case DRV_TLV_AUTHENTICATION_METHOD:
1336 if (p_drv_buf->auth_method_set) {
1337 *p_tlv_buf = (u8 *)&p_drv_buf->auth_method;
1338 return sizeof(p_drv_buf->auth_method);
1341 case DRV_TLV_ISCSI_BOOT_TARGET_PORTAL:
1342 if (p_drv_buf->boot_taget_portal_set) {
1343 *p_tlv_buf = (u8 *)&p_drv_buf->boot_taget_portal;
1344 return sizeof(p_drv_buf->boot_taget_portal);
1347 case DRV_TLV_MAX_FRAME_SIZE:
1348 if (p_drv_buf->frame_size_set) {
1349 *p_tlv_buf = (u8 *)&p_drv_buf->frame_size;
1350 return sizeof(p_drv_buf->frame_size);
1353 case DRV_TLV_PDU_TX_DESCRIPTORS_QUEUE_SIZE:
1354 if (p_drv_buf->tx_desc_size_set) {
1355 *p_tlv_buf = (u8 *)&p_drv_buf->tx_desc_size;
1356 return sizeof(p_drv_buf->tx_desc_size);
1359 case DRV_TLV_PDU_RX_DESCRIPTORS_QUEUE_SIZE:
1360 if (p_drv_buf->rx_desc_size_set) {
1361 *p_tlv_buf = (u8 *)&p_drv_buf->rx_desc_size;
1362 return sizeof(p_drv_buf->rx_desc_size);
1365 case DRV_TLV_ISCSI_BOOT_PROGRESS:
1366 if (p_drv_buf->boot_progress_set) {
1367 *p_tlv_buf = (u8 *)&p_drv_buf->boot_progress;
1368 return sizeof(p_drv_buf->boot_progress);
1371 case DRV_TLV_PDU_TX_DESCRIPTOR_QUEUE_AVG_DEPTH:
1372 if (p_drv_buf->tx_desc_qdepth_set) {
1373 *p_tlv_buf = (u8 *)&p_drv_buf->tx_desc_qdepth;
1374 return sizeof(p_drv_buf->tx_desc_qdepth);
1377 case DRV_TLV_PDU_RX_DESCRIPTORS_QUEUE_AVG_DEPTH:
1378 if (p_drv_buf->rx_desc_qdepth_set) {
1379 *p_tlv_buf = (u8 *)&p_drv_buf->rx_desc_qdepth;
1380 return sizeof(p_drv_buf->rx_desc_qdepth);
1383 case DRV_TLV_ISCSI_PDU_RX_FRAMES_RECEIVED:
1384 if (p_drv_buf->rx_frames_set) {
1385 *p_tlv_buf = (u8 *)&p_drv_buf->rx_frames;
1386 return sizeof(p_drv_buf->rx_frames);
1389 case DRV_TLV_ISCSI_PDU_RX_BYTES_RECEIVED:
1390 if (p_drv_buf->rx_bytes_set) {
1391 *p_tlv_buf = (u8 *)&p_drv_buf->rx_bytes;
1392 return sizeof(p_drv_buf->rx_bytes);
1395 case DRV_TLV_ISCSI_PDU_TX_FRAMES_SENT:
1396 if (p_drv_buf->tx_frames_set) {
1397 *p_tlv_buf = (u8 *)&p_drv_buf->tx_frames;
1398 return sizeof(p_drv_buf->tx_frames);
1401 case DRV_TLV_ISCSI_PDU_TX_BYTES_SENT:
1402 if (p_drv_buf->tx_bytes_set) {
1403 *p_tlv_buf = (u8 *)&p_drv_buf->tx_bytes;
1404 return sizeof(p_drv_buf->tx_bytes);
1414 static enum _ecore_status_t ecore_mfw_update_tlvs(struct ecore_hwfn *p_hwfn,
1415 u8 tlv_group, u8 *p_mfw_buf,
1418 union ecore_mfw_tlv_data *p_tlv_data;
1419 struct ecore_drv_tlv_hdr tlv;
1420 u8 *p_tlv_ptr = OSAL_NULL, *p_temp;
1424 p_tlv_data = OSAL_VZALLOC(p_hwfn->p_dev, sizeof(*p_tlv_data));
1428 if (OSAL_MFW_FILL_TLV_DATA(p_hwfn, tlv_group, p_tlv_data)) {
1429 OSAL_VFREE(p_hwfn->p_dev, p_tlv_data);
1434 OSAL_MEMSET(&tlv, 0, sizeof(tlv));
1435 while (offset < size) {
1436 p_temp = &p_mfw_buf[offset];
1437 tlv.tlv_type = TLV_TYPE(p_temp);
1438 tlv.tlv_length = TLV_LENGTH(p_temp);
1439 tlv.tlv_flags = TLV_FLAGS(p_temp);
1440 DP_INFO(p_hwfn, "Type %d length = %d flags = 0x%x\n",
1441 tlv.tlv_type, tlv.tlv_length, tlv.tlv_flags);
1443 offset += sizeof(tlv);
1444 if (tlv_group == ECORE_MFW_TLV_GENERIC)
1445 len = ecore_mfw_get_gen_tlv_value(&tlv,
1446 &p_tlv_data->generic, &p_tlv_ptr);
1447 else if (tlv_group == ECORE_MFW_TLV_ETH)
1448 len = ecore_mfw_get_eth_tlv_value(&tlv,
1449 &p_tlv_data->eth, &p_tlv_ptr);
1450 else if (tlv_group == ECORE_MFW_TLV_FCOE)
1451 len = ecore_mfw_get_fcoe_tlv_value(&tlv,
1452 &p_tlv_data->fcoe, &p_tlv_ptr);
1454 len = ecore_mfw_get_iscsi_tlv_value(&tlv,
1455 &p_tlv_data->iscsi, &p_tlv_ptr);
1458 OSAL_WARN(len > 4 * tlv.tlv_length,
1459 "Incorrect MFW TLV length");
1460 len = OSAL_MIN_T(int, len, 4 * tlv.tlv_length);
1461 tlv.tlv_flags |= ECORE_DRV_TLV_FLAGS_CHANGED;
1462 /* TODO: Endianness handling? */
1463 OSAL_MEMCPY(p_mfw_buf, &tlv, sizeof(tlv));
1464 OSAL_MEMCPY(p_mfw_buf + offset, p_tlv_ptr, len);
1467 offset += sizeof(u32) * tlv.tlv_length;
1470 OSAL_VFREE(p_hwfn->p_dev, p_tlv_data);
1472 return ECORE_SUCCESS;
1475 enum _ecore_status_t
1476 ecore_mfw_process_tlv_req(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt)
1478 u32 addr, size, offset, resp, param, val;
1479 u8 tlv_group = 0, id, *p_mfw_buf = OSAL_NULL, *p_temp;
1480 u32 global_offsize, global_addr;
1481 enum _ecore_status_t rc;
1482 struct ecore_drv_tlv_hdr tlv;
1484 addr = SECTION_OFFSIZE_ADDR(p_hwfn->mcp_info->public_base,
1486 global_offsize = ecore_rd(p_hwfn, p_ptt, addr);
1487 global_addr = SECTION_ADDR(global_offsize, 0);
1488 addr = global_addr + OFFSETOF(struct public_global, data_ptr);
1489 size = ecore_rd(p_hwfn, p_ptt, global_addr +
1490 OFFSETOF(struct public_global, data_size));
1493 DP_NOTICE(p_hwfn, false, "Invalid TLV req size = %d\n", size);
1497 p_mfw_buf = (void *)OSAL_VZALLOC(p_hwfn->p_dev, size);
1499 DP_NOTICE(p_hwfn, false,
1500 "Failed allocate memory for p_mfw_buf\n");
1504 /* Read the TLV request to local buffer */
1505 for (offset = 0; offset < size; offset += sizeof(u32)) {
1506 val = ecore_rd(p_hwfn, p_ptt, addr + offset);
1507 OSAL_MEMCPY(&p_mfw_buf[offset], &val, sizeof(u32));
1510 /* Parse the headers to enumerate the requested TLV groups */
1511 for (offset = 0; offset < size;
1512 offset += sizeof(tlv) + sizeof(u32) * tlv.tlv_length) {
1513 p_temp = &p_mfw_buf[offset];
1514 tlv.tlv_type = TLV_TYPE(p_temp);
1515 tlv.tlv_length = TLV_LENGTH(p_temp);
1516 if (ecore_mfw_get_tlv_group(tlv.tlv_type, &tlv_group))
1520 /* Update the TLV values in the local buffer */
1521 for (id = ECORE_MFW_TLV_GENERIC; id < ECORE_MFW_TLV_MAX; id <<= 1) {
1522 if (tlv_group & id) {
1523 if (ecore_mfw_update_tlvs(p_hwfn, id, p_mfw_buf, size))
1528 /* Write the TLV data to shared memory */
1529 for (offset = 0; offset < size; offset += sizeof(u32)) {
1530 val = (u32)p_mfw_buf[offset];
1531 ecore_wr(p_hwfn, p_ptt, addr + offset, val);
1532 offset += sizeof(u32);
1536 rc = ecore_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_GET_TLV_DONE, 0, &resp,
1539 OSAL_VFREE(p_hwfn->p_dev, p_mfw_buf);