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