xref: /openbmc/linux/drivers/usb/storage/ene_ub6250.c (revision a5b2c10c)
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 
27 MODULE_DESCRIPTION("Driver for ENE UB6250 reader");
28 MODULE_LICENSE("GPL");
29 MODULE_IMPORT_NS(USB_STORAGE);
30 MODULE_FIRMWARE(SD_INIT1_FIRMWARE);
31 MODULE_FIRMWARE(SD_INIT2_FIRMWARE);
32 MODULE_FIRMWARE(SD_RW_FIRMWARE);
33 MODULE_FIRMWARE(MS_INIT_FIRMWARE);
34 MODULE_FIRMWARE(MSP_RW_FIRMWARE);
35 MODULE_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 
46 static struct usb_device_id ene_ub6250_usb_ids[] = {
47 #	include "unusual_ene_ub6250.h"
48 	{ }		/* Terminating entry */
49 };
50 MODULE_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 
68 static 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 struct SD_STATUS {
241 	u8    Insert:1;
242 	u8    Ready:1;
243 	u8    MediaChange:1;
244 	u8    IsMMC:1;
245 	u8    HiCapacity:1;
246 	u8    HiSpeed:1;
247 	u8    WtP:1;
248 	u8    Reserved:1;
249 };
250 
251 struct MS_STATUS {
252 	u8    Insert:1;
253 	u8    Ready:1;
254 	u8    MediaChange:1;
255 	u8    IsMSPro:1;
256 	u8    IsMSPHG:1;
257 	u8    Reserved1:1;
258 	u8    WtP:1;
259 	u8    Reserved2:1;
260 };
261 
262 struct SM_STATUS {
263 	u8    Insert:1;
264 	u8    Ready:1;
265 	u8    MediaChange:1;
266 	u8    Reserved:3;
267 	u8    WtP:1;
268 	u8    IsMS:1;
269 };
270 
271 struct ms_bootblock_cis {
272 	u8 bCistplDEVICE[6];    /* 0 */
273 	u8 bCistplDEVICE0C[6];  /* 6 */
274 	u8 bCistplJEDECC[4];    /* 12 */
275 	u8 bCistplMANFID[6];    /* 16 */
276 	u8 bCistplVER1[32];     /* 22 */
277 	u8 bCistplFUNCID[4];    /* 54 */
278 	u8 bCistplFUNCE0[4];    /* 58 */
279 	u8 bCistplFUNCE1[5];    /* 62 */
280 	u8 bCistplCONF[7];      /* 67 */
281 	u8 bCistplCFTBLENT0[10];/* 74 */
282 	u8 bCistplCFTBLENT1[8]; /* 84 */
283 	u8 bCistplCFTBLENT2[12];/* 92 */
284 	u8 bCistplCFTBLENT3[8]; /* 104 */
285 	u8 bCistplCFTBLENT4[17];/* 112 */
286 	u8 bCistplCFTBLENT5[8]; /* 129 */
287 	u8 bCistplCFTBLENT6[17];/* 137 */
288 	u8 bCistplCFTBLENT7[8]; /* 154 */
289 	u8 bCistplNOLINK[3];    /* 162 */
290 } ;
291 
292 struct ms_bootblock_idi {
293 #define MS_IDI_GENERAL_CONF 0x848A
294 	u16 wIDIgeneralConfiguration;	/* 0 */
295 	u16 wIDInumberOfCylinder;	/* 1 */
296 	u16 wIDIreserved0;		/* 2 */
297 	u16 wIDInumberOfHead;		/* 3 */
298 	u16 wIDIbytesPerTrack;		/* 4 */
299 	u16 wIDIbytesPerSector;		/* 5 */
300 	u16 wIDIsectorsPerTrack;	/* 6 */
301 	u16 wIDItotalSectors[2];	/* 7-8  high,low */
302 	u16 wIDIreserved1[11];		/* 9-19 */
303 	u16 wIDIbufferType;		/* 20 */
304 	u16 wIDIbufferSize;		/* 21 */
305 	u16 wIDIlongCmdECC;		/* 22 */
306 	u16 wIDIfirmVersion[4];		/* 23-26 */
307 	u16 wIDImodelName[20];		/* 27-46 */
308 	u16 wIDIreserved2;		/* 47 */
309 	u16 wIDIlongWordSupported;	/* 48 */
310 	u16 wIDIdmaSupported;		/* 49 */
311 	u16 wIDIreserved3;		/* 50 */
312 	u16 wIDIpioTiming;		/* 51 */
313 	u16 wIDIdmaTiming;		/* 52 */
314 	u16 wIDItransferParameter;	/* 53 */
315 	u16 wIDIformattedCylinder;	/* 54 */
316 	u16 wIDIformattedHead;		/* 55 */
317 	u16 wIDIformattedSectorsPerTrack;/* 56 */
318 	u16 wIDIformattedTotalSectors[2];/* 57-58 */
319 	u16 wIDImultiSector;		/* 59 */
320 	u16 wIDIlbaSectors[2];		/* 60-61 */
321 	u16 wIDIsingleWordDMA;		/* 62 */
322 	u16 wIDImultiWordDMA;		/* 63 */
323 	u16 wIDIreserved4[192];		/* 64-255 */
324 };
325 
326 struct ms_bootblock_sysent_rec {
327 	u32 dwStart;
328 	u32 dwSize;
329 	u8 bType;
330 	u8 bReserved[3];
331 };
332 
333 struct ms_bootblock_sysent {
334 	struct ms_bootblock_sysent_rec entry[MS_NUMBER_OF_SYSTEM_ENTRY];
335 };
336 
337 struct ms_bootblock_sysinf {
338 	u8 bMsClass;			/* must be 1 */
339 	u8 bCardType;			/* see below */
340 	u16 wBlockSize;			/* n KB */
341 	u16 wBlockNumber;		/* number of physical block */
342 	u16 wTotalBlockNumber;		/* number of logical block */
343 	u16 wPageSize;			/* must be 0x200 */
344 	u8 bExtraSize;			/* 0x10 */
345 	u8 bSecuritySupport;
346 	u8 bAssemblyDate[8];
347 	u8 bFactoryArea[4];
348 	u8 bAssemblyMakerCode;
349 	u8 bAssemblyMachineCode[3];
350 	u16 wMemoryMakerCode;
351 	u16 wMemoryDeviceCode;
352 	u16 wMemorySize;
353 	u8 bReserved1;
354 	u8 bReserved2;
355 	u8 bVCC;
356 	u8 bVPP;
357 	u16 wControllerChipNumber;
358 	u16 wControllerFunction;	/* New MS */
359 	u8 bReserved3[9];		/* New MS */
360 	u8 bParallelSupport;		/* New MS */
361 	u16 wFormatValue;		/* New MS */
362 	u8 bFormatType;
363 	u8 bUsage;
364 	u8 bDeviceType;
365 	u8 bReserved4[22];
366 	u8 bFUValue3;
367 	u8 bFUValue4;
368 	u8 bReserved5[15];
369 };
370 
371 struct ms_bootblock_header {
372 	u16 wBlockID;
373 	u16 wFormatVersion;
374 	u8 bReserved1[184];
375 	u8 bNumberOfDataEntry;
376 	u8 bReserved2[179];
377 };
378 
379 struct ms_bootblock_page0 {
380 	struct ms_bootblock_header header;
381 	struct ms_bootblock_sysent sysent;
382 	struct ms_bootblock_sysinf sysinf;
383 };
384 
385 struct ms_bootblock_cis_idi {
386 	union {
387 		struct ms_bootblock_cis cis;
388 		u8 dmy[256];
389 	} cis;
390 
391 	union {
392 		struct ms_bootblock_idi idi;
393 		u8 dmy[256];
394 	} idi;
395 
396 };
397 
398 /* ENE MS Lib struct */
399 struct ms_lib_type_extdat {
400 	u8 reserved;
401 	u8 intr;
402 	u8 status0;
403 	u8 status1;
404 	u8 ovrflg;
405 	u8 mngflg;
406 	u16 logadr;
407 };
408 
409 struct ms_lib_ctrl {
410 	u32 flags;
411 	u32 BytesPerSector;
412 	u32 NumberOfCylinder;
413 	u32 SectorsPerCylinder;
414 	u16 cardType;			/* R/W, RO, Hybrid */
415 	u16 blockSize;
416 	u16 PagesPerBlock;
417 	u16 NumberOfPhyBlock;
418 	u16 NumberOfLogBlock;
419 	u16 NumberOfSegment;
420 	u16 *Phy2LogMap;		/* phy2log table */
421 	u16 *Log2PhyMap;		/* log2phy table */
422 	u16 wrtblk;
423 	unsigned char *pagemap[(MS_MAX_PAGES_PER_BLOCK + (MS_LIB_BITS_PER_BYTE-1)) / MS_LIB_BITS_PER_BYTE];
424 	unsigned char *blkpag;
425 	struct ms_lib_type_extdat *blkext;
426 	unsigned char copybuf[512];
427 };
428 
429 
430 /* SD Block Length */
431 /* 2^9 = 512 Bytes, The HW maximum read/write data length */
432 #define SD_BLOCK_LEN  9
433 
434 struct ene_ub6250_info {
435 
436 	/* I/O bounce buffer */
437 	u8		*bbuf;
438 
439 	/* for 6250 code */
440 	struct SD_STATUS	SD_Status;
441 	struct MS_STATUS	MS_Status;
442 	struct SM_STATUS	SM_Status;
443 
444 	/* ----- SD Control Data ---------------- */
445 	/*SD_REGISTER SD_Regs; */
446 	u16		SD_Block_Mult;
447 	u8		SD_READ_BL_LEN;
448 	u16		SD_C_SIZE;
449 	u8		SD_C_SIZE_MULT;
450 
451 	/* SD/MMC New spec. */
452 	u8		SD_SPEC_VER;
453 	u8		SD_CSD_VER;
454 	u8		SD20_HIGH_CAPACITY;
455 	u32		HC_C_SIZE;
456 	u8		MMC_SPEC_VER;
457 	u8		MMC_BusWidth;
458 	u8		MMC_HIGH_CAPACITY;
459 
460 	/*----- MS Control Data ---------------- */
461 	bool		MS_SWWP;
462 	u32		MSP_TotalBlock;
463 	struct ms_lib_ctrl MS_Lib;
464 	bool		MS_IsRWPage;
465 	u16		MS_Model;
466 
467 	/*----- SM Control Data ---------------- */
468 	u8		SM_DeviceID;
469 	u8		SM_CardID;
470 
471 	unsigned char	*testbuf;
472 	u8		BIN_FLAG;
473 	u32		bl_num;
474 	int		SrbStatus;
475 
476 	/*------Power Managerment ---------------*/
477 	bool		Power_IsResum;
478 };
479 
480 static int ene_sd_init(struct us_data *us);
481 static int ene_ms_init(struct us_data *us);
482 static int ene_load_bincode(struct us_data *us, unsigned char flag);
483 
484 static void ene_ub6250_info_destructor(void *extra)
485 {
486 	struct ene_ub6250_info *info = (struct ene_ub6250_info *) extra;
487 
488 	if (!extra)
489 		return;
490 	kfree(info->bbuf);
491 }
492 
493 static int ene_send_scsi_cmd(struct us_data *us, u8 fDir, void *buf, int use_sg)
494 {
495 	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
496 	struct bulk_cs_wrap *bcs = (struct bulk_cs_wrap *) us->iobuf;
497 
498 	int result;
499 	unsigned int residue;
500 	unsigned int cswlen = 0, partial = 0;
501 	unsigned int transfer_length = bcb->DataTransferLength;
502 
503 	/* usb_stor_dbg(us, "transport --- ene_send_scsi_cmd\n"); */
504 	/* send cmd to out endpoint */
505 	result = usb_stor_bulk_transfer_buf(us, us->send_bulk_pipe,
506 					    bcb, US_BULK_CB_WRAP_LEN, NULL);
507 	if (result != USB_STOR_XFER_GOOD) {
508 		usb_stor_dbg(us, "send cmd to out endpoint fail ---\n");
509 		return USB_STOR_TRANSPORT_ERROR;
510 	}
511 
512 	if (buf) {
513 		unsigned int pipe = fDir;
514 
515 		if (fDir  == FDIR_READ)
516 			pipe = us->recv_bulk_pipe;
517 		else
518 			pipe = us->send_bulk_pipe;
519 
520 		/* Bulk */
521 		if (use_sg) {
522 			result = usb_stor_bulk_srb(us, pipe, us->srb);
523 		} else {
524 			result = usb_stor_bulk_transfer_sg(us, pipe, buf,
525 						transfer_length, 0, &partial);
526 		}
527 		if (result != USB_STOR_XFER_GOOD) {
528 			usb_stor_dbg(us, "data transfer fail ---\n");
529 			return USB_STOR_TRANSPORT_ERROR;
530 		}
531 	}
532 
533 	/* Get CSW for device status */
534 	result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe, bcs,
535 					    US_BULK_CS_WRAP_LEN, &cswlen);
536 
537 	if (result == USB_STOR_XFER_SHORT && cswlen == 0) {
538 		usb_stor_dbg(us, "Received 0-length CSW; retrying...\n");
539 		result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe,
540 					    bcs, US_BULK_CS_WRAP_LEN, &cswlen);
541 	}
542 
543 	if (result == USB_STOR_XFER_STALLED) {
544 		/* get the status again */
545 		usb_stor_dbg(us, "Attempting to get CSW (2nd try)...\n");
546 		result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe,
547 						bcs, US_BULK_CS_WRAP_LEN, NULL);
548 	}
549 
550 	if (result != USB_STOR_XFER_GOOD)
551 		return USB_STOR_TRANSPORT_ERROR;
552 
553 	/* check bulk status */
554 	residue = le32_to_cpu(bcs->Residue);
555 
556 	/*
557 	 * try to compute the actual residue, based on how much data
558 	 * was really transferred and what the device tells us
559 	 */
560 	if (residue && !(us->fflags & US_FL_IGNORE_RESIDUE)) {
561 		residue = min(residue, transfer_length);
562 		if (us->srb != NULL)
563 			scsi_set_resid(us->srb, max(scsi_get_resid(us->srb),
564 								residue));
565 	}
566 
567 	if (bcs->Status != US_BULK_STAT_OK)
568 		return USB_STOR_TRANSPORT_ERROR;
569 
570 	return USB_STOR_TRANSPORT_GOOD;
571 }
572 
573 static int do_scsi_request_sense(struct us_data *us, struct scsi_cmnd *srb)
574 {
575 	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
576 	unsigned char buf[18];
577 
578 	memset(buf, 0, 18);
579 	buf[0] = 0x70;				/* Current error */
580 	buf[2] = info->SrbStatus >> 16;		/* Sense key */
581 	buf[7] = 10;				/* Additional length */
582 	buf[12] = info->SrbStatus >> 8;		/* ASC */
583 	buf[13] = info->SrbStatus;		/* ASCQ */
584 
585 	usb_stor_set_xfer_buf(buf, sizeof(buf), srb);
586 	return USB_STOR_TRANSPORT_GOOD;
587 }
588 
589 static int do_scsi_inquiry(struct us_data *us, struct scsi_cmnd *srb)
590 {
591 	unsigned char data_ptr[36] = {
592 		0x00, 0x00, 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 
601 static int sd_scsi_test_unit_ready(struct us_data *us, struct scsi_cmnd *srb)
602 {
603 	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
604 
605 	if (info->SD_Status.Insert && info->SD_Status.Ready)
606 		return USB_STOR_TRANSPORT_GOOD;
607 	else {
608 		ene_sd_init(us);
609 		return USB_STOR_TRANSPORT_GOOD;
610 	}
611 
612 	return USB_STOR_TRANSPORT_GOOD;
613 }
614 
615 static int sd_scsi_mode_sense(struct us_data *us, struct scsi_cmnd *srb)
616 {
617 	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
618 	unsigned char mediaNoWP[12] = {
619 		0x0b, 0x00, 0x00, 0x08, 0x00, 0x00,
620 		0x71, 0xc0, 0x00, 0x00, 0x02, 0x00 };
621 	unsigned char mediaWP[12]   = {
622 		0x0b, 0x00, 0x80, 0x08, 0x00, 0x00,
623 		0x71, 0xc0, 0x00, 0x00, 0x02, 0x00 };
624 
625 	if (info->SD_Status.WtP)
626 		usb_stor_set_xfer_buf(mediaWP, 12, srb);
627 	else
628 		usb_stor_set_xfer_buf(mediaNoWP, 12, srb);
629 
630 
631 	return USB_STOR_TRANSPORT_GOOD;
632 }
633 
634 static int sd_scsi_read_capacity(struct us_data *us, struct scsi_cmnd *srb)
635 {
636 	u32	bl_num;
637 	u32	bl_len;
638 	unsigned int offset = 0;
639 	unsigned char    buf[8];
640 	struct scatterlist *sg = NULL;
641 	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
642 
643 	usb_stor_dbg(us, "sd_scsi_read_capacity\n");
644 	if (info->SD_Status.HiCapacity) {
645 		bl_len = 0x200;
646 		if (info->SD_Status.IsMMC)
647 			bl_num = info->HC_C_SIZE-1;
648 		else
649 			bl_num = (info->HC_C_SIZE + 1) * 1024 - 1;
650 	} else {
651 		bl_len = 1 << (info->SD_READ_BL_LEN);
652 		bl_num = info->SD_Block_Mult * (info->SD_C_SIZE + 1)
653 				* (1 << (info->SD_C_SIZE_MULT + 2)) - 1;
654 	}
655 	info->bl_num = bl_num;
656 	usb_stor_dbg(us, "bl_len = %x\n", bl_len);
657 	usb_stor_dbg(us, "bl_num = %x\n", bl_num);
658 
659 	/*srb->request_bufflen = 8; */
660 	buf[0] = (bl_num >> 24) & 0xff;
661 	buf[1] = (bl_num >> 16) & 0xff;
662 	buf[2] = (bl_num >> 8) & 0xff;
663 	buf[3] = (bl_num >> 0) & 0xff;
664 	buf[4] = (bl_len >> 24) & 0xff;
665 	buf[5] = (bl_len >> 16) & 0xff;
666 	buf[6] = (bl_len >> 8) & 0xff;
667 	buf[7] = (bl_len >> 0) & 0xff;
668 
669 	usb_stor_access_xfer_buf(buf, 8, srb, &sg, &offset, TO_XFER_BUF);
670 
671 	return USB_STOR_TRANSPORT_GOOD;
672 }
673 
674 static int sd_scsi_read(struct us_data *us, struct scsi_cmnd *srb)
675 {
676 	int result;
677 	unsigned char *cdb = srb->cmnd;
678 	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
679 	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
680 
681 	u32 bn = ((cdb[2] << 24) & 0xff000000) | ((cdb[3] << 16) & 0x00ff0000) |
682 		 ((cdb[4] << 8) & 0x0000ff00) | ((cdb[5] << 0) & 0x000000ff);
683 	u16 blen = ((cdb[7] << 8) & 0xff00) | ((cdb[8] << 0) & 0x00ff);
684 	u32 bnByte = bn * 0x200;
685 	u32 blenByte = blen * 0x200;
686 
687 	if (bn > info->bl_num)
688 		return USB_STOR_TRANSPORT_ERROR;
689 
690 	result = ene_load_bincode(us, SD_RW_PATTERN);
691 	if (result != USB_STOR_XFER_GOOD) {
692 		usb_stor_dbg(us, "Load SD RW pattern Fail !!\n");
693 		return USB_STOR_TRANSPORT_ERROR;
694 	}
695 
696 	if (info->SD_Status.HiCapacity)
697 		bnByte = bn;
698 
699 	/* set up the command wrapper */
700 	memset(bcb, 0, sizeof(struct bulk_cb_wrap));
701 	bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
702 	bcb->DataTransferLength = blenByte;
703 	bcb->Flags  = US_BULK_FLAG_IN;
704 	bcb->CDB[0] = 0xF1;
705 	bcb->CDB[5] = (unsigned char)(bnByte);
706 	bcb->CDB[4] = (unsigned char)(bnByte>>8);
707 	bcb->CDB[3] = (unsigned char)(bnByte>>16);
708 	bcb->CDB[2] = (unsigned char)(bnByte>>24);
709 
710 	result = ene_send_scsi_cmd(us, FDIR_READ, scsi_sglist(srb), 1);
711 	return result;
712 }
713 
714 static int sd_scsi_write(struct us_data *us, struct scsi_cmnd *srb)
715 {
716 	int result;
717 	unsigned char *cdb = srb->cmnd;
718 	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
719 	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
720 
721 	u32 bn = ((cdb[2] << 24) & 0xff000000) | ((cdb[3] << 16) & 0x00ff0000) |
722 		 ((cdb[4] << 8) & 0x0000ff00) | ((cdb[5] << 0) & 0x000000ff);
723 	u16 blen = ((cdb[7] << 8) & 0xff00) | ((cdb[8] << 0) & 0x00ff);
724 	u32 bnByte = bn * 0x200;
725 	u32 blenByte = blen * 0x200;
726 
727 	if (bn > info->bl_num)
728 		return USB_STOR_TRANSPORT_ERROR;
729 
730 	result = ene_load_bincode(us, SD_RW_PATTERN);
731 	if (result != USB_STOR_XFER_GOOD) {
732 		usb_stor_dbg(us, "Load SD RW pattern Fail !!\n");
733 		return USB_STOR_TRANSPORT_ERROR;
734 	}
735 
736 	if (info->SD_Status.HiCapacity)
737 		bnByte = bn;
738 
739 	/* set up the command wrapper */
740 	memset(bcb, 0, sizeof(struct bulk_cb_wrap));
741 	bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
742 	bcb->DataTransferLength = blenByte;
743 	bcb->Flags  = 0x00;
744 	bcb->CDB[0] = 0xF0;
745 	bcb->CDB[5] = (unsigned char)(bnByte);
746 	bcb->CDB[4] = (unsigned char)(bnByte>>8);
747 	bcb->CDB[3] = (unsigned char)(bnByte>>16);
748 	bcb->CDB[2] = (unsigned char)(bnByte>>24);
749 
750 	result = ene_send_scsi_cmd(us, FDIR_WRITE, scsi_sglist(srb), 1);
751 	return result;
752 }
753 
754 /*
755  * ENE MS Card
756  */
757 
758 static int ms_lib_set_logicalpair(struct us_data *us, u16 logblk, u16 phyblk)
759 {
760 	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
761 
762 	if ((logblk >= info->MS_Lib.NumberOfLogBlock) || (phyblk >= info->MS_Lib.NumberOfPhyBlock))
763 		return (u32)-1;
764 
765 	info->MS_Lib.Phy2LogMap[phyblk] = logblk;
766 	info->MS_Lib.Log2PhyMap[logblk] = phyblk;
767 
768 	return 0;
769 }
770 
771 static int ms_lib_set_logicalblockmark(struct us_data *us, u16 phyblk, u16 mark)
772 {
773 	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
774 
775 	if (phyblk >= info->MS_Lib.NumberOfPhyBlock)
776 		return (u32)-1;
777 
778 	info->MS_Lib.Phy2LogMap[phyblk] = mark;
779 
780 	return 0;
781 }
782 
783 static int ms_lib_set_initialerrorblock(struct us_data *us, u16 phyblk)
784 {
785 	return ms_lib_set_logicalblockmark(us, phyblk, MS_LB_INITIAL_ERROR);
786 }
787 
788 static int ms_lib_set_bootblockmark(struct us_data *us, u16 phyblk)
789 {
790 	return ms_lib_set_logicalblockmark(us, phyblk, MS_LB_BOOT_BLOCK);
791 }
792 
793 static int ms_lib_free_logicalmap(struct us_data *us)
794 {
795 	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
796 
797 	kfree(info->MS_Lib.Phy2LogMap);
798 	info->MS_Lib.Phy2LogMap = NULL;
799 
800 	kfree(info->MS_Lib.Log2PhyMap);
801 	info->MS_Lib.Log2PhyMap = NULL;
802 
803 	return 0;
804 }
805 
806 static int ms_lib_alloc_logicalmap(struct us_data *us)
807 {
808 	u32  i;
809 	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
810 
811 	info->MS_Lib.Phy2LogMap = kmalloc_array(info->MS_Lib.NumberOfPhyBlock,
812 						sizeof(u16),
813 						GFP_KERNEL);
814 	info->MS_Lib.Log2PhyMap = kmalloc_array(info->MS_Lib.NumberOfLogBlock,
815 						sizeof(u16),
816 						GFP_KERNEL);
817 
818 	if ((info->MS_Lib.Phy2LogMap == NULL) || (info->MS_Lib.Log2PhyMap == NULL)) {
819 		ms_lib_free_logicalmap(us);
820 		return (u32)-1;
821 	}
822 
823 	for (i = 0; i < info->MS_Lib.NumberOfPhyBlock; i++)
824 		info->MS_Lib.Phy2LogMap[i] = MS_LB_NOT_USED;
825 
826 	for (i = 0; i < info->MS_Lib.NumberOfLogBlock; i++)
827 		info->MS_Lib.Log2PhyMap[i] = MS_LB_NOT_USED;
828 
829 	return 0;
830 }
831 
832 static void ms_lib_clear_writebuf(struct us_data *us)
833 {
834 	int i;
835 	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
836 
837 	info->MS_Lib.wrtblk = (u16)-1;
838 	ms_lib_clear_pagemap(info);
839 
840 	if (info->MS_Lib.blkpag)
841 		memset(info->MS_Lib.blkpag, 0xff, info->MS_Lib.PagesPerBlock * info->MS_Lib.BytesPerSector);
842 
843 	if (info->MS_Lib.blkext) {
844 		for (i = 0; i < info->MS_Lib.PagesPerBlock; i++) {
845 			info->MS_Lib.blkext[i].status1 = MS_REG_ST1_DEFAULT;
846 			info->MS_Lib.blkext[i].ovrflg = MS_REG_OVR_DEFAULT;
847 			info->MS_Lib.blkext[i].mngflg = MS_REG_MNG_DEFAULT;
848 			info->MS_Lib.blkext[i].logadr = MS_LB_NOT_USED;
849 		}
850 	}
851 }
852 
853 static int ms_count_freeblock(struct us_data *us, u16 PhyBlock)
854 {
855 	u32 Ende, Count;
856 	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
857 
858 	Ende = PhyBlock + MS_PHYSICAL_BLOCKS_PER_SEGMENT;
859 	for (Count = 0; PhyBlock < Ende; PhyBlock++) {
860 		switch (info->MS_Lib.Phy2LogMap[PhyBlock]) {
861 		case MS_LB_NOT_USED:
862 		case MS_LB_NOT_USED_ERASED:
863 			Count++;
864 		default:
865 			break;
866 		}
867 	}
868 
869 	return Count;
870 }
871 
872 static int ms_read_readpage(struct us_data *us, u32 PhyBlockAddr,
873 		u8 PageNum, u32 *PageBuf, struct ms_lib_type_extdat *ExtraDat)
874 {
875 	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
876 	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
877 	u8 *bbuf = info->bbuf;
878 	int result;
879 	u32 bn = PhyBlockAddr * 0x20 + PageNum;
880 
881 	result = ene_load_bincode(us, MS_RW_PATTERN);
882 	if (result != USB_STOR_XFER_GOOD)
883 		return USB_STOR_TRANSPORT_ERROR;
884 
885 	/* Read Page Data */
886 	memset(bcb, 0, sizeof(struct bulk_cb_wrap));
887 	bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
888 	bcb->DataTransferLength = 0x200;
889 	bcb->Flags      = US_BULK_FLAG_IN;
890 	bcb->CDB[0]     = 0xF1;
891 
892 	bcb->CDB[1]     = 0x02; /* in init.c ENE_MSInit() is 0x01 */
893 
894 	bcb->CDB[5]     = (unsigned char)(bn);
895 	bcb->CDB[4]     = (unsigned char)(bn>>8);
896 	bcb->CDB[3]     = (unsigned char)(bn>>16);
897 	bcb->CDB[2]     = (unsigned char)(bn>>24);
898 
899 	result = ene_send_scsi_cmd(us, FDIR_READ, PageBuf, 0);
900 	if (result != USB_STOR_XFER_GOOD)
901 		return USB_STOR_TRANSPORT_ERROR;
902 
903 
904 	/* Read Extra Data */
905 	memset(bcb, 0, sizeof(struct bulk_cb_wrap));
906 	bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
907 	bcb->DataTransferLength = 0x4;
908 	bcb->Flags      = US_BULK_FLAG_IN;
909 	bcb->CDB[0]     = 0xF1;
910 	bcb->CDB[1]     = 0x03;
911 
912 	bcb->CDB[5]     = (unsigned char)(PageNum);
913 	bcb->CDB[4]     = (unsigned char)(PhyBlockAddr);
914 	bcb->CDB[3]     = (unsigned char)(PhyBlockAddr>>8);
915 	bcb->CDB[2]     = (unsigned char)(PhyBlockAddr>>16);
916 	bcb->CDB[6]     = 0x01;
917 
918 	result = ene_send_scsi_cmd(us, FDIR_READ, bbuf, 0);
919 	if (result != USB_STOR_XFER_GOOD)
920 		return USB_STOR_TRANSPORT_ERROR;
921 
922 	ExtraDat->reserved = 0;
923 	ExtraDat->intr     = 0x80;  /* Not yet,fireware support */
924 	ExtraDat->status0  = 0x10;  /* Not yet,fireware support */
925 
926 	ExtraDat->status1  = 0x00;  /* Not yet,fireware support */
927 	ExtraDat->ovrflg   = bbuf[0];
928 	ExtraDat->mngflg   = bbuf[1];
929 	ExtraDat->logadr   = memstick_logaddr(bbuf[2], bbuf[3]);
930 
931 	return USB_STOR_TRANSPORT_GOOD;
932 }
933 
934 static int ms_lib_process_bootblock(struct us_data *us, u16 PhyBlock, u8 *PageData)
935 {
936 	struct ms_bootblock_sysent *SysEntry;
937 	struct ms_bootblock_sysinf *SysInfo;
938 	u32 i, result;
939 	u8 PageNumber;
940 	u8 *PageBuffer;
941 	struct ms_lib_type_extdat ExtraData;
942 	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
943 
944 	PageBuffer = kmalloc(MS_BYTES_PER_PAGE, GFP_KERNEL);
945 	if (PageBuffer == NULL)
946 		return (u32)-1;
947 
948 	result = (u32)-1;
949 
950 	SysInfo = &(((struct ms_bootblock_page0 *)PageData)->sysinf);
951 
952 	if ((SysInfo->bMsClass != MS_SYSINF_MSCLASS_TYPE_1) ||
953 		(be16_to_cpu(SysInfo->wPageSize) != MS_SYSINF_PAGE_SIZE) ||
954 		((SysInfo->bSecuritySupport & MS_SYSINF_SECURITY) == MS_SYSINF_SECURITY_SUPPORT) ||
955 		(SysInfo->bReserved1 != MS_SYSINF_RESERVED1) ||
956 		(SysInfo->bReserved2 != MS_SYSINF_RESERVED2) ||
957 		(SysInfo->bFormatType != MS_SYSINF_FORMAT_FAT) ||
958 		(SysInfo->bUsage != MS_SYSINF_USAGE_GENERAL))
959 		goto exit;
960 		/* */
961 	switch (info->MS_Lib.cardType = SysInfo->bCardType) {
962 	case MS_SYSINF_CARDTYPE_RDONLY:
963 		ms_lib_ctrl_set(info, MS_LIB_CTRL_RDONLY);
964 		break;
965 	case MS_SYSINF_CARDTYPE_RDWR:
966 		ms_lib_ctrl_reset(info, MS_LIB_CTRL_RDONLY);
967 		break;
968 	case MS_SYSINF_CARDTYPE_HYBRID:
969 	default:
970 		goto exit;
971 	}
972 
973 	info->MS_Lib.blockSize = be16_to_cpu(SysInfo->wBlockSize);
974 	info->MS_Lib.NumberOfPhyBlock = be16_to_cpu(SysInfo->wBlockNumber);
975 	info->MS_Lib.NumberOfLogBlock = be16_to_cpu(SysInfo->wTotalBlockNumber)-2;
976 	info->MS_Lib.PagesPerBlock = info->MS_Lib.blockSize * SIZE_OF_KIRO / MS_BYTES_PER_PAGE;
977 	info->MS_Lib.NumberOfSegment = info->MS_Lib.NumberOfPhyBlock / MS_PHYSICAL_BLOCKS_PER_SEGMENT;
978 	info->MS_Model = be16_to_cpu(SysInfo->wMemorySize);
979 
980 	/*Allocate to all number of logicalblock and physicalblock */
981 	if (ms_lib_alloc_logicalmap(us))
982 		goto exit;
983 
984 	/* Mark the book block */
985 	ms_lib_set_bootblockmark(us, PhyBlock);
986 
987 	SysEntry = &(((struct ms_bootblock_page0 *)PageData)->sysent);
988 
989 	for (i = 0; i < MS_NUMBER_OF_SYSTEM_ENTRY; i++) {
990 		u32  EntryOffset, EntrySize;
991 
992 		EntryOffset = be32_to_cpu(SysEntry->entry[i].dwStart);
993 
994 		if (EntryOffset == 0xffffff)
995 			continue;
996 		EntrySize = be32_to_cpu(SysEntry->entry[i].dwSize);
997 
998 		if (EntrySize == 0)
999 			continue;
1000 
1001 		if (EntryOffset + MS_BYTES_PER_PAGE + EntrySize > info->MS_Lib.blockSize * (u32)SIZE_OF_KIRO)
1002 			continue;
1003 
1004 		if (i == 0) {
1005 			u8 PrevPageNumber = 0;
1006 			u16 phyblk;
1007 
1008 			if (SysEntry->entry[i].bType != MS_SYSENT_TYPE_INVALID_BLOCK)
1009 				goto exit;
1010 
1011 			while (EntrySize > 0) {
1012 
1013 				PageNumber = (u8)(EntryOffset / MS_BYTES_PER_PAGE + 1);
1014 				if (PageNumber != PrevPageNumber) {
1015 					switch (ms_read_readpage(us, PhyBlock, PageNumber, (u32 *)PageBuffer, &ExtraData)) {
1016 					case MS_STATUS_SUCCESS:
1017 						break;
1018 					case MS_STATUS_WRITE_PROTECT:
1019 					case MS_ERROR_FLASH_READ:
1020 					case MS_STATUS_ERROR:
1021 					default:
1022 						goto exit;
1023 					}
1024 
1025 					PrevPageNumber = PageNumber;
1026 				}
1027 
1028 				phyblk = be16_to_cpu(*(u16 *)(PageBuffer + (EntryOffset % MS_BYTES_PER_PAGE)));
1029 				if (phyblk < 0x0fff)
1030 					ms_lib_set_initialerrorblock(us, phyblk);
1031 
1032 				EntryOffset += 2;
1033 				EntrySize -= 2;
1034 			}
1035 		} else if (i == 1) {  /* CIS/IDI */
1036 			struct ms_bootblock_idi *idi;
1037 
1038 			if (SysEntry->entry[i].bType != MS_SYSENT_TYPE_CIS_IDI)
1039 				goto exit;
1040 
1041 			switch (ms_read_readpage(us, PhyBlock, (u8)(EntryOffset / MS_BYTES_PER_PAGE + 1), (u32 *)PageBuffer, &ExtraData)) {
1042 			case MS_STATUS_SUCCESS:
1043 				break;
1044 			case MS_STATUS_WRITE_PROTECT:
1045 			case MS_ERROR_FLASH_READ:
1046 			case MS_STATUS_ERROR:
1047 			default:
1048 				goto exit;
1049 			}
1050 
1051 			idi = &((struct ms_bootblock_cis_idi *)(PageBuffer + (EntryOffset % MS_BYTES_PER_PAGE)))->idi.idi;
1052 			if (le16_to_cpu(idi->wIDIgeneralConfiguration) != MS_IDI_GENERAL_CONF)
1053 				goto exit;
1054 
1055 			info->MS_Lib.BytesPerSector = le16_to_cpu(idi->wIDIbytesPerSector);
1056 			if (info->MS_Lib.BytesPerSector != MS_BYTES_PER_PAGE)
1057 				goto exit;
1058 		}
1059 	} /* End for .. */
1060 
1061 	result = 0;
1062 
1063 exit:
1064 	if (result)
1065 		ms_lib_free_logicalmap(us);
1066 
1067 	kfree(PageBuffer);
1068 
1069 	result = 0;
1070 	return result;
1071 }
1072 
1073 static void ms_lib_free_writebuf(struct us_data *us)
1074 {
1075 	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1076 	info->MS_Lib.wrtblk = (u16)-1; /* set to -1 */
1077 
1078 	/* memset((fdoExt)->MS_Lib.pagemap, 0, sizeof((fdoExt)->MS_Lib.pagemap)) */
1079 
1080 	ms_lib_clear_pagemap(info); /* (pdx)->MS_Lib.pagemap memset 0 in ms.h */
1081 
1082 	if (info->MS_Lib.blkpag) {
1083 		kfree(info->MS_Lib.blkpag);  /* Arnold test ... */
1084 		info->MS_Lib.blkpag = NULL;
1085 	}
1086 
1087 	if (info->MS_Lib.blkext) {
1088 		kfree(info->MS_Lib.blkext);  /* Arnold test ... */
1089 		info->MS_Lib.blkext = NULL;
1090 	}
1091 }
1092 
1093 
1094 static void ms_lib_free_allocatedarea(struct us_data *us)
1095 {
1096 	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1097 
1098 	ms_lib_free_writebuf(us); /* Free MS_Lib.pagemap */
1099 	ms_lib_free_logicalmap(us); /* kfree MS_Lib.Phy2LogMap and MS_Lib.Log2PhyMap */
1100 
1101 	/* set struct us point flag to 0 */
1102 	info->MS_Lib.flags = 0;
1103 	info->MS_Lib.BytesPerSector = 0;
1104 	info->MS_Lib.SectorsPerCylinder = 0;
1105 
1106 	info->MS_Lib.cardType = 0;
1107 	info->MS_Lib.blockSize = 0;
1108 	info->MS_Lib.PagesPerBlock = 0;
1109 
1110 	info->MS_Lib.NumberOfPhyBlock = 0;
1111 	info->MS_Lib.NumberOfLogBlock = 0;
1112 }
1113 
1114 
1115 static int ms_lib_alloc_writebuf(struct us_data *us)
1116 {
1117 	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1118 
1119 	info->MS_Lib.wrtblk = (u16)-1;
1120 
1121 	info->MS_Lib.blkpag = kmalloc_array(info->MS_Lib.PagesPerBlock,
1122 					    info->MS_Lib.BytesPerSector,
1123 					    GFP_KERNEL);
1124 	info->MS_Lib.blkext = kmalloc_array(info->MS_Lib.PagesPerBlock,
1125 					    sizeof(struct ms_lib_type_extdat),
1126 					    GFP_KERNEL);
1127 
1128 	if ((info->MS_Lib.blkpag == NULL) || (info->MS_Lib.blkext == NULL)) {
1129 		ms_lib_free_writebuf(us);
1130 		return (u32)-1;
1131 	}
1132 
1133 	ms_lib_clear_writebuf(us);
1134 
1135 	return 0;
1136 }
1137 
1138 static int ms_lib_force_setlogical_pair(struct us_data *us, u16 logblk, u16 phyblk)
1139 {
1140 	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1141 
1142 	if (logblk == MS_LB_NOT_USED)
1143 		return 0;
1144 
1145 	if ((logblk >= info->MS_Lib.NumberOfLogBlock) ||
1146 		(phyblk >= info->MS_Lib.NumberOfPhyBlock))
1147 		return (u32)-1;
1148 
1149 	info->MS_Lib.Phy2LogMap[phyblk] = logblk;
1150 	info->MS_Lib.Log2PhyMap[logblk] = phyblk;
1151 
1152 	return 0;
1153 }
1154 
1155 static int ms_read_copyblock(struct us_data *us, u16 oldphy, u16 newphy,
1156 			u16 PhyBlockAddr, u8 PageNum, unsigned char *buf, u16 len)
1157 {
1158 	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1159 	int result;
1160 
1161 	result = ene_load_bincode(us, MS_RW_PATTERN);
1162 	if (result != USB_STOR_XFER_GOOD)
1163 		return USB_STOR_TRANSPORT_ERROR;
1164 
1165 	memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1166 	bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1167 	bcb->DataTransferLength = 0x200*len;
1168 	bcb->Flags = 0x00;
1169 	bcb->CDB[0] = 0xF0;
1170 	bcb->CDB[1] = 0x08;
1171 	bcb->CDB[4] = (unsigned char)(oldphy);
1172 	bcb->CDB[3] = (unsigned char)(oldphy>>8);
1173 	bcb->CDB[2] = 0; /* (BYTE)(oldphy>>16) */
1174 	bcb->CDB[7] = (unsigned char)(newphy);
1175 	bcb->CDB[6] = (unsigned char)(newphy>>8);
1176 	bcb->CDB[5] = 0; /* (BYTE)(newphy>>16) */
1177 	bcb->CDB[9] = (unsigned char)(PhyBlockAddr);
1178 	bcb->CDB[8] = (unsigned char)(PhyBlockAddr>>8);
1179 	bcb->CDB[10] = PageNum;
1180 
1181 	result = ene_send_scsi_cmd(us, FDIR_WRITE, buf, 0);
1182 	if (result != USB_STOR_XFER_GOOD)
1183 		return USB_STOR_TRANSPORT_ERROR;
1184 
1185 	return USB_STOR_TRANSPORT_GOOD;
1186 }
1187 
1188 static int ms_read_eraseblock(struct us_data *us, u32 PhyBlockAddr)
1189 {
1190 	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1191 	int result;
1192 	u32 bn = PhyBlockAddr;
1193 
1194 	result = ene_load_bincode(us, MS_RW_PATTERN);
1195 	if (result != USB_STOR_XFER_GOOD)
1196 		return USB_STOR_TRANSPORT_ERROR;
1197 
1198 	memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1199 	bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1200 	bcb->DataTransferLength = 0x200;
1201 	bcb->Flags = US_BULK_FLAG_IN;
1202 	bcb->CDB[0] = 0xF2;
1203 	bcb->CDB[1] = 0x06;
1204 	bcb->CDB[4] = (unsigned char)(bn);
1205 	bcb->CDB[3] = (unsigned char)(bn>>8);
1206 	bcb->CDB[2] = (unsigned char)(bn>>16);
1207 
1208 	result = ene_send_scsi_cmd(us, FDIR_READ, NULL, 0);
1209 	if (result != USB_STOR_XFER_GOOD)
1210 		return USB_STOR_TRANSPORT_ERROR;
1211 
1212 	return USB_STOR_TRANSPORT_GOOD;
1213 }
1214 
1215 static int ms_lib_check_disableblock(struct us_data *us, u16 PhyBlock)
1216 {
1217 	unsigned char *PageBuf = NULL;
1218 	u16 result = MS_STATUS_SUCCESS;
1219 	u16 blk, index = 0;
1220 	struct ms_lib_type_extdat extdat;
1221 	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1222 
1223 	PageBuf = kmalloc(MS_BYTES_PER_PAGE, GFP_KERNEL);
1224 	if (PageBuf == NULL) {
1225 		result = MS_NO_MEMORY_ERROR;
1226 		goto exit;
1227 	}
1228 
1229 	ms_read_readpage(us, PhyBlock, 1, (u32 *)PageBuf, &extdat);
1230 	do {
1231 		blk = be16_to_cpu(PageBuf[index]);
1232 		if (blk == MS_LB_NOT_USED)
1233 			break;
1234 		if (blk == info->MS_Lib.Log2PhyMap[0]) {
1235 			result = MS_ERROR_FLASH_READ;
1236 			break;
1237 		}
1238 		index++;
1239 	} while (1);
1240 
1241 exit:
1242 	kfree(PageBuf);
1243 	return result;
1244 }
1245 
1246 static int ms_lib_setacquired_errorblock(struct us_data *us, u16 phyblk)
1247 {
1248 	u16 log;
1249 	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1250 
1251 	if (phyblk >= info->MS_Lib.NumberOfPhyBlock)
1252 		return (u32)-1;
1253 
1254 	log = info->MS_Lib.Phy2LogMap[phyblk];
1255 
1256 	if (log < info->MS_Lib.NumberOfLogBlock)
1257 		info->MS_Lib.Log2PhyMap[log] = MS_LB_NOT_USED;
1258 
1259 	if (info->MS_Lib.Phy2LogMap[phyblk] != MS_LB_INITIAL_ERROR)
1260 		info->MS_Lib.Phy2LogMap[phyblk] = MS_LB_ACQUIRED_ERROR;
1261 
1262 	return 0;
1263 }
1264 
1265 static int ms_lib_overwrite_extra(struct us_data *us, u32 PhyBlockAddr,
1266 				u8 PageNum, u8 OverwriteFlag)
1267 {
1268 	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1269 	int result;
1270 
1271 	result = ene_load_bincode(us, MS_RW_PATTERN);
1272 	if (result != USB_STOR_XFER_GOOD)
1273 		return USB_STOR_TRANSPORT_ERROR;
1274 
1275 	memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1276 	bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1277 	bcb->DataTransferLength = 0x4;
1278 	bcb->Flags = US_BULK_FLAG_IN;
1279 	bcb->CDB[0] = 0xF2;
1280 	bcb->CDB[1] = 0x05;
1281 	bcb->CDB[5] = (unsigned char)(PageNum);
1282 	bcb->CDB[4] = (unsigned char)(PhyBlockAddr);
1283 	bcb->CDB[3] = (unsigned char)(PhyBlockAddr>>8);
1284 	bcb->CDB[2] = (unsigned char)(PhyBlockAddr>>16);
1285 	bcb->CDB[6] = OverwriteFlag;
1286 	bcb->CDB[7] = 0xFF;
1287 	bcb->CDB[8] = 0xFF;
1288 	bcb->CDB[9] = 0xFF;
1289 
1290 	result = ene_send_scsi_cmd(us, FDIR_READ, NULL, 0);
1291 	if (result != USB_STOR_XFER_GOOD)
1292 		return USB_STOR_TRANSPORT_ERROR;
1293 
1294 	return USB_STOR_TRANSPORT_GOOD;
1295 }
1296 
1297 static int ms_lib_error_phyblock(struct us_data *us, u16 phyblk)
1298 {
1299 	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1300 
1301 	if (phyblk >= info->MS_Lib.NumberOfPhyBlock)
1302 		return MS_STATUS_ERROR;
1303 
1304 	ms_lib_setacquired_errorblock(us, phyblk);
1305 
1306 	if (ms_lib_iswritable(info))
1307 		return ms_lib_overwrite_extra(us, phyblk, 0, (u8)(~MS_REG_OVR_BKST & BYTE_MASK));
1308 
1309 	return MS_STATUS_SUCCESS;
1310 }
1311 
1312 static int ms_lib_erase_phyblock(struct us_data *us, u16 phyblk)
1313 {
1314 	u16 log;
1315 	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1316 
1317 	if (phyblk >= info->MS_Lib.NumberOfPhyBlock)
1318 		return MS_STATUS_ERROR;
1319 
1320 	log = info->MS_Lib.Phy2LogMap[phyblk];
1321 
1322 	if (log < info->MS_Lib.NumberOfLogBlock)
1323 		info->MS_Lib.Log2PhyMap[log] = MS_LB_NOT_USED;
1324 
1325 	info->MS_Lib.Phy2LogMap[phyblk] = MS_LB_NOT_USED;
1326 
1327 	if (ms_lib_iswritable(info)) {
1328 		switch (ms_read_eraseblock(us, phyblk)) {
1329 		case MS_STATUS_SUCCESS:
1330 			info->MS_Lib.Phy2LogMap[phyblk] = MS_LB_NOT_USED_ERASED;
1331 			return MS_STATUS_SUCCESS;
1332 		case MS_ERROR_FLASH_ERASE:
1333 		case MS_STATUS_INT_ERROR:
1334 			ms_lib_error_phyblock(us, phyblk);
1335 			return MS_ERROR_FLASH_ERASE;
1336 		case MS_STATUS_ERROR:
1337 		default:
1338 			ms_lib_ctrl_set(info, MS_LIB_CTRL_RDONLY); /* MS_LibCtrlSet will used by ENE_MSInit ,need check, and why us to info*/
1339 			ms_lib_setacquired_errorblock(us, phyblk);
1340 			return MS_STATUS_ERROR;
1341 		}
1342 	}
1343 
1344 	ms_lib_setacquired_errorblock(us, phyblk);
1345 
1346 	return MS_STATUS_SUCCESS;
1347 }
1348 
1349 static int ms_lib_read_extra(struct us_data *us, u32 PhyBlock,
1350 				u8 PageNum, struct ms_lib_type_extdat *ExtraDat)
1351 {
1352 	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1353 	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1354 	u8 *bbuf = info->bbuf;
1355 	int result;
1356 
1357 	memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1358 	bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1359 	bcb->DataTransferLength = 0x4;
1360 	bcb->Flags      = US_BULK_FLAG_IN;
1361 	bcb->CDB[0]     = 0xF1;
1362 	bcb->CDB[1]     = 0x03;
1363 	bcb->CDB[5]     = (unsigned char)(PageNum);
1364 	bcb->CDB[4]     = (unsigned char)(PhyBlock);
1365 	bcb->CDB[3]     = (unsigned char)(PhyBlock>>8);
1366 	bcb->CDB[2]     = (unsigned char)(PhyBlock>>16);
1367 	bcb->CDB[6]     = 0x01;
1368 
1369 	result = ene_send_scsi_cmd(us, FDIR_READ, bbuf, 0);
1370 	if (result != USB_STOR_XFER_GOOD)
1371 		return USB_STOR_TRANSPORT_ERROR;
1372 
1373 	ExtraDat->reserved = 0;
1374 	ExtraDat->intr     = 0x80;  /* Not yet, waiting for fireware support */
1375 	ExtraDat->status0  = 0x10;  /* Not yet, waiting for fireware support */
1376 	ExtraDat->status1  = 0x00;  /* Not yet, waiting for fireware support */
1377 	ExtraDat->ovrflg   = bbuf[0];
1378 	ExtraDat->mngflg   = bbuf[1];
1379 	ExtraDat->logadr   = memstick_logaddr(bbuf[2], bbuf[3]);
1380 
1381 	return USB_STOR_TRANSPORT_GOOD;
1382 }
1383 
1384 static int ms_libsearch_block_from_physical(struct us_data *us, u16 phyblk)
1385 {
1386 	u16 blk;
1387 	struct ms_lib_type_extdat extdat; /* need check */
1388 	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1389 
1390 
1391 	if (phyblk >= info->MS_Lib.NumberOfPhyBlock)
1392 		return MS_LB_ERROR;
1393 
1394 	for (blk = phyblk + 1; blk != phyblk; blk++) {
1395 		if ((blk & MS_PHYSICAL_BLOCKS_PER_SEGMENT_MASK) == 0)
1396 			blk -= MS_PHYSICAL_BLOCKS_PER_SEGMENT;
1397 
1398 		if (info->MS_Lib.Phy2LogMap[blk] == MS_LB_NOT_USED_ERASED) {
1399 			return blk;
1400 		} else if (info->MS_Lib.Phy2LogMap[blk] == MS_LB_NOT_USED) {
1401 			switch (ms_lib_read_extra(us, blk, 0, &extdat)) {
1402 			case MS_STATUS_SUCCESS:
1403 			case MS_STATUS_SUCCESS_WITH_ECC:
1404 				break;
1405 			case MS_NOCARD_ERROR:
1406 				return MS_NOCARD_ERROR;
1407 			case MS_STATUS_INT_ERROR:
1408 				return MS_LB_ERROR;
1409 			case MS_ERROR_FLASH_READ:
1410 			default:
1411 				ms_lib_setacquired_errorblock(us, blk);
1412 				continue;
1413 			} /* End switch */
1414 
1415 			if ((extdat.ovrflg & MS_REG_OVR_BKST) != MS_REG_OVR_BKST_OK) {
1416 				ms_lib_setacquired_errorblock(us, blk);
1417 				continue;
1418 			}
1419 
1420 			switch (ms_lib_erase_phyblock(us, blk)) {
1421 			case MS_STATUS_SUCCESS:
1422 				return blk;
1423 			case MS_STATUS_ERROR:
1424 				return MS_LB_ERROR;
1425 			case MS_ERROR_FLASH_ERASE:
1426 			default:
1427 				ms_lib_error_phyblock(us, blk);
1428 				break;
1429 			}
1430 		}
1431 	} /* End for */
1432 
1433 	return MS_LB_ERROR;
1434 }
1435 static int ms_libsearch_block_from_logical(struct us_data *us, u16 logblk)
1436 {
1437 	u16 phyblk;
1438 	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1439 
1440 	phyblk = ms_libconv_to_physical(info, logblk);
1441 	if (phyblk >= MS_LB_ERROR) {
1442 		if (logblk >= info->MS_Lib.NumberOfLogBlock)
1443 			return MS_LB_ERROR;
1444 
1445 		phyblk = (logblk + MS_NUMBER_OF_BOOT_BLOCK) / MS_LOGICAL_BLOCKS_PER_SEGMENT;
1446 		phyblk *= MS_PHYSICAL_BLOCKS_PER_SEGMENT;
1447 		phyblk += MS_PHYSICAL_BLOCKS_PER_SEGMENT - 1;
1448 	}
1449 
1450 	return ms_libsearch_block_from_physical(us, phyblk);
1451 }
1452 
1453 static int ms_scsi_test_unit_ready(struct us_data *us, struct scsi_cmnd *srb)
1454 {
1455 	struct ene_ub6250_info *info = (struct ene_ub6250_info *)(us->extra);
1456 
1457 	/* pr_info("MS_SCSI_Test_Unit_Ready\n"); */
1458 	if (info->MS_Status.Insert && info->MS_Status.Ready) {
1459 		return USB_STOR_TRANSPORT_GOOD;
1460 	} else {
1461 		ene_ms_init(us);
1462 		return USB_STOR_TRANSPORT_GOOD;
1463 	}
1464 
1465 	return USB_STOR_TRANSPORT_GOOD;
1466 }
1467 
1468 static int ms_scsi_mode_sense(struct us_data *us, struct scsi_cmnd *srb)
1469 {
1470 	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1471 	unsigned char mediaNoWP[12] = {
1472 		0x0b, 0x00, 0x00, 0x08, 0x00, 0x00,
1473 		0x71, 0xc0, 0x00, 0x00, 0x02, 0x00 };
1474 	unsigned char mediaWP[12]   = {
1475 		0x0b, 0x00, 0x80, 0x08, 0x00, 0x00,
1476 		0x71, 0xc0, 0x00, 0x00, 0x02, 0x00 };
1477 
1478 	if (info->MS_Status.WtP)
1479 		usb_stor_set_xfer_buf(mediaWP, 12, srb);
1480 	else
1481 		usb_stor_set_xfer_buf(mediaNoWP, 12, srb);
1482 
1483 	return USB_STOR_TRANSPORT_GOOD;
1484 }
1485 
1486 static int ms_scsi_read_capacity(struct us_data *us, struct scsi_cmnd *srb)
1487 {
1488 	u32   bl_num;
1489 	u16    bl_len;
1490 	unsigned int offset = 0;
1491 	unsigned char    buf[8];
1492 	struct scatterlist *sg = NULL;
1493 	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1494 
1495 	usb_stor_dbg(us, "ms_scsi_read_capacity\n");
1496 	bl_len = 0x200;
1497 	if (info->MS_Status.IsMSPro)
1498 		bl_num = info->MSP_TotalBlock - 1;
1499 	else
1500 		bl_num = info->MS_Lib.NumberOfLogBlock * info->MS_Lib.blockSize * 2 - 1;
1501 
1502 	info->bl_num = bl_num;
1503 	usb_stor_dbg(us, "bl_len = %x\n", bl_len);
1504 	usb_stor_dbg(us, "bl_num = %x\n", bl_num);
1505 
1506 	/*srb->request_bufflen = 8; */
1507 	buf[0] = (bl_num >> 24) & 0xff;
1508 	buf[1] = (bl_num >> 16) & 0xff;
1509 	buf[2] = (bl_num >> 8) & 0xff;
1510 	buf[3] = (bl_num >> 0) & 0xff;
1511 	buf[4] = (bl_len >> 24) & 0xff;
1512 	buf[5] = (bl_len >> 16) & 0xff;
1513 	buf[6] = (bl_len >> 8) & 0xff;
1514 	buf[7] = (bl_len >> 0) & 0xff;
1515 
1516 	usb_stor_access_xfer_buf(buf, 8, srb, &sg, &offset, TO_XFER_BUF);
1517 
1518 	return USB_STOR_TRANSPORT_GOOD;
1519 }
1520 
1521 static void ms_lib_phy_to_log_range(u16 PhyBlock, u16 *LogStart, u16 *LogEnde)
1522 {
1523 	PhyBlock /= MS_PHYSICAL_BLOCKS_PER_SEGMENT;
1524 
1525 	if (PhyBlock) {
1526 		*LogStart = MS_LOGICAL_BLOCKS_IN_1ST_SEGMENT + (PhyBlock - 1) * MS_LOGICAL_BLOCKS_PER_SEGMENT;/*496*/
1527 		*LogEnde = *LogStart + MS_LOGICAL_BLOCKS_PER_SEGMENT;/*496*/
1528 	} else {
1529 		*LogStart = 0;
1530 		*LogEnde = MS_LOGICAL_BLOCKS_IN_1ST_SEGMENT;/*494*/
1531 	}
1532 }
1533 
1534 static int ms_lib_read_extrablock(struct us_data *us, u32 PhyBlock,
1535 	u8 PageNum, u8 blen, void *buf)
1536 {
1537 	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1538 	int     result;
1539 
1540 	/* Read Extra Data */
1541 	memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1542 	bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1543 	bcb->DataTransferLength = 0x4 * blen;
1544 	bcb->Flags      = US_BULK_FLAG_IN;
1545 	bcb->CDB[0]     = 0xF1;
1546 	bcb->CDB[1]     = 0x03;
1547 	bcb->CDB[5]     = (unsigned char)(PageNum);
1548 	bcb->CDB[4]     = (unsigned char)(PhyBlock);
1549 	bcb->CDB[3]     = (unsigned char)(PhyBlock>>8);
1550 	bcb->CDB[2]     = (unsigned char)(PhyBlock>>16);
1551 	bcb->CDB[6]     = blen;
1552 
1553 	result = ene_send_scsi_cmd(us, FDIR_READ, buf, 0);
1554 	if (result != USB_STOR_XFER_GOOD)
1555 		return USB_STOR_TRANSPORT_ERROR;
1556 
1557 	return USB_STOR_TRANSPORT_GOOD;
1558 }
1559 
1560 static int ms_lib_scan_logicalblocknumber(struct us_data *us, u16 btBlk1st)
1561 {
1562 	u16 PhyBlock, newblk, i;
1563 	u16 LogStart, LogEnde;
1564 	struct ms_lib_type_extdat extdat;
1565 	u32 count = 0, index = 0;
1566 	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1567 	u8 *bbuf = info->bbuf;
1568 
1569 	for (PhyBlock = 0; PhyBlock < info->MS_Lib.NumberOfPhyBlock;) {
1570 		ms_lib_phy_to_log_range(PhyBlock, &LogStart, &LogEnde);
1571 
1572 		for (i = 0; i < MS_PHYSICAL_BLOCKS_PER_SEGMENT; i++, PhyBlock++) {
1573 			switch (ms_libconv_to_logical(info, PhyBlock)) {
1574 			case MS_STATUS_ERROR:
1575 				continue;
1576 			default:
1577 				break;
1578 			}
1579 
1580 			if (count == PhyBlock) {
1581 				ms_lib_read_extrablock(us, PhyBlock, 0, 0x80,
1582 						bbuf);
1583 				count += 0x80;
1584 			}
1585 			index = (PhyBlock % 0x80) * 4;
1586 
1587 			extdat.ovrflg = bbuf[index];
1588 			extdat.mngflg = bbuf[index+1];
1589 			extdat.logadr = memstick_logaddr(bbuf[index+2],
1590 					bbuf[index+3]);
1591 
1592 			if ((extdat.ovrflg & MS_REG_OVR_BKST) != MS_REG_OVR_BKST_OK) {
1593 				ms_lib_setacquired_errorblock(us, PhyBlock);
1594 				continue;
1595 			}
1596 
1597 			if ((extdat.mngflg & MS_REG_MNG_ATFLG) == MS_REG_MNG_ATFLG_ATTBL) {
1598 				ms_lib_erase_phyblock(us, PhyBlock);
1599 				continue;
1600 			}
1601 
1602 			if (extdat.logadr != MS_LB_NOT_USED) {
1603 				if ((extdat.logadr < LogStart) || (LogEnde <= extdat.logadr)) {
1604 					ms_lib_erase_phyblock(us, PhyBlock);
1605 					continue;
1606 				}
1607 
1608 				newblk = ms_libconv_to_physical(info, extdat.logadr);
1609 
1610 				if (newblk != MS_LB_NOT_USED) {
1611 					if (extdat.logadr == 0) {
1612 						ms_lib_set_logicalpair(us, extdat.logadr, PhyBlock);
1613 						if (ms_lib_check_disableblock(us, btBlk1st)) {
1614 							ms_lib_set_logicalpair(us, extdat.logadr, newblk);
1615 							continue;
1616 						}
1617 					}
1618 
1619 					ms_lib_read_extra(us, newblk, 0, &extdat);
1620 					if ((extdat.ovrflg & MS_REG_OVR_UDST) == MS_REG_OVR_UDST_UPDATING) {
1621 						ms_lib_erase_phyblock(us, PhyBlock);
1622 						continue;
1623 					} else {
1624 						ms_lib_erase_phyblock(us, newblk);
1625 					}
1626 				}
1627 
1628 				ms_lib_set_logicalpair(us, extdat.logadr, PhyBlock);
1629 			}
1630 		}
1631 	} /* End for ... */
1632 
1633 	return MS_STATUS_SUCCESS;
1634 }
1635 
1636 
1637 static int ms_scsi_read(struct us_data *us, struct scsi_cmnd *srb)
1638 {
1639 	int result;
1640 	unsigned char *cdb = srb->cmnd;
1641 	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1642 	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1643 
1644 	u32 bn = ((cdb[2] << 24) & 0xff000000) | ((cdb[3] << 16) & 0x00ff0000) |
1645 		((cdb[4] << 8) & 0x0000ff00) | ((cdb[5] << 0) & 0x000000ff);
1646 	u16 blen = ((cdb[7] << 8) & 0xff00) | ((cdb[8] << 0) & 0x00ff);
1647 	u32 blenByte = blen * 0x200;
1648 
1649 	if (bn > info->bl_num)
1650 		return USB_STOR_TRANSPORT_ERROR;
1651 
1652 	if (info->MS_Status.IsMSPro) {
1653 		result = ene_load_bincode(us, MSP_RW_PATTERN);
1654 		if (result != USB_STOR_XFER_GOOD) {
1655 			usb_stor_dbg(us, "Load MPS RW pattern Fail !!\n");
1656 			return USB_STOR_TRANSPORT_ERROR;
1657 		}
1658 
1659 		/* set up the command wrapper */
1660 		memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1661 		bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1662 		bcb->DataTransferLength = blenByte;
1663 		bcb->Flags  = US_BULK_FLAG_IN;
1664 		bcb->CDB[0] = 0xF1;
1665 		bcb->CDB[1] = 0x02;
1666 		bcb->CDB[5] = (unsigned char)(bn);
1667 		bcb->CDB[4] = (unsigned char)(bn>>8);
1668 		bcb->CDB[3] = (unsigned char)(bn>>16);
1669 		bcb->CDB[2] = (unsigned char)(bn>>24);
1670 
1671 		result = ene_send_scsi_cmd(us, FDIR_READ, scsi_sglist(srb), 1);
1672 	} else {
1673 		void *buf;
1674 		int offset = 0;
1675 		u16 phyblk, logblk;
1676 		u8 PageNum;
1677 		u16 len;
1678 		u32 blkno;
1679 
1680 		buf = kmalloc(blenByte, GFP_KERNEL);
1681 		if (buf == NULL)
1682 			return USB_STOR_TRANSPORT_ERROR;
1683 
1684 		result = ene_load_bincode(us, MS_RW_PATTERN);
1685 		if (result != USB_STOR_XFER_GOOD) {
1686 			pr_info("Load MS RW pattern Fail !!\n");
1687 			result = USB_STOR_TRANSPORT_ERROR;
1688 			goto exit;
1689 		}
1690 
1691 		logblk  = (u16)(bn / info->MS_Lib.PagesPerBlock);
1692 		PageNum = (u8)(bn % info->MS_Lib.PagesPerBlock);
1693 
1694 		while (1) {
1695 			if (blen > (info->MS_Lib.PagesPerBlock-PageNum))
1696 				len = info->MS_Lib.PagesPerBlock-PageNum;
1697 			else
1698 				len = blen;
1699 
1700 			phyblk = ms_libconv_to_physical(info, logblk);
1701 			blkno  = phyblk * 0x20 + PageNum;
1702 
1703 			/* set up the command wrapper */
1704 			memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1705 			bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1706 			bcb->DataTransferLength = 0x200 * len;
1707 			bcb->Flags  = US_BULK_FLAG_IN;
1708 			bcb->CDB[0] = 0xF1;
1709 			bcb->CDB[1] = 0x02;
1710 			bcb->CDB[5] = (unsigned char)(blkno);
1711 			bcb->CDB[4] = (unsigned char)(blkno>>8);
1712 			bcb->CDB[3] = (unsigned char)(blkno>>16);
1713 			bcb->CDB[2] = (unsigned char)(blkno>>24);
1714 
1715 			result = ene_send_scsi_cmd(us, FDIR_READ, buf+offset, 0);
1716 			if (result != USB_STOR_XFER_GOOD) {
1717 				pr_info("MS_SCSI_Read --- result = %x\n", result);
1718 				result = USB_STOR_TRANSPORT_ERROR;
1719 				goto exit;
1720 			}
1721 
1722 			blen -= len;
1723 			if (blen <= 0)
1724 				break;
1725 			logblk++;
1726 			PageNum = 0;
1727 			offset += MS_BYTES_PER_PAGE*len;
1728 		}
1729 		usb_stor_set_xfer_buf(buf, blenByte, srb);
1730 exit:
1731 		kfree(buf);
1732 	}
1733 	return result;
1734 }
1735 
1736 static int ms_scsi_write(struct us_data *us, struct scsi_cmnd *srb)
1737 {
1738 	int result;
1739 	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1740 	unsigned char *cdb = srb->cmnd;
1741 	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1742 
1743 	u32 bn = ((cdb[2] << 24) & 0xff000000) |
1744 			((cdb[3] << 16) & 0x00ff0000) |
1745 			((cdb[4] << 8) & 0x0000ff00) |
1746 			((cdb[5] << 0) & 0x000000ff);
1747 	u16 blen = ((cdb[7] << 8) & 0xff00) | ((cdb[8] << 0) & 0x00ff);
1748 	u32 blenByte = blen * 0x200;
1749 
1750 	if (bn > info->bl_num)
1751 		return USB_STOR_TRANSPORT_ERROR;
1752 
1753 	if (info->MS_Status.IsMSPro) {
1754 		result = ene_load_bincode(us, MSP_RW_PATTERN);
1755 		if (result != USB_STOR_XFER_GOOD) {
1756 			pr_info("Load MSP RW pattern Fail !!\n");
1757 			return USB_STOR_TRANSPORT_ERROR;
1758 		}
1759 
1760 		/* set up the command wrapper */
1761 		memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1762 		bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1763 		bcb->DataTransferLength = blenByte;
1764 		bcb->Flags  = 0x00;
1765 		bcb->CDB[0] = 0xF0;
1766 		bcb->CDB[1] = 0x04;
1767 		bcb->CDB[5] = (unsigned char)(bn);
1768 		bcb->CDB[4] = (unsigned char)(bn>>8);
1769 		bcb->CDB[3] = (unsigned char)(bn>>16);
1770 		bcb->CDB[2] = (unsigned char)(bn>>24);
1771 
1772 		result = ene_send_scsi_cmd(us, FDIR_WRITE, scsi_sglist(srb), 1);
1773 	} else {
1774 		void *buf;
1775 		int offset = 0;
1776 		u16 PhyBlockAddr;
1777 		u8 PageNum;
1778 		u16 len, oldphy, newphy;
1779 
1780 		buf = kmalloc(blenByte, GFP_KERNEL);
1781 		if (buf == NULL)
1782 			return USB_STOR_TRANSPORT_ERROR;
1783 		usb_stor_set_xfer_buf(buf, blenByte, srb);
1784 
1785 		result = ene_load_bincode(us, MS_RW_PATTERN);
1786 		if (result != USB_STOR_XFER_GOOD) {
1787 			pr_info("Load MS RW pattern Fail !!\n");
1788 			result = USB_STOR_TRANSPORT_ERROR;
1789 			goto exit;
1790 		}
1791 
1792 		PhyBlockAddr = (u16)(bn / info->MS_Lib.PagesPerBlock);
1793 		PageNum      = (u8)(bn % info->MS_Lib.PagesPerBlock);
1794 
1795 		while (1) {
1796 			if (blen > (info->MS_Lib.PagesPerBlock-PageNum))
1797 				len = info->MS_Lib.PagesPerBlock-PageNum;
1798 			else
1799 				len = blen;
1800 
1801 			oldphy = ms_libconv_to_physical(info, PhyBlockAddr); /* need check us <-> info */
1802 			newphy = ms_libsearch_block_from_logical(us, PhyBlockAddr);
1803 
1804 			result = ms_read_copyblock(us, oldphy, newphy, PhyBlockAddr, PageNum, buf+offset, len);
1805 
1806 			if (result != USB_STOR_XFER_GOOD) {
1807 				pr_info("MS_SCSI_Write --- result = %x\n", result);
1808 				result =  USB_STOR_TRANSPORT_ERROR;
1809 				goto exit;
1810 			}
1811 
1812 			info->MS_Lib.Phy2LogMap[oldphy] = MS_LB_NOT_USED_ERASED;
1813 			ms_lib_force_setlogical_pair(us, PhyBlockAddr, newphy);
1814 
1815 			blen -= len;
1816 			if (blen <= 0)
1817 				break;
1818 			PhyBlockAddr++;
1819 			PageNum = 0;
1820 			offset += MS_BYTES_PER_PAGE*len;
1821 		}
1822 exit:
1823 		kfree(buf);
1824 	}
1825 	return result;
1826 }
1827 
1828 /*
1829  * ENE MS Card
1830  */
1831 
1832 static int ene_get_card_type(struct us_data *us, u16 index, void *buf)
1833 {
1834 	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1835 	int result;
1836 
1837 	memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1838 	bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1839 	bcb->DataTransferLength	= 0x01;
1840 	bcb->Flags			= US_BULK_FLAG_IN;
1841 	bcb->CDB[0]			= 0xED;
1842 	bcb->CDB[2]			= (unsigned char)(index>>8);
1843 	bcb->CDB[3]			= (unsigned char)index;
1844 
1845 	result = ene_send_scsi_cmd(us, FDIR_READ, buf, 0);
1846 	return result;
1847 }
1848 
1849 static int ene_get_card_status(struct us_data *us, u8 *buf)
1850 {
1851 	u16 tmpreg;
1852 	u32 reg4b;
1853 	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1854 
1855 	/*usb_stor_dbg(us, "transport --- ENE_ReadSDReg\n");*/
1856 	reg4b = *(u32 *)&buf[0x18];
1857 	info->SD_READ_BL_LEN = (u8)((reg4b >> 8) & 0x0f);
1858 
1859 	tmpreg = (u16) reg4b;
1860 	reg4b = *(u32 *)(&buf[0x14]);
1861 	if (info->SD_Status.HiCapacity && !info->SD_Status.IsMMC)
1862 		info->HC_C_SIZE = (reg4b >> 8) & 0x3fffff;
1863 
1864 	info->SD_C_SIZE = ((tmpreg & 0x03) << 10) | (u16)(reg4b >> 22);
1865 	info->SD_C_SIZE_MULT = (u8)(reg4b >> 7)  & 0x07;
1866 	if (info->SD_Status.HiCapacity && info->SD_Status.IsMMC)
1867 		info->HC_C_SIZE = *(u32 *)(&buf[0x100]);
1868 
1869 	if (info->SD_READ_BL_LEN > SD_BLOCK_LEN) {
1870 		info->SD_Block_Mult = 1 << (info->SD_READ_BL_LEN-SD_BLOCK_LEN);
1871 		info->SD_READ_BL_LEN = SD_BLOCK_LEN;
1872 	} else {
1873 		info->SD_Block_Mult = 1;
1874 	}
1875 
1876 	return USB_STOR_TRANSPORT_GOOD;
1877 }
1878 
1879 static int ene_load_bincode(struct us_data *us, unsigned char flag)
1880 {
1881 	int err;
1882 	char *fw_name = NULL;
1883 	unsigned char *buf = NULL;
1884 	const struct firmware *sd_fw = NULL;
1885 	int result = USB_STOR_TRANSPORT_ERROR;
1886 	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1887 	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1888 
1889 	if (info->BIN_FLAG == flag)
1890 		return USB_STOR_TRANSPORT_GOOD;
1891 
1892 	switch (flag) {
1893 	/* For SD */
1894 	case SD_INIT1_PATTERN:
1895 		usb_stor_dbg(us, "SD_INIT1_PATTERN\n");
1896 		fw_name = SD_INIT1_FIRMWARE;
1897 		break;
1898 	case SD_INIT2_PATTERN:
1899 		usb_stor_dbg(us, "SD_INIT2_PATTERN\n");
1900 		fw_name = SD_INIT2_FIRMWARE;
1901 		break;
1902 	case SD_RW_PATTERN:
1903 		usb_stor_dbg(us, "SD_RW_PATTERN\n");
1904 		fw_name = SD_RW_FIRMWARE;
1905 		break;
1906 	/* For MS */
1907 	case MS_INIT_PATTERN:
1908 		usb_stor_dbg(us, "MS_INIT_PATTERN\n");
1909 		fw_name = MS_INIT_FIRMWARE;
1910 		break;
1911 	case MSP_RW_PATTERN:
1912 		usb_stor_dbg(us, "MSP_RW_PATTERN\n");
1913 		fw_name = MSP_RW_FIRMWARE;
1914 		break;
1915 	case MS_RW_PATTERN:
1916 		usb_stor_dbg(us, "MS_RW_PATTERN\n");
1917 		fw_name = MS_RW_FIRMWARE;
1918 		break;
1919 	default:
1920 		usb_stor_dbg(us, "----------- Unknown PATTERN ----------\n");
1921 		goto nofw;
1922 	}
1923 
1924 	err = request_firmware(&sd_fw, fw_name, &us->pusb_dev->dev);
1925 	if (err) {
1926 		usb_stor_dbg(us, "load firmware %s failed\n", fw_name);
1927 		goto nofw;
1928 	}
1929 	buf = kmemdup(sd_fw->data, sd_fw->size, GFP_KERNEL);
1930 	if (buf == NULL)
1931 		goto nofw;
1932 
1933 	memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1934 	bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1935 	bcb->DataTransferLength = sd_fw->size;
1936 	bcb->Flags = 0x00;
1937 	bcb->CDB[0] = 0xEF;
1938 
1939 	result = ene_send_scsi_cmd(us, FDIR_WRITE, buf, 0);
1940 	if (us->srb != NULL)
1941 		scsi_set_resid(us->srb, 0);
1942 	info->BIN_FLAG = flag;
1943 	kfree(buf);
1944 
1945 nofw:
1946 	release_firmware(sd_fw);
1947 	return result;
1948 }
1949 
1950 static int ms_card_init(struct us_data *us)
1951 {
1952 	u32 result;
1953 	u16 TmpBlock;
1954 	unsigned char *PageBuffer0 = NULL, *PageBuffer1 = NULL;
1955 	struct ms_lib_type_extdat extdat;
1956 	u16 btBlk1st, btBlk2nd;
1957 	u32 btBlk1stErred;
1958 	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1959 
1960 	printk(KERN_INFO "MS_CardInit start\n");
1961 
1962 	ms_lib_free_allocatedarea(us); /* Clean buffer and set struct us_data flag to 0 */
1963 
1964 	/* get two PageBuffer */
1965 	PageBuffer0 = kmalloc(MS_BYTES_PER_PAGE, GFP_KERNEL);
1966 	PageBuffer1 = kmalloc(MS_BYTES_PER_PAGE, GFP_KERNEL);
1967 	if ((PageBuffer0 == NULL) || (PageBuffer1 == NULL)) {
1968 		result = MS_NO_MEMORY_ERROR;
1969 		goto exit;
1970 	}
1971 
1972 	btBlk1st = btBlk2nd = MS_LB_NOT_USED;
1973 	btBlk1stErred = 0;
1974 
1975 	for (TmpBlock = 0; TmpBlock < MS_MAX_INITIAL_ERROR_BLOCKS+2; TmpBlock++) {
1976 
1977 		switch (ms_read_readpage(us, TmpBlock, 0, (u32 *)PageBuffer0, &extdat)) {
1978 		case MS_STATUS_SUCCESS:
1979 			break;
1980 		case MS_STATUS_INT_ERROR:
1981 			break;
1982 		case MS_STATUS_ERROR:
1983 		default:
1984 			continue;
1985 		}
1986 
1987 		if ((extdat.ovrflg & MS_REG_OVR_BKST) == MS_REG_OVR_BKST_NG)
1988 			continue;
1989 
1990 		if (((extdat.mngflg & MS_REG_MNG_SYSFLG) == MS_REG_MNG_SYSFLG_USER) ||
1991 			(be16_to_cpu(((struct ms_bootblock_page0 *)PageBuffer0)->header.wBlockID) != MS_BOOT_BLOCK_ID) ||
1992 			(be16_to_cpu(((struct ms_bootblock_page0 *)PageBuffer0)->header.wFormatVersion) != MS_BOOT_BLOCK_FORMAT_VERSION) ||
1993 			(((struct ms_bootblock_page0 *)PageBuffer0)->header.bNumberOfDataEntry != MS_BOOT_BLOCK_DATA_ENTRIES))
1994 				continue;
1995 
1996 		if (btBlk1st != MS_LB_NOT_USED) {
1997 			btBlk2nd = TmpBlock;
1998 			break;
1999 		}
2000 
2001 		btBlk1st = TmpBlock;
2002 		memcpy(PageBuffer1, PageBuffer0, MS_BYTES_PER_PAGE);
2003 		if (extdat.status1 & (MS_REG_ST1_DTER | MS_REG_ST1_EXER | MS_REG_ST1_FGER))
2004 			btBlk1stErred = 1;
2005 	}
2006 
2007 	if (btBlk1st == MS_LB_NOT_USED) {
2008 		result = MS_STATUS_ERROR;
2009 		goto exit;
2010 	}
2011 
2012 	/* write protect */
2013 	if ((extdat.status0 & MS_REG_ST0_WP) == MS_REG_ST0_WP_ON)
2014 		ms_lib_ctrl_set(info, MS_LIB_CTRL_WRPROTECT);
2015 
2016 	result = MS_STATUS_ERROR;
2017 	/* 1st Boot Block */
2018 	if (btBlk1stErred == 0)
2019 		result = ms_lib_process_bootblock(us, btBlk1st, PageBuffer1);
2020 		/* 1st */
2021 	/* 2nd Boot Block */
2022 	if (result && (btBlk2nd != MS_LB_NOT_USED))
2023 		result = ms_lib_process_bootblock(us, btBlk2nd, PageBuffer0);
2024 
2025 	if (result) {
2026 		result = MS_STATUS_ERROR;
2027 		goto exit;
2028 	}
2029 
2030 	for (TmpBlock = 0; TmpBlock < btBlk1st; TmpBlock++)
2031 		info->MS_Lib.Phy2LogMap[TmpBlock] = MS_LB_INITIAL_ERROR;
2032 
2033 	info->MS_Lib.Phy2LogMap[btBlk1st] = MS_LB_BOOT_BLOCK;
2034 
2035 	if (btBlk2nd != MS_LB_NOT_USED) {
2036 		for (TmpBlock = btBlk1st + 1; TmpBlock < btBlk2nd; TmpBlock++)
2037 			info->MS_Lib.Phy2LogMap[TmpBlock] = MS_LB_INITIAL_ERROR;
2038 
2039 		info->MS_Lib.Phy2LogMap[btBlk2nd] = MS_LB_BOOT_BLOCK;
2040 	}
2041 
2042 	result = ms_lib_scan_logicalblocknumber(us, btBlk1st);
2043 	if (result)
2044 		goto exit;
2045 
2046 	for (TmpBlock = MS_PHYSICAL_BLOCKS_PER_SEGMENT;
2047 		TmpBlock < info->MS_Lib.NumberOfPhyBlock;
2048 		TmpBlock += MS_PHYSICAL_BLOCKS_PER_SEGMENT) {
2049 		if (ms_count_freeblock(us, TmpBlock) == 0) {
2050 			ms_lib_ctrl_set(info, MS_LIB_CTRL_WRPROTECT);
2051 			break;
2052 		}
2053 	}
2054 
2055 	/* write */
2056 	if (ms_lib_alloc_writebuf(us)) {
2057 		result = MS_NO_MEMORY_ERROR;
2058 		goto exit;
2059 	}
2060 
2061 	result = MS_STATUS_SUCCESS;
2062 
2063 exit:
2064 	kfree(PageBuffer1);
2065 	kfree(PageBuffer0);
2066 
2067 	printk(KERN_INFO "MS_CardInit end\n");
2068 	return result;
2069 }
2070 
2071 static int ene_ms_init(struct us_data *us)
2072 {
2073 	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
2074 	int result;
2075 	u16 MSP_BlockSize, MSP_UserAreaBlocks;
2076 	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
2077 	u8 *bbuf = info->bbuf;
2078 
2079 	printk(KERN_INFO "transport --- ENE_MSInit\n");
2080 
2081 	/* the same part to test ENE */
2082 
2083 	result = ene_load_bincode(us, MS_INIT_PATTERN);
2084 	if (result != USB_STOR_XFER_GOOD) {
2085 		printk(KERN_ERR "Load MS Init Code Fail !!\n");
2086 		return USB_STOR_TRANSPORT_ERROR;
2087 	}
2088 
2089 	memset(bcb, 0, sizeof(struct bulk_cb_wrap));
2090 	bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
2091 	bcb->DataTransferLength = 0x200;
2092 	bcb->Flags      = US_BULK_FLAG_IN;
2093 	bcb->CDB[0]     = 0xF1;
2094 	bcb->CDB[1]     = 0x01;
2095 
2096 	result = ene_send_scsi_cmd(us, FDIR_READ, bbuf, 0);
2097 	if (result != USB_STOR_XFER_GOOD) {
2098 		printk(KERN_ERR "Execution MS Init Code Fail !!\n");
2099 		return USB_STOR_TRANSPORT_ERROR;
2100 	}
2101 	/* the same part to test ENE */
2102 	info->MS_Status = *(struct MS_STATUS *) bbuf;
2103 
2104 	if (info->MS_Status.Insert && info->MS_Status.Ready) {
2105 		printk(KERN_INFO "Insert     = %x\n", info->MS_Status.Insert);
2106 		printk(KERN_INFO "Ready      = %x\n", info->MS_Status.Ready);
2107 		printk(KERN_INFO "IsMSPro    = %x\n", info->MS_Status.IsMSPro);
2108 		printk(KERN_INFO "IsMSPHG    = %x\n", info->MS_Status.IsMSPHG);
2109 		printk(KERN_INFO "WtP= %x\n", info->MS_Status.WtP);
2110 		if (info->MS_Status.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 
2126 static 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 =  *(struct SD_STATUS *) bbuf;
2172 	if (info->SD_Status.Insert && info->SD_Status.Ready) {
2173 		struct SD_STATUS *s = &info->SD_Status;
2174 
2175 		ene_get_card_status(us, bbuf);
2176 		usb_stor_dbg(us, "Insert     = %x\n", s->Insert);
2177 		usb_stor_dbg(us, "Ready      = %x\n", s->Ready);
2178 		usb_stor_dbg(us, "IsMMC      = %x\n", s->IsMMC);
2179 		usb_stor_dbg(us, "HiCapacity = %x\n", s->HiCapacity);
2180 		usb_stor_dbg(us, "HiSpeed    = %x\n", s->HiSpeed);
2181 		usb_stor_dbg(us, "WtP        = %x\n", s->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 
2190 static 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.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.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() ---------*/
2220 static 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  */
2265 static 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 
2302 static 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.Ready || info->MS_Status.Ready)))
2310 		result = ene_init(us);
2311 	if (result == USB_STOR_XFER_GOOD) {
2312 		result = USB_STOR_TRANSPORT_ERROR;
2313 		if (info->SD_Status.Ready)
2314 			result = sd_scsi_irp(us, srb);
2315 
2316 		if (info->MS_Status.Ready)
2317 			result = ms_scsi_irp(us, srb);
2318 	}
2319 	return result;
2320 }
2321 
2322 static struct scsi_host_template ene_ub6250_host_template;
2323 
2324 static 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 
2378 static int ene_ub6250_resume(struct usb_interface *iface)
2379 {
2380 	u8 tmp = 0;
2381 	struct us_data *us = usb_get_intfdata(iface);
2382 	struct ene_ub6250_info *info = (struct ene_ub6250_info *)(us->extra);
2383 
2384 	mutex_lock(&us->dev_mutex);
2385 
2386 	if (us->suspend_resume_hook)
2387 		(us->suspend_resume_hook)(us, US_RESUME);
2388 
2389 	mutex_unlock(&us->dev_mutex);
2390 
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 static int ene_ub6250_reset_resume(struct usb_interface *iface)
2401 {
2402 	u8 tmp = 0;
2403 	struct us_data *us = usb_get_intfdata(iface);
2404 	struct ene_ub6250_info *info = (struct ene_ub6250_info *)(us->extra);
2405 
2406 	/* Report the reset to the SCSI core */
2407 	usb_stor_reset_resume(iface);
2408 
2409 	/*
2410 	 * FIXME: Notify the subdrivers that they need to reinitialize
2411 	 * the device
2412 	 */
2413 	info->Power_IsResum = true;
2414 	/*info->SD_Status.Ready = 0; */
2415 	info->SD_Status = *(struct SD_STATUS *)&tmp;
2416 	info->MS_Status = *(struct MS_STATUS *)&tmp;
2417 	info->SM_Status = *(struct SM_STATUS *)&tmp;
2418 
2419 	return 0;
2420 }
2421 
2422 #else
2423 
2424 #define ene_ub6250_resume		NULL
2425 #define ene_ub6250_reset_resume		NULL
2426 
2427 #endif
2428 
2429 static struct usb_driver ene_ub6250_driver = {
2430 	.name =		DRV_NAME,
2431 	.probe =	ene_ub6250_probe,
2432 	.disconnect =	usb_stor_disconnect,
2433 	.suspend =	usb_stor_suspend,
2434 	.resume =	ene_ub6250_resume,
2435 	.reset_resume =	ene_ub6250_reset_resume,
2436 	.pre_reset =	usb_stor_pre_reset,
2437 	.post_reset =	usb_stor_post_reset,
2438 	.id_table =	ene_ub6250_usb_ids,
2439 	.soft_unbind =	1,
2440 	.no_dynamic_id = 1,
2441 };
2442 
2443 module_usb_stor_driver(ene_ub6250_driver, ene_ub6250_host_template, DRV_NAME);
2444