450 lines
15 KiB
C
450 lines
15 KiB
C
/*
|
|
* $Log: V:/Flite/archives/TrueFFS5/Src/FLIOCTL.C_V $
|
|
*
|
|
* Rev 1.7 May 09 2001 00:45:48 oris
|
|
* Changed protection ioctl interface to prevent the use of input buffer as an output buffer.
|
|
*
|
|
* Rev 1.6 Apr 16 2001 13:43:28 oris
|
|
* Removed warrnings.
|
|
*
|
|
* Rev 1.5 Apr 09 2001 15:09:20 oris
|
|
* End with an empty line.
|
|
*
|
|
* Rev 1.4 Apr 01 2001 15:16:26 oris
|
|
* Updated inquire capability ioctl - diffrent input and output records.
|
|
*
|
|
* Rev 1.3 Apr 01 2001 07:58:30 oris
|
|
* copywrite notice.
|
|
* FL_IOCTL_FORMAT_PHYSICAL_DRIVE ioctl is not under the LOW_LEVEL compilation flag.
|
|
* Bug fix - BDK_GET_INFO no longer calls bdkCreate().
|
|
*
|
|
* Rev 1.2 Feb 14 2001 02:15:00 oris
|
|
* Updated inquire capabilities ioctl.
|
|
*
|
|
* Rev 1.1 Feb 13 2001 01:52:20 oris
|
|
* Added the following new IO Controls:
|
|
* FL_IOCTL_FORMAT_VOLUME2,
|
|
* FL_IOCTL_FORMAT_PARTITION,
|
|
* FL_IOCTL_BDTL_HW_PROTECTION,
|
|
* FL_IOCTL_BINARY_HW_PROTECTION,
|
|
* FL_IOCTL_OTP,
|
|
* FL_IOCTL_CUSTOMER_ID,
|
|
* FL_IOCTL_UNIQUE_ID,
|
|
* FL_IOCTL_NUMBER_OF_PARTITIONS,
|
|
* FL_IOCTL_SUPPORTED_FEATURES,
|
|
* FL_IOCTL_SET_ENVIRONMENT_VARIABLES,
|
|
* FL_IOCTL_PLACE_EXB_BY_BUFFER,
|
|
* FL_IOCTL_WRITE_IPL,
|
|
* FL_IOCTL_DEEP_POWER_DOWN_MODE,
|
|
* and BDK_GET_INFO type in FL_IOCTL_BDK_OPERATION
|
|
* Those IOCTL were not qualed and the TrueFFS 5.0 should be release with revision 1.0 of this this file.
|
|
*
|
|
* Rev 1.0 Feb 04 2001 11:37:36 oris
|
|
* Initial revision.
|
|
*
|
|
*/
|
|
/***********************************************************************************/
|
|
/* M-Systems Confidential */
|
|
/* Copyright (C) M-Systems Flash Disk Pioneers Ltd. 1995-2001 */
|
|
/* All Rights Reserved */
|
|
/***********************************************************************************/
|
|
/* NOTICE OF M-SYSTEMS OEM */
|
|
/* SOFTWARE LICENSE AGREEMENT */
|
|
/* */
|
|
/* THE USE OF THIS SOFTWARE IS GOVERNED BY A SEPARATE LICENSE */
|
|
/* AGREEMENT BETWEEN THE OEM AND M-SYSTEMS. REFER TO THAT AGREEMENT */
|
|
/* FOR THE SPECIFIC TERMS AND CONDITIONS OF USE, */
|
|
/* OR CONTACT M-SYSTEMS FOR LICENSE ASSISTANCE: */
|
|
/* E-MAIL = info@m-sys.com */
|
|
/***********************************************************************************/
|
|
|
|
#include "flioctl.h"
|
|
#include "blockdev.h"
|
|
|
|
#ifdef IOCTL_INTERFACE
|
|
|
|
FLStatus flIOctl(IOreq FAR2 *ioreq1)
|
|
{
|
|
IOreq ioreq2;
|
|
void FAR1 *inputRecord;
|
|
void FAR1 *outputRecord;
|
|
|
|
inputRecord = ((flIOctlRecord FAR1 *)(ioreq1->irData))->inputRecord;
|
|
outputRecord = ((flIOctlRecord FAR1 *)(ioreq1->irData))->outputRecord;
|
|
ioreq2.irHandle = ioreq1->irHandle;
|
|
|
|
switch (ioreq1->irFlags) {
|
|
case FL_IOCTL_GET_INFO:
|
|
{
|
|
flDiskInfoOutput FAR1 *outputRec = (flDiskInfoOutput FAR1 *)outputRecord;
|
|
|
|
ioreq2.irData = &(outputRec->info);
|
|
outputRec->status = flVolumeInfo(&ioreq2);
|
|
return outputRec->status;
|
|
}
|
|
|
|
#ifdef DEFRAGMENT_VOLUME
|
|
case FL_IOCTL_DEFRAGMENT:
|
|
{
|
|
flDefragInput FAR1 *inputRec = (flDefragInput FAR1 *)inputRecord;
|
|
flDefragOutput FAR1 *outputRec = (flDefragOutput FAR1 *)outputRecord;
|
|
|
|
ioreq2.irLength = inputRec->requiredNoOfSectors;
|
|
outputRec->status = flDefragmentVolume(&ioreq2);
|
|
outputRec->actualNoOfSectors = ioreq2.irLength;
|
|
return outputRec->status;
|
|
}
|
|
#endif /* DEFRAGMENT_VOLUME */
|
|
#ifndef FL_READ_ONLY
|
|
#ifdef WRITE_PROTECTION
|
|
case FL_IOCTL_WRITE_PROTECT:
|
|
{
|
|
flWriteProtectInput FAR1 *inputRec = (flWriteProtectInput FAR1 *)inputRecord;
|
|
flOutputStatusRecord FAR1 *outputRec = (flOutputStatusRecord FAR1 *)outputRecord;
|
|
|
|
ioreq2.irData = inputRec->password;
|
|
ioreq2.irFlags = inputRec->type;
|
|
outputRec->status = flWriteProtection(&ioreq2);
|
|
return outputRec->status;
|
|
}
|
|
#endif /* WRITE_PROTECTION */
|
|
#endif /* FL_READ_ONLY */
|
|
case FL_IOCTL_MOUNT_VOLUME:
|
|
{
|
|
flMountInput FAR1 *inputRec = (flMountInput FAR1 *)inputRecord;
|
|
flOutputStatusRecord FAR1 *outputRec = (flOutputStatusRecord FAR1 *)outputRecord;
|
|
|
|
if (inputRec->type == FL_DISMOUNT)
|
|
outputRec->status = flDismountVolume(&ioreq2);
|
|
else
|
|
outputRec->status = flAbsMountVolume(&ioreq2);
|
|
return outputRec->status;
|
|
}
|
|
|
|
#ifdef FORMAT_VOLUME
|
|
case FL_IOCTL_FORMAT_VOLUME:
|
|
{
|
|
flFormatInput FAR1 *inputRec = (flFormatInput FAR1 *)inputRecord;
|
|
flOutputStatusRecord FAR1 *outputRec = (flOutputStatusRecord FAR1 *)outputRecord;
|
|
|
|
ioreq2.irFlags = inputRec->formatType;
|
|
ioreq2.irData = &(inputRec->fp);
|
|
outputRec->status = flFormatVolume(&ioreq2);
|
|
return outputRec->status;
|
|
}
|
|
|
|
case FL_IOCTL_FORMAT_LOGICAL_DRIVE:
|
|
{
|
|
flFormatLogicalInput FAR1 *inputRec = (flFormatLogicalInput FAR1 *)inputRecord;
|
|
flOutputStatusRecord FAR1 *outputRec = (flOutputStatusRecord FAR1 *)outputRecord;
|
|
|
|
ioreq2.irData = &(inputRec->fp);
|
|
outputRec->status = flFormatLogicalDrive(&ioreq2);
|
|
return outputRec->status;
|
|
}
|
|
|
|
case FL_IOCTL_FORMAT_PHYSICAL_DRIVE:
|
|
{
|
|
flFormatPhysicalInput FAR1 *inputRec = (flFormatPhysicalInput FAR1 *)inputRecord;
|
|
flOutputStatusRecord FAR1 *outputRec = (flOutputStatusRecord FAR1 *)outputRecord;
|
|
|
|
ioreq2.irFlags = inputRec->formatType;
|
|
ioreq2.irData = &(inputRec->fp);
|
|
outputRec->status = flFormatPhysicalDrive(&ioreq2);
|
|
return outputRec->status;
|
|
}
|
|
#endif /* FORMAT_VOLUME */
|
|
|
|
#ifdef BDK_ACCESS
|
|
case FL_IOCTL_BDK_OPERATION:
|
|
{
|
|
flBDKOperationInput FAR1 *inputRec = (flBDKOperationInput FAR1 *)inputRecord;
|
|
flOutputStatusRecord FAR1 *outputRec = (flOutputStatusRecord FAR1 *)outputRecord;
|
|
|
|
ioreq2.irData = &(inputRec->bdkStruct);
|
|
switch(inputRec->type) {
|
|
case BDK_INIT_READ:
|
|
outputRec->status = bdkReadInit(&ioreq2);
|
|
break;
|
|
case BDK_READ:
|
|
outputRec->status = bdkReadBlock(&ioreq2);
|
|
break;
|
|
case BDK_GET_INFO:
|
|
outputRec->status = bdkPartitionInfo(&ioreq2);
|
|
break;
|
|
#ifndef FL_READ_ONLY
|
|
case BDK_INIT_WRITE:
|
|
outputRec->status = bdkWriteInit(&ioreq2);
|
|
break;
|
|
case BDK_WRITE:
|
|
outputRec->status = bdkWriteBlock(&ioreq2);
|
|
break;
|
|
case BDK_ERASE:
|
|
outputRec->status = bdkErase(&ioreq2);
|
|
break;
|
|
case BDK_CREATE:
|
|
outputRec->status = bdkCreate(&ioreq2);
|
|
break;
|
|
#endif /* FL_READ_ONLY */
|
|
default:
|
|
outputRec->status = flBadParameter;
|
|
break;
|
|
}
|
|
return outputRec->status;
|
|
}
|
|
#endif /* BDK_ACCESS */
|
|
#ifdef HW_PROTECTION
|
|
#ifdef BDK_ACCESS
|
|
case FL_IOCTL_BINARY_HW_PROTECTION:
|
|
{
|
|
flProtectionInput FAR1 *inputRec = (flProtectionInput FAR1 *)inputRecord;
|
|
flProtectionOutput FAR1 *outputRec = (flProtectionOutput FAR1 *)outputRecord;
|
|
|
|
switch(inputRec->type)
|
|
{
|
|
case PROTECTION_INSERT_KEY:
|
|
ioreq2.irData = inputRec->key;
|
|
outputRec->status = bdkInsertProtectionKey(&ioreq2);
|
|
break;
|
|
case PROTECTION_REMOVE_KEY:
|
|
outputRec->status = bdkRemoveProtectionKey(&ioreq2);
|
|
break;
|
|
case PROTECTION_GET_TYPE:
|
|
outputRec->status = bdkIdentifyProtection(&ioreq2);
|
|
outputRec->protectionType = (byte)ioreq2.irFlags;
|
|
break;
|
|
case PROTECTION_DISABLE_LOCK:
|
|
ioreq2.irFlags = 0;
|
|
outputRec->status = bdkHardwareProtectionLock(&ioreq2);
|
|
break;
|
|
case PROTECTION_ENABLE_LOCK:
|
|
ioreq2.irFlags = LOCK_ENABLED;
|
|
outputRec->status = bdkHardwareProtectionLock(&ioreq2);
|
|
break;
|
|
case PROTECTION_CHANGE_KEY:
|
|
ioreq2.irData = inputRec->key;
|
|
outputRec->status = bdkChangeProtectionKey(&ioreq2);
|
|
break;
|
|
case PROTECTION_CHANGE_TYPE:
|
|
ioreq2.irFlags = inputRec->protectionType;
|
|
outputRec->status = bdkChangeProtectionType(&ioreq2);
|
|
break;
|
|
default:
|
|
outputRec->status = flBadParameter;
|
|
break;
|
|
}
|
|
return outputRec->status;
|
|
}
|
|
#endif /* BDK_ACCESS */
|
|
case FL_IOCTL_BDTL_HW_PROTECTION:
|
|
{
|
|
flProtectionInput FAR1 *inputRec = (flProtectionInput FAR1 *)inputRecord;
|
|
flProtectionOutput FAR1 *outputRec = (flProtectionOutput FAR1 *)outputRecord;
|
|
|
|
switch(inputRec->type)
|
|
{
|
|
case PROTECTION_INSERT_KEY:
|
|
ioreq2.irData = inputRec->key;
|
|
outputRec->status = flInsertProtectionKey(&ioreq2);
|
|
break;
|
|
case PROTECTION_REMOVE_KEY:
|
|
outputRec->status = flRemoveProtectionKey(&ioreq2);
|
|
break;
|
|
case PROTECTION_GET_TYPE:
|
|
outputRec->status = flIdentifyProtection(&ioreq2);
|
|
outputRec->protectionType = (byte)ioreq2.irFlags;
|
|
break;
|
|
case PROTECTION_DISABLE_LOCK:
|
|
ioreq2.irFlags = 0;
|
|
outputRec->status = flHardwareProtectionLock(&ioreq2);
|
|
break;
|
|
case PROTECTION_ENABLE_LOCK:
|
|
ioreq2.irFlags = LOCK_ENABLED;
|
|
outputRec->status = flHardwareProtectionLock(&ioreq2);
|
|
break;
|
|
case PROTECTION_CHANGE_KEY:
|
|
ioreq2.irData = inputRec->key;
|
|
outputRec->status = flChangeProtectionKey(&ioreq2);
|
|
break;
|
|
case PROTECTION_CHANGE_TYPE:
|
|
ioreq2.irFlags = inputRec->protectionType;
|
|
outputRec->status = flChangeProtectionType(&ioreq2);
|
|
break;
|
|
default:
|
|
outputRec->status = flBadParameter;
|
|
break;
|
|
}
|
|
return outputRec->status;
|
|
}
|
|
#endif /* HW_PROTECTION */
|
|
#ifdef HW_OTP
|
|
case FL_IOCTL_OTP:
|
|
{
|
|
flOtpInput FAR1 *inputRec = (flOtpInput FAR1 *)inputRecord;
|
|
flOutputStatusRecord FAR1 *outputRec = (flOutputStatusRecord FAR1 *)outputRecord;
|
|
|
|
switch(inputRec->type)
|
|
{
|
|
case OTP_SIZE:
|
|
outputRec->status = flOTPSize(&ioreq2);
|
|
inputRec->lockedFlag = (byte)ioreq2.irFlags;
|
|
inputRec->length = ioreq2.irCount ;
|
|
inputRec->usedSize = ioreq2.irLength ;
|
|
break;
|
|
case OTP_READ:
|
|
ioreq2.irData = inputRec->buffer; /* user buffer */
|
|
ioreq2.irCount = inputRec->usedSize; /* offset */
|
|
ioreq2.irLength = inputRec->length; /* size to read */
|
|
outputRec->status = flOTPRead(&ioreq2);
|
|
break;
|
|
case OTP_WRITE_LOCK:
|
|
ioreq2.irData = inputRec->buffer; /* user buffer */
|
|
ioreq2.irLength = inputRec->length; /* size to read */
|
|
outputRec->status = flOTPWriteAndLock(&ioreq2);
|
|
break;
|
|
default:
|
|
outputRec->status = flBadParameter;
|
|
break;
|
|
}
|
|
return outputRec->status;
|
|
}
|
|
|
|
case FL_IOCTL_CUSTOMER_ID:
|
|
{
|
|
flCustomerIdOutput FAR1 *outputRec = (flCustomerIdOutput FAR1 *)outputRecord;
|
|
|
|
ioreq2.irData = outputRec->id;
|
|
outputRec->status = flGetCustomerID(&ioreq2);
|
|
return outputRec->status;
|
|
}
|
|
|
|
case FL_IOCTL_UNIQUE_ID:
|
|
{
|
|
flUniqueIdOutput FAR1 *outputRec = (flUniqueIdOutput FAR1 *)outputRecord;
|
|
|
|
ioreq2.irData = outputRec->id;
|
|
outputRec->status = flGetUniqueID(&ioreq2);
|
|
return outputRec->status;
|
|
}
|
|
#endif /* HW_OTP */
|
|
|
|
case FL_IOCTL_NUMBER_OF_PARTITIONS:
|
|
{
|
|
flCountPartitionsOutput FAR1 *outputRec = (flCountPartitionsOutput FAR1 *)outputRecord;
|
|
|
|
outputRec->status = flCountVolumes(&ioreq2);
|
|
outputRec->noOfPartitions = (byte) ioreq2.irFlags;
|
|
return outputRec->status;
|
|
}
|
|
|
|
#ifdef LOW_LEVEL
|
|
|
|
case FL_IOCTL_INQUIRE_CAPABILITIES:
|
|
{
|
|
flCapabilityInput FAR1 *inputRec = (flCapabilityInput FAR1 *)inputRecord;
|
|
flCapabilityOutput FAR1 *outputRec = (flCapabilityOutput FAR1 *)outputRecord;
|
|
|
|
ioreq2.irLength = inputRec->capability;
|
|
outputRec->status = flInquireCapabilities(&ioreq2);
|
|
outputRec->capability = ioreq2.irLength;
|
|
return outputRec->status;
|
|
}
|
|
|
|
#endif /* LOW_LEVEL */
|
|
#ifdef ENVIRONMENT_VARS
|
|
|
|
/*
|
|
case FL_IOCTL_EXTENDED_ENVIRONMENT_VARIABLES:
|
|
{
|
|
flEnvVarsInput FAR1 *inputRec = (flEnvVarsInput FAR1 *)inputRecord;
|
|
flEnvVarsOutput FAR1 *outputRec = (flEnvVarsOutput FAR1 *)outputRecord;
|
|
outputRec->status = flSetEnv(inputRec->varName , inputRec->varValue, &(outputRec->prevValue));
|
|
return outputRec->status;
|
|
}
|
|
*/
|
|
#endif /* ENVIRONMENT_VARS */
|
|
#ifdef LOW_LEVEL
|
|
#ifdef WRITE_EXB_IMAGE
|
|
|
|
case FL_IOCTL_PLACE_EXB_BY_BUFFER:
|
|
{
|
|
flPlaceExbInput FAR1 *inputRec = (flPlaceExbInput FAR1 *)inputRecord;
|
|
flOutputStatusRecord FAR1 *outputRec = (flOutputStatusRecord FAR1 *)outputRecord;
|
|
ioreq2.irData = inputRec->buf;
|
|
ioreq2.irLength = inputRec->bufLen;
|
|
ioreq2.irWindowBase = inputRec->exbWindow;
|
|
ioreq2.irFlags = inputRec->exbFlags;
|
|
outputRec->status = flPlaceExbByBuffer(&ioreq2);
|
|
return outputRec->status;
|
|
}
|
|
|
|
#endif /* WRITE_EXB_IMAGE */
|
|
|
|
case FL_IOCTL_EXTENDED_WRITE_IPL:
|
|
{
|
|
flIplInput FAR1 *inputRec = (flIplInput FAR1 *)inputRecord;
|
|
flOutputStatusRecord FAR1 *outputRec = (flOutputStatusRecord FAR1 *)outputRecord;
|
|
ioreq2.irData = inputRec->buf;
|
|
ioreq2.irLength = inputRec->bufLen;
|
|
outputRec->status = flWriteIPL(&ioreq2);
|
|
return outputRec->status;
|
|
}
|
|
|
|
case FL_IOCTL_DEEP_POWER_DOWN_MODE:
|
|
{
|
|
flPowerDownInput FAR1 *inputRec = (flPowerDownInput FAR1 *)inputRecord;
|
|
flOutputStatusRecord FAR1 *outputRec = (flOutputStatusRecord FAR1 *)outputRecord;
|
|
ioreq2.irFlags = inputRec->state;
|
|
outputRec->status = flDeepPowerDownMode(&ioreq2);
|
|
return outputRec->status;
|
|
}
|
|
|
|
#endif /* LOW_LEVEL */
|
|
#ifdef ABS_READ_WRITE
|
|
#ifndef FL_READ_ONLY
|
|
case FL_IOCTL_DELETE_SECTORS:
|
|
{
|
|
flDeleteSectorsInput FAR1 *inputRec = (flDeleteSectorsInput FAR1 *)inputRecord;
|
|
flOutputStatusRecord FAR1 *outputRec = (flOutputStatusRecord FAR1 *)outputRecord;
|
|
|
|
ioreq2.irSectorNo = inputRec->firstSector;
|
|
ioreq2.irSectorCount = inputRec->numberOfSectors;
|
|
outputRec->status = flAbsDelete(&ioreq2);
|
|
return outputRec->status;
|
|
}
|
|
#endif /* FL_READ_ONLY */
|
|
case FL_IOCTL_READ_SECTORS:
|
|
{
|
|
flReadWriteInput FAR1 *inputRec = (flReadWriteInput FAR1 *)inputRecord;
|
|
flReadWriteOutput FAR1 *outputRec = (flReadWriteOutput FAR1 *)outputRecord;
|
|
|
|
ioreq2.irSectorNo = inputRec->firstSector;
|
|
ioreq2.irSectorCount = inputRec->numberOfSectors;
|
|
ioreq2.irData = inputRec->buf;
|
|
outputRec->status = flAbsRead(&ioreq2);
|
|
outputRec->numberOfSectors = ioreq2.irSectorCount;
|
|
return outputRec->status;
|
|
}
|
|
#ifndef FL_READ_ONLY
|
|
case FL_IOCTL_WRITE_SECTORS:
|
|
{
|
|
flReadWriteInput FAR1 *inputRec = (flReadWriteInput FAR1 *)inputRecord;
|
|
flReadWriteOutput FAR1 *outputRec = (flReadWriteOutput FAR1 *)outputRecord;
|
|
|
|
ioreq2.irSectorNo = inputRec->firstSector;
|
|
ioreq2.irSectorCount = inputRec->numberOfSectors;
|
|
ioreq2.irData = inputRec->buf;
|
|
outputRec->status = flAbsWrite(&ioreq2);
|
|
outputRec->numberOfSectors = ioreq2.irSectorCount;
|
|
return outputRec->status;
|
|
}
|
|
#endif /* FL_READ_ONLY */
|
|
#endif /* ABS_READ_WRITE */
|
|
|
|
default:
|
|
return flBadParameter;
|
|
}
|
|
}
|
|
|
|
#endif /* IOCTL_INTERFACE */
|