int Ssfdc_D_ReadCisSect(struct us_data *us, BYTE *buf, BYTE *redundant) { BYTE zone, sector; WORD block; zone = Media.Zone; block = Media.PhyBlock; sector = Media.Sector; Media.Zone = 0; Media.PhyBlock = CisArea.PhyBlock; Media.Sector = CisArea.Sector; if (Ssfdc_D_ReadSect(us, buf, redundant)) { Media.Zone = zone; Media.PhyBlock = block; Media.Sector = sector; return ERROR; } Media.Zone = zone; Media.PhyBlock = block; Media.Sector = sector; return SMSUCCESS; }
//----- Ssfdc_D_ReadCisSect() ------------------------------------------ int Ssfdc_D_ReadCisSect(struct us_data *us, BYTE *buf,BYTE *redundant) { BYTE zone,sector; WORD block; //SSFDCTYPE_T aa = (SSFDCTYPE_T ) &Ssfdc; //ADDRESS_T bb = (ADDRESS_T) &Media; zone=Media.Zone; block=Media.PhyBlock; sector=Media.Sector; Media.Zone=0; Media.PhyBlock=CisArea.PhyBlock; Media.Sector=CisArea.Sector; if (Ssfdc_D_ReadSect(us,buf,redundant)) { Media.Zone=zone; Media.PhyBlock=block; Media.Sector=sector; return(ERROR); } Media.Zone=zone; Media.PhyBlock=block; Media.Sector=sector; return(SUCCESS); }
//----- Search_D_CIS() ------------------------------------------------- int Search_D_CIS(struct us_data *us) { //SSFDCTYPE_T aa = (SSFDCTYPE_T ) &Ssfdc; //ADDRESS_T bb = (ADDRESS_T) &Media; Media.Zone=0; Media.Sector=0; for (Media.PhyBlock=0; Media.PhyBlock<(Ssfdc.MaxBlocks-Ssfdc.MaxLogBlocks-1); Media.PhyBlock++) { if (Ssfdc_D_ReadRedtData(us, Redundant)) { Ssfdc_D_Reset(us); return(ERROR); } if (!Check_D_FailBlock(Redundant)) break; } if (Media.PhyBlock==(Ssfdc.MaxBlocks-Ssfdc.MaxLogBlocks-1)) { Ssfdc_D_Reset(us); return(ERROR); } while (Media.Sector<CIS_SEARCH_SECT) { if (Media.Sector) { if (Ssfdc_D_ReadRedtData(us, Redundant)) { Ssfdc_D_Reset(us); return(ERROR); } } if (!Check_D_DataStatus(Redundant)) { if (Ssfdc_D_ReadSect(us,WorkBuf,Redundant)) { Ssfdc_D_Reset(us); return(ERROR); } if (Check_D_CISdata(WorkBuf,Redundant)) { Ssfdc_D_Reset(us); return(ERROR); } CisArea.PhyBlock=Media.PhyBlock; CisArea.Sector=Media.Sector; Ssfdc_D_Reset(us); return(SMSUCCESS); } Media.Sector++; } Ssfdc_D_Reset(us); return(ERROR); }
//SmartMedia Physical Sector Data Copy Subroutine //----- Copy_D_PhyOneSect() -------------------------------------------- int Copy_D_PhyOneSect(struct us_data *us) { int i; DWORD err, retry; //SSFDCTYPE_T aa = (SSFDCTYPE_T ) &Ssfdc; //ADDRESS_T bb = (ADDRESS_T) &Media; /* pr_info("Copy_D_PhyOneSect --- Secotr = %x\n", Media.Sector); */ if (ReadBlock!=NO_ASSIGN) { Media.PhyBlock=ReadBlock; for(retry=0; retry<2; retry++) { if (retry!=0) { Ssfdc_D_Reset(us); if (Ssfdc_D_ReadCisSect(us,WorkBuf,WorkRedund)) { ErrCode = ERR_HwError; MediaChange=ERROR; return(ERROR); } if (Check_D_CISdata(WorkBuf,WorkRedund)) { ErrCode = ERR_HwError; MediaChange=ERROR; return(ERROR); } } if (Ssfdc_D_ReadSect(us,WorkBuf,WorkRedund)) { ErrCode = ERR_HwError; MediaChange=ERROR; return(ERROR); } if (Check_D_DataStatus(WorkRedund)) { err=ERROR; break; } if (!Check_D_ReadError(WorkRedund)) { err=SMSUCCESS; break; } if (!Check_D_Correct(WorkBuf,WorkRedund)) { err=SMSUCCESS; break; } err=ERROR; SectCopyMode=REQ_FAIL; } } else { err=SMSUCCESS; for(i=0; i<SECTSIZE; i++) WorkBuf[i]=DUMMY_DATA; Clr_D_RedundantData(WorkRedund); } Set_D_LogBlockAddr(WorkRedund); if (err==ERROR) { Set_D_RightECC(WorkRedund); Set_D_DataStaus(WorkRedund); } Media.PhyBlock=WriteBlock; if (Ssfdc_D_WriteSectForCopy(us, WorkBuf, WorkRedund)) { ErrCode = ERR_HwError; MediaChange=ERROR; return(ERROR); } if (Ssfdc_D_CheckStatus()) { ErrCode = ERR_WriteFault; return(ERROR); } Media.PhyBlock=ReadBlock; return(SMSUCCESS); }