4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
23 * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
27 #pragma ident "%Z%%M% %I% %E% SMI"
33 * Global variable for default debug flags
38 * Global mutex used by logging routines below
40 kmutex_t rge_log_mutex
[1];
43 * Static data used by logging routines; protected by <rge_log_mutex>
53 * Backend print routine for all the routines below
56 rge_vprt(const char *fmt
, va_list args
)
60 ASSERT(mutex_owned(rge_log_mutex
));
62 (void) vsnprintf(buf
, sizeof (buf
), fmt
, args
);
63 cmn_err(rge_log_data
.level
, rge_log_data
.fmt
, rge_log_data
.who
, buf
);
67 * Report a run-time event (CE_NOTE, to console & log)
70 rge_notice(rge_t
*rgep
, const char *fmt
, ...)
74 mutex_enter(rge_log_mutex
);
75 rge_log_data
.who
= rgep
->ifname
;
76 rge_log_data
.fmt
= "%s: %s";
77 rge_log_data
.level
= CE_NOTE
;
83 mutex_exit(rge_log_mutex
);
87 * Log a run-time event (CE_NOTE, log only)
90 rge_log(rge_t
*rgep
, const char *fmt
, ...)
94 mutex_enter(rge_log_mutex
);
95 rge_log_data
.who
= rgep
->ifname
;
96 rge_log_data
.fmt
= "!%s: %s";
97 rge_log_data
.level
= CE_NOTE
;
103 mutex_exit(rge_log_mutex
);
107 * Log a run-time problem (CE_WARN, log only)
110 rge_problem(rge_t
*rgep
, const char *fmt
, ...)
114 mutex_enter(rge_log_mutex
);
115 rge_log_data
.who
= rgep
->ifname
;
116 rge_log_data
.fmt
= "!%s: %s";
117 rge_log_data
.level
= CE_WARN
;
123 mutex_exit(rge_log_mutex
);
127 * Log a programming error (CE_WARN, log only)
130 rge_error(rge_t
*rgep
, const char *fmt
, ...)
134 mutex_enter(rge_log_mutex
);
135 rge_log_data
.who
= rgep
->ifname
;
136 rge_log_data
.fmt
= "!%s: %s";
137 rge_log_data
.level
= CE_WARN
;
143 mutex_exit(rge_log_mutex
);
149 rge_prt(const char *fmt
, ...)
153 ASSERT(mutex_owned(rge_log_mutex
));
159 mutex_exit(rge_log_mutex
);
163 (*rge_gdb(void))(const char *fmt
, ...)
165 mutex_enter(rge_log_mutex
);
166 rge_log_data
.who
= "rge";
167 rge_log_data
.fmt
= "?%s: %s\n";
168 rge_log_data
.level
= CE_CONT
;
174 (*rge_db(rge_t
*rgep
))(const char *fmt
, ...)
176 mutex_enter(rge_log_mutex
);
177 rge_log_data
.who
= rgep
->ifname
;
178 rge_log_data
.fmt
= "?%s: %s\n";
179 rge_log_data
.level
= CE_CONT
;
185 * Dump a chunk of memory, 16 bytes at a time
188 minidump(rge_t
*rgep
, const char *caption
, void *dp
, uint_t len
)
193 rge_log(rgep
, "%d bytes of %s at address %p:-", len
, caption
, dp
);
195 for (len
= MIN(len
, rgep
->rxbuf_size
); len
!= 0; len
-= nbytes
) {
196 nbytes
= MIN(len
, sizeof (buf
));
197 bzero(buf
, sizeof (buf
));
198 bcopy(dp
, buf
, nbytes
);
199 rge_log(rgep
, "%08x %08x %08x %08x",
200 buf
[0], buf
[1], buf
[2], buf
[3]);
201 dp
= (caddr_t
)dp
+ nbytes
;
206 rge_pkt_dump(rge_t
*rgep
, rge_bd_t
*hrbdp
, sw_rbd_t
*srbdp
, const char *msg
)
208 rge_problem(rgep
, "driver-detected hardware error: %s", msg
);
210 minidump(rgep
, "hardware descriptor", hrbdp
, sizeof (*hrbdp
));
212 rge_log(rgep
, "PCI address %lx flags_len 0x%x"
214 hrbdp
->host_buf_addr
,
219 minidump(rgep
, "software descriptor", srbdp
, sizeof (*srbdp
));
221 rge_log(rgep
, "PCI address %llx buffer len 0x%x token 0x%x",
222 srbdp
->rx_buf
->pbuf
.cookie
.dmac_laddress
,
223 srbdp
->rx_buf
->pbuf
.alength
,
224 srbdp
->rx_buf
->pbuf
.token
);
226 minidump(rgep
, "packet data", srbdp
->rx_buf
->pbuf
.mem_va
,
227 hrbdp
->flags_len
& RBD_LEN_MASK
);
232 rge_dbg_enter(rge_t
*rgep
, const char *s
)
236 debug
= rgep
!= NULL
? rgep
->debug
: rge_debug
;
237 if (debug
& RGE_DBG_STOP
) {
238 cmn_err(CE_CONT
, "rge_dbg_enter(%p): %s\n", (void *)rgep
, s
);
243 #endif /* RGE_DEBUGGING */