2 * Copyright (c) 2009-2015 Solarflare Communications Inc.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
15 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
16 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
21 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
22 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
23 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
24 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 * The views and conclusions contained in the software and documentation are
27 * those of the authors and should not be interpreted as representing official
28 * policies, either expressed or implied, of the FreeBSD Project.
31 #include <sys/cdefs.h>
32 __FBSDID("$FreeBSD$");
36 #include "efx_types.h"
44 static efx_nvram_ops_t __efx_nvram_falcon_ops = {
46 falcon_nvram_test, /* envo_test */
47 #endif /* EFSYS_OPT_DIAG */
48 falcon_nvram_size, /* envo_size */
49 falcon_nvram_get_version, /* envo_get_version */
50 falcon_nvram_rw_start, /* envo_rw_start */
51 falcon_nvram_read_chunk, /* envo_read_chunk */
52 falcon_nvram_erase, /* envo_erase */
53 falcon_nvram_write_chunk, /* envo_write_chunk */
54 falcon_nvram_rw_finish, /* envo_rw_finish */
55 falcon_nvram_set_version, /* envo_set_version */
58 #endif /* EFSYS_OPT_FALCON */
62 static efx_nvram_ops_t __efx_nvram_siena_ops = {
64 siena_nvram_test, /* envo_test */
65 #endif /* EFSYS_OPT_DIAG */
66 siena_nvram_size, /* envo_size */
67 siena_nvram_get_version, /* envo_get_version */
68 siena_nvram_rw_start, /* envo_rw_start */
69 siena_nvram_read_chunk, /* envo_read_chunk */
70 siena_nvram_erase, /* envo_erase */
71 siena_nvram_write_chunk, /* envo_write_chunk */
72 siena_nvram_rw_finish, /* envo_rw_finish */
73 siena_nvram_set_version, /* envo_set_version */
76 #endif /* EFSYS_OPT_SIENA */
78 #if EFSYS_OPT_HUNTINGTON
80 static efx_nvram_ops_t __efx_nvram_hunt_ops = {
82 hunt_nvram_test, /* envo_test */
83 #endif /* EFSYS_OPT_DIAG */
84 hunt_nvram_size, /* envo_size */
85 hunt_nvram_get_version, /* envo_get_version */
86 hunt_nvram_rw_start, /* envo_rw_start */
87 hunt_nvram_read_chunk, /* envo_read_chunk */
88 hunt_nvram_erase, /* envo_erase */
89 hunt_nvram_write_chunk, /* envo_write_chunk */
90 hunt_nvram_rw_finish, /* envo_rw_finish */
91 hunt_nvram_set_version, /* envo_set_version */
94 #endif /* EFSYS_OPT_HUNTINGTON */
100 efx_nvram_ops_t *envop;
103 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
104 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
105 EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_NVRAM));
107 switch (enp->en_family) {
109 case EFX_FAMILY_FALCON:
110 envop = (efx_nvram_ops_t *)&__efx_nvram_falcon_ops;
112 #endif /* EFSYS_OPT_FALCON */
115 case EFX_FAMILY_SIENA:
116 envop = (efx_nvram_ops_t *)&__efx_nvram_siena_ops;
118 #endif /* EFSYS_OPT_SIENA */
120 #if EFSYS_OPT_HUNTINGTON
121 case EFX_FAMILY_HUNTINGTON:
122 envop = (efx_nvram_ops_t *)&__efx_nvram_hunt_ops;
124 #endif /* EFSYS_OPT_HUNTINGTON */
132 enp->en_envop = envop;
133 enp->en_mod_flags |= EFX_MOD_NVRAM;
138 EFSYS_PROBE1(fail1, int, rc);
149 efx_nvram_ops_t *envop = enp->en_envop;
152 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
153 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_NVRAM);
155 if ((rc = envop->envo_test(enp)) != 0)
161 EFSYS_PROBE1(fail1, int, rc);
166 #endif /* EFSYS_OPT_DIAG */
171 __in efx_nvram_type_t type,
174 efx_nvram_ops_t *envop = enp->en_envop;
177 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
178 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_NVRAM);
180 EFSYS_ASSERT3U(type, <, EFX_NVRAM_NTYPES);
182 if ((rc = envop->envo_size(enp, type, sizep)) != 0)
188 EFSYS_PROBE1(fail1, int, rc);
194 efx_nvram_get_version(
196 __in efx_nvram_type_t type,
197 __out uint32_t *subtypep,
198 __out_ecount(4) uint16_t version[4])
200 efx_nvram_ops_t *envop = enp->en_envop;
203 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
204 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
205 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_NVRAM);
207 EFSYS_ASSERT3U(type, <, EFX_NVRAM_NTYPES);
209 if ((rc = envop->envo_get_version(enp, type, subtypep, version)) != 0)
215 EFSYS_PROBE1(fail1, int, rc);
223 __in efx_nvram_type_t type,
224 __out_opt size_t *chunk_sizep)
226 efx_nvram_ops_t *envop = enp->en_envop;
229 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
230 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_NVRAM);
232 EFSYS_ASSERT3U(type, <, EFX_NVRAM_NTYPES);
233 EFSYS_ASSERT3U(type, !=, EFX_NVRAM_INVALID);
235 EFSYS_ASSERT3U(enp->en_nvram_locked, ==, EFX_NVRAM_INVALID);
237 if ((rc = envop->envo_rw_start(enp, type, chunk_sizep)) != 0)
240 enp->en_nvram_locked = type;
245 EFSYS_PROBE1(fail1, int, rc);
251 efx_nvram_read_chunk(
253 __in efx_nvram_type_t type,
254 __in unsigned int offset,
255 __out_bcount(size) caddr_t data,
258 efx_nvram_ops_t *envop = enp->en_envop;
261 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
262 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_NVRAM);
264 EFSYS_ASSERT3U(type, <, EFX_NVRAM_NTYPES);
265 EFSYS_ASSERT3U(type, !=, EFX_NVRAM_INVALID);
267 EFSYS_ASSERT3U(enp->en_nvram_locked, ==, type);
269 if ((rc = envop->envo_read_chunk(enp, type, offset, data, size)) != 0)
275 EFSYS_PROBE1(fail1, int, rc);
283 __in efx_nvram_type_t type)
285 efx_nvram_ops_t *envop = enp->en_envop;
288 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
289 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_NVRAM);
291 EFSYS_ASSERT3U(type, <, EFX_NVRAM_NTYPES);
292 EFSYS_ASSERT3U(type, !=, EFX_NVRAM_INVALID);
294 EFSYS_ASSERT3U(enp->en_nvram_locked, ==, type);
296 if ((rc = envop->envo_erase(enp, type)) != 0)
302 EFSYS_PROBE1(fail1, int, rc);
308 efx_nvram_write_chunk(
310 __in efx_nvram_type_t type,
311 __in unsigned int offset,
312 __in_bcount(size) caddr_t data,
315 efx_nvram_ops_t *envop = enp->en_envop;
318 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
319 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_NVRAM);
321 EFSYS_ASSERT3U(type, <, EFX_NVRAM_NTYPES);
322 EFSYS_ASSERT3U(type, !=, EFX_NVRAM_INVALID);
324 EFSYS_ASSERT3U(enp->en_nvram_locked, ==, type);
326 if ((rc = envop->envo_write_chunk(enp, type, offset, data, size)) != 0)
332 EFSYS_PROBE1(fail1, int, rc);
340 __in efx_nvram_type_t type)
342 efx_nvram_ops_t *envop = enp->en_envop;
344 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
345 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_NVRAM);
347 EFSYS_ASSERT3U(type, <, EFX_NVRAM_NTYPES);
348 EFSYS_ASSERT3U(type, !=, EFX_NVRAM_INVALID);
350 EFSYS_ASSERT3U(enp->en_nvram_locked, ==, type);
352 envop->envo_rw_finish(enp, type);
354 enp->en_nvram_locked = EFX_NVRAM_INVALID;
358 efx_nvram_set_version(
360 __in efx_nvram_type_t type,
361 __in_ecount(4) uint16_t version[4])
363 efx_nvram_ops_t *envop = enp->en_envop;
366 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
367 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
368 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_NVRAM);
370 EFSYS_ASSERT3U(type, <, EFX_NVRAM_NTYPES);
373 * The Siena implementation of envo_set_version() will attempt to
374 * acquire the NVRAM_UPDATE lock for the DYNAMIC_CONFIG sector.
375 * Therefore, you can't have already acquired the NVRAM_UPDATE lock.
377 EFSYS_ASSERT3U(enp->en_nvram_locked, ==, EFX_NVRAM_INVALID);
379 if ((rc = envop->envo_set_version(enp, type, version)) != 0)
385 EFSYS_PROBE1(fail1, int, rc);
394 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
395 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
396 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_NVRAM);
398 EFSYS_ASSERT3U(enp->en_nvram_locked, ==, EFX_NVRAM_INVALID);
400 enp->en_envop = NULL;
401 enp->en_mod_flags &= ~EFX_MOD_NVRAM;
404 #endif /* EFSYS_OPT_NVRAM */
406 #if EFSYS_OPT_NVRAM || EFSYS_OPT_VPD
409 * Internal MCDI request handling
413 efx_mcdi_nvram_partitions(
415 __out_bcount(size) caddr_t data,
417 __out unsigned int *npartnp)
420 uint8_t payload[MAX(MC_CMD_NVRAM_PARTITIONS_IN_LEN,
421 MC_CMD_NVRAM_PARTITIONS_OUT_LENMAX)];
425 (void) memset(payload, 0, sizeof (payload));
426 req.emr_cmd = MC_CMD_NVRAM_PARTITIONS;
427 req.emr_in_buf = payload;
428 req.emr_in_length = MC_CMD_NVRAM_PARTITIONS_IN_LEN;
429 req.emr_out_buf = payload;
430 req.emr_out_length = MC_CMD_NVRAM_PARTITIONS_OUT_LENMAX;
432 efx_mcdi_execute(enp, &req);
434 if (req.emr_rc != 0) {
439 if (req.emr_out_length_used < MC_CMD_NVRAM_PARTITIONS_OUT_LENMIN) {
443 npartn = MCDI_OUT_DWORD(req, NVRAM_PARTITIONS_OUT_NUM_PARTITIONS);
445 if (req.emr_out_length_used < MC_CMD_NVRAM_PARTITIONS_OUT_LEN(npartn)) {
450 if (size < npartn * sizeof (uint32_t)) {
458 MCDI_OUT2(req, uint32_t, NVRAM_PARTITIONS_OUT_TYPE_ID),
459 (npartn * sizeof (uint32_t)));
468 EFSYS_PROBE1(fail1, int, rc);
474 efx_mcdi_nvram_metadata(
477 __out uint32_t *subtypep,
478 __out_ecount(4) uint16_t version[4],
479 __out_bcount_opt(size) char *descp,
483 uint8_t payload[MAX(MC_CMD_NVRAM_METADATA_IN_LEN,
484 MC_CMD_NVRAM_METADATA_OUT_LENMAX)];
487 (void) memset(payload, 0, sizeof (payload));
488 req.emr_cmd = MC_CMD_NVRAM_METADATA;
489 req.emr_in_buf = payload;
490 req.emr_in_length = MC_CMD_NVRAM_METADATA_IN_LEN;
491 req.emr_out_buf = payload;
492 req.emr_out_length = MC_CMD_NVRAM_METADATA_OUT_LENMAX;
494 MCDI_IN_SET_DWORD(req, NVRAM_METADATA_IN_TYPE, partn);
496 efx_mcdi_execute(enp, &req);
498 if (req.emr_rc != 0) {
503 if (req.emr_out_length_used < MC_CMD_NVRAM_METADATA_OUT_LENMIN) {
508 if (MCDI_OUT_DWORD_FIELD(req, NVRAM_METADATA_OUT_FLAGS,
509 NVRAM_METADATA_OUT_SUBTYPE_VALID)) {
510 *subtypep = MCDI_OUT_DWORD(req, NVRAM_METADATA_OUT_SUBTYPE);
515 if (MCDI_OUT_DWORD_FIELD(req, NVRAM_METADATA_OUT_FLAGS,
516 NVRAM_METADATA_OUT_VERSION_VALID)) {
517 version[0] = MCDI_OUT_WORD(req, NVRAM_METADATA_OUT_VERSION_W);
518 version[1] = MCDI_OUT_WORD(req, NVRAM_METADATA_OUT_VERSION_X);
519 version[2] = MCDI_OUT_WORD(req, NVRAM_METADATA_OUT_VERSION_Y);
520 version[3] = MCDI_OUT_WORD(req, NVRAM_METADATA_OUT_VERSION_Z);
522 version[0] = version[1] = version[2] = version[3] = 0;
525 if (MCDI_OUT_DWORD_FIELD(req, NVRAM_METADATA_OUT_FLAGS,
526 NVRAM_METADATA_OUT_DESCRIPTION_VALID)) {
527 /* Return optional descrition string */
528 if ((descp != NULL) && (size > 0)) {
532 desclen = (req.emr_out_length_used
533 - MC_CMD_NVRAM_METADATA_OUT_LEN(0));
535 EFSYS_ASSERT3U(desclen, <=,
536 MC_CMD_NVRAM_METADATA_OUT_DESCRIPTION_MAXNUM);
538 if (size < desclen) {
543 memcpy(descp, MCDI_OUT2(req, char,
544 NVRAM_METADATA_OUT_DESCRIPTION),
547 /* Ensure string is NUL terminated */
548 descp[desclen] = '\0';
559 EFSYS_PROBE1(fail1, int, rc);
568 __out_opt size_t *sizep,
569 __out_opt uint32_t *addressp,
570 __out_opt uint32_t *erase_sizep)
572 uint8_t payload[MAX(MC_CMD_NVRAM_INFO_IN_LEN,
573 MC_CMD_NVRAM_INFO_OUT_LEN)];
577 (void) memset(payload, 0, sizeof (payload));
578 req.emr_cmd = MC_CMD_NVRAM_INFO;
579 req.emr_in_buf = payload;
580 req.emr_in_length = MC_CMD_NVRAM_INFO_IN_LEN;
581 req.emr_out_buf = payload;
582 req.emr_out_length = MC_CMD_NVRAM_INFO_OUT_LEN;
584 MCDI_IN_SET_DWORD(req, NVRAM_INFO_IN_TYPE, partn);
586 efx_mcdi_execute_quiet(enp, &req);
588 if (req.emr_rc != 0) {
593 if (req.emr_out_length_used < MC_CMD_NVRAM_INFO_OUT_LEN) {
599 *sizep = MCDI_OUT_DWORD(req, NVRAM_INFO_OUT_SIZE);
602 *addressp = MCDI_OUT_DWORD(req, NVRAM_INFO_OUT_PHYSADDR);
605 *erase_sizep = MCDI_OUT_DWORD(req, NVRAM_INFO_OUT_ERASESIZE);
612 EFSYS_PROBE1(fail1, int, rc);
618 efx_mcdi_nvram_update_start(
622 uint8_t payload[MAX(MC_CMD_NVRAM_UPDATE_START_IN_LEN,
623 MC_CMD_NVRAM_UPDATE_START_OUT_LEN)];
627 (void) memset(payload, 0, sizeof (payload));
628 req.emr_cmd = MC_CMD_NVRAM_UPDATE_START;
629 req.emr_in_buf = payload;
630 req.emr_in_length = MC_CMD_NVRAM_UPDATE_START_IN_LEN;
631 req.emr_out_buf = payload;
632 req.emr_out_length = MC_CMD_NVRAM_UPDATE_START_OUT_LEN;
634 MCDI_IN_SET_DWORD(req, NVRAM_UPDATE_START_IN_TYPE, partn);
636 efx_mcdi_execute(enp, &req);
638 if (req.emr_rc != 0) {
646 EFSYS_PROBE1(fail1, int, rc);
655 __in uint32_t offset,
656 __out_bcount(size) caddr_t data,
660 uint8_t payload[MAX(MC_CMD_NVRAM_READ_IN_LEN,
661 MC_CMD_NVRAM_READ_OUT_LENMAX)];
664 if (size > MC_CMD_NVRAM_READ_OUT_LENMAX) {
669 (void) memset(payload, 0, sizeof (payload));
670 req.emr_cmd = MC_CMD_NVRAM_READ;
671 req.emr_in_buf = payload;
672 req.emr_in_length = MC_CMD_NVRAM_READ_IN_LEN;
673 req.emr_out_buf = payload;
674 req.emr_out_length = MC_CMD_NVRAM_READ_OUT_LENMAX;
676 MCDI_IN_SET_DWORD(req, NVRAM_READ_IN_TYPE, partn);
677 MCDI_IN_SET_DWORD(req, NVRAM_READ_IN_OFFSET, offset);
678 MCDI_IN_SET_DWORD(req, NVRAM_READ_IN_LENGTH, size);
680 efx_mcdi_execute(enp, &req);
682 if (req.emr_rc != 0) {
687 if (req.emr_out_length_used < MC_CMD_NVRAM_READ_OUT_LEN(size)) {
693 MCDI_OUT2(req, uint8_t, NVRAM_READ_OUT_READ_BUFFER),
701 EFSYS_PROBE1(fail1, int, rc);
707 efx_mcdi_nvram_erase(
710 __in uint32_t offset,
714 uint8_t payload[MAX(MC_CMD_NVRAM_ERASE_IN_LEN,
715 MC_CMD_NVRAM_ERASE_OUT_LEN)];
718 (void) memset(payload, 0, sizeof (payload));
719 req.emr_cmd = MC_CMD_NVRAM_ERASE;
720 req.emr_in_buf = payload;
721 req.emr_in_length = MC_CMD_NVRAM_ERASE_IN_LEN;
722 req.emr_out_buf = payload;
723 req.emr_out_length = MC_CMD_NVRAM_ERASE_OUT_LEN;
725 MCDI_IN_SET_DWORD(req, NVRAM_ERASE_IN_TYPE, partn);
726 MCDI_IN_SET_DWORD(req, NVRAM_ERASE_IN_OFFSET, offset);
727 MCDI_IN_SET_DWORD(req, NVRAM_ERASE_IN_LENGTH, size);
729 efx_mcdi_execute(enp, &req);
731 if (req.emr_rc != 0) {
739 EFSYS_PROBE1(fail1, int, rc);
745 efx_mcdi_nvram_write(
748 __in uint32_t offset,
749 __out_bcount(size) caddr_t data,
753 uint8_t payload[MAX(MC_CMD_NVRAM_WRITE_IN_LENMAX,
754 MC_CMD_NVRAM_WRITE_OUT_LEN)];
757 if (size > MC_CMD_NVRAM_WRITE_IN_LENMAX) {
762 (void) memset(payload, 0, sizeof (payload));
763 req.emr_cmd = MC_CMD_NVRAM_WRITE;
764 req.emr_in_buf = payload;
765 req.emr_in_length = MC_CMD_NVRAM_WRITE_IN_LEN(size);
766 req.emr_out_buf = payload;
767 req.emr_out_length = MC_CMD_NVRAM_WRITE_OUT_LEN;
769 MCDI_IN_SET_DWORD(req, NVRAM_WRITE_IN_TYPE, partn);
770 MCDI_IN_SET_DWORD(req, NVRAM_WRITE_IN_OFFSET, offset);
771 MCDI_IN_SET_DWORD(req, NVRAM_WRITE_IN_LENGTH, size);
773 memcpy(MCDI_IN2(req, uint8_t, NVRAM_WRITE_IN_WRITE_BUFFER),
776 efx_mcdi_execute(enp, &req);
778 if (req.emr_rc != 0) {
788 EFSYS_PROBE1(fail1, int, rc);
794 efx_mcdi_nvram_update_finish(
797 __in boolean_t reboot)
800 uint8_t payload[MAX(MC_CMD_NVRAM_UPDATE_FINISH_IN_LEN,
801 MC_CMD_NVRAM_UPDATE_FINISH_OUT_LEN)];
804 (void) memset(payload, 0, sizeof (payload));
805 req.emr_cmd = MC_CMD_NVRAM_UPDATE_FINISH;
806 req.emr_in_buf = payload;
807 req.emr_in_length = MC_CMD_NVRAM_UPDATE_FINISH_IN_LEN;
808 req.emr_out_buf = payload;
809 req.emr_out_length = MC_CMD_NVRAM_UPDATE_FINISH_OUT_LEN;
811 MCDI_IN_SET_DWORD(req, NVRAM_UPDATE_FINISH_IN_TYPE, partn);
812 MCDI_IN_SET_DWORD(req, NVRAM_UPDATE_FINISH_IN_REBOOT, reboot);
814 efx_mcdi_execute(enp, &req);
816 if (req.emr_rc != 0) {
824 EFSYS_PROBE1(fail1, int, rc);
837 uint8_t payload[MAX(MC_CMD_NVRAM_TEST_IN_LEN,
838 MC_CMD_NVRAM_TEST_OUT_LEN)];
842 (void) memset(payload, 0, sizeof (payload));
843 req.emr_cmd = MC_CMD_NVRAM_TEST;
844 req.emr_in_buf = payload;
845 req.emr_in_length = MC_CMD_NVRAM_TEST_IN_LEN;
846 req.emr_out_buf = payload;
847 req.emr_out_length = MC_CMD_NVRAM_TEST_OUT_LEN;
849 MCDI_IN_SET_DWORD(req, NVRAM_TEST_IN_TYPE, partn);
851 efx_mcdi_execute(enp, &req);
853 if (req.emr_rc != 0) {
858 if (req.emr_out_length_used < MC_CMD_NVRAM_TEST_OUT_LEN) {
863 result = MCDI_OUT_DWORD(req, NVRAM_TEST_OUT_RESULT);
864 if (result == MC_CMD_NVRAM_TEST_FAIL) {
866 EFSYS_PROBE1(nvram_test_failure, int, partn);
879 EFSYS_PROBE1(fail1, int, rc);
884 #endif /* EFSYS_OPT_DIAG */
887 #endif /* EFSYS_OPT_NVRAM || EFSYS_OPT_VPD */