scsi2sata.c

来自「6440linuxDriver的源代码」· C语言 代码 · 共 1,717 行 · 第 1/4 页

C
1,717
字号
	){	if( (pReq->Cdb[4]&0xF0) != 0 )	{		SCSI_ATA_CheckCondition( pReq, SCSI_SK_ILLEGAL_REQUEST, 				SCSI_ASC_INVALID_FEILD_IN_CDB );		return;	}}/**************************************************************************** SCSI_ATA_TestUnitReadyTranslation* Purpose: Test Unit Ready cmd translation****************************************************************************/void SCSI_ATA_TestUnitReadyTranslationCallback(	IN MV_PVOID This,	IN PMV_Request pReq	){	PCore_Driver_Extension pCore = (PCore_Driver_Extension)This;	PSATA_FIS_REG_H2D pFIS = (PSATA_FIS_REG_H2D)pCore->RX_FIS;	// 6th byte	if(pFIS->LBA_High & 0x1)	{		SCSI_ATA_CheckCondition(pReq, SCSI_SK_NOT_READY, 				SCSI_ASC_LOGICAL_UNIT_NOT_RESP_TO_SEL );	}	pReq->Scsi_Status = SCSI_STATUS_GOOD;}/**************************************************************************** SCSI_ATA_TestUnitReadyTranslation* Purpose: Test Unit Ready cmd translation****************************************************************************/void SCSI_ATA_TestUnitReadyTranslation(	IN PDomain_Device pDevice,	IN PMV_Request pReq, 	OUT PATA_TaskFile pTaskFile	){	if( pDevice->State == DEVICE_STATE_FORMAT_WRITE || 		pDevice->State == DEVICE_STATE_FORMAT_VERIFY )	{		SCSI_ATA_CheckCondition( pReq, SCSI_SK_NOT_READY, 				SCSI_ASC_LUN_NOT_READY );		return;	}	pReq->Completion = SCSI_ATA_TestUnitReadyTranslationCallback;	pTaskFile->Command = ATA_CMD_PM_CHECK;}/**************************************************************************** SCSI_ATA_RequestSenseTranslation* Purpose: Request sense translation****************************************************************************/void SCSI_ATA_RequestSenseTranslation(	IN PDomain_Device pDevice,	IN PMV_Request pReq, 	OUT PATA_TaskFile pTaskFile	){	if( pDevice->State == DEVICE_STATE_FORMAT_WRITE || 		pDevice->State == DEVICE_STATE_FORMAT_VERIFY )	{		SCSI_ATA_CheckCondition( pReq, SCSI_SK_NOT_READY, 				SCSI_ASC_LUN_NOT_READY );		return;	}	if( pDevice->Capacity & DEVICE_SETTING_SMART_ENABLED )	{		// MRIE is set to 6h		// DExcpt bit is set to 0		SCSI_ATA_CheckCondition( pReq, 				SCSI_ASC_FAILURE_PREDICTION_THRESHOLD_EXCEEDED, 				SCSI_ASCQ_HIF_GENERAL_HD_FAILURE );	}	pTaskFile->Command	= 0xB0;	pTaskFile->Features = ATA_CMD_SMART_RETURN_STATUS;	}/**************************************************************************** ATA_CDB2TaskFile* Purpose: Convert Cdb SCSI to ATA taskfile ****************************************************************************/MV_BOOLEAN ATA_CDB2TaskFile(	IN PDomain_Device pDevice,	IN PMV_Request pReq, 	IN MV_U8 tag,	OUT PATA_TaskFile pTaskFile	){	//ATA_TaskFile TaskFiletemp;	//MV_BOOLEAN status = MV_TRUE;	MV_ZeroMemory(pTaskFile, sizeof(ATA_TaskFile));	//MV_ZeroMemory(&TaskFiletemp, sizeof(ATA_TaskFile));    switch ( pReq->Cdb[0] )	{		case SCSI_CMD_FORMAT_UNIT:			if(FirstRun)			{				pDevice->State = DEVICE_STATE_FORMAT_WRITE;				FirstRun = MV_FALSE;			}			SCSI_ATA_FormatUnitTranslation(pDevice, pReq, pTaskFile);			break;		case SCSI_CMD_INQUIRY:			SCSI_ATA_InquiryTranslation( pReq, pTaskFile );			break;		case SCSI_CMD_LOG_SENSE:			SCSI_ATA_LogSenseTranslation( pDevice, pReq, pTaskFile );			break;		case SCSI_CMD_MODE_SELECT_6:		case SCSI_CMD_MODE_SELECT_10:			SCSI_ATA_ModeSelectTranslation( pDevice, pReq, pTaskFile);			break;		case SCSI_CMD_MODE_SENSE_6:		case SCSI_CMD_MODE_SENSE_10:			SCSI_ATA_ModeSenseTranslation( pDevice, pReq, pTaskFile );			break;		case SCSI_CMD_READ_10:		case SCSI_CMD_WRITE_10:		case SCSI_CMD_READ_16:		case SCSI_CMD_WRITE_16:			SCSI_ATA_ReadWriteTranslation( pReq, tag, pTaskFile );			break;		case SCSI_CMD_READ_CAPACITY_10:		case SCSI_CMD_READ_CAPACITY_16:			SCSI_ATA_ReadCapacityTranslation( pReq, pTaskFile );			break;		case SCSI_CMD_VERIFY_10:		case SCSI_CMD_VERIFY_16:			SCSI_ATA_VerifyTranslation( pReq, pTaskFile );			break;		case SCSI_CMD_SYNCHRONIZE_CACHE_10:		case SCSI_CMD_SYNCHRONIZE_CACHE_16:			SCSI_ATA_SyncCacheTranslation(pDevice, pReq, pTaskFile);			break;		case SCSI_CMD_SND_DIAG:			SCSI_ATA_SendDiagTranslation( pReq, pTaskFile );			break;		case SCSI_CMD_START_STOP_UNIT:			//SCSI_ATA_StartStopTranslation(pReq, pTaskFile );			if (pReq->Cdb[4] & MV_BIT(0))			{				pTaskFile->Command = ATA_CMD_SEEK;				pTaskFile->Device = MV_BIT(6);			}			else			{				pTaskFile->Command = ATA_CMD_STANDBY_IMMEDIATE;			}			break;		case SCSI_CMD_TEST_UNIT_READY:			SCSI_ATA_TestUnitReadyTranslation( pDevice, pReq, pTaskFile );			break;		case SCSI_CMD_REQUEST_SENSE:			SCSI_ATA_RequestSenseTranslation( pDevice, pReq, pTaskFile );			break;		case SCSI_CMD_MARVELL_SPECIFIC:			{				/* This request should be for core module */				if ( pReq->Cdb[1]!=CDB_CORE_MODULE )					return MV_FALSE;				switch ( pReq->Cdb[2] )				{					case CDB_CORE_SOFT_RESET_1:						pTaskFile->Control = MV_BIT(2);						break;					case CDB_CORE_SOFT_RESET_0:						pTaskFile->Control = 0;						break;					case CDB_CORE_IDENTIFY:						pTaskFile->Command = ATA_CMD_IDENTIFY_ATA;						break;										case CDB_CORE_SET_UDMA_MODE:						pTaskFile->Command = ATA_CMD_SET_FEATURES;						pTaskFile->Features = ATA_CMD_SET_TRANSFER_MODE;						pTaskFile->Sector_Count = 0x40 | pReq->Cdb[3];						MV_DASSERT( pReq->Cdb[4]==MV_FALSE );	/* Use UDMA mode */						//TBD: Check the 80-conductor cable in order to enable UDMA greater than 2.						break;					case CDB_CORE_SET_PIO_MODE:						pTaskFile->Command = ATA_CMD_SET_FEATURES;						pTaskFile->Features = ATA_CMD_SET_TRANSFER_MODE;						pTaskFile->Sector_Count = 0x08 | pReq->Cdb[3];						break;					case CDB_CORE_ENABLE_WRITE_CACHE:						pTaskFile->Command = ATA_CMD_SET_FEATURES;						pTaskFile->Features = ATA_CMD_ENABLE_WRITE_CACHE;						break;								case CDB_CORE_DISABLE_WRITE_CACHE:						pTaskFile->Command = ATA_CMD_SET_FEATURES;						pTaskFile->Features = ATA_CMD_DISABLE_WRITE_CACHE;						break;					case CDB_CORE_ENABLE_SMART:						pTaskFile->Command = ATA_CMD_SMART;						pTaskFile->Features = ATA_CMD_ENABLE_SMART;						pTaskFile->LBA_Mid = 0x4F;						pTaskFile->LBA_High = 0xC2;						break;					case CDB_CORE_DISABLE_SMART:						pTaskFile->Command = ATA_CMD_SMART;						pTaskFile->Features = ATA_CMD_DISABLE_SMART;						pTaskFile->LBA_Mid = 0x4F;						pTaskFile->LBA_High = 0xC2;						break;					case CDB_CORE_SMART_RETURN_STATUS:						pTaskFile->Command = ATA_CMD_SMART;						pTaskFile->Features = ATA_CMD_SMART_RETURN_STATUS;						pTaskFile->LBA_Mid = 0x4F;						pTaskFile->LBA_High = 0xC2;						break;					case CDB_CORE_SHUTDOWN:						if ( pDevice->Capacity&DEVICE_CAPACITY_48BIT_SUPPORTED )							pTaskFile->Command = ATA_CMD_FLUSH_EXT;						else							pTaskFile->Command = ATA_CMD_FLUSH;						break;					case CDB_CORE_ENABLE_READ_AHEAD:							pTaskFile->Command = ATA_CMD_SET_FEATURES;						pTaskFile->Features = ATA_CMD_ENABLE_READ_LOOK_AHEAD;						break;					case CDB_CORE_DISABLE_READ_AHEAD:						pTaskFile->Command = ATA_CMD_SET_FEATURES;						pTaskFile->Features = ATA_CMD_DISABLE_READ_LOOK_AHEAD;						break;										case CDB_CORE_READ_LOG_EXT:						pTaskFile->Command = ATA_CMD_READ_LOG_EXT;						pTaskFile->Sector_Count = 1;	/* Read one sector */						pTaskFile->LBA_Low = 0x10;		/* Page 10h */						break;					case CDB_CORE_PM_READ_REG:						pTaskFile->Command = ATA_CMD_PM_READ;						pTaskFile->Features = pReq->Cdb[4];						pTaskFile->Device = pReq->Cdb[3];						break;					case CDB_CORE_OS_SMART_CMD:						{						    pTaskFile->Command = pReq->Cdb[3];						    pTaskFile->Features = pReq->Cdb[4];						    pTaskFile->LBA_Low = pReq->Cdb[5];						    pTaskFile->LBA_Mid  = pReq->Cdb[6];						    pTaskFile->LBA_High = pReq->Cdb[7];						    pTaskFile->LBA_Low_Exp = pReq->Cdb[9];						    pTaskFile->Sector_Count = pReq->Cdb[8];						    break;						}					case CDB_CORE_PM_WRITE_REG:						pTaskFile->Command = ATA_CMD_PM_WRITE;						pTaskFile->Features = pReq->Cdb[4];						pTaskFile->Device = pReq->Cdb[3];						pTaskFile->LBA_Low = pReq->Cdb[5];						pTaskFile->LBA_Mid = pReq->Cdb[6];						pTaskFile->LBA_High = pReq->Cdb[7];						pTaskFile->Sector_Count = pReq->Cdb[8];						break;					default:						return MV_FALSE;				}				break;			}		#ifndef _OS_BIOS				MV_DPRINT(("Error: Unknown request: 0x%x.\n", pReq->Cdb[0]));		#endif		default:			return MV_FALSE;	}	return MV_TRUE;}MV_BOOLEAN ATAPI_CDB2TaskFile(	IN PDomain_Device pDevice,	IN PMV_Request pReq, 	OUT PATA_TaskFile pTaskFile	){	MV_ZeroMemory(pTaskFile, sizeof(ATA_TaskFile));	/* At the same time, set the command category as well. */    switch ( pReq->Cdb[0] )	{		case SCSI_CMD_MARVELL_SPECIFIC:			/* This request should be for core module */			if ( pReq->Cdb[1]!=CDB_CORE_MODULE )				return MV_FALSE;			switch ( pReq->Cdb[2] )			{				case CDB_CORE_SOFT_RESET_1:					pTaskFile->Control = MV_BIT(2);					break;				case CDB_CORE_SOFT_RESET_0:					pTaskFile->Control = 0;					break;				case CDB_CORE_IDENTIFY:					pTaskFile->Command = ATA_CMD_IDENTIY_ATAPI;					break;											case CDB_CORE_SET_UDMA_MODE:					pTaskFile->Command = ATA_CMD_SET_FEATURES;					pTaskFile->Features = ATA_CMD_SET_TRANSFER_MODE;					if ( pReq->Cdb[4]==MV_TRUE )						pTaskFile->Sector_Count = 0x20 | pReq->Cdb[3];	/* MDMA mode */					else						pTaskFile->Sector_Count = 0x40 | pReq->Cdb[3];	/* UDMA mode*/					//TBD: Check the 80-conductor cable in order to enable UDMA greater than 2.					break;											case CDB_CORE_SET_PIO_MODE:					pTaskFile->Command = ATA_CMD_SET_FEATURES;					pTaskFile->Features = ATA_CMD_SET_TRANSFER_MODE;					pTaskFile->Sector_Count = 0x08 | pReq->Cdb[3];					break;				case CDB_CORE_PM_READ_REG:					pTaskFile->Command = ATA_CMD_PM_READ;					pTaskFile->Features = pReq->Cdb[4];					pTaskFile->Device = pReq->Cdb[3];					break;				case CDB_CORE_PM_WRITE_REG:					pTaskFile->Command = ATA_CMD_PM_WRITE;					pTaskFile->Features = pReq->Cdb[4];					pTaskFile->Device = pReq->Cdb[3];					pTaskFile->LBA_Low = pReq->Cdb[5];					pTaskFile->LBA_Mid = pReq->Cdb[6];					pTaskFile->LBA_High = pReq->Cdb[7];					pTaskFile->Sector_Count = pReq->Cdb[8];					break;		                case CDB_CORE_OS_SMART_CMD:		                //Now we don't support SMART on ATAPI device.				default:					return MV_FALSE;			}			break;		case SCSI_CMD_READ_10:		case SCSI_CMD_WRITE_10:		case SCSI_CMD_VERIFY_10:		case SCSI_CMD_INQUIRY:		case SCSI_CMD_READ_CAPACITY_10:		case SCSI_CMD_TEST_UNIT_READY:		case SCSI_CMD_MODE_SENSE_10:		case SCSI_CMD_MODE_SELECT_10:		case SCSI_CMD_PREVENT_MEDIUM_REMOVAL:		case SCSI_CMD_READ_TOC:		case SCSI_CMD_BLANK:		case SCSI_CMD_READ_DISC_INFO:		case SCSI_CMD_START_STOP_UNIT:		case SCSI_CMD_SYNCHRONIZE_CACHE_10:		case SCSI_CMD_REQUEST_SENSE:		default:		/* 		 * Use packet command 		 */		/* Features: DMA, OVL, DMADIR */#if defined(USE_DMA_FOR_ALL_PACKET_COMMAND)			if ( !(pReq->Cmd_Flag&CMD_FLAG_NON_DATA) )			{				//if ( pReq->Cdb[0]!=SCSI_CMD_INQUIRY ) //ATAPI???				pTaskFile->Features |= MV_BIT(0);			}#elif defined(USE_PIO_FOR_ALL_PACKET_COMMAND)			/* do nothing */#else			if ( pReq->Cmd_Flag&CMD_FLAG_DMA )				//if ( SCSI_IS_READ(pReq->Cdb[0]) || 				//   SCSI_IS_WRITE(pReq->Cdb[0]) )				pTaskFile->Features |= MV_BIT(0);#endif			//TBD: OVL: overlapped.			//TBD: DMADIR in IDENTIFY PACKET DEVICE word 62			//TBD: Sector Count: Tag			/* Byte count low and byte count high */			if ( pReq->Data_Transfer_Length>0xFFFF )			{				pTaskFile->LBA_Mid = 0xFF;				pTaskFile->LBA_High = 0xFF;			}			else			{				pTaskFile->LBA_Mid = (MV_U8)pReq->Data_Transfer_Length;				pTaskFile->LBA_High = (MV_U8)(pReq->Data_Transfer_Length>>8);			}			pTaskFile->Command = ATA_CMD_PACKET;		break;	}	return MV_TRUE;}

⌨️ 快捷键说明

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