xref: /onnv-gate/usr/src/uts/common/io/ib/clients/eoib/enx_log.c (revision 13101:da7b13ec3a28)
1*13101SVenki.Rajagopalan@Sun.COM /*
2*13101SVenki.Rajagopalan@Sun.COM  * CDDL HEADER START
3*13101SVenki.Rajagopalan@Sun.COM  *
4*13101SVenki.Rajagopalan@Sun.COM  * The contents of this file are subject to the terms of the
5*13101SVenki.Rajagopalan@Sun.COM  * Common Development and Distribution License (the "License").
6*13101SVenki.Rajagopalan@Sun.COM  * You may not use this file except in compliance with the License.
7*13101SVenki.Rajagopalan@Sun.COM  *
8*13101SVenki.Rajagopalan@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*13101SVenki.Rajagopalan@Sun.COM  * or http://www.opensolaris.org/os/licensing.
10*13101SVenki.Rajagopalan@Sun.COM  * See the License for the specific language governing permissions
11*13101SVenki.Rajagopalan@Sun.COM  * and limitations under the License.
12*13101SVenki.Rajagopalan@Sun.COM  *
13*13101SVenki.Rajagopalan@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
14*13101SVenki.Rajagopalan@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*13101SVenki.Rajagopalan@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
16*13101SVenki.Rajagopalan@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
17*13101SVenki.Rajagopalan@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
18*13101SVenki.Rajagopalan@Sun.COM  *
19*13101SVenki.Rajagopalan@Sun.COM  * CDDL HEADER END
20*13101SVenki.Rajagopalan@Sun.COM  */
21*13101SVenki.Rajagopalan@Sun.COM 
22*13101SVenki.Rajagopalan@Sun.COM /*
23*13101SVenki.Rajagopalan@Sun.COM  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
24*13101SVenki.Rajagopalan@Sun.COM  */
25*13101SVenki.Rajagopalan@Sun.COM 
26*13101SVenki.Rajagopalan@Sun.COM #include <sys/types.h>
27*13101SVenki.Rajagopalan@Sun.COM #include <sys/kmem.h>
28*13101SVenki.Rajagopalan@Sun.COM #include <sys/cmn_err.h>
29*13101SVenki.Rajagopalan@Sun.COM #include <sys/conf.h>
30*13101SVenki.Rajagopalan@Sun.COM #include <sys/ddi.h>
31*13101SVenki.Rajagopalan@Sun.COM #include <sys/sunddi.h>
32*13101SVenki.Rajagopalan@Sun.COM #include <sys/ksynch.h>
33*13101SVenki.Rajagopalan@Sun.COM #include <sys/varargs.h>
34*13101SVenki.Rajagopalan@Sun.COM 
35*13101SVenki.Rajagopalan@Sun.COM #include <sys/ib/clients/eoib/enx_impl.h>
36*13101SVenki.Rajagopalan@Sun.COM 
37*13101SVenki.Rajagopalan@Sun.COM /*
38*13101SVenki.Rajagopalan@Sun.COM  * Defaults
39*13101SVenki.Rajagopalan@Sun.COM  */
40*13101SVenki.Rajagopalan@Sun.COM uint_t enx_log_size = ENX_LOGSZ_DEFAULT;
41*13101SVenki.Rajagopalan@Sun.COM int enx_log_level = ENX_MSGS_DEFAULT | ENX_MSGS_DEBUG;
42*13101SVenki.Rajagopalan@Sun.COM int enx_log_timestamps = 0;
43*13101SVenki.Rajagopalan@Sun.COM 
44*13101SVenki.Rajagopalan@Sun.COM /*
45*13101SVenki.Rajagopalan@Sun.COM  * Debug variables, should not be tunables so allocated debug buffer
46*13101SVenki.Rajagopalan@Sun.COM  * and its size remain consistent.
47*13101SVenki.Rajagopalan@Sun.COM  */
48*13101SVenki.Rajagopalan@Sun.COM static kmutex_t enx_debug_buf_lock;
49*13101SVenki.Rajagopalan@Sun.COM static uint8_t *enx_debug_buf;
50*13101SVenki.Rajagopalan@Sun.COM static uint32_t enx_debug_buf_ndx;
51*13101SVenki.Rajagopalan@Sun.COM static uint_t enx_debug_buf_sz;
52*13101SVenki.Rajagopalan@Sun.COM 
53*13101SVenki.Rajagopalan@Sun.COM static void eibnx_log(char *);
54*13101SVenki.Rajagopalan@Sun.COM 
55*13101SVenki.Rajagopalan@Sun.COM void
eibnx_debug_init(void)56*13101SVenki.Rajagopalan@Sun.COM eibnx_debug_init(void)
57*13101SVenki.Rajagopalan@Sun.COM {
58*13101SVenki.Rajagopalan@Sun.COM 	enx_debug_buf_ndx = 0;
59*13101SVenki.Rajagopalan@Sun.COM 	enx_debug_buf_sz = enx_log_size;
60*13101SVenki.Rajagopalan@Sun.COM 	enx_debug_buf = kmem_zalloc(enx_debug_buf_sz, KM_SLEEP);
61*13101SVenki.Rajagopalan@Sun.COM 
62*13101SVenki.Rajagopalan@Sun.COM 	mutex_init(&enx_debug_buf_lock, NULL, MUTEX_DRIVER, NULL);
63*13101SVenki.Rajagopalan@Sun.COM }
64*13101SVenki.Rajagopalan@Sun.COM 
65*13101SVenki.Rajagopalan@Sun.COM void
eibnx_debug_fini(void)66*13101SVenki.Rajagopalan@Sun.COM eibnx_debug_fini(void)
67*13101SVenki.Rajagopalan@Sun.COM {
68*13101SVenki.Rajagopalan@Sun.COM 	mutex_destroy(&enx_debug_buf_lock);
69*13101SVenki.Rajagopalan@Sun.COM 
70*13101SVenki.Rajagopalan@Sun.COM 	if (enx_debug_buf && enx_debug_buf_sz) {
71*13101SVenki.Rajagopalan@Sun.COM 		kmem_free(enx_debug_buf, enx_debug_buf_sz);
72*13101SVenki.Rajagopalan@Sun.COM 		enx_debug_buf = NULL;
73*13101SVenki.Rajagopalan@Sun.COM 	}
74*13101SVenki.Rajagopalan@Sun.COM 	enx_debug_buf_sz = 0;
75*13101SVenki.Rajagopalan@Sun.COM 	enx_debug_buf_ndx = 0;
76*13101SVenki.Rajagopalan@Sun.COM }
77*13101SVenki.Rajagopalan@Sun.COM 
78*13101SVenki.Rajagopalan@Sun.COM void
eibnx_log(char * msg)79*13101SVenki.Rajagopalan@Sun.COM eibnx_log(char *msg)
80*13101SVenki.Rajagopalan@Sun.COM {
81*13101SVenki.Rajagopalan@Sun.COM 	uint32_t off;
82*13101SVenki.Rajagopalan@Sun.COM 	int msglen;
83*13101SVenki.Rajagopalan@Sun.COM 	char msgbuf[ENX_MAX_LINE];
84*13101SVenki.Rajagopalan@Sun.COM 
85*13101SVenki.Rajagopalan@Sun.COM 	if (enx_debug_buf == NULL)
86*13101SVenki.Rajagopalan@Sun.COM 		return;
87*13101SVenki.Rajagopalan@Sun.COM 
88*13101SVenki.Rajagopalan@Sun.COM 	if (enx_log_timestamps) {
89*13101SVenki.Rajagopalan@Sun.COM 		msglen = snprintf(msgbuf, ENX_MAX_LINE, "%llx: %s",
90*13101SVenki.Rajagopalan@Sun.COM 		    (unsigned long long)ddi_get_lbolt64(), msg);
91*13101SVenki.Rajagopalan@Sun.COM 	} else {
92*13101SVenki.Rajagopalan@Sun.COM 		msglen = snprintf(msgbuf, ENX_MAX_LINE, "%s", msg);
93*13101SVenki.Rajagopalan@Sun.COM 	}
94*13101SVenki.Rajagopalan@Sun.COM 
95*13101SVenki.Rajagopalan@Sun.COM 	if (msglen < 0)
96*13101SVenki.Rajagopalan@Sun.COM 		return;
97*13101SVenki.Rajagopalan@Sun.COM 	else if (msglen >= ENX_MAX_LINE)
98*13101SVenki.Rajagopalan@Sun.COM 		msglen = ENX_MAX_LINE - 1;
99*13101SVenki.Rajagopalan@Sun.COM 
100*13101SVenki.Rajagopalan@Sun.COM 	mutex_enter(&enx_debug_buf_lock);
101*13101SVenki.Rajagopalan@Sun.COM 
102*13101SVenki.Rajagopalan@Sun.COM 	if ((enx_debug_buf_ndx == 0) ||
103*13101SVenki.Rajagopalan@Sun.COM 	    (enx_debug_buf[enx_debug_buf_ndx-1] != '\n')) {
104*13101SVenki.Rajagopalan@Sun.COM 		enx_debug_buf[enx_debug_buf_ndx] = '\n';
105*13101SVenki.Rajagopalan@Sun.COM 		enx_debug_buf_ndx++;
106*13101SVenki.Rajagopalan@Sun.COM 	}
107*13101SVenki.Rajagopalan@Sun.COM 
108*13101SVenki.Rajagopalan@Sun.COM 	off = enx_debug_buf_ndx;	/* current msg should go here */
109*13101SVenki.Rajagopalan@Sun.COM 
110*13101SVenki.Rajagopalan@Sun.COM 	enx_debug_buf_ndx += msglen;	/* next msg should start here */
111*13101SVenki.Rajagopalan@Sun.COM 	enx_debug_buf[enx_debug_buf_ndx] = 0;	/* terminate current msg */
112*13101SVenki.Rajagopalan@Sun.COM 
113*13101SVenki.Rajagopalan@Sun.COM 	if (enx_debug_buf_ndx >= (enx_debug_buf_sz - 2 * ENX_MAX_LINE))
114*13101SVenki.Rajagopalan@Sun.COM 		enx_debug_buf_ndx = 0;
115*13101SVenki.Rajagopalan@Sun.COM 
116*13101SVenki.Rajagopalan@Sun.COM 	mutex_exit(&enx_debug_buf_lock);
117*13101SVenki.Rajagopalan@Sun.COM 
118*13101SVenki.Rajagopalan@Sun.COM 	bcopy(msgbuf, enx_debug_buf+off, msglen);    /* no lock needed */
119*13101SVenki.Rajagopalan@Sun.COM }
120*13101SVenki.Rajagopalan@Sun.COM 
121*13101SVenki.Rajagopalan@Sun.COM #ifdef ENX_DEBUG
122*13101SVenki.Rajagopalan@Sun.COM void
eibnx_dprintf_verbose(const char * fmt,...)123*13101SVenki.Rajagopalan@Sun.COM eibnx_dprintf_verbose(const char *fmt, ...)
124*13101SVenki.Rajagopalan@Sun.COM {
125*13101SVenki.Rajagopalan@Sun.COM 	va_list ap;
126*13101SVenki.Rajagopalan@Sun.COM 	int msglen;
127*13101SVenki.Rajagopalan@Sun.COM 	char msgbuf[ENX_MAX_LINE];
128*13101SVenki.Rajagopalan@Sun.COM 	char newfmt[ENX_MAX_LINE];
129*13101SVenki.Rajagopalan@Sun.COM 
130*13101SVenki.Rajagopalan@Sun.COM 	if ((enx_log_level & ENX_MSGS_VERBOSE) != ENX_MSGS_VERBOSE)
131*13101SVenki.Rajagopalan@Sun.COM 		return;
132*13101SVenki.Rajagopalan@Sun.COM 
133*13101SVenki.Rajagopalan@Sun.COM 	(void) snprintf(newfmt, ENX_MAX_LINE, "..........%s", fmt);
134*13101SVenki.Rajagopalan@Sun.COM 
135*13101SVenki.Rajagopalan@Sun.COM 	va_start(ap, fmt);
136*13101SVenki.Rajagopalan@Sun.COM 	msglen = vsnprintf(msgbuf, ENX_MAX_LINE, newfmt, ap);
137*13101SVenki.Rajagopalan@Sun.COM 	va_end(ap);
138*13101SVenki.Rajagopalan@Sun.COM 
139*13101SVenki.Rajagopalan@Sun.COM 	if (msglen > 0) {
140*13101SVenki.Rajagopalan@Sun.COM 		eibnx_log(msgbuf);
141*13101SVenki.Rajagopalan@Sun.COM 	}
142*13101SVenki.Rajagopalan@Sun.COM }
143*13101SVenki.Rajagopalan@Sun.COM 
144*13101SVenki.Rajagopalan@Sun.COM void
eibnx_dprintf_args(const char * fmt,...)145*13101SVenki.Rajagopalan@Sun.COM eibnx_dprintf_args(const char *fmt, ...)
146*13101SVenki.Rajagopalan@Sun.COM {
147*13101SVenki.Rajagopalan@Sun.COM 	va_list ap;
148*13101SVenki.Rajagopalan@Sun.COM 	int msglen;
149*13101SVenki.Rajagopalan@Sun.COM 	char msgbuf[ENX_MAX_LINE];
150*13101SVenki.Rajagopalan@Sun.COM 	char newfmt[ENX_MAX_LINE];
151*13101SVenki.Rajagopalan@Sun.COM 
152*13101SVenki.Rajagopalan@Sun.COM 	if ((enx_log_level & ENX_MSGS_ARGS) != ENX_MSGS_ARGS)
153*13101SVenki.Rajagopalan@Sun.COM 		return;
154*13101SVenki.Rajagopalan@Sun.COM 
155*13101SVenki.Rajagopalan@Sun.COM 	(void) snprintf(newfmt, ENX_MAX_LINE, "........%s", fmt);
156*13101SVenki.Rajagopalan@Sun.COM 
157*13101SVenki.Rajagopalan@Sun.COM 	va_start(ap, fmt);
158*13101SVenki.Rajagopalan@Sun.COM 	msglen = vsnprintf(msgbuf, ENX_MAX_LINE, newfmt, ap);
159*13101SVenki.Rajagopalan@Sun.COM 	va_end(ap);
160*13101SVenki.Rajagopalan@Sun.COM 
161*13101SVenki.Rajagopalan@Sun.COM 	if (msglen > 0) {
162*13101SVenki.Rajagopalan@Sun.COM 		eibnx_log(msgbuf);
163*13101SVenki.Rajagopalan@Sun.COM 	}
164*13101SVenki.Rajagopalan@Sun.COM }
165*13101SVenki.Rajagopalan@Sun.COM 
166*13101SVenki.Rajagopalan@Sun.COM void
eibnx_dprintf_debug(const char * fmt,...)167*13101SVenki.Rajagopalan@Sun.COM eibnx_dprintf_debug(const char *fmt, ...)
168*13101SVenki.Rajagopalan@Sun.COM {
169*13101SVenki.Rajagopalan@Sun.COM 	va_list ap;
170*13101SVenki.Rajagopalan@Sun.COM 	int msglen;
171*13101SVenki.Rajagopalan@Sun.COM 	char msgbuf[ENX_MAX_LINE];
172*13101SVenki.Rajagopalan@Sun.COM 	char newfmt[ENX_MAX_LINE];
173*13101SVenki.Rajagopalan@Sun.COM 
174*13101SVenki.Rajagopalan@Sun.COM 	if ((enx_log_level & ENX_MSGS_DEBUG) != ENX_MSGS_DEBUG)
175*13101SVenki.Rajagopalan@Sun.COM 		return;
176*13101SVenki.Rajagopalan@Sun.COM 
177*13101SVenki.Rajagopalan@Sun.COM 	(void) snprintf(newfmt, ENX_MAX_LINE, "......%s", fmt);
178*13101SVenki.Rajagopalan@Sun.COM 
179*13101SVenki.Rajagopalan@Sun.COM 	va_start(ap, fmt);
180*13101SVenki.Rajagopalan@Sun.COM 	msglen = vsnprintf(msgbuf, ENX_MAX_LINE, newfmt, ap);
181*13101SVenki.Rajagopalan@Sun.COM 	va_end(ap);
182*13101SVenki.Rajagopalan@Sun.COM 
183*13101SVenki.Rajagopalan@Sun.COM 	if (msglen > 0) {
184*13101SVenki.Rajagopalan@Sun.COM 		eibnx_log(msgbuf);
185*13101SVenki.Rajagopalan@Sun.COM 	}
186*13101SVenki.Rajagopalan@Sun.COM }
187*13101SVenki.Rajagopalan@Sun.COM #endif
188*13101SVenki.Rajagopalan@Sun.COM 
189*13101SVenki.Rajagopalan@Sun.COM void
eibnx_dprintf_warn(const char * fmt,...)190*13101SVenki.Rajagopalan@Sun.COM eibnx_dprintf_warn(const char *fmt, ...)
191*13101SVenki.Rajagopalan@Sun.COM {
192*13101SVenki.Rajagopalan@Sun.COM 	va_list ap;
193*13101SVenki.Rajagopalan@Sun.COM 	int msglen;
194*13101SVenki.Rajagopalan@Sun.COM 	char msgbuf[ENX_MAX_LINE];
195*13101SVenki.Rajagopalan@Sun.COM 	char newfmt[ENX_MAX_LINE];
196*13101SVenki.Rajagopalan@Sun.COM 
197*13101SVenki.Rajagopalan@Sun.COM 	if ((enx_log_level & ENX_MSGS_WARN) != ENX_MSGS_WARN)
198*13101SVenki.Rajagopalan@Sun.COM 		return;
199*13101SVenki.Rajagopalan@Sun.COM 
200*13101SVenki.Rajagopalan@Sun.COM 	(void) snprintf(newfmt, ENX_MAX_LINE, "....%s", fmt);
201*13101SVenki.Rajagopalan@Sun.COM 
202*13101SVenki.Rajagopalan@Sun.COM 	va_start(ap, fmt);
203*13101SVenki.Rajagopalan@Sun.COM 	msglen = vsnprintf(msgbuf, ENX_MAX_LINE, newfmt, ap);
204*13101SVenki.Rajagopalan@Sun.COM 	va_end(ap);
205*13101SVenki.Rajagopalan@Sun.COM 
206*13101SVenki.Rajagopalan@Sun.COM 	if (msglen > 0) {
207*13101SVenki.Rajagopalan@Sun.COM 		eibnx_log(msgbuf);
208*13101SVenki.Rajagopalan@Sun.COM 	}
209*13101SVenki.Rajagopalan@Sun.COM }
210*13101SVenki.Rajagopalan@Sun.COM 
211*13101SVenki.Rajagopalan@Sun.COM void
eibnx_dprintf_err(const char * fmt,...)212*13101SVenki.Rajagopalan@Sun.COM eibnx_dprintf_err(const char *fmt, ...)
213*13101SVenki.Rajagopalan@Sun.COM {
214*13101SVenki.Rajagopalan@Sun.COM 	va_list ap;
215*13101SVenki.Rajagopalan@Sun.COM 	int msglen;
216*13101SVenki.Rajagopalan@Sun.COM 	char msgbuf[ENX_MAX_LINE];
217*13101SVenki.Rajagopalan@Sun.COM 	char newfmt[ENX_MAX_LINE];
218*13101SVenki.Rajagopalan@Sun.COM 
219*13101SVenki.Rajagopalan@Sun.COM 	if ((enx_log_level & ENX_MSGS_ERR) != ENX_MSGS_ERR)
220*13101SVenki.Rajagopalan@Sun.COM 		return;
221*13101SVenki.Rajagopalan@Sun.COM 
222*13101SVenki.Rajagopalan@Sun.COM 	(void) snprintf(newfmt, ENX_MAX_LINE, "..%s", fmt);
223*13101SVenki.Rajagopalan@Sun.COM 
224*13101SVenki.Rajagopalan@Sun.COM 	va_start(ap, fmt);
225*13101SVenki.Rajagopalan@Sun.COM 	msglen = vsnprintf(msgbuf, ENX_MAX_LINE, newfmt, ap);
226*13101SVenki.Rajagopalan@Sun.COM 	va_end(ap);
227*13101SVenki.Rajagopalan@Sun.COM 
228*13101SVenki.Rajagopalan@Sun.COM 	if (msglen > 0) {
229*13101SVenki.Rajagopalan@Sun.COM 		eibnx_log(msgbuf);
230*13101SVenki.Rajagopalan@Sun.COM 		cmn_err(CE_WARN, "!%s\n", msgbuf);
231*13101SVenki.Rajagopalan@Sun.COM 	}
232*13101SVenki.Rajagopalan@Sun.COM }
233*13101SVenki.Rajagopalan@Sun.COM 
234*13101SVenki.Rajagopalan@Sun.COM void
eibnx_dprintf_crit(const char * fmt,...)235*13101SVenki.Rajagopalan@Sun.COM eibnx_dprintf_crit(const char *fmt, ...)
236*13101SVenki.Rajagopalan@Sun.COM {
237*13101SVenki.Rajagopalan@Sun.COM 	va_list ap;
238*13101SVenki.Rajagopalan@Sun.COM 	int msglen;
239*13101SVenki.Rajagopalan@Sun.COM 	char msgbuf[ENX_MAX_LINE];
240*13101SVenki.Rajagopalan@Sun.COM 
241*13101SVenki.Rajagopalan@Sun.COM 	if ((enx_log_level & ENX_MSGS_CRIT) != ENX_MSGS_CRIT)
242*13101SVenki.Rajagopalan@Sun.COM 		return;
243*13101SVenki.Rajagopalan@Sun.COM 
244*13101SVenki.Rajagopalan@Sun.COM 	va_start(ap, fmt);
245*13101SVenki.Rajagopalan@Sun.COM 	msglen = vsnprintf(msgbuf, ENX_MAX_LINE, fmt, ap);
246*13101SVenki.Rajagopalan@Sun.COM 	va_end(ap);
247*13101SVenki.Rajagopalan@Sun.COM 
248*13101SVenki.Rajagopalan@Sun.COM 	if (msglen > 0) {
249*13101SVenki.Rajagopalan@Sun.COM 		eibnx_log(msgbuf);
250*13101SVenki.Rajagopalan@Sun.COM 		cmn_err(CE_PANIC, "!%s\n", msgbuf);
251*13101SVenki.Rajagopalan@Sun.COM 	}
252*13101SVenki.Rajagopalan@Sun.COM }
253