// 6250 CMD 5 //----- Ssfdc_D_EraseBlock() ------------------------------------------- int Ssfdc_D_EraseBlock(struct us_data *us) { struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf; int result; WORD addr; result = ENE_LoadBinCode(us, SM_RW_PATTERN); if (result != USB_STOR_XFER_GOOD) { printk("Load SM RW Code Fail !!\n"); return USB_STOR_TRANSPORT_ERROR; } addr=(WORD)Media.Zone*Ssfdc.MaxBlocks+Media.PhyBlock; addr=addr*(WORD)Ssfdc.MaxSectors; 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] = 0xF2; bcb->CDB[1] = 0x06; bcb->CDB[7] = (BYTE)addr; bcb->CDB[6] = (BYTE)(addr/0x0100); bcb->CDB[5] = Media.Zone/2; result = ENE_SendScsiCmd(us, FDIR_READ, NULL, 0); if (result != USB_STOR_XFER_GOOD) return USB_STOR_TRANSPORT_ERROR; return USB_STOR_TRANSPORT_GOOD; }
//----- MS_ReaderEraseBlock() ---------------------------------------- int MS_ReaderEraseBlock(struct us_data *us, DWORD PhyBlockAddr) { struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf; int result; DWORD bn = PhyBlockAddr; //printk("MS --- MS_ReaderEraseBlock, PhyBlockAddr = %x\n", PhyBlockAddr); result = ENE_LoadBinCode(us, MS_RW_PATTERN); if (result != USB_STOR_XFER_GOOD) return USB_STOR_TRANSPORT_ERROR; memset(bcb, 0, sizeof(bcb)); bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); bcb->DataTransferLength = 0x200; bcb->Flags = 0x80; bcb->CDB[0] = 0xF2; bcb->CDB[1] = 0x06; bcb->CDB[4] = (BYTE)(bn); bcb->CDB[3] = (BYTE)(bn>>8); bcb->CDB[2] = (BYTE)(bn>>16); result = ENE_SendScsiCmd(us, FDIR_READ, NULL, 0); if (result != USB_STOR_XFER_GOOD) return USB_STOR_TRANSPORT_ERROR; return USB_STOR_TRANSPORT_GOOD; }
//----- MS_LibOverwriteExtra() --------------------------------------- int MS_LibOverwriteExtra(struct us_data *us, DWORD PhyBlockAddr, BYTE PageNum, BYTE OverwriteFlag) { struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf; int result; //printk("MS --- MS_LibOverwriteExtra, 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; memset(bcb, 0, sizeof(bcb)); bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); bcb->DataTransferLength = 0x4; bcb->Flags = 0x80; bcb->CDB[0] = 0xF2; bcb->CDB[1] = 0x05; 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] = OverwriteFlag; bcb->CDB[7] = 0xFF; bcb->CDB[8] = 0xFF; bcb->CDB[9] = 0xFF; result = ENE_SendScsiCmd(us, FDIR_READ, NULL, 0); if (result != USB_STOR_XFER_GOOD) return USB_STOR_TRANSPORT_ERROR; return USB_STOR_TRANSPORT_GOOD; }
//----- MS_ReaderCopyBlock() ------------------------------------------ int MS_ReaderCopyBlock(struct us_data *us, WORD oldphy, WORD newphy, WORD PhyBlockAddr, BYTE PageNum, PBYTE buf, WORD len) { struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf; int result; //printk("MS_ReaderCopyBlock --- 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; memset(bcb, 0, sizeof(bcb)); bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); bcb->DataTransferLength = 0x200*len; bcb->Flags = 0x00; bcb->CDB[0] = 0xF0; bcb->CDB[1] = 0x08; bcb->CDB[4] = (BYTE)(oldphy); bcb->CDB[3] = (BYTE)(oldphy>>8); bcb->CDB[2] = (BYTE)(oldphy>>16); bcb->CDB[7] = (BYTE)(newphy); bcb->CDB[6] = (BYTE)(newphy>>8); bcb->CDB[5] = (BYTE)(newphy>>16); bcb->CDB[9] = (BYTE)(PhyBlockAddr); bcb->CDB[8] = (BYTE)(PhyBlockAddr>>8); bcb->CDB[10] = PageNum; result = ENE_SendScsiCmd(us, FDIR_WRITE, buf, 0); if (result != USB_STOR_XFER_GOOD) return USB_STOR_TRANSPORT_ERROR; return USB_STOR_TRANSPORT_GOOD; }
int Ssfdc_D_WriteSectForCopy(struct us_data *us, BYTE *buf, BYTE *redundant) { struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf; int result; WORD addr; result = ENE_LoadBinCode(us, SM_RW_PATTERN); if (result != USB_STOR_XFER_GOOD) { printk("Load SM RW Code Fail !!\n"); return USB_STOR_TRANSPORT_ERROR; } addr = (WORD)Media.Zone*Ssfdc.MaxBlocks + Media.PhyBlock; addr = addr*(WORD)Ssfdc.MaxSectors + Media.Sector; /* */ memset(bcb, 0, sizeof(struct bulk_cb_wrap)); bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); bcb->DataTransferLength = 0x200; bcb->Flags = 0x00; bcb->CDB[0] = 0xF0; bcb->CDB[1] = 0x04; bcb->CDB[7] = (BYTE)addr; bcb->CDB[6] = (BYTE)(addr / 0x0100); bcb->CDB[5] = Media.Zone / 2; bcb->CDB[8] = *(redundant + REDT_ADDR1H); bcb->CDB[9] = *(redundant + REDT_ADDR1L); result = ENE_SendScsiCmd(us, FDIR_WRITE, buf, 0); if (result != USB_STOR_XFER_GOOD) return USB_STOR_TRANSPORT_ERROR; 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; }
//----- Ssfdc_D_CopyBlock() -------------------------------------------- int Ssfdc_D_CopyBlock(struct us_data *us, WORD count, BYTE *buf,BYTE *redundant) { struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf; int result; //PBULK_CBW pBulkCbw = fdoExt->pBulkCbw; //NTSTATUS ntStatus; WORD ReadAddr, WriteAddr; //printk("Ssfdc_D_WriteSect --- ZONE = %x, ReadBlock = %x, WriteBlock = %x\n", Media.Zone, ReadBlock, WriteBlock); result = ENE_LoadBinCode(us, SM_RW_PATTERN); if (result != USB_STOR_XFER_GOOD) { printk("Load SM RW Code Fail !!\n"); return USB_STOR_TRANSPORT_ERROR; } ReadAddr = (WORD)Media.Zone*Ssfdc.MaxBlocks+ReadBlock; ReadAddr = ReadAddr*(WORD)Ssfdc.MaxSectors; WriteAddr = (WORD)Media.Zone*Ssfdc.MaxBlocks+WriteBlock; WriteAddr = WriteAddr*(WORD)Ssfdc.MaxSectors; // Write sect data memset(bcb, 0, sizeof(struct bulk_cb_wrap)); bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); bcb->DataTransferLength = 0x200*count; bcb->Flags = 0x00; bcb->CDB[0] = 0xF0; bcb->CDB[1] = 0x08; bcb->CDB[7] = (BYTE)WriteAddr; bcb->CDB[6] = (BYTE)(WriteAddr/0x0100); bcb->CDB[5] = Media.Zone/2; bcb->CDB[8] = *(redundant+REDT_ADDR1H); bcb->CDB[9] = *(redundant+REDT_ADDR1L); bcb->CDB[10] = Media.Sector; if (ReadBlock != NO_ASSIGN) { bcb->CDB[4] = (BYTE)ReadAddr; bcb->CDB[3] = (BYTE)(ReadAddr/0x0100); bcb->CDB[2] = Media.Zone/2; } else bcb->CDB[11] = 1; result = ENE_SendScsiCmd(us, FDIR_WRITE, buf, 0); if (result != USB_STOR_XFER_GOOD) return USB_STOR_TRANSPORT_ERROR; return USB_STOR_TRANSPORT_GOOD; }
//----- Ssfdc_D_ReadBlock() --------------------------------------------- int Ssfdc_D_ReadBlock(struct us_data *us, WORD count, BYTE *buf,BYTE *redundant) { struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf; int result; WORD addr; //printk("Ssfdc_D_ReadBlock\n"); result = ENE_LoadBinCode(us, SM_RW_PATTERN); if (result != USB_STOR_XFER_GOOD) { printk("Load SM RW Code Fail !!\n"); return USB_STOR_TRANSPORT_ERROR; } addr = (WORD)Media.Zone*Ssfdc.MaxBlocks+Media.PhyBlock; addr = addr*(WORD)Ssfdc.MaxSectors+Media.Sector; // Read sect data memset(bcb, 0, sizeof(struct bulk_cb_wrap)); bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); bcb->DataTransferLength = 0x200*count; bcb->Flags = 0x80; bcb->CDB[0] = 0xF1; bcb->CDB[1] = 0x02; bcb->CDB[4] = (BYTE)addr; bcb->CDB[3] = (BYTE)(addr/0x0100); bcb->CDB[2] = Media.Zone/2; result = ENE_SendScsiCmd(us, FDIR_READ, buf, 0); if (result != USB_STOR_XFER_GOOD) return USB_STOR_TRANSPORT_ERROR; // Read redundant memset(bcb, 0, sizeof(struct bulk_cb_wrap)); bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); bcb->DataTransferLength = 0x10; bcb->Flags = 0x80; bcb->CDB[0] = 0xF1; bcb->CDB[1] = 0x03; bcb->CDB[4] = (BYTE)addr; bcb->CDB[3] = (BYTE)(addr/0x0100); bcb->CDB[2] = Media.Zone/2; bcb->CDB[8] = 0; bcb->CDB[9] = 1; result = ENE_SendScsiCmd(us, FDIR_READ, redundant, 0); if (result != USB_STOR_XFER_GOOD) return USB_STOR_TRANSPORT_ERROR; return USB_STOR_TRANSPORT_GOOD; }
/* * ENE_MSInit(): */ int ENE_MSInit(struct us_data *us) { struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf; int result; BYTE buf[0x200]; WORD MSP_BlockSize, MSP_UserAreaBlocks; printk(KERN_INFO "transport --- ENE_MSInit\n"); result = ENE_LoadBinCode(us, MS_INIT_PATTERN); if (result != USB_STOR_XFER_GOOD) { printk(KERN_ERR "Load MS Init Code Fail !!\n"); return USB_STOR_TRANSPORT_ERROR; } 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] = 0x01; result = ENE_SendScsiCmd(us, FDIR_READ, &buf, 0); if (result != USB_STOR_XFER_GOOD) { printk(KERN_ERR "Execution MS Init Code Fail !!\n"); return USB_STOR_TRANSPORT_ERROR; } us->MS_Status = *(PMS_STATUS)&buf[0]; if (us->MS_Status.Insert && us->MS_Status.Ready) { printk(KERN_INFO "Insert = %x\n", us->MS_Status.Insert); printk(KERN_INFO "Ready = %x\n", us->MS_Status.Ready); printk(KERN_INFO "IsMSPro = %x\n", us->MS_Status.IsMSPro); printk(KERN_INFO "IsMSPHG = %x\n", us->MS_Status.IsMSPHG); printk(KERN_INFO "WtP = %x\n", us->MS_Status.WtP); if (us->MS_Status.IsMSPro) { MSP_BlockSize = (buf[6] << 8) | buf[7]; MSP_UserAreaBlocks = (buf[10] << 8) | buf[11]; us->MSP_TotalBlock = MSP_BlockSize * MSP_UserAreaBlocks; } else { MS_CardInit(us); } printk(KERN_INFO "MS Init Code OK !!\n"); } else { printk(KERN_INFO "MS Card Not Ready --- %x\n", buf[0]); return USB_STOR_TRANSPORT_ERROR; } return USB_STOR_TRANSPORT_GOOD; }
/* *ENE_SMInit() */ int ENE_SMInit(struct us_data *us) { struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf; int result; BYTE buf[0x200]; printk(KERN_INFO "transport --- ENE_SMInit\n"); result = ENE_LoadBinCode(us, SM_INIT_PATTERN); if (result != USB_STOR_XFER_GOOD) { printk(KERN_INFO "Load SM Init Code Fail !!\n"); return USB_STOR_TRANSPORT_ERROR; } 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] = 0x01; result = ENE_SendScsiCmd(us, FDIR_READ, &buf, 0); if (result != USB_STOR_XFER_GOOD) { printk(KERN_ERR "Execution SM Init Code Fail !! result = %x\n", result); return USB_STOR_TRANSPORT_ERROR; } us->SM_Status = *(PSM_STATUS)&buf[0]; us->SM_DeviceID = buf[1]; us->SM_CardID = buf[2]; if (us->SM_Status.Insert && us->SM_Status.Ready) { printk(KERN_INFO "Insert = %x\n", us->SM_Status.Insert); printk(KERN_INFO "Ready = %x\n", us->SM_Status.Ready); printk(KERN_INFO "WtP = %x\n", us->SM_Status.WtP); printk(KERN_INFO "DeviceID = %x\n", us->SM_DeviceID); printk(KERN_INFO "CardID = %x\n", us->SM_CardID); MediaChange = 1; Check_D_MediaFmt(us); } else { printk(KERN_ERR "SM Card Not Ready --- %x\n", buf[0]); return USB_STOR_TRANSPORT_ERROR; } return USB_STOR_TRANSPORT_GOOD; }
// 6250 CMD 4 //----- Ssfdc_D_WriteRedtData() ---------------------------------------- int Ssfdc_D_WriteRedtData(struct us_data *us, BYTE *redundant) { struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf; int result; //PBULK_CBW pBulkCbw = fdoExt->pBulkCbw; //NTSTATUS ntStatus; WORD addr; result = ENE_LoadBinCode(us, SM_RW_PATTERN); if (result != USB_STOR_XFER_GOOD) { printk("Load SM RW Code Fail !!\n"); return USB_STOR_TRANSPORT_ERROR; } addr = (WORD)Media.Zone*Ssfdc.MaxBlocks+Media.PhyBlock; addr = addr*(WORD)Ssfdc.MaxSectors+Media.Sector; memset(bcb, 0, sizeof(struct bulk_cb_wrap)); bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); bcb->DataTransferLength = 0x10; bcb->Flags = 0x80; bcb->CDB[0] = 0xF2; bcb->CDB[1] = 0x05; bcb->CDB[7] = (BYTE)addr; bcb->CDB[6] = (BYTE)(addr/0x0100); bcb->CDB[5] = Media.Zone/2; bcb->CDB[8] = *(redundant+REDT_ADDR1H); bcb->CDB[9] = *(redundant+REDT_ADDR1L); result = ENE_SendScsiCmd(us, FDIR_READ, NULL, 0); if (result != USB_STOR_XFER_GOOD) return USB_STOR_TRANSPORT_ERROR; return USB_STOR_TRANSPORT_GOOD; }