#include <linux/slab.h> #include "usb.h" #include "scsiglue.h" #include "smcommon.h" #include "smil.h" int Check_D_LogCHS (WORD *,BYTE *,BYTE *); void Initialize_D_Media (void); void PowerOff_D_Media (void); int Check_D_MediaPower (void); int Check_D_MediaExist (void); int Check_D_MediaWP (void); int Check_D_MediaFmt (struct us_data *); int Check_D_MediaFmtForEraseAll (struct us_data *); int Conv_D_MediaAddr (struct us_data *, DWORD); int Inc_D_MediaAddr (struct us_data *); int Check_D_FirstSect (void); int Check_D_LastSect (void); int Media_D_ReadOneSect (struct us_data *, WORD, BYTE *); int Media_D_WriteOneSect (struct us_data *, WORD, BYTE *); int Media_D_CopyBlockHead (struct us_data *); int Media_D_CopyBlockTail (struct us_data *); int Media_D_EraseOneBlock (void); int Media_D_EraseAllBlock (void); int Copy_D_BlockAll (struct us_data *, DWORD); int Copy_D_BlockHead (struct us_data *); int Copy_D_BlockTail (struct us_data *); int Reassign_D_BlockHead (struct us_data *); int Assign_D_WriteBlock (void); int Release_D_ReadBlock (struct us_data *); int Release_D_WriteBlock (struct us_data *); int Release_D_CopySector (struct us_data *); int Copy_D_PhyOneSect (struct us_data *); int Read_D_PhyOneSect (struct us_data *, WORD, BYTE *); int Write_D_PhyOneSect (struct us_data *, WORD, BYTE *); int Erase_D_PhyOneBlock (struct us_data *); int Set_D_PhyFmtValue (struct us_data *); int Search_D_CIS (struct us_data *); int Make_D_LogTable (struct us_data *); void Check_D_BlockIsFull (void); int MarkFail_D_PhyOneBlock (struct us_data *); DWORD ErrXDCode; DWORD ErrCode; //BYTE SectBuf[SECTSIZE]; static BYTE WorkBuf[SECTSIZE]; static BYTE Redundant[REDTSIZE]; static BYTE WorkRedund[REDTSIZE]; //WORD Log2Phy[MAX_ZONENUM][MAX_LOGBLOCK]; static WORD *Log2Phy[MAX_ZONENUM]; // 128 x 1000, Log2Phy[MAX_ZONENUM][MAX_LOGBLOCK]; static BYTE Assign[MAX_ZONENUM][MAX_BLOCKNUM/8]; static WORD AssignStart[MAX_ZONENUM]; WORD ReadBlock; WORD WriteBlock; DWORD MediaChange; static DWORD SectCopyMode; //BIT Control Macro static BYTE BitData[] = { 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80 } ; #define Set_D_Bit(a,b) (a[(BYTE)((b)/8)]|= BitData[(b)%8]) #define Clr_D_Bit(a,b) (a[(BYTE)((b)/8)]&=~BitData[(b)%8]) #define Chk_D_Bit(a,b) (a[(BYTE)((b)/8)] & BitData[(b)%8]) //extern PBYTE SMHostAddr; BYTE IsSSFDCCompliance; BYTE IsXDCompliance; // ////Power Control & Media Exist Check Function ////----- Init_D_SmartMedia() -------------------------------------------- //int Init_D_SmartMedia(void) //{ // int i; // // EMCR_Print("Init_D_SmartMedia start\n"); // for (i=0; i<MAX_ZONENUM; i++) // { // if (Log2Phy[i]!=NULL) // { // EMCR_Print("ExFreePool Zone = %x, Addr = %x\n", i, Log2Phy[i]); // ExFreePool(Log2Phy[i]); // Log2Phy[i] = NULL; // } // } // // Initialize_D_Media(); // return(NO_ERROR); //} //----- SM_FreeMem() ------------------------------------------------- int SM_FreeMem(void) { int i; pr_info("SM_FreeMem start\n"); for (i=0; i<MAX_ZONENUM; i++) { if (Log2Phy[i]!=NULL) { pr_info("Free Zone = %x, Addr = %p\n", i, Log2Phy[i]); kfree(Log2Phy[i]); Log2Phy[i] = NULL; } } return(NO_ERROR); } ////----- Pwoff_D_SmartMedia() ------------------------------------------- //int Pwoff_D_SmartMedia(void) //{ // PowerOff_D_Media(); // return(NO_ERROR); //} // ////----- Check_D_SmartMedia() ------------------------------------------- //int Check_D_SmartMedia(void) //{ // if (Check_D_MediaExist()) // return(ErrCode); // // return(NO_ERROR); //} // ////----- Check_D_Parameter() -------------------------------------------- //int Check_D_Parameter(PFDO_DEVICE_EXTENSION fdoExt,WORD *pcyl,BYTE *phead,BYTE *psect) //{ // if (Check_D_MediaPower()) // return(ErrCode); // // if (Check_D_MediaFmt(fdoExt)) // return(ErrCode); // // if (Check_D_LogCHS(pcyl,phead,psect)) // return(ErrCode); // // return(NO_ERROR); //} //SmartMedia Read/Write/Erase Function //----- Media_D_ReadSector() ------------------------------------------- int Media_D_ReadSector(struct us_data *us, DWORD start,WORD count,BYTE *buf) { WORD len, bn; //if (Check_D_MediaPower()) ; ¦b 6250 don't care // return(ErrCode); //if (Check_D_MediaFmt(fdoExt)) ; // return(ErrCode); if (Conv_D_MediaAddr(us, start)) return(ErrCode); while(1) { len = Ssfdc.MaxSectors - Media.Sector; if (count > len) bn = len; else bn = count; //if (Media_D_ReadOneSect(fdoExt, SectBuf)) //if (Media_D_ReadOneSect(fdoExt, count, buf)) if (Media_D_ReadOneSect(us, bn, buf)) { ErrCode = ERR_EccReadErr; return(ErrCode); } Media.Sector += bn; count -= bn; if (count<=0) break; buf += bn * SECTSIZE; if (Inc_D_MediaAddr(us)) return(ErrCode); } return(NO_ERROR); } // here //----- Media_D_CopySector() ------------------------------------------ int Media_D_CopySector(struct us_data *us, DWORD start,WORD count,BYTE *buf) { //DWORD mode; //int i; WORD len, bn; //SSFDCTYPE_T aa = (SSFDCTYPE_T ) &Ssfdc; //ADDRESS_T bb = (ADDRESS_T) &Media; /* pr_info("Media_D_CopySector !!!\n"); */ if (Conv_D_MediaAddr(us, start)) return(ErrCode); while(1) { if (Assign_D_WriteBlock()) return(ERROR); len = Ssfdc.MaxSectors - Media.Sector; if (count > len) bn = len; else bn = count; //if (Ssfdc_D_CopyBlock(fdoExt,count,buf,Redundant)) if (Ssfdc_D_CopyBlock(us,bn,buf,Redundant)) { ErrCode = ERR_WriteFault; return(ErrCode); } Media.Sector = 0x1F; //if (Release_D_ReadBlock(fdoExt)) if (Release_D_CopySector(us)) { if (ErrCode==ERR_HwError) { ErrCode = ERR_WriteFault; return(ErrCode); } } count -= bn; if (count<=0) break; buf += bn * SECTSIZE; if (Inc_D_MediaAddr(us)) return(ErrCode); } return(NO_ERROR); } //----- Release_D_CopySector() ------------------------------------------ int Release_D_CopySector(struct us_data *us) { //SSFDCTYPE_T aa = (SSFDCTYPE_T ) &Ssfdc; //ADDRESS_T bb = (ADDRESS_T) &Media; Log2Phy[Media.Zone][Media.LogBlock]=WriteBlock; Media.PhyBlock=ReadBlock; if (Media.PhyBlock==NO_ASSIGN) { Media.PhyBlock=WriteBlock; return(SMSUCCESS); } Clr_D_Bit(Assign[Media.Zone],Media.PhyBlock); Media.PhyBlock=WriteBlock; return(SMSUCCESS); } /* //----- Media_D_WriteSector() ------------------------------------------ int Media_D_WriteSector(PFDO_DEVICE_EXTENSION fdoExt, DWORD start,WORD count,BYTE *buf) { int i; WORD len, bn; SSFDCTYPE_T aa = (SSFDCTYPE_T ) &Ssfdc; ADDRESS_T bb = (ADDRESS_T) &Media; //if (Check_D_MediaPower()) // return(ErrCode); // //if (Check_D_MediaFmt(fdoExt)) // return(ErrCode); // //if (Check_D_MediaWP()) // return(ErrCode); if (Conv_D_MediaAddr(fdoExt, start)) return(ErrCode); //ENE_Print("Media_D_WriteSector --- Sector = %x\n", Media.Sector); if (Check_D_FirstSect()) { if (Media_D_CopyBlockHead(fdoExt)) { ErrCode = ERR_WriteFault; return(ErrCode); } } while(1) { if (!Check_D_FirstSect()) { if (Assign_D_WriteBlock()) return(ErrCode); } len = Ssfdc.MaxSectors - Media.Sector; if (count > len) bn = len; else bn = count; //for(i=0;i<SECTSIZE;i++) // SectBuf[i]=*buf++; //if (Media_D_WriteOneSect(fdoExt, SectBuf)) if (Media_D_WriteOneSect(fdoExt, bn, buf)) { ErrCode = ERR_WriteFault; return(ErrCode); } Media.Sector += bn - 1; if (!Check_D_LastSect()) { if (Release_D_ReadBlock(fdoExt)) { if (ErrCode==ERR_HwError) { ErrCode = ERR_WriteFault; return(ErrCode); } } } count -= bn; if (count<=0) break; buf += bn * SECTSIZE; //if (--count<=0) // break; if (Inc_D_MediaAddr(fdoExt)) return(ErrCode); } if (!Check_D_LastSect()) return(NO_ERROR); if (Inc_D_MediaAddr(fdoExt)) return(ErrCode); if (Media_D_CopyBlockTail(fdoExt)) { ErrCode = ERR_WriteFault; return(ErrCode); } return(NO_ERROR); } // ////----- Media_D_EraseBlock() ------------------------------------------- //int Media_D_EraseBlock(PFDO_DEVICE_EXTENSION fdoExt, DWORD start,WORD count) //{ // if (Check_D_MediaPower()) // return(ErrCode); // // if (Check_D_MediaFmt(fdoExt)) // return(ErrCode); // // if (Check_D_MediaWP()) // return(ErrCode); // // if (Conv_D_MediaAddr(start)) // return(ErrCode); // // while(Check_D_FirstSect()) { // if (Inc_D_MediaAddr(fdoExt)) // return(ErrCode); // // if (--count<=0) // return(NO_ERROR); // } // // while(1) { // if (!Check_D_LastSect()) // if (Media_D_EraseOneBlock()) // if (ErrCode==ERR_HwError) // { // ErrCode = ERR_WriteFault; // return(ErrCode); // } // // if (Inc_D_MediaAddr(fdoExt)) // return(ErrCode); // // if (--count<=0) // return(NO_ERROR); // } //} // ////----- Media_D_EraseAll() --------------------------------------------- //int Media_D_EraseAll(PFDO_DEVICE_EXTENSION fdoExt) //{ // if (Check_D_MediaPower()) // return(ErrCode); // // if (Check_D_MediaFmtForEraseAll(fdoExt)) // return(ErrCode); // // if (Check_D_MediaWP()) // return(ErrCode); // // if (Media_D_EraseAllBlock()) // return(ErrCode); // // return(NO_ERROR); //} //SmartMedia Write Function for One Sector Write Mode //----- Media_D_OneSectWriteStart() ------------------------------------ int Media_D_OneSectWriteStart(PFDO_DEVICE_EXTENSION fdoExt,DWORD start,BYTE *buf) { // int i; // SSFDCTYPE_T aa = (SSFDCTYPE_T ) &Ssfdc; // ADDRESS_T bb = (ADDRESS_T) &Media; // // //if (Check_D_MediaPower()) // // return(ErrCode); // //if (Check_D_MediaFmt(fdoExt)) // // return(ErrCode); // //if (Check_D_MediaWP()) // // return(ErrCode); // if (Conv_D_MediaAddr(fdoExt, start)) // return(ErrCode); // // if (Check_D_FirstSect()) // if (Media_D_CopyBlockHead(fdoExt)) // { // ErrCode = ERR_WriteFault; // return(ErrCode); // } // // if (!Check_D_FirstSect()) // if (Assign_D_WriteBlock()) // return(ErrCode); // // //for(i=0;i<SECTSIZE;i++) // // SectBuf[i]=*buf++; // // //if (Media_D_WriteOneSect(fdoExt, SectBuf)) // if (Media_D_WriteOneSect(fdoExt, buf)) // { // ErrCode = ERR_WriteFault; // return(ErrCode); // } // // if (!Check_D_LastSect()) // { // if (Release_D_ReadBlock(fdoExt)) // if (ErrCode==ERR_HwError) // { // ErrCode = ERR_WriteFault; // return(ErrCode); // } // } return(NO_ERROR); } //----- Media_D_OneSectWriteNext() ------------------------------------- int Media_D_OneSectWriteNext(PFDO_DEVICE_EXTENSION fdoExt, BYTE *buf) { // int i; // SSFDCTYPE_T aa = (SSFDCTYPE_T ) &Ssfdc; // ADDRESS_T bb = (ADDRESS_T) &Media; // // if (Inc_D_MediaAddr(fdoExt)) // return(ErrCode); // // if (!Check_D_FirstSect()) // if (Assign_D_WriteBlock()) // return(ErrCode); // // //for(i=0;i<SECTSIZE;i++) // // SectBuf[i]=*buf++; // // //if (Media_D_WriteOneSect(fdoExt, SectBuf)) // if (Media_D_WriteOneSect(fdoExt, buf)) // { // ErrCode = ERR_WriteFault; // return(ErrCode); // } // // if (!Check_D_LastSect()) // { // if (Release_D_ReadBlock(fdoExt)) // if (ErrCode==ERR_HwError) // { // ErrCode = ERR_WriteFault; // return(ErrCode); // } // } return(NO_ERROR); } //----- Media_D_OneSectWriteFlush() ------------------------------------ int Media_D_OneSectWriteFlush(PFDO_DEVICE_EXTENSION fdoExt) { if (!Check_D_LastSect()) return(NO_ERROR); if (Inc_D_MediaAddr(fdoExt)) return(ErrCode); if (Media_D_CopyBlockTail(fdoExt)) { ErrCode = ERR_WriteFault; return(ErrCode); } return(NO_ERROR); } // ////LED Tern On/Off Subroutine ////----- SM_EnableLED() ----------------------------------------------- //void SM_EnableLED(PFDO_DEVICE_EXTENSION fdoExt, BOOLEAN enable) //{ // if (fdoExt->Drive_IsSWLED) // { // if (enable) // Led_D_TernOn(); // else // Led_D_TernOff(); // } //} // ////----- Led_D_TernOn() ------------------------------------------------- //void Led_D_TernOn(void) //{ // if (Check_D_CardStsChg()) // MediaChange=ERROR; // // Cnt_D_LedOn(); //} // ////----- Led_D_TernOff() ------------------------------------------------ //void Led_D_TernOff(void) //{ // if (Check_D_CardStsChg()) // MediaChange=ERROR; // // Cnt_D_LedOff(); //} // ////SmartMedia Logical Format Subroutine ////----- Check_D_LogCHS() ----------------------------------------------- //int Check_D_LogCHS(WORD *c,BYTE *h,BYTE *s) //{ // switch(Ssfdc.Model) { // case SSFDC1MB: *c=125; *h= 4; *s= 4; break; // case SSFDC2MB: *c=125; *h= 4; *s= 8; break; // case SSFDC4MB: *c=250; *h= 4; *s= 8; break; // case SSFDC8MB: *c=250; *h= 4; *s=16; break; // case SSFDC16MB: *c=500; *h= 4; *s=16; break; // case SSFDC32MB: *c=500; *h= 8; *s=16; break; // case SSFDC64MB: *c=500; *h= 8; *s=32; break; // case SSFDC128MB: *c=500; *h=16; *s=32; break; // default: *c= 0; *h= 0; *s= 0; ErrCode = ERR_NoSmartMedia; return(ERROR); // } // // return(SMSUCCESS); //} // ////Power Control & Media Exist Check Subroutine ////----- Initialize_D_Media() ------------------------------------------- //void Initialize_D_Media(void) //{ // ErrCode = NO_ERROR; // MediaChange = ERROR; // SectCopyMode = COMPLETED; // Cnt_D_Reset(); //} // ////----- PowerOff_D_Media() --------------------------------------------- //void PowerOff_D_Media(void) //{ // Cnt_D_PowerOff(); //} // ////----- Check_D_MediaPower() ------------------------------------------- //int Check_D_MediaPower(void) //{ // //usleep(56*1024); // if (Check_D_CardStsChg()) // MediaChange = ERROR; // //usleep(56*1024); // if ((!Check_D_CntPower())&&(!MediaChange)) // ¦³ power & Media ¨S³Q change, «h return success // return(SMSUCCESS); // //usleep(56*1024); // // if (Check_D_CardExist()) // Check if card is not exist, return err // { // ErrCode = ERR_NoSmartMedia; // MediaChange = ERROR; // return(ERROR); // } // //usleep(56*1024); // if (Cnt_D_PowerOn()) // { // ErrCode = ERR_NoSmartMedia; // MediaChange = ERROR; // return(ERROR); // } // //usleep(56*1024); // Ssfdc_D_Reset(fdoExt); // //usleep(56*1024); // return(SMSUCCESS); //} // ////-----Check_D_MediaExist() -------------------------------------------- //int Check_D_MediaExist(void) //{ // if (Check_D_CardStsChg()) // MediaChange = ERROR; // // if (!Check_D_CardExist()) // { // if (!MediaChange) // return(SMSUCCESS); // // ErrCode = ERR_ChangedMedia; // return(ERROR); // } // // ErrCode = ERR_NoSmartMedia; // // return(ERROR); //} // ////----- Check_D_MediaWP() ---------------------------------------------- //int Check_D_MediaWP(void) //{ // if (Ssfdc.Attribute &MWP) // { // ErrCode = ERR_WrtProtect; // return(ERROR); // } // // return(SMSUCCESS); //} */ //SmartMedia Physical Format Test Subroutine //----- Check_D_MediaFmt() --------------------------------------------- int Check_D_MediaFmt(struct us_data *us) { pr_info("Check_D_MediaFmt\n"); //ULONG i,j, result=FALSE, zone,block; //usleep(56*1024); if (!MediaChange) return(SMSUCCESS); MediaChange = ERROR; SectCopyMode = COMPLETED; //usleep(56*1024); if (Set_D_PhyFmtValue(us)) { ErrCode = ERR_UnknownMedia; return(ERROR); } //usleep(56*1024); if (Search_D_CIS(us)) { ErrCode = ERR_IllegalFmt; return(ERROR); } MediaChange = SMSUCCESS; return(SMSUCCESS); } /* ////----- Check_D_BlockIsFull() ---------------------------------- //void Check_D_BlockIsFull() //{ // ULONG i, block; // // if (IsXDCompliance || IsSSFDCCompliance) // { // // If the blocks are full then return write-protect. // block = Ssfdc.MaxBlocks/8; // for (Media.Zone=0; Media.Zone<Ssfdc.MaxZones; Media.Zone++) // { // if (Log2Phy[Media.Zone]==NULL) // { // if (Make_D_LogTable()) // { // ErrCode = ERR_IllegalFmt; // return; // } // } // // for (i=0; i<block; i++) // { // if (Assign[Media.Zone][i] != 0xFF) // return; // } // } // Ssfdc.Attribute |= WP; // } //} // // ////----- Check_D_MediaFmtForEraseAll() ---------------------------------- //int Check_D_MediaFmtForEraseAll(PFDO_DEVICE_EXTENSION fdoExt) //{ // MediaChange = ERROR; // SectCopyMode = COMPLETED; // // if (Set_D_PhyFmtValue(fdoExt)) // { // ErrCode = ERR_UnknownMedia; // return(ERROR); // } // // if (Search_D_CIS(fdoExt)) // { // ErrCode = ERR_IllegalFmt; // return(ERROR); // } // // return(SMSUCCESS); //} */ //SmartMedia Physical Address Control Subroutine //----- Conv_D_MediaAddr() --------------------------------------------- int Conv_D_MediaAddr(struct us_data *us, DWORD addr) { DWORD temp; //ULONG zz; //SSFDCTYPE_T aa = (SSFDCTYPE_T ) &Ssfdc; //ADDRESS_T bb = (ADDRESS_T) &Media; temp = addr/Ssfdc.MaxSectors; Media.Zone = (BYTE) (temp/Ssfdc.MaxLogBlocks); if (Log2Phy[Media.Zone]==NULL) { if (Make_D_LogTable(us)) { ErrCode = ERR_IllegalFmt; return(ERROR); } } Media.Sector = (BYTE) (addr%Ssfdc.MaxSectors); Media.LogBlock = (WORD) (temp%Ssfdc.MaxLogBlocks); if (Media.Zone<Ssfdc.MaxZones) { Clr_D_RedundantData(Redundant); Set_D_LogBlockAddr(Redundant); Media.PhyBlock = Log2Phy[Media.Zone][Media.LogBlock]; return(SMSUCCESS); } ErrCode = ERR_OutOfLBA; return(ERROR); } //----- Inc_D_MediaAddr() ---------------------------------------------- int Inc_D_MediaAddr(struct us_data *us) { WORD LogBlock = Media.LogBlock; //SSFDCTYPE_T aa = (SSFDCTYPE_T ) &Ssfdc; //ADDRESS_T bb = (ADDRESS_T) &Media; if (++Media.Sector<Ssfdc.MaxSectors) return(SMSUCCESS); if (Log2Phy[Media.Zone]==NULL) { if (Make_D_LogTable(us)) { ErrCode = ERR_IllegalFmt; return(ERROR); } } Media.Sector=0; Media.LogBlock = LogBlock; if (++Media.LogBlock<Ssfdc.MaxLogBlocks) { Clr_D_RedundantData(Redundant); Set_D_LogBlockAddr(Redundant); Media.PhyBlock=Log2Phy[Media.Zone][Media.LogBlock]; return(SMSUCCESS); } Media.LogBlock=0; if (++Media.Zone<Ssfdc.MaxZones) { if (Log2Phy[Media.Zone]==NULL) { if (Make_D_LogTable(us)) { ErrCode = ERR_IllegalFmt; return(ERROR); } } Media.LogBlock = 0; Clr_D_RedundantData(Redundant); Set_D_LogBlockAddr(Redundant); Media.PhyBlock=Log2Phy[Media.Zone][Media.LogBlock]; return(SMSUCCESS); } Media.Zone=0; ErrCode = ERR_OutOfLBA; return(ERROR); } /* //----- Check_D_FirstSect() -------------------------------------------- int Check_D_FirstSect(void) { SSFDCTYPE_T aa = (SSFDCTYPE_T ) &Ssfdc; ADDRESS_T bb = (ADDRESS_T) &Media; if (!Media.Sector) return(SMSUCCESS); return(ERROR); } //----- Check_D_LastSect() --------------------------------------------- int Check_D_LastSect(void) { SSFDCTYPE_T aa = (SSFDCTYPE_T ) &Ssfdc; ADDRESS_T bb = (ADDRESS_T) &Media; if (Media.Sector<(Ssfdc.MaxSectors-1)) return(ERROR); return(SMSUCCESS); } */ //SmartMedia Read/Write Subroutine with Retry //----- Media_D_ReadOneSect() ------------------------------------------ int Media_D_ReadOneSect(struct us_data *us, WORD count, BYTE *buf) { DWORD err, retry; if (!Read_D_PhyOneSect(us, count, buf)) return(SMSUCCESS); if (ErrCode==ERR_HwError) return(ERROR); if (ErrCode==ERR_DataStatus) return(ERROR); #ifdef RDERR_REASSIGN if (Ssfdc.Attribute &MWP) { if (ErrCode==ERR_CorReadErr) return(SMSUCCESS); return(ERROR); } err=ErrCode; for(retry=0; retry<2; retry++) { if (Copy_D_BlockAll(us, (err==ERR_EccReadErr)?REQ_FAIL:REQ_ERASE)) { if (ErrCode==ERR_HwError) return(ERROR); continue; } ErrCode = err; if (ErrCode==ERR_CorReadErr) return(SMSUCCESS); return(ERROR); } MediaChange = ERROR; #else if (ErrCode==ERR_CorReadErr) return(SMSUCCESS); #endif return(ERROR); } /* //----- Media_D_WriteOneSect() ----------------------------------------- int Media_D_WriteOneSect(PFDO_DEVICE_EXTENSION fdoExt, WORD count, BYTE *buf) { DWORD retry; SSFDCTYPE_T aa = (SSFDCTYPE_T ) &Ssfdc; ADDRESS_T bb = (ADDRESS_T) &Media; if (!Write_D_PhyOneSect(fdoExt, count, buf)) return(SMSUCCESS); if (ErrCode==ERR_HwError) return(ERROR); for(retry=1; retry<2; retry++) { if (Reassign_D_BlockHead(fdoExt)) { if (ErrCode==ERR_HwError) return(ERROR); continue; } if (!Write_D_PhyOneSect(fdoExt, count, buf)) return(SMSUCCESS); if (ErrCode==ERR_HwError) return(ERROR); } if (Release_D_WriteBlock(fdoExt)) return(ERROR); ErrCode = ERR_WriteFault; MediaChange = ERROR; return(ERROR); } //SmartMedia Data Copy Subroutine with Retry //----- Media_D_CopyBlockHead() ---------------------------------------- int Media_D_CopyBlockHead(PFDO_DEVICE_EXTENSION fdoExt) { DWORD retry; for(retry=0; retry<2; retry++) { if (!Copy_D_BlockHead(fdoExt)) return(SMSUCCESS); if (ErrCode==ERR_HwError) return(ERROR); } MediaChange = ERROR; return(ERROR); } //----- Media_D_CopyBlockTail() ---------------------------------------- int Media_D_CopyBlockTail(PFDO_DEVICE_EXTENSION fdoExt) { DWORD retry; if (!Copy_D_BlockTail(fdoExt)) return(SMSUCCESS); if (ErrCode==ERR_HwError) return(ERROR); for(retry=1; retry<2; retry++) { if (Reassign_D_BlockHead(fdoExt)) { if (ErrCode==ERR_HwError) return(ERROR); continue; } if (!Copy_D_BlockTail(fdoExt)) return(SMSUCCESS); if (ErrCode==ERR_HwError) return(ERROR); } if (Release_D_WriteBlock(fdoExt)) return(ERROR); ErrCode = ERR_WriteFault; MediaChange = ERROR; return(ERROR); } // ////----- Media_D_EraseOneBlock() ---------------------------------------- //int Media_D_EraseOneBlock(void) //{ // WORD LogBlock = Media.LogBlock; // WORD PhyBlock = Media.PhyBlock; // SSFDCTYPE_T aa = (SSFDCTYPE_T ) &Ssfdc; // ADDRESS_T bb = (ADDRESS_T) &Media; // // if (Media.PhyBlock==NO_ASSIGN) // return(SMSUCCESS); // // if (Log2Phy[Media.Zone]==NULL) // { // if (Make_D_LogTable()) // { // ErrCode = ERR_IllegalFmt; // return(ERROR); // } // } // Media.LogBlock = LogBlock; // Media.PhyBlock = PhyBlock; // // Log2Phy[Media.Zone][Media.LogBlock]=NO_ASSIGN; // // if (Erase_D_PhyOneBlock(fdoExt)) // { // if (ErrCode==ERR_HwError) // return(ERROR); // if (MarkFail_D_PhyOneBlock()) // return(ERROR); // // ErrCode = ERR_WriteFault; // return(ERROR); // } // // Clr_D_Bit(Assign[Media.Zone],Media.PhyBlock); // Media.PhyBlock=NO_ASSIGN; // return(SMSUCCESS); //} // ////SmartMedia Erase Subroutine ////----- Media_D_EraseAllBlock() ---------------------------------------- //int Media_D_EraseAllBlock(void) //{ // WORD cis=0; // // SSFDCTYPE_T aa = (SSFDCTYPE_T ) &Ssfdc; // ADDRESS_T bb = (ADDRESS_T) &Media; // // MediaChange = ERROR; // Media.Sector = 0; // // for(Media.Zone=0; Media.Zone<Ssfdc.MaxZones; Media.Zone++) // for(Media.PhyBlock=0; Media.PhyBlock<Ssfdc.MaxBlocks; Media.PhyBlock++) { // if (Ssfdc_D_ReadRedtData(Redundant)) // { // Ssfdc_D_Reset(fdoExt); // return(ERROR); // } // // Ssfdc_D_Reset(fdoExt); // if (!Check_D_FailBlock(Redundant)) // { // if (cis) // { // if (Ssfdc_D_EraseBlock(fdoExt)) // { // ErrCode = ERR_HwError; // return(ERROR); // } // // if (Ssfdc_D_CheckStatus()) // { // if (MarkFail_D_PhyOneBlock()) // return(ERROR); // } // // continue; // } // // if (Media.PhyBlock!=CisArea.PhyBlock) // { // ErrCode = ERR_IllegalFmt; // return(ERROR); // } // // cis++; // } // // } // return(SMSUCCESS); //} */ //SmartMedia Physical Sector Data Copy Subroutine //----- Copy_D_BlockAll() ---------------------------------------------- int Copy_D_BlockAll(struct us_data *us, DWORD mode) { BYTE sect; //SSFDCTYPE_T aa = (SSFDCTYPE_T ) &Ssfdc; //ADDRESS_T bb = (ADDRESS_T) &Media; sect=Media.Sector; if (Assign_D_WriteBlock()) return(ERROR); if (mode==REQ_FAIL) SectCopyMode=REQ_FAIL; for(Media.Sector=0; Media.Sector<Ssfdc.MaxSectors; Media.Sector++) { if (Copy_D_PhyOneSect(us)) { if (ErrCode==ERR_HwError) return(ERROR); if (Release_D_WriteBlock(us)) return(ERROR); ErrCode = ERR_WriteFault; Media.PhyBlock=ReadBlock; Media.Sector=sect; return(ERROR); } } if (Release_D_ReadBlock(us)) return(ERROR); Media.PhyBlock=WriteBlock; Media.Sector=sect; return(SMSUCCESS); } /* //----- Copy_D_BlockHead() --------------------------------------------- int Copy_D_BlockHead(PFDO_DEVICE_EXTENSION fdoExt) { BYTE sect; SSFDCTYPE_T aa = (SSFDCTYPE_T ) &Ssfdc; ADDRESS_T bb = (ADDRESS_T) &Media; sect=Media.Sector; if (Assign_D_WriteBlock()) return(ERROR); for(Media.Sector=0; Media.Sector<sect; Media.Sector++) { if (Copy_D_PhyOneSect(fdoExt)) { if (ErrCode==ERR_HwError) return(ERROR); if (Release_D_WriteBlock(fdoExt)) return(ERROR); ErrCode = ERR_WriteFault; Media.PhyBlock=ReadBlock; Media.Sector=sect; return(ERROR); } } Media.PhyBlock=WriteBlock; Media.Sector=sect; return(SMSUCCESS); } //----- Copy_D_BlockTail() --------------------------------------------- int Copy_D_BlockTail(PFDO_DEVICE_EXTENSION fdoExt) { BYTE sect; SSFDCTYPE_T aa = (SSFDCTYPE_T ) &Ssfdc; ADDRESS_T bb = (ADDRESS_T) &Media; for(sect=Media.Sector; Media.Sector<Ssfdc.MaxSectors; Media.Sector++) { if (Copy_D_PhyOneSect(fdoExt)) { if (ErrCode==ERR_HwError) return(ERROR); Media.PhyBlock=WriteBlock; Media.Sector=sect; return(ERROR); } } if (Release_D_ReadBlock(fdoExt)) return(ERROR); Media.PhyBlock=WriteBlock; Media.Sector=sect; return(SMSUCCESS); } //----- Reassign_D_BlockHead() ----------------------------------------- int Reassign_D_BlockHead(PFDO_DEVICE_EXTENSION fdoExt) { DWORD mode; WORD block; BYTE sect; SSFDCTYPE_T aa = (SSFDCTYPE_T ) &Ssfdc; ADDRESS_T bb = (ADDRESS_T) &Media; mode=SectCopyMode; block=ReadBlock; sect=Media.Sector; if (Assign_D_WriteBlock()) return(ERROR); SectCopyMode=REQ_FAIL; for(Media.Sector=0; Media.Sector<sect; Media.Sector++) { if (Copy_D_PhyOneSect(fdoExt)) { if (ErrCode==ERR_HwError) return(ERROR); if (Release_D_WriteBlock(fdoExt)) return(ERROR); ErrCode = ERR_WriteFault; SectCopyMode=mode; WriteBlock=ReadBlock; ReadBlock=block; Media.Sector=sect; Media.PhyBlock=WriteBlock; return(ERROR); } } if (Release_D_ReadBlock(fdoExt)) return(ERROR); SectCopyMode=mode; ReadBlock=block; Media.Sector=sect; Media.PhyBlock=WriteBlock; return(SMSUCCESS); } */ //SmartMedia Physical Block Assign/Release Subroutine //----- Assign_D_WriteBlock() ------------------------------------------ int Assign_D_WriteBlock(void) { //SSFDCTYPE_T aa = (SSFDCTYPE_T ) &Ssfdc; //ADDRESS_T bb = (ADDRESS_T) &Media; ReadBlock=Media.PhyBlock; for(WriteBlock=AssignStart[Media.Zone]; WriteBlock<Ssfdc.MaxBlocks; WriteBlock++) { if (!Chk_D_Bit(Assign[Media.Zone],WriteBlock)) { Set_D_Bit(Assign[Media.Zone],WriteBlock); AssignStart[Media.Zone]=WriteBlock+1; Media.PhyBlock=WriteBlock; SectCopyMode=REQ_ERASE; //ErrXDCode = NO_ERROR; return(SMSUCCESS); } } for(WriteBlock=0; WriteBlock<AssignStart[Media.Zone]; WriteBlock++) { if (!Chk_D_Bit(Assign[Media.Zone],WriteBlock)) { Set_D_Bit(Assign[Media.Zone],WriteBlock); AssignStart[Media.Zone]=WriteBlock+1; Media.PhyBlock=WriteBlock; SectCopyMode=REQ_ERASE; //ErrXDCode = NO_ERROR; return(SMSUCCESS); } } WriteBlock=NO_ASSIGN; ErrCode = ERR_WriteFault; // For xD test //Ssfdc.Attribute |= WP; //ErrXDCode = ERR_WrtProtect; return(ERROR); } //----- Release_D_ReadBlock() ------------------------------------------ int Release_D_ReadBlock(struct us_data *us) { DWORD mode; //SSFDCTYPE_T aa = (SSFDCTYPE_T ) &Ssfdc; //ADDRESS_T bb = (ADDRESS_T) &Media; mode=SectCopyMode; SectCopyMode=COMPLETED; if (mode==COMPLETED) return(SMSUCCESS); Log2Phy[Media.Zone][Media.LogBlock]=WriteBlock; Media.PhyBlock=ReadBlock; if (Media.PhyBlock==NO_ASSIGN) { Media.PhyBlock=WriteBlock; return(SMSUCCESS); } if (mode==REQ_ERASE) { if (Erase_D_PhyOneBlock(us)) { if (ErrCode==ERR_HwError) return(ERROR); if (MarkFail_D_PhyOneBlock(us)) return(ERROR); } else Clr_D_Bit(Assign[Media.Zone],Media.PhyBlock); } else if (MarkFail_D_PhyOneBlock(us)) return(ERROR); Media.PhyBlock=WriteBlock; return(SMSUCCESS); } //----- Release_D_WriteBlock() ----------------------------------------- int Release_D_WriteBlock(struct us_data *us) { //SSFDCTYPE_T aa = (SSFDCTYPE_T ) &Ssfdc; //ADDRESS_T bb = (ADDRESS_T) &Media; SectCopyMode=COMPLETED; Media.PhyBlock=WriteBlock; if (MarkFail_D_PhyOneBlock(us)) return(ERROR); Media.PhyBlock=ReadBlock; return(SMSUCCESS); } //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); } //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); } /* //----- Write_D_PhyOneSect() ------------------------------------------- int Write_D_PhyOneSect(PFDO_DEVICE_EXTENSION fdoExt, WORD count, BYTE *buf) { SSFDCTYPE_T aa = (SSFDCTYPE_T ) &Ssfdc; ADDRESS_T bb = (ADDRESS_T) &Media; //if (Ssfdc_D_WriteSect(fdoExt,buf,Redundant)) if (Ssfdc_D_WriteBlock(fdoExt,count,buf,Redundant)) { ErrCode = ERR_HwError; MediaChange=ERROR; return(ERROR); } if (Ssfdc_D_CheckStatus()) { ErrCode = ERR_WriteFault; return(ERROR); } return(SMSUCCESS); } */ //----- Erase_D_PhyOneBlock() ------------------------------------------ int Erase_D_PhyOneBlock(struct us_data *us) { //SSFDCTYPE_T aa = (SSFDCTYPE_T ) &Ssfdc; //ADDRESS_T bb = (ADDRESS_T) &Media; if (Ssfdc_D_EraseBlock(us)) { ErrCode = ERR_HwError; MediaChange=ERROR; return(ERROR); } if (Ssfdc_D_CheckStatus()) { ErrCode = ERR_WriteFault; return(ERROR); } return(SMSUCCESS); } //SmartMedia Physical Format Check Local Subroutine //----- Set_D_PhyFmtValue() -------------------------------------------- int Set_D_PhyFmtValue(struct us_data *us) { // PPDO_DEVICE_EXTENSION pdoExt; // BYTE idcode[4]; // DWORD UserDefData_1, UserDefData_2, Data, mask; // // //if (!fdoExt->ChildDeviceObject) return(ERROR); // //pdoExt = fdoExt->ChildDeviceObject->DeviceExtension; // // Ssfdc_D_ReadID(idcode, READ_ID_1); // //if (Set_D_SsfdcModel(idcode[1])) if (Set_D_SsfdcModel(us->SM_DeviceID)) return(ERROR); // //Use Multi-function pin to differentiate SM and xD. // UserDefData_1 = ReadPCIReg(fdoExt->BusID, fdoExt->DevID, fdoExt->FuncID, PCI_REG_USER_DEF) & 0x80; // if (UserDefData_1) // { // if ( READ_PORT_BYTE(SM_REG_INT_STATUS) & 0x80 ) fdoExt->DiskType = DISKTYPE_XD; // if ( READ_PORT_BYTE(SM_REG_INT_STATUS) & 0x40 ) fdoExt->DiskType = DISKTYPE_SM; // // if ( IsXDCompliance && (fdoExt->DiskType == DISKTYPE_XD) ) // { // Ssfdc_D_ReadID(idcode, READ_ID_3); // if (idcode[2] != 0xB5) // return(ERROR); // } // } // // //Use GPIO to differentiate SM and xD. // UserDefData_2 = ReadPCIReg(fdoExt->BusID, fdoExt->DevID, fdoExt->FuncID, PCI_REG_USER_DEF) >> 8; // if ( UserDefData_2 ) // { // Data = ReadPCIReg(fdoExt->BusID, fdoExt->DevID, 0, 0xAC); // // mask = 1 << (UserDefData_2-1); // // 1 : xD , 0 : SM // if ( Data & mask) // fdoExt->DiskType = DISKTYPE_XD; // else // fdoExt->DiskType = DISKTYPE_SM; // // if ( IsXDCompliance && (fdoExt->DiskType == DISKTYPE_XD) ) // { // Ssfdc_D_ReadID(idcode, READ_ID_3); // if (idcode[2] != 0xB5) // return(ERROR); // } // } // // if ( !(UserDefData_1 | UserDefData_2) ) // { // // Use UserDefine Register to differentiate SM and xD. // Ssfdc_D_ReadID(idcode, READ_ID_3); // // if (idcode[2] == 0xB5) // fdoExt->DiskType = DISKTYPE_XD; // else // { // if (!IsXDCompliance) // fdoExt->DiskType = DISKTYPE_SM; // else // return(ERROR); // } // // if (fdoExt->UserDef_DiskType == 0x04) fdoExt->DiskType = DISKTYPE_XD; // if (fdoExt->UserDef_DiskType == 0x08) fdoExt->DiskType = DISKTYPE_SM; // } // // if (!fdoExt->UserDef_DisableWP) // { // if (fdoExt->DiskType == DISKTYPE_SM) // { // if (Check_D_SsfdcWP()) // Ssfdc.Attribute|=WP; // } // } 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); } //----- 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); } //----- 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); } /* // ////----- SM_Init() ---------------------------------------------------- //void SM_Init(void) //{ // _Hw_D_ClrIntCardChg(); // _Hw_D_SetIntMask(); // // For DMA Interrupt // _Hw_D_ClrDMAIntCardChg(); // _Hw_D_SetDMAIntMask(); //} // ////----- Media_D_EraseAllRedtData() ----------------------------------- //int Media_D_EraseAllRedtData(DWORD Index, BOOLEAN CheckBlock) //{ // BYTE i; // // if (Check_D_MediaPower()) // return(ErrCode); // // if (Check_D_MediaWP()) // return(ErrCode); // // for (i=0; i<REDTSIZE; i++) // WorkRedund[i] = 0xFF; // // Media.Zone = (BYTE)Index; // for (Media.PhyBlock=0; Media.PhyBlock<Ssfdc.MaxBlocks; Media.PhyBlock++) // { // if ((!Media.Zone) && (Media.PhyBlock<=CisArea.PhyBlock)) // continue; // // if (Ssfdc_D_EraseBlock(fdoExt)) // { // ErrCode = ERR_HwError; // return(ERROR); // } // // for(Media.Sector=0; Media.Sector<Ssfdc.MaxSectors; Media.Sector++) // { // Ssfdc_D_WriteRedtMode(); // // if (Ssfdc_D_WriteRedtData(WorkRedund)) // { // Ssfdc_D_Reset(fdoExt); // ErrCode = ERR_HwError; // MediaChange = ERROR; // return(ERROR); // } // NO Status Check // } // // Ssfdc_D_Reset(fdoExt); // } // // Ssfdc_D_Reset(fdoExt); // // return(SMSUCCESS); //} // ////----- Media_D_GetMediaInfo() --------------------------------------- //DWORD Media_D_GetMediaInfo(PFDO_DEVICE_EXTENSION fdoExt, PIOCTL_MEDIA_INFO_IN pParamIn, PIOCTL_MEDIA_INFO_OUT pParamOut) //{ // pParamOut->ErrCode = STATUS_CMD_FAIL; // // Init_D_SmartMedia(); // // if (Check_D_MediaPower()) // return (ErrCode==ERR_NoSmartMedia) ? STATUS_CMD_NO_MEDIA : STATUS_CMD_FAIL; // // if (Set_D_PhyFmtValue(fdoExt)) // return STATUS_CMD_FAIL; // // //usleep(56*1024); // if (Search_D_CIS(fdoExt)) // return STATUS_CMD_FAIL; // // if (Check_D_MediaWP()) // return STATUS_CMD_MEDIA_WP; // // pParamOut->PageSize = Ssfdc.MaxSectors; // pParamOut->BlockSize = Ssfdc.MaxBlocks; // pParamOut->ZoneSize = Ssfdc.MaxZones; // // return STATUS_CMD_SUCCESS; //}*/