1 /*- 2 * Copyright 2007-2009 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 08518fd1fb4e2612 */ 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 }; 214 215 /* END MKCONFIG GENERATED MonitorStatNamesBlock */ 216 217 extern const char __cs * 218 efx_mon_stat_name( 219 __in efx_nic_t *enp, 220 __in efx_mon_stat_t id) 221 { 222 _NOTE(ARGUNUSED(enp)) 223 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC); 224 225 EFSYS_ASSERT3U(id, <, EFX_MON_NSTATS); 226 return (__mon_stat_name[id]); 227 } 228 229 #endif /* EFSYS_OPT_NAMES */ 230 231 __checkReturn int 232 efx_mon_stats_update( 233 __in efx_nic_t *enp, 234 __in efsys_mem_t *esmp, 235 __out_ecount(EFX_MON_NSTATS) efx_mon_stat_value_t *values) 236 { 237 efx_mon_t *emp = &(enp->en_mon); 238 efx_mon_ops_t *emop = emp->em_emop; 239 240 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC); 241 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_MON); 242 243 return (emop->emo_stats_update(enp, esmp, values)); 244 } 245 246 #endif /* EFSYS_OPT_MON_STATS */ 247 248 void 249 efx_mon_fini( 250 __in efx_nic_t *enp) 251 { 252 efx_mon_t *emp = &(enp->en_mon); 253 efx_mon_ops_t *emop = emp->em_emop; 254 int rc; 255 256 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC); 257 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE); 258 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_MON); 259 260 emp->em_emop = NULL; 261 262 rc = emop->emo_reset(enp); 263 if (rc != 0) 264 EFSYS_PROBE1(fail1, int, rc); 265 266 emp->em_type = EFX_MON_INVALID; 267 268 enp->en_mod_flags &= ~EFX_MOD_MON; 269 } 270