⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eng_scsi.h

📁 RAID卡的测试程序
💻 H
📖 第 1 页 / 共 3 页
字号:
#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 + -