3 #include "ecore_status.h"
8 #define TLV_TYPE(p) (p[0])
9 #define TLV_LENGTH(p) (p[1])
10 #define TLV_FLAGS(p) (p[3])
12 static enum _ecore_status_t
13 ecore_mfw_get_tlv_group(u8 tlv_type, u8 *tlv_group)
16 case DRV_TLV_FEATURE_FLAGS:
17 case DRV_TLV_LOCAL_ADMIN_ADDR:
18 case DRV_TLV_ADDITIONAL_MAC_ADDR_1:
19 case DRV_TLV_ADDITIONAL_MAC_ADDR_2:
20 case DRV_TLV_OS_DRIVER_STATES:
21 case DRV_TLV_PXE_BOOT_PROGRESS:
22 case DRV_TLV_RX_FRAMES_RECEIVED:
23 case DRV_TLV_RX_BYTES_RECEIVED:
24 case DRV_TLV_TX_FRAMES_SENT:
25 case DRV_TLV_TX_BYTES_SENT:
26 *tlv_group |= ECORE_MFW_TLV_GENERIC;
28 case DRV_TLV_LSO_MAX_OFFLOAD_SIZE:
29 case DRV_TLV_LSO_MIN_SEGMENT_COUNT:
30 case DRV_TLV_PROMISCUOUS_MODE:
31 case DRV_TLV_TX_DESCRIPTORS_QUEUE_SIZE:
32 case DRV_TLV_RX_DESCRIPTORS_QUEUE_SIZE:
33 case DRV_TLV_NUM_OF_NET_QUEUE_VMQ_CFG:
34 case DRV_TLV_NUM_OFFLOADED_CONNECTIONS_TCP_IPV4:
35 case DRV_TLV_NUM_OFFLOADED_CONNECTIONS_TCP_IPV6:
36 case DRV_TLV_TX_DESCRIPTOR_QUEUE_AVG_DEPTH:
37 case DRV_TLV_RX_DESCRIPTORS_QUEUE_AVG_DEPTH:
38 case DRV_TLV_IOV_OFFLOAD:
39 case DRV_TLV_TX_QUEUES_EMPTY:
40 case DRV_TLV_RX_QUEUES_EMPTY:
41 case DRV_TLV_TX_QUEUES_FULL:
42 case DRV_TLV_RX_QUEUES_FULL:
43 *tlv_group |= ECORE_MFW_TLV_ETH;
50 case DRV_TLV_BOOT_TYPE:
51 case DRV_TLV_NPIV_STATE:
52 case DRV_TLV_NUM_OF_NPIV_IDS:
53 case DRV_TLV_SWITCH_NAME:
54 case DRV_TLV_SWITCH_PORT_NUM:
55 case DRV_TLV_SWITCH_PORT_ID:
56 case DRV_TLV_VENDOR_NAME:
57 case DRV_TLV_SWITCH_MODEL:
58 case DRV_TLV_SWITCH_FW_VER:
59 case DRV_TLV_QOS_PRIORITY_PER_802_1P:
60 case DRV_TLV_PORT_ALIAS:
61 case DRV_TLV_PORT_STATE:
62 case DRV_TLV_FIP_TX_DESCRIPTORS_QUEUE_SIZE:
63 case DRV_TLV_FCOE_RX_DESCRIPTORS_QUEUE_SIZE:
64 case DRV_TLV_LINK_FAILURE_COUNT:
65 case DRV_TLV_FCOE_BOOT_PROGRESS:
66 case DRV_TLV_RX_BROADCAST_PACKETS:
67 case DRV_TLV_TX_BROADCAST_PACKETS:
68 case DRV_TLV_FCOE_TX_DESCRIPTOR_QUEUE_AVG_DEPTH:
69 case DRV_TLV_FCOE_RX_DESCRIPTORS_QUEUE_AVG_DEPTH:
70 case DRV_TLV_FCOE_RX_FRAMES_RECEIVED:
71 case DRV_TLV_FCOE_RX_BYTES_RECEIVED:
72 case DRV_TLV_FCOE_TX_FRAMES_SENT:
73 case DRV_TLV_FCOE_TX_BYTES_SENT:
74 case DRV_TLV_CRC_ERROR_COUNT:
75 case DRV_TLV_CRC_ERROR_1_RECEIVED_SOURCE_FC_ID:
76 case DRV_TLV_CRC_ERROR_1_TIMESTAMP:
77 case DRV_TLV_CRC_ERROR_2_RECEIVED_SOURCE_FC_ID:
78 case DRV_TLV_CRC_ERROR_2_TIMESTAMP:
79 case DRV_TLV_CRC_ERROR_3_RECEIVED_SOURCE_FC_ID:
80 case DRV_TLV_CRC_ERROR_3_TIMESTAMP:
81 case DRV_TLV_CRC_ERROR_4_RECEIVED_SOURCE_FC_ID:
82 case DRV_TLV_CRC_ERROR_4_TIMESTAMP:
83 case DRV_TLV_CRC_ERROR_5_RECEIVED_SOURCE_FC_ID:
84 case DRV_TLV_CRC_ERROR_5_TIMESTAMP:
85 case DRV_TLV_LOSS_OF_SYNC_ERROR_COUNT:
86 case DRV_TLV_LOSS_OF_SIGNAL_ERRORS:
87 case DRV_TLV_PRIMITIVE_SEQUENCE_PROTOCOL_ERROR_COUNT:
88 case DRV_TLV_DISPARITY_ERROR_COUNT:
89 case DRV_TLV_CODE_VIOLATION_ERROR_COUNT:
90 case DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_1:
91 case DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_2:
92 case DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_3:
93 case DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_4:
94 case DRV_TLV_LAST_FLOGI_TIMESTAMP:
95 case DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_1:
96 case DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_2:
97 case DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_3:
98 case DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_4:
99 case DRV_TLV_LAST_FLOGI_ACC_TIMESTAMP:
100 case DRV_TLV_LAST_FLOGI_RJT:
101 case DRV_TLV_LAST_FLOGI_RJT_TIMESTAMP:
102 case DRV_TLV_FDISCS_SENT_COUNT:
103 case DRV_TLV_FDISC_ACCS_RECEIVED:
104 case DRV_TLV_FDISC_RJTS_RECEIVED:
105 case DRV_TLV_PLOGI_SENT_COUNT:
106 case DRV_TLV_PLOGI_ACCS_RECEIVED:
107 case DRV_TLV_PLOGI_RJTS_RECEIVED:
108 case DRV_TLV_PLOGI_1_SENT_DESTINATION_FC_ID:
109 case DRV_TLV_PLOGI_1_TIMESTAMP:
110 case DRV_TLV_PLOGI_2_SENT_DESTINATION_FC_ID:
111 case DRV_TLV_PLOGI_2_TIMESTAMP:
112 case DRV_TLV_PLOGI_3_SENT_DESTINATION_FC_ID:
113 case DRV_TLV_PLOGI_3_TIMESTAMP:
114 case DRV_TLV_PLOGI_4_SENT_DESTINATION_FC_ID:
115 case DRV_TLV_PLOGI_4_TIMESTAMP:
116 case DRV_TLV_PLOGI_5_SENT_DESTINATION_FC_ID:
117 case DRV_TLV_PLOGI_5_TIMESTAMP:
118 case DRV_TLV_PLOGI_1_ACC_RECEIVED_SOURCE_FC_ID:
119 case DRV_TLV_PLOGI_1_ACC_TIMESTAMP:
120 case DRV_TLV_PLOGI_2_ACC_RECEIVED_SOURCE_FC_ID:
121 case DRV_TLV_PLOGI_2_ACC_TIMESTAMP:
122 case DRV_TLV_PLOGI_3_ACC_RECEIVED_SOURCE_FC_ID:
123 case DRV_TLV_PLOGI_3_ACC_TIMESTAMP:
124 case DRV_TLV_PLOGI_4_ACC_RECEIVED_SOURCE_FC_ID:
125 case DRV_TLV_PLOGI_4_ACC_TIMESTAMP:
126 case DRV_TLV_PLOGI_5_ACC_RECEIVED_SOURCE_FC_ID:
127 case DRV_TLV_PLOGI_5_ACC_TIMESTAMP:
128 case DRV_TLV_LOGOS_ISSUED:
129 case DRV_TLV_LOGO_ACCS_RECEIVED:
130 case DRV_TLV_LOGO_RJTS_RECEIVED:
131 case DRV_TLV_LOGO_1_RECEIVED_SOURCE_FC_ID:
132 case DRV_TLV_LOGO_1_TIMESTAMP:
133 case DRV_TLV_LOGO_2_RECEIVED_SOURCE_FC_ID:
134 case DRV_TLV_LOGO_2_TIMESTAMP:
135 case DRV_TLV_LOGO_3_RECEIVED_SOURCE_FC_ID:
136 case DRV_TLV_LOGO_3_TIMESTAMP:
137 case DRV_TLV_LOGO_4_RECEIVED_SOURCE_FC_ID:
138 case DRV_TLV_LOGO_4_TIMESTAMP:
139 case DRV_TLV_LOGO_5_RECEIVED_SOURCE_FC_ID:
140 case DRV_TLV_LOGO_5_TIMESTAMP:
141 case DRV_TLV_LOGOS_RECEIVED:
142 case DRV_TLV_ACCS_ISSUED:
143 case DRV_TLV_PRLIS_ISSUED:
144 case DRV_TLV_ACCS_RECEIVED:
145 case DRV_TLV_ABTS_SENT_COUNT:
146 case DRV_TLV_ABTS_ACCS_RECEIVED:
147 case DRV_TLV_ABTS_RJTS_RECEIVED:
148 case DRV_TLV_ABTS_1_SENT_DESTINATION_FC_ID:
149 case DRV_TLV_ABTS_1_TIMESTAMP:
150 case DRV_TLV_ABTS_2_SENT_DESTINATION_FC_ID:
151 case DRV_TLV_ABTS_2_TIMESTAMP:
152 case DRV_TLV_ABTS_3_SENT_DESTINATION_FC_ID:
153 case DRV_TLV_ABTS_3_TIMESTAMP:
154 case DRV_TLV_ABTS_4_SENT_DESTINATION_FC_ID:
155 case DRV_TLV_ABTS_4_TIMESTAMP:
156 case DRV_TLV_ABTS_5_SENT_DESTINATION_FC_ID:
157 case DRV_TLV_ABTS_5_TIMESTAMP:
158 case DRV_TLV_RSCNS_RECEIVED:
159 case DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_1:
160 case DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_2:
161 case DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_3:
162 case DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_4:
163 case DRV_TLV_LUN_RESETS_ISSUED:
164 case DRV_TLV_ABORT_TASK_SETS_ISSUED:
165 case DRV_TLV_TPRLOS_SENT:
166 case DRV_TLV_NOS_SENT_COUNT:
167 case DRV_TLV_NOS_RECEIVED_COUNT:
168 case DRV_TLV_OLS_COUNT:
169 case DRV_TLV_LR_COUNT:
170 case DRV_TLV_LRR_COUNT:
171 case DRV_TLV_LIP_SENT_COUNT:
172 case DRV_TLV_LIP_RECEIVED_COUNT:
173 case DRV_TLV_EOFA_COUNT:
174 case DRV_TLV_EOFNI_COUNT:
175 case DRV_TLV_SCSI_STATUS_CHECK_CONDITION_COUNT:
176 case DRV_TLV_SCSI_STATUS_CONDITION_MET_COUNT:
177 case DRV_TLV_SCSI_STATUS_BUSY_COUNT:
178 case DRV_TLV_SCSI_STATUS_INTERMEDIATE_COUNT:
179 case DRV_TLV_SCSI_STATUS_INTERMEDIATE_CONDITION_MET_COUNT:
180 case DRV_TLV_SCSI_STATUS_RESERVATION_CONFLICT_COUNT:
181 case DRV_TLV_SCSI_STATUS_TASK_SET_FULL_COUNT:
182 case DRV_TLV_SCSI_STATUS_ACA_ACTIVE_COUNT:
183 case DRV_TLV_SCSI_STATUS_TASK_ABORTED_COUNT:
184 case DRV_TLV_SCSI_CHECK_CONDITION_1_RECEIVED_SK_ASC_ASCQ:
185 case DRV_TLV_SCSI_CHECK_1_TIMESTAMP:
186 case DRV_TLV_SCSI_CHECK_CONDITION_2_RECEIVED_SK_ASC_ASCQ:
187 case DRV_TLV_SCSI_CHECK_2_TIMESTAMP:
188 case DRV_TLV_SCSI_CHECK_CONDITION_3_RECEIVED_SK_ASC_ASCQ:
189 case DRV_TLV_SCSI_CHECK_3_TIMESTAMP:
190 case DRV_TLV_SCSI_CHECK_CONDITION_4_RECEIVED_SK_ASC_ASCQ:
191 case DRV_TLV_SCSI_CHECK_4_TIMESTAMP:
192 case DRV_TLV_SCSI_CHECK_CONDITION_5_RECEIVED_SK_ASC_ASCQ:
193 case DRV_TLV_SCSI_CHECK_5_TIMESTAMP:
194 *tlv_group = ECORE_MFW_TLV_FCOE;
196 case DRV_TLV_TARGET_LLMNR_ENABLED:
197 case DRV_TLV_HEADER_DIGEST_FLAG_ENABLED:
198 case DRV_TLV_DATA_DIGEST_FLAG_ENABLED:
199 case DRV_TLV_AUTHENTICATION_METHOD:
200 case DRV_TLV_ISCSI_BOOT_TARGET_PORTAL:
201 case DRV_TLV_MAX_FRAME_SIZE:
202 case DRV_TLV_PDU_TX_DESCRIPTORS_QUEUE_SIZE:
203 case DRV_TLV_PDU_RX_DESCRIPTORS_QUEUE_SIZE:
204 case DRV_TLV_ISCSI_BOOT_PROGRESS:
205 case DRV_TLV_PDU_TX_DESCRIPTOR_QUEUE_AVG_DEPTH:
206 case DRV_TLV_PDU_RX_DESCRIPTORS_QUEUE_AVG_DEPTH:
207 case DRV_TLV_ISCSI_PDU_RX_FRAMES_RECEIVED:
208 case DRV_TLV_ISCSI_PDU_RX_BYTES_RECEIVED:
209 case DRV_TLV_ISCSI_PDU_TX_FRAMES_SENT:
210 case DRV_TLV_ISCSI_PDU_TX_BYTES_SENT:
211 *tlv_group |= ECORE_MFW_TLV_ISCSI;
217 return ECORE_SUCCESS;
221 ecore_mfw_get_gen_tlv_value(struct ecore_drv_tlv_hdr *p_tlv,
222 struct ecore_mfw_tlv_generic *p_drv_buf,
225 switch (p_tlv->tlv_type) {
226 case DRV_TLV_FEATURE_FLAGS:
227 if (p_drv_buf->feat_flags_set) {
228 *p_tlv_buf = (u8 *)&p_drv_buf->feat_flags;
229 return sizeof(p_drv_buf->feat_flags);
232 case DRV_TLV_LOCAL_ADMIN_ADDR:
233 if (p_drv_buf->local_mac_set) {
234 *p_tlv_buf = (u8 *)&p_drv_buf->local_mac;
235 return sizeof(p_drv_buf->local_mac);
238 case DRV_TLV_ADDITIONAL_MAC_ADDR_1:
239 if (p_drv_buf->additional_mac1_set) {
240 *p_tlv_buf = (u8 *)&p_drv_buf->additional_mac1;
241 return sizeof(p_drv_buf->additional_mac1);
244 case DRV_TLV_ADDITIONAL_MAC_ADDR_2:
245 if (p_drv_buf->additional_mac2_set) {
246 *p_tlv_buf = (u8 *)&p_drv_buf->additional_mac2;
247 return sizeof(p_drv_buf->additional_mac2);
250 case DRV_TLV_OS_DRIVER_STATES:
251 if (p_drv_buf->drv_state_set) {
252 *p_tlv_buf = (u8 *)&p_drv_buf->drv_state;
253 return sizeof(p_drv_buf->drv_state);
256 case DRV_TLV_PXE_BOOT_PROGRESS:
257 if (p_drv_buf->pxe_progress_set) {
258 *p_tlv_buf = (u8 *)&p_drv_buf->pxe_progress;
259 return sizeof(p_drv_buf->pxe_progress);
262 case DRV_TLV_RX_FRAMES_RECEIVED:
263 if (p_drv_buf->rx_frames_set) {
264 *p_tlv_buf = (u8 *)&p_drv_buf->rx_frames;
265 return sizeof(p_drv_buf->rx_frames);
268 case DRV_TLV_RX_BYTES_RECEIVED:
269 if (p_drv_buf->rx_bytes_set) {
270 *p_tlv_buf = (u8 *)&p_drv_buf->rx_bytes;
271 return sizeof(p_drv_buf->rx_bytes);
274 case DRV_TLV_TX_FRAMES_SENT:
275 if (p_drv_buf->tx_frames_set) {
276 *p_tlv_buf = (u8 *)&p_drv_buf->tx_frames;
277 return sizeof(p_drv_buf->tx_frames);
280 case DRV_TLV_TX_BYTES_SENT:
281 if (p_drv_buf->tx_bytes_set) {
282 *p_tlv_buf = (u8 *)&p_drv_buf->tx_bytes;
283 return sizeof(p_drv_buf->tx_bytes);
294 ecore_mfw_get_eth_tlv_value(struct ecore_drv_tlv_hdr *p_tlv,
295 struct ecore_mfw_tlv_eth *p_drv_buf,
298 switch (p_tlv->tlv_type) {
299 case DRV_TLV_LSO_MAX_OFFLOAD_SIZE:
300 if (p_drv_buf->lso_maxoff_size_set) {
301 *p_tlv_buf = (u8 *)&p_drv_buf->lso_maxoff_size;
302 return sizeof(p_drv_buf->lso_maxoff_size);
305 case DRV_TLV_LSO_MIN_SEGMENT_COUNT:
306 if (p_drv_buf->lso_minseg_size_set) {
307 *p_tlv_buf = (u8 *)&p_drv_buf->lso_minseg_size;
308 return sizeof(p_drv_buf->lso_minseg_size);
311 case DRV_TLV_PROMISCUOUS_MODE:
312 if (p_drv_buf->prom_mode_set) {
313 *p_tlv_buf = (u8 *)&p_drv_buf->prom_mode;
314 return sizeof(p_drv_buf->prom_mode);
317 case DRV_TLV_TX_DESCRIPTORS_QUEUE_SIZE:
318 if (p_drv_buf->tx_descr_size_set) {
319 *p_tlv_buf = (u8 *)&p_drv_buf->tx_descr_size;
320 return sizeof(p_drv_buf->tx_descr_size);
323 case DRV_TLV_RX_DESCRIPTORS_QUEUE_SIZE:
324 if (p_drv_buf->rx_descr_size_set) {
325 *p_tlv_buf = (u8 *)&p_drv_buf->rx_descr_size;
326 return sizeof(p_drv_buf->rx_descr_size);
329 case DRV_TLV_NUM_OF_NET_QUEUE_VMQ_CFG:
330 if (p_drv_buf->netq_count_set) {
331 *p_tlv_buf = (u8 *)&p_drv_buf->netq_count;
332 return sizeof(p_drv_buf->netq_count);
335 case DRV_TLV_NUM_OFFLOADED_CONNECTIONS_TCP_IPV4:
336 if (p_drv_buf->tcp4_offloads_set) {
337 *p_tlv_buf = (u8 *)&p_drv_buf->tcp4_offloads;
338 return sizeof(p_drv_buf->tcp4_offloads);
341 case DRV_TLV_NUM_OFFLOADED_CONNECTIONS_TCP_IPV6:
342 if (p_drv_buf->tcp6_offloads_set) {
343 *p_tlv_buf = (u8 *)&p_drv_buf->tcp6_offloads;
344 return sizeof(p_drv_buf->tcp6_offloads);
347 case DRV_TLV_TX_DESCRIPTOR_QUEUE_AVG_DEPTH:
348 if (p_drv_buf->tx_descr_qdepth_set) {
349 *p_tlv_buf = (u8 *)&p_drv_buf->tx_descr_qdepth;
350 return sizeof(p_drv_buf->tx_descr_qdepth);
353 case DRV_TLV_RX_DESCRIPTORS_QUEUE_AVG_DEPTH:
354 if (p_drv_buf->rx_descr_qdepth_set) {
355 *p_tlv_buf = (u8 *)&p_drv_buf->rx_descr_qdepth;
356 return sizeof(p_drv_buf->rx_descr_qdepth);
359 case DRV_TLV_IOV_OFFLOAD:
360 if (p_drv_buf->iov_offload_set) {
361 *p_tlv_buf = (u8 *)&p_drv_buf->iov_offload;
362 return sizeof(p_drv_buf->iov_offload);
365 case DRV_TLV_TX_QUEUES_EMPTY:
366 if (p_drv_buf->txqs_empty_set) {
367 *p_tlv_buf = (u8 *)&p_drv_buf->txqs_empty;
368 return sizeof(p_drv_buf->txqs_empty);
371 case DRV_TLV_RX_QUEUES_EMPTY:
372 if (p_drv_buf->rxqs_empty_set) {
373 *p_tlv_buf = (u8 *)&p_drv_buf->rxqs_empty;
374 return sizeof(p_drv_buf->rxqs_empty);
377 case DRV_TLV_TX_QUEUES_FULL:
378 if (p_drv_buf->num_txqs_full_set) {
379 *p_tlv_buf = (u8 *)&p_drv_buf->num_txqs_full;
380 return sizeof(p_drv_buf->num_txqs_full);
383 case DRV_TLV_RX_QUEUES_FULL:
384 if (p_drv_buf->num_rxqs_full_set) {
385 *p_tlv_buf = (u8 *)&p_drv_buf->num_rxqs_full;
386 return sizeof(p_drv_buf->num_rxqs_full);
397 ecore_mfw_get_fcoe_tlv_value(struct ecore_drv_tlv_hdr *p_tlv,
398 struct ecore_mfw_tlv_fcoe *p_drv_buf,
401 switch (p_tlv->tlv_type) {
402 case DRV_TLV_SCSI_TO:
403 if (p_drv_buf->scsi_timeout_set) {
404 *p_tlv_buf = (u8 *)&p_drv_buf->scsi_timeout;
405 return sizeof(p_drv_buf->scsi_timeout);
408 case DRV_TLV_R_T_TOV:
409 if (p_drv_buf->rt_tov_set) {
410 *p_tlv_buf = (u8 *)&p_drv_buf->rt_tov;
411 return sizeof(p_drv_buf->rt_tov);
414 case DRV_TLV_R_A_TOV:
415 if (p_drv_buf->ra_tov_set) {
416 *p_tlv_buf = (u8 *)&p_drv_buf->ra_tov;
417 return sizeof(p_drv_buf->ra_tov);
420 case DRV_TLV_E_D_TOV:
421 if (p_drv_buf->ed_tov_set) {
422 *p_tlv_buf = (u8 *)&p_drv_buf->ed_tov;
423 return sizeof(p_drv_buf->ed_tov);
427 if (p_drv_buf->cr_tov_set) {
428 *p_tlv_buf = (u8 *)&p_drv_buf->cr_tov;
429 return sizeof(p_drv_buf->cr_tov);
432 case DRV_TLV_BOOT_TYPE:
433 if (p_drv_buf->boot_type_set) {
434 *p_tlv_buf = (u8 *)&p_drv_buf->boot_type;
435 return sizeof(p_drv_buf->boot_type);
438 case DRV_TLV_NPIV_STATE:
439 if (p_drv_buf->npiv_state_set) {
440 *p_tlv_buf = (u8 *)&p_drv_buf->npiv_state;
441 return sizeof(p_drv_buf->npiv_state);
444 case DRV_TLV_NUM_OF_NPIV_IDS:
445 if (p_drv_buf->num_npiv_ids_set) {
446 *p_tlv_buf = (u8 *)&p_drv_buf->num_npiv_ids;
447 return sizeof(p_drv_buf->num_npiv_ids);
450 case DRV_TLV_SWITCH_NAME:
451 if (p_drv_buf->switch_name_set) {
452 *p_tlv_buf = (u8 *)&p_drv_buf->switch_name;
453 return sizeof(p_drv_buf->switch_name);
456 case DRV_TLV_SWITCH_PORT_NUM:
457 if (p_drv_buf->switch_portnum_set) {
458 *p_tlv_buf = (u8 *)&p_drv_buf->switch_portnum;
459 return sizeof(p_drv_buf->switch_portnum);
462 case DRV_TLV_SWITCH_PORT_ID:
463 if (p_drv_buf->switch_portid_set) {
464 *p_tlv_buf = (u8 *)&p_drv_buf->switch_portid;
465 return sizeof(p_drv_buf->switch_portid);
468 case DRV_TLV_VENDOR_NAME:
469 if (p_drv_buf->vendor_name_set) {
470 *p_tlv_buf = (u8 *)&p_drv_buf->vendor_name;
471 return sizeof(p_drv_buf->vendor_name);
474 case DRV_TLV_SWITCH_MODEL:
475 if (p_drv_buf->switch_model_set) {
476 *p_tlv_buf = (u8 *)&p_drv_buf->switch_model;
477 return sizeof(p_drv_buf->switch_model);
480 case DRV_TLV_SWITCH_FW_VER:
481 if (p_drv_buf->switch_fw_version_set) {
482 *p_tlv_buf = (u8 *)&p_drv_buf->switch_fw_version;
483 return sizeof(p_drv_buf->switch_fw_version);
486 case DRV_TLV_QOS_PRIORITY_PER_802_1P:
487 if (p_drv_buf->qos_pri_set) {
488 *p_tlv_buf = (u8 *)&p_drv_buf->qos_pri;
489 return sizeof(p_drv_buf->qos_pri);
492 case DRV_TLV_PORT_ALIAS:
493 if (p_drv_buf->port_alias_set) {
494 *p_tlv_buf = (u8 *)&p_drv_buf->port_alias;
495 return sizeof(p_drv_buf->port_alias);
498 case DRV_TLV_PORT_STATE:
499 if (p_drv_buf->port_state_set) {
500 *p_tlv_buf = (u8 *)&p_drv_buf->port_state;
501 return sizeof(p_drv_buf->port_state);
504 case DRV_TLV_FIP_TX_DESCRIPTORS_QUEUE_SIZE:
505 if (p_drv_buf->fip_tx_descr_size_set) {
506 *p_tlv_buf = (u8 *)&p_drv_buf->fip_tx_descr_size;
507 return sizeof(p_drv_buf->fip_tx_descr_size);
510 case DRV_TLV_FCOE_RX_DESCRIPTORS_QUEUE_SIZE:
511 if (p_drv_buf->fip_rx_descr_size_set) {
512 *p_tlv_buf = (u8 *)&p_drv_buf->fip_rx_descr_size;
513 return sizeof(p_drv_buf->fip_rx_descr_size);
516 case DRV_TLV_LINK_FAILURE_COUNT:
517 if (p_drv_buf->link_failures_set) {
518 *p_tlv_buf = (u8 *)&p_drv_buf->link_failures;
519 return sizeof(p_drv_buf->link_failures);
522 case DRV_TLV_FCOE_BOOT_PROGRESS:
523 if (p_drv_buf->fcoe_boot_progress_set) {
524 *p_tlv_buf = (u8 *)&p_drv_buf->fcoe_boot_progress;
525 return sizeof(p_drv_buf->fcoe_boot_progress);
528 case DRV_TLV_RX_BROADCAST_PACKETS:
529 if (p_drv_buf->rx_bcast_set) {
530 *p_tlv_buf = (u8 *)&p_drv_buf->rx_bcast;
531 return sizeof(p_drv_buf->rx_bcast);
534 case DRV_TLV_TX_BROADCAST_PACKETS:
535 if (p_drv_buf->tx_bcast_set) {
536 *p_tlv_buf = (u8 *)&p_drv_buf->tx_bcast;
537 return sizeof(p_drv_buf->tx_bcast);
540 case DRV_TLV_FCOE_TX_DESCRIPTOR_QUEUE_AVG_DEPTH:
541 if (p_drv_buf->fcoe_txq_depth_set) {
542 *p_tlv_buf = (u8 *)&p_drv_buf->fcoe_txq_depth;
543 return sizeof(p_drv_buf->fcoe_txq_depth);
546 case DRV_TLV_FCOE_RX_DESCRIPTORS_QUEUE_AVG_DEPTH:
547 if (p_drv_buf->fcoe_rxq_depth_set) {
548 *p_tlv_buf = (u8 *)&p_drv_buf->fcoe_rxq_depth;
549 return sizeof(p_drv_buf->fcoe_rxq_depth);
552 case DRV_TLV_FCOE_RX_FRAMES_RECEIVED:
553 if (p_drv_buf->fcoe_rx_frames_set) {
554 *p_tlv_buf = (u8 *)&p_drv_buf->fcoe_rx_frames;
555 return sizeof(p_drv_buf->fcoe_rx_frames);
558 case DRV_TLV_FCOE_RX_BYTES_RECEIVED:
559 if (p_drv_buf->fcoe_rx_bytes_set) {
560 *p_tlv_buf = (u8 *)&p_drv_buf->fcoe_rx_bytes;
561 return sizeof(p_drv_buf->fcoe_rx_bytes);
564 case DRV_TLV_FCOE_TX_FRAMES_SENT:
565 if (p_drv_buf->fcoe_tx_frames_set) {
566 *p_tlv_buf = (u8 *)&p_drv_buf->fcoe_tx_frames;
567 return sizeof(p_drv_buf->fcoe_tx_frames);
570 case DRV_TLV_FCOE_TX_BYTES_SENT:
571 if (p_drv_buf->fcoe_tx_bytes_set) {
572 *p_tlv_buf = (u8 *)&p_drv_buf->fcoe_tx_bytes;
573 return sizeof(p_drv_buf->fcoe_tx_bytes);
576 case DRV_TLV_CRC_ERROR_COUNT:
577 if (p_drv_buf->crc_count_set) {
578 *p_tlv_buf = (u8 *)&p_drv_buf->crc_count;
579 return sizeof(p_drv_buf->crc_count);
582 case DRV_TLV_CRC_ERROR_1_RECEIVED_SOURCE_FC_ID:
583 if (p_drv_buf->crc_err_src_fcid_set[0]) {
584 *p_tlv_buf = (u8 *)&p_drv_buf->crc_err_src_fcid[0];
585 return sizeof(p_drv_buf->crc_err_src_fcid[0]);
588 case DRV_TLV_CRC_ERROR_2_RECEIVED_SOURCE_FC_ID:
589 if (p_drv_buf->crc_err_src_fcid_set[1]) {
590 *p_tlv_buf = (u8 *)&p_drv_buf->crc_err_src_fcid[1];
591 return sizeof(p_drv_buf->crc_err_src_fcid[1]);
594 case DRV_TLV_CRC_ERROR_3_RECEIVED_SOURCE_FC_ID:
595 if (p_drv_buf->crc_err_src_fcid_set[2]) {
596 *p_tlv_buf = (u8 *)&p_drv_buf->crc_err_src_fcid[2];
597 return sizeof(p_drv_buf->crc_err_src_fcid[2]);
600 case DRV_TLV_CRC_ERROR_4_RECEIVED_SOURCE_FC_ID:
601 if (p_drv_buf->crc_err_src_fcid_set[3]) {
602 *p_tlv_buf = (u8 *)&p_drv_buf->crc_err_src_fcid[3];
603 return sizeof(p_drv_buf->crc_err_src_fcid[3]);
606 case DRV_TLV_CRC_ERROR_5_RECEIVED_SOURCE_FC_ID:
607 if (p_drv_buf->crc_err_src_fcid_set[4]) {
608 *p_tlv_buf = (u8 *)&p_drv_buf->crc_err_src_fcid[4];
609 return sizeof(p_drv_buf->crc_err_src_fcid[4]);
612 case DRV_TLV_CRC_ERROR_1_TIMESTAMP:
613 if (p_drv_buf->crc_err_tstamp_set[0]) {
614 *p_tlv_buf = (u8 *)&p_drv_buf->crc_err_tstamp[0];
615 return sizeof(p_drv_buf->crc_err_tstamp[0]);
618 case DRV_TLV_CRC_ERROR_2_TIMESTAMP:
619 if (p_drv_buf->crc_err_tstamp_set[1]) {
620 *p_tlv_buf = (u8 *)&p_drv_buf->crc_err_tstamp[1];
621 return sizeof(p_drv_buf->crc_err_tstamp[1]);
624 case DRV_TLV_CRC_ERROR_3_TIMESTAMP:
625 if (p_drv_buf->crc_err_tstamp_set[2]) {
626 *p_tlv_buf = (u8 *)&p_drv_buf->crc_err_tstamp[2];
627 return sizeof(p_drv_buf->crc_err_tstamp[2]);
630 case DRV_TLV_CRC_ERROR_4_TIMESTAMP:
631 if (p_drv_buf->crc_err_tstamp_set[3]) {
632 *p_tlv_buf = (u8 *)&p_drv_buf->crc_err_tstamp[3];
633 return sizeof(p_drv_buf->crc_err_tstamp[3]);
636 case DRV_TLV_CRC_ERROR_5_TIMESTAMP:
637 if (p_drv_buf->crc_err_tstamp_set[4]) {
638 *p_tlv_buf = (u8 *)&p_drv_buf->crc_err_tstamp[4];
639 return sizeof(p_drv_buf->crc_err_tstamp[4]);
642 case DRV_TLV_LOSS_OF_SYNC_ERROR_COUNT:
643 if (p_drv_buf->losync_err_set) {
644 *p_tlv_buf = (u8 *)&p_drv_buf->losync_err;
645 return sizeof(p_drv_buf->losync_err);
648 case DRV_TLV_LOSS_OF_SIGNAL_ERRORS:
649 if (p_drv_buf->losig_err_set) {
650 *p_tlv_buf = (u8 *)&p_drv_buf->losig_err;
651 return sizeof(p_drv_buf->losig_err);
654 case DRV_TLV_PRIMITIVE_SEQUENCE_PROTOCOL_ERROR_COUNT:
655 if (p_drv_buf->primtive_err_set) {
656 *p_tlv_buf = (u8 *)&p_drv_buf->primtive_err;
657 return sizeof(p_drv_buf->primtive_err);
660 case DRV_TLV_DISPARITY_ERROR_COUNT:
661 if (p_drv_buf->disparity_err_set) {
662 *p_tlv_buf = (u8 *)&p_drv_buf->disparity_err;
663 return sizeof(p_drv_buf->disparity_err);
666 case DRV_TLV_CODE_VIOLATION_ERROR_COUNT:
667 if (p_drv_buf->code_violation_err_set) {
668 *p_tlv_buf = (u8 *)&p_drv_buf->code_violation_err;
669 return sizeof(p_drv_buf->code_violation_err);
672 case DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_1:
673 if (p_drv_buf->flogi_param_set[0]) {
674 *p_tlv_buf = (u8 *)&p_drv_buf->flogi_param[0];
675 return sizeof(p_drv_buf->flogi_param[0]);
678 case DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_2:
679 if (p_drv_buf->flogi_param_set[1]) {
680 *p_tlv_buf = (u8 *)&p_drv_buf->flogi_param[1];
681 return sizeof(p_drv_buf->flogi_param[1]);
684 case DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_3:
685 if (p_drv_buf->flogi_param_set[2]) {
686 *p_tlv_buf = (u8 *)&p_drv_buf->flogi_param[2];
687 return sizeof(p_drv_buf->flogi_param[2]);
690 case DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_4:
691 if (p_drv_buf->flogi_param_set[3]) {
692 *p_tlv_buf = (u8 *)&p_drv_buf->flogi_param[3];
693 return sizeof(p_drv_buf->flogi_param[3]);
696 case DRV_TLV_LAST_FLOGI_TIMESTAMP:
697 if (p_drv_buf->flogi_tstamp_set) {
698 *p_tlv_buf = (u8 *)&p_drv_buf->flogi_tstamp;
699 return sizeof(p_drv_buf->flogi_tstamp);
702 case DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_1:
703 if (p_drv_buf->flogi_acc_param_set[0]) {
704 *p_tlv_buf = (u8 *)&p_drv_buf->flogi_acc_param[0];
705 return sizeof(p_drv_buf->flogi_acc_param[0]);
708 case DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_2:
709 if (p_drv_buf->flogi_acc_param_set[1]) {
710 *p_tlv_buf = (u8 *)&p_drv_buf->flogi_acc_param[1];
711 return sizeof(p_drv_buf->flogi_acc_param[1]);
714 case DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_3:
715 if (p_drv_buf->flogi_acc_param_set[2]) {
716 *p_tlv_buf = (u8 *)&p_drv_buf->flogi_acc_param[2];
717 return sizeof(p_drv_buf->flogi_acc_param[2]);
720 case DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_4:
721 if (p_drv_buf->flogi_acc_param_set[3]) {
722 *p_tlv_buf = (u8 *)&p_drv_buf->flogi_acc_param[3];
723 return sizeof(p_drv_buf->flogi_acc_param[3]);
726 case DRV_TLV_LAST_FLOGI_ACC_TIMESTAMP:
727 if (p_drv_buf->flogi_acc_tstamp_set) {
728 *p_tlv_buf = (u8 *)&p_drv_buf->flogi_acc_tstamp;
729 return sizeof(p_drv_buf->flogi_acc_tstamp);
732 case DRV_TLV_LAST_FLOGI_RJT:
733 if (p_drv_buf->flogi_rjt_set) {
734 *p_tlv_buf = (u8 *)&p_drv_buf->flogi_rjt;
735 return sizeof(p_drv_buf->flogi_rjt);
738 case DRV_TLV_LAST_FLOGI_RJT_TIMESTAMP:
739 if (p_drv_buf->flogi_rjt_tstamp_set) {
740 *p_tlv_buf = (u8 *)&p_drv_buf->flogi_rjt_tstamp;
741 return sizeof(p_drv_buf->flogi_rjt_tstamp);
744 case DRV_TLV_FDISCS_SENT_COUNT:
745 if (p_drv_buf->fdiscs_set) {
746 *p_tlv_buf = (u8 *)&p_drv_buf->fdiscs;
747 return sizeof(p_drv_buf->fdiscs);
750 case DRV_TLV_FDISC_ACCS_RECEIVED:
751 if (p_drv_buf->fdisc_acc_set) {
752 *p_tlv_buf = (u8 *)&p_drv_buf->fdisc_acc;
753 return sizeof(p_drv_buf->fdisc_acc);
756 case DRV_TLV_FDISC_RJTS_RECEIVED:
757 if (p_drv_buf->fdisc_rjt_set) {
758 *p_tlv_buf = (u8 *)&p_drv_buf->fdisc_rjt;
759 return sizeof(p_drv_buf->fdisc_rjt);
762 case DRV_TLV_PLOGI_SENT_COUNT:
763 if (p_drv_buf->plogi_set) {
764 *p_tlv_buf = (u8 *)&p_drv_buf->plogi;
765 return sizeof(p_drv_buf->plogi);
768 case DRV_TLV_PLOGI_ACCS_RECEIVED:
769 if (p_drv_buf->plogi_acc_set) {
770 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_acc;
771 return sizeof(p_drv_buf->plogi_acc);
774 case DRV_TLV_PLOGI_RJTS_RECEIVED:
775 if (p_drv_buf->plogi_rjt_set) {
776 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_rjt;
777 return sizeof(p_drv_buf->plogi_rjt);
780 case DRV_TLV_PLOGI_1_SENT_DESTINATION_FC_ID:
781 if (p_drv_buf->plogi_dst_fcid_set[0]) {
782 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_dst_fcid[0];
783 return sizeof(p_drv_buf->plogi_dst_fcid[0]);
786 case DRV_TLV_PLOGI_2_SENT_DESTINATION_FC_ID:
787 if (p_drv_buf->plogi_dst_fcid_set[1]) {
788 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_dst_fcid[1];
789 return sizeof(p_drv_buf->plogi_dst_fcid[1]);
792 case DRV_TLV_PLOGI_3_SENT_DESTINATION_FC_ID:
793 if (p_drv_buf->plogi_dst_fcid_set[2]) {
794 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_dst_fcid[2];
795 return sizeof(p_drv_buf->plogi_dst_fcid[2]);
798 case DRV_TLV_PLOGI_4_SENT_DESTINATION_FC_ID:
799 if (p_drv_buf->plogi_dst_fcid_set[3]) {
800 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_dst_fcid[3];
801 return sizeof(p_drv_buf->plogi_dst_fcid[3]);
804 case DRV_TLV_PLOGI_5_SENT_DESTINATION_FC_ID:
805 if (p_drv_buf->plogi_dst_fcid_set[4]) {
806 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_dst_fcid[4];
807 return sizeof(p_drv_buf->plogi_dst_fcid[4]);
810 case DRV_TLV_PLOGI_1_TIMESTAMP:
811 if (p_drv_buf->plogi_tstamp_set[0]) {
812 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_tstamp[0];
813 return sizeof(p_drv_buf->plogi_tstamp[0]);
816 case DRV_TLV_PLOGI_2_TIMESTAMP:
817 if (p_drv_buf->plogi_tstamp_set[1]) {
818 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_tstamp[1];
819 return sizeof(p_drv_buf->plogi_tstamp[1]);
822 case DRV_TLV_PLOGI_3_TIMESTAMP:
823 if (p_drv_buf->plogi_tstamp_set[2]) {
824 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_tstamp[2];
825 return sizeof(p_drv_buf->plogi_tstamp[2]);
828 case DRV_TLV_PLOGI_4_TIMESTAMP:
829 if (p_drv_buf->plogi_tstamp_set[3]) {
830 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_tstamp[3];
831 return sizeof(p_drv_buf->plogi_tstamp[3]);
834 case DRV_TLV_PLOGI_5_TIMESTAMP:
835 if (p_drv_buf->plogi_tstamp_set[4]) {
836 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_tstamp[4];
837 return sizeof(p_drv_buf->plogi_tstamp[4]);
840 case DRV_TLV_PLOGI_1_ACC_RECEIVED_SOURCE_FC_ID:
841 if (p_drv_buf->plogi_acc_src_fcid_set[0]) {
842 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_acc_src_fcid[0];
843 return sizeof(p_drv_buf->plogi_acc_src_fcid[0]);
846 case DRV_TLV_PLOGI_2_ACC_RECEIVED_SOURCE_FC_ID:
847 if (p_drv_buf->plogi_acc_src_fcid_set[1]) {
848 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_acc_src_fcid[1];
849 return sizeof(p_drv_buf->plogi_acc_src_fcid[1]);
852 case DRV_TLV_PLOGI_3_ACC_RECEIVED_SOURCE_FC_ID:
853 if (p_drv_buf->plogi_acc_src_fcid_set[2]) {
854 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_acc_src_fcid[2];
855 return sizeof(p_drv_buf->plogi_acc_src_fcid[2]);
858 case DRV_TLV_PLOGI_4_ACC_RECEIVED_SOURCE_FC_ID:
859 if (p_drv_buf->plogi_acc_src_fcid_set[3]) {
860 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_acc_src_fcid[3];
861 return sizeof(p_drv_buf->plogi_acc_src_fcid[3]);
864 case DRV_TLV_PLOGI_5_ACC_RECEIVED_SOURCE_FC_ID:
865 if (p_drv_buf->plogi_acc_src_fcid_set[4]) {
866 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_acc_src_fcid[4];
867 return sizeof(p_drv_buf->plogi_acc_src_fcid[4]);
870 case DRV_TLV_PLOGI_1_ACC_TIMESTAMP:
871 if (p_drv_buf->plogi_acc_tstamp_set[0]) {
872 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_acc_tstamp[0];
873 return sizeof(p_drv_buf->plogi_acc_tstamp[0]);
876 case DRV_TLV_PLOGI_2_ACC_TIMESTAMP:
877 if (p_drv_buf->plogi_acc_tstamp_set[1]) {
878 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_acc_tstamp[1];
879 return sizeof(p_drv_buf->plogi_acc_tstamp[1]);
882 case DRV_TLV_PLOGI_3_ACC_TIMESTAMP:
883 if (p_drv_buf->plogi_acc_tstamp_set[2]) {
884 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_acc_tstamp[2];
885 return sizeof(p_drv_buf->plogi_acc_tstamp[2]);
888 case DRV_TLV_PLOGI_4_ACC_TIMESTAMP:
889 if (p_drv_buf->plogi_acc_tstamp_set[3]) {
890 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_acc_tstamp[3];
891 return sizeof(p_drv_buf->plogi_acc_tstamp[3]);
894 case DRV_TLV_PLOGI_5_ACC_TIMESTAMP:
895 if (p_drv_buf->plogi_acc_tstamp_set[4]) {
896 *p_tlv_buf = (u8 *)&p_drv_buf->plogi_acc_tstamp[4];
897 return sizeof(p_drv_buf->plogi_acc_tstamp[4]);
900 case DRV_TLV_LOGOS_ISSUED:
901 if (p_drv_buf->tx_plogos_set) {
902 *p_tlv_buf = (u8 *)&p_drv_buf->tx_plogos;
903 return sizeof(p_drv_buf->tx_plogos);
906 case DRV_TLV_LOGO_ACCS_RECEIVED:
907 if (p_drv_buf->plogo_acc_set) {
908 *p_tlv_buf = (u8 *)&p_drv_buf->plogo_acc;
909 return sizeof(p_drv_buf->plogo_acc);
912 case DRV_TLV_LOGO_RJTS_RECEIVED:
913 if (p_drv_buf->plogo_rjt_set) {
914 *p_tlv_buf = (u8 *)&p_drv_buf->plogo_rjt;
915 return sizeof(p_drv_buf->plogo_rjt);
918 case DRV_TLV_LOGO_1_RECEIVED_SOURCE_FC_ID:
919 if (p_drv_buf->plogo_src_fcid_set[0]) {
920 *p_tlv_buf = (u8 *)&p_drv_buf->plogo_src_fcid[0];
921 return sizeof(p_drv_buf->plogo_src_fcid[0]);
924 case DRV_TLV_LOGO_2_RECEIVED_SOURCE_FC_ID:
925 if (p_drv_buf->plogo_src_fcid_set[1]) {
926 *p_tlv_buf = (u8 *)&p_drv_buf->plogo_src_fcid[1];
927 return sizeof(p_drv_buf->plogo_src_fcid[1]);
930 case DRV_TLV_LOGO_3_RECEIVED_SOURCE_FC_ID:
931 if (p_drv_buf->plogo_src_fcid_set[2]) {
932 *p_tlv_buf = (u8 *)&p_drv_buf->plogo_src_fcid[2];
933 return sizeof(p_drv_buf->plogo_src_fcid[2]);
936 case DRV_TLV_LOGO_4_RECEIVED_SOURCE_FC_ID:
937 if (p_drv_buf->plogo_src_fcid_set[3]) {
938 *p_tlv_buf = (u8 *)&p_drv_buf->plogo_src_fcid[3];
939 return sizeof(p_drv_buf->plogo_src_fcid[3]);
942 case DRV_TLV_LOGO_5_RECEIVED_SOURCE_FC_ID:
943 if (p_drv_buf->plogo_src_fcid_set[4]) {
944 *p_tlv_buf = (u8 *)&p_drv_buf->plogo_src_fcid[4];
945 return sizeof(p_drv_buf->plogo_src_fcid[4]);
948 case DRV_TLV_LOGO_1_TIMESTAMP:
949 if (p_drv_buf->plogo_tstamp_set[0]) {
950 *p_tlv_buf = (u8 *)&p_drv_buf->plogo_tstamp[0];
951 return sizeof(p_drv_buf->plogo_tstamp[0]);
954 case DRV_TLV_LOGO_2_TIMESTAMP:
955 if (p_drv_buf->plogo_tstamp_set[1]) {
956 *p_tlv_buf = (u8 *)&p_drv_buf->plogo_tstamp[1];
957 return sizeof(p_drv_buf->plogo_tstamp[1]);
960 case DRV_TLV_LOGO_3_TIMESTAMP:
961 if (p_drv_buf->plogo_tstamp_set[2]) {
962 *p_tlv_buf = (u8 *)&p_drv_buf->plogo_tstamp[2];
963 return sizeof(p_drv_buf->plogo_tstamp[2]);
966 case DRV_TLV_LOGO_4_TIMESTAMP:
967 if (p_drv_buf->plogo_tstamp_set[3]) {
968 *p_tlv_buf = (u8 *)&p_drv_buf->plogo_tstamp[3];
969 return sizeof(p_drv_buf->plogo_tstamp[3]);
972 case DRV_TLV_LOGO_5_TIMESTAMP:
973 if (p_drv_buf->plogo_tstamp_set[4]) {
974 *p_tlv_buf = (u8 *)&p_drv_buf->plogo_tstamp[4];
975 return sizeof(p_drv_buf->plogo_tstamp[4]);
978 case DRV_TLV_LOGOS_RECEIVED:
979 if (p_drv_buf->rx_logos_set) {
980 *p_tlv_buf = (u8 *)&p_drv_buf->rx_logos;
981 return sizeof(p_drv_buf->rx_logos);
984 case DRV_TLV_ACCS_ISSUED:
985 if (p_drv_buf->tx_accs_set) {
986 *p_tlv_buf = (u8 *)&p_drv_buf->tx_accs;
987 return sizeof(p_drv_buf->tx_accs);
990 case DRV_TLV_PRLIS_ISSUED:
991 if (p_drv_buf->tx_prlis_set) {
992 *p_tlv_buf = (u8 *)&p_drv_buf->tx_prlis;
993 return sizeof(p_drv_buf->tx_prlis);
996 case DRV_TLV_ACCS_RECEIVED:
997 if (p_drv_buf->rx_accs_set) {
998 *p_tlv_buf = (u8 *)&p_drv_buf->rx_accs;
999 return sizeof(p_drv_buf->rx_accs);
1002 case DRV_TLV_ABTS_SENT_COUNT:
1003 if (p_drv_buf->tx_abts_set) {
1004 *p_tlv_buf = (u8 *)&p_drv_buf->tx_abts;
1005 return sizeof(p_drv_buf->tx_abts);
1008 case DRV_TLV_ABTS_ACCS_RECEIVED:
1009 if (p_drv_buf->rx_abts_acc_set) {
1010 *p_tlv_buf = (u8 *)&p_drv_buf->rx_abts_acc;
1011 return sizeof(p_drv_buf->rx_abts_acc);
1014 case DRV_TLV_ABTS_RJTS_RECEIVED:
1015 if (p_drv_buf->rx_abts_rjt_set) {
1016 *p_tlv_buf = (u8 *)&p_drv_buf->rx_abts_rjt;
1017 return sizeof(p_drv_buf->rx_abts_rjt);
1020 case DRV_TLV_ABTS_1_SENT_DESTINATION_FC_ID:
1021 if (p_drv_buf->abts_dst_fcid_set[0]) {
1022 *p_tlv_buf = (u8 *)&p_drv_buf->abts_dst_fcid[0];
1023 return sizeof(p_drv_buf->abts_dst_fcid[0]);
1026 case DRV_TLV_ABTS_2_SENT_DESTINATION_FC_ID:
1027 if (p_drv_buf->abts_dst_fcid_set[1]) {
1028 *p_tlv_buf = (u8 *)&p_drv_buf->abts_dst_fcid[1];
1029 return sizeof(p_drv_buf->abts_dst_fcid[1]);
1032 case DRV_TLV_ABTS_3_SENT_DESTINATION_FC_ID:
1033 if (p_drv_buf->abts_dst_fcid_set[2]) {
1034 *p_tlv_buf = (u8 *)&p_drv_buf->abts_dst_fcid[2];
1035 return sizeof(p_drv_buf->abts_dst_fcid[2]);
1038 case DRV_TLV_ABTS_4_SENT_DESTINATION_FC_ID:
1039 if (p_drv_buf->abts_dst_fcid_set[3]) {
1040 *p_tlv_buf = (u8 *)&p_drv_buf->abts_dst_fcid[3];
1041 return sizeof(p_drv_buf->abts_dst_fcid[3]);
1044 case DRV_TLV_ABTS_5_SENT_DESTINATION_FC_ID:
1045 if (p_drv_buf->abts_dst_fcid_set[4]) {
1046 *p_tlv_buf = (u8 *)&p_drv_buf->abts_dst_fcid[4];
1047 return sizeof(p_drv_buf->abts_dst_fcid[4]);
1050 case DRV_TLV_ABTS_1_TIMESTAMP:
1051 if (p_drv_buf->abts_tstamp_set[0]) {
1052 *p_tlv_buf = (u8 *)&p_drv_buf->abts_tstamp[0];
1053 return sizeof(p_drv_buf->abts_tstamp[0]);
1056 case DRV_TLV_ABTS_2_TIMESTAMP:
1057 if (p_drv_buf->abts_tstamp_set[1]) {
1058 *p_tlv_buf = (u8 *)&p_drv_buf->abts_tstamp[1];
1059 return sizeof(p_drv_buf->abts_tstamp[1]);
1062 case DRV_TLV_ABTS_3_TIMESTAMP:
1063 if (p_drv_buf->abts_tstamp_set[2]) {
1064 *p_tlv_buf = (u8 *)&p_drv_buf->abts_tstamp[2];
1065 return sizeof(p_drv_buf->abts_tstamp[2]);
1068 case DRV_TLV_ABTS_4_TIMESTAMP:
1069 if (p_drv_buf->abts_tstamp_set[3]) {
1070 *p_tlv_buf = (u8 *)&p_drv_buf->abts_tstamp[3];
1071 return sizeof(p_drv_buf->abts_tstamp[3]);
1074 case DRV_TLV_ABTS_5_TIMESTAMP:
1075 if (p_drv_buf->abts_tstamp_set[4]) {
1076 *p_tlv_buf = (u8 *)&p_drv_buf->abts_tstamp[4];
1077 return sizeof(p_drv_buf->abts_tstamp[4]);
1080 case DRV_TLV_RSCNS_RECEIVED:
1081 if (p_drv_buf->rx_rscn_set) {
1082 *p_tlv_buf = (u8 *)&p_drv_buf->rx_rscn;
1083 return sizeof(p_drv_buf->rx_rscn);
1086 case DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_1:
1087 if (p_drv_buf->rx_rscn_nport_set[0]) {
1088 *p_tlv_buf = (u8 *)&p_drv_buf->rx_rscn_nport[0];
1089 return sizeof(p_drv_buf->rx_rscn_nport[0]);
1092 case DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_2:
1093 if (p_drv_buf->rx_rscn_nport_set[1]) {
1094 *p_tlv_buf = (u8 *)&p_drv_buf->rx_rscn_nport[1];
1095 return sizeof(p_drv_buf->rx_rscn_nport[1]);
1098 case DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_3:
1099 if (p_drv_buf->rx_rscn_nport_set[2]) {
1100 *p_tlv_buf = (u8 *)&p_drv_buf->rx_rscn_nport[2];
1101 return sizeof(p_drv_buf->rx_rscn_nport[2]);
1104 case DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_4:
1105 if (p_drv_buf->rx_rscn_nport_set[3]) {
1106 *p_tlv_buf = (u8 *)&p_drv_buf->rx_rscn_nport[3];
1107 return sizeof(p_drv_buf->rx_rscn_nport[3]);
1110 case DRV_TLV_LUN_RESETS_ISSUED:
1111 if (p_drv_buf->tx_lun_rst_set) {
1112 *p_tlv_buf = (u8 *)&p_drv_buf->tx_lun_rst;
1113 return sizeof(p_drv_buf->tx_lun_rst);
1116 case DRV_TLV_ABORT_TASK_SETS_ISSUED:
1117 if (p_drv_buf->abort_task_sets_set) {
1118 *p_tlv_buf = (u8 *)&p_drv_buf->abort_task_sets;
1119 return sizeof(p_drv_buf->abort_task_sets);
1122 case DRV_TLV_TPRLOS_SENT:
1123 if (p_drv_buf->tx_tprlos_set) {
1124 *p_tlv_buf = (u8 *)&p_drv_buf->tx_tprlos;
1125 return sizeof(p_drv_buf->tx_tprlos);
1128 case DRV_TLV_NOS_SENT_COUNT:
1129 if (p_drv_buf->tx_nos_set) {
1130 *p_tlv_buf = (u8 *)&p_drv_buf->tx_nos;
1131 return sizeof(p_drv_buf->tx_nos);
1134 case DRV_TLV_NOS_RECEIVED_COUNT:
1135 if (p_drv_buf->rx_nos_set) {
1136 *p_tlv_buf = (u8 *)&p_drv_buf->rx_nos;
1137 return sizeof(p_drv_buf->rx_nos);
1140 case DRV_TLV_OLS_COUNT:
1141 if (p_drv_buf->ols_set) {
1142 *p_tlv_buf = (u8 *)&p_drv_buf->ols;
1143 return sizeof(p_drv_buf->ols);
1146 case DRV_TLV_LR_COUNT:
1147 if (p_drv_buf->lr_set) {
1148 *p_tlv_buf = (u8 *)&p_drv_buf->lr;
1149 return sizeof(p_drv_buf->lr);
1152 case DRV_TLV_LRR_COUNT:
1153 if (p_drv_buf->lrr_set) {
1154 *p_tlv_buf = (u8 *)&p_drv_buf->lrr;
1155 return sizeof(p_drv_buf->lrr);
1158 case DRV_TLV_LIP_SENT_COUNT:
1159 if (p_drv_buf->tx_lip_set) {
1160 *p_tlv_buf = (u8 *)&p_drv_buf->tx_lip;
1161 return sizeof(p_drv_buf->tx_lip);
1164 case DRV_TLV_LIP_RECEIVED_COUNT:
1165 if (p_drv_buf->rx_lip_set) {
1166 *p_tlv_buf = (u8 *)&p_drv_buf->rx_lip;
1167 return sizeof(p_drv_buf->rx_lip);
1170 case DRV_TLV_EOFA_COUNT:
1171 if (p_drv_buf->eofa_set) {
1172 *p_tlv_buf = (u8 *)&p_drv_buf->eofa;
1173 return sizeof(p_drv_buf->eofa);
1176 case DRV_TLV_EOFNI_COUNT:
1177 if (p_drv_buf->eofni_set) {
1178 *p_tlv_buf = (u8 *)&p_drv_buf->eofni;
1179 return sizeof(p_drv_buf->eofni);
1182 case DRV_TLV_SCSI_STATUS_CHECK_CONDITION_COUNT:
1183 if (p_drv_buf->scsi_chks_set) {
1184 *p_tlv_buf = (u8 *)&p_drv_buf->scsi_chks;
1185 return sizeof(p_drv_buf->scsi_chks);
1188 case DRV_TLV_SCSI_STATUS_CONDITION_MET_COUNT:
1189 if (p_drv_buf->scsi_cond_met_set) {
1190 *p_tlv_buf = (u8 *)&p_drv_buf->scsi_cond_met;
1191 return sizeof(p_drv_buf->scsi_cond_met);
1194 case DRV_TLV_SCSI_STATUS_BUSY_COUNT:
1195 if (p_drv_buf->scsi_busy_set) {
1196 *p_tlv_buf = (u8 *)&p_drv_buf->scsi_busy;
1197 return sizeof(p_drv_buf->scsi_busy);
1200 case DRV_TLV_SCSI_STATUS_INTERMEDIATE_COUNT:
1201 if (p_drv_buf->scsi_inter_set) {
1202 *p_tlv_buf = (u8 *)&p_drv_buf->scsi_inter;
1203 return sizeof(p_drv_buf->scsi_inter);
1206 case DRV_TLV_SCSI_STATUS_INTERMEDIATE_CONDITION_MET_COUNT:
1207 if (p_drv_buf->scsi_inter_cond_met_set) {
1208 *p_tlv_buf = (u8 *)&p_drv_buf->scsi_inter_cond_met;
1209 return sizeof(p_drv_buf->scsi_inter_cond_met);
1212 case DRV_TLV_SCSI_STATUS_RESERVATION_CONFLICT_COUNT:
1213 if (p_drv_buf->scsi_rsv_conflicts_set) {
1214 *p_tlv_buf = (u8 *)&p_drv_buf->scsi_rsv_conflicts;
1215 return sizeof(p_drv_buf->scsi_rsv_conflicts);
1218 case DRV_TLV_SCSI_STATUS_TASK_SET_FULL_COUNT:
1219 if (p_drv_buf->scsi_tsk_full_set) {
1220 *p_tlv_buf = (u8 *)&p_drv_buf->scsi_tsk_full;
1221 return sizeof(p_drv_buf->scsi_tsk_full);
1224 case DRV_TLV_SCSI_STATUS_ACA_ACTIVE_COUNT:
1225 if (p_drv_buf->scsi_aca_active_set) {
1226 *p_tlv_buf = (u8 *)&p_drv_buf->scsi_aca_active;
1227 return sizeof(p_drv_buf->scsi_aca_active);
1230 case DRV_TLV_SCSI_STATUS_TASK_ABORTED_COUNT:
1231 if (p_drv_buf->scsi_tsk_abort_set) {
1232 *p_tlv_buf = (u8 *)&p_drv_buf->scsi_tsk_abort;
1233 return sizeof(p_drv_buf->scsi_tsk_abort);
1236 case DRV_TLV_SCSI_CHECK_CONDITION_1_RECEIVED_SK_ASC_ASCQ:
1237 if (p_drv_buf->scsi_rx_chk_set[0]) {
1238 *p_tlv_buf = (u8 *)&p_drv_buf->scsi_rx_chk[0];
1239 return sizeof(p_drv_buf->scsi_rx_chk[0]);
1242 case DRV_TLV_SCSI_CHECK_CONDITION_2_RECEIVED_SK_ASC_ASCQ:
1243 if (p_drv_buf->scsi_rx_chk_set[1]) {
1244 *p_tlv_buf = (u8 *)&p_drv_buf->scsi_rx_chk[1];
1245 return sizeof(p_drv_buf->scsi_rx_chk[1]);
1248 case DRV_TLV_SCSI_CHECK_CONDITION_3_RECEIVED_SK_ASC_ASCQ:
1249 if (p_drv_buf->scsi_rx_chk_set[2]) {
1250 *p_tlv_buf = (u8 *)&p_drv_buf->scsi_rx_chk[2];
1251 return sizeof(p_drv_buf->scsi_rx_chk[2]);
1254 case DRV_TLV_SCSI_CHECK_CONDITION_4_RECEIVED_SK_ASC_ASCQ:
1255 if (p_drv_buf->scsi_rx_chk_set[3]) {
1256 *p_tlv_buf = (u8 *)&p_drv_buf->scsi_rx_chk[3];
1257 return sizeof(p_drv_buf->scsi_rx_chk[4]);
1260 case DRV_TLV_SCSI_CHECK_CONDITION_5_RECEIVED_SK_ASC_ASCQ:
1261 if (p_drv_buf->scsi_rx_chk_set[4]) {
1262 *p_tlv_buf = (u8 *)&p_drv_buf->scsi_rx_chk[4];
1263 return sizeof(p_drv_buf->scsi_rx_chk[4]);
1266 case DRV_TLV_SCSI_CHECK_1_TIMESTAMP:
1267 if (p_drv_buf->scsi_chk_tstamp_set[0]) {
1268 *p_tlv_buf = (u8 *)&p_drv_buf->scsi_chk_tstamp[0];
1269 return sizeof(p_drv_buf->scsi_chk_tstamp[0]);
1272 case DRV_TLV_SCSI_CHECK_2_TIMESTAMP:
1273 if (p_drv_buf->scsi_chk_tstamp_set[1]) {
1274 *p_tlv_buf = (u8 *)&p_drv_buf->scsi_chk_tstamp[1];
1275 return sizeof(p_drv_buf->scsi_chk_tstamp[1]);
1278 case DRV_TLV_SCSI_CHECK_3_TIMESTAMP:
1279 if (p_drv_buf->scsi_chk_tstamp_set[2]) {
1280 *p_tlv_buf = (u8 *)&p_drv_buf->scsi_chk_tstamp[2];
1281 return sizeof(p_drv_buf->scsi_chk_tstamp[2]);
1284 case DRV_TLV_SCSI_CHECK_4_TIMESTAMP:
1285 if (p_drv_buf->scsi_chk_tstamp_set[3]) {
1286 *p_tlv_buf = (u8 *)&p_drv_buf->scsi_chk_tstamp[3];
1287 return sizeof(p_drv_buf->scsi_chk_tstamp[3]);
1290 case DRV_TLV_SCSI_CHECK_5_TIMESTAMP:
1291 if (p_drv_buf->scsi_chk_tstamp_set[4]) {
1292 *p_tlv_buf = (u8 *)&p_drv_buf->scsi_chk_tstamp[4];
1293 return sizeof(p_drv_buf->scsi_chk_tstamp[4]);
1304 ecore_mfw_get_iscsi_tlv_value(struct ecore_drv_tlv_hdr *p_tlv,
1305 struct ecore_mfw_tlv_iscsi *p_drv_buf,
1308 switch (p_tlv->tlv_type) {
1309 case DRV_TLV_TARGET_LLMNR_ENABLED:
1310 if (p_drv_buf->target_llmnr_set) {
1311 *p_tlv_buf = (u8 *)&p_drv_buf->target_llmnr;
1312 return sizeof(p_drv_buf->target_llmnr);
1315 case DRV_TLV_HEADER_DIGEST_FLAG_ENABLED:
1316 if (p_drv_buf->header_digest_set) {
1317 *p_tlv_buf = (u8 *)&p_drv_buf->header_digest;
1318 return sizeof(p_drv_buf->header_digest);
1321 case DRV_TLV_DATA_DIGEST_FLAG_ENABLED:
1322 if (p_drv_buf->data_digest_set) {
1323 *p_tlv_buf = (u8 *)&p_drv_buf->data_digest;
1324 return sizeof(p_drv_buf->data_digest);
1327 case DRV_TLV_AUTHENTICATION_METHOD:
1328 if (p_drv_buf->auth_method_set) {
1329 *p_tlv_buf = (u8 *)&p_drv_buf->auth_method;
1330 return sizeof(p_drv_buf->auth_method);
1333 case DRV_TLV_ISCSI_BOOT_TARGET_PORTAL:
1334 if (p_drv_buf->boot_taget_portal_set) {
1335 *p_tlv_buf = (u8 *)&p_drv_buf->boot_taget_portal;
1336 return sizeof(p_drv_buf->boot_taget_portal);
1339 case DRV_TLV_MAX_FRAME_SIZE:
1340 if (p_drv_buf->frame_size_set) {
1341 *p_tlv_buf = (u8 *)&p_drv_buf->frame_size;
1342 return sizeof(p_drv_buf->frame_size);
1345 case DRV_TLV_PDU_TX_DESCRIPTORS_QUEUE_SIZE:
1346 if (p_drv_buf->tx_desc_size_set) {
1347 *p_tlv_buf = (u8 *)&p_drv_buf->tx_desc_size;
1348 return sizeof(p_drv_buf->tx_desc_size);
1351 case DRV_TLV_PDU_RX_DESCRIPTORS_QUEUE_SIZE:
1352 if (p_drv_buf->rx_desc_size_set) {
1353 *p_tlv_buf = (u8 *)&p_drv_buf->rx_desc_size;
1354 return sizeof(p_drv_buf->rx_desc_size);
1357 case DRV_TLV_ISCSI_BOOT_PROGRESS:
1358 if (p_drv_buf->boot_progress_set) {
1359 *p_tlv_buf = (u8 *)&p_drv_buf->boot_progress;
1360 return sizeof(p_drv_buf->boot_progress);
1363 case DRV_TLV_PDU_TX_DESCRIPTOR_QUEUE_AVG_DEPTH:
1364 if (p_drv_buf->tx_desc_qdepth_set) {
1365 *p_tlv_buf = (u8 *)&p_drv_buf->tx_desc_qdepth;
1366 return sizeof(p_drv_buf->tx_desc_qdepth);
1369 case DRV_TLV_PDU_RX_DESCRIPTORS_QUEUE_AVG_DEPTH:
1370 if (p_drv_buf->rx_desc_qdepth_set) {
1371 *p_tlv_buf = (u8 *)&p_drv_buf->rx_desc_qdepth;
1372 return sizeof(p_drv_buf->rx_desc_qdepth);
1375 case DRV_TLV_ISCSI_PDU_RX_FRAMES_RECEIVED:
1376 if (p_drv_buf->rx_frames_set) {
1377 *p_tlv_buf = (u8 *)&p_drv_buf->rx_frames;
1378 return sizeof(p_drv_buf->rx_frames);
1381 case DRV_TLV_ISCSI_PDU_RX_BYTES_RECEIVED:
1382 if (p_drv_buf->rx_bytes_set) {
1383 *p_tlv_buf = (u8 *)&p_drv_buf->rx_bytes;
1384 return sizeof(p_drv_buf->rx_bytes);
1387 case DRV_TLV_ISCSI_PDU_TX_FRAMES_SENT:
1388 if (p_drv_buf->tx_frames_set) {
1389 *p_tlv_buf = (u8 *)&p_drv_buf->tx_frames;
1390 return sizeof(p_drv_buf->tx_frames);
1393 case DRV_TLV_ISCSI_PDU_TX_BYTES_SENT:
1394 if (p_drv_buf->tx_bytes_set) {
1395 *p_tlv_buf = (u8 *)&p_drv_buf->tx_bytes;
1396 return sizeof(p_drv_buf->tx_bytes);
1406 static enum _ecore_status_t
1407 ecore_mfw_update_tlvs(u8 tlv_group, struct ecore_hwfn *p_hwfn,
1408 struct ecore_ptt *p_ptt, u8 *p_mfw_buf, u32 size)
1410 union ecore_mfw_tlv_data *p_tlv_data;
1411 struct ecore_drv_tlv_hdr tlv;
1412 u8 *p_tlv_ptr = OSAL_NULL, *p_temp;
1416 p_tlv_data = OSAL_VALLOC(p_hwfn->p_dev, sizeof(*p_tlv_data));
1420 OSAL_MEMSET(p_tlv_data, 0, sizeof(*p_tlv_data));
1421 if (OSAL_MFW_FILL_TLV_DATA(p_hwfn, tlv_group, p_tlv_data)) {
1422 OSAL_VFREE(p_hwfn->p_dev, p_tlv_data);
1427 OSAL_MEMSET(&tlv, 0, sizeof(tlv));
1428 while (offset < size) {
1429 p_temp = &p_mfw_buf[offset];
1430 tlv.tlv_type = TLV_TYPE(p_temp);
1431 tlv.tlv_length = TLV_LENGTH(p_temp);
1432 tlv.tlv_flags = TLV_FLAGS(p_temp);
1433 DP_INFO(p_hwfn, "Type %d length = %d flags = 0x%x\n",
1434 tlv.tlv_type, tlv.tlv_length, tlv.tlv_flags);
1436 offset += sizeof(tlv);
1437 if (tlv_group == ECORE_MFW_TLV_GENERIC)
1438 len = ecore_mfw_get_gen_tlv_value(&tlv,
1439 &p_tlv_data->generic, &p_tlv_ptr);
1440 else if (tlv_group == ECORE_MFW_TLV_ETH)
1441 len = ecore_mfw_get_eth_tlv_value(&tlv,
1442 &p_tlv_data->eth, &p_tlv_ptr);
1443 else if (tlv_group == ECORE_MFW_TLV_FCOE)
1444 len = ecore_mfw_get_fcoe_tlv_value(&tlv,
1445 &p_tlv_data->fcoe, &p_tlv_ptr);
1447 len = ecore_mfw_get_iscsi_tlv_value(&tlv,
1448 &p_tlv_data->iscsi, &p_tlv_ptr);
1451 OSAL_WARN(len > 4 * tlv.tlv_length,
1452 "Incorrect MFW TLV length");
1453 len = OSAL_MIN_T(int, len, 4 * tlv.tlv_length);
1454 tlv.tlv_flags |= ECORE_DRV_TLV_FLAGS_CHANGED;
1455 /* TODO: Endianness handling? */
1456 OSAL_MEMCPY(p_mfw_buf, &tlv, sizeof(tlv));
1457 OSAL_MEMCPY(p_mfw_buf + offset, p_tlv_ptr, len);
1460 offset += sizeof(u32) * tlv.tlv_length;
1463 OSAL_VFREE(p_hwfn->p_dev, p_tlv_data);
1465 return ECORE_SUCCESS;
1468 enum _ecore_status_t
1469 ecore_mfw_process_tlv_req(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt)
1471 u32 addr, size, offset, resp, param, val;
1472 u8 tlv_group = 0, id, *p_mfw_buf = OSAL_NULL, *p_temp;
1473 u32 global_offsize, global_addr;
1474 enum _ecore_status_t rc;
1475 struct ecore_drv_tlv_hdr tlv;
1477 addr = SECTION_OFFSIZE_ADDR(p_hwfn->mcp_info->public_base,
1479 global_offsize = ecore_rd(p_hwfn, p_ptt, addr);
1480 global_addr = SECTION_ADDR(global_offsize, 0);
1481 addr = global_addr + OFFSETOF(struct public_global, data_ptr);
1482 size = ecore_rd(p_hwfn, p_ptt, global_addr +
1483 OFFSETOF(struct public_global, data_size));
1486 DP_NOTICE(p_hwfn, false, "Invalid TLV req size = %d\n", size);
1490 p_mfw_buf = (void *)OSAL_VALLOC(p_hwfn->p_dev, size);
1492 DP_NOTICE(p_hwfn, false,
1493 "Failed allocate memory for p_mfw_buf\n");
1497 /* Read the TLV request to local buffer */
1498 for (offset = 0; offset < size; offset += sizeof(u32)) {
1499 val = ecore_rd(p_hwfn, p_ptt, addr + offset);
1500 OSAL_MEMCPY(&p_mfw_buf[offset], &val, sizeof(u32));
1503 /* Parse the headers to enumerate the requested TLV groups */
1504 for (offset = 0; offset < size;
1505 offset += sizeof(tlv) + sizeof(u32) * tlv.tlv_length) {
1506 p_temp = &p_mfw_buf[offset];
1507 tlv.tlv_type = TLV_TYPE(p_temp);
1508 tlv.tlv_length = TLV_LENGTH(p_temp);
1509 if (ecore_mfw_get_tlv_group(tlv.tlv_type, &tlv_group))
1513 /* Update the TLV values in the local buffer */
1514 for (id = ECORE_MFW_TLV_GENERIC; id < ECORE_MFW_TLV_MAX; id <<= 1) {
1515 if (tlv_group & id) {
1516 if (ecore_mfw_update_tlvs(id, p_hwfn, p_ptt, p_mfw_buf,
1522 /* Write the TLV data to shared memory */
1523 for (offset = 0; offset < size; offset += sizeof(u32)) {
1524 val = (u32)p_mfw_buf[offset];
1525 ecore_wr(p_hwfn, p_ptt, addr + offset, val);
1526 offset += sizeof(u32);
1530 rc = ecore_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_GET_TLV_DONE, 0, &resp,
1533 OSAL_VFREE(p_hwfn->p_dev, p_mfw_buf);