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