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