2 * Copyright 2009 Solarflare Communications Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS AND
14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 #include <sys/cdefs.h>
27 __FBSDID("$FreeBSD$");
31 #include "efx_types.h"
39 static efx_nvram_ops_t __cs __efx_nvram_falcon_ops = {
41 falcon_nvram_test, /* envo_test */
42 #endif /* EFSYS_OPT_DIAG */
43 falcon_nvram_size, /* envo_size */
44 falcon_nvram_get_version, /* envo_get_version */
45 falcon_nvram_rw_start, /* envo_rw_start */
46 falcon_nvram_read_chunk, /* envo_read_chunk */
47 falcon_nvram_erase, /* envo_erase */
48 falcon_nvram_write_chunk, /* envo_write_chunk */
49 falcon_nvram_rw_finish, /* envo_rw_finish */
50 falcon_nvram_set_version, /* envo_set_version */
53 #endif /* EFSYS_OPT_FALCON */
57 static efx_nvram_ops_t __cs __efx_nvram_siena_ops = {
59 siena_nvram_test, /* envo_test */
60 #endif /* EFSYS_OPT_DIAG */
61 siena_nvram_size, /* envo_size */
62 siena_nvram_get_version, /* envo_get_version */
63 siena_nvram_rw_start, /* envo_rw_start */
64 siena_nvram_read_chunk, /* envo_read_chunk */
65 siena_nvram_erase, /* envo_erase */
66 siena_nvram_write_chunk, /* envo_write_chunk */
67 siena_nvram_rw_finish, /* envo_rw_finish */
68 siena_nvram_set_version, /* envo_set_version */
71 #endif /* EFSYS_OPT_SIENA */
77 efx_nvram_ops_t *envop;
80 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
81 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
82 EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_NVRAM));
84 switch (enp->en_family) {
86 case EFX_FAMILY_FALCON:
87 envop = (efx_nvram_ops_t *)&__efx_nvram_falcon_ops;
89 #endif /* EFSYS_OPT_FALCON */
92 case EFX_FAMILY_SIENA:
93 envop = (efx_nvram_ops_t *)&__efx_nvram_siena_ops;
95 #endif /* EFSYS_OPT_SIENA */
103 enp->en_envop = envop;
104 enp->en_mod_flags |= EFX_MOD_NVRAM;
109 EFSYS_PROBE1(fail1, int, rc);
120 efx_nvram_ops_t *envop = enp->en_envop;
123 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
124 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_NVRAM);
126 if ((rc = envop->envo_test(enp)) != 0)
132 EFSYS_PROBE1(fail1, int, rc);
137 #endif /* EFSYS_OPT_DIAG */
142 __in efx_nvram_type_t type,
145 efx_nvram_ops_t *envop = enp->en_envop;
148 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
149 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_NVRAM);
151 EFSYS_ASSERT3U(type, <, EFX_NVRAM_NTYPES);
153 if ((rc = envop->envo_size(enp, type, sizep)) != 0)
159 EFSYS_PROBE1(fail1, int, rc);
165 efx_nvram_get_version(
167 __in efx_nvram_type_t type,
168 __out uint32_t *subtypep,
169 __out_ecount(4) uint16_t version[4])
171 efx_nvram_ops_t *envop = enp->en_envop;
174 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
175 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
176 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_NVRAM);
178 EFSYS_ASSERT3U(type, <, EFX_NVRAM_NTYPES);
180 if ((rc = envop->envo_get_version(enp, type, subtypep, version)) != 0)
186 EFSYS_PROBE1(fail1, int, rc);
194 __in efx_nvram_type_t type,
195 __out_opt size_t *chunk_sizep)
197 efx_nvram_ops_t *envop = enp->en_envop;
200 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
201 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_NVRAM);
203 EFSYS_ASSERT3U(type, <, EFX_NVRAM_NTYPES);
204 EFSYS_ASSERT3U(type, !=, EFX_NVRAM_INVALID);
206 EFSYS_ASSERT3U(enp->en_nvram_locked, ==, EFX_NVRAM_INVALID);
208 if ((rc = envop->envo_rw_start(enp, type, chunk_sizep)) != 0)
211 enp->en_nvram_locked = type;
216 EFSYS_PROBE1(fail1, int, rc);
222 efx_nvram_read_chunk(
224 __in efx_nvram_type_t type,
225 __in unsigned int offset,
226 __out_bcount(size) caddr_t data,
229 efx_nvram_ops_t *envop = enp->en_envop;
232 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
233 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_NVRAM);
235 EFSYS_ASSERT3U(type, <, EFX_NVRAM_NTYPES);
236 EFSYS_ASSERT3U(type, !=, EFX_NVRAM_INVALID);
238 EFSYS_ASSERT3U(enp->en_nvram_locked, ==, type);
240 if ((rc = envop->envo_read_chunk(enp, type, offset, data, size)) != 0)
246 EFSYS_PROBE1(fail1, int, rc);
254 __in efx_nvram_type_t type)
256 efx_nvram_ops_t *envop = enp->en_envop;
259 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
260 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_NVRAM);
262 EFSYS_ASSERT3U(type, <, EFX_NVRAM_NTYPES);
263 EFSYS_ASSERT3U(type, !=, EFX_NVRAM_INVALID);
265 EFSYS_ASSERT3U(enp->en_nvram_locked, ==, type);
267 if ((rc = envop->envo_erase(enp, type)) != 0)
273 EFSYS_PROBE1(fail1, int, rc);
279 efx_nvram_write_chunk(
281 __in efx_nvram_type_t type,
282 __in unsigned int offset,
283 __in_bcount(size) caddr_t data,
286 efx_nvram_ops_t *envop = enp->en_envop;
289 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
290 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_NVRAM);
292 EFSYS_ASSERT3U(type, <, EFX_NVRAM_NTYPES);
293 EFSYS_ASSERT3U(type, !=, EFX_NVRAM_INVALID);
295 EFSYS_ASSERT3U(enp->en_nvram_locked, ==, type);
297 if ((rc = envop->envo_write_chunk(enp, type, offset, data, size)) != 0)
303 EFSYS_PROBE1(fail1, int, rc);
311 __in efx_nvram_type_t type)
313 efx_nvram_ops_t *envop = enp->en_envop;
315 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
316 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_NVRAM);
318 EFSYS_ASSERT3U(type, <, EFX_NVRAM_NTYPES);
319 EFSYS_ASSERT3U(type, !=, EFX_NVRAM_INVALID);
321 EFSYS_ASSERT3U(enp->en_nvram_locked, ==, type);
323 envop->envo_rw_finish(enp, type);
325 enp->en_nvram_locked = EFX_NVRAM_INVALID;
329 efx_nvram_set_version(
331 __in efx_nvram_type_t type,
332 __out uint16_t version[4])
334 efx_nvram_ops_t *envop = enp->en_envop;
337 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
338 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
339 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_NVRAM);
341 EFSYS_ASSERT3U(type, <, EFX_NVRAM_NTYPES);
344 * The Siena implementation of envo_set_version() will attempt to
345 * acquire the NVRAM_UPDATE lock for the DYNAMIC_CONFIG sector.
346 * Therefore, you can't have already acquired the NVRAM_UPDATE lock.
348 EFSYS_ASSERT3U(enp->en_nvram_locked, ==, EFX_NVRAM_INVALID);
350 if ((rc = envop->envo_set_version(enp, type, version)) != 0)
356 EFSYS_PROBE1(fail1, int, rc);
365 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
366 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
367 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_NVRAM);
369 EFSYS_ASSERT3U(enp->en_nvram_locked, ==, EFX_NVRAM_INVALID);
371 enp->en_envop = NULL;
372 enp->en_mod_flags &= ~EFX_MOD_NVRAM;
375 #endif /* EFSYS_OPT_NVRAM */