Exemplo n.º 1
0
//----- 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;
}
Exemplo n.º 2
0
/*
 * 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;
}
Exemplo n.º 3
0
//----- 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;
}