1*6f3e57acSmx /* 2*6f3e57acSmx * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 3*6f3e57acSmx * Use is subject to license terms. 4*6f3e57acSmx */ 5*6f3e57acSmx 6*6f3e57acSmx /* 7*6f3e57acSmx * This file may contain confidential information of Nvidia 8*6f3e57acSmx * and should not be distributed in source form without approval 9*6f3e57acSmx * from Sun Legal. 10*6f3e57acSmx */ 11*6f3e57acSmx 12*6f3e57acSmx #pragma ident "%Z%%M% %I% %E% SMI" 13*6f3e57acSmx 14*6f3e57acSmx #include "nge.h" 15*6f3e57acSmx 16*6f3e57acSmx 17*6f3e57acSmx /* 18*6f3e57acSmx * Global variable for default debug flags 19*6f3e57acSmx */ 20*6f3e57acSmx uint32_t nge_debug; 21*6f3e57acSmx 22*6f3e57acSmx /* 23*6f3e57acSmx * Global mutex used by logging routines below 24*6f3e57acSmx */ 25*6f3e57acSmx kmutex_t nge_log_mutex[1]; 26*6f3e57acSmx 27*6f3e57acSmx /* 28*6f3e57acSmx * Static data used by logging routines; protected by <nge_log_mutex> 29*6f3e57acSmx */ 30*6f3e57acSmx static struct { 31*6f3e57acSmx const char *who; 32*6f3e57acSmx const char *fmt; 33*6f3e57acSmx int level; 34*6f3e57acSmx } nge_log_data; 35*6f3e57acSmx 36*6f3e57acSmx 37*6f3e57acSmx /* 38*6f3e57acSmx * Backend print routine for all the routines below 39*6f3e57acSmx */ 40*6f3e57acSmx static void 41*6f3e57acSmx nge_vprt(const char *fmt, va_list args) 42*6f3e57acSmx { 43*6f3e57acSmx char buf[128]; 44*6f3e57acSmx 45*6f3e57acSmx ASSERT(mutex_owned(nge_log_mutex)); 46*6f3e57acSmx 47*6f3e57acSmx (void) vsnprintf(buf, sizeof (buf), fmt, args); 48*6f3e57acSmx cmn_err(nge_log_data.level, nge_log_data.fmt, nge_log_data.who, buf); 49*6f3e57acSmx } 50*6f3e57acSmx 51*6f3e57acSmx 52*6f3e57acSmx /* 53*6f3e57acSmx * Log a run-time event (CE_NOTE, log only) 54*6f3e57acSmx */ 55*6f3e57acSmx void 56*6f3e57acSmx nge_log(nge_t *ngep, const char *fmt, ...) 57*6f3e57acSmx { 58*6f3e57acSmx va_list args; 59*6f3e57acSmx 60*6f3e57acSmx mutex_enter(nge_log_mutex); 61*6f3e57acSmx nge_log_data.who = ngep->ifname; 62*6f3e57acSmx nge_log_data.fmt = "!%s: %s"; 63*6f3e57acSmx nge_log_data.level = CE_NOTE; 64*6f3e57acSmx 65*6f3e57acSmx va_start(args, fmt); 66*6f3e57acSmx nge_vprt(fmt, args); 67*6f3e57acSmx va_end(args); 68*6f3e57acSmx 69*6f3e57acSmx mutex_exit(nge_log_mutex); 70*6f3e57acSmx } 71*6f3e57acSmx 72*6f3e57acSmx /* 73*6f3e57acSmx * Log a run-time problem (CE_WARN, log only) 74*6f3e57acSmx */ 75*6f3e57acSmx void 76*6f3e57acSmx nge_problem(nge_t *ngep, const char *fmt, ...) 77*6f3e57acSmx { 78*6f3e57acSmx va_list args; 79*6f3e57acSmx 80*6f3e57acSmx mutex_enter(nge_log_mutex); 81*6f3e57acSmx nge_log_data.who = ngep->ifname; 82*6f3e57acSmx nge_log_data.fmt = "!%s: %s"; 83*6f3e57acSmx nge_log_data.level = CE_WARN; 84*6f3e57acSmx 85*6f3e57acSmx va_start(args, fmt); 86*6f3e57acSmx nge_vprt(fmt, args); 87*6f3e57acSmx va_end(args); 88*6f3e57acSmx 89*6f3e57acSmx mutex_exit(nge_log_mutex); 90*6f3e57acSmx } 91*6f3e57acSmx 92*6f3e57acSmx /* 93*6f3e57acSmx * Log a programming error (CE_WARN, log only) 94*6f3e57acSmx */ 95*6f3e57acSmx void 96*6f3e57acSmx nge_error(nge_t *ngep, const char *fmt, ...) 97*6f3e57acSmx { 98*6f3e57acSmx va_list args; 99*6f3e57acSmx 100*6f3e57acSmx mutex_enter(nge_log_mutex); 101*6f3e57acSmx nge_log_data.who = ngep->ifname; 102*6f3e57acSmx nge_log_data.fmt = "!%s: %s"; 103*6f3e57acSmx nge_log_data.level = CE_WARN; 104*6f3e57acSmx 105*6f3e57acSmx va_start(args, fmt); 106*6f3e57acSmx nge_vprt(fmt, args); 107*6f3e57acSmx va_end(args); 108*6f3e57acSmx 109*6f3e57acSmx mutex_exit(nge_log_mutex); 110*6f3e57acSmx } 111*6f3e57acSmx 112*6f3e57acSmx static const char * 113*6f3e57acSmx nge_class_string(uint8_t class_id) 114*6f3e57acSmx { 115*6f3e57acSmx const char *msg; 116*6f3e57acSmx switch (class_id) { 117*6f3e57acSmx default: 118*6f3e57acSmx msg = "none"; 119*6f3e57acSmx break; 120*6f3e57acSmx 121*6f3e57acSmx case NGE_HW_ERR: 122*6f3e57acSmx msg = "Hardware fatal error. Hardware will be reset"; 123*6f3e57acSmx break; 124*6f3e57acSmx 125*6f3e57acSmx case NGE_HW_LINK: 126*6f3e57acSmx msg = "the link is broken, please check the connection"; 127*6f3e57acSmx break; 128*6f3e57acSmx 129*6f3e57acSmx case NGE_HW_BM: 130*6f3e57acSmx msg = "Reset the hardware buffer management fails," 131*6f3e57acSmx "need to power off/power on system. It is hardware bug"; 132*6f3e57acSmx break; 133*6f3e57acSmx 134*6f3e57acSmx case NGE_HW_RCHAN: 135*6f3e57acSmx msg = "Reset rx's channel fails. Need to power off/power" 136*6f3e57acSmx "on system"; 137*6f3e57acSmx break; 138*6f3e57acSmx 139*6f3e57acSmx case NGE_HW_TCHAN: 140*6f3e57acSmx msg = "Reset rx's channel fails. Need to power off/power" 141*6f3e57acSmx "on system"; 142*6f3e57acSmx break; 143*6f3e57acSmx 144*6f3e57acSmx case NGE_HW_ROM: 145*6f3e57acSmx msg = "Unlock eeprom lock fails."; 146*6f3e57acSmx break; 147*6f3e57acSmx 148*6f3e57acSmx case NGE_SW_PROBLEM_ID: 149*6f3e57acSmx msg = "Refill rx's bd fails"; 150*6f3e57acSmx break; 151*6f3e57acSmx } 152*6f3e57acSmx return (msg); 153*6f3e57acSmx } 154*6f3e57acSmx 155*6f3e57acSmx void 156*6f3e57acSmx nge_report(nge_t *ngep, uint8_t error_id) 157*6f3e57acSmx { 158*6f3e57acSmx const char *err_msg; 159*6f3e57acSmx 160*6f3e57acSmx err_msg = nge_class_string(error_id); 161*6f3e57acSmx nge_error(ngep, err_msg); 162*6f3e57acSmx 163*6f3e57acSmx } 164*6f3e57acSmx static void 165*6f3e57acSmx nge_prt(const char *fmt, ...) 166*6f3e57acSmx { 167*6f3e57acSmx va_list args; 168*6f3e57acSmx 169*6f3e57acSmx ASSERT(mutex_owned(nge_log_mutex)); 170*6f3e57acSmx 171*6f3e57acSmx va_start(args, fmt); 172*6f3e57acSmx nge_vprt(fmt, args); 173*6f3e57acSmx va_end(args); 174*6f3e57acSmx 175*6f3e57acSmx mutex_exit(nge_log_mutex); 176*6f3e57acSmx } 177*6f3e57acSmx 178*6f3e57acSmx void 179*6f3e57acSmx (*nge_gdb(void))(const char *fmt, ...) 180*6f3e57acSmx { 181*6f3e57acSmx mutex_enter(nge_log_mutex); 182*6f3e57acSmx 183*6f3e57acSmx nge_log_data.who = "nge"; 184*6f3e57acSmx nge_log_data.fmt = "?%s: %s\n"; 185*6f3e57acSmx nge_log_data.level = CE_CONT; 186*6f3e57acSmx 187*6f3e57acSmx return (nge_prt); 188*6f3e57acSmx } 189*6f3e57acSmx 190*6f3e57acSmx void 191*6f3e57acSmx (*nge_db(nge_t *ngep))(const char *fmt, ...) 192*6f3e57acSmx { 193*6f3e57acSmx mutex_enter(nge_log_mutex); 194*6f3e57acSmx 195*6f3e57acSmx nge_log_data.who = ngep->ifname; 196*6f3e57acSmx nge_log_data.fmt = "?%s: %s\n"; 197*6f3e57acSmx nge_log_data.level = CE_CONT; 198*6f3e57acSmx 199*6f3e57acSmx return (nge_prt); 200*6f3e57acSmx } 201