Пример #1
0
MV_U32 mod_get_mem_size(PHBA_Extension pHBA, enum Resource_Type type,
			MV_U16 max_io)
{
        int i = 0;
        unsigned long quota = 0;
        unsigned long  oneQuota = 0;

        for (i=0; i<MAX_MODULE_NUMBER; i++) {
                if (module_set[i].get_mem_size != NULL) {
                        oneQuota = module_set[i].get_mem_size(type, max_io);
                        quota += ROUNDING(oneQuota, 8);
                        MV_DBG(DMSG_KERN,
                               "%s quota for module %d is 0x%lx.\n", 
                               type == RESOURCE_CACHED_MEMORY? "Cached memory" : "Uncached memory",
                               i, 
                               oneQuota);

                        if (oneQuota) {
                                if (type == RESOURCE_UNCACHED_MEMORY) {
                                        MV_PVOID uncached_virtual = NULL;
                                        uncached_virtual = pci_alloc_consistent(pHBA->pcidev,
                                                                                                  oneQuota,
                                                                                                  &pHBA->uncached_physical[i]);
                                        pHBA->uncached_size[i] = oneQuota;
                                        if (uncached_virtual != NULL)
                                                pHBA->uncached_virtual_address[i] = uncached_virtual;
#ifdef CACHE_MODULE_SUPPORT
                                        else if (i == MODULE_CACHE) 
                                                MV_DPRINT(("Module %d asks for uncached memory failed.\n", i));
#endif
                                        else
                                                return -1;
                                }
                        }
                }
        }

        /* Each extension needs one extension header which is hidden from module. */
        if ( type==RESOURCE_CACHED_MEMORY )
                quota += MODULE_HEADER_SIZE * MAX_MODULE_NUMBER;

        MV_DBG(DMSG_KERN, "%s quota totally is 0x%lx.\n",
                type==RESOURCE_CACHED_MEMORY? "Cached memory" : "Uncached memory",
                quota);

        return quota;
}
Пример #2
0
/* Set MV_Request.Cmd_Flag */
MV_BOOLEAN Category_CDB_Type(
	IN PDomain_Device pDevice,
	IN PMV_Request pReq
	)
{
	PDomain_Port pPort = pDevice->PPort;

	switch ( pReq->Cdb[0] )
	{
		case SCSI_CMD_READ_10:
		case SCSI_CMD_READ_16:
			pReq->Cmd_Flag |= CMD_FLAG_DATA_IN;
			
		case SCSI_CMD_WRITE_10:
		case SCSI_CMD_WRITE_16:
		case SCSI_CMD_VERIFY_10:
			/* 
			 * 
			 * CMD_FLAG_DATA_IN
			 * CMD_FLAG_NON_DATA
			 * CMD_FLAG_DMA
			 */
			if ( pDevice->Device_Type&DEVICE_TYPE_ATAPI )
				pReq->Cmd_Flag |= CMD_FLAG_PACKET;

			if ( pDevice->Capacity&DEVICE_CAPACITY_48BIT_SUPPORTED )
				pReq->Cmd_Flag |= CMD_FLAG_48BIT;

			if ( pDevice->Capacity&DEVICE_CAPACITY_NCQ_SUPPORTED )
			{
				// might be a PM - assert is no longer true
				//MV_DASSERT( pPort->Type==PORT_TYPE_SATA );		
#if 0
				if ( (pReq->Cdb[0]==SCSI_CMD_READ_10)
					|| (pReq->Cdb[0]==SCSI_CMD_WRITE_10) )
#else
				if (SCSI_IS_READ(pReq->Cdb[0]) || SCSI_IS_WRITE(pReq->Cdb[0]))
#endif
				{
					if ( (pPort->Running_Slot==0)
						|| (pPort->Setting&PORT_SETTING_NCQ_RUNNING) )
					{
						/* hardware workaround:
						 * don't do NCQ on silicon image PM */
						if( !((pPort->Setting & PORT_SETTING_PM_EXISTING) && 
							(pPort->PM_Vendor_Id == 0x1095 )) )
						{
							if ( pReq->Scsi_Status!=REQ_STATUS_RETRY )
								pReq->Cmd_Flag |= CMD_FLAG_NCQ;
						}
					}
				}
			}

			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_IDENTIFY:
					case CDB_CORE_READ_LOG_EXT:
						pReq->Cmd_Flag |= CMD_FLAG_DATA_IN;
						break;
					case CDB_CORE_SET_UDMA_MODE:
					case CDB_CORE_SET_PIO_MODE:
					case CDB_CORE_ENABLE_WRITE_CACHE:
					case CDB_CORE_DISABLE_WRITE_CACHE:
					case CDB_CORE_ENABLE_READ_AHEAD:
					case CDB_CORE_DISABLE_READ_AHEAD:
						pReq->Cmd_Flag |= CMD_FLAG_NON_DATA;
						break;
				#ifdef SUPPORT_ATA_SMART
					case CDB_CORE_ATA_IDENTIFY_PACKET_DEVICE:
						pReq->Cmd_Flag |= (CMD_FLAG_DATA_IN | CMD_FLAG_SMART);
						break;
					case CDB_CORE_ENABLE_SMART:
					case CDB_CORE_DISABLE_SMART:
					case CDB_CORE_SMART_RETURN_STATUS:
					case  CDB_CORE_ATA_SMART_AUTO_OFFLINE:
					case CDB_CORE_ATA_SMART_AUTOSAVE:      
					case CDB_CORE_ATA_SMART_IMMEDIATE_OFFLINE:
						pReq->Cmd_Flag |= (CMD_FLAG_NON_DATA | CMD_FLAG_SMART);
						break;
					case CDB_CORE_ATA_SMART_READ_VALUES:
					case CDB_CORE_ATA_SMART_READ_THRESHOLDS:
					case CDB_CORE_ATA_SMART_READ_LOG_SECTOR:
						pReq->Cmd_Flag |= (CMD_FLAG_DATA_IN | CMD_FLAG_SMART);
						break;
					case CDB_CORE_ATA_SMART_WRITE_LOG_SECTOR:
						pReq->Cmd_Flag |= (CMD_FLAG_DATA_OUT | CMD_FLAG_SMART);
						break;
				#endif
					case CDB_CORE_ATA_IDENTIFY:
						pReq->Cmd_Flag |= (CMD_FLAG_DATA_IN | CMD_FLAG_SMART);
						break;		
					case CDB_CORE_ATA_DOWNLOAD_MICROCODE:
						break;
					case CDB_CORE_SHUTDOWN:
						if ( pDevice->Device_Type&DEVICE_TYPE_ATAPI )
							return MV_FALSE;
						MV_DPRINT(("Shutdown on device %d.\n", pReq->Device_Id));
						pReq->Cmd_Flag |= CMD_FLAG_NON_DATA;
						break;
               #ifdef SUPPORT_ATA_POWER_MANAGEMENT
					case CDB_CORE_ATA_SLEEP:
					case CDB_CORE_ATA_IDLE:
					case CDB_CORE_ATA_STANDBY:
					case CDB_CORE_ATA_IDLE_IMMEDIATE:
					case CDB_CORE_ATA_CHECK_POWER_MODE:
					case CDB_CORE_ATA_STANDBY_IMMEDIATE:
                                               pReq->Cmd_Flag |= CMD_FLAG_NON_DATA;
                                               break;
               #endif
					case CDB_CORE_OS_SMART_CMD:
						if  ((pReq->Cdb[3] != ATA_CMD_IDENTIFY_ATA) ||
							(pReq->Cdb[3] != ATA_CMD_IDENTIY_ATAPI))
							pReq->Cmd_Flag |= CMD_FLAG_SMART;
						if (pDevice->Device_Type & DEVICE_TYPE_ATAPI)
							pReq->Cmd_Flag |= CMD_FLAG_PACKET;
						break;
					default:
						return MV_FALSE;
				}
				break;
			}
#ifdef SUPPORT_ATA_SECURITY_CMD
			case ATA_16:
			return MV_TRUE;
			break;
#endif
		case SCSI_CMD_START_STOP_UNIT:	
		case SCSI_CMD_SYNCHRONIZE_CACHE_10:
			if ( !(pDevice->Device_Type & DEVICE_TYPE_ATAPI )){
				if ( pDevice->Capacity&DEVICE_CAPACITY_48BIT_SUPPORTED )
					pReq->Cmd_Flag |= CMD_FLAG_48BIT;
				pReq->Cmd_Flag |= CMD_FLAG_NON_DATA;
				break;
			}	//We will send this command to CD drive directly if it is ATAPI device.	
		case SCSI_CMD_SND_DIAG:
			pReq->Cmd_Flag |= CMD_FLAG_DATA_OUT;
		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_REQUEST_SENSE:
		default:
			if ( pDevice->Device_Type&DEVICE_TYPE_ATAPI )
			{
				pReq->Cmd_Flag |= CMD_FLAG_PACKET;
				break;
			}
			else
			{
				MV_DPRINT(("Error: Unknown request: 0x%x.\n", pReq->Cdb[0]));
				return MV_FALSE;
			}
	}

	return MV_TRUE;
}
/* Set MV_Request.Cmd_Flag */
MV_BOOLEAN Category_CDB_Type(
    IN PDomain_Device pDevice,
    IN PMV_Request pReq
)
{
    //pReq->Cmd_Flag = 0;//TBD: Don't set. HBA has set some bits.
    PDomain_Port pPort = pDevice->PPort;

    switch ( pReq->Cdb[0] )
    {
    case SCSI_CMD_READ_10:
    case SCSI_CMD_READ_12:
    case SCSI_CMD_WRITE_10:
    case SCSI_CMD_VERIFY_10:
        /*
         *
         * CMD_FLAG_DATA_IN
         * CMD_FLAG_NON_DATA
         * CMD_FLAG_DMA
         */
        if ( pDevice->Device_Type&DEVICE_TYPE_ATAPI )
            pReq->Cmd_Flag |= CMD_FLAG_PACKET;

        if ( pDevice->Capacity&DEVICE_CAPACITY_48BIT_SUPPORTED )
            pReq->Cmd_Flag |= CMD_FLAG_48BIT;
#if 0
        if ( pDevice->Capacity&DEVICE_CAPACITY_NCQ_SUPPORTED )
        {
            if ( ((pReq->Cdb[0]==SCSI_CMD_READ_10) || (pReq->Cdb[0]==SCSI_CMD_READ_12)
                    || (pReq->Cdb[0]==SCSI_CMD_WRITE_10))
                    && (pReq->SG_Table.Valid_Entry_Count <= 1) /* PRDTL=1 bug */
               )
            {
                if ( (pPort->Running_Slot==0) || (pPort->Setting&PORT_SETTING_NCQ_RUNNING) )
                {
                    /* hardware workaround:
                     * don't do NCQ on silicon image PM */
                    if( !((pPort->Setting & PORT_SETTING_PM_EXISTING) &&
                            (pPort->PM_Vendor_Id == 0x1095 )) )
                    {
                        if ( pReq->Scsi_Status!=REQ_STATUS_RETRY )
                            pReq->Cmd_Flag |= CMD_FLAG_NCQ;
                    }
                }
            }
        }
#endif
        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_IDENTIFY:
        case CDB_CORE_READ_LOG_EXT:
            pReq->Cmd_Flag |= CMD_FLAG_DATA_IN;
            break;

        case CDB_CORE_SET_UDMA_MODE:
        case CDB_CORE_SET_PIO_MODE:
        case CDB_CORE_ENABLE_WRITE_CACHE:
        case CDB_CORE_DISABLE_WRITE_CACHE:
        case CDB_CORE_ENABLE_SMART:
        case CDB_CORE_DISABLE_SMART:
        case CDB_CORE_SMART_RETURN_STATUS:
        case CDB_CORE_ENABLE_READ_AHEAD:
        case CDB_CORE_DISABLE_READ_AHEAD:
            pReq->Cmd_Flag |= CMD_FLAG_NON_DATA;
            break;

        case CDB_CORE_SHUTDOWN:
            if ( pDevice->Device_Type&DEVICE_TYPE_ATAPI )
                return MV_FALSE;
            MV_DPRINT(("Shutdown on device %d.\n", pReq->Device_Id));
            pReq->Cmd_Flag |= CMD_FLAG_NON_DATA;
            break;

        default:
            return MV_FALSE;
        }
        break;
    }

    case SCSI_CMD_START_STOP_UNIT:
    case SCSI_CMD_SYNCHRONIZE_CACHE_10:
        if ( !(pDevice->Device_Type & DEVICE_TYPE_ATAPI )) {
            if ( pDevice->Capacity&DEVICE_CAPACITY_48BIT_SUPPORTED )
                pReq->Cmd_Flag |= CMD_FLAG_48BIT;
            pReq->Cmd_Flag |= CMD_FLAG_NON_DATA;
            break;
        }//We will send this command to CD drive directly if it is ATAPI device.

    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_REQUEST_SENSE:
    default:
        if ( pDevice->Device_Type&DEVICE_TYPE_ATAPI )
        {
            //MV_DPRINT(("Other requests: 0x%x.\n", pReq->Cdb[0]));
            pReq->Cmd_Flag |= CMD_FLAG_PACKET;

#if 0 //TBD: Refer to TranslateSCSIRequest
            if ( pReq->Data_Transfer_Length==0 )
            {
                pReq->Cmd_Flag |= CMD_FLAG_NON_DATA;
            }
            else
            {
                if ( pReq->Cdb[0]==SCSI_CMD_INQUIRY
                        || pReq->Cdb[0]==SCSI_CMD_READ_CAPACITY_10
                        || pReq->Cdb[0]==SCSI_CMD_REQUEST_SENSE
                        || pReq->Cdb[0]==SCSI_CMD_REPORT_LUN
                        || pReq->Cdb[0]==SCSI_CMD_READ_DISC_STRUCTURE
                        || pReq->Cdb[0]==SCSI_CMD_READ_TOC
                        || pReq->Cdb[0]==SCSI_CMD_READ_SUB_CHANNEL
                        || pReq->Cdb[0]==SCSI_CMD_READ_CD
                        || pReq->Cdb[0]==SCSI_CMD_GET_EVENT_STATUS_NOTIFICATION
                   )
                {
                    pReq->Cmd_Flag |= CMD_FLAG_DATA_IN;
                }
                else if ( pReq->Cdb[0]==SCSI_CMD_MODE_SENSE_10 )
                {
                    /* Data out */
                }
                else
                {
                    MV_DPRINT(("Should be data-in or data-out: 0x%x.\n", pReq->Cdb[0]));
                    //MV_ASSERT(MV_FALSE);
                }
            }
#endif

            break;
        }
        else
        {
            MV_DPRINT(("Error: Unknown request: 0x%x.\n", pReq->Cdb[0]));
            return MV_FALSE;
        }
    }

    return MV_TRUE;
}
Пример #4
0
MV_BOOLEAN ATA_CDB2TaskFile(
	IN PDomain_Device pDevice,
	IN PMV_Request pReq, 
	IN MV_U8 tag,
	OUT PATA_TaskFile pTaskFile
	)
{
	MV_ZeroMemory(pTaskFile, sizeof(ATA_TaskFile));

	switch ( pReq->Cdb[0] )
	{
		case SCSI_CMD_READ_10:
		case SCSI_CMD_WRITE_10:
			{
				
				/* 
				 * The OS maximum tranfer length is set to 128K.
				 * For ATA_CMD_READ_DMA and ATA_CMD_WRITE_DMA,
				 * the max size they can handle is 256 sectors.
				 * And Sector_Count==0 means 256 sectors.
				 * If OS request max lenght>128K, for 28 bit device, we have to split requests.
				 */
#ifndef _OS_LINUX  //Avoid keneral panic 
				MV_DASSERT( ( (((MV_U16)pReq->Cdb[7])<<8) | (pReq->Cdb[8]) ) <= 256 );
#endif
				/*
				 * 24 bit LBA can express 128GB.
				 * 4 bytes LBA like SCSI_CMD_READ_10 can express 2TB.
				 */
			
				/* Make sure Cmd_Flag has set already. */
				#ifdef SUPPORT_ATA_SECURITY_CMD
				if ( pReq->Cmd_Flag&CMD_FLAG_NCQ && !((pDevice->Setting&DEVICE_SETTING_SECURITY_LOCKED)==0x10))
				#else
				if ( pReq->Cmd_Flag&CMD_FLAG_NCQ)
				#endif
				{
					
					pTaskFile->Features = pReq->Cdb[8];
					pTaskFile->Feature_Exp = pReq->Cdb[7];

					pTaskFile->Sector_Count = tag<<3;
					
					pTaskFile->LBA_Low = pReq->Cdb[5];
					pTaskFile->LBA_Mid = pReq->Cdb[4];
					pTaskFile->LBA_High = pReq->Cdb[3];
					pTaskFile->LBA_Low_Exp = pReq->Cdb[2];
		
					pTaskFile->Device = MV_BIT(6);

					if ( pReq->Cdb[0]==SCSI_CMD_READ_10 )
						pTaskFile->Command = ATA_CMD_READ_FPDMA_QUEUED;
					else if ( pReq->Cdb[0]==SCSI_CMD_WRITE_10 )
						pTaskFile->Command = ATA_CMD_WRITE_FPDMA_QUEUED;
				}
				else if ( pReq->Cmd_Flag&CMD_FLAG_48BIT )
				{
					MV_DASSERT( !(pReq->Cmd_Flag&CMD_FLAG_NCQ) );

					pTaskFile->Sector_Count = pReq->Cdb[8];
					pTaskFile->Sector_Count_Exp = pReq->Cdb[7];

					pTaskFile->LBA_Low = pReq->Cdb[5];
					pTaskFile->LBA_Mid = pReq->Cdb[4];
					pTaskFile->LBA_High = pReq->Cdb[3];
					pTaskFile->LBA_Low_Exp = pReq->Cdb[2];

					pTaskFile->Device = MV_BIT(6);

					if ( pReq->Cdb[0]==SCSI_CMD_READ_10 )
						pTaskFile->Command = ATA_CMD_READ_DMA_EXT;
					else if ( pReq->Cdb[0]==SCSI_CMD_WRITE_10 )
						pTaskFile->Command = ATA_CMD_WRITE_DMA_EXT;
				}
				else
				{
					/* 28 bit DMA */
					pTaskFile->Sector_Count = pReq->Cdb[8];		/* Could be zero */
	
					pTaskFile->LBA_Low = pReq->Cdb[5];
					pTaskFile->LBA_Mid = pReq->Cdb[4];
					pTaskFile->LBA_High = pReq->Cdb[3];
			
					pTaskFile->Device = MV_BIT(6) | (pReq->Cdb[2]&0xF);
					
					MV_DASSERT( (pReq->Cdb[2]&0xF0)==0 );

					if ( pReq->Cdb[0]==SCSI_CMD_READ_10 )
						pTaskFile->Command = ATA_CMD_READ_DMA;
					else if ( pReq->Cdb[0]==SCSI_CMD_WRITE_10 )
						pTaskFile->Command = ATA_CMD_WRITE_DMA;
				}

				break;
			}
#ifdef SUPPORT_ATA_SECURITY_CMD
		case ATA_16:
			scsi_ata_passthru_16_fill_taskfile(pReq,pTaskFile);
			break;
#endif
		case SCSI_CMD_READ_16:
		case SCSI_CMD_WRITE_16:
			rw16_taskfile(pReq, pTaskFile, tag);
			break;

		case SCSI_CMD_VERIFY_10:
			/* 
			 * For verify command, the size may need use two MV_U8, especially Windows.
			 * For 28 bit device, we have to split the request.
			 * For 48 bit device, we use ATA_CMD_VERIFY_EXT.
			 */
			if ( pDevice->Capacity&DEVICE_CAPACITY_48BIT_SUPPORTED )
			{
				pTaskFile->Sector_Count = pReq->Cdb[8];
				pTaskFile->Sector_Count_Exp = pReq->Cdb[7];

				pTaskFile->LBA_Low = pReq->Cdb[5];
				pTaskFile->LBA_Mid = pReq->Cdb[4];
				pTaskFile->LBA_High = pReq->Cdb[3];
				pTaskFile->LBA_Low_Exp = pReq->Cdb[2];

				pTaskFile->Device = MV_BIT(6);

				pTaskFile->Command = ATA_CMD_VERIFY_EXT;
			}
			else
			{
				pTaskFile->Sector_Count = pReq->Cdb[8];
				
				pTaskFile->LBA_Low = pReq->Cdb[5];
				pTaskFile->LBA_Mid = pReq->Cdb[4];
				pTaskFile->LBA_High = pReq->Cdb[3];

				pTaskFile->Device = MV_BIT(6) | (pReq->Cdb[2]&0xF);
				
				MV_DASSERT( (pReq->Cdb[2]&0xF0)==0 );

				pTaskFile->Command = ATA_CMD_VERIFY;				
			}

			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_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 */
						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;
						 pDevice->Setting |= DEVICE_SETTING_WRITECACHE_ENABLED;
						break;
			
					case CDB_CORE_DISABLE_WRITE_CACHE:
						pTaskFile->Command = ATA_CMD_SET_FEATURES;
						pTaskFile->Features = ATA_CMD_DISABLE_WRITE_CACHE;
						 pDevice->Setting &= ~DEVICE_SETTING_WRITECACHE_ENABLED;
						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;

                      	 #ifdef SUPPORT_ATA_POWER_MANAGEMENT
					case CDB_CORE_ATA_IDLE:
						pTaskFile->Command = 0xe3;
						pTaskFile->Sector_Count = pReq->Cdb[(pReq->Cmd_Flag & CMD_FLAG_ATA_12) ?4:6];
							break;
					case CDB_CORE_ATA_STANDBY:
						pTaskFile->Command = 0xe2;
							break;
					case CDB_CORE_ATA_IDLE_IMMEDIATE:
						pTaskFile->Command = 0xe1;
							break;
					case CDB_CORE_ATA_STANDBY_IMMEDIATE:
						pTaskFile->Command = 0xe0;
							break;
					case CDB_CORE_ATA_CHECK_POWER_MODE:
						pTaskFile->Command = 0xe5;
							break;
                         	        case CDB_CORE_ATA_SLEEP:
                                               	pTaskFile->Command = 0xe6;
                                               	break;
                         #endif
					case CDB_CORE_ATA_IDENTIFY:
						pTaskFile->Command = 0xec;
						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_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;
				#ifdef SUPPORT_ATA_SMART
					case CDB_CORE_ATA_IDENTIFY_PACKET_DEVICE:
						pTaskFile->Command = ATA_IDENTIFY_PACKET_DEVICE;
						pTaskFile->Sector_Count = 0x1;
						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;
						pTaskFile->LBA_Low = 0x1;
						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;
						pTaskFile->LBA_Low = 0x1;
						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_ATA_SMART_READ_VALUES:
						pTaskFile->Command = ATA_CMD_SMART;
						pTaskFile->Features = ATA_SMART_READ_VALUES;
						pTaskFile->LBA_Mid = 0x4F;
						pTaskFile->LBA_High = 0xC2;
						pTaskFile->LBA_Low = 0x1;
						break;
					case CDB_CORE_ATA_SMART_READ_THRESHOLDS:
						pTaskFile->Command = ATA_CMD_SMART;
						pTaskFile->Features = ATA_SMART_READ_THRESHOLDS;
						pTaskFile->LBA_Mid = 0x4F;
						pTaskFile->LBA_High = 0xC2;
						pTaskFile->LBA_Low = 0x1;
						break;
					case CDB_CORE_ATA_SMART_READ_LOG_SECTOR:
						pTaskFile->Command = ATA_CMD_SMART;
						pTaskFile->Features = ATA_SMART_READ_LOG_SECTOR;
						pTaskFile->LBA_Mid = 0x4F;
						pTaskFile->LBA_High = 0xC2;
						pTaskFile->Sector_Count = 0x1;
						pTaskFile->LBA_Low = pReq->Cdb[(pReq->Cmd_Flag & CMD_FLAG_ATA_12) ?5:8];
						break;
					case CDB_CORE_ATA_SMART_WRITE_LOG_SECTOR :
						pTaskFile->Command = ATA_CMD_SMART;
						pTaskFile->Features = ATA_SMART_WRITE_LOG_SECTOR;
						pTaskFile->LBA_Mid = 0x4F;
						pTaskFile->LBA_High = 0xC2;
						pTaskFile->Sector_Count = 0x1;
						pTaskFile->LBA_Low = pReq->Cdb[(pReq->Cmd_Flag & CMD_FLAG_ATA_12) ?5:8];
						break;
					case  CDB_CORE_ATA_SMART_AUTO_OFFLINE:
						pTaskFile->Command = ATA_CMD_SMART;
						pTaskFile->Features = ATA_SMART_AUTO_OFFLINE;
						pTaskFile->LBA_Mid = 0x4F;
						pTaskFile->LBA_High = 0xC2;
						pTaskFile->LBA_Low= pReq->Cdb[(pReq->Cmd_Flag & CMD_FLAG_ATA_12) ?5:8];
						pTaskFile->Sector_Count = pReq->Cdb[(pReq->Cmd_Flag & CMD_FLAG_ATA_12) ?4:6];
						break;
					case CDB_CORE_ATA_SMART_AUTOSAVE:    
						pTaskFile->Command = ATA_CMD_SMART;
						pTaskFile->Features = ATA_SMART_AUTOSAVE;
						pTaskFile->LBA_Mid = 0x4F;
						pTaskFile->LBA_High = 0xC2;
						pTaskFile->Sector_Count =  pReq->Cdb[(pReq->Cmd_Flag & CMD_FLAG_ATA_12) ?4 : 6];
						break;
					case CDB_CORE_ATA_SMART_IMMEDIATE_OFFLINE:
						pTaskFile->Command = ATA_CMD_SMART;
						pTaskFile->Features = ATA_SMART_IMMEDIATE_OFFLINE;
						pTaskFile->LBA_Mid = 0x4F;
						pTaskFile->LBA_High = 0xC2;
						pTaskFile->LBA_Low= pReq->Cdb[(pReq->Cmd_Flag & CMD_FLAG_ATA_12) ?5:8];
						pTaskFile->Sector_Count =  pReq->Cdb[(pReq->Cmd_Flag & CMD_FLAG_ATA_12) ?4 : 6];
						break;
				#endif /*#ifdef SUPPORT_ATA_SMART*/
					case CDB_CORE_ATA_DOWNLOAD_MICROCODE:
						if(pReq->Cmd_Flag & CMD_FLAG_ATA_12)
							scsi_ata_passthru_12_fill_taskfile(pReq,pTaskFile);
						else
							scsi_ata_passthru_16_fill_taskfile(pReq,pTaskFile);
						break;
					default:
						return MV_FALSE;
				}
				break;
			}

		case SCSI_CMD_SYNCHRONIZE_CACHE_10:
			if ( pDevice->Capacity&DEVICE_CAPACITY_48BIT_SUPPORTED )
				pTaskFile->Command = ATA_CMD_FLUSH_EXT;
			else
				pTaskFile->Command = ATA_CMD_FLUSH;
			pTaskFile->Device = MV_BIT(6);
			break;
		case SCSI_CMD_START_STOP_UNIT:
			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_SND_DIAG:
			Core_Fill_SendDiagTaskfile( pDevice,pReq, pTaskFile);
			break;
		case SCSI_CMD_REQUEST_SENSE:
		case SCSI_CMD_MODE_SELECT_10:
		case SCSI_CMD_MODE_SENSE_10:
			MV_DPRINT(("Error: Unknown request: 0x%x.\n", pReq->Cdb[0]));

		default:
			return MV_FALSE;
	}

	/* 
	 * Attention: Never return before this line if your return is MV_TRUE.
	 * We need set the slave DEV bit here. 
	 */
	if ( pDevice->Is_Slave )		
		pTaskFile->Device |= MV_BIT(4);

	return MV_TRUE;
}