ata2scsi.c

来自「6440linuxDriver的源代码」· C语言 代码 · 共 169 行

C
169
字号
#include "core_header.h"#include "core_exp.h"#include "core_sata.h"#include "core_ata.h"#include "core_helper.h"#ifdef CORE_SAS_SUPPORT_ATA_COMMAND/* Please refer to SAT for the parameter settings. */MV_U8 SCSI_MakeModePageCaching(MV_PU8 pBuf, MV_BOOLEAN writeCache, MV_BOOLEAN preread){	//TBD: Some of the parameters, it's better to get the original value first.	pBuf[0] = 0x08;					/* Page Code, PS = 0; */	pBuf[1] = 0x12;					/* Page Length */	pBuf[2] = writeCache?0x04:0;	/* Write/Read Cache is disabled */	pBuf[3] = 0;					/* Demand read/write retention priority */	pBuf[4] = 0;					/* Disable pre-fetch transfer length (4,5) */	pBuf[5] = 0;	pBuf[6] = 0;					/* Minimum pre-fetch (6,7) */	pBuf[7] = 0;	pBuf[8] = 0;					/* Maximum pre-fetch (8,9) */	pBuf[9] = 0;	pBuf[10] = 0;					/* Maximum pre-fetch ceiling (10,11) */	pBuf[11] = 0;	pBuf[12] = preread?0:0x20;		/* Disable Read-Ahead,  */	pBuf[13] = 0;					/* Number of cache segments */	pBuf[14] = 0;					/* Cache segment size (14, 15) */	pBuf[15] = 0;	pBuf[16] = 0;					/* Reserved */	pBuf[17] = 0;					/* Obsolete */	pBuf[18] = 0;	pBuf[19] = 0;	return 0x14;	/* Total page length in byte */}/* * Translate ATA command to SCSI command. */MV_BOOLEANSCSI_MakeSMARTReturnStatusCommand(	PCore_Driver_Extension pCore,	PMV_Request pReq	){	PSATA_Scratch_Buffer pSATASB = GetSATAScratchFromPool(pCore);	PMV_SG_Table pSGTable;	MV_U16 bufferLength = SATA_SCRATCH_BUFFER_SIZE;	if( pSATASB == NULL ) {		MV_DPRINT(("No resource for SCSI_MakeSMARTReturnStatusCommand.\n"));		return MV_FALSE;	}	CoreSaveOriginalCDB(pCore, pReq);	MV_ZeroMemory(pReq->Cdb, MAX_CDB_SIZE);	pReq->Cdb[0] = SCSI_CMD_LOG_SENSE;	pReq->Cdb[1] = 0;					/* SP=0 PPC=0 */	pReq->Cdb[2] = 0x6F;				/* Page=2F(Informal Exceptions Log) PC=01b(Cumulative Values) */	pReq->Cdb[7] = bufferLength>>8;		/* Allocation Length (7,8)  */	pReq->Cdb[8] = (MV_U8)bufferLength;	pReq->Cdb[9] = 0;					/* Control */	pSGTable = &pReq->SG_Table;	pReq->Data_Transfer_Length = bufferLength;	pReq->Cmd_Flag = CMD_FLAG_DATA_IN;	//MV_DASSERT( pReq->Data_Buffer==NULL );	pReq->Data_Buffer = pSATASB->Scratch_Vir;	pReq->Scratch_Buffer = pSATASB;	//pReq->Completion = (void(*)(MV_PVOID,PMV_Request))SAS_InternalReqCallback;	/* Make the SG table. */	SGTable_Init(pSGTable, 0);	SGTable_Append(		pSGTable, 		pSATASB->Scratch_DMA.parts.low,		pSATASB->Scratch_DMA.parts.high,		bufferLength);	return MV_TRUE;}MV_BOOLEANSCSI_MakeCacheCommand(	PCore_Driver_Extension pCore,	PMV_Request pReq,	MV_BOOLEAN writecache,	MV_BOOLEAN preread	){	PSATA_Scratch_Buffer pSATASB = GetSATAScratchFromPool(pCore);	PMV_SG_Table pSGTable;	MV_PU8 pBuf = NULL;	MV_U8  pageLength;	MV_U8 bufferLength;	if( pSATASB == NULL ) {		MV_DPRINT(("No resource for SCSI_MakeCacheCommand.\n"));		return MV_FALSE;	}	pBuf = (MV_PU8)pSATASB->Scratch_Vir;	/* Mode page */	pageLength = SCSI_MakeModePageCaching(&pBuf[4], writecache, preread);	/* Mode parameter header (6) */	pBuf[0] = 0;	/* Mode Data Length=0. For MODE SELECT, non-zero value will make request fail. */	pBuf[1] = 0;	/* Medium Type: refer to SBC */	pBuf[2] = 0;	/* Device-Specific Parameter: refer to SBC */	pBuf[3] = 0;	/* Block Descriptor Length: No block descriptor */	CoreSaveOriginalCDB(pCore, pReq);	MV_ZeroMemory(pReq->Cdb, MAX_CDB_SIZE);	bufferLength = pageLength+4;	pReq->Cdb[0] = SCSI_CMD_MODE_SELECT_6;	pReq->Cdb[1] = 0x11;			/* SP=1 PF=1 */	pReq->Cdb[4] = bufferLength;	/* Parameter List Length */	pReq->Cdb[5] = 0;				/* Control */	pSGTable = &pReq->SG_Table;	pReq->Data_Transfer_Length = bufferLength;	pReq->Cmd_Flag = 0;							/* Data Out */	//MV_DASSERT( pReq->Data_Buffer==NULL );	/* Raid will send request with buffer. Save it. */	pReq->Data_Buffer = pSATASB->Scratch_Vir;	pReq->Scratch_Buffer = pSATASB;	//pReq->Completion = (void(*)(MV_PVOID,PMV_Request))SAS_InternalReqCallback;	/* Make the SG table. */	SGTable_Init(pSGTable, 0);	SGTable_Append(		pSGTable, 		pSATASB->Scratch_DMA.parts.low,		pSATASB->Scratch_DMA.parts.high,		bufferLength);	return MV_TRUE;}MV_VOIDSCSI_MakeSynchronizeCacheCommmand(	PCore_Driver_Extension pCore,	PMV_Request pReq	){	PMV_SG_Table pSGTable;	CoreSaveOriginalCDB(pCore, pReq);	MV_ZeroMemory(pReq->Cdb, MAX_CDB_SIZE);	pReq->Cdb[0] = SCSI_CMD_SYNCHRONIZE_CACHE_10;	pReq->Data_Transfer_Length = 0;	pReq->Cmd_Flag = CMD_FLAG_NON_DATA;	//MV_DASSERT( pReq->Data_Buffer==NULL );	pReq->Data_Buffer = NULL;	pReq->Scratch_Buffer = NULL;	//pReq->Completion = (void(*)(MV_PVOID,PMV_Request))SAS_InternalReqCallback;	/* Make the SG table. */	pSGTable = &pReq->SG_Table;	SGTable_Init(pSGTable, 0);}#endif /* CORE_SAS_SUPPORT_ATA_COMMAND */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?