6f3e57ac9d0b054c3169579f3422080b8ba10105mx/*
47693af92e50a1ad81825eb01b7157a211269613mx * CDDL HEADER START
47693af92e50a1ad81825eb01b7157a211269613mx *
47693af92e50a1ad81825eb01b7157a211269613mx * The contents of this file are subject to the terms of the
47693af92e50a1ad81825eb01b7157a211269613mx * Common Development and Distribution License (the "License").
47693af92e50a1ad81825eb01b7157a211269613mx * You may not use this file except in compliance with the License.
47693af92e50a1ad81825eb01b7157a211269613mx *
47693af92e50a1ad81825eb01b7157a211269613mx * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
47693af92e50a1ad81825eb01b7157a211269613mx * or http://www.opensolaris.org/os/licensing.
47693af92e50a1ad81825eb01b7157a211269613mx * See the License for the specific language governing permissions
47693af92e50a1ad81825eb01b7157a211269613mx * and limitations under the License.
47693af92e50a1ad81825eb01b7157a211269613mx *
47693af92e50a1ad81825eb01b7157a211269613mx * When distributing Covered Code, include this CDDL HEADER in each
47693af92e50a1ad81825eb01b7157a211269613mx * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
47693af92e50a1ad81825eb01b7157a211269613mx * If applicable, add the following below this CDDL HEADER, with the
47693af92e50a1ad81825eb01b7157a211269613mx * fields enclosed by brackets "[]" replaced with your own identifying
47693af92e50a1ad81825eb01b7157a211269613mx * information: Portions Copyright [yyyy] [name of copyright owner]
47693af92e50a1ad81825eb01b7157a211269613mx *
47693af92e50a1ad81825eb01b7157a211269613mx * CDDL HEADER END
6f3e57ac9d0b054c3169579f3422080b8ba10105mx */
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx/*
47693af92e50a1ad81825eb01b7157a211269613mx * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
47693af92e50a1ad81825eb01b7157a211269613mx * Use is subject to license terms.
6f3e57ac9d0b054c3169579f3422080b8ba10105mx */
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx#pragma ident "%Z%%M% %I% %E% SMI"
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx#include "nge.h"
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx/*
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Global variable for default debug flags
6f3e57ac9d0b054c3169579f3422080b8ba10105mx */
6f3e57ac9d0b054c3169579f3422080b8ba10105mxuint32_t nge_debug;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx/*
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Global mutex used by logging routines below
6f3e57ac9d0b054c3169579f3422080b8ba10105mx */
6f3e57ac9d0b054c3169579f3422080b8ba10105mxkmutex_t nge_log_mutex[1];
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx/*
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Static data used by logging routines; protected by <nge_log_mutex>
6f3e57ac9d0b054c3169579f3422080b8ba10105mx */
6f3e57ac9d0b054c3169579f3422080b8ba10105mxstatic struct {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx const char *who;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx const char *fmt;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx int level;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx} nge_log_data;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx/*
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Backend print routine for all the routines below
6f3e57ac9d0b054c3169579f3422080b8ba10105mx */
6f3e57ac9d0b054c3169579f3422080b8ba10105mxstatic void
6f3e57ac9d0b054c3169579f3422080b8ba10105mxnge_vprt(const char *fmt, va_list args)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx{
6f3e57ac9d0b054c3169579f3422080b8ba10105mx char buf[128];
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx ASSERT(mutex_owned(nge_log_mutex));
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx (void) vsnprintf(buf, sizeof (buf), fmt, args);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx cmn_err(nge_log_data.level, nge_log_data.fmt, nge_log_data.who, buf);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx}
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx/*
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Log a run-time event (CE_NOTE, log only)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx */
6f3e57ac9d0b054c3169579f3422080b8ba10105mxvoid
6f3e57ac9d0b054c3169579f3422080b8ba10105mxnge_log(nge_t *ngep, const char *fmt, ...)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx{
6f3e57ac9d0b054c3169579f3422080b8ba10105mx va_list args;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx mutex_enter(nge_log_mutex);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx nge_log_data.who = ngep->ifname;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx nge_log_data.fmt = "!%s: %s";
6f3e57ac9d0b054c3169579f3422080b8ba10105mx nge_log_data.level = CE_NOTE;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx va_start(args, fmt);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx nge_vprt(fmt, args);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx va_end(args);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx mutex_exit(nge_log_mutex);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx}
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx/*
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Log a run-time problem (CE_WARN, log only)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx */
6f3e57ac9d0b054c3169579f3422080b8ba10105mxvoid
6f3e57ac9d0b054c3169579f3422080b8ba10105mxnge_problem(nge_t *ngep, const char *fmt, ...)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx{
6f3e57ac9d0b054c3169579f3422080b8ba10105mx va_list args;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx mutex_enter(nge_log_mutex);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx nge_log_data.who = ngep->ifname;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx nge_log_data.fmt = "!%s: %s";
6f3e57ac9d0b054c3169579f3422080b8ba10105mx nge_log_data.level = CE_WARN;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx va_start(args, fmt);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx nge_vprt(fmt, args);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx va_end(args);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx mutex_exit(nge_log_mutex);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx}
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx/*
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Log a programming error (CE_WARN, log only)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx */
6f3e57ac9d0b054c3169579f3422080b8ba10105mxvoid
6f3e57ac9d0b054c3169579f3422080b8ba10105mxnge_error(nge_t *ngep, const char *fmt, ...)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx{
6f3e57ac9d0b054c3169579f3422080b8ba10105mx va_list args;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx mutex_enter(nge_log_mutex);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx nge_log_data.who = ngep->ifname;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx nge_log_data.fmt = "!%s: %s";
6f3e57ac9d0b054c3169579f3422080b8ba10105mx nge_log_data.level = CE_WARN;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx va_start(args, fmt);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx nge_vprt(fmt, args);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx va_end(args);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx mutex_exit(nge_log_mutex);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx}
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mxstatic const char *
6f3e57ac9d0b054c3169579f3422080b8ba10105mxnge_class_string(uint8_t class_id)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx{
6f3e57ac9d0b054c3169579f3422080b8ba10105mx const char *msg;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx switch (class_id) {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx default:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx msg = "none";
6f3e57ac9d0b054c3169579f3422080b8ba10105mx break;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case NGE_HW_ERR:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx msg = "Hardware fatal error. Hardware will be reset";
6f3e57ac9d0b054c3169579f3422080b8ba10105mx break;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case NGE_HW_LINK:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx msg = "the link is broken, please check the connection";
6f3e57ac9d0b054c3169579f3422080b8ba10105mx break;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case NGE_HW_BM:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx msg = "Reset the hardware buffer management fails,"
6f3e57ac9d0b054c3169579f3422080b8ba10105mx "need to power off/power on system. It is hardware bug";
6f3e57ac9d0b054c3169579f3422080b8ba10105mx break;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case NGE_HW_RCHAN:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx msg = "Reset rx's channel fails. Need to power off/power"
6f3e57ac9d0b054c3169579f3422080b8ba10105mx "on system";
6f3e57ac9d0b054c3169579f3422080b8ba10105mx break;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case NGE_HW_TCHAN:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx msg = "Reset rx's channel fails. Need to power off/power"
6f3e57ac9d0b054c3169579f3422080b8ba10105mx "on system";
6f3e57ac9d0b054c3169579f3422080b8ba10105mx break;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case NGE_HW_ROM:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx msg = "Unlock eeprom lock fails.";
6f3e57ac9d0b054c3169579f3422080b8ba10105mx break;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case NGE_SW_PROBLEM_ID:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx msg = "Refill rx's bd fails";
6f3e57ac9d0b054c3169579f3422080b8ba10105mx break;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx }
6f3e57ac9d0b054c3169579f3422080b8ba10105mx return (msg);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx}
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mxvoid
6f3e57ac9d0b054c3169579f3422080b8ba10105mxnge_report(nge_t *ngep, uint8_t error_id)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx{
6f3e57ac9d0b054c3169579f3422080b8ba10105mx const char *err_msg;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx err_msg = nge_class_string(error_id);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx nge_error(ngep, err_msg);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx}
6f3e57ac9d0b054c3169579f3422080b8ba10105mxstatic void
6f3e57ac9d0b054c3169579f3422080b8ba10105mxnge_prt(const char *fmt, ...)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx{
6f3e57ac9d0b054c3169579f3422080b8ba10105mx va_list args;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx ASSERT(mutex_owned(nge_log_mutex));
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx va_start(args, fmt);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx nge_vprt(fmt, args);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx va_end(args);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx mutex_exit(nge_log_mutex);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx}
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mxvoid
6f3e57ac9d0b054c3169579f3422080b8ba10105mx(*nge_gdb(void))(const char *fmt, ...)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx{
6f3e57ac9d0b054c3169579f3422080b8ba10105mx mutex_enter(nge_log_mutex);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx nge_log_data.who = "nge";
6f3e57ac9d0b054c3169579f3422080b8ba10105mx nge_log_data.fmt = "?%s: %s\n";
6f3e57ac9d0b054c3169579f3422080b8ba10105mx nge_log_data.level = CE_CONT;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx return (nge_prt);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx}
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mxvoid
6f3e57ac9d0b054c3169579f3422080b8ba10105mx(*nge_db(nge_t *ngep))(const char *fmt, ...)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx{
6f3e57ac9d0b054c3169579f3422080b8ba10105mx mutex_enter(nge_log_mutex);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx nge_log_data.who = ngep->ifname;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx nge_log_data.fmt = "?%s: %s\n";
6f3e57ac9d0b054c3169579f3422080b8ba10105mx nge_log_data.level = CE_CONT;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx
6f3e57ac9d0b054c3169579f3422080b8ba10105mx return (nge_prt);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx}