xref: /illumos-gate/usr/src/uts/common/io/e1000g/e1000g_debug.c (revision 058561cbaa119a6f2659bc27ef343e1b47266bb2)
1 /*
2  * This file is provided under a CDDLv1 license.  When using or
3  * redistributing this file, you may do so under this license.
4  * In redistributing this file this license must be included
5  * and no other modification of this header file is permitted.
6  *
7  * CDDL LICENSE SUMMARY
8  *
9  * Copyright(c) 1999 - 2007 Intel Corporation. All rights reserved.
10  *
11  * The contents of this file are subject to the terms of Version
12  * 1.0 of the Common Development and Distribution License (the "License").
13  *
14  * You should have received a copy of the License with this software.
15  * You can obtain a copy of the License at
16  *	http://www.opensolaris.org/os/licensing.
17  * See the License for the specific language governing permissions
18  * and limitations under the License.
19  */
20 
21 /*
22  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms of the CDDLv1.
24  */
25 
26 #pragma ident	"%Z%%M%	%I%	%E% SMI"
27 
28 /*
29  * **********************************************************************
30  *									*
31  * Module Name:								*
32  *   e1000g_debug.c							*
33  *									*
34  * Abstract:								*
35  *									*
36  *   This driver runs on the following hardware:			*
37  *   - Wiseman based PCI gigabit ethernet adapters			*
38  *									*
39  * Environment:								*
40  *   Kernel Mode -							*
41  *									*
42  * **********************************************************************
43  */
44 #ifdef GCC
45 #ifdef __STDC__
46 #include <stdarg.h>
47 #else
48 #include <varargs.h>
49 #endif
50 #define	_SYS_VARARGS_H
51 #endif
52 
53 #include "e1000g_sw.h"
54 #include "e1000g_debug.h"
55 
56 void
57 e1000g_log(struct e1000g *Adapter, int level, char *fmt, ...)
58 {
59 	auto char name[NAMELEN];
60 	auto char buf[BUFSZ];
61 	va_list ap;
62 
63 	if (Adapter != NULL) {
64 		(void) sprintf(name, "%s - e1000g[%d] ",
65 		    ddi_get_name(Adapter->dip), ddi_get_instance(Adapter->dip));
66 	} else {
67 		(void) sprintf(name, "e1000g");
68 	}
69 #ifdef GCC
70 	/*
71 	 * va_start uses built in macro __builtin_va_alist from the
72 	 * compiler libs which requires compiler system to have
73 	 * __BUILTIN_VA_ARG_INCR defined.
74 	 */
75 	/*
76 	 * Many compilation systems depend upon the use of special functions
77 	 * built into the the compilation system to handle variable argument
78 	 * lists and stack allocations.  The method to obtain this in SunOS
79 	 * is to define the feature test macro "__BUILTIN_VA_ARG_INCR" which
80 	 * enables the following special built-in functions:
81 	 *	__builtin_alloca
82 	 *	__builtin_va_alist
83 	 *	__builtin_va_arg_incr
84 	 * It is intended that the compilation system define this feature test
85 	 * macro, not the user of the system.
86 	 *
87 	 * The tests on the processor type are to provide a transitional period
88 	 * for existing compilation systems, and may be removed in a future
89 	 * release.
90 	 */
91 	/*
92 	 * Using GNU gcc compiler it doesn't expand to va_start....
93 	 */
94 	va_start(ap, fmt);
95 #else
96 	va_start(ap, fmt);
97 #endif	/* GCC */
98 	(void) vsprintf(buf, fmt, ap);
99 	va_end(ap);
100 
101 	switch (level) {
102 	case CE_CONT:
103 	case CE_NOTE:
104 	case CE_WARN:
105 	case CE_PANIC:
106 		if (e1000g_display_only == 1 && e1000g_print_only == 1) {
107 			cmn_err(level, "%s: %s", name, buf);
108 			break;
109 		}
110 		if (e1000g_display_only == 1) {
111 			cmn_err(level, "^%s: %s", name, buf);
112 			break;
113 		}
114 		if (e1000g_print_only == 1) {
115 			cmn_err(level, "!%s: %s", name, buf);
116 			break;
117 		}
118 		/*
119 		 * if they are not set properly then do both
120 		 */
121 		cmn_err(level, "%s: %s", name, buf);
122 		break;
123 
124 #ifdef e1000g_DEBUG
125 	case e1000g_DDI_LEVEL:	/* 256 or 0x100 */
126 		if (e1000g_debug != e1000g_DDI_LEVEL)
127 			break;
128 
129 	case e1000g_INT_LEVEL:	/* 128 or 0x080 */
130 		if ((e1000g_debug != e1000g_INT_LEVEL) &&
131 		    (e1000g_debug < e1000g_INT_LEVEL))
132 			break;
133 
134 	case e1000g_SEND_LEVEL:	/* 64 or 0x040 */
135 		if ((e1000g_debug != e1000g_SEND_LEVEL) &&
136 		    (e1000g_debug < e1000g_SEND_LEVEL))
137 			break;
138 
139 	case e1000g_RECV_LEVEL:	/* 32 or 0x020 */
140 		if ((e1000g_debug != e1000g_RECV_LEVEL) &&
141 		    (e1000g_debug < e1000g_RECV_LEVEL))
142 			break;
143 
144 	case e1000g_CALLTRACE_LEVEL:	/* 8 or 0x008 */
145 		if ((e1000g_debug != e1000g_CALLTRACE_LEVEL) &&
146 		    (e1000g_debug < e1000g_CALLTRACE_LEVEL))
147 			break;
148 
149 	case e1000g_INFO_LEVEL:	/* 4 or 0x004 */
150 		if ((e1000g_debug != e1000g_INFO_LEVEL) &&
151 		    (e1000g_debug < e1000g_INFO_LEVEL))
152 			break;
153 
154 	case e1000g_VERBOSE_LEVEL:	/* 16 or 0x010 */
155 #endif
156 	default:
157 		if (e1000g_display_only == 1 && e1000g_print_only == 1) {
158 			cmn_err(CE_CONT, "%s:\t%s", name, buf);
159 			break;
160 		}
161 
162 		if (e1000g_display_only == 1) {
163 			cmn_err(CE_CONT, "^%s:\t%s", name, buf);
164 			break;
165 		}
166 
167 		if (e1000g_print_only == 1) {
168 			cmn_err(CE_CONT, "!%s:\t%s", name, buf);
169 			break;
170 		}
171 
172 		/*
173 		 * if they are not set properly then do both
174 		 */
175 		cmn_err(CE_CONT, "%s:\t%s", name, buf);
176 		break;
177 	}
178 }
179 
180 void
181 e1000g_log_hw(char *msg, void *cptr, int length)
182 {
183 	int i = 0, j;
184 	char buf[BUFSZ];
185 	char *cp = cptr;
186 
187 	bzero(buf, BUFSZ);
188 	for (i = 0; i < length; i++) {
189 		/*
190 		 * make sure there is room for longest %x (i.e. 8 for a
191 		 * negative number) plus space (1) plus zero (1)
192 		 */
193 		if ((j = strlen(buf)) >= (BUFSZ - 10)) {
194 			buf[BUFSZ - 2] = '>';
195 			buf[BUFSZ - 1] = 0;
196 			break;
197 		}
198 
199 		(void) sprintf(&buf[j], "%x ", cp[i]);
200 	}
201 	cmn_err(CE_CONT, "^%s: %s\n", msg, buf);
202 }
203