//----- MS_LibReadExtra() -------------------------------------------- int MS_LibReadExtra(struct us_data *us, DWORD PhyBlock, BYTE PageNum, MS_LibTypeExtdat *ExtraDat) { struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf; int result; BYTE ExtBuf[4]; //printk("MS_LibReadExtra --- PhyBlock = %x, PageNum = %x\n", PhyBlock, PageNum); memset(bcb, 0, sizeof(bcb)); bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); bcb->DataTransferLength = 0x4; bcb->Flags = 0x80; bcb->CDB[0] = 0xF1; bcb->CDB[1] = 0x03; bcb->CDB[5] = (BYTE)(PageNum); bcb->CDB[4] = (BYTE)(PhyBlock); bcb->CDB[3] = (BYTE)(PhyBlock>>8); bcb->CDB[2] = (BYTE)(PhyBlock>>16); bcb->CDB[6] = 0x01; result = ENE_SendScsiCmd(us, FDIR_READ, &ExtBuf, 0); if (result != USB_STOR_XFER_GOOD) return USB_STOR_TRANSPORT_ERROR; ExtraDat->reserved = 0; ExtraDat->intr = 0x80; // Not yet, waiting for fireware support ExtraDat->status0 = 0x10; // Not yet, waiting for fireware support ExtraDat->status1 = 0x00; // Not yet, waiting for fireware support ExtraDat->ovrflg = ExtBuf[0]; ExtraDat->mngflg = ExtBuf[1]; ExtraDat->logadr = MemStickLogAddr(ExtBuf[2], ExtBuf[3]); return USB_STOR_TRANSPORT_GOOD; }
/* * MS_ReaderReadPage() */ int MS_ReaderReadPage(struct us_data *us, DWORD PhyBlockAddr, BYTE PageNum, PDWORD PageBuf, MS_LibTypeExtdat *ExtraDat) { struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf; int result; BYTE ExtBuf[4]; DWORD bn = PhyBlockAddr * 0x20 + PageNum; /* printk(KERN_INFO "MS --- MS_ReaderReadPage, PhyBlockAddr = %x, PageNum = %x\n", PhyBlockAddr, PageNum); */ result = ENE_LoadBinCode(us, MS_RW_PATTERN); if (result != USB_STOR_XFER_GOOD) return USB_STOR_TRANSPORT_ERROR; /* Read Page Data */ memset(bcb, 0, sizeof(struct bulk_cb_wrap)); bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); bcb->DataTransferLength = 0x200; bcb->Flags = 0x80; bcb->CDB[0] = 0xF1; bcb->CDB[1] = 0x02; bcb->CDB[5] = (BYTE)(bn); bcb->CDB[4] = (BYTE)(bn>>8); bcb->CDB[3] = (BYTE)(bn>>16); bcb->CDB[2] = (BYTE)(bn>>24); result = ENE_SendScsiCmd(us, FDIR_READ, PageBuf, 0); if (result != USB_STOR_XFER_GOOD) return USB_STOR_TRANSPORT_ERROR; /* Read Extra Data */ memset(bcb, 0, sizeof(struct bulk_cb_wrap)); bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); bcb->DataTransferLength = 0x4; bcb->Flags = 0x80; bcb->CDB[0] = 0xF1; bcb->CDB[1] = 0x03; bcb->CDB[5] = (BYTE)(PageNum); bcb->CDB[4] = (BYTE)(PhyBlockAddr); bcb->CDB[3] = (BYTE)(PhyBlockAddr>>8); bcb->CDB[2] = (BYTE)(PhyBlockAddr>>16); bcb->CDB[6] = 0x01; result = ENE_SendScsiCmd(us, FDIR_READ, &ExtBuf, 0); if (result != USB_STOR_XFER_GOOD) return USB_STOR_TRANSPORT_ERROR; ExtraDat->reserved = 0; ExtraDat->intr = 0x80; /* Not yet,fireware support */ ExtraDat->status0 = 0x10; /* Not yet,fireware support */ ExtraDat->status1 = 0x00; /* Not yet,fireware support */ ExtraDat->ovrflg = ExtBuf[0]; ExtraDat->mngflg = ExtBuf[1]; ExtraDat->logadr = MemStickLogAddr(ExtBuf[2], ExtBuf[3]); return USB_STOR_TRANSPORT_GOOD; }
//----- MS_LibScanLogicalBlockNumber() ------------------------------- int MS_LibScanLogicalBlockNumber(struct us_data *us, WORD btBlk1st) { WORD PhyBlock, newblk, i; WORD LogStart, LogEnde; MS_LibTypeExtdat extdat; BYTE buf[0x200]; DWORD count=0, index=0; for (PhyBlock = 0; PhyBlock < us->MS_Lib.NumberOfPhyBlock;) { MS_LibPhy2LogRange(PhyBlock, &LogStart, &LogEnde); for (i=0; i<MS_PHYSICAL_BLOCKS_PER_SEGMENT; i++, PhyBlock++) { switch (MS_LibConv2Logical(us, PhyBlock)) { case MS_STATUS_ERROR: continue; default: break; } if (count == PhyBlock) { MS_LibReadExtraBlock(us, PhyBlock, 0, 0x80, &buf); count += 0x80; } index = (PhyBlock % 0x80) * 4; extdat.ovrflg = buf[index]; extdat.mngflg = buf[index+1]; extdat.logadr = MemStickLogAddr(buf[index+2], buf[index+3]); if ((extdat.ovrflg & MS_REG_OVR_BKST) != MS_REG_OVR_BKST_OK) { MS_LibSetAcquiredErrorBlock(us, PhyBlock); continue; } if ((extdat.mngflg & MS_REG_MNG_ATFLG) == MS_REG_MNG_ATFLG_ATTBL) { MS_LibErasePhyBlock(us, PhyBlock); continue; } if (extdat.logadr != MS_LB_NOT_USED) { if ((extdat.logadr < LogStart) || (LogEnde <= extdat.logadr)) { MS_LibErasePhyBlock(us, PhyBlock); continue; } if ((newblk = MS_LibConv2Physical(us, extdat.logadr)) != MS_LB_NOT_USED) { if (extdat.logadr==0) { MS_LibSetLogicalPair(us, extdat.logadr, PhyBlock); if ( MS_LibCheckDisableBlock(us, btBlk1st) ) { MS_LibSetLogicalPair(us, extdat.logadr, newblk); continue; } } MS_LibReadExtra(us, newblk, 0, &extdat); if ((extdat.ovrflg & MS_REG_OVR_UDST) == MS_REG_OVR_UDST_UPDATING) { MS_LibErasePhyBlock(us, PhyBlock); continue; } else MS_LibErasePhyBlock(us, newblk); } MS_LibSetLogicalPair(us, extdat.logadr, PhyBlock); } } } //End for ... return MS_STATUS_SUCCESS; }