📄 eng_scsi.h
字号:
#define PDBG_WR_DIMM 0x37
#define PDBG_CMP_DIMM 0x38
#define PDBG_RW_RESV_DIMM 0x39
#define PDBG_LBA_MAP 0x40 /* CDB_DBG_LBA_MAP */
#define PDBG_CC_obsolete 0x50
#define PDBG_CC_DEBUGGING 0x51
#define PDBG_CC_DUMP_OS_REQ_BUF 0 /* CDB[1]==PDBG_CC_DEBUGGING */
#define PDBG_CC_FLUSH 1 /* CDB[3] = Array ID */
#define PDBG_CC_CLEAN_IDLE 2 /* CDB[3] = Array ID */
#define PDBG_CC_DISABLE_BYPASS 3 /* CDB[3] = Array ID */
#define PDBG_CC_ENABLE_BYPASS 4 /* CDB[3] = Array ID */
#define PDBG_I2C_READ 0x60
#define PDBG_I2C_WRITE 0x61
/* CDB_DBG_ERRINJ.injectOpCode CDB[1]==PDBG_INJECT_ERROR */
#define PDBG_INJECT_OP_DUMP 0x00
#define PDBG_INJECT_OP_INJECT 0x01
#define PDBG_INJECT_OP_PURGE 0x02
#define PDBG_INJECT_OP_CLEAR 0x03
/* CDB_DBG_ERRINJ.flags */
#define ES_FLAGS_WRITE_RECOVERABLE 0x01 /* error can be recovered on writing */
#define ES_FLAGS_ERROR_ON_READ 0x02 /* error on reading */
#define ES_FLAGS_ERROR_ON_WRITE 0x04 /* error on writing */
#define ES_FLAGS_ERROR_UNPLUG 0x08 /* disk unplug */
#define ES_FLAGS_ERROR_PLUGIN 0x10 /* disk plugin */
#define ES_FLAGS_ERROR_ON_VERIFY 0x20 /* error on verify */
#define ES_FLAGS_ERROR_SMART_ERROR 0x40 /* smart error */
/* special flags (actually not flags) */
#define ES_FLAGS_ERROR_SET_DOWN U8_MAX
#if defined( _COMPILER_MS_C_COMPATIBLE )
#pragma pack( 1 )
#endif /* COMPILER_MS_C_COMPATIBLE */
typedef struct _CDB_DBG_ERRINJ
{
U8 opCode; /* svucDEBUGGING_COMMAND (0xE2) */
U8 subOpCode; /* PDBG_INJECT_ERROR */
U8 diskID;
U8 injectOpCode; /* PDBG_INJECT_OP_xxx */
U32 startLBA;
U16 count;
U8 status;
U8 flags; /* ES_FLAGS_xxxx */
}
PACKED CDB_DBG_ERRINJ, buf_space * bpCDB_DBG_ERRINJ;
/*
-----------------------------------------------------------------------------------------
Debugging request CDB definitions vary with different sub opcodes. Here is the
generic debugging request CDB.
-----------------------------------------------------------------------------------------
*/
typedef struct _CDB_DBG
{
U8 opCode; /* svucDEBUGGING_COMMAND(0xE2) */
U8 subOpCode; /* PDBG_xxx */
U8 bReserved[14];
}
PACKED CDB_DBG, buf_space * bpCDB_DBG;
typedef struct _CDB_DBG_DISK_SIMPLE
{
U8 opCode; /* svucDEBUGGING_COMMAND(0xE2) */
U8 subOpCode; /* PDBG_xxx (0x30~0x3f) */
U8 diskID;
U8 action;
}
PACKED CDB_DBG_DISK_SIMPLE, buf_space * bpCDB_DBG_DISK_SIMPLE;
typedef struct _CDB_DBG_DISK
{
U8 opCode; /* svucDEBUGGING_COMMAND(0xE2) */
U8 subOpCode; /* PDBG_xxx (0x00~0x0f) */
U8 diskID;
U8 bReserved;
LBA lba; /* FIXME: align it! */
U16 count; /* block count */
U16 hReserved;
}
PACKED CDB_DBG_DISK, buf_space * bpCDB_DBG_DISK;
typedef struct _CDB_DBG_NVRAM
{
U8 opCode; /* svucDEBUGGING_COMMAND(0xE2) */
U8 subOpCode; /* PDBG_xxx (0x20~0x2f) */
U16 length; /* byte length */
U32 offset; /* NVRAM offset */
}
PACKED CDB_DBG_NVRAM, buf_space * bpCDB_DBG_NVRAM;
/*=============================================================================*/
/* svucDEBUGGING_COMMAND/PDBG_LBA_MAP */
#define PDBG_LBA_MAP_ACT_D2A 0x00 /* map disk lba to array lba */
#define PDBG_LBA_MAP_ACT_A2D 0x01 /* map array lba to disk lba */
#define PDBG_LBA_MAP_ACT_A2A 0x02 /* map array lba to array lba (migration only) */
typedef struct _DBG_LBA_MAP_PARAM_D2A
{
LBA DiskLBA; /* IN */
U8 DiskID; /* IN */
U8 MigrationTarget; /* IN */
U8 Reserved1[2]; /* IN */
U8 IsMapSucceed; /* OUT */
U8 MappedArrayID; /* OUT */
U8 IsMappedToParity; /* OUT */
U8 IsMigrationTarget; /* OUT */
LBA MappedArrayLBA; /* OUT */
}
PACKED DBG_LBA_MAP_PARAM_D2A, buf_space * bpDBG_LBA_MAP_PARAM_D2A;
typedef struct _DBG_LBA_MAP_PARAM_A2D
{
LBA ArrayLBA; /* IN */
U8 ArrayID; /* IN */
U8 IsMigrationTarget; /* IN, valid and checked only if the array in migration */
U8 Reserved1[2]; /* IN */
U8 IsMapSucceed; /* OUT */
U8 MappedDiskID; /* OUT */
U8 Reserved2[2]; /* OUT */
LBA MappedDiskLBA; /* OUT */
}
PACKED DBG_LBA_MAP_PARAM_A2D, buf_space * bpDBG_LBA_MAP_PARAM_A2D;
typedef struct _DBG_LBA_MAP_PARAM_A2A
{
LBA ArrayLBA; /* IN */
U8 ArrayID; /* IN */
U8 Reserved1[3]; /* IN */
U8 IsMapSucceed; /* OUT */
U8 Reserved2[3]; /* OUT */
LBA MappedArrayLBA; /* OUT */
}
PACKED DBG_LBA_MAP_PARAM_A2A, buf_space * bpDBG_LBA_MAP_PARAM_A2A;
typedef struct _CDB_DBG_LBA_MAP
{
U8 opCode; /* svucDEBUGGING_COMMAND(0xE2) */
U8 subOpCode; /* PDBG_LBA_MAP (0x20~0x2f) */
U8 action; /* PDBG_LBA_MAP_ACT_xxx */
}
PACKED CDB_DBG_LBA_MAP, buf_space * bpCDB_DBG_LBA_MAP;
/*=============================================================================*/
typedef struct _CDB_ATA_PTI
{
U8 OpCode; /* FIXED svucCONTROLLER_COMMAND */
U8 SubOpCode; /* FIXED ccmdATA_PASSTHRU */
U8 bCommand; /* refer to ATA spec. */
U8 bFeatures;
U8 bSectorCount;
U8 bSectorNumber;
U8 bCylinderLow;
U8 bCylinderHigh;
U16 blFlag;
U8 DiskID;
U8 bReserved[5];
}
PACKED CDB_ATA_PTI, buf_space * bpCDB_ATA_PTI;
#define CDB_GET_INFO_CMD_PATROL 0x00
#define CDB_GET_INFO_CMD_ERRORTABLE 0x01
#define CDB_GET_INFO_CMD_PATROL_EX 0x02
typedef struct _DISK_PATROL_INFO
{
LBA wWatermark; /* patrol watermark */
U16 hFlags; /* see above BGA_STATE_xxx */
U16 hCount; /* loop count */
U16 hErrorCount; /* error detected during media patrol */
U16 hPercentage; /* Runtime percentage, internal usage */
} DISK_PATROL_INFO, buf_space * bpDISK_PATROL_INFO;
typedef struct _DISK_PATROL_INFO_EX
{
LBA wWatermark; /* patrol watermark */
U16 hFlags; /* see above BGA_STATE_xxx */
U16 hCount; /* loop count */
U16 hErrorCount; /* error detected during media patrol */
U16 hPercentage; /* Runtime percentage, internal usage */
U32 StartTime;
U32 LastResumeTime;
U32 Reserved[2];
} DISK_PATROL_INFO_EX, buf_space * bpDISK_PATROL_INFO_EX;
typedef struct _CDB_GET_INFO
{
U8 OpCode; /* FIXED svucCONTROLLER_COMMAND */
U8 SubOpCode; /* FIXED ccmdGET_INFO */
U8 Command; /* CDB_GET_INFO_CMD_xxx */
union
{
U8 DiskID;
} PACKED patrol;
} PACKED CDB_GET_INFO, buf_space * bpCDB_GET_INFO;
/*=====================================================================================*/
/*
* Data struture and definition for Engine_GetEvent
*/
#define MAX_EVENTLOG_PARAMS 6
#define ERRORLOG_NUM 21 /* It was 19 if defined 20
*/
/* logevent.WarningLevel */
#define EVENT_LEVEL_ERROR 0x00
#define EVENT_LEVEL_WARNING 0x01
#define EVENT_LEVEL_INFORMATION 0x02
struct logevent
{
U32 id;
U32 TimeStamp;
U32 Flags; /* internal usage, AP shall not touch it */
U32 NumOfParams;
U32 WarningLevel;
union
{
U32 params[MAX_EVENTLOG_PARAMS ];
} ParamList;
U8 Name[ARRAY_NAME_LENGTH];
};
#define CDB_EVENT_CMD_GETCOUNT 0x1
#define CDB_EVENT_CMD_GETCONTENT 0x2
typedef struct _CDB_EVENT
{
U8 OpCode; /* FIXED svucCONTROLLER_COMMAND */
U8 SubOpCode; /* FIXED ccmdEvent */
U8 Command; /* Refer to CDB_EVENT_CMD_XXXX */
U8 bEventCount;
}
PACKED CDB_EVENT, buf_space * bpCDB_EVENT;
typedef struct _CDB_SMART_CHECK
{
U8 OpCode; /* FIXED svucCONTROLLER_COMMAND */
U8 SubOpCode; /* FIXED ccmdSMART_CHECK */
U8 Control;
U8 DiskID;
U32 DiskIDMap;
}
PACKED CDB_SMART_CHECK, buf_space * bpCDB_SMART_CHECK;
typedef struct _CDB_DBG_I2C
{
U8 opCode; /* svucDEBUGGING_COMMAND (0xE2) */
U8 subOpCode; /* PDBG_I2C_XXX */
U8 bus; /* bus number */
U8 length; /* data length */
U16 address; /* slave address. Currently we use 7bit address but later we may support 10 bit.*/
U8 reserved[2];
}
PACKED CDB_DBG_I2C, buf_space * bpCDB_DBG_I2C;
#if defined(NEW_ERROR_HANDLING)
typedef struct _CDB_ERROR_FIXING
{
U8 opCode; /* FIXED svucCONTROLLER_COMMAND */
U8 subOpCode; /* FIXED ccmdERROR_FIXING */
U8 diskID; /* Error Disk */
U8 errorCmd; /* Error Command */
U8 reserved[4];
LBA lba;
}
PACKED CDB_ERROR_FIXING, buf_space * bpCDB_ERROR_FIXING;
#endif /* NEW_ERROR_HANDLING */
#define ATAPTI_GET_RESULT 0x00
#define ATAPTI_ND 0x01 /* non-data */
#define ATAPTI_PI 0x02 /* PIO IN */
#define ATAPTI_PO 0x03 /* PIO OUT */
#define ATAPTI_DR 0x04 /* Device Reset, not supported yet */
#define ATAPTI_DD 0x05 /* Execute Device Diagnostic, not supported yet */
#define ATAPTI_DM 0x06 /* DMA command */
#define ATAPTI_DMO 0x07 /* overlapped/queued DMA, not supported yet */
#define ATAPTI_P 0x08 /* packet command, not supported yet */
#define ATAPTI_VS 0x09 /* vendor specific, not supported yet */
typedef struct _CDB_ATA_PTI_EX
{
U8 OpCode; /* svucCONTROLLER_COMMAND(0xE2) */
U8 SubOpCode; /* FIXED ccmdATA_PASSTHRU_EX */
U8 DiskId;
U8 Command;
U16 Feature;
U16 SectorCount;
U32 LbaLow;
U16 LbaHigh;
U8 Proto;
U8 Device;
}
PACKED CDB_ATA_PTI_EX, buf_space * bpCDB_ATA_PTI_EX;
typedef struct _ATA_REGS
{
U16 Feature;
U16 SectorCount;
U32 LbaLow;
U16 LbaHigh;
U8 Status;
U8 Error;
U32 Reserved;
}
PACKED ATA_REGS, buf_space * bpATA_REGS;
// CAM
typedef struct _CAM_NV_GLOBAL_SETTING
{
U32 CamStatus; /* Cam Status for global setting */
#define CAM_ST_PORTREMAP 0x01 /* port 1-4/2-3 cross mapped */
#define CAM_ST_BUZZERENABLED 0x02 /* Enable board buzzer */
#define CAM_ST_DISABLE_BOOT_OOBCOMRESET 0x04 /* HDDs spin-up disabled when power up */
U32 SpinUpTime; /* default 1s. */
/* Note: If CamStatus set bit */
/* CAM_ST_DISABLE_BOOT_OOBCOMRESET, this */
/* SpinUpTime should be ignored */
U32 Reserved[6]; /* reserved for global settings */
} PACKED CAM_NV_GLOBAL_SETTING;
typedef struct _CAM_NV_PORT_SETTING
{
#define CAM_PC_DISABLE_NCQ_TCQ 0x00000001
#define CAM_PC_DISABLE_GEN_II 0x00000002
#define CAM_PC_PHY_MODE_VALID 0x00000004
U32 PortControl;
U32 Reserved1;
U32 PhyMode2; /* valid if PortControl.CAM_PC_PHY_MODE_VALID set */
U32 Reserved2[5];
} PACKED CAM_NV_PORT_SETTING;
typedef union _CAM_NV_GLOBAL_PORT_DATA
{
CAM_NV_GLOBAL_SETTING global;
CAM_NV_PORT_SETTING port;
} PACKED CAM_NV_GLOBAL_PORT_DATA, buf_space *bpCAM_NV_GLOBAL_PORT_DATA;
#define CAM_GET_SET_GLOBAL (-1)
typedef struct _CDB_GET_SET_CAM_SETTINGS
{
U8 OpCode; /* svucCONTROLLER_COMMAND */
U8 SubOpCode; /* ccmdGET_SET_CAM_SETTINGS */
U8 Command;
#define CAM_SETTING_CMD_GET_SAVED 0x00
#define CAM_SETTING_CMD_GET_CURRENT 0x01
#define CAM_SETTING_CMD_SET 0x02
#define CAM_SETTING_CMD_GLOBAL 0x80 /* PortId is invalid if global set */
U8 PortId;
}
PACKED CDB_GET_SET_CAM_SETTINGS, buf_space * bpCDB_GET_SET_CAM_SETTINGS;
#if defined( _COMPILER_MS_C_COMPATIBLE )
#pragma pack( )
#endif /* COMPILER_MS_C_COMPATIBLE */
/*------------------------------------------------------------------*/
#define COMPOSE_SCSI_CDB_LBA( bCDB, lba ) do { \
if( scsiIs16BAccessCmd((bCDB)[0]) ) { \
REVERSE_BYTES_U32( &(bCDB)[2], &(lba).u.High ); \
REVERSE_BYTES_U32( &(bCDB)[6], &(lba).u.Low ); \
} \
else { \
REVERSE_BYTES_U32( &(bCDB)[2], &(lba).u.Low ); \
} \
} while(0)
#define COMPOSE_SCSI_CDB_COUNT( bCDB, hCount ) do { \
if( scsiIs16BAccessCmd((bCDB)[0]) ) { \
(bCDB)[10] = (bCDB)[11] = 0; \
REVERSE_BYTES_U16( &(bCDB)[12], &(hCount) ); \
} \
else { \
REVERSE_BYTES_U16( &(bCDB)[7], &(hCount) ); \
} \
} while(0)
#define COMPOSE_SCSI_CDB( bCDB, lba, hCount ) do { \
if( scsiIs16BAccessCmd((bCDB)[0]) ) { \
REVERSE_BYTES_U32( &(bCDB)[2], &(lba).u.High ); \
REVERSE_BYTES_U32( &(bCDB)[6], &(lba).u.Low ); \
(bCDB)[10] = (bCDB)[11] = 0; \
REVERSE_BYTES_U16( &(bCDB)[12], &(hCount) ); \
} \
else { \
REVERSE_BYTES_U32( &(bCDB)[2], &(lba).u.Low ); \
REVERSE_BYTES_U16( &(bCDB)[7], &(hCount) ); \
} \
} while(0)
/*------------------------------------------------------------------*/
#define GET_LBA_FROM_SCSI_CDB( bCDB, lba ) do { \
if( scsiIs16BAccessCmd((bCDB)[0]) ) { \
REVERSE_BYTES_U32( &(lba).u.High, &(bCDB)[2] ); \
REVERSE_BYTES_U32( &(lba).u.Low, &(bCDB)[6] ); \
} \
else { \
(lba).u.High = 0L; \
REVERSE_BYTES_U32( &(lba).u.Low, &(bCDB)[2] ); \
} \
} while(0)
#define GET_COUNT_FROM_SCSI_CDB( bCDB, hCount ) do { \
if( scsiIs16BAccessCmd((bCDB)[0]) ) { \
REVERSE_BYTES_U16( &(hCount), &(bCDB)[12] ); \
} \
else { \
REVERSE_BYTES_U16( &(hCount), &(bCDB)[7] ); \
} \
} while(0)
#define GET_ACCESS_FROM_SCSI_CDB( bCDB, lba, hCount ) do { \
if( scsiIs16BAccessCmd((bCDB)[0]) ) { \
REVERSE_BYTES_U32( &(lba).u.High, &(bCDB)[2] ); \
REVERSE_BYTES_U32( &(lba).u.Low, &(bCDB)[6] ); \
REVERSE_BYTES_U16( &(hCount), &(bCDB)[12] ); \
} \
else { \
(lba).u.High = 0L; \
REVERSE_BYTES_U32( &(lba).u.Low, &(bCDB)[2] ); \
REVERSE_BYTES_U16( &(hCount), &(bCDB)[7] ); \
} \
} while(0)
/*------------------------------------------------------------------*/
#endif /* ENGINE_SCSI3_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -