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