|
|
/*++
Copyright (C) 1997-99 Microsoft Corporation
Module Name:
hack.h
Abstract:
--*/
#if !defined (___hack_h___)
#define ___hack_h___
extern ULONG IdeDebug;
extern ULONG IdeDebugRescanBusFreq; extern ULONG IdeDebugRescanBusCounter;
extern ULONG IdeDebugHungControllerFreq; extern ULONG IdeDebugHungControllerCounter;
extern ULONG IdeDebugTimeoutAllCacheFlush;
extern ULONG IdeDebugForceSmallCrashDumpBlockSize;
extern PDEVICE_OBJECT IdeDebugDevObjTimeoutAllDmaSrb;
extern ULONG FailBmSetupCount;
extern ULONG IdeDebugFakeCrcError;
VOID IdeDebugPrint( ULONG DebugPrintLevel, PCCHAR DebugMessage, ... );
#ifdef DebugPrint
#undef DebugPrint
#endif
#if DBG
#define DebugPrint(x) IdeDebugPrint x
#define DBG_BIT_CONTROL 0x80000000
#define DBG_ALWAYS DBG_BIT_CONTROL
#define DBG_BUSSCAN (DBG_BIT_CONTROL | 0x00000001)
#define DBG_PNP (DBG_BIT_CONTROL | 0x00000002)
#define DBG_POWER (DBG_BIT_CONTROL | 0x00000004)
#define DBG_READ_WRITE (DBG_BIT_CONTROL | 0x00000008)
#define DBG_CRASHDUMP (DBG_BIT_CONTROL | 0x00000010)
#define DBG_ACPI (DBG_BIT_CONTROL | 0x00000020)
#define DBG_RESET (DBG_BIT_CONTROL | 0x00000040)
#define DBG_PDO_LOCKTAG (DBG_BIT_CONTROL | 0x00000080)
#define DBG_WMI (DBG_BIT_CONTROL | 0x00000100)
#define DBG_IDEREADCAP (DBG_BIT_CONTROL | 0x00000200)
#define DBG_WARNING (DBG_BIT_CONTROL | 0x00000400)
#define DBG_REG_SEARCH (DBG_BIT_CONTROL | 0x00000800)
#define DBG_IDE_DEVICE_ERROR (DBG_BIT_CONTROL | 0x00001000)
#define DBG_ATAPI_DEVICES (DBG_BIT_CONTROL | 0x00002000)
#define DBG_XFERMODE (DBG_BIT_CONTROL | 0x00004000)
#ifdef IDE_MEASURE_BUSSCAN_SPEED
#define DBG_SPECIAL DBG_ALWAYS
#else
#define DBG_SPECIAL (DBG_BIT_CONTROL | 0x00008000)
#endif
#else
#define DebugPrint(x)
#endif
BOOLEAN IdePortSlaveIsGhost ( IN OUT PFDO_EXTENSION FdoExtension, IN PIDENTIFY_DATA MasterIdentifyData, IN PIDENTIFY_DATA SlaveIdentifyData ); UCHAR IdePortGetFlushCommand ( IN OUT PFDO_EXTENSION FdoExtension, IN OUT PPDO_EXTENSION PdoExtension, IN PIDENTIFY_DATA IdentifyData );
BOOLEAN IdePortMustBePio ( IN PFDO_EXTENSION FdoExtension, IN PIDENTIFY_DATA IdentifyData ); BOOLEAN IdePortPioByDefaultDevice ( IN PFDO_EXTENSION FdoExtension, IN PIDENTIFY_DATA IdentifyData );
BOOLEAN IdePortDeviceHasNonRemovableMedia ( IN OUT PFDO_EXTENSION FdoExtension, IN PIDENTIFY_DATA IdentifyData ); BOOLEAN IdePortDeviceIsLs120 ( IN PFDO_EXTENSION FdoExtension, IN PIDENTIFY_DATA IdentifyData ); BOOLEAN IdePortNoPowerDown ( IN PFDO_EXTENSION FdoExtension, IN PIDENTIFY_DATA IdentifyData ); BOOLEAN IdePortVerifyDma ( IN PPDO_EXTENSION pdoExtension, IN IDE_DEVICETYPE ideDeviceType );
VOID IdePortFudgeAtaIdentifyData( IN OUT PIDENTIFY_DATA IdentifyData );
BOOLEAN IdePortIsThisAPanasonicPCMCIACard( IN PFDO_EXTENSION FdoExtension );
VOID FASTCALL IdePortLogNoMemoryErrorFn( IN PVOID DeviceExtension, IN ULONG TargetId, IN POOL_TYPE PoolType, IN SIZE_T Size, IN ULONG LocationIdentifier, IN ULONG Tag );
typedef enum { noSpecialAction=0, disableSerialNumber, setFlagSonyMemoryStick, skipModeSense }SPECIAL_ACTION_FLAG;
typedef struct _IDE_SPECIAL_DEVICE { PUCHAR VendorProductId; PUCHAR Revision; SPECIAL_ACTION_FLAG RequiredAction; } IDE_SPECIAL_DEVICE, *PIDE_SPECIAL_DEVICE;
SPECIAL_ACTION_FLAG IdeFindSpecialDevice( IN PUCHAR VendorProductId, IN PUCHAR ProductRevisionId );
// Model number can be atmost 40 ascii characters
#define MAX_MODELNUM_SIZE 40
#define MEMSTICKID "MEMORYSTICK"
//procure the model number from the identify data
#define GetTargetModelId(IdentifyData, targetModelNum) {\
ULONG i; \ ASSERT(MAX_MODELNUM_SIZE <= sizeof(IdentifyData->ModelNumber)); \ for (i=0; i<sizeof(IdentifyData->ModelNumber); i+=2) { \ targetModelNum[i + 0] = IdentifyData->ModelNumber[i + 1]; \ targetModelNum[i + 1] = IdentifyData->ModelNumber[i + 0]; \ if (targetModelNum[i + 0] == '\0') { \ targetModelNum[i + 0] = ' '; \ }\ if (targetModelNum[i + 1] == '\0') { \ targetModelNum[i + 1] = ' '; \ } \ } \ for (i = sizeof(IdentifyData->ModelNumber)-1;i>0; i--) { \ if (targetModelNum[i] != ' ') { \ ASSERT(i < MAX_MODELNUM_SIZE); \ targetModelNum[i+1]='\0'; \ break; \ } \ } \ if (i == 0) { \ if (targetModelNum[i] != ' ') { \ ASSERT(i < MAX_MODELNUM_SIZE); \ targetModelNum[i+1]='\0'; \ } else { \ targetModelNum[i]='\0'; \ } \ } \ }
#define ALLOC_FAILURE_LOGSIZE (sizeof(IO_ERROR_LOG_PACKET) + 4 * sizeof(ULONG))
#define IdeLogNoMemoryError(a, b, c, d, e) IdePortLogNoMemoryErrorFn(a, b, c, d, e, 'PedI')
//
// Log dead meat info.
//
#ifdef LOG_DEADMEAT_EVENT
#define IdeLogDeadMeatEvent(filName, lineNum) { \
filName = __FILE__;\ lineNum = __LINE__; \ } #define IdeLogDeadMeatTaskFile(dst, src) dst = src
#define IdeLogDeadMeatReason(dst, src) dst=src
#else
#define IdeLogDeadMeatEvent(filName, lineNum)
#define IdeLogDeadMeatTaskFile(dst, src)
#define IdeLogDeadMeatReason(dst, src)
#endif //LOG_DEADMEAT_EVENT
//
// Timing Code
//
typedef enum _TIME_ID {
TimeIsr = 0, TimeDpc, TimeStartIo, TimeMax
} TIME_ID;
#ifdef IDE_MEASURE_BUSSCAN_SPEED
VOID LogBusScanStartTimer ( PLARGE_INTEGER TickCount );
ULONG LogBusScanStopTimer ( PLARGE_INTEGER TickCount );
#define LogBusScanTimeDiff(FdoExtension, ParameterName, ParameterValue) \
IdePortSaveDeviceParameter(FdoExtension, ParameterName, ParameterValue)
#else
#define LogBusScanStartTimer(TickCount)
#define LogBusScanStopTimer(TickCount) 0
#define LogBusScanTimeDiff(FdoExtension, ParameterName, ParameterValue)
#endif
#if defined (ENABLE_TIME_LOG)
typedef struct _TIME_LOG {
LARGE_INTEGER min; LARGE_INTEGER max; LARGE_INTEGER totalTimeInMicroSec; LARGE_INTEGER numLog;
} TIME_LOG, *PTIME_LOG;
VOID LogStartTime( TIME_ID id, PLARGE_INTEGER timer ); VOID LogStopTime( TIME_ID id, PLARGE_INTEGER timer, ULONG waterMarkInMicroSec );
#else
#define LogStartTime(x,y)
#define LogStopTime(x,y,z)
#endif // ENABLE_TIME_LOG
#if defined (IDE_BUS_TRACE)
typedef enum _IO_TYPE {
InPortByte = 0, OutPortByte, InPortWord, OutPortWord } IO_TYPE;
typedef struct _BUS_TRACE_RECORD {
IO_TYPE IoType; PVOID Address; ULONG Data; ULONG Count;
} BUS_TRACE_RECORD, *PBUS_TRACE_RECORD;
typedef struct _BUS_TRACE_LOG {
PBUS_TRACE_RECORD LogTable; ULONG NumLogTableEntries; ULONG LastLogTableEntry; BOOLEAN TableWrapped;
KSPIN_LOCK SpinLock;
} BUS_TRACE_LOG, *PBUS_TRACE_LOG;
VOID InitBusTraceLogTable ( VOID );
VOID FreeBusTraceLogTable ( VOID );
VOID IdepUpdateTraceLog ( IO_TYPE IoType, PVOID PortAddress, ULONG Data );
UCHAR IdepPortInPortByte ( PUCHAR PortAddress );
VOID IdepPortOutPortByte ( PUCHAR PortAddress, UCHAR Data );
USHORT IdepPortInPortWord ( PUSHORT PortAddress );
VOID IdepPortOutPortWord ( PUSHORT PortAddress, USHORT Data );
VOID IdepPortInPortWordBuffer ( PUSHORT PortAddress, PUSHORT Buffer, ULONG Count );
VOID IdepPortOutPortWordBuffer ( PUSHORT PortAddress, PUSHORT Buffer, ULONG Count );
#endif // IDE_BUS_TRACE
#if defined (IDE_BUS_TRACE)
#define IdePortInPortByte(addr) IdepPortInPortByte(addr)
#define IdePortOutPortByte(addr, data) IdepPortOutPortByte(addr, data)
#define IdePortInPortWord(addr) IdepPortInPortWord(addr)
#define IdePortOutPortWord(addr, data) IdepPortOutPortWord(addr, data)
#define IdePortInPortWordBuffer(addr, buf, count) IdepPortInPortWordBuffer(addr, buf, count)
#define IdePortOutPortWordBuffer(addr, buf, count) IdepPortOutPortWordBuffer(addr, buf, count)
#else
#define IdePortInPortByte(addr) READ_PORT_UCHAR(addr)
#define IdePortOutPortByte(addr, data) WRITE_PORT_UCHAR(addr, data)
#define IdePortInPortWord(addr) READ_PORT_USHORT(addr)
#define IdePortOutPortWord(addr, data) WRITE_PORT_USHORT(addr, data)
#define IdePortInPortWordBuffer(addr, buf, count) READ_PORT_BUFFER_USHORT(addr, buf, count)
#define IdePortOutPortWordBuffer(addr, buf, count) WRITE_PORT_BUFFER_USHORT(addr, buf, count)
#endif // IDE_BUS_TRACE
typedef struct _COMMAND_LOG { UCHAR Cdb[16]; IDEREGS InitialTaskFile; IDEREGS FinalTaskFile; LARGE_INTEGER StartTime; LARGE_INTEGER EndTime; BMSTATUS BmStatus; UCHAR SenseData[3]; }COMMAND_LOG, *PCOMMAND_LOG;
#ifdef ENABLE_COMMAND_LOG
#define MAX_COMMAND_LOG_ENTRIES 40
#define UpdateStartTimeStamp(cmdLog) KeQuerySystemTime(&(cmdLog->StartTime));
#define UpdateStopTimeStamp(cmdLog) KeQuerySystemTime(&(cmdLog->EndTime));
typedef struct _SRB_DATA *PSRB_DATA;
VOID IdeLogBmStatus ( PSCSI_REQUEST_BLOCK Srb, BMSTATUS BmStatus );
VOID IdeLogOpenCommandLog( PSRB_DATA SrbData );
VOID IdeLogStartCommandLog( PSRB_DATA SrbData );
VOID IdeLogStopCommandLog( PSRB_DATA SrbData );
VOID IdeLogSaveTaskFile( PSRB_DATA SrbData, PIDE_REGISTERS_1 BaseIoAddress );
VOID IdeLogFreeCommandLog( PSRB_DATA SrbData );
#else
#define IdeLogOpenCommandLog(a)
#define IdeLogStartCommandLog(a)
#define IdeLogStopCommandLog(a)
#define IdeLogSaveTaskFile(a,b)
#define IdeLogBmStatus(a,b)
#define IdeLogFreeCommandLog(a)
#endif // command log
#ifdef ENABLE_ATAPI_VERIFIER
VOID ViAtapiInterrupt( IN PFDO_EXTENSION FdoExtension );
UCHAR ViIdeGetBaseStatus( PIDE_REGISTERS_1 BaseIoAddress );
UCHAR ViIdeGetErrorByte( PIDE_REGISTERS_1 BaseIoAddress );
ULONG ViIdeFakeDeviceChange( IN PFDO_EXTENSION FdoExtension, ULONG Target );
BOOLEAN ViIdeFakeMissingDevice( IN PFDO_EXTENSION FdoExtension, IN ULONG Target );
BOOLEAN ViIdeGenerateDmaTimeout ( IN PVOID HwDeviceExtension, IN BOOLEAN DmaInProgress );
VOID ViIdeInitVerifierSettings( IN PFDO_EXTENSION FdoExtension ); /*
BOOLEAN ViIdeGenerateDmaTimeout( IN PHW_DEVICE_EXTENSION HwDeviceExtension, IN BOOLEAN DmaInProgress ); */ #endif //verifier
#endif // ___hack_h___
|