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