]> asedeno.scripts.mit.edu Git - linux.git/blob - drivers/usb/storage/ene_ub6250.c
44aca29ad6cc30fe396e08c168616357e7fa1b05
[linux.git] / drivers / usb / storage / ene_ub6250.c
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              0x000000        /* No Sense */
99 #define SS_NOT_READY            0x023A00        /* Medium not present */
100 #define SS_MEDIUM_ERR           0x031100        /* Unrecovered read error */
101 #define SS_HW_ERR               0x040800        /* Communication failure */
102 #define SS_ILLEGAL_REQUEST      0x052000        /* Invalid command */
103 #define SS_UNIT_ATTENTION       0x062900        /* Reset occurred */
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         /* for 6250 code */
450         struct SD_STATUS        SD_Status;
451         struct MS_STATUS        MS_Status;
452         struct SM_STATUS        SM_Status;
453
454         /* ----- SD Control Data ---------------- */
455         /*SD_REGISTER SD_Regs; */
456         u16             SD_Block_Mult;
457         u8              SD_READ_BL_LEN;
458         u16             SD_C_SIZE;
459         u8              SD_C_SIZE_MULT;
460
461         /* SD/MMC New spec. */
462         u8              SD_SPEC_VER;
463         u8              SD_CSD_VER;
464         u8              SD20_HIGH_CAPACITY;
465         u32             HC_C_SIZE;
466         u8              MMC_SPEC_VER;
467         u8              MMC_BusWidth;
468         u8              MMC_HIGH_CAPACITY;
469
470         /*----- MS Control Data ---------------- */
471         bool            MS_SWWP;
472         u32             MSP_TotalBlock;
473         struct ms_lib_ctrl MS_Lib;
474         bool            MS_IsRWPage;
475         u16             MS_Model;
476
477         /*----- SM Control Data ---------------- */
478         u8              SM_DeviceID;
479         u8              SM_CardID;
480
481         unsigned char   *testbuf;
482         u8              BIN_FLAG;
483         u32             bl_num;
484         int             SrbStatus;
485
486         /*------Power Managerment ---------------*/
487         bool            Power_IsResum;
488 };
489
490 static int ene_sd_init(struct us_data *us);
491 static int ene_ms_init(struct us_data *us);
492 static int ene_load_bincode(struct us_data *us, unsigned char flag);
493
494 static void ene_ub6250_info_destructor(void *extra)
495 {
496         if (!extra)
497                 return;
498 }
499
500 static int ene_send_scsi_cmd(struct us_data *us, u8 fDir, void *buf, int use_sg)
501 {
502         struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
503         struct bulk_cs_wrap *bcs = (struct bulk_cs_wrap *) us->iobuf;
504
505         int result;
506         unsigned int residue;
507         unsigned int cswlen = 0, partial = 0;
508         unsigned int transfer_length = bcb->DataTransferLength;
509
510         /* usb_stor_dbg(us, "transport --- ene_send_scsi_cmd\n"); */
511         /* send cmd to out endpoint */
512         result = usb_stor_bulk_transfer_buf(us, us->send_bulk_pipe,
513                                             bcb, US_BULK_CB_WRAP_LEN, NULL);
514         if (result != USB_STOR_XFER_GOOD) {
515                 usb_stor_dbg(us, "send cmd to out endpoint fail ---\n");
516                 return USB_STOR_TRANSPORT_ERROR;
517         }
518
519         if (buf) {
520                 unsigned int pipe = fDir;
521
522                 if (fDir  == FDIR_READ)
523                         pipe = us->recv_bulk_pipe;
524                 else
525                         pipe = us->send_bulk_pipe;
526
527                 /* Bulk */
528                 if (use_sg) {
529                         result = usb_stor_bulk_srb(us, pipe, us->srb);
530                 } else {
531                         result = usb_stor_bulk_transfer_sg(us, pipe, buf,
532                                                 transfer_length, 0, &partial);
533                 }
534                 if (result != USB_STOR_XFER_GOOD) {
535                         usb_stor_dbg(us, "data transfer fail ---\n");
536                         return USB_STOR_TRANSPORT_ERROR;
537                 }
538         }
539
540         /* Get CSW for device status */
541         result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe, bcs,
542                                             US_BULK_CS_WRAP_LEN, &cswlen);
543
544         if (result == USB_STOR_XFER_SHORT && cswlen == 0) {
545                 usb_stor_dbg(us, "Received 0-length CSW; retrying...\n");
546                 result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe,
547                                             bcs, US_BULK_CS_WRAP_LEN, &cswlen);
548         }
549
550         if (result == USB_STOR_XFER_STALLED) {
551                 /* get the status again */
552                 usb_stor_dbg(us, "Attempting to get CSW (2nd try)...\n");
553                 result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe,
554                                                 bcs, US_BULK_CS_WRAP_LEN, NULL);
555         }
556
557         if (result != USB_STOR_XFER_GOOD)
558                 return USB_STOR_TRANSPORT_ERROR;
559
560         /* check bulk status */
561         residue = le32_to_cpu(bcs->Residue);
562
563         /*
564          * try to compute the actual residue, based on how much data
565          * was really transferred and what the device tells us
566          */
567         if (residue && !(us->fflags & US_FL_IGNORE_RESIDUE)) {
568                 residue = min(residue, transfer_length);
569                 if (us->srb != NULL)
570                         scsi_set_resid(us->srb, max(scsi_get_resid(us->srb),
571                                                                 (int)residue));
572         }
573
574         if (bcs->Status != US_BULK_STAT_OK)
575                 return USB_STOR_TRANSPORT_ERROR;
576
577         return USB_STOR_TRANSPORT_GOOD;
578 }
579
580 static int do_scsi_request_sense(struct us_data *us, struct scsi_cmnd *srb)
581 {
582         struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
583         unsigned char buf[18];
584
585         memset(buf, 0, 18);
586         buf[0] = 0x70;                          /* Current error */
587         buf[2] = info->SrbStatus >> 16;         /* Sense key */
588         buf[7] = 10;                            /* Additional length */
589         buf[12] = info->SrbStatus >> 8;         /* ASC */
590         buf[13] = info->SrbStatus;              /* ASCQ */
591
592         usb_stor_set_xfer_buf(buf, sizeof(buf), srb);
593         return USB_STOR_TRANSPORT_GOOD;
594 }
595
596 static int sd_scsi_test_unit_ready(struct us_data *us, struct scsi_cmnd *srb)
597 {
598         struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
599
600         if (info->SD_Status.Insert && info->SD_Status.Ready)
601                 return USB_STOR_TRANSPORT_GOOD;
602         else {
603                 ene_sd_init(us);
604                 return USB_STOR_TRANSPORT_GOOD;
605         }
606
607         return USB_STOR_TRANSPORT_GOOD;
608 }
609
610 static int sd_scsi_inquiry(struct us_data *us, struct scsi_cmnd *srb)
611 {
612         unsigned char data_ptr[36] = {
613                 0x00, 0x80, 0x02, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x55,
614                 0x53, 0x42, 0x32, 0x2E, 0x30, 0x20, 0x20, 0x43, 0x61,
615                 0x72, 0x64, 0x52, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20,
616                 0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x31, 0x30, 0x30 };
617
618         usb_stor_set_xfer_buf(data_ptr, 36, srb);
619         return USB_STOR_TRANSPORT_GOOD;
620 }
621
622 static int sd_scsi_mode_sense(struct us_data *us, struct scsi_cmnd *srb)
623 {
624         struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
625         unsigned char mediaNoWP[12] = {
626                 0x0b, 0x00, 0x00, 0x08, 0x00, 0x00,
627                 0x71, 0xc0, 0x00, 0x00, 0x02, 0x00 };
628         unsigned char mediaWP[12]   = {
629                 0x0b, 0x00, 0x80, 0x08, 0x00, 0x00,
630                 0x71, 0xc0, 0x00, 0x00, 0x02, 0x00 };
631
632         if (info->SD_Status.WtP)
633                 usb_stor_set_xfer_buf(mediaWP, 12, srb);
634         else
635                 usb_stor_set_xfer_buf(mediaNoWP, 12, srb);
636
637
638         return USB_STOR_TRANSPORT_GOOD;
639 }
640
641 static int sd_scsi_read_capacity(struct us_data *us, struct scsi_cmnd *srb)
642 {
643         u32     bl_num;
644         u32     bl_len;
645         unsigned int offset = 0;
646         unsigned char    buf[8];
647         struct scatterlist *sg = NULL;
648         struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
649
650         usb_stor_dbg(us, "sd_scsi_read_capacity\n");
651         if (info->SD_Status.HiCapacity) {
652                 bl_len = 0x200;
653                 if (info->SD_Status.IsMMC)
654                         bl_num = info->HC_C_SIZE-1;
655                 else
656                         bl_num = (info->HC_C_SIZE + 1) * 1024 - 1;
657         } else {
658                 bl_len = 1 << (info->SD_READ_BL_LEN);
659                 bl_num = info->SD_Block_Mult * (info->SD_C_SIZE + 1)
660                                 * (1 << (info->SD_C_SIZE_MULT + 2)) - 1;
661         }
662         info->bl_num = bl_num;
663         usb_stor_dbg(us, "bl_len = %x\n", bl_len);
664         usb_stor_dbg(us, "bl_num = %x\n", bl_num);
665
666         /*srb->request_bufflen = 8; */
667         buf[0] = (bl_num >> 24) & 0xff;
668         buf[1] = (bl_num >> 16) & 0xff;
669         buf[2] = (bl_num >> 8) & 0xff;
670         buf[3] = (bl_num >> 0) & 0xff;
671         buf[4] = (bl_len >> 24) & 0xff;
672         buf[5] = (bl_len >> 16) & 0xff;
673         buf[6] = (bl_len >> 8) & 0xff;
674         buf[7] = (bl_len >> 0) & 0xff;
675
676         usb_stor_access_xfer_buf(buf, 8, srb, &sg, &offset, TO_XFER_BUF);
677
678         return USB_STOR_TRANSPORT_GOOD;
679 }
680
681 static int sd_scsi_read(struct us_data *us, struct scsi_cmnd *srb)
682 {
683         int result;
684         unsigned char *cdb = srb->cmnd;
685         struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
686         struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
687
688         u32 bn = ((cdb[2] << 24) & 0xff000000) | ((cdb[3] << 16) & 0x00ff0000) |
689                  ((cdb[4] << 8) & 0x0000ff00) | ((cdb[5] << 0) & 0x000000ff);
690         u16 blen = ((cdb[7] << 8) & 0xff00) | ((cdb[8] << 0) & 0x00ff);
691         u32 bnByte = bn * 0x200;
692         u32 blenByte = blen * 0x200;
693
694         if (bn > info->bl_num)
695                 return USB_STOR_TRANSPORT_ERROR;
696
697         result = ene_load_bincode(us, SD_RW_PATTERN);
698         if (result != USB_STOR_XFER_GOOD) {
699                 usb_stor_dbg(us, "Load SD RW pattern Fail !!\n");
700                 return USB_STOR_TRANSPORT_ERROR;
701         }
702
703         if (info->SD_Status.HiCapacity)
704                 bnByte = bn;
705
706         /* set up the command wrapper */
707         memset(bcb, 0, sizeof(struct bulk_cb_wrap));
708         bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
709         bcb->DataTransferLength = blenByte;
710         bcb->Flags  = US_BULK_FLAG_IN;
711         bcb->CDB[0] = 0xF1;
712         bcb->CDB[5] = (unsigned char)(bnByte);
713         bcb->CDB[4] = (unsigned char)(bnByte>>8);
714         bcb->CDB[3] = (unsigned char)(bnByte>>16);
715         bcb->CDB[2] = (unsigned char)(bnByte>>24);
716
717         result = ene_send_scsi_cmd(us, FDIR_READ, scsi_sglist(srb), 1);
718         return result;
719 }
720
721 static int sd_scsi_write(struct us_data *us, struct scsi_cmnd *srb)
722 {
723         int result;
724         unsigned char *cdb = srb->cmnd;
725         struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
726         struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
727
728         u32 bn = ((cdb[2] << 24) & 0xff000000) | ((cdb[3] << 16) & 0x00ff0000) |
729                  ((cdb[4] << 8) & 0x0000ff00) | ((cdb[5] << 0) & 0x000000ff);
730         u16 blen = ((cdb[7] << 8) & 0xff00) | ((cdb[8] << 0) & 0x00ff);
731         u32 bnByte = bn * 0x200;
732         u32 blenByte = blen * 0x200;
733
734         if (bn > info->bl_num)
735                 return USB_STOR_TRANSPORT_ERROR;
736
737         result = ene_load_bincode(us, SD_RW_PATTERN);
738         if (result != USB_STOR_XFER_GOOD) {
739                 usb_stor_dbg(us, "Load SD RW pattern Fail !!\n");
740                 return USB_STOR_TRANSPORT_ERROR;
741         }
742
743         if (info->SD_Status.HiCapacity)
744                 bnByte = bn;
745
746         /* set up the command wrapper */
747         memset(bcb, 0, sizeof(struct bulk_cb_wrap));
748         bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
749         bcb->DataTransferLength = blenByte;
750         bcb->Flags  = 0x00;
751         bcb->CDB[0] = 0xF0;
752         bcb->CDB[5] = (unsigned char)(bnByte);
753         bcb->CDB[4] = (unsigned char)(bnByte>>8);
754         bcb->CDB[3] = (unsigned char)(bnByte>>16);
755         bcb->CDB[2] = (unsigned char)(bnByte>>24);
756
757         result = ene_send_scsi_cmd(us, FDIR_WRITE, scsi_sglist(srb), 1);
758         return result;
759 }
760
761 /*
762  * ENE MS Card
763  */
764
765 static int ms_lib_set_logicalpair(struct us_data *us, u16 logblk, u16 phyblk)
766 {
767         struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
768
769         if ((logblk >= info->MS_Lib.NumberOfLogBlock) || (phyblk >= info->MS_Lib.NumberOfPhyBlock))
770                 return (u32)-1;
771
772         info->MS_Lib.Phy2LogMap[phyblk] = logblk;
773         info->MS_Lib.Log2PhyMap[logblk] = phyblk;
774
775         return 0;
776 }
777
778 static int ms_lib_set_logicalblockmark(struct us_data *us, u16 phyblk, u16 mark)
779 {
780         struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
781
782         if (phyblk >= info->MS_Lib.NumberOfPhyBlock)
783                 return (u32)-1;
784
785         info->MS_Lib.Phy2LogMap[phyblk] = mark;
786
787         return 0;
788 }
789
790 static int ms_lib_set_initialerrorblock(struct us_data *us, u16 phyblk)
791 {
792         return ms_lib_set_logicalblockmark(us, phyblk, MS_LB_INITIAL_ERROR);
793 }
794
795 static int ms_lib_set_bootblockmark(struct us_data *us, u16 phyblk)
796 {
797         return ms_lib_set_logicalblockmark(us, phyblk, MS_LB_BOOT_BLOCK);
798 }
799
800 static int ms_lib_free_logicalmap(struct us_data *us)
801 {
802         struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
803
804         kfree(info->MS_Lib.Phy2LogMap);
805         info->MS_Lib.Phy2LogMap = NULL;
806
807         kfree(info->MS_Lib.Log2PhyMap);
808         info->MS_Lib.Log2PhyMap = NULL;
809
810         return 0;
811 }
812
813 static int ms_lib_alloc_logicalmap(struct us_data *us)
814 {
815         u32  i;
816         struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
817
818         info->MS_Lib.Phy2LogMap = kmalloc(info->MS_Lib.NumberOfPhyBlock * sizeof(u16), GFP_KERNEL);
819         info->MS_Lib.Log2PhyMap = kmalloc(info->MS_Lib.NumberOfLogBlock * sizeof(u16), GFP_KERNEL);
820
821         if ((info->MS_Lib.Phy2LogMap == NULL) || (info->MS_Lib.Log2PhyMap == NULL)) {
822                 ms_lib_free_logicalmap(us);
823                 return (u32)-1;
824         }
825
826         for (i = 0; i < info->MS_Lib.NumberOfPhyBlock; i++)
827                 info->MS_Lib.Phy2LogMap[i] = MS_LB_NOT_USED;
828
829         for (i = 0; i < info->MS_Lib.NumberOfLogBlock; i++)
830                 info->MS_Lib.Log2PhyMap[i] = MS_LB_NOT_USED;
831
832         return 0;
833 }
834
835 static void ms_lib_clear_writebuf(struct us_data *us)
836 {
837         int i;
838         struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
839
840         info->MS_Lib.wrtblk = (u16)-1;
841         ms_lib_clear_pagemap(info);
842
843         if (info->MS_Lib.blkpag)
844                 memset(info->MS_Lib.blkpag, 0xff, info->MS_Lib.PagesPerBlock * info->MS_Lib.BytesPerSector);
845
846         if (info->MS_Lib.blkext) {
847                 for (i = 0; i < info->MS_Lib.PagesPerBlock; i++) {
848                         info->MS_Lib.blkext[i].status1 = MS_REG_ST1_DEFAULT;
849                         info->MS_Lib.blkext[i].ovrflg = MS_REG_OVR_DEFAULT;
850                         info->MS_Lib.blkext[i].mngflg = MS_REG_MNG_DEFAULT;
851                         info->MS_Lib.blkext[i].logadr = MS_LB_NOT_USED;
852                 }
853         }
854 }
855
856 static int ms_count_freeblock(struct us_data *us, u16 PhyBlock)
857 {
858         u32 Ende, Count;
859         struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
860
861         Ende = PhyBlock + MS_PHYSICAL_BLOCKS_PER_SEGMENT;
862         for (Count = 0; PhyBlock < Ende; PhyBlock++) {
863                 switch (info->MS_Lib.Phy2LogMap[PhyBlock]) {
864                 case MS_LB_NOT_USED:
865                 case MS_LB_NOT_USED_ERASED:
866                         Count++;
867                 default:
868                         break;
869                 }
870         }
871
872         return Count;
873 }
874
875 static int ms_read_readpage(struct us_data *us, u32 PhyBlockAddr,
876                 u8 PageNum, u32 *PageBuf, struct ms_lib_type_extdat *ExtraDat)
877 {
878         struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
879         int result;
880         u8 ExtBuf[4];
881         u32 bn = PhyBlockAddr * 0x20 + PageNum;
882
883         result = ene_load_bincode(us, MS_RW_PATTERN);
884         if (result != USB_STOR_XFER_GOOD)
885                 return USB_STOR_TRANSPORT_ERROR;
886
887         /* Read Page Data */
888         memset(bcb, 0, sizeof(struct bulk_cb_wrap));
889         bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
890         bcb->DataTransferLength = 0x200;
891         bcb->Flags      = US_BULK_FLAG_IN;
892         bcb->CDB[0]     = 0xF1;
893
894         bcb->CDB[1]     = 0x02; /* in init.c ENE_MSInit() is 0x01 */
895
896         bcb->CDB[5]     = (unsigned char)(bn);
897         bcb->CDB[4]     = (unsigned char)(bn>>8);
898         bcb->CDB[3]     = (unsigned char)(bn>>16);
899         bcb->CDB[2]     = (unsigned char)(bn>>24);
900
901         result = ene_send_scsi_cmd(us, FDIR_READ, PageBuf, 0);
902         if (result != USB_STOR_XFER_GOOD)
903                 return USB_STOR_TRANSPORT_ERROR;
904
905
906         /* Read Extra Data */
907         memset(bcb, 0, sizeof(struct bulk_cb_wrap));
908         bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
909         bcb->DataTransferLength = 0x4;
910         bcb->Flags      = US_BULK_FLAG_IN;
911         bcb->CDB[0]     = 0xF1;
912         bcb->CDB[1]     = 0x03;
913
914         bcb->CDB[5]     = (unsigned char)(PageNum);
915         bcb->CDB[4]     = (unsigned char)(PhyBlockAddr);
916         bcb->CDB[3]     = (unsigned char)(PhyBlockAddr>>8);
917         bcb->CDB[2]     = (unsigned char)(PhyBlockAddr>>16);
918         bcb->CDB[6]     = 0x01;
919
920         result = ene_send_scsi_cmd(us, FDIR_READ, &ExtBuf, 0);
921         if (result != USB_STOR_XFER_GOOD)
922                 return USB_STOR_TRANSPORT_ERROR;
923
924         ExtraDat->reserved = 0;
925         ExtraDat->intr     = 0x80;  /* Not yet,fireware support */
926         ExtraDat->status0  = 0x10;  /* Not yet,fireware support */
927
928         ExtraDat->status1  = 0x00;  /* Not yet,fireware support */
929         ExtraDat->ovrflg   = ExtBuf[0];
930         ExtraDat->mngflg   = ExtBuf[1];
931         ExtraDat->logadr   = memstick_logaddr(ExtBuf[2], ExtBuf[3]);
932
933         return USB_STOR_TRANSPORT_GOOD;
934 }
935
936 static int ms_lib_process_bootblock(struct us_data *us, u16 PhyBlock, u8 *PageData)
937 {
938         struct ms_bootblock_sysent *SysEntry;
939         struct ms_bootblock_sysinf *SysInfo;
940         u32 i, result;
941         u8 PageNumber;
942         u8 *PageBuffer;
943         struct ms_lib_type_extdat ExtraData;
944         struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
945
946         PageBuffer = kmalloc(MS_BYTES_PER_PAGE, GFP_KERNEL);
947         if (PageBuffer == NULL)
948                 return (u32)-1;
949
950         result = (u32)-1;
951
952         SysInfo = &(((struct ms_bootblock_page0 *)PageData)->sysinf);
953
954         if ((SysInfo->bMsClass != MS_SYSINF_MSCLASS_TYPE_1) ||
955                 (be16_to_cpu(SysInfo->wPageSize) != MS_SYSINF_PAGE_SIZE) ||
956                 ((SysInfo->bSecuritySupport & MS_SYSINF_SECURITY) == MS_SYSINF_SECURITY_SUPPORT) ||
957                 (SysInfo->bReserved1 != MS_SYSINF_RESERVED1) ||
958                 (SysInfo->bReserved2 != MS_SYSINF_RESERVED2) ||
959                 (SysInfo->bFormatType != MS_SYSINF_FORMAT_FAT) ||
960                 (SysInfo->bUsage != MS_SYSINF_USAGE_GENERAL))
961                 goto exit;
962                 /* */
963         switch (info->MS_Lib.cardType = SysInfo->bCardType) {
964         case MS_SYSINF_CARDTYPE_RDONLY:
965                 ms_lib_ctrl_set(info, MS_LIB_CTRL_RDONLY);
966                 break;
967         case MS_SYSINF_CARDTYPE_RDWR:
968                 ms_lib_ctrl_reset(info, MS_LIB_CTRL_RDONLY);
969                 break;
970         case MS_SYSINF_CARDTYPE_HYBRID:
971         default:
972                 goto exit;
973         }
974
975         info->MS_Lib.blockSize = be16_to_cpu(SysInfo->wBlockSize);
976         info->MS_Lib.NumberOfPhyBlock = be16_to_cpu(SysInfo->wBlockNumber);
977         info->MS_Lib.NumberOfLogBlock = be16_to_cpu(SysInfo->wTotalBlockNumber)-2;
978         info->MS_Lib.PagesPerBlock = info->MS_Lib.blockSize * SIZE_OF_KIRO / MS_BYTES_PER_PAGE;
979         info->MS_Lib.NumberOfSegment = info->MS_Lib.NumberOfPhyBlock / MS_PHYSICAL_BLOCKS_PER_SEGMENT;
980         info->MS_Model = be16_to_cpu(SysInfo->wMemorySize);
981
982         /*Allocate to all number of logicalblock and physicalblock */
983         if (ms_lib_alloc_logicalmap(us))
984                 goto exit;
985
986         /* Mark the book block */
987         ms_lib_set_bootblockmark(us, PhyBlock);
988
989         SysEntry = &(((struct ms_bootblock_page0 *)PageData)->sysent);
990
991         for (i = 0; i < MS_NUMBER_OF_SYSTEM_ENTRY; i++) {
992                 u32  EntryOffset, EntrySize;
993
994                 EntryOffset = be32_to_cpu(SysEntry->entry[i].dwStart);
995
996                 if (EntryOffset == 0xffffff)
997                         continue;
998                 EntrySize = be32_to_cpu(SysEntry->entry[i].dwSize);
999
1000                 if (EntrySize == 0)
1001                         continue;
1002
1003                 if (EntryOffset + MS_BYTES_PER_PAGE + EntrySize > info->MS_Lib.blockSize * (u32)SIZE_OF_KIRO)
1004                         continue;
1005
1006                 if (i == 0) {
1007                         u8 PrevPageNumber = 0;
1008                         u16 phyblk;
1009
1010                         if (SysEntry->entry[i].bType != MS_SYSENT_TYPE_INVALID_BLOCK)
1011                                 goto exit;
1012
1013                         while (EntrySize > 0) {
1014
1015                                 PageNumber = (u8)(EntryOffset / MS_BYTES_PER_PAGE + 1);
1016                                 if (PageNumber != PrevPageNumber) {
1017                                         switch (ms_read_readpage(us, PhyBlock, PageNumber, (u32 *)PageBuffer, &ExtraData)) {
1018                                         case MS_STATUS_SUCCESS:
1019                                                 break;
1020                                         case MS_STATUS_WRITE_PROTECT:
1021                                         case MS_ERROR_FLASH_READ:
1022                                         case MS_STATUS_ERROR:
1023                                         default:
1024                                                 goto exit;
1025                                         }
1026
1027                                         PrevPageNumber = PageNumber;
1028                                 }
1029
1030                                 phyblk = be16_to_cpu(*(u16 *)(PageBuffer + (EntryOffset % MS_BYTES_PER_PAGE)));
1031                                 if (phyblk < 0x0fff)
1032                                         ms_lib_set_initialerrorblock(us, phyblk);
1033
1034                                 EntryOffset += 2;
1035                                 EntrySize -= 2;
1036                         }
1037                 } else if (i == 1) {  /* CIS/IDI */
1038                         struct ms_bootblock_idi *idi;
1039
1040                         if (SysEntry->entry[i].bType != MS_SYSENT_TYPE_CIS_IDI)
1041                                 goto exit;
1042
1043                         switch (ms_read_readpage(us, PhyBlock, (u8)(EntryOffset / MS_BYTES_PER_PAGE + 1), (u32 *)PageBuffer, &ExtraData)) {
1044                         case MS_STATUS_SUCCESS:
1045                                 break;
1046                         case MS_STATUS_WRITE_PROTECT:
1047                         case MS_ERROR_FLASH_READ:
1048                         case MS_STATUS_ERROR:
1049                         default:
1050                                 goto exit;
1051                         }
1052
1053                         idi = &((struct ms_bootblock_cis_idi *)(PageBuffer + (EntryOffset % MS_BYTES_PER_PAGE)))->idi.idi;
1054                         if (le16_to_cpu(idi->wIDIgeneralConfiguration) != MS_IDI_GENERAL_CONF)
1055                                 goto exit;
1056
1057                         info->MS_Lib.BytesPerSector = le16_to_cpu(idi->wIDIbytesPerSector);
1058                         if (info->MS_Lib.BytesPerSector != MS_BYTES_PER_PAGE)
1059                                 goto exit;
1060                 }
1061         } /* End for .. */
1062
1063         result = 0;
1064
1065 exit:
1066         if (result)
1067                 ms_lib_free_logicalmap(us);
1068
1069         kfree(PageBuffer);
1070
1071         result = 0;
1072         return result;
1073 }
1074
1075 static void ms_lib_free_writebuf(struct us_data *us)
1076 {
1077         struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1078         info->MS_Lib.wrtblk = (u16)-1; /* set to -1 */
1079
1080         /* memset((fdoExt)->MS_Lib.pagemap, 0, sizeof((fdoExt)->MS_Lib.pagemap)) */
1081
1082         ms_lib_clear_pagemap(info); /* (pdx)->MS_Lib.pagemap memset 0 in ms.h */
1083
1084         if (info->MS_Lib.blkpag) {
1085                 kfree(info->MS_Lib.blkpag);  /* Arnold test ... */
1086                 info->MS_Lib.blkpag = NULL;
1087         }
1088
1089         if (info->MS_Lib.blkext) {
1090                 kfree(info->MS_Lib.blkext);  /* Arnold test ... */
1091                 info->MS_Lib.blkext = NULL;
1092         }
1093 }
1094
1095
1096 static void ms_lib_free_allocatedarea(struct us_data *us)
1097 {
1098         struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1099
1100         ms_lib_free_writebuf(us); /* Free MS_Lib.pagemap */
1101         ms_lib_free_logicalmap(us); /* kfree MS_Lib.Phy2LogMap and MS_Lib.Log2PhyMap */
1102
1103         /* set struct us point flag to 0 */
1104         info->MS_Lib.flags = 0;
1105         info->MS_Lib.BytesPerSector = 0;
1106         info->MS_Lib.SectorsPerCylinder = 0;
1107
1108         info->MS_Lib.cardType = 0;
1109         info->MS_Lib.blockSize = 0;
1110         info->MS_Lib.PagesPerBlock = 0;
1111
1112         info->MS_Lib.NumberOfPhyBlock = 0;
1113         info->MS_Lib.NumberOfLogBlock = 0;
1114 }
1115
1116
1117 static int ms_lib_alloc_writebuf(struct us_data *us)
1118 {
1119         struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1120
1121         info->MS_Lib.wrtblk = (u16)-1;
1122
1123         info->MS_Lib.blkpag = kmalloc(info->MS_Lib.PagesPerBlock * info->MS_Lib.BytesPerSector, GFP_KERNEL);
1124         info->MS_Lib.blkext = kmalloc(info->MS_Lib.PagesPerBlock * sizeof(struct ms_lib_type_extdat), GFP_KERNEL);
1125
1126         if ((info->MS_Lib.blkpag == NULL) || (info->MS_Lib.blkext == NULL)) {
1127                 ms_lib_free_writebuf(us);
1128                 return (u32)-1;
1129         }
1130
1131         ms_lib_clear_writebuf(us);
1132
1133 return 0;
1134 }
1135
1136 static int ms_lib_force_setlogical_pair(struct us_data *us, u16 logblk, u16 phyblk)
1137 {
1138         struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1139
1140         if (logblk == MS_LB_NOT_USED)
1141                 return 0;
1142
1143         if ((logblk >= info->MS_Lib.NumberOfLogBlock) ||
1144                 (phyblk >= info->MS_Lib.NumberOfPhyBlock))
1145                 return (u32)-1;
1146
1147         info->MS_Lib.Phy2LogMap[phyblk] = logblk;
1148         info->MS_Lib.Log2PhyMap[logblk] = phyblk;
1149
1150         return 0;
1151 }
1152
1153 static int ms_read_copyblock(struct us_data *us, u16 oldphy, u16 newphy,
1154                         u16 PhyBlockAddr, u8 PageNum, unsigned char *buf, u16 len)
1155 {
1156         struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1157         int result;
1158
1159         result = ene_load_bincode(us, MS_RW_PATTERN);
1160         if (result != USB_STOR_XFER_GOOD)
1161                 return USB_STOR_TRANSPORT_ERROR;
1162
1163         memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1164         bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1165         bcb->DataTransferLength = 0x200*len;
1166         bcb->Flags = 0x00;
1167         bcb->CDB[0] = 0xF0;
1168         bcb->CDB[1] = 0x08;
1169         bcb->CDB[4] = (unsigned char)(oldphy);
1170         bcb->CDB[3] = (unsigned char)(oldphy>>8);
1171         bcb->CDB[2] = 0; /* (BYTE)(oldphy>>16) */
1172         bcb->CDB[7] = (unsigned char)(newphy);
1173         bcb->CDB[6] = (unsigned char)(newphy>>8);
1174         bcb->CDB[5] = 0; /* (BYTE)(newphy>>16) */
1175         bcb->CDB[9] = (unsigned char)(PhyBlockAddr);
1176         bcb->CDB[8] = (unsigned char)(PhyBlockAddr>>8);
1177         bcb->CDB[10] = PageNum;
1178
1179         result = ene_send_scsi_cmd(us, FDIR_WRITE, buf, 0);
1180         if (result != USB_STOR_XFER_GOOD)
1181                 return USB_STOR_TRANSPORT_ERROR;
1182
1183         return USB_STOR_TRANSPORT_GOOD;
1184 }
1185
1186 static int ms_read_eraseblock(struct us_data *us, u32 PhyBlockAddr)
1187 {
1188         struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1189         int result;
1190         u32 bn = PhyBlockAddr;
1191
1192         result = ene_load_bincode(us, MS_RW_PATTERN);
1193         if (result != USB_STOR_XFER_GOOD)
1194                 return USB_STOR_TRANSPORT_ERROR;
1195
1196         memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1197         bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1198         bcb->DataTransferLength = 0x200;
1199         bcb->Flags = US_BULK_FLAG_IN;
1200         bcb->CDB[0] = 0xF2;
1201         bcb->CDB[1] = 0x06;
1202         bcb->CDB[4] = (unsigned char)(bn);
1203         bcb->CDB[3] = (unsigned char)(bn>>8);
1204         bcb->CDB[2] = (unsigned char)(bn>>16);
1205
1206         result = ene_send_scsi_cmd(us, FDIR_READ, NULL, 0);
1207         if (result != USB_STOR_XFER_GOOD)
1208                 return USB_STOR_TRANSPORT_ERROR;
1209
1210         return USB_STOR_TRANSPORT_GOOD;
1211 }
1212
1213 static int ms_lib_check_disableblock(struct us_data *us, u16 PhyBlock)
1214 {
1215         unsigned char *PageBuf = NULL;
1216         u16 result = MS_STATUS_SUCCESS;
1217         u16 blk, index = 0;
1218         struct ms_lib_type_extdat extdat;
1219         struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1220
1221         PageBuf = kmalloc(MS_BYTES_PER_PAGE, GFP_KERNEL);
1222         if (PageBuf == NULL) {
1223                 result = MS_NO_MEMORY_ERROR;
1224                 goto exit;
1225         }
1226
1227         ms_read_readpage(us, PhyBlock, 1, (u32 *)PageBuf, &extdat);
1228         do {
1229                 blk = be16_to_cpu(PageBuf[index]);
1230                 if (blk == MS_LB_NOT_USED)
1231                         break;
1232                 if (blk == info->MS_Lib.Log2PhyMap[0]) {
1233                         result = MS_ERROR_FLASH_READ;
1234                         break;
1235                 }
1236                 index++;
1237         } while (1);
1238
1239 exit:
1240         kfree(PageBuf);
1241         return result;
1242 }
1243
1244 static int ms_lib_setacquired_errorblock(struct us_data *us, u16 phyblk)
1245 {
1246         u16 log;
1247         struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1248
1249         if (phyblk >= info->MS_Lib.NumberOfPhyBlock)
1250                 return (u32)-1;
1251
1252         log = info->MS_Lib.Phy2LogMap[phyblk];
1253
1254         if (log < info->MS_Lib.NumberOfLogBlock)
1255                 info->MS_Lib.Log2PhyMap[log] = MS_LB_NOT_USED;
1256
1257         if (info->MS_Lib.Phy2LogMap[phyblk] != MS_LB_INITIAL_ERROR)
1258                 info->MS_Lib.Phy2LogMap[phyblk] = MS_LB_ACQUIRED_ERROR;
1259
1260         return 0;
1261 }
1262
1263 static int ms_lib_overwrite_extra(struct us_data *us, u32 PhyBlockAddr,
1264                                 u8 PageNum, u8 OverwriteFlag)
1265 {
1266         struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1267         int result;
1268
1269         result = ene_load_bincode(us, MS_RW_PATTERN);
1270         if (result != USB_STOR_XFER_GOOD)
1271                 return USB_STOR_TRANSPORT_ERROR;
1272
1273         memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1274         bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1275         bcb->DataTransferLength = 0x4;
1276         bcb->Flags = US_BULK_FLAG_IN;
1277         bcb->CDB[0] = 0xF2;
1278         bcb->CDB[1] = 0x05;
1279         bcb->CDB[5] = (unsigned char)(PageNum);
1280         bcb->CDB[4] = (unsigned char)(PhyBlockAddr);
1281         bcb->CDB[3] = (unsigned char)(PhyBlockAddr>>8);
1282         bcb->CDB[2] = (unsigned char)(PhyBlockAddr>>16);
1283         bcb->CDB[6] = OverwriteFlag;
1284         bcb->CDB[7] = 0xFF;
1285         bcb->CDB[8] = 0xFF;
1286         bcb->CDB[9] = 0xFF;
1287
1288         result = ene_send_scsi_cmd(us, FDIR_READ, NULL, 0);
1289         if (result != USB_STOR_XFER_GOOD)
1290                 return USB_STOR_TRANSPORT_ERROR;
1291
1292         return USB_STOR_TRANSPORT_GOOD;
1293 }
1294
1295 static int ms_lib_error_phyblock(struct us_data *us, u16 phyblk)
1296 {
1297         struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1298
1299         if (phyblk >= info->MS_Lib.NumberOfPhyBlock)
1300                 return MS_STATUS_ERROR;
1301
1302         ms_lib_setacquired_errorblock(us, phyblk);
1303
1304         if (ms_lib_iswritable(info))
1305                 return ms_lib_overwrite_extra(us, phyblk, 0, (u8)(~MS_REG_OVR_BKST & BYTE_MASK));
1306
1307         return MS_STATUS_SUCCESS;
1308 }
1309
1310 static int ms_lib_erase_phyblock(struct us_data *us, u16 phyblk)
1311 {
1312         u16 log;
1313         struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1314
1315         if (phyblk >= info->MS_Lib.NumberOfPhyBlock)
1316                 return MS_STATUS_ERROR;
1317
1318         log = info->MS_Lib.Phy2LogMap[phyblk];
1319
1320         if (log < info->MS_Lib.NumberOfLogBlock)
1321                 info->MS_Lib.Log2PhyMap[log] = MS_LB_NOT_USED;
1322
1323         info->MS_Lib.Phy2LogMap[phyblk] = MS_LB_NOT_USED;
1324
1325         if (ms_lib_iswritable(info)) {
1326                 switch (ms_read_eraseblock(us, phyblk)) {
1327                 case MS_STATUS_SUCCESS:
1328                         info->MS_Lib.Phy2LogMap[phyblk] = MS_LB_NOT_USED_ERASED;
1329                         return MS_STATUS_SUCCESS;
1330                 case MS_ERROR_FLASH_ERASE:
1331                 case MS_STATUS_INT_ERROR:
1332                         ms_lib_error_phyblock(us, phyblk);
1333                         return MS_ERROR_FLASH_ERASE;
1334                 case MS_STATUS_ERROR:
1335                 default:
1336                         ms_lib_ctrl_set(info, MS_LIB_CTRL_RDONLY); /* MS_LibCtrlSet will used by ENE_MSInit ,need check, and why us to info*/
1337                         ms_lib_setacquired_errorblock(us, phyblk);
1338                         return MS_STATUS_ERROR;
1339                 }
1340         }
1341
1342         ms_lib_setacquired_errorblock(us, phyblk);
1343
1344         return MS_STATUS_SUCCESS;
1345 }
1346
1347 static int ms_lib_read_extra(struct us_data *us, u32 PhyBlock,
1348                                 u8 PageNum, struct ms_lib_type_extdat *ExtraDat)
1349 {
1350         struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1351         int result;
1352         u8 ExtBuf[4];
1353
1354         memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1355         bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1356         bcb->DataTransferLength = 0x4;
1357         bcb->Flags      = US_BULK_FLAG_IN;
1358         bcb->CDB[0]     = 0xF1;
1359         bcb->CDB[1]     = 0x03;
1360         bcb->CDB[5]     = (unsigned char)(PageNum);
1361         bcb->CDB[4]     = (unsigned char)(PhyBlock);
1362         bcb->CDB[3]     = (unsigned char)(PhyBlock>>8);
1363         bcb->CDB[2]     = (unsigned char)(PhyBlock>>16);
1364         bcb->CDB[6]     = 0x01;
1365
1366         result = ene_send_scsi_cmd(us, FDIR_READ, &ExtBuf, 0);
1367         if (result != USB_STOR_XFER_GOOD)
1368                 return USB_STOR_TRANSPORT_ERROR;
1369
1370         ExtraDat->reserved = 0;
1371         ExtraDat->intr     = 0x80;  /* Not yet, waiting for fireware support */
1372         ExtraDat->status0  = 0x10;  /* Not yet, waiting for fireware support */
1373         ExtraDat->status1  = 0x00;  /* Not yet, waiting for fireware support */
1374         ExtraDat->ovrflg   = ExtBuf[0];
1375         ExtraDat->mngflg   = ExtBuf[1];
1376         ExtraDat->logadr   = memstick_logaddr(ExtBuf[2], ExtBuf[3]);
1377
1378         return USB_STOR_TRANSPORT_GOOD;
1379 }
1380
1381 static int ms_libsearch_block_from_physical(struct us_data *us, u16 phyblk)
1382 {
1383         u16 blk;
1384         struct ms_lib_type_extdat extdat; /* need check */
1385         struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1386
1387
1388         if (phyblk >= info->MS_Lib.NumberOfPhyBlock)
1389                 return MS_LB_ERROR;
1390
1391         for (blk = phyblk + 1; blk != phyblk; blk++) {
1392                 if ((blk & MS_PHYSICAL_BLOCKS_PER_SEGMENT_MASK) == 0)
1393                         blk -= MS_PHYSICAL_BLOCKS_PER_SEGMENT;
1394
1395                 if (info->MS_Lib.Phy2LogMap[blk] == MS_LB_NOT_USED_ERASED) {
1396                         return blk;
1397                 } else if (info->MS_Lib.Phy2LogMap[blk] == MS_LB_NOT_USED) {
1398                         switch (ms_lib_read_extra(us, blk, 0, &extdat)) {
1399                         case MS_STATUS_SUCCESS:
1400                         case MS_STATUS_SUCCESS_WITH_ECC:
1401                                 break;
1402                         case MS_NOCARD_ERROR:
1403                                 return MS_NOCARD_ERROR;
1404                         case MS_STATUS_INT_ERROR:
1405                                 return MS_LB_ERROR;
1406                         case MS_ERROR_FLASH_READ:
1407                         default:
1408                                 ms_lib_setacquired_errorblock(us, blk);
1409                                 continue;
1410                         } /* End switch */
1411
1412                         if ((extdat.ovrflg & MS_REG_OVR_BKST) != MS_REG_OVR_BKST_OK) {
1413                                 ms_lib_setacquired_errorblock(us, blk);
1414                                 continue;
1415                         }
1416
1417                         switch (ms_lib_erase_phyblock(us, blk)) {
1418                         case MS_STATUS_SUCCESS:
1419                                 return blk;
1420                         case MS_STATUS_ERROR:
1421                                 return MS_LB_ERROR;
1422                         case MS_ERROR_FLASH_ERASE:
1423                         default:
1424                                 ms_lib_error_phyblock(us, blk);
1425                                 break;
1426                         }
1427                 }
1428         } /* End for */
1429
1430         return MS_LB_ERROR;
1431 }
1432 static int ms_libsearch_block_from_logical(struct us_data *us, u16 logblk)
1433 {
1434         u16 phyblk;
1435         struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1436
1437         phyblk = ms_libconv_to_physical(info, logblk);
1438         if (phyblk >= MS_LB_ERROR) {
1439                 if (logblk >= info->MS_Lib.NumberOfLogBlock)
1440                         return MS_LB_ERROR;
1441
1442                 phyblk = (logblk + MS_NUMBER_OF_BOOT_BLOCK) / MS_LOGICAL_BLOCKS_PER_SEGMENT;
1443                 phyblk *= MS_PHYSICAL_BLOCKS_PER_SEGMENT;
1444                 phyblk += MS_PHYSICAL_BLOCKS_PER_SEGMENT - 1;
1445         }
1446
1447         return ms_libsearch_block_from_physical(us, phyblk);
1448 }
1449
1450 static int ms_scsi_test_unit_ready(struct us_data *us, struct scsi_cmnd *srb)
1451 {
1452         struct ene_ub6250_info *info = (struct ene_ub6250_info *)(us->extra);
1453
1454         /* pr_info("MS_SCSI_Test_Unit_Ready\n"); */
1455         if (info->MS_Status.Insert && info->MS_Status.Ready) {
1456                 return USB_STOR_TRANSPORT_GOOD;
1457         } else {
1458                 ene_ms_init(us);
1459                 return USB_STOR_TRANSPORT_GOOD;
1460         }
1461
1462         return USB_STOR_TRANSPORT_GOOD;
1463 }
1464
1465 static int ms_scsi_inquiry(struct us_data *us, struct scsi_cmnd *srb)
1466 {
1467         /* pr_info("MS_SCSI_Inquiry\n"); */
1468         unsigned char data_ptr[36] = {
1469                 0x00, 0x80, 0x02, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x55,
1470                 0x53, 0x42, 0x32, 0x2E, 0x30, 0x20, 0x20, 0x43, 0x61,
1471                 0x72, 0x64, 0x52, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20,
1472                 0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x31, 0x30, 0x30};
1473
1474         usb_stor_set_xfer_buf(data_ptr, 36, srb);
1475         return USB_STOR_TRANSPORT_GOOD;
1476 }
1477
1478 static int ms_scsi_mode_sense(struct us_data *us, struct scsi_cmnd *srb)
1479 {
1480         struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1481         unsigned char mediaNoWP[12] = {
1482                 0x0b, 0x00, 0x00, 0x08, 0x00, 0x00,
1483                 0x71, 0xc0, 0x00, 0x00, 0x02, 0x00 };
1484         unsigned char mediaWP[12]   = {
1485                 0x0b, 0x00, 0x80, 0x08, 0x00, 0x00,
1486                 0x71, 0xc0, 0x00, 0x00, 0x02, 0x00 };
1487
1488         if (info->MS_Status.WtP)
1489                 usb_stor_set_xfer_buf(mediaWP, 12, srb);
1490         else
1491                 usb_stor_set_xfer_buf(mediaNoWP, 12, srb);
1492
1493         return USB_STOR_TRANSPORT_GOOD;
1494 }
1495
1496 static int ms_scsi_read_capacity(struct us_data *us, struct scsi_cmnd *srb)
1497 {
1498         u32   bl_num;
1499         u16    bl_len;
1500         unsigned int offset = 0;
1501         unsigned char    buf[8];
1502         struct scatterlist *sg = NULL;
1503         struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1504
1505         usb_stor_dbg(us, "ms_scsi_read_capacity\n");
1506         bl_len = 0x200;
1507         if (info->MS_Status.IsMSPro)
1508                 bl_num = info->MSP_TotalBlock - 1;
1509         else
1510                 bl_num = info->MS_Lib.NumberOfLogBlock * info->MS_Lib.blockSize * 2 - 1;
1511
1512         info->bl_num = bl_num;
1513         usb_stor_dbg(us, "bl_len = %x\n", bl_len);
1514         usb_stor_dbg(us, "bl_num = %x\n", bl_num);
1515
1516         /*srb->request_bufflen = 8; */
1517         buf[0] = (bl_num >> 24) & 0xff;
1518         buf[1] = (bl_num >> 16) & 0xff;
1519         buf[2] = (bl_num >> 8) & 0xff;
1520         buf[3] = (bl_num >> 0) & 0xff;
1521         buf[4] = (bl_len >> 24) & 0xff;
1522         buf[5] = (bl_len >> 16) & 0xff;
1523         buf[6] = (bl_len >> 8) & 0xff;
1524         buf[7] = (bl_len >> 0) & 0xff;
1525
1526         usb_stor_access_xfer_buf(buf, 8, srb, &sg, &offset, TO_XFER_BUF);
1527
1528         return USB_STOR_TRANSPORT_GOOD;
1529 }
1530
1531 static void ms_lib_phy_to_log_range(u16 PhyBlock, u16 *LogStart, u16 *LogEnde)
1532 {
1533         PhyBlock /= MS_PHYSICAL_BLOCKS_PER_SEGMENT;
1534
1535         if (PhyBlock) {
1536                 *LogStart = MS_LOGICAL_BLOCKS_IN_1ST_SEGMENT + (PhyBlock - 1) * MS_LOGICAL_BLOCKS_PER_SEGMENT;/*496*/
1537                 *LogEnde = *LogStart + MS_LOGICAL_BLOCKS_PER_SEGMENT;/*496*/
1538         } else {
1539                 *LogStart = 0;
1540                 *LogEnde = MS_LOGICAL_BLOCKS_IN_1ST_SEGMENT;/*494*/
1541         }
1542 }
1543
1544 static int ms_lib_read_extrablock(struct us_data *us, u32 PhyBlock,
1545         u8 PageNum, u8 blen, void *buf)
1546 {
1547         struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1548         int     result;
1549
1550         /* Read Extra Data */
1551         memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1552         bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1553         bcb->DataTransferLength = 0x4 * blen;
1554         bcb->Flags      = US_BULK_FLAG_IN;
1555         bcb->CDB[0]     = 0xF1;
1556         bcb->CDB[1]     = 0x03;
1557         bcb->CDB[5]     = (unsigned char)(PageNum);
1558         bcb->CDB[4]     = (unsigned char)(PhyBlock);
1559         bcb->CDB[3]     = (unsigned char)(PhyBlock>>8);
1560         bcb->CDB[2]     = (unsigned char)(PhyBlock>>16);
1561         bcb->CDB[6]     = blen;
1562
1563         result = ene_send_scsi_cmd(us, FDIR_READ, buf, 0);
1564         if (result != USB_STOR_XFER_GOOD)
1565                 return USB_STOR_TRANSPORT_ERROR;
1566
1567         return USB_STOR_TRANSPORT_GOOD;
1568 }
1569
1570 static int ms_lib_scan_logicalblocknumber(struct us_data *us, u16 btBlk1st)
1571 {
1572         u16 PhyBlock, newblk, i;
1573         u16 LogStart, LogEnde;
1574         struct ms_lib_type_extdat extdat;
1575         u8 buf[0x200];
1576         u32 count = 0, index = 0;
1577         struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1578
1579         for (PhyBlock = 0; PhyBlock < info->MS_Lib.NumberOfPhyBlock;) {
1580                 ms_lib_phy_to_log_range(PhyBlock, &LogStart, &LogEnde);
1581
1582                 for (i = 0; i < MS_PHYSICAL_BLOCKS_PER_SEGMENT; i++, PhyBlock++) {
1583                         switch (ms_libconv_to_logical(info, PhyBlock)) {
1584                         case MS_STATUS_ERROR:
1585                                 continue;
1586                         default:
1587                                 break;
1588                         }
1589
1590                         if (count == PhyBlock) {
1591                                 ms_lib_read_extrablock(us, PhyBlock, 0, 0x80, &buf);
1592                                 count += 0x80;
1593                         }
1594                         index = (PhyBlock % 0x80) * 4;
1595
1596                         extdat.ovrflg = buf[index];
1597                         extdat.mngflg = buf[index+1];
1598                         extdat.logadr = memstick_logaddr(buf[index+2], buf[index+3]);
1599
1600                         if ((extdat.ovrflg & MS_REG_OVR_BKST) != MS_REG_OVR_BKST_OK) {
1601                                 ms_lib_setacquired_errorblock(us, PhyBlock);
1602                                 continue;
1603                         }
1604
1605                         if ((extdat.mngflg & MS_REG_MNG_ATFLG) == MS_REG_MNG_ATFLG_ATTBL) {
1606                                 ms_lib_erase_phyblock(us, PhyBlock);
1607                                 continue;
1608                         }
1609
1610                         if (extdat.logadr != MS_LB_NOT_USED) {
1611                                 if ((extdat.logadr < LogStart) || (LogEnde <= extdat.logadr)) {
1612                                         ms_lib_erase_phyblock(us, PhyBlock);
1613                                         continue;
1614                                 }
1615
1616                                 newblk = ms_libconv_to_physical(info, extdat.logadr);
1617
1618                                 if (newblk != MS_LB_NOT_USED) {
1619                                         if (extdat.logadr == 0) {
1620                                                 ms_lib_set_logicalpair(us, extdat.logadr, PhyBlock);
1621                                                 if (ms_lib_check_disableblock(us, btBlk1st)) {
1622                                                         ms_lib_set_logicalpair(us, extdat.logadr, newblk);
1623                                                         continue;
1624                                                 }
1625                                         }
1626
1627                                         ms_lib_read_extra(us, newblk, 0, &extdat);
1628                                         if ((extdat.ovrflg & MS_REG_OVR_UDST) == MS_REG_OVR_UDST_UPDATING) {
1629                                                 ms_lib_erase_phyblock(us, PhyBlock);
1630                                                 continue;
1631                                         } else {
1632                                                 ms_lib_erase_phyblock(us, newblk);
1633                                         }
1634                                 }
1635
1636                                 ms_lib_set_logicalpair(us, extdat.logadr, PhyBlock);
1637                         }
1638                 }
1639         } /* End for ... */
1640
1641         return MS_STATUS_SUCCESS;
1642 }
1643
1644
1645 static int ms_scsi_read(struct us_data *us, struct scsi_cmnd *srb)
1646 {
1647         int result;
1648         unsigned char *cdb = srb->cmnd;
1649         struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1650         struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1651
1652         u32 bn = ((cdb[2] << 24) & 0xff000000) | ((cdb[3] << 16) & 0x00ff0000) |
1653                 ((cdb[4] << 8) & 0x0000ff00) | ((cdb[5] << 0) & 0x000000ff);
1654         u16 blen = ((cdb[7] << 8) & 0xff00) | ((cdb[8] << 0) & 0x00ff);
1655         u32 blenByte = blen * 0x200;
1656
1657         if (bn > info->bl_num)
1658                 return USB_STOR_TRANSPORT_ERROR;
1659
1660         if (info->MS_Status.IsMSPro) {
1661                 result = ene_load_bincode(us, MSP_RW_PATTERN);
1662                 if (result != USB_STOR_XFER_GOOD) {
1663                         usb_stor_dbg(us, "Load MPS RW pattern Fail !!\n");
1664                         return USB_STOR_TRANSPORT_ERROR;
1665                 }
1666
1667                 /* set up the command wrapper */
1668                 memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1669                 bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1670                 bcb->DataTransferLength = blenByte;
1671                 bcb->Flags  = US_BULK_FLAG_IN;
1672                 bcb->CDB[0] = 0xF1;
1673                 bcb->CDB[1] = 0x02;
1674                 bcb->CDB[5] = (unsigned char)(bn);
1675                 bcb->CDB[4] = (unsigned char)(bn>>8);
1676                 bcb->CDB[3] = (unsigned char)(bn>>16);
1677                 bcb->CDB[2] = (unsigned char)(bn>>24);
1678
1679                 result = ene_send_scsi_cmd(us, FDIR_READ, scsi_sglist(srb), 1);
1680         } else {
1681                 void *buf;
1682                 int offset = 0;
1683                 u16 phyblk, logblk;
1684                 u8 PageNum;
1685                 u16 len;
1686                 u32 blkno;
1687
1688                 buf = kmalloc(blenByte, GFP_KERNEL);
1689                 if (buf == NULL)
1690                         return USB_STOR_TRANSPORT_ERROR;
1691
1692                 result = ene_load_bincode(us, MS_RW_PATTERN);
1693                 if (result != USB_STOR_XFER_GOOD) {
1694                         pr_info("Load MS RW pattern Fail !!\n");
1695                         result = USB_STOR_TRANSPORT_ERROR;
1696                         goto exit;
1697                 }
1698
1699                 logblk  = (u16)(bn / info->MS_Lib.PagesPerBlock);
1700                 PageNum = (u8)(bn % info->MS_Lib.PagesPerBlock);
1701
1702                 while (1) {
1703                         if (blen > (info->MS_Lib.PagesPerBlock-PageNum))
1704                                 len = info->MS_Lib.PagesPerBlock-PageNum;
1705                         else
1706                                 len = blen;
1707
1708                         phyblk = ms_libconv_to_physical(info, logblk);
1709                         blkno  = phyblk * 0x20 + PageNum;
1710
1711                         /* set up the command wrapper */
1712                         memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1713                         bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1714                         bcb->DataTransferLength = 0x200 * len;
1715                         bcb->Flags  = US_BULK_FLAG_IN;
1716                         bcb->CDB[0] = 0xF1;
1717                         bcb->CDB[1] = 0x02;
1718                         bcb->CDB[5] = (unsigned char)(blkno);
1719                         bcb->CDB[4] = (unsigned char)(blkno>>8);
1720                         bcb->CDB[3] = (unsigned char)(blkno>>16);
1721                         bcb->CDB[2] = (unsigned char)(blkno>>24);
1722
1723                         result = ene_send_scsi_cmd(us, FDIR_READ, buf+offset, 0);
1724                         if (result != USB_STOR_XFER_GOOD) {
1725                                 pr_info("MS_SCSI_Read --- result = %x\n", result);
1726                                 result = USB_STOR_TRANSPORT_ERROR;
1727                                 goto exit;
1728                         }
1729
1730                         blen -= len;
1731                         if (blen <= 0)
1732                                 break;
1733                         logblk++;
1734                         PageNum = 0;
1735                         offset += MS_BYTES_PER_PAGE*len;
1736                 }
1737                 usb_stor_set_xfer_buf(buf, blenByte, srb);
1738 exit:
1739                 kfree(buf);
1740         }
1741         return result;
1742 }
1743
1744 static int ms_scsi_write(struct us_data *us, struct scsi_cmnd *srb)
1745 {
1746         int result;
1747         struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1748         unsigned char *cdb = srb->cmnd;
1749         struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1750
1751         u32 bn = ((cdb[2] << 24) & 0xff000000) |
1752                         ((cdb[3] << 16) & 0x00ff0000) |
1753                         ((cdb[4] << 8) & 0x0000ff00) |
1754                         ((cdb[5] << 0) & 0x000000ff);
1755         u16 blen = ((cdb[7] << 8) & 0xff00) | ((cdb[8] << 0) & 0x00ff);
1756         u32 blenByte = blen * 0x200;
1757
1758         if (bn > info->bl_num)
1759                 return USB_STOR_TRANSPORT_ERROR;
1760
1761         if (info->MS_Status.IsMSPro) {
1762                 result = ene_load_bincode(us, MSP_RW_PATTERN);
1763                 if (result != USB_STOR_XFER_GOOD) {
1764                         pr_info("Load MSP RW pattern Fail !!\n");
1765                         return USB_STOR_TRANSPORT_ERROR;
1766                 }
1767
1768                 /* set up the command wrapper */
1769                 memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1770                 bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1771                 bcb->DataTransferLength = blenByte;
1772                 bcb->Flags  = 0x00;
1773                 bcb->CDB[0] = 0xF0;
1774                 bcb->CDB[1] = 0x04;
1775                 bcb->CDB[5] = (unsigned char)(bn);
1776                 bcb->CDB[4] = (unsigned char)(bn>>8);
1777                 bcb->CDB[3] = (unsigned char)(bn>>16);
1778                 bcb->CDB[2] = (unsigned char)(bn>>24);
1779
1780                 result = ene_send_scsi_cmd(us, FDIR_WRITE, scsi_sglist(srb), 1);
1781         } else {
1782                 void *buf;
1783                 int offset = 0;
1784                 u16 PhyBlockAddr;
1785                 u8 PageNum;
1786                 u16 len, oldphy, newphy;
1787
1788                 buf = kmalloc(blenByte, GFP_KERNEL);
1789                 if (buf == NULL)
1790                         return USB_STOR_TRANSPORT_ERROR;
1791                 usb_stor_set_xfer_buf(buf, blenByte, srb);
1792
1793                 result = ene_load_bincode(us, MS_RW_PATTERN);
1794                 if (result != USB_STOR_XFER_GOOD) {
1795                         pr_info("Load MS RW pattern Fail !!\n");
1796                         result = USB_STOR_TRANSPORT_ERROR;
1797                         goto exit;
1798                 }
1799
1800                 PhyBlockAddr = (u16)(bn / info->MS_Lib.PagesPerBlock);
1801                 PageNum      = (u8)(bn % info->MS_Lib.PagesPerBlock);
1802
1803                 while (1) {
1804                         if (blen > (info->MS_Lib.PagesPerBlock-PageNum))
1805                                 len = info->MS_Lib.PagesPerBlock-PageNum;
1806                         else
1807                                 len = blen;
1808
1809                         oldphy = ms_libconv_to_physical(info, PhyBlockAddr); /* need check us <-> info */
1810                         newphy = ms_libsearch_block_from_logical(us, PhyBlockAddr);
1811
1812                         result = ms_read_copyblock(us, oldphy, newphy, PhyBlockAddr, PageNum, buf+offset, len);
1813
1814                         if (result != USB_STOR_XFER_GOOD) {
1815                                 pr_info("MS_SCSI_Write --- result = %x\n", result);
1816                                 result =  USB_STOR_TRANSPORT_ERROR;
1817                                 goto exit;
1818                         }
1819
1820                         info->MS_Lib.Phy2LogMap[oldphy] = MS_LB_NOT_USED_ERASED;
1821                         ms_lib_force_setlogical_pair(us, PhyBlockAddr, newphy);
1822
1823                         blen -= len;
1824                         if (blen <= 0)
1825                                 break;
1826                         PhyBlockAddr++;
1827                         PageNum = 0;
1828                         offset += MS_BYTES_PER_PAGE*len;
1829                 }
1830 exit:
1831                 kfree(buf);
1832         }
1833         return result;
1834 }
1835
1836 /*
1837  * ENE MS Card
1838  */
1839
1840 static int ene_get_card_type(struct us_data *us, u16 index, void *buf)
1841 {
1842         struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1843         int result;
1844
1845         memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1846         bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1847         bcb->DataTransferLength = 0x01;
1848         bcb->Flags                      = US_BULK_FLAG_IN;
1849         bcb->CDB[0]                     = 0xED;
1850         bcb->CDB[2]                     = (unsigned char)(index>>8);
1851         bcb->CDB[3]                     = (unsigned char)index;
1852
1853         result = ene_send_scsi_cmd(us, FDIR_READ, buf, 0);
1854         return result;
1855 }
1856
1857 static int ene_get_card_status(struct us_data *us, u8 *buf)
1858 {
1859         u16 tmpreg;
1860         u32 reg4b;
1861         struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1862
1863         /*usb_stor_dbg(us, "transport --- ENE_ReadSDReg\n");*/
1864         reg4b = *(u32 *)&buf[0x18];
1865         info->SD_READ_BL_LEN = (u8)((reg4b >> 8) & 0x0f);
1866
1867         tmpreg = (u16) reg4b;
1868         reg4b = *(u32 *)(&buf[0x14]);
1869         if (info->SD_Status.HiCapacity && !info->SD_Status.IsMMC)
1870                 info->HC_C_SIZE = (reg4b >> 8) & 0x3fffff;
1871
1872         info->SD_C_SIZE = ((tmpreg & 0x03) << 10) | (u16)(reg4b >> 22);
1873         info->SD_C_SIZE_MULT = (u8)(reg4b >> 7)  & 0x07;
1874         if (info->SD_Status.HiCapacity && info->SD_Status.IsMMC)
1875                 info->HC_C_SIZE = *(u32 *)(&buf[0x100]);
1876
1877         if (info->SD_READ_BL_LEN > SD_BLOCK_LEN) {
1878                 info->SD_Block_Mult = 1 << (info->SD_READ_BL_LEN-SD_BLOCK_LEN);
1879                 info->SD_READ_BL_LEN = SD_BLOCK_LEN;
1880         } else {
1881                 info->SD_Block_Mult = 1;
1882         }
1883
1884         return USB_STOR_TRANSPORT_GOOD;
1885 }
1886
1887 static int ene_load_bincode(struct us_data *us, unsigned char flag)
1888 {
1889         int err;
1890         char *fw_name = NULL;
1891         unsigned char *buf = NULL;
1892         const struct firmware *sd_fw = NULL;
1893         int result = USB_STOR_TRANSPORT_ERROR;
1894         struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1895         struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1896
1897         if (info->BIN_FLAG == flag)
1898                 return USB_STOR_TRANSPORT_GOOD;
1899
1900         switch (flag) {
1901         /* For SD */
1902         case SD_INIT1_PATTERN:
1903                 usb_stor_dbg(us, "SD_INIT1_PATTERN\n");
1904                 fw_name = SD_INIT1_FIRMWARE;
1905                 break;
1906         case SD_INIT2_PATTERN:
1907                 usb_stor_dbg(us, "SD_INIT2_PATTERN\n");
1908                 fw_name = SD_INIT2_FIRMWARE;
1909                 break;
1910         case SD_RW_PATTERN:
1911                 usb_stor_dbg(us, "SD_RW_PATTERN\n");
1912                 fw_name = SD_RW_FIRMWARE;
1913                 break;
1914         /* For MS */
1915         case MS_INIT_PATTERN:
1916                 usb_stor_dbg(us, "MS_INIT_PATTERN\n");
1917                 fw_name = MS_INIT_FIRMWARE;
1918                 break;
1919         case MSP_RW_PATTERN:
1920                 usb_stor_dbg(us, "MSP_RW_PATTERN\n");
1921                 fw_name = MSP_RW_FIRMWARE;
1922                 break;
1923         case MS_RW_PATTERN:
1924                 usb_stor_dbg(us, "MS_RW_PATTERN\n");
1925                 fw_name = MS_RW_FIRMWARE;
1926                 break;
1927         default:
1928                 usb_stor_dbg(us, "----------- Unknown PATTERN ----------\n");
1929                 goto nofw;
1930         }
1931
1932         err = request_firmware(&sd_fw, fw_name, &us->pusb_dev->dev);
1933         if (err) {
1934                 usb_stor_dbg(us, "load firmware %s failed\n", fw_name);
1935                 goto nofw;
1936         }
1937         buf = kmemdup(sd_fw->data, sd_fw->size, GFP_KERNEL);
1938         if (buf == NULL)
1939                 goto nofw;
1940
1941         memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1942         bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1943         bcb->DataTransferLength = sd_fw->size;
1944         bcb->Flags = 0x00;
1945         bcb->CDB[0] = 0xEF;
1946
1947         result = ene_send_scsi_cmd(us, FDIR_WRITE, buf, 0);
1948         if (us->srb != NULL)
1949                 scsi_set_resid(us->srb, 0);
1950         info->BIN_FLAG = flag;
1951         kfree(buf);
1952
1953 nofw:
1954         release_firmware(sd_fw);
1955         return result;
1956 }
1957
1958 static int ms_card_init(struct us_data *us)
1959 {
1960         u32 result;
1961         u16 TmpBlock;
1962         unsigned char *PageBuffer0 = NULL, *PageBuffer1 = NULL;
1963         struct ms_lib_type_extdat extdat;
1964         u16 btBlk1st, btBlk2nd;
1965         u32 btBlk1stErred;
1966         struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1967
1968         printk(KERN_INFO "MS_CardInit start\n");
1969
1970         ms_lib_free_allocatedarea(us); /* Clean buffer and set struct us_data flag to 0 */
1971
1972         /* get two PageBuffer */
1973         PageBuffer0 = kmalloc(MS_BYTES_PER_PAGE, GFP_KERNEL);
1974         PageBuffer1 = kmalloc(MS_BYTES_PER_PAGE, GFP_KERNEL);
1975         if ((PageBuffer0 == NULL) || (PageBuffer1 == NULL)) {
1976                 result = MS_NO_MEMORY_ERROR;
1977                 goto exit;
1978         }
1979
1980         btBlk1st = btBlk2nd = MS_LB_NOT_USED;
1981         btBlk1stErred = 0;
1982
1983         for (TmpBlock = 0; TmpBlock < MS_MAX_INITIAL_ERROR_BLOCKS+2; TmpBlock++) {
1984
1985                 switch (ms_read_readpage(us, TmpBlock, 0, (u32 *)PageBuffer0, &extdat)) {
1986                 case MS_STATUS_SUCCESS:
1987                         break;
1988                 case MS_STATUS_INT_ERROR:
1989                         break;
1990                 case MS_STATUS_ERROR:
1991                 default:
1992                         continue;
1993                 }
1994
1995                 if ((extdat.ovrflg & MS_REG_OVR_BKST) == MS_REG_OVR_BKST_NG)
1996                         continue;
1997
1998                 if (((extdat.mngflg & MS_REG_MNG_SYSFLG) == MS_REG_MNG_SYSFLG_USER) ||
1999                         (be16_to_cpu(((struct ms_bootblock_page0 *)PageBuffer0)->header.wBlockID) != MS_BOOT_BLOCK_ID) ||
2000                         (be16_to_cpu(((struct ms_bootblock_page0 *)PageBuffer0)->header.wFormatVersion) != MS_BOOT_BLOCK_FORMAT_VERSION) ||
2001                         (((struct ms_bootblock_page0 *)PageBuffer0)->header.bNumberOfDataEntry != MS_BOOT_BLOCK_DATA_ENTRIES))
2002                                 continue;
2003
2004                 if (btBlk1st != MS_LB_NOT_USED) {
2005                         btBlk2nd = TmpBlock;
2006                         break;
2007                 }
2008
2009                 btBlk1st = TmpBlock;
2010                 memcpy(PageBuffer1, PageBuffer0, MS_BYTES_PER_PAGE);
2011                 if (extdat.status1 & (MS_REG_ST1_DTER | MS_REG_ST1_EXER | MS_REG_ST1_FGER))
2012                         btBlk1stErred = 1;
2013         }
2014
2015         if (btBlk1st == MS_LB_NOT_USED) {
2016                 result = MS_STATUS_ERROR;
2017                 goto exit;
2018         }
2019
2020         /* write protect */
2021         if ((extdat.status0 & MS_REG_ST0_WP) == MS_REG_ST0_WP_ON)
2022                 ms_lib_ctrl_set(info, MS_LIB_CTRL_WRPROTECT);
2023
2024         result = MS_STATUS_ERROR;
2025         /* 1st Boot Block */
2026         if (btBlk1stErred == 0)
2027                 result = ms_lib_process_bootblock(us, btBlk1st, PageBuffer1);
2028                 /* 1st */
2029         /* 2nd Boot Block */
2030         if (result && (btBlk2nd != MS_LB_NOT_USED))
2031                 result = ms_lib_process_bootblock(us, btBlk2nd, PageBuffer0);
2032
2033         if (result) {
2034                 result = MS_STATUS_ERROR;
2035                 goto exit;
2036         }
2037
2038         for (TmpBlock = 0; TmpBlock < btBlk1st; TmpBlock++)
2039                 info->MS_Lib.Phy2LogMap[TmpBlock] = MS_LB_INITIAL_ERROR;
2040
2041         info->MS_Lib.Phy2LogMap[btBlk1st] = MS_LB_BOOT_BLOCK;
2042
2043         if (btBlk2nd != MS_LB_NOT_USED) {
2044                 for (TmpBlock = btBlk1st + 1; TmpBlock < btBlk2nd; TmpBlock++)
2045                         info->MS_Lib.Phy2LogMap[TmpBlock] = MS_LB_INITIAL_ERROR;
2046
2047                 info->MS_Lib.Phy2LogMap[btBlk2nd] = MS_LB_BOOT_BLOCK;
2048         }
2049
2050         result = ms_lib_scan_logicalblocknumber(us, btBlk1st);
2051         if (result)
2052                 goto exit;
2053
2054         for (TmpBlock = MS_PHYSICAL_BLOCKS_PER_SEGMENT;
2055                 TmpBlock < info->MS_Lib.NumberOfPhyBlock;
2056                 TmpBlock += MS_PHYSICAL_BLOCKS_PER_SEGMENT) {
2057                 if (ms_count_freeblock(us, TmpBlock) == 0) {
2058                         ms_lib_ctrl_set(info, MS_LIB_CTRL_WRPROTECT);
2059                         break;
2060                 }
2061         }
2062
2063         /* write */
2064         if (ms_lib_alloc_writebuf(us)) {
2065                 result = MS_NO_MEMORY_ERROR;
2066                 goto exit;
2067         }
2068
2069         result = MS_STATUS_SUCCESS;
2070
2071 exit:
2072         kfree(PageBuffer1);
2073         kfree(PageBuffer0);
2074
2075         printk(KERN_INFO "MS_CardInit end\n");
2076         return result;
2077 }
2078
2079 static int ene_ms_init(struct us_data *us)
2080 {
2081         struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
2082         int result;
2083         u8 buf[0x200];
2084         u16 MSP_BlockSize, MSP_UserAreaBlocks;
2085         struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
2086
2087         printk(KERN_INFO "transport --- ENE_MSInit\n");
2088
2089         /* the same part to test ENE */
2090
2091         result = ene_load_bincode(us, MS_INIT_PATTERN);
2092         if (result != USB_STOR_XFER_GOOD) {
2093                 printk(KERN_ERR "Load MS Init Code Fail !!\n");
2094                 return USB_STOR_TRANSPORT_ERROR;
2095         }
2096
2097         memset(bcb, 0, sizeof(struct bulk_cb_wrap));
2098         bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
2099         bcb->DataTransferLength = 0x200;
2100         bcb->Flags      = US_BULK_FLAG_IN;
2101         bcb->CDB[0]     = 0xF1;
2102         bcb->CDB[1]     = 0x01;
2103
2104         result = ene_send_scsi_cmd(us, FDIR_READ, &buf, 0);
2105         if (result != USB_STOR_XFER_GOOD) {
2106                 printk(KERN_ERR "Execution MS Init Code Fail !!\n");
2107                 return USB_STOR_TRANSPORT_ERROR;
2108         }
2109         /* the same part to test ENE */
2110         info->MS_Status = *(struct MS_STATUS *)&buf[0];
2111
2112         if (info->MS_Status.Insert && info->MS_Status.Ready) {
2113                 printk(KERN_INFO "Insert     = %x\n", info->MS_Status.Insert);
2114                 printk(KERN_INFO "Ready      = %x\n", info->MS_Status.Ready);
2115                 printk(KERN_INFO "IsMSPro    = %x\n", info->MS_Status.IsMSPro);
2116                 printk(KERN_INFO "IsMSPHG    = %x\n", info->MS_Status.IsMSPHG);
2117                 printk(KERN_INFO "WtP= %x\n", info->MS_Status.WtP);
2118                 if (info->MS_Status.IsMSPro) {
2119                         MSP_BlockSize      = (buf[6] << 8) | buf[7];
2120                         MSP_UserAreaBlocks = (buf[10] << 8) | buf[11];
2121                         info->MSP_TotalBlock = MSP_BlockSize * MSP_UserAreaBlocks;
2122                 } else {
2123                         ms_card_init(us); /* Card is MS (to ms.c)*/
2124                 }
2125                 usb_stor_dbg(us, "MS Init Code OK !!\n");
2126         } else {
2127                 usb_stor_dbg(us, "MS Card Not Ready --- %x\n", buf[0]);
2128                 return USB_STOR_TRANSPORT_ERROR;
2129         }
2130
2131         return USB_STOR_TRANSPORT_GOOD;
2132 }
2133
2134 static int ene_sd_init(struct us_data *us)
2135 {
2136         int result;
2137         u8  buf[0x200];
2138         struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
2139         struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
2140
2141         usb_stor_dbg(us, "transport --- ENE_SDInit\n");
2142         /* SD Init Part-1 */
2143         result = ene_load_bincode(us, SD_INIT1_PATTERN);
2144         if (result != USB_STOR_XFER_GOOD) {
2145                 usb_stor_dbg(us, "Load SD Init Code Part-1 Fail !!\n");
2146                 return USB_STOR_TRANSPORT_ERROR;
2147         }
2148
2149         memset(bcb, 0, sizeof(struct bulk_cb_wrap));
2150         bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
2151         bcb->Flags = US_BULK_FLAG_IN;
2152         bcb->CDB[0] = 0xF2;
2153
2154         result = ene_send_scsi_cmd(us, FDIR_READ, NULL, 0);
2155         if (result != USB_STOR_XFER_GOOD) {
2156                 usb_stor_dbg(us, "Execution SD Init Code Fail !!\n");
2157                 return USB_STOR_TRANSPORT_ERROR;
2158         }
2159
2160         /* SD Init Part-2 */
2161         result = ene_load_bincode(us, SD_INIT2_PATTERN);
2162         if (result != USB_STOR_XFER_GOOD) {
2163                 usb_stor_dbg(us, "Load SD Init Code Part-2 Fail !!\n");
2164                 return USB_STOR_TRANSPORT_ERROR;
2165         }
2166
2167         memset(bcb, 0, sizeof(struct bulk_cb_wrap));
2168         bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
2169         bcb->DataTransferLength = 0x200;
2170         bcb->Flags              = US_BULK_FLAG_IN;
2171         bcb->CDB[0]             = 0xF1;
2172
2173         result = ene_send_scsi_cmd(us, FDIR_READ, &buf, 0);
2174         if (result != USB_STOR_XFER_GOOD) {
2175                 usb_stor_dbg(us, "Execution SD Init Code Fail !!\n");
2176                 return USB_STOR_TRANSPORT_ERROR;
2177         }
2178
2179         info->SD_Status =  *(struct SD_STATUS *)&buf[0];
2180         if (info->SD_Status.Insert && info->SD_Status.Ready) {
2181                 struct SD_STATUS *s = &info->SD_Status;
2182
2183                 ene_get_card_status(us, (unsigned char *)&buf);
2184                 usb_stor_dbg(us, "Insert     = %x\n", s->Insert);
2185                 usb_stor_dbg(us, "Ready      = %x\n", s->Ready);
2186                 usb_stor_dbg(us, "IsMMC      = %x\n", s->IsMMC);
2187                 usb_stor_dbg(us, "HiCapacity = %x\n", s->HiCapacity);
2188                 usb_stor_dbg(us, "HiSpeed    = %x\n", s->HiSpeed);
2189                 usb_stor_dbg(us, "WtP        = %x\n", s->WtP);
2190         } else {
2191                 usb_stor_dbg(us, "SD Card Not Ready --- %x\n", buf[0]);
2192                 return USB_STOR_TRANSPORT_ERROR;
2193         }
2194         return USB_STOR_TRANSPORT_GOOD;
2195 }
2196
2197
2198 static int ene_init(struct us_data *us)
2199 {
2200         int result;
2201         u8  misc_reg03 = 0;
2202         struct ene_ub6250_info *info = (struct ene_ub6250_info *)(us->extra);
2203
2204         result = ene_get_card_type(us, REG_CARD_STATUS, &misc_reg03);
2205         if (result != USB_STOR_XFER_GOOD)
2206                 return USB_STOR_TRANSPORT_ERROR;
2207
2208         if (misc_reg03 & 0x01) {
2209                 if (!info->SD_Status.Ready) {
2210                         result = ene_sd_init(us);
2211                         if (result != USB_STOR_XFER_GOOD)
2212                                 return USB_STOR_TRANSPORT_ERROR;
2213                 }
2214         }
2215         if (misc_reg03 & 0x02) {
2216                 if (!info->MS_Status.Ready) {
2217                         result = ene_ms_init(us);
2218                         if (result != USB_STOR_XFER_GOOD)
2219                                 return USB_STOR_TRANSPORT_ERROR;
2220                 }
2221         }
2222         return result;
2223 }
2224
2225 /*----- sd_scsi_irp() ---------*/
2226 static int sd_scsi_irp(struct us_data *us, struct scsi_cmnd *srb)
2227 {
2228         int    result;
2229         struct ene_ub6250_info *info = (struct ene_ub6250_info *)us->extra;
2230
2231         switch (srb->cmnd[0]) {
2232         case TEST_UNIT_READY:
2233                 result = sd_scsi_test_unit_ready(us, srb);
2234                 break; /* 0x00 */
2235         case REQUEST_SENSE:
2236                 result = do_scsi_request_sense(us, srb);
2237                 break; /* 0x03 */
2238         case INQUIRY:
2239                 result = sd_scsi_inquiry(us, srb);
2240                 break; /* 0x12 */
2241         case MODE_SENSE:
2242                 result = sd_scsi_mode_sense(us, srb);
2243                 break; /* 0x1A */
2244         /*
2245         case START_STOP:
2246                 result = SD_SCSI_Start_Stop(us, srb);
2247                 break; //0x1B
2248         */
2249         case READ_CAPACITY:
2250                 result = sd_scsi_read_capacity(us, srb);
2251                 break; /* 0x25 */
2252         case READ_10:
2253                 result = sd_scsi_read(us, srb);
2254                 break; /* 0x28 */
2255         case WRITE_10:
2256                 result = sd_scsi_write(us, srb);
2257                 break; /* 0x2A */
2258         default:
2259                 info->SrbStatus = SS_ILLEGAL_REQUEST;
2260                 result = USB_STOR_TRANSPORT_FAILED;
2261                 break;
2262         }
2263         if (result == USB_STOR_TRANSPORT_GOOD)
2264                 info->SrbStatus = SS_SUCCESS;
2265         return result;
2266 }
2267
2268 /*
2269  * ms_scsi_irp()
2270  */
2271 static int ms_scsi_irp(struct us_data *us, struct scsi_cmnd *srb)
2272 {
2273         int result;
2274         struct ene_ub6250_info *info = (struct ene_ub6250_info *)us->extra;
2275
2276         switch (srb->cmnd[0]) {
2277         case TEST_UNIT_READY:
2278                 result = ms_scsi_test_unit_ready(us, srb);
2279                 break; /* 0x00 */
2280         case REQUEST_SENSE:
2281                 result = do_scsi_request_sense(us, srb);
2282                 break; /* 0x03 */
2283         case INQUIRY:
2284                 result = ms_scsi_inquiry(us, srb);
2285                 break; /* 0x12 */
2286         case MODE_SENSE:
2287                 result = ms_scsi_mode_sense(us, srb);
2288                 break; /* 0x1A */
2289         case READ_CAPACITY:
2290                 result = ms_scsi_read_capacity(us, srb);
2291                 break; /* 0x25 */
2292         case READ_10:
2293                 result = ms_scsi_read(us, srb);
2294                 break; /* 0x28 */
2295         case WRITE_10:
2296                 result = ms_scsi_write(us, srb);
2297                 break;  /* 0x2A */
2298         default:
2299                 info->SrbStatus = SS_ILLEGAL_REQUEST;
2300                 result = USB_STOR_TRANSPORT_FAILED;
2301                 break;
2302         }
2303         if (result == USB_STOR_TRANSPORT_GOOD)
2304                 info->SrbStatus = SS_SUCCESS;
2305         return result;
2306 }
2307
2308 static int ene_transport(struct scsi_cmnd *srb, struct us_data *us)
2309 {
2310         int result = USB_STOR_XFER_GOOD;
2311         struct ene_ub6250_info *info = (struct ene_ub6250_info *)(us->extra);
2312
2313         /*US_DEBUG(usb_stor_show_command(us, srb)); */
2314         scsi_set_resid(srb, 0);
2315         if (unlikely(!(info->SD_Status.Ready || info->MS_Status.Ready)))
2316                 result = ene_init(us);
2317         if (result == USB_STOR_XFER_GOOD) {
2318                 result = USB_STOR_TRANSPORT_ERROR;
2319                 if (info->SD_Status.Ready)
2320                         result = sd_scsi_irp(us, srb);
2321
2322                 if (info->MS_Status.Ready)
2323                         result = ms_scsi_irp(us, srb);
2324         }
2325         return result;
2326 }
2327
2328 static struct scsi_host_template ene_ub6250_host_template;
2329
2330 static int ene_ub6250_probe(struct usb_interface *intf,
2331                          const struct usb_device_id *id)
2332 {
2333         int result;
2334         u8  misc_reg03 = 0;
2335         struct us_data *us;
2336
2337         result = usb_stor_probe1(&us, intf, id,
2338                    (id - ene_ub6250_usb_ids) + ene_ub6250_unusual_dev_list,
2339                    &ene_ub6250_host_template);
2340         if (result)
2341                 return result;
2342
2343         /* FIXME: where should the code alloc extra buf ? */
2344         if (!us->extra) {
2345                 us->extra = kzalloc(sizeof(struct ene_ub6250_info), GFP_KERNEL);
2346                 if (!us->extra)
2347                         return -ENOMEM;
2348                 us->extra_destructor = ene_ub6250_info_destructor;
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, &misc_reg03);
2361         if (result != USB_STOR_XFER_GOOD) {
2362                 usb_stor_disconnect(intf);
2363                 return USB_STOR_TRANSPORT_ERROR;
2364         }
2365
2366         if (!(misc_reg03 & 0x01)) {
2367                 pr_info("ums_eneub6250: This driver only supports SD/MS cards. "
2368                         "It does not support SM cards.\n");
2369         }
2370
2371         return result;
2372 }
2373
2374
2375 #ifdef CONFIG_PM
2376
2377 static int ene_ub6250_resume(struct usb_interface *iface)
2378 {
2379         u8 tmp = 0;
2380         struct us_data *us = usb_get_intfdata(iface);
2381         struct ene_ub6250_info *info = (struct ene_ub6250_info *)(us->extra);
2382
2383         mutex_lock(&us->dev_mutex);
2384
2385         if (us->suspend_resume_hook)
2386                 (us->suspend_resume_hook)(us, US_RESUME);
2387
2388         mutex_unlock(&us->dev_mutex);
2389
2390         info->Power_IsResum = true;
2391         /*info->SD_Status.Ready = 0; */
2392         info->SD_Status = *(struct SD_STATUS *)&tmp;
2393         info->MS_Status = *(struct MS_STATUS *)&tmp;
2394         info->SM_Status = *(struct SM_STATUS *)&tmp;
2395
2396         return 0;
2397 }
2398
2399 static int ene_ub6250_reset_resume(struct usb_interface *iface)
2400 {
2401         u8 tmp = 0;
2402         struct us_data *us = usb_get_intfdata(iface);
2403         struct ene_ub6250_info *info = (struct ene_ub6250_info *)(us->extra);
2404
2405         /* Report the reset to the SCSI core */
2406         usb_stor_reset_resume(iface);
2407
2408         /*
2409          * FIXME: Notify the subdrivers that they need to reinitialize
2410          * the device
2411          */
2412         info->Power_IsResum = true;
2413         /*info->SD_Status.Ready = 0; */
2414         info->SD_Status = *(struct SD_STATUS *)&tmp;
2415         info->MS_Status = *(struct MS_STATUS *)&tmp;
2416         info->SM_Status = *(struct SM_STATUS *)&tmp;
2417
2418         return 0;
2419 }
2420
2421 #else
2422
2423 #define ene_ub6250_resume               NULL
2424 #define ene_ub6250_reset_resume         NULL
2425
2426 #endif
2427
2428 static struct usb_driver ene_ub6250_driver = {
2429         .name =         DRV_NAME,
2430         .probe =        ene_ub6250_probe,
2431         .disconnect =   usb_stor_disconnect,
2432         .suspend =      usb_stor_suspend,
2433         .resume =       ene_ub6250_resume,
2434         .reset_resume = ene_ub6250_reset_resume,
2435         .pre_reset =    usb_stor_pre_reset,
2436         .post_reset =   usb_stor_post_reset,
2437         .id_table =     ene_ub6250_usb_ids,
2438         .soft_unbind =  1,
2439         .no_dynamic_id = 1,
2440 };
2441
2442 module_usb_stor_driver(ene_ub6250_driver, ene_ub6250_host_template, DRV_NAME);