Ejemplo n.º 1
0
AtaError ATA_setDateTime(AtaFile *pAtaFile)
{
  AtaUint16 jj;
  AtaUint32 ll;
  AtaState *pAtaDrive=pAtaFile->pDrive;
  AtaError ret_stat = ATA_ERROR_NONE;
  AtaUint16 *_AtaWriteBuffer = pAtaDrive->_AtaWriteBuffer;

  if (pAtaFile==NULL) return(ATA_ERROR_INVALID_PARAM); //KR042610

  ll = _AtaCalculatePhySectorAndOffsetFromDirEntry((AtaUint32)pAtaFile->CurrentDirEntry, (AtaUint16 *)&jj, pAtaFile, &ret_stat);
  if(ret_stat) return(ret_stat);
  ret_stat = _AtaReadSector(ll, pAtaDrive, &_AtaWriteBuffer[0], 0);
  if(ret_stat) return(ret_stat);

  /*  Update directory entry*/
  jj+=11;
  _AtaWriteBuffer[jj++] = pAtaFile->Time = pAtaDrive->get_mod_time();
  _AtaWriteBuffer[jj] = pAtaFile->Date = pAtaDrive->get_mod_date();

  /*  Commit replacement directory entry sector to disk*/
  ret_stat = _AtaFlush(pAtaDrive);
  if(ret_stat) return(ret_stat);
  ret_stat = pAtaDrive->AtaWriteSector(ll, pAtaDrive->pAtaMediaState, &_AtaWriteBuffer[0], 0);
  if(ret_stat) return(ret_stat);
  ret_stat = pAtaDrive->AtaWriteSectorFlush(pAtaDrive->pAtaMediaState);
  return(ret_stat);
}
Ejemplo n.º 2
0
AtaError ATA_setAttr(AtaFile *pAtaFile, AtaUint16 Attr)
{
  AtaUint16 jj;
  AtaUint32 ll;
  AtaState *pAtaDrive=pAtaFile->pDrive;
  AtaError ret_stat = ATA_ERROR_NONE;
  AtaUint16 *_AtaWriteBuffer = pAtaDrive->_AtaWriteBuffer;

  if (pAtaFile==NULL) return(ATA_ERROR_INVALID_PARAM); //KR042610

  ll = _AtaCalculatePhySectorAndOffsetFromDirEntry((AtaUint32)pAtaFile->CurrentDirEntry, (AtaUint16 *)&jj, pAtaFile, &ret_stat);
  if(ret_stat) return(ret_stat);
  ret_stat = _AtaReadSector(ll, pAtaDrive, &_AtaWriteBuffer[0], 0);
  if(ret_stat) return(ret_stat);

  /*  Update directory entry*/
  jj+=5;
/*  _AtaWriteBuffer[jj] |= Attr << 8;*/  /*SUSMIT - Absolute attribute setting BUGGIX*/
  _AtaWriteBuffer[jj] &= 0x00ff;
  _AtaWriteBuffer[jj] |= Attr << 8;
  pAtaFile->Attributes = Attr;

  /*  Commit replacement directory entry sector to disk*/
  ret_stat = _AtaFlush(pAtaDrive);
  if(ret_stat) return(ret_stat);
  ret_stat = pAtaDrive->AtaWriteSector(ll, pAtaDrive->pAtaMediaState, &_AtaWriteBuffer[0], 0);
  if(ret_stat) return(ret_stat);
  ret_stat = pAtaDrive->AtaWriteSectorFlush(pAtaDrive->pAtaMediaState);
  return(ret_stat);
}
Ejemplo n.º 3
0
AtaUint32 ATA_diskUsed(AtaState *pAtaState, AtaError *ret_stat)
{  /*returns in KB.*/
  int i,j, LastCluster = 0;
  AtaUint32 size=0;
  AtaUint32 tempsize, fatmarker = 0;
  AtaCluster NumClusters = 0, tempCluster = 0;AtaSector PhySector = 0;
  AtaUint16 FatEntryOffset = 0, FatEntryAlignment = 0;
  AtaSector firstFat=pAtaState->FirstFatSector;
  AtaUint16 *_AtaWriteBuffer = pAtaState->_AtaWriteBuffer;
  if (pAtaState==NULL) *ret_stat = ATA_ERROR_INVALID_PARAM; //KR042610
  else                 *ret_stat = ATA_ERROR_NONE;

  *ret_stat = ATA_ERROR_NONE;
  switch(pAtaState->FatType) {
  	case ATA_FAT_TYPE_12:
		  NumClusters = (AtaCluster)((pAtaState->TotalSectors-pAtaState->RootDirSector)/pAtaState->LogSectorsPerCluster);
		  for(i=0;i<NumClusters;i++) {
			PhySector = _AtaCalculatePhySectorAndOffsetOfFatEntry((AtaCluster)i, pAtaState, &FatEntryOffset, &FatEntryAlignment);
			*ret_stat = _AtaReadFatEntryAtPhySector(PhySector, pAtaState, FatEntryOffset, FatEntryAlignment, &LastCluster, &tempCluster);
		  	if(tempCluster!=0) size++; }
		  break;
  	case ATA_FAT_TYPE_16:
		  for(i=0;i<pAtaState->LogSectorsPerFat;i++) {
		  *ret_stat = _AtaReadSector(firstFat++, pAtaState, &_AtaWriteBuffer[0], 0);
		  tempsize=0;
		  for(j=0;j<ATA_WORDS_PER_PHY_SECTOR;j++)
		  if(_AtaWriteBuffer[j]!=0) tempsize++;
		  size+=tempsize; }
		  break;
  	case ATA_FAT_TYPE_32:
		  for(i=0;i<pAtaState->LogSectorsPerFat;i++) {
		  *ret_stat = _AtaReadSector(firstFat++, pAtaState, &_AtaWriteBuffer[0], 0);
		  tempsize=0;
		  for(j=0;j<ATA_WORDS_PER_PHY_SECTOR;j+=2) {
		  	fatmarker = (AtaUint32)_AtaWriteBuffer[j];
		  	fatmarker = (fatmarker&0x0000ffff) << 16;
		  	fatmarker |= (AtaUint32)_AtaWriteBuffer[j+1];
		  	if(fatmarker!=0) tempsize++; }
		  size+=tempsize; }
		  break;
  	default:
		  break;
  }
/*  return ((size*pAtaState->WordsPerCluster)/512);*/ /*SUSMIT - Original Implementation*/
/*  return (size*(pAtaState->WordsPerCluster/512));*//*SUSMIT - Fails for disks with cluster size of 512 bytes*/
  return ((size*(pAtaState->WordsPerCluster/256))/2);
}
Ejemplo n.º 4
0
AtaUint32 ATA_diskUsed(AtaState *pAtaState, AtaError *ret_stat)
{  /*returns in KB.*/
  int i,j;
  AtaUint32 size=0;
  AtaUint32 tempsize;
  AtaSector firstFat=pAtaState->FirstFatSector;
  AtaUint16 *_AtaWriteBuffer = pAtaState->_AtaWriteBuffer;

  if (pAtaState==NULL) *ret_stat = ATA_ERROR_INVALID_PARAM; //KR042610
  else                 *ret_stat = ATA_ERROR_NONE;
  for(i=0;i<pAtaState->LogSectorsPerFat;i++) {
  *ret_stat = _AtaReadSector(firstFat++, pAtaState, &_AtaWriteBuffer[0], 0);
  tempsize=0;
  for(j=0;j<ATA_WORDS_PER_PHY_SECTOR;j++)
  if(_AtaWriteBuffer[j]!=0) tempsize++;
  size+=tempsize; }
/*  return ((size*pAtaState->WordsPerCluster)/512);*/ /*SUSMIT - Original Implementation*/
/*  return (size*(pAtaState->WordsPerCluster/512));*//*SUSMIT - Fails for disks with cluster size of 512 bytes*/
  return ((size*(pAtaState->WordsPerCluster/256))/2);
}
Ejemplo n.º 5
0
AtaError ATA_format(AtaState *pDrive, int flag)
{
	AtaSector testsector, testsector1;
	int x; AtaError ret_stat = ATA_ERROR_NONE;
    AtaUint16 *_AtaWriteBuffer = pDrive->_AtaWriteBuffer;
    AtaUint16 _AtaWriteBuffer1[256];
/*SUSMIT - FAT32 format fix*/
  AtaSector PhySector;
  AtaUint16 fOffset, fAlign;
  AtaCluster write_cluster, RootCluster;
  int LastCluster = 0;
  unsigned short FatNo;
/*SUSMIT - FAT32 format fix*/

    if (pDrive==NULL) return(ATA_ERROR_INVALID_PARAM); //KR042810

	for(x=0; x< 256; x++) _AtaWriteBuffer1[x] = 0;
/*Removed this on order to reduce memory, we won't remember boot records
so, our format won't be able to fix disks with Bad MBR/BR but will
be able to format*/
#if 0
	switch(pDrive->FatType) {
      case ATA_FAT_TYPE_12:
        /*write MBR*/
        ret_stat = _AtaReadSector((AtaSector)0, pDrive, &_AtaWriteBuffer[0], 0);
        if(ret_stat) return(ret_stat);
        ret_stat = pDrive->AtaWriteSector((AtaSector)0, pDrive->pAtaMediaState, &MBR_8MB_FAT12_MMC[0], 0);
        if(ret_stat) return(ret_stat);
        /*Write BR*/
        ret_stat = _AtaReadSector((AtaSector)pDrive->BootPhySector, pDrive, &_AtaWriteBuffer[0], 0);
        if(ret_stat) return(ret_stat);
        ret_stat = pDrive->AtaWriteSector((AtaSector)pDrive->BootPhySector, pDrive->pAtaMediaState, &BR_8MB_FAT12_MMC[0], 0);
        if(ret_stat) return(ret_stat);
        break;
      case ATA_FAT_TYPE_16:
        /*Write MBR*/
        ret_stat = _AtaReadSector((AtaSector)0, pDrive, &_AtaWriteBuffer[0], 0);
        if(ret_stat) return(ret_stat);
        ret_stat = pDrive->AtaWriteSector((AtaSector)0, pDrive->pAtaMediaState, &MBR_32MB_FAT16_MMC[0], 0);
        if(ret_stat) return(ret_stat);
        /*Write BR*/
        ret_stat = _AtaReadSector((AtaSector)pDrive->BootPhySector, pDrive, &_AtaWriteBuffer[0], 0);
        if(ret_stat) return(ret_stat);
        ret_stat = pDrive->AtaWriteSector((AtaSector)pDrive->BootPhySector, pDrive->pAtaMediaState, &BR_32MB_FAT16_MMC[0], 0);
        if(ret_stat) return(ret_stat);
        break;
      case ATA_FAT_TYPE_32:
        /*Write MBR*/
        ret_stat = _AtaReadSector((AtaSector)0, pDrive, &_AtaWriteBuffer[0], 0);
        if(ret_stat) return(ret_stat);
        ret_stat = pDrive->AtaWriteSector((AtaSector)0, pDrive->pAtaMediaState, &MBR_32MB_FAT16_MMC[0], 0);
        if(ret_stat) return(ret_stat);
        /*Write BR*/
        ret_stat = _AtaReadSector((AtaSector)pDrive->BootPhySector, pDrive, &_AtaWriteBuffer[0], 0);
        if(ret_stat) return(ret_stat);
        ret_stat = pDrive->AtaWriteSector((AtaSector)pDrive->BootPhySector, pDrive->pAtaMediaState, &BR_32MB_FAT16_MMC[0], 0);
        if(ret_stat) return(ret_stat);
        break;
      default: return(ATA_ERROR_BAD_MEDIA);
    }
#endif
	/*Clear FAT*/
	if(pDrive->FatType == ATA_FAT_TYPE_32) {
/*SUSMIT - FAT32 format fix*/
    RootCluster = _AtaReadDoubleWord(pDrive->BootPhySector, pDrive, 44);			/* Fat Size/Sector Count  byte 36 - 39 */
	ret_stat = _AtaReadSector((AtaSector)pDrive->RootDirSector, pDrive, &_AtaWriteBuffer[0], 0);
	if(ret_stat) return(ret_stat);
	_AtaWriteBuffer1[0] = 0xFFF8;
	_AtaWriteBuffer1[1] = 0xFFFF;
	_AtaWriteBuffer1[2] = 0xFFF8;
	_AtaWriteBuffer1[3] = 0xFFFF;
	_AtaWriteBuffer1[4] = 0xFFF8;
	_AtaWriteBuffer1[5] = 0xFFFF;
	ret_stat = pDrive->AtaWriteSector((AtaSector)pDrive->RootDirSector, pDrive->pAtaMediaState, &_AtaWriteBuffer1[0], 0);
	if(ret_stat) return(ret_stat);
    ret_stat = pDrive->AtaWriteSectorFlush(pDrive->pAtaMediaState);
    if(ret_stat) return(ret_stat);
	for(FatNo=0; FatNo<pDrive->NumberOfFats; FatNo++)
	{
      PhySector = _AtaCalculatePhySectorAndOffsetOfFatEntry(RootCluster, pDrive, &fOffset, &fAlign);
		PhySector +=
		(
		  (unsigned long)FatNo *
		  pDrive->LogSectorsPerFat *
		  (unsigned long)(pDrive->WordsPerLogSector/ATA_WORDS_PER_PHY_SECTOR)
		);
	  ret_stat = _AtaReadFatEntryAtPhySector(PhySector, pDrive, fOffset, fAlign, &LastCluster, &write_cluster);
	  if(ret_stat) return(ret_stat);
      ret_stat = _AtaWriteFatEntryAtPhySector(PhySector, pDrive, 0x0FFFFFFF, fOffset, fAlign, 1,1);
	  if(ret_stat) return(ret_stat);
	}
/*SUSMIT - FAT32 format fix*/
	}
	else {
	testsector=pDrive->FirstFatSector;
	ret_stat = _AtaReadSector((AtaSector)testsector, pDrive, &_AtaWriteBuffer[0], 0);
	if(ret_stat) return(ret_stat);
	_AtaWriteBuffer1[0] = 0xFFF8;
	_AtaWriteBuffer1[1] = 0xFFFF;
	ret_stat = pDrive->AtaWriteSector((AtaSector)testsector++, pDrive->pAtaMediaState, &_AtaWriteBuffer1[0], 0);
	if(ret_stat) return(ret_stat);
    ret_stat = pDrive->AtaWriteSectorFlush(pDrive->pAtaMediaState);
    if(ret_stat) return(ret_stat);
	_AtaWriteBuffer1[0] = 0;
	_AtaWriteBuffer1[1] = 0;
	testsector1 = pDrive->FirstFatSector+pDrive->LogSectorsPerFat;
	while(testsector<testsector1) {
      ret_stat = _AtaReadSector((AtaSector)testsector, pDrive, &_AtaWriteBuffer[0], 0);
      if(ret_stat) return(ret_stat);
      ret_stat = pDrive->AtaWriteSector((AtaSector)testsector++, pDrive->pAtaMediaState, &_AtaWriteBuffer1[0], 0);
      if(ret_stat) return(ret_stat);
      ret_stat = pDrive->AtaWriteSectorFlush(pDrive->pAtaMediaState);
      if(ret_stat) return(ret_stat);
    }
    ret_stat = _AtaReadSector((AtaSector)testsector, pDrive, &_AtaWriteBuffer[0], 0);
	if(ret_stat) return(ret_stat);
	_AtaWriteBuffer1[0] = 0xFFF8;
	_AtaWriteBuffer1[1] = 0xFFFF;
	ret_stat = pDrive->AtaWriteSector((AtaSector)testsector++, pDrive->pAtaMediaState, &_AtaWriteBuffer1[0], 0);
	if(ret_stat) return(ret_stat);
    ret_stat = pDrive->AtaWriteSectorFlush(pDrive->pAtaMediaState);
    if(ret_stat) return(ret_stat);
	_AtaWriteBuffer1[0] = 0;
	_AtaWriteBuffer1[1] = 0;
	testsector1 = pDrive->FirstDataSector;
	while(testsector<testsector1) {
      ret_stat = _AtaReadSector((AtaSector)testsector, pDrive, &_AtaWriteBuffer[0], 0);
      if(ret_stat) return(ret_stat);
      ret_stat = pDrive->AtaWriteSector((AtaSector)testsector++, pDrive->pAtaMediaState, &_AtaWriteBuffer1[0], 0);
      if(ret_stat) return(ret_stat);
      ret_stat = pDrive->AtaWriteSectorFlush(pDrive->pAtaMediaState);
      if(ret_stat) return(ret_stat);
    } }
	/*only for full format*/
	if (flag) {
	testsector = pDrive->FirstDataSector;
	while(testsector<=pDrive->TotalSectors) {
      ret_stat = _AtaReadSector((AtaSector)testsector, pDrive, &_AtaWriteBuffer[0], 0);
      if(ret_stat) return(ret_stat);
      ret_stat = pDrive->AtaWriteSector((AtaSector)testsector++, pDrive->pAtaMediaState, &_AtaWriteBuffer1[0], 0);
      if(ret_stat) return(ret_stat);
      ret_stat = pDrive->AtaWriteSectorFlush(pDrive->pAtaMediaState);
      if(ret_stat) return(ret_stat);
    } }
/* SUSMIT - 25 FEB 2003 - NMP*/
/*	ret_stat = ATA_systemInit(pDrive);*/
	ret_stat = ATA_systemInit(pDrive,0);
/* SUSMIT - 25 FEB 2003 - NMP*/
	return(ret_stat);
}
Ejemplo n.º 6
0
AtaError ATA_getLongName(AtaFile *pAtaFile, char *LongName, AtaUint16 StartOffset, AtaUint16 Length)
{
  register char *cc;
    AtaError ret_stat = ATA_ERROR_NONE;
    AtaUint32 ll;AtaUint16 kk;
    short jj = 0;long lll;
    AtaState *pAtaDrive = pAtaFile->pDrive;
    AtaUint16 *_AtaWriteBuffer = pAtaDrive->_AtaWriteBuffer;
    AtaUint16 exit_flag = 0;
    AtaUint16 NumLFNEntry = 0;
    int i,j;AtaUint16 icnt = 0;
    AtaUint16 file_cksum = _Ata_lfn_checksum(pAtaFile);

    if ((pAtaFile==NULL)||(pAtaDrive==NULL)) return(ATA_ERROR_INVALID_PARAM); //KR042610

    file_cksum = file_cksum<<8;
    file_cksum &= 0xff00;

    ll = _AtaCalculatePhySectorAndOffsetFromDirEntry((AtaUint32)pAtaFile->CurrentDirEntry, (AtaUint16 *)&jj, pAtaFile, &ret_stat);
    if(ret_stat) return(ret_stat);
    ret_stat = _AtaReadSector(ll, pAtaDrive, &_AtaWriteBuffer[0], 0);
    if(ret_stat) return(ret_stat);
    kk=jj;
    jj-=16;
/*SUSMIT - Fix for UNICODE*/
/*    while(((_AtaWriteBuffer[jj+5] == 0x0F00)||(_AtaWriteBuffer[jj+5] == 0x0FFF))&&(jj>=0)&&(!exit_flag)&&(_AtaWriteBuffer[jj+6] == file_cksum)) {*/
    while((((_AtaWriteBuffer[jj+5]&0xff00) == 0x0F00)||(_AtaWriteBuffer[jj+5] == 0x0FFF))&&(jj>=0)&&(!exit_flag)&&(_AtaWriteBuffer[jj+6] == file_cksum)) {
/*SUSMIT - Fix for UNICODE*/
      if(_AtaWriteBuffer[jj]&0x0040) exit_flag = 1;
      NumLFNEntry++;
      jj-=16; }
/*SUSMIT - Code to check for corner cases*/
	if((!exit_flag)&&((NumLFNEntry)||(kk==0))) {

     ret_stat = AtaGetLFN(ll, pAtaDrive, LongName, &icnt, kk, jj, Length, NumLFNEntry);
      		NumLFNEntry = 0;
    if(ret_stat) return(ret_stat);

/*Susmit - Fix for .*/
    lll = (AtaUint32)pAtaFile->CurrentDirEntry-16-(AtaUint16)(kk%16);
    if(lll<0) lll = (AtaUint32)pAtaFile->CurrentDirEntry;
    ll = _AtaCalculatePhySectorAndOffsetFromDirEntry((AtaUint32)(lll), (AtaUint16 *)&jj, pAtaFile, &ret_stat);
/*Susmit - Fix for .*/
/*    ll = _AtaCalculatePhySectorAndOffsetFromDirEntry(((AtaUint32)pAtaFile->CurrentDirEntry-16-(AtaUint16)(kk%16)), (AtaUint16 *)&jj, pAtaFile, &ret_stat);*/
    if(ret_stat) return(ret_stat);
    ret_stat = _AtaReadSector(ll, pAtaDrive, &_AtaWriteBuffer[0], 0);
    if(ret_stat) return(ret_stat);
    jj = 256;
    kk=jj;
    jj-=16;
/*SUSMIT - Fix for UNICODE*/
/*    while(((_AtaWriteBuffer[jj+5] == 0x0F00)||(_AtaWriteBuffer[jj+5] == 0x0FFF))&&(jj>=0)&&(!exit_flag)&&(_AtaWriteBuffer[jj+6] == file_cksum)) {*/
    while((((_AtaWriteBuffer[jj+5]&0xff00) == 0x0F00)||(_AtaWriteBuffer[jj+5] == 0x0FFF))&&(jj>=0)&&(!exit_flag)&&(_AtaWriteBuffer[jj+6] == file_cksum)) {
/*SUSMIT - Fix for UNICODE*/
      if(_AtaWriteBuffer[jj]&0x0040) exit_flag = 1;
      NumLFNEntry++;
      jj-=16; }
	}
/*SUSMIT - Code to check for corner cases*/
    if(NumLFNEntry) {
     ret_stat = AtaGetLFN(ll, pAtaDrive, LongName, &icnt, kk, jj, Length, NumLFNEntry);
      		NumLFNEntry = 0;
     if(ret_stat) return(ret_stat);
 /*End of filename collection, now need to put '\0' at proper place - SUSMIT*/
/*SUSMIT - Fix for UNICODE of more than 208 characters*/
	if(!exit_flag) {
    ll = _AtaCalculatePhySectorAndOffsetFromDirEntry((AtaUint32)(lll-16), (AtaUint16 *)&jj, pAtaFile, &ret_stat);
    if(ret_stat) return(ret_stat);
    ret_stat = _AtaReadSector(ll, pAtaDrive, &_AtaWriteBuffer[0], 0);
    if(ret_stat) return(ret_stat);
    jj = 256;
    kk=jj;
    jj-=16;
/*SUSMIT - Fix for UNICODE*/
/*    while(((_AtaWriteBuffer[jj+5] == 0x0F00)||(_AtaWriteBuffer[jj+5] == 0x0FFF))&&(jj>=0)&&(!exit_flag)&&(_AtaWriteBuffer[jj+6] == file_cksum)) {*/
    while((((_AtaWriteBuffer[jj+5]&0xff00) == 0x0F00)||(_AtaWriteBuffer[jj+5] == 0x0FFF))&&(jj>=0)&&(!exit_flag)&&(_AtaWriteBuffer[jj+6] == file_cksum)) {
/*SUSMIT - Fix for UNICODE*/
      if(_AtaWriteBuffer[jj]&0x0040) exit_flag = 1;
      NumLFNEntry++;
      jj-=16; }
	}
/*SUSMIT - Code to check for corner cases*/
    if(NumLFNEntry) {
     ret_stat = AtaGetLFN(ll, pAtaDrive, LongName, &icnt, kk, jj, Length, NumLFNEntry);
      		NumLFNEntry = 0;
     if(ret_stat) return(ret_stat);
	}
/*SUSMIT - Fix for UNICODE of more than 208 characters*/
      if(icnt < Length) LongName[icnt] = '\0';
/*SUSMIT - No need to worry about zeroes if we get the full LFN, they will come automatically from LFN entries*/
    }
    else {
       cc = pAtaFile->Filename;
       i = 0;j = 0;
       while((*cc!=' ')&&(i<Length)&&(*cc!='\0')) {LongName[i++] = pAtaFile->Filename[j++];cc++;}
       cc = pAtaFile->Ext; j = 0;
       if((i<Length)&&(*cc!=' ')&&(*cc!='\0')) LongName[i++] = '.';
       while((*cc!=' ')&&(i<Length)&&(*cc!='\0')) {LongName[i++] = pAtaFile->Ext[j++];cc++;}
      if(i<Length) LongName[i] = '\0'; }
  return(ret_stat);
}
Ejemplo n.º 7
0
AtaError ATA_deleteLong(AtaFile *pAtaFile)
{
    int last_cluster;
    AtaError ret_stat = ATA_ERROR_NONE;
    AtaUint32 ll;
    unsigned short jj = 0;
/*SUSMIT - New LFN Fix*/
	AtaUint16 deleteflag = 0;
/*SUSMIT - New LFN Fix*/
    AtaState *pAtaDrive = pAtaFile->pDrive;
    AtaUint16 *_AtaWriteBuffer = pAtaDrive->_AtaWriteBuffer;
    AtaUint32 direntrycounter, dircounterstart = 0;
    AtaUint16 entriespersector = pAtaDrive->WordsPerLogSector/16;
    AtaUint16 file_cksum = _Ata_lfn_checksum(pAtaFile);

	if (pAtaFile==NULL) return(ATA_ERROR_INVALID_PARAM); //KR042610

    file_cksum = file_cksum<<8;
    file_cksum &= 0xff00;

  	if(pAtaFile->CurrentDirEntry>20) {dircounterstart = (AtaUint32)(pAtaFile->CurrentDirEntry-20);
  	dircounterstart-=(AtaUint32)(dircounterstart%entriespersector);}
/*SUSMIT - This magic number 20 comes from the limitation that an LFN can contain max 255
characters & all the entries are contiguous*/
  for(direntrycounter = dircounterstart; direntrycounter <= pAtaFile->CurrentDirEntry; direntrycounter += entriespersector) {
    ll = _AtaCalculatePhySectorAndOffsetFromDirEntry((AtaUint32)direntrycounter, (AtaUint16 *)&jj, pAtaFile, &ret_stat);
    if(ret_stat) return(ret_stat);
    ret_stat = _AtaReadSector(ll, pAtaDrive, &_AtaWriteBuffer[0], 0);
    if(ret_stat) return(ret_stat);
    while(jj<256) {
    if((((_AtaWriteBuffer[jj+5]&0xff00) == 0x0F00)||(_AtaWriteBuffer[jj+5] == 0x0FFF))&&(_AtaWriteBuffer[jj+6] == file_cksum))
/*SUSMIT - New LFN Fix*/
     { if(((_AtaWriteBuffer[jj]&0x0040)==0x0040)&&((_AtaWriteBuffer[jj]&0x000f)==(pAtaFile->CurrentDirEntry-(direntrycounter+jj/entriespersector)))) deleteflag = 1;
/*SUSMIT - New LFN deletion modification to save characters*/
/*     	if(deleteflag){ _AtaWriteBuffer[jj] = '\xE5'; }*/
     	if(deleteflag){ _AtaWriteBuffer[jj] = (_AtaWriteBuffer[jj]&0xff00)|0x00E5; }
/*SUSMIT - New LFN deletion modification to save characters*/
      }
    jj+=16;
/*SUSMIT - New LFN Fix*/
    }
    ret_stat = _AtaFlush(pAtaDrive);
    if(ret_stat) return(ret_stat);
    ret_stat = pAtaDrive->AtaWriteSector(ll, pAtaDrive->pAtaMediaState, &_AtaWriteBuffer[0], 0);
    if(ret_stat) return(ret_stat);
    ret_stat = pAtaDrive->AtaWriteSectorFlush(pAtaDrive->pAtaMediaState);
    if(ret_stat) return(ret_stat);
  }
/*Deletion of 8.3 directory entry & actual file - Susmit*/
    pAtaFile->PrevBrokenCluster = pAtaFile->NextBrokenCluster = pAtaFile->Cluster = pAtaFile->StartCluster;
    pAtaFile->Filename[0] = '\xE5';
    if(_AtaCreate(pAtaFile,2,0))
    {
      return(1);
    }
/*SUSMIT - Directory Delete FAT Updation Bug Fix*/
/* if(pAtaFile->Size!=0) {*/
/* if((pAtaFile->Size!=0)||(pAtaFile->Attributes == ATA_ATTR_DIRECTORY)) *//*SUSMIT - Directory Attribute Fix*/
 if((pAtaFile->Size!=0)||(ATA_isDir(pAtaFile))) 
/*SUSMIT - Directory Delete FAT Updation Bug Fix*/
    {
      do
      {
/*SUSMIT - New delete change due to modification in _AtaFindNextBrokenCluster*/
/*        ret_stat = _AtaFindNextBrokenCluster(pAtaFile,1);*/
        ret_stat = _AtaFindNextBrokenCluster(pAtaFile,0);
/*SUSMIT - New delete change due to modification in _AtaFindNextBrokenCluster*/
        if(ret_stat == ATA_ERROR_EOF) ret_stat = ATA_ERROR_NONE;
        if(ret_stat) return(ret_stat);

        ret_stat = _AtaReadFatEntry(pAtaFile->NextBrokenCluster, pAtaDrive, &last_cluster, &pAtaFile->Cluster);
        if(ret_stat) return(ret_stat);

        ret_stat = _AtaWriteFatEntry(pAtaFile,1);
        if(ret_stat) return(ret_stat);
      }
      while(!last_cluster);
    }
    return(ret_stat);
}