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