int MarkFail_D_PhyOneBlock(struct us_data *us) { BYTE sect; sect=Media.Sector; Set_D_FailBlock(WorkRedund); for(Media.Sector=0; Media.Sector<Ssfdc.MaxSectors; Media.Sector++) { if (Ssfdc_D_WriteRedtData(us, WorkRedund)) { Ssfdc_D_Reset(us); Media.Sector = sect; ErrCode = ERR_HwError; MediaChange = ERROR; return(ERROR); } } Ssfdc_D_Reset(us); Media.Sector=sect; return(SMSUCCESS); }
//----- MarkFail_D_PhyOneBlock() --------------------------------------- int MarkFail_D_PhyOneBlock(struct us_data *us) { BYTE sect; //SSFDCTYPE_T aa = (SSFDCTYPE_T ) &Ssfdc; //ADDRESS_T bb = (ADDRESS_T) &Media; sect=Media.Sector; Set_D_FailBlock(WorkRedund); //Ssfdc_D_WriteRedtMode(); for(Media.Sector=0; Media.Sector<Ssfdc.MaxSectors; Media.Sector++) { if (Ssfdc_D_WriteRedtData(us, WorkRedund)) { Ssfdc_D_Reset(us); Media.Sector = sect; ErrCode = ERR_HwError; MediaChange = ERROR; return(ERROR); } // NO Status Check } Ssfdc_D_Reset(us); Media.Sector=sect; return(SMSUCCESS); }
//SmartMedia Physical Sector Read/Write/Erase Subroutine //----- Read_D_PhyOneSect() -------------------------------------------- int Read_D_PhyOneSect(struct us_data *us, WORD count, BYTE *buf) { int i; DWORD retry; //SSFDCTYPE_T aa = (SSFDCTYPE_T ) &Ssfdc; //ADDRESS_T bb = (ADDRESS_T) &Media; if (Media.PhyBlock==NO_ASSIGN) { for(i=0; i<SECTSIZE; i++) *buf++=DUMMY_DATA; return(SMSUCCESS); } 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(fdoExt,buf,Redundant)) if (Ssfdc_D_ReadBlock(us,count,buf,Redundant)) { ErrCode = ERR_HwError; MediaChange=ERROR; return(ERROR); } if (Check_D_DataStatus(Redundant)) { ErrCode = ERR_DataStatus; return(ERROR); } if (!Check_D_ReadError(Redundant)) return(SMSUCCESS); if (!Check_D_Correct(buf,Redundant)) { ErrCode = ERR_CorReadErr; return(ERROR); } } ErrCode = ERR_EccReadErr; return(ERROR); }
//----- Make_D_LogTable() ---------------------------------------------- int Make_D_LogTable(struct us_data *us) { WORD phyblock,logblock; //SSFDCTYPE_T aa = (SSFDCTYPE_T ) &Ssfdc; //ADDRESS_T bb = (ADDRESS_T) &Media; if (Log2Phy[Media.Zone]==NULL) { Log2Phy[Media.Zone] = kmalloc(MAX_LOGBLOCK*sizeof(WORD), GFP_KERNEL); /* pr_info("ExAllocatePool Zone = %x, Addr = %x\n", Media.Zone, Log2Phy[Media.Zone]); */ if (Log2Phy[Media.Zone]==NULL) return(ERROR); } Media.Sector=0; //for(Media.Zone=0; Media.Zone<MAX_ZONENUM; Media.Zone++) //for(Media.Zone=0; Media.Zone<Ssfdc.MaxZones; Media.Zone++) { /* pr_info("Make_D_LogTable --- MediaZone = 0x%x\n", Media.Zone); */ for(Media.LogBlock=0; Media.LogBlock<Ssfdc.MaxLogBlocks; Media.LogBlock++) Log2Phy[Media.Zone][Media.LogBlock]=NO_ASSIGN; for(Media.PhyBlock=0; Media.PhyBlock<(MAX_BLOCKNUM/8); Media.PhyBlock++) Assign[Media.Zone][Media.PhyBlock]=0x00; for(Media.PhyBlock=0; Media.PhyBlock<Ssfdc.MaxBlocks; Media.PhyBlock++) { if ((!Media.Zone) && (Media.PhyBlock<=CisArea.PhyBlock)) { Set_D_Bit(Assign[Media.Zone],Media.PhyBlock); continue; } if (Ssfdc_D_ReadRedtData(us, Redundant)) { Ssfdc_D_Reset(us); return(ERROR); } if (!Check_D_DataBlank(Redundant)) continue; Set_D_Bit(Assign[Media.Zone],Media.PhyBlock); if (Check_D_FailBlock(Redundant)) continue; //if (Check_D_DataStatus(Redundant)) // continue; if (Load_D_LogBlockAddr(Redundant)) continue; if (Media.LogBlock>=Ssfdc.MaxLogBlocks) continue; if (Log2Phy[Media.Zone][Media.LogBlock]==NO_ASSIGN) { Log2Phy[Media.Zone][Media.LogBlock]=Media.PhyBlock; continue; } phyblock = Media.PhyBlock; logblock = Media.LogBlock; Media.Sector = (BYTE)(Ssfdc.MaxSectors-1); if (Ssfdc_D_ReadRedtData(us, Redundant)) { Ssfdc_D_Reset(us); return(ERROR); } if (!Load_D_LogBlockAddr(Redundant)) { if (Media.LogBlock==logblock) { Media.PhyBlock=Log2Phy[Media.Zone][logblock]; if (Ssfdc_D_ReadRedtData(us, Redundant)) { Ssfdc_D_Reset(us); return(ERROR); } Media.PhyBlock=phyblock; if (!Load_D_LogBlockAddr(Redundant)) { if (Media.LogBlock!=logblock) { Media.PhyBlock=Log2Phy[Media.Zone][logblock]; Log2Phy[Media.Zone][logblock]=phyblock; } } else { Media.PhyBlock=Log2Phy[Media.Zone][logblock]; Log2Phy[Media.Zone][logblock]=phyblock; } } } Media.Sector=0; // here Not yet //#ifdef L2P_ERR_ERASE // if (!(Ssfdc.Attribute &MWP)) // { // Ssfdc_D_Reset(fdoExt); // if (Ssfdc_D_EraseBlock(fdoExt)) // return(ERROR); // // if (Ssfdc_D_CheckStatus()) // { // if (MarkFail_D_PhyOneBlock()) // return(ERROR); // } // else // Clr_D_Bit(Assign[Media.Zone],Media.PhyBlock); // } //#else // Ssfdc.Attribute|=MWP; //#endif Media.PhyBlock=phyblock; } // End for (Media.PhyBlock<Ssfdc.MaxBlocks) AssignStart[Media.Zone]=0; } // End for (Media.Zone<MAX_ZONENUM) Ssfdc_D_Reset(us); return(SMSUCCESS); }
//----- 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); }
int Make_D_LogTable(struct us_data *us) { WORD phyblock,logblock; if (Log2Phy[Media.Zone]==NULL) { Log2Phy[Media.Zone] = kmalloc(MAX_LOGBLOCK*sizeof(WORD), GFP_KERNEL); if (Log2Phy[Media.Zone]==NULL) return(ERROR); } Media.Sector=0; { for(Media.LogBlock=0; Media.LogBlock<Ssfdc.MaxLogBlocks; Media.LogBlock++) Log2Phy[Media.Zone][Media.LogBlock]=NO_ASSIGN; for(Media.PhyBlock=0; Media.PhyBlock<(MAX_BLOCKNUM/8); Media.PhyBlock++) Assign[Media.Zone][Media.PhyBlock]=0x00; for(Media.PhyBlock=0; Media.PhyBlock<Ssfdc.MaxBlocks; Media.PhyBlock++) { if ((!Media.Zone) && (Media.PhyBlock<=CisArea.PhyBlock)) { Set_D_Bit(Assign[Media.Zone],Media.PhyBlock); continue; } if (Ssfdc_D_ReadRedtData(us, Redundant)) { Ssfdc_D_Reset(us); return(ERROR); } if (!Check_D_DataBlank(Redundant)) continue; Set_D_Bit(Assign[Media.Zone],Media.PhyBlock); if (Check_D_FailBlock(Redundant)) continue; if (Load_D_LogBlockAddr(Redundant)) continue; if (Media.LogBlock>=Ssfdc.MaxLogBlocks) continue; if (Log2Phy[Media.Zone][Media.LogBlock]==NO_ASSIGN) { Log2Phy[Media.Zone][Media.LogBlock]=Media.PhyBlock; continue; } phyblock = Media.PhyBlock; logblock = Media.LogBlock; Media.Sector = (BYTE)(Ssfdc.MaxSectors-1); if (Ssfdc_D_ReadRedtData(us, Redundant)) { Ssfdc_D_Reset(us); return(ERROR); } if (!Load_D_LogBlockAddr(Redundant)) { if (Media.LogBlock==logblock) { Media.PhyBlock=Log2Phy[Media.Zone][logblock]; if (Ssfdc_D_ReadRedtData(us, Redundant)) { Ssfdc_D_Reset(us); return(ERROR); } Media.PhyBlock=phyblock; if (!Load_D_LogBlockAddr(Redundant)) { if (Media.LogBlock!=logblock) { Media.PhyBlock=Log2Phy[Media.Zone][logblock]; Log2Phy[Media.Zone][logblock]=phyblock; } } else { Media.PhyBlock=Log2Phy[Media.Zone][logblock]; Log2Phy[Media.Zone][logblock]=phyblock; } } } Media.Sector=0; Media.PhyBlock=phyblock; } AssignStart[Media.Zone]=0; } Ssfdc_D_Reset(us); return(SMSUCCESS); }