Home | History | Annotate | Download | only in dmfe
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 /*
     22  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
     23  * Use is subject to license terms.
     24  */
     25 
     26 #include "dmfe_impl.h"
     27 
     28 /*
     29  *	========== Message printing & debug routines ==========
     30  */
     31 
     32 static struct {
     33 	kmutex_t mutex[1];
     34 	const char *ifname;
     35 	const char *fmt;
     36 	int level;
     37 } prtdata;
     38 
     39 void
     40 dmfe_log_init()
     41 {
     42 	mutex_init(prtdata.mutex, NULL, MUTEX_DRIVER, NULL);
     43 }
     44 
     45 void
     46 dmfe_log_fini()
     47 {
     48 	mutex_destroy(prtdata.mutex);
     49 }
     50 
     51 /*
     52  * Backend print routine for all the routines below
     53  */
     54 static void
     55 dmfe_vprt(const char *fmt, va_list args)
     56 {
     57 	char buf[128];
     58 
     59 	ASSERT(mutex_owned(prtdata.mutex));
     60 
     61 	(void) vsnprintf(buf, sizeof (buf), fmt, args);
     62 	cmn_err(prtdata.level, prtdata.fmt, prtdata.ifname, buf);
     63 }
     64 
     65 /*
     66  * Report a run-time error (CE_WARN, to console & log)
     67  * Also logs all the chip's operating registers
     68  */
     69 void
     70 dmfe_warning(dmfe_t *dmfep, const char *fmt, ...)
     71 {
     72 	va_list args;
     73 	uint32_t reg;
     74 	int i;
     75 
     76 	mutex_enter(prtdata.mutex);
     77 	prtdata.ifname = dmfep->ifname;
     78 	prtdata.fmt = "%s: %s";
     79 	prtdata.level = CE_WARN;
     80 
     81 	va_start(args, fmt);
     82 	dmfe_vprt(fmt, args);
     83 	va_end(args);
     84 
     85 	/*
     86 	 * Record all the chip registers in the logfile
     87 	 */
     88 	for (i = 0; i < 16; ++i) {
     89 		reg = dmfe_chip_get32(dmfep, 8*i);
     90 		cmn_err(CE_NOTE, "!%s: CR%d\t%08x", dmfep->ifname, i, reg);
     91 	}
     92 
     93 	mutex_exit(prtdata.mutex);
     94 }
     95 
     96 /*
     97  * Log a programming error (CE_WARN, log only)
     98  */
     99 void
    100 dmfe_error(dmfe_t *dmfep, const char *fmt, ...)
    101 {
    102 	va_list args;
    103 
    104 	mutex_enter(prtdata.mutex);
    105 	prtdata.ifname = dmfep->ifname;
    106 	prtdata.fmt = "!%s: %s";
    107 	prtdata.level = CE_WARN;
    108 
    109 	va_start(args, fmt);
    110 	dmfe_vprt(fmt, args);
    111 	va_end(args);
    112 
    113 	mutex_exit(prtdata.mutex);
    114 }
    115 
    116 /*
    117  * Report a run-time event (CE_NOTE, to console & log)
    118  */
    119 void
    120 dmfe_notice(dmfe_t *dmfep, const char *fmt, ...)
    121 {
    122 	va_list args;
    123 
    124 	mutex_enter(prtdata.mutex);
    125 	prtdata.ifname = dmfep->ifname;
    126 	prtdata.fmt = "%s: %s";
    127 	prtdata.level = CE_NOTE;
    128 
    129 	va_start(args, fmt);
    130 	dmfe_vprt(fmt, args);
    131 	va_end(args);
    132 
    133 	mutex_exit(prtdata.mutex);
    134 }
    135 
    136 /*
    137  * Log a run-time event (CE_NOTE, log only)
    138  */
    139 void
    140 dmfe_log(dmfe_t *dmfep, const char *fmt, ...)
    141 {
    142 	va_list args;
    143 
    144 	mutex_enter(prtdata.mutex);
    145 	prtdata.ifname = dmfep->ifname;
    146 	prtdata.fmt = "!%s: %s";
    147 	prtdata.level = CE_NOTE;
    148 
    149 	va_start(args, fmt);
    150 	dmfe_vprt(fmt, args);
    151 	va_end(args);
    152 
    153 	mutex_exit(prtdata.mutex);
    154 }
    155