Linux Audio

Check our new training course

Linux debugging, profiling, tracing and performance analysis training

Apr 14-17, 2025
Register
Loading...
v6.13.7
   1// SPDX-License-Identifier: GPL-2.0+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
   2#include <linux/jiffies.h>
   3#include <linux/errno.h>
   4#include <linux/module.h>
   5#include <linux/slab.h>
   6
   7#include <scsi/scsi.h>
   8#include <scsi/scsi_cmnd.h>
   9
  10#include <linux/firmware.h>
  11
  12#include "usb.h"
  13#include "transport.h"
  14#include "protocol.h"
  15#include "debug.h"
  16#include "scsiglue.h"
  17
  18#define SD_INIT1_FIRMWARE "ene-ub6250/sd_init1.bin"
  19#define SD_INIT2_FIRMWARE "ene-ub6250/sd_init2.bin"
  20#define SD_RW_FIRMWARE "ene-ub6250/sd_rdwr.bin"
  21#define MS_INIT_FIRMWARE "ene-ub6250/ms_init.bin"
  22#define MSP_RW_FIRMWARE "ene-ub6250/msp_rdwr.bin"
  23#define MS_RW_FIRMWARE "ene-ub6250/ms_rdwr.bin"
  24
  25#define DRV_NAME "ums_eneub6250"
  26
  27MODULE_DESCRIPTION("Driver for ENE UB6250 reader");
  28MODULE_LICENSE("GPL");
  29MODULE_IMPORT_NS("USB_STORAGE");
  30MODULE_FIRMWARE(SD_INIT1_FIRMWARE);
  31MODULE_FIRMWARE(SD_INIT2_FIRMWARE);
  32MODULE_FIRMWARE(SD_RW_FIRMWARE);
  33MODULE_FIRMWARE(MS_INIT_FIRMWARE);
  34MODULE_FIRMWARE(MSP_RW_FIRMWARE);
  35MODULE_FIRMWARE(MS_RW_FIRMWARE);
  36
  37/*
  38 * The table of devices
  39 */
  40#define UNUSUAL_DEV(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax, \
  41		    vendorName, productName, useProtocol, useTransport, \
  42		    initFunction, flags) \
  43{ USB_DEVICE_VER(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax), \
  44	.driver_info = (flags)}
  45
  46static const struct usb_device_id ene_ub6250_usb_ids[] = {
  47#	include "unusual_ene_ub6250.h"
  48	{ }		/* Terminating entry */
  49};
  50MODULE_DEVICE_TABLE(usb, ene_ub6250_usb_ids);
  51
  52#undef UNUSUAL_DEV
  53
  54/*
  55 * The flags table
  56 */
  57#define UNUSUAL_DEV(idVendor, idProduct, bcdDeviceMin, bcdDeviceMax, \
  58		    vendor_name, product_name, use_protocol, use_transport, \
  59		    init_function, Flags) \
  60{ \
  61	.vendorName = vendor_name,	\
  62	.productName = product_name,	\
  63	.useProtocol = use_protocol,	\
  64	.useTransport = use_transport,	\
  65	.initFunction = init_function,	\
  66}
  67
  68static const struct us_unusual_dev ene_ub6250_unusual_dev_list[] = {
  69#	include "unusual_ene_ub6250.h"
  70	{ }		/* Terminating entry */
  71};
  72
  73#undef UNUSUAL_DEV
  74
  75
  76
  77/* ENE bin code len */
  78#define ENE_BIN_CODE_LEN    0x800
  79/* EnE HW Register */
  80#define REG_CARD_STATUS     0xFF83
  81#define REG_HW_TRAP1        0xFF89
  82
  83/* SRB Status */
  84#define SS_SUCCESS		0x000000	/* No Sense */
  85#define SS_NOT_READY		0x023A00	/* Medium not present */
  86#define SS_MEDIUM_ERR		0x031100	/* Unrecovered read error */
  87#define SS_HW_ERR		0x040800	/* Communication failure */
  88#define SS_ILLEGAL_REQUEST	0x052000	/* Invalid command */
  89#define SS_UNIT_ATTENTION	0x062900	/* Reset occurred */
  90
  91/* ENE Load FW Pattern */
  92#define SD_INIT1_PATTERN   1
  93#define SD_INIT2_PATTERN   2
  94#define SD_RW_PATTERN      3
  95#define MS_INIT_PATTERN    4
  96#define MSP_RW_PATTERN     5
  97#define MS_RW_PATTERN      6
  98#define SM_INIT_PATTERN    7
  99#define SM_RW_PATTERN      8
 100
 101#define FDIR_WRITE         0
 102#define FDIR_READ          1
 103
 104/* For MS Card */
 105
 106/* Status Register 1 */
 107#define MS_REG_ST1_MB           0x80    /* media busy */
 108#define MS_REG_ST1_FB1          0x40    /* flush busy 1 */
 109#define MS_REG_ST1_DTER         0x20    /* error on data(corrected) */
 110#define MS_REG_ST1_UCDT         0x10    /* unable to correct data */
 111#define MS_REG_ST1_EXER         0x08    /* error on extra(corrected) */
 112#define MS_REG_ST1_UCEX         0x04    /* unable to correct extra */
 113#define MS_REG_ST1_FGER         0x02    /* error on overwrite flag(corrected) */
 114#define MS_REG_ST1_UCFG         0x01    /* unable to correct overwrite flag */
 115#define MS_REG_ST1_DEFAULT	(MS_REG_ST1_MB | MS_REG_ST1_FB1 | MS_REG_ST1_DTER | MS_REG_ST1_UCDT | MS_REG_ST1_EXER | MS_REG_ST1_UCEX | MS_REG_ST1_FGER | MS_REG_ST1_UCFG)
 116
 117/* Overwrite Area */
 118#define MS_REG_OVR_BKST		0x80            /* block status */
 119#define MS_REG_OVR_BKST_OK	MS_REG_OVR_BKST     /* OK */
 120#define MS_REG_OVR_BKST_NG	0x00            /* NG */
 121#define MS_REG_OVR_PGST0	0x40            /* page status */
 122#define MS_REG_OVR_PGST1	0x20
 123#define MS_REG_OVR_PGST_MASK	(MS_REG_OVR_PGST0 | MS_REG_OVR_PGST1)
 124#define MS_REG_OVR_PGST_OK	(MS_REG_OVR_PGST0 | MS_REG_OVR_PGST1) /* OK */
 125#define MS_REG_OVR_PGST_NG	MS_REG_OVR_PGST1                      /* NG */
 126#define MS_REG_OVR_PGST_DATA_ERROR	0x00        /* data error */
 127#define MS_REG_OVR_UDST			0x10        /* update status */
 128#define MS_REG_OVR_UDST_UPDATING	0x00        /* updating */
 129#define MS_REG_OVR_UDST_NO_UPDATE	MS_REG_OVR_UDST
 130#define MS_REG_OVR_RESERVED	0x08
 131#define MS_REG_OVR_DEFAULT	(MS_REG_OVR_BKST_OK | MS_REG_OVR_PGST_OK | MS_REG_OVR_UDST_NO_UPDATE | MS_REG_OVR_RESERVED)
 132
 133/* Management Flag */
 134#define MS_REG_MNG_SCMS0	0x20    /* serial copy management system */
 135#define MS_REG_MNG_SCMS1	0x10
 136#define MS_REG_MNG_SCMS_MASK		(MS_REG_MNG_SCMS0 | MS_REG_MNG_SCMS1)
 137#define MS_REG_MNG_SCMS_COPY_OK		(MS_REG_MNG_SCMS0 | MS_REG_MNG_SCMS1)
 138#define MS_REG_MNG_SCMS_ONE_COPY	MS_REG_MNG_SCMS1
 139#define MS_REG_MNG_SCMS_NO_COPY	0x00
 140#define MS_REG_MNG_ATFLG	0x08    /* address transfer table flag */
 141#define MS_REG_MNG_ATFLG_OTHER	MS_REG_MNG_ATFLG    /* other */
 142#define MS_REG_MNG_ATFLG_ATTBL	0x00	/* address transfer table */
 143#define MS_REG_MNG_SYSFLG	0x04	/* system flag */
 144#define MS_REG_MNG_SYSFLG_USER	MS_REG_MNG_SYSFLG   /* user block */
 145#define MS_REG_MNG_SYSFLG_BOOT	0x00	/* system block */
 146#define MS_REG_MNG_RESERVED	0xc3
 147#define MS_REG_MNG_DEFAULT	(MS_REG_MNG_SCMS_COPY_OK | MS_REG_MNG_ATFLG_OTHER | MS_REG_MNG_SYSFLG_USER | MS_REG_MNG_RESERVED)
 148
 149
 150#define MS_MAX_PAGES_PER_BLOCK		32
 151#define MS_MAX_INITIAL_ERROR_BLOCKS 	10
 152#define MS_LIB_BITS_PER_BYTE		8
 153
 154#define MS_SYSINF_FORMAT_FAT		1
 155#define MS_SYSINF_USAGE_GENERAL		0
 156
 157#define MS_SYSINF_MSCLASS_TYPE_1	1
 158#define MS_SYSINF_PAGE_SIZE		MS_BYTES_PER_PAGE /* fixed */
 159
 160#define MS_SYSINF_CARDTYPE_RDONLY	1
 161#define MS_SYSINF_CARDTYPE_RDWR		2
 162#define MS_SYSINF_CARDTYPE_HYBRID	3
 163#define MS_SYSINF_SECURITY		0x01
 164#define MS_SYSINF_SECURITY_NO_SUPPORT	MS_SYSINF_SECURITY
 165#define MS_SYSINF_SECURITY_SUPPORT	0
 166
 167#define MS_SYSINF_RESERVED1		1
 168#define MS_SYSINF_RESERVED2		1
 169
 170#define MS_SYSENT_TYPE_INVALID_BLOCK	0x01
 171#define MS_SYSENT_TYPE_CIS_IDI		0x0a    /* CIS/IDI */
 172
 173#define SIZE_OF_KIRO		1024
 174#define BYTE_MASK		0xff
 175
 176/* ms error code */
 177#define MS_STATUS_WRITE_PROTECT	0x0106
 178#define MS_STATUS_SUCCESS	0x0000
 179#define MS_ERROR_FLASH_READ	0x8003
 180#define MS_ERROR_FLASH_ERASE	0x8005
 181#define MS_LB_ERROR		0xfff0
 182#define MS_LB_BOOT_BLOCK	0xfff1
 183#define MS_LB_INITIAL_ERROR	0xfff2
 184#define MS_STATUS_SUCCESS_WITH_ECC 0xfff3
 185#define MS_LB_ACQUIRED_ERROR	0xfff4
 186#define MS_LB_NOT_USED_ERASED	0xfff5
 187#define MS_NOCARD_ERROR		0xfff8
 188#define MS_NO_MEMORY_ERROR	0xfff9
 189#define MS_STATUS_INT_ERROR	0xfffa
 190#define MS_STATUS_ERROR		0xfffe
 191#define MS_LB_NOT_USED		0xffff
 192
 193#define MS_REG_MNG_SYSFLG	0x04    /* system flag */
 194#define MS_REG_MNG_SYSFLG_USER	MS_REG_MNG_SYSFLG   /* user block */
 195
 196#define MS_BOOT_BLOCK_ID                        0x0001
 197#define MS_BOOT_BLOCK_FORMAT_VERSION            0x0100
 198#define MS_BOOT_BLOCK_DATA_ENTRIES              2
 199
 200#define MS_NUMBER_OF_SYSTEM_ENTRY       	4
 201#define MS_NUMBER_OF_BOOT_BLOCK			2
 202#define MS_BYTES_PER_PAGE			512
 203#define MS_LOGICAL_BLOCKS_PER_SEGMENT		496
 204#define MS_LOGICAL_BLOCKS_IN_1ST_SEGMENT        494
 205
 206#define MS_PHYSICAL_BLOCKS_PER_SEGMENT		0x200 /* 512 */
 207#define MS_PHYSICAL_BLOCKS_PER_SEGMENT_MASK     0x1ff
 208
 209/* overwrite area */
 210#define MS_REG_OVR_BKST		0x80		/* block status */
 211#define MS_REG_OVR_BKST_OK	MS_REG_OVR_BKST	/* OK */
 212#define MS_REG_OVR_BKST_NG	0x00            /* NG */
 213
 214/* Status Register 1 */
 215#define MS_REG_ST1_DTER		0x20	/* error on data(corrected) */
 216#define MS_REG_ST1_EXER		0x08	/* error on extra(corrected) */
 217#define MS_REG_ST1_FGER		0x02	/* error on overwrite flag(corrected) */
 218
 219/* MemoryStick Register */
 220/* Status Register 0 */
 221#define MS_REG_ST0_WP		0x01	/* write protected */
 222#define MS_REG_ST0_WP_ON	MS_REG_ST0_WP
 223
 224#define MS_LIB_CTRL_RDONLY      0
 225#define MS_LIB_CTRL_WRPROTECT   1
 226
 227/*dphy->log table */
 228#define ms_libconv_to_logical(pdx, PhyBlock) (((PhyBlock) >= (pdx)->MS_Lib.NumberOfPhyBlock) ? MS_STATUS_ERROR : (pdx)->MS_Lib.Phy2LogMap[PhyBlock])
 229#define ms_libconv_to_physical(pdx, LogBlock) (((LogBlock) >= (pdx)->MS_Lib.NumberOfLogBlock) ? MS_STATUS_ERROR : (pdx)->MS_Lib.Log2PhyMap[LogBlock])
 230
 231#define ms_lib_ctrl_set(pdx, Flag)	((pdx)->MS_Lib.flags |= (1 << (Flag)))
 232#define ms_lib_ctrl_reset(pdx, Flag)	((pdx)->MS_Lib.flags &= ~(1 << (Flag)))
 233#define ms_lib_ctrl_check(pdx, Flag)	((pdx)->MS_Lib.flags & (1 << (Flag)))
 234
 235#define ms_lib_iswritable(pdx) ((ms_lib_ctrl_check((pdx), MS_LIB_CTRL_RDONLY) == 0) && (ms_lib_ctrl_check(pdx, MS_LIB_CTRL_WRPROTECT) == 0))
 236#define ms_lib_clear_pagemap(pdx) memset((pdx)->MS_Lib.pagemap, 0, sizeof((pdx)->MS_Lib.pagemap))
 237#define memstick_logaddr(logadr1, logadr0) ((((u16)(logadr1)) << 8) | (logadr0))
 238
 239
 240/* SD_STATUS bits */
 241#define SD_Insert	BIT(0)
 242#define SD_Ready	BIT(1)
 243#define SD_MediaChange	BIT(2)
 244#define SD_IsMMC	BIT(3)
 245#define SD_HiCapacity	BIT(4)
 246#define SD_HiSpeed	BIT(5)
 247#define SD_WtP		BIT(6)
 248			/* Bit 7 reserved */
 249
 250/* MS_STATUS bits */
 251#define MS_Insert	BIT(0)
 252#define MS_Ready	BIT(1)
 253#define MS_MediaChange	BIT(2)
 254#define MS_IsMSPro	BIT(3)
 255#define MS_IsMSPHG	BIT(4)
 256			/* Bit 5 reserved */
 257#define MS_WtP		BIT(6)
 258			/* Bit 7 reserved */
 259
 260/* SM_STATUS bits */
 261#define SM_Insert	BIT(0)
 262#define SM_Ready	BIT(1)
 263#define SM_MediaChange	BIT(2)
 264			/* Bits 3-5 reserved */
 265#define SM_WtP		BIT(6)
 266#define SM_IsMS		BIT(7)
 
 
 
 267
 268struct ms_bootblock_cis {
 269	u8 bCistplDEVICE[6];    /* 0 */
 270	u8 bCistplDEVICE0C[6];  /* 6 */
 271	u8 bCistplJEDECC[4];    /* 12 */
 272	u8 bCistplMANFID[6];    /* 16 */
 273	u8 bCistplVER1[32];     /* 22 */
 274	u8 bCistplFUNCID[4];    /* 54 */
 275	u8 bCistplFUNCE0[4];    /* 58 */
 276	u8 bCistplFUNCE1[5];    /* 62 */
 277	u8 bCistplCONF[7];      /* 67 */
 278	u8 bCistplCFTBLENT0[10];/* 74 */
 279	u8 bCistplCFTBLENT1[8]; /* 84 */
 280	u8 bCistplCFTBLENT2[12];/* 92 */
 281	u8 bCistplCFTBLENT3[8]; /* 104 */
 282	u8 bCistplCFTBLENT4[17];/* 112 */
 283	u8 bCistplCFTBLENT5[8]; /* 129 */
 284	u8 bCistplCFTBLENT6[17];/* 137 */
 285	u8 bCistplCFTBLENT7[8]; /* 154 */
 286	u8 bCistplNOLINK[3];    /* 162 */
 287} ;
 288
 289struct ms_bootblock_idi {
 290#define MS_IDI_GENERAL_CONF 0x848A
 291	u16 wIDIgeneralConfiguration;	/* 0 */
 292	u16 wIDInumberOfCylinder;	/* 1 */
 293	u16 wIDIreserved0;		/* 2 */
 294	u16 wIDInumberOfHead;		/* 3 */
 295	u16 wIDIbytesPerTrack;		/* 4 */
 296	u16 wIDIbytesPerSector;		/* 5 */
 297	u16 wIDIsectorsPerTrack;	/* 6 */
 298	u16 wIDItotalSectors[2];	/* 7-8  high,low */
 299	u16 wIDIreserved1[11];		/* 9-19 */
 300	u16 wIDIbufferType;		/* 20 */
 301	u16 wIDIbufferSize;		/* 21 */
 302	u16 wIDIlongCmdECC;		/* 22 */
 303	u16 wIDIfirmVersion[4];		/* 23-26 */
 304	u16 wIDImodelName[20];		/* 27-46 */
 305	u16 wIDIreserved2;		/* 47 */
 306	u16 wIDIlongWordSupported;	/* 48 */
 307	u16 wIDIdmaSupported;		/* 49 */
 308	u16 wIDIreserved3;		/* 50 */
 309	u16 wIDIpioTiming;		/* 51 */
 310	u16 wIDIdmaTiming;		/* 52 */
 311	u16 wIDItransferParameter;	/* 53 */
 312	u16 wIDIformattedCylinder;	/* 54 */
 313	u16 wIDIformattedHead;		/* 55 */
 314	u16 wIDIformattedSectorsPerTrack;/* 56 */
 315	u16 wIDIformattedTotalSectors[2];/* 57-58 */
 316	u16 wIDImultiSector;		/* 59 */
 317	u16 wIDIlbaSectors[2];		/* 60-61 */
 318	u16 wIDIsingleWordDMA;		/* 62 */
 319	u16 wIDImultiWordDMA;		/* 63 */
 320	u16 wIDIreserved4[192];		/* 64-255 */
 321};
 322
 323struct ms_bootblock_sysent_rec {
 324	u32 dwStart;
 325	u32 dwSize;
 326	u8 bType;
 327	u8 bReserved[3];
 328};
 329
 330struct ms_bootblock_sysent {
 331	struct ms_bootblock_sysent_rec entry[MS_NUMBER_OF_SYSTEM_ENTRY];
 332};
 333
 334struct ms_bootblock_sysinf {
 335	u8 bMsClass;			/* must be 1 */
 336	u8 bCardType;			/* see below */
 337	u16 wBlockSize;			/* n KB */
 338	u16 wBlockNumber;		/* number of physical block */
 339	u16 wTotalBlockNumber;		/* number of logical block */
 340	u16 wPageSize;			/* must be 0x200 */
 341	u8 bExtraSize;			/* 0x10 */
 342	u8 bSecuritySupport;
 343	u8 bAssemblyDate[8];
 344	u8 bFactoryArea[4];
 345	u8 bAssemblyMakerCode;
 346	u8 bAssemblyMachineCode[3];
 347	u16 wMemoryMakerCode;
 348	u16 wMemoryDeviceCode;
 349	u16 wMemorySize;
 350	u8 bReserved1;
 351	u8 bReserved2;
 352	u8 bVCC;
 353	u8 bVPP;
 354	u16 wControllerChipNumber;
 355	u16 wControllerFunction;	/* New MS */
 356	u8 bReserved3[9];		/* New MS */
 357	u8 bParallelSupport;		/* New MS */
 358	u16 wFormatValue;		/* New MS */
 359	u8 bFormatType;
 360	u8 bUsage;
 361	u8 bDeviceType;
 362	u8 bReserved4[22];
 363	u8 bFUValue3;
 364	u8 bFUValue4;
 365	u8 bReserved5[15];
 366};
 367
 368struct ms_bootblock_header {
 369	u16 wBlockID;
 370	u16 wFormatVersion;
 371	u8 bReserved1[184];
 372	u8 bNumberOfDataEntry;
 373	u8 bReserved2[179];
 374};
 375
 376struct ms_bootblock_page0 {
 377	struct ms_bootblock_header header;
 378	struct ms_bootblock_sysent sysent;
 379	struct ms_bootblock_sysinf sysinf;
 380};
 381
 382struct ms_bootblock_cis_idi {
 383	union {
 384		struct ms_bootblock_cis cis;
 385		u8 dmy[256];
 386	} cis;
 387
 388	union {
 389		struct ms_bootblock_idi idi;
 390		u8 dmy[256];
 391	} idi;
 392
 393};
 394
 395/* ENE MS Lib struct */
 396struct ms_lib_type_extdat {
 397	u8 reserved;
 398	u8 intr;
 399	u8 status0;
 400	u8 status1;
 401	u8 ovrflg;
 402	u8 mngflg;
 403	u16 logadr;
 404};
 405
 406struct ms_lib_ctrl {
 407	u32 flags;
 408	u32 BytesPerSector;
 409	u32 NumberOfCylinder;
 410	u32 SectorsPerCylinder;
 411	u16 cardType;			/* R/W, RO, Hybrid */
 412	u16 blockSize;
 413	u16 PagesPerBlock;
 414	u16 NumberOfPhyBlock;
 415	u16 NumberOfLogBlock;
 416	u16 NumberOfSegment;
 417	u16 *Phy2LogMap;		/* phy2log table */
 418	u16 *Log2PhyMap;		/* log2phy table */
 419	u16 wrtblk;
 420	unsigned char *pagemap[(MS_MAX_PAGES_PER_BLOCK + (MS_LIB_BITS_PER_BYTE-1)) / MS_LIB_BITS_PER_BYTE];
 421	unsigned char *blkpag;
 422	struct ms_lib_type_extdat *blkext;
 423	unsigned char copybuf[512];
 424};
 425
 426
 427/* SD Block Length */
 428/* 2^9 = 512 Bytes, The HW maximum read/write data length */
 429#define SD_BLOCK_LEN  9
 430
 431struct ene_ub6250_info {
 432
 433	/* I/O bounce buffer */
 434	u8		*bbuf;
 435
 436	/* for 6250 code */
 437	u8		SD_Status;
 438	u8		MS_Status;
 439	u8		SM_Status;
 440
 441	/* ----- SD Control Data ---------------- */
 442	/*SD_REGISTER SD_Regs; */
 443	u16		SD_Block_Mult;
 444	u8		SD_READ_BL_LEN;
 445	u16		SD_C_SIZE;
 446	u8		SD_C_SIZE_MULT;
 447
 448	/* SD/MMC New spec. */
 449	u8		SD_SPEC_VER;
 450	u8		SD_CSD_VER;
 451	u8		SD20_HIGH_CAPACITY;
 452	u32		HC_C_SIZE;
 453	u8		MMC_SPEC_VER;
 454	u8		MMC_BusWidth;
 455	u8		MMC_HIGH_CAPACITY;
 456
 457	/*----- MS Control Data ---------------- */
 458	bool		MS_SWWP;
 459	u32		MSP_TotalBlock;
 460	struct ms_lib_ctrl MS_Lib;
 461	bool		MS_IsRWPage;
 462	u16		MS_Model;
 463
 464	/*----- SM Control Data ---------------- */
 465	u8		SM_DeviceID;
 466	u8		SM_CardID;
 467
 468	unsigned char	*testbuf;
 469	u8		BIN_FLAG;
 470	u32		bl_num;
 471	int		SrbStatus;
 472
 473	/*------Power Managerment ---------------*/
 474	bool		Power_IsResum;
 475};
 476
 477static int ene_sd_init(struct us_data *us);
 478static int ene_ms_init(struct us_data *us);
 479static int ene_load_bincode(struct us_data *us, unsigned char flag);
 480
 481static void ene_ub6250_info_destructor(void *extra)
 482{
 483	struct ene_ub6250_info *info = (struct ene_ub6250_info *) extra;
 484
 485	if (!extra)
 486		return;
 487	kfree(info->bbuf);
 488}
 489
 490static int ene_send_scsi_cmd(struct us_data *us, u8 fDir, void *buf, int use_sg)
 491{
 492	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
 493	struct bulk_cs_wrap *bcs = (struct bulk_cs_wrap *) us->iobuf;
 494
 495	int result;
 496	unsigned int residue;
 497	unsigned int cswlen = 0, partial = 0;
 498	unsigned int transfer_length = bcb->DataTransferLength;
 499
 500	/* usb_stor_dbg(us, "transport --- ene_send_scsi_cmd\n"); */
 501	/* send cmd to out endpoint */
 502	result = usb_stor_bulk_transfer_buf(us, us->send_bulk_pipe,
 503					    bcb, US_BULK_CB_WRAP_LEN, NULL);
 504	if (result != USB_STOR_XFER_GOOD) {
 505		usb_stor_dbg(us, "send cmd to out endpoint fail ---\n");
 506		return USB_STOR_TRANSPORT_ERROR;
 507	}
 508
 509	if (buf) {
 510		unsigned int pipe = fDir;
 511
 512		if (fDir  == FDIR_READ)
 513			pipe = us->recv_bulk_pipe;
 514		else
 515			pipe = us->send_bulk_pipe;
 516
 517		/* Bulk */
 518		if (use_sg) {
 519			result = usb_stor_bulk_srb(us, pipe, us->srb);
 520		} else {
 521			result = usb_stor_bulk_transfer_sg(us, pipe, buf,
 522						transfer_length, 0, &partial);
 523		}
 524		if (result != USB_STOR_XFER_GOOD) {
 525			usb_stor_dbg(us, "data transfer fail ---\n");
 526			return USB_STOR_TRANSPORT_ERROR;
 527		}
 528	}
 529
 530	/* Get CSW for device status */
 531	result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe, bcs,
 532					    US_BULK_CS_WRAP_LEN, &cswlen);
 533
 534	if (result == USB_STOR_XFER_SHORT && cswlen == 0) {
 535		usb_stor_dbg(us, "Received 0-length CSW; retrying...\n");
 536		result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe,
 537					    bcs, US_BULK_CS_WRAP_LEN, &cswlen);
 538	}
 539
 540	if (result == USB_STOR_XFER_STALLED) {
 541		/* get the status again */
 542		usb_stor_dbg(us, "Attempting to get CSW (2nd try)...\n");
 543		result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe,
 544						bcs, US_BULK_CS_WRAP_LEN, NULL);
 545	}
 546
 547	if (result != USB_STOR_XFER_GOOD)
 548		return USB_STOR_TRANSPORT_ERROR;
 549
 550	/* check bulk status */
 551	residue = le32_to_cpu(bcs->Residue);
 552
 553	/*
 554	 * try to compute the actual residue, based on how much data
 555	 * was really transferred and what the device tells us
 556	 */
 557	if (residue && !(us->fflags & US_FL_IGNORE_RESIDUE)) {
 558		residue = min(residue, transfer_length);
 559		if (us->srb != NULL)
 560			scsi_set_resid(us->srb, max(scsi_get_resid(us->srb),
 561								residue));
 562	}
 563
 564	if (bcs->Status != US_BULK_STAT_OK)
 565		return USB_STOR_TRANSPORT_ERROR;
 566
 567	return USB_STOR_TRANSPORT_GOOD;
 568}
 569
 570static int do_scsi_request_sense(struct us_data *us, struct scsi_cmnd *srb)
 571{
 572	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
 573	unsigned char buf[18];
 574
 575	memset(buf, 0, 18);
 576	buf[0] = 0x70;				/* Current error */
 577	buf[2] = info->SrbStatus >> 16;		/* Sense key */
 578	buf[7] = 10;				/* Additional length */
 579	buf[12] = info->SrbStatus >> 8;		/* ASC */
 580	buf[13] = info->SrbStatus;		/* ASCQ */
 581
 582	usb_stor_set_xfer_buf(buf, sizeof(buf), srb);
 583	return USB_STOR_TRANSPORT_GOOD;
 584}
 585
 586static int do_scsi_inquiry(struct us_data *us, struct scsi_cmnd *srb)
 587{
 588	unsigned char data_ptr[36] = {
 589		0x00, 0x00, 0x02, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x55,
 590		0x53, 0x42, 0x32, 0x2E, 0x30, 0x20, 0x20, 0x43, 0x61,
 591		0x72, 0x64, 0x52, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20,
 592		0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x31, 0x30, 0x30 };
 593
 594	usb_stor_set_xfer_buf(data_ptr, 36, srb);
 595	return USB_STOR_TRANSPORT_GOOD;
 596}
 597
 598static int sd_scsi_test_unit_ready(struct us_data *us, struct scsi_cmnd *srb)
 599{
 600	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
 601
 602	if ((info->SD_Status & SD_Insert) && (info->SD_Status & SD_Ready))
 603		return USB_STOR_TRANSPORT_GOOD;
 604	else {
 605		ene_sd_init(us);
 606		return USB_STOR_TRANSPORT_GOOD;
 607	}
 608
 609	return USB_STOR_TRANSPORT_GOOD;
 610}
 611
 612static int sd_scsi_mode_sense(struct us_data *us, struct scsi_cmnd *srb)
 613{
 614	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
 615	unsigned char mediaNoWP[12] = {
 616		0x0b, 0x00, 0x00, 0x08, 0x00, 0x00,
 617		0x71, 0xc0, 0x00, 0x00, 0x02, 0x00 };
 618	unsigned char mediaWP[12]   = {
 619		0x0b, 0x00, 0x80, 0x08, 0x00, 0x00,
 620		0x71, 0xc0, 0x00, 0x00, 0x02, 0x00 };
 621
 622	if (info->SD_Status & SD_WtP)
 623		usb_stor_set_xfer_buf(mediaWP, 12, srb);
 624	else
 625		usb_stor_set_xfer_buf(mediaNoWP, 12, srb);
 626
 627
 628	return USB_STOR_TRANSPORT_GOOD;
 629}
 630
 631static int sd_scsi_read_capacity(struct us_data *us, struct scsi_cmnd *srb)
 632{
 633	u32	bl_num;
 634	u32	bl_len;
 635	unsigned int offset = 0;
 636	unsigned char    buf[8];
 637	struct scatterlist *sg = NULL;
 638	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
 639
 640	usb_stor_dbg(us, "sd_scsi_read_capacity\n");
 641	if (info->SD_Status & SD_HiCapacity) {
 642		bl_len = 0x200;
 643		if (info->SD_Status & SD_IsMMC)
 644			bl_num = info->HC_C_SIZE-1;
 645		else
 646			bl_num = (info->HC_C_SIZE + 1) * 1024 - 1;
 647	} else {
 648		bl_len = 1 << (info->SD_READ_BL_LEN);
 649		bl_num = info->SD_Block_Mult * (info->SD_C_SIZE + 1)
 650				* (1 << (info->SD_C_SIZE_MULT + 2)) - 1;
 651	}
 652	info->bl_num = bl_num;
 653	usb_stor_dbg(us, "bl_len = %x\n", bl_len);
 654	usb_stor_dbg(us, "bl_num = %x\n", bl_num);
 655
 656	/*srb->request_bufflen = 8; */
 657	buf[0] = (bl_num >> 24) & 0xff;
 658	buf[1] = (bl_num >> 16) & 0xff;
 659	buf[2] = (bl_num >> 8) & 0xff;
 660	buf[3] = (bl_num >> 0) & 0xff;
 661	buf[4] = (bl_len >> 24) & 0xff;
 662	buf[5] = (bl_len >> 16) & 0xff;
 663	buf[6] = (bl_len >> 8) & 0xff;
 664	buf[7] = (bl_len >> 0) & 0xff;
 665
 666	usb_stor_access_xfer_buf(buf, 8, srb, &sg, &offset, TO_XFER_BUF);
 667
 668	return USB_STOR_TRANSPORT_GOOD;
 669}
 670
 671static int sd_scsi_read(struct us_data *us, struct scsi_cmnd *srb)
 672{
 673	int result;
 674	unsigned char *cdb = srb->cmnd;
 675	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
 676	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
 677
 678	u32 bn = ((cdb[2] << 24) & 0xff000000) | ((cdb[3] << 16) & 0x00ff0000) |
 679		 ((cdb[4] << 8) & 0x0000ff00) | ((cdb[5] << 0) & 0x000000ff);
 680	u16 blen = ((cdb[7] << 8) & 0xff00) | ((cdb[8] << 0) & 0x00ff);
 681	u32 bnByte = bn * 0x200;
 682	u32 blenByte = blen * 0x200;
 683
 684	if (bn > info->bl_num)
 685		return USB_STOR_TRANSPORT_ERROR;
 686
 687	result = ene_load_bincode(us, SD_RW_PATTERN);
 688	if (result != USB_STOR_XFER_GOOD) {
 689		usb_stor_dbg(us, "Load SD RW pattern Fail !!\n");
 690		return USB_STOR_TRANSPORT_ERROR;
 691	}
 692
 693	if (info->SD_Status & SD_HiCapacity)
 694		bnByte = bn;
 695
 696	/* set up the command wrapper */
 697	memset(bcb, 0, sizeof(struct bulk_cb_wrap));
 698	bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
 699	bcb->DataTransferLength = blenByte;
 700	bcb->Flags  = US_BULK_FLAG_IN;
 701	bcb->CDB[0] = 0xF1;
 702	bcb->CDB[5] = (unsigned char)(bnByte);
 703	bcb->CDB[4] = (unsigned char)(bnByte>>8);
 704	bcb->CDB[3] = (unsigned char)(bnByte>>16);
 705	bcb->CDB[2] = (unsigned char)(bnByte>>24);
 706
 707	result = ene_send_scsi_cmd(us, FDIR_READ, scsi_sglist(srb), 1);
 708	return result;
 709}
 710
 711static int sd_scsi_write(struct us_data *us, struct scsi_cmnd *srb)
 712{
 713	int result;
 714	unsigned char *cdb = srb->cmnd;
 715	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
 716	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
 717
 718	u32 bn = ((cdb[2] << 24) & 0xff000000) | ((cdb[3] << 16) & 0x00ff0000) |
 719		 ((cdb[4] << 8) & 0x0000ff00) | ((cdb[5] << 0) & 0x000000ff);
 720	u16 blen = ((cdb[7] << 8) & 0xff00) | ((cdb[8] << 0) & 0x00ff);
 721	u32 bnByte = bn * 0x200;
 722	u32 blenByte = blen * 0x200;
 723
 724	if (bn > info->bl_num)
 725		return USB_STOR_TRANSPORT_ERROR;
 726
 727	result = ene_load_bincode(us, SD_RW_PATTERN);
 728	if (result != USB_STOR_XFER_GOOD) {
 729		usb_stor_dbg(us, "Load SD RW pattern Fail !!\n");
 730		return USB_STOR_TRANSPORT_ERROR;
 731	}
 732
 733	if (info->SD_Status & SD_HiCapacity)
 734		bnByte = bn;
 735
 736	/* set up the command wrapper */
 737	memset(bcb, 0, sizeof(struct bulk_cb_wrap));
 738	bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
 739	bcb->DataTransferLength = blenByte;
 740	bcb->Flags  = US_BULK_FLAG_OUT;
 741	bcb->CDB[0] = 0xF0;
 742	bcb->CDB[5] = (unsigned char)(bnByte);
 743	bcb->CDB[4] = (unsigned char)(bnByte>>8);
 744	bcb->CDB[3] = (unsigned char)(bnByte>>16);
 745	bcb->CDB[2] = (unsigned char)(bnByte>>24);
 746
 747	result = ene_send_scsi_cmd(us, FDIR_WRITE, scsi_sglist(srb), 1);
 748	return result;
 749}
 750
 751/*
 752 * ENE MS Card
 753 */
 754
 755static int ms_lib_set_logicalpair(struct us_data *us, u16 logblk, u16 phyblk)
 756{
 757	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
 758
 759	if ((logblk >= info->MS_Lib.NumberOfLogBlock) || (phyblk >= info->MS_Lib.NumberOfPhyBlock))
 760		return (u32)-1;
 761
 762	info->MS_Lib.Phy2LogMap[phyblk] = logblk;
 763	info->MS_Lib.Log2PhyMap[logblk] = phyblk;
 764
 765	return 0;
 766}
 767
 768static int ms_lib_set_logicalblockmark(struct us_data *us, u16 phyblk, u16 mark)
 769{
 770	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
 771
 772	if (phyblk >= info->MS_Lib.NumberOfPhyBlock)
 773		return (u32)-1;
 774
 775	info->MS_Lib.Phy2LogMap[phyblk] = mark;
 776
 777	return 0;
 778}
 779
 780static int ms_lib_set_initialerrorblock(struct us_data *us, u16 phyblk)
 781{
 782	return ms_lib_set_logicalblockmark(us, phyblk, MS_LB_INITIAL_ERROR);
 783}
 784
 785static int ms_lib_set_bootblockmark(struct us_data *us, u16 phyblk)
 786{
 787	return ms_lib_set_logicalblockmark(us, phyblk, MS_LB_BOOT_BLOCK);
 788}
 789
 790static int ms_lib_free_logicalmap(struct us_data *us)
 791{
 792	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
 793
 794	kfree(info->MS_Lib.Phy2LogMap);
 795	info->MS_Lib.Phy2LogMap = NULL;
 796
 797	kfree(info->MS_Lib.Log2PhyMap);
 798	info->MS_Lib.Log2PhyMap = NULL;
 799
 800	return 0;
 801}
 802
 803static int ms_lib_alloc_logicalmap(struct us_data *us)
 804{
 805	u32  i;
 806	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
 807
 808	info->MS_Lib.Phy2LogMap = kmalloc_array(info->MS_Lib.NumberOfPhyBlock,
 809						sizeof(u16),
 810						GFP_KERNEL);
 811	info->MS_Lib.Log2PhyMap = kmalloc_array(info->MS_Lib.NumberOfLogBlock,
 812						sizeof(u16),
 813						GFP_KERNEL);
 814
 815	if ((info->MS_Lib.Phy2LogMap == NULL) || (info->MS_Lib.Log2PhyMap == NULL)) {
 816		ms_lib_free_logicalmap(us);
 817		return (u32)-1;
 818	}
 819
 820	for (i = 0; i < info->MS_Lib.NumberOfPhyBlock; i++)
 821		info->MS_Lib.Phy2LogMap[i] = MS_LB_NOT_USED;
 822
 823	for (i = 0; i < info->MS_Lib.NumberOfLogBlock; i++)
 824		info->MS_Lib.Log2PhyMap[i] = MS_LB_NOT_USED;
 825
 826	return 0;
 827}
 828
 829static void ms_lib_clear_writebuf(struct us_data *us)
 830{
 831	int i;
 832	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
 833
 834	info->MS_Lib.wrtblk = (u16)-1;
 835	ms_lib_clear_pagemap(info);
 836
 837	if (info->MS_Lib.blkpag)
 838		memset(info->MS_Lib.blkpag, 0xff, info->MS_Lib.PagesPerBlock * info->MS_Lib.BytesPerSector);
 839
 840	if (info->MS_Lib.blkext) {
 841		for (i = 0; i < info->MS_Lib.PagesPerBlock; i++) {
 842			info->MS_Lib.blkext[i].status1 = MS_REG_ST1_DEFAULT;
 843			info->MS_Lib.blkext[i].ovrflg = MS_REG_OVR_DEFAULT;
 844			info->MS_Lib.blkext[i].mngflg = MS_REG_MNG_DEFAULT;
 845			info->MS_Lib.blkext[i].logadr = MS_LB_NOT_USED;
 846		}
 847	}
 848}
 849
 850static int ms_count_freeblock(struct us_data *us, u16 PhyBlock)
 851{
 852	u32 Ende, Count;
 853	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
 854
 855	Ende = PhyBlock + MS_PHYSICAL_BLOCKS_PER_SEGMENT;
 856	for (Count = 0; PhyBlock < Ende; PhyBlock++) {
 857		switch (info->MS_Lib.Phy2LogMap[PhyBlock]) {
 858		case MS_LB_NOT_USED:
 859		case MS_LB_NOT_USED_ERASED:
 860			Count++;
 861			break;
 862		default:
 863			break;
 864		}
 865	}
 866
 867	return Count;
 868}
 869
 870static int ms_read_readpage(struct us_data *us, u32 PhyBlockAddr,
 871		u8 PageNum, u32 *PageBuf, struct ms_lib_type_extdat *ExtraDat)
 872{
 873	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
 874	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
 875	u8 *bbuf = info->bbuf;
 876	int result;
 
 877	u32 bn = PhyBlockAddr * 0x20 + PageNum;
 878
 
 
 
 879	result = ene_load_bincode(us, MS_RW_PATTERN);
 880	if (result != USB_STOR_XFER_GOOD)
 881		return USB_STOR_TRANSPORT_ERROR;
 882
 883	/* Read Page Data */
 884	memset(bcb, 0, sizeof(struct bulk_cb_wrap));
 885	bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
 886	bcb->DataTransferLength = 0x200;
 887	bcb->Flags      = US_BULK_FLAG_IN;
 888	bcb->CDB[0]     = 0xF1;
 889
 890	bcb->CDB[1]     = 0x02; /* in init.c ENE_MSInit() is 0x01 */
 891
 892	bcb->CDB[5]     = (unsigned char)(bn);
 893	bcb->CDB[4]     = (unsigned char)(bn>>8);
 894	bcb->CDB[3]     = (unsigned char)(bn>>16);
 895	bcb->CDB[2]     = (unsigned char)(bn>>24);
 896
 897	result = ene_send_scsi_cmd(us, FDIR_READ, PageBuf, 0);
 898	if (result != USB_STOR_XFER_GOOD)
 899		return USB_STOR_TRANSPORT_ERROR;
 900
 901
 902	/* Read Extra Data */
 903	memset(bcb, 0, sizeof(struct bulk_cb_wrap));
 904	bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
 905	bcb->DataTransferLength = 0x4;
 906	bcb->Flags      = US_BULK_FLAG_IN;
 907	bcb->CDB[0]     = 0xF1;
 908	bcb->CDB[1]     = 0x03;
 909
 910	bcb->CDB[5]     = (unsigned char)(PageNum);
 911	bcb->CDB[4]     = (unsigned char)(PhyBlockAddr);
 912	bcb->CDB[3]     = (unsigned char)(PhyBlockAddr>>8);
 913	bcb->CDB[2]     = (unsigned char)(PhyBlockAddr>>16);
 914	bcb->CDB[6]     = 0x01;
 915
 916	result = ene_send_scsi_cmd(us, FDIR_READ, bbuf, 0);
 917	if (result != USB_STOR_XFER_GOOD)
 918		return USB_STOR_TRANSPORT_ERROR;
 919
 920	ExtraDat->reserved = 0;
 921	ExtraDat->intr     = 0x80;  /* Not yet,fireware support */
 922	ExtraDat->status0  = 0x10;  /* Not yet,fireware support */
 923
 924	ExtraDat->status1  = 0x00;  /* Not yet,fireware support */
 925	ExtraDat->ovrflg   = bbuf[0];
 926	ExtraDat->mngflg   = bbuf[1];
 927	ExtraDat->logadr   = memstick_logaddr(bbuf[2], bbuf[3]);
 928
 929	return USB_STOR_TRANSPORT_GOOD;
 930}
 931
 932static int ms_lib_process_bootblock(struct us_data *us, u16 PhyBlock, u8 *PageData)
 933{
 934	struct ms_bootblock_sysent *SysEntry;
 935	struct ms_bootblock_sysinf *SysInfo;
 936	u32 i, result;
 937	u8 PageNumber;
 938	u8 *PageBuffer;
 939	struct ms_lib_type_extdat ExtraData;
 940	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
 941
 942	PageBuffer = kzalloc(MS_BYTES_PER_PAGE * 2, GFP_KERNEL);
 943	if (PageBuffer == NULL)
 944		return (u32)-1;
 945
 946	result = (u32)-1;
 947
 948	SysInfo = &(((struct ms_bootblock_page0 *)PageData)->sysinf);
 949
 950	if ((SysInfo->bMsClass != MS_SYSINF_MSCLASS_TYPE_1) ||
 951		(be16_to_cpu(SysInfo->wPageSize) != MS_SYSINF_PAGE_SIZE) ||
 952		((SysInfo->bSecuritySupport & MS_SYSINF_SECURITY) == MS_SYSINF_SECURITY_SUPPORT) ||
 953		(SysInfo->bReserved1 != MS_SYSINF_RESERVED1) ||
 954		(SysInfo->bReserved2 != MS_SYSINF_RESERVED2) ||
 955		(SysInfo->bFormatType != MS_SYSINF_FORMAT_FAT) ||
 956		(SysInfo->bUsage != MS_SYSINF_USAGE_GENERAL))
 957		goto exit;
 958		/* */
 959	switch (info->MS_Lib.cardType = SysInfo->bCardType) {
 960	case MS_SYSINF_CARDTYPE_RDONLY:
 961		ms_lib_ctrl_set(info, MS_LIB_CTRL_RDONLY);
 962		break;
 963	case MS_SYSINF_CARDTYPE_RDWR:
 964		ms_lib_ctrl_reset(info, MS_LIB_CTRL_RDONLY);
 965		break;
 966	case MS_SYSINF_CARDTYPE_HYBRID:
 967	default:
 968		goto exit;
 969	}
 970
 971	info->MS_Lib.blockSize = be16_to_cpu(SysInfo->wBlockSize);
 972	info->MS_Lib.NumberOfPhyBlock = be16_to_cpu(SysInfo->wBlockNumber);
 973	info->MS_Lib.NumberOfLogBlock = be16_to_cpu(SysInfo->wTotalBlockNumber)-2;
 974	info->MS_Lib.PagesPerBlock = info->MS_Lib.blockSize * SIZE_OF_KIRO / MS_BYTES_PER_PAGE;
 975	info->MS_Lib.NumberOfSegment = info->MS_Lib.NumberOfPhyBlock / MS_PHYSICAL_BLOCKS_PER_SEGMENT;
 976	info->MS_Model = be16_to_cpu(SysInfo->wMemorySize);
 977
 978	/*Allocate to all number of logicalblock and physicalblock */
 979	if (ms_lib_alloc_logicalmap(us))
 980		goto exit;
 981
 982	/* Mark the book block */
 983	ms_lib_set_bootblockmark(us, PhyBlock);
 984
 985	SysEntry = &(((struct ms_bootblock_page0 *)PageData)->sysent);
 986
 987	for (i = 0; i < MS_NUMBER_OF_SYSTEM_ENTRY; i++) {
 988		u32  EntryOffset, EntrySize;
 989
 990		EntryOffset = be32_to_cpu(SysEntry->entry[i].dwStart);
 991
 992		if (EntryOffset == 0xffffff)
 993			continue;
 994		EntrySize = be32_to_cpu(SysEntry->entry[i].dwSize);
 995
 996		if (EntrySize == 0)
 997			continue;
 998
 999		if (EntryOffset + MS_BYTES_PER_PAGE + EntrySize > info->MS_Lib.blockSize * (u32)SIZE_OF_KIRO)
1000			continue;
1001
1002		if (i == 0) {
1003			u8 PrevPageNumber = 0;
1004			u16 phyblk;
1005
1006			if (SysEntry->entry[i].bType != MS_SYSENT_TYPE_INVALID_BLOCK)
1007				goto exit;
1008
1009			while (EntrySize > 0) {
1010
1011				PageNumber = (u8)(EntryOffset / MS_BYTES_PER_PAGE + 1);
1012				if (PageNumber != PrevPageNumber) {
1013					switch (ms_read_readpage(us, PhyBlock, PageNumber, (u32 *)PageBuffer, &ExtraData)) {
1014					case MS_STATUS_SUCCESS:
1015						break;
1016					case MS_STATUS_WRITE_PROTECT:
1017					case MS_ERROR_FLASH_READ:
1018					case MS_STATUS_ERROR:
1019					default:
1020						goto exit;
1021					}
1022
1023					PrevPageNumber = PageNumber;
1024				}
1025
1026				phyblk = be16_to_cpu(*(u16 *)(PageBuffer + (EntryOffset % MS_BYTES_PER_PAGE)));
1027				if (phyblk < 0x0fff)
1028					ms_lib_set_initialerrorblock(us, phyblk);
1029
1030				EntryOffset += 2;
1031				EntrySize -= 2;
1032			}
1033		} else if (i == 1) {  /* CIS/IDI */
1034			struct ms_bootblock_idi *idi;
1035
1036			if (SysEntry->entry[i].bType != MS_SYSENT_TYPE_CIS_IDI)
1037				goto exit;
1038
1039			switch (ms_read_readpage(us, PhyBlock, (u8)(EntryOffset / MS_BYTES_PER_PAGE + 1), (u32 *)PageBuffer, &ExtraData)) {
1040			case MS_STATUS_SUCCESS:
1041				break;
1042			case MS_STATUS_WRITE_PROTECT:
1043			case MS_ERROR_FLASH_READ:
1044			case MS_STATUS_ERROR:
1045			default:
1046				goto exit;
1047			}
1048
1049			idi = &((struct ms_bootblock_cis_idi *)(PageBuffer + (EntryOffset % MS_BYTES_PER_PAGE)))->idi.idi;
1050			if (le16_to_cpu(idi->wIDIgeneralConfiguration) != MS_IDI_GENERAL_CONF)
1051				goto exit;
1052
1053			info->MS_Lib.BytesPerSector = le16_to_cpu(idi->wIDIbytesPerSector);
1054			if (info->MS_Lib.BytesPerSector != MS_BYTES_PER_PAGE)
1055				goto exit;
1056		}
1057	} /* End for .. */
1058
1059	result = 0;
1060
1061exit:
1062	if (result)
1063		ms_lib_free_logicalmap(us);
1064
1065	kfree(PageBuffer);
1066
1067	result = 0;
1068	return result;
1069}
1070
1071static void ms_lib_free_writebuf(struct us_data *us)
1072{
1073	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1074	info->MS_Lib.wrtblk = (u16)-1; /* set to -1 */
1075
1076	/* memset((fdoExt)->MS_Lib.pagemap, 0, sizeof((fdoExt)->MS_Lib.pagemap)) */
1077
1078	ms_lib_clear_pagemap(info); /* (pdx)->MS_Lib.pagemap memset 0 in ms.h */
1079
1080	if (info->MS_Lib.blkpag) {
1081		kfree(info->MS_Lib.blkpag);  /* Arnold test ... */
1082		info->MS_Lib.blkpag = NULL;
1083	}
1084
1085	if (info->MS_Lib.blkext) {
1086		kfree(info->MS_Lib.blkext);  /* Arnold test ... */
1087		info->MS_Lib.blkext = NULL;
1088	}
1089}
1090
1091
1092static void ms_lib_free_allocatedarea(struct us_data *us)
1093{
1094	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1095
1096	ms_lib_free_writebuf(us); /* Free MS_Lib.pagemap */
1097	ms_lib_free_logicalmap(us); /* kfree MS_Lib.Phy2LogMap and MS_Lib.Log2PhyMap */
1098
1099	/* set struct us point flag to 0 */
1100	info->MS_Lib.flags = 0;
1101	info->MS_Lib.BytesPerSector = 0;
1102	info->MS_Lib.SectorsPerCylinder = 0;
1103
1104	info->MS_Lib.cardType = 0;
1105	info->MS_Lib.blockSize = 0;
1106	info->MS_Lib.PagesPerBlock = 0;
1107
1108	info->MS_Lib.NumberOfPhyBlock = 0;
1109	info->MS_Lib.NumberOfLogBlock = 0;
1110}
1111
1112
1113static int ms_lib_alloc_writebuf(struct us_data *us)
1114{
1115	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1116
1117	info->MS_Lib.wrtblk = (u16)-1;
1118
1119	info->MS_Lib.blkpag = kmalloc_array(info->MS_Lib.PagesPerBlock,
1120					    info->MS_Lib.BytesPerSector,
1121					    GFP_KERNEL);
1122	info->MS_Lib.blkext = kmalloc_array(info->MS_Lib.PagesPerBlock,
1123					    sizeof(struct ms_lib_type_extdat),
1124					    GFP_KERNEL);
1125
1126	if ((info->MS_Lib.blkpag == NULL) || (info->MS_Lib.blkext == NULL)) {
1127		ms_lib_free_writebuf(us);
1128		return (u32)-1;
1129	}
1130
1131	ms_lib_clear_writebuf(us);
1132
1133	return 0;
1134}
1135
1136static int ms_lib_force_setlogical_pair(struct us_data *us, u16 logblk, u16 phyblk)
1137{
1138	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1139
1140	if (logblk == MS_LB_NOT_USED)
1141		return 0;
1142
1143	if ((logblk >= info->MS_Lib.NumberOfLogBlock) ||
1144		(phyblk >= info->MS_Lib.NumberOfPhyBlock))
1145		return (u32)-1;
1146
1147	info->MS_Lib.Phy2LogMap[phyblk] = logblk;
1148	info->MS_Lib.Log2PhyMap[logblk] = phyblk;
1149
1150	return 0;
1151}
1152
1153static int ms_read_copyblock(struct us_data *us, u16 oldphy, u16 newphy,
1154			u16 PhyBlockAddr, u8 PageNum, unsigned char *buf, u16 len)
1155{
1156	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1157	int result;
1158
 
 
1159	result = ene_load_bincode(us, MS_RW_PATTERN);
1160	if (result != USB_STOR_XFER_GOOD)
1161		return USB_STOR_TRANSPORT_ERROR;
1162
1163	memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1164	bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1165	bcb->DataTransferLength = 0x200*len;
1166	bcb->Flags = US_BULK_FLAG_OUT;
1167	bcb->CDB[0] = 0xF0;
1168	bcb->CDB[1] = 0x08;
1169	bcb->CDB[4] = (unsigned char)(oldphy);
1170	bcb->CDB[3] = (unsigned char)(oldphy>>8);
1171	bcb->CDB[2] = 0; /* (BYTE)(oldphy>>16) */
1172	bcb->CDB[7] = (unsigned char)(newphy);
1173	bcb->CDB[6] = (unsigned char)(newphy>>8);
1174	bcb->CDB[5] = 0; /* (BYTE)(newphy>>16) */
1175	bcb->CDB[9] = (unsigned char)(PhyBlockAddr);
1176	bcb->CDB[8] = (unsigned char)(PhyBlockAddr>>8);
1177	bcb->CDB[10] = PageNum;
1178
1179	result = ene_send_scsi_cmd(us, FDIR_WRITE, buf, 0);
1180	if (result != USB_STOR_XFER_GOOD)
1181		return USB_STOR_TRANSPORT_ERROR;
1182
1183	return USB_STOR_TRANSPORT_GOOD;
1184}
1185
1186static int ms_read_eraseblock(struct us_data *us, u32 PhyBlockAddr)
1187{
1188	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1189	int result;
1190	u32 bn = PhyBlockAddr;
1191
 
 
1192	result = ene_load_bincode(us, MS_RW_PATTERN);
1193	if (result != USB_STOR_XFER_GOOD)
1194		return USB_STOR_TRANSPORT_ERROR;
1195
1196	memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1197	bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1198	bcb->DataTransferLength = 0x200;
1199	bcb->Flags = US_BULK_FLAG_IN;
1200	bcb->CDB[0] = 0xF2;
1201	bcb->CDB[1] = 0x06;
1202	bcb->CDB[4] = (unsigned char)(bn);
1203	bcb->CDB[3] = (unsigned char)(bn>>8);
1204	bcb->CDB[2] = (unsigned char)(bn>>16);
1205
1206	result = ene_send_scsi_cmd(us, FDIR_READ, NULL, 0);
1207	if (result != USB_STOR_XFER_GOOD)
1208		return USB_STOR_TRANSPORT_ERROR;
1209
1210	return USB_STOR_TRANSPORT_GOOD;
1211}
1212
1213static int ms_lib_check_disableblock(struct us_data *us, u16 PhyBlock)
1214{
1215	unsigned char *PageBuf = NULL;
1216	u16 result = MS_STATUS_SUCCESS;
1217	u16 blk, index = 0;
1218	struct ms_lib_type_extdat extdat;
1219	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1220
1221	PageBuf = kmalloc(MS_BYTES_PER_PAGE, GFP_KERNEL);
1222	if (PageBuf == NULL) {
1223		result = MS_NO_MEMORY_ERROR;
1224		goto exit;
1225	}
1226
1227	ms_read_readpage(us, PhyBlock, 1, (u32 *)PageBuf, &extdat);
1228	do {
1229		blk = be16_to_cpu(PageBuf[index]);
1230		if (blk == MS_LB_NOT_USED)
1231			break;
1232		if (blk == info->MS_Lib.Log2PhyMap[0]) {
1233			result = MS_ERROR_FLASH_READ;
1234			break;
1235		}
1236		index++;
1237	} while (1);
1238
1239exit:
1240	kfree(PageBuf);
1241	return result;
1242}
1243
1244static int ms_lib_setacquired_errorblock(struct us_data *us, u16 phyblk)
1245{
1246	u16 log;
1247	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1248
1249	if (phyblk >= info->MS_Lib.NumberOfPhyBlock)
1250		return (u32)-1;
1251
1252	log = info->MS_Lib.Phy2LogMap[phyblk];
1253
1254	if (log < info->MS_Lib.NumberOfLogBlock)
1255		info->MS_Lib.Log2PhyMap[log] = MS_LB_NOT_USED;
1256
1257	if (info->MS_Lib.Phy2LogMap[phyblk] != MS_LB_INITIAL_ERROR)
1258		info->MS_Lib.Phy2LogMap[phyblk] = MS_LB_ACQUIRED_ERROR;
1259
1260	return 0;
1261}
1262
1263static int ms_lib_overwrite_extra(struct us_data *us, u32 PhyBlockAddr,
1264				u8 PageNum, u8 OverwriteFlag)
1265{
1266	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1267	int result;
1268
 
 
1269	result = ene_load_bincode(us, MS_RW_PATTERN);
1270	if (result != USB_STOR_XFER_GOOD)
1271		return USB_STOR_TRANSPORT_ERROR;
1272
1273	memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1274	bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1275	bcb->DataTransferLength = 0x4;
1276	bcb->Flags = US_BULK_FLAG_IN;
1277	bcb->CDB[0] = 0xF2;
1278	bcb->CDB[1] = 0x05;
1279	bcb->CDB[5] = (unsigned char)(PageNum);
1280	bcb->CDB[4] = (unsigned char)(PhyBlockAddr);
1281	bcb->CDB[3] = (unsigned char)(PhyBlockAddr>>8);
1282	bcb->CDB[2] = (unsigned char)(PhyBlockAddr>>16);
1283	bcb->CDB[6] = OverwriteFlag;
1284	bcb->CDB[7] = 0xFF;
1285	bcb->CDB[8] = 0xFF;
1286	bcb->CDB[9] = 0xFF;
1287
1288	result = ene_send_scsi_cmd(us, FDIR_READ, NULL, 0);
1289	if (result != USB_STOR_XFER_GOOD)
1290		return USB_STOR_TRANSPORT_ERROR;
1291
1292	return USB_STOR_TRANSPORT_GOOD;
1293}
1294
1295static int ms_lib_error_phyblock(struct us_data *us, u16 phyblk)
1296{
1297	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1298
1299	if (phyblk >= info->MS_Lib.NumberOfPhyBlock)
1300		return MS_STATUS_ERROR;
1301
1302	ms_lib_setacquired_errorblock(us, phyblk);
1303
1304	if (ms_lib_iswritable(info))
1305		return ms_lib_overwrite_extra(us, phyblk, 0, (u8)(~MS_REG_OVR_BKST & BYTE_MASK));
1306
1307	return MS_STATUS_SUCCESS;
1308}
1309
1310static int ms_lib_erase_phyblock(struct us_data *us, u16 phyblk)
1311{
1312	u16 log;
1313	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1314
1315	if (phyblk >= info->MS_Lib.NumberOfPhyBlock)
1316		return MS_STATUS_ERROR;
1317
1318	log = info->MS_Lib.Phy2LogMap[phyblk];
1319
1320	if (log < info->MS_Lib.NumberOfLogBlock)
1321		info->MS_Lib.Log2PhyMap[log] = MS_LB_NOT_USED;
1322
1323	info->MS_Lib.Phy2LogMap[phyblk] = MS_LB_NOT_USED;
1324
1325	if (ms_lib_iswritable(info)) {
1326		switch (ms_read_eraseblock(us, phyblk)) {
1327		case MS_STATUS_SUCCESS:
1328			info->MS_Lib.Phy2LogMap[phyblk] = MS_LB_NOT_USED_ERASED;
1329			return MS_STATUS_SUCCESS;
1330		case MS_ERROR_FLASH_ERASE:
1331		case MS_STATUS_INT_ERROR:
1332			ms_lib_error_phyblock(us, phyblk);
1333			return MS_ERROR_FLASH_ERASE;
1334		case MS_STATUS_ERROR:
1335		default:
1336			ms_lib_ctrl_set(info, MS_LIB_CTRL_RDONLY); /* MS_LibCtrlSet will used by ENE_MSInit ,need check, and why us to info*/
1337			ms_lib_setacquired_errorblock(us, phyblk);
1338			return MS_STATUS_ERROR;
1339		}
1340	}
1341
1342	ms_lib_setacquired_errorblock(us, phyblk);
1343
1344	return MS_STATUS_SUCCESS;
1345}
1346
1347static int ms_lib_read_extra(struct us_data *us, u32 PhyBlock,
1348				u8 PageNum, struct ms_lib_type_extdat *ExtraDat)
1349{
1350	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1351	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1352	u8 *bbuf = info->bbuf;
1353	int result;
 
1354
 
1355	memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1356	bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1357	bcb->DataTransferLength = 0x4;
1358	bcb->Flags      = US_BULK_FLAG_IN;
1359	bcb->CDB[0]     = 0xF1;
1360	bcb->CDB[1]     = 0x03;
1361	bcb->CDB[5]     = (unsigned char)(PageNum);
1362	bcb->CDB[4]     = (unsigned char)(PhyBlock);
1363	bcb->CDB[3]     = (unsigned char)(PhyBlock>>8);
1364	bcb->CDB[2]     = (unsigned char)(PhyBlock>>16);
1365	bcb->CDB[6]     = 0x01;
1366
1367	result = ene_send_scsi_cmd(us, FDIR_READ, bbuf, 0);
1368	if (result != USB_STOR_XFER_GOOD)
1369		return USB_STOR_TRANSPORT_ERROR;
1370
1371	ExtraDat->reserved = 0;
1372	ExtraDat->intr     = 0x80;  /* Not yet, waiting for fireware support */
1373	ExtraDat->status0  = 0x10;  /* Not yet, waiting for fireware support */
1374	ExtraDat->status1  = 0x00;  /* Not yet, waiting for fireware support */
1375	ExtraDat->ovrflg   = bbuf[0];
1376	ExtraDat->mngflg   = bbuf[1];
1377	ExtraDat->logadr   = memstick_logaddr(bbuf[2], bbuf[3]);
1378
1379	return USB_STOR_TRANSPORT_GOOD;
1380}
1381
1382static int ms_libsearch_block_from_physical(struct us_data *us, u16 phyblk)
1383{
 
1384	u16 blk;
1385	struct ms_lib_type_extdat extdat; /* need check */
1386	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1387
1388
1389	if (phyblk >= info->MS_Lib.NumberOfPhyBlock)
1390		return MS_LB_ERROR;
1391
1392	for (blk = phyblk + 1; blk != phyblk; blk++) {
1393		if ((blk & MS_PHYSICAL_BLOCKS_PER_SEGMENT_MASK) == 0)
1394			blk -= MS_PHYSICAL_BLOCKS_PER_SEGMENT;
1395
 
1396		if (info->MS_Lib.Phy2LogMap[blk] == MS_LB_NOT_USED_ERASED) {
1397			return blk;
1398		} else if (info->MS_Lib.Phy2LogMap[blk] == MS_LB_NOT_USED) {
1399			switch (ms_lib_read_extra(us, blk, 0, &extdat)) {
1400			case MS_STATUS_SUCCESS:
1401			case MS_STATUS_SUCCESS_WITH_ECC:
1402				break;
1403			case MS_NOCARD_ERROR:
1404				return MS_NOCARD_ERROR;
1405			case MS_STATUS_INT_ERROR:
1406				return MS_LB_ERROR;
1407			case MS_ERROR_FLASH_READ:
1408			default:
1409				ms_lib_setacquired_errorblock(us, blk);
1410				continue;
1411			} /* End switch */
1412
1413			if ((extdat.ovrflg & MS_REG_OVR_BKST) != MS_REG_OVR_BKST_OK) {
1414				ms_lib_setacquired_errorblock(us, blk);
1415				continue;
1416			}
1417
1418			switch (ms_lib_erase_phyblock(us, blk)) {
1419			case MS_STATUS_SUCCESS:
1420				return blk;
1421			case MS_STATUS_ERROR:
1422				return MS_LB_ERROR;
1423			case MS_ERROR_FLASH_ERASE:
1424			default:
1425				ms_lib_error_phyblock(us, blk);
1426				break;
1427			}
1428		}
1429	} /* End for */
1430
1431	return MS_LB_ERROR;
1432}
1433static int ms_libsearch_block_from_logical(struct us_data *us, u16 logblk)
1434{
1435	u16 phyblk;
1436	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1437
1438	phyblk = ms_libconv_to_physical(info, logblk);
1439	if (phyblk >= MS_LB_ERROR) {
1440		if (logblk >= info->MS_Lib.NumberOfLogBlock)
1441			return MS_LB_ERROR;
1442
1443		phyblk = (logblk + MS_NUMBER_OF_BOOT_BLOCK) / MS_LOGICAL_BLOCKS_PER_SEGMENT;
1444		phyblk *= MS_PHYSICAL_BLOCKS_PER_SEGMENT;
1445		phyblk += MS_PHYSICAL_BLOCKS_PER_SEGMENT - 1;
1446	}
1447
1448	return ms_libsearch_block_from_physical(us, phyblk);
1449}
1450
1451static int ms_scsi_test_unit_ready(struct us_data *us, struct scsi_cmnd *srb)
1452{
1453	struct ene_ub6250_info *info = (struct ene_ub6250_info *)(us->extra);
1454
1455	/* pr_info("MS_SCSI_Test_Unit_Ready\n"); */
1456	if ((info->MS_Status & MS_Insert) && (info->MS_Status & MS_Ready)) {
1457		return USB_STOR_TRANSPORT_GOOD;
1458	} else {
1459		ene_ms_init(us);
1460		return USB_STOR_TRANSPORT_GOOD;
1461	}
1462
1463	return USB_STOR_TRANSPORT_GOOD;
1464}
1465
 
 
 
 
 
 
 
 
 
 
 
 
 
1466static int ms_scsi_mode_sense(struct us_data *us, struct scsi_cmnd *srb)
1467{
1468	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1469	unsigned char mediaNoWP[12] = {
1470		0x0b, 0x00, 0x00, 0x08, 0x00, 0x00,
1471		0x71, 0xc0, 0x00, 0x00, 0x02, 0x00 };
1472	unsigned char mediaWP[12]   = {
1473		0x0b, 0x00, 0x80, 0x08, 0x00, 0x00,
1474		0x71, 0xc0, 0x00, 0x00, 0x02, 0x00 };
1475
1476	if (info->MS_Status & MS_WtP)
1477		usb_stor_set_xfer_buf(mediaWP, 12, srb);
1478	else
1479		usb_stor_set_xfer_buf(mediaNoWP, 12, srb);
1480
1481	return USB_STOR_TRANSPORT_GOOD;
1482}
1483
1484static int ms_scsi_read_capacity(struct us_data *us, struct scsi_cmnd *srb)
1485{
1486	u32   bl_num;
1487	u32    bl_len;
1488	unsigned int offset = 0;
1489	unsigned char    buf[8];
1490	struct scatterlist *sg = NULL;
1491	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1492
1493	usb_stor_dbg(us, "ms_scsi_read_capacity\n");
1494	bl_len = 0x200;
1495	if (info->MS_Status & MS_IsMSPro)
1496		bl_num = info->MSP_TotalBlock - 1;
1497	else
1498		bl_num = info->MS_Lib.NumberOfLogBlock * info->MS_Lib.blockSize * 2 - 1;
1499
1500	info->bl_num = bl_num;
1501	usb_stor_dbg(us, "bl_len = %x\n", bl_len);
1502	usb_stor_dbg(us, "bl_num = %x\n", bl_num);
1503
1504	/*srb->request_bufflen = 8; */
1505	buf[0] = (bl_num >> 24) & 0xff;
1506	buf[1] = (bl_num >> 16) & 0xff;
1507	buf[2] = (bl_num >> 8) & 0xff;
1508	buf[3] = (bl_num >> 0) & 0xff;
1509	buf[4] = (bl_len >> 24) & 0xff;
1510	buf[5] = (bl_len >> 16) & 0xff;
1511	buf[6] = (bl_len >> 8) & 0xff;
1512	buf[7] = (bl_len >> 0) & 0xff;
1513
1514	usb_stor_access_xfer_buf(buf, 8, srb, &sg, &offset, TO_XFER_BUF);
1515
1516	return USB_STOR_TRANSPORT_GOOD;
1517}
1518
1519static void ms_lib_phy_to_log_range(u16 PhyBlock, u16 *LogStart, u16 *LogEnde)
1520{
1521	PhyBlock /= MS_PHYSICAL_BLOCKS_PER_SEGMENT;
1522
1523	if (PhyBlock) {
1524		*LogStart = MS_LOGICAL_BLOCKS_IN_1ST_SEGMENT + (PhyBlock - 1) * MS_LOGICAL_BLOCKS_PER_SEGMENT;/*496*/
1525		*LogEnde = *LogStart + MS_LOGICAL_BLOCKS_PER_SEGMENT;/*496*/
1526	} else {
1527		*LogStart = 0;
1528		*LogEnde = MS_LOGICAL_BLOCKS_IN_1ST_SEGMENT;/*494*/
1529	}
1530}
1531
1532static int ms_lib_read_extrablock(struct us_data *us, u32 PhyBlock,
1533	u8 PageNum, u8 blen, void *buf)
1534{
1535	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1536	int     result;
1537
 
 
 
1538	/* Read Extra Data */
1539	memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1540	bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1541	bcb->DataTransferLength = 0x4 * blen;
1542	bcb->Flags      = US_BULK_FLAG_IN;
1543	bcb->CDB[0]     = 0xF1;
1544	bcb->CDB[1]     = 0x03;
1545	bcb->CDB[5]     = (unsigned char)(PageNum);
1546	bcb->CDB[4]     = (unsigned char)(PhyBlock);
1547	bcb->CDB[3]     = (unsigned char)(PhyBlock>>8);
1548	bcb->CDB[2]     = (unsigned char)(PhyBlock>>16);
1549	bcb->CDB[6]     = blen;
1550
1551	result = ene_send_scsi_cmd(us, FDIR_READ, buf, 0);
1552	if (result != USB_STOR_XFER_GOOD)
1553		return USB_STOR_TRANSPORT_ERROR;
1554
1555	return USB_STOR_TRANSPORT_GOOD;
1556}
1557
1558static int ms_lib_scan_logicalblocknumber(struct us_data *us, u16 btBlk1st)
1559{
1560	u16 PhyBlock, newblk, i;
1561	u16 LogStart, LogEnde;
1562	struct ms_lib_type_extdat extdat;
 
1563	u32 count = 0, index = 0;
1564	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1565	u8 *bbuf = info->bbuf;
1566
1567	for (PhyBlock = 0; PhyBlock < info->MS_Lib.NumberOfPhyBlock;) {
1568		ms_lib_phy_to_log_range(PhyBlock, &LogStart, &LogEnde);
1569
1570		for (i = 0; i < MS_PHYSICAL_BLOCKS_PER_SEGMENT; i++, PhyBlock++) {
1571			switch (ms_libconv_to_logical(info, PhyBlock)) {
1572			case MS_STATUS_ERROR:
1573				continue;
1574			default:
1575				break;
1576			}
1577
1578			if (count == PhyBlock) {
1579				ms_lib_read_extrablock(us, PhyBlock, 0, 0x80,
1580						bbuf);
1581				count += 0x80;
1582			}
1583			index = (PhyBlock % 0x80) * 4;
1584
1585			extdat.ovrflg = bbuf[index];
1586			extdat.mngflg = bbuf[index+1];
1587			extdat.logadr = memstick_logaddr(bbuf[index+2],
1588					bbuf[index+3]);
1589
1590			if ((extdat.ovrflg & MS_REG_OVR_BKST) != MS_REG_OVR_BKST_OK) {
1591				ms_lib_setacquired_errorblock(us, PhyBlock);
1592				continue;
1593			}
1594
1595			if ((extdat.mngflg & MS_REG_MNG_ATFLG) == MS_REG_MNG_ATFLG_ATTBL) {
1596				ms_lib_erase_phyblock(us, PhyBlock);
1597				continue;
1598			}
1599
1600			if (extdat.logadr != MS_LB_NOT_USED) {
1601				if ((extdat.logadr < LogStart) || (LogEnde <= extdat.logadr)) {
1602					ms_lib_erase_phyblock(us, PhyBlock);
1603					continue;
1604				}
1605
1606				newblk = ms_libconv_to_physical(info, extdat.logadr);
1607
1608				if (newblk != MS_LB_NOT_USED) {
1609					if (extdat.logadr == 0) {
1610						ms_lib_set_logicalpair(us, extdat.logadr, PhyBlock);
1611						if (ms_lib_check_disableblock(us, btBlk1st)) {
1612							ms_lib_set_logicalpair(us, extdat.logadr, newblk);
1613							continue;
1614						}
1615					}
1616
1617					ms_lib_read_extra(us, newblk, 0, &extdat);
1618					if ((extdat.ovrflg & MS_REG_OVR_UDST) == MS_REG_OVR_UDST_UPDATING) {
1619						ms_lib_erase_phyblock(us, PhyBlock);
1620						continue;
1621					} else {
1622						ms_lib_erase_phyblock(us, newblk);
1623					}
1624				}
1625
1626				ms_lib_set_logicalpair(us, extdat.logadr, PhyBlock);
1627			}
1628		}
1629	} /* End for ... */
1630
1631	return MS_STATUS_SUCCESS;
1632}
1633
1634
1635static int ms_scsi_read(struct us_data *us, struct scsi_cmnd *srb)
1636{
1637	int result;
1638	unsigned char *cdb = srb->cmnd;
1639	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1640	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1641
1642	u32 bn = ((cdb[2] << 24) & 0xff000000) | ((cdb[3] << 16) & 0x00ff0000) |
1643		((cdb[4] << 8) & 0x0000ff00) | ((cdb[5] << 0) & 0x000000ff);
1644	u16 blen = ((cdb[7] << 8) & 0xff00) | ((cdb[8] << 0) & 0x00ff);
1645	u32 blenByte = blen * 0x200;
1646
1647	if (bn > info->bl_num)
1648		return USB_STOR_TRANSPORT_ERROR;
1649
1650	if (info->MS_Status & MS_IsMSPro) {
1651		result = ene_load_bincode(us, MSP_RW_PATTERN);
1652		if (result != USB_STOR_XFER_GOOD) {
1653			usb_stor_dbg(us, "Load MPS RW pattern Fail !!\n");
1654			return USB_STOR_TRANSPORT_ERROR;
1655		}
1656
1657		/* set up the command wrapper */
1658		memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1659		bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1660		bcb->DataTransferLength = blenByte;
1661		bcb->Flags  = US_BULK_FLAG_IN;
1662		bcb->CDB[0] = 0xF1;
1663		bcb->CDB[1] = 0x02;
1664		bcb->CDB[5] = (unsigned char)(bn);
1665		bcb->CDB[4] = (unsigned char)(bn>>8);
1666		bcb->CDB[3] = (unsigned char)(bn>>16);
1667		bcb->CDB[2] = (unsigned char)(bn>>24);
1668
1669		result = ene_send_scsi_cmd(us, FDIR_READ, scsi_sglist(srb), 1);
1670	} else {
1671		void *buf;
1672		int offset = 0;
1673		u16 phyblk, logblk;
1674		u8 PageNum;
1675		u16 len;
1676		u32 blkno;
1677
1678		buf = kmalloc(blenByte, GFP_KERNEL);
1679		if (buf == NULL)
1680			return USB_STOR_TRANSPORT_ERROR;
1681
1682		result = ene_load_bincode(us, MS_RW_PATTERN);
1683		if (result != USB_STOR_XFER_GOOD) {
1684			pr_info("Load MS RW pattern Fail !!\n");
1685			result = USB_STOR_TRANSPORT_ERROR;
1686			goto exit;
1687		}
1688
1689		logblk  = (u16)(bn / info->MS_Lib.PagesPerBlock);
1690		PageNum = (u8)(bn % info->MS_Lib.PagesPerBlock);
1691
1692		while (1) {
1693			if (blen > (info->MS_Lib.PagesPerBlock-PageNum))
1694				len = info->MS_Lib.PagesPerBlock-PageNum;
1695			else
1696				len = blen;
1697
1698			phyblk = ms_libconv_to_physical(info, logblk);
1699			blkno  = phyblk * 0x20 + PageNum;
1700
1701			/* set up the command wrapper */
1702			memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1703			bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1704			bcb->DataTransferLength = 0x200 * len;
1705			bcb->Flags  = US_BULK_FLAG_IN;
1706			bcb->CDB[0] = 0xF1;
1707			bcb->CDB[1] = 0x02;
1708			bcb->CDB[5] = (unsigned char)(blkno);
1709			bcb->CDB[4] = (unsigned char)(blkno>>8);
1710			bcb->CDB[3] = (unsigned char)(blkno>>16);
1711			bcb->CDB[2] = (unsigned char)(blkno>>24);
1712
1713			result = ene_send_scsi_cmd(us, FDIR_READ, buf+offset, 0);
1714			if (result != USB_STOR_XFER_GOOD) {
1715				pr_info("MS_SCSI_Read --- result = %x\n", result);
1716				result = USB_STOR_TRANSPORT_ERROR;
1717				goto exit;
1718			}
1719
1720			blen -= len;
1721			if (blen <= 0)
1722				break;
1723			logblk++;
1724			PageNum = 0;
1725			offset += MS_BYTES_PER_PAGE*len;
1726		}
1727		usb_stor_set_xfer_buf(buf, blenByte, srb);
1728exit:
1729		kfree(buf);
1730	}
1731	return result;
1732}
1733
1734static int ms_scsi_write(struct us_data *us, struct scsi_cmnd *srb)
1735{
1736	int result;
1737	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1738	unsigned char *cdb = srb->cmnd;
1739	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1740
1741	u32 bn = ((cdb[2] << 24) & 0xff000000) |
1742			((cdb[3] << 16) & 0x00ff0000) |
1743			((cdb[4] << 8) & 0x0000ff00) |
1744			((cdb[5] << 0) & 0x000000ff);
1745	u16 blen = ((cdb[7] << 8) & 0xff00) | ((cdb[8] << 0) & 0x00ff);
1746	u32 blenByte = blen * 0x200;
1747
1748	if (bn > info->bl_num)
1749		return USB_STOR_TRANSPORT_ERROR;
1750
1751	if (info->MS_Status & MS_IsMSPro) {
1752		result = ene_load_bincode(us, MSP_RW_PATTERN);
1753		if (result != USB_STOR_XFER_GOOD) {
1754			pr_info("Load MSP RW pattern Fail !!\n");
1755			return USB_STOR_TRANSPORT_ERROR;
1756		}
1757
1758		/* set up the command wrapper */
1759		memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1760		bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1761		bcb->DataTransferLength = blenByte;
1762		bcb->Flags  = US_BULK_FLAG_OUT;
1763		bcb->CDB[0] = 0xF0;
1764		bcb->CDB[1] = 0x04;
1765		bcb->CDB[5] = (unsigned char)(bn);
1766		bcb->CDB[4] = (unsigned char)(bn>>8);
1767		bcb->CDB[3] = (unsigned char)(bn>>16);
1768		bcb->CDB[2] = (unsigned char)(bn>>24);
1769
1770		result = ene_send_scsi_cmd(us, FDIR_WRITE, scsi_sglist(srb), 1);
1771	} else {
1772		void *buf;
1773		int offset = 0;
1774		u16 PhyBlockAddr;
1775		u8 PageNum;
1776		u16 len, oldphy, newphy;
1777
1778		buf = kmalloc(blenByte, GFP_KERNEL);
1779		if (buf == NULL)
1780			return USB_STOR_TRANSPORT_ERROR;
1781		usb_stor_set_xfer_buf(buf, blenByte, srb);
1782
1783		result = ene_load_bincode(us, MS_RW_PATTERN);
1784		if (result != USB_STOR_XFER_GOOD) {
1785			pr_info("Load MS RW pattern Fail !!\n");
1786			result = USB_STOR_TRANSPORT_ERROR;
1787			goto exit;
1788		}
1789
1790		PhyBlockAddr = (u16)(bn / info->MS_Lib.PagesPerBlock);
1791		PageNum      = (u8)(bn % info->MS_Lib.PagesPerBlock);
1792
1793		while (1) {
1794			if (blen > (info->MS_Lib.PagesPerBlock-PageNum))
1795				len = info->MS_Lib.PagesPerBlock-PageNum;
1796			else
1797				len = blen;
1798
1799			oldphy = ms_libconv_to_physical(info, PhyBlockAddr); /* need check us <-> info */
1800			newphy = ms_libsearch_block_from_logical(us, PhyBlockAddr);
1801
1802			result = ms_read_copyblock(us, oldphy, newphy, PhyBlockAddr, PageNum, buf+offset, len);
1803
1804			if (result != USB_STOR_XFER_GOOD) {
1805				pr_info("MS_SCSI_Write --- result = %x\n", result);
1806				result =  USB_STOR_TRANSPORT_ERROR;
1807				goto exit;
1808			}
1809
1810			info->MS_Lib.Phy2LogMap[oldphy] = MS_LB_NOT_USED_ERASED;
1811			ms_lib_force_setlogical_pair(us, PhyBlockAddr, newphy);
1812
1813			blen -= len;
1814			if (blen <= 0)
1815				break;
1816			PhyBlockAddr++;
1817			PageNum = 0;
1818			offset += MS_BYTES_PER_PAGE*len;
1819		}
1820exit:
1821		kfree(buf);
1822	}
1823	return result;
1824}
1825
1826/*
1827 * ENE MS Card
1828 */
1829
1830static int ene_get_card_type(struct us_data *us, u16 index, void *buf)
1831{
1832	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1833	int result;
1834
1835	memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1836	bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1837	bcb->DataTransferLength	= 0x01;
1838	bcb->Flags			= US_BULK_FLAG_IN;
1839	bcb->CDB[0]			= 0xED;
1840	bcb->CDB[2]			= (unsigned char)(index>>8);
1841	bcb->CDB[3]			= (unsigned char)index;
1842
1843	result = ene_send_scsi_cmd(us, FDIR_READ, buf, 0);
1844	return result;
1845}
1846
1847static int ene_get_card_status(struct us_data *us, u8 *buf)
1848{
1849	u16 tmpreg;
1850	u32 reg4b;
1851	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1852
1853	/*usb_stor_dbg(us, "transport --- ENE_ReadSDReg\n");*/
1854	reg4b = *(u32 *)&buf[0x18];
1855	info->SD_READ_BL_LEN = (u8)((reg4b >> 8) & 0x0f);
1856
1857	tmpreg = (u16) reg4b;
1858	reg4b = *(u32 *)(&buf[0x14]);
1859	if ((info->SD_Status & SD_HiCapacity) && !(info->SD_Status & SD_IsMMC))
1860		info->HC_C_SIZE = (reg4b >> 8) & 0x3fffff;
1861
1862	info->SD_C_SIZE = ((tmpreg & 0x03) << 10) | (u16)(reg4b >> 22);
1863	info->SD_C_SIZE_MULT = (u8)(reg4b >> 7)  & 0x07;
1864	if ((info->SD_Status & SD_HiCapacity) && (info->SD_Status & SD_IsMMC))
1865		info->HC_C_SIZE = *(u32 *)(&buf[0x100]);
1866
1867	if (info->SD_READ_BL_LEN > SD_BLOCK_LEN) {
1868		info->SD_Block_Mult = 1 << (info->SD_READ_BL_LEN-SD_BLOCK_LEN);
1869		info->SD_READ_BL_LEN = SD_BLOCK_LEN;
1870	} else {
1871		info->SD_Block_Mult = 1;
1872	}
1873
1874	return USB_STOR_TRANSPORT_GOOD;
1875}
1876
1877static int ene_load_bincode(struct us_data *us, unsigned char flag)
1878{
1879	int err;
1880	char *fw_name = NULL;
1881	unsigned char *buf = NULL;
1882	const struct firmware *sd_fw = NULL;
1883	int result = USB_STOR_TRANSPORT_ERROR;
1884	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1885	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1886
1887	if (info->BIN_FLAG == flag)
1888		return USB_STOR_TRANSPORT_GOOD;
1889
1890	switch (flag) {
1891	/* For SD */
1892	case SD_INIT1_PATTERN:
1893		usb_stor_dbg(us, "SD_INIT1_PATTERN\n");
1894		fw_name = SD_INIT1_FIRMWARE;
1895		break;
1896	case SD_INIT2_PATTERN:
1897		usb_stor_dbg(us, "SD_INIT2_PATTERN\n");
1898		fw_name = SD_INIT2_FIRMWARE;
1899		break;
1900	case SD_RW_PATTERN:
1901		usb_stor_dbg(us, "SD_RW_PATTERN\n");
1902		fw_name = SD_RW_FIRMWARE;
1903		break;
1904	/* For MS */
1905	case MS_INIT_PATTERN:
1906		usb_stor_dbg(us, "MS_INIT_PATTERN\n");
1907		fw_name = MS_INIT_FIRMWARE;
1908		break;
1909	case MSP_RW_PATTERN:
1910		usb_stor_dbg(us, "MSP_RW_PATTERN\n");
1911		fw_name = MSP_RW_FIRMWARE;
1912		break;
1913	case MS_RW_PATTERN:
1914		usb_stor_dbg(us, "MS_RW_PATTERN\n");
1915		fw_name = MS_RW_FIRMWARE;
1916		break;
1917	default:
1918		usb_stor_dbg(us, "----------- Unknown PATTERN ----------\n");
1919		goto nofw;
1920	}
1921
1922	err = request_firmware(&sd_fw, fw_name, &us->pusb_dev->dev);
1923	if (err) {
1924		usb_stor_dbg(us, "load firmware %s failed\n", fw_name);
1925		goto nofw;
1926	}
1927	buf = kmemdup(sd_fw->data, sd_fw->size, GFP_KERNEL);
1928	if (buf == NULL)
1929		goto nofw;
1930
 
1931	memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1932	bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1933	bcb->DataTransferLength = sd_fw->size;
1934	bcb->Flags = US_BULK_FLAG_OUT;
1935	bcb->CDB[0] = 0xEF;
1936
1937	result = ene_send_scsi_cmd(us, FDIR_WRITE, buf, 0);
1938	if (us->srb != NULL)
1939		scsi_set_resid(us->srb, 0);
1940	info->BIN_FLAG = flag;
1941	kfree(buf);
1942
1943nofw:
1944	release_firmware(sd_fw);
1945	return result;
1946}
1947
1948static int ms_card_init(struct us_data *us)
1949{
1950	u32 result;
1951	u16 TmpBlock;
1952	unsigned char *PageBuffer0 = NULL, *PageBuffer1 = NULL;
1953	struct ms_lib_type_extdat extdat;
1954	u16 btBlk1st, btBlk2nd;
1955	u32 btBlk1stErred;
1956	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1957
1958	printk(KERN_INFO "MS_CardInit start\n");
1959
1960	ms_lib_free_allocatedarea(us); /* Clean buffer and set struct us_data flag to 0 */
1961
1962	/* get two PageBuffer */
1963	PageBuffer0 = kmalloc(MS_BYTES_PER_PAGE, GFP_KERNEL);
1964	PageBuffer1 = kmalloc(MS_BYTES_PER_PAGE, GFP_KERNEL);
1965	if ((PageBuffer0 == NULL) || (PageBuffer1 == NULL)) {
1966		result = MS_NO_MEMORY_ERROR;
1967		goto exit;
1968	}
1969
1970	btBlk1st = btBlk2nd = MS_LB_NOT_USED;
1971	btBlk1stErred = 0;
1972
1973	for (TmpBlock = 0; TmpBlock < MS_MAX_INITIAL_ERROR_BLOCKS+2; TmpBlock++) {
1974
1975		switch (ms_read_readpage(us, TmpBlock, 0, (u32 *)PageBuffer0, &extdat)) {
1976		case MS_STATUS_SUCCESS:
1977			break;
1978		case MS_STATUS_INT_ERROR:
1979			break;
1980		case MS_STATUS_ERROR:
1981		default:
1982			continue;
1983		}
1984
1985		if ((extdat.ovrflg & MS_REG_OVR_BKST) == MS_REG_OVR_BKST_NG)
1986			continue;
1987
1988		if (((extdat.mngflg & MS_REG_MNG_SYSFLG) == MS_REG_MNG_SYSFLG_USER) ||
1989			(be16_to_cpu(((struct ms_bootblock_page0 *)PageBuffer0)->header.wBlockID) != MS_BOOT_BLOCK_ID) ||
1990			(be16_to_cpu(((struct ms_bootblock_page0 *)PageBuffer0)->header.wFormatVersion) != MS_BOOT_BLOCK_FORMAT_VERSION) ||
1991			(((struct ms_bootblock_page0 *)PageBuffer0)->header.bNumberOfDataEntry != MS_BOOT_BLOCK_DATA_ENTRIES))
1992				continue;
1993
1994		if (btBlk1st != MS_LB_NOT_USED) {
1995			btBlk2nd = TmpBlock;
1996			break;
1997		}
1998
1999		btBlk1st = TmpBlock;
2000		memcpy(PageBuffer1, PageBuffer0, MS_BYTES_PER_PAGE);
2001		if (extdat.status1 & (MS_REG_ST1_DTER | MS_REG_ST1_EXER | MS_REG_ST1_FGER))
2002			btBlk1stErred = 1;
2003	}
2004
2005	if (btBlk1st == MS_LB_NOT_USED) {
2006		result = MS_STATUS_ERROR;
2007		goto exit;
2008	}
2009
2010	/* write protect */
2011	if ((extdat.status0 & MS_REG_ST0_WP) == MS_REG_ST0_WP_ON)
2012		ms_lib_ctrl_set(info, MS_LIB_CTRL_WRPROTECT);
2013
2014	result = MS_STATUS_ERROR;
2015	/* 1st Boot Block */
2016	if (btBlk1stErred == 0)
2017		result = ms_lib_process_bootblock(us, btBlk1st, PageBuffer1);
2018		/* 1st */
2019	/* 2nd Boot Block */
2020	if (result && (btBlk2nd != MS_LB_NOT_USED))
2021		result = ms_lib_process_bootblock(us, btBlk2nd, PageBuffer0);
2022
2023	if (result) {
2024		result = MS_STATUS_ERROR;
2025		goto exit;
2026	}
2027
2028	for (TmpBlock = 0; TmpBlock < btBlk1st; TmpBlock++)
2029		info->MS_Lib.Phy2LogMap[TmpBlock] = MS_LB_INITIAL_ERROR;
2030
2031	info->MS_Lib.Phy2LogMap[btBlk1st] = MS_LB_BOOT_BLOCK;
2032
2033	if (btBlk2nd != MS_LB_NOT_USED) {
2034		for (TmpBlock = btBlk1st + 1; TmpBlock < btBlk2nd; TmpBlock++)
2035			info->MS_Lib.Phy2LogMap[TmpBlock] = MS_LB_INITIAL_ERROR;
2036
2037		info->MS_Lib.Phy2LogMap[btBlk2nd] = MS_LB_BOOT_BLOCK;
2038	}
2039
2040	result = ms_lib_scan_logicalblocknumber(us, btBlk1st);
2041	if (result)
2042		goto exit;
2043
2044	for (TmpBlock = MS_PHYSICAL_BLOCKS_PER_SEGMENT;
2045		TmpBlock < info->MS_Lib.NumberOfPhyBlock;
2046		TmpBlock += MS_PHYSICAL_BLOCKS_PER_SEGMENT) {
2047		if (ms_count_freeblock(us, TmpBlock) == 0) {
2048			ms_lib_ctrl_set(info, MS_LIB_CTRL_WRPROTECT);
2049			break;
2050		}
2051	}
2052
2053	/* write */
2054	if (ms_lib_alloc_writebuf(us)) {
2055		result = MS_NO_MEMORY_ERROR;
2056		goto exit;
2057	}
2058
2059	result = MS_STATUS_SUCCESS;
2060
2061exit:
2062	kfree(PageBuffer1);
2063	kfree(PageBuffer0);
2064
2065	printk(KERN_INFO "MS_CardInit end\n");
2066	return result;
2067}
2068
2069static int ene_ms_init(struct us_data *us)
2070{
2071	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
2072	int result;
 
2073	u16 MSP_BlockSize, MSP_UserAreaBlocks;
2074	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
2075	u8 *bbuf = info->bbuf;
2076	unsigned int s;
2077
2078	printk(KERN_INFO "transport --- ENE_MSInit\n");
2079
2080	/* the same part to test ENE */
2081
2082	result = ene_load_bincode(us, MS_INIT_PATTERN);
2083	if (result != USB_STOR_XFER_GOOD) {
2084		printk(KERN_ERR "Load MS Init Code Fail !!\n");
2085		return USB_STOR_TRANSPORT_ERROR;
2086	}
2087
2088	memset(bcb, 0, sizeof(struct bulk_cb_wrap));
2089	bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
2090	bcb->DataTransferLength = 0x200;
2091	bcb->Flags      = US_BULK_FLAG_IN;
2092	bcb->CDB[0]     = 0xF1;
2093	bcb->CDB[1]     = 0x01;
2094
2095	result = ene_send_scsi_cmd(us, FDIR_READ, bbuf, 0);
2096	if (result != USB_STOR_XFER_GOOD) {
2097		printk(KERN_ERR "Execution MS Init Code Fail !!\n");
2098		return USB_STOR_TRANSPORT_ERROR;
2099	}
2100	/* the same part to test ENE */
2101	info->MS_Status = bbuf[0];
2102
2103	s = info->MS_Status;
2104	if ((s & MS_Insert) && (s & MS_Ready)) {
2105		printk(KERN_INFO "Insert     = %x\n", !!(s & MS_Insert));
2106		printk(KERN_INFO "Ready      = %x\n", !!(s & MS_Ready));
2107		printk(KERN_INFO "IsMSPro    = %x\n", !!(s & MS_IsMSPro));
2108		printk(KERN_INFO "IsMSPHG    = %x\n", !!(s & MS_IsMSPHG));
2109		printk(KERN_INFO "WtP= %x\n", !!(s & MS_WtP));
2110		if (s & MS_IsMSPro) {
2111			MSP_BlockSize      = (bbuf[6] << 8) | bbuf[7];
2112			MSP_UserAreaBlocks = (bbuf[10] << 8) | bbuf[11];
2113			info->MSP_TotalBlock = MSP_BlockSize * MSP_UserAreaBlocks;
2114		} else {
2115			ms_card_init(us); /* Card is MS (to ms.c)*/
2116		}
2117		usb_stor_dbg(us, "MS Init Code OK !!\n");
2118	} else {
2119		usb_stor_dbg(us, "MS Card Not Ready --- %x\n", bbuf[0]);
2120		return USB_STOR_TRANSPORT_ERROR;
2121	}
2122
2123	return USB_STOR_TRANSPORT_GOOD;
2124}
2125
2126static int ene_sd_init(struct us_data *us)
2127{
2128	int result;
 
2129	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
2130	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
2131	u8 *bbuf = info->bbuf;
2132
2133	usb_stor_dbg(us, "transport --- ENE_SDInit\n");
2134	/* SD Init Part-1 */
2135	result = ene_load_bincode(us, SD_INIT1_PATTERN);
2136	if (result != USB_STOR_XFER_GOOD) {
2137		usb_stor_dbg(us, "Load SD Init Code Part-1 Fail !!\n");
2138		return USB_STOR_TRANSPORT_ERROR;
2139	}
2140
2141	memset(bcb, 0, sizeof(struct bulk_cb_wrap));
2142	bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
2143	bcb->Flags = US_BULK_FLAG_IN;
2144	bcb->CDB[0] = 0xF2;
2145
2146	result = ene_send_scsi_cmd(us, FDIR_READ, NULL, 0);
2147	if (result != USB_STOR_XFER_GOOD) {
2148		usb_stor_dbg(us, "Execution SD Init Code Fail !!\n");
2149		return USB_STOR_TRANSPORT_ERROR;
2150	}
2151
2152	/* SD Init Part-2 */
2153	result = ene_load_bincode(us, SD_INIT2_PATTERN);
2154	if (result != USB_STOR_XFER_GOOD) {
2155		usb_stor_dbg(us, "Load SD Init Code Part-2 Fail !!\n");
2156		return USB_STOR_TRANSPORT_ERROR;
2157	}
2158
2159	memset(bcb, 0, sizeof(struct bulk_cb_wrap));
2160	bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
2161	bcb->DataTransferLength = 0x200;
2162	bcb->Flags              = US_BULK_FLAG_IN;
2163	bcb->CDB[0]             = 0xF1;
2164
2165	result = ene_send_scsi_cmd(us, FDIR_READ, bbuf, 0);
2166	if (result != USB_STOR_XFER_GOOD) {
2167		usb_stor_dbg(us, "Execution SD Init Code Fail !!\n");
2168		return USB_STOR_TRANSPORT_ERROR;
2169	}
2170
2171	info->SD_Status = bbuf[0];
2172	if ((info->SD_Status & SD_Insert) && (info->SD_Status & SD_Ready)) {
2173		unsigned int s = info->SD_Status;
2174
2175		ene_get_card_status(us, bbuf);
2176		usb_stor_dbg(us, "Insert     = %x\n", !!(s & SD_Insert));
2177		usb_stor_dbg(us, "Ready      = %x\n", !!(s & SD_Ready));
2178		usb_stor_dbg(us, "IsMMC      = %x\n", !!(s & SD_IsMMC));
2179		usb_stor_dbg(us, "HiCapacity = %x\n", !!(s & SD_HiCapacity));
2180		usb_stor_dbg(us, "HiSpeed    = %x\n", !!(s & SD_HiSpeed));
2181		usb_stor_dbg(us, "WtP        = %x\n", !!(s & SD_WtP));
2182	} else {
2183		usb_stor_dbg(us, "SD Card Not Ready --- %x\n", bbuf[0]);
2184		return USB_STOR_TRANSPORT_ERROR;
2185	}
2186	return USB_STOR_TRANSPORT_GOOD;
2187}
2188
2189
2190static int ene_init(struct us_data *us)
2191{
2192	int result;
2193	u8  misc_reg03;
2194	struct ene_ub6250_info *info = (struct ene_ub6250_info *)(us->extra);
2195	u8 *bbuf = info->bbuf;
2196
2197	result = ene_get_card_type(us, REG_CARD_STATUS, bbuf);
2198	if (result != USB_STOR_XFER_GOOD)
2199		return USB_STOR_TRANSPORT_ERROR;
2200
2201	misc_reg03 = bbuf[0];
2202	if (misc_reg03 & 0x01) {
2203		if (!(info->SD_Status & SD_Ready)) {
2204			result = ene_sd_init(us);
2205			if (result != USB_STOR_XFER_GOOD)
2206				return USB_STOR_TRANSPORT_ERROR;
2207		}
2208	}
2209	if (misc_reg03 & 0x02) {
2210		if (!(info->MS_Status & MS_Ready)) {
2211			result = ene_ms_init(us);
2212			if (result != USB_STOR_XFER_GOOD)
2213				return USB_STOR_TRANSPORT_ERROR;
2214		}
2215	}
2216	return result;
2217}
2218
2219/*----- sd_scsi_irp() ---------*/
2220static int sd_scsi_irp(struct us_data *us, struct scsi_cmnd *srb)
2221{
2222	int    result;
2223	struct ene_ub6250_info *info = (struct ene_ub6250_info *)us->extra;
2224
 
2225	switch (srb->cmnd[0]) {
2226	case TEST_UNIT_READY:
2227		result = sd_scsi_test_unit_ready(us, srb);
2228		break; /* 0x00 */
2229	case REQUEST_SENSE:
2230		result = do_scsi_request_sense(us, srb);
2231		break; /* 0x03 */
2232	case INQUIRY:
2233		result = do_scsi_inquiry(us, srb);
2234		break; /* 0x12 */
2235	case MODE_SENSE:
2236		result = sd_scsi_mode_sense(us, srb);
2237		break; /* 0x1A */
2238	/*
2239	case START_STOP:
2240		result = SD_SCSI_Start_Stop(us, srb);
2241		break; //0x1B
2242	*/
2243	case READ_CAPACITY:
2244		result = sd_scsi_read_capacity(us, srb);
2245		break; /* 0x25 */
2246	case READ_10:
2247		result = sd_scsi_read(us, srb);
2248		break; /* 0x28 */
2249	case WRITE_10:
2250		result = sd_scsi_write(us, srb);
2251		break; /* 0x2A */
2252	default:
2253		info->SrbStatus = SS_ILLEGAL_REQUEST;
2254		result = USB_STOR_TRANSPORT_FAILED;
2255		break;
2256	}
2257	if (result == USB_STOR_TRANSPORT_GOOD)
2258		info->SrbStatus = SS_SUCCESS;
2259	return result;
2260}
2261
2262/*
2263 * ms_scsi_irp()
2264 */
2265static int ms_scsi_irp(struct us_data *us, struct scsi_cmnd *srb)
2266{
2267	int result;
2268	struct ene_ub6250_info *info = (struct ene_ub6250_info *)us->extra;
2269
2270	switch (srb->cmnd[0]) {
2271	case TEST_UNIT_READY:
2272		result = ms_scsi_test_unit_ready(us, srb);
2273		break; /* 0x00 */
2274	case REQUEST_SENSE:
2275		result = do_scsi_request_sense(us, srb);
2276		break; /* 0x03 */
2277	case INQUIRY:
2278		result = do_scsi_inquiry(us, srb);
2279		break; /* 0x12 */
2280	case MODE_SENSE:
2281		result = ms_scsi_mode_sense(us, srb);
2282		break; /* 0x1A */
2283	case READ_CAPACITY:
2284		result = ms_scsi_read_capacity(us, srb);
2285		break; /* 0x25 */
2286	case READ_10:
2287		result = ms_scsi_read(us, srb);
2288		break; /* 0x28 */
2289	case WRITE_10:
2290		result = ms_scsi_write(us, srb);
2291		break;  /* 0x2A */
2292	default:
2293		info->SrbStatus = SS_ILLEGAL_REQUEST;
2294		result = USB_STOR_TRANSPORT_FAILED;
2295		break;
2296	}
2297	if (result == USB_STOR_TRANSPORT_GOOD)
2298		info->SrbStatus = SS_SUCCESS;
2299	return result;
2300}
2301
2302static int ene_transport(struct scsi_cmnd *srb, struct us_data *us)
2303{
2304	int result = USB_STOR_XFER_GOOD;
2305	struct ene_ub6250_info *info = (struct ene_ub6250_info *)(us->extra);
2306
2307	/*US_DEBUG(usb_stor_show_command(us, srb)); */
2308	scsi_set_resid(srb, 0);
2309	if (unlikely(!(info->SD_Status & SD_Ready) || (info->MS_Status & MS_Ready)))
2310		result = ene_init(us);
2311	if (result == USB_STOR_XFER_GOOD) {
2312		result = USB_STOR_TRANSPORT_ERROR;
2313		if (info->SD_Status & SD_Ready)
2314			result = sd_scsi_irp(us, srb);
2315
2316		if (info->MS_Status & MS_Ready)
2317			result = ms_scsi_irp(us, srb);
2318	}
2319	return result;
2320}
2321
2322static struct scsi_host_template ene_ub6250_host_template;
2323
2324static int ene_ub6250_probe(struct usb_interface *intf,
2325			 const struct usb_device_id *id)
2326{
2327	int result;
2328	u8  misc_reg03;
2329	struct us_data *us;
2330	struct ene_ub6250_info *info;
2331
2332	result = usb_stor_probe1(&us, intf, id,
2333		   (id - ene_ub6250_usb_ids) + ene_ub6250_unusual_dev_list,
2334		   &ene_ub6250_host_template);
2335	if (result)
2336		return result;
2337
2338	/* FIXME: where should the code alloc extra buf ? */
2339	us->extra = kzalloc(sizeof(struct ene_ub6250_info), GFP_KERNEL);
2340	if (!us->extra)
2341		return -ENOMEM;
2342	us->extra_destructor = ene_ub6250_info_destructor;
2343
2344	info = (struct ene_ub6250_info *)(us->extra);
2345	info->bbuf = kmalloc(512, GFP_KERNEL);
2346	if (!info->bbuf) {
2347		kfree(us->extra);
2348		return -ENOMEM;
2349	}
2350
2351	us->transport_name = "ene_ub6250";
2352	us->transport = ene_transport;
2353	us->max_lun = 0;
2354
2355	result = usb_stor_probe2(us);
2356	if (result)
2357		return result;
2358
2359	/* probe card type */
2360	result = ene_get_card_type(us, REG_CARD_STATUS, info->bbuf);
2361	if (result != USB_STOR_XFER_GOOD) {
2362		usb_stor_disconnect(intf);
2363		return USB_STOR_TRANSPORT_ERROR;
2364	}
2365
2366	misc_reg03 = info->bbuf[0];
2367	if (!(misc_reg03 & 0x01)) {
2368		pr_info("ums_eneub6250: This driver only supports SD/MS cards. "
2369			"It does not support SM cards.\n");
2370	}
2371
2372	return result;
2373}
2374
2375
2376#ifdef CONFIG_PM
2377
2378static int ene_ub6250_resume(struct usb_interface *iface)
2379{
 
2380	struct us_data *us = usb_get_intfdata(iface);
2381	struct ene_ub6250_info *info = (struct ene_ub6250_info *)(us->extra);
2382
2383	mutex_lock(&us->dev_mutex);
2384
2385	if (us->suspend_resume_hook)
2386		(us->suspend_resume_hook)(us, US_RESUME);
2387
2388	mutex_unlock(&us->dev_mutex);
2389
2390	info->Power_IsResum = true;
2391	/* info->SD_Status &= ~SD_Ready; */
2392	info->SD_Status = 0;
2393	info->MS_Status = 0;
2394	info->SM_Status = 0;
2395
2396	return 0;
2397}
2398
2399static int ene_ub6250_reset_resume(struct usb_interface *iface)
2400{
 
2401	struct us_data *us = usb_get_intfdata(iface);
2402	struct ene_ub6250_info *info = (struct ene_ub6250_info *)(us->extra);
2403
2404	/* Report the reset to the SCSI core */
2405	usb_stor_reset_resume(iface);
2406
2407	/*
2408	 * FIXME: Notify the subdrivers that they need to reinitialize
2409	 * the device
2410	 */
2411	info->Power_IsResum = true;
2412	/* info->SD_Status &= ~SD_Ready; */
2413	info->SD_Status = 0;
2414	info->MS_Status = 0;
2415	info->SM_Status = 0;
2416
2417	return 0;
2418}
2419
2420#else
2421
2422#define ene_ub6250_resume		NULL
2423#define ene_ub6250_reset_resume		NULL
2424
2425#endif
2426
2427static struct usb_driver ene_ub6250_driver = {
2428	.name =		DRV_NAME,
2429	.probe =	ene_ub6250_probe,
2430	.disconnect =	usb_stor_disconnect,
2431	.suspend =	usb_stor_suspend,
2432	.resume =	ene_ub6250_resume,
2433	.reset_resume =	ene_ub6250_reset_resume,
2434	.pre_reset =	usb_stor_pre_reset,
2435	.post_reset =	usb_stor_post_reset,
2436	.id_table =	ene_ub6250_usb_ids,
2437	.soft_unbind =	1,
2438	.no_dynamic_id = 1,
2439};
2440
2441module_usb_stor_driver(ene_ub6250_driver, ene_ub6250_host_template, DRV_NAME);
v3.15
   1/*
   2 *
   3 * This program is free software; you can redistribute it and/or modify it
   4 * under the terms of the GNU General Public License as published by the
   5 * Free Software Foundation; either version 2, or (at your option) any
   6 * later version.
   7 *
   8 * This program is distributed in the hope that it will be useful, but
   9 * WITHOUT ANY WARRANTY; without even the implied warranty of
  10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11 * General Public License for more details.
  12 *
  13 * You should have received a copy of the GNU General Public License along
  14 * with this program; if not, write to the Free Software Foundation, Inc.,
  15 * 675 Mass Ave, Cambridge, MA 02139, USA.
  16 */
  17#include <linux/jiffies.h>
  18#include <linux/errno.h>
  19#include <linux/module.h>
  20#include <linux/slab.h>
  21
  22#include <scsi/scsi.h>
  23#include <scsi/scsi_cmnd.h>
  24
  25#include <linux/firmware.h>
  26
  27#include "usb.h"
  28#include "transport.h"
  29#include "protocol.h"
  30#include "debug.h"
 
  31
  32#define SD_INIT1_FIRMWARE "ene-ub6250/sd_init1.bin"
  33#define SD_INIT2_FIRMWARE "ene-ub6250/sd_init2.bin"
  34#define SD_RW_FIRMWARE "ene-ub6250/sd_rdwr.bin"
  35#define MS_INIT_FIRMWARE "ene-ub6250/ms_init.bin"
  36#define MSP_RW_FIRMWARE "ene-ub6250/msp_rdwr.bin"
  37#define MS_RW_FIRMWARE "ene-ub6250/ms_rdwr.bin"
  38
 
 
  39MODULE_DESCRIPTION("Driver for ENE UB6250 reader");
  40MODULE_LICENSE("GPL");
 
  41MODULE_FIRMWARE(SD_INIT1_FIRMWARE);
  42MODULE_FIRMWARE(SD_INIT2_FIRMWARE);
  43MODULE_FIRMWARE(SD_RW_FIRMWARE);
  44MODULE_FIRMWARE(MS_INIT_FIRMWARE);
  45MODULE_FIRMWARE(MSP_RW_FIRMWARE);
  46MODULE_FIRMWARE(MS_RW_FIRMWARE);
  47
  48/*
  49 * The table of devices
  50 */
  51#define UNUSUAL_DEV(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax, \
  52		    vendorName, productName, useProtocol, useTransport, \
  53		    initFunction, flags) \
  54{ USB_DEVICE_VER(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax), \
  55	.driver_info = (flags)}
  56
  57static struct usb_device_id ene_ub6250_usb_ids[] = {
  58#	include "unusual_ene_ub6250.h"
  59	{ }		/* Terminating entry */
  60};
  61MODULE_DEVICE_TABLE(usb, ene_ub6250_usb_ids);
  62
  63#undef UNUSUAL_DEV
  64
  65/*
  66 * The flags table
  67 */
  68#define UNUSUAL_DEV(idVendor, idProduct, bcdDeviceMin, bcdDeviceMax, \
  69		    vendor_name, product_name, use_protocol, use_transport, \
  70		    init_function, Flags) \
  71{ \
  72	.vendorName = vendor_name,	\
  73	.productName = product_name,	\
  74	.useProtocol = use_protocol,	\
  75	.useTransport = use_transport,	\
  76	.initFunction = init_function,	\
  77}
  78
  79static struct us_unusual_dev ene_ub6250_unusual_dev_list[] = {
  80#	include "unusual_ene_ub6250.h"
  81	{ }		/* Terminating entry */
  82};
  83
  84#undef UNUSUAL_DEV
  85
  86
  87
  88/* ENE bin code len */
  89#define ENE_BIN_CODE_LEN    0x800
  90/* EnE HW Register */
  91#define REG_CARD_STATUS     0xFF83
  92#define REG_HW_TRAP1        0xFF89
  93
  94/* SRB Status */
  95#define SS_SUCCESS                  0x00      /* No Sense */
  96#define SS_NOT_READY                0x02
  97#define SS_MEDIUM_ERR               0x03
  98#define SS_HW_ERR                   0x04
  99#define SS_ILLEGAL_REQUEST          0x05
 100#define SS_UNIT_ATTENTION           0x06
 101
 102/* ENE Load FW Pattern */
 103#define SD_INIT1_PATTERN   1
 104#define SD_INIT2_PATTERN   2
 105#define SD_RW_PATTERN      3
 106#define MS_INIT_PATTERN    4
 107#define MSP_RW_PATTERN     5
 108#define MS_RW_PATTERN      6
 109#define SM_INIT_PATTERN    7
 110#define SM_RW_PATTERN      8
 111
 112#define FDIR_WRITE         0
 113#define FDIR_READ          1
 114
 115/* For MS Card */
 116
 117/* Status Register 1 */
 118#define MS_REG_ST1_MB           0x80    /* media busy */
 119#define MS_REG_ST1_FB1          0x40    /* flush busy 1 */
 120#define MS_REG_ST1_DTER         0x20    /* error on data(corrected) */
 121#define MS_REG_ST1_UCDT         0x10    /* unable to correct data */
 122#define MS_REG_ST1_EXER         0x08    /* error on extra(corrected) */
 123#define MS_REG_ST1_UCEX         0x04    /* unable to correct extra */
 124#define MS_REG_ST1_FGER         0x02    /* error on overwrite flag(corrected) */
 125#define MS_REG_ST1_UCFG         0x01    /* unable to correct overwrite flag */
 126#define MS_REG_ST1_DEFAULT	(MS_REG_ST1_MB | MS_REG_ST1_FB1 | MS_REG_ST1_DTER | MS_REG_ST1_UCDT | MS_REG_ST1_EXER | MS_REG_ST1_UCEX | MS_REG_ST1_FGER | MS_REG_ST1_UCFG)
 127
 128/* Overwrite Area */
 129#define MS_REG_OVR_BKST		0x80            /* block status */
 130#define MS_REG_OVR_BKST_OK	MS_REG_OVR_BKST     /* OK */
 131#define MS_REG_OVR_BKST_NG	0x00            /* NG */
 132#define MS_REG_OVR_PGST0	0x40            /* page status */
 133#define MS_REG_OVR_PGST1	0x20
 134#define MS_REG_OVR_PGST_MASK	(MS_REG_OVR_PGST0 | MS_REG_OVR_PGST1)
 135#define MS_REG_OVR_PGST_OK	(MS_REG_OVR_PGST0 | MS_REG_OVR_PGST1) /* OK */
 136#define MS_REG_OVR_PGST_NG	MS_REG_OVR_PGST1                      /* NG */
 137#define MS_REG_OVR_PGST_DATA_ERROR	0x00        /* data error */
 138#define MS_REG_OVR_UDST			0x10        /* update status */
 139#define MS_REG_OVR_UDST_UPDATING	0x00        /* updating */
 140#define MS_REG_OVR_UDST_NO_UPDATE	MS_REG_OVR_UDST
 141#define MS_REG_OVR_RESERVED	0x08
 142#define MS_REG_OVR_DEFAULT	(MS_REG_OVR_BKST_OK | MS_REG_OVR_PGST_OK | MS_REG_OVR_UDST_NO_UPDATE | MS_REG_OVR_RESERVED)
 143
 144/* Management Flag */
 145#define MS_REG_MNG_SCMS0	0x20    /* serial copy management system */
 146#define MS_REG_MNG_SCMS1	0x10
 147#define MS_REG_MNG_SCMS_MASK		(MS_REG_MNG_SCMS0 | MS_REG_MNG_SCMS1)
 148#define MS_REG_MNG_SCMS_COPY_OK		(MS_REG_MNG_SCMS0 | MS_REG_MNG_SCMS1)
 149#define MS_REG_MNG_SCMS_ONE_COPY	MS_REG_MNG_SCMS1
 150#define MS_REG_MNG_SCMS_NO_COPY	0x00
 151#define MS_REG_MNG_ATFLG	0x08    /* address transfer table flag */
 152#define MS_REG_MNG_ATFLG_OTHER	MS_REG_MNG_ATFLG    /* other */
 153#define MS_REG_MNG_ATFLG_ATTBL	0x00	/* address transfer table */
 154#define MS_REG_MNG_SYSFLG	0x04	/* system flag */
 155#define MS_REG_MNG_SYSFLG_USER	MS_REG_MNG_SYSFLG   /* user block */
 156#define MS_REG_MNG_SYSFLG_BOOT	0x00	/* system block */
 157#define MS_REG_MNG_RESERVED	0xc3
 158#define MS_REG_MNG_DEFAULT	(MS_REG_MNG_SCMS_COPY_OK | MS_REG_MNG_ATFLG_OTHER | MS_REG_MNG_SYSFLG_USER | MS_REG_MNG_RESERVED)
 159
 160
 161#define MS_MAX_PAGES_PER_BLOCK		32
 162#define MS_MAX_INITIAL_ERROR_BLOCKS 	10
 163#define MS_LIB_BITS_PER_BYTE		8
 164
 165#define MS_SYSINF_FORMAT_FAT		1
 166#define MS_SYSINF_USAGE_GENERAL		0
 167
 168#define MS_SYSINF_MSCLASS_TYPE_1	1
 169#define MS_SYSINF_PAGE_SIZE		MS_BYTES_PER_PAGE /* fixed */
 170
 171#define MS_SYSINF_CARDTYPE_RDONLY	1
 172#define MS_SYSINF_CARDTYPE_RDWR		2
 173#define MS_SYSINF_CARDTYPE_HYBRID	3
 174#define MS_SYSINF_SECURITY		0x01
 175#define MS_SYSINF_SECURITY_NO_SUPPORT	MS_SYSINF_SECURITY
 176#define MS_SYSINF_SECURITY_SUPPORT	0
 177
 178#define MS_SYSINF_RESERVED1		1
 179#define MS_SYSINF_RESERVED2		1
 180
 181#define MS_SYSENT_TYPE_INVALID_BLOCK	0x01
 182#define MS_SYSENT_TYPE_CIS_IDI		0x0a    /* CIS/IDI */
 183
 184#define SIZE_OF_KIRO		1024
 185#define BYTE_MASK		0xff
 186
 187/* ms error code */
 188#define MS_STATUS_WRITE_PROTECT	0x0106
 189#define MS_STATUS_SUCCESS	0x0000
 190#define MS_ERROR_FLASH_READ	0x8003
 191#define MS_ERROR_FLASH_ERASE	0x8005
 192#define MS_LB_ERROR		0xfff0
 193#define MS_LB_BOOT_BLOCK	0xfff1
 194#define MS_LB_INITIAL_ERROR	0xfff2
 195#define MS_STATUS_SUCCESS_WITH_ECC 0xfff3
 196#define MS_LB_ACQUIRED_ERROR	0xfff4
 197#define MS_LB_NOT_USED_ERASED	0xfff5
 198#define MS_NOCARD_ERROR		0xfff8
 199#define MS_NO_MEMORY_ERROR	0xfff9
 200#define MS_STATUS_INT_ERROR	0xfffa
 201#define MS_STATUS_ERROR		0xfffe
 202#define MS_LB_NOT_USED		0xffff
 203
 204#define MS_REG_MNG_SYSFLG	0x04    /* system flag */
 205#define MS_REG_MNG_SYSFLG_USER	MS_REG_MNG_SYSFLG   /* user block */
 206
 207#define MS_BOOT_BLOCK_ID                        0x0001
 208#define MS_BOOT_BLOCK_FORMAT_VERSION            0x0100
 209#define MS_BOOT_BLOCK_DATA_ENTRIES              2
 210
 211#define MS_NUMBER_OF_SYSTEM_ENTRY       	4
 212#define MS_NUMBER_OF_BOOT_BLOCK			2
 213#define MS_BYTES_PER_PAGE			512
 214#define MS_LOGICAL_BLOCKS_PER_SEGMENT		496
 215#define MS_LOGICAL_BLOCKS_IN_1ST_SEGMENT        494
 216
 217#define MS_PHYSICAL_BLOCKS_PER_SEGMENT		0x200 /* 512 */
 218#define MS_PHYSICAL_BLOCKS_PER_SEGMENT_MASK     0x1ff
 219
 220/* overwrite area */
 221#define MS_REG_OVR_BKST		0x80		/* block status */
 222#define MS_REG_OVR_BKST_OK	MS_REG_OVR_BKST	/* OK */
 223#define MS_REG_OVR_BKST_NG	0x00            /* NG */
 224
 225/* Status Register 1 */
 226#define MS_REG_ST1_DTER		0x20	/* error on data(corrected) */
 227#define MS_REG_ST1_EXER		0x08	/* error on extra(corrected) */
 228#define MS_REG_ST1_FGER		0x02	/* error on overwrite flag(corrected) */
 229
 230/* MemoryStick Register */
 231/* Status Register 0 */
 232#define MS_REG_ST0_WP		0x01	/* write protected */
 233#define MS_REG_ST0_WP_ON	MS_REG_ST0_WP
 234
 235#define MS_LIB_CTRL_RDONLY      0
 236#define MS_LIB_CTRL_WRPROTECT   1
 237
 238/*dphy->log table */
 239#define ms_libconv_to_logical(pdx, PhyBlock) (((PhyBlock) >= (pdx)->MS_Lib.NumberOfPhyBlock) ? MS_STATUS_ERROR : (pdx)->MS_Lib.Phy2LogMap[PhyBlock])
 240#define ms_libconv_to_physical(pdx, LogBlock) (((LogBlock) >= (pdx)->MS_Lib.NumberOfLogBlock) ? MS_STATUS_ERROR : (pdx)->MS_Lib.Log2PhyMap[LogBlock])
 241
 242#define ms_lib_ctrl_set(pdx, Flag)	((pdx)->MS_Lib.flags |= (1 << (Flag)))
 243#define ms_lib_ctrl_reset(pdx, Flag)	((pdx)->MS_Lib.flags &= ~(1 << (Flag)))
 244#define ms_lib_ctrl_check(pdx, Flag)	((pdx)->MS_Lib.flags & (1 << (Flag)))
 245
 246#define ms_lib_iswritable(pdx) ((ms_lib_ctrl_check((pdx), MS_LIB_CTRL_RDONLY) == 0) && (ms_lib_ctrl_check(pdx, MS_LIB_CTRL_WRPROTECT) == 0))
 247#define ms_lib_clear_pagemap(pdx) memset((pdx)->MS_Lib.pagemap, 0, sizeof((pdx)->MS_Lib.pagemap))
 248#define memstick_logaddr(logadr1, logadr0) ((((u16)(logadr1)) << 8) | (logadr0))
 249
 250
 251struct SD_STATUS {
 252	u8    Insert:1;
 253	u8    Ready:1;
 254	u8    MediaChange:1;
 255	u8    IsMMC:1;
 256	u8    HiCapacity:1;
 257	u8    HiSpeed:1;
 258	u8    WtP:1;
 259	u8    Reserved:1;
 260};
 261
 262struct MS_STATUS {
 263	u8    Insert:1;
 264	u8    Ready:1;
 265	u8    MediaChange:1;
 266	u8    IsMSPro:1;
 267	u8    IsMSPHG:1;
 268	u8    Reserved1:1;
 269	u8    WtP:1;
 270	u8    Reserved2:1;
 271};
 272
 273struct SM_STATUS {
 274	u8    Insert:1;
 275	u8    Ready:1;
 276	u8    MediaChange:1;
 277	u8    Reserved:3;
 278	u8    WtP:1;
 279	u8    IsMS:1;
 280};
 281
 282struct ms_bootblock_cis {
 283	u8 bCistplDEVICE[6];    /* 0 */
 284	u8 bCistplDEVICE0C[6];  /* 6 */
 285	u8 bCistplJEDECC[4];    /* 12 */
 286	u8 bCistplMANFID[6];    /* 16 */
 287	u8 bCistplVER1[32];     /* 22 */
 288	u8 bCistplFUNCID[4];    /* 54 */
 289	u8 bCistplFUNCE0[4];    /* 58 */
 290	u8 bCistplFUNCE1[5];    /* 62 */
 291	u8 bCistplCONF[7];      /* 67 */
 292	u8 bCistplCFTBLENT0[10];/* 74 */
 293	u8 bCistplCFTBLENT1[8]; /* 84 */
 294	u8 bCistplCFTBLENT2[12];/* 92 */
 295	u8 bCistplCFTBLENT3[8]; /* 104 */
 296	u8 bCistplCFTBLENT4[17];/* 112 */
 297	u8 bCistplCFTBLENT5[8]; /* 129 */
 298	u8 bCistplCFTBLENT6[17];/* 137 */
 299	u8 bCistplCFTBLENT7[8]; /* 154 */
 300	u8 bCistplNOLINK[3];    /* 162 */
 301} ;
 302
 303struct ms_bootblock_idi {
 304#define MS_IDI_GENERAL_CONF 0x848A
 305	u16 wIDIgeneralConfiguration;	/* 0 */
 306	u16 wIDInumberOfCylinder;	/* 1 */
 307	u16 wIDIreserved0;		/* 2 */
 308	u16 wIDInumberOfHead;		/* 3 */
 309	u16 wIDIbytesPerTrack;		/* 4 */
 310	u16 wIDIbytesPerSector;		/* 5 */
 311	u16 wIDIsectorsPerTrack;	/* 6 */
 312	u16 wIDItotalSectors[2];	/* 7-8  high,low */
 313	u16 wIDIreserved1[11];		/* 9-19 */
 314	u16 wIDIbufferType;		/* 20 */
 315	u16 wIDIbufferSize;		/* 21 */
 316	u16 wIDIlongCmdECC;		/* 22 */
 317	u16 wIDIfirmVersion[4];		/* 23-26 */
 318	u16 wIDImodelName[20];		/* 27-46 */
 319	u16 wIDIreserved2;		/* 47 */
 320	u16 wIDIlongWordSupported;	/* 48 */
 321	u16 wIDIdmaSupported;		/* 49 */
 322	u16 wIDIreserved3;		/* 50 */
 323	u16 wIDIpioTiming;		/* 51 */
 324	u16 wIDIdmaTiming;		/* 52 */
 325	u16 wIDItransferParameter;	/* 53 */
 326	u16 wIDIformattedCylinder;	/* 54 */
 327	u16 wIDIformattedHead;		/* 55 */
 328	u16 wIDIformattedSectorsPerTrack;/* 56 */
 329	u16 wIDIformattedTotalSectors[2];/* 57-58 */
 330	u16 wIDImultiSector;		/* 59 */
 331	u16 wIDIlbaSectors[2];		/* 60-61 */
 332	u16 wIDIsingleWordDMA;		/* 62 */
 333	u16 wIDImultiWordDMA;		/* 63 */
 334	u16 wIDIreserved4[192];		/* 64-255 */
 335};
 336
 337struct ms_bootblock_sysent_rec {
 338	u32 dwStart;
 339	u32 dwSize;
 340	u8 bType;
 341	u8 bReserved[3];
 342};
 343
 344struct ms_bootblock_sysent {
 345	struct ms_bootblock_sysent_rec entry[MS_NUMBER_OF_SYSTEM_ENTRY];
 346};
 347
 348struct ms_bootblock_sysinf {
 349	u8 bMsClass;			/* must be 1 */
 350	u8 bCardType;			/* see below */
 351	u16 wBlockSize;			/* n KB */
 352	u16 wBlockNumber;		/* number of physical block */
 353	u16 wTotalBlockNumber;		/* number of logical block */
 354	u16 wPageSize;			/* must be 0x200 */
 355	u8 bExtraSize;			/* 0x10 */
 356	u8 bSecuritySupport;
 357	u8 bAssemblyDate[8];
 358	u8 bFactoryArea[4];
 359	u8 bAssemblyMakerCode;
 360	u8 bAssemblyMachineCode[3];
 361	u16 wMemoryMakerCode;
 362	u16 wMemoryDeviceCode;
 363	u16 wMemorySize;
 364	u8 bReserved1;
 365	u8 bReserved2;
 366	u8 bVCC;
 367	u8 bVPP;
 368	u16 wControllerChipNumber;
 369	u16 wControllerFunction;	/* New MS */
 370	u8 bReserved3[9];		/* New MS */
 371	u8 bParallelSupport;		/* New MS */
 372	u16 wFormatValue;		/* New MS */
 373	u8 bFormatType;
 374	u8 bUsage;
 375	u8 bDeviceType;
 376	u8 bReserved4[22];
 377	u8 bFUValue3;
 378	u8 bFUValue4;
 379	u8 bReserved5[15];
 380};
 381
 382struct ms_bootblock_header {
 383	u16 wBlockID;
 384	u16 wFormatVersion;
 385	u8 bReserved1[184];
 386	u8 bNumberOfDataEntry;
 387	u8 bReserved2[179];
 388};
 389
 390struct ms_bootblock_page0 {
 391	struct ms_bootblock_header header;
 392	struct ms_bootblock_sysent sysent;
 393	struct ms_bootblock_sysinf sysinf;
 394};
 395
 396struct ms_bootblock_cis_idi {
 397	union {
 398		struct ms_bootblock_cis cis;
 399		u8 dmy[256];
 400	} cis;
 401
 402	union {
 403		struct ms_bootblock_idi idi;
 404		u8 dmy[256];
 405	} idi;
 406
 407};
 408
 409/* ENE MS Lib struct */
 410struct ms_lib_type_extdat {
 411	u8 reserved;
 412	u8 intr;
 413	u8 status0;
 414	u8 status1;
 415	u8 ovrflg;
 416	u8 mngflg;
 417	u16 logadr;
 418};
 419
 420struct ms_lib_ctrl {
 421	u32 flags;
 422	u32 BytesPerSector;
 423	u32 NumberOfCylinder;
 424	u32 SectorsPerCylinder;
 425	u16 cardType;			/* R/W, RO, Hybrid */
 426	u16 blockSize;
 427	u16 PagesPerBlock;
 428	u16 NumberOfPhyBlock;
 429	u16 NumberOfLogBlock;
 430	u16 NumberOfSegment;
 431	u16 *Phy2LogMap;		/* phy2log table */
 432	u16 *Log2PhyMap;		/* log2phy table */
 433	u16 wrtblk;
 434	unsigned char *pagemap[(MS_MAX_PAGES_PER_BLOCK + (MS_LIB_BITS_PER_BYTE-1)) / MS_LIB_BITS_PER_BYTE];
 435	unsigned char *blkpag;
 436	struct ms_lib_type_extdat *blkext;
 437	unsigned char copybuf[512];
 438};
 439
 440
 441/* SD Block Length */
 442/* 2^9 = 512 Bytes, The HW maximum read/write data length */
 443#define SD_BLOCK_LEN  9
 444
 445struct ene_ub6250_info {
 
 
 
 
 446	/* for 6250 code */
 447	struct SD_STATUS	SD_Status;
 448	struct MS_STATUS	MS_Status;
 449	struct SM_STATUS	SM_Status;
 450
 451	/* ----- SD Control Data ---------------- */
 452	/*SD_REGISTER SD_Regs; */
 453	u16		SD_Block_Mult;
 454	u8		SD_READ_BL_LEN;
 455	u16		SD_C_SIZE;
 456	u8		SD_C_SIZE_MULT;
 457
 458	/* SD/MMC New spec. */
 459	u8		SD_SPEC_VER;
 460	u8		SD_CSD_VER;
 461	u8		SD20_HIGH_CAPACITY;
 462	u32		HC_C_SIZE;
 463	u8		MMC_SPEC_VER;
 464	u8		MMC_BusWidth;
 465	u8		MMC_HIGH_CAPACITY;
 466
 467	/*----- MS Control Data ---------------- */
 468	bool		MS_SWWP;
 469	u32		MSP_TotalBlock;
 470	struct ms_lib_ctrl MS_Lib;
 471	bool		MS_IsRWPage;
 472	u16		MS_Model;
 473
 474	/*----- SM Control Data ---------------- */
 475	u8		SM_DeviceID;
 476	u8		SM_CardID;
 477
 478	unsigned char	*testbuf;
 479	u8		BIN_FLAG;
 480	u32		bl_num;
 481	int		SrbStatus;
 482
 483	/*------Power Managerment ---------------*/
 484	bool		Power_IsResum;
 485};
 486
 487static int ene_sd_init(struct us_data *us);
 488static int ene_ms_init(struct us_data *us);
 489static int ene_load_bincode(struct us_data *us, unsigned char flag);
 490
 491static void ene_ub6250_info_destructor(void *extra)
 492{
 
 
 493	if (!extra)
 494		return;
 
 495}
 496
 497static int ene_send_scsi_cmd(struct us_data *us, u8 fDir, void *buf, int use_sg)
 498{
 499	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
 500	struct bulk_cs_wrap *bcs = (struct bulk_cs_wrap *) us->iobuf;
 501
 502	int result;
 503	unsigned int residue;
 504	unsigned int cswlen = 0, partial = 0;
 505	unsigned int transfer_length = bcb->DataTransferLength;
 506
 507	/* usb_stor_dbg(us, "transport --- ene_send_scsi_cmd\n"); */
 508	/* send cmd to out endpoint */
 509	result = usb_stor_bulk_transfer_buf(us, us->send_bulk_pipe,
 510					    bcb, US_BULK_CB_WRAP_LEN, NULL);
 511	if (result != USB_STOR_XFER_GOOD) {
 512		usb_stor_dbg(us, "send cmd to out endpoint fail ---\n");
 513		return USB_STOR_TRANSPORT_ERROR;
 514	}
 515
 516	if (buf) {
 517		unsigned int pipe = fDir;
 518
 519		if (fDir  == FDIR_READ)
 520			pipe = us->recv_bulk_pipe;
 521		else
 522			pipe = us->send_bulk_pipe;
 523
 524		/* Bulk */
 525		if (use_sg) {
 526			result = usb_stor_bulk_srb(us, pipe, us->srb);
 527		} else {
 528			result = usb_stor_bulk_transfer_sg(us, pipe, buf,
 529						transfer_length, 0, &partial);
 530		}
 531		if (result != USB_STOR_XFER_GOOD) {
 532			usb_stor_dbg(us, "data transfer fail ---\n");
 533			return USB_STOR_TRANSPORT_ERROR;
 534		}
 535	}
 536
 537	/* Get CSW for device status */
 538	result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe, bcs,
 539					    US_BULK_CS_WRAP_LEN, &cswlen);
 540
 541	if (result == USB_STOR_XFER_SHORT && cswlen == 0) {
 542		usb_stor_dbg(us, "Received 0-length CSW; retrying...\n");
 543		result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe,
 544					    bcs, US_BULK_CS_WRAP_LEN, &cswlen);
 545	}
 546
 547	if (result == USB_STOR_XFER_STALLED) {
 548		/* get the status again */
 549		usb_stor_dbg(us, "Attempting to get CSW (2nd try)...\n");
 550		result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe,
 551						bcs, US_BULK_CS_WRAP_LEN, NULL);
 552	}
 553
 554	if (result != USB_STOR_XFER_GOOD)
 555		return USB_STOR_TRANSPORT_ERROR;
 556
 557	/* check bulk status */
 558	residue = le32_to_cpu(bcs->Residue);
 559
 560	/* try to compute the actual residue, based on how much data
 561	 * was really transferred and what the device tells us */
 
 
 562	if (residue && !(us->fflags & US_FL_IGNORE_RESIDUE)) {
 563		residue = min(residue, transfer_length);
 564		if (us->srb != NULL)
 565			scsi_set_resid(us->srb, max(scsi_get_resid(us->srb),
 566								(int)residue));
 567	}
 568
 569	if (bcs->Status != US_BULK_STAT_OK)
 570		return USB_STOR_TRANSPORT_ERROR;
 571
 572	return USB_STOR_TRANSPORT_GOOD;
 573}
 574
 575static int sd_scsi_test_unit_ready(struct us_data *us, struct scsi_cmnd *srb)
 576{
 577	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
 
 578
 579	if (info->SD_Status.Insert && info->SD_Status.Ready)
 580		return USB_STOR_TRANSPORT_GOOD;
 581	else {
 582		ene_sd_init(us);
 583		return USB_STOR_TRANSPORT_GOOD;
 584	}
 585
 
 586	return USB_STOR_TRANSPORT_GOOD;
 587}
 588
 589static int sd_scsi_inquiry(struct us_data *us, struct scsi_cmnd *srb)
 590{
 591	unsigned char data_ptr[36] = {
 592		0x00, 0x80, 0x02, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x55,
 593		0x53, 0x42, 0x32, 0x2E, 0x30, 0x20, 0x20, 0x43, 0x61,
 594		0x72, 0x64, 0x52, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20,
 595		0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x31, 0x30, 0x30 };
 596
 597	usb_stor_set_xfer_buf(data_ptr, 36, srb);
 598	return USB_STOR_TRANSPORT_GOOD;
 599}
 600
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 601static int sd_scsi_mode_sense(struct us_data *us, struct scsi_cmnd *srb)
 602{
 603	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
 604	unsigned char mediaNoWP[12] = {
 605		0x0b, 0x00, 0x00, 0x08, 0x00, 0x00,
 606		0x71, 0xc0, 0x00, 0x00, 0x02, 0x00 };
 607	unsigned char mediaWP[12]   = {
 608		0x0b, 0x00, 0x80, 0x08, 0x00, 0x00,
 609		0x71, 0xc0, 0x00, 0x00, 0x02, 0x00 };
 610
 611	if (info->SD_Status.WtP)
 612		usb_stor_set_xfer_buf(mediaWP, 12, srb);
 613	else
 614		usb_stor_set_xfer_buf(mediaNoWP, 12, srb);
 615
 616
 617	return USB_STOR_TRANSPORT_GOOD;
 618}
 619
 620static int sd_scsi_read_capacity(struct us_data *us, struct scsi_cmnd *srb)
 621{
 622	u32	bl_num;
 623	u32	bl_len;
 624	unsigned int offset = 0;
 625	unsigned char    buf[8];
 626	struct scatterlist *sg = NULL;
 627	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
 628
 629	usb_stor_dbg(us, "sd_scsi_read_capacity\n");
 630	if (info->SD_Status.HiCapacity) {
 631		bl_len = 0x200;
 632		if (info->SD_Status.IsMMC)
 633			bl_num = info->HC_C_SIZE-1;
 634		else
 635			bl_num = (info->HC_C_SIZE + 1) * 1024 - 1;
 636	} else {
 637		bl_len = 1 << (info->SD_READ_BL_LEN);
 638		bl_num = info->SD_Block_Mult * (info->SD_C_SIZE + 1)
 639				* (1 << (info->SD_C_SIZE_MULT + 2)) - 1;
 640	}
 641	info->bl_num = bl_num;
 642	usb_stor_dbg(us, "bl_len = %x\n", bl_len);
 643	usb_stor_dbg(us, "bl_num = %x\n", bl_num);
 644
 645	/*srb->request_bufflen = 8; */
 646	buf[0] = (bl_num >> 24) & 0xff;
 647	buf[1] = (bl_num >> 16) & 0xff;
 648	buf[2] = (bl_num >> 8) & 0xff;
 649	buf[3] = (bl_num >> 0) & 0xff;
 650	buf[4] = (bl_len >> 24) & 0xff;
 651	buf[5] = (bl_len >> 16) & 0xff;
 652	buf[6] = (bl_len >> 8) & 0xff;
 653	buf[7] = (bl_len >> 0) & 0xff;
 654
 655	usb_stor_access_xfer_buf(buf, 8, srb, &sg, &offset, TO_XFER_BUF);
 656
 657	return USB_STOR_TRANSPORT_GOOD;
 658}
 659
 660static int sd_scsi_read(struct us_data *us, struct scsi_cmnd *srb)
 661{
 662	int result;
 663	unsigned char *cdb = srb->cmnd;
 664	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
 665	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
 666
 667	u32 bn = ((cdb[2] << 24) & 0xff000000) | ((cdb[3] << 16) & 0x00ff0000) |
 668		 ((cdb[4] << 8) & 0x0000ff00) | ((cdb[5] << 0) & 0x000000ff);
 669	u16 blen = ((cdb[7] << 8) & 0xff00) | ((cdb[8] << 0) & 0x00ff);
 670	u32 bnByte = bn * 0x200;
 671	u32 blenByte = blen * 0x200;
 672
 673	if (bn > info->bl_num)
 674		return USB_STOR_TRANSPORT_ERROR;
 675
 676	result = ene_load_bincode(us, SD_RW_PATTERN);
 677	if (result != USB_STOR_XFER_GOOD) {
 678		usb_stor_dbg(us, "Load SD RW pattern Fail !!\n");
 679		return USB_STOR_TRANSPORT_ERROR;
 680	}
 681
 682	if (info->SD_Status.HiCapacity)
 683		bnByte = bn;
 684
 685	/* set up the command wrapper */
 686	memset(bcb, 0, sizeof(struct bulk_cb_wrap));
 687	bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
 688	bcb->DataTransferLength = blenByte;
 689	bcb->Flags  = US_BULK_FLAG_IN;
 690	bcb->CDB[0] = 0xF1;
 691	bcb->CDB[5] = (unsigned char)(bnByte);
 692	bcb->CDB[4] = (unsigned char)(bnByte>>8);
 693	bcb->CDB[3] = (unsigned char)(bnByte>>16);
 694	bcb->CDB[2] = (unsigned char)(bnByte>>24);
 695
 696	result = ene_send_scsi_cmd(us, FDIR_READ, scsi_sglist(srb), 1);
 697	return result;
 698}
 699
 700static int sd_scsi_write(struct us_data *us, struct scsi_cmnd *srb)
 701{
 702	int result;
 703	unsigned char *cdb = srb->cmnd;
 704	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
 705	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
 706
 707	u32 bn = ((cdb[2] << 24) & 0xff000000) | ((cdb[3] << 16) & 0x00ff0000) |
 708		 ((cdb[4] << 8) & 0x0000ff00) | ((cdb[5] << 0) & 0x000000ff);
 709	u16 blen = ((cdb[7] << 8) & 0xff00) | ((cdb[8] << 0) & 0x00ff);
 710	u32 bnByte = bn * 0x200;
 711	u32 blenByte = blen * 0x200;
 712
 713	if (bn > info->bl_num)
 714		return USB_STOR_TRANSPORT_ERROR;
 715
 716	result = ene_load_bincode(us, SD_RW_PATTERN);
 717	if (result != USB_STOR_XFER_GOOD) {
 718		usb_stor_dbg(us, "Load SD RW pattern Fail !!\n");
 719		return USB_STOR_TRANSPORT_ERROR;
 720	}
 721
 722	if (info->SD_Status.HiCapacity)
 723		bnByte = bn;
 724
 725	/* set up the command wrapper */
 726	memset(bcb, 0, sizeof(struct bulk_cb_wrap));
 727	bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
 728	bcb->DataTransferLength = blenByte;
 729	bcb->Flags  = 0x00;
 730	bcb->CDB[0] = 0xF0;
 731	bcb->CDB[5] = (unsigned char)(bnByte);
 732	bcb->CDB[4] = (unsigned char)(bnByte>>8);
 733	bcb->CDB[3] = (unsigned char)(bnByte>>16);
 734	bcb->CDB[2] = (unsigned char)(bnByte>>24);
 735
 736	result = ene_send_scsi_cmd(us, FDIR_WRITE, scsi_sglist(srb), 1);
 737	return result;
 738}
 739
 740/*
 741 * ENE MS Card
 742 */
 743
 744static int ms_lib_set_logicalpair(struct us_data *us, u16 logblk, u16 phyblk)
 745{
 746	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
 747
 748	if ((logblk >= info->MS_Lib.NumberOfLogBlock) || (phyblk >= info->MS_Lib.NumberOfPhyBlock))
 749		return (u32)-1;
 750
 751	info->MS_Lib.Phy2LogMap[phyblk] = logblk;
 752	info->MS_Lib.Log2PhyMap[logblk] = phyblk;
 753
 754	return 0;
 755}
 756
 757static int ms_lib_set_logicalblockmark(struct us_data *us, u16 phyblk, u16 mark)
 758{
 759	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
 760
 761	if (phyblk >= info->MS_Lib.NumberOfPhyBlock)
 762		return (u32)-1;
 763
 764	info->MS_Lib.Phy2LogMap[phyblk] = mark;
 765
 766	return 0;
 767}
 768
 769static int ms_lib_set_initialerrorblock(struct us_data *us, u16 phyblk)
 770{
 771	return ms_lib_set_logicalblockmark(us, phyblk, MS_LB_INITIAL_ERROR);
 772}
 773
 774static int ms_lib_set_bootblockmark(struct us_data *us, u16 phyblk)
 775{
 776	return ms_lib_set_logicalblockmark(us, phyblk, MS_LB_BOOT_BLOCK);
 777}
 778
 779static int ms_lib_free_logicalmap(struct us_data *us)
 780{
 781	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
 782
 783	kfree(info->MS_Lib.Phy2LogMap);
 784	info->MS_Lib.Phy2LogMap = NULL;
 785
 786	kfree(info->MS_Lib.Log2PhyMap);
 787	info->MS_Lib.Log2PhyMap = NULL;
 788
 789	return 0;
 790}
 791
 792static int ms_lib_alloc_logicalmap(struct us_data *us)
 793{
 794	u32  i;
 795	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
 796
 797	info->MS_Lib.Phy2LogMap = kmalloc(info->MS_Lib.NumberOfPhyBlock * sizeof(u16), GFP_KERNEL);
 798	info->MS_Lib.Log2PhyMap = kmalloc(info->MS_Lib.NumberOfLogBlock * sizeof(u16), GFP_KERNEL);
 
 
 
 
 799
 800	if ((info->MS_Lib.Phy2LogMap == NULL) || (info->MS_Lib.Log2PhyMap == NULL)) {
 801		ms_lib_free_logicalmap(us);
 802		return (u32)-1;
 803	}
 804
 805	for (i = 0; i < info->MS_Lib.NumberOfPhyBlock; i++)
 806		info->MS_Lib.Phy2LogMap[i] = MS_LB_NOT_USED;
 807
 808	for (i = 0; i < info->MS_Lib.NumberOfLogBlock; i++)
 809		info->MS_Lib.Log2PhyMap[i] = MS_LB_NOT_USED;
 810
 811	return 0;
 812}
 813
 814static void ms_lib_clear_writebuf(struct us_data *us)
 815{
 816	int i;
 817	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
 818
 819	info->MS_Lib.wrtblk = (u16)-1;
 820	ms_lib_clear_pagemap(info);
 821
 822	if (info->MS_Lib.blkpag)
 823		memset(info->MS_Lib.blkpag, 0xff, info->MS_Lib.PagesPerBlock * info->MS_Lib.BytesPerSector);
 824
 825	if (info->MS_Lib.blkext) {
 826		for (i = 0; i < info->MS_Lib.PagesPerBlock; i++) {
 827			info->MS_Lib.blkext[i].status1 = MS_REG_ST1_DEFAULT;
 828			info->MS_Lib.blkext[i].ovrflg = MS_REG_OVR_DEFAULT;
 829			info->MS_Lib.blkext[i].mngflg = MS_REG_MNG_DEFAULT;
 830			info->MS_Lib.blkext[i].logadr = MS_LB_NOT_USED;
 831		}
 832	}
 833}
 834
 835static int ms_count_freeblock(struct us_data *us, u16 PhyBlock)
 836{
 837	u32 Ende, Count;
 838	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
 839
 840	Ende = PhyBlock + MS_PHYSICAL_BLOCKS_PER_SEGMENT;
 841	for (Count = 0; PhyBlock < Ende; PhyBlock++) {
 842		switch (info->MS_Lib.Phy2LogMap[PhyBlock]) {
 843		case MS_LB_NOT_USED:
 844		case MS_LB_NOT_USED_ERASED:
 845			Count++;
 
 846		default:
 847			break;
 848		}
 849	}
 850
 851	return Count;
 852}
 853
 854static int ms_read_readpage(struct us_data *us, u32 PhyBlockAddr,
 855		u8 PageNum, u32 *PageBuf, struct ms_lib_type_extdat *ExtraDat)
 856{
 857	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
 
 
 858	int result;
 859	u8 ExtBuf[4];
 860	u32 bn = PhyBlockAddr * 0x20 + PageNum;
 861
 862	/* printk(KERN_INFO "MS --- MS_ReaderReadPage,
 863	PhyBlockAddr = %x, PageNum = %x\n", PhyBlockAddr, PageNum); */
 864
 865	result = ene_load_bincode(us, MS_RW_PATTERN);
 866	if (result != USB_STOR_XFER_GOOD)
 867		return USB_STOR_TRANSPORT_ERROR;
 868
 869	/* Read Page Data */
 870	memset(bcb, 0, sizeof(struct bulk_cb_wrap));
 871	bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
 872	bcb->DataTransferLength = 0x200;
 873	bcb->Flags      = US_BULK_FLAG_IN;
 874	bcb->CDB[0]     = 0xF1;
 875
 876	bcb->CDB[1]     = 0x02; /* in init.c ENE_MSInit() is 0x01 */
 877
 878	bcb->CDB[5]     = (unsigned char)(bn);
 879	bcb->CDB[4]     = (unsigned char)(bn>>8);
 880	bcb->CDB[3]     = (unsigned char)(bn>>16);
 881	bcb->CDB[2]     = (unsigned char)(bn>>24);
 882
 883	result = ene_send_scsi_cmd(us, FDIR_READ, PageBuf, 0);
 884	if (result != USB_STOR_XFER_GOOD)
 885		return USB_STOR_TRANSPORT_ERROR;
 886
 887
 888	/* Read Extra Data */
 889	memset(bcb, 0, sizeof(struct bulk_cb_wrap));
 890	bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
 891	bcb->DataTransferLength = 0x4;
 892	bcb->Flags      = US_BULK_FLAG_IN;
 893	bcb->CDB[0]     = 0xF1;
 894	bcb->CDB[1]     = 0x03;
 895
 896	bcb->CDB[5]     = (unsigned char)(PageNum);
 897	bcb->CDB[4]     = (unsigned char)(PhyBlockAddr);
 898	bcb->CDB[3]     = (unsigned char)(PhyBlockAddr>>8);
 899	bcb->CDB[2]     = (unsigned char)(PhyBlockAddr>>16);
 900	bcb->CDB[6]     = 0x01;
 901
 902	result = ene_send_scsi_cmd(us, FDIR_READ, &ExtBuf, 0);
 903	if (result != USB_STOR_XFER_GOOD)
 904		return USB_STOR_TRANSPORT_ERROR;
 905
 906	ExtraDat->reserved = 0;
 907	ExtraDat->intr     = 0x80;  /* Not yet,fireware support */
 908	ExtraDat->status0  = 0x10;  /* Not yet,fireware support */
 909
 910	ExtraDat->status1  = 0x00;  /* Not yet,fireware support */
 911	ExtraDat->ovrflg   = ExtBuf[0];
 912	ExtraDat->mngflg   = ExtBuf[1];
 913	ExtraDat->logadr   = memstick_logaddr(ExtBuf[2], ExtBuf[3]);
 914
 915	return USB_STOR_TRANSPORT_GOOD;
 916}
 917
 918static int ms_lib_process_bootblock(struct us_data *us, u16 PhyBlock, u8 *PageData)
 919{
 920	struct ms_bootblock_sysent *SysEntry;
 921	struct ms_bootblock_sysinf *SysInfo;
 922	u32 i, result;
 923	u8 PageNumber;
 924	u8 *PageBuffer;
 925	struct ms_lib_type_extdat ExtraData;
 926	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
 927
 928	PageBuffer = kmalloc(MS_BYTES_PER_PAGE, GFP_KERNEL);
 929	if (PageBuffer == NULL)
 930		return (u32)-1;
 931
 932	result = (u32)-1;
 933
 934	SysInfo = &(((struct ms_bootblock_page0 *)PageData)->sysinf);
 935
 936	if ((SysInfo->bMsClass != MS_SYSINF_MSCLASS_TYPE_1) ||
 937		(be16_to_cpu(SysInfo->wPageSize) != MS_SYSINF_PAGE_SIZE) ||
 938		((SysInfo->bSecuritySupport & MS_SYSINF_SECURITY) == MS_SYSINF_SECURITY_SUPPORT) ||
 939		(SysInfo->bReserved1 != MS_SYSINF_RESERVED1) ||
 940		(SysInfo->bReserved2 != MS_SYSINF_RESERVED2) ||
 941		(SysInfo->bFormatType != MS_SYSINF_FORMAT_FAT) ||
 942		(SysInfo->bUsage != MS_SYSINF_USAGE_GENERAL))
 943		goto exit;
 944		/* */
 945	switch (info->MS_Lib.cardType = SysInfo->bCardType) {
 946	case MS_SYSINF_CARDTYPE_RDONLY:
 947		ms_lib_ctrl_set(info, MS_LIB_CTRL_RDONLY);
 948		break;
 949	case MS_SYSINF_CARDTYPE_RDWR:
 950		ms_lib_ctrl_reset(info, MS_LIB_CTRL_RDONLY);
 951		break;
 952	case MS_SYSINF_CARDTYPE_HYBRID:
 953	default:
 954		goto exit;
 955	}
 956
 957	info->MS_Lib.blockSize = be16_to_cpu(SysInfo->wBlockSize);
 958	info->MS_Lib.NumberOfPhyBlock = be16_to_cpu(SysInfo->wBlockNumber);
 959	info->MS_Lib.NumberOfLogBlock = be16_to_cpu(SysInfo->wTotalBlockNumber)-2;
 960	info->MS_Lib.PagesPerBlock = info->MS_Lib.blockSize * SIZE_OF_KIRO / MS_BYTES_PER_PAGE;
 961	info->MS_Lib.NumberOfSegment = info->MS_Lib.NumberOfPhyBlock / MS_PHYSICAL_BLOCKS_PER_SEGMENT;
 962	info->MS_Model = be16_to_cpu(SysInfo->wMemorySize);
 963
 964	/*Allocate to all number of logicalblock and physicalblock */
 965	if (ms_lib_alloc_logicalmap(us))
 966		goto exit;
 967
 968	/* Mark the book block */
 969	ms_lib_set_bootblockmark(us, PhyBlock);
 970
 971	SysEntry = &(((struct ms_bootblock_page0 *)PageData)->sysent);
 972
 973	for (i = 0; i < MS_NUMBER_OF_SYSTEM_ENTRY; i++) {
 974		u32  EntryOffset, EntrySize;
 975
 976		EntryOffset = be32_to_cpu(SysEntry->entry[i].dwStart);
 977
 978		if (EntryOffset == 0xffffff)
 979			continue;
 980		EntrySize = be32_to_cpu(SysEntry->entry[i].dwSize);
 981
 982		if (EntrySize == 0)
 983			continue;
 984
 985		if (EntryOffset + MS_BYTES_PER_PAGE + EntrySize > info->MS_Lib.blockSize * (u32)SIZE_OF_KIRO)
 986			continue;
 987
 988		if (i == 0) {
 989			u8 PrevPageNumber = 0;
 990			u16 phyblk;
 991
 992			if (SysEntry->entry[i].bType != MS_SYSENT_TYPE_INVALID_BLOCK)
 993				goto exit;
 994
 995			while (EntrySize > 0) {
 996
 997				PageNumber = (u8)(EntryOffset / MS_BYTES_PER_PAGE + 1);
 998				if (PageNumber != PrevPageNumber) {
 999					switch (ms_read_readpage(us, PhyBlock, PageNumber, (u32 *)PageBuffer, &ExtraData)) {
1000					case MS_STATUS_SUCCESS:
1001						break;
1002					case MS_STATUS_WRITE_PROTECT:
1003					case MS_ERROR_FLASH_READ:
1004					case MS_STATUS_ERROR:
1005					default:
1006						goto exit;
1007					}
1008
1009					PrevPageNumber = PageNumber;
1010				}
1011
1012				phyblk = be16_to_cpu(*(u16 *)(PageBuffer + (EntryOffset % MS_BYTES_PER_PAGE)));
1013				if (phyblk < 0x0fff)
1014					ms_lib_set_initialerrorblock(us, phyblk);
1015
1016				EntryOffset += 2;
1017				EntrySize -= 2;
1018			}
1019		} else if (i == 1) {  /* CIS/IDI */
1020			struct ms_bootblock_idi *idi;
1021
1022			if (SysEntry->entry[i].bType != MS_SYSENT_TYPE_CIS_IDI)
1023				goto exit;
1024
1025			switch (ms_read_readpage(us, PhyBlock, (u8)(EntryOffset / MS_BYTES_PER_PAGE + 1), (u32 *)PageBuffer, &ExtraData)) {
1026			case MS_STATUS_SUCCESS:
1027				break;
1028			case MS_STATUS_WRITE_PROTECT:
1029			case MS_ERROR_FLASH_READ:
1030			case MS_STATUS_ERROR:
1031			default:
1032				goto exit;
1033			}
1034
1035			idi = &((struct ms_bootblock_cis_idi *)(PageBuffer + (EntryOffset % MS_BYTES_PER_PAGE)))->idi.idi;
1036			if (le16_to_cpu(idi->wIDIgeneralConfiguration) != MS_IDI_GENERAL_CONF)
1037				goto exit;
1038
1039			info->MS_Lib.BytesPerSector = le16_to_cpu(idi->wIDIbytesPerSector);
1040			if (info->MS_Lib.BytesPerSector != MS_BYTES_PER_PAGE)
1041				goto exit;
1042		}
1043	} /* End for .. */
1044
1045	result = 0;
1046
1047exit:
1048	if (result)
1049		ms_lib_free_logicalmap(us);
1050
1051	kfree(PageBuffer);
1052
1053	result = 0;
1054	return result;
1055}
1056
1057static void ms_lib_free_writebuf(struct us_data *us)
1058{
1059	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1060	info->MS_Lib.wrtblk = (u16)-1; /* set to -1 */
1061
1062	/* memset((fdoExt)->MS_Lib.pagemap, 0, sizeof((fdoExt)->MS_Lib.pagemap)) */
1063
1064	ms_lib_clear_pagemap(info); /* (pdx)->MS_Lib.pagemap memset 0 in ms.h */
1065
1066	if (info->MS_Lib.blkpag) {
1067		kfree((u8 *)(info->MS_Lib.blkpag));  /* Arnold test ... */
1068		info->MS_Lib.blkpag = NULL;
1069	}
1070
1071	if (info->MS_Lib.blkext) {
1072		kfree((u8 *)(info->MS_Lib.blkext));  /* Arnold test ... */
1073		info->MS_Lib.blkext = NULL;
1074	}
1075}
1076
1077
1078static void ms_lib_free_allocatedarea(struct us_data *us)
1079{
1080	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1081
1082	ms_lib_free_writebuf(us); /* Free MS_Lib.pagemap */
1083	ms_lib_free_logicalmap(us); /* kfree MS_Lib.Phy2LogMap and MS_Lib.Log2PhyMap */
1084
1085	/* set struct us point flag to 0 */
1086	info->MS_Lib.flags = 0;
1087	info->MS_Lib.BytesPerSector = 0;
1088	info->MS_Lib.SectorsPerCylinder = 0;
1089
1090	info->MS_Lib.cardType = 0;
1091	info->MS_Lib.blockSize = 0;
1092	info->MS_Lib.PagesPerBlock = 0;
1093
1094	info->MS_Lib.NumberOfPhyBlock = 0;
1095	info->MS_Lib.NumberOfLogBlock = 0;
1096}
1097
1098
1099static int ms_lib_alloc_writebuf(struct us_data *us)
1100{
1101	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1102
1103	info->MS_Lib.wrtblk = (u16)-1;
1104
1105	info->MS_Lib.blkpag = kmalloc(info->MS_Lib.PagesPerBlock * info->MS_Lib.BytesPerSector, GFP_KERNEL);
1106	info->MS_Lib.blkext = kmalloc(info->MS_Lib.PagesPerBlock * sizeof(struct ms_lib_type_extdat), GFP_KERNEL);
 
 
 
 
1107
1108	if ((info->MS_Lib.blkpag == NULL) || (info->MS_Lib.blkext == NULL)) {
1109		ms_lib_free_writebuf(us);
1110		return (u32)-1;
1111	}
1112
1113	ms_lib_clear_writebuf(us);
1114
1115return 0;
1116}
1117
1118static int ms_lib_force_setlogical_pair(struct us_data *us, u16 logblk, u16 phyblk)
1119{
1120	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1121
1122	if (logblk == MS_LB_NOT_USED)
1123		return 0;
1124
1125	if ((logblk >= info->MS_Lib.NumberOfLogBlock) ||
1126		(phyblk >= info->MS_Lib.NumberOfPhyBlock))
1127		return (u32)-1;
1128
1129	info->MS_Lib.Phy2LogMap[phyblk] = logblk;
1130	info->MS_Lib.Log2PhyMap[logblk] = phyblk;
1131
1132	return 0;
1133}
1134
1135static int ms_read_copyblock(struct us_data *us, u16 oldphy, u16 newphy,
1136			u16 PhyBlockAddr, u8 PageNum, unsigned char *buf, u16 len)
1137{
1138	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1139	int result;
1140
1141	/* printk(KERN_INFO "MS_ReaderCopyBlock --- PhyBlockAddr = %x,
1142		PageNum = %x\n", PhyBlockAddr, PageNum); */
1143	result = ene_load_bincode(us, MS_RW_PATTERN);
1144	if (result != USB_STOR_XFER_GOOD)
1145		return USB_STOR_TRANSPORT_ERROR;
1146
1147	memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1148	bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1149	bcb->DataTransferLength = 0x200*len;
1150	bcb->Flags = 0x00;
1151	bcb->CDB[0] = 0xF0;
1152	bcb->CDB[1] = 0x08;
1153	bcb->CDB[4] = (unsigned char)(oldphy);
1154	bcb->CDB[3] = (unsigned char)(oldphy>>8);
1155	bcb->CDB[2] = 0; /* (BYTE)(oldphy>>16) */
1156	bcb->CDB[7] = (unsigned char)(newphy);
1157	bcb->CDB[6] = (unsigned char)(newphy>>8);
1158	bcb->CDB[5] = 0; /* (BYTE)(newphy>>16) */
1159	bcb->CDB[9] = (unsigned char)(PhyBlockAddr);
1160	bcb->CDB[8] = (unsigned char)(PhyBlockAddr>>8);
1161	bcb->CDB[10] = PageNum;
1162
1163	result = ene_send_scsi_cmd(us, FDIR_WRITE, buf, 0);
1164	if (result != USB_STOR_XFER_GOOD)
1165		return USB_STOR_TRANSPORT_ERROR;
1166
1167	return USB_STOR_TRANSPORT_GOOD;
1168}
1169
1170static int ms_read_eraseblock(struct us_data *us, u32 PhyBlockAddr)
1171{
1172	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1173	int result;
1174	u32 bn = PhyBlockAddr;
1175
1176	/* printk(KERN_INFO "MS --- ms_read_eraseblock,
1177			PhyBlockAddr = %x\n", PhyBlockAddr); */
1178	result = ene_load_bincode(us, MS_RW_PATTERN);
1179	if (result != USB_STOR_XFER_GOOD)
1180		return USB_STOR_TRANSPORT_ERROR;
1181
1182	memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1183	bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1184	bcb->DataTransferLength = 0x200;
1185	bcb->Flags = US_BULK_FLAG_IN;
1186	bcb->CDB[0] = 0xF2;
1187	bcb->CDB[1] = 0x06;
1188	bcb->CDB[4] = (unsigned char)(bn);
1189	bcb->CDB[3] = (unsigned char)(bn>>8);
1190	bcb->CDB[2] = (unsigned char)(bn>>16);
1191
1192	result = ene_send_scsi_cmd(us, FDIR_READ, NULL, 0);
1193	if (result != USB_STOR_XFER_GOOD)
1194		return USB_STOR_TRANSPORT_ERROR;
1195
1196	return USB_STOR_TRANSPORT_GOOD;
1197}
1198
1199static int ms_lib_check_disableblock(struct us_data *us, u16 PhyBlock)
1200{
1201	unsigned char *PageBuf = NULL;
1202	u16 result = MS_STATUS_SUCCESS;
1203	u16 blk, index = 0;
1204	struct ms_lib_type_extdat extdat;
1205	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1206
1207	PageBuf = kmalloc(MS_BYTES_PER_PAGE, GFP_KERNEL);
1208	if (PageBuf == NULL) {
1209		result = MS_NO_MEMORY_ERROR;
1210		goto exit;
1211	}
1212
1213	ms_read_readpage(us, PhyBlock, 1, (u32 *)PageBuf, &extdat);
1214	do {
1215		blk = be16_to_cpu(PageBuf[index]);
1216		if (blk == MS_LB_NOT_USED)
1217			break;
1218		if (blk == info->MS_Lib.Log2PhyMap[0]) {
1219			result = MS_ERROR_FLASH_READ;
1220			break;
1221		}
1222		index++;
1223	} while (1);
1224
1225exit:
1226	kfree(PageBuf);
1227	return result;
1228}
1229
1230static int ms_lib_setacquired_errorblock(struct us_data *us, u16 phyblk)
1231{
1232	u16 log;
1233	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1234
1235	if (phyblk >= info->MS_Lib.NumberOfPhyBlock)
1236		return (u32)-1;
1237
1238	log = info->MS_Lib.Phy2LogMap[phyblk];
1239
1240	if (log < info->MS_Lib.NumberOfLogBlock)
1241		info->MS_Lib.Log2PhyMap[log] = MS_LB_NOT_USED;
1242
1243	if (info->MS_Lib.Phy2LogMap[phyblk] != MS_LB_INITIAL_ERROR)
1244		info->MS_Lib.Phy2LogMap[phyblk] = MS_LB_ACQUIRED_ERROR;
1245
1246	return 0;
1247}
1248
1249static int ms_lib_overwrite_extra(struct us_data *us, u32 PhyBlockAddr,
1250				u8 PageNum, u8 OverwriteFlag)
1251{
1252	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1253	int result;
1254
1255	/* printk("MS --- MS_LibOverwriteExtra,
1256		PhyBlockAddr = %x, PageNum = %x\n", PhyBlockAddr, PageNum); */
1257	result = ene_load_bincode(us, MS_RW_PATTERN);
1258	if (result != USB_STOR_XFER_GOOD)
1259		return USB_STOR_TRANSPORT_ERROR;
1260
1261	memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1262	bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1263	bcb->DataTransferLength = 0x4;
1264	bcb->Flags = US_BULK_FLAG_IN;
1265	bcb->CDB[0] = 0xF2;
1266	bcb->CDB[1] = 0x05;
1267	bcb->CDB[5] = (unsigned char)(PageNum);
1268	bcb->CDB[4] = (unsigned char)(PhyBlockAddr);
1269	bcb->CDB[3] = (unsigned char)(PhyBlockAddr>>8);
1270	bcb->CDB[2] = (unsigned char)(PhyBlockAddr>>16);
1271	bcb->CDB[6] = OverwriteFlag;
1272	bcb->CDB[7] = 0xFF;
1273	bcb->CDB[8] = 0xFF;
1274	bcb->CDB[9] = 0xFF;
1275
1276	result = ene_send_scsi_cmd(us, FDIR_READ, NULL, 0);
1277	if (result != USB_STOR_XFER_GOOD)
1278		return USB_STOR_TRANSPORT_ERROR;
1279
1280	return USB_STOR_TRANSPORT_GOOD;
1281}
1282
1283static int ms_lib_error_phyblock(struct us_data *us, u16 phyblk)
1284{
1285	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1286
1287	if (phyblk >= info->MS_Lib.NumberOfPhyBlock)
1288		return MS_STATUS_ERROR;
1289
1290	ms_lib_setacquired_errorblock(us, phyblk);
1291
1292	if (ms_lib_iswritable(info))
1293		return ms_lib_overwrite_extra(us, phyblk, 0, (u8)(~MS_REG_OVR_BKST & BYTE_MASK));
1294
1295	return MS_STATUS_SUCCESS;
1296}
1297
1298static int ms_lib_erase_phyblock(struct us_data *us, u16 phyblk)
1299{
1300	u16 log;
1301	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1302
1303	if (phyblk >= info->MS_Lib.NumberOfPhyBlock)
1304		return MS_STATUS_ERROR;
1305
1306	log = info->MS_Lib.Phy2LogMap[phyblk];
1307
1308	if (log < info->MS_Lib.NumberOfLogBlock)
1309		info->MS_Lib.Log2PhyMap[log] = MS_LB_NOT_USED;
1310
1311	info->MS_Lib.Phy2LogMap[phyblk] = MS_LB_NOT_USED;
1312
1313	if (ms_lib_iswritable(info)) {
1314		switch (ms_read_eraseblock(us, phyblk)) {
1315		case MS_STATUS_SUCCESS:
1316			info->MS_Lib.Phy2LogMap[phyblk] = MS_LB_NOT_USED_ERASED;
1317			return MS_STATUS_SUCCESS;
1318		case MS_ERROR_FLASH_ERASE:
1319		case MS_STATUS_INT_ERROR:
1320			ms_lib_error_phyblock(us, phyblk);
1321			return MS_ERROR_FLASH_ERASE;
1322		case MS_STATUS_ERROR:
1323		default:
1324			ms_lib_ctrl_set(info, MS_LIB_CTRL_RDONLY); /* MS_LibCtrlSet will used by ENE_MSInit ,need check, and why us to info*/
1325			ms_lib_setacquired_errorblock(us, phyblk);
1326			return MS_STATUS_ERROR;
1327		}
1328	}
1329
1330	ms_lib_setacquired_errorblock(us, phyblk);
1331
1332	return MS_STATUS_SUCCESS;
1333}
1334
1335static int ms_lib_read_extra(struct us_data *us, u32 PhyBlock,
1336				u8 PageNum, struct ms_lib_type_extdat *ExtraDat)
1337{
1338	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
 
 
1339	int result;
1340	u8 ExtBuf[4];
1341
1342	/* printk("MS_LibReadExtra --- PhyBlock = %x, PageNum = %x\n", PhyBlock, PageNum); */
1343	memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1344	bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1345	bcb->DataTransferLength = 0x4;
1346	bcb->Flags      = US_BULK_FLAG_IN;
1347	bcb->CDB[0]     = 0xF1;
1348	bcb->CDB[1]     = 0x03;
1349	bcb->CDB[5]     = (unsigned char)(PageNum);
1350	bcb->CDB[4]     = (unsigned char)(PhyBlock);
1351	bcb->CDB[3]     = (unsigned char)(PhyBlock>>8);
1352	bcb->CDB[2]     = (unsigned char)(PhyBlock>>16);
1353	bcb->CDB[6]     = 0x01;
1354
1355	result = ene_send_scsi_cmd(us, FDIR_READ, &ExtBuf, 0);
1356	if (result != USB_STOR_XFER_GOOD)
1357		return USB_STOR_TRANSPORT_ERROR;
1358
1359	ExtraDat->reserved = 0;
1360	ExtraDat->intr     = 0x80;  /* Not yet, waiting for fireware support */
1361	ExtraDat->status0  = 0x10;  /* Not yet, waiting for fireware support */
1362	ExtraDat->status1  = 0x00;  /* Not yet, waiting for fireware support */
1363	ExtraDat->ovrflg   = ExtBuf[0];
1364	ExtraDat->mngflg   = ExtBuf[1];
1365	ExtraDat->logadr   = memstick_logaddr(ExtBuf[2], ExtBuf[3]);
1366
1367	return USB_STOR_TRANSPORT_GOOD;
1368}
1369
1370static int ms_libsearch_block_from_physical(struct us_data *us, u16 phyblk)
1371{
1372	u16 Newblk;
1373	u16 blk;
1374	struct ms_lib_type_extdat extdat; /* need check */
1375	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1376
1377
1378	if (phyblk >= info->MS_Lib.NumberOfPhyBlock)
1379		return MS_LB_ERROR;
1380
1381	for (blk = phyblk + 1; blk != phyblk; blk++) {
1382		if ((blk & MS_PHYSICAL_BLOCKS_PER_SEGMENT_MASK) == 0)
1383			blk -= MS_PHYSICAL_BLOCKS_PER_SEGMENT;
1384
1385		Newblk = info->MS_Lib.Phy2LogMap[blk];
1386		if (info->MS_Lib.Phy2LogMap[blk] == MS_LB_NOT_USED_ERASED) {
1387			return blk;
1388		} else if (info->MS_Lib.Phy2LogMap[blk] == MS_LB_NOT_USED) {
1389			switch (ms_lib_read_extra(us, blk, 0, &extdat)) {
1390			case MS_STATUS_SUCCESS:
1391			case MS_STATUS_SUCCESS_WITH_ECC:
1392				break;
1393			case MS_NOCARD_ERROR:
1394				return MS_NOCARD_ERROR;
1395			case MS_STATUS_INT_ERROR:
1396				return MS_LB_ERROR;
1397			case MS_ERROR_FLASH_READ:
1398			default:
1399				ms_lib_setacquired_errorblock(us, blk);
1400				continue;
1401			} /* End switch */
1402
1403			if ((extdat.ovrflg & MS_REG_OVR_BKST) != MS_REG_OVR_BKST_OK) {
1404				ms_lib_setacquired_errorblock(us, blk);
1405				continue;
1406			}
1407
1408			switch (ms_lib_erase_phyblock(us, blk)) {
1409			case MS_STATUS_SUCCESS:
1410				return blk;
1411			case MS_STATUS_ERROR:
1412				return MS_LB_ERROR;
1413			case MS_ERROR_FLASH_ERASE:
1414			default:
1415				ms_lib_error_phyblock(us, blk);
1416				break;
1417			}
1418		}
1419	} /* End for */
1420
1421	return MS_LB_ERROR;
1422}
1423static int ms_libsearch_block_from_logical(struct us_data *us, u16 logblk)
1424{
1425	u16 phyblk;
1426	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1427
1428	phyblk = ms_libconv_to_physical(info, logblk);
1429	if (phyblk >= MS_LB_ERROR) {
1430		if (logblk >= info->MS_Lib.NumberOfLogBlock)
1431			return MS_LB_ERROR;
1432
1433		phyblk = (logblk + MS_NUMBER_OF_BOOT_BLOCK) / MS_LOGICAL_BLOCKS_PER_SEGMENT;
1434		phyblk *= MS_PHYSICAL_BLOCKS_PER_SEGMENT;
1435		phyblk += MS_PHYSICAL_BLOCKS_PER_SEGMENT - 1;
1436	}
1437
1438	return ms_libsearch_block_from_physical(us, phyblk);
1439}
1440
1441static int ms_scsi_test_unit_ready(struct us_data *us, struct scsi_cmnd *srb)
1442{
1443	struct ene_ub6250_info *info = (struct ene_ub6250_info *)(us->extra);
1444
1445	/* pr_info("MS_SCSI_Test_Unit_Ready\n"); */
1446	if (info->MS_Status.Insert && info->MS_Status.Ready) {
1447		return USB_STOR_TRANSPORT_GOOD;
1448	} else {
1449		ene_ms_init(us);
1450		return USB_STOR_TRANSPORT_GOOD;
1451	}
1452
1453	return USB_STOR_TRANSPORT_GOOD;
1454}
1455
1456static int ms_scsi_inquiry(struct us_data *us, struct scsi_cmnd *srb)
1457{
1458	/* pr_info("MS_SCSI_Inquiry\n"); */
1459	unsigned char data_ptr[36] = {
1460		0x00, 0x80, 0x02, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x55,
1461		0x53, 0x42, 0x32, 0x2E, 0x30, 0x20, 0x20, 0x43, 0x61,
1462		0x72, 0x64, 0x52, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20,
1463		0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x31, 0x30, 0x30};
1464
1465	usb_stor_set_xfer_buf(data_ptr, 36, srb);
1466	return USB_STOR_TRANSPORT_GOOD;
1467}
1468
1469static int ms_scsi_mode_sense(struct us_data *us, struct scsi_cmnd *srb)
1470{
1471	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1472	unsigned char mediaNoWP[12] = {
1473		0x0b, 0x00, 0x00, 0x08, 0x00, 0x00,
1474		0x71, 0xc0, 0x00, 0x00, 0x02, 0x00 };
1475	unsigned char mediaWP[12]   = {
1476		0x0b, 0x00, 0x80, 0x08, 0x00, 0x00,
1477		0x71, 0xc0, 0x00, 0x00, 0x02, 0x00 };
1478
1479	if (info->MS_Status.WtP)
1480		usb_stor_set_xfer_buf(mediaWP, 12, srb);
1481	else
1482		usb_stor_set_xfer_buf(mediaNoWP, 12, srb);
1483
1484	return USB_STOR_TRANSPORT_GOOD;
1485}
1486
1487static int ms_scsi_read_capacity(struct us_data *us, struct scsi_cmnd *srb)
1488{
1489	u32   bl_num;
1490	u16    bl_len;
1491	unsigned int offset = 0;
1492	unsigned char    buf[8];
1493	struct scatterlist *sg = NULL;
1494	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1495
1496	usb_stor_dbg(us, "ms_scsi_read_capacity\n");
1497	bl_len = 0x200;
1498	if (info->MS_Status.IsMSPro)
1499		bl_num = info->MSP_TotalBlock - 1;
1500	else
1501		bl_num = info->MS_Lib.NumberOfLogBlock * info->MS_Lib.blockSize * 2 - 1;
1502
1503	info->bl_num = bl_num;
1504	usb_stor_dbg(us, "bl_len = %x\n", bl_len);
1505	usb_stor_dbg(us, "bl_num = %x\n", bl_num);
1506
1507	/*srb->request_bufflen = 8; */
1508	buf[0] = (bl_num >> 24) & 0xff;
1509	buf[1] = (bl_num >> 16) & 0xff;
1510	buf[2] = (bl_num >> 8) & 0xff;
1511	buf[3] = (bl_num >> 0) & 0xff;
1512	buf[4] = (bl_len >> 24) & 0xff;
1513	buf[5] = (bl_len >> 16) & 0xff;
1514	buf[6] = (bl_len >> 8) & 0xff;
1515	buf[7] = (bl_len >> 0) & 0xff;
1516
1517	usb_stor_access_xfer_buf(buf, 8, srb, &sg, &offset, TO_XFER_BUF);
1518
1519	return USB_STOR_TRANSPORT_GOOD;
1520}
1521
1522static void ms_lib_phy_to_log_range(u16 PhyBlock, u16 *LogStart, u16 *LogEnde)
1523{
1524	PhyBlock /= MS_PHYSICAL_BLOCKS_PER_SEGMENT;
1525
1526	if (PhyBlock) {
1527		*LogStart = MS_LOGICAL_BLOCKS_IN_1ST_SEGMENT + (PhyBlock - 1) * MS_LOGICAL_BLOCKS_PER_SEGMENT;/*496*/
1528		*LogEnde = *LogStart + MS_LOGICAL_BLOCKS_PER_SEGMENT;/*496*/
1529	} else {
1530		*LogStart = 0;
1531		*LogEnde = MS_LOGICAL_BLOCKS_IN_1ST_SEGMENT;/*494*/
1532	}
1533}
1534
1535static int ms_lib_read_extrablock(struct us_data *us, u32 PhyBlock,
1536	u8 PageNum, u8 blen, void *buf)
1537{
1538	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1539	int     result;
1540
1541	/* printk("MS_LibReadExtraBlock --- PhyBlock = %x,
1542		PageNum = %x, blen = %x\n", PhyBlock, PageNum, blen); */
1543
1544	/* Read Extra Data */
1545	memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1546	bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1547	bcb->DataTransferLength = 0x4 * blen;
1548	bcb->Flags      = US_BULK_FLAG_IN;
1549	bcb->CDB[0]     = 0xF1;
1550	bcb->CDB[1]     = 0x03;
1551	bcb->CDB[5]     = (unsigned char)(PageNum);
1552	bcb->CDB[4]     = (unsigned char)(PhyBlock);
1553	bcb->CDB[3]     = (unsigned char)(PhyBlock>>8);
1554	bcb->CDB[2]     = (unsigned char)(PhyBlock>>16);
1555	bcb->CDB[6]     = blen;
1556
1557	result = ene_send_scsi_cmd(us, FDIR_READ, buf, 0);
1558	if (result != USB_STOR_XFER_GOOD)
1559		return USB_STOR_TRANSPORT_ERROR;
1560
1561	return USB_STOR_TRANSPORT_GOOD;
1562}
1563
1564static int ms_lib_scan_logicalblocknumber(struct us_data *us, u16 btBlk1st)
1565{
1566	u16 PhyBlock, newblk, i;
1567	u16 LogStart, LogEnde;
1568	struct ms_lib_type_extdat extdat;
1569	u8 buf[0x200];
1570	u32 count = 0, index = 0;
1571	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
 
1572
1573	for (PhyBlock = 0; PhyBlock < info->MS_Lib.NumberOfPhyBlock;) {
1574		ms_lib_phy_to_log_range(PhyBlock, &LogStart, &LogEnde);
1575
1576		for (i = 0; i < MS_PHYSICAL_BLOCKS_PER_SEGMENT; i++, PhyBlock++) {
1577			switch (ms_libconv_to_logical(info, PhyBlock)) {
1578			case MS_STATUS_ERROR:
1579				continue;
1580			default:
1581				break;
1582			}
1583
1584			if (count == PhyBlock) {
1585				ms_lib_read_extrablock(us, PhyBlock, 0, 0x80, &buf);
 
1586				count += 0x80;
1587			}
1588			index = (PhyBlock % 0x80) * 4;
1589
1590			extdat.ovrflg = buf[index];
1591			extdat.mngflg = buf[index+1];
1592			extdat.logadr = memstick_logaddr(buf[index+2], buf[index+3]);
 
1593
1594			if ((extdat.ovrflg & MS_REG_OVR_BKST) != MS_REG_OVR_BKST_OK) {
1595				ms_lib_setacquired_errorblock(us, PhyBlock);
1596				continue;
1597			}
1598
1599			if ((extdat.mngflg & MS_REG_MNG_ATFLG) == MS_REG_MNG_ATFLG_ATTBL) {
1600				ms_lib_erase_phyblock(us, PhyBlock);
1601				continue;
1602			}
1603
1604			if (extdat.logadr != MS_LB_NOT_USED) {
1605				if ((extdat.logadr < LogStart) || (LogEnde <= extdat.logadr)) {
1606					ms_lib_erase_phyblock(us, PhyBlock);
1607					continue;
1608				}
1609
1610				newblk = ms_libconv_to_physical(info, extdat.logadr);
1611
1612				if (newblk != MS_LB_NOT_USED) {
1613					if (extdat.logadr == 0) {
1614						ms_lib_set_logicalpair(us, extdat.logadr, PhyBlock);
1615						if (ms_lib_check_disableblock(us, btBlk1st)) {
1616							ms_lib_set_logicalpair(us, extdat.logadr, newblk);
1617							continue;
1618						}
1619					}
1620
1621					ms_lib_read_extra(us, newblk, 0, &extdat);
1622					if ((extdat.ovrflg & MS_REG_OVR_UDST) == MS_REG_OVR_UDST_UPDATING) {
1623						ms_lib_erase_phyblock(us, PhyBlock);
1624						continue;
1625					} else {
1626						ms_lib_erase_phyblock(us, newblk);
1627					}
1628				}
1629
1630				ms_lib_set_logicalpair(us, extdat.logadr, PhyBlock);
1631			}
1632		}
1633	} /* End for ... */
1634
1635	return MS_STATUS_SUCCESS;
1636}
1637
1638
1639static int ms_scsi_read(struct us_data *us, struct scsi_cmnd *srb)
1640{
1641	int result;
1642	unsigned char *cdb = srb->cmnd;
1643	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1644	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1645
1646	u32 bn = ((cdb[2] << 24) & 0xff000000) | ((cdb[3] << 16) & 0x00ff0000) |
1647		((cdb[4] << 8) & 0x0000ff00) | ((cdb[5] << 0) & 0x000000ff);
1648	u16 blen = ((cdb[7] << 8) & 0xff00) | ((cdb[8] << 0) & 0x00ff);
1649	u32 blenByte = blen * 0x200;
1650
1651	if (bn > info->bl_num)
1652		return USB_STOR_TRANSPORT_ERROR;
1653
1654	if (info->MS_Status.IsMSPro) {
1655		result = ene_load_bincode(us, MSP_RW_PATTERN);
1656		if (result != USB_STOR_XFER_GOOD) {
1657			usb_stor_dbg(us, "Load MPS RW pattern Fail !!\n");
1658			return USB_STOR_TRANSPORT_ERROR;
1659		}
1660
1661		/* set up the command wrapper */
1662		memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1663		bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1664		bcb->DataTransferLength = blenByte;
1665		bcb->Flags  = US_BULK_FLAG_IN;
1666		bcb->CDB[0] = 0xF1;
1667		bcb->CDB[1] = 0x02;
1668		bcb->CDB[5] = (unsigned char)(bn);
1669		bcb->CDB[4] = (unsigned char)(bn>>8);
1670		bcb->CDB[3] = (unsigned char)(bn>>16);
1671		bcb->CDB[2] = (unsigned char)(bn>>24);
1672
1673		result = ene_send_scsi_cmd(us, FDIR_READ, scsi_sglist(srb), 1);
1674	} else {
1675		void *buf;
1676		int offset = 0;
1677		u16 phyblk, logblk;
1678		u8 PageNum;
1679		u16 len;
1680		u32 blkno;
1681
1682		buf = kmalloc(blenByte, GFP_KERNEL);
1683		if (buf == NULL)
1684			return USB_STOR_TRANSPORT_ERROR;
1685
1686		result = ene_load_bincode(us, MS_RW_PATTERN);
1687		if (result != USB_STOR_XFER_GOOD) {
1688			pr_info("Load MS RW pattern Fail !!\n");
1689			result = USB_STOR_TRANSPORT_ERROR;
1690			goto exit;
1691		}
1692
1693		logblk  = (u16)(bn / info->MS_Lib.PagesPerBlock);
1694		PageNum = (u8)(bn % info->MS_Lib.PagesPerBlock);
1695
1696		while (1) {
1697			if (blen > (info->MS_Lib.PagesPerBlock-PageNum))
1698				len = info->MS_Lib.PagesPerBlock-PageNum;
1699			else
1700				len = blen;
1701
1702			phyblk = ms_libconv_to_physical(info, logblk);
1703			blkno  = phyblk * 0x20 + PageNum;
1704
1705			/* set up the command wrapper */
1706			memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1707			bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1708			bcb->DataTransferLength = 0x200 * len;
1709			bcb->Flags  = US_BULK_FLAG_IN;
1710			bcb->CDB[0] = 0xF1;
1711			bcb->CDB[1] = 0x02;
1712			bcb->CDB[5] = (unsigned char)(blkno);
1713			bcb->CDB[4] = (unsigned char)(blkno>>8);
1714			bcb->CDB[3] = (unsigned char)(blkno>>16);
1715			bcb->CDB[2] = (unsigned char)(blkno>>24);
1716
1717			result = ene_send_scsi_cmd(us, FDIR_READ, buf+offset, 0);
1718			if (result != USB_STOR_XFER_GOOD) {
1719				pr_info("MS_SCSI_Read --- result = %x\n", result);
1720				result = USB_STOR_TRANSPORT_ERROR;
1721				goto exit;
1722			}
1723
1724			blen -= len;
1725			if (blen <= 0)
1726				break;
1727			logblk++;
1728			PageNum = 0;
1729			offset += MS_BYTES_PER_PAGE*len;
1730		}
1731		usb_stor_set_xfer_buf(buf, blenByte, srb);
1732exit:
1733		kfree(buf);
1734	}
1735	return result;
1736}
1737
1738static int ms_scsi_write(struct us_data *us, struct scsi_cmnd *srb)
1739{
1740	int result;
1741	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1742	unsigned char *cdb = srb->cmnd;
1743	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1744
1745	u32 bn = ((cdb[2] << 24) & 0xff000000) |
1746			((cdb[3] << 16) & 0x00ff0000) |
1747			((cdb[4] << 8) & 0x0000ff00) |
1748			((cdb[5] << 0) & 0x000000ff);
1749	u16 blen = ((cdb[7] << 8) & 0xff00) | ((cdb[8] << 0) & 0x00ff);
1750	u32 blenByte = blen * 0x200;
1751
1752	if (bn > info->bl_num)
1753		return USB_STOR_TRANSPORT_ERROR;
1754
1755	if (info->MS_Status.IsMSPro) {
1756		result = ene_load_bincode(us, MSP_RW_PATTERN);
1757		if (result != USB_STOR_XFER_GOOD) {
1758			pr_info("Load MSP RW pattern Fail !!\n");
1759			return USB_STOR_TRANSPORT_ERROR;
1760		}
1761
1762		/* set up the command wrapper */
1763		memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1764		bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1765		bcb->DataTransferLength = blenByte;
1766		bcb->Flags  = 0x00;
1767		bcb->CDB[0] = 0xF0;
1768		bcb->CDB[1] = 0x04;
1769		bcb->CDB[5] = (unsigned char)(bn);
1770		bcb->CDB[4] = (unsigned char)(bn>>8);
1771		bcb->CDB[3] = (unsigned char)(bn>>16);
1772		bcb->CDB[2] = (unsigned char)(bn>>24);
1773
1774		result = ene_send_scsi_cmd(us, FDIR_WRITE, scsi_sglist(srb), 1);
1775	} else {
1776		void *buf;
1777		int offset = 0;
1778		u16 PhyBlockAddr;
1779		u8 PageNum;
1780		u16 len, oldphy, newphy;
1781
1782		buf = kmalloc(blenByte, GFP_KERNEL);
1783		if (buf == NULL)
1784			return USB_STOR_TRANSPORT_ERROR;
1785		usb_stor_set_xfer_buf(buf, blenByte, srb);
1786
1787		result = ene_load_bincode(us, MS_RW_PATTERN);
1788		if (result != USB_STOR_XFER_GOOD) {
1789			pr_info("Load MS RW pattern Fail !!\n");
1790			result = USB_STOR_TRANSPORT_ERROR;
1791			goto exit;
1792		}
1793
1794		PhyBlockAddr = (u16)(bn / info->MS_Lib.PagesPerBlock);
1795		PageNum      = (u8)(bn % info->MS_Lib.PagesPerBlock);
1796
1797		while (1) {
1798			if (blen > (info->MS_Lib.PagesPerBlock-PageNum))
1799				len = info->MS_Lib.PagesPerBlock-PageNum;
1800			else
1801				len = blen;
1802
1803			oldphy = ms_libconv_to_physical(info, PhyBlockAddr); /* need check us <-> info */
1804			newphy = ms_libsearch_block_from_logical(us, PhyBlockAddr);
1805
1806			result = ms_read_copyblock(us, oldphy, newphy, PhyBlockAddr, PageNum, buf+offset, len);
1807
1808			if (result != USB_STOR_XFER_GOOD) {
1809				pr_info("MS_SCSI_Write --- result = %x\n", result);
1810				result =  USB_STOR_TRANSPORT_ERROR;
1811				goto exit;
1812			}
1813
1814			info->MS_Lib.Phy2LogMap[oldphy] = MS_LB_NOT_USED_ERASED;
1815			ms_lib_force_setlogical_pair(us, PhyBlockAddr, newphy);
1816
1817			blen -= len;
1818			if (blen <= 0)
1819				break;
1820			PhyBlockAddr++;
1821			PageNum = 0;
1822			offset += MS_BYTES_PER_PAGE*len;
1823		}
1824exit:
1825		kfree(buf);
1826	}
1827	return result;
1828}
1829
1830/*
1831 * ENE MS Card
1832 */
1833
1834static int ene_get_card_type(struct us_data *us, u16 index, void *buf)
1835{
1836	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1837	int result;
1838
1839	memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1840	bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1841	bcb->DataTransferLength	= 0x01;
1842	bcb->Flags			= US_BULK_FLAG_IN;
1843	bcb->CDB[0]			= 0xED;
1844	bcb->CDB[2]			= (unsigned char)(index>>8);
1845	bcb->CDB[3]			= (unsigned char)index;
1846
1847	result = ene_send_scsi_cmd(us, FDIR_READ, buf, 0);
1848	return result;
1849}
1850
1851static int ene_get_card_status(struct us_data *us, u8 *buf)
1852{
1853	u16 tmpreg;
1854	u32 reg4b;
1855	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1856
1857	/*usb_stor_dbg(us, "transport --- ENE_ReadSDReg\n");*/
1858	reg4b = *(u32 *)&buf[0x18];
1859	info->SD_READ_BL_LEN = (u8)((reg4b >> 8) & 0x0f);
1860
1861	tmpreg = (u16) reg4b;
1862	reg4b = *(u32 *)(&buf[0x14]);
1863	if (info->SD_Status.HiCapacity && !info->SD_Status.IsMMC)
1864		info->HC_C_SIZE = (reg4b >> 8) & 0x3fffff;
1865
1866	info->SD_C_SIZE = ((tmpreg & 0x03) << 10) | (u16)(reg4b >> 22);
1867	info->SD_C_SIZE_MULT = (u8)(reg4b >> 7)  & 0x07;
1868	if (info->SD_Status.HiCapacity && info->SD_Status.IsMMC)
1869		info->HC_C_SIZE = *(u32 *)(&buf[0x100]);
1870
1871	if (info->SD_READ_BL_LEN > SD_BLOCK_LEN) {
1872		info->SD_Block_Mult = 1 << (info->SD_READ_BL_LEN-SD_BLOCK_LEN);
1873		info->SD_READ_BL_LEN = SD_BLOCK_LEN;
1874	} else {
1875		info->SD_Block_Mult = 1;
1876	}
1877
1878	return USB_STOR_TRANSPORT_GOOD;
1879}
1880
1881static int ene_load_bincode(struct us_data *us, unsigned char flag)
1882{
1883	int err;
1884	char *fw_name = NULL;
1885	unsigned char *buf = NULL;
1886	const struct firmware *sd_fw = NULL;
1887	int result = USB_STOR_TRANSPORT_ERROR;
1888	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1889	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1890
1891	if (info->BIN_FLAG == flag)
1892		return USB_STOR_TRANSPORT_GOOD;
1893
1894	switch (flag) {
1895	/* For SD */
1896	case SD_INIT1_PATTERN:
1897		usb_stor_dbg(us, "SD_INIT1_PATTERN\n");
1898		fw_name = SD_INIT1_FIRMWARE;
1899		break;
1900	case SD_INIT2_PATTERN:
1901		usb_stor_dbg(us, "SD_INIT2_PATTERN\n");
1902		fw_name = SD_INIT2_FIRMWARE;
1903		break;
1904	case SD_RW_PATTERN:
1905		usb_stor_dbg(us, "SD_RW_PATTERN\n");
1906		fw_name = SD_RW_FIRMWARE;
1907		break;
1908	/* For MS */
1909	case MS_INIT_PATTERN:
1910		usb_stor_dbg(us, "MS_INIT_PATTERN\n");
1911		fw_name = MS_INIT_FIRMWARE;
1912		break;
1913	case MSP_RW_PATTERN:
1914		usb_stor_dbg(us, "MSP_RW_PATTERN\n");
1915		fw_name = MSP_RW_FIRMWARE;
1916		break;
1917	case MS_RW_PATTERN:
1918		usb_stor_dbg(us, "MS_RW_PATTERN\n");
1919		fw_name = MS_RW_FIRMWARE;
1920		break;
1921	default:
1922		usb_stor_dbg(us, "----------- Unknown PATTERN ----------\n");
1923		goto nofw;
1924	}
1925
1926	err = request_firmware(&sd_fw, fw_name, &us->pusb_dev->dev);
1927	if (err) {
1928		usb_stor_dbg(us, "load firmware %s failed\n", fw_name);
1929		goto nofw;
1930	}
1931	buf = kmalloc(sd_fw->size, GFP_KERNEL);
1932	if (buf == NULL)
1933		goto nofw;
1934
1935	memcpy(buf, sd_fw->data, sd_fw->size);
1936	memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1937	bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1938	bcb->DataTransferLength = sd_fw->size;
1939	bcb->Flags = 0x00;
1940	bcb->CDB[0] = 0xEF;
1941
1942	result = ene_send_scsi_cmd(us, FDIR_WRITE, buf, 0);
 
 
1943	info->BIN_FLAG = flag;
1944	kfree(buf);
1945
1946nofw:
1947	release_firmware(sd_fw);
1948	return result;
1949}
1950
1951static int ms_card_init(struct us_data *us)
1952{
1953	u32 result;
1954	u16 TmpBlock;
1955	unsigned char *PageBuffer0 = NULL, *PageBuffer1 = NULL;
1956	struct ms_lib_type_extdat extdat;
1957	u16 btBlk1st, btBlk2nd;
1958	u32 btBlk1stErred;
1959	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1960
1961	printk(KERN_INFO "MS_CardInit start\n");
1962
1963	ms_lib_free_allocatedarea(us); /* Clean buffer and set struct us_data flag to 0 */
1964
1965	/* get two PageBuffer */
1966	PageBuffer0 = kmalloc(MS_BYTES_PER_PAGE, GFP_KERNEL);
1967	PageBuffer1 = kmalloc(MS_BYTES_PER_PAGE, GFP_KERNEL);
1968	if ((PageBuffer0 == NULL) || (PageBuffer1 == NULL)) {
1969		result = MS_NO_MEMORY_ERROR;
1970		goto exit;
1971	}
1972
1973	btBlk1st = btBlk2nd = MS_LB_NOT_USED;
1974	btBlk1stErred = 0;
1975
1976	for (TmpBlock = 0; TmpBlock < MS_MAX_INITIAL_ERROR_BLOCKS+2; TmpBlock++) {
1977
1978		switch (ms_read_readpage(us, TmpBlock, 0, (u32 *)PageBuffer0, &extdat)) {
1979		case MS_STATUS_SUCCESS:
1980			break;
1981		case MS_STATUS_INT_ERROR:
1982			break;
1983		case MS_STATUS_ERROR:
1984		default:
1985			continue;
1986		}
1987
1988		if ((extdat.ovrflg & MS_REG_OVR_BKST) == MS_REG_OVR_BKST_NG)
1989			continue;
1990
1991		if (((extdat.mngflg & MS_REG_MNG_SYSFLG) == MS_REG_MNG_SYSFLG_USER) ||
1992			(be16_to_cpu(((struct ms_bootblock_page0 *)PageBuffer0)->header.wBlockID) != MS_BOOT_BLOCK_ID) ||
1993			(be16_to_cpu(((struct ms_bootblock_page0 *)PageBuffer0)->header.wFormatVersion) != MS_BOOT_BLOCK_FORMAT_VERSION) ||
1994			(((struct ms_bootblock_page0 *)PageBuffer0)->header.bNumberOfDataEntry != MS_BOOT_BLOCK_DATA_ENTRIES))
1995				continue;
1996
1997		if (btBlk1st != MS_LB_NOT_USED) {
1998			btBlk2nd = TmpBlock;
1999			break;
2000		}
2001
2002		btBlk1st = TmpBlock;
2003		memcpy(PageBuffer1, PageBuffer0, MS_BYTES_PER_PAGE);
2004		if (extdat.status1 & (MS_REG_ST1_DTER | MS_REG_ST1_EXER | MS_REG_ST1_FGER))
2005			btBlk1stErred = 1;
2006	}
2007
2008	if (btBlk1st == MS_LB_NOT_USED) {
2009		result = MS_STATUS_ERROR;
2010		goto exit;
2011	}
2012
2013	/* write protect */
2014	if ((extdat.status0 & MS_REG_ST0_WP) == MS_REG_ST0_WP_ON)
2015		ms_lib_ctrl_set(info, MS_LIB_CTRL_WRPROTECT);
2016
2017	result = MS_STATUS_ERROR;
2018	/* 1st Boot Block */
2019	if (btBlk1stErred == 0)
2020		result = ms_lib_process_bootblock(us, btBlk1st, PageBuffer1);
2021		/* 1st */
2022	/* 2nd Boot Block */
2023	if (result && (btBlk2nd != MS_LB_NOT_USED))
2024		result = ms_lib_process_bootblock(us, btBlk2nd, PageBuffer0);
2025
2026	if (result) {
2027		result = MS_STATUS_ERROR;
2028		goto exit;
2029	}
2030
2031	for (TmpBlock = 0; TmpBlock < btBlk1st; TmpBlock++)
2032		info->MS_Lib.Phy2LogMap[TmpBlock] = MS_LB_INITIAL_ERROR;
2033
2034	info->MS_Lib.Phy2LogMap[btBlk1st] = MS_LB_BOOT_BLOCK;
2035
2036	if (btBlk2nd != MS_LB_NOT_USED) {
2037		for (TmpBlock = btBlk1st + 1; TmpBlock < btBlk2nd; TmpBlock++)
2038			info->MS_Lib.Phy2LogMap[TmpBlock] = MS_LB_INITIAL_ERROR;
2039
2040		info->MS_Lib.Phy2LogMap[btBlk2nd] = MS_LB_BOOT_BLOCK;
2041	}
2042
2043	result = ms_lib_scan_logicalblocknumber(us, btBlk1st);
2044	if (result)
2045		goto exit;
2046
2047	for (TmpBlock = MS_PHYSICAL_BLOCKS_PER_SEGMENT;
2048		TmpBlock < info->MS_Lib.NumberOfPhyBlock;
2049		TmpBlock += MS_PHYSICAL_BLOCKS_PER_SEGMENT) {
2050		if (ms_count_freeblock(us, TmpBlock) == 0) {
2051			ms_lib_ctrl_set(info, MS_LIB_CTRL_WRPROTECT);
2052			break;
2053		}
2054	}
2055
2056	/* write */
2057	if (ms_lib_alloc_writebuf(us)) {
2058		result = MS_NO_MEMORY_ERROR;
2059		goto exit;
2060	}
2061
2062	result = MS_STATUS_SUCCESS;
2063
2064exit:
2065	kfree(PageBuffer1);
2066	kfree(PageBuffer0);
2067
2068	printk(KERN_INFO "MS_CardInit end\n");
2069	return result;
2070}
2071
2072static int ene_ms_init(struct us_data *us)
2073{
2074	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
2075	int result;
2076	u8 buf[0x200];
2077	u16 MSP_BlockSize, MSP_UserAreaBlocks;
2078	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
 
 
2079
2080	printk(KERN_INFO "transport --- ENE_MSInit\n");
2081
2082	/* the same part to test ENE */
2083
2084	result = ene_load_bincode(us, MS_INIT_PATTERN);
2085	if (result != USB_STOR_XFER_GOOD) {
2086		printk(KERN_ERR "Load MS Init Code Fail !!\n");
2087		return USB_STOR_TRANSPORT_ERROR;
2088	}
2089
2090	memset(bcb, 0, sizeof(struct bulk_cb_wrap));
2091	bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
2092	bcb->DataTransferLength = 0x200;
2093	bcb->Flags      = US_BULK_FLAG_IN;
2094	bcb->CDB[0]     = 0xF1;
2095	bcb->CDB[1]     = 0x01;
2096
2097	result = ene_send_scsi_cmd(us, FDIR_READ, &buf, 0);
2098	if (result != USB_STOR_XFER_GOOD) {
2099		printk(KERN_ERR "Execution MS Init Code Fail !!\n");
2100		return USB_STOR_TRANSPORT_ERROR;
2101	}
2102	/* the same part to test ENE */
2103	info->MS_Status = *(struct MS_STATUS *)&buf[0];
2104
2105	if (info->MS_Status.Insert && info->MS_Status.Ready) {
2106		printk(KERN_INFO "Insert     = %x\n", info->MS_Status.Insert);
2107		printk(KERN_INFO "Ready      = %x\n", info->MS_Status.Ready);
2108		printk(KERN_INFO "IsMSPro    = %x\n", info->MS_Status.IsMSPro);
2109		printk(KERN_INFO "IsMSPHG    = %x\n", info->MS_Status.IsMSPHG);
2110		printk(KERN_INFO "WtP= %x\n", info->MS_Status.WtP);
2111		if (info->MS_Status.IsMSPro) {
2112			MSP_BlockSize      = (buf[6] << 8) | buf[7];
2113			MSP_UserAreaBlocks = (buf[10] << 8) | buf[11];
 
2114			info->MSP_TotalBlock = MSP_BlockSize * MSP_UserAreaBlocks;
2115		} else {
2116			ms_card_init(us); /* Card is MS (to ms.c)*/
2117		}
2118		usb_stor_dbg(us, "MS Init Code OK !!\n");
2119	} else {
2120		usb_stor_dbg(us, "MS Card Not Ready --- %x\n", buf[0]);
2121		return USB_STOR_TRANSPORT_ERROR;
2122	}
2123
2124	return USB_STOR_TRANSPORT_GOOD;
2125}
2126
2127static int ene_sd_init(struct us_data *us)
2128{
2129	int result;
2130	u8  buf[0x200];
2131	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
2132	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
 
2133
2134	usb_stor_dbg(us, "transport --- ENE_SDInit\n");
2135	/* SD Init Part-1 */
2136	result = ene_load_bincode(us, SD_INIT1_PATTERN);
2137	if (result != USB_STOR_XFER_GOOD) {
2138		usb_stor_dbg(us, "Load SD Init Code Part-1 Fail !!\n");
2139		return USB_STOR_TRANSPORT_ERROR;
2140	}
2141
2142	memset(bcb, 0, sizeof(struct bulk_cb_wrap));
2143	bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
2144	bcb->Flags = US_BULK_FLAG_IN;
2145	bcb->CDB[0] = 0xF2;
2146
2147	result = ene_send_scsi_cmd(us, FDIR_READ, NULL, 0);
2148	if (result != USB_STOR_XFER_GOOD) {
2149		usb_stor_dbg(us, "Execution SD Init Code Fail !!\n");
2150		return USB_STOR_TRANSPORT_ERROR;
2151	}
2152
2153	/* SD Init Part-2 */
2154	result = ene_load_bincode(us, SD_INIT2_PATTERN);
2155	if (result != USB_STOR_XFER_GOOD) {
2156		usb_stor_dbg(us, "Load SD Init Code Part-2 Fail !!\n");
2157		return USB_STOR_TRANSPORT_ERROR;
2158	}
2159
2160	memset(bcb, 0, sizeof(struct bulk_cb_wrap));
2161	bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
2162	bcb->DataTransferLength = 0x200;
2163	bcb->Flags              = US_BULK_FLAG_IN;
2164	bcb->CDB[0]             = 0xF1;
2165
2166	result = ene_send_scsi_cmd(us, FDIR_READ, &buf, 0);
2167	if (result != USB_STOR_XFER_GOOD) {
2168		usb_stor_dbg(us, "Execution SD Init Code Fail !!\n");
2169		return USB_STOR_TRANSPORT_ERROR;
2170	}
2171
2172	info->SD_Status =  *(struct SD_STATUS *)&buf[0];
2173	if (info->SD_Status.Insert && info->SD_Status.Ready) {
2174		struct SD_STATUS *s = &info->SD_Status;
2175
2176		ene_get_card_status(us, (unsigned char *)&buf);
2177		usb_stor_dbg(us, "Insert     = %x\n", s->Insert);
2178		usb_stor_dbg(us, "Ready      = %x\n", s->Ready);
2179		usb_stor_dbg(us, "IsMMC      = %x\n", s->IsMMC);
2180		usb_stor_dbg(us, "HiCapacity = %x\n", s->HiCapacity);
2181		usb_stor_dbg(us, "HiSpeed    = %x\n", s->HiSpeed);
2182		usb_stor_dbg(us, "WtP        = %x\n", s->WtP);
2183	} else {
2184		usb_stor_dbg(us, "SD Card Not Ready --- %x\n", buf[0]);
2185		return USB_STOR_TRANSPORT_ERROR;
2186	}
2187	return USB_STOR_TRANSPORT_GOOD;
2188}
2189
2190
2191static int ene_init(struct us_data *us)
2192{
2193	int result;
2194	u8  misc_reg03 = 0;
2195	struct ene_ub6250_info *info = (struct ene_ub6250_info *)(us->extra);
 
2196
2197	result = ene_get_card_type(us, REG_CARD_STATUS, &misc_reg03);
2198	if (result != USB_STOR_XFER_GOOD)
2199		return USB_STOR_TRANSPORT_ERROR;
2200
 
2201	if (misc_reg03 & 0x01) {
2202		if (!info->SD_Status.Ready) {
2203			result = ene_sd_init(us);
2204			if (result != USB_STOR_XFER_GOOD)
2205				return USB_STOR_TRANSPORT_ERROR;
2206		}
2207	}
2208	if (misc_reg03 & 0x02) {
2209		if (!info->MS_Status.Ready) {
2210			result = ene_ms_init(us);
2211			if (result != USB_STOR_XFER_GOOD)
2212				return USB_STOR_TRANSPORT_ERROR;
2213		}
2214	}
2215	return result;
2216}
2217
2218/*----- sd_scsi_irp() ---------*/
2219static int sd_scsi_irp(struct us_data *us, struct scsi_cmnd *srb)
2220{
2221	int    result;
2222	struct ene_ub6250_info *info = (struct ene_ub6250_info *)us->extra;
2223
2224	info->SrbStatus = SS_SUCCESS;
2225	switch (srb->cmnd[0]) {
2226	case TEST_UNIT_READY:
2227		result = sd_scsi_test_unit_ready(us, srb);
2228		break; /* 0x00 */
 
 
 
2229	case INQUIRY:
2230		result = sd_scsi_inquiry(us, srb);
2231		break; /* 0x12 */
2232	case MODE_SENSE:
2233		result = sd_scsi_mode_sense(us, srb);
2234		break; /* 0x1A */
2235	/*
2236	case START_STOP:
2237		result = SD_SCSI_Start_Stop(us, srb);
2238		break; //0x1B
2239	*/
2240	case READ_CAPACITY:
2241		result = sd_scsi_read_capacity(us, srb);
2242		break; /* 0x25 */
2243	case READ_10:
2244		result = sd_scsi_read(us, srb);
2245		break; /* 0x28 */
2246	case WRITE_10:
2247		result = sd_scsi_write(us, srb);
2248		break; /* 0x2A */
2249	default:
2250		info->SrbStatus = SS_ILLEGAL_REQUEST;
2251		result = USB_STOR_TRANSPORT_FAILED;
2252		break;
2253	}
 
 
2254	return result;
2255}
2256
2257/*
2258 * ms_scsi_irp()
2259 */
2260static int ms_scsi_irp(struct us_data *us, struct scsi_cmnd *srb)
2261{
2262	int result;
2263	struct ene_ub6250_info *info = (struct ene_ub6250_info *)us->extra;
2264	info->SrbStatus = SS_SUCCESS;
2265	switch (srb->cmnd[0]) {
2266	case TEST_UNIT_READY:
2267		result = ms_scsi_test_unit_ready(us, srb);
2268		break; /* 0x00 */
 
 
 
2269	case INQUIRY:
2270		result = ms_scsi_inquiry(us, srb);
2271		break; /* 0x12 */
2272	case MODE_SENSE:
2273		result = ms_scsi_mode_sense(us, srb);
2274		break; /* 0x1A */
2275	case READ_CAPACITY:
2276		result = ms_scsi_read_capacity(us, srb);
2277		break; /* 0x25 */
2278	case READ_10:
2279		result = ms_scsi_read(us, srb);
2280		break; /* 0x28 */
2281	case WRITE_10:
2282		result = ms_scsi_write(us, srb);
2283		break;  /* 0x2A */
2284	default:
2285		info->SrbStatus = SS_ILLEGAL_REQUEST;
2286		result = USB_STOR_TRANSPORT_FAILED;
2287		break;
2288	}
 
 
2289	return result;
2290}
2291
2292static int ene_transport(struct scsi_cmnd *srb, struct us_data *us)
2293{
2294	int result = 0;
2295	struct ene_ub6250_info *info = (struct ene_ub6250_info *)(us->extra);
2296
2297	/*US_DEBUG(usb_stor_show_command(us, srb)); */
2298	scsi_set_resid(srb, 0);
2299	if (unlikely(!(info->SD_Status.Ready || info->MS_Status.Ready))) {
2300		result = ene_init(us);
2301	} else {
2302		if (info->SD_Status.Ready)
 
2303			result = sd_scsi_irp(us, srb);
2304
2305		if (info->MS_Status.Ready)
2306			result = ms_scsi_irp(us, srb);
2307	}
2308	return 0;
2309}
2310
 
2311
2312static int ene_ub6250_probe(struct usb_interface *intf,
2313			 const struct usb_device_id *id)
2314{
2315	int result;
2316	u8  misc_reg03 = 0;
2317	struct us_data *us;
 
2318
2319	result = usb_stor_probe1(&us, intf, id,
2320		   (id - ene_ub6250_usb_ids) + ene_ub6250_unusual_dev_list);
 
2321	if (result)
2322		return result;
2323
2324	/* FIXME: where should the code alloc extra buf ? */
2325	if (!us->extra) {
2326		us->extra = kzalloc(sizeof(struct ene_ub6250_info), GFP_KERNEL);
2327		if (!us->extra)
2328			return -ENOMEM;
2329		us->extra_destructor = ene_ub6250_info_destructor;
 
 
 
 
 
2330	}
2331
2332	us->transport_name = "ene_ub6250";
2333	us->transport = ene_transport;
2334	us->max_lun = 0;
2335
2336	result = usb_stor_probe2(us);
2337	if (result)
2338		return result;
2339
2340	/* probe card type */
2341	result = ene_get_card_type(us, REG_CARD_STATUS, &misc_reg03);
2342	if (result != USB_STOR_XFER_GOOD) {
2343		usb_stor_disconnect(intf);
2344		return USB_STOR_TRANSPORT_ERROR;
2345	}
2346
 
2347	if (!(misc_reg03 & 0x01)) {
2348		pr_info("ums_eneub6250: The driver only supports SD/MS card. "
2349			"To use SM card, please build driver/staging/keucr\n");
2350	}
2351
2352	return result;
2353}
2354
2355
2356#ifdef CONFIG_PM
2357
2358static int ene_ub6250_resume(struct usb_interface *iface)
2359{
2360	u8 tmp = 0;
2361	struct us_data *us = usb_get_intfdata(iface);
2362	struct ene_ub6250_info *info = (struct ene_ub6250_info *)(us->extra);
2363
2364	mutex_lock(&us->dev_mutex);
2365
2366	if (us->suspend_resume_hook)
2367		(us->suspend_resume_hook)(us, US_RESUME);
2368
2369	mutex_unlock(&us->dev_mutex);
2370
2371	info->Power_IsResum = true;
2372	/*info->SD_Status.Ready = 0; */
2373	info->SD_Status = *(struct SD_STATUS *)&tmp;
2374	info->MS_Status = *(struct MS_STATUS *)&tmp;
2375	info->SM_Status = *(struct SM_STATUS *)&tmp;
2376
2377	return 0;
2378}
2379
2380static int ene_ub6250_reset_resume(struct usb_interface *iface)
2381{
2382	u8 tmp = 0;
2383	struct us_data *us = usb_get_intfdata(iface);
2384	struct ene_ub6250_info *info = (struct ene_ub6250_info *)(us->extra);
2385
2386	/* Report the reset to the SCSI core */
2387	usb_stor_reset_resume(iface);
2388
2389	/* FIXME: Notify the subdrivers that they need to reinitialize
2390	 * the device */
 
 
2391	info->Power_IsResum = true;
2392	/*info->SD_Status.Ready = 0; */
2393	info->SD_Status = *(struct SD_STATUS *)&tmp;
2394	info->MS_Status = *(struct MS_STATUS *)&tmp;
2395	info->SM_Status = *(struct SM_STATUS *)&tmp;
2396
2397	return 0;
2398}
2399
2400#else
2401
2402#define ene_ub6250_resume		NULL
2403#define ene_ub6250_reset_resume		NULL
2404
2405#endif
2406
2407static struct usb_driver ene_ub6250_driver = {
2408	.name =		"ums_eneub6250",
2409	.probe =	ene_ub6250_probe,
2410	.disconnect =	usb_stor_disconnect,
2411	.suspend =	usb_stor_suspend,
2412	.resume =	ene_ub6250_resume,
2413	.reset_resume =	ene_ub6250_reset_resume,
2414	.pre_reset =	usb_stor_pre_reset,
2415	.post_reset =	usb_stor_post_reset,
2416	.id_table =	ene_ub6250_usb_ids,
2417	.soft_unbind =	1,
2418	.no_dynamic_id = 1,
2419};
2420
2421module_usb_driver(ene_ub6250_driver);