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