/******************************************************************************* NAME $RCSfile: commRpt.c,v $ SUMMARY Report mechanism for PikesPeak VERSION $Revision: 1.6 $ UPDATE DATE $Date: 2010/07/06 09:25:27 $ PROGRAMMER $Author: alan $ Copyright 2009 LSI Corporation. All Rights Reserved. DESCRIPTION: The functions used to report diagnostics status REFERENCE: *******************************************************************************/ /*** INCLUDES ***/ #include #include #include #include #include #include #include #include #include "commFWInfo.h" #if defined(CHASSIS_WSAS) #include "wemblySAS.h" #endif #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30) static DECLARE_MUTEX(call_and_get_mutex); #else static DEFINE_SEMAPHORE(call_and_get_mutex); #endif int gDiagReportError = 0; //extern int gdiagProcRetrunValue; UINT32 gBoardStressHitError=0; UINT32 gBoardStressHadErrorCount=0; UINT8 gBoardStressSasActivityStopFlag=0; UINT8 gBoardStressFcActivityStopFlag=0; UINT8 gBoardStressIbActivityStopFlag=0; UINT8 gBoardStressNic82579StopFlag=0; UINT8 gBoardStressNic82576p0StopFlag=0; UINT8 gBoardStressNic82576p1StopFlag=0; UINT8 gBoardStressPchI2cStopFlag=0; UINT8 gBoardStressFpgaI2cStopFlag=0; UINT8 gBoardStressDmaXorStopFlag=0; //Set to stop DMA XOR Board Stress Test UINT8 gBoardStressDmaCopyStopFlag=0; //Set to stop DMA COPY Board Stress Test UINT8 gBoardStressPlxStopFlag=0; //static UINT32 g_return_last_request_value=0; UINT32 g_loop_count = 1; UINT32 g_loop_sequence = 0; //0: AABB; 1:ABAB UINT32 g_stop_on_error = 0; UINT32 gHwValidationFlag=0; //0: MFG stress mode; 1: HW-Validation stress mode EXTERN VOID* gFpgaBar1VirtualP; EXTERN VOID* gFpgaBar2VirtualP; EXTERN VOID fpgaNvsramLockAll(VOID); EXTERN VOID fpgaNvsramUnlockAll(VOID); EXPORT_SYMBOL(commReportError); EXPORT_SYMBOL(commPostProgress); EXPORT_SYMBOL(gDiagReportError); EXPORT_SYMBOL(gHwValidationFlag); /*** PROCEDURES ***/ /******************************************************************************* * PROCEDURE * * NAME: commReportError * SUMMARY: Report the error in the diagnostics * SCOPE: public * * DESCRIPTION: After the disgnostics detect a error condiction, using this fucntion to report. * * RETURNS: * * NOTES: * */ PUBLIC VOID commReportError( INT16 com, INT8 item, INT16 code, const char *msg, INT64 arg1, INT64 arg2, INT64 arg3, commErrRptFormat format) { //FIXME: model code ??? UINT16 model_code = 0x2382; char buf[256]; gDiagReportError = 1; // gdiagProcRetrunValue = 1; printk("[%04x-%04x-%02x-%04x] ",model_code, com, item, code); switch (format) { case DG_FORMAT_NONE: printk("%s\n",msg); break; case DG_MEMORY_BYTE_FORMAT: case DG_MEMORY_WORD_FORMAT: case DG_MEMORY_LONG_FORMAT: case DG_MEMORY_LL_FORMAT: if (format == DG_MEMORY_BYTE_FORMAT) sprintf(buf, "%s, addr-> 0x%08X: expected-> 0x%02X obs-> 0x%02X\n", msg, (INT32) arg1, (INT8) arg2, (INT8) arg3); else if (format == DG_MEMORY_WORD_FORMAT) sprintf(buf, "%s, addr-> 0x%08X: expected-> 0x%04X obs-> 0x%04X\n", msg, (INT32) arg1, (INT16) arg2, (INT16) arg3); else if (format == DG_MEMORY_LONG_FORMAT) sprintf(buf, "%s, addr-> 0x%08X: expected-> 0x%08X obs-> 0x%08X\n", msg, (INT32) arg1, (INT32) arg2, (INT32) arg3); else sprintf(buf, "%s, addr-> 0x%016llX: expected-> 0x%016llX obs-> 0x%016llX\n", msg, arg1, arg2, arg3); printk("%s", buf); break; case DG_FPGA_DRIVE_FORMAT: sprintf(buf, "%s, number-> %d, type-> %d\n", msg, (INT8) arg1, (INT8) arg2); printk("%s", buf); break; case DG_FPGA_INT_FORMAT: sprintf(buf, "%s, register number-> 0x%02X, register bit-> 0x%02X\n", msg, (INT8) arg1, (INT8) arg2); printk("%s", buf); break; case DG_FPGA_NVSRAM_FORMAT: sprintf(buf, "%s, block-> 0x%08X, byte-> 0x%08X, pattern: %d\n", msg, (INT32) arg1, (INT32) arg2, (INT32) arg3); printk("%s", buf); break; case DG_QE8_IRQ_FORMAT: sprintf(buf, "%s, channel-> %d, IRQ Num-> %d\n", msg, (INT32) arg1, (INT32) arg2); printk(buf); break; case DG_QE8_DG_FORMAT: sprintf(buf, "%s '%d'\n", msg, (INT32) arg1); printk(buf); break; case DG_QE8_LOOPBACK_FORMAT: sprintf(buf, "%s '%d' at speed %dGbps\n", msg, (INT32) arg1, (INT32) arg2); printk(buf); break; case DG_QE8_BS_FORMAT: sprintf(buf, "%s '%d', but the required the number of the " "available QE8 channels is '%d'\n", msg, (UINT32) arg1, (UINT32) arg2); printk(buf); break; case DG_PCI_REGISTER_FORMAT: sprintf(buf, "%s on bus %02x\n", msg, (INT32)arg1); printk(buf); break; case DG_PCH_MSG_FORMAT: sprintf(buf, "%s, expected-> 0x%02X obs-> 0x%02X\n", msg, (INT8) arg1, (INT8) arg2); printk("%s", buf); break; case DG_PCH_IO_FORMAT: sprintf(buf, "%s, sector->0x%08X: expected-> 0x%02X obs-> 0x%02X\n", msg, (INT32) arg1, (INT8) arg2, (INT8) arg3); printk("%s", buf); break; case DG_EXPANDER_FLASH_FORMAT: sprintf(buf, "%s %d\n",msg, (INT32) arg1); printk("%s", buf); break; case DG_EXPANDER_LOOPBACK_FORMAT: sprintf(buf, "%s, Phy-> %d\n",msg, (INT32) arg1); printk("%s", buf); break; case DG_LSI_FALCON_FORMAT: sprintf(buf, "%s, Phy-> 0x%02X\n",msg, (INT32) arg1); printk("%s", buf); break; case DG_LSI_FALCON_PATTERN_FORMAT: sprintf(buf, "%s, Phy-> 0x%02X Pattern-> 0x%04X\n",msg, (INT32) arg1, (INT32) arg2); printk("%s", buf); break; default: printk("unknow error format\n"); break; } } /******************************************************************************* * PROCEDURE * * NAME: commPostProgress * SUMMARY: Report the progress in the diagnostics * SCOPE: public * * DESCRIPTION: This function used to show the progress of a diagnostics * * RETURNS: * * NOTES: * */ PUBLIC VOID commPostProgress(const char *msg, INT32 offset, INT32 total) { INT32 percentage; percentage = (offset*100)/total; if( percentage >= 100 ) printk("%s: %3d%%\n", msg, percentage); else printk("%s: %3d%% \r", msg, percentage); } VOID boardStressHitError(UINT32 item) { if(item!=0) printk("\nBoard Stress 0x%02x hit error\n", item); gBoardStressSasActivityStopFlag=1; gBoardStressFcActivityStopFlag=1; gBoardStressIbActivityStopFlag=1; gBoardStressNic82579StopFlag=1; gBoardStressNic82576p0StopFlag=1; gBoardStressNic82576p1StopFlag=1; gBoardStressPchI2cStopFlag=1; gBoardStressFpgaI2cStopFlag=1; gBoardStressDmaXorStopFlag=1; gBoardStressDmaCopyStopFlag=1; gBoardStressPlxStopFlag=1; gBoardStressHitError |= item; } VOID boardStressClearStopFlag(VOID) { gBoardStressSasActivityStopFlag=0; gBoardStressFcActivityStopFlag=0; gBoardStressIbActivityStopFlag=0; gBoardStressNic82579StopFlag=0; gBoardStressNic82576p0StopFlag=0; gBoardStressNic82576p1StopFlag=0; gBoardStressPchI2cStopFlag=0; gBoardStressFpgaI2cStopFlag=0; gBoardStressDmaXorStopFlag=0; //Set to stop DMA XOR Board Stress Test gBoardStressDmaCopyStopFlag=0; //Set to stop DMA COPY Board Stress Test gBoardStressPlxStopFlag=0; } MODULE_AUTHOR( "merck.hung@netapp.com" ); MODULE_DESCRIPTION( "Common Error Report Code" ); MODULE_LICENSE( "GPL" );