1 /*
2 * Copyright 2007-2013 Solarflare Communications Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
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.
12 *
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
23 * SUCH DAMAGE.
24 */
25
26 #include "efsys.h"
27 #include "efx.h"
28 #include "efx_types.h"
29 #include "efx_regs.h"
30 #include "efx_impl.h"
31
32 #if EFSYS_OPT_MON_NULL
33 #include "nullmon.h"
34 #endif
35
36 #if EFSYS_OPT_MON_LM87
37 #include "lm87.h"
38 #endif
39
40 #if EFSYS_OPT_MON_MAX6647
41 #include "max6647.h"
42 #endif
43
44 #if EFSYS_OPT_NAMES
45
46 static const char __cs * __cs __efx_mon_name[] = {
47 "",
48 "nullmon",
49 "lm87",
50 "max6647",
51 "sfx90x0"
52 };
53
54 const char __cs *
55 efx_mon_name(
56 __in efx_nic_t *enp)
57 {
58 efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
59
60 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
61
62 EFSYS_ASSERT(encp->enc_mon_type != EFX_MON_INVALID);
63 EFSYS_ASSERT3U(encp->enc_mon_type, <, EFX_MON_NTYPES);
64 return (__efx_mon_name[encp->enc_mon_type]);
65 }
66
67 #endif /* EFSYS_OPT_NAMES */
68
69 #if EFSYS_OPT_MON_NULL
70 static efx_mon_ops_t __cs __efx_mon_null_ops = {
71 nullmon_reset, /* emo_reset */
72 nullmon_reconfigure, /* emo_reconfigure */
73 #if EFSYS_OPT_MON_STATS
74 nullmon_stats_update /* emo_stat_update */
75 #endif /* EFSYS_OPT_MON_STATS */
76 };
77 #endif
78
79 #if EFSYS_OPT_MON_LM87
80 static efx_mon_ops_t __cs __efx_mon_lm87_ops = {
81 lm87_reset, /* emo_reset */
82 lm87_reconfigure, /* emo_reconfigure */
83 #if EFSYS_OPT_MON_STATS
84 lm87_stats_update /* emo_stat_update */
85 #endif /* EFSYS_OPT_MON_STATS */
86 };
87 #endif
88
89 #if EFSYS_OPT_MON_MAX6647
90 static efx_mon_ops_t __cs __efx_mon_max6647_ops = {
91 max6647_reset, /* emo_reset */
92 max6647_reconfigure, /* emo_reconfigure */
93 #if EFSYS_OPT_MON_STATS
94 max6647_stats_update /* emo_stat_update */
95 #endif /* EFSYS_OPT_MON_STATS */
96 };
97 #endif
98
99 #if EFSYS_OPT_MON_SIENA
100 static efx_mon_ops_t __cs __efx_mon_siena_ops = {
101 siena_mon_reset, /* emo_reset */
102 siena_mon_reconfigure, /* emo_reconfigure */
103 #if EFSYS_OPT_MON_STATS
104 siena_mon_stats_update /* emo_stat_update */
105 #endif /* EFSYS_OPT_MON_STATS */
106 };
107 #endif
108
109
110 static efx_mon_ops_t __cs * __cs __efx_mon_ops[] = {
111 NULL,
112 #if EFSYS_OPT_MON_NULL
113 &__efx_mon_null_ops,
114 #else
115 NULL,
116 #endif
117 #if EFSYS_OPT_MON_LM87
118 &__efx_mon_lm87_ops,
119 #else
120 NULL,
121 #endif
122 #if EFSYS_OPT_MON_MAX6647
123 &__efx_mon_max6647_ops,
124 #else
125 NULL,
126 #endif
127 #if EFSYS_OPT_MON_SIENA
128 &__efx_mon_siena_ops
129 #else
130 NULL
131 #endif
132 };
133
134 __checkReturn int
135 efx_mon_init(
136 __in efx_nic_t *enp)
137 {
138 efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
139 efx_mon_t *emp = &(enp->en_mon);
140 efx_mon_ops_t *emop;
141 int rc;
142
143 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
144 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
145
146 if (enp->en_mod_flags & EFX_MOD_MON) {
147 rc = EINVAL;
148 goto fail1;
149 }
150
151 enp->en_mod_flags |= EFX_MOD_MON;
152
153 emp->em_type = encp->enc_mon_type;
154
155 EFSYS_ASSERT(encp->enc_mon_type != EFX_MON_INVALID);
156 EFSYS_ASSERT3U(emp->em_type, <, EFX_MON_NTYPES);
157 if ((emop = (efx_mon_ops_t *)__efx_mon_ops[emp->em_type]) == NULL) {
158 rc = ENOTSUP;
159 goto fail2;
160 }
161
162 if ((rc = emop->emo_reset(enp)) != 0)
163 goto fail3;
164
165 if ((rc = emop->emo_reconfigure(enp)) != 0)
166 goto fail4;
167
168 emp->em_emop = emop;
169 return (0);
170
171 fail4:
172 EFSYS_PROBE(fail5);
173
174 (void) emop->emo_reset(enp);
175
176 fail3:
177 EFSYS_PROBE(fail4);
178 fail2:
179 EFSYS_PROBE(fail3);
180
181 emp->em_type = EFX_MON_INVALID;
182
183 enp->en_mod_flags &= ~EFX_MOD_MON;
184
185 fail1:
186 EFSYS_PROBE1(fail1, int, rc);
187
188 return (rc);
189 }
190
191 #if EFSYS_OPT_MON_STATS
192
193 #if EFSYS_OPT_NAMES
194
195 /* START MKCONFIG GENERATED MonitorStatNamesBlock cc98f339ca74c6b8 */
196 static const char __cs * __cs __mon_stat_name[] = {
197 "value_2_5v",
198 "value_vccp1",
199 "value_vcc",
200 "value_5v",
201 "value_12v",
202 "value_vccp2",
203 "value_ext_temp",
204 "value_int_temp",
205 "value_ain1",
206 "value_ain2",
207 "controller_cooling",
208 "ext_cooling",
209 "1v",
210 "1_2v",
211 "1_8v",
212 "3_3v",
213 "1_2va",
214 "vref",
215 };
216
217 /* END MKCONFIG GENERATED MonitorStatNamesBlock */
218
219 extern const char __cs *
220 efx_mon_stat_name(
221 __in efx_nic_t *enp,
222 __in efx_mon_stat_t id)
223 {
224 _NOTE(ARGUNUSED(enp))
225 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
226
227 EFSYS_ASSERT3U(id, <, EFX_MON_NSTATS);
228 return (__mon_stat_name[id]);
229 }
230
231 #endif /* EFSYS_OPT_NAMES */
232
233 __checkReturn int
234 efx_mon_stats_update(
235 __in efx_nic_t *enp,
236 __in efsys_mem_t *esmp,
237 __out_ecount(EFX_MON_NSTATS) efx_mon_stat_value_t *values)
238 {
239 efx_mon_t *emp = &(enp->en_mon);
240 efx_mon_ops_t *emop = emp->em_emop;
241
242 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
243 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_MON);
244
245 return (emop->emo_stats_update(enp, esmp, values));
246 }
247
248 #endif /* EFSYS_OPT_MON_STATS */
249
250 void
251 efx_mon_fini(
252 __in efx_nic_t *enp)
253 {
254 efx_mon_t *emp = &(enp->en_mon);
255 efx_mon_ops_t *emop = emp->em_emop;
256 int rc;
257
258 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
259 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
260 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_MON);
261
262 emp->em_emop = NULL;
263
264 rc = emop->emo_reset(enp);
265 if (rc != 0)
266 EFSYS_PROBE1(fail1, int, rc);
267
268 emp->em_type = EFX_MON_INVALID;
269
270 enp->en_mod_flags &= ~EFX_MOD_MON;
271 }