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 + -
显示快捷键?